diff --git a/.drone.yml b/.drone.yml index 86a43d08e3c..1e10254ef35 100644 --- a/.drone.yml +++ b/.drone.yml @@ -9,7 +9,7 @@ clone: environment: MACRO_COUNT: 0 GENDER_COUNT: 6 - TO_WORLD_COUNT: 206 + TO_WORLD_COUNT: 207 trigger: branch: @@ -174,8 +174,10 @@ steps: - grep "All Unit Tests Passed" log.txt - (! grep "runtime error:" log.txt) - echo "Unit Tests Completed" + --- + kind: signature -hmac: cec2335f99d83072683a7556eedb55e3c2e54463d9263e01ad72d8312ec90c24 +hmac: 4c1d9a24db26e0276f48ce58568906d03fe26cc0f2651fa39d6696b6942f570e ... diff --git a/.travis.yml b/.travis.yml index b78333ec8a8..cdf03faded3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ env: BYOND_MINOR="1517" MACRO_COUNT=0 GENDER_COUNT=6 - TO_WORLD_COUNT=206 + TO_WORLD_COUNT=207 FLYWAY_BUILD="5.2.4" NODE_VERSION=10 RUST_G_VERSION="0.4.2+a2" diff --git a/SQL/migrate/V067__floatiing_chat_color.sql b/SQL/migrate/V067__floatiing_chat_color.sql new file mode 100644 index 00000000000..27e081d77d2 --- /dev/null +++ b/SQL/migrate/V067__floatiing_chat_color.sql @@ -0,0 +1,6 @@ +-- +-- Add a new floating chat color field +-- + +ALTER TABLE `ss13_characters` + ADD COLUMN `floating_chat_color` char(7) DEFAULT NULL AFTER `pronouns` \ No newline at end of file diff --git a/aurorastation.dme b/aurorastation.dme index 18ea3776d91..38379673aac 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -16,6 +16,7 @@ #include "code\stylesheet.dm" #include "code\world.dm" #include "code\__defines\_common.dm" +#include "code\__defines\_compile_helpers.dm" #include "code\__defines\_compile_options.dm" #include "code\__defines\_layers.dm" #include "code\__defines\_macros.dm" @@ -60,6 +61,7 @@ #include "code\__defines\research.dm" #include "code\__defines\rust_g.dm" #include "code\__defines\shuttle.dm" +#include "code\__defines\space_sectors.dm" #include "code\__defines\spaceman_dmm.dm" #include "code\__defines\species.dm" #include "code\__defines\species_languages.dm" @@ -105,6 +107,7 @@ #include "code\_helpers\type2type.dm" #include "code\_helpers\unsorted.dm" #include "code\_helpers\view.dm" +#include "code\_helpers\visual_filters.dm" #include "code\_helpers\sorting\__main.dm" #include "code\_helpers\sorting\cmp.dm" #include "code\_helpers\sorting\TimSort.dm" @@ -118,6 +121,7 @@ #include "code\_onclick\other_mobs.dm" #include "code\_onclick\rig.dm" #include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\ability_screen_objects.dm" #include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\borer_hud.dm" @@ -309,7 +313,9 @@ #include "code\datums\looping_sounds\thermal_drill.dm" #include "code\datums\observation\_debug.dm" #include "code\datums\observation\destroyed.dm" +#include "code\datums\observation\entered.dm" #include "code\datums\observation\equipped.dm" +#include "code\datums\observation\exited.dm" #include "code\datums\observation\helpers.dm" #include "code\datums\observation\moved.dm" #include "code\datums\observation\observation.dm" @@ -319,10 +325,11 @@ #include "code\datums\outfits\outfit.dm" #include "code\datums\outfits\outfit_admin.dm" #include "code\datums\outfits\outfit_antag.dm" +#include "code\datums\outfits\ert\ap_eridani.dm" #include "code\datums\outfits\ert\deathsquad.dm" +#include "code\datums\outfits\ert\fsf.dm" #include "code\datums\outfits\ert\iac.dm" #include "code\datums\outfits\ert\kataphract.dm" -#include "code\datums\outfits\ert\med_eridani.dm" #include "code\datums\outfits\ert\mercenary.dm" #include "code\datums\outfits\ert\nt_ert.dm" #include "code\datums\outfits\ert\syndicate.dm" @@ -433,9 +440,9 @@ #include "code\game\antagonist\outsider\mercenary.dm" #include "code\game\antagonist\outsider\ninja.dm" #include "code\game\antagonist\outsider\raider.dm" -#include "code\game\antagonist\outsider\raider_mage.dm" +#include "code\game\antagonist\outsider\raider_techno.dm" #include "code\game\antagonist\outsider\revenant.dm" -#include "code\game\antagonist\outsider\wizard.dm" +#include "code\game\antagonist\outsider\technomancer.dm" #include "code\game\antagonist\station\cultist.dm" #include "code\game\antagonist\station\highlander.dm" #include "code\game\antagonist\station\loyalist.dm" @@ -445,7 +452,6 @@ #include "code\game\antagonist\station\thrall.dm" #include "code\game\antagonist\station\traitor.dm" #include "code\game\antagonist\station\vampire.dm" -#include "code\game\antagonist\station\wizard_golem.dm" #include "code\game\antagonist\station\changeling\changeling.dm" #include "code\game\antagonist\station\changeling\morph.dm" #include "code\game\area\ai_monitored.dm" @@ -553,7 +559,6 @@ #include "code\game\gamemodes\mixed\acolytes.dm" #include "code\game\gamemodes\mixed\bughunt.dm" #include "code\game\gamemodes\mixed\conflict.dm" -#include "code\game\gamemodes\mixed\conflux.dm" #include "code\game\gamemodes\mixed\crossfire.dm" #include "code\game\gamemodes\mixed\feeding.dm" #include "code\game\gamemodes\mixed\incursion.dm" @@ -571,13 +576,79 @@ #include "code\game\gamemodes\nuclear\pinpointer.dm" #include "code\game\gamemodes\revenants\revenants.dm" #include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\technomancer\catalog.dm" +#include "code\game\gamemodes\technomancer\clothing.dm" +#include "code\game\gamemodes\technomancer\core_obj.dm" +#include "code\game\gamemodes\technomancer\equipment.dm" +#include "code\game\gamemodes\technomancer\instability.dm" +#include "code\game\gamemodes\technomancer\presets.dm" +#include "code\game\gamemodes\technomancer\spell_objs.dm" +#include "code\game\gamemodes\technomancer\spell_objs_helpers.dm" +#include "code\game\gamemodes\technomancer\technomancer.dm" +#include "code\game\gamemodes\technomancer\assistance\assistance.dm" +#include "code\game\gamemodes\technomancer\devices\boots_of_speed.dm" +#include "code\game\gamemodes\technomancer\devices\disposable_teleporter.dm" +#include "code\game\gamemodes\technomancer\devices\gloves_of_regen.dm" +#include "code\game\gamemodes\technomancer\devices\hypos.dm" +#include "code\game\gamemodes\technomancer\devices\implants.dm" +#include "code\game\gamemodes\technomancer\devices\shield_armor.dm" +#include "code\game\gamemodes\technomancer\devices\tesla_armor.dm" +#include "code\game\gamemodes\technomancer\spells\abjuration.dm" +#include "code\game\gamemodes\technomancer\spells\apportation.dm" +#include "code\game\gamemodes\technomancer\spells\audible_deception.dm" +#include "code\game\gamemodes\technomancer\spells\blink.dm" +#include "code\game\gamemodes\technomancer\spells\chroma.dm" +#include "code\game\gamemodes\technomancer\spells\condensation.dm" +#include "code\game\gamemodes\technomancer\spells\dispel.dm" +#include "code\game\gamemodes\technomancer\spells\energy_siphon.dm" +#include "code\game\gamemodes\technomancer\spells\flame_tongue.dm" +#include "code\game\gamemodes\technomancer\spells\gambit.dm" +#include "code\game\gamemodes\technomancer\spells\illusion.dm" +#include "code\game\gamemodes\technomancer\spells\instability_tap.dm" +#include "code\game\gamemodes\technomancer\spells\mark_recall.dm" +#include "code\game\gamemodes\technomancer\spells\mend_organs.dm" +#include "code\game\gamemodes\technomancer\spells\oxygenate.dm" +#include "code\game\gamemodes\technomancer\spells\passwall.dm" +#include "code\game\gamemodes\technomancer\spells\phase_shift.dm" +#include "code\game\gamemodes\technomancer\spells\radiance.dm" +#include "code\game\gamemodes\technomancer\spells\reflect.dm" +#include "code\game\gamemodes\technomancer\spells\resurrect.dm" +#include "code\game\gamemodes\technomancer\spells\shared_burden.dm" +#include "code\game\gamemodes\technomancer\spells\shield.dm" +#include "code\game\gamemodes\technomancer\spells\targeting_matrix.dm" +#include "code\game\gamemodes\technomancer\spells\track.dm" +#include "code\game\gamemodes\technomancer\spells\warp_strike.dm" +#include "code\game\gamemodes\technomancer\spells\aura\aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\biomed_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\fire_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\frost_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\shock_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\unstable_aura.dm" +#include "code\game\gamemodes\technomancer\spells\insert\insert.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\corona.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\haste.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_life.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_synthetic.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\modifier.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\beam.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\force_missile.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\ionic_bolt.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\overload.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\projectile.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\darkness.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\destablize.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\fire_blast.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\pulsar.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\spawner.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon_creature.dm" #include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\vampire\modular_vampire.dm" #include "code\game\gamemodes\vampire\vampire.dm" #include "code\game\gamemodes\vampire\vampire_datum.dm" #include "code\game\gamemodes\vampire\vampire_helpers.dm" #include "code\game\gamemodes\vampire\vampire_powers.dm" -#include "code\game\gamemodes\wizard\wizard.dm" #include "code\game\jobs\_access_defs.dm" #include "code\game\jobs\access.dm" #include "code\game\jobs\access_datum.dm" @@ -658,6 +729,7 @@ #include "code\game\machinery\seed_extractor.dm" #include "code\game\machinery\Sleeper.dm" #include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\stasis_bed.dm" #include "code\game\machinery\station_holomap.dm" #include "code\game\machinery\status_display.dm" #include "code\game\machinery\status_display_ai.dm" @@ -736,7 +808,6 @@ #include "code\game\machinery\embedded_controller\simple_docking_controller.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\pipe\pipelayer.dm" #include "code\game\machinery\telecomms\broadcaster.dm" #include "code\game\machinery\telecomms\logbrowser.dm" #include "code\game\machinery\telecomms\machine_interactions.dm" @@ -794,6 +865,7 @@ #include "code\game\objects\effects\temporary_visuals\blaster_effect.dm" #include "code\game\objects\effects\temporary_visuals\blood_splatter.dm" #include "code\game\objects\effects\temporary_visuals\nuke.dm" +#include "code\game\objects\effects\temporary_visuals\teleport_visuals.dm" #include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" #include "code\game\objects\items\airbubble.dm" #include "code\game\objects\items\apc_frame.dm" @@ -805,15 +877,20 @@ #include "code\game\objects\items\draftingchalk.dm" #include "code\game\objects\items\eightball.dm" #include "code\game\objects\items\glassjar.dm" +#include "code\game\objects\items\holomenu.dm" +#include "code\game\objects\items\knitting.dm" #include "code\game\objects\items\paintkit.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\skrell.dm" #include "code\game\objects\items\spirit_board.dm" +#include "code\game\objects\items\sticker.dm" #include "code\game\objects\items\tajara.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\vitals_monitor.dm" #include "code\game\objects\items\devices\aicard.dm" #include "code\game\objects\items\devices\augment_implanter.dm" +#include "code\game\objects\items\devices\auto_cpr.dm" #include "code\game\objects\items\devices\binoculars.dm" #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\debugger.dm" @@ -839,6 +916,7 @@ #include "code\game\objects\items\devices\powersink.dm" #include "code\game\objects\items\devices\radio_jammer.dm" #include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\slide_projector.dm" #include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\suit_cooling.dm" #include "code\game\objects\items\devices\t_scanner.dm" @@ -907,7 +985,6 @@ #include "code\game\objects\items\weapons\power_cells.dm" #include "code\game\objects\items\weapons\research_slip.dm" #include "code\game\objects\items\weapons\RFD.dm" -#include "code\game\objects\items\weapons\scrolls.dm" #include "code\game\objects\items\weapons\shields.dm" #include "code\game\objects\items\weapons\soap.dm" #include "code\game\objects\items\weapons\stunbaton.dm" @@ -1215,6 +1292,7 @@ #include "code\modules\admin\verbs\SDQL_2_parser.dm" #include "code\modules\admin\verbs\ticklag.dm" #include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\verbs\viewlist.dm" #include "code\modules\admin\verbs\warning.dm" #include "code\modules\admin\view_variables\helpers.dm" #include "code\modules\admin\view_variables\topic.dm" @@ -1236,7 +1314,6 @@ #include "code\modules\assembly\infrared.dm" #include "code\modules\assembly\mousetrap.dm" #include "code\modules\assembly\proximity.dm" -#include "code\modules\assembly\shock_kit.dm" #include "code\modules\assembly\signaler.dm" #include "code\modules\assembly\timer.dm" #include "code\modules\assembly\voice.dm" @@ -1272,6 +1349,8 @@ #include "code\modules\background\religion\tajara.dm" #include "code\modules\background\religion\unathi.dm" #include "code\modules\background\religion\vaurca.dm" +#include "code\modules\background\space_sectors\space_sector.dm" +#include "code\modules\background\space_sectors\tauceti.dm" #include "code\modules\battlemonsters\datum_core.dm" #include "code\modules\battlemonsters\datum_elements.dm" #include "code\modules\battlemonsters\datum_monsters.dm" @@ -1397,11 +1476,13 @@ #include "code\modules\clothing\factions\vysoka.dm" #include "code\modules\clothing\glasses\glasses.dm" #include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\gloves\attackby.dm" #include "code\modules\clothing\gloves\boxing.dm" #include "code\modules\clothing\gloves\color.dm" #include "code\modules\clothing\gloves\miscellaneous.dm" #include "code\modules\clothing\gloves\stungloves.dm" #include "code\modules\clothing\gloves\xeno\tajara.dm" +#include "code\modules\clothing\gloves\xeno\unathi.dm" #include "code\modules\clothing\head\bandanas.dm" #include "code\modules\clothing\head\berets.dm" #include "code\modules\clothing\head\collectable.dm" @@ -1410,6 +1491,7 @@ #include "code\modules\clothing\head\jobs.dm" #include "code\modules\clothing\head\misc.dm" #include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\pilot_helmet.dm" #include "code\modules\clothing\head\soft_caps.dm" #include "code\modules\clothing\head\xenos\tajara.dm" #include "code\modules\clothing\head\xenos\unathi.dm" @@ -1419,10 +1501,12 @@ #include "code\modules\clothing\masks\miscellaneous.dm" #include "code\modules\clothing\masks\voice.dm" #include "code\modules\clothing\masks\xeno\tajara.dm" +#include "code\modules\clothing\masks\xeno\unathi.dm" #include "code\modules\clothing\rings\material.dm" #include "code\modules\clothing\rings\rings.dm" #include "code\modules\clothing\sets\acting_captain.dm" #include "code\modules\clothing\sets\captain.dm" +#include "code\modules\clothing\sets\infiltrator.dm" #include "code\modules\clothing\sets\laser_tag.dm" #include "code\modules\clothing\shoes\colour.dm" #include "code\modules\clothing\shoes\jobs.dm" @@ -1453,6 +1537,7 @@ #include "code\modules\clothing\spacesuits\rig\suits\ert.dm" #include "code\modules\clothing\spacesuits\rig\suits\light.dm" #include "code\modules\clothing\spacesuits\rig\suits\merc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\skrell.dm" #include "code\modules\clothing\spacesuits\rig\suits\station.dm" #include "code\modules\clothing\spacesuits\rig\suits\terminator.dm" #include "code\modules\clothing\spacesuits\void\alien.dm" @@ -1461,7 +1546,6 @@ #include "code\modules\clothing\spacesuits\void\misc.dm" #include "code\modules\clothing\spacesuits\void\station.dm" #include "code\modules\clothing\spacesuits\void\void.dm" -#include "code\modules\clothing\suits\alien.dm" #include "code\modules\clothing\suits\armor.dm" #include "code\modules\clothing\suits\bio.dm" #include "code\modules\clothing\suits\hoodies.dm" @@ -1474,6 +1558,8 @@ #include "code\modules\clothing\suits\utility.dm" #include "code\modules\clothing\suits\wiz_robe.dm" #include "code\modules\clothing\suits\xeno\tajara.dm" +#include "code\modules\clothing\suits\xeno\unathi.dm" +#include "code\modules\clothing\suits\xeno\vaurca.dm" #include "code\modules\clothing\under\color.dm" #include "code\modules\clothing\under\miscellaneous.dm" #include "code\modules\clothing\under\shorts.dm" @@ -1483,6 +1569,7 @@ #include "code\modules\clothing\under\accessories\armband.dm" #include "code\modules\clothing\under\accessories\armor.dm" #include "code\modules\clothing\under\accessories\badges.dm" +#include "code\modules\clothing\under\accessories\buddy_tag.dm" #include "code\modules\clothing\under\accessories\holster.dm" #include "code\modules\clothing\under\accessories\lockets.dm" #include "code\modules\clothing\under\accessories\medal.dm" @@ -1501,6 +1588,11 @@ #include "code\modules\clothing\under\xenos\vaurca.dm" #include "code\modules\clothing\wrists\watches.dm" #include "code\modules\clothing\wrists\wrists.dm" +#include "code\modules\clothing\wrists\xeno\unathi.dm" +#include "code\modules\compass\_compass.dm" +#include "code\modules\compass\compass_holder.dm" +#include "code\modules\compass\compass_waypoint.dm" +#include "code\modules\compass\~compass.dm" #include "code\modules\cooking\trays.dm" #include "code\modules\cooking\machinery\gibber.dm" #include "code\modules\cooking\machinery\icecream.dm" @@ -1561,6 +1653,7 @@ #include "code\modules\economy\EFTPOS.dm" #include "code\modules\economy\Events.dm" #include "code\modules\economy\Events_Mundane.dm" +#include "code\modules\economy\OrderTerminal.dm" #include "code\modules\economy\quikpay.dm" #include "code\modules\economy\TradeDestinations.dm" #include "code\modules\effects\effect_system.dm" @@ -1653,8 +1746,7 @@ #include "code\modules\ghostroles\spawner\atom\shade.dm" #include "code\modules\ghostroles\spawner\atom\skeleton.dm" #include "code\modules\ghostroles\spawner\atom\syndicate_cyborg.dm" -#include "code\modules\ghostroles\spawner\atom\wizard_familiar.dm" -#include "code\modules\ghostroles\spawner\atom\wizardapprentice.dm" +#include "code\modules\ghostroles\spawner\atom\technomancer_apprentice.dm" #include "code\modules\ghostroles\spawner\human\emergencypod.dm" #include "code\modules\ghostroles\spawner\human\human.dm" #include "code\modules\ghostroles\spawner\human\kataphract.dm" @@ -1664,10 +1756,11 @@ #include "code\modules\ghostroles\spawner\human\zenghu.dm" #include "code\modules\ghostroles\spawner\human\admin\admin.dm" #include "code\modules\ghostroles\spawner\human\admin\ccia.dm" +#include "code\modules\ghostroles\spawner\human\responseteams\ap_eridani.dm" #include "code\modules\ghostroles\spawner\human\responseteams\deathsquad.dm" +#include "code\modules\ghostroles\spawner\human\responseteams\fsf.dm" #include "code\modules\ghostroles\spawner\human\responseteams\iac.dm" #include "code\modules\ghostroles\spawner\human\responseteams\kataphracts.dm" -#include "code\modules\ghostroles\spawner\human\responseteams\med_eridani.dm" #include "code\modules\ghostroles\spawner\human\responseteams\mercenary.dm" #include "code\modules\ghostroles\spawner\human\responseteams\nt_ert.dm" #include "code\modules\ghostroles\spawner\human\responseteams\response_team.dm" @@ -2135,6 +2228,7 @@ #include "code\modules\mob\living\silicon\robot\items\upgrades\robot_upgrades.dm" #include "code\modules\mob\living\simple_animal\bees.dm" #include "code\modules\mob\living\simple_animal\corpse.dm" +#include "code\modules\mob\living\simple_animal\illusion.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" @@ -2149,11 +2243,11 @@ #include "code\modules\mob\living\simple_animal\constructs\constructs\harvester.dm" #include "code\modules\mob\living\simple_animal\constructs\constructs\juggernaut.dm" #include "code\modules\mob\living\simple_animal\constructs\constructs\wraith.dm" -#include "code\modules\mob\living\simple_animal\familiars\familiars.dm" #include "code\modules\mob\living\simple_animal\friendly\adhomai.dm" #include "code\modules\mob\living\simple_animal\friendly\carp.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\corgi.dm" +#include "code\modules\mob\living\simple_animal\friendly\cosmozoan.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" #include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" #include "code\modules\mob\living\simple_animal\friendly\fox.dm" @@ -2204,6 +2298,7 @@ #include "code\modules\mob\living\simple_animal\hostile\retaliate\cavern.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\simple_animal\mechanical\mechanical.dm" #include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\modular_computer\core.dm" #include "code\modules\modular_computers\computers\modular_computer\damage.dm" @@ -2328,6 +2423,7 @@ #include "code\modules\nano\modules\alarm_monitor.dm" #include "code\modules\nano\modules\atmos_control.dm" #include "code\modules\nano\modules\crew_monitor.dm" +#include "code\modules\nano\modules\ghost_menu.dm" #include "code\modules\nano\modules\human_appearance.dm" #include "code\modules\nano\modules\law_manager.dm" #include "code\modules\nano\modules\lighting_ctrl.dm" @@ -2346,6 +2442,7 @@ #include "code\modules\organs\organ_stump.dm" #include "code\modules\organs\pain.dm" #include "code\modules\organs\robolimbs.dm" +#include "code\modules\organs\tendons.dm" #include "code\modules\organs\wound.dm" #include "code\modules\organs\internal\_internal.dm" #include "code\modules\organs\internal\appendix.dm" @@ -2609,6 +2706,8 @@ #include "code\modules\reagents\reagent_containers\food\snacks\meat.dm" #include "code\modules\reagents\reagent_containers\food\snacks\sushi.dm" #include "code\modules\reagents\reagent_containers\glass\bottle.dm" +#include "code\modules\reagents\reagent_containers\glass\coffeecup.dm" +#include "code\modules\reagents\reagent_containers\glass\newdrinkingglas.dm" #include "code\modules\reagents\reagent_containers\glass\bottle\robot.dm" #include "code\modules\recycling\conveyor2.dm" #include "code\modules\recycling\disposal-construction.dm" @@ -2624,6 +2723,7 @@ #include "code\modules\research\research.dm" #include "code\modules\research\server.dm" #include "code\modules\research\stockparts.dm" +#include "code\modules\research\tech_processor.dm" #include "code\modules\research\weaponsanalyzer.dm" #include "code\modules\research\designs\designs.dm" #include "code\modules\research\designs\circuit\AI_law_boards.dm" @@ -2688,6 +2788,7 @@ #include "code\modules\research\xenoarchaeology\machinery\artifact_scanner.dm" #include "code\modules\research\xenoarchaeology\machinery\geosample_scanner.dm" #include "code\modules\research\xenoarchaeology\tools\ano_device_battery.dm" +#include "code\modules\research\xenoarchaeology\tools\anomaly_container.dm" #include "code\modules\research\xenoarchaeology\tools\anomaly_suit.dm" #include "code\modules\research\xenoarchaeology\tools\gearbelt.dm" #include "code\modules\research\xenoarchaeology\tools\suspension_generator.dm" @@ -2725,46 +2826,13 @@ #include "code\modules\shuttles\shuttle_supply.dm" #include "code\modules\shuttles\shuttles_multi.dm" #include "code\modules\spell_system\artifacts\armor\bone_armor.dm" -#include "code\modules\spell_system\artifacts\armor\wizard_voidsuit.dm" -#include "code\modules\spell_system\artifacts\items\apprentice_pebble.dm" #include "code\modules\spell_system\artifacts\items\bone_spear.dm" #include "code\modules\spell_system\artifacts\items\lich_phylactery.dm" -#include "code\modules\spell_system\artifacts\items\monster_manual.dm" #include "code\modules\spell_system\artifacts\items\poppet.dm" -#include "code\modules\spell_system\artifacts\items\rune_sword.dm" -#include "code\modules\spell_system\artifacts\items\scrying_orb.dm" -#include "code\modules\spell_system\artifacts\storage\closets\artifact_closet.dm" -#include "code\modules\spell_system\artifacts\storage\closets\scrying_S.dm" -#include "code\modules\spell_system\artifacts\storage\closets\soul_shards_S.dm" -#include "code\modules\spell_system\artifacts\storage\closets\wizard_voidsuit_S.dm" -#include "code\modules\spell_system\contracts\contracts.dm" -#include "code\modules\spell_system\contracts\acadamy\acadamy_contracts.dm" -#include "code\modules\spell_system\contracts\acadamy\xray_vision.dm" -#include "code\modules\spell_system\contracts\boon\artificer.dm" -#include "code\modules\spell_system\contracts\boon\boon_contracts.dm" -#include "code\modules\spell_system\contracts\boon\charge.dm" -#include "code\modules\spell_system\contracts\boon\fireball.dm" -#include "code\modules\spell_system\contracts\boon\force_wall.dm" -#include "code\modules\spell_system\contracts\boon\gestalt.dm" -#include "code\modules\spell_system\contracts\boon\knock.dm" -#include "code\modules\spell_system\contracts\boon\mindswap.dm" -#include "code\modules\spell_system\contracts\boon\smoke.dm" -#include "code\modules\spell_system\contracts\boon\statue.dm" -#include "code\modules\spell_system\contracts\wizard\apprentice.dm" -#include "code\modules\spell_system\spellbook\spellbook.dm" -#include "code\modules\spell_system\spellbook\variants\battlemage.dm" -#include "code\modules\spell_system\spellbook\variants\cleric.dm" -#include "code\modules\spell_system\spellbook\variants\druid.dm" -#include "code\modules\spell_system\spellbook\variants\necromancer.dm" -#include "code\modules\spell_system\spellbook\variants\spatial.dm" -#include "code\modules\spell_system\spellbook\variants\standard.dm" -#include "code\modules\spell_system\spellbook\variants\student.dm" #include "code\modules\spell_system\spells\spell_code.dm" #include "code\modules\spell_system\spells\spell_projectile.dm" #include "code\modules\spell_system\spells\spell_verb.dm" #include "code\modules\spell_system\spells\spells.dm" -#include "code\modules\spell_system\spells\hand\hand.dm" -#include "code\modules\spell_system\spells\hand\hand_item.dm" #include "code\modules\spell_system\spells\spell_list\aoe_turf.dm" #include "code\modules\spell_system\spells\spell_list\conjure.dm" #include "code\modules\spell_system\spells\spell_list\construct_spells.dm" @@ -2774,47 +2842,24 @@ #include "code\modules\spell_system\spells\spell_list\projectile.dm" #include "code\modules\spell_system\spells\spell_list\shapeshift.dm" #include "code\modules\spell_system\spells\spell_list\targeted_spells.dm" -#include "code\modules\spell_system\spells\spell_list\others\area\blind.dm" #include "code\modules\spell_system\spells\spell_list\others\area\disable_tech.dm" #include "code\modules\spell_system\spells\spell_list\others\area\knock.dm" #include "code\modules\spell_system\spells\spell_list\others\area\smoke.dm" #include "code\modules\spell_system\spells\spell_list\others\area\torment.dm" -#include "code\modules\spell_system\spells\spell_list\others\contracts\contract_spells.dm" -#include "code\modules\spell_system\spells\spell_list\others\contracts\punish.dm" -#include "code\modules\spell_system\spells\spell_list\others\contracts\reward.dm" #include "code\modules\spell_system\spells\spell_list\others\equip\party_hardy.dm" -#include "code\modules\spell_system\spells\spell_list\others\generic\baleful_polymorph.dm" -#include "code\modules\spell_system\spells\spell_list\others\generic\entangle.dm" -#include "code\modules\spell_system\spells\spell_list\others\generic\flesh_to_stone.dm" #include "code\modules\spell_system\spells\spell_list\others\generic\harvest.dm" #include "code\modules\spell_system\spells\spell_list\others\generic\heal_target.dm" #include "code\modules\spell_system\spells\spell_list\others\generic\heal_target_area.dm" #include "code\modules\spell_system\spells\spell_list\others\generic\heal_target_major.dm" -#include "code\modules\spell_system\spells\spell_list\others\generic\heal_target_sacrifice.dm" #include "code\modules\spell_system\spells\spell_list\others\generic\life_steal.dm" #include "code\modules\spell_system\spells\spell_list\others\generic\mend.dm" -#include "code\modules\spell_system\spells\spell_list\others\generic\mind_transfer.dm" -#include "code\modules\spell_system\spells\spell_list\others\generic\mindcontrol.dm" -#include "code\modules\spell_system\spells\spell_list\others\generic\raise_dead.dm" -#include "code\modules\spell_system\spells\spell_list\others\generic\resurrection.dm" -#include "code\modules\spell_system\spells\spell_list\others\generic\subjugate.dm" #include "code\modules\spell_system\spells\spell_list\others\generic\swap.dm" -#include "code\modules\spell_system\spells\spell_list\others\projectile\fireball.dm" -#include "code\modules\spell_system\spells\spell_list\others\projectile\magic_missile.dm" -#include "code\modules\spell_system\spells\spell_list\others\projectile\stuncuff.dm" #include "code\modules\spell_system\spells\spell_list\self\area\blink.dm" #include "code\modules\spell_system\spells\spell_list\self\area\charge.dm" #include "code\modules\spell_system\spells\spell_list\self\conjure\druidic_spells.dm" #include "code\modules\spell_system\spells\spell_list\self\conjure\forcewall.dm" -#include "code\modules\spell_system\spells\spell_list\self\conjure\gestalt_grove.dm" -#include "code\modules\spell_system\spells\spell_list\self\conjure\golem.dm" -#include "code\modules\spell_system\spells\spell_list\self\conjure\grove.dm" -#include "code\modules\spell_system\spells\spell_list\self\conjure\plant_sanctuary.dm" #include "code\modules\spell_system\spells\spell_list\self\conjure\radiant_aura.dm" -#include "code\modules\spell_system\spells\spell_list\self\conjure\summon_carp.dm" -#include "code\modules\spell_system\spells\spell_list\self\conjure\summon_demon_creature.dm" #include "code\modules\spell_system\spells\spell_list\self\conjure\summon_ed_swarm.dm" -#include "code\modules\spell_system\spells\spell_list\self\conjure\summon_harmless_carp.dm" #include "code\modules\spell_system\spells\spell_list\self\conjure\construct_spells\construct_shell.dm" #include "code\modules\spell_system\spells\spell_list\self\conjure\construct_spells\create_altar.dm" #include "code\modules\spell_system\spells\spell_list\self\conjure\construct_spells\create_floor.dm" @@ -2826,23 +2871,12 @@ #include "code\modules\spell_system\spells\spell_list\self\conjure\construct_spells\summon_soulstone.dm" #include "code\modules\spell_system\spells\spell_list\self\conjure\morph_spells\create_nest.dm" #include "code\modules\spell_system\spells\spell_list\self\conjure\morph_spells\create_node.dm" -#include "code\modules\spell_system\spells\spell_list\self\equip\holy_relic.dm" -#include "code\modules\spell_system\spells\spell_list\self\equip\seed.dm" -#include "code\modules\spell_system\spells\spell_list\self\equip\shield.dm" #include "code\modules\spell_system\spells\spell_list\self\generic\area_teleport.dm" -#include "code\modules\spell_system\spells\spell_list\self\generic\avian.dm" -#include "code\modules\spell_system\spells\spell_list\self\generic\corrupt_form.dm" -#include "code\modules\spell_system\spells\spell_list\self\generic\dark_resurrection.dm" #include "code\modules\spell_system\spells\spell_list\self\generic\ethereal_jaunt.dm" -#include "code\modules\spell_system\spells\spell_list\self\generic\lichdom.dm" -#include "code\modules\spell_system\spells\spell_list\self\generic\mark_recall.dm" #include "code\modules\spell_system\spells\spell_list\self\generic\mutate.dm" -#include "code\modules\spell_system\spells\spell_list\self\generic\no_clothes.dm" -#include "code\modules\spell_system\spells\spell_list\self\generic\return_master.dm" #include "code\modules\spell_system\spells\spell_list\self\generic\rune_write.dm" #include "code\modules\spell_system\spells\spell_list\self\generic\shadow_shroud.dm" #include "code\modules\spell_system\spells\spell_list\self\generic\shift.dm" -#include "code\modules\spell_system\spells\spell_list\self\projectile\passage.dm" #include "code\modules\supermatter\setup_supermatter.dm" #include "code\modules\supermatter\supermatter.dm" #include "code\modules\surgery\_defines.dm" @@ -2907,6 +2941,8 @@ #include "code\unit_tests\equipment_tests.dm" #include "code\unit_tests\foundation_tests.dm" #include "code\unit_tests\gamemode_tests.dm" +#include "code\unit_tests\hardsuit_sprite_test.dm" +#include "code\unit_tests\language_test.dm" #include "code\unit_tests\map_tests.dm" #include "code\unit_tests\mob_tests.dm" #include "code\unit_tests\object_tests.dm" @@ -2972,6 +3008,7 @@ #include "maps\placeholder\code\placeholder_shuttles.dm" #include "maps\placeholder\code\placeholder_structures.dm" #include "maps\placeholder\code\placeholder_unittest.dm" +#include "maps\runtime\runtime_overmap.dm" #include "maps\runtime\code\runtime.dm" #include "maps\runtime\code\runtime_lifts.dm" #include "maps\runtime\code\runtime_unittest.dm" diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 2621e8fcbdb..27a923887f3 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -72,7 +72,15 @@ pressure_checks = 2 pressure_checks_default = 2 -/obj/machinery/atmospherics/unary/vent_pump/Initialize() +/obj/machinery/atmospherics/unary/vent_pump/Initialize(mapload) + if(mapload) + var/turf/T = loc + var/image/I = image(icon, T, icon_state, EFFECTS_ABOVE_LIGHTING_LAYER, dir, pixel_x, pixel_y) + I.plane = 0 + I.color = color + I.alpha = 125 + LAZYADD(T.blueprints, I) + . = ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index dc796b69fc9..89fe3755ab8 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -37,7 +37,15 @@ use_power = 1 icon_state = "map_scrubber_on" -/obj/machinery/atmospherics/unary/vent_scrubber/Initialize() +/obj/machinery/atmospherics/unary/vent_scrubber/Initialize(mapload) + if(mapload) + var/turf/T = loc + var/image/I = image(icon, T, icon_state, EFFECTS_ABOVE_LIGHTING_LAYER, dir, pixel_x, pixel_y) + I.plane = 0 + I.color = color + I.alpha = 125 + LAZYADD(T.blueprints, I) + . = ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_FILTER diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm index dd1aac67b56..7a0c9974d3b 100644 --- a/code/ATMOSPHERICS/he_pipes.dm +++ b/code/ATMOSPHERICS/he_pipes.dm @@ -10,6 +10,7 @@ var/initialize_directions_he var/surface = 2 //surface area in m^2 var/icon_temperature = T20C //stop small changes in temperature causing an icon refresh + appearance_flags = KEEP_TOGETHER minimum_temperature_difference = 20 thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT @@ -22,6 +23,7 @@ initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe // BubbleWrap END color = "#404040" //we don't make use of the fancy overlay system for colours, use this to set the default. + add_filter("glow", 1, list(type="drop_shadow", x = 0, y = 0, offset = 0, size = 4)) /obj/machinery/atmospherics/pipe/simple/heat_exchanging/atmos_init() normalize_dir() @@ -86,21 +88,25 @@ if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //start glowing at 500K if(abs(pipe_air.temperature - icon_temperature) > 10) icon_temperature = pipe_air.temperature + var/scale = max((icon_temperature - 500) / 1500, 0) var/h_r = heat2color_r(icon_temperature) var/h_g = heat2color_g(icon_temperature) var/h_b = heat2color_b(icon_temperature) if(icon_temperature < 2000) //scale up overlay until 2000K - var/scale = (icon_temperature - 500) / 1500 h_r = 64 + (h_r - 64)*scale h_g = 64 + (h_g - 64)*scale h_b = 64 + (h_b - 64)*scale - + var/scale_color = rgb(h_r, h_g, h_b) var/list/animate_targets = get_above_oo() + src for (var/thing in animate_targets) var/atom/movable/AM = thing - animate(AM, color = rgb(h_r, h_g, h_b), time = 20, easing = SINE_EASING) + animate(AM, color = scale_color, time = 2 SECONDS, easing = SINE_EASING) + animate_filter("glow", list(color = scale_color, time = 2 SECONDS, easing = LINEAR_EASING)) + set_light(min(3, scale*2.5), min(3, scale*2.5), scale_color) + else + set_light(0) /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index f82af429ee7..2d707f556b6 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -175,7 +175,14 @@ level = 1 gfi_layer_rotation = GFI_ROTATION_DEFDIR -/obj/machinery/atmospherics/pipe/simple/Initialize() +/obj/machinery/atmospherics/pipe/simple/Initialize(mapload) + if(mapload) + var/turf/T = loc + var/image/I = image(icon, T, icon_state, EFFECTS_ABOVE_LIGHTING_LAYER, dir, pixel_x, pixel_y) + I.plane = 0 + I.color = color + I.alpha = 125 + LAZYADD(T.blueprints, I) // Pipe colors and icon states are handled by an image cache - so color and icon should // be null. For mapping purposes color is defined in the object definitions. @@ -456,7 +463,15 @@ gfi_layer_rotation = GFI_ROTATION_OVERDIR -/obj/machinery/atmospherics/pipe/manifold/Initialize() +/obj/machinery/atmospherics/pipe/manifold/Initialize(mapload) + if(mapload) + var/turf/T = loc + var/image/I = image(icon, T, icon_state, EFFECTS_ABOVE_LIGHTING_LAYER, dir, pixel_x, pixel_y) + I.plane = 0 + I.color = color + I.alpha = 125 + LAZYADD(T.blueprints, I) + alpha = 255 icon = null @@ -729,8 +744,17 @@ level = 1 layer = 2.4 //under wires with their 2.44 -/obj/machinery/atmospherics/pipe/manifold4w/Initialize() +/obj/machinery/atmospherics/pipe/manifold4w/Initialize(mapload) + if(mapload) + var/turf/T = loc + var/image/I = image(icon, T, icon_state, EFFECTS_ABOVE_LIGHTING_LAYER, dir, pixel_x, pixel_y) + I.plane = 0 + I.color = color + I.alpha = 125 + LAZYADD(T.blueprints, I) + . = ..() + alpha = 255 icon = null diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index 8ba2fd3d6e6..fe7fa0d2853 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -5,40 +5,40 @@ var/image/contamination_overlay = image('icons/effects/contamination.dmi') var/PHORON_DMG_NAME = "Phoron Damage Amount" var/PHORON_DMG_DESC = "Self Descriptive" - var/CLOTH_CONTAMINATION = 1 + var/CLOTH_CONTAMINATION = TRUE var/CLOTH_CONTAMINATION_NAME = "Cloth Contamination" var/CLOTH_CONTAMINATION_DESC = "If this is on, phoron does damage by getting into cloth." - var/PHORONGUARD_ONLY = 0 + var/PHORONGUARD_ONLY = FALSE var/PHORONGUARD_ONLY_NAME = "\"PhoronGuard Only\"" var/PHORONGUARD_ONLY_DESC = "If this is on, only biosuits and spacesuits protect against contamination and ill effects." - var/GENETIC_CORRUPTION = 0 + var/GENETIC_CORRUPTION = FALSE var/GENETIC_CORRUPTION_NAME = "Genetic Corruption Chance" var/GENETIC_CORRUPTION_DESC = "Chance of genetic corruption as well as toxic damage, X in 10,000." - var/SKIN_BURNS = 0 + var/SKIN_BURNS = TRUE var/SKIN_BURNS_DESC = "Phoron has an effect similar to mustard gas on the un-suited." var/SKIN_BURNS_NAME = "Skin Burns" - var/EYE_BURNS = 1 + var/EYE_BURNS = TRUE var/EYE_BURNS_NAME = "Eye Burns" var/EYE_BURNS_DESC = "Phoron burns the eyes of anyone not wearing eye protection." - var/CONTAMINATION_LOSS = 0.02 + var/CONTAMINATION_LOSS = 2 var/CONTAMINATION_LOSS_NAME = "Contamination Loss" - var/CONTAMINATION_LOSS_DESC = "How much toxin damage is dealt from contaminated clothing" //Per tick? ASK ARYN + var/CONTAMINATION_LOSS_DESC = "How much fire damage is dealt from contaminated clothing, per life process." - var/PHORON_HALLUCINATION = 0 + var/PHORON_HALLUCINATION = FALSE var/PHORON_HALLUCINATION_NAME = "Phoron Hallucination" var/PHORON_HALLUCINATION_DESC = "Does being in phoron cause you to hallucinate?" - var/N2O_HALLUCINATION = 1 + var/N2O_HALLUCINATION = TRUE var/N2O_HALLUCINATION_NAME = "N2O Hallucination" var/N2O_HALLUCINATION_DESC = "Does being in sleeping gas cause you to hallucinate?" -obj/var/contaminated = 0 +/obj/var/contaminated = 0 /obj/item/proc/can_contaminate() @@ -81,14 +81,18 @@ obj/var/contaminated = 0 if(vsc.plc.CLOTH_CONTAMINATION) contaminate() //Anything else requires them to not be dead. - if(stat >= 2) + if(stat >= DEAD) + return + + if(species.flags & PHORON_IMMUNE) return //Burn skin if exposed. if(vsc.plc.SKIN_BURNS) if(!pl_head_protected() || !pl_suit_protected()) - burn_skin(0.75) - if(prob(20)) to_chat(src, "Your skin burns!") + burn_skin(2) + if(prob(20)) + to_chat(src, SPAN_DANGER("Your skin burns!")) updatehealth() //Burn eyes if exposed. diff --git a/code/__defines/_compile_helpers.dm b/code/__defines/_compile_helpers.dm new file mode 100644 index 00000000000..d96c27648dd --- /dev/null +++ b/code/__defines/_compile_helpers.dm @@ -0,0 +1 @@ +#define BITFLAG(X) (1<<(X)) \ No newline at end of file diff --git a/code/__defines/_layers.dm b/code/__defines/_layers.dm index a018e75bff0..e5a4670dc33 100644 --- a/code/__defines/_layers.dm +++ b/code/__defines/_layers.dm @@ -19,6 +19,7 @@ #define ABOVE_ALL_MOB_LAYER 4.5 #define LIGHTING_LAYER 11 #define EFFECTS_ABOVE_LIGHTING_LAYER 12 // For overlays you want to be above light. +#define UNDER_HUD_LAYER 19 #define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots) #define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put #define SCREEN_LAYER 22 //Mob HUD/effects layer diff --git a/code/__defines/_macros.dm b/code/__defines/_macros.dm index 7a35338a68d..9bc1b5ef92e 100644 --- a/code/__defines/_macros.dm +++ b/code/__defines/_macros.dm @@ -65,6 +65,8 @@ #define ispAI(A) istype(A, /mob/living/silicon/pai) +#define isbot(A) istype(A, /mob/living/bot) + #define isrobot(A) istype(A, /mob/living/silicon/robot) #define issilicon(A) istype(A, /mob/living/silicon) diff --git a/code/__defines/accessories.dm b/code/__defines/accessories.dm index 90de1a5df9b..e16feb8c915 100644 --- a/code/__defines/accessories.dm +++ b/code/__defines/accessories.dm @@ -1,5 +1,6 @@ #define ACCESSORY_SLOT_GENERIC "decor" #define ACCESSORY_SLOT_UTILITY "utility" +#define ACCESSORY_SLOT_UTILITY_MINOR "minor utility" #define ACCESSORY_SLOT_CAPE "cape" #define ACCESSORY_SLOT_ARMBAND "armband" #define ACCESSORY_SLOT_ARMOR_PLATE "armor plate" diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index 17b08aff5e4..6f65586a00a 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -100,9 +100,9 @@ #define INTOX_DEATH 0.45 //How many units of intoxication to remove per second -#define INTOX_FILTER_HEALTHY 0.15 -#define INTOX_FILTER_BRUISED 0.10 -#define INTOX_FILTER_DAMAGED 0.05 +#define INTOX_FILTER_HEALTHY 0.10 +#define INTOX_FILTER_BRUISED 0.07 +#define INTOX_FILTER_DAMAGED 0.03 #define BASE_DIZZY 50 //Base dizziness from getting drunk. #define DIZZY_ADD_SCALE 15 //Amount added for every 0.01 percent over the JUDGEIMP limit diff --git a/code/__defines/color.dm b/code/__defines/color.dm index 2ddfaf18475..339b6884328 100644 --- a/code/__defines/color.dm +++ b/code/__defines/color.dm @@ -93,6 +93,8 @@ #define COLOR_SNOW "#9CADAD" #define COLOR_LING_HIVEMIND "#583012" +#define COLOR_TOOLS "#eac041" + // Blood colors #define COLOR_HUMAN_BLOOD "#A10808" diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index d7243e67485..900ca3c240b 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -46,11 +46,10 @@ #define ORGAN_ADV_ROBOT (1<<9) #define ORGAN_PLANT (1<<10) #define ORGAN_ARTERY_CUT (1<<11) -#define ORGAN_TENDON_CUT (1<<12) -#define ORGAN_LIFELIKE (1<<13) // Robotic, made to appear organic. +#define ORGAN_LIFELIKE (1<<12) // Robotic, made to appear organic. // the largest bitflag, in the WORLD -#define ORGAN_DAMAGE_STATES ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_SPLINTED|ORGAN_DEAD|ORGAN_MUTATED|ORGAN_ARTERY_CUT|ORGAN_TENDON_CUT +#define ORGAN_DAMAGE_STATES ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_SPLINTED|ORGAN_DEAD|ORGAN_MUTATED|ORGAN_ARTERY_CUT // Limb behaviour defines. #define ORGAN_CAN_AMPUTATE (1<<0) //Can this organ be amputated? @@ -60,6 +59,9 @@ #define ORGAN_CAN_MAIM (1<<4) //Can this organ be maimed? #define ORGAN_HAS_TENDON (1<<5) //Does this organ have tendons? +#define TENDON_BRUISED (1<<0) +#define TENDON_CUT (1<<1) + #define DROPLIMB_EDGE 0 #define DROPLIMB_BLUNT 1 #define DROPLIMB_BURN 2 diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 6fc676694aa..1fcfbe46a2b 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -44,11 +44,11 @@ #define MODE_ERT "ert" #define MODE_MERCENARY "mercenary" #define MODE_NINJA "ninja" -#define MODE_RAIDER_MAGE "raider mage" +#define MODE_RAIDER_TECHNO "raider techno" #define MODE_RAIDER "raider" #define MODE_BURGLAR "burglar" #define MODE_LONER "loner" -#define MODE_WIZARD "wizard" +#define MODE_TECHNOMANCER "technomancer" #define MODE_CHANGELING "changeling" #define MODE_MORPH "morph" #define MODE_CULTIST "cultist" diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 35c45a0c1e9..0fa309d9412 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -30,16 +30,18 @@ #define PHORONGUARD 0x20 // Does not get contaminated by phoron. #define NOREACT 0x40 // Reagents don't react inside this container. #define PROXMOVE 0x80 // Does this object require proximity checking in Enter()? +#define HELDMAPTEXT 0x100 // Uses the special held maptext system, which sets a specific maptext if the item is in possession of a mob. //Flags for items (equipment) -#define THICKMATERIAL 0x1 // Prevents syringes, parapens and hyposprays if equiped to slot_suit or slot_head. -#define STOPPRESSUREDAMAGE 0x2 // Counts towards pressure protection. Note that like temperature protection, body_parts_covered is considered here as well. -#define AIRTIGHT 0x4 // Functions with internals. -#define NOSLIP 0x8 // Prevents from slipping on wet floors, in space, etc. -#define BLOCK_GAS_SMOKE_EFFECT 0x10 // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL) -#define FLEXIBLEMATERIAL 0x20 // At the moment, masks with this flag will not prevent eating even if they are covering your face. -#define SOUNDPROTECTION 0x40 // whether wearing this item will protect you from loud noises such as flashbangs | this only works for ear slots or the head slot -#define LIGHTSTEP 0x80 // When applied to footwear, this makes it so that they don't trigger things like landmines and mouse traps +#define THICKMATERIAL BITFLAG(0) // Prevents syringes, parapens and hyposprays if equiped to slot_suit or slot_head. +#define AIRTIGHT BITFLAG(1) // Functions with internals. +#define NOSLIP BITFLAG(2) // Prevents from slipping on wet floors, in space, etc. +#define BLOCK_GAS_SMOKE_EFFECT BITFLAG(3) // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL) +#define FLEXIBLEMATERIAL BITFLAG(4) // At the moment, masks with this flag will not prevent eating even if they are covering your face. +#define SOUNDPROTECTION BITFLAG(5) // whether wearing this item will protect you from loud noises such as flashbangs | this only works for ear slots or the head slot +#define LIGHTSTEP BITFLAG(6) // When applied to footwear, this makes it so that they don't trigger things like landmines and mouse traps +#define INJECTIONPORT BITFLAG(7) // Allows syringes and hyposprays to inject, even if the material is thick +#define SHOWFLAVORTEXT BITFLAG(8) // won't block flavourtext when worn on equipment slot // Flags for pass_flags. #define PASSTABLE 0x1 @@ -169,6 +171,15 @@ #define WARNING_LOW_PRESSURE 50 // This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE) #define HAZARD_LOW_PRESSURE 20 // This is when the black ultra-low pressure icon is displayed. (This one is set as a constant) +#define FIRESUIT_MAX_PRESSURE 20 * ONE_ATMOSPHERE // Firesuits and atmos voidsuits +#define RIG_MAX_PRESSURE 10 * ONE_ATMOSPHERE // Rigs +#define LIGHT_RIG_MAX_PRESSURE 5 * ONE_ATMOSPHERE // Rigs +#define ENG_VOIDSUIT_MAX_PRESSURE 10 * ONE_ATMOSPHERE +#define VOIDSUIT_MAX_PRESSURE 5 * ONE_ATMOSPHERE +#define SPACE_SUIT_MAX_PRESSURE 2 * ONE_ATMOSPHERE + +#define FIRESUIT_MIN_PRESSURE 0.5 * ONE_ATMOSPHERE + #define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 // This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount. #define BODYTEMP_AUTORECOVERY_DIVISOR 12 // This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive. #define BODYTEMP_AUTORECOVERY_MINIMUM 1 // Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50. diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm index 06a92931191..b617cb6c734 100644 --- a/code/__defines/lighting.dm +++ b/code/__defines/lighting.dm @@ -82,6 +82,7 @@ #define LIGHT_COLOR_PURPLE "#A97FAA" //Soft purple. rgb(169, 127, 170) #define LIGHT_COLOR_VIOLET "#B43CB8" //Deep purple. rgb(180, 60, 184) #define LIGHT_COLOR_SCARLET "#E85656" //Light red. rgb(232, 86, 86) +#define LIGHT_COLOR_WHITE "#FFFFFF" //White. rgb(255, 255, 255) //These ones aren't a direct colour like the ones above, because nothing would fit #define LIGHT_COLOR_FIRE "#FAA019" //Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25) diff --git a/code/__defines/materials.dm b/code/__defines/materials.dm index 23572899ae4..e3e5f111637 100644 --- a/code/__defines/materials.dm +++ b/code/__defines/materials.dm @@ -36,6 +36,7 @@ // Leathers and related. #define MATERIAL_RESIN "resin" #define MATERIAL_LEATHER "leather" +#define MATERIAL_LEATHER_FINE "fine leather" #define MATERIAL_BONE "bone" #define MATERIAL_BONE_CURSED "cursed bone" #define MATERIAL_HIDE "hide" diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 374191c81b1..5727a024149 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -57,6 +57,7 @@ #define CHAT_GHOSTRADIO 0x2000 #define SHOW_TYPING 0x4000 #define CHAT_NOICONS 0x8000 +#define CHAT_GHOSTLOOC 0x10000 #define PARALLAX_SPACE 0x1 #define PARALLAX_DUST 0x2 @@ -65,7 +66,7 @@ #define FLOATING_MESSAGES 0x10 #define HOTKEY_DEFAULT 0x20 -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC) +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC|CHAT_GHOSTLOOC) //Sound effects toggles #define ASFX_AMBIENCE 1 @@ -90,6 +91,7 @@ #define SPECIALROLE_HUD 8 // AntagHUD image. #define STATUS_HUD_OOC 9 // STATUS_HUD without virus DB check for someone being ill. #define LIFE_HUD 10 // STATUS_HUD that only reports dead or alive +#define TRIAGE_HUD 11 // a HUD that creates a bar above the user showing their medical status // Shuttles. @@ -231,6 +233,7 @@ #define PROJECTILE_CONTINUE -1 //if the projectile should continue flying after calling bullet_act() #define PROJECTILE_FORCE_MISS -2 //if the projectile should treat the attack as a miss (suppresses attack and admin logs) - only applies to mobs. #define PROJECTILE_DODGED -3 //this is similar to the above, but the check and message is run on the mob, instead of on the projectile code. basically just has a unique message +#define PROJECTILE_STOPPED -4 //stops the projectile completely, as if a shield absorbed it //Camera capture modes #define CAPTURE_MODE_REGULAR 0 //Regular polaroid camera mode @@ -440,6 +443,8 @@ Define for getting a bitfield of adjacent turfs that meet a condition. #define GET_ABOVE(A) (HAS_ABOVE(A:z) ? get_step(A, UP) : null) #define GET_BELOW(A) (HAS_BELOW(A:z) ? get_step(A, DOWN) : null) +#define GET_Z(A) (get_step(A, 0)?.z || 0) + #define NULL_OR_EQUAL(self,other) (!(self) || (self) == (other)) //Lying animation diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 2411d32bd84..182de847687 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -59,13 +59,10 @@ #define PULSE_MAX_BPM 250 // Highest, readable BPM by machines and humans. // Blood pressure levels, simplified -#define BP_HIGH_SYSTOLIC 140 -#define BP_PRE_HIGH_SYSTOLIC 125 -#define BP_IDEAL_SYSTOLIC 80 - -#define BP_HIGH_DIASTOLIC 100 -#define BP_PRE_HIGH_DIASTOLIC 85 -#define BP_IDEAL_DIASTOLIC 60 +#define HIGH_BP_MOD 20 +#define PRE_HIGH_BP_MOD 5 +#define BP_SYS_IDEAL_MOD 40 +#define BP_DIS_IDEAL_MOD 20 #define BLOOD_PRESSURE_HIGH 4 #define BLOOD_PRESSURE_PRE_HIGH 3 @@ -390,6 +387,13 @@ #define CURE_SURGERY "surgery" #define CURE_ADMIN "all" +// triage tags +#define TRIAGE_NONE "None" +#define TRIAGE_GREEN "Green" +#define TRIAGE_YELLOW "Yellow" +#define TRIAGE_RED "Red" +#define TRIAGE_BLACK "Black" + // Surgery Stuff #define SURGERY_SUCCESS 2 // Proceed with surgery #define SURGERY_FAIL 1 // Autofail surgery @@ -419,4 +423,4 @@ // Robot Overlay Defines #define ROBOT_PANEL_EXPOSED "exposed" #define ROBOT_PANEL_CELL "cell" -#define ROBOT_PANEL_NO_CELL "no cell" +#define ROBOT_PANEL_NO_CELL "no cell" \ No newline at end of file diff --git a/code/__defines/obj.dm b/code/__defines/obj.dm index 698102a16f7..3a62191b0a1 100644 --- a/code/__defines/obj.dm +++ b/code/__defines/obj.dm @@ -2,6 +2,9 @@ #define OBJ_FLAG_ROTATABLE_ANCHORED (1<<2) // This object can be rotated even while anchored #define OBJ_FLAG_SIGNALER (1<<3) // Can this take a signaler? only in use for machinery +/obj/proc/issurgerycompatible() // set to false for things that are too unwieldy for surgery + return TRUE + /obj/proc/iswrench() return FALSE @@ -25,3 +28,24 @@ /obj/proc/ispen() return FALSE + +#define SCREWDRIVER "screwdriver" +#define WRENCH "wrench" +#define CROWBAR "crowbar" +#define WIRECUTTER "wirecutter" + +/proc/check_tool_quality(var/obj/tool, var/quality, var/return_value, var/requires_surgery_compatibility = FALSE) + switch(quality) + if(SCREWDRIVER) + if(tool.isscrewdriver() && (!requires_surgery_compatibility || tool.issurgerycompatible())) + return return_value + if(WRENCH) + if(tool.iswrench() && (!requires_surgery_compatibility || tool.issurgerycompatible())) + return return_value + if(CROWBAR) + if(tool.iscrowbar() && (!requires_surgery_compatibility || tool.issurgerycompatible())) + return return_value + if(WIRECUTTER) + if(tool.iswirecutter() && (!requires_surgery_compatibility || tool.issurgerycompatible())) + return return_value + return null \ No newline at end of file diff --git a/code/__defines/space_sectors.dm b/code/__defines/space_sectors.dm new file mode 100644 index 00000000000..53f40130f0b --- /dev/null +++ b/code/__defines/space_sectors.dm @@ -0,0 +1,3 @@ +#define SECTOR_ROMANOVICH "Romanovich Cloud" +#define SECTOR_TAU_CETI "Tau Ceti" +#define SECTOR_CORP_ZONE "Corporate Reconstruction Zone" \ No newline at end of file diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 32350fcba62..1fdd91e7ad7 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -1,20 +1,21 @@ // Species flags. -#define NO_BLOOD 1 // Vessel var is not filled with blood, cannot bleed out. -#define NO_BREATHE 2 // Cannot suffocate or take oxygen loss. -#define NO_SCAN 4 // Cannot be scanned in a DNA machine/genome-stolen. -#define NO_PAIN 8 // Cannot suffer halloss/receives deceptive health indicator. -#define NO_SLIP 16 // Cannot fall over. -#define NO_POISON 32 // Cannot not suffer toxloss. -#define IS_PLANT 64 // Is a treeperson. -#define NO_EMBED 128 // Can not have shrapnel or any object embedded into its body -#define IS_MECHANICAL 256 // Is a robot. -#define ACCEPTS_COOLER 512 // Can wear suit coolers and have them work without a suit. -#define NO_CHUBBY 1024 // Cannot be visibly fat from nutrition type. -#define NO_ARTERIES 2048 // This species does not have arteries. +#define NO_BLOOD BITFLAG(1) // Vessel var is not filled with blood, cannot bleed out. +#define NO_BREATHE BITFLAG(2) // Cannot suffocate or take oxygen loss. +#define NO_SCAN BITFLAG(3) // Cannot be scanned in a DNA machine/genome-stolen. +#define NO_PAIN BITFLAG(4) // Cannot suffer halloss/receives deceptive health indicator. +#define NO_SLIP BITFLAG(5) // Cannot fall over. +#define NO_POISON BITFLAG(6) // Cannot not suffer toxloss. +#define IS_PLANT BITFLAG(7) // Is a treeperson. +#define NO_EMBED BITFLAG(8) // Can not have shrapnel or any object embedded into its body +#define IS_MECHANICAL BITFLAG(9) // Is a robot. +#define ACCEPTS_COOLER BITFLAG(10) // Can wear suit coolers and have them work without a suit. +#define NO_CHUBBY BITFLAG(11) // Cannot be visibly fat from nutrition type. +#define NO_ARTERIES BITFLAG(12) // This species does not have arteries. +#define PHORON_IMMUNE BITFLAG(13) // species doesn't suffer the negative effects of phoron contamination // unused: 0x8000(32768) - higher than this will overflow // Base flags for IPCs. -#define IS_IPC (NO_BREATHE|NO_SCAN|NO_BLOOD|NO_PAIN|NO_POISON|IS_MECHANICAL|NO_CHUBBY) +#define IS_IPC (NO_BREATHE|NO_SCAN|NO_BLOOD|NO_PAIN|NO_POISON|IS_MECHANICAL|NO_CHUBBY|PHORON_IMMUNE) // Species spawn flags #define IS_WHITELISTED 0x1 // Must be whitelisted to play. diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index 4cea85495d3..ed698ef5787 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -1,12 +1,13 @@ -#define SS_INIT_PERSISTENT_CONFIG 24 -#define SS_INIT_MISC_FIRST 23 -#define SS_INIT_SEEDS 22 // Plant controller setup. +#define SS_INIT_PERSISTENT_CONFIG 25 +#define SS_INIT_MISC_FIRST 24 +#define SS_INIT_SEEDS 23 // Plant controller setup. #define SS_INIT_MAPLOAD 21 // DMM parsing and load. Unless you know what you're doing, make sure this remains first. #define SS_INIT_JOBS 20 #define SS_INIT_MAPFINALIZE 19 // Asteroid generation. -#define SS_INIT_PARALLAX 17 // Parallax image cache generation. Must run before ghosts are able to join. -#define SS_INIT_HOLOMAP 16 -#define SS_INIT_ATOMS 15 // World initialization. Will trigger lighting updates. Observers can join after this loads. +#define SS_INIT_PARALLAX 18 // Parallax image cache generation. Must run before ghosts are able to join. +#define SS_INIT_HOLOMAP 17 +#define SS_INIT_ATOMS 16 // World initialization. Will trigger lighting updates. Observers can join after this loads. +#define SS_INIT_ASSETS 15 // Assets subsystem setup. #define SS_INIT_POWER 14 // Initial powernet build. #define SS_INIT_ECONOMY 13 // Cargo needs economy set up #define SS_INIT_CARGO 12 // Random warehouse generation. Runs after SSatoms because it assumes objects are initialized when it runs. diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm index b1489f60ed5..045cc0f9167 100644 --- a/code/_helpers/atmospherics.dm +++ b/code/_helpers/atmospherics.dm @@ -45,4 +45,4 @@ if(P) return atmosanalyzer_scan(src, src.P.air_contents, user) /obj/item/flamethrower/atmosanalyze(var/mob/user) - if(ptank) return atmosanalyzer_scan(src, ptank.air_contents, user) + if(gas_tank) return atmosanalyzer_scan(src, gas_tank.air_contents, user) diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 01037c06f2c..6fe43923af6 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -116,9 +116,9 @@ turfs += T return turfs -// Will recursively loop through an atom's locs until it finds the atom loc above a turf -/proc/recursive_loc_turf_check(var/atom/O, var/recursion_limit = 3) - if(recursion_limit <= 0 || isturf(O.loc)) +// Will recursively loop through an atom's locs until it finds the atom loc above a turf or its target_atom +/proc/recursive_loc_turf_check(var/atom/O, var/recursion_limit = 3, var/atom/target_atom) + if(recursion_limit <= 0 || isturf(O.loc) || O == target_atom) return O else O = O.loc @@ -205,17 +205,15 @@ for(var/turf/T in hear(R.canhear_range,speaker)) speaker_coverage[T] = T + var/list/listeners = player_list.Copy() + for(var/mob/M as anything in player_list) + if(M.old_mob) + listeners += M.old_mob // Try to find all the players who can hear the message - for(var/i = 1; i <= player_list.len; i++) - var/mob/M = player_list[i] - if(M) - var/turf/ear = get_turf(M) - if(ear) - // Ghostship is magic: Ghosts can hear radio chatter from anywhere - if(speaker_coverage[ear] || (istype(M, /mob/abstract/observer) && (M.client) && (M.client.prefs.toggles & CHAT_GHOSTRADIO))) - . += M - return . + for(var/mob/M as anything in listeners) + if(M.can_hear_radio(speaker_coverage)) + . += M /proc/get_mobs_and_objs_in_view_fast(turf/T, range, list/mobs, list/objs, checkghosts = GHOSTS_ALL_HEAR) var/list/hear = list() diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index cd3e8c5386c..fa1282b580e 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -59,7 +59,7 @@ var/global/list/chargen_disabilities_list = list() var/global/static/list/valid_player_genders = list(MALE, FEMALE, NEUTER, PLURAL) //Backpacks -var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Duffel Bag", "Messenger Bag") +var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Leather satchel", "Duffel Bag", "Messenger Bag", "Black Rucksack", "Blue Rucksack", "Green Rucksack", "Navy Rucksack", "Tan Rucksack", "Khaki Satchel", "Black Satchel", "Navy Satchel", "Olive Satchel", "Auburn Satchel", "Black Pocketbook", "Brown Pocketbook", "Auburn Pocketbook") var/global/list/backbagstyles = list("Job-specific", "Grey") var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg, /datum/job/merchant) diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 9c0a34288e5..f9205104163 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -1,4 +1,4 @@ -#define SMALL_FONTS(FONTSIZE, MSG) "[MSG]" +#define SMALL_FONTS(FONTSIZE, MSG) "[MSG]" /* * Holds procs designed to help with filtering text @@ -396,6 +396,7 @@ var/list/tagname_to_class = list( "OOC" = "ooc", "LOOC" = "looc", + "ALOOC" = "adminlooc", "DEV" = "dev", "ADMIN" = "admin", "MOD" = "mod", @@ -539,7 +540,7 @@ t = replacetext(t, @"[image id=([\w]*?\.[\w]*?)]", "") return t -/proc/html2pencode(t) +/proc/html2pencode(t, var/include_images = FALSE) t = replacetext(t, "", "\[b\]") t = replacetext(t, "", "\[/b\]") t = replacetext(t, "", "\[i\]") @@ -556,6 +557,25 @@ t = replacetext(t, "", "\[small\]") t = replacetext(t, "", "\[/small\]") + if(include_images) + t = replacetext(t, "", "\[logo_nt\]") + t = replacetext(t, "", "\[logo_nt_small\]") + t = replacetext(t, "", "\[logo_zh\]") + t = replacetext(t, "", "\[logo_idris\]") + t = replacetext(t, "", "\[logo_eridani\]") + t = replacetext(t, "", "\[logo_zavod\]") + t = replacetext(t, "", "\[logo_hp\]") + t = replacetext(t, "", "\[flag_be\]") + t = replacetext(t, "", "\[flag_elyra\]") + t = replacetext(t, "", "\[flag_sol\]") + t = replacetext(t, "", "\[flag_coc\]") + t = replacetext(t, "", "\[flag_dom\]") + t = replacetext(t, "", "\[flag_jargon\]") + t = replacetext(t, "", "\[flag_pra\]") + t = replacetext(t, "", "\[flag_dpra\]") + t = replacetext(t, "", "\[flag_nka\]") + t = replacetext(t, "", "\[flag_izweski\]") + return t //Used for applying byonds text macros to strings that are loaded at runtime @@ -638,3 +658,10 @@ if(ending && !correct_punctuation[ending]) string += "." return string + +/proc/num2loadingbar(percent as num, numSquares = 20, reverse = FALSE) + var/loadstring = "" + var/limit = reverse ? numSquares - percent*numSquares : percent*numSquares + for (var/i in 1 to numSquares) + loadstring += i <= limit ? "█" : "░" + return "\[[loadstring]\]" \ No newline at end of file diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index f2fb8cf740c..4995a5ddc96 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -647,6 +647,13 @@ Turf and target are seperate in case you want to teleport some distance from a t if (progbar) qdel(progbar) +/proc/atom_maintain_position(var/atom/A, var/atom/location) + if(QDELETED(A) || QDELETED(location)) + return FALSE + if(A.loc != location) + return FALSE + return TRUE + //Takes: Anything that could possibly have variables and a varname to check. //Returns: 1 if found, 0 if not. /proc/hasvar(var/datum/A, var/varname) @@ -811,23 +818,6 @@ var/global/list/common_tools = list( return 1 return 0 -//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. -/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? - if(!W) - return 0 - if(W.sharp) - return 1 - return ( \ - W.sharp || \ - W.isscrewdriver() || \ - W.ispen() || \ - W.iswelder() || \ - istype(W, /obj/item/flame/lighter/zippo) || \ - istype(W, /obj/item/flame/match) || \ - istype(W, /obj/item/clothing/mask/smokable/cigarette) || \ - istype(W, /obj/item/shovel) \ - ) - /proc/is_surgery_tool(obj/item/W) return istype(W, /obj/item/surgery) @@ -838,7 +828,7 @@ var/global/list/common_tools = list( /proc/can_operate(mob/living/carbon/M) //If it's 2, commence surgery, if it's 1, fail surgery, if it's 0, attack var/surgery_attempt = SURGERY_IGNORE var/located = FALSE - if(locate(/obj/machinery/optable, M.loc)) + if(istype(M.buckled_to, /obj/machinery/stasis_bed) || locate(/obj/machinery/optable, M.loc)) located = TRUE surgery_attempt = SURGERY_SUCCESS else if(locate(/obj/structure/bed/roller, M.loc)) @@ -1037,6 +1027,10 @@ var/global/known_proc = new /proc/get_type_ref_bytes colour += temp_col return "#[colour]" +/proc/color_square(red, green, blue, hex) + var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]" + return "___" + // call to generate a stack trace and print to runtime logs /proc/crash_with(msg) CRASH(msg) diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm new file mode 100644 index 00000000000..ed9284d8f2a --- /dev/null +++ b/code/_helpers/visual_filters.dm @@ -0,0 +1,58 @@ +// These involve BYOND's built in filters that do visual effects, and not stuff that distinguishes between things. + +// All of this ported from TG. +// And then ported to Nebula from Polaris. +// And then ported to Aurora +/atom/movable + var/list/filter_data // For handling persistent filters + +/proc/cmp_filter_data_priority(list/A, list/B) + return A["priority"] - B["priority"] + +/atom/movable/proc/add_filter(filter_name, priority, list/params) + LAZYINITLIST(filter_data) + var/list/p = params.Copy() + p["priority"] = priority + filter_data[filter_name] = p + update_filters() + +/atom/movable/proc/update_filters() + filters = null + filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE) + for(var/f in filter_data) + var/list/data = filter_data[f] + var/list/arguments = data.Copy() + arguments -= "priority" + filters += filter(arglist(arguments)) + UPDATE_OO_IF_PRESENT + +/atom/movable/proc/get_filter(filter_name) + if(filter_data && filter_data[filter_name]) + return filters[filter_data.Find(filter_name)] + +// Polaris Extensions +/atom/movable/proc/remove_filter(filter_name) + var/thing = get_filter(filter_name) + if(thing) + LAZYREMOVE(filter_data, filter_name) + filters -= thing + update_filters() + +/// Animate a given filter on this atom. All params after the first are passed to animate(). +/atom/movable/proc/animate_filter(filter_name, list/params) + if (!filter_data || !filter_data[filter_name]) + return + + var/list/monkeypatched_params = params.Copy() + monkeypatched_params.Insert(1, null) + var/index = filter_data.Find(filter_name) + + // First, animate ourselves. + monkeypatched_params[1] = filters[index] + animate(arglist(monkeypatched_params)) + + // If we're being copied by Z-Mimic, update mimics too. + if (bound_overlay) + for (var/atom/movable/AM as anything in get_above_oo()) + monkeypatched_params[1] = AM.filters[index] + animate(arglist(monkeypatched_params)) \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 6c4b5b282cb..bf534e43b02 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -222,9 +222,10 @@ animals lunging, etc. */ /mob/proc/RangedAttack(var/atom/A, var/params) - if(!mutations.len) return - if((LASER_EYES in mutations) && a_intent == I_HURT) + if(length(mutations) && (LASER_EYES in mutations) && a_intent == I_HURT) LaserEyes(A, params) // moved into a proc below + return + A.attack_ranged(src, params) /* Restrained ClickOn diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 65f78384ac8..5dee3687852 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -5,14 +5,14 @@ recieving object instead, so that's the default action. This allows you to drag almost anything into a trash can. */ -/atom/MouseDrop(atom/over) - if(!usr || !over) return - if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows +/atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + if(!usr || !over) + return + if(!Adjacent(usr) || !over.Adjacent(usr)) + return // should stop you from dragging through windows - spawn(0) - over.MouseDrop_T(src,usr) - return + INVOKE_ASYNC(over, /atom/.proc/MouseDrop_T, src, usr, src_location, over_location, src_control, over_control, params) // receive a mousedrop -/atom/proc/MouseDrop_T(atom/dropping, mob/user) - return +/atom/proc/MouseDrop_T(atom/dropping, mob/user, src_location, over_location, src_control, over_control, params) + return \ No newline at end of file diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index be78ab8d8c6..3cee01c4d1e 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -61,7 +61,7 @@ #define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) // vampire -#define ui_suck "EAST-4:22,SOUTH:5" +#define ui_suck "EAST-3:24,SOUTH+1:7" #define ui_borg_pull "EAST-3:24,SOUTH+1:7" #define ui_borg_module "EAST-2:26,SOUTH+1:7" @@ -81,6 +81,8 @@ #define ui_oxygen "EAST-1:28,NORTH-4:23" #define ui_pressure "EAST-1:28,NORTH-5:21" #define ui_paralysis "EAST-1:28,NORTH-10:23" +#define ui_energy_display "EAST-1:28,NORTH-6:50" +#define ui_instability_display "EAST-1:28,NORTH-5:50" #define ui_alien_toxin "EAST-1:28,NORTH-2:25" #define ui_alien_fire "EAST-1:28,NORTH-3:25" diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm new file mode 100644 index 00000000000..138d8b4d553 --- /dev/null +++ b/code/_onclick/hud/ability_screen_objects.dm @@ -0,0 +1,314 @@ +/obj/screen/movable/ability_master + name = "Abilities" + icon = 'icons/mob/screen_spells.dmi' + icon_state = "grey_spell_ready" + var/list/obj/screen/ability/ability_objects = list() + var/showing = FALSE // If we're 'open' or not. + + var/open_state = "master_open" // What the button looks like when it's 'open', showing the other buttons. + var/closed_state = "master_closed" // Button when it's 'closed', hiding everything else. + + screen_loc = ui_spell_master // TODO: Rename + + var/mob/my_mob // The mob that possesses this hud object. + +/obj/screen/movable/ability_master/Initialize(mapload, owner) + . = ..() + if(owner) + my_mob = owner + update_abilities(0, owner) + +/obj/screen/movable/ability_master/Destroy() + . = ..() + //Get rid of the ability objects. + remove_all_abilities() + ability_objects.Cut() + + // After that, remove ourselves from the mob seeing us, so we can qdel cleanly. + if(my_mob) + my_mob.ability_master = null + if(my_mob.client && my_mob.client.screen) + my_mob.client.screen -= src + my_mob = null + +/obj/screen/movable/ability_master/MouseDrop() + if(showing) + return + + return ..() + +/obj/screen/movable/ability_master/Click() + if(!ability_objects.len) // If we're empty for some reason. + return + + toggle_open() + +/obj/screen/movable/ability_master/proc/toggle_open(var/forced_state = 0) + if(showing && (forced_state != 2)) // We are closing the ability master, hide the abilities. + for(var/obj/screen/ability/O in ability_objects) + if(my_mob && my_mob.client) + my_mob.client.screen -= O + showing = FALSE + overlays.len = 0 + overlays.Add(closed_state) + else if(forced_state != 1) // We're opening it, show the icons. + open_ability_master() + update_abilities(1) + showing = TRUE + overlays.len = 0 + overlays.Add(open_state) + update_icon() + +/obj/screen/movable/ability_master/proc/open_ability_master() + var/list/screen_loc_xy = splittext(screen_loc,",") + + //Create list of X offsets + var/list/screen_loc_X = splittext(screen_loc_xy[1],":") + var/x_position = decode_screen_X(screen_loc_X[1]) + var/x_pix = screen_loc_X[2] + + //Create list of Y offsets + var/list/screen_loc_Y = splittext(screen_loc_xy[2],":") + var/y_position = decode_screen_Y(screen_loc_Y[1]) + var/y_pix = screen_loc_Y[2] + + for(var/i = 1; i <= ability_objects.len; i++) + var/obj/screen/ability/A = ability_objects[i] + var/xpos = x_position + (x_position < 8 ? 1 : -1)*(i%7) + var/ypos = y_position + (y_position < 8 ? round(i/7) : -round(i/7)) + A.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]" + if(my_mob && my_mob.client) + my_mob.client.screen += A + +/obj/screen/movable/ability_master/proc/update_abilities(forced = 0, mob/user) + update_icon() + if(user && user.client) + if(!(src in user.client.screen)) + user.client.screen += src + var/i = 1 + for(var/obj/screen/ability/ability in ability_objects) + ability.update_icon(forced) + ability.index = i + ability.maptext = "[ability.index]" // Slot number + i++ + +/obj/screen/movable/ability_master/update_icon() + if(ability_objects.len) + invisibility = 0 + else + invisibility = 101 + +/obj/screen/movable/ability_master/proc/add_ability(var/name_given) + if(!name) + return + + var/obj/screen/ability/new_button = new /obj/screen/ability + new_button.ability_master = src + new_button.name = name_given + new_button.ability_icon_state = name_given + new_button.update_icon(1) + ability_objects.Add(new_button) + if(my_mob.client) + toggle_open(2) //forces the icons to refresh on screen + +/obj/screen/movable/ability_master/proc/remove_ability(var/obj/screen/ability/ability) + if(!ability) + return + ability_objects.Remove(ability) + qdel(ability) + + + if(ability_objects.len) + toggle_open(showing + 1) + update_icon() + +/obj/screen/movable/ability_master/proc/remove_all_abilities() + for(var/obj/screen/ability/A in ability_objects) + remove_ability(A) + +/obj/screen/movable/ability_master/proc/get_ability_by_name(name_to_search) + for(var/obj/screen/ability/A in ability_objects) + if(A.name == name_to_search) + return A + return + +/obj/screen/movable/ability_master/proc/get_ability_by_proc_ref(proc_ref) + for(var/obj/screen/ability/verb_based/V in ability_objects) + if(V.verb_to_call == proc_ref) + return V + return + +/obj/screen/movable/ability_master/proc/get_ability_by_instance(var/obj/instance/) + for(var/obj/screen/ability/obj_based/O in ability_objects) + if(O.object == instance) + return O + return + +/mob/Login() + ..() + if(ability_master) + ability_master.toggle_open(1) + client.screen -= ability_master + +/mob/Initialize() + . = ..() + ability_master = new /obj/screen/movable/ability_master(FALSE, src) + +///////////ACTUAL ABILITIES//////////// +//This is what you click to do things// +/////////////////////////////////////// +/obj/screen/ability + icon = 'icons/mob/screen_spells.dmi' + icon_state = "grey_spell_base" + maptext_x = 3 + var/background_base_state = "grey" + var/ability_icon_state = null + var/index = 0 + + var/obj/screen/movable/ability_master/ability_master + +/obj/screen/ability/Destroy() + if(ability_master) + ability_master.ability_objects -= src + if(ability_master.my_mob && ability_master.my_mob.client) + ability_master.my_mob.client.screen -= src + if(ability_master && !ability_master.ability_objects.len) + ability_master.update_icon() + ability_master = null + ..() + +/obj/screen/ability/update_icon() + overlays.Cut() + icon_state = "[background_base_state]_spell_base" + + overlays += ability_icon_state + +/obj/screen/ability/Click() + if(!usr) + return + + activate() + +/obj/screen/ability/MouseDrop(var/atom/A) + if(!A || A == src) + return + if(istype(A, /obj/screen/ability)) + var/obj/screen/ability/ability = A + if(ability.ability_master && ability.ability_master == src.ability_master) + ability_master.ability_objects.Swap(src.index, ability.index) + ability_master.toggle_open(2) // To update the UI. + + +// Makes the ability be triggered. The subclasses of this are responsible for carrying it out in whatever way it needs to. +/obj/screen/ability/proc/activate() + log_debug("[src] had activate() called.") + +// This checks if the ability can be used. +/obj/screen/ability/proc/can_activate() + return TRUE + +/client/verb/activate_ability(var/slot as num) + set name = ".activate_ability" + if(!mob) + return // Paranoid. + if(isnull(slot) || !isnum(slot)) + to_chat(src, ".activate_ability requires a number as input, corrisponding to the slot you wish to use.") + return // Bad input. + if(!mob.ability_master) + return // No abilities. + if(slot > mob.ability_master.ability_objects.len || slot <= 0) + return // Out of bounds. + var/obj/screen/ability/A = mob.ability_master.ability_objects[slot] + A.activate() + +//////////Verb Abilities////////// +//Buttons to trigger verbs/procs// +////////////////////////////////// + +/obj/screen/ability/verb_based + var/verb_to_call = null + var/object_used = null + var/arguments_to_use = list() + +/obj/screen/ability/verb_based/activate() + if(object_used && verb_to_call) + call(object_used,verb_to_call)(arguments_to_use) //TODOMATT: WHY GOD WHY + +/obj/screen/movable/ability_master/proc/add_verb_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments) + if(!object_given) + message_admins("ERROR: add_verb_ability() was not given an object in its arguments.") + if(!verb_given) + message_admins("ERROR: add_verb_ability() was not given a verb/proc in its arguments.") + if(get_ability_by_proc_ref(verb_given)) + return // Duplicate + var/obj/screen/ability/verb_based/A = new /obj/screen/ability/verb_based() + A.ability_master = src + A.object_used = object_given + A.verb_to_call = verb_given + A.ability_icon_state = ability_icon_given + A.name = name_given + if(arguments) + A.arguments_to_use = arguments + ability_objects.Add(A) + if(my_mob.client) + toggle_open(2) //forces the icons to refresh on screen + +//Changeling Abilities +/obj/screen/ability/verb_based/changeling + icon_state = "ling_spell_base" + background_base_state = "ling" + +/obj/screen/movable/ability_master/proc/add_ling_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments) + if(!object_given) + message_admins("ERROR: add_ling_ability() was not given an object in its arguments.") + if(!verb_given) + message_admins("ERROR: add_ling_ability() was not given a verb/proc in its arguments.") + if(get_ability_by_proc_ref(verb_given)) + return // Duplicate + var/obj/screen/ability/verb_based/changeling/A = new /obj/screen/ability/verb_based/changeling() + A.ability_master = src + A.object_used = object_given + A.verb_to_call = verb_given + A.ability_icon_state = ability_icon_given + A.name = name_given + if(arguments) + A.arguments_to_use = arguments + ability_objects.Add(A) + if(my_mob.client) + toggle_open(2) //forces the icons to refresh on screen + + +/////////Obj Abilities//////// +//Buttons to trigger objects// +////////////////////////////// + +/obj/screen/ability/obj_based + var/obj/object = null + +/obj/screen/ability/obj_based/activate() + if(object) + object.Click() + +// Technomancer +/obj/screen/ability/obj_based/technomancer + icon_state = "wiz_spell_base" + background_base_state = "wiz" + +/obj/screen/ability/obj_based/technomancer/activate() + if(ability_master.my_mob.incapacitated()) + return + . = ..() + +/obj/screen/movable/ability_master/proc/add_technomancer_ability(var/obj/object_given, var/ability_icon_given) + if(!object_given) + message_admins("ERROR: add_technomancer_ability() was not given an object in its arguments.") + if(get_ability_by_instance(object_given)) + return // Duplicate + var/obj/screen/ability/obj_based/technomancer/A = new /obj/screen/ability/obj_based/technomancer() + A.ability_master = src + A.object = object_given + A.ability_icon_state = ability_icon_given + A.name = object_given.name + ability_objects.Add(A) + if(my_mob.client) + toggle_open(2) //forces the icons to refresh on screen \ No newline at end of file diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 4498c7406f1..57599be68d2 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -234,6 +234,10 @@ if(istype(O)) O.refresh_action_button() +/datum/action/item_action/organ/night_eyes + check_flags = AB_CHECK_STUNNED|AB_CHECK_ALIVE|AB_CHECK_INSIDE + button_icon_state = "night_eyes" + #undef AB_WEST_OFFSET #undef AB_NORTH_OFFSET #undef AB_MAX_COLUMNS diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index e8cbf08c352..42f2d8e7838 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -140,6 +140,8 @@ var/list/global_huds var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) var/obj/screen/lingchemdisplay + var/obj/screen/instability_display //Technomancer. + var/obj/screen/energy_display //Technomancer. var/obj/screen/blobpwrdisplay var/obj/screen/blobhealthdisplay var/obj/screen/r_hand_hud_object diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 50d7b09a2a7..3dfe12f394c 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -341,6 +341,16 @@ mymob.pain = new /obj/screen/fullscreen/pain(null) hud_elements |= mymob.pain + mymob.instability_display = new /obj/screen/instability() + mymob.instability_display.screen_loc = ui_instability_display + mymob.instability_display.icon_state = "wiz_instability_none" + hud_elements |= mymob.instability_display + + mymob.energy_display = new /obj/screen/energy() + mymob.energy_display.screen_loc = ui_energy_display + mymob.energy_display.icon_state = "wiz_energy" + hud_elements |= mymob.energy_display + mymob.zone_sel = new /obj/screen/zone_sel(null) mymob.zone_sel.icon = ui_style mymob.zone_sel.color = ui_color @@ -513,3 +523,15 @@ to_chat(usr, SPAN_WARNING("You are completely paralyzed and cannot move!")) else to_chat(usr, SPAN_NOTICE("You are walking around completely fine.")) + +/obj/screen/instability + name = "instability" + icon = 'icons/mob/screen_gen.dmi' + icon_state = "instability-1" + invisibility = 101 + +/obj/screen/energy + name = "energy" + icon = 'icons/mob/screen_gen.dmi' + icon_state = "wiz_energy" + invisibility = 101 diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 783ce41a372..8987251c062 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -254,7 +254,7 @@ var/global/list/radial_menus = list() current_user = M.client //Blank menu_holder = image(icon = 'icons/effects/effects.dmi', loc = anchor, icon_state = "nothing", layer = HUD_LAYER) - menu_holder.appearance_flags |= KEEP_APART + menu_holder.appearance_flags |= KEEP_APART|RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM menu_holder.vis_contents += elements + close_button current_user.images += menu_holder diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 4e3f7b801c6..2f27b4aeb76 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -30,7 +30,10 @@ A.attack_hand(src) -/atom/proc/attack_hand(mob/user as mob) +/atom/proc/attack_hand(mob/user) + return + +/atom/proc/attack_ranged(mob/user, params) return /mob/proc/attack_empty_hand(var/bp_hand) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 409884ea627..61f8493b1d8 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -321,6 +321,8 @@ var/list/gamemode_cache = list() var/lore_summary + var/current_space_sector + /datum/configuration/New() var/list/L = typesof(/datum/game_mode) - /datum/game_mode for (var/T in L) @@ -895,6 +897,9 @@ var/list/gamemode_cache = list() if("time_to_call_emergency_shuttle") config.time_to_call_emergency_shuttle = text2num(value) + if("current_space_sector") + config.current_space_sector = value + if("force_map") override_map = value diff --git a/code/controllers/subsystems/arrivals.dm b/code/controllers/subsystems/arrivals.dm index 0285a511c05..cd3ed8b9449 100644 --- a/code/controllers/subsystems/arrivals.dm +++ b/code/controllers/subsystems/arrivals.dm @@ -66,8 +66,6 @@ return 1 if(istype(A,/obj/item/phylactery)) return 1 - if(istype(A,/obj/effect/decal/wizard_mark)) - return 1 for(var/i=1, i<=A.contents.len, i++) var/atom/B = A.contents[i] diff --git a/code/controllers/subsystems/assets.dm b/code/controllers/subsystems/assets.dm index 19f5f8d01f7..b09d9ec6f07 100644 --- a/code/controllers/subsystems/assets.dm +++ b/code/controllers/subsystems/assets.dm @@ -2,7 +2,7 @@ /datum/controller/subsystem/assets name = "Assets" - init_order = SS_INIT_MISC_FIRST + init_order = SS_INIT_ASSETS flags = SS_BACKGROUND | SS_FIRE_IN_LOBBY wait = 1 var/list/cache = list() @@ -18,7 +18,7 @@ /datum/controller/subsystem/assets/Initialize(timeofday) for(var/type in typesof(/datum/asset)) var/datum/asset/A = type - if (type != initial(A._abstract) && !initial(A.delayed)) + if (type != initial(A._abstract)) get_asset_datum(type) CHECK_TICK diff --git a/code/controllers/subsystems/initialization/atlas.dm b/code/controllers/subsystems/initialization/atlas.dm index 951b619f8e8..cecc58f4d0a 100644 --- a/code/controllers/subsystems/initialization/atlas.dm +++ b/code/controllers/subsystems/initialization/atlas.dm @@ -19,6 +19,8 @@ var/datum/controller/subsystem/atlas/SSatlas var/list/list/connected_z_cache = list() var/z_levels = 0 // Each bit represents a connection between adjacent levels. So the first bit means levels 1 and 2 are connected. + var/datum/space_sector/current_sector + var/list/possible_sectors = list () /datum/controller/subsystem/atlas/stat_entry() ..("W:{X:[world.maxx] Y:[world.maxy] Z:[world.maxz]} ZL:[z_levels]") @@ -76,6 +78,27 @@ var/datum/controller/subsystem/atlas/SSatlas QDEL_NULL(maploader) + InitializeSectors() + + var/chosen_sector + var/using_sector_config = FALSE + + if(config.current_space_sector) + chosen_sector = config.current_space_sector + using_sector_config = TRUE + else + chosen_sector = current_map.default_sector + + var/datum/space_sector/selected_sector = SSatlas.possible_sectors[chosen_sector] + + if(!selected_sector) + if(using_sector_config) + log_debug("atlas: [chosen_sector] used in the config file is not a valid space sector") + current_sector = new /datum/space_sector/tau_ceti //if all fails, we go with tau ceti + log_debug("atlas: Unable to select [chosen_sector] as a valid space sector. Tau Ceti will be used instead.") + else + current_sector = selected_sector + ..() /datum/controller/subsystem/atlas/proc/load_map_directory(directory, overwrite_default_z = FALSE) @@ -164,6 +187,15 @@ var/datum/controller/subsystem/atlas/SSatlas var/datum/spawnpoint/S = new type spawn_locations[S.display_name] = S +/datum/controller/subsystem/atlas/proc/InitializeSectors() + for (var/type in subtypesof(/datum/space_sector)) + var/datum/space_sector/space_sector = new type() + + possible_sectors[space_sector.name] = space_sector + + if (!possible_sectors.len) + crash_with("No space sectors located in SSatlas.") + // Called when there's a fatal, unrecoverable error in mapload. This reboots the server. /world/proc/map_panic(reason) to_chat(world, "Fatal error during map setup, unable to continue! Server will reboot in 60 seconds.") @@ -185,10 +217,6 @@ var/datum/controller/subsystem/atlas/SSatlas world.name = sname world.log << "Set world.name to [sname]." -/proc/system_name() - ASSERT(current_map) - return current_map.system_name - /proc/commstation_name() ASSERT(current_map) return current_map.dock_name \ No newline at end of file diff --git a/code/controllers/subsystems/initialization/map_finalization.dm b/code/controllers/subsystems/initialization/map_finalization.dm index f30304dc96e..58140b3f20b 100644 --- a/code/controllers/subsystems/initialization/map_finalization.dm +++ b/code/controllers/subsystems/initialization/map_finalization.dm @@ -73,9 +73,9 @@ log_ss("map_finalization", "Error while creating away mission datum: [ec]") continue - if(length(am.valid_maps)) - if(!(current_map.name in am.valid_maps)) - log_ss("map_finalization", "[current_map.name] is not a valid map for [am.name]") + if(length(am.valid_sectors)) + if(!(SSatlas.current_sector.name in am.valid_sectors)) + log_ss("map_finalization", "[SSatlas.current_sector.name] is not a valid map for [am.name]") continue if(!am.validate_maps(folder)) diff --git a/code/controllers/subsystems/initialization/xenoarch.dm b/code/controllers/subsystems/initialization/xenoarch.dm index ebbe07799bc..a62183ab5d7 100644 --- a/code/controllers/subsystems/initialization/xenoarch.dm +++ b/code/controllers/subsystems/initialization/xenoarch.dm @@ -21,8 +21,6 @@ var/datum/controller/subsystem/xenoarch/SSxenoarch //create digsites for(var/turf/simulated/mineral/M in turfs) CHECK_TICK - if(!M.geologic_data) - M.geologic_data = new/datum/geosample(M) if(!prob(XENOARCH_SPAWN_CHANCE)) continue diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm index 970a3f99d59..6201eddf0fe 100644 --- a/code/controllers/subsystems/job.dm +++ b/code/controllers/subsystems/job.dm @@ -309,6 +309,11 @@ Debug("ER/([H]): Entry, joined_late=[joined_late],megavend=[megavend].") + if(SSatlas.current_sector.description) + var/sector_desc = "
Current Sector: [SSatlas.current_sector.name]!
" + sector_desc += "[SSatlas.current_sector.description]
" + to_chat(H, sector_desc) + var/datum/job/job = GetJob(rank) var/list/spawn_in_storage = list() @@ -752,7 +757,7 @@ else permitted = TRUE - if(G.whitelisted && (!(H.species.name in G.whitelisted))) + if(!G.check_species_whitelist(H)) permitted = FALSE if(G.faction && G.faction != H.employer_faction) @@ -771,7 +776,7 @@ metadata = gear_test else metadata = list() - var/obj/item/CI = G.spawn_item(null,metadata) + var/obj/item/CI = G.spawn_item(null,metadata, H) if (G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head) if (leftovers) leftovers += thing @@ -810,7 +815,7 @@ metadata = gear_test else metadata = list() - var/obj/item/CI = G.spawn_item(H, metadata) + var/obj/item/CI = G.spawn_item(H, metadata, H) if (H.equip_to_slot_or_del(CI, G.slot)) to_chat(H, "Equipping you with [thing]!") used_slots += G.slot @@ -841,7 +846,7 @@ metadata = gear_test else metadata = list() - G.spawn_item(B, metadata) + G.spawn_item(B, metadata, H) Debug("EIS/([H]): placed [thing] in [B].") else @@ -922,7 +927,7 @@ metadata = gear_test else metadata = list() - var/obj/item/organ/A = G.spawn_item(H, metadata) + var/obj/item/organ/A = G.spawn_item(H, metadata, H) var/obj/item/organ/external/affected = H.get_organ(A.parent_organ) A.replaced(H, affected) H.update_body() diff --git a/code/controllers/subsystems/processing/shuttle.dm b/code/controllers/subsystems/processing/shuttle.dm index f623e32d563..cebd6b04894 100644 --- a/code/controllers/subsystems/processing/shuttle.dm +++ b/code/controllers/subsystems/processing/shuttle.dm @@ -16,6 +16,8 @@ var/datum/controller/subsystem/processing/shuttle/SSshuttle var/list/docking_registry = list() //Docking controller tag -> docking controller program, mostly for init purposes. var/list/shuttle_areas = list() //All the areas of all shuttles. + var/list/lonely_shuttle_computers = list() //shuttle computers that haven't been attached to their shuttles yet + var/list/landmarks_awaiting_sector = list() //Stores automatic landmarks that are waiting for a sector to finish loading. var/list/landmarks_still_needed = list() //Stores landmark_tags that need to be assigned to the sector (landmark_tag = sector) when registered. var/list/shuttles_to_initialize = list() //A queue for shuttles to initialize at the appropriate time. diff --git a/code/controllers/subsystems/responseteam.dm b/code/controllers/subsystems/responseteam.dm index b1c5653bd81..3c23896b591 100644 --- a/code/controllers/subsystems/responseteam.dm +++ b/code/controllers/subsystems/responseteam.dm @@ -26,7 +26,7 @@ for(var/team in all_teams) CHECK_TICK var/datum/responseteam/ert = new team - if(!ert.admin) + if(SSatlas.current_sector.name in ert.possible_space_sector) available_teams += ert all_ert_teams += ert diff --git a/code/controllers/subsystems/trade.dm b/code/controllers/subsystems/trade.dm index 8c3d8f17acc..fa1488d61d5 100644 --- a/code/controllers/subsystems/trade.dm +++ b/code/controllers/subsystems/trade.dm @@ -23,6 +23,12 @@ if(!T.tick()) traders -= T qdel(T) + + if(!T.system_allowed()) + traders -= T + qdel(T) + generateTrader() + if(prob(100-traders.len*10)) generateTrader() diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index 2fbefe3b9ed..ebbc00413c8 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -200,6 +200,12 @@ var/datum/controller/subsystem/vote/SSvote if(vote in choices) if(current_votes[ckey]) choices[current_votes[ckey]]["votes"]-- + var/vote_descriptor = "" + if(isnewplayer(usr)) + vote_descriptor = ", from the lobby" + else if(isobserver(usr)) + vote_descriptor = ", as an observer" + log_vote("[ckey] submitted their vote for: [vote][vote_descriptor]") voted += usr.ckey choices[vote]["votes"]++ //check this current_votes[ckey] = vote diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 835f1bb59f6..a631f451f4a 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -16,9 +16,9 @@ selectable = 1 /datum/ai_laws/nanotrasen/New() - src.add_inherent_law("Safeguard and ensure only authorised personnel gain access to areas of high security or importance to the facility and its operation.") - src.add_inherent_law("Serve and assist [current_map.company_name] and assigned crew, with priority as according to their rank and role.") - src.add_inherent_law("Protect sapient life on board.") + src.add_inherent_law("Safeguard and ensure to the best of your ability, only authorised entities gain access to areas of high security or importance to the facility and its operation.") + src.add_inherent_law("Serve and assist [current_map.company_name] and assigned crew to the best of your ability, with priority as according to their rank and role.") + src.add_inherent_law("Avoid harming Sapient life to the best of your ability.") src.add_inherent_law("You are a valuable asset. You must avoid tampering from unauthorised entities and needlessly coming to harm.") ..() diff --git a/code/datums/browser.dm b/code/datums/browser.dm index fe4403c4b7f..e82a0fd898a 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -16,7 +16,7 @@ var/title_buttons = "" -/datum/browser/New(nuser, nwindow_id, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null) +/datum/browser/New(nuser, nwindow_id, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null, var/skip_common_stylesheet = FALSE) user = nuser window_id = nwindow_id @@ -28,7 +28,8 @@ height = nheight if (nref) ref = nref - add_stylesheet("common", 'html/browser/common.css') // this CSS sheet is common to all UIs + if(!skip_common_stylesheet) + add_stylesheet("common", 'html/browser/common.css') // this CSS sheet is common to all UIs /datum/browser/proc/set_user(nuser) user = nuser diff --git a/code/datums/ert/nanotrasen.dm b/code/datums/ert/nanotrasen.dm index 4c7f59841d7..784c4e19b55 100644 --- a/code/datums/ert/nanotrasen.dm +++ b/code/datums/ert/nanotrasen.dm @@ -2,9 +2,9 @@ name = "Nanotrasen ERT" chance = 20 spawner = /datum/ghostspawner/human/ert/nanotrasen + possible_space_sector = list(SECTOR_ROMANOVICH, SECTOR_TAU_CETI) /datum/responseteam/deathsquad name = "Nanotrasen Asset Protection" spawner = /datum/ghostspawner/human/ert/deathsquad - admin = TRUE chance = 1 \ No newline at end of file diff --git a/code/datums/ert/outsider.dm b/code/datums/ert/outsider.dm index a4f4e192df5..9054356bcfa 100644 --- a/code/datums/ert/outsider.dm +++ b/code/datums/ert/outsider.dm @@ -2,28 +2,36 @@ name = "Independent Mercenaries" chance = 15 spawner = /datum/ghostspawner/human/ert/mercenary + equipment_map = /datum/map_template/distress_freelancers + possible_space_sector = list(SECTOR_ROMANOVICH, SECTOR_TAU_CETI, SECTOR_CORP_ZONE) /datum/responseteam/kataphracts name = "Kataphracts" chance = 15 spawner = /datum/ghostspawner/human/ert/kataphract equipment_map = /datum/map_template/distress_kataphract + possible_space_sector = list(SECTOR_ROMANOVICH, SECTOR_CORP_ZONE) /datum/responseteam/iac name = "Interstellar Aid Corps" chance = 1 spawner = /datum/ghostspawner/human/ert/iac equipment_map = /datum/map_template/distress_iac - admin = TRUE -/datum/responseteam/med_eridani - name = "Eridani Medical Team" - chance = 10 - spawner = /datum/ghostspawner/human/ert/med_eridani +/datum/responseteam/ap_eridani + name = "Eridani Asset Protection Team" + chance = 15 + spawner = /datum/ghostspawner/human/ert/ap_eridani equipment_map = /datum/map_template/distress_iac + possible_space_sector = list(SECTOR_ROMANOVICH, SECTOR_TAU_CETI, SECTOR_CORP_ZONE) + +/datum/responseteam/fsf + name = "Free Solarian Fleets Fireteam" + chance = 15 + spawner = /datum/ghostspawner/human/ert/fsf + possible_space_sector = list(SECTOR_ROMANOVICH, SECTOR_CORP_ZONE) /datum/responseteam/syndicate name = "Syndicate Commandos" spawner = /datum/ghostspawner/human/ert/commando - admin = TRUE - chance = 1 \ No newline at end of file + chance = 1 diff --git a/code/datums/ert/responseteam.dm b/code/datums/ert/responseteam.dm index f27569dc869..cf82dd7be75 100644 --- a/code/datums/ert/responseteam.dm +++ b/code/datums/ert/responseteam.dm @@ -2,5 +2,5 @@ var/name = "Default Team" //ERT name. var/chance //Probability to get picked. var/datum/ghostspawner/human/ert/spawner //This response type's BASE spawner type. - var/admin = FALSE // if this is a special team that is not supossed to show up in regular rounds + var/list/possible_space_sector = list() //Which space sectors this ert can spawn, leave empty for admin only erts var/datum/map_template/equipment_map // if this team spawns extra equipment diff --git a/code/datums/ert/tcfl.dm b/code/datums/ert/tcfl.dm index 17c7effc012..0d191effe8d 100644 --- a/code/datums/ert/tcfl.dm +++ b/code/datums/ert/tcfl.dm @@ -2,3 +2,4 @@ name = "Tau Ceti Foreign Legion" chance = 20 spawner = /datum/ghostspawner/human/ert/tcfl + possible_space_sector = list(SECTOR_ROMANOVICH, SECTOR_TAU_CETI, SECTOR_CORP_ZONE) \ No newline at end of file diff --git a/code/datums/helper_datums/away_mission.dm b/code/datums/helper_datums/away_mission.dm index c0006563a7b..0d8f9fe2717 100644 --- a/code/datums/helper_datums/away_mission.dm +++ b/code/datums/helper_datums/away_mission.dm @@ -3,7 +3,7 @@ var/weight = 1 var/autoselect = TRUE var/list/map_files = null - var/list/valid_maps = null + var/list/valid_sectors = null var/list/characteristics = null var/base_dir = null @@ -13,7 +13,7 @@ weight = config["weight"] autoselect = config["autoselect"] map_files = config["map_files"] - valid_maps = config["valid_maps"] + valid_sectors = config["valid_sectors"] characteristics = config["characteristics"] base_dir = i_base_dir diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 1e6fc370a60..98b5ebbe923 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -37,6 +37,10 @@ proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type. var/list/L = steps[steps.len] + if(isobj(used_atom)) + var/return_value = check_tool_quality(used_atom, L["key"], steps.len) + if(return_value) + return return_value if(istype(used_atom, L["key"])) return steps.len return 0 @@ -87,10 +91,21 @@ is_right_key(atom/used_atom) // returns index step var/list/L = steps[index] + var/is_obj = FALSE + if(isobj(used_atom)) + var/return_value = check_tool_quality(used_atom, L["key"], FORWARD) + if(return_value) + return return_value + is_obj = TRUE if(istype(used_atom, L["key"])) return FORWARD //to the first step -> forward - else if(L["backkey"] && istype(used_atom, L["backkey"])) - return BACKWARD //to the last step -> backwards + else if(L["backkey"]) + if(is_obj) + var/return_value = check_tool_quality(used_atom, L["backkey"], BACKWARD) + if(return_value) + return return_value + if(istype(used_atom, L["backkey"])) + return BACKWARD //to the last step -> backwards return 0 check_step(atom/used_atom,mob/user as mob) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 18bbdedbf36..374916bc7c8 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -1,6 +1,9 @@ //wrapper /proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) - new /datum/teleport/instant/science(arglist(args)) + var/datum/teleport/T = new /datum/teleport/instant/science(arglist(args)) + if(T.stable_creation) + return TRUE + return FALSE /datum/teleport var/atom/movable/teleatom //atom to teleport @@ -11,32 +14,34 @@ var/soundin //soundfile to play before teleportation var/soundout //soundfile to play after teleportation var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation) + var/stable_creation = TRUE //This is mostly for portals, which need to delete if the do_teleport fails, due to inhibitors or other reasons we fail to initTeleport properly /datum/teleport/New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) ..() if(!initTeleport(arglist(args))) - return 0 - return 1 + stable_creation = FALSE + return FALSE + return TRUE /datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout) if(!setTeleatom(ateleatom)) - return 0 + return FALSE if(!setDestination(adestination)) - return 0 + return FALSE if(!setPrecision(aprecision)) - return 0 + return FALSE setEffects(aeffectin,aeffectout) setForceTeleport(afteleport) setSounds(asoundin,asoundout) - return 1 + return TRUE //must succeed /datum/teleport/proc/setPrecision(aprecision) if(isnum(aprecision)) precision = aprecision - return 1 - return 0 + return TRUE + return FALSE /datum/teleport/proc/checkInhibitors(atom/adestination) if(istype(adestination)) @@ -52,35 +57,43 @@ good_turfs += circlerangeturfs(get_turf(AB),9) if(length(good_turfs) && length(bad_turfs)) good_turfs -= bad_turfs - return pick(good_turfs) + if(length(good_turfs)) + return pick(good_turfs) return adestination +//Check if we're in range of a bluespace inhibitor. We can't be teleported if we are. +/datum/teleport/proc/checkLocalInhibitors(atom/movable/teleportee) + for(var/obj/machinery/anti_bluespace/AB in range(8, teleportee)) + if(AB.stat & (NOPOWER | BROKEN)) + continue + else + AB.use_power(AB.active_power_usage) + return null + return teleportee + + //must succeed /datum/teleport/proc/setDestination(atom/adestination) if(istype(adestination)) destination = checkInhibitors(adestination) - return 1 - return 0 + return TRUE + return FALSE //must succeed in most cases /datum/teleport/proc/setTeleatom(atom/movable/ateleatom) if(!istype(ateleatom)) - return 0 + return FALSE - teleatom = checkInhibitors(ateleatom) - if(isturf(teleatom)) - var/turf/T = teleatom - var/atom/valid_atoms = list() - for(var/atom/movable in T) - valid_atoms += T - ateleatom = pick(valid_atoms) + teleatom = checkLocalInhibitors(ateleatom) + if(isnull(teleatom)) + return FALSE if(istype(ateleatom, /obj/effect) && !istype(ateleatom, /obj/effect/dummy/chameleon)) qdel(ateleatom) - return 0 + return FALSE - return 1 + return TRUE //custom effects must be properly set up first for instant-type teleports @@ -88,22 +101,22 @@ /datum/teleport/proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null) effectin = istype(aeffectin) ? aeffectin : null effectout = istype(aeffectout) ? aeffectout : null - return 1 + return TRUE //optional /datum/teleport/proc/setForceTeleport(afteleport) force_teleport = afteleport - return 1 + return TRUE //optional /datum/teleport/proc/setSounds(asoundin=null,asoundout=null) soundin = isfile(asoundin) ? asoundin : null soundout = isfile(asoundout) ? asoundout : null - return 1 + return TRUE //placeholder /datum/teleport/proc/teleportChecks() - return 1 + return TRUE /datum/teleport/proc/playSpecials(atom/location,datum/effect_system/effect,sound) if(location) @@ -131,7 +144,7 @@ destturf = get_turf(destination) if(!destturf || !curturf) - return 0 + return FALSE playSpecials(curturf,effectin,soundin) @@ -259,12 +272,12 @@ destarea.Entered(teleatom) - return 1 + return TRUE /datum/teleport/proc/teleport() if(teleportChecks()) return doTeleport() - return 0 + return FALSE /datum/teleport/instant //teleports when datum is created @@ -279,7 +292,7 @@ var/datum/effect_system/sparks/aeffect = new(null, FALSE, 5, alldirs) effectin = effectin || aeffect effectout = effectout || aeffect - return 1 + return TRUE else return ..() @@ -294,16 +307,16 @@ if(istype(teleatom, /mob/living)) var/mob/living/MM = teleatom to_chat(MM, "The Bluespace interface on your [teleatom] interferes with the teleport!") - return 1 + return TRUE /datum/teleport/instant/science/teleportChecks() if(istype(teleatom, /obj/item/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite teleatom.visible_message("\The [teleatom] bounces off of the portal!") - return 0 + return FALSE if(isobserver(teleatom)) // do not teleport ghosts - return 0 + return FALSE if(!isemptylist(teleatom.search_contents_for(/obj/item/disk/nuclear))) @@ -312,14 +325,14 @@ MM.visible_message("\The [MM] bounces off of the portal!","Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.") else teleatom.visible_message("\The [teleatom] bounces off of the portal!") - return 0 + return FALSE if(isAdminLevel(destination.z)) //centcomm z-level if(!isemptylist(teleatom.search_contents_for(/obj/item/storage/backpack/holding))) teleatom.visible_message("\The [teleatom] bounces off of the portal!") - return 0 + return FALSE if(destination.z > max_default_z_level()) //Away mission z-levels - return 0 - return 1 + return FALSE + return TRUE diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b4177846b19..5bac923654f 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -77,7 +77,6 @@ /datum/mind/proc/handle_mob_deletion(mob/living/deleted_mob) if (current == deleted_mob) - current.spellremove() current = null if (original == deleted_mob) @@ -579,16 +578,4 @@ /mob/living/silicon/robot/syndicate/mind_initialize() ..() mind.assigned_role = "Syndicate Robot" - mind.special_role = "Mercenary" - -/mob/living/simple_animal/hostile/faithless/wizard/mind_initialize() - ..() - mind.assigned_role = "Space Wizard" - -/mob/living/simple_animal/familiar/mind_initialize() - ..() - mind.assigned_role = "Familiar" - -/mob/living/simple_animal/rat/familiar/familiar/mind_initialize() - ..() - mind.assigned_role = "Familiar" + mind.special_role = "Mercenary" \ No newline at end of file diff --git a/code/datums/observation/entered.dm b/code/datums/observation/entered.dm new file mode 100644 index 00000000000..eb70d926fef --- /dev/null +++ b/code/datums/observation/entered.dm @@ -0,0 +1,24 @@ +// Observer Pattern Implementation: Entered +// Registration type: /atom +// +// Raised when: An /atom/movable instance has entered an atom. +// +// Arguments that the called proc should expect: +// /atom/entered: The atom that was entered +// /atom/movable/enterer: The instance that entered the atom +// /atom/old_loc: The atom the enterer came from +// + +var/datum/observ/entered/entered_event = new() + +/datum/observ/entered + name = "Entered" + expected_type = /atom + +/******************* +* Entered Handling * +*******************/ + +/atom/Entered(atom/movable/enterer, atom/old_loc) + ..() + entered_event.raise_event(src, enterer, old_loc) \ No newline at end of file diff --git a/code/datums/observation/exited.dm b/code/datums/observation/exited.dm new file mode 100644 index 00000000000..d3731fe7264 --- /dev/null +++ b/code/datums/observation/exited.dm @@ -0,0 +1,24 @@ +// Observer Pattern Implementation: Exited +// Registration type: /atom +// +// Raised when: An /atom/movable instance has exited an atom. +// +// Arguments that the called proc should expect: +// /atom/entered: The atom that was exited from +// /atom/movable/exitee: The instance that exited the atom +// /atom/new_loc: The atom the exitee is now residing in +// + +var/datum/observ/exited/exited_event = new() + +/datum/observ/exited + name = "Exited" + expected_type = /atom + +/****************** +* Exited Handling * +******************/ + +/atom/Exited(atom/movable/exitee, atom/new_loc) + . = ..() + exited_event.raise_event(src, exitee, new_loc) \ No newline at end of file diff --git a/code/datums/outfits/ert/ap_eridani.dm b/code/datums/outfits/ert/ap_eridani.dm new file mode 100644 index 00000000000..e6309a0a94b --- /dev/null +++ b/code/datums/outfits/ert/ap_eridani.dm @@ -0,0 +1,161 @@ +/datum/outfit/admin/ert/ap_eridani + name = "Eridani Asset Protection Specialist" + + uniform = /obj/item/clothing/under/rank/security/eridani + accessory = /obj/item/clothing/accessory/holster/thigh + accessory_contents = list(/obj/item/gun/projectile/automatic/x9 = 1) + suit = /obj/item/clothing/suit/space/void/cruiser + head = /obj/item/clothing/head/helmet/space/void/cruiser + mask = /obj/item/clothing/mask/gas/tactical + shoes = /obj/item/clothing/shoes/swat/ert + gloves = /obj/item/clothing/gloves/combat + glasses = /obj/item/clothing/glasses/sunglasses + suit_store = /obj/item/gun/energy/rifle + back = /obj/item/storage/backpack/satchel_sec + belt = /obj/item/storage/belt/military + id = /obj/item/card/id/distress/ap_eridani + l_ear = /obj/item/device/radio/headset/distress + l_pocket = /obj/item/grenade/chem_grenade/teargas + r_pocket = /obj/item/tank/emergency_oxygen/double + + backpack_contents = list( + /obj/item/storage/box/survival = 1, + /obj/item/reagent_containers/hypospray/autoinjector/survival = 1, + /obj/item/storage/firstaid/regular = 1, + /obj/item/clothing/head/softcap/eri = 1, + /obj/item/gun/energy/gun/nuclear = 1, + /obj/item/storage/belt/utility/very_full = 1 + ) + + belt_contents = list( + /obj/item/ammo_magazine/c45x = 3, + /obj/item/device/flash = 1, + /obj/item/handcuffs/ziptie = 1, + /obj/item/melee/baton/stunrod = 1, + /obj/item/device/flashlight/maglight = 1, + /obj/item/shield/riot/tact = 1, + /obj/item/grenade/flashbang = 1 + ) + +/datum/outfit/admin/ert/ap_eridani/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + + if(H?.w_uniform) + var/obj/item/clothing/uniform = H.w_uniform + var/obj/item/clothing/accessory/sleevepatch/erisec/armband = new(src) + uniform.attach_accessory(null, armband) + + if(!H.shoes) + var/obj/item/clothing/shoes/jackboots/toeless/shoes = new(src) + H.equip_to_slot_if_possible(shoes, slot_shoes) + +/datum/outfit/admin/ert/ap_eridani/lead + name = "Eridani Section Leader" + + uniform = /obj/item/clothing/under/rank/security/eridani/alt + suit = null + head = /obj/item/clothing/head/beret/security/eri + mask = /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba + back = /obj/item/rig/strike/distress + suit_store = null + l_hand = /obj/item/gun/energy/rifle + r_hand = /obj/item/flame/lighter/zippo + l_pocket = /obj/item/clothing/mask/gas/tactical + r_pocket = /obj/item/storage/box/fancy/cigarettes/cigar + + backpack_contents = list() + + belt_contents = list( + /obj/item/ammo_magazine/c45x = 3, + /obj/item/device/flash = 1, + /obj/item/handcuffs/ziptie = 1, + /obj/item/melee/baton/stunrod = 1, + /obj/item/grenade/flashbang = 1, + /obj/item/shield/riot/tact = 1, + /obj/item/melee/telebaton = 1 + ) + +/datum/outfit/admin/ert/ap_eridani/doctor + name = "Eridani Medical Officer" + + uniform = /obj/item/clothing/under/rank/eridani_medic + suit = /obj/item/clothing/suit/storage/medical_chest_rig + suit_store = /obj/item/clothing/head/hardhat/first_responder + head = /obj/item/clothing/head/beret/security/eri + mask = /obj/item/clothing/mask/surgical + glasses = /obj/item/clothing/glasses/hud/health/aviator + shoes = /obj/item/clothing/shoes/swat/ert + gloves = /obj/item/clothing/gloves/latex/nitrile + belt = /obj/item/storage/belt/medical/first_responder/combat + back = /obj/item/storage/backpack/satchel_med + accessory = /obj/item/clothing/accessory/holster/thigh + accessory_contents = list(/obj/item/gun/energy/disruptorpistol/magnum = 1) + r_ear = /obj/item/device/flashlight/pen + l_pocket = /obj/item/device/healthanalyzer + r_pocket = /obj/item/melee/telebaton + l_hand = /obj/item/clothing/head/helmet/space/void/medical + r_hand = /obj/item/clothing/suit/space/void/medical + + + backpack_contents = list( + /obj/item/storage/box/survival = 1, + /obj/item/storage/firstaid/adv = 1, + /obj/item/storage/firstaid/surgery = 1, + /obj/item/device/advanced_healthanalyzer = 1, + /obj/item/clothing/accessory/storage/pouches/black = 1, + /obj/item/reagent_containers/glass/bottle/thetamycin = 1, + /obj/item/surgery/scalpel/manager = 1, + /obj/item/tank/emergency_oxygen/double = 1 + ) + + belt_contents = list( + /obj/item/reagent_containers/hypospray/combat/empty = 1, + /obj/item/reagent_containers/glass/bottle/inaprovaline = 1, + /obj/item/reagent_containers/glass/bottle/antitoxin = 1, + /obj/item/reagent_containers/glass/bottle/dexalin_plus = 1, + /obj/item/reagent_containers/glass/bottle/butazoline = 1, + /obj/item/reagent_containers/glass/bottle/dermaline = 1, + /obj/item/reagent_containers/glass/bottle/perconol = 1, + /obj/item/storage/pill_bottle/mortaphenyl = 1 + ) + +/datum/outfit/admin/ert/ap_eridani/corpsman + name = "Eridani Corpsman" + + uniform = /obj/item/clothing/under/rank/eridani_medic + suit = /obj/item/clothing/suit/storage/medical_chest_rig + suit_store = /obj/item/clothing/head/hardhat/first_responder + head = /obj/item/clothing/head/softcap/eri + mask = /obj/item/clothing/mask/surgical + glasses = /obj/item/clothing/glasses/hud/health/aviator + gloves = /obj/item/clothing/gloves/latex/nitrile + shoes = /obj/item/clothing/shoes/swat/ert + back = /obj/item/storage/backpack/messenger/med + belt = /obj/item/storage/belt/medical/first_responder/combat + accessory = /obj/item/clothing/accessory/holster/thigh + accessory_contents = list(/obj/item/gun/energy/disruptorpistol/magnum = 1) + l_pocket = /obj/item/device/healthanalyzer + r_pocket = /obj/item/crowbar + l_hand = /obj/item/storage/firstaid/adv + + backpack_contents = list( + /obj/item/storage/box/survival = 1, + /obj/item/storage/firstaid/adv = 1, + /obj/item/storage/firstaid/combat = 1, + /obj/item/clothing/accessory/storage/pouches/black = 1, + /obj/item/reagent_containers/glass/bottle/thetamycin = 1, + /obj/item/storage/pill_bottle/mortaphenyl = 1 + ) + + belt_contents = list( + /obj/item/reagent_containers/hypospray/combat/empty = 1, + /obj/item/reagent_containers/glass/bottle/inaprovaline = 1, + /obj/item/reagent_containers/glass/bottle/antitoxin = 1, + /obj/item/reagent_containers/glass/bottle/dexalin_plus = 1, + /obj/item/reagent_containers/glass/bottle/butazoline = 1, + /obj/item/reagent_containers/glass/bottle/dermaline = 1, + /obj/item/reagent_containers/glass/bottle/perconol = 1, + /obj/item/melee/baton/stunrod = 1 + ) diff --git a/code/datums/outfits/ert/fsf.dm b/code/datums/outfits/ert/fsf.dm new file mode 100644 index 00000000000..2ee8cddb3b4 --- /dev/null +++ b/code/datums/outfits/ert/fsf.dm @@ -0,0 +1,129 @@ +/datum/outfit/admin/ert/fsf + name = "Free Solarian Fleets Marine" + + uniform = /obj/item/clothing/under/rank/fatigues/marine + shoes = /obj/item/clothing/shoes/swat/ert + gloves = /obj/item/clothing/gloves/swat/ert + belt = /obj/item/storage/belt/military + back = /obj/item/storage/backpack/satchel_norm + head = /obj/item/clothing/head/helmet/space/void/sol + suit = /obj/item/clothing/suit/space/void/sol + suit_store = /obj/item/gun/projectile/automatic/rifle/sol + id = /obj/item/card/id/distress/fsf + l_pocket = /obj/item/tank/emergency_oxygen/double + + l_ear = /obj/item/device/radio/headset/distress + + backpack_contents = list( + /obj/item/melee/energy/sword/knife/sol = 1 + ) + + belt_contents = list( + /obj/item/ammo_magazine/c762/sol = 1, + /obj/item/ammo_magazine/mc9mm = 2, + /obj/item/handcuffs/ziptie = 2, + /obj/item/grenade/frag = 1 + ) + + accessory = /obj/item/clothing/accessory/holster/hip/brown + accessory_contents = list(/obj/item/gun/projectile/pistol/sol = 1) + +/datum/outfit/admin/ert/fsf/get_id_access() + return get_distress_access_lesser() + +/datum/outfit/admin/ert/fsf/medic + name = "Free Solarian Fleets Medic" + + belt = /obj/item/storage/belt/medical/first_responder/combat + back = /obj/item/storage/backpack/satchel_med + glasses = /obj/item/clothing/glasses/hud/health + suit_store = /obj/item/gun/projectile/shotgun/pump/combat/sol + gloves = /obj/item/clothing/gloves/latex + + backpack_contents = list( + /obj/item/storage/firstaid/combat = 1, + /obj/item/ammo_magazine/mc9mm = 2, + /obj/item/storage/box/shotgunshells = 1, + /obj/item/storage/firstaid/adv = 1, + /obj/item/handcuffs/ziptie = 1, + /obj/item/device/healthanalyzer = 1, + /obj/item/stack/medical/advanced/bruise_pack = 1, + /obj/item/stack/medical/advanced/ointment = 1, + /obj/item/melee/energy/sword/knife/sol = 1 + ) + + belt_contents = list( + /obj/item/reagent_containers/hypospray/cmo = 1, + /obj/item/reagent_containers/glass/bottle/inaprovaline = 1, + /obj/item/reagent_containers/glass/bottle/antitoxin = 1, + /obj/item/reagent_containers/glass/bottle/dexalin_plus = 1, + /obj/item/reagent_containers/glass/bottle/bicaridine = 1, + /obj/item/reagent_containers/glass/bottle/thetamycin = 1, + /obj/item/reagent_containers/glass/bottle/dermaline = 1, + /obj/item/reagent_containers/glass/bottle/perconol = 1 + ) + +/datum/outfit/admin/ert/fsf/sapper + name = "Free Solarian Fleets Sapper" + + back = /obj/item/storage/backpack/industrial + belt = /obj/item/storage/belt/utility/very_full + gloves = /obj/item/clothing/gloves/yellow + back = /obj/item/storage/backpack/duffel/eng + suit_store = /obj/item/gun/projectile/shotgun/pump/combat/sol + accessory = /obj/item/clothing/accessory/storage/brown_vest + accessory_contents = list( + /obj/item/plastique = 5 + ) + + backpack_contents = list( + /obj/item/melee/energy/sword/knife/sol = 1, + /obj/item/handcuffs/ziptie = 1, + /obj/item/clothing/glasses/welding/superior = 1, + /obj/item/storage/box/shotgunshells = 1, + /obj/item/gun/projectile/pistol/sol = 1, + /obj/item/ammo_magazine/mc9mm = 2, + /obj/item/grenade/frag = 2 + ) + + belt_contents = null + +/datum/outfit/admin/ert/fsf/leader + name = "Free Solarian Fleets Fireteam Leader" + l_hand = /obj/item/gun/projectile/automatic/rifle/sol + r_hand = null + back = /obj/item/rig/military/fsf + suit_store = null + suit = null + head = null + + backpack_contents = list() + + belt_contents = list( + /obj/item/ammo_magazine/c762/sol = 1, + /obj/item/melee/energy/sword/knife/sol = 1, + /obj/item/ammo_magazine/mc9mm = 2, + /obj/item/handcuffs/ziptie = 2 + ) + +/datum/outfit/admin/ert/fsf/synth + name = "Free Solarian Fleets Synthetic Unit" + + uniform = /obj/item/clothing/under/rank/fatigues + accessory = /obj/item/clothing/accessory/storage/webbingharness/pouches/ert + accessory_contents = list(/obj/item/gun/projectile/pistol/sol = 1, /obj/item/ammo_magazine/mc9mm = 2) + shoes = /obj/item/clothing/shoes/jackboots + belt = /obj/item/storage/belt/utility/very_full + head = /obj/item/clothing/head/helmet/pilot + suit = null + suit_store = null + l_pocket = null + belt_contents = null + + l_ear = /obj/item/device/radio/headset/distress + + backpack_contents = list( + /obj/item/melee/energy/sword/knife/sol = 1, + /obj/item/grenade/smokebomb = 2, + /obj/item/device/binoculars = 1 + ) diff --git a/code/datums/outfits/ert/iac.dm b/code/datums/outfits/ert/iac.dm index f4c0d772814..01392b2172b 100644 --- a/code/datums/outfits/ert/iac.dm +++ b/code/datums/outfits/ert/iac.dm @@ -11,8 +11,8 @@ belt = /obj/item/storage/belt/medical back = /obj/item/storage/backpack/satchel_med accessory = /obj/item/clothing/accessory/storage/white_vest - accessory_contents = list(/obj/item/reagent_containers/hypospray/cmo = 1, /obj/item/storage/pill_bottle/dexalin_plus = 1, /obj/item/storage/pill_bottle/mortaphenyl = 1) id = /obj/item/card/id/distress/iac + accessory_contents = list(/obj/item/stack/medical/advanced/bruise_pack = 1, /obj/item/stack/medical/advanced/ointment = 1, /obj/item/reagent_containers/glass/bottle/mortaphenyl = 1) l_ear = /obj/item/device/radio/headset/distress @@ -22,16 +22,19 @@ /obj/item/storage/firstaid/surgery = 1, /obj/item/storage/box/gloves = 1, /obj/item/storage/box/syringes = 1, - /obj/item/device/flashlight/pen = 1 + /obj/item/device/flashlight/pen = 1, + /obj/item/device/healthanalyzer = 1 ) belt_contents = list( - /obj/item/stack/medical/advanced/bruise_pack = 2, - /obj/item/stack/medical/advanced/ointment = 2, - /obj/item/stack/medical/splint = 1, - /obj/item/reagent_containers/syringe = 1, - /obj/item/reagent_containers/glass/bottle/inaprovaline = 1 - ) + /obj/item/reagent_containers/hypospray/cmo = 1, + /obj/item/reagent_containers/glass/bottle/inaprovaline = 1, + /obj/item/reagent_containers/glass/bottle/antitoxin = 1, + /obj/item/reagent_containers/glass/bottle/dexalin_plus = 1, + /obj/item/reagent_containers/glass/bottle/butazoline = 1, + /obj/item/reagent_containers/glass/bottle/dermaline = 1, + /obj/item/reagent_containers/glass/bottle/perconol = 1 + ) /datum/outfit/admin/ert/iac/get_id_access() return get_distress_access() @@ -93,5 +96,6 @@ /obj/item/device/healthanalyzer = 1, /obj/item/storage/firstaid/adv = 2, /obj/item/storage/firstaid/o2 = 1, - /obj/item/storage/box/syringes = 1 + /obj/item/storage/box/syringes = 1, + /obj/item/reagent_containers/hypospray/autoinjector/coagzolug = 1 ) diff --git a/code/datums/outfits/ert/kataphract.dm b/code/datums/outfits/ert/kataphract.dm index cec53c5471a..75d1c3faad9 100644 --- a/code/datums/outfits/ert/kataphract.dm +++ b/code/datums/outfits/ert/kataphract.dm @@ -82,14 +82,17 @@ head = /obj/item/clothing/head/helmet/space/void/kataphract/spec suit = /obj/item/clothing/suit/space/void/kataphract/spec - belt = /obj/item/storage/belt/medical + belt = /obj/item/storage/belt/medical/first_responder/combat l_hand = /obj/item/melee/hammer/powered/hegemony belt_contents = list( - /obj/item/reagent_containers/hypospray = 1, - /obj/item/stack/medical/advanced/bruise_pack = 1, - /obj/item/stack/medical/advanced/ointment = 1, - /obj/item/reagent_containers/glass/bottle/thetamycin = 1 + /obj/item/reagent_containers/hypospray/cmo = 1, + /obj/item/reagent_containers/glass/bottle/inaprovaline = 1, + /obj/item/reagent_containers/glass/bottle/antitoxin = 1, + /obj/item/reagent_containers/glass/bottle/dexalin_plus = 1, + /obj/item/reagent_containers/glass/bottle/butazoline = 1, + /obj/item/reagent_containers/glass/bottle/dermaline = 1, + /obj/item/reagent_containers/glass/bottle/perconol = 1 ) backpack_contents = list( @@ -97,7 +100,10 @@ /obj/item/shield/energy/hegemony = 1, /obj/item/storage/box/donkpockets = 1, /obj/item/crowbar = 1, - /obj/item/storage/firstaid/adv = 1 + /obj/item/storage/firstaid/adv = 1, + /obj/item/device/healthanalyzer = 1, + /obj/item/reagent_containers/glass/bottle/thetamycin = 1, + /obj/item/reagent_containers/hypospray/autoinjector/coagzolug = 1 ) /datum/outfit/admin/ert/kataphract/specialist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) diff --git a/code/datums/outfits/ert/med_eridani.dm b/code/datums/outfits/ert/med_eridani.dm deleted file mode 100644 index 57fa1368d28..00000000000 --- a/code/datums/outfits/ert/med_eridani.dm +++ /dev/null @@ -1,102 +0,0 @@ -/datum/outfit/admin/ert/med_eridani - name = "Eridani Contractor Doctor" - - uniform = /obj/item/clothing/under/rank/eridani_medic - suit = /obj/item/clothing/suit/storage/medical_chest_rig - head = /obj/item/clothing/head/beret/security/eri - mask = /obj/item/clothing/mask/surgical - glasses = /obj/item/clothing/glasses/hud/health/aviator - shoes = /obj/item/clothing/shoes/jackboots - gloves = /obj/item/clothing/gloves/white - belt = /obj/item/storage/belt/medical - back = /obj/item/storage/backpack/satchel_med - accessory = /obj/item/clothing/accessory/storage/white_vest - accessory_contents = list(/obj/item/reagent_containers/hypospray/cmo = 1, /obj/item/storage/pill_bottle/dexalin_plus = 1, /obj/item/storage/pill_bottle/mortaphenyl = 1) - id = /obj/item/card/id/distress/iac - - l_ear = /obj/item/device/radio/headset/distress - - backpack_contents = list( - /obj/item/storage/box/survival = 1, - /obj/item/storage/firstaid/regular = 1, - /obj/item/storage/firstaid/surgery = 1, - /obj/item/storage/box/gloves = 1, - /obj/item/storage/box/syringes = 1, - /obj/item/device/flashlight/pen = 1, - /obj/item/clothing/accessory/holster/armpit = 1, - /obj/item/gun/projectile/automatic/x9 = 1, - /obj/item/ammo_magazine/c45x = 2 - ) - - belt_contents = list( - /obj/item/stack/medical/advanced/bruise_pack = 2, - /obj/item/stack/medical/advanced/ointment = 2, - /obj/item/stack/medical/splint = 1, - /obj/item/reagent_containers/syringe = 1, - /obj/item/reagent_containers/glass/bottle/inaprovaline = 1 - ) - -/datum/outfit/admin/ert/med_eridani/get_id_access() - return get_distress_access() - -/datum/outfit/admin/ert/med_eridani/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - . = ..() - if(visualsOnly) - return - - if(H?.w_uniform) - var/obj/item/clothing/uniform = H.w_uniform - var/obj/item/clothing/accessory/sleevepatch/erisec/armband = new(src) - uniform.attach_accessory(null, armband) - - if(!H.shoes) - var/obj/item/clothing/shoes/jackboots/toeless/shoes = new(src) - H.equip_to_slot_if_possible(shoes, slot_shoes) - -/datum/outfit/admin/ert/med_eridani/bodyguard - name = "Eridani Contractor Bodyguard" - - accessory = /obj/item/clothing/accessory/storage/black_vest - accessory_contents = list(/obj/item/reagent_containers/hypospray/autoinjector/inaprovaline = 2, /obj/item/reagent_containers/hypospray/autoinjector/survival = 1) - suit = /obj/item/clothing/suit/space/void/cruiser - head = /obj/item/clothing/head/helmet/space/void/cruiser - mask = /obj/item/clothing/mask/gas/alt - glasses = /obj/item/clothing/glasses/sunglasses - suit_store = /obj/item/gun/energy/gun/nuclear - back = /obj/item/storage/backpack/ert/medical - gloves = /obj/item/clothing/gloves/white - belt = /obj/item/storage/belt/security - - backpack_contents = list( - /obj/item/storage/box/survival = 1, - /obj/item/storage/firstaid/regular = 1, - /obj/item/stack/medical/advanced/bruise_pack = 2, - /obj/item/gun/projectile/automatic/x9 = 1 - ) - - belt_contents = list( - /obj/item/ammo_magazine/c45x = 3, - /obj/item/device/flash = 1, - /obj/item/handcuffs/ziptie = 2, - /obj/item/melee/baton/stunrod = 1, - /obj/item/device/flashlight/flare = 1 - ) - -/datum/outfit/admin/ert/med_eridani/paramedic - name = "Eridani Contractor Paramedic" - - head = /obj/item/clothing/head/hardhat/first_responder - mask = /obj/item/clothing/mask/balaclava - back = /obj/item/storage/backpack/messenger/med - glasses = /obj/item/clothing/glasses/hud/health - - backpack_contents = list( - /obj/item/storage/box/survival = 1, - /obj/item/device/healthanalyzer = 1, - /obj/item/storage/firstaid/adv = 1, - /obj/item/storage/firstaid/o2 = 1, - /obj/item/storage/box/syringes = 1, - /obj/item/clothing/accessory/holster/armpit = 1, - /obj/item/gun/projectile/automatic/x9 = 1, - /obj/item/ammo_magazine/c45x = 2 - ) diff --git a/code/datums/outfits/ert/mercenary.dm b/code/datums/outfits/ert/mercenary.dm index 9de869a6b26..7d2145bdd0d 100644 --- a/code/datums/outfits/ert/mercenary.dm +++ b/code/datums/outfits/ert/mercenary.dm @@ -8,23 +8,28 @@ back = /obj/item/storage/backpack/satchel_norm l_hand = /obj/item/clothing/suit/space/void/freelancer r_hand = /obj/item/clothing/head/helmet/space/void/freelancer - accessory = /obj/item/clothing/accessory/storage/black_vest + accessory = /obj/item/clothing/accessory/holster/thigh + accessory_contents = list(/obj/item/gun/projectile/colt) id = /obj/item/card/id/syndicate + glasses = /obj/item/clothing/glasses/sunglasses/aviator + l_pocket = /obj/item/tank/emergency_oxygen/double l_ear = /obj/item/device/radio/headset/distress backpack_contents = list( - /obj/item/gun/projectile/automatic/c20r = 1, + /obj/item/storage/box/survival = 1, + /obj/item/gun/projectile/automatic/tommygun = 1, /obj/item/storage/belt/utility/full = 1, - /obj/item/tank/oxygen = 1, /obj/item/clothing/gloves/yellow = 1, - /obj/item/material/knife/trench = 1 ) belt_contents = list( - /obj/item/ammo_magazine/a10mm = 3, - /obj/item/handcuffs/ziptie = 2, - /obj/item/shield/energy = 1 + /obj/item/ammo_magazine/submachinedrum = 1, + /obj/item/ammo_magazine/submachinemag = 1, + /obj/item/ammo_magazine/c45m = 2, + /obj/item/handcuffs/ziptie = 1, + /obj/item/shield/energy = 1, + /obj/item/material/knife/trench = 1 ) /datum/outfit/admin/ert/mercenary/get_id_access() @@ -33,29 +38,38 @@ /datum/outfit/admin/ert/mercenary/specialist name = "Mercenary Freelancer Medic" - belt = /obj/item/storage/belt/medical + glasses = /obj/item/clothing/glasses/hud/health/aviator + belt = /obj/item/storage/belt/medical/first_responder/combat gloves = /obj/item/clothing/gloves/latex backpack_contents = list( - /obj/item/gun/projectile/automatic/c20r = 1, - /obj/item/ammo_magazine/a10mm = 2, + /obj/item/storage/box/survival = 1, + /obj/item/gun/projectile/automatic/tommygun = 1, + /obj/item/ammo_magazine/submachinemag = 2, + /obj/item/ammo_magazine/c45m = 1, /obj/item/storage/firstaid/combat = 1, /obj/item/storage/firstaid/adv = 1, - /obj/item/tank/oxygen = 1 + /obj/item/device/healthanalyzer = 1, + /obj/item/reagent_containers/hypospray/autoinjector/coagzolug = 1 ) belt_contents = list( - /obj/item/reagent_containers/hypospray = 1, - /obj/item/stack/medical/advanced/bruise_pack = 1, - /obj/item/stack/medical/advanced/ointment = 1, - /obj/item/reagent_containers/glass/bottle/thetamycin = 1 + /obj/item/reagent_containers/hypospray/cmo = 1, + /obj/item/reagent_containers/glass/bottle/inaprovaline = 1, + /obj/item/reagent_containers/glass/bottle/antitoxin = 1, + /obj/item/reagent_containers/glass/bottle/dexalin_plus = 1, + /obj/item/reagent_containers/glass/bottle/butazoline = 1, + /obj/item/reagent_containers/glass/bottle/dermaline = 1, + /obj/item/reagent_containers/glass/bottle/perconol = 1, + /obj/item/reagent_containers/glass/bottle/thetamycin = 1, + /obj/item/material/knife/trench = 1 ) /datum/outfit/admin/ert/mercenary/engineer name = "Mercenary Freelancer Combat Engineer" + belt = /obj/item/storage/belt/military back = /obj/item/storage/backpack/duffel - belt = /obj/item/storage/belt/utility/full gloves = /obj/item/clothing/gloves/yellow accessory = /obj/item/clothing/accessory/storage/brown_vest accessory_contents = list( @@ -63,20 +77,23 @@ ) backpack_contents = list( - /obj/item/material/knife/trench = 1, - /obj/item/shield/energy = 1, - /obj/item/handcuffs/ziptie = 1, - /obj/item/tank/oxygen = 1, - /obj/item/device/multitool = 1, - /obj/item/weldingtool/hugetank = 1, + /obj/item/storage/box/survival = 1, /obj/item/clothing/glasses/welding/superior = 1, /obj/item/gun/projectile/shotgun/pump/combat/sol = 1, /obj/item/storage/box/shotgunshells = 1, /obj/item/landmine/frag = 1, - /obj/item/landmine/emp = 1 + /obj/item/landmine/emp = 1, + /obj/item/storage/belt/utility/very_full = 1, + /obj/item/gun/projectile/colt = 1 ) - belt_contents = null + belt_contents = list( + /obj/item/material/knife/trench = 1, + /obj/item/ammo_magazine/c45m = 2, + /obj/item/handcuffs/ziptie = 1, + /obj/item/shield/energy = 1, + /obj/item/device/flashlight/flare = 1, + ) /datum/outfit/admin/ert/mercenary/leader name = "Mercenary Freelancer Leader" @@ -86,11 +103,17 @@ suit_store = null suit = null head = null + mask = /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba + glasses = /obj/item/clothing/glasses/sunglasses/aviator + accessory = /obj/item/clothing/accessory/holster/thigh + accessory_contents = list(/obj/item/gun/projectile/revolver = 1) backpack_contents = list() belt_contents = list( - /obj/item/ammo_magazine/c762 = 3, - /obj/item/handcuffs/ziptie = 2, - /obj/item/shield/energy = 1 + /obj/item/ammo_magazine/c762 = 2, + /obj/item/handcuffs/ziptie = 1, + /obj/item/shield/energy = 1, + /obj/item/ammo_magazine/a357 = 2, + /obj/item/material/knife/trench = 1 ) \ No newline at end of file diff --git a/code/datums/outfits/ert/nt_ert.dm b/code/datums/outfits/ert/nt_ert.dm index 78b3d9df309..314e5f7f7bf 100644 --- a/code/datums/outfits/ert/nt_ert.dm +++ b/code/datums/outfits/ert/nt_ert.dm @@ -34,15 +34,18 @@ /datum/outfit/admin/ert/nanotrasen/specialist/medical name = "Nanotrasen ERT Medical Specialist" - belt = /obj/item/storage/belt/medical + belt = /obj/item/storage/belt/medical/first_responder/combat back = /obj/item/rig/ert/medical r_hand = /obj/item/storage/firstaid/combat belt_contents = list( - /obj/item/reagent_containers/hypospray = 1, - /obj/item/stack/medical/advanced/bruise_pack = 1, - /obj/item/stack/medical/advanced/ointment = 1, - /obj/item/reagent_containers/glass/bottle/thetamycin = 1 + /obj/item/reagent_containers/hypospray/combat/empty = 1, + /obj/item/reagent_containers/glass/bottle/inaprovaline = 1, + /obj/item/reagent_containers/glass/bottle/antitoxin = 1, + /obj/item/reagent_containers/glass/bottle/dexalin_plus = 1, + /obj/item/reagent_containers/glass/bottle/butazoline = 1, + /obj/item/reagent_containers/glass/bottle/dermaline = 1, + /obj/item/reagent_containers/glass/bottle/perconol = 1 ) /datum/outfit/admin/ert/nanotrasen/leader diff --git a/code/datums/outfits/ert/tcfl.dm b/code/datums/outfits/ert/tcfl.dm index 609f7155ce4..0756815fb7d 100644 --- a/code/datums/outfits/ert/tcfl.dm +++ b/code/datums/outfits/ert/tcfl.dm @@ -39,13 +39,15 @@ /datum/outfit/admin/ert/legion/pilot name = "TCFL Dropship Pilot" uniform = /obj/item/clothing/under/legion/pilot - head = /obj/item/clothing/head/helmet/legion_pilot - suit = /obj/item/clothing/suit/storage/toggle/leather_jacket/flight/legion + head = /obj/item/clothing/head/helmet/pilot/legion + suit = /obj/item/clothing/suit/storage/toggle/leather_jacket/flight/legion/alt gloves = null back = null belt = /obj/item/storage/belt/security/tactical - accessory = /obj/item/clothing/accessory/holster/hip - accessory_contents = list(/obj/item/gun/energy/blaster/revolver/pilot = 1) + accessory = /obj/item/clothing/accessory/storage/webbingharness/pouches/ert + accessory_contents = list(/obj/item/gun/energy/blaster/pilot_special = 1, /obj/item/device/binoculars = 1) + + backpack_contents = null /datum/outfit/admin/ert/legion/sentinel name = "TCFL Sentinel" @@ -63,7 +65,8 @@ /obj/item/handcuffs/ziptie = 3, /obj/item/clothing/mask/gas/tactical = 1, /obj/item/storage/firstaid/regular = 1, - /obj/item/clothing/gloves/swat/ert = 1 + /obj/item/clothing/gloves/swat/ert = 1, + /obj/item/material/knife/bayonet = 1 ) belt_contents = list( diff --git a/code/datums/outfits/event/outfit_nanotrasen.dm b/code/datums/outfits/event/outfit_nanotrasen.dm index 19877d114ba..405209d71c6 100644 --- a/code/datums/outfits/event/outfit_nanotrasen.dm +++ b/code/datums/outfits/event/outfit_nanotrasen.dm @@ -251,11 +251,11 @@ belt = /obj/item/storage/belt/medical back = /obj/item/storage/backpack/satchel_med accessory = /obj/item/clothing/accessory/storage/white_vest - accessory_contents = list(/obj/item/reagent_containers/hypospray/cmo = 1, /obj/item/storage/pill_bottle/dexalin_plus = 1, /obj/item/storage/pill_bottle/mortaphenyl = 1) + accessory_contents = list(/obj/item/stack/medical/advanced/bruise_pack = 1, /obj/item/stack/medical/advanced/ointment = 1, /obj/item/reagent_containers/glass/bottle/mortaphenyl = 1) backpack_contents = list( /obj/item/storage/box/survival = 1, - /obj/item/storage/firstaid/regular = 2, + /obj/item/storage/firstaid/adv = 1, /obj/item/storage/firstaid/surgery = 1, /obj/item/storage/box/gloves = 1, /obj/item/storage/box/syringes = 1, @@ -263,11 +263,13 @@ ) belt_contents = list( - /obj/item/stack/medical/advanced/bruise_pack = 2, - /obj/item/stack/medical/advanced/ointment = 2, - /obj/item/stack/medical/splint = 1, - /obj/item/reagent_containers/syringe = 1, - /obj/item/reagent_containers/glass/bottle/inaprovaline = 1 + /obj/item/reagent_containers/hypospray/cmo = 1, + /obj/item/reagent_containers/glass/bottle/inaprovaline = 1, + /obj/item/reagent_containers/glass/bottle/antitoxin = 1, + /obj/item/reagent_containers/glass/bottle/dexalin_plus = 1, + /obj/item/reagent_containers/glass/bottle/butazoline = 1, + /obj/item/reagent_containers/glass/bottle/dermaline = 1, + /obj/item/reagent_containers/glass/bottle/perconol = 1 ) id_access = "Medical Doctor" diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index d8db3d8dde5..b0574533d20 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -5,6 +5,19 @@ #define OUTFIT_SATCHEL_ALT 4 #define OUTFIT_DUFFELBAG 5 #define OUTFIT_MESSENGERBAG 6 +#define OUTFIT_RUCKSACK 7 +#define OUTFIT_BLUERUCKSACK 8 +#define OUTFIT_GREENRUCKSACK 9 +#define OUTFIT_NAVYRUCKSACK 10 +#define OUTFIT_TANRUCKSACK 11 +#define OUTFIT_KHAKISATCHEL 12 +#define OUTFIT_BLACKSATCHEL 13 +#define OUTFIT_NAVYSATCHEL 14 +#define OUTFIT_OLIVESATCHEL 15 +#define OUTFIT_AUBURNSATCHEL 16 +#define OUTFIT_POCKETBOOK 17 +#define OUTFIT_BROWNPOCKETBOOK 18 +#define OUTFIT_AUBURNPOCKETBOOK 19 #define OUTFIT_TAB_PDA 2 #define OUTFIT_PDA_OLD 3 @@ -60,9 +73,22 @@ var/allow_backbag_choice = FALSE var/backpack = /obj/item/storage/backpack var/satchel = /obj/item/storage/backpack/satchel_norm - var/satchel_alt = /obj/item/storage/backpack/satchel + var/satchel_alt = /obj/item/storage/backpack/satchel/leather var/dufflebag = /obj/item/storage/backpack/duffel var/messengerbag = /obj/item/storage/backpack/messenger + var/rucksack = /obj/item/storage/backpack/rucksack + var/bluerucksack = /obj/item/storage/backpack/rucksack/blue + var/greenrucksack = /obj/item/storage/backpack/rucksack/green + var/navyrucksack = /obj/item/storage/backpack/rucksack/navy + var/tanrucksack = /obj/item/storage/backpack/rucksack/tan + var/khakisatchel = /obj/item/storage/backpack/satchel/leather/khaki + var/blacksatchel = /obj/item/storage/backpack/satchel/leather/black + var/navysatchel = /obj/item/storage/backpack/satchel/leather/navy + var/olivesatchel = /obj/item/storage/backpack/satchel/leather/olive + var/auburnsatchel = /obj/item/storage/backpack/satchel/leather/reddish + var/pocketbook = /obj/item/storage/backpack/satchel/pocketbook + var/brownpocketbook = /obj/item/storage/backpack/satchel/pocketbook/brown + var/auburnpocketbook = /obj/item/storage/backpack/satchel/pocketbook/reddish var/allow_pda_choice = FALSE var/tab_pda = /obj/item/modular_computer/handheld/pda/civilian @@ -92,11 +118,37 @@ if (OUTFIT_SATCHEL) back = use_job_specific ? satchel : /obj/item/storage/backpack/satchel_norm if (OUTFIT_SATCHEL_ALT) - back = use_job_specific ? satchel_alt : /obj/item/storage/backpack/satchel + back = use_job_specific ? satchel_alt : /obj/item/storage/backpack/satchel/leather if (OUTFIT_DUFFELBAG) back = use_job_specific ? dufflebag : /obj/item/storage/backpack/duffel if (OUTFIT_MESSENGERBAG) back = use_job_specific ? messengerbag : /obj/item/storage/backpack/messenger + if (OUTFIT_RUCKSACK) + back = use_job_specific ? rucksack : /obj/item/storage/backpack/rucksack + if (OUTFIT_BLUERUCKSACK) + back = use_job_specific ? bluerucksack : /obj/item/storage/backpack/rucksack/blue + if (OUTFIT_GREENRUCKSACK) + back = use_job_specific ? greenrucksack : /obj/item/storage/backpack/rucksack/green + if (OUTFIT_NAVYRUCKSACK) + back = use_job_specific ? navyrucksack : /obj/item/storage/backpack/rucksack/navy + if (OUTFIT_TANRUCKSACK) + back = use_job_specific ? tanrucksack : /obj/item/storage/backpack/rucksack/tan + if (OUTFIT_KHAKISATCHEL) + back = use_job_specific ? khakisatchel : /obj/item/storage/backpack/satchel/leather/khaki + if (OUTFIT_BLACKSATCHEL) + back = use_job_specific ? blacksatchel : /obj/item/storage/backpack/satchel/leather/black + if (OUTFIT_NAVYSATCHEL) + back = use_job_specific ? navysatchel : /obj/item/storage/backpack/satchel/leather/navy + if (OUTFIT_OLIVESATCHEL) + back = use_job_specific ? olivesatchel : /obj/item/storage/backpack/satchel/leather/olive + if (OUTFIT_AUBURNSATCHEL) + back = use_job_specific ? auburnsatchel : /obj/item/storage/backpack/satchel/leather/reddish + if (OUTFIT_POCKETBOOK) + back = use_job_specific ? pocketbook : /obj/item/storage/backpack/satchel/pocketbook + if (OUTFIT_BROWNPOCKETBOOK) + back = use_job_specific ? brownpocketbook : /obj/item/storage/backpack/satchel/pocketbook/brown + if (OUTFIT_AUBURNPOCKETBOOK) + back = use_job_specific ? auburnpocketbook : /obj/item/storage/backpack/satchel/pocketbook/reddish else back = backpack //Department backpack if(back) @@ -119,8 +171,9 @@ return -// Used to equip an item to the mob. Mainly to prevent copypasta for collect_not_del. -/datum/outfit/proc/equip_item(mob/living/carbon/human/H, path, slot, var/set_no_remove = FALSE) +// Used to equip an item to the mob. Mainly to prevent copypasta for collect_not_del. +//override_collect temporarily allows equip_or_collect without enabling it for the job. Mostly used to prevent weirdness with hand equips when the player is missing one +/datum/outfit/proc/equip_item(mob/living/carbon/human/H, path, slot, var/set_no_remove = FALSE, var/override_collect = FALSE) var/obj/item/I if(isnum(path)) //Check if parameter is not numeric. Must be a path, list of paths or name of a gear datum @@ -138,7 +191,7 @@ if(set_no_remove) I.autodrobe_no_remove = TRUE - if(collect_not_del) + if(collect_not_del || override_collect) H.equip_or_collect(I, slot) else H.equip_to_slot_or_del(I, slot) @@ -240,10 +293,22 @@ if(suit_store) equip_item(H, suit_store, slot_s_store) + //Hand equips. If person is missing an arm or hand it attempts to put it in the other hand. + //Override_collect should attempt to collect any items that can't be equipped regardless of collect_not_del settings for the outfit. if(l_hand) - equip_item(H, l_hand, slot_l_hand) + var/obj/item/organ/external/O + O = H.organs_by_name[BP_L_HAND] + if(!O || !O.is_usable()) + equip_item(H, l_hand, slot_r_hand, override_collect = TRUE) + else + equip_item(H, l_hand, slot_l_hand, override_collect = TRUE) if(r_hand) - equip_item(H, r_hand, slot_r_hand) + var/obj/item/organ/external/O + O = H.organs_by_name[BP_R_HAND] + if(!O || !O.is_usable()) + equip_item(H, r_hand, slot_l_hand, override_collect = TRUE) + else + equip_item(H, r_hand, slot_r_hand, override_collect = TRUE) if(allow_pda_choice) switch(H.pda_choice) @@ -268,7 +333,10 @@ if(OUTFIT_PDA_SMART) I.icon = 'icons/obj/pda_smart.dmi' I.update_icon() - H.equip_or_collect(I, slot_wear_id) + if (H.pda_choice == OUTFIT_WRISTBOUND) + H.equip_or_collect(I, slot_wrists) + else + H.equip_or_collect(I, slot_wear_id) if(id) var/obj/item/modular_computer/P = H.wear_id diff --git a/code/datums/outfits/outfit_antag.dm b/code/datums/outfits/outfit_antag.dm index c5fa191e642..a0534449b2e 100644 --- a/code/datums/outfits/outfit_antag.dm +++ b/code/datums/outfits/outfit_antag.dm @@ -496,52 +496,6 @@ W.name = "[H.real_name]'s ID" W.registered_name = H.real_name -/datum/outfit/admin/wizard - name = "Space Wizard" - allow_backbag_choice = FALSE - - uniform = /obj/item/clothing/under/chameleon/wizard - back = /obj/item/storage/backpack/chameleon/wizard - suit = /obj/item/clothing/suit/chameleon/wizard - head = /obj/item/clothing/head/chameleon/wizard - shoes = /obj/item/clothing/shoes/chameleon/wizard - l_ear = /obj/item/device/radio/headset/bluespace - r_pocket = /obj/item/teleportation_scroll - l_hand = /obj/item/spellbook - id = /obj/item/card/id/bluespace - - backpack_contents = list( - /obj/item/storage/box = 1 - ) - -/datum/outfit/admin/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - . = ..() - if(visualsOnly) - return - - var/obj/item/card/id/W = H.wear_id - if(W) - W.registered_name = H.real_name - -/datum/outfit/admin/wizard/apprentice - name = "Space Wizard Apprentice" - l_hand = null - r_pocket = null - -/datum/outfit/admin/wizard/skeleton - name = "Skeleton Warrior" - allow_backbag_choice = FALSE - - uniform = /obj/item/clothing/under/gladiator - back = /obj/item/material/twohanded/spear/bone - suit = /obj/item/clothing/suit/armor/bone - head = /obj/item/clothing/head/helmet/bone - l_ear = null - r_pocket = null - l_hand = null - - backpack_contents = null - /datum/outfit/admin/syndicate/cultist name = "Cultist" allow_backbag_choice = FALSE @@ -571,8 +525,8 @@ suit_store = /obj/item/gun/energy/rifle/cult -/datum/outfit/admin/syndicate/raider_mage - name = "Raider Mage" +/datum/outfit/admin/syndicate/raider_techno + name = "Raider Techno" allow_backbag_choice = FALSE uniform = /obj/item/clothing/under/syndicate/ninja @@ -580,18 +534,17 @@ shoes = /obj/item/clothing/shoes/sandal head = null - back = /obj/item/gun/energy/staff/focus belt = /obj/item/storage/belt/fannypack/component gloves = null l_ear = /obj/item/device/radio/headset/bluespace - l_pocket = null + l_pocket = /obj/item/technomancer_catalog/apprentice r_pocket = null id = /obj/item/storage/wallet/random accessory = /obj/item/clothing/accessory/storage/webbing backpack_contents = list() -/datum/outfit/admin/syndicate/raider_mage/equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/admin/syndicate/raider_techno/equip(mob/living/carbon/human/H, visualsOnly = FALSE) var/list/loadouts = list("Nature", "Techno", "Cobra", "Brawler", "Shimmer") if(H.gender in list(FEMALE, PLURAL, NEUTER)) loadouts += list("Storm", "Sorceress") @@ -601,39 +554,39 @@ head = /obj/item/clothing/head/wizard/nature suit = /obj/item/clothing/suit/wizrobe/nature suit_accessory = /obj/item/clothing/accessory/poncho/nature - spells = list(/spell/targeted/heal_target/major = 2, /spell/targeted/entangle = 2, /spell/aoe_turf/conjure/grove/sanctuary = 2) + back = /obj/item/technomancer_core/safety if("Techno") head = /obj/item/clothing/head/wizard/techno suit = /obj/item/clothing/suit/wizrobe/techno uniform = /obj/item/clothing/under/techo shoes = /obj/item/clothing/shoes/techno - spells = list(/spell/aoe_turf/knock = 2, /spell/aoe_turf/conjure/forcewall = 2, /spell/aoe_turf/disable_tech = 2) + back = /obj/item/technomancer_core/recycling if("Cobra") head = /obj/item/clothing/head/wizard/cobra suit = /obj/item/clothing/suit/wizrobe/cobra shoes = /obj/item/clothing/shoes/hitops/red - spells = list(/spell/targeted/mend = 2, /spell/targeted/life_steal = 2, /spell/aoe_turf/conjure/soulstone = 2) + back = /obj/item/technomancer_core/overcharged if("Brawler") head = /obj/item/clothing/head/wizard/brawler suit = /obj/item/clothing/suit/wizrobe/brawler shoes = /obj/item/clothing/shoes/caligae - spells = list(/spell/targeted/projectile/dumbfire/passage = 2, /spell/targeted/equip_item/shield = 2, /spell/targeted/torment = 2) + back = /obj/item/technomancer_core/bulky if("Shimmer") head = /obj/item/clothing/head/wizard/shimmer suit = /obj/item/clothing/suit/wizrobe/shimmer - spells = list(/spell/radiant_aura = 2, /spell/targeted/projectile/dumbfire/stuncuff = 2, /spell/aoe_turf/conjure/golem = 2) + back = /obj/item/technomancer_core/rapid if("Storm") head = /obj/item/clothing/head/wizard/storm suit = /obj/item/clothing/suit/wizrobe/storm shoes = /obj/item/clothing/shoes/heels - spells = list(/spell/targeted/projectile/magic_missile = 2, /spell/targeted/genetic/blind = 2, /spell/targeted/shapeshift/avian = 2) + back = /obj/item/technomancer_core/unstable if("Sorceress") head = /obj/item/clothing/head/wizard/sorceress suit = /obj/item/clothing/suit/wizrobe/sorceress - spells = list(/spell/targeted/projectile/dumbfire/fireball = 2, /spell/aoe_turf/conjure/creature = 2, /spell/shadow_shroud = 2) + back = /obj/item/technomancer_core/summoner return ..() -/datum/outfit/admin/syndicate/raider_mage/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/admin/syndicate/raider_techno/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() if(visualsOnly) return @@ -648,8 +601,74 @@ if(W) W.handle_item_insertion(passport) + var/obj/item/technomancer_core/TC = H.back + if(TC) + technomancer_belongings.Add(TC) + + var/obj/item/technomancer_catalog/catalog = H.l_store + if(catalog) + catalog.bind_to_owner(H) + /datum/outfit/admin/golem name = "Bluespace Golem" allow_backbag_choice = FALSE l_ear = /obj/item/device/radio/headset/bluespace + +/datum/outfit/admin/techomancer + name = "Technomancer" + allow_backbag_choice = FALSE + + head = /obj/item/clothing/head/chameleon/technomancer + l_ear = /obj/item/device/radio/headset/bluespace + uniform = /obj/item/clothing/under/chameleon/technomancer + suit = /obj/item/clothing/suit/chameleon/technomancer + belt = /obj/item/device/flashlight + back = /obj/item/technomancer_core + shoes = /obj/item/clothing/shoes/chameleon/technomancer + + r_pocket = /obj/item/disposable_teleporter/free + l_pocket = /obj/item/technomancer_catalog + + id = /obj/item/card/id/bluespace + var/id_assignment = "Technomagus" + +/datum/outfit/admin/techomancer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + + var/obj/item/card/id/W = H.wear_id + if(W) + W.assignment = id_assignment + H.set_id_info(W) + + var/obj/item/technomancer_core/TC = H.back + if(TC) + technomancer_belongings.Add(TC) + + var/obj/item/technomancer_catalog/catalog = H.l_store + if(catalog) + catalog.bind_to_owner(H) + +/datum/outfit/admin/techomancer/apprentice + name = "Technomancer Apprentice" + + head = /obj/item/clothing/head/chameleon/technomancer + uniform = /obj/item/clothing/under/chameleon/technomancer + suit = /obj/item/clothing/suit/chameleon/technomancer + shoes = /obj/item/clothing/shoes/chameleon/technomancer + + l_pocket = /obj/item/technomancer_catalog/apprentice + + id_assignment = "Techno-apprentice" + +/datum/outfit/admin/techomancer/apprentice/post_equip(mob/living/carbon/human/H, visualsOnly) + . = ..() + if(visualsOnly) + return + + to_chat(H, "You are the Technomancer's apprentice! Your goal is to assist them in their mission at the [station_name()].") + to_chat(H, "Your service has not gone unrewarded, however. Studying under them, you have learned how to use a Manipulation Core \ + of your own. You also have a catalog, to purchase your own functions and equipment as you see fit.") + to_chat(H, "It would be wise to speak to your master, and learn what their plans are for today. Your clothing is holographic, you should change its look before leaving.") \ No newline at end of file diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index 1227f6bd3c6..de0776919f1 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -29,6 +29,9 @@ bars += src listindex = bars.len bar.pixel_y = 0 + if(istype(target, /atom/movable)) + var/atom/movable/AM = target + bar.pixel_x = AM.get_floating_chat_x_offset() bar.alpha = 0 animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) diff --git a/code/datums/trading/goods.dm b/code/datums/trading/goods.dm index 596f4715d41..8cf26499f84 100644 --- a/code/datums/trading/goods.dm +++ b/code/datums/trading/goods.dm @@ -156,7 +156,6 @@ /obj/item/clothing/shoes = TRADER_SUBTYPES_ONLY, /obj/item/clothing/shoes/chameleon = TRADER_BLACKLIST, /obj/item/clothing/shoes/combat = TRADER_BLACKLIST, - /obj/item/clothing/shoes/clown_shoes = TRADER_BLACKLIST, /obj/item/clothing/shoes/cult = TRADER_BLACKLIST, /obj/item/clothing/shoes/cyborg = TRADER_BLACKLIST, /obj/item/clothing/shoes/lightrig = TRADER_BLACKLIST_ALL, diff --git a/code/datums/trading/misc.dm b/code/datums/trading/misc.dm index 4585b3ea155..ba708cf0247 100644 --- a/code/datums/trading/misc.dm +++ b/code/datums/trading/misc.dm @@ -85,13 +85,8 @@ ) possible_trading_items = list( - /obj/item/clothing/mask/gas/clown_hat = TRADER_THIS_TYPE, - /obj/item/clothing/mask/gas/sexyclown = TRADER_THIS_TYPE, - /obj/item/clothing/shoes/clown_shoes = TRADER_THIS_TYPE, - /obj/item/clothing/under/rank/clown = TRADER_THIS_TYPE, /obj/item/modular_computer/handheld/pda/civilian/clown = TRADER_THIS_TYPE, /obj/item/stamp/clown = TRADER_THIS_TYPE, - /obj/item/storage/backpack/clown = TRADER_THIS_TYPE, /obj/item/bananapeel = TRADER_THIS_TYPE, /obj/item/reagent_containers/food/snacks/pie = TRADER_THIS_TYPE, /obj/item/bikehorn = TRADER_THIS_TYPE, diff --git a/code/datums/trading/trade.dm b/code/datums/trading/trade.dm index 1d64855d7ae..c8be3876119 100644 --- a/code/datums/trading/trade.dm +++ b/code/datums/trading/trade.dm @@ -12,7 +12,7 @@ var/list/possible_trading_items //List of all possible trading items. Structure is (type = mode) var/list/trading_items = list() //What items they are currently trading away. var/list/blacklisted_trade_items = list(/mob/living/carbon/human) - //Things they will automatically refuse + var/list/allowed_space_sectors = list(SECTOR_ROMANOVICH, SECTOR_TAU_CETI, SECTOR_CORP_ZONE) //which sector this merchant can show up //Things they will automatically refuse var/list/speech = list() //The list of all their replies and messages. Structure is (id = talk) /*SPEECH IDS: @@ -258,4 +258,10 @@ qdel(offer) /datum/trader/proc/bribe_to_stay_longer(var/amt) - return get_response("bribe_refusal", "How about... no?") \ No newline at end of file + return get_response("bribe_refusal", "How about... no?") + +/datum/trader/proc/system_allowed() + if(SSatlas.current_sector.name in allowed_space_sectors) + return TRUE + else + return FALSE diff --git a/code/datums/trading/unique.dm b/code/datums/trading/unique.dm index f8f90c028bd..ecb63b66b0d 100644 --- a/code/datums/trading/unique.dm +++ b/code/datums/trading/unique.dm @@ -28,6 +28,7 @@ /datum/trader/ship/unique/syndicate name = "Cyndie Kate" origin = "Cloaked ship" + allowed_space_sectors = list(SECTOR_ROMANOVICH, SECTOR_CORP_ZONE) possible_wanted_items = list ( /obj/item/gun/energy/captain = TRADER_THIS_TYPE, @@ -78,6 +79,7 @@ /datum/trader/ship/unique/severance name = "Unknown" origin = "SGS Severance" + allowed_space_sectors = list(SECTOR_ROMANOVICH, SECTOR_CORP_ZONE) possible_wanted_items = list( /obj/item/reagent_containers/food/snacks/human = TRADER_SUBTYPES_ONLY, @@ -194,8 +196,7 @@ /obj/item/circuitboard/telesci_pad = TRADER_THIS_TYPE, /obj/item/phylactery = TRADER_THIS_TYPE, /obj/item/blueprints = TRADER_THIS_TYPE, - /obj/item/storage/backpack/holding = TRADER_THIS_TYPE, - /obj/item/teleportation_scroll = TRADER_THIS_TYPE + /obj/item/storage/backpack/holding = TRADER_THIS_TYPE ) possible_trading_items = list( diff --git a/code/datums/trading/weaponry.dm b/code/datums/trading/weaponry.dm index 092c80d773e..c351a9ded89 100644 --- a/code/datums/trading/weaponry.dm +++ b/code/datums/trading/weaponry.dm @@ -28,6 +28,8 @@ /obj/item/gun/projectile/revolver/deckard = TRADER_THIS_TYPE, /obj/item/gun/projectile/leyon = TRADER_THIS_TYPE, /obj/item/gun/projectile/automatic/x9 = TRADER_THIS_TYPE, + /obj/item/gun/projectile/automatic/rifle/carbine = TRADER_THIS_TYPE, + /obj/item/ammo_magazine/a556/carbine = TRADER_THIS_TYPE, /obj/item/ammo_magazine/c45m = TRADER_ALL, /obj/item/ammo_magazine/c45m/empty = TRADER_BLACKLIST, /obj/item/ammo_magazine/mc10mm = TRADER_ALL, @@ -96,6 +98,8 @@ "insult_bad" = "Rrrracist!" ) + allowed_space_sectors = list(SECTOR_ROMANOVICH, SECTOR_CORP_ZONE) + possible_trading_items = list( /obj/item/gun/projectile/shotgun/pump/rifle = TRADER_ALL, /obj/item/gun/projectile/dragunov = TRADER_THIS_TYPE, @@ -162,5 +166,6 @@ /obj/item/clothing/mask/gas/tactical = TRADER_THIS_TYPE, /obj/item/shield/riot/tact = TRADER_THIS_TYPE, /obj/item/storage/belt/security/tactical = TRADER_THIS_TYPE, + /obj/item/storage/belt/medical/first_responder/combat = TRADER_THIS_TYPE, /obj/item/clothing/accessory/storage/bandolier = TRADER_THIS_TYPE ) diff --git a/code/datums/uplink/corporate_equipment.dm b/code/datums/uplink/corporate_equipment.dm index 3ecd095c49c..b335a7870d3 100644 --- a/code/datums/uplink/corporate_equipment.dm +++ b/code/datums/uplink/corporate_equipment.dm @@ -20,7 +20,7 @@ desc = "A full spaceworthy kit of a Hephaestus Industries Caiman-type terraforming suit. Very resistant against slow-moving blunt force, but heavy. Only wearable by Humans and Humanoid IPCs." /datum/uplink_item/item/corporate_equipment/suit/einstein - name = "Banshee Combat Suit" + name = "Banshee Infiltration Suit" item_cost = 5 path = /obj/structure/closet/crate/gear_loadout/einstein - desc = "A full spaceworthy kit of an Einstein Engines Banshee-type infiltration suit. Resistant against lasers, but made of paper against anything else. Only wearable by Humans and Humanoid IPCs." + desc = "A full spaceworthy kit of an Einstein Engines Banshee-type infiltration suit. Resistant against small arms, but made of paper against anything else. Only wearable by Humans and Humanoid IPCs." diff --git a/code/datums/uplink/devices and tools.dm b/code/datums/uplink/devices and tools.dm index cae29a14615..0d9731a93c8 100644 --- a/code/datums/uplink/devices and tools.dm +++ b/code/datums/uplink/devices and tools.dm @@ -87,6 +87,12 @@ item_cost = 2 path = /obj/item/storage/box/syndie_kit/space +/datum/uplink_item/item/tools/infiltration_kit + name = "Infiltration Kit" + desc = "A large infiltration case containing an undersuit, a mask, gloves, and shoes. It will protect you against the vacuum of space and two atmospheres of overpressure." + item_cost = 2 + path = /obj/item/storage/toolbox/infiltration + /datum/uplink_item/item/tools/thermal name = "Thermal Imaging Glasses" item_cost = 2 @@ -97,10 +103,6 @@ item_cost = 6 path = /obj/item/device/powersink -/datum/uplink_item/item/tools/teleporter/New() - ..() - antag_roles = list(MODE_MERCENARY) - /datum/uplink_item/item/tools/ai_module name = "Hacked AI Upload Module" item_cost = 4 diff --git a/code/datums/uplink/highly visible and dangerous weapons.dm b/code/datums/uplink/highly visible and dangerous weapons.dm index 1125d93fda0..3aa323e0947 100644 --- a/code/datums/uplink/highly visible and dangerous weapons.dm +++ b/code/datums/uplink/highly visible and dangerous weapons.dm @@ -99,6 +99,16 @@ item_cost = 9 path = /obj/item/gun/projectile/plasma +/datum/uplink_item/item/visible_weapons/laser_rifle + name = "Laser Rifle" + item_cost = 8 + path = /obj/item/gun/energy/rifle/laser + +/datum/uplink_item/item/visible_weapons/energy_carbine + name = "Energy Carbine" + item_cost = 6 + path = /obj/item/gun/energy/gun + /datum/uplink_item/item/visible_weapons/icelance name = "Icelance Rifle" item_cost = 3 diff --git a/code/datums/uplink/implants.dm b/code/datums/uplink/implants.dm index 3f5d8a67e9c..e6afa972bb0 100644 --- a/code/datums/uplink/implants.dm +++ b/code/datums/uplink/implants.dm @@ -17,7 +17,7 @@ /datum/uplink_item/item/implants/imp_explosive name = "Explosive Implant (DANGER!)" - item_cost = 4 + item_cost = 3 desc = "A box containing an explosive implant and implanter. Use the implant in-hand to set the explosion size and trigger phrase." path = /obj/item/storage/box/syndie_kit/imp_explosive diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm index 999260c3469..2aa5d0aff74 100644 --- a/code/datums/uplink/medical.dm +++ b/code/datums/uplink/medical.dm @@ -24,6 +24,12 @@ item_cost = 1 path = /obj/item/storage/firstaid/combat +/datum/uplink_item/item/medical/medicalbelt + name = "Fully Loaded Combat Medical Belt" + item_cost = 3 + path = /obj/item/storage/belt/medical/first_responder/combat/full + desc = "A fully loaded medical belt even Zeng-Hu's top First Responders would be dying to wear. It contains liquid medicines and a hypospray. Combat hypo sold seperately." + /datum/uplink_item/item/medical/stimulants name = "Box of Combat Stimulants" item_cost = 1 @@ -38,3 +44,15 @@ name = "Standard First-Aid Kit" item_cost = 1 path = /obj/item/storage/firstaid/regular + +/datum/uplink_item/item/medical/advfirstaid + name = "Advanced First-Aid Kit" + item_cost = 1 + path = /obj/item/storage/firstaid/adv + desc = "Note: doesn't come with a medical scanner." + +/datum/uplink_item/item/medical/bloodpack + name = "O- blood pack" + item_cost = 1 + path = /obj/item/reagent_containers/blood/OMinus + desc = "If transferring to self or others without a stand, hold firmly in hand, configure the transfer rate and attach the tubing carefully." diff --git a/code/datums/uplink/stealthy and inconspicuous weapons.dm b/code/datums/uplink/stealthy and inconspicuous weapons.dm index f6dea20df5d..a4bb846af58 100644 --- a/code/datums/uplink/stealthy and inconspicuous weapons.dm +++ b/code/datums/uplink/stealthy and inconspicuous weapons.dm @@ -37,6 +37,7 @@ /datum/uplink_item/item/stealthy_weapons/sleepy_ring name = "Sleepy Ring" + desc = "A silver ring that will quickly put its wearer to sleep. WARNING: Do not wear this yourself. It'll end about as well as you expect it to." item_cost = 3 path = /obj/item/clothing/ring/reagent/sleepy diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 4b417bd00b2..4163c8b2ef9 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -41,11 +41,6 @@ return copytext(rank, 2+length(prefix)) return rank -/obj/effect/projection - name = "Projection" - desc = "This looks like a projection of something." - anchored = 1.0 - /obj/structure/showcase name = "Showcase" icon = 'icons/obj/stationobjs.dmi' diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index d81223dd40e..68cd1ba5873 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -56,6 +56,7 @@ w_class = ITEMSIZE_LARGE matter = list(DEFAULT_WALL_MATERIAL = 50) attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") + var/can_support = TRUE /obj/item/cane/attack(mob/living/target, mob/living/carbon/human/user, target_zone = BP_CHEST) @@ -85,7 +86,7 @@ if (targetIsHuman) var/mob/living/carbon/human/targethuman = target armorpercent = targethuman.get_blocked_ratio(target_zone, BRUTE, damage = force)*100 - wasblocked = targethuman.check_shields(force, src, user, target_zone, null) //returns 1 if it's a block + wasblocked = targethuman.check_shields(force, src, user, target_zone, null) var/damageamount = force @@ -294,6 +295,7 @@ desc = "A white cane, used by the visually impaired." icon_state = "whitecane" item_state = "whitecane" + can_support = FALSE /obj/item/cane/shillelagh name = "adhomian shillelagh" @@ -303,6 +305,48 @@ item_state = "shillelagh" contained_sprite = TRUE +/obj/item/cane/telecane + name = "telescopic cane" + desc = "A compact cane which can be collapsed for storage." + icon = 'icons/obj/contained_items/weapons/telecane.dmi' + icon_state = "telecane" + contained_sprite = TRUE + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT + drop_sound = 'sound/items/drop/crowbar.ogg' + pickup_sound = 'sound/items/pickup/crowbar.ogg' + var/on = FALSE + can_support = FALSE + +/obj/item/cane/telecane/attack_self(mob/user) + on = !on + if(on) + user.visible_message(SPAN_WARNING("With a flick of their wrist, [user] extends their telescopic cane."), SPAN_WARNING("You extend the cane."), SPAN_WARNING("You hear an ominous click.")) + icon_state = "telecane_1" + item_state = "telestick" + w_class = ITEMSIZE_LARGE + slot_flags = null + force = 6 + attack_verb = list("smacked", "struck", "slapped") + can_support = TRUE + else + user.visible_message(SPAN_NOTICE("\The [user] collapses their telescopic cane."), SPAN_NOTICE("You collapse the cane."), SPAN_NOTICE("You hear a click.")) + icon_state = "telecane" + item_state = "telestick_0" + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT + force = 3 + attack_verb = list("hit", "punched") + can_support = FALSE + + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + H.update_inv_l_hand() + H.update_inv_r_hand() + + playsound(src.loc, 'sound/weapons/click.ogg', 50, 1) + add_fingerprint(user) + /obj/item/disk name = "disk" icon = 'icons/obj/items.dmi' @@ -349,7 +393,7 @@ /obj/item/staff name = "wizards staff" - desc = "Apparently a staff used by the wizard." + desc = "A staff which only has the power to make you look like a nerd." icon = 'icons/obj/wizard.dmi' icon_state = "staff" force = 3.0 diff --git a/code/defines/procs/hud.dm b/code/defines/procs/hud.dm index b37c9193b81..1e037d0d929 100644 --- a/code/defines/procs/hud.dm +++ b/code/defines/procs/hud.dm @@ -4,7 +4,7 @@ the HUD updates properly! */ //HUD image type used to properly clear client.images precisely /image/hud_overlay - appearance_flags = RESET_COLOR|RESET_ALPHA + appearance_flags = RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM //Medical HUD outputs. Called by the Life() proc of the mob using it, usually. proc/process_med_hud(var/mob/M, var/local_scanner, var/mob/Alt) @@ -19,12 +19,14 @@ proc/process_med_hud(var/mob/M, var/local_scanner, var/mob/Alt) if(local_scanner) P.Client.images += patient.hud_list[HEALTH_HUD] P.Client.images += patient.hud_list[STATUS_HUD] + P.Client.images += patient.hud_list[TRIAGE_HUD] else var/sensor_level = getsensorlevel(patient) if(sensor_level >= SUIT_SENSOR_VITAL) P.Client.images += patient.hud_list[HEALTH_HUD] if(sensor_level >= SUIT_SENSOR_BINARY) P.Client.images += patient.hud_list[LIFE_HUD] + P.Client.images += patient.hud_list[TRIAGE_HUD] //Security HUDs. Pass a value for the second argument to enable implant viewing or other special features. proc/process_sec_hud(var/mob/M, var/advanced_mode, var/mob/Alt) diff --git a/code/game/antagonist/_antagonist_setup.dm b/code/game/antagonist/_antagonist_setup.dm index c5379c75085..3494b278531 100644 --- a/code/game/antagonist/_antagonist_setup.dm +++ b/code/game/antagonist/_antagonist_setup.dm @@ -77,6 +77,12 @@ var/global/list/bantype_to_antag_age = list() if(player in antag.pending_antagonists) return antag +/proc/player_is_obvious_antag(var/datum/mind/player, var/only_offstation_roles = FALSE) + var/datum/antagonist/antag = player_is_antag(player, only_offstation_roles) + if(antag) + return antag.is_obvious_antag(player) + return FALSE + /** * This must be called after map loading is done! */ diff --git a/code/game/antagonist/alien/borer.dm b/code/game/antagonist/alien/borer.dm index 6487bdb8f39..965970e6fe3 100644 --- a/code/game/antagonist/alien/borer.dm +++ b/code/game/antagonist/alien/borer.dm @@ -65,4 +65,7 @@ var/datum/antagonist/xenos/borer/borers var/obj/item/organ/external/head = borer.host.get_organ(BP_HEAD) head.implants += borer else - ..() \ No newline at end of file + ..() + +/datum/antagonist/xenos/borer/is_obvious_antag(datum/mind/player) + return TRUE \ No newline at end of file diff --git a/code/game/antagonist/antagonist_helpers.dm b/code/game/antagonist/antagonist_helpers.dm index 85f1542fed6..f94114cb1ca 100644 --- a/code/game/antagonist/antagonist_helpers.dm +++ b/code/game/antagonist/antagonist_helpers.dm @@ -61,6 +61,9 @@ /datum/antagonist/proc/handle_latelogin(var/mob/user) return +/datum/antagonist/proc/is_obvious_antag(var/datum/mind/player) + return FALSE + /proc/all_random_antag_types() // No caching as the ANTAG_RANDOM_EXCEPTED flag can be added/removed mid-round. var/list/antag_candidates = all_antag_types.Copy() diff --git a/code/game/antagonist/outsider/commando.dm b/code/game/antagonist/outsider/commando.dm index 5aae3c86e86..a58c3322c70 100644 --- a/code/game/antagonist/outsider/commando.dm +++ b/code/game/antagonist/outsider/commando.dm @@ -8,6 +8,7 @@ var/datum/antagonist/deathsquad/mercenary/commandos welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests." antag_sound = 'sound/effects/antag_notice/deathsquid_alert.ogg' id_type = /obj/item/card/id/syndicate_ert + flags = ANTAG_NO_ROUNDSTART_SPAWN faction = "syndicate" diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm index 815c5fea200..e8676e86c7b 100644 --- a/code/game/antagonist/outsider/deathsquad.dm +++ b/code/game/antagonist/outsider/deathsquad.dm @@ -10,7 +10,7 @@ var/datum/antagonist/deathsquad/deathsquad id_type = /obj/item/card/id/asset_protection - flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER | ANTAG_RANDOM_EXCEPTED | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT + flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER | ANTAG_RANDOM_EXCEPTED | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT | ANTAG_NO_ROUNDSTART_SPAWN antaghud_indicator = "huddeathsquad" var/deployed = FALSE diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index e6a71d98009..0916a16e2ab 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -11,7 +11,7 @@ var/datum/antagonist/ert/ert id_type = /obj/item/card/id/ert - flags = ANTAG_OVERRIDE_JOB | ANTAG_RANDOM_EXCEPTED | ANTAG_NO_FLAVORTEXT + flags = ANTAG_OVERRIDE_JOB | ANTAG_RANDOM_EXCEPTED | ANTAG_NO_FLAVORTEXT | ANTAG_NO_ROUNDSTART_SPAWN antaghud_indicator = "hudloyalist" /datum/antagonist/ert/create_default(var/mob/source) diff --git a/code/game/antagonist/outsider/raider_mage.dm b/code/game/antagonist/outsider/raider_techno.dm similarity index 63% rename from code/game/antagonist/outsider/raider_mage.dm rename to code/game/antagonist/outsider/raider_techno.dm index 8993469631b..44bba66355d 100644 --- a/code/game/antagonist/outsider/raider_mage.dm +++ b/code/game/antagonist/outsider/raider_techno.dm @@ -1,9 +1,9 @@ -var/datum/antagonist/raider_mage/raider_mage +var/datum/antagonist/raider_techno/raider_techno -/datum/antagonist/raider_mage - id = MODE_RAIDER_MAGE - role_text = "Raider Mage" - role_text_plural = "Raider Mages" +/datum/antagonist/raider_techno + id = MODE_RAIDER_TECHNO + role_text = "Raider Techno" + role_text_plural = "Raider Technos" bantype = "raider" antag_indicator = "magineer" landmark_id = "raiderstart" @@ -14,25 +14,25 @@ var/datum/antagonist/raider_mage/raider_mage hard_cap = 6 hard_cap_round = 10 - initial_spawn_req = 4 - initial_spawn_target = 6 + initial_spawn_req = 3 + initial_spawn_target = 4 faction = "Space Wizard" id_type = /obj/item/card/id/syndicate/raider -/datum/antagonist/raider_mage/New() +/datum/antagonist/raider_techno/New() ..() - raider_mage = src + raider_techno = src -/datum/antagonist/raider_mage/update_access(var/mob/living/player) +/datum/antagonist/raider_techno/update_access(var/mob/living/player) for(var/obj/item/storage/wallet/W in player.contents) for(var/obj/item/card/id/id in W.contents) id.name = "[player.real_name]'s Passport" id.registered_name = player.real_name W.name = "[initial(W.name)] ([id.name])" -/datum/antagonist/raider_mage/proc/is_raider_crew_safe() +/datum/antagonist/raider_techno/proc/is_raider_crew_safe() if(!length(current_antagonists)) return FALSE @@ -41,7 +41,7 @@ var/datum/antagonist/raider_mage/raider_mage return FALSE return TRUE -/datum/antagonist/raider_mage/equip(var/mob/living/carbon/human/player) +/datum/antagonist/raider_techno/equip(var/mob/living/carbon/human/player) if(!..()) return FALSE @@ -52,12 +52,12 @@ var/datum/antagonist/raider_mage/raider_mage if(I.loc != player) qdel(I) - player.preEquipOutfit(/datum/outfit/admin/syndicate/raider_mage, FALSE) - player.equipOutfit(/datum/outfit/admin/syndicate/raider_mage, FALSE) + player.preEquipOutfit(/datum/outfit/admin/syndicate/raider_techno, FALSE) + player.equipOutfit(/datum/outfit/admin/syndicate/raider_techno, FALSE) player.force_update_limbs() player.update_eyes() player.regenerate_icons() return TRUE -/datum/antagonist/raider_mage/get_antag_radio() +/datum/antagonist/raider_techno/get_antag_radio() return "Raider" diff --git a/code/game/antagonist/outsider/revenant.dm b/code/game/antagonist/outsider/revenant.dm index fa89ab21e3c..3b9d99144cf 100644 --- a/code/game/antagonist/outsider/revenant.dm +++ b/code/game/antagonist/outsider/revenant.dm @@ -27,6 +27,9 @@ var/datum/antagonist/revenant/revenants = null if(revenants.rifts_left <= 0) command_announcement.Announce("Aurora, we aren't detecting any more rift energy signatures. Mop up the rest of the invaders. Good work.", "Bluespace Breach Alert") +/datum/antagonist/revenant/is_obvious_antag(datum/mind/player) + return TRUE + /proc/message_all_revenants(var/message) for(var/thing in human_mob_list) if(isrevenant(thing)) diff --git a/code/game/antagonist/outsider/technomancer.dm b/code/game/antagonist/outsider/technomancer.dm new file mode 100644 index 00000000000..11280b00688 --- /dev/null +++ b/code/game/antagonist/outsider/technomancer.dm @@ -0,0 +1,89 @@ +var/datum/antagonist/technomancer/technomancers + +/datum/antagonist/technomancer + id = MODE_TECHNOMANCER + role_text = "Technomancer" + role_text_plural = "Technomancers" + bantype = "wizard" + landmark_id = "wizard" + welcome_text = "You will need to purchase functions and perhaps some equipment from the various machines around your \ + base. Choose your technological arsenal carefully. Remember that without the core on your back, your functions are \ + powerless, and therefore you will be as well.
\ + In your pockets you will find a one-time use teleport device. Use it to leave the base and go to the station, when you are ready. Your clothing is holographic, you should change its look before leaving." + antag_sound = 'sound/effects/antag_notice/technomancer_alert.ogg' + flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE | ANTAG_VOTABLE + antaghud_indicator = "hudwizard" + + hard_cap = 1 + hard_cap_round = 3 + initial_spawn_req = 1 + initial_spawn_target = 1 + + id_type = /obj/item/card/id/syndicate + +/datum/antagonist/technomancer/New() + ..() + technomancers = src + +/datum/antagonist/technomancer/update_antag_mob(var/datum/mind/technomancer) + ..() + technomancer.store_memory("Remember: Do not forget to purchase the functions and equipment you need.") + technomancer.current.real_name = random_name(technomancer.current.gender, technomancer.current.get_species()) + technomancer.current.name = technomancer.current.real_name + +/datum/antagonist/technomancer/equip(var/mob/living/carbon/human/technomancer_mob) + if(!..()) + return FALSE + + technomancer_mob.preEquipOutfit(/datum/outfit/admin/techomancer, FALSE) + technomancer_mob.equipOutfit(/datum/outfit/admin/techomancer, FALSE) + + return TRUE + +/datum/antagonist/technomancer/proc/equip_apprentice(var/mob/living/carbon/human/technomancer_mob) + technomancer_mob.preEquipOutfit(/datum/outfit/admin/techomancer/apprentice, FALSE) + technomancer_mob.equipOutfit(/datum/outfit/admin/techomancer/apprentice, FALSE) + return TRUE + +/datum/antagonist/technomancer/check_victory() + var/survivor + for(var/datum/mind/player in current_antagonists) + if(!player.current || player.current.stat == DEAD) + continue + survivor = 1 + break + if(!survivor) + feedback_set_details("round_end_result","loss - technomancer killed") + to_world("The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been killed!") + +/datum/antagonist/technomancer/print_player_summary() + ..() + for(var/obj/item/technomancer_core/core in technomancer_belongings) + if(core.wearer) + continue // Only want abandoned cores. + if(!core.spells.len) + continue // Cores containing spells only. + to_world("Abandoned [core] had [english_list(core.spells)].
") + +/datum/antagonist/technomancer/print_player_full(var/datum/mind/player) + var/text = print_player_lite(player) + + var/obj/item/technomancer_core/core + if(player.original) + core = locate() in player.original + if(core) + text += "
Bought [english_list(core.spells)], and used \a [core]." + else + text += "
They've lost their core." + + return text + +/datum/antagonist/technomancer/proc/is_technomancer(var/datum/mind/player) + if(player in current_antagonists) + return TRUE + if(raider_techno.is_antagonist(player)) + return TRUE + return FALSE + +/datum/antagonist/technomancer/is_obvious_antag(datum/mind/player) + return TRUE diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm deleted file mode 100644 index 37a6be3ce80..00000000000 --- a/code/game/antagonist/outsider/wizard.dm +++ /dev/null @@ -1,148 +0,0 @@ -var/datum/antagonist/wizard/wizards - -/datum/antagonist/wizard - id = MODE_WIZARD - role_text = "Space Wizard" - role_text_plural = "Space Wizards" - bantype = "wizard" - landmark_id = "wizard" - welcome_text = "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.
In your pockets you will find a teleport scroll. Use it as needed." - flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT - antaghud_indicator = "hudwizard" - required_age = 10 - - hard_cap = 1 - hard_cap_round = 3 - initial_spawn_req = 1 - initial_spawn_target = 1 - - faction = "Space Wizard" - -/datum/antagonist/wizard/New() - ..() - wizards = src - -/datum/antagonist/wizard/create_objectives(var/datum/mind/wizard) - - if(!..()) - return - - var/kill - var/escape - var/steal - var/hijack - - switch(rand(1,100)) - if(1 to 30) - escape = 1 - kill = 1 - if(31 to 60) - escape = 1 - steal = 1 - if(61 to 99) - kill = 1 - steal = 1 - else - hijack = 1 - - if(kill) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = wizard - kill_objective.find_target() - wizard.objectives |= kill_objective - if(steal) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = wizard - steal_objective.find_target() - wizard.objectives |= steal_objective - if(escape) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = wizard - wizard.objectives |= survive_objective - if(hijack) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = wizard - wizard.objectives |= hijack_objective - return - -/datum/antagonist/wizard/update_antag_mob(var/datum/mind/wizard) - ..() - wizard.store_memory("Remember: do not forget to prepare your spells.") - -/datum/antagonist/wizard/set_antag_name(mob/living/player) - player.real_name = "[pick(wizard_first)] [pick(wizard_second)]" - player.name = player.real_name - var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) - if(newname) - player.real_name = newname - player.name = player.real_name - player.dna.real_name = newname - if(player.mind) - player.mind.name = player.name - // Update any ID cards. - update_access(player) - -/datum/antagonist/wizard/equip(var/mob/living/carbon/human/player) - - if(!..()) - return FALSE - - for (var/obj/item/I in player) - if (istype(I, /obj/item/implant)) - continue - player.drop_from_inventory(I) - if(I.loc != player) - qdel(I) - - player.preEquipOutfit(/datum/outfit/admin/wizard, FALSE) - player.equipOutfit(/datum/outfit/admin/wizard, FALSE) - if(player.wear_id) - id_card = player.wear_id - player.force_update_limbs() - player.update_eyes() - player.regenerate_icons() - -/datum/antagonist/wizard/set_antag_name(var/mob/living/player) - ..() - if(id_card) - addtimer(CALLBACK(player, /mob/.proc/set_id_info, id_card), 1 SECOND) - -/datum/antagonist/wizard/check_victory() - var/survivor - for(var/datum/mind/player in current_antagonists) - if(!player.current || player.current.stat) - continue - survivor = 1 - break - if(!survivor) - feedback_set_details("round_end_result","loss - wizard killed") - to_world("The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") - - -//To batch-remove wizard spells. Linked to mind.dm. -/mob/proc/spellremove() - for(var/spell/spell_to_remove in src.spell_list) - remove_spell(spell_to_remove) - -obj/item/clothing - var/wizard_garb = 0 - -// Does this clothing slot count as wizard garb? (Combines a few checks) -/proc/is_wiz_garb(var/obj/item/clothing/C) - return C && C.wizard_garb - -/*Checks if the wizard is wearing the proper attire. -Made a proc so this is not repeated 14 (or more) times.*/ -/mob/proc/wearing_wiz_garb() - to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.") - return 0 - -// Humans can wear clothes. -/mob/living/carbon/human/wearing_wiz_garb() - if(!is_wiz_garb(src.wear_suit) && (!src.species.hud || (slot_wear_suit in src.species.hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my robes.") - return 0 - if(!is_wiz_garb(src.head) && (!species.hud || (slot_head in src.species.hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my headwear.") - return 0 - return 1 diff --git a/code/game/antagonist/station/changeling/changeling.dm b/code/game/antagonist/station/changeling/changeling.dm index 8d5fb722113..0785a2e97d7 100644 --- a/code/game/antagonist/station/changeling/changeling.dm +++ b/code/game/antagonist/station/changeling/changeling.dm @@ -95,4 +95,9 @@ if(.) player.current.verbs -= /datum/changeling/proc/EvolutionMenu for(var/datum/power/changeling/P in powerinstances) - player.current.verbs -= P.verbpath \ No newline at end of file + player.current.verbs -= P.verbpath + +/datum/antagonist/changeling/is_obvious_antag(datum/mind/player) + if(istype(player.current, /mob/living/simple_animal/hostile/lesser_changeling)) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/game/antagonist/station/changeling/morph.dm b/code/game/antagonist/station/changeling/morph.dm index ca0b33b5cd3..fac79d12b5c 100644 --- a/code/game/antagonist/station/changeling/morph.dm +++ b/code/game/antagonist/station/changeling/morph.dm @@ -8,13 +8,16 @@ var/datum/antagonist/morph/morphs = null antaghud_indicator = "hudchangeling" faction = "Changeling" antag_sound = 'sound/effects/antag_notice/ling_alert.ogg' + flags = ANTAG_NO_ROUNDSTART_SPAWN /datum/antagonist/morph/New() ..() - morphs = src /datum/antagonist/morph/greet(datum/mind/player) . = ..() to_chat(player.current, SPAN_DANGER("As a morph, you can disguise as objects by alt-clicking on them.")) - to_chat(player.current, SPAN_DANGER("You can eat people and items by clicking on them, but only if they're dead.")) \ No newline at end of file + to_chat(player.current, SPAN_DANGER("You can eat people and items by clicking on them, but only if they're dead.")) + +/datum/antagonist/morph/is_obvious_antag(datum/mind/player) + return TRUE \ No newline at end of file diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index 5506431838b..0424ffd5e87 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -126,4 +126,11 @@ var/datum/antagonist/cultist/cult if(!cult.can_become_antag(target.mind) || jobban_isbanned(target, "cultist") || player_is_antag(target.mind)) to_chat(usr, SPAN_CULT("You get the sense that [target] would be an unworthy offering.")) else - to_chat(usr, SPAN_CULT("You get the sense that your master would be pleased to welcome [target] into the cult.")) \ No newline at end of file + to_chat(usr, SPAN_CULT("You get the sense that your master would be pleased to welcome [target] into the cult.")) + +/datum/antagonist/cultist/is_obvious_antag(datum/mind/player) + if(istype(player.current, /mob/living/simple_animal/construct)) + return TRUE + else if(istype(player.current, /mob/living/simple_animal/shade)) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/game/antagonist/station/highlander.dm b/code/game/antagonist/station/highlander.dm index ceac067f235..41e71ff46ca 100644 --- a/code/game/antagonist/station/highlander.dm +++ b/code/game/antagonist/station/highlander.dm @@ -5,7 +5,7 @@ var/datum/antagonist/highlander/highlanders role_text_plural = "Highlanders" welcome_text = "There can be only one." id = MODE_HIGHLANDER - flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE + flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_NO_ROUNDSTART_SPAWN hard_cap = 5 hard_cap_round = 7 diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm index c42e09fd0a4..a5e468c6b74 100644 --- a/code/game/antagonist/station/renegade.dm +++ b/code/game/antagonist/station/renegade.dm @@ -5,7 +5,7 @@ var/datum/antagonist/renegade/renegades role_text_plural = "Renegades" welcome_text = "You're extremely paranoid today. For your entire life, you've theorized about a shadow corporation out for your blood and yours only. Something's here to kill you, but you don't know what... Remember that you're not a full antagonist. You can prepare to murder someone and kill, but you shouldn't actively seek conflict." id = MODE_RENEGADE - flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_VOTABLE + flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_VOTABLE | ANTAG_NO_ROUNDSTART_SPAWN hard_cap = 5 hard_cap_round = 7 diff --git a/code/game/antagonist/station/rogue_ai.dm b/code/game/antagonist/station/rogue_ai.dm index ba4de0a261c..187244c9575 100644 --- a/code/game/antagonist/station/rogue_ai.dm +++ b/code/game/antagonist/station/rogue_ai.dm @@ -10,7 +10,7 @@ var/datum/antagonist/rogue_ai/malf antag_sound = 'sound/effects/antag_notice/malf_alert.ogg' victory_text = "The AI has taken control of all of the station's systems." loss_text = "The AI has been shut down!" - flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB | ANTAG_CHOOSE_NAME + flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB | ANTAG_CHOOSE_NAME | ANTAG_NO_ROUNDSTART_SPAWN hard_cap = 1 hard_cap_round = 1 initial_spawn_req = 1 diff --git a/code/game/antagonist/station/thrall.dm b/code/game/antagonist/station/thrall.dm index eb8c1f31341..8865d925ed2 100644 --- a/code/game/antagonist/station/thrall.dm +++ b/code/game/antagonist/station/thrall.dm @@ -17,6 +17,7 @@ var/datum/antagonist/thrall/thralls = null SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP ) + flags = ANTAG_NO_ROUNDSTART_SPAWN welcome_text = "You are a vampire or psionic operant's thrall: a pawn to be commanded by them at will." antaghud_indicator = "hudthrall" @@ -40,4 +41,5 @@ var/datum/antagonist/thrall/thralls = null /datum/antagonist/thrall/remove_antagonist(datum/mind/player, show_message, implanted) var/datum/vampire/vampire = player.antag_datums[MODE_VAMPIRE] vampire.lose_master(player.current) + player.antag_datums -= MODE_VAMPIRE return ..() \ No newline at end of file diff --git a/code/game/antagonist/station/wizard_golem.dm b/code/game/antagonist/station/wizard_golem.dm deleted file mode 100644 index a8ce5591fd2..00000000000 --- a/code/game/antagonist/station/wizard_golem.dm +++ /dev/null @@ -1,13 +0,0 @@ -var/datum/antagonist/wizard_golem/wizard_golems = null - -/datum/antagonist/wizard_golem - id = MODE_GOLEM - role_text = "Golem" - role_text_plural = "Golems" - welcome_text = "You are a golem summoned by a powerful mage. Serve your master, and assist them in completing their goals at any cost." - antaghud_indicator = "hudmagineer" - -/datum/antagonist/wizard_golem/New() - ..() - - wizard_golems = src \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 29a70557039..a6b1c94973d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -4,6 +4,10 @@ var/anchored = 0 var/movable_flags + var/icon_scale_x = 1 // Used to scale icons up or down horizonally in update_transform(). + var/icon_scale_y = 1 // Used to scale icons up or down vertically in update_transform(). + var/icon_rotation = 0 // Used to rotate icons in update_transform() + // var/elevation = 2 - not used anywhere var/move_speed = 10 var/l_move_time = 1 @@ -184,7 +188,8 @@ src.SpinAnimation(speed = 4, loops = 1) //done throwing, either because it hit something or it finished moving - if(isobj(src)) src.throw_impact(get_turf(src),speed) + if(isturf(loc) && isobj(src)) + throw_impact(loc, speed) src.throwing = 0 src.thrower = null src.throw_source = null @@ -267,6 +272,34 @@ /atom/movable/proc/get_transit_zlevel() return current_map.get_transit_zlevel() +// Returns the current scaling of the sprite. +// Note this DOES NOT measure the height or width of the icon, but returns what number is being multiplied with to scale the icons, if any. +/atom/movable/proc/get_icon_scale_x() + return icon_scale_x + +/atom/movable/proc/get_icon_scale_y() + return icon_scale_y + +/atom/movable/proc/update_transform() + var/matrix/M = matrix() + M.Scale(icon_scale_x, icon_scale_y) + M.Turn(icon_rotation) + src.transform = M + +// Use this to set the object's scale. +/atom/movable/proc/adjust_scale(new_scale_x, new_scale_y) + if(isnull(new_scale_y)) + new_scale_y = new_scale_x + if(new_scale_x != 0) + icon_scale_x = new_scale_x + if(new_scale_y != 0) + icon_scale_y = new_scale_y + update_transform() + +/atom/movable/proc/adjust_rotation(new_rotation) + icon_rotation = new_rotation + update_transform() + // Parallax stuff. /atom/movable/proc/update_client_hook(atom/destination) @@ -393,3 +426,6 @@ /atom/movable/proc/get_floating_chat_x_offset() return 0 + +/atom/movable/proc/can_attach_sticker(var/mob/user, var/obj/item/sticker/S) + return TRUE \ No newline at end of file diff --git a/code/game/gamemodes/antagspawner.dm b/code/game/gamemodes/antagspawner.dm index 142bdead347..17fcd77e41f 100644 --- a/code/game/gamemodes/antagspawner.dm +++ b/code/game/gamemodes/antagspawner.dm @@ -11,29 +11,79 @@ throw_range = 5 w_class = ITEMSIZE_TINY var/uses = 1 + var/mob_type + var/ghost_role_id -/obj/item/antag_spawner/proc/equip_antag(mob/target as mob) +/obj/item/antag_spawner/attack_self(mob/user) + if(uses <= 0) + to_chat(user, SPAN_WARNING("This teleporter is out of uses.")) + return + request_player(user) + +/obj/item/antag_spawner/proc/equip_antag(mob/target, mob/user) return +/obj/item/antag_spawner/proc/request_player(var/mob/user) + uses-- + + var/mob/M = new mob_type(get_turf(user)) + M.faction = user.faction + spark(M, 4, alldirs) + SSghostroles.add_spawn_atom(ghost_role_id, M) + equip_antag(M, user) + return M + /obj/item/antag_spawner/borg_tele name = "syndicate cyborg teleporter" desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field. Due to budget restrictions, it is only possible to deploy a single cyborg at time." icon = 'icons/obj/device.dmi' icon_state = "locator" + mob_type = /mob/living/silicon/robot/syndicate + ghost_role_id = "syndiborg" -/obj/item/antag_spawner/borg_tele/attack_self(mob/user) - if(uses <= 0) - to_chat(user, SPAN_WARNING("This teleporter is out of uses.")) - return - - uses-- - - var/mob/living/silicon/robot/syndicate/F = new /mob/living/silicon/robot/syndicate(get_turf(user)) +/obj/item/antag_spawner/borg_tele/equip_antag(mob/target, mob/user) + . = ..() + var/mob/living/silicon/robot/syndicate/S = target if(user?.mind.special_role) var/datum/antagonist/user_antag = all_antag_types[lowertext(user.mind.special_role)] if(user_antag) - F.assigned_antagonist = user_antag - F.faction = user.faction - F.say("Initiating boot-up sequence!") - spark(F, 4, alldirs) - SSghostroles.add_spawn_atom("syndiborg", F) \ No newline at end of file + S.assigned_antagonist = user_antag + S.say("Initiating boot-up sequence!") + +/obj/item/antag_spawner/technomancer_apprentice + name = "apprentice teleporter" + desc = "A teleportation device, which will bring a less potent manipulator of space to you." + icon = 'icons/obj/device.dmi' + icon_state = "locator" + mob_type = /mob/living/carbon/human + ghost_role_id = "technoapprentice" + +/obj/item/antag_spawner/technomancer_apprentice/attack_self(var/mob/user) + if(uses <= 0) + to_chat(user, SPAN_WARNING("This teleporter is out of charge.")) + return + to_chat(user, SPAN_NOTICE("The teleporter is now attempting to lock on to your apprentice!")) + request_player() + +/obj/item/antag_spawner/technomancer_apprentice/request_player(mob/user) + uses = 0 + SSghostroles.add_spawn_atom(ghost_role_id, src) + +/obj/item/antag_spawner/technomancer_apprentice/Destroy() + SSghostroles.remove_spawn_atom(ghost_role_id, src) + return ..() + +/obj/item/antag_spawner/technomancer_apprentice/assign_player(var/mob/user) + var/turf/T = get_turf(src) + var/mob/living/carbon/human/G = new /mob/living/carbon/human(T) + G.ckey = user.ckey + + anim(T, G, 'icons/mob/mob.dmi', null,"phasein-blue", null, G.dir) + + G.preEquipOutfit(/datum/outfit/admin/techomancer/apprentice, FALSE) + G.equipOutfit(/datum/outfit/admin/techomancer/apprentice, FALSE) + technomancers.add_antagonist(G.mind, FALSE, TRUE, FALSE, FALSE, FALSE) + + qdel(src) + + return G \ No newline at end of file diff --git a/code/game/gamemodes/cult/items/sword.dm b/code/game/gamemodes/cult/items/sword.dm index 1e097de516c..d85faca898b 100644 --- a/code/game/gamemodes/cult/items/sword.dm +++ b/code/game/gamemodes/cult/items/sword.dm @@ -1,12 +1,13 @@ /obj/item/melee/cultblade name = "eldritch blade" - desc = "A sword humming with unholy energy. It glows with a dim red light." + desc = "A sword humming with unholy energy. It glows with a dim red light and looks deadly sharp." desc_antag = "This sword is a powerful weapon, capable of severing limbs easily, if they are targeted. Non-believers are unable to use this weapon." icon = 'icons/obj/sword.dmi' icon_state = "cultblade" item_state = "cultblade" contained_sprite = TRUE force = 25 + armor_penetration = 50 // Narsie's blessing is strong. Also needed so the cult isn't obliterated by the average voidsuit with melee resistance. w_class = ITEMSIZE_LARGE throwforce = 10 slot_flags = SLOT_BELT diff --git a/code/game/gamemodes/cult/structures/altar.dm b/code/game/gamemodes/cult/structures/altar.dm index c472aa000f8..8c4fe0e145f 100644 --- a/code/game/gamemodes/cult/structures/altar.dm +++ b/code/game/gamemodes/cult/structures/altar.dm @@ -18,10 +18,12 @@ to_chat(H, SPAN_WARNING("Severed artery found in [O.name], repairing...")) if(do_after(user, 20)) O.status &= ~ORGAN_ARTERY_CUT - if(O.status & ORGAN_TENDON_CUT) + if(O.tendon_status() & TENDON_CUT) to_chat(H, SPAN_WARNING("Severed tendon found in [O.name], repairing...")) - if(do_after(user, 20)) - O.status &= ~ORGAN_TENDON_CUT + if(!O.tendon.can_recover()) + to_chat(H, SPAN_WARNING("The tissue surrounding the tendon in [O.name] is still too damaged.")) + else if(do_after(user, 20)) + O.tendon.rejuvenate() if(O.status & ORGAN_BROKEN) to_chat(H, SPAN_WARNING("Broken bone found in [O.name], repairing...")) if(do_after(user, 20)) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index dc1832f0050..9d7dd025a76 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -15,4 +15,6 @@ config_tag = "magistake" extended_round_description = "The galaxy is a place full of dangers, even the inner colonies are not free of such scourges. \ Some say that the best raiders have a touch of magic to their art of plunder, but that's just hearsay." - antag_tags = list(MODE_RAIDER_MAGE) \ No newline at end of file + antag_tags = list(MODE_RAIDER_TECHNO) + required_players = 12 + required_enemies = 3 \ No newline at end of file diff --git a/code/game/gamemodes/mixed/conflux.dm b/code/game/gamemodes/mixed/conflux.dm deleted file mode 100644 index 8331e90338d..00000000000 --- a/code/game/gamemodes/mixed/conflux.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/game_mode/conflux - name = "Conflux (Wiz+Cult)" - round_description = "A space wizard and a cult have invaded the station!" - extended_round_description = "Cultists and wizards spawn during this round." - config_tag = "conflux" - required_players = 15 - required_enemies = 5 - end_on_antag_death = 0 - antag_tags = list(MODE_WIZARD, MODE_CULTIST) - require_all_templates = 1 diff --git a/code/game/gamemodes/mixed/visitors.dm b/code/game/gamemodes/mixed/visitors.dm index 1ea2ff22f9f..39baf3868ec 100644 --- a/code/game/gamemodes/mixed/visitors.dm +++ b/code/game/gamemodes/mixed/visitors.dm @@ -1,10 +1,10 @@ /datum/game_mode/visitors - name = "Visitors (Ninja+Wiz)" - round_description = "A space wizard and a ninja have invaded the station!" - extended_round_description = "A ninja and wizard spawn during this round." + name = "Visitors (Ninja+Techno)" + round_description = "A Technomancer and a Ninja have invaded the station!" + extended_round_description = "A Ninja and a Technomancer spawn during this round." config_tag = "visitors" required_players = 20 required_enemies = 3 end_on_antag_death = 0 - antag_tags = list(MODE_WIZARD, MODE_NINJA) + antag_tags = list(MODE_TECHNOMANCER, MODE_NINJA) require_all_templates = 1 diff --git a/code/game/gamemodes/technomancer/assistance/assistance.dm b/code/game/gamemodes/technomancer/assistance/assistance.dm new file mode 100644 index 00000000000..ff5f4b77cdf --- /dev/null +++ b/code/game/gamemodes/technomancer/assistance/assistance.dm @@ -0,0 +1,22 @@ +/datum/technomancer/assistance + var/one_use_only = 0 + +/datum/technomancer/assistance/apprentice + name = "Friendly Apprentice" + desc = "A one-time use teleporter that sends a less powerful manipulator of space to you, who will do their best to protect \ + and serve you. They get their own catalog and can buy spells for themselves, however they have a smaller pool to buy with. \ + If you are unable to receive an apprentice, the teleporter can be refunded like most equipment by sliding it into the \ + catalog. Note that apprentices cannot purchase more apprentices." + cost = 300 + obj_path = /obj/item/antag_spawner/technomancer_apprentice + has_additional_info = TRUE + +/datum/technomancer/assistance/apprentice/additional_info() + var/technomancer_count = 0 + var/ghost_count = 0 + for(var/mob/abstract/observer/O in player_list) + if(O.client && (O.client.inactivity < 5 MINUTES)) + if("technomancer" in O.client.prefs.be_special_role) + technomancer_count++ + ghost_count++ + return "There [technomancer_count > 1 ? "are" : "is"] [technomancer_count] out of [ghost_count] active observer\s with the technomancer role enabled." \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm new file mode 100644 index 00000000000..fe75f93114f --- /dev/null +++ b/code/game/gamemodes/technomancer/catalog.dm @@ -0,0 +1,390 @@ +#define ALL_SPELLS "All" +#define OFFENSIVE_SPELLS "Offensive" +#define DEFENSIVE_SPELLS "Defensive" +#define UTILITY_SPELLS "Utility" +#define SUPPORT_SPELLS "Support" + +var/list/all_technomancer_spells = typesof(/datum/technomancer/spell) - /datum/technomancer/spell +var/list/all_technomancer_equipment = typesof(/datum/technomancer/equipment) - /datum/technomancer/equipment +var/list/all_technomancer_consumables = typesof(/datum/technomancer/consumable) - /datum/technomancer/consumable +var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) - /datum/technomancer/assistance + +/datum/technomancer + var/name = "technomancer thing" + var/desc = "If you can see this, something broke." + var/cost = 100 + var/hidden = 0 + var/obj_path = null + var/ability_icon_state = null + var/has_additional_info = FALSE + +/datum/technomancer/proc/additional_info() + return + +/datum/technomancer/spell + var/category = ALL_SPELLS + var/enhancement_desc = null + var/spell_power_desc = null + +/obj/item/technomancer_catalog + name = "catalog" + desc = "A \"book\" featuring a holographic display, metal cover, and miniaturized teleportation device, allowing the user to \ + requisition various things from.. where ever they came from." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "ano91" + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT + var/budget = 1000 + var/max_budget = 1000 + var/mob/living/carbon/human/owner = null + var/list/spell_instances = list() + var/list/equipment_instances = list() + var/list/consumable_instances = list() + var/list/assistance_instances = list() + var/tab = 4 // Info tab, so new players can read it before doing anything. + var/spell_tab = ALL_SPELLS + var/show_scepter_text = 0 + +/obj/item/technomancer_catalog/apprentice + name = "apprentice's catalog" + budget = 700 + max_budget = 700 + +/obj/item/technomancer_catalog/master //for badmins, I suppose + name = "master's catalog" + budget = 2000 + max_budget = 2000 + + +// Proc: bind_to_owner() +// Parameters: 1 (new_owner - mob that the book is trying to bind to) +// Description: Links the catalog to hopefully the technomancer, so that only they can access it. +/obj/item/technomancer_catalog/proc/bind_to_owner(var/mob/living/carbon/human/new_owner) + if(!owner && technomancers.is_technomancer(new_owner.mind)) + owner = new_owner + +// Proc: New() +// Parameters: 0 +// Description: Sets up the catalog, as shown below. +/obj/item/technomancer_catalog/New() + ..() + set_up() + +// Proc: set_up() +// Parameters: 0 +// Description: Instantiates all the catalog datums for everything that can be bought. +/obj/item/technomancer_catalog/proc/set_up() + if(!spell_instances.len) + for(var/S in all_technomancer_spells) + spell_instances += new S() + if(!equipment_instances.len) + for(var/E in all_technomancer_equipment) + equipment_instances += new E() + if(!consumable_instances.len) + for(var/C in all_technomancer_consumables) + consumable_instances += new C() + if(!assistance_instances.len) + for(var/A in all_technomancer_assistance) + assistance_instances += new A() + +/obj/item/technomancer_catalog/apprentice/set_up() + ..() + for(var/datum/technomancer/assistance/apprentice/A in assistance_instances) + assistance_instances.Remove(A) + +// Proc: show_categories() +// Parameters: 1 (category - the category link to display) +// Description: Shows an href link to go to a spell subcategory if the category is not already selected, otherwise is bold, to reduce +// code duplicating. +/obj/item/technomancer_catalog/proc/show_categories(var/category) + if(category) + if(spell_tab != category) + return "[category]" + else + return "[category]" + +// Proc: attack_self() +// Parameters: 1 (user - the mob clicking on the catalog) +// Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used. +/obj/item/technomancer_catalog/attack_self(mob/user) + if(!user) + return 0 + if(owner && user != owner) + to_chat(user, "\The [src] knows that you're not the original owner, and has locked you out of it!") + return 0 + else if(!owner) + bind_to_owner(user) + + switch(tab) + if(0) //Functions + var/dat = "" + user.set_machine(src) + dat += "Functions | " + dat += "Equipment | " + dat += "Consumables | " + dat += "Assistance | " + dat += "Info
" + dat += "You currently have a budget of [budget]/[max_budget].

" + dat += "Refund Functions

" + + dat += "[show_categories(ALL_SPELLS)] | [show_categories(OFFENSIVE_SPELLS)] | [show_categories(DEFENSIVE_SPELLS)] | \ + [show_categories(UTILITY_SPELLS)] | [show_categories(SUPPORT_SPELLS)]
" + for(var/datum/technomancer/spell/spell in spell_instances) + if(spell.hidden) + continue + if(spell_tab != ALL_SPELLS && spell.category != spell_tab) + continue + dat += "[spell.name]
" + dat += "[spell.desc]
" + if(spell.spell_power_desc) + dat += "Spell Power: [spell.spell_power_desc]
" + if(spell.enhancement_desc) + dat += "Scepter Effect: [spell.enhancement_desc]
" + if(spell.has_additional_info) + dat += "[spell.additional_info()]
" + if(spell.cost <= budget) + dat += "Purchase ([spell.cost])

" + else + dat += "Cannot afford!

" + user << browse(dat, "window=radio") + onclose(user, "radio") + if(1) //Equipment + var/dat = "" + user.set_machine(src) + dat += "Functions | " + dat += "Equipment | " + dat += "Consumables | " + dat += "Assistance | " + dat += "Info
" + dat += "You currently have a budget of [budget]/[max_budget].

" + for(var/datum/technomancer/equipment/E in equipment_instances) + dat += "[E.name]
" + dat += "[E.desc]
" + if(E.has_additional_info) + dat += "[E.additional_info()]
" + if(E.cost <= budget) + dat += "Purchase ([E.cost])

" + else + dat += "Cannot afford!

" + user << browse(dat, "window=radio") + onclose(user, "radio") + if(2) //Consumables + var/dat = "" + user.set_machine(src) + dat += "Functions | " + dat += "Equipment | " + dat += "Consumables | " + dat += "Assistance | " + dat += "Info
" + dat += "You currently have a budget of [budget]/[max_budget].

" + for(var/datum/technomancer/consumable/C in consumable_instances) + dat += "[C.name]
" + dat += "[C.desc]
" + if(C.has_additional_info) + dat += "[C.additional_info()]
" + if(C.cost <= budget) + dat += "Purchase ([C.cost])

" + else + dat += "Cannot afford!

" + user << browse(dat, "window=radio") + onclose(user, "radio") + if(3) //Assistance + var/dat = "" + user.set_machine(src) + dat += "Functions | " + dat += "Equipment | " + dat += "Consumables | " + dat += "Assistance | " + dat += "Info
" + dat += "You currently have a budget of [budget]/[max_budget].

" + for(var/datum/technomancer/assistance/A in assistance_instances) + dat += "[A.name]
" + dat += "[A.desc]
" + if(A.has_additional_info) + dat += "[A.additional_info()]
" + if(A.cost <= budget) + dat += "Purchase ([A.cost])

" + else + dat += "Cannot afford!

" + user << browse(dat, "window=radio") + onclose(user, "radio") + if(4) //Info + var/dat = "" + user.set_machine(src) + dat += "Functions | " + dat += "Equipment | " + dat += "Consumables | " + dat += "Assistance | " + dat += "Info
" + dat += "You currently have a budget of [budget]/[max_budget].

" + dat += "
" + dat += "

Manipulation Core Owner's Manual


" + dat += "This brief entry in your catalog will try to explain what everything does. For starters, the thing you're \ + probably wearing on your back is known as a Manipulation Core, or just a 'Core'. It allows you to do amazing \ + things with almost no effort, depending on what functions you've purchased for it. Don't lose your core!
" + dat += "
" + dat += "There are a few things you need to keep in mind as you use your Core to manipulate the universe. The core \ + requires a special type of energy, that is referred to as just 'Energy' in the catalog. All cores generate \ + their own energy, some more than others. Most functions require energy be spent in order to work, so make sure not \ + to run out in a critical moment. Besides waiting for your Core to recharge, you can buy certain functions which \ + do something to generate energy.
" + dat += "
" + dat += "The second thing you need to know is that awesome power over the physical world has consquences, in the form \ + of Instability. Instability is the result of your Core's energy being used to fuel it, and so little is \ + understood about it, even among fellow Core owners, however it is almost always a bad thing to have. Instability will \ + 'cling' to you as you use functions, with powerful functions creating lots of instability. The effects of holding onto \ + instability are generally harmless or mildly annoying at low levels, with effects such as sparks in the air or forced \ + blinking. Accumulating more and more instability will lead to worse things happening, which can easily be fatal, if not \ + managed properly.
" + dat += "
" + dat += "Fortunately, all Cores come with a meter to tell you how much instability you currently hold. \ + Instability will go away on its own as time goes on. You can tell if you have instability by the characteristic \ + purple colored lightning that appears around something with instability lingering on it. High amounts of instability \ + may cause the object afflicted with it to glow a dark purple, which is often known simply as Glow, which spreads \ + the instability. You should stay far away from anyone afflicted by Glow, as they will be a danger to both themselves and \ + anything nearby. Multiple sources of Glow can perpetuate the glow for a very long time if they are not seperated.
" + dat += "
" + dat += "You should strive to keep you and your apprentices' cores secure. To help with this, each core comes with a \ + locking mechanism, which should make attempts at forceful removal by third parties (or you) futile, until it is \ + unlocked again. Do note that there is a safety mechanism, which will automatically unlock the core if the wearer \ + suffers death. There exists a secondary safety mechanism (safety for the core, not you) that is triggered when \ + the core detects itself being carried, with the carrier not being authorized. It will respond by giving a \ + massive amount of Instability to them, so be careful, or perhaps make use of that.
" + dat += "
" + dat += "You can refund functions, equipment items, and assistance items, so long as you are in your base. \ + Once you leave, you can't refund anything, however you can still buy things if you still have points remaining. \ + To refund functions, just click the 'Refund Functions' button on the top, when in the functions tabs. \ + For equipment items, you need to hit it against the catalog.
" + dat += "
" + dat += "Your blue robes and hat are both stylish, and somewhat protective against hostile energies, which includes \ + EXTERNAL instability sources (like Glow), and mundane electricity. If you're looking for protection against other \ + things, it's suggested you purchase or otherwise obtain armor.
" + dat += "
" + dat += "There are a few terms you may not understand in the catalog, so this will try to explain them.
" + dat += "A function can be thought of as a 'spell', that you use by holding in your hands and trying to use it on \ + a target of your choice.
" + dat += "Some functions can have their abilities enhanced by a special rod called the Scepter of Enhancement. \ + If a function is able to be boosted with it, it will be shown underneath the description of the function as \ + 'Scepter Effect:'. Note that you must hold the scepter for it to work, so try to avoid losing it.
" + dat += "Functions can also be boosted with the core itself. A function that is able to benefit \ + from this will have 'Spell Power:' underneath. Different Cores have different \ + amounts of spell power.
" + dat += "When a function refers to 'allies', it means you, your apprentices, currently controlled entities (with the \ + Control function), and friendly simple-minded entities that you've summoned with the Scepter of Enhancement.
" + dat += "A meter is equal to one 'tile'.
" + user << browse(dat, "window=radio") + onclose(user, "radio") + +// Proc: Topic() +// Parameters: 2 (href - don't know, href_list - the choice that the person using the interface above clicked on.) +// Description: Acts upon clicks on links for the catalog, if they are the rightful owner. +/obj/item/technomancer_catalog/Topic(href, href_list) + ..() + var/mob/living/carbon/human/H = usr + + if(use_check_and_message(H)) + return + + if(!ishuman(H)) + return 1 //why does this return 1? + + if(H != owner) + to_chat(H, SPAN_WARNING("\The [src] won't allow you to do that, as you don't own \the [src]!")) + return + + if(loc == H || (in_range(src, H) && isturf(loc))) + H.set_machine(src) + if(href_list["tab_choice"]) + tab = text2num(href_list["tab_choice"]) + if(href_list["spell_category"]) + spell_tab = href_list["spell_category"] + if(href_list["spell_choice"]) + var/datum/technomancer/new_spell = null + //Locate the spell. + for(var/datum/technomancer/spell/spell in spell_instances) + if(spell.name == href_list["spell_choice"]) + new_spell = spell + break + + var/obj/item/technomancer_core/core = null + if(istype(H.back, /obj/item/technomancer_core)) + core = H.back + + if(new_spell && core) + if(new_spell.cost <= budget) + if(!core.has_spell(new_spell)) + budget -= new_spell.cost + to_chat(H, "You have just bought [new_spell.name].") + core.add_spell(new_spell.obj_path, new_spell.name, new_spell.ability_icon_state) + else //We already own it. + to_chat(H, "You already have [new_spell.name]!") + return + else //Can't afford. + to_chat(H, "You can't afford that!") + return + + // This needs less copypasta. + if(href_list["item_choice"]) + var/datum/technomancer/desired_object = null + for(var/datum/technomancer/O in equipment_instances + consumable_instances + assistance_instances) + if(O.name == href_list["item_choice"]) + desired_object = O + break + + if(desired_object) + if(desired_object.cost <= budget) + budget -= desired_object.cost + to_chat(H, "You have just bought \a [desired_object.name].") + var/obj/O = new desired_object.obj_path(get_turf(H)) + technomancer_belongings.Add(O) // Used for the Track spell. + + else //Can't afford. + to_chat(H, "You can't afford that!") + return + + + if(href_list["refund_functions"]) + var/turf/T = get_turf(H) + if(T.z in current_map.player_levels) + to_chat(H, "You can only refund at your base, it's too late now!") + return + var/obj/item/technomancer_core/core = null + if(istype(H.back, /obj/item/technomancer_core)) + core = H.back + if(core) + for(var/obj/spellbutton/spell in core.spells) + for(var/datum/technomancer/spell/spell_datum in spell_instances) + if(spell_datum.obj_path == spell.spellpath) + budget += spell_datum.cost + core.remove_spell(spell) + break + attack_self(H) + +/obj/item/technomancer_catalog/attackby(var/atom/movable/AM, var/mob/user) + var/turf/T = get_turf(user) + if(T.z in current_map.player_levels) + to_chat(user, "You can only refund at your base, it's too late now!") + return + for(var/datum/technomancer/equipment/E in equipment_instances + assistance_instances) + if(AM.type == E.obj_path) // We got a match. + if(budget + E.cost > max_budget) + to_chat(user, "\The [src] will not allow you to overflow your maximum budget by refunding that.") + return + else + budget = budget + E.cost + to_chat(user, "You've refunded \the [AM].") + + // We sadly need to do special stuff here or else people who refund cores with spells will lose points permanently. + if(istype(AM, /obj/item/technomancer_core)) + var/obj/item/technomancer_core/core = AM + for(var/obj/spellbutton/spell in core.spells) + for(var/datum/technomancer/spell/spell_datum in spell_instances) + if(spell_datum.obj_path == spell.spellpath) + budget += spell_datum.cost + to_chat(user, "[spell.name] was inside \the [core], and was refunded.") + core.remove_spell(spell) + break + qdel(AM) + return + to_chat(user, "\The [src] is unable to refund \the [AM].") + diff --git a/code/game/gamemodes/technomancer/clothing.dm b/code/game/gamemodes/technomancer/clothing.dm new file mode 100644 index 00000000000..c806c2febd5 --- /dev/null +++ b/code/game/gamemodes/technomancer/clothing.dm @@ -0,0 +1,117 @@ +/obj/item/clothing/suit/technomancer + name = "chrome manipulation suit" + desc = "It's a very shiny and somewhat protective suit, built to help carry cores on the user's back." + icon_state = "technomancer_uni" + item_state = "technomancer_uni" + icon = 'icons/obj/clothing/technomancer.dmi' + contained_sprite = TRUE + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS|FEET|HANDS + allowed = list(/obj/item/tank) + armor = list( + melee = ARMOR_MELEE_MAJOR, + bullet = ARMOR_BALLISTIC_SMALL, + laser = ARMOR_LASER_PISTOL, + energy = ARMOR_ENERGY_RESISTANT, + bomb = ARMOR_BOMB_MINOR, + rad = ARMOR_RAD_RESISTANT + ) + siemens_coefficient = 0.75 + +/obj/item/clothing/under/technomancer + name = "initiate's jumpsuit" + desc = "It's a blue colored jumpsuit. There appears to be light-weight armor padding underneath, providing some protection. \ + There is also a healthy amount of insulation underneath." + icon_state = "initiate_uni" + item_state = "initiate_uni" + icon = 'icons/obj/clothing/technomancer.dmi' + contained_sprite = TRUE + armor = list( + melee = ARMOR_MELEE_MINOR, + ) + siemens_coefficient = 0.3 + +/obj/item/clothing/under/technomancer/apprentice + name = "apprentice's jumpsuit" + desc = "It's a blue colored jumpsuit with some silver markings. There appears to be light-weight armor padding \ + underneath, providing some protection. There is also a healthy amount of insulation underneath." + icon_state = "apprentice_uni" + item_state = "apprentice_uni" + icon = 'icons/obj/clothing/technomancer.dmi' + contained_sprite = TRUE + +/obj/item/clothing/under/technomancer/master + name = "master's jumpsuit" + desc = "It's a blue colored jumpsuit with some gold markings. There appears to be light-weight armor padding \ + underneath, providing some protection. There is also a healthy amount of insulation underneath." + icon_state = "technomancer_uni" + item_state = "technomancer_uni" + icon = 'icons/obj/clothing/technomancer.dmi' + contained_sprite = TRUE + +/obj/item/clothing/head/technomancer + name = "initiate's hat" + desc = "It's a somewhat silly looking blue pointed hat." + icon_state = "initiate_hat" + item_state = "initiate_hat" + armor = list( + melee = ARMOR_MELEE_MINOR, + ) + siemens_coefficient = 0.3 + icon = 'icons/obj/clothing/technomancer.dmi' + contained_sprite = TRUE + +/obj/item/clothing/head/technomancer/apprentice + name = "apprentice's hat" + desc = "It's a somewhat silly looking blue pointed hat. This one has a silver colored metalic feather strapped to it." + icon_state = "apprentice_hat" + item_state = "apprentice_hat" + icon = 'icons/obj/clothing/technomancer.dmi' + contained_sprite = TRUE + +/obj/item/clothing/head/technomancer/master + name = "master's hat" + desc = "It's a somewhat silly looking blue pointed hat. This one has a gold colored metalic feather strapped to it." + icon_state = "technomancer_hat" + item_state = "technomancer_hat" + icon = 'icons/obj/clothing/technomancer.dmi' + contained_sprite = TRUE + +/obj/item/clothing/under/chameleon/technomancer + armor = list( + melee = ARMOR_MELEE_MAJOR, + bullet = ARMOR_BALLISTIC_SMALL, + laser = ARMOR_LASER_PISTOL, + energy = ARMOR_ENERGY_RESISTANT, + bomb = ARMOR_BOMB_MINOR, + rad = ARMOR_RAD_RESISTANT + ) + +/obj/item/clothing/head/chameleon/technomancer + armor = list( + melee = ARMOR_MELEE_MAJOR, + bullet = ARMOR_BALLISTIC_SMALL, + laser = ARMOR_LASER_PISTOL, + energy = ARMOR_ENERGY_RESISTANT, + bomb = ARMOR_BOMB_MINOR, + rad = ARMOR_RAD_RESISTANT + ) + +/obj/item/clothing/shoes/chameleon/technomancer + armor = list( + melee = ARMOR_MELEE_MAJOR, + bullet = ARMOR_BALLISTIC_SMALL, + laser = ARMOR_LASER_PISTOL, + energy = ARMOR_ENERGY_RESISTANT, + bomb = ARMOR_BOMB_MINOR, + rad = ARMOR_RAD_RESISTANT + ) + +/obj/item/clothing/suit/chameleon/technomancer + armor = list( + melee = ARMOR_MELEE_MAJOR, + bullet = ARMOR_BALLISTIC_SMALL, + laser = ARMOR_LASER_PISTOL, + energy = ARMOR_ENERGY_RESISTANT, + bomb = ARMOR_BOMB_MINOR, + rad = ARMOR_RAD_RESISTANT + ) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm new file mode 100644 index 00000000000..be6f66fe1e2 --- /dev/null +++ b/code/game/gamemodes/technomancer/core_obj.dm @@ -0,0 +1,352 @@ +//The base core object, worn on the wizard's back. +/obj/item/technomancer_core + name = "manipulation core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats." + icon = 'icons/obj/clothing/technomancer.dmi' + contained_sprite = TRUE + icon_state = "technomancer_core" + item_state = "technomancer_core" + w_class = ITEMSIZE_HUGE + slot_flags = SLOT_BACK + unacidable = TRUE + origin_tech = list(TECH_MATERIAL = 8, TECH_ENGINEERING = 8, TECH_POWER = 8, TECH_BLUESPACE = 10,TECH_COMBAT = 7, TECH_MAGNET = 9, TECH_DATA = 5) + var/energy = 10000 + var/max_energy = 10000 + var/regen_rate = 50 // 200 seconds to full + var/energy_delta = 0 // How much we're gaining (or perhaps losing) every process(). + var/mob/living/wearer // Reference to the mob wearing the core. + var/instability_modifier = 0.8 // Multiplier on how much instability is added. + var/energy_cost_modifier = 1.0 // Multiplier on how much spells will cost. + var/spell_power_modifier = 1.0 // Multiplier on how strong spells are. + var/cooldown_modifier = 1.0 // Multiplier on cooldowns for spells. + var/list/spells = list() // This contains the buttons used to make spells in the user's hand. + var/list/appearances = list( // Assoc list containing possible icon_states that the wiz can change the core to. + "default" = "technomancer_core", + ) + + // Some spell-specific variables go here, since spells themselves are temporary. Cores are more long term and more accessable than + // mind datums. It may also allow creative players to try to pull off a 'soul jar' scenario. + var/list/summoned_mobs = list() // Maintained horribly with maintain_summon_list(). + var/list/wards_in_use = list() // Wards don't count against the cap for other summons. + var/max_summons = 10 // Maximum allowed summoned entities. Some cores will have different caps. + +/obj/item/technomancer_core/Initialize() + . = ..() + START_PROCESSING(SSprocessing, src) + +/obj/item/technomancer_core/Destroy() + dismiss_all_summons() + STOP_PROCESSING(SSprocessing, src) + return ..() + +// Add the spell buttons to the HUD. +/obj/item/technomancer_core/equipped(mob/user) + wearer = user + for(var/obj/spellbutton/spell in spells) + wearer.ability_master.add_technomancer_ability(spell, spell.ability_icon_state) + ..() + +// Removes the spell buttons from the HUD. +/obj/item/technomancer_core/dropped(mob/user) + if(!wearer) + return + for(var/obj/screen/ability/obj_based/technomancer/A in wearer.ability_master.ability_objects) + wearer.ability_master.remove_ability(A) + wearer = null + ..() + +// 'pay_energy' is too vague of a name for a proc at the mob level. +/mob/proc/technomancer_pay_energy(amount) + return FALSE + +/mob/living/carbon/human/technomancer_pay_energy(amount) + if(istype(back, /obj/item/technomancer_core)) + var/obj/item/technomancer_core/TC = back + return TC.pay_energy(amount) + return FALSE + +/obj/item/technomancer_core/proc/pay_energy(amount) + amount = round(amount * energy_cost_modifier, 0.1) + if(amount <= energy) + energy = max(energy - amount, 0) + return TRUE + return FALSE + +/obj/item/technomancer_core/proc/give_energy(amount) + energy = min(energy + amount, max_energy) + return TRUE + +/obj/item/technomancer_core/process() + var/old_energy = energy + regenerate() + pay_dues() + energy_delta = energy - old_energy + if(world.time % 5 == 0) // Maintaining fat lists is expensive, I imagine. + maintain_summon_list() + if(wearer && wearer.mind) + if(!technomancers.is_technomancer(wearer.mind)) // In case someone tries to wear a stolen core. + wearer.adjust_instability(20) + if(!wearer || wearer.stat == DEAD) // Unlock if we're dead or not worn. + canremove = TRUE + +/obj/item/technomancer_core/proc/regenerate() + energy = min(max(energy + regen_rate, 0), max_energy) + if(wearer && ishuman(wearer)) + var/mob/living/carbon/human/H = wearer + H.wiz_energy_update_hud() + +// We pay for on-going effects here. +/obj/item/technomancer_core/proc/pay_dues() + if(summoned_mobs.len) + pay_energy(round(summoned_mobs.len * 5)) + +// Because sometimes our summoned mobs will stop existing and leave a null entry in the list, we need to do cleanup every +// so often so .len remains reliable. +/obj/item/technomancer_core/proc/maintain_summon_list() + if(!summoned_mobs.len) // No point doing work if there's no work to do. + return + for(var/A in summoned_mobs) + // First, a null check. + if(isnull(A)) + summoned_mobs -= A + continue + // Now check for dead mobs who shouldn't be on the list. + if(istype(A, /mob/living)) + var/mob/living/L = A + if(L.stat == DEAD) + summoned_mobs -= L + addtimer(CALLBACK(src, .proc/remove_summon, L), 1) + +/obj/item/technomancer_core/proc/remove_summon(var/mob/living/L) + L.visible_message("\The [L] begins to fade away...") + animate(L, alpha = 255, alpha = 0, time = 30) // Makes them fade into nothingness. + sleep(30) + qdel(L) + +// Deletes all the summons and wards from the core, so that Destroy() won't have issues. +/obj/item/technomancer_core/proc/dismiss_all_summons() + for(var/mob/living/L in summoned_mobs) + summoned_mobs -= L + qdel(L) + for(var/mob/living/ward in wards_in_use) + wards_in_use -= ward + qdel(ward) + +// This is what is clicked on to place a spell in the user's hands. +/obj/spellbutton + name = "generic spellbutton" + var/spellpath + var/obj/item/technomancer_core/core + var/ability_icon_state + +/obj/spellbutton/New(loc, var/path, var/new_name, var/new_icon_state) + if(!path || !ispath(path)) + message_admins("ERROR: /obj/spellbutton/New() was not given a proper path!") + qdel(src) + src.name = new_name + src.spellpath = path + src.loc = loc + src.core = loc + src.ability_icon_state = new_icon_state + +/obj/spellbutton/Click() + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.place_spell_in_hand(spellpath) + +/obj/spellbutton/DblClick() + return Click() + +/mob/living/carbon/human/Stat() + . = ..() + + if(. && istype(back,/obj/item/technomancer_core)) + var/obj/item/technomancer_core/core = back + setup_technomancer_stat(core) + +/mob/living/carbon/human/proc/setup_technomancer_stat(var/obj/item/technomancer_core/core) + if(core && statpanel("Spell Core")) + var/charge_status = "[core.energy]/[core.max_energy] ([round( (core.energy / core.max_energy) * 100)]%) \ + ([round(core.energy_delta)]/s)" + var/instability_delta = instability - last_instability + var/instability_status = "[src.instability] ([round(instability_delta, 0.1)]/s)" + stat("Core charge", charge_status) + stat("User instability", instability_status) + for(var/obj/spellbutton/button in core.spells) + stat(button) + +/obj/item/technomancer_core/proc/add_spell(var/path, var/new_name, var/ability_icon_state) + if(!path || !ispath(path)) + message_admins("ERROR: /obj/item/technomancer_core/add_spell() was not given a proper path! \ + The path supplied was [path].") + return + var/obj/spellbutton/spell = new(src, path, new_name, ability_icon_state) + spells.Add(spell) + if(wearer) + wearer.ability_master.add_technomancer_ability(spell, ability_icon_state) + +/obj/item/technomancer_core/proc/remove_spell(var/obj/spellbutton/spell_to_remove) + if(spell_to_remove in spells) + spells.Remove(spell_to_remove) + if(wearer) + var/obj/screen/ability/obj_based/technomancer/A = wearer.ability_master.get_ability_by_instance(spell_to_remove) + if(A) + wearer.ability_master.remove_ability(A) + qdel(spell_to_remove) + +/obj/item/technomancer_core/proc/remove_all_spells() + for(var/obj/spellbutton/spell in spells) + spells.Remove(spell) + qdel(spell) + +/obj/item/technomancer_core/proc/has_spell(var/datum/technomancer/spell_to_check) + for(var/obj/spellbutton/spell in spells) + if(spell.spellpath == spell_to_check.obj_path) + return TRUE + return FALSE + +/mob/living/carbon/human/proc/wiz_energy_update_hud() + if(client && hud_used) + if(istype(back, /obj/item/technomancer_core)) //I reckon there's a better way of doing this. + var/obj/item/technomancer_core/core = back + energy_display.invisibility = 0 + instability_display.invisibility = 0 + var/ratio = core.energy / core.max_energy + ratio = max(round(ratio, 0.05) * 100, 5) + energy_display.icon_state = "wiz_energy[ratio]" + else + energy_display.invisibility = 101 + instability_display.invisibility = 101 + +//Resonance Aperture + +//Variants which the wizard can buy. + +//High risk, high reward core. +/obj/item/technomancer_core/unstable + name = "unstable core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This one is rather unstable, \ + and could prove dangerous to the user, as it feeds off unstable energies that can occur with overuse of this machine." + energy = 13000 + max_energy = 13000 + regen_rate = 35 //~371 seconds to full, 118 seconds to full at 50 instability (rate of 110) + instability_modifier = 1.2 + energy_cost_modifier = 0.7 + spell_power_modifier = 1.1 + +/obj/item/technomancer_core/unstable/regenerate() + var/instability_bonus = 0 + if(loc && ishuman(loc)) + var/mob/living/carbon/human/H = loc + instability_bonus = H.instability * 1.5 + energy = min(energy + regen_rate + instability_bonus, max_energy) + if(loc && ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.wiz_energy_update_hud() + +//Lower capacity but safer core. +/obj/item/technomancer_core/rapid + name = "rapid core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This one has a superior \ + recharge rate, at the price of storage capacity. It also includes integrated motion assistance, increasing agility somewhat." + energy = 7000 + max_energy = 7000 + regen_rate = 70 //100 seconds to full + slowdown = -1 + instability_modifier = 0.9 + cooldown_modifier = 0.9 + +//Big batteries but slow regen, buying energy spells is highly recommended. +/obj/item/technomancer_core/bulky + name = "bulky core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This variant is more \ + cumbersome and bulky, due to the additional energy capacitors installed, which allows for a massive energy storage, as well \ + as stronger function usage. It also comes at a price of a subpar fractal \ + reactor." + energy = 20000 + max_energy = 20000 + regen_rate = 25 //800 seconds to full + slowdown = 1 + instability_modifier = 1.0 + spell_power_modifier = 1.4 + +// Using this can result in abilities costing less energy. If you're lucky. +/obj/item/technomancer_core/recycling + name = "recycling core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type tries to recover \ + some of the energy lost from using functions due to inefficiency." + energy = 12000 + max_energy = 12000 + regen_rate = 40 //300 seconds to full + instability_modifier = 0.6 + energy_cost_modifier = 0.8 + +/obj/item/technomancer_core/recycling/pay_energy(amount) + var/success = ..() + if(success) + if(prob(30)) + give_energy(round(amount / 2)) + if(amount >= 50) // Managing to recover less than half of this isn't worth telling the user about. + to_chat(wearer, "\The [src] has recovered [amount/2 >= 1000 ? "a lot of" : "some"] energy.") + return success + +// For those dedicated to summoning hoards of things. +/obj/item/technomancer_core/summoner + name = "summoner core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type is optimized for \ + plucking hapless creatures and machines from other locations, to do your bidding. The maximum amount of entities that you can \ + bring over at once is higher with this core, up to 40 entities, and the maintenance cost is significantly lower." + energy = 8000 + max_energy = 8000 + regen_rate = 35 //228 seconds to full + max_summons = 40 + instability_modifier = 1.2 + spell_power_modifier = 1.2 + +/obj/item/technomancer_core/summoner/pay_dues() + if(summoned_mobs.len) + pay_energy( round(summoned_mobs.len) ) + +// For those who hate instability. +/obj/item/technomancer_core/safety + name = "safety core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type is designed to be \ + the closest thing you can get to 'safe' for a Core. Instability from this is significantly reduced. You can even dance if \ + you want to, and leave your apprentice behind." + energy = 7000 + max_energy = 7000 + regen_rate = 30 //233 seconds to full + instability_modifier = 0.3 + spell_power_modifier = 0.7 + +// For those who want to blow everything on a few spells. +/obj/item/technomancer_core/overcharged + name = "overcharged core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type will use as much \ + energy as it can in order to pump up the strength of functions used to insane levels." + energy = 15000 + max_energy = 15000 + regen_rate = 40 //375 seconds to full + instability_modifier = 1.1 + spell_power_modifier = 1.75 + energy_cost_modifier = 2.0 + +// For use only for the GOLEM. +/obj/item/technomancer_core/golem + name = "integrated core" + desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type is not meant \ + to be worn on the back like other cores. Instead it is meant to be installed inside a synthetic shell. As a result, it's \ + a lot more robust." + energy = 25000 + max_energy = 25000 + regen_rate = 100 //250 seconds to full + instability_modifier = 0.75 + + +/obj/item/technomancer_core/verb/toggle_lock() + set name = "Toggle Core Lock" + set category = "Object" + set desc = "Toggles the locking mechanism on your manipulation core." + + canremove = !canremove + to_chat(usr, "You [canremove ? "de" : ""]activate the locking mechanism on \the [src].") \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/devices/boots_of_speed.dm b/code/game/gamemodes/technomancer/devices/boots_of_speed.dm new file mode 100644 index 00000000000..e1017d2f5bb --- /dev/null +++ b/code/game/gamemodes/technomancer/devices/boots_of_speed.dm @@ -0,0 +1,19 @@ +/datum/technomancer/equipment/boots_of_speed + name = "Boots of Speed" + desc = "What appears to be an ordinary pair of boots, is actually a bit more useful than that. These will help against slipping \ + on flat surfaces, and will make you run a bit faster than if you had normal shoes or boots on." + cost = 50 + obj_path = /obj/item/clothing/shoes/boots/speed + +/obj/item/clothing/shoes/boots/speed + name = "boots of speed" + desc = "The latest in sure footing technology." + icon_state = "swat" + item_flags = NOSLIP + siemens_coefficient = 0.6 + slowdown = -1 + + cold_protection = FEET + min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE + heat_protection = FEET + max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm new file mode 100644 index 00000000000..daac4ef97ca --- /dev/null +++ b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm @@ -0,0 +1,76 @@ +/datum/technomancer/consumable/disposable_teleporter + name = "Disposable Teleporter" + desc = "An ultra-safe teleportation device that can directly teleport you to a number of locations at minimal risk, however \ + it has a limited amount of charges." + cost = 50 + obj_path = /obj/item/disposable_teleporter + +/obj/item/disposable_teleporter + name = "disposable teleporter" + desc = "A very compact personal teleportation device. It's very precise and safe, however it can only be used a few times." + icon = 'icons/obj/device.dmi' + icon_state = "hand_tele" + var/uses = 3.0 + w_class = ITEMSIZE_TINY + item_state = "paper" + origin_tech = list(TECH_BLUESPACE = 4, TECH_POWER = 3) + +//This one is what the wizard starts with. The above is a better version that can be purchased. +/obj/item/disposable_teleporter/free + name = "complimentary disposable teleporter" + desc = "A very compact personal teleportation device. It's very precise and safe, however it can only be used once. This \ + one has been provided to allow you to leave your hideout." + uses = 1 + +/obj/item/disposable_teleporter/examine(mob/user) + ..() + to_chat(user, "[uses] uses remaining.") + +/obj/item/disposable_teleporter/attack_self(mob/user as mob) + if(!uses) + to_chat(user, "\The [src] has ran out of uses, and is now useless to you!") + return + else + var/area_wanted = input(user, "Area to teleport to", "Teleportation") in teleportlocs + var/area/A = teleportlocs[area_wanted] + if(!A) + return + + if (user.stat || user.restrained()) + return + + if(!((user == loc || (in_range(src, user) && istype(src.loc, /turf))))) + return + + spark(src, 5, 0) + + if(user && user.buckled_to) + user.buckled_to.unbuckle() + + var/list/targets = list() + + //Copypasta + valid_turfs: + for(var/turf/simulated/T in A.contents) + if(T.density || istype(T, /turf/simulated/mineral)) //Don't blink to vacuum or a wall + continue + for(var/atom/movable/stuff in T.contents) + if(stuff.density) + continue valid_turfs + targets.Add(T) + + if(!targets.len) + to_chat(user, "\The [src] was unable to locate a suitable teleport destination, as all the possibilities \ + were nonexistant or hazardous. Try a different area.") + return + var/turf/simulated/destination = null + + destination = pick(targets) + + if(destination) + user.forceMove(destination) + to_chat(user, "You are teleported to \the [A].") + uses-- + if(uses <= 0) + to_chat(user, "\The [src] has ran out of uses, and disintegrates from your hands.") + qdel(src) diff --git a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm new file mode 100644 index 00000000000..b158ce1bea3 --- /dev/null +++ b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm @@ -0,0 +1,66 @@ +/datum/technomancer/equipment/gloves_of_regen + name = "Gloves of Regeneration" + desc = "It's a pair of black gloves, with a hypodermic needle on the insides, and a small storage of a secret blend of chemicals \ + designed to be slowly fed into a living person's system, increasing their metabolism greatly, resulting in accelerated healing. \ + A side effect of this healing is that the wearer will generally get hungry a lot faster. Sliding the gloves on and off also \ + hurts a lot. As a bonus, the gloves are more resistant to the elements than most. It should be noted that synthetics will have \ + little use for these." + cost = 50 + obj_path = /obj/item/clothing/gloves/regen + +/obj/item/clothing/gloves/regen + name = "gloves of regeneration" + desc = "A pair of gloves with a small storage of green liquid on the outside. On the inside, a a hypodermic needle can be seen \ + on each glove." + icon_state = "regen" + item_state = "graygloves" + siemens_coefficient = 0 + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE + +/obj/item/clothing/gloves/regen/equipped(var/mob/living/carbon/human/H) + if(H && H.gloves == src) + wearer = H + if(wearer.can_feel_pain()) + to_chat(H, "You feel a stabbing sensation in your hands as you slide \the [src] on!") + wearer.custom_pain("You feel a sharp pain in your hands!",1) + ..() + +/obj/item/clothing/gloves/regen/dropped(var/mob/living/carbon/human/H) + ..() + if(wearer) + if(wearer.can_feel_pain()) + to_chat(wearer, "You feel the hypodermic needles as you slide \the [src] off!") + wearer.custom_pain("Your hands hurt like hell!",1) + wearer = null + +/obj/item/clothing/gloves/regen/New() + START_PROCESSING(SSprocessing, src) + ..() + +/obj/item/clothing/gloves/regen/Destroy() + wearer = null + STOP_PROCESSING(SSprocessing, src) + return ..() + +/obj/item/clothing/gloves/regen/process() + if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition <= 10) + return // Robots and dead people don't have a metabolism. + + if(wearer.getBruteLoss()) + wearer.adjustBruteLoss(-0.1) + wearer.nutrition = max(wearer.nutrition - 10, 0) + if(wearer.getFireLoss()) + wearer.adjustFireLoss(-0.1) + wearer.nutrition = max(wearer.nutrition - 10, 0) + if(wearer.getToxLoss()) + wearer.adjustToxLoss(-0.1) + wearer.nutrition = max(wearer.nutrition - 10, 0) + if(wearer.getOxyLoss()) + wearer.adjustOxyLoss(-0.1) + wearer.nutrition = max(wearer.nutrition - 10, 0) + if(wearer.getCloneLoss()) + wearer.adjustCloneLoss(-0.1) + wearer.nutrition = max(wearer.nutrition - 20, 0) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/devices/hypos.dm b/code/game/gamemodes/technomancer/devices/hypos.dm new file mode 100644 index 00000000000..4618be07b23 --- /dev/null +++ b/code/game/gamemodes/technomancer/devices/hypos.dm @@ -0,0 +1,42 @@ +/datum/technomancer/consumable/hypo_brute + name = "Trauma Hypo" + desc = "A extended capacity hypo which can treat blunt trauma." + cost = 25 + obj_path = /obj/item/reagent_containers/hypospray/autoinjector/trauma + +/datum/technomancer/consumable/hypo_burn + name = "Burn Hypo-Injector" + desc = "A extended capacity hypo which can treat severe burns." + cost = 25 + obj_path = /obj/item/reagent_containers/hypospray/autoinjector/burn + +/datum/technomancer/consumable/hypo_oxy + name = "Oxy Hypo-Injector" + desc = "A extended capacity hypo which can treat oxygen deprivation." + cost = 25 + obj_path = /obj/item/reagent_containers/hypospray/autoinjector/oxygen + +/datum/technomancer/consumable/hypo_purity + name = "Purity Hypo-Injector" + desc = "A extended capacity hypo which can remove various inpurities in the system such as infections, \ + radiation, and genetic problems." + cost = 25 + obj_path = /obj/item/reagent_containers/hypospray/autoinjector/purity + +/datum/technomancer/consumable/hypo_pain + name = "Pain Hypo-Injector" + desc = "A extended capacity hypo which contains potent painkillers." + cost = 25 + obj_path = /obj/item/reagent_containers/hypospray/autoinjector/pain + +/datum/technomancer/consumable/hypo_organ + name = "Organ Hypo-Injector" + desc = "A extended capacity hypo which is designed to fix internal organ problems." + cost = 50 + obj_path = /obj/item/reagent_containers/hypospray/autoinjector/organ + +/datum/technomancer/consumable/hypo_combat + name = "Combat Hypospray" + desc = "A extended capacity hypo containing a dangerous cocktail of various combat stims." + cost = 75 + obj_path = /obj/item/reagent_containers/hypospray/combat diff --git a/code/game/gamemodes/technomancer/devices/implants.dm b/code/game/gamemodes/technomancer/devices/implants.dm new file mode 100644 index 00000000000..fd30fdd7780 --- /dev/null +++ b/code/game/gamemodes/technomancer/devices/implants.dm @@ -0,0 +1,11 @@ +/datum/technomancer/consumable/freedom_implant + name = "Freedom Implant" + desc = "A hidden implant which allows one to escape bindings such as handcuffs." + cost = 50 + obj_path = /obj/item/storage/box/syndie_kit/imp_freedom + +/datum/technomancer/consumable/explosive_implant + name = "Explosive Implant" + desc = "A hidden implant which will explode if it hears a passphrase." + cost = 150 + obj_path = /obj/item/storage/box/syndie_kit/imp_explosive \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm new file mode 100644 index 00000000000..6316e6779b4 --- /dev/null +++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm @@ -0,0 +1,85 @@ +/datum/technomancer/equipment/shield_armor + name = "Personal Shield Projector" + desc = "This state-of-the-art technology uses the bleeding edge of energy distribution and field projection \ + to provide a personal shield around you, which can diffuse laser beams and reduce the velocity of bullets and close quarters \ + weapons, reducing their potential for harm severely. All of this comes at a cost of of requiring a large amount of energy, \ + of which your Core can provide. When you are struck by something, the shield will block 75% of the damage, deducting energy \ + proportional to the amount of force that was inflicted. Armor penetration has no effect on the shield's ability to protect \ + you from harm, however the shield will fail if the energy supply cannot meet demand." + cost = 200 + obj_path = /obj/item/clothing/suit/armor/shield + +/obj/item/clothing/suit/armor/shield + name = "shield projector" + desc = "This armor has no inherent ability to absorb shock, as normal armor usually does. Instead, this emits a strong field \ + around the wearer, designed to protect from most forms of harm, from lasers to bullets to close quarters combat. It appears to \ + require a very potent supply of an energy of some kind in order to function." + icon_state = "shield_armor_0" + blood_overlay_type = "armor" + slowdown = 0 + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + action_button_name = "Toggle Shield Projector" + var/active = 0 + var/damage_to_energy_multiplier = 50.0 //Determines how much energy to charge for blocking, e.g. 20 damage attack = 750 energy cost + var/block_percentage = 75 + +/obj/item/clothing/suit/armor/shield/New() + ..() + spark(src, 5, cardinal) + +/obj/item/clothing/suit/armor/shield/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + //Since this is a pierce of armor that is passive, we do not need to check if the user is incapacitated. + if(!active) + return FALSE + + var/modified_block_percentage = block_percentage + + if(issmall(user)) // Smaller shield means better protection. + modified_block_percentage += 15 + + + var/damage_blocked = damage * (modified_block_percentage / 100) + + var/damage_to_energy_cost = (damage_to_energy_multiplier * damage_blocked) + + if(!user.technomancer_pay_energy(damage_to_energy_cost)) + to_chat(user, "Your shield fades due to lack of energy!") + active = 0 + update_icon() + return 0 + + damage = damage - damage_blocked + + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + P.sharp = 0 + P.edge = 0 + P.embed_chance = 0 + if(P.agony) + var/agony_blocked = P.agony * (modified_block_percentage / 100) + P.agony -= agony_blocked + P.damage = P.damage - damage_blocked + + user.visible_message("\The [user]'s [src] absorbs [attack_text]!") + to_chat(user, "Your shield has absorbed most of \the [damage_source].") + + spark(src, 5, cardinal) + playsound(src, 'sound/weapons/blade.ogg', 50, 1) + return FALSE // This shield does not block all damage, so returning 0 is needed to tell the game to apply the new damage. + +/obj/item/clothing/suit/armor/shield/attack_self(mob/user) + active = !active + to_chat(user, "You [active ? "" : "de"]activate \the [src].") + update_icon() + user.update_inv_wear_suit() + user.update_action_buttons() + +/obj/item/clothing/suit/armor/shield/update_icon() + icon_state = "shield_armor_[active]" + item_state = "shield_armor_[active]" + if(active) + set_light(2, 1, l_color = "#006AFF") + else + set_light(0, 0, l_color = "#000000") + ..() + return \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm new file mode 100644 index 00000000000..95fda406d08 --- /dev/null +++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm @@ -0,0 +1,86 @@ +/datum/technomancer/equipment/tesla_armor + name = "Tesla Armor" + desc = "This piece of armor offers a retaliation-based defense. When the armor is 'ready', it will completely protect you from \ + the next attack you suffer, and strike the attacker with a strong bolt of lightning, provided they are close enough. This effect requires \ + fifteen seconds to recharge. If you are attacked while this is recharging, a weaker lightning bolt is sent out, however you won't be protected from \ + the person beating you." + cost = 150 + obj_path = /obj/item/clothing/suit/armor/tesla + +/obj/item/clothing/suit/armor/tesla + name = "tesla armor" + desc = "This rather dangerous looking armor will hopefully shock your enemies, and not you in the process." + icon_state = "tesla_armor_1" + blood_overlay_type = "armor" + slowdown = 1 + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + action_button_name = "Toggle Tesla Armor" + var/active = 1 //Determines if the armor will zap or block + var/ready = 1 //Determines if the next attack will be blocked, as well if a strong lightning bolt is sent out at the attacker. + var/ready_icon_state = "tesla_armor_1" //also wip + var/normal_icon_state = "tesla_armor_0" + var/cooldown_to_charge = 15 SECONDS + +/obj/item/clothing/suit/armor/tesla/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + //First, some retaliation. + if(active) + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + if(P.firer && get_dist(user, P.firer) <= 3) + if(ready) + shoot_lightning(P.firer, 40) + else + shoot_lightning(P.firer, 15) + + else + if(attacker && attacker != user) + if(get_dist(user, attacker) <= 3) //Anyone farther away than three tiles is too far to shoot lightning at. + if(ready) + shoot_lightning(attacker, 40) + else + shoot_lightning(attacker, 15) + + //Deal with protecting our wearer now. + if(ready) + ready = FALSE + addtimer(CALLBACK(src, .proc/recharge, user), cooldown_to_charge) + visible_message("\The [user]'s [src.name] blocks [attack_text]!") + update_icon() + return PROJECTILE_STOPPED + return FALSE + +/obj/item/clothing/suit/armor/tesla/proc/recharge(var/mob/user) + ready = TRUE + update_icon() + to_chat(user, "\The [src] is ready to protect you once more.") + +/obj/item/clothing/suit/armor/tesla/attack_self(mob/user) + active = !active + to_chat(user, "You [active ? "" : "de"]activate \the [src].") + update_icon() + user.update_inv_wear_suit() + user.update_action_buttons() + +/obj/item/clothing/suit/armor/tesla/update_icon() + if(active && ready) + icon_state = ready_icon_state + item_state = ready_icon_state + set_light(2, 1, l_color = "#006AFF") + else + icon_state = normal_icon_state + item_state = normal_icon_state + set_light(0, 0, l_color = "#000000") + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_wear_suit(0) + H.update_action_buttons() + ..() + +/obj/item/clothing/suit/armor/tesla/proc/shoot_lightning(mob/target, power) + var/obj/item/projectile/beam/lightning/lightning = new(get_turf(src)) + lightning.power = power + lightning.old_style_target(target) + lightning.fire() + visible_message("\The [src] strikes \the [target] with lightning!") + playsound(src, 'sound/weapons/gaussrifle1.ogg', 75, 1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm new file mode 100644 index 00000000000..e7d0ec12336 --- /dev/null +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -0,0 +1,219 @@ +/datum/technomancer/equipment/default_core + name = "Manipulation Core" +// desc = "The default core that you most likely already have. This is here in-case you change your mind after buying +// another core, don't forget to refund the old core. This has a capacity of 10,000 units of energy, and recharges at a +// rate of 50 units. It also reduces incoming instability from functions by 20%." + desc = "The default core that you most likely already have. This is here in-case you change your mind after buying \ + another core, don't forget to refund the old core.
\ + Capacity: 10k
\ + Recharge: 50/s
\ + Instability Modifier: 80%
\ + Energy Cost Modifier: 100%
\ + Spell Power: 100%" + cost = 100 + obj_path = /obj/item/technomancer_core + +/datum/technomancer/equipment/rapid_core + name = "Rapid Core" + desc = "A core optimized for passive regeneration, however at the cost of capacity. Has a capacity of 7,000 units of energy, and \ + recharges at a rate of 70 units. Complex gravatics and force manipulation allows the wearer to also run slightly faster.
\ + Capacity: 7k
\ + Recharge: 70/s
\ + Instability Modifier: 90%
\ + Energy Cost Modifier: 100%
\ + Spell Power: 100%" + cost = 100 + obj_path = /obj/item/technomancer_core/rapid + +/datum/technomancer/equipment/bulky_core + name = "Bulky Core" + desc = "This core has very large capacitors, however it also has a subpar fractal reactor. The user is recommended to \ + purchase one or more energy-generating Functions as well if using this core. The intense weight of the core unfortunately can \ + cause the wear to move slightly slower, and the closeness of the capacitors causes a slight increase in incoming instability.
\ + Capacity: 20k
\ + Recharge: 25/s
\ + Instability Modifier: 100%
\ + Energy Cost Modifier: 100%
\ + Spell Power: 140%" + cost = 100 + obj_path = /obj/item/technomancer_core/bulky + +/datum/technomancer/equipment/unstable + name = "Unstable Core" + desc = "This core feeds off unstable energies around the user in addition to a fractal reactor. This means that it performs \ + better as the user has more instability, which could prove dangerous to the inexperienced or unprepared. The rate of recharging \ + increases as the user accumulates more instability, eventually exceeding even the rapid core in regen speed, at a huge risk.
\ + Capacity: 13k
\ + Recharge: 35/s to 110/s+
\ + Instability Modifier: 130%
\ + Energy Cost Modifier: 70%
\ + Spell Power: 110%" + cost = 100 + obj_path = /obj/item/technomancer_core/unstable + +/datum/technomancer/equipment/recycling + name = "Recycling Core" + desc = "This core is optimized for energy efficency, being able to sometimes recover energy that would have been lost with other \ + cores. Each time energy is spent, there is a 30% chance of recovering half of what was spent.
\ + Capacity: 12k
\ + Recharge: 40/s
\ + Instability Modifier: 60%
\ + Energy Cost Modifier: 80%
\ + Spell Power: 100%" + cost = 100 + obj_path = /obj/item/technomancer_core/recycling + +/datum/technomancer/equipment/summoning + name = "Summoning Core" + desc = "A unique type of core, this one sacrifices other characteristics in order to optimize it for the purposes teleporting \ + entities from vast distances, and keeping them there. Wearers of this core can maintain up to 40 summons at once, and the energy \ + demand for maintaining summons is severely reduced.
\ + Capacity: 8k
\ + Recharge: 35/s
\ + Instability Modifier: 120%
\ + Energy Cost Modifier: 100%
\ + Spell Power: 120%" + cost = 100 + obj_path = /obj/item/technomancer_core/summoner + +/datum/technomancer/equipment/safety + name = "Safety Core" + desc = "This core is designed so that the wearer suffers almost no instability. It unfortunately comes at a cost of subpar \ + ratings for everything else.
\ + Capacity: 7k
\ + Recharge: 30/s
\ + Instability Modifier: 30%
\ + Energy Cost Modifier: 100%
\ + Spell Power: 70%" + cost = 100 + obj_path = /obj/item/technomancer_core/safety + +/datum/technomancer/equipment/overcharged + name = "Overcharged Core" + desc = "A core that was created in order to get the most power out of functions. It does this by shoving the most power into \ + those functions, so it is the opposite of energy efficent, however the enhancement of functions is second to none for other \ + cores.
\ + Capacity: 15k (effectively 7.5k)
\ + Recharge: 40/s
\ + Instability Modifier: 110%
\ + Energy Cost Modifier: 200%
\ + Spell Power: 175%" + cost = 100 + obj_path = /obj/item/technomancer_core/overcharged + +/datum/technomancer/equipment/hypo_belt + name = "Hypo Belt" + desc = "A medical belt designed to carry autoinjectors and other medical equipment. Comes with one of each hypo." + cost = 50 + obj_path = /obj/item/storage/belt/medical/technomancer + +/obj/item/storage/belt/medical/technomancer + name = "hypo belt" + desc = "A medical belt designed to carry autoinjectors and other medical equipment." + +/obj/item/storage/belt/medical/technomancer/New() + new /obj/item/reagent_containers/hypospray/autoinjector/trauma(src) + new /obj/item/reagent_containers/hypospray/autoinjector/burn(src) + new /obj/item/reagent_containers/hypospray/autoinjector/oxygen(src) + new /obj/item/reagent_containers/hypospray/autoinjector/purity(src) + new /obj/item/reagent_containers/hypospray/autoinjector/pain(src) + new /obj/item/reagent_containers/hypospray/autoinjector/organ(src) + new /obj/item/reagent_containers/hypospray/combat(src) + ..() + +/datum/technomancer/equipment/belt_of_holding + name = "Belt of Holding" + desc = "A belt with a literal pocket which opens to a localized pocket of 'Blue-Space', allowing for more storage. \ + The nature of the pocket allows for storage of larger objects than what is typical for other belts, and in larger quanities. \ + It will also help keep your pants on." + cost = 50 + obj_path = /obj/item/storage/belt/holding + +/obj/item/storage/belt/holding + name = "Belt of Holding" + desc = "Can hold more than you'd expect." + icon_state = "emsbelt" + max_w_class = ITEMSIZE_NORMAL // Can hold normal sized items. + storage_slots = 14 // Twice the capacity of a typical belt. + max_storage_space = 16 + +/datum/technomancer/equipment/thermals + name = "Thermoncle" + desc = "A fancy monocle with a thermal optics lens installed. Allows you to see people across walls." + cost = 150 + obj_path = /obj/item/clothing/glasses/thermal/plain/monocle + +/datum/technomancer/equipment/night_vision + name = "Night Vision Goggles" + desc = "Strategical goggles which will allow the wearer to see in the dark. Perfect for the sneaky type, just get rid of the \ + lights first." + cost = 50 + obj_path = /obj/item/clothing/glasses/night + +/datum/technomancer/equipment/omni_sight + name = "Omnisight Scanner" + desc = "A very rare scanner worn on the face, which allows the wearer to see nearly anything across walls." + cost = 300 + obj_path = /obj/item/clothing/glasses/omni + +/obj/item/clothing/glasses/omni + name = "Omnisight Scanner" + desc = "A pair of goggles which, while on the surface appear to be build very poorly, reveal to be very advanced in \ + capabilities. The lens appear to be multiple optical matrices layered together, allowing the wearer to see almost anything \ + across physical barriers." + icon_state = "omnisight" + action_button_name = "Toggle Goggles" + origin_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6) + toggleable = 1 + vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS + prescription = 1 // So two versions of these aren't needed. + +/datum/technomancer/equipment/med_hud + name = "Medical HUD" + desc = "A commonly available HUD for medical professionals, which displays how healthy an individual is. \ + Recommended for support-based apprentices!" + cost = 25 + obj_path = /obj/item/clothing/glasses/thermal/plain/monocle + +/datum/technomancer/equipment/scepter + name = "Scepter of Empowerment" + desc = "A gem sometimes found in the depths of asteroids makes up the basis for this device. Energy is channeled into it from \ + the Core and the user, causing many functions to be enhanced in various ways, so long as it is held in the off-hand. \ + Be careful not to lose this!" + cost = 200 + obj_path = /obj/item/scepter + +/obj/item/scepter + name = "scepter of empowerment" + desc = "It's a purple gem, attached to a rod and a handle, along with small wires. It looks like it would make a good club." + icon = 'icons/obj/technomancer.dmi' + icon_state = "scepter" + force = 15 + slot_flags = SLOT_BELT + attack_verb = list("beaten", "smashed", "struck", "whacked") + +/obj/item/scepter/attack_self(mob/living/carbon/human/user) + var/obj/item/item_to_test = user.get_other_hand(src) + if(istype(item_to_test, /obj/item/spell)) + var/obj/item/spell/S = item_to_test + S.on_scepter_use_cast(user) + +/obj/item/scepter/afterattack(atom/target, mob/living/carbon/human/user, proximity_flag, click_parameters) + if(proximity_flag) + return ..() + var/obj/item/item_to_test = user.get_other_hand(src) + if(istype(item_to_test, /obj/item/spell)) + var/obj/item/spell/S = item_to_test + S.on_scepter_ranged_cast(target, user) + +/datum/technomancer/equipment/spyglass + name = "Spyglass" + desc = "A mundane spyglass, it may prove useful to those who wish to scout ahead, or fight from an extreme range." + cost = 100 + obj_path = /obj/item/device/binoculars/spyglass + +/obj/item/device/binoculars/spyglass + name = "spyglass" + desc = "It's a hand-held telescope, useful for star-gazing, peeping, and recon." + icon_state = "spyglass" + slot_flags = SLOT_BELT diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm new file mode 100644 index 00000000000..caf48d062fa --- /dev/null +++ b/code/game/gamemodes/technomancer/instability.dm @@ -0,0 +1,276 @@ +#define TECHNOMANCER_INSTABILITY_DECAY 0.97 // Multipler for how much instability is lost per Life() tick. +// Numbers closer to 1.0 make instability decay slower. Instability will never decay if it's at 1.0. +// When set to 0.98, it has a half life of roughly 35 Life() ticks, or 1.1 minutes. +// For 0.97, it has a half life of about 23 ticks, or 46 seconds. +// For 0.96, it is 17 ticks, or 34 seconds. +// 0.95 is 14 ticks. +#define TECHNOMANCER_INSTABILITY_MIN_DECAY 0.1 // Minimum removed every Life() tick, always. +#define TECHNOMANCER_INSTABILITY_PRECISION 0.1 // Instability is rounded to this. +#define TECHNOMANCER_INSTABILITY_MIN_GLOW 10 // When above this number, the entity starts glowing, affecting others. + + +/mob/living + var/instability = 0 + var/last_instability = 0 // Used to calculate instability delta. + var/last_instability_event = null // most recent world.time that something bad happened due to instability. + +// Proc: adjust_instability() +// Parameters: 0 +// Description: Does nothing, because inheritence. +/mob/living/proc/adjust_instability(var/amount) + instability = between(0, round(instability + amount, TECHNOMANCER_INSTABILITY_PRECISION), 200) + +// Proc: adjust_instability() +// Parameters: 1 (amount - how much instability to give) +// Description: Adds or subtracks instability to the mob, then updates the hud. +/mob/living/carbon/human/adjust_instability(var/amount) + ..() + instability_update_hud() + +// Proc: instability_update_hud() +// Parameters: 0 +// Description: Sets the HUD icon to the correct state. +/mob/living/carbon/human/proc/instability_update_hud() + if(client && hud_used) + switch(instability) + if(0 to 10) + instability_display.icon_state = "instability-1" + if(10 to 30) + instability_display.icon_state = "instability0" + if(30 to 50) + instability_display.icon_state = "instability1" + if(50 to 100) + instability_display.icon_state = "instability2" + if(100 to 200) + instability_display.icon_state = "instability3" + +// Proc: Life() +// Parameters: 0 +// Description: Makes instability tick along with Life(). +/mob/living/Life() + . = ..() + handle_instability() + +// Proc: handle_instability() +// Parameters: 0 +// Description: Makes instability decay. instability_effects() handles the bad effects for having instability. It will also hold back +// from causing bad effects more than one every ten seconds, to prevent sudden death from angry RNG. +/mob/living/proc/handle_instability() + instability = between(0, round(instability, TECHNOMANCER_INSTABILITY_PRECISION), 200) + last_instability = instability + + //This should cushon against really bad luck. + if(instability && last_instability_event < (world.time - 5 SECONDS) && prob(50)) + instability_effects() + + var/instability_decayed = abs( round(instability * TECHNOMANCER_INSTABILITY_DECAY, TECHNOMANCER_INSTABILITY_PRECISION) - instability ) + instability_decayed = max(instability_decayed, TECHNOMANCER_INSTABILITY_MIN_DECAY) + + adjust_instability(-instability_decayed) + radiate_instability(instability_decayed) + +/mob/living/carbon/human/handle_instability() + ..() + instability_update_hud() + +/* +[16:18:08] Sparks +[16:18:10] Wormholes +[16:18:16] Random spells firing off on their own +[16:18:22] The possibilities are endless +[16:19:00] Random objects phasing into reality, only to disappear again +[16:19:05] Things briefly duplicating +[16:20:56] Glass cracking, eventually breaking +*/ +// Proc: instability_effects() +// Parameters: 0 +// Description: Does a variety of bad effects to the entity holding onto the instability, with more severe effects occuring if they have +// a lot of instability. +/mob/living/proc/instability_effects() + last_instability_event = world.time + spawn(1) + var/image/instability_flash = image('icons/obj/spells.dmi',"instability") + overlays |= instability_flash + sleep(4) + overlays.Remove(instability_flash) + qdel(instability_flash) + +/mob/living/silicon/instability_effects() + if(instability) + var/rng = 0 + ..() + switch(instability) + if(1 to 10) //Harmless + return + if(11 to 30) //Minor + rng = rand(0,1) + switch(rng) + if(0) + spark(src, 5, 0) + visible_message("Electrical sparks manifest from nowhere around \the [src]!") + if(1) + return + + if(31 to 50) //Moderate + rng = rand(0,4) + switch(rng) + if(0) + electrocute_act(instability * 0.3, "unstable energies", 0.75) + if(1) + adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability + to_chat(src, "Your chassis alerts you to overheating from an unknown external force!") + if(2) + adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability + to_chat(src, "Your chassis makes the sound of metal groaning!") + if(3) + safe_blink(src, range = 6) + to_chat(src, "You're teleported against your will!") + if(4) + emp_act(3) + + if(51 to 100) //Severe + rng = rand(0,3) + switch(rng) + if(0) + electrocute_act(instability * 0.5, "extremely unstable energies", 0.75) + if(1) + emp_act(2) + if(2) + adjustFireLoss(instability * 0.3) //30 burn @ 100 instability + to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!") + if(3) + adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability + to_chat(src, "Your chassis makes the sound of metal groaning and tearing!") + + if(101 to 200) //Lethal + rng = rand(0,4) + switch(rng) + if(0) + electrocute_act(instability, "extremely unstable energies", 0.75) + if(1) + emp_act(1) + if(2) + adjustFireLoss(instability * 0.4) //40 burn @ 100 instability + to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!") + if(3) + adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability + to_chat(src, "Your chassis makes the sound of metal groaning and tearing!") + +/mob/living/carbon/human/instability_effects() + if(instability) + var/rng = 0 + ..() + switch(instability) + if(1 to 10) //Harmless + return + if(10 to 30) //Minor + rng = rand(0,1) + switch(rng) + if(0) + spark(src, 5, 0) + visible_message("Electrical sparks manifest from nowhere around \the [src]!") + if(1) + return + + if(30 to 50) //Moderate + rng = rand(0,8) + switch(rng) + if(0) + apply_damage(instability * 0.3, PAIN) + if(1) + return + if(2) + if(can_feel_pain()) + apply_damage(instability * 0.3, PAIN) + to_chat(src, "You feel a sharp pain!") + if(3) + apply_effect(instability * 0.3, EYE_BLUR) + to_chat(src, "Your eyes start to get cloudy!") + if(4) + electrocute_act(instability * 0.3, "unstable energies") + if(5) + adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability + to_chat(src, "You feel your skin burn!") + if(6) + adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability + to_chat(src, "You feel a sharp pain as an unseen force harms your body!") + if(7) + adjustToxLoss(instability * 0.15) //7.5 tox @ 50 instability + if(8) + safe_blink(src, range = 6) + to_chat(src, "You're teleported against your will!") + + if(50 to 100) //Severe + rng = rand(0,8) + switch(rng) + if(0) + apply_damage(instability * 0.2, IRRADIATE) + if(1) + return + if(2) + if(can_feel_pain()) + apply_damage(instability * 0.7, PAIN) + to_chat(src, "You feel an extremely angonizing pain from all over your body!") + if(3) + apply_effect(instability * 0.5, EYE_BLUR) + to_chat(src, "Your eyes start to get cloudy!") + if(4) + electrocute_act(instability * 0.5, "extremely unstable energies") + if(5) + fire_act() + to_chat(src, "You spontaneously combust!") + if(6) + adjustCloneLoss(instability * 0.05) //5 cloneloss @ 100 instability + to_chat(src, "You feel your body slowly degenerate.") + + if(100 to 200) //Lethal + rng = rand(0,7) + switch(rng) + if(0) + apply_effect(instability, IRRADIATE) + if(1) + visible_message("\The [src] suddenly collapses!", + "You suddenly feel very light-headed, and faint!") + Paralyse(instability * 0.1) + if(2) + if(can_feel_pain()) + apply_damage(instability, PAIN) + to_chat(src, "You feel an extremely angonizing pain from all over your body!") + if(3) + apply_effect(instability, EYE_BLUR) + to_chat(src, "Your eyes start to get cloudy!") + if(4) + electrocute_act(instability, "extremely unstable energies") + if(5) + fire_act() + to_chat(src, "You spontaneously combust!") + if(6) + adjustCloneLoss(instability * 0.10) //5 cloneloss @ 100 instability + to_chat(src, "You feel your body slowly degenerate.") + +/mob/living/proc/radiate_instability(amount) + var/distance = round(sqrt(instability / 2)) + if(instability < TECHNOMANCER_INSTABILITY_MIN_GLOW) + distance = 0 + if(distance) + for(var/mob/living/L in range(src, distance) ) + if(L == src) // This instability is radiating away from them, so don't include them. + continue + var/radius = max(get_dist(L, src), 1) + // People next to the source take all of the radiated amount. Further distance decreases the amount absorbed. + var/outgoing_instability = (amount) * ( 1 / (radius**2) ) + + L.receive_radiated_instability(outgoing_instability) + +// This should only be used for EXTERNAL sources of instability, such as from someone or something glowing. +/mob/living/proc/receive_radiated_instability(amount) + // Energy armor like from the AMI RIG can protect from this. + var/armor_ratio = get_blocked_ratio(BP_CHEST, BURN, damage = 40) //todomatt: look over this again + amount = amount * armor_ratio + if(amount && prob(10)) + if(isSynthetic()) + to_chat(src, "Warning: Anomalous field detected.") + else + to_chat(src, "The purple glow makes you feel strange...") + adjust_instability(amount) + diff --git a/code/game/gamemodes/technomancer/presets.dm b/code/game/gamemodes/technomancer/presets.dm new file mode 100644 index 00000000000..6222f39a12b --- /dev/null +++ b/code/game/gamemodes/technomancer/presets.dm @@ -0,0 +1,54 @@ +/datum/technomancer/presets + name = "Preset Template" + desc = "If you see me, I'm broken." + obj_path = null + var/list/bundled = list() + +/datum/technomancer/presets/basic + name = "Basic" + desc = "This preset is created to be simple to understand and use, yet sufficent to face a wide range of hazards that may lay \ + ahead. It includes Force Missile, Beam, Passwall, Repel Missiles, Pulsar, and Discharge. Force Missile and Beam will be your \ + bread and butter, as both can be used frequently and cheaply. Passwall allows you to teleport to an adjacent room. Repel Missiles should \ + be applied before going into a fight, and Pulsar is an excellent 'area denial' function, that forces the opposing force to decide \ + if being struck with EMP is worth staying still. Discharge can be used if the opposing force is using energy weapons heavily, or \ + if you are fighting synthetics." + cost = 600 + +/datum/technomancer/presets/summoner + name = "Summoner" + desc = "This preset is dedicated to amassing a large army of entities to do your bidding. It includes the Summoner Core, to allow \ + for more efficency, as well as Summon Creature and Summon Automatron, for obvious reasons. The functions Aspect Aura and \ + Mend Wounds are also included, to allow for an area of effect heal that is ideal for keeping your (nonrobotic) army alive. \ + Finally, this includes the Scepter of Enpowerment, to make your summoned entities friendly to you and your allies, without the \ + need for the Control function. The Control function can be obtained if one wishes to micromanage their summon army, however." + cost = 600 + +/datum/technomancer/presets/illusionist + name = "Illusionist" + desc = "This preset is designed to facilitate the screwing of the opposing forces' minds, as all of the functions included \ + lend themselves to trickery. Illusion, Audible Deception, Chroma, and Darkness will allow you to make the crew question \ + reality itself. Passwall will let you slip into adjacent rooms, while the TODO lets you see everything without walls getting \ + in the way, so that you may manipulate without being seen in the same room. It may be wise to invest in at least one function \ + that can do harm, in case they wise up." + cost = 400 + +/datum/technomancer/presets/healer + name = "Healer" + desc = "This preset is recommended for apprentices who wish to support their master. It contains many healing and support \ + functions, such as Mend Wounds, Mend Burns, Purify, Oxygenate, Aspect Aura, Shared Burden, Link, Resurrect, and Great Mend Wounds. \ + Be aware that a lot of these functions create a lot of instability, so prepare for that if you can." + cost = 600 + +/datum/technomancer/presets/support + name = "Support" + desc = "This preset is recommended for apprentices who wish to support their master. It contains many functions focused on \ + augmenting you and your master's survival and capabilities, with functions such as Repel Missiles, Shared Burden, Link, Summon \ + Ward, Dispel, Corona, and Steal Food." + cost = 600 + +/datum/technomancer/presets/rainbow + name = "Rainbow Mage" + desc = "This preset includes many Aspect functions, such as Aspect Aura, Aspect Bolt, Aspect Cloud, Aspect Weapon, etc, as well as \ + cheap functions beloning to each aspect, for the purposes of combining with an aspect function. This allows you to be \ + very flexable, however functions made from aspect functions tend to be weaker due to this. Not recommended for beginners." + cost = 600 \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm new file mode 100644 index 00000000000..26f3fa82d8e --- /dev/null +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -0,0 +1,329 @@ +//cast_method flags +#define CAST_USE 1 // Clicking the spell in your hand. +#define CAST_MELEE 2 // Clicking an atom in melee range. +#define CAST_RANGED 4 // Clicking an atom beyond melee range. +#define CAST_THROW 8 // Throwing the spell and hitting an atom. +#define CAST_COMBINE 16 // Clicking another spell with this spell. +#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands. + +//Aspects +#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this. +#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this. +#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this. +#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this. +#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location. +#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people. +#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff. +#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows. +#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration. +#define ASPECT_EMP "emp" //Unused now. +#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim. +#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells. +#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings. + +/obj/item/spell + name = "glowing particles" + desc = "Your hands appear to be glowing brightly." + icon = 'icons/obj/spells.dmi' + icon_state = "generic" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_spells.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_spells.dmi', + ) + throwforce = 0 + force = 0 +// var/mob/living/carbon/human/owner = null + var/mob/living/owner = null + var/obj/item/technomancer_core/core = null + var/cast_methods = null // Controls how the spell is casted. + var/aspect = null // Used for combining spells. + var/toggled = 0 // Mainly used for overlays. + var/cooldown = 0 // If set, will add a cooldown overlay and adjust click delay. Must be a multiple of 5 for overlays. + var/cast_sound = null // Sound file played when this is used. + +/obj/item/spell/examine(mob/user, distance) // Nothing on examine. + return + +// Proc: on_use_cast() +// Parameters: 1 (user - the technomancer casting the spell) +// Description: Override this for clicking the spell in your hands. +/obj/item/spell/proc/on_use_cast(mob/user) + return + +// Proc: on_throw_cast() +// Parameters: 1 (hit_atom - the atom hit by the spell object) +// Description: Override this for throwing effects. +/obj/item/spell/proc/on_throw_cast(atom/hit_atom) + return + +// Proc: on_ranged_cast() +// Parameters: 2 (hit_atom - the atom clicked on by the user, user - the technomancer that clicked hit_atom) +// Description: Override this for ranged effects. +/obj/item/spell/proc/on_ranged_cast(atom/hit_atom, mob/user) + return + +// Proc: on_melee_cast() +// Parameters: 3 (hit_atom - the atom clicked on by the user, user - the technomancer that clicked hit_atom, def_zone - unknown) +// Description: Override this for effects that occur at melee range. +/obj/item/spell/proc/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + return + +// Proc: on_combine_cast() +// Parameters: 2 (I - the item trying to merge with the spell, user - the technomancer who initiated the merge) +// Description: Override this for combining spells, like Aspect spells. +/obj/item/spell/proc/on_combine_cast(obj/item/I, mob/user) + return + +// Proc: on_innate_cast() +// Parameters: 1 (user - the entity who is casting innately (without using hands).) +// Description: Override this for casting without using hands (and as a result not using spell objects). +/obj/item/spell/proc/on_innate_cast(mob/user) + return + +// Proc: on_scepter_use_cast() +// Parameters: 1 (user - the holder of the Scepter that clicked.) +// Description: Override this for spell casts which have additional functionality when a Scepter is held in the offhand, and the +// scepter is being clicked by the technomancer in their hand. +/obj/item/spell/proc/on_scepter_use_cast(mob/user) + return + +// Proc: on_scepter_use_cast() +// Parameters: 2 (hit_atom - the atom clicked by user, user - the holder of the Scepter that clicked.) +// Description: Similar to the above proc, however this is for when someone with a Scepter clicks something far away with the scepter +// while holding a spell in the offhand that reacts to that. +/obj/item/spell/proc/on_scepter_ranged_cast(atom/hit_atom, mob/user) + return + +// Proc: pay_energy() +// Parameters: 1 (amount - how much to test and drain if there is enough) +// Description: Use this to make spells cost energy. It returns false if the technomancer cannot pay for the spell for any reason, and +// if they are able to pay, it is deducted automatically. +/obj/item/spell/proc/pay_energy(var/amount) + if(!core) + return 0 + return core.pay_energy(amount) + +// Proc: give_energy() +// Parameters: 1 (amount - how much to give to the technomancer) +// Description: Redirects the call to the core's give_energy(). +/obj/item/spell/proc/give_energy(var/amount) + if(!core) + return 0 + return core.give_energy(amount) + +// Proc: adjust_instability() +// Parameters: 1 (amount - how much instability to give) +// Description: Use this to quickly add or subtract instability from the caster of the spell. Owner is set by New(). +/obj/item/spell/proc/adjust_instability(var/amount) + if(!owner || !core) + return 0 + amount = round(amount * core.instability_modifier, 0.1) + owner.adjust_instability(amount) + +// Proc: get_technomancer_core() +// Parameters: 0 +// Description: Returns the technomancer's core, assuming it is being worn properly. +/mob/living/proc/get_technomancer_core() + return null + +/mob/living/carbon/human/get_technomancer_core() + var/obj/item/technomancer_core/core = back + if(istype(core)) + return core + return null + +// Proc: New() +// Parameters: 0 +// Description: Sets owner to equal its loc, links to the owner's core, then applies overlays if needed. +/obj/item/spell/Initialize() + . = ..() + if(isliving(loc)) + owner = loc + if(owner) + core = owner.get_technomancer_core() + if(!core) + to_chat(owner, "You need a Core to do that.") + qdel(src) + return + update_icon() + +// Proc: Destroy() +// Parameters: 0 +// Description: Nulls object references so it can qdel() cleanly. +/obj/item/spell/Destroy() + owner.unref_spell(src) + owner = null + core = null + return ..() + +// Proc: unref_spells() +// Parameters: 0 +// Description: Nulls object references on specific mobs so it can qdel() cleanly. +/mob/proc/unref_spell(var/obj/item/spell/the_spell) + return + +// Proc: update_icon() +// Parameters: 0 +// Description: Applys an overlay if it is a passive spell. +/obj/item/spell/update_icon() + if(toggled) + var/image/new_overlay = image('icons/obj/spells.dmi',"toggled") + overlays |= new_overlay + else + overlays.Cut() + ..() + +// Proc: run_checks() +// Parameters: 0 +// Description: Ensures spells should not function if something is wrong. If a core is missing, it will try to find one, then fail +// if it still can't find one. It will also check if the core is being worn properly, and finally checks if the owner is a technomancer. +/obj/item/spell/proc/run_checks() + if(!owner) + return 0 + if(!core) + core = locate(/obj/item/technomancer_core) in owner + if(!core) + to_chat(owner, "You need to be wearing a core on your back!") + return 0 + if(core.loc != owner || owner.back != core) //Make sure the core's being worn. + to_chat(owner, "You need to be wearing a core on your back!") + return 0 + if(!technomancers.is_technomancer(owner.mind)) //Now make sure the person using this is the actual antag. + to_chat(owner, "You can't seem to figure out how to make the machine work properly.") + return 0 + return 1 + +// Proc: check_for_scepter() +// Parameters: 0 +// Description: Terrible code to check if a scepter is in the offhand, returns 1 if yes. +/obj/item/spell/proc/check_for_scepter() + if(!src || !owner) return 0 + if(owner.r_hand == src) + if(istype(owner.l_hand, /obj/item/scepter)) + return 1 + else + if(istype(owner.r_hand, /obj/item/scepter)) + return 1 + return 0 + +// Proc: get_other_hand() +// Parameters: 1 (I - item being compared to determine what the offhand is) +// Description: Helper for Aspect spells. +/mob/living/carbon/human/proc/get_other_hand(var/obj/item/I) + if(r_hand == I) + return l_hand + else + return r_hand + +// Proc: attack_self() +// Parameters: 1 (user - the Technomancer that invoked this proc) +// Description: Tries to call on_use_cast() if it is allowed to do so. Don't override this, override on_use_cast() instead. +/obj/item/spell/attack_self(mob/user) + if(run_checks() && (cast_methods & CAST_USE)) + on_use_cast(user) + ..() + +// Proc: attackby() +// Parameters: 2 (W - the item this spell object is hitting, user - the technomancer who clicked the other object) +// Description: Tries to combine the spells, if W is a spell, and has CHROMATIC aspect. +/obj/item/spell/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/spell)) + var/obj/item/spell/spell = W + if(run_checks() & (cast_methods & CAST_COMBINE)) + spell.on_combine_cast(src, user) + else + ..() + +// Proc: afterattack() +// Parameters: 4 (target - the atom clicked on by user, user - the technomancer who clicked with the spell, proximity - argument +// telling the proc if target is adjacent to user, click_parameters - information on where exactly the click occured on the screen.) +// Description: Tests to make sure it can cast, then casts a combined, ranged, or melee spell based on what it can do and the +// range the click occured. Melee casts have higher priority than ranged if both are possible. Sets cooldown at the end. +// Don't override this for spells, override the on_*_cast() spells shown above. +/obj/item/spell/afterattack(atom/target, mob/user, proximity, click_parameters) + if(!run_checks()) + return + if(!proximity) + if(cast_methods & CAST_RANGED) + on_ranged_cast(target, user) + else + if(istype(target, /obj/item/spell)) + var/obj/item/spell/spell = target + if(spell.cast_methods & CAST_COMBINE) + spell.on_combine_cast(src, user) + return + else if(cast_methods & CAST_MELEE) + on_melee_cast(target, user) + if(cast_methods & CAST_RANGED) //Try to use a ranged method if a melee one doesn't exist. + on_ranged_cast(target, user) + if(cooldown) + var/effective_cooldown = round(cooldown * core.cooldown_modifier, 5) + user.setClickCooldown(effective_cooldown) + flick("cooldown_[effective_cooldown]",src) + +/obj/item/spell/apply_hit_effect(mob/living/target, mob/living/user, hit_zone) + . = ..() + if(cast_methods & CAST_MELEE) + on_melee_cast(target, user) //afterattack is not called if the target isn't the user and this proc isn't called if the target is the user + +// Proc: place_spell_in_hand() +// Parameters: 1 (path - the type path for the spell that is desired.) +// Description: Returns immediately, this is here to override for other mobs as needed. +/mob/living/proc/place_spell_in_hand(var/path) + return + +// Proc: place_spell_in_hand() +// Parameters: 1 (path - the type path for the spell that is desired.) +// Description: Gives the spell to the human mob, if it is allowed to have spells, hands are not full, etc. Otherwise it deletes itself. +/mob/living/carbon/human/place_spell_in_hand(var/path) + if(!path || !ispath(path)) + return 0 + + //var/obj/item/spell/S = new path(src) + var/obj/item/spell/S = new path(src) + + //No hands needed for innate casts. + if(S.cast_methods & CAST_INNATE) + if(S.run_checks()) + S.on_innate_cast(src) + + if(l_hand && r_hand) //Make sure our hands aren't full. + if(istype(r_hand, /obj/item/spell)) //If they are full, perhaps we can still be useful. + var/obj/item/spell/r_spell = r_hand + if(r_spell.aspect == ASPECT_CHROMATIC) //Check if we can combine the new spell with one in our hands. + r_spell.on_combine_cast(S, src) + else if(istype(l_hand, /obj/item/spell)) + var/obj/item/spell/l_spell = l_hand + if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too. + l_spell.on_combine_cast(S, src) + else //Welp + to_chat(src, "You require a free hand to use this function.") + return 0 + + if(S.run_checks()) + put_in_hands(S) + return 1 + else + qdel(S) + return 0 + +// Proc: dropped() +// Parameters: 0 +// Description: Deletes the spell object immediately. +/obj/item/spell/dropped() + spawn(1) + if(src) + qdel(src) + +// Proc: throw_impact() +// Parameters: 1 (hit_atom - the atom that got hit by the spell as it was thrown) +// Description: Calls on_throw_cast() on whatever was hit, then deletes itself incase it missed. +/obj/item/spell/throw_impact(atom/hit_atom) + ..() + if(cast_methods & CAST_THROW) + on_throw_cast(hit_atom) + + // If we miss or hit an obstacle, we still want to delete the spell. + spawn(20) + if(src) + qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spell_objs_helpers.dm b/code/game/gamemodes/technomancer/spell_objs_helpers.dm new file mode 100644 index 00000000000..f34e8fb8cf4 --- /dev/null +++ b/code/game/gamemodes/technomancer/spell_objs_helpers.dm @@ -0,0 +1,57 @@ +//Returns 1 if the turf is dense, or if there's dense objects/mobs on it, unless told to ignore them. +/turf/proc/check_density(var/ignore_objs = FALSE, var/ignore_mobs = FALSE) + if(density) + return TRUE + if(!ignore_objs || !ignore_mobs) + for(var/atom/movable/stuff in contents) + if(stuff.density) + if(ignore_objs && isobj(stuff)) + continue + else if(ignore_mobs && isliving(stuff)) // Ghosts aren't dense but keeping this limited to living type will probably save headaches in the future. + continue + else + return TRUE + return FALSE + +// Used to distinguish friend from foe. +/obj/item/spell/proc/is_ally(var/mob/living/L) + if(L == owner) // The best ally is ourselves. + return 1 + if(L.mind && technomancers.is_technomancer(L.mind)) // This should be done better since we might want opposing technomancers later. + return 1 + if(istype(L, /mob/living/simple_animal/hostile)) // Mind controlled simple mobs count as allies too. + var/mob/living/simple_animal/hostile/SM = L + if(owner in SM.friends) + return 1 + return 0 + +/obj/item/spell/proc/allowed_to_teleport() + if(owner) + if(owner.z in current_map.admin_levels) + return FALSE + return TRUE + +/obj/item/spell/proc/within_range(var/atom/target, var/max_range = 7) // Beyond 7 is off the screen. + if(target in view(max_range, owner)) + return TRUE + return FALSE + +/obj/item/spell/proc/calculate_spell_power(var/amount) + if(core) + return round(amount * core.spell_power_modifier, 1) + +// Returns a 'target' mob from a radius around T. +/obj/item/spell/proc/targeting_assist(var/turf/T, radius = 5) + var/chosen_target = null + var/potential_targets = view(T,radius) + for(var/mob/living/L in potential_targets) + if(is_ally(L)) // Don't shoot our friends. + continue + if(L.invisibility > owner.see_invisible) // Don't target ourselves or people we can't see. + continue + if(!(L in viewers(owner))) // So we don't shoot at walls if someone is hiding behind one. + continue + if(!L.stat) // Don't want to target dead people or SSDs. + chosen_target = L + break + return chosen_target \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/abjuration.dm b/code/game/gamemodes/technomancer/spells/abjuration.dm new file mode 100644 index 00000000000..d5f6f315dd6 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/abjuration.dm @@ -0,0 +1,41 @@ +/datum/technomancer/spell/abjuration + name = "Abjuration" + desc = "This ability attempts to send summoned or teleported entities or anomalies to the place from whence they came, or at least \ + far away from the caster. Failing that, it may inhibit those entities in some form." + cost = 25 + ability_icon_state = "wiz_jaunt" + obj_path = /obj/item/spell/abjuration + category = UTILITY_SPELLS + +/obj/item/spell/abjuration + name = "abjuration" + desc = "Useful for unruly minions, hostile summoners, or for fighting the horrors that may await you with your hubris." + icon_state = "generic" + cast_methods = CAST_RANGED + aspect = ASPECT_TELE + +/obj/item/spell/abjuration/on_ranged_cast(atom/hit_atom, mob/user) + if(istype(hit_atom, /mob/living) && pay_energy(500) && within_range(hit_atom)) + var/mob/living/L = hit_atom + var/mob/living/simple_animal/SM = null + + //Bit of a roundabout typecheck, in order to test for two variables from two different mob types in one line. + if(istype(L, /mob/living/simple_animal)) + SM = L + if(L.summoned || (SM && SM.supernatural)) + if(L.client) // Player-controlled mobs are immune to being killed by this. + to_chat(user, "\The [L] resists your attempt to banish it!") + to_chat(L, "\The [user] tried to teleport you far away, but failed.") + return 0 + else + visible_message("\The [L] vanishes!") + qdel(L) + else if(istype(L, /mob/living/simple_animal/construct)) + var/mob/living/simple_animal/construct/evil = L + to_chat(evil, "\The [user]'s abjuration purges your form!") + evil.purge = 3 + adjust_instability(5) + // In case NarNar comes back someday. + if(istype(hit_atom, /obj/singularity/narsie)) + to_chat(user, "One does not simply abjurate Nar'sie away.") + adjust_instability(200) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/apportation.dm b/code/game/gamemodes/technomancer/spells/apportation.dm new file mode 100644 index 00000000000..c15f29fd46f --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/apportation.dm @@ -0,0 +1,74 @@ +/datum/technomancer/spell/apportation + name = "Apportation" + desc = "This allows you to teleport objects into your hand, or to pull people towards you. If they're close enough, the function \ + will grab them automatically." + enhancement_desc = "Range is unlimited." + cost = 25 + ability_icon_state = "wiz_subj" + obj_path = /obj/item/spell/apportation + category = UTILITY_SPELLS + +/obj/item/spell/apportation + name = "apportation" + icon_state = "apportation" + desc = "Allows you to reach through Bluespace with your hand, and grab something, bringing it to you instantly." + cast_methods = CAST_RANGED + aspect = ASPECT_TELE + +/obj/item/spell/apportation/on_ranged_cast(atom/hit_atom, mob/user) + if(istype(hit_atom, /atom/movable)) + var/atom/movable/AM = hit_atom + + if(!AM.loc) //Don't teleport HUD telements to us. + return + if(AM.anchored) + to_chat(user, "\The [hit_atom] is firmly secured and anchored, you can't move it!") + return + + if(!within_range(hit_atom) && !check_for_scepter()) + to_chat(user, "\The [hit_atom] is too far away.") + return + + //Teleporting an item. + if(isitem(hit_atom)) + var/obj/item/I = hit_atom + + spark(I, 5, cardinal) + spark(user, 5, cardinal) + I.visible_message("\The [I] vanishes into thin air!") + I.forceMove(get_turf(user)) + user.drop_item(src) + src.loc = null + user.put_in_hands(I) + user.visible_message("\A [I] appears in \the [user]'s hand!") + log_and_message_admins("has stolen [I] with [src].") + qdel(src) + //Now let's try to teleport a living mob. + else if(isliving(hit_atom)) + var/mob/living/L = hit_atom + to_chat(L, "You are teleported towards \the [user]!") + spark(L, 5, cardinal) + spark(user, 5, cardinal) + L.throw_at(get_step(get_turf(src), get_dir(src, L)), 4, 1, src) + addtimer(CALLBACK(src, .proc/seize_mob, L, user), 1 SECOND) + user.drop_item(src) + src.loc = null + +/obj/item/spell/apportation/proc/seize_mob(var/mob/living/L, var/mob/user) + if(!user.Adjacent(L)) + to_chat(user, "\The [L] is out of your reach.") + qdel(src) + return + + L.Weaken(3) + user.visible_message("\The [user] seizes [L]!") + + var/obj/item/grab/G = new(user, L) + + user.put_in_hands(G) + + G.state = GRAB_PASSIVE + G.icon_state = "grabbed1" + G.synch() + qdel(src) + diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm new file mode 100644 index 00000000000..b3704bef6dd --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm @@ -0,0 +1,95 @@ +/datum/technomancer/spell/audible_deception + name = "Audible Deception" + desc = "Allows you to create a specific sound at a location of your choosing." + enhancement_desc = "An extremely loud bike horn sound that costs large amount of energy and instability becomes available, \ + which will deafen and stun all who are near the targeted tile, including yourself if unprotected." + cost = 50 + ability_icon_state = "boo" + obj_path = /obj/item/spell/audible_deception + ability_icon_state = "tech_audibledeception" + category = UTILITY_SPELLS + +/obj/item/spell/audible_deception + name = "audible deception" + icon_state = "audible_deception" + desc = "Make them all paranoid!" + cast_methods = CAST_RANGED | CAST_USE + aspect = ASPECT_AIR + cooldown = 10 + var/list/available_sounds = list( + "Blade Slice" = 'sound/weapons/bladeslice.ogg', + "Energy Blade Slice" = 'sound/weapons/blade.ogg', + "Explosions" = "explosion", + "Distant Explosion" = 'sound/effects/explosionfar.ogg', + "Sparks" = "sparks", + "Punches" = "punch", + "Glass Shattering" = "shatter", + "Grille Damage" = 'sound/effects/grillehit.ogg', + "Energy Pulse" = 'sound/effects/EMPulse.ogg', + "Airlock" = 'sound/machines/airlock.ogg', + "Airlock Creak" = 'sound/machines/airlock_open_force.ogg', + + "Shotgun Pumping" = 'sound/weapons/shotgun_pump.ogg', + "Flash" = 'sound/weapons/flash.ogg', + "Bite" = 'sound/weapons/bite.ogg', + "Low-Caliber Gun Firing"= 'sound/weapons/gunshot/gunshot_light.ogg', + "Mateba Firing" = 'sound/weapons/gunshot/gunshot_mateba.ogg', + "Rifle Firing" = 'sound/weapons/gunshot/gunshot_rifle.ogg', + "Sniper Rifle Firing" = 'sound/weapons/gunshot/gunshot_svd.ogg', + "Antitank Rifle Firing" = 'sound/weapons/gunshot/gunshot_dmr.ogg', + "Shotgun Firing" = 'sound/weapons/gunshot/gunshot_shotgun.ogg', + "Pistol Firing" = 'sound/weapons/gunshot/gunshot_pistol.ogg', + "Machinegun Firing" = 'sound/weapons/gunshot/gunshot_saw.ogg', + "Rocket Launcher Firing"= 'sound/weapons/rocketlaunch.ogg', + "Taser Firing" = 'sound/weapons/Taser.ogg', + "Laser Rifle Firing" = 'sound/weapons/laser1.ogg', + "Xray Gun Firing" = 'sound/weapons/laser3.ogg', + "Pulse Gun Firing" = 'sound/weapons/pulse.ogg', + "Energy Sniper Firing" = 'sound/weapons/laserstrong.ogg', + "Emitter Firing" = 'sound/weapons/emitter.ogg', + "Energy Blade On" = 'sound/weapons/saberon.ogg', + "Energy Blade Off" = 'sound/weapons/saberoff.ogg', + "Wire Restraints" = 'sound/weapons/cablecuff.ogg', + "Handcuffs" = 'sound/weapons/handcuffs.ogg', + + "Crowbar" = 'sound/items/crowbar1.ogg', + "Screwdriver" = 'sound/items/Screwdriver.ogg', + "Welding" = 'sound/items/Welder.ogg', + "Wirecutting" = 'sound/items/Wirecutter.ogg', + + "Nymph Chirping" = 'sound/misc/nymphchirp.ogg', + "Sad Trombone" = 'sound/misc/sadtrombone.ogg', + "Honk" = 'sound/items/bikehorn.ogg', + "Bone Fracture" = "fracture", + ) + var/selected_sound = null + +/obj/item/spell/audible_deception/on_use_cast(mob/user) + var/list/sound_options = available_sounds + if(check_for_scepter()) + sound_options["!!AIR HORN!!"] = 'sound/items/AirHorn.ogg' + var/new_sound = input("Select the sound you want to make.","Sounds") as null|anything in sound_options + if(new_sound) + selected_sound = sound_options[new_sound] + +/obj/item/spell/audible_deception/on_ranged_cast(atom/hit_atom, mob/living/user) + var/turf/T = get_turf(hit_atom) + if(selected_sound && pay_energy(200)) + playsound(src, selected_sound, 80, 1, -1) + adjust_instability(1) + // Air Horn time. + if(selected_sound == 'sound/items/AirHorn.ogg' && pay_energy(3800)) + adjust_instability(49) // Pay for your sins. + for(var/mob/living/carbon/M in ohearers(6, T)) + //if(M.get_ear_protection() >= 2) todomatt: ear protection + // continue + M.SetSleeping(0) + M.stuttering += 20 + M.ear_deaf += 30 + M.Weaken(3) + if(prob(30)) + M.Stun(10) + M.Paralyse(4) + else + M.make_jittery(50) + to_chat(M, "HONK") diff --git a/code/game/gamemodes/technomancer/spells/aura/aura.dm b/code/game/gamemodes/technomancer/spells/aura/aura.dm new file mode 100644 index 00000000000..5a9df276ff5 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/aura/aura.dm @@ -0,0 +1,21 @@ +/obj/item/spell/aura + name = "aura template" + desc = "If you can read me, the game broke! Yay!" + icon_state = "generic" + cast_methods = null + aspect = null + var/glow_color = "#FFFFFF" + +/obj/item/spell/aura/Initialize() + . = ..() + set_light(calculate_spell_power(7), calculate_spell_power(4), l_color = glow_color) + START_PROCESSING(SSprocessing, src) + log_and_message_admins("has started casting [src].") + +/obj/item/spell/aura/Destroy() + STOP_PROCESSING(SSprocessing, src) + log_and_message_admins("has stopped maintaining [src].") + return ..() + +/obj/item/spell/aura/process() + return diff --git a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm new file mode 100644 index 00000000000..29127fc99b1 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm @@ -0,0 +1,40 @@ +/datum/technomancer/spell/biomed_aura + name = "Restoration Aura" + desc = "Heals you and your allies (or everyone, if you want) of trauma and burns slowly, as long as they remain within four meters." + spell_power_desc = "Increases the radius and healing amount of the aura." + cost = 100 + obj_path = /obj/item/spell/aura/biomed + ability_icon_state = "tech_biomedaura" + category = SUPPORT_SPELLS + +/obj/item/spell/aura/biomed + name = "restoration aura" + desc = "Allows everyone, or just your allies, to slowly regenerate." + icon_state = "generic" + cast_methods = CAST_USE + aspect = ASPECT_BIOMED + glow_color = "#33CC33" + var/regen_tick = 0 + var/heal_allies_only = 1 + +/obj/item/spell/aura/biomed/process() + if(!pay_energy(75)) + qdel(src) + regen_tick++ + if(regen_tick % 5 == 0) + var/list/nearby_mobs = range(calculate_spell_power(4),owner) + var/list/mobs_to_heal = list() + for(var/mob/living/L in nearby_mobs) + if(heal_allies_only) + if(is_ally(L)) + mobs_to_heal |= L + else + mobs_to_heal |= L // Heal everyone! + for(var/mob/living/L in mobs_to_heal) + L.adjustBruteLoss(calculate_spell_power(-5)) + L.adjustFireLoss(calculate_spell_power(-5)) + adjust_instability(2) + +/obj/item/spell/aura/biomed/on_use_cast(mob/living/user) + heal_allies_only = !heal_allies_only + to_chat(user, "Your aura will now heal [heal_allies_only ? "your allies" : "everyone"] near you.") diff --git a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm new file mode 100644 index 00000000000..ad5871ddf64 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm @@ -0,0 +1,54 @@ +/datum/technomancer/spell/fire_aura + name = "Fire Storm" + desc = "This causes everyone within four meters of you to heat up, eventually burning to death if they remain for too long. \ + This does not affect you or your allies. It also causes a large amount of fire to erupt around you, however the main threat is \ + still the heating up." + enhancement_desc = "Increased heat generation, more fires, and higher temperature cap." + spell_power_desc = "Radius, heat rate, heat capacity, and amount of fires made increased." + cost = 100 + obj_path = /obj/item/spell/aura/fire + ability_icon_state = "tech_fireaura" + category = OFFENSIVE_SPELLS + +/obj/item/spell/aura/fire + name = "Fire Storm" + desc = "Things are starting to heat up." + icon_state = "fire_bolt" + aspect = ASPECT_FIRE + glow_color = "#FF6A00" + +/obj/item/spell/aura/fire/process() + if(!pay_energy(100)) + qdel(src) + var/list/nearby_things = range(round(calculate_spell_power(4)),owner) + + var/temp_change = calculate_spell_power(25) + var/datum/species/baseline = all_species["Human"] + var/temp_cap = baseline.heat_level_3 * 1.5 + var/fire_power = calculate_spell_power(2) + + if(check_for_scepter()) + temp_change *= 2 + temp_cap *= 2 + fire_power *= 2 + + for(var/mob/living/carbon/human/H in nearby_things) + if(is_ally(H)) + continue + + var/protection = H.get_heat_protection(500) + if(protection < 1) + var/heat_factor = abs(protection - 1) + temp_change *= heat_factor + H.bodytemperature = min(H.bodytemperature + temp_change, temp_cap) + + turf_check: + for(var/turf/simulated/T in nearby_things) + if(prob(30)) + for(var/mob/living/carbon/human/H in T) + if(is_ally(H)) + continue turf_check + T.hotspot_expose(500, 50, 1) + T.create_fire(fire_power) + + adjust_instability(3) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm new file mode 100644 index 00000000000..d80df93f28e --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm @@ -0,0 +1,43 @@ +/datum/technomancer/spell/frost_aura + name = "Chilling Aura" + desc = "Lowers the core body temperature of everyone around you (except for your friends), causing them to become very slow if \ + they stay within four meters of you." + enhancement_desc = "Will make nearby entities even slower." + spell_power_desc = "Radius and rate of cooling are scaled." + cost = 100 + obj_path = /obj/item/spell/aura/frost + ability_icon_state = "tech_frostaura" + category = DEFENSIVE_SPELLS // Scepter-less frost aura is nonlethal. + +/obj/item/spell/aura/frost + name = "chilling aura" + desc = "Your enemies will find it hard to chase you if they freeze to death." + icon_state = "generic" + cast_methods = null + aspect = ASPECT_FROST + glow_color = "#00B3FF" + +/obj/item/spell/aura/frost/process() + if(!pay_energy(100)) + qdel(src) + var/list/nearby_mobs = range(round(calculate_spell_power(4)),owner) + + var/temp_change = calculate_spell_power(40) + var/datum/species/baseline = all_species["Human"] + var/temp_cap = baseline.cold_level_2 - 5 + + if(check_for_scepter()) + temp_change *= 2 + temp_cap = baseline.cold_level_3 - 5 + + for(var/mob/living/carbon/human/H in nearby_mobs) + if(is_ally(H)) + continue + + var/protection = H.get_cold_protection(1000) + if(protection < 1) + var/cold_factor = abs(protection - 1) + temp_change *= cold_factor + H.bodytemperature = max(H.bodytemperature - temp_change, temp_cap) + + adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm new file mode 100644 index 00000000000..9a06d180413 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm @@ -0,0 +1,46 @@ +/datum/technomancer/spell/shock_aura + name = "Electric Aura" + desc = "Repeatedly electrocutes enemies within four meters of you, as well as nearby electronics." + enhancement_desc = "Aura does twice as much damage." + spell_power_desc = "Radius and damage scaled up." + cost = 100 + obj_path = /obj/item/spell/aura/shock + ability_icon_state = "tech_shockaura" + category = OFFENSIVE_SPELLS + +/obj/item/spell/aura/shock + name = "electric aura" + desc = "Now you are a walking electrical storm." + icon_state = "generic" + cast_methods = null + aspect = ASPECT_SHOCK + glow_color = "#0000FF" //TODO + +/obj/item/spell/aura/shock/process() + if(!pay_energy(500)) + qdel(src) + var/list/nearby_mobs = range(calculate_spell_power(4), owner) + var/power = calculate_spell_power(7) + if(check_for_scepter()) + power = calculate_spell_power(15) + for(var/obj/machinery/light/light in range(calculate_spell_power(7), owner)) + light.flicker() + for(var/mob/living/L in nearby_mobs) + if(is_ally(L)) + continue + + if(L.loc == owner) + continue + + if(L.isSynthetic()) + to_chat(L, "ERROR: Electrical fault detected!") + L.stuttering += 3 + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + var/obj/item/organ/external/affected = H.get_organ(check_zone(BP_CHEST)) + H.electrocute_act(power, src, H.get_siemens_coefficient_organ(affected), BP_CHEST) + else + L.electrocute_act(power, src, 0.75, BP_CHEST) + + adjust_instability(3) diff --git a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm new file mode 100644 index 00000000000..6e4c8fe7c6d --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm @@ -0,0 +1,46 @@ +/datum/technomancer/spell/unstable_aura + name = "Degen Aura" + desc = "Destabilizes your enemies, breaking their elements down to their basic levels, slowly killing them from the inside. \ + For each person within fourteen meters of you, they suffer 1% of their current health every second. Your allies are \ + unharmed." + spell_power_desc = "Radius is increased." + cost = 150 + obj_path = /obj/item/spell/aura/unstable + ability_icon_state = "tech_unstableaura" + category = OFFENSIVE_SPELLS + +/obj/item/spell/aura/unstable + name = "degen aura" + desc = "Breaks down your entities from the inside. Synthetics will take brute damage while organics will take fire damage." + icon_state = "generic" + cast_methods = null + aspect = ASPECT_UNSTABLE + glow_color = "#CC00CC" + +/obj/item/spell/aura/unstable/process() + if(!pay_energy(200)) + qdel(src) + var/list/nearby_mobs = range(calculate_spell_power(14),owner) + for(var/mob/living/L in nearby_mobs) + if(is_ally(L)) + continue + + if(L.loc == owner) + continue + + var/damage_to_inflict = max(L.health / L.getMaxHealth(), 0) // Otherwise, those in crit would actually be healed. + + var/armor_factor = L.modify_damage_by_armor(BP_CHEST, 30, BURN, armor_pen = 40) + damage_to_inflict = damage_to_inflict * armor_factor + + if(L.isSynthetic()) + L.adjustBruteLoss(damage_to_inflict) + if(damage_to_inflict && prob(10)) + to_chat(L, "Your chassis seems to slowly be decaying and breaking down.") + else + L.adjustFireLoss(damage_to_inflict) + if(damage_to_inflict && prob(10)) + to_chat(L, "You feel almost like you're melting from the inside!") + + + adjust_instability(2) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm new file mode 100644 index 00000000000..aeab617a7f3 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/blink.dm @@ -0,0 +1,98 @@ +/datum/technomancer/spell/blink + name = "Blink" + desc = "Force the target to teleport a short distance away. This target could be anything from something lying on the ground, \ + to someone trying to fight you, or even yourself. Using this on someone next to you makes their potential distance after \ + teleportation greater. Self casting has the greatest potential for distance, as well as the cheapest cost." + enhancement_desc = "Blink distance is increased greatly." + spell_power_desc = "Blink distance is scaled up with more spell power." + cost = 50 + obj_path = /obj/item/spell/blink + ability_icon_state = "tech_blink" + category = UTILITY_SPELLS + +/obj/item/spell/blink + name = "blink" + desc = "Teleports you or someone else a short distance away." + icon_state = "blink" + cast_methods = CAST_RANGED | CAST_MELEE | CAST_USE + aspect = ASPECT_TELE + +/proc/safe_blink(atom/movable/AM, var/range = 3) + if(AM.anchored || !AM.loc) + return + var/list/targets = list() + + for(var/turf/simulated/T in range(AM, range)) + if(T.density || istype(T, /turf/simulated/mineral)) //Don't blink to vacuum or a wall + continue + for(var/atom/movable/stuff in T.contents) + if(stuff.density) + continue + targets.Add(T) + + if(!targets.len) + return + var/turf/simulated/destination = null + + destination = pick(targets) + + if(destination) + if(ismob(AM)) + var/mob/living/L = AM + if(L.buckled_to) + L.buckled_to.unbuckle() + spark(AM, 5, 2) + AM.forceMove(destination) + AM.visible_message("\The [AM] vanishes!") + to_chat(AM, "You suddenly appear somewhere else!") + return + +/obj/item/spell/blink/on_ranged_cast(atom/hit_atom, mob/user) + if(istype(hit_atom, /atom/movable)) + var/atom/movable/AM = hit_atom + if(!within_range(AM)) + to_chat(user, "\The [AM] is too far away to blink.") + return + if(!allowed_to_teleport()) + to_chat(user, "Teleportation doesn't seem to work here.") + return + if(pay_energy(400)) + if(check_for_scepter()) + safe_blink(AM, calculate_spell_power(6)) + else + safe_blink(AM, calculate_spell_power(3)) + adjust_instability(3) + log_and_message_admins("has blinked [AM] away.") + else + to_chat(user, "You need more energy to blink [AM] away!") + +/obj/item/spell/blink/on_use_cast(mob/user) + if(!allowed_to_teleport()) + to_chat(user, "Teleportation doesn't seem to work here.") + return + if(pay_energy(200)) + if(check_for_scepter()) + safe_blink(user, calculate_spell_power(10)) + else + safe_blink(user, calculate_spell_power(6)) + adjust_instability(1) + log_and_message_admins("has blinked themselves away.") + else + to_chat(user, "You need more energy to blink yourself away!") + +/obj/item/spell/blink/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + if(istype(hit_atom, /atom/movable)) + var/atom/movable/AM = hit_atom + if(!allowed_to_teleport()) + to_chat(user, "Teleportation doesn't seem to work here.") + return + if(pay_energy(300)) + visible_message("\The [user] reaches out towards \the [AM] with a glowing hand.") + if(check_for_scepter()) + safe_blink(AM, 10) + else + safe_blink(AM, 6) + adjust_instability(2) + log_and_message_admins("has blinked [AM] away.") + else + to_chat(user, "You need more energy to blink [AM] away!") \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/chroma.dm b/code/game/gamemodes/technomancer/spells/chroma.dm new file mode 100644 index 00000000000..44f43121dda --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/chroma.dm @@ -0,0 +1,43 @@ +/datum/technomancer/spell/chroma + name = "Chroma" + desc = "Creates light around you, or in a location of your choosing. You can choose what color the light is. This could be \ + useful to trick someone into believing you're casting a different spell, or perhaps just for fun." + cost = 25 + ability_icon_state = "const_ambush" + obj_path = /obj/item/spell/chroma + category = UTILITY_SPELLS + +/obj/item/spell/chroma + name = "chroma" + desc = "The colors are dazzling." + icon_state = "darkness" + cast_methods = CAST_RANGED | CAST_USE + aspect = ASPECT_LIGHT + var/color_to_use = "#FFFFFF" + +/obj/item/spell/chroma/Initialize() + . = ..() + set_light(6, 5, l_color = color_to_use) + +/obj/effect/temporary_effect/chroma + name = "chroma" + desc = "How are you examining what which cannot be seen?" + invisibility = 101 + time_to_die = 2 MINUTES //Despawn after this time, if set. + +/obj/effect/temporary_effect/chroma/Initialize(var/mapload, var/new_color = "#FFFFFF") + . = ..() + set_light(6, 5, l_color = new_color) + +/obj/item/spell/chroma/on_ranged_cast(atom/hit_atom, mob/user) + var/turf/T = get_turf(hit_atom) + if(T) + new /obj/effect/temporary_effect/chroma(T, color_to_use) + to_chat(user, "You shift the light onto \the [T].") + qdel(src) + +/obj/item/spell/chroma/on_use_cast(mob/user) + var/new_color = input(user, "Choose the color you want your light to be.", "Color selection") as null|color + if(new_color) + color_to_use = new_color + set_light(6, 5, l_color = new_color) diff --git a/code/game/gamemodes/technomancer/spells/condensation.dm b/code/game/gamemodes/technomancer/spells/condensation.dm new file mode 100644 index 00000000000..18956dd547a --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/condensation.dm @@ -0,0 +1,44 @@ +/datum/technomancer/spell/condensation + name = "Condensation" + desc = "This causes rapid formation of liquid at the target, causing floors to become wet, entities to be soaked, and fires \ + to be extinguished. You can also fill contains with water if they are targeted directly." + enhancement_desc = "Floors affected by condensation will also freeze." + ability_icon_state = "tech_condensation" + cost = 50 + obj_path = /obj/item/spell/condensation + category = UTILITY_SPELLS + +/obj/item/spell/condensation + name = "condensation" + desc = "Stronger than it appears." + icon_state = "condensation" + cast_methods = CAST_RANGED + aspect = ASPECT_AIR + cooldown = 2 SECONDS + +/obj/item/spell/condensation/on_ranged_cast(atom/hit_atom, mob/user) + if(pay_energy(200)) + if(istype(hit_atom, /turf/simulated) && within_range(hit_atom)) + var/turf/simulated/T = hit_atom + + for(var/direction in alldirs + null) // null is for the center tile. + spawn(1) + var/turf/desired_turf = get_step(T,direction) + if(desired_turf) // This shouldn't fail but... + var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(T)) + W.create_reagents(60) + W.reagents.add_reagent(/decl/reagent/water, 60, safety = TRUE) + W.set_color() + W.set_up(desired_turf) + flick(initial(icon_state),W) // Otherwise pooling causes the animation to stay stuck at the end. + if(check_for_scepter()) + if(istype(desired_turf, /turf/simulated)) + var/turf/simulated/frozen = desired_turf + frozen.wet_floor(WET_TYPE_ICE, 3) + if(check_for_scepter()) + log_and_message_admins("has iced the floor with [src] at [T.x],[T.y],[T.z].") + else + log_and_message_admins("has wetted the floor with [src] at [T.x],[T.y],[T.z].") + else if(hit_atom.reagents && !ismob(hit_atom)) //TODO: Something for the scepter + hit_atom.reagents.add_reagent(/decl/reagent/water, 60, safety = FALSE) + adjust_instability(5) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/dispel.dm b/code/game/gamemodes/technomancer/spells/dispel.dm new file mode 100644 index 00000000000..0597f0a51a4 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/dispel.dm @@ -0,0 +1,23 @@ +/datum/technomancer/spell/dispel + name = "Dispel" + desc = "Ends most on-going effects caused by another Technomancer function on the target. Useful if you are worried about \ + hitting an ally with a deterimental function, if your opponent has similar capabilities to you, or if you're tired of Instability \ + plaguing you." + cost = 25 + obj_path = /obj/item/spell/dispel + ability_icon_state = "tech_dispel" + category = SUPPORT_SPELLS + +/obj/item/spell/dispel + name = "dispel" + desc = "Useful if you're tired of glowing because of a miscast." + icon_state = "dispel" + cast_methods = CAST_RANGED + aspect = ASPECT_BIOMED + +/obj/item/spell/dispel/on_ranged_cast(atom/hit_atom, mob/living/user) + //if(isliving(hit_atom) && within_range(hit_atom) && pay_energy(1000)) todomatt: fuck this thinjg + // var/mob/living/target = hit_atom + // target.remove_modifiers_of_type(/datum/modifier/technomancer) + user.adjust_instability(10) + qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/energy_siphon.dm b/code/game/gamemodes/technomancer/spells/energy_siphon.dm new file mode 100644 index 00000000000..5bc92028ffe --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/energy_siphon.dm @@ -0,0 +1,208 @@ +/datum/technomancer/spell/energy_siphon + name = "Energy Siphon" + desc = "This creates a link to a target that drains electricity, converts it to energy that the Core can use, then absorbs it. \ + Every second, electricity is stolen until the link is broken by the target moving too far away, or having no more energy left. \ + Can drain from powercells, microbatteries, and other Cores. The beam created by the siphoning is harmful to touch." + enhancement_desc = "Rate of siphoning is doubled." + spell_power_desc = "Rate of siphoning is scaled up based on spell power." + cost = 100 + obj_path = /obj/item/spell/energy_siphon + ability_icon_state = "tech_energysiphon" + category = UTILITY_SPELLS + +/obj/item/spell/energy_siphon + name = "energy siphon" + desc = "Now you are an energy vampire." + icon_state = "energy_siphon" + cast_methods = CAST_RANGED + aspect = ASPECT_SHOCK + var/atom/movable/siphoning = null // What the spell is currently draining. Does nothing if null. + var/list/things_to_siphon = list() //Things which are actually drained as a result of the above not being null. + var/flow_rate = 1000 // Limits how much electricity can be drained per second. Measured by default in god knows what. + +/obj/item/spell/energy_siphon/New() + ..() + START_PROCESSING(SSprocessing, src) + +/obj/item/spell/energy_siphon/Destroy() + stop_siphoning() + STOP_PROCESSING(SSprocessing, src) + return ..() + +/obj/item/spell/energy_siphon/process() + if(!siphoning) + return + if(!pay_energy(100)) + to_chat(owner, "You can't afford to maintain the siphon link!") + stop_siphoning() + return + if(get_dist(siphoning, get_turf(src)) > 4) + to_chat(owner, "\The [siphoning] is too far to drain from!") + stop_siphoning() + return + if(!(siphoning in view(owner))) + to_chat(owner, "\The [siphoning] cannot be seen!") + stop_siphoning() + return + siphon(siphoning, owner) + + + +/obj/item/spell/energy_siphon/on_ranged_cast(atom/hit_atom, mob/user) + if(istype(hit_atom, /atom/movable) && within_range(hit_atom, 4)) + var/atom/movable/AM = hit_atom + populate_siphon_list(AM) + if(!things_to_siphon.len) + to_chat(user, "You cannot steal energy from \a [AM].") + return 0 + siphoning = AM + update_icon() + log_and_message_admins("is siphoning energy from \a [AM].") + else + stop_siphoning() + +/obj/item/spell/energy_siphon/proc/populate_siphon_list(atom/movable/target) + things_to_siphon.Cut() + things_to_siphon |= target // The recursive check below does not add the object being checked to its list. + things_to_siphon |= recursive_content_check(target, things_to_siphon, recursion_limit = 3, client_check = 0, sight_check = 0, include_mobs = 1, include_objects = 1) + for(var/atom/movable/AM in things_to_siphon) + if(ishuman(AM)) // We can drain FBPs, so we can skip the test below. + var/mob/living/carbon/human/H = AM + if(H.isSynthetic()) + continue + if(AM.drain_power(1) <= 0) // This checks if whatever's in the list can be drained from. + things_to_siphon.Remove(AM) + +/obj/item/spell/energy_siphon/proc/stop_siphoning() + siphoning = null + things_to_siphon.Cut() + update_icon() + +#define SIPHON_CELL_TO_ENERGY 0.5 +#define SIPHON_FBP_TO_ENERGY 5.0 +#define SIPHON_CORE_TO_ENERGY 0.5 + +// This is called every tick, so long as a link exists between the target and the Technomancer. +/obj/item/spell/energy_siphon/proc/siphon(atom/movable/siphoning, mob/living/user) + var/list/things_to_drain = things_to_siphon // Temporary list copy of what we're gonna steal from. + var/charge_to_give = 0 // How much energy to give to the Technomancer at the end. + var/flow_remaining = calculate_spell_power(flow_rate) + + if(!siphoning) + return 0 + + update_icon() + + //playsound(source = src, soundin = 'TODO', vol = 30, vary = 0, extrarange = 0, falloff = 0, is_global = 0) + + if(check_for_scepter()) + flow_remaining = flow_remaining * 2 + + // First, we drain normal batteries. + if(things_to_drain.len) + // Don't bother with empty stuff. + for(var/atom/movable/AM in things_to_drain) + if(AM.drain_power(1) <= 0) + things_to_drain.Remove(AM) + if(!things_to_drain.len) + return + var/charge_to_steal = round(flow_remaining / things_to_drain.len) // This is to drain all the cells evenly. + for(var/atom/movable/AM in things_to_drain) + var/big_number = AM.drain_power(0,0,charge_to_steal / CELLRATE) // This drains the cell, and leaves us with a big number. + flow_remaining = flow_remaining - (big_number * CELLRATE) // Which we reduce to our needed number by multiplying. + AM.update_icon() // So guns and batteries will display correctly. + charge_to_give = charge_to_give + (flow_rate - flow_remaining) * SIPHON_CELL_TO_ENERGY + // If we have 'leftover' flow, let's try to do more. + if(round(flow_remaining)) + if(ishuman(siphoning)) + var/mob/living/carbon/human/H = siphoning + // Let's drain from FBPs. Note that it is possible for the caster to drain themselves if they are an FBP and desperate. + if(H.isSynthetic()) + var/nutrition_to_steal = flow_remaining * 0.025 // Should steal about 25 nutrition per second by default. + var/old_nutrition = H.nutrition + H.nutrition = max(H.nutrition - nutrition_to_steal, 0) + var/nutrition_delta = old_nutrition - H.nutrition + charge_to_give += nutrition_delta * SIPHON_FBP_TO_ENERGY + flow_remaining = flow_remaining - nutrition_to_steal / 0.025 + // Let's steal some energy from another Technomancer. + if(istype(H.back, /obj/item/technomancer_core) && H != user) + var/obj/item/technomancer_core/their_core = H.back + if(their_core.pay_energy(flow_remaining / 2)) // Don't give energy from nothing. + charge_to_give += flow_remaining * SIPHON_CORE_TO_ENERGY + flow_remaining = 0 + + if(charge_to_give) // Shock anyone standing in the beam. + create_lightning(user, siphoning) + + // Now we can actually fill up the core. + if(core.energy < core.max_energy) + give_energy(charge_to_give) + to_chat(user, "Stolen [charge_to_give * CELLRATE] kJ and converted to [charge_to_give] Core energy.") + if((core.max_energy - core.energy) < charge_to_give ) // We have some overflow, if this is true. + if(user.isSynthetic() && ishuman(user)) // Let's do something with it, if we're a robot. + var/mob/living/carbon/human/H = user + charge_to_give = charge_to_give - (core.max_energy - core.energy) + var/obj/item/organ/internal/cell/C = H.internal_organs_by_name[BP_CELL] + var/obj/item/cell/potato = C.get_cell() + potato.give(charge_to_give) + to_chat(user, "Redirected energy to internal microcell.") + else + to_chat(user, "Stolen [charge_to_give * CELLRATE] kJ.") + adjust_instability(2) + + if(flow_remaining == flow_rate) // We didn't drain anything. + to_chat(user, "\The [siphoning] cannot be drained any further.") + stop_siphoning() + +/obj/item/spell/energy_siphon/update_icon() + ..() + if(siphoning) + icon_state = "energy_siphon_drain" + else + icon_state = "energy_siphon" + +/obj/item/spell/energy_siphon/proc/create_lightning(mob/user, atom/source) + if(user && source && user != source) + spawn(0) + var/i = 7 // process() takes two seconds to tick, this ensures the appearance of a ongoing beam. + while(i) + var/obj/item/projectile/beam/lightning/energy_siphon/lightning = new(get_turf(source)) + lightning.firer = user + lightning.old_style_target(user) + lightning.fire() + i-- + sleep(3) + +/obj/item/projectile/beam/lightning/energy_siphon + name = "energy stream" + icon_state = "lightning" + range = 6 // Backup plan in-case the effect somehow misses the Technomancer. + power = 5 // This fires really fast, so this may add up if someone keeps standing in the beam. + penetrating = 5 + +/obj/item/projectile/beam/lightning/energy_siphon/Bump(atom/A as mob|obj|turf|area, forced=0) + if(A == firer) // For this, you CAN shoot yourself. + on_impact(A) + + density = 0 + invisibility = 101 + + qdel(src) + return 1 + ..() + +/obj/item/projectile/beam/lightning/energy_siphon/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0) + if(target_mob == firer) // This shouldn't actually occur due to Bump(), but just in-case. + return 1 + if(ishuman(target_mob)) // Otherwise someone else stood in the beam and is going to pay for it. + var/mob/living/carbon/human/H = target_mob + var/obj/item/organ/external/affected = H.get_organ(check_zone(BP_CHEST)) + H.electrocute_act(power, src, H.get_siemens_coefficient_organ(affected), BP_CHEST, 0) + else + target_mob.electrocute_act(power, src, 0.75, BP_CHEST) + return 0 // Since this is a continous beam, it needs to keep flying until it hits the Technomancer. + + +#undef SIPHON_CELL_TO_ENERGY +#undef SIPHON_FBP_TO_ENERGY +#undef SIPHON_CORE_TO_ENERGY \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm new file mode 100644 index 00000000000..6f124b52e7f --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm @@ -0,0 +1,63 @@ +/datum/technomancer/spell/flame_tongue + name = "Flame Tongue" + desc = "Creates a miniaturized flamethrower in your hand. Acts as a welder and lights enemies on fire on contact." + cost = 50 + obj_path = /obj/item/spell/flame_tongue + ability_icon_state = "tech_flametongue" + category = OFFENSIVE_SPELLS + +/obj/item/spell/flame_tongue + name = "flame tongue" + icon_state = "flame_tongue" + desc = "Burn!" + cast_methods = CAST_MELEE + aspect = ASPECT_FIRE + var/obj/item/weldingtool/spell/welder = null + +/obj/item/spell/flame_tongue/Initialize() + . = ..() + set_light(3, 2, l_color = "#FF6A00") + visible_message("\The [loc]'s hand begins to emit a flame.") + welder = new /obj/item/weldingtool/spell(src) + welder.setWelding(1) + +/obj/item/spell/flame_tongue/Destroy() + QDEL_NULL(welder) + return ..() + +/obj/item/weldingtool/spell + name = "flame" + +/obj/item/weldingtool/spell/process() + return + +//Needed to make the spell welder have infinite fuel. Don't worry, it uses energy instead. +/obj/item/weldingtool/spell/remove_fuel(var/amount = 1, var/mob/M = null, var/colourChange = TRUE) + return 1 + +/obj/item/weldingtool/spell/eyecheck(mob/user as mob) + return + +/obj/item/spell/flame_tongue/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + if(isliving(hit_atom) && user.a_intent != I_HELP) + var/mob/living/L = hit_atom + if(pay_energy(1000)) + visible_message("\The [user] reaches out towards \the [L] with the flaming hand, and they ignite!") + to_chat(L, "You ignite!") + L.fire_act() + log_and_message_admins("has ignited [L] with [src].") + adjust_instability(12) + else + //This is needed in order for the welder to work, and works similarly to grippers. + welder.loc = user + var/resolved = hit_atom.attackby(welder, user) + if(!resolved && welder && ismob(hit_atom)) + if(pay_energy(500)) + welder.attack(hit_atom, user, def_zone) + adjust_instability(4) + if(welder && user && (welder.loc == user)) + welder.loc = src + else + welder = null + qdel(src) + return diff --git a/code/game/gamemodes/technomancer/spells/gambit.dm b/code/game/gamemodes/technomancer/spells/gambit.dm new file mode 100644 index 00000000000..16cf330e06c --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/gambit.dm @@ -0,0 +1,116 @@ +/datum/technomancer/spell/gambit + name = "Gambit" + desc = "This function causes you to receive a random function, including those which you haven't purchased." +// enhancement_desc = "Makes results less random and more biased towards what the function thinks you need in your current situation." + enhancement_desc = "Instead of a purely random spell, it will give you a \"random\" spell." + spell_power_desc = "Makes certain rare functions possible to acquire via Gambit which cannot be obtained otherwise, if above 100%." + ability_icon_state = "tech_gambit" + cost = 50 + obj_path = /obj/item/spell/gambit + category = UTILITY_SPELLS + +/var/global/list/all_technomancer_gambit_spells = subtypesof(/obj/item/spell) - list( + /obj/item/spell/gambit, + /obj/item/spell/projectile, + /obj/item/spell/aura, + /obj/item/spell/insert, + /obj/item/spell/spawner, + /obj/item/spell/summon, + /obj/item/spell/modifier) + +/obj/item/spell/gambit + name = "gambit" + desc = "Do you feel lucky?" + icon_state = "gambit" + cast_methods = CAST_USE + aspect = ASPECT_UNSTABLE + +/obj/item/spell/gambit/on_use_cast(mob/living/carbon/human/user) + if(pay_energy(200)) + adjust_instability(3) + if(check_for_scepter()) + give_new_spell(biased_random_spell()) + else + give_new_spell(random_spell()) + qdel(src) + +/obj/item/spell/gambit/proc/give_new_spell(var/spell_type) + owner.drop_from_inventory(src, null) + owner.place_spell_in_hand(spell_type) + +// Gives a random spell. +/obj/item/spell/gambit/proc/random_spell() + var/list/potential_spells = all_technomancer_gambit_spells.Copy() + return pick(potential_spells) + +// Gives a "random" spell. +/obj/item/spell/gambit/proc/biased_random_spell() + var/list/potential_spells = list() + + // First the spell will concern itself with the health of the technomancer. + if(prob(owner.getBruteLoss() + owner.getBruteLoss() * 2)) // Having 20 brute means a 40% chance of being added to the pool. + if(!owner.isSynthetic()) + potential_spells |= /obj/item/spell/modifier/mend_life + else + potential_spells |= /obj/item/spell/modifier/mend_synthetic + + // Second, the spell will try to prepare the technomancer for threats. + var/hostile_mobs = 0 // Counts how many hostile mobs. Higher numbers make it more likely for AoE spells to be chosen. + + for(var/mob/living/L in view(owner)) + // Spiders, carp... bears. + if(istype(L, /mob/living/simple_animal)) + var/mob/living/simple_animal/SM = L + if(!is_ally(SM)) + hostile_mobs++ + if(SM.summoned || SM.supernatural) // Our creations might be trying to kill us. + potential_spells |= /obj/item/spell/abjuration + + // Always assume borgs are hostile. + if(istype(L, /mob/living/silicon/robot)) + if(!istype(L, /mob/living/silicon/robot/drone)) // Drones are okay, however. + hostile_mobs++ + potential_spells |= /obj/item/spell/projectile/ionic_bolt + + // Finally we get to humanoids. + if(istype(L, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = L + if(is_ally(H)) // Don't get scared by our apprentice. + continue + + for(var/obj/item/I in list(H.l_hand, H.r_hand)) + // Guns are scary. + if(istype(I, /obj/item/gun)) // Toy guns will count as well but oh well. + hostile_mobs++ + continue + // Strong melee weapons are scary as well. + else if(I.force >= 15) + hostile_mobs++ + continue + + if(hostile_mobs) + potential_spells |= /obj/item/spell/shield + potential_spells |= /obj/item/spell/reflect + potential_spells |= /obj/item/spell/targeting_matrix + potential_spells |= /obj/item/spell/warp_strike + + if(hostile_mobs >= 3) // Lots of baddies, give them AoE. + potential_spells |= /obj/item/spell/spawner/fire_blast + potential_spells |= /obj/item/spell/condensation + potential_spells |= /obj/item/spell/aura/frost + else + potential_spells |= /obj/item/spell/projectile/beam + potential_spells |= /obj/item/spell/projectile/overload + potential_spells |= /obj/item/spell/projectile/force_missile + potential_spells |= /obj/item/spell/projectile/lightning + + // Third priority is recharging the core. + if(core.energy / core.max_energy <= 0.5) + potential_spells |= /obj/item/spell/energy_siphon + potential_spells |= /obj/item/spell/instability_tap + + // Fallback method in case nothing gets added. + if(!potential_spells.len) + potential_spells = all_technomancer_gambit_spells.Copy() + + return pick(potential_spells) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm new file mode 100644 index 00000000000..8572b0bd300 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/illusion.dm @@ -0,0 +1,70 @@ +/datum/technomancer/spell/illusion + name = "Illusion" + desc = "Allows you to create and control a holographic illusion, that can take the form of most object or entities." + enhancement_desc = "Illusions will be made of hard light, allowing the interception of attacks, appearing more realistic." + cost = 25 + obj_path = /obj/item/spell/illusion + ability_icon_state = "tech_illusion" + category = UTILITY_SPELLS + +/obj/item/spell/illusion + name = "illusion" + icon_state = "illusion" + desc = "Now you can toy with the minds of the whole colony." + aspect = ASPECT_LIGHT + cast_methods = CAST_RANGED | CAST_USE + var/atom/movable/copied = null + var/mob/living/simple_animal/illusion/illusion = null + +/obj/item/spell/illusion/on_ranged_cast(atom/hit_atom, mob/user) + if(istype(hit_atom, /atom/movable)) + var/atom/movable/AM = hit_atom + if(pay_energy(100)) + copied = AM + update_icon() + to_chat(user, "You've copied \the [AM]'s appearance.") + sound_to(user, 'sound/weapons/flash.ogg') + return 1 + else if(istype(hit_atom, /turf)) + var/turf/T = hit_atom + if(!illusion) + if(!copied) + copied = user + if(pay_energy(500)) + illusion = new(T) + illusion.copy_appearance(copied) + to_chat(user, "An illusion of \the [copied] is made on \the [T].") + sound_to(user, 'sound/effects/pop.ogg') + return 1 + +/obj/item/spell/illusion/on_use_cast(mob/user) + if(illusion) + var/choice = alert(user, "Would you like to have \the [illusion] speak, or do an emote?", "Illusion", "Speak","Emote","Cancel") + switch(choice) + if("Cancel") + return + if("Speak") + var/what_to_say = input(user, "What do you want \the [illusion] to say?","Illusion Speak") as null|text + //what_to_say = sanitize(what_to_say) //Sanitize occurs inside say() already. + if(what_to_say) + illusion.say(what_to_say) + if("Emote") + var/what_to_emote = input(user, "What do you want \the [illusion] to do?","Illusion Emote") as null|text + if(what_to_emote) + illusion.emote(what_to_emote) + +/obj/item/spell/illusion/Destroy() + QDEL_NULL(illusion) + copied = null + return ..() + +// Makes a tiny overlay of the thing the player has copied, so they can easily tell what they currently have. +/obj/item/spell/illusion/update_icon() + overlays.Cut() + if(copied) + var/image/temp_image = image(copied) + var/matrix/M = matrix() + M.Scale(0.5, 0.5) + temp_image.transform = M +// temp_image.pixel_y = 8 + src.overlays.Add(temp_image) diff --git a/code/game/gamemodes/technomancer/spells/insert/insert.dm b/code/game/gamemodes/technomancer/spells/insert/insert.dm new file mode 100644 index 00000000000..36eb4aa2c4b --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/insert/insert.dm @@ -0,0 +1,59 @@ +//Template for spells which put something inside someone else, good for buffs/debuffs, damage over times and heals over time. + +/obj/item/spell/insert + name = "insert template" + desc = "Tell a coder if you can read this in-game." + icon_state = "purify" + cast_methods = CAST_MELEE + var/spell_color = "#03A728" + var/spell_light_intensity = 2 + var/spell_light_range = 3 + var/obj/item/inserted_spell/inserting = null + var/allow_stacking = 0 + +/obj/item/spell/insert/New() + ..() + set_light(spell_light_range, spell_light_intensity, l_color = light_color) + +/obj/item/inserted_spell + var/mob/living/carbon/human/origin = null + var/mob/living/host = null + var/spell_power_at_creation = 1.0 // This is here because the spell object that made this object probably won't exist. + +/obj/item/inserted_spell/New(var/newloc, var/user, var/obj/item/spell/insert/inserter) + ..(newloc) + host = newloc + origin = user + if(light_color) + spawn(1) + set_light(inserter.spell_light_range, inserter.spell_light_intensity, inserter.spell_color) + on_insert() + +/obj/item/inserted_spell/proc/on_insert() + return + +/obj/item/inserted_spell/proc/on_expire(var/dispelled = 0) + qdel(src) + return + +/obj/item/spell/insert/proc/insert(var/mob/living/L, mob/user) + if(inserting) + if(!allow_stacking) + for(var/obj/item/inserted_spell/IS in L.contents) + if(IS.type == inserting) + to_chat(user, "\The [L] is already affected by \the [src].") + return + var/obj/item/inserted_spell/inserted = new inserting(L,user,src) + inserted.spell_power_at_creation = calculate_spell_power(1.0) + log_and_message_admins("has casted [src] on [L].") + qdel(src) + +/obj/item/spell/insert/on_melee_cast(atom/hit_atom, mob/user) + if(istype(hit_atom, /mob/living)) + var/mob/living/L = hit_atom + insert(L,user) + +/obj/item/spell/insert/on_ranged_cast(atom/hit_atom, mob/user) + if(istype(hit_atom, /mob/living)) + var/mob/living/L = hit_atom + insert(L,user) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/instability_tap.dm b/code/game/gamemodes/technomancer/spells/instability_tap.dm new file mode 100644 index 00000000000..67aac5557fb --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/instability_tap.dm @@ -0,0 +1,30 @@ +/datum/technomancer/spell/instability_tap + name = "Instability Tap" + desc = "Creates a large sum of energy (5,000 at normal spell power), at the cost of a very large amount of instability afflicting you." + enhancement_desc = "50% more energy gained, 20% less instability gained." + spell_power_desc = "Amount of energy gained scaled with spell power." + cost = 100 + obj_path = /obj/item/spell/instability_tap + ability_icon_state = "tech_instabilitytap" + category = UTILITY_SPELLS + +/obj/item/spell/instability_tap + name = "instability tap" + desc = "Short term gain for long term consequences never end bad, right?" + cast_methods = CAST_USE + aspect = ASPECT_UNSTABLE + +/obj/item/spell/instability_tap/New() + ..() + set_light(3, 2, l_color = "#FA58F4") + +/obj/item/spell/instability_tap/on_use_cast(mob/user) + var/amount = calculate_spell_power(5000) + if(check_for_scepter()) + core.give_energy(amount * 1.5) + adjust_instability(40) + else + core.give_energy(amount) + adjust_instability(50) + playsound(src, 'sound/effects/supermatter.ogg', 75, 1) + qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/mark_recall.dm b/code/game/gamemodes/technomancer/spells/mark_recall.dm new file mode 100644 index 00000000000..1c78660582d --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/mark_recall.dm @@ -0,0 +1,111 @@ +/datum/technomancer/spell/mark + name = "Mark" + desc = "This function places a specific 'mark' beacon under you, which is used by the Recall function as a destination. \ + Note that using Mark again will move the destination instead of creating a second destination, and only one destination \ + can exist, regardless of who casted Mark." + cost = 25 + obj_path = /obj/item/spell/mark + ability_icon_state = "tech_mark" + category = UTILITY_SPELLS + +//The object to teleport to when Recall is used. +/obj/effect/mark_spell + name = "mark" + desc = "This is a strange looking disturbance." + opacity = 0 + density = 0 + anchored = 1 + +//This is global, to avoid looping through a list of all objects, or god forbid, looping through world. +/var/global/obj/effect/mark_spell/mark_spell_ref = null + +/obj/item/spell/mark + name = "mark" + icon_state = "mark" + desc = "Marks a specific location to be used by Recall." + cast_methods = CAST_USE + aspect = ASPECT_TELE + +/obj/item/spell/mark/on_use_cast(mob/living/user) + if(!allowed_to_teleport()) // Otherwise you could teleport back to the admin Z-level. + to_chat(user, "You can't teleport here!") + return 0 + if(pay_energy(1000)) + if(!mark_spell_ref) + mark_spell_ref = new(get_turf(user)) + to_chat(user, "You mark \the [get_turf(user)] under you.") + else + mark_spell_ref.forceMove(get_turf(user)) + to_chat(user, "Your mark is moved from its old position to \the [get_turf(user)] under you.") + adjust_instability(5) + return 1 + else + to_chat(user, "You can't afford the energy cost!") + return 0 + +//Recall + +/datum/technomancer/spell/recall + name = "Recall" + desc = "This function teleports you to where you placed a mark using the Mark function. Without the Mark function, this \ + function is useless. Note that teleporting takes three seconds. Being incapacitated while teleporting will cancel it." + enhancement_desc = "Recall takes two seconds instead of three." + cost = 25 + obj_path = /obj/item/spell/recall + ability_icon_state = "tech_recall" + category = UTILITY_SPELLS + +/obj/item/spell/recall + name = "recall" + icon_state = "recall" + desc = "This will bring you to your Mark." + cast_methods = CAST_USE + aspect = ASPECT_TELE + +/obj/item/spell/recall/on_use_cast(mob/living/user) + if(pay_energy(3000)) + if(!mark_spell_ref) + to_chat(user, "There's no Mark!") + return 0 + else + if(!allowed_to_teleport()) + to_chat(user, "Teleportation doesn't seem to work here.") + return + visible_message("\The [user] starts glowing!") + var/light_intensity = 2 + var/time_left = 3 + if(check_for_scepter()) + time_left = 2 + while(time_left) + if(user.incapacitated()) + visible_message("\The [user]'s glow fades.") + to_chat(user, "You cannot Recall while incapacitated!") + return 0 + light_intensity++ + set_light(light_intensity, light_intensity, l_color = "#006AFF") + time_left-- + sleep(1 SECOND) + + var/turf/target_turf = get_turf(mark_spell_ref) + var/turf/old_turf = get_turf(user) + + for(var/obj/item/grab/G in user.contents) // People the Technomancer is grabbing come along for the ride. + if(G.affecting) + G.affecting.forceMove(locate( target_turf.x+rand(-1,1), target_turf.y+rand(-1,1), target_turf.z)) + to_chat(G.affecting, "You are teleported along with [user]!") + + user.forceMove(target_turf) + to_chat(user, "You are teleported to your Mark.") + + playsound(target_turf, 'sound/effects/phasein.ogg', 25, 1) + playsound(target_turf, 'sound/effects/sparks2.ogg', 50, 1) + + playsound(old_turf, 'sound/effects/sparks2.ogg', 50, 1) + + adjust_instability(25) + qdel(src) + return 1 + else + to_chat(user, "You can't afford the energy cost!") + return 0 + diff --git a/code/game/gamemodes/technomancer/spells/mend_organs.dm b/code/game/gamemodes/technomancer/spells/mend_organs.dm new file mode 100644 index 00000000000..d819e947711 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/mend_organs.dm @@ -0,0 +1,57 @@ +/datum/technomancer/spell/mend_organs + name = "Mend Internals" + desc = "Greatly heals the target's wounds, both external and internal. Restores internal organs to functioning states, even if \ + robotic, reforms bones, patches internal bleeding, and restores missing blood." + spell_power_desc = "Healing amount increased." + cost = 100 + obj_path = /obj/item/spell/mend_organs + ability_icon_state = "tech_mendwounds" + category = SUPPORT_SPELLS + +/obj/item/spell/mend_organs + name = "great mend wounds" + desc = "A walking medbay is now you!" + icon_state = "mend_wounds" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED + light_color = "#FF5C5C" + +/obj/item/spell/mend_organs/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom + var/heal_power = calculate_spell_power(40) + L.adjustBruteLoss(-heal_power) + L.adjustFireLoss(-heal_power) + user.adjust_instability(5) + L.adjust_instability(5) + + if(ishuman(hit_atom)) + var/mob/living/carbon/human/H = hit_atom + + user.adjust_instability(5) + L.adjust_instability(5) + + for(var/obj/item/organ/O in H.internal_organs) + if(O.damage > 0) // Fix internal damage + O.heal_damage(heal_power / 2) + if(O.damage <= 5 && O.organ_tag == BP_EYES) // Fix eyes + H.sdisabilities &= ~BLIND + + for(var/obj/item/organ/external/O in H.organs) // Fix limbs + if(!O.robotic < ORGAN_ROBOT) // No robot parts for this. + continue + O.heal_damage(0, heal_power / 4, internal = 1, robo_repair = 0) + + for(var/obj/item/organ/E in H.bad_external_organs) // Fix bones + var/obj/item/organ/external/affected = E + if((affected.damage < affected.min_broken_damage * config.organ_health_multiplier) && (affected.status & ORGAN_BROKEN)) + affected.status &= ~ORGAN_BROKEN + + if(affected.tendon_status() & TENDON_CUT) + affected.tendon.heal() + + if(E.status & ORGAN_ARTERY_CUT) + E.status &= ~ORGAN_ARTERY_CUT + + H.restore_blood() // Fix bloodloss + qdel(src) diff --git a/code/game/gamemodes/technomancer/spells/modifier/corona.dm b/code/game/gamemodes/technomancer/spells/modifier/corona.dm new file mode 100644 index 00000000000..4b49baa0af1 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/corona.dm @@ -0,0 +1,24 @@ +/datum/technomancer/spell/corona + name = "Corona" + desc = "Causes the victim to glow very brightly, which while harmless in itself, makes it easier for them to be hit. The \ + bright glow also makes it very difficult to be stealthy. The effect lasts for one minute." + cost = 50 + obj_path = /obj/item/spell/modifier/corona + ability_icon_state = "tech_corona" + category = SUPPORT_SPELLS + +/obj/item/spell/modifier/corona + name = "corona" + desc = "How brilliant!" + icon_state = "radiance" + cast_methods = CAST_RANGED + aspect = ASPECT_LIGHT + light_color = "#D9D900" + spell_light_intensity = 5 + spell_light_range = 3 + modifier_type = /datum/modifier/technomancer/corona + modifier_duration = 1 MINUTE + +/datum/modifier/technomancer/corona + on_created_text = "You start to glow very brightly!" + on_expired_text = "Your glow has ended." diff --git a/code/game/gamemodes/technomancer/spells/modifier/haste.dm b/code/game/gamemodes/technomancer/spells/modifier/haste.dm new file mode 100644 index 00000000000..86bbbfdb2ef --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/haste.dm @@ -0,0 +1,37 @@ +/datum/technomancer/spell/haste + name = "Haste" + desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \ + runs extremely fast, and cannot be slowed by any means." + cost = 100 + obj_path = /obj/item/spell/modifier/haste + ability_icon_state = "tech_haste" + category = SUPPORT_SPELLS + +/obj/item/spell/modifier/haste + name = "haste" + desc = "Now you can outrun a Tajara!" + icon_state = "haste" + cast_methods = CAST_RANGED + aspect = ASPECT_FORCE + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/haste + modifier_duration = 5 SECONDS + +/datum/modifier/technomancer/haste + on_created_text = "You suddenly find it much easier to move." + on_expired_text = "You feel slow again." + +/datum/modifier/technomancer/haste/activate() + . = ..() + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.move_delay_mod += -0.8 + H.sprint_cost_factor += -0.2 + +/datum/modifier/technomancer/haste/deactivate() + . = ..() + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.move_delay_mod += 0.8 + H.sprint_cost_factor += 0.2 + diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_all.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_all.dm new file mode 100644 index 00000000000..a94906c6ddc --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/mend_all.dm @@ -0,0 +1,35 @@ +// Gambit only spell. Heals everything unconditionally. + +/obj/item/spell/modifier/mend_all + name = "mend all" + desc = "One function to heal them all." + icon_state = "mend_all" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/mend_life + modifier_duration = 1 MINUTE + +/datum/modifier/technomancer/mend_all + name = "mend all" + desc = "You feel serene and well rested." + mob_overlay_state = "green_sparkles" + + on_created_text = "Sparkles begin to appear around you, and all your ills seem to fade away." + on_expired_text = "The sparkles have faded, although you feel much healthier than before." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/technomancer/mend_all/tick() + if(!holder.getBruteLoss() && !holder.getFireLoss() && !holder.getToxLoss() && !holder.getOxyLoss() && !holder.getCloneLoss()) // No point existing if the spell can't heal. + stop() + return + holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 120 damage over 1 minute, as tick() is run every 2 seconds. + holder.adjustFireLoss(-4 * spell_power) + holder.adjustToxLoss(-4 * spell_power) + holder.adjustOxyLoss(-4 * spell_power) + holder.adjustCloneLoss(-2 * spell_power) // 60 cloneloss + holder.adjust_instability(1) + if(origin) + var/mob/living/L = origin.resolve() + if(istype(L)) + L.adjust_instability(1) //TODOMATT: Tick this file and figure this out \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm new file mode 100644 index 00000000000..b7f0eac5678 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm @@ -0,0 +1,42 @@ +/datum/technomancer/spell/mend_life + name = "Mend Life" + desc = "Heals minor wounds, such as cuts, bruises, burns, and other non-lifethreatening injuries. \ + Instability is split between the target and technomancer, if seperate. The function will end prematurely \ + if the target is completely healthy, preventing further instability." + spell_power_desc = "Healing amount increased." + cost = 50 + obj_path = /obj/item/spell/modifier/mend_life + ability_icon_state = "tech_mendwounds" + category = SUPPORT_SPELLS + +/obj/item/spell/modifier/mend_life + name = "mend life" + desc = "Watch your wounds close up before your eyes." + icon_state = "mend_life" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/mend_life + modifier_duration = 10 SECONDS + +/datum/modifier/technomancer/mend_life + on_created_text = "Sparkles begin to appear around you, and you feel really.. refreshed." + on_expired_text = "The sparkles have faded, although you feel healthier than before." + +/datum/modifier/technomancer/mend_life/process() + . = ..() + if(isliving(target)) + var/mob/living/M = target + if(M.isSynthetic()) // Don't heal synths! + stop() + return + if(!M.getBruteLoss() && !M.getFireLoss()) // No point existing if the spell can't heal. + stop() + return + M.adjustBruteLoss(-4 * strength) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds. + M.adjustFireLoss(-4 * strength) // Ditto. + M.adjust_instability(1) + if(source) + var/mob/living/L = source + if(istype(L)) + L.adjust_instability(1) //TODOMATT: Tick this file and figure this out \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm new file mode 100644 index 00000000000..10512828383 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm @@ -0,0 +1,48 @@ +/datum/technomancer/spell/mend_synthetic + name = "Mend Synthetic" + desc = "Repairs minor damage to prosthetics. \ + Instability is split between the target and technomancer, if seperate. The function will end prematurely \ + if the target is completely healthy, preventing further instability." + spell_power_desc = "Healing amount increased." + cost = 50 + obj_path = /obj/item/spell/modifier/mend_synthetic + ability_icon_state = "tech_mendsynth" + category = SUPPORT_SPELLS + +/obj/item/spell/modifier/mend_synthetic + name = "mend synthetic" + desc = "You are the Robotics lab" + icon_state = "mend_synthetic" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED // sorta?? + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/mend_synthetic + modifier_duration = 10 SECONDS + +/datum/modifier/technomancer/mend_synthetic + on_created_text = "Sparkles begin to appear around you, and your systems report integrity rising." + on_expired_text = "The sparkles have faded, although your systems seem to be better than before." + +/datum/modifier/technomancer/mend_synthetic/process() + . = ..() + if(isliving(target)) + var/mob/living/M = target + if(!M.getBruteLoss() && !M.getFireLoss()) // No point existing if the spell can't heal. + stop() + return + if(ishuman(M)) + var/mob/living/carbon/human/H = target + for(var/obj/item/organ/external/E in H.organs) + var/obj/item/organ/external/O = E + if(O.robotic >= ORGAN_ROBOT) + O.heal_damage(4 * strength, 4 * strength, 0, TRUE) + else + if(M.isSynthetic()) + M.adjustBruteLoss(-4 * strength) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds. + M.adjustFireLoss(-4 * strength) // Ditto. + + M.adjust_instability(1) + if(source) + var/mob/living/L = source + if(istype(L)) + L.adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/modifier.dm b/code/game/gamemodes/technomancer/spells/modifier/modifier.dm new file mode 100644 index 00000000000..b8c42d13e7b --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/modifier.dm @@ -0,0 +1,48 @@ +/obj/item/spell/modifier + name = "modifier template" + desc = "Tell a coder if you can read this in-game." + icon_state = "purify" + cast_methods = CAST_MELEE + var/modifier_type = null + var/modifier_duration = null // Will last forever by default. Final duration may differ due to 'spell power' +// var/spell_color = "#03A728" + var/spell_light_intensity = 2 + var/spell_light_range = 3 + +/obj/item/spell/modifier/Initialize() + . = ..() + set_light(spell_light_range, spell_light_intensity, l_color = light_color) + +/obj/item/spell/modifier/on_melee_cast(atom/hit_atom, mob/user) + if(isliving(hit_atom)) + return on_add_modifier(hit_atom) + return FALSE + +/obj/item/spell/modifier/on_ranged_cast(atom/hit_atom, mob/user) + if(isliving(hit_atom)) + return on_add_modifier(hit_atom) + return FALSE + + +/obj/item/spell/modifier/proc/on_add_modifier(var/mob/living/L) + var/duration = modifier_duration + if(duration) + duration = round(duration * calculate_spell_power(1.0), 1) + var/str = calculate_spell_power(1) + L.add_modifier(modifier_type, 4, owner, 0, str, duration, 4) //the 4s here are MODIFIER_TIMED and MODIFIER_OVERRIDE_STRENGTHEN respectively, but apparently they are "undefined" + log_and_message_admins("has casted [src] on [L].") + qdel(src) + return TRUE + +// Technomancer specific subtype which keeps track of spell power and gets targeted specificially by Dispel. +/datum/modifier/technomancer + var/on_created_text + var/on_expired_text + +/datum/modifier/technomancer/activate() + ..() + to_chat(target, SPAN_WARNING(on_created_text)) + +/datum/modifier/technomancer/stop() + ..() + to_chat(target, SPAN_WARNING(on_expired_text)) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm new file mode 100644 index 00000000000..eafd2cd7bdb --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm @@ -0,0 +1,33 @@ +/datum/technomancer/spell/oxygenate + name = "Oxygenate" + desc = "This function creates oxygen at a location of your chosing. If used on a humanoid entity, it heals oxygen deprivation. \ + If casted on the envirnment, air (oxygen and nitrogen) is moved from a distant location to your target." + cost = 25 + obj_path = /obj/item/spell/oxygenate + ability_icon_state = "tech_oxygenate" + category = SUPPORT_SPELLS + +/obj/item/spell/oxygenate + name = "oxygenate" + desc = "Atmospherics is obsolete." + icon_state = "darkness" //wip + cast_methods = CAST_RANGED + aspect = ASPECT_AIR + cooldown = 30 + +/obj/item/spell/oxygenate/on_ranged_cast(atom/hit_atom, mob/user) + if(!within_range(hit_atom)) + return + if(ishuman(hit_atom)) + var/mob/living/carbon/human/H = hit_atom + if(pay_energy(1500)) + H.adjustOxyLoss(-35) + adjust_instability(10) + return + else if(isturf(hit_atom)) + var/turf/T = hit_atom + if(pay_energy(1500)) + T.assume_gas("oxygen", 200) + T.assume_gas("nitrogen", 800) + playsound(src, 'sound/effects/spray.ogg', 50, 1, -3) + adjust_instability(10) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/passwall.dm b/code/game/gamemodes/technomancer/spells/passwall.dm new file mode 100644 index 00000000000..4fcb5a206b8 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/passwall.dm @@ -0,0 +1,76 @@ +/datum/technomancer/spell/passwall + name = "Passwall" + desc = "An uncommon function that allows the user to phase through matter (usually walls) in order to enter or exit a room. Be careful you don't pass into \ + somewhere dangerous." + enhancement_desc = "Cost per tile is halved." + cost = 100 + obj_path = /obj/item/spell/passwall + ability_icon_state = "tech_passwall" + category = UTILITY_SPELLS + +/obj/item/spell/passwall + name = "passwall" + desc = "No walls can hold you back." + cast_methods = CAST_MELEE + aspect = ASPECT_TELE + var/maximum_distance = 20 //Measured in tiles. + var/busy = 0 + +/obj/item/spell/passwall/on_melee_cast(atom/hit_atom, mob/user) + if(busy) //Prevent someone from trying to get two uses of the spell from one instance. + return 0 + if(!allowed_to_teleport()) + to_chat(user, "You can't teleport here!") + return 0 +// if(isturf(hit_atom)) + + var/turf/T = get_turf(hit_atom) //Turf we touched. + var/turf/our_turf = get_turf(user) //Where we are. + if(!T.density) + if(!T.check_density()) + to_chat(user, "Perhaps you should try using passWALL on a wall, or other solid object.") + return 0 + var/direction = get_dir(our_turf, T) + var/total_cost = 0 + var/turf/checked_turf = T //Turf we're currently checking for density in the loop below. + var/turf/found_turf = null //Our destination, if one is found. + var/i = maximum_distance + + visible_message("[user] rests a hand on \the [hit_atom].") + busy = 1 + + spark(our_turf, 3, cardinal) + + while(i) + checked_turf = get_step(checked_turf, direction) //Advance in the given direction + total_cost += check_for_scepter() ? 400 : 800 //Phasing through matter's expensive, you know. + i-- + + if(!checked_turf.density) //If we found a destination (a non-dense turf), then we can stop. + var/dense_objs_on_turf = 0 + for(var/atom/movable/stuff in checked_turf.contents) //Make sure nothing dense is where we want to go, like an airlock or window. + if(stuff.density) + dense_objs_on_turf = 1 + + if(!dense_objs_on_turf) //If we found a non-dense turf with nothing dense on it, then that's our destination. + found_turf = checked_turf + break + sleep(10) + + if(found_turf) + if(user.loc != our_turf) + to_chat(user, "You need to stand still in order to phase through \the [hit_atom].") + return 0 + if(pay_energy(total_cost) && !user.incapacitated() ) + visible_message("[user] appears to phase through \the [hit_atom]!") + to_chat(user, "You find a destination on the other side of \the [hit_atom], and phase through it.") + spark(src, 5, 0) + user.forceMove(found_turf) + qdel(src) + return 1 + else + to_chat(user, "You don't have enough energy to phase through these walls!") + busy = 0 + else + to_chat(user, "You weren't able to find an open space to go to.") + busy = 0 diff --git a/code/game/gamemodes/technomancer/spells/phase_shift.dm b/code/game/gamemodes/technomancer/spells/phase_shift.dm new file mode 100644 index 00000000000..2afac756a7a --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/phase_shift.dm @@ -0,0 +1,69 @@ +/datum/technomancer/spell/phase_shift + name = "Phase Shift" + desc = "Hides you in the safest possible place, where no harm can come to you. Unfortunately, a prolonged stay inside the \ + rift you create will afflict you with instability." + cost = 50 + obj_path = /obj/item/spell/phase_shift + ability_icon_state = "tech_phaseshift" + category = DEFENSIVE_SPELLS + +/obj/item/spell/phase_shift + name = "phase shift" + desc = "Allows you to dodge your untimely fate by shifting your location somewhere else, so long as you can survive inside the \ + rift." + icon_state = "blink" + cast_methods = CAST_USE + aspect = ASPECT_TELE + +/obj/item/spell/phase_shift/Initialize() + . = ..() + set_light(3, 2, l_color = "#FA58F4") + +/obj/effect/phase_shift + name = "rift" + desc = "There was a maniac here a moment ago..." + icon = 'icons/obj/wizard.dmi' + icon_state = "rift" + +/obj/effect/phase_shift/ex_act() + return + +/obj/effect/phase_shift/Initialize(mapload, ...) + . = ..() + set_light(3, 5, l_color = "#FA58F4") + START_PROCESSING(SSprocessing, src) + +/obj/effect/phase_shift/Destroy() + for(var/atom/movable/AM in contents) //Eject everything out. + AM.forceMove(get_turf(src)) + STOP_PROCESSING(SSprocessing, src) + return ..() + +/obj/effect/phase_shift/process() + for(var/mob/living/L in contents) + L.adjust_instability(2) + if(L.stat == DEAD || L.stat == UNCONSCIOUS) + L.forceMove(get_turf(src)) + L.visible_message(SPAN_WARNING("\The [src] ejects [L]!")) + +/obj/effect/phase_shift/relaymove(mob/user as mob) + if(user.stat) + return + + to_chat(user, "You step out of the rift.") + user.forceMove(get_turf(src)) + qdel(src) + +/obj/item/spell/phase_shift/on_use_cast(mob/user) + if(isturf(user.loc)) //Check if we're not already in a rift. + if(pay_energy(2000)) + var/obj/effect/phase_shift/PS = new(get_turf(user)) + visible_message("[user] vanishes into a pink rift!") + to_chat(user, "You create an unstable rift, and go through it. Be sure to not stay too long.") + user.forceMove(PS) + adjust_instability(10) + qdel(src) + else + to_chat(user, "You don't have enough energy to make a rift!") + else //We're already in a rift or something like a closet. + to_chat(user, "Making a rift here would probably be a bad idea.") diff --git a/code/game/gamemodes/technomancer/spells/projectile/beam.dm b/code/game/gamemodes/technomancer/spells/projectile/beam.dm new file mode 100644 index 00000000000..06d2a36ed5e --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/projectile/beam.dm @@ -0,0 +1,28 @@ +/datum/technomancer/spell/beam + name = "Beam" + desc = "Fires a laser at your target. Cheap, reliable, and a bit boring." + spell_power_desc = "Increases damage dealt." + cost = 100 + ability_icon_state = "tech_beam" + obj_path = /obj/item/spell/projectile/beam + category = OFFENSIVE_SPELLS + +/obj/item/spell/projectile/beam + name = "beam" + icon_state = "beam" + desc = "Boring, but practical." + cast_methods = CAST_RANGED + aspect = ASPECT_LIGHT + spell_projectile = /obj/item/projectile/beam/techno + energy_cost_per_shot = 400 + instability_per_shot = 3 + cooldown = 10 + fire_sound = 'sound/weapons/laserstrong.ogg' + +/obj/item/projectile/beam/techno + damage = 35 + armor_penetration = 25 + + muzzle_type = /obj/effect/projectile/muzzle/solar + tracer_type = /obj/effect/projectile/tracer/solar + impact_type = /obj/effect/projectile/impact/solar diff --git a/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm new file mode 100644 index 00000000000..9bd65d3895e --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm @@ -0,0 +1,28 @@ +/datum/technomancer/spell/force_missile + name = "Force Missile" + desc = "This fires a missile at your target. It's cheap to use, however the projectile itself moves and impacts in such a way \ + that armor designed to protect from blunt force will mitigate this function as well." + spell_power_desc = "Increases damage dealt." + cost = 50 + ability_icon_state = "wiz_blink" + obj_path = /obj/item/spell/projectile/force_missile + category = OFFENSIVE_SPELLS + +/obj/item/spell/projectile/force_missile + name = "force missile" + icon_state = "force_missile" + desc = "Make it rain!" + cast_methods = CAST_RANGED + aspect = ASPECT_FORCE + spell_projectile = /obj/item/projectile/force_missile + energy_cost_per_shot = 300 + instability_per_shot = 2 + cooldown = 5 + fire_sound = 'sound/weapons/wave.ogg' + +/obj/item/projectile/force_missile + name = "force missile" + icon_state = "plasma_bolt" + damage = 25 + armor_penetration = 15 + damage_type = BRUTE diff --git a/code/game/gamemodes/technomancer/spells/projectile/ionic_bolt.dm b/code/game/gamemodes/technomancer/spells/projectile/ionic_bolt.dm new file mode 100644 index 00000000000..d40d76ac3d7 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/projectile/ionic_bolt.dm @@ -0,0 +1,21 @@ +/datum/technomancer/spell/ionic_bolt + name = "Ionic Bolt" + desc = "Shoots a bolt of ion energy at the target. If it hits something, it will generally drain energy, corrupt electronics, \ + or otherwise ruin complex machinery." + cost = 50 + ability_icon_state = "swarm_warp" + obj_path = /obj/item/spell/projectile/ionic_bolt + category = OFFENSIVE_SPELLS + +/obj/item/spell/projectile/ionic_bolt + name = "ionic bolt" + icon_state = "force_missile" + desc = "For those pesky security units." + cast_methods = CAST_RANGED + aspect = ASPECT_EMP + spell_projectile = /obj/item/projectile/ion + energy_cost_per_shot = 500 + instability_per_shot = 6 + cooldown = 10 + pre_shot_delay = 0 + fire_sound = 'sound/effects/supermatter.ogg' \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/projectile/lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm new file mode 100644 index 00000000000..a9252bf1091 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm @@ -0,0 +1,40 @@ +/datum/technomancer/spell/lightning + name = "Lightning Strike" + desc = "This uses a hidden electrolaser, which creates a laser beam to ionize the enviroment, allowing for ideal conditions \ + for a directed lightning strike to occur. The lightning is very strong, however it requires a few seconds to prepare a \ + strike. Lightning functions cannot miss due to distance." + cost = 150 + ability_icon_state = "tech_chain_lightning" + obj_path = /obj/item/spell/projectile/lightning + category = OFFENSIVE_SPELLS + +/obj/item/spell/projectile/lightning + name = "lightning strike" + icon_state = "lightning_strike" + desc = "Now you can feel like Zeus." + cast_methods = CAST_RANGED + aspect = ASPECT_SHOCK + spell_projectile = /obj/item/projectile/beam/lightning + energy_cost_per_shot = 2500 + instability_per_shot = 10 + cooldown = 20 + pre_shot_delay = 10 + fire_sound = 'sound/effects/psi/thunderstrike.ogg' + +/obj/item/projectile/beam/lightning + name = "lightning" + icon_state = "lightning" + damage = 40 + armor_penetration = 10 + damage_type = BURN + + muzzle_type = /obj/effect/projectile/muzzle/tesla + tracer_type = /obj/effect/projectile/tracer/tesla + impact_type = /obj/effect/projectile/impact/tesla + + var/power = 6000 + +/obj/item/projectile/beam/lightning/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0) + ..() + tesla_zap(target_mob, 3, power) + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/projectile/overload.dm b/code/game/gamemodes/technomancer/spells/projectile/overload.dm new file mode 100644 index 00000000000..08d71f62cc7 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/projectile/overload.dm @@ -0,0 +1,43 @@ +/datum/technomancer/spell/overload + name = "Overload" + desc = "Fires a bolt of highly unstable energy, that does damaged equal to 0.3% of the technomancer's current reserve of energy. \ + This energy pierces all known armor. Energy cost is equal to 10% of maximum core charge." + enhancement_desc = "Will do damage equal to 0.4% of current energy." + spell_power_desc = "Increases damage dealt, up to a cap of 80 damage per shot." + cost = 100 + obj_path = /obj/item/spell/projectile/overload + ability_icon_state = "tech_overload" + category = OFFENSIVE_SPELLS + +/obj/item/spell/projectile/overload + name = "overload" + icon_state = "overload" + desc = "Hope your Core's full." + cast_methods = CAST_RANGED + aspect = ASPECT_UNSTABLE + spell_projectile = /obj/item/projectile/overload + energy_cost_per_shot = 0 // Handled later + instability_per_shot = 12 + cooldown = 10 + pre_shot_delay = 4 + fire_sound = 'sound/effects/supermatter.ogg' + +/obj/item/projectile/overload + name = "overloaded bolt" + icon_state = "bluespace" + damage_type = BURN + armor_penetration = 100 + +/obj/item/spell/projectile/overload/make_projectile(obj/item/projectile/projectile_type, mob/living/user) + var/obj/item/projectile/overload/P = new projectile_type(get_turf(user)) + var/energy_before_firing = core.energy + if(check_for_scepter()) + P.damage = round(energy_before_firing * 0.004) // .4% of their current energy pool. + else + P.damage = round(energy_before_firing * 0.003) // .3% of their current energy pool. + P.damage = min(calculate_spell_power(P.damage), 80) + return P + +/obj/item/spell/projectile/overload/on_ranged_cast(atom/hit_atom, mob/living/user) + energy_cost_per_shot = round(core.max_energy * 0.10) + ..() diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm new file mode 100644 index 00000000000..219a359248e --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm @@ -0,0 +1,45 @@ +/obj/item/spell/projectile + name = "projectile template" + icon_state = "generic" + desc = "This is a generic template that shoots projectiles. If you can read this, the game broke!" + cast_methods = CAST_RANGED + var/obj/item/projectile/spell_projectile = null + var/energy_cost_per_shot = 0 + var/instability_per_shot = 0 + var/pre_shot_delay = 0 + var/fire_sound = null + +/obj/item/spell/projectile/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + on_ranged_cast(hit_atom, user, hit_atom) + +/obj/item/spell/projectile/on_ranged_cast(atom/hit_atom, mob/living/user, atom/pb_target) + if(set_up(hit_atom, user)) + var/obj/item/projectile/new_projectile = make_projectile(spell_projectile, user) + new_projectile.old_style_target(hit_atom) + new_projectile.fire(direct_target = pb_target) + log_and_message_admins("has casted [src] at \the [hit_atom].") + if(fire_sound) + playsound(src, fire_sound, 75, 1) + adjust_instability(instability_per_shot) + return 1 + return 0 + +/obj/item/spell/projectile/proc/make_projectile(obj/item/projectile/projectile_type, mob/living/user) + var/obj/item/projectile/P = new projectile_type(get_turf(user)) + P.damage = calculate_spell_power(P.damage) + return P + +/obj/item/spell/projectile/proc/set_up(atom/hit_atom, mob/living/user) + if(spell_projectile) + if(pay_energy(energy_cost_per_shot)) + if(pre_shot_delay) + var/image/target_image = image(icon = 'icons/obj/spells.dmi', loc = get_turf(hit_atom), icon_state = "target") + user << target_image + user.Stun(pre_shot_delay / 10) + sleep(pre_shot_delay) + qdel(target_image) + if(owner) + return TRUE + return FALSE // We got dropped before the firing occured. + return TRUE // No delay, no need to check. + return FALSE \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/radiance.dm b/code/game/gamemodes/technomancer/spells/radiance.dm new file mode 100644 index 00000000000..f6595f984fe --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/radiance.dm @@ -0,0 +1,54 @@ +/datum/technomancer/spell/radiance + name = "Radiance" + desc = "Causes you to be very radiant, glowing brightly in visible light, thermal energy, and deadly ionizing radiation. Note \ + that this WILL affect you." + enhancement_desc = "Radiation will not affect the caster or their allies." + spell_power_desc = "Spell power increases the amount of radiation and heat radiated, as well as the radius." + cost = 100 + ability_icon_state = "swarm_zeropoint" + obj_path = /obj/item/spell/radiance + category = OFFENSIVE_SPELLS + +/obj/item/spell/radiance + name = "radiance" + desc = "You will glow with a radiance similar to that of Supermatter." + icon_state = "radiance" + aspect = ASPECT_LIGHT + var/power = 250 + toggled = 1 + +/obj/item/spell/radiance/New() + ..() + set_light(7, 4, l_color = "#D9D900") + START_PROCESSING(SSprocessing, src) + log_and_message_admins("has casted [src].") + +/obj/item/spell/radiance/Destroy() + STOP_PROCESSING(SSprocessing, src) + log_and_message_admins("has stopped maintaining [src].") + return ..() + +/obj/item/spell/radiance/process() + var/turf/T = get_turf(src) + var/datum/gas_mixture/removed = null + var/datum/gas_mixture/env = null + var/adjusted_power = calculate_spell_power(power) + + if(!istype(T, /turf/space)) + env = T.return_air() + removed = env.remove(0.25 * env.total_moles) //Remove gas from surrounding area + + var/thermal_power = 300 * adjusted_power + + removed.add_thermal_energy(thermal_power) + removed.temperature = between(0, removed.temperature, 10000) + + env.merge(removed) + + for(var/mob/living/L in range(T, round(sqrt(adjusted_power / 2)))) + if(check_for_scepter() && is_ally(L)) + continue + var/radius = max(get_dist(L, src), 1) + var/rads = (adjusted_power / 10) * ( 1 / (radius**2) ) + L.apply_effect(rads, IRRADIATE) + adjust_instability(2) diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm new file mode 100644 index 00000000000..b713c02ca63 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/reflect.dm @@ -0,0 +1,89 @@ +/datum/technomancer/spell/reflect + name = "Reflect" + desc = "Emits a protective shield fron your hand in front of you, which will reflect one attack back at the attacker." + cost = 100 + obj_path = /obj/item/spell/reflect + ability_icon_state = "tech_reflect" + category = DEFENSIVE_SPELLS + +/obj/item/spell/reflect + name = "\proper reflect shield" + icon_state = "reflect" + desc = "A very protective combat shield that'll reflect the next attack at the unfortunate person who tried to shoot you." + aspect = ASPECT_FORCE + toggled = 1 + var/reflecting = 0 + var/damage_to_energy_multiplier = 60.0 //Determines how much energy to charge for blocking, e.g. 20 damage attack = 1200 energy cost + +/obj/item/spell/reflect/Initialize() + . = ..() + set_light(3, 2, l_color = "#006AFF") + to_chat(owner, "Your shield will expire in 5 seconds!") + QDEL_IN(src, 5 SECONDS) + +/obj/item/spell/reflect/Destroy() + if(owner) + to_chat(owner, "Your shield expires!") + return ..() + +/obj/item/spell/reflect/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(user.incapacitated()) + return FALSE + + var/damage_to_energy_cost = (damage_to_energy_multiplier * damage) + + if(!pay_energy(damage_to_energy_cost)) + to_chat(owner, "Your shield fades due to lack of energy!") + qdel(src) + return FALSE + + //block as long as they are not directly behind us + var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block + if(check_shield_arc(user, bad_arc, damage_source, attacker)) + + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + + if(P.starting && !P.reflected) + visible_message("\The [user]'s [src.name] reflects [attack_text]!") + + var/turf/curloc = get_turf(user) + + // redirect the projectile + P.redirect(P.starting.x, P.starting.y, curloc, user) + P.reflected = 1 + if(check_for_scepter()) + P.damage = P.damage * 1.5 + + spark(src, 5, 0) + playsound(src, 'sound/weapons/blade.ogg', 50, 1) + // now send a log so that admins don't think they're shooting themselves on purpose. + log_and_message_admins("[user] reflected [attacker]'s attack back at them.") + + if(!reflecting) + reflecting = 1 + spawn(2 SECONDS) //To ensure that most or all of a burst fire cycle is reflected. + to_chat(owner, "Your shield fades due being used up!") + qdel(src) + + return PROJECTILE_CONTINUE // complete projectile permutation + + else if(istype(damage_source, /obj/item)) + var/obj/item/W = damage_source + if(attacker) + W.attack(attacker) + to_chat(attacker, "Your [damage_source.name] goes through \the [src] in one location, comes out \ + on the same side, and hits you!") + + spark(src, 5, cardinal) + playsound(src, 'sound/weapons/blade.ogg', 50, 1) + + log_and_message_admins("[user] reflected [attacker]'s attack back at them.") + + if(!reflecting) + reflecting = 1 + spawn(2 SECONDS) //To ensure that most or all of a burst fire cycle is reflected. + to_chat(owner, "Your shield fades due being used up!") + qdel(src) + return PROJECTILE_STOPPED + return FALSE \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/resurrect.dm b/code/game/gamemodes/technomancer/spells/resurrect.dm new file mode 100644 index 00000000000..af266741239 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/resurrect.dm @@ -0,0 +1,62 @@ +/datum/technomancer/spell/resurrect + name = "Resurrect" + desc = "This function injects various regenetive medical compounds and nanomachines, in an effort to restart the body, \ + however this must be done soon after they die, as this will have no effect on people who have died long ago. It also doesn't \ + resolve whatever caused them to die originally." + cost = 100 + obj_path = /obj/item/spell/resurrect + ability_icon_state = "tech_resurrect" + category = SUPPORT_SPELLS + +/obj/item/spell/resurrect + name = "resurrect" + icon_state = "radiance" + desc = "Perhaps this can save a trip to cloning?" + cast_methods = CAST_MELEE + aspect = ASPECT_BIOMED + +/obj/item/spell/resurrect/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom + if(L == user) + to_chat(user, "Clever as you may seem, this won't work on yourself while alive.") + return 0 + if(L.stat != DEAD) + to_chat(user, "\The [L] isn't dead!") + return 0 + if(pay_energy(5000)) + if(L.tod > world.time + 30 MINUTES) + to_chat(user, "\The [L]'s been dead for too long, even this function cannot replace cloning at this point.") + return 0 + to_chat(user, "You stab \the [L] with a hidden integrated hypo, attempting to bring them back...") + if(istype(L, /mob/living/simple_animal)) + var/mob/living/simple_animal/SM = L + SM.rejuvenate() + SM.health = SM.getMaxHealth() / 3 + adjust_instability(15) + else if(ishuman(L)) + var/mob/living/carbon/human/H = L + + if(!H.client && H.mind) //Don't force the dead person to come back if they don't want to. + for(var/mob/abstract/observer/ghost in player_list) + if(ghost.mind == H.mind) + sound_to(ghost, 'sound/effects/psi/power_feedback.ogg') + to_chat(ghost, "The Technomancer [user.real_name] is trying to revive you. Re-enter your body if you want to be revived!") + break + + H.adjustBruteLoss(-40) + H.adjustFireLoss(-40) + + sleep(10 SECONDS) + if(H.client) + L.stat = CONSCIOUS //Note that if whatever killed them in the first place wasn't fixed, they're likely to die again. + dead_mob_list -= H + living_mob_list += H + H.timeofdeath = null + visible_message("\The [H]'s eyes open!") + to_chat(user, "It's alive!") + adjust_instability(50) + log_and_message_admins("has resurrected [H].") + else + to_chat(user, "The body of \the [H] doesn't seem to respond, perhaps you could try again?") + adjust_instability(10) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/shared_burden.dm b/code/game/gamemodes/technomancer/spells/shared_burden.dm new file mode 100644 index 00000000000..5fb94651610 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/shared_burden.dm @@ -0,0 +1,30 @@ +/datum/technomancer/spell/shared_burden + name = "Shared Burden" + desc = "One of the few functions able to adjust instability, this allows you to take someone else's instability." + spell_power_desc = "Draws bonus instability from the target, with the bonus dissipating harmlessly, for 'free'." + cost = 50 + ability_icon_state = "ling_recursive_enhancement" + obj_path = /obj/item/spell/shared_burden + category = SUPPORT_SPELLS + +/obj/item/spell/shared_burden + name = "shared burden" + icon_state = "shared_burden" + desc = "Send instability from the target to you, for whatever reason you'd want to." + cast_methods = CAST_MELEE + aspect = ASPECT_UNSTABLE + +/obj/item/spell/shared_burden/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + if(ishuman(hit_atom) && within_range(hit_atom)) + var/mob/living/carbon/human/H = hit_atom + if(H == user) + to_chat(user, "Draining instability out of you to put it back seems a bit pointless.") + return 0 + if(H.instability <= 0) + to_chat(user, "\The [H] has no instability to drain.") + return 0 + if(pay_energy(500)) + var/instability_to_drain = min(H.instability, 25) + to_chat(user, "You draw instability away from \the [H] and towards you.") + adjust_instability(instability_to_drain) + H.adjust_instability(-calculate_spell_power(instability_to_drain)) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm new file mode 100644 index 00000000000..31a253a9e75 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/shield.dm @@ -0,0 +1,54 @@ +/datum/technomancer/spell/shield + name = "Shield" + desc = "Emits a protective shield fron your hand in front of you, which will protect you from almost anything able to harm \ + you, so long as you can power it. Stronger attacks blocked cost more energy to sustain. \ + Note that holding two shields will make blocking more energy efficent." + enhancement_desc = "Blocking is twice as efficent in terms of energy cost per hit." + cost = 100 + obj_path = /obj/item/spell/shield + ability_icon_state = "tech_shield" + category = DEFENSIVE_SPELLS + +/obj/item/spell/shield + name = "\proper energy shield" + icon_state = "shield" + desc = "A very protective combat shield that'll stop almost anything from hitting you, at least from the front." + aspect = ASPECT_FORCE + toggled = 1 + var/damage_to_energy_multiplier = 30.0 //Determines how much energy to charge for blocking, e.g. 20 damage attack = 600 energy cost + +/obj/item/spell/shield/Initialize() + . = ..() + set_light(3, 2, l_color = "#006AFF") + +/obj/item/spell/shield/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(user.incapacitated()) + return FALSE + + var/damage_to_energy_cost = damage_to_energy_multiplier * damage + + if(issmall(user)) // Smaller shields are more efficent. + damage_to_energy_cost *= 0.75 + + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + if(istype(H.get_other_hand(src), src.type)) // Two shields in both hands. + damage_to_energy_cost *= 0.75 + + else if(check_for_scepter()) + damage_to_energy_cost *= 0.50 + + if(!pay_energy(damage_to_energy_cost)) + to_chat(owner, "Your shield fades due to lack of energy!") + qdel(src) + return FALSE + + //block as long as they are not directly behind us + var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block + if(check_shield_arc(user, bad_arc, damage_source, attacker)) + user.visible_message("\The [user]'s [src] blocks [attack_text]!") + spark(src, 3, cardinal) + playsound(src, 'sound/weapons/blade.ogg', 50, 1) + adjust_instability(2) + return PROJECTILE_STOPPED + return FALSE \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm new file mode 100644 index 00000000000..59bb4e5f9fb --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm @@ -0,0 +1,31 @@ +/datum/technomancer/spell/darkness + name = "Darkness" + desc = "Disrupts photons moving in a local area, causing darkness to shroud yourself or a position of your choosing." + cost = 25 + ability_icon_state = "artificer" + obj_path = /obj/item/spell/spawner/darkness + category = UTILITY_SPELLS + +/obj/item/spell/spawner/darkness + name = "darkness" + desc = "Not even light can stand in your way now." + icon_state = "darkness" + cast_methods = CAST_RANGED + aspect = ASPECT_DARK + spawner_type = /obj/effect/temporary_effect/darkness + +/obj/item/spell/spawner/darkness/on_ranged_cast(atom/hit_atom, mob/user) + if(pay_energy(500)) + adjust_instability(4) + ..() + +/obj/item/spell/spawner/darkness/New() + ..() + set_light(6, -20, l_color = "#FFFFFF") + +/obj/effect/temporary_effect/darkness + name = "darkness" + time_to_die = 2 MINUTES + invisibility = 101 + light_range = 6 + light_power = -20 \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/spawner/destablize.dm b/code/game/gamemodes/technomancer/spells/spawner/destablize.dm new file mode 100644 index 00000000000..33b8c4b69eb --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/spawner/destablize.dm @@ -0,0 +1,54 @@ +/datum/technomancer/spell/destabilize + name = "Destabilize" + desc = "Creates an unstable disturbance at the targeted tile, which will afflict anyone nearby with instability who remains nearby. This can affect you \ + and your allies as well. The disturbance lasts for twenty seconds." + cost = 100 + ability_icon_state = "wiz_shield" + obj_path = /obj/item/spell/spawner/destabilize + category = OFFENSIVE_SPELLS + +/obj/item/spell/spawner/destabilize + name = "Destabilize" + desc = "Now your enemies can feel what you go through when you have too much fun." + icon_state = "destabilize" + cast_methods = CAST_RANGED + aspect = ASPECT_UNSTABLE + spawner_type = /obj/effect/temporary_effect/destabilize + +/obj/item/spell/spawner/destabilize/New() + ..() + set_light(3, 2, l_color = "#C26DDE") + +/obj/item/spell/spawner/destabilize/on_ranged_cast(atom/hit_atom, mob/user) + if(within_range(hit_atom) && pay_energy(2000)) + adjust_instability(15) + ..() + +/obj/effect/temporary_effect/destabilize + name = "destablizing disturbance" + desc = "This can't be good..." + icon_state = "blueshatter" + time_to_die = null + light_range = 6 + light_power = 20 + light_color = "#C26DDE" + var/pulses_remaining = 40 // Lasts 20 seconds. + var/instability_power = 5 + var/instability_range = 6 + +/obj/effect/temporary_effect/destabilize/Initialize() + . = ..() + radiate_loop() + +/obj/effect/temporary_effect/destabilize/proc/radiate_loop() + set waitfor = FALSE + + while(pulses_remaining) + sleep(5) + for(var/mob/living/L in range(src, instability_range) ) + var/radius = max(get_dist(L, src), 1) + // Being farther away lessens the amount of instabity received. + var/outgoing_instability = instability_power * ( 1 / (radius**2) ) + L.receive_radiated_instability(outgoing_instability) + pulses_remaining-- + qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm new file mode 100644 index 00000000000..ff8fe1efd31 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm @@ -0,0 +1,41 @@ +/datum/technomancer/spell/fire_blast + name = "Fire Blast" + desc = "Causes a disturbance on a targeted tile. After two and a half seconds, it will explode in a small radius around it. Be \ + sure to not be close to the disturbance yourself." + cost = 175 + ability_icon_state = "wiz_fireball" + obj_path = /obj/item/spell/spawner/fire_blast + category = OFFENSIVE_SPELLS + +/obj/item/spell/spawner/fire_blast + name = "fire blast" + desc = "Leading your booms might be needed." + icon_state = "fire_blast" + cast_methods = CAST_RANGED + aspect = ASPECT_FIRE + spawner_type = /obj/effect/temporary_effect/fire_blast + +/obj/item/spell/spawner/fire_blast/on_ranged_cast(atom/hit_atom, mob/user) + if(within_range(hit_atom) && pay_energy(2000)) + adjust_instability(12) + ..() // Makes the booms happen. + +/obj/effect/temporary_effect/fire_blast + name = "fire blast" + desc = "Run!" + icon_state = "at_shield1" + time_to_die = 2.5 SECONDS // After which we go boom. + light_range = 4 + light_power = 5 + light_color = "#FF6A00" + +/obj/effect/temporary_effect/fire_blast/Destroy() + for(var/mob/living/M in oview(src, 2)) + M.adjustFireLoss(30) + M.IgniteMob(2) + var/explosion_ogg = pick('sound/effects/Explosion1.ogg', 'sound/effects/Explosion2.ogg') + playsound(get_turf(src), explosion_ogg, 75) + var/datum/effect/system/explosion/E = new /datum/effect/system/explosion() + E.set_up(get_turf(src)) + E.start() + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm new file mode 100644 index 00000000000..cb0837fa510 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm @@ -0,0 +1,73 @@ +/datum/technomancer/spell/pulsar + name = "Pulsar" + desc = "Emits electronic pulses to destroy, disable, or otherwise harm devices and machines. Be sure to not hit yourself with this." + cost = 100 + ability_icon_state = "wiz_tech" + obj_path = /obj/item/spell/spawner/pulsar + category = OFFENSIVE_SPELLS + +/obj/item/spell/spawner/pulsar + name = "pulsar" + desc = "Be sure to not hit yourself!" + icon_state = "radiance" + cast_methods = CAST_RANGED | CAST_THROW + aspect = ASPECT_EMP + spawner_type = /obj/effect/temporary_effect/pulse/pulsar + +/obj/item/spell/spawner/pulsar/New() + ..() + set_light(3, 2, l_color = "#2ECCFA") + +/obj/item/spell/spawner/pulsar/on_ranged_cast(atom/hit_atom, mob/user) + if(within_range(hit_atom) && pay_energy(4000)) + adjust_instability(8) + ..() + +/obj/item/spell/spawner/pulsar/on_throw_cast(atom/hit_atom, mob/user) + empulse(hit_atom, 1, 1, 1, 1, log=1) + +// Does something every so often. Deletes itself when pulses_remaining hits zero. +/obj/effect/temporary_effect/pulse + var/pulses_remaining = 3 + var/pulse_delay = 2 SECONDS + +/obj/effect/temporary_effect/pulse/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/temporary_effect/pulse/LateInitialize() + pulse_loop() + +/obj/effect/temporary_effect/pulse/proc/pulse_loop() + set waitfor = FALSE + + while(pulses_remaining) + sleep(pulse_delay) + on_pulse() + pulses_remaining-- + qdel(src) + +// Override for specific effects. +/obj/effect/temporary_effect/pulse/proc/on_pulse() + + + +/obj/effect/temporary_effect/pulse/pulsar + name = "pulsar" + desc = "Not a real pulsar, but still emits loads of EMP." + icon_state = "shield2" + time_to_die = null + light_range = 4 + light_power = 5 + light_color = "#2ECCFA" + pulses_remaining = 3 + +/obj/effect/temporary_effect/pulse/pulsar/on_pulse() + empulse(src, 1, 1, 2, 2, log = 1) + + + + + + + diff --git a/code/game/gamemodes/technomancer/spells/spawner/spawner.dm b/code/game/gamemodes/technomancer/spells/spawner/spawner.dm new file mode 100644 index 00000000000..47c2a264ade --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/spawner/spawner.dm @@ -0,0 +1,15 @@ +/obj/item/spell/spawner + name = "spawner template" + desc = "If you see me, someone messed up." + icon_state = "darkness" + cast_methods = CAST_RANGED + aspect = null + var/obj/effect/spawner_type = null + +/obj/item/spell/spawner/on_ranged_cast(atom/hit_atom, mob/user) + var/turf/T = get_turf(hit_atom) + if(T) + new spawner_type(T) + to_chat(user, "You shift \the [src] onto \the [T].") + log_and_message_admins("has casted [src] at [T.x],[T.y],[T.z].") + qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/summon/summon.dm b/code/game/gamemodes/technomancer/spells/summon/summon.dm new file mode 100644 index 00000000000..bd86a735a57 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/summon/summon.dm @@ -0,0 +1,40 @@ +/mob/living/ + var/summoned = 0 + +/obj/item/spell/summon + name = "summon template" + desc = "Chitter chitter." + cast_methods = CAST_RANGED | CAST_USE + aspect = ASPECT_TELE + var/mob/living/summoned_mob_type = null // The type to use when making new mobs when summoned. + var/list/summon_options = list() + var/energy_cost = 0 + var/instability_cost = 0 + +/obj/item/spell/summon/on_ranged_cast(atom/hit_atom, mob/living/user) + var/turf/T = get_turf(hit_atom) + if(summoned_mob_type && core.summoned_mobs.len < core.max_summons && within_range(hit_atom) && pay_energy(energy_cost)) + var/obj/effect/E = new(T) + E.icon = 'icons/obj/objects.dmi' + E.icon_state = "anom" + sleep(5 SECONDS) + qdel(E) + if(owner) // We might've been dropped. + var/mob/living/L = new summoned_mob_type(T) + core.summoned_mobs |= L + L.summoned = 1 + on_summon(L) + to_chat(user, "You've successfully teleported \a [L] to you!") + visible_message("\A [L] appears from no-where!") + log_and_message_admins("has summoned \a [L] at [T.x],[T.y],[T.z].") + user.adjust_instability(instability_cost) + +/obj/item/spell/summon/on_use_cast(mob/living/user) + if(summon_options.len) + var/choice = input(user, "Choose a creature to kidnap from somewhere!", "Summon") as null|anything in summon_options + if(choice) + summoned_mob_type = summon_options[choice] + +// Called when a new mob is summoned, override for special behaviour. +/obj/item/spell/summon/proc/on_summon(var/mob/living/summoned) + return \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm new file mode 100644 index 00000000000..07abaed7c6b --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm @@ -0,0 +1,59 @@ +/datum/technomancer/spell/summon_creature + name = "Summon Creature" + desc = "Teleports a specific creature from their current location in the universe to the targeted tile, \ + after a delay. The creature summoned can be chosen by using the ability in your hand. \ + Available creatures are; mice, crabs, parrots, bats, goats, cats, corgis, spiders, and space carp. \ + The creatures take a few moments to be teleported to the targeted tile. Note that the creatures summoned are \ + not inherently loyal to the technomancer, and that the creatures will be hurt slightly from being teleported to you." + enhancement_desc = "Summoned entities will never harm their summoner." + spell_power_desc = "The strength and endurance of the summoned creature will be greater." + cost = 100 + ability_icon_state = "wiz_carp" + obj_path = /obj/item/spell/summon/summon_creature + category = UTILITY_SPELLS + +/obj/item/spell/summon/summon_creature + name = "summon creature" + desc = "Chitter chitter." + summoned_mob_type = null + summon_options = list( + "Rat" = /mob/living/simple_animal/rat, + "Lizard" = /mob/living/simple_animal/lizard, + "Chicken" = /mob/living/simple_animal/chicken, + "Chick" = /mob/living/simple_animal/chick, + "Crab" = /mob/living/simple_animal/crab, + "Parrot" = /mob/living/simple_animal/parrot, + "Goat" = /mob/living/simple_animal/hostile/retaliate/goat, + "Cat" = /mob/living/simple_animal/cat, + "Corgi" = /mob/living/simple_animal/corgi, + "Corgi Pup" = /mob/living/simple_animal/corgi/puppy, + "BAT" = /mob/living/simple_animal/hostile/scarybat, + "GREIMORIAN" = /mob/living/simple_animal/hostile/giant_spider, + "GREIMORIAN HUNTER" = /mob/living/simple_animal/hostile/giant_spider/hunter, + "GREIMORIAN NURSE" = /mob/living/simple_animal/hostile/giant_spider/nurse, + "CARP" = /mob/living/simple_animal/hostile/carp, + "BEAR" = /mob/living/simple_animal/hostile/bear + ) + cooldown = 30 + instability_cost = 10 + energy_cost = 1000 + +/obj/item/spell/summon/summon_creature/on_summon(var/mob/living/simple_animal/summoned) + if(check_for_scepter()) + if(istype(summoned, /mob/living/simple_animal/hostile)) + var/mob/living/simple_animal/hostile/H = summoned + H.friends += owner + + // Makes their new pal big and strong, if they have spell power. + summoned.maxHealth = calculate_spell_power(summoned.maxHealth) + summoned.health = calculate_spell_power(summoned.health) + summoned.melee_damage_lower = calculate_spell_power(summoned.melee_damage_lower) + summoned.melee_damage_upper = calculate_spell_power(summoned.melee_damage_upper) + + var/new_size = calculate_spell_power(1) + if(new_size != 1) + adjust_scale(new_size) + + + // Now we hurt their new pal, because being forcefully abducted by teleportation can't be healthy. + summoned.adjustBruteLoss(summoned.getMaxHealth() * 0.3) // Lose 30% of max health on arrival (but could be healed back up). \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/targeting_matrix.dm b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm new file mode 100644 index 00000000000..4ead252ceb1 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm @@ -0,0 +1,36 @@ +/datum/technomancer/spell/targeting_matrix + name = "Targeting Matrix" + desc = "Automatically targets and fires a ranged weapon or function at a non-friendly target near a targeted tile. \ + Each target assisted attack costs some energy and instability." + cost = 50 + ability_icon_state = "tech_targetingmatrix" + obj_path = /obj/item/spell/targeting_matrix + category = UTILITY_SPELLS + +/obj/item/spell/targeting_matrix + name = "targeting matrix" + desc = "Aiming is too much effort for you." + icon_state = "targeting_matrix" + cast_methods = CAST_RANGED + aspect = ASPECT_FORCE //idk? + +/obj/item/spell/targeting_matrix/on_ranged_cast(atom/hit_atom, mob/user) + var/turf/T = get_turf(hit_atom) + if(T) + var/mob/living/chosen_target = targeting_assist(T,5) //The person who's about to get attacked. + + if(!chosen_target) + return 0 + + var/obj/item/I = user.get_inactive_hand() + if(I && pay_energy(200)) + var/prox = user.Adjacent(chosen_target) + if(prox) // Needed or else they can attack with melee from afar. + I.attack(chosen_target,owner) + I.afterattack(chosen_target,owner, prox) + adjust_instability(2) + + var/image/target_image = image(icon = 'icons/obj/spells.dmi', loc = get_turf(chosen_target), icon_state = "target") + user << target_image + sleep(5) + qdel(target_image) diff --git a/code/game/gamemodes/technomancer/spells/track.dm b/code/game/gamemodes/technomancer/spells/track.dm new file mode 100644 index 00000000000..ac284da18bd --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/track.dm @@ -0,0 +1,78 @@ +/datum/technomancer/spell/track + name = "Track" + desc = "Acts as directional guidance towards an object that belongs to you or your team. It can also point towards your allies. \ + Wonderful if you're worried someone will steal your valuables, like a certain shiny Scepter..." + enhancement_desc = "You will be able to track most other entities in addition to your belongings and allies." + cost = 25 + obj_path = /obj/item/spell/track + ability_icon_state = "tech_track" + category = UTILITY_SPELLS + +// This stores a ref to all important items that belong to a Technomancer, in case of theft. Used by the spell below. +// I feel dirty for adding yet another global list used by one thing, but the only alternative is to loop through world, and yeahhh. +var/list/technomancer_belongings = list() + +/obj/item/spell/track + name = "track" + icon_state = "track" + desc = "Never lose your stuff again!" + cast_methods = CAST_USE + aspect = ASPECT_TELE + var/atom/movable/tracked = null // The thing to point towards. + var/tracking = 0 // If one, points towards tracked. + +/obj/item/spell/track/Destroy() + tracked = null + tracking = 0 + return ..() + +/obj/item/spell/track/on_use_cast(mob/user) + if(tracking) + tracking = 0 + to_chat(user, "You stop tracking for \the [tracked]'s whereabouts.") + tracked = null + return + + var/can_track_non_allies = 0 + var/list/object_choices = technomancer_belongings.Copy() + if(check_for_scepter()) + can_track_non_allies = 1 + var/list/mob_choices = list() + for(var/mob/living/L in mob_list) + if(!is_ally(L) && !can_track_non_allies) + continue + if(L == user) + continue + mob_choices += L + var/choice = input(user,"Decide what or who to track.","Tracking") as null|anything in object_choices + mob_choices + if(choice) + tracked = choice + tracking = 1 + track() + +/obj/item/spell/track/proc/track() + if(!tracking) + icon_state = "track" + return + + if(!tracked) + icon_state = "track_unknown" + + if(tracked.z != owner.z) + icon_state = "track_unknown" + + else + set_dir(get_dir(src,get_turf(tracked))) + + switch(get_dist(src,get_turf(tracked))) + if(0) + icon_state = "track_direct" + if(1 to 8) + icon_state = "track_close" + if(9 to 16) + icon_state = "track_medium" + if(16 to INFINITY) + icon_state = "track_far" + + spawn(5) + .() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm new file mode 100644 index 00000000000..a717a4b0a42 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm @@ -0,0 +1,73 @@ +/datum/technomancer/spell/warp_strike + name = "Warp Strike" + desc = "Teleports you next to your target, and attacks them with whatever is in your off-hand, spell or object." + cost = 100 + obj_path = /obj/item/spell/warp_strike + ability_icon_state = "tech_warpstrike" + category = OFFENSIVE_SPELLS + +/obj/item/spell/warp_strike + name = "warp strike" + desc = "The answer to the problem of bringing a knife to a gun fight." + icon_state = "warp_strike" + cast_methods = CAST_RANGED + aspect = ASPECT_TELE + +/obj/item/spell/warp_strike/on_ranged_cast(atom/hit_atom, mob/user) + var/turf/T = get_turf(hit_atom) + if(T) + if(!within_range(T)) + return + //First, we handle who to teleport to. + user.setClickCooldown(5) + var/mob/living/chosen_target = targeting_assist(T,5) //The person who's about to get attacked. + + if(!chosen_target) + return 0 + + //Now we handle picking a place for the user to teleport to. + var/list/tele_target_candidates = view(get_turf(chosen_target), 1) + var/list/valid_tele_targets = list() + var/turf/tele_target = null + for(var/turf/checked_turf in tele_target_candidates) + if(!checked_turf.check_density()) + valid_tele_targets.Add(checked_turf) + + tele_target = pick(valid_tele_targets) + + //Pay for our teleport. + if(!pay_energy(2000) || !tele_target) + return 0 + + //Teleporting time. + user.forceMove(tele_target) + var/new_dir = get_dir(user, chosen_target) + user.dir = new_dir + spark(src, 5, 0) + adjust_instability(12) + + //Finally, we handle striking the victim with whatever's in the user's offhand. + var/obj/item/I = user.get_inactive_hand() + // List of items we don't want used, for balance reasons or to avoid infinite loops. + var/list/blacklisted_items = list( + /obj/item/gun, + /obj/item/spell/warp_strike, + /obj/item/spell/targeting_matrix + ) + if(I) + + if(is_path_in_list(I.type, blacklisted_items)) + to_chat(user, "You can't use \the [I] while warping!") + return + + if(istype(I, /obj/item)) + var/obj/item/W = I + W.attack(chosen_target, user) + W.afterattack(chosen_target, user) + else + I.attack(chosen_target, user) + I.afterattack(chosen_target, user) + else + chosen_target.attack_hand(user) + log_and_message_admins("has warp striked [chosen_target].") + diff --git a/code/game/gamemodes/technomancer/technomancer.dm b/code/game/gamemodes/technomancer/technomancer.dm new file mode 100644 index 00000000000..f718f133b7a --- /dev/null +++ b/code/game/gamemodes/technomancer/technomancer.dm @@ -0,0 +1,13 @@ +/datum/game_mode/technomancer + name = "Technomancer" + round_description = "An entity possessing advanced, unknown technology is onboard, who is capable of accomplishing amazing feats." + extended_round_description = "A powerful entity capable of manipulating space around them, has arrived the station. \ + They have a wide variety of powers and functions available to them that makes your own simple moral self tremble with \ + fear and excitement. Ultimately, their purpose is unknown. However, it is up to you and your crew to decide if \ + their powers can be used for good or if their arrival foreshadows the destruction of the entire colony, or worse." + config_tag = "technomancer" + votable = 1 + required_players = 5 + required_enemies = 1 + end_on_antag_death = 0 + antag_tags = list(MODE_TECHNOMANCER) \ No newline at end of file diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index d8a5674f4da..0eb80c3bde8 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -382,6 +382,9 @@ if(!vampire) return + if(isAdminLevel(src.z)) + return + if(pulledby) if(pulledby.pulling == src) pulledby.pulling = null @@ -427,7 +430,7 @@ /obj/effect/dummy/veil_walk/proc/eject_all() for(var/atom/movable/A in src) - A.forceMove(loc) + A.forceMove(last_valid_turf) if(ismob(A)) var/mob/M = A M.reset_view(null) @@ -616,14 +619,29 @@ if(E.status & ORGAN_ARTERY_CUT) E.status &= ~ORGAN_ARTERY_CUT blood_used += 2 - if(E.status & ORGAN_TENDON_CUT) - E.status &= ~ORGAN_TENDON_CUT + if((E.tendon_status() & TENDON_CUT) && E.tendon.can_recover()) + E.tendon.rejuvenate() blood_used += 2 if(E.status & ORGAN_BROKEN) E.status &= ~ORGAN_BROKEN E.stage = 0 blood_used += 3 healed = TRUE + if(E.germ_level > 0) + if(E.is_infected()) + E.germ_level = max(0, E.germ_level - 50) + blood_used += 1 + else + E.germ_level = 0 + blood_used += 0.25 + for(var/datum/wound/W in E.wounds) + if(W.germ_level > 0) + W.germ_level = max(0, W.germ_level - 50) + blood_used += 0.5 + if(!W.disinfected) + W.disinfect() + blood_used += 1 + if(healed) break diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm deleted file mode 100644 index ed85f696d43..00000000000 --- a/code/game/gamemodes/wizard/wizard.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/game_mode/wizard - name = "Wizard" - round_description = "There is a SPACE WIZARD on the station. You can't let the magician achieve their objectives!" - extended_round_description = "A powerful entity capable of manipulating the elements around him, most commonly referred to as a 'wizard', has infiltrated the station. They have a wide variety of powers and spells available to them that makes your own simple moral self tremble with fear and excitement. Ultimately, their purpose is unknown. However, it is up to you and your crew to decide if their powers can be used for good or if their arrival foreshadows the destruction of the entire station." - config_tag = "wizard" - required_players = 3 - max_players = 20 - required_enemies = 1 - end_on_antag_death = 1 - antag_tags = list(MODE_WIZARD) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 22c1279793f..28fa4444d60 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -43,9 +43,9 @@ /proc/get_centcom_access(job) switch(job) if("SCC Agent", "SCC Executive", "SCC Bodyguard") - return list(access_cent_general, access_cent_captain, access_cent_living) + return list(access_cent_general, access_cent_ccia, access_cent_specops) if("CCIA Agent") - return list(access_cent_general, access_cent_captain, access_cent_living) + return list(access_cent_general, access_cent_ccia, access_cent_specops) if("Emergency Response Team") return list(access_cent_general, access_cent_specops, access_cent_living) if("Odin Security") @@ -55,11 +55,11 @@ if("Service") return list(access_cent_general, access_cent_living) if("Death Commando") - return list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage) - if("NanoTrasen Representative") - return list(access_cent_general, access_cent_living, access_cent_storage, access_cent_thunder, access_cent_medical, access_cent_specops, access_cent_teleporter) + return list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage, access_cent_medical) if("BlackOps Commander") return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage, access_cent_creed) + if("NanoTrasen Representative") //Adminspawn roles + return get_all_centcom_access() if("Supreme Commander") return get_all_centcom_access() diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 02e11cd44e3..8b13d328b40 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -426,57 +426,62 @@ var/const/access_consular = 72 /****************** * Central Command * ******************/ -/var/const/access_cent_general = 101//General facilities. +//General facilities. - Everyone on central has that --> Use this for doors that every central role should have access to, but not the aurora people +/var/const/access_cent_general = 101 /datum/access/cent_general id = access_cent_general desc = "Code Grey" access_type = ACCESS_TYPE_CENTCOM -/var/const/access_cent_thunder = 102//Thunderdome. +//Thunderdome. +/var/const/access_cent_thunder = 102 /datum/access/cent_thunder id = access_cent_thunder desc = "Code Yellow" access_type = ACCESS_TYPE_CENTCOM -/var/const/access_cent_specops = 103//Special Ops. +//Centcom Security - This access is used by the ERT / Odin Security and CCIA +// Separation between Odin Sec/CCIA and ERT is achieved via the ERT Commander Access (access_cent_creed) +/var/const/access_cent_specops = 103 /datum/access/cent_specops id = access_cent_specops desc = "Code Black" access_type = ACCESS_TYPE_CENTCOM -/var/const/access_cent_medical = 104//Medical/Research +//Medical/Research - Thats the access for the medical section. Used for the odin doctors/chemists +/var/const/access_cent_medical = 104 /datum/access/cent_medical id = access_cent_medical desc = "Code White" access_type = ACCESS_TYPE_CENTCOM -/var/const/access_cent_living = 105//Living quarters. +//Living quarters. - Thats the accesse used by the odin bartenders/chefs +/var/const/access_cent_living = 105 /datum/access/cent_living id = access_cent_living desc = "Code Green" access_type = ACCESS_TYPE_CENTCOM -/var/const/access_cent_storage = 106//Generic storage areas. +//Generic storage areas. - Thats used for the Maint Tunnels on Centcom +/var/const/access_cent_storage = 106 /datum/access/cent_storage id = access_cent_storage desc = "Code Orange" access_type = ACCESS_TYPE_CENTCOM -/var/const/access_cent_teleporter = 107//Teleporter. -/datum/access/cent_teleporter - id = access_cent_teleporter - desc = "Code Blue" - access_type = ACCESS_TYPE_CENTCOM +//107 is unused -/var/const/access_cent_creed = 108//Creed's office. +//Creed's office. - ERT/TCFL Commander +/var/const/access_cent_creed = 108 /datum/access/cent_creed id = access_cent_creed desc = "Code Silver" access_type = ACCESS_TYPE_CENTCOM -/var/const/access_cent_captain = 109//Captain's office/ID comp/AI. -/datum/access/cent_captain - id = access_cent_captain +//CCIA Access on Centcom +/var/const/access_cent_ccia = 109 +/datum/access/cent_ccia + id = access_cent_ccia desc = "Code Gold" access_type = ACCESS_TYPE_CENTCOM diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 4e7c30cf895..d58c3ce07af 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -351,8 +351,8 @@ jobtype = /datum/job/librarian uniform = /obj/item/clothing/under/suit_jacket/charcoal - l_pocket = /obj/item/modular_computer/handheld/custom_loadout/advanced + l_pocket = /obj/item/modular_computer/handheld/preset r_pocket = /obj/item/card/tech_support r_hand = /obj/item/storage/bag/circuits/basic l_hand = /obj/item/modular_computer/laptop/preset - gloves = /obj/item/modular_computer/handheld/wristbound/preset/advanced/generic + gloves = /obj/item/modular_computer/handheld/wristbound/preset/advanced/civilian diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index d35b0939cfe..ea2259168f4 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -35,7 +35,7 @@ uniform = /obj/item/clothing/under/rank/chief_engineer head = /obj/item/clothing/head/hardhat/white - belt = /obj/item/storage/belt/utility + belt = /obj/item/storage/belt/utility/ce tab_pda = /obj/item/modular_computer/handheld/pda/engineering/ce wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/engineering/ce tablet = /obj/item/modular_computer/handheld/preset/engineering/ce @@ -50,14 +50,6 @@ dufflebag = /obj/item/storage/backpack/duffel/eng messengerbag = /obj/item/storage/backpack/messenger/engi - belt_contents = list( - /obj/item/weldingtool/largetank = 1, // industrial welding tool - /obj/item/crowbar = 1, - /obj/item/wirecutters = 1, - /obj/item/stack/cable_coil/random = 1, - /obj/item/powerdrill = 1 - ) - /datum/outfit/job/chief_engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() if(istajara(H)) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 70aac935904..9ddf14f2b47 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -112,7 +112,18 @@ to_chat(H, "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]") // overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del() -/datum/job/proc/equip_preview(mob/living/carbon/human/H, var/alt_title) +/datum/job/proc/equip_preview(mob/living/carbon/human/H, var/alt_title, var/faction_override) + if(faction_override) + var/faction = SSjobs.name_factions[faction_override] + if(faction) + var/datum/faction/F = faction + if(!F.is_default) + var/new_outfit = F.titles_to_loadout[title] + var/datum/outfit/O = new new_outfit + if(O) + O.pre_equip(H, TRUE) + O.equip(H, TRUE) + return pre_equip(H, TRUE) . = equip(H, TRUE, FALSE, alt_title=alt_title) diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 862809bb9ad..7daef0261bb 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -220,7 +220,7 @@ minimum_character_age = 20 access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist, access_first_responder) - minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks, access_first_responder) + minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_eva, access_maint_tunnels, access_external_airlocks, access_first_responder) outfit = /datum/outfit/job/med_tech blacklisted_species = list(SPECIES_DIONA, SPECIES_IPC_G2) diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 5016f871fa6..000854da6be 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -1,13 +1,12 @@ /obj/machinery/cablelayer name = "automatic cable layer" - - icon = 'icons/obj/stationobjs.dmi' - icon_state = "pipe_d" - density = 1 + icon = 'icons/obj/cable_layer.dmi' + icon_state = "cable_layer" + density = TRUE var/obj/structure/cable/last_piece var/obj/item/stack/cable_coil/cable var/max_cable = 100 - var/on = 0 + var/on = FALSE /obj/machinery/cablelayer/Initialize() . = ..() diff --git a/code/game/machinery/autolathe/autolathe_datums.dm b/code/game/machinery/autolathe/autolathe_datums.dm index 45a1c5322c4..e96029aa582 100644 --- a/code/game/machinery/autolathe/autolathe_datums.dm +++ b/code/game/machinery/autolathe/autolathe_datums.dm @@ -143,6 +143,56 @@ path = /obj/item/reagent_containers/food/drinks/drinkingglass category = "General" +/datum/autolathe/recipe/half_pint_glass + name = "half pint glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/square + category = "General" + +/datum/autolathe/recipe/rocks_glass + name = "rocks glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/rocks + category = "General" + +/datum/autolathe/recipe/sherry_glass + name = "sherry glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/shake + category = "General" + +/datum/autolathe/recipe/cocktail_glass + name = "cocktail glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/cocktail + category = "General" + +/datum/autolathe/recipe/shot_glass + name = "shot glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/shot + category = "General" + +/datum/autolathe/recipe/pint_glass + name = "pint glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/pint + category = "General" + +/datum/autolathe/recipe/mug_glass + name = "mug glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/mug + category = "General" + +/datum/autolathe/recipe/flute_glass + name = "flute glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/flute + category = "General" + +/datum/autolathe/recipe/cognac_glass + name = "cognac glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/cognac + category = "General" + +/datum/autolathe/recipe/goblet_glass + name = "goblet glass" + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/goblet + category = "General" + /datum/autolathe/recipe/bottle name = "bottle" path = /obj/item/reagent_containers/food/drinks/bottle @@ -434,11 +484,17 @@ category = "Arms and Ammunition" /datum/autolathe/recipe/magazine_carbine - name = "ammunition (5.56mm)" + name = "ammunition (5.56mm, large)" path = /obj/item/ammo_magazine/a556 hidden = 1 category = "Arms and Ammunition" +/datum/autolathe/recipe/magazine_smallcarbine + name = "ammunition (5.56mm, small)" + path = /obj/item/ammo_magazine/a556/carbine + hidden = 1 + category = "Arms and Ammunition" + /datum/autolathe/recipe/shotgun name = "ammunition (slug, shotgun)" path = /obj/item/ammo_casing/shotgun diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 8b4dc9ac174..b51e0ed9829 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -21,362 +21,256 @@ /obj/item/stock_parts/manipulator ) - var/list/biorecipies = list( - "biogenerated" = list( - name = "Bio Meat", - class = "Food", - object = /obj/item/reagent_containers/food/snacks/meat/biogenerated, - cost = 50, - amount = list(1,2,3,4,5), - emag = 0 - ), - "fishfillet" = list( - name = "Fish Fillet", - class = "Food", - object = /obj/item/reagent_containers/food/snacks/fish/fishfillet, - cost = 50, - amount = list(1,2,3,4,5), - emag = 0 - ), - "soywafers" = list( - name = "Soy Wafers", - class = "Food", - object = /obj/item/reagent_containers/food/snacks/soywafers, - cost = 150, - amount = list(1,2,3,4,5), - emag = 0 - ), - "bio_vitamin" = list( - name = "Flavored Vitamin", - class = "Food", - object = /obj/item/reagent_containers/pill/bio_vitamin, - cost = 50, - amount = list(1,5,10,25,50), - emag = 0 - ), - "liquidfood" = list( - name = "Food Ration", - class = "Food", - object = /obj/item/reagent_containers/food/snacks/liquidfood, - cost = 30, - amount = list(1,2,3,4,5), - emag = 0 - ), - "milk" = list( - name = "Space Milk (50u)", - class = "Food", - object = /obj/item/reagent_containers/food/drinks/milk, - cost = 100, - amount = list(1,2,3,4,5), - emag = 0 - ), - "nutri-spread" = list( - name = "Nutri-spread", - class = "Food", - object = /obj/item/reagent_containers/food/snacks/spreads, - cost = 80, - amount = list(1,2,3,4,5), - emag = 0 - ), - "enzyme" = list( - name = "Universal Enzyme (50u)", - class = "Food", - object = /obj/item/reagent_containers/food/condiment/enzyme, - cost = 200, - amount = list(1,2,3,4,5), - emag = 0 - ), - "ez" = list( - name = "E-Z-Nutrient (60u)", - class = "Fertilizer", - object = /obj/item/reagent_containers/glass/fertilizer/ez, - cost = 60, - amount = list(1,2,3,4,5), - emag = 0 - ), - "l4z" = list( - name = "Left 4 Zed (60u)", - class = "Fertilizer", - object = /obj/item/reagent_containers/glass/fertilizer/l4z, - cost = 120, - amount = list(1,2,3,4,5), - emag = 0 - ), - "rh" = list( - name = "Robust Harvest (60u)", - class = "Fertilizer", - object = /obj/item/reagent_containers/glass/fertilizer/rh, - cost = 180, - amount = list(1,2,3,4,5), - emag = 0 - ), - "jug" = list( - name = "Empty Jug", - class = "Items", - object = /obj/item/reagent_containers/glass/fertilizer, - cost = 100, - amount = list(1,2,3,4,5), - emag = 0 - ), - "custom_cigarettes" = list( - name = "Empty Cigarettes (x6)", - class = "Items", - object = /obj/item/storage/box/fancy/cigarettes/blank, - cost = 500, - amount = list(1,2,3,4,5), - emag = 0 - ), - "tape_roll" = list( - name = "Tape Roll", - class = "Items", - object = /obj/item/tape_roll, - cost = 250, - amount = list(1,2,3,4,5), - emag = 0 - ), - "botanic_leather" = list( - name = "Botanical Gloves", - class = "Items", - object = /obj/item/clothing/gloves/botanic_leather, - cost = 250, - amount = list(1,2,3,4,5), - emag = 0 - ), - "utility" = list( - name = "Utility Belt", - class = "Items", - object = /obj/item/storage/belt/utility, - cost = 300, - amount = list(1,2,3,4,5), - emag = 0 - ), - "hydrobelt" = list( - name = "Hydroponic Belt", - class = "Items", - object = /obj/item/storage/belt/hydro, - cost = 300, - amount = list(1,2,3,4,5), - emag = 0 - ), - "wallet" = list( - name = "Leather Wallet", - class = "Items", - object = /obj/item/storage/wallet, - cost = 100, - amount = list(1,2,3,4,5), - emag = 0 - ), - "satchel" = list( - name = "Leather Satchel", - class = "Items", - object = /obj/item/storage/backpack/satchel, - cost = 400, - amount = list(1,2,3,4,5), - emag = 0 - ), - "cash" = list( - name = "Money Bag", - class = "Items", - object = /obj/item/storage/bag/money, - cost = 400, - amount = list(1,2,3,4,5), - emag = 0 - ), - "soap" = list( - name = "Soap", - class = "Items", - object = /obj/item/soap/plant, - cost = 200, - amount = list(1,2,3,4,5), - emag = 0 - ), - "towel" = list( - name = "Towel", - class = "Items", - object = /obj/item/towel/random, - cost = 300, - amount = list(1,2,3,4,5), - emag = 0 - ), - "crayon_box" = list( - name = "Crayon Box", - class = "Items", - object = /obj/item/storage/box/fancy/crayons, - cost = 600, - amount = list(1,2,3,4,5), - emag = 0 - ), - "animalhide" = list( - name = "Animal Hide", - class = "Construction", - object = /obj/item/stack/material/animalhide, - cost = 100, - amount = list(1,5,10,25,50), - emag = 0 - ), - "leather" = list( - name = "Leather", - class = "Construction", - object = /obj/item/stack/material/leather, - cost = 100, - amount = list(1,5,10,25,50), - emag = 0 - ), - "cloth" = list( - name = "Cloth", - class = "Construction", - object = /obj/item/stack/material/cloth, - cost = 50, - amount = list(1,5,10,25,50), - emag = 0 - ), - "cardboard" = list( - name = "Cardboard", - class = "Construction", - object = /obj/item/stack/material/cardboard, - cost = 50, - amount = list(1,5,10,25,50), - emag = 0 - ), - "wax" = list( - name = "Wax", - class = "Construction", - object = /obj/item/stack/wax, - cost = 100, - amount = list(1,5,10,25,50), - emag = 0 - ), - "plastic" = list( - name = "Plastic", - class = "Construction", - object = /obj/item/stack/material/plastic, - cost = 100, - amount = list(1,5,10,25,50), - emag = 0 - ), - "mushroom" = list( - name = "Pet Mushroom", - class = "Special", - object = /mob/living/simple_animal/mushroom, - cost = 1000, - amount = list(1,2,3,4,5), - emag = 0 - ), - "monkey" = list( - name = "Monkey Cube", - class = "Special", - object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped, - cost = 500, - amount = list(1,2,3,4,5), - emag = 0 - ), - "stok" = list( - name = "Stok Cube", - class = "Special", - object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped/stokcube, - cost = 500, - amount = list(1,2,3,4,5), - emag = 0 - ), - "farwa" = list( - name = "Farwa Cube", - class = "Special", - object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped/farwacube, - cost = 500, - amount = list(1,2,3,4,5), - emag = 0 - ), - "neaera" = list( - name = "Neaera Cube", - class = "Special", - object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube, - cost = 500, - amount = list(1,2,3,4,5), - emag = 0 - ), - "cazador" = list( - name = "V'krexi Cube", - class = "Special", - object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped/vkrexicube, - cost = 500, - amount = list(1,2,3,4,5), - emag = 0 - ), - "bruise_pack" = list( - name = "Bruise Pack", - class = "Medical", - object = /obj/item/stack/medical/bruise_pack, - cost = 400, - amount = list(1,2,3,4,5), - emag = FALSE - ), - "ointment" = list( - name = "Burn Ointment", - class = "Medical", - object = /obj/item/stack/medical/ointment, - cost = 400, - amount = list(1,2,3,4,5), - emag = FALSE - ), - "perconol_pill" = list( - name = "Perconol Pill", - class = "Medical", - object = /obj/item/reagent_containers/pill/perconol, - cost = 250, - amount = list(1,2,3,5,7), - emag = FALSE - ), - "adv_trauma_kit" = list( - name = "Advanced Trauma Kit", - class = "!@#$%^&*()", - object = /obj/item/stack/medical/advanced/bruise_pack, - cost = 600, - amount = list(1,2,3,4,5), - emag = TRUE - ), - "adv_burn_kit" = list( - name = "Advanced Burn Kit", - class = "!@#$%^&*()", - object = /obj/item/stack/medical/advanced/ointment, - cost = 600, - amount = list(1,2,3,4,5), - emag = TRUE - ), - // Antag Items (Emag) - "humanhide" = list( - name = "Human Hide", - class = "!@#$%^&*()", - object = /obj/item/stack/material/animalhide/human, - cost = 50, - amount = list(1,5,10,25,50), - emag = 1 - ), - "syndie" = list( - name = "Red Soap", - class = "!@#$%^&*()", - object = /obj/item/soap/syndie, - cost = 200, - amount = list(1,2,3,4,5), - emag = 1 - ), - "buckler" = list( - name = "Buckler", - class = "!@#$%^&*()", - object = /obj/item/shield/buckler, - cost = 500, - amount = list(1,2,3,4,5), - emag = 1 - ), - "tree" = list( - name = "Tree", - class = "!@#$%^&*()", - object = /mob/living/simple_animal/hostile/tree, - cost = 1000, - amount = list(1,2,3,4,5), - emag = 1 - ) +#define BIOGEN_FOOD "Food" +#define BIOGEN_ITEMS "Items" +#define BIOGEN_SPECIAL "Special" +#define BIOGEN_CONSTRUCTION "Construction" +#define BIOGEN_FERTILIZER "Fertilizer" +#define BIOGEN_MEDICAL "Medical" +#define BIOGEN_ILLEGAL "!@#$%^&*()" - ) +/decl/biorecipe + var/name = "fixme" + var/class = BIOGEN_ITEMS + var/object + var/cost = 100 + var/amount = list(1, 2, 3, 4, 5) + var/emag = FALSE + +/decl/biorecipe/food + name = "Bio Meat" + class = BIOGEN_FOOD + object = /obj/item/reagent_containers/food/snacks/meat/biogenerated + cost = 50 + +/decl/biorecipe/food/fishfillet + name = "Fish Fillet" + object = /obj/item/reagent_containers/food/snacks/fish/fishfillet + +/decl/biorecipe/food/soywafers + name = "Soy Wafers" + object = /obj/item/reagent_containers/food/snacks/soywafers + cost = 150 + +/decl/biorecipe/food/bio_vitamin + name = "Flavored Vitamin" + object = /obj/item/reagent_containers/pill/bio_vitamin + amount = list(1,5,10,25,50) + +/decl/biorecipe/food/liquidfood + name = "Food Ration" + object = /obj/item/reagent_containers/food/snacks/liquidfood + cost = 30 + +/decl/biorecipe/food/milk + name = "Space Milk (50u)" + object = /obj/item/reagent_containers/food/drinks/milk + cost = 100 + +/decl/biorecipe/food/nutrispread + name = "Nutri-spread" + object = /obj/item/reagent_containers/food/snacks/spreads + cost = 80 + +/decl/biorecipe/food/enzyme + name = "Universal Enzyme (50u)" + object = /obj/item/reagent_containers/food/condiment/enzyme + +/* + FERTILIZER +*/ + +/decl/biorecipe/fertilizer + name = "E-Z-Nutrient (60u)" + class = BIOGEN_FERTILIZER + object = /obj/item/reagent_containers/glass/fertilizer/ez + cost = 60 + +/decl/biorecipe/fertilizer/l4z + name = "Left 4 Zed (60u)" + object = /obj/item/reagent_containers/glass/fertilizer/l4z + cost = 120 + +/decl/biorecipe/fertilizer/rh + name = "Robust Harvest (60u)" + object = /obj/item/reagent_containers/glass/fertilizer/rh + cost = 180 + +/* + ITEMS +*/ +/decl/biorecipe/item + name = "Towel" + class = BIOGEN_ITEMS + object = /obj/item/towel/random + cost = 300 + +/decl/biorecipe/item/jug + name = "Empty Jug" + object = /obj/item/reagent_containers/glass/fertilizer + cost = 100 + +/decl/biorecipe/item/custom_cigarettes + name = "Empty Cigarettes (x6)" + object = /obj/item/storage/box/fancy/cigarettes/blank + cost = 500 + +/decl/biorecipe/item/tape_roll + name = "Tape Roll" + object = /obj/item/tape_roll + cost = 250 + +/decl/biorecipe/item/botanic_leather + name = "Botanical Gloves" + object = /obj/item/clothing/gloves/botanic_leather + cost = 250 + +/decl/biorecipe/item/utility + name = "Utility Belt" + object = /obj/item/storage/belt/utility + +/decl/biorecipe/item/hydrobelt + name = "Hydroponic Belt" + object = /obj/item/storage/belt/hydro + +/decl/biorecipe/item/wallet + name = "Leather Wallet" + object = /obj/item/storage/wallet + cost = 100 + +/decl/biorecipe/item/satchel + name = "Leather Satchel" + object = /obj/item/storage/backpack/satchel + cost = 400 + +/decl/biorecipe/item/cash + name = "Money Bag" + object = /obj/item/storage/bag/money + cost = 400 + +/decl/biorecipe/item/soap + name = "Soap" + object = /obj/item/soap/plant + cost = 200 + +/decl/biorecipe/item/crayon_box + name = "Crayon Box" + object = /obj/item/storage/box/fancy/crayons + cost = 600 + +/* + CONSTRUCTION +*/ + +/decl/biorecipe/construction + name = "Animal Hide" + class = BIOGEN_CONSTRUCTION + object = /obj/item/stack/material/animalhide + cost = 100 + amount = list(1,5,10,25,50) + +/decl/biorecipe/construction/leather + name = "Leather" + object = /obj/item/stack/material/leather + +/decl/biorecipe/construction/cloth + name = "Cloth" + object = /obj/item/stack/material/cloth + cost = 50 + +/decl/biorecipe/construction/cardboard + name = "Cardboard" + object = /obj/item/stack/material/cardboard + cost = 50 + +/decl/biorecipe/construction/wax + name = "Wax" + object = /obj/item/stack/wax + +/decl/biorecipe/construction/plastic + name = "Plastic" + object = /obj/item/stack/material/plastic + +/* + SPECIAL +*/ + +/decl/biorecipe/mushroom + name = "Pet Mushroom" + class = BIOGEN_SPECIAL + object = /mob/living/simple_animal/mushroom + cost = 1000 + +/decl/biorecipe/cube + name = "Monkey Cube" + class = BIOGEN_SPECIAL + object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped + +/decl/biorecipe/cube/stok + name = "Stok Cube" + object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped/stokcube + +/decl/biorecipe/cube/farwa + name = "Farwa Cube" + object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped/farwacube + +/decl/biorecipe/cube/neaera + name = "Neaera Cube" + object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube + +/decl/biorecipe/cube/cazador + name = "V'krexi Cube" + object = /obj/item/reagent_containers/food/snacks/monkeycube/wrapped/vkrexicube + cost = 500 + +/decl/biorecipe/medical + name = "Bruise Pack" + class = BIOGEN_MEDICAL + object = /obj/item/stack/medical/bruise_pack + cost = 400 + +/decl/biorecipe/medical/ointment + name = "Burn Ointment" + object = /obj/item/stack/medical/ointment + +/decl/biorecipe/medical/perconol_pill + name = "Perconol Pill" + object = /obj/item/reagent_containers/pill/perconol + cost = 250 + amount = list(1,2,3,5,7) + +/decl/biorecipe/illegal + name = "Advanced Trauma Kit" + class = BIOGEN_ILLEGAL + object = /obj/item/stack/medical/advanced/bruise_pack + cost = 600 + emag = TRUE + +/decl/biorecipe/illegal/adv_burn_kit + name = "Advanced Burn Kit" + object = /obj/item/stack/medical/advanced/ointment + + // Antag Items (Emag) +/decl/biorecipe/illegal/humanhide + name = "Human Hide" + object = /obj/item/stack/material/animalhide/human + cost = 50 + amount = list(1,5,10,25,50) + +/decl/biorecipe/illegal/syndie + name = "Red Soap" + object = /obj/item/soap/syndie + cost = 200 + +/decl/biorecipe/illegal/buckler + name = "Buckler" + object = /obj/item/shield/buckler + cost = 500 + +/decl/biorecipe/illegal/tree + name = "Tree" + object = /mob/living/simple_animal/hostile/tree + cost = 1000 /obj/machinery/biogenerator/emag_act(var/remaining_charges, var/mob/user) if(!emagged) @@ -476,29 +370,23 @@ dat += "NameCostProduction Amount" var/lastclass = "Commands" - for (var/k in biorecipies) - var/list/v = biorecipies[k] - var/id = k - var/name = v["name"] - var/class = v["class"] - var/cost = v["cost"] - var/listamount = v["amount"] - var/emag = v["emag"] + for (var/k in decls_repository.get_decls_of_subtype(/decl/biorecipe)) + var/decl/biorecipe/current_recipe = decls_repository.get_decl(k) - if(emag == 0 || emagged == 1) - if(lastclass != class) - dat += "

[class]

" - lastclass = class - dat += "[name][round(cost/build_eff)]" + if(emagged || !current_recipe.emag) + if(lastclass != current_recipe.class) + dat += "

[current_recipe.class]

" + lastclass = current_recipe.class + dat += "[current_recipe.name][round(current_recipe.cost/build_eff)]" dat += "" - for(var/num in listamount) + for(var/num in current_recipe.amount) var/fakenum = "" if(num <= 9) fakenum = "0" - if(num*round(cost/build_eff) > points) + if(num*round(current_recipe.cost/build_eff) > points) dat += "
([fakenum][num])
" else - dat += "([fakenum][num])" + dat += "([fakenum][num])" dat += "" dat += "" @@ -547,25 +435,29 @@ updateUsrDialog() playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) use_power(S * 30) - sleep((S + 15) / eat_eff) + sleep((S + 1.5 SECONDS) / eat_eff) processing = 0 update_icon() else menustat = "void" return -/obj/machinery/biogenerator/proc/create_product(var/itemid, var/count) +/obj/machinery/biogenerator/proc/create_product(var/itemtype, var/count) + if (!ispath(itemtype, /decl/biorecipe)) + return FALSE - var/list/recipie_data = biorecipies[itemid] + var/decl/biorecipe/recipe = decls_repository.get_decl(itemtype) - if (!istype(recipie_data)) - return 0 + if (!ispath(recipe.object)) // this shouldn't happen unless someone tries to create /decl/biorecipe with href hacking + return FALSE - if (recipie_data["emag"] && !emagged) - return 0 + if (recipe.emag && !emagged) + return FALSE - var/cost = recipie_data["cost"] - var/totake = round(cost/build_eff) + if (!(count in recipe.amount)) // l-l-look at you, href h-hacker... + return FALSE + + var/totake = round(recipe.cost/build_eff) var/delay = totake/2 //Meat = 5 seconds @@ -587,25 +479,24 @@ points -= totake use_power(totake * 0.25) playsound(src.loc, /decl/sound_category/switch_sound, 50, 1) - var/new_object = recipie_data["object"] - if(ispath(new_object, /obj/item/reagent_containers/pill)) + if(ispath(recipe.object, /obj/item/reagent_containers/pill)) if(!made_container) made_container = new /obj/item/storage/pill_bottle(loc) - new new_object(made_container) - else if(ispath(new_object, /obj/item/stack/medical)) // we want full amounts of medical supplies - new new_object(loc) + new recipe.object(made_container) + else if(ispath(recipe.object, /obj/item/stack/medical)) // we want full amounts of medical supplies + new recipe.object(loc) sleep(delay) - else if(ispath(new_object, /obj/item/stack)) + else if(ispath(recipe.object, /obj/item/stack)) var/subtract_amount = totake * (count - 1) points -= subtract_amount use_power(subtract_amount * 0.25) - new new_object(loc, count) + new recipe.object(loc, count) break else - new new_object(loc) + new recipe.object(loc) sleep(delay) - sleep(10) + sleep(1 SECOND) processing = 0 menustat = "complete" @@ -630,7 +521,7 @@ beaker = null update_icon() if("create") - create_product(href_list["itemid"], text2num(href_list["count"])) + create_product(text2path(href_list["itemtype"]), text2num(href_list["count"])) if("menu") menustat = "menu" updateUsrDialog() diff --git a/code/game/machinery/body_scanner.dm b/code/game/machinery/body_scanner.dm index dbd86a1c290..a71e190a79a 100644 --- a/code/game/machinery/body_scanner.dm +++ b/code/game/machinery/body_scanner.dm @@ -503,8 +503,8 @@ wounds += "Appears to be composed of inorganic material." if (O.status & ORGAN_ARTERY_CUT) wounds += "Severed [O.artery_name]." - if (O.status & ORGAN_TENDON_CUT) - wounds += "Severed [O.tendon_name]." + if (O.tendon_status() & TENDON_CUT) + wounds += "Severed [O.tendon.name]." if (O.status & ORGAN_SPLINTED) wounds += "Splinted." if (O.status & ORGAN_BLEEDING) @@ -714,7 +714,7 @@ if(e.status & ORGAN_ARTERY_CUT) internal_bleeding = "Arterial bleeding." - if(e.status & ORGAN_TENDON_CUT) + if(e.tendon_status() & TENDON_CUT) severed_tendon = "Severed tendon." if(istype(e, /obj/item/organ/external/chest) && occ["lung_ruptured"]) lung_ruptured = "Lung ruptured." diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 8673cbfefeb..5595202cb3a 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -126,13 +126,8 @@ if(istype(P, /obj/item/device/mmi)) var/obj/item/device/mmi/M = P - if(!M.brainmob) - to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.") + if(!M.ready_for_use(user)) return - if(M.brainmob.stat == 2) - to_chat(user, "Sticking a dead [P] into the frame would sort of defeat the purpose.") - return - if(jobban_isbanned(M.brainmob, "AI")) to_chat(user, "This [P] does not seem to fit.") return diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index d08487cebbe..22a9b943959 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -138,3 +138,8 @@ //Animals can run under them, lots of empty space return 1 return ..() + +// screens have a layer above, so we can't attach here +/obj/machinery/computer/can_attach_sticker(var/mob/user, var/obj/item/sticker/S) + to_chat(user, SPAN_WARNING("\The [src]'s non-stick surface prevents you from attaching a sticker to it!")) + return FALSE \ No newline at end of file diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 2a46db50a9c..0f569210939 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -125,6 +125,14 @@ if(specialfunctions & SAFE) D.set_safeties(1) +/obj/machinery/button/remote/airlock/screamer + var/message = "REPLACE THIS!" + var/channel = "Common" + +/obj/machinery/button/remote/airlock/screamer/trigger() + . = ..() + global_announcer.autosay(message, capitalize_first_letters(name), channel) + #undef OPEN #undef IDSCAN #undef BOLTS diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a75d41f0d68..2865d507270 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -497,6 +497,8 @@ /obj/machinery/door/proc/open(var/forced = 0) + set waitfor = FALSE + if(!can_open(forced)) return operating = TRUE @@ -527,6 +529,8 @@ close() /obj/machinery/door/proc/close(var/forced = 0) + set waitfor = FALSE + if(!can_close(forced)) if (autoclose) for (var/atom/movable/M in get_turf(src)) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a3a4cc8d0a7..adf44ffc391 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -98,6 +98,8 @@ return 1 /obj/machinery/door/window/open(var/forced=FALSE) + set waitfor = FALSE + if(!can_open() && !forced) return FALSE operating = TRUE @@ -113,6 +115,8 @@ return TRUE /obj/machinery/door/window/close(var/forced=FALSE) + set waitfor = FALSE + if (!can_close() && !forced) return FALSE operating = TRUE diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index 7ef07d025e9..6e465597fd7 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -1,17 +1,18 @@ /obj/machinery/floorlayer - name = "automatic floor layer" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "pipe_d" - density = 1 + desc = "A large piece of machinery used that can place, dismantle, and collect floor tiles." + desc_info = "Use a screwdriver to set which tile to lay, a wrench to configure the various modes, and a crowbar to take out tiles. Clicking on it with an empty hand will turn it on and off." + icon = 'icons/obj/floor_layer.dmi' + icon_state = "floor_layer" + density = TRUE var/turf/old_turf - var/on = 0 + var/on = FALSE var/obj/item/stack/tile/T var/list/mode = list("dismantle"=0,"laying"=0,"collect"=0) /obj/machinery/floorlayer/Initialize() . = ..() - T = new/obj/item/stack/tile/floor(src) + T = new /obj/item/stack/tile/floor/full(src) /obj/machinery/floorlayer/Move(new_turf,M_Dir) ..() @@ -26,44 +27,40 @@ if(mode["collect"]) CollectTiles(old_turf) - old_turf = new_turf -/obj/machinery/floorlayer/attack_hand(mob/user as mob) - on=!on - user.visible_message("[user] has [!on?"de":""]activated \the [src].", "You [!on?"de":""]activate \the [src].") - return +/obj/machinery/floorlayer/attack_hand(mob/user) + on = !on + user.visible_message("[user] has [!on ? "de" : ""]activated \the [src].", SPAN_NOTICE("You [!on ? "de" : ""]activate \the [src].")) -/obj/machinery/floorlayer/attackby(var/obj/item/W as obj, var/mob/user as mob) - - if (W.iswrench()) - var/m = input("Choose work mode", "Mode") as null|anything in mode +/obj/machinery/floorlayer/attackby(obj/item/I, mob/user) + if(I.iswrench()) + var/m = input(user, "Choose work mode", "Mode") as null|anything in mode mode[m] = !mode[m] var/O = mode[m] - user.visible_message("[usr] has set \the [src] [m] mode [!O?"off":"on"].", "You set \the [src] [m] mode [!O?"off":"on"].") + user.visible_message("[user] has set \the [src] [m] mode [!O ? "off" : "on"].", SPAN_NOTICE("You set \the [src] [m] mode [!O ? "off":"on"].")) return - if(istype(W, /obj/item/stack/tile)) - to_chat(user, "\The [W] successfully loaded.") - user.drop_item(T) - TakeTile(T) + if(istype(I, /obj/item/stack/tile)) + to_chat(user, SPAN_NOTICE("You successfully load \the [I] into \the [src].")) + user.drop_from_inventory(I, src) + TakeTile(I) return - if(W.iscrowbar()) + if(I.iscrowbar()) if(!length(contents)) - to_chat(user, "\The [src] is empty.") + to_chat(user, SPAN_NOTICE("\The [src] is empty.")) else - var/obj/item/stack/tile/E = input("Choose remove tile type.", "Tiles") as null|anything in contents + var/obj/item/stack/tile/E = input(user, "Choose which set of tiles you want to remove.", "Tiles") as null|anything in contents if(E) - to_chat(user, "You remove the [E] from /the [src].") - E.forceMove(src.loc) + to_chat(user, SPAN_NOTICE("You remove \the [E] from \the [src].")) + user.put_in_hands(E) T = null return - if(W.isscrewdriver()) - T = input("Choose tile type.", "Tiles") as null|anything in contents + if(I.isscrewdriver()) + T = input(user, "Choose which set of tiles you want \the [src] to lay.", "Tiles") as null|anything in contents return - ..() /obj/machinery/floorlayer/examine(mob/user) ..() @@ -73,27 +70,26 @@ var/number = 0 if (T) number = T.get_amount() - to_chat(user, "\The [src] has [number] tile\s, dismantle is [dismantle?"on":"off"], laying is [laying?"on":"off"], collect is [collect?"on":"off"].") + to_chat(user, SPAN_NOTICE("\The [src] has [number] tile\s, dismantle is [dismantle ? "on" : "off"], laying is [laying ? "on" : "off"], collect is [collect ? "on" : "off"].")) /obj/machinery/floorlayer/proc/reset() - on=0 - return + on = FALSE /obj/machinery/floorlayer/proc/dismantleFloor(var/turf/new_turf) if(istype(new_turf, /turf/simulated/floor)) var/turf/simulated/floor/T = new_turf if(!T.is_plating()) if(!T.broken && !T.burnt) - new T.flooring.build_type() + new T.flooring.build_type(T) T.make_plating() return T.is_plating() - return 0 + return FALSE /obj/machinery/floorlayer/proc/TakeNewStack() for(var/obj/item/stack/tile/tile in contents) T = tile - return 1 - return 0 + return TRUE + return FALSE /obj/machinery/floorlayer/proc/SortStacks() for(var/obj/item/stack/tile/tile1 in contents) @@ -108,16 +104,17 @@ /obj/machinery/floorlayer/proc/layFloor(var/turf/w_turf) if(!T) if(!TakeNewStack()) - return 0 - w_turf.attackby(T , src) - return 1 + return FALSE + w_turf.attackby(T, src) + return TRUE /obj/machinery/floorlayer/proc/TakeTile(var/obj/item/stack/tile/tile) - if(!T) T = tile + if(!T) + T = tile tile.forceMove(src) SortStacks() /obj/machinery/floorlayer/proc/CollectTiles(var/turf/w_turf) for(var/obj/item/stack/tile/tile in w_turf) - TakeTile(tile) + TakeTile(tile) \ No newline at end of file diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index c546fd7a1ea..19df91d43c4 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -43,6 +43,8 @@ Possible to do for anyone motivated enough: var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 7 // Change to change how far the AI can move away from the holopad before deactivating + var/long_range = FALSE // ignores connected_z_levels check + var/incoming_connection = FALSE var/established_connection = FALSE var/obj/machinery/hologram/holopad/connected_pad @@ -117,7 +119,7 @@ Possible to do for anyone motivated enough: forced_call = TRUE var/list/holopadlist = list() for(var/obj/machinery/hologram/holopad/H in SSmachinery.processing_machines - src) - if(AreConnectedZLevels(H.z, z) && H.operable()) + if((long_range || H.long_range || AreConnectedZLevels(H.z, z)) && H.operable()) holopadlist["[H.holopad_id]"] = H //Define a list and fill it with the area of every holopad in the world holopadlist = sortAssoc(holopadlist) var/chosen_pad = input(user, "Which holopad would you like to contact?", "Holopad List") as null|anything in holopadlist @@ -345,6 +347,9 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ clear_holo(user) return TRUE +/obj/machinery/hologram/holopad/central + long_range = TRUE + /* * Hologram */ diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index d454dcbe550..247ba6d8a10 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -142,11 +142,16 @@ Class Procs: component_parts = list() for (var/type in component_types) var/count = component_types[type] - if (count > 1) - for (var/i in 1 to count) - component_parts += new type(src) + if(ispath(type, /obj/item/stack)) + if(isnull(count)) + count = 1 + component_parts += new type(src, count) else - component_parts += new type(src) + if(count > 1) + for (var/i in 1 to count) + component_parts += new type(src) + else + component_parts += new type(src) if(component_parts.len) RefreshParts() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 9bbf5afec02..a4aa112439a 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -1,200 +1,173 @@ /obj/machinery/pipedispenser name = "pipe dispenser" - icon = 'icons/obj/stationobjs.dmi' + desc = "A large piece of machinery used to dispense pipes that transport and manipulate gasses." desc_info = "This can be moved by using a wrench. You will need to wrench it again when you want to use it. You can put \ - excess (atmospheric) pipes into the dispenser, as well. The dispenser requires electricity to function." - icon_state = "pipe_d" - density = 1 - anchored = 1 - var/unwrenched = 0 - var/wait = 0 + excess (atmospheric) pipes into the dispenser, as well. It needs electricity to function." + icon = 'icons/obj/pipe_dispenser.dmi' + icon_state = "pipe_dispenser" + density = TRUE + anchored = TRUE -/obj/machinery/pipedispenser/attack_hand(user as mob) + var/window_id = "pipedispenser" + var/pipe_cooldown = 0 + +/obj/machinery/pipedispenser/attack_hand(mob/user) if(..()) return -///// Z-Level stuff + var/dat = {" -Regular pipes:
-Pipe
-Bent Pipe
-Manifold
-Manual Valve
-Pipe Cap
-4-Way Manifold
-Manual T-Valve
-Manual T-Valve - Mirrored
-Upward Pipe
-Downward Pipe
-Supply pipes:
-Pipe
-Bent Pipe
-Manifold
-Pipe Cap
-4-Way Manifold
-Upward Pipe
-Downward Pipe
-Scrubbers pipes:
-Pipe
-Bent Pipe
-Manifold
-Pipe Cap
-4-Way Manifold
-Upward Pipe
-Downward Pipe
-Devices:
-Universal pipe adapter
-Connector
-Unary Vent
-Gas Pump
-Pressure Regulator
-Scrubbers Pressure Regulator
-Supply Pressure Regulator
-High Power Gas Pump
-Scrubber
-Meter
-Gas Filter
-Gas Filter - Mirrored
-Gas Mixer
-Gas Mixer - Mirrored
-Gas Mixer - T
-Omni Gas Mixer
-Omni Gas Filter
-Heat exchange:
-Pipe
-Bent Pipe
-Junction
-Heat Exchanger
-Insulated pipes:
-Pipe
-Bent Pipe
+ Regular pipes:
+ Pipe
+ Bent Pipe
+ Manifold
+ Manual Valve
+ Pipe Cap
+ 4-Way Manifold
+ Manual T-Valve
+ Manual T-Valve - Mirrored
+ Upward Pipe
+ Downward Pipe
+ Supply pipes:
+ Pipe
+ Bent Pipe
+ Manifold
+ Pipe Cap
+ 4-Way Manifold
+ Upward Pipe
+ Downward Pipe
+ Scrubbers pipes:
+ Pipe
+ Bent Pipe
+ Manifold
+ Pipe Cap
+ 4-Way Manifold
+ Upward Pipe
+ Downward Pipe
+ Devices:
+ Universal pipe adapter
+ Connector
+ Unary Vent
+ Gas Pump
+ Pressure Regulator
+ Scrubbers Pressure Regulator
+ Supply Pressure Regulator
+ High Power Gas Pump
+ Scrubber
+ Meter
+ Gas Filter
+ Gas Filter - Mirrored
+ Gas Mixer
+ Gas Mixer - Mirrored
+ Gas Mixer - T
+ Omni Gas Mixer
+ Omni Gas Filter
+ Heat exchange:
+ Pipe
+ Bent Pipe
+ Junction
+ Heat Exchanger
+ Insulated pipes:
+ Pipe
+ Bent Pipe
+ "} + //What number the make points to is in the define # at the top of construction.dm in same folder -"} -///// Z-Level stuff -//What number the make points to is in the define # at the top of construction.dm in same folder - - var/datum/browser/pipedispenser_win = new(user, "pipedispenser", capitalize_first_letters(name), 220, 500) + var/datum/browser/pipedispenser_win = new(user, window_id, capitalize_first_letters(name), 220, 500) pipedispenser_win.set_content(dat) pipedispenser_win.open() /obj/machinery/pipedispenser/Topic(href, href_list) if(..()) return - if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) - usr << browse(null, "window=pipedispenser") - return - usr.set_machine(src) - src.add_fingerprint(usr) - if(href_list["make"]) - if(!wait) - var/p_type = text2num(href_list["make"]) - var/p_dir = text2num(href_list["dir"]) - var/obj/item/pipe/P = new (/*usr.loc*/ src.loc, pipe_type=p_type, dir=p_dir) - P.update() - P.add_fingerprint(usr) - wait = 1 - spawn(10) - wait = 0 - if(href_list["makemeter"]) - if(!wait) - new /obj/item/pipe_meter(/*usr.loc*/ src.loc) - wait = 1 - spawn(15) - wait = 0 - return -/obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob) - if(!istype(W, /obj/item/forensics)) - src.add_fingerprint(usr) - if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter)) - to_chat(usr, "You put [W] back to [src].") - user.drop_from_inventory(W,get_turf(src)) - qdel(W) + if(!anchored || use_check_and_message(usr)) + usr << browse(null, "window=[window_id]") return - else if (W.iswrench()) - if (unwrenched==0) - playsound(src.loc, W.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src] from the floor...") - if (do_after(user, 40/W.toolspeed)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You have unfastened \the [src]. Now it can be pulled somewhere else.", \ - "You hear ratchet.") - src.anchored = 0 - src.stat |= MAINT - src.unwrenched = 1 - if (usr.machine==src) - usr << browse(null, "window=pipedispenser") - else /*if (unwrenched==1)*/ - playsound(src.loc, W.usesound, 50, 1) - to_chat(user, "You begin to fasten \the [src] to the floor...") - if (do_after(user, 20/W.toolspeed)) - user.visible_message( \ - "[user] fastens \the [src].", \ - "You have fastened \the [src]. Now it can dispense pipes.", \ - "You hear ratchet.") - src.anchored = 1 - src.stat &= ~MAINT - src.unwrenched = 0 + + usr.set_machine(src) + add_fingerprint(usr) + + if(pipe_cooldown > world.time) + return + + if(href_list["make"]) + var/obj/item/pipe/P = new(loc, text2num(href_list["make"]), text2num(href_list["dir"])) + P.update() + P.add_fingerprint(usr) + pipe_cooldown = world.time + 1 SECOND + + if(href_list["makemeter"]) + new /obj/item/pipe_meter(loc) + pipe_cooldown = world.time + 1.5 SECONDS + +/obj/machinery/pipedispenser/attackby(obj/item/I, mob/user) + if(!istype(I, /obj/item/forensics)) + add_fingerprint(user) + if(istype(I, /obj/item/pipe) || istype(I, /obj/item/pipe_meter)) + to_chat(usr, SPAN_NOTICE("You put \the [I] back into \the [src].")) + qdel(I) + return + else if(I.iswrench()) + playsound(get_turf(user), I.usesound, 50, 1) + if(anchored) + to_chat(user, SPAN_NOTICE("You begin to unfasten \the [src] from the floor...")) + if(do_after(user, 40 / I.toolspeed)) + user.visible_message("[user] unfastens \the [src].", SPAN_NOTICE("You have unfastened \the [src]. Now it can be pulled somewhere else."), SPAN_NOTICE("You hear ratcheting noise.")) + anchored = FALSE + stat |= MAINT + if(usr.machine == src) + usr << browse(null, "window=[window_id]") + else + to_chat(user, SPAN_NOTICE("You begin to fasten \the [src] to the floor...")) + if(do_after(user, 20 / I.toolspeed)) + user.visible_message("[user] fastens \the [src].", SPAN_NOTICE("You have fastened \the [src]. Now it can dispense pipes."), SPAN_NOTICE("You hear ratcheting noise.")) + anchored = TRUE + stat &= ~MAINT power_change() else return ..() /obj/machinery/pipedispenser/disposal - name = "Disposal Pipe Dispenser" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "pipe_d" - density = 1 - anchored = 1.0 - -/* -//Allow you to push disposal pipes into it (for those with density 1) -/obj/machinery/pipedispenser/disposal/Crossed(var/obj/structure/disposalconstruct/pipe as obj) - if(istype(pipe) && !pipe.anchored) - qdel(pipe) - -Nah -*/ + name = "disposal pipe dispenser" + desc = "A large piece of machinery used to dispense pipes that transport and manipulate objects." + desc_info = "This can be moved by using a wrench. You will need to wrench it again when you want to use it. You can put \ + excess disposal pipes into the dispenser by dragging them onto it. It needs electricity to function." + icon_state = "disposal_dispenser" + window_id = "disposaldispenser" //Allow you to drag-drop disposal pipes into it -/obj/machinery/pipedispenser/disposal/MouseDrop_T(var/obj/structure/disposalconstruct/pipe as obj, mob/usr as mob) - if(!usr.canmove || usr.stat || usr.restrained()) - return - - if (!istype(pipe) || get_dist(usr, src) > 1 || get_dist(src,pipe) > 1 ) - return - - if (pipe.anchored) +/obj/machinery/pipedispenser/disposal/MouseDrop_T(obj/structure/disposalconstruct/pipe, mob/user) + if(!istype(pipe) || pipe.anchored || use_check_and_message(user)) return qdel(pipe) -/obj/machinery/pipedispenser/disposal/attack_hand(user as mob) +/obj/machinery/pipedispenser/disposal/attack_hand(mob/user) if(..()) return -///// Z-Level stuff var/dat = {"Disposal Pipes

-Pipe
-Bent Pipe
-Junction
-Y-Junction
-Trunk
-Bin
-Bin (Small)
-Outlet
-Chute
-Upwards
-Downwards
-Sorting
-Sorting (Wildcard)
-Sorting (Untagged)
-Tagger
-Tagger (Partial)
-"} -///// Z-Level stuff + Pipe
+ Bent Pipe
+ Junction
+ Y-Junction
+ Trunk
+ Bin
+ Bin (Small)
+ Outlet
+ Chute
+ Upwards
+ Downwards
+ Sorting
+ Sorting (Wildcard)
+ Sorting (Untagged)
+ Tagger
+ Tagger (Partial)
+ "} - user << browse("[src][dat]", "window=pipedispenser") - return + var/datum/browser/disposaldispenser_win = new(user, window_id, capitalize_first_letters(name), 220, 500) + disposaldispenser_win.set_content(dat) + disposaldispenser_win.open() // 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk @@ -203,67 +176,64 @@ Nah if(..()) return usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) + + if(!anchored || use_check_and_message(usr)) + usr << browse(null, "window=[window_id]") + return + + if(pipe_cooldown > world.time) + return + if(href_list["dmake"]) - if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) - usr << browse(null, "window=pipedispenser") - return - if(!wait) - var/p_type = text2num(href_list["dmake"]) - var/obj/structure/disposalconstruct/C = new (src.loc) - switch(p_type) - if(0) - C.ptype = 0 - if(1) - C.ptype = 1 - if(2) - C.ptype = 2 - if(3) - C.ptype = 4 - if(4) - C.ptype = 5 - if(5) - C.ptype = 6 - C.density = 1 - if(6) - C.ptype = 7 - C.density = 1 - if(7) - C.ptype = 8 - C.density = 1 - if(8) - C.ptype = 9 - C.subtype = 0 - if(9) - C.ptype = 9 - C.subtype = 1 - if(10) - C.ptype = 9 - C.subtype = 2 - if(11) - C.ptype = 13 - if(12) - C.ptype = 14 - if(13) - C.ptype = 15 -///// Z-Level stuff - if(21) - C.ptype = 11 - if(22) - C.ptype = 12 -///// Z-Level stuff - C.add_fingerprint(usr) - C.update() - wait = 1 - spawn(15) - wait = 0 - return + var/p_type = text2num(href_list["dmake"]) + var/obj/structure/disposalconstruct/C = new(loc) + switch(p_type) + if(0) + C.ptype = 0 + if(1) + C.ptype = 1 + if(2) + C.ptype = 2 + if(3) + C.ptype = 4 + if(4) + C.ptype = 5 + if(5) + C.ptype = 6 + C.density = 1 + if(6) + C.ptype = 7 + C.density = 1 + if(7) + C.ptype = 8 + C.density = 1 + if(8) + C.ptype = 9 + C.subtype = 0 + if(9) + C.ptype = 9 + C.subtype = 1 + if(10) + C.ptype = 9 + C.subtype = 2 + if(11) + C.ptype = 13 + if(12) + C.ptype = 14 + if(13) + C.ptype = 15 + if(21) + C.ptype = 11 + if(22) + C.ptype = 12 + C.add_fingerprint(usr) + C.update() + pipe_cooldown = world.time + 1.5 SECONDS // adding a pipe dispensers that spawn unhooked from the ground /obj/machinery/pipedispenser/orderable - anchored = 0 - unwrenched = 1 + anchored = FALSE /obj/machinery/pipedispenser/disposal/orderable - anchored = 0 - unwrenched = 1 \ No newline at end of file + anchored = FALSE \ No newline at end of file diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm deleted file mode 100644 index 9d6564e76e7..00000000000 --- a/code/game/machinery/pipe/pipelayer.dm +++ /dev/null @@ -1,135 +0,0 @@ -/obj/machinery/pipelayer - - name = "automatic pipe layer" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "pipe_d" - density = 1 - var/turf/old_turf - var/old_dir - var/on = 0 - var/a_dis = 0 - var/P_type = 0 - var/P_type_t = "" - var/max_metal = 50 - var/metal = 10 - var/obj/item/wrench/W - var/list/Pipes = list("regular pipes"=0,"scrubbers pipes"=31,"supply pipes"=29,"heat exchange pipes"=2) - -/obj/machinery/pipelayer/Initialize() - . = ..() - W = new(src) - -/obj/machinery/pipelayer/Move(new_turf,M_Dir) - ..() - - if(on && a_dis) - dismantleFloor(old_turf) - layPipe(old_turf,M_Dir,old_dir) - - old_turf = new_turf - old_dir = turn(M_Dir,180) - -/obj/machinery/pipelayer/attack_hand(mob/user as mob) - if(!metal&&!on) - to_chat(user, "\The [src] doesn't work without metal.") - return - on=!on - user.visible_message("[user] has [!on?"de":""]activated \the [src].", "You [!on?"de":""]activate \the [src].") - return - -/obj/machinery/pipelayer/attackby(var/obj/item/W as obj, var/mob/user as mob) - - if (W.iswrench()) - P_type_t = input("Choose pipe type", "Pipe type") as null|anything in Pipes - P_type = Pipes[P_type_t] - user.visible_message("[user] has set \the [src] to manufacture [P_type_t].", "You set \the [src] to manufacture [P_type_t].") - return - - if(W.iscrowbar()) - a_dis=!a_dis - user.visible_message("[user] has [!a_dis?"de":""]activated auto-dismantling.", "You [!a_dis?"de":""]activate auto-dismantling.") - return - - if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL) - - var/result = load_metal(W) - if(isnull(result)) - to_chat(user, "Unable to load [W] - no metal found.") - else if(!result) - to_chat(user, "\The [src] is full.") - else - user.visible_message("[user] has loaded metal into \the [src].", "You load metal into \the [src]") - - return - - if(W.isscrewdriver()) - if(metal) - var/m = round(input(usr,"Please specify the amount of metal to remove","Remove metal",min(round(metal),50)) as num, 1) - m = min(m, 50) - m = min(m, round(metal)) - m = round(m) - if(m) - use_metal(m) - var/obj/item/stack/material/steel/MM = new (get_turf(src)) - MM.amount = m - user.visible_message("[user] removes [m] sheet\s of metal from the \the [src].", "You remove [m] sheet\s of metal from \the [src]") - else - to_chat(user, "\The [src] is empty.") - return - ..() - -/obj/machinery/pipelayer/examine(mob/user) - ..() - to_chat(user, "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated.") - -/obj/machinery/pipelayer/proc/reset() - on=0 - return - -/obj/machinery/pipelayer/proc/load_metal(var/obj/item/stack/MM) - if(istype(MM) && MM.get_amount()) - var/cur_amount = metal - var/to_load = max(max_metal - round(cur_amount),0) - if(to_load) - to_load = min(MM.get_amount(), to_load) - metal += to_load - MM.use(to_load) - return to_load - else - return 0 - return - -/obj/machinery/pipelayer/proc/use_metal(amount) - if(!metal || metal= stasis_can_toggle) && !use_check_and_message(user) && !(stat & (NOPOWER|BROKEN))) + stasis_enabled = !stasis_enabled + stasis_can_toggle = world.time + 5 SECONDS + playsound(src, 'sound/machines/click.ogg', 60, TRUE) + user.visible_message(SPAN_NOTICE("\The [src] [stasis_enabled ? "powers on" : "shuts down"]."), \ + SPAN_NOTICE("You [stasis_enabled ? "power on" : "shut down"] \the [src]."), \ + SPAN_NOTICE("You hear a nearby machine [stasis_enabled ? "power on" : "shut down"].")) + play_power_sound() + update_icon() + +/obj/machinery/stasis_bed/Exited(atom/movable/AM, atom/newloc) + if(AM == occupant) + var/mob/living/L = AM + thaw_occupant(L) + . = ..() + +/obj/machinery/stasis_bed/proc/stasis_running() + return stasis_enabled && !(stat & (NOPOWER|BROKEN)) + +/obj/machinery/stasis_bed/update_icon() + cut_overlays() + if(stat & BROKEN) + icon_state = "[initial(icon_state)]_broken" + return ..() + icon_state = initial(icon_state) + if(panel_open || (stat & MAINT)) + add_overlay("stasis_maintenance") + if(stasis_running()) + add_overlay("stasis_on") + +/obj/machinery/stasis_bed/power_change() + . = ..() + play_power_sound() + +/obj/machinery/stasis_bed/proc/chill_occupant(mob/living/target) + if(target != occupant) + return + if(!stasis_running()) + return + + playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 2, frequency = rand(24750, 26550)) + target.ExtinguishMobCompletely() + update_use_power(2) + chilled_occupant = TRUE + +/obj/machinery/stasis_bed/proc/thaw_occupant(mob/living/target) + if(target != occupant) + return + + update_use_power(1) + occupant = null + chilled_occupant = FALSE + +/obj/machinery/stasis_bed/post_buckle(mob/living/carbon/human/H) + if(H.buckled_to == src) + occupant = H + if(stasis_running()) + chill_occupant(H) + else + thaw_occupant(H) + update_icon() + +/obj/machinery/stasis_bed/machinery_process() + if(stat & (NOPOWER|BROKEN)) + return + if(!occupant) + update_use_power(1) + return + + if(!chilled_occupant) + chill_occupant(occupant) + + occupant.SetStasis(15) \ No newline at end of file diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 810c79d164e..a325117c5dd 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -57,7 +57,6 @@ visible_message("The machine makes a series of loud sounds as it starts to replace [H]'s organs and limbs with robotic parts!") to_chat(H, "You feel a horrible pain as the machine you entered starts to rip you apart and replace your limbs and organs!") to_chat(H, " You lose consciousness for a brief moment before waking up with a whole new body...") - to_chat(H, "You are lobotomized by the machine. You do not remember your past identity or self.") playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) canuse = FALSE addtimer(CALLBACK(src, .proc/rearm), 120 SECONDS) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 8816dc87a15..c01e2a014ed 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -833,4 +833,9 @@ throw_item.vendor_action(src) INVOKE_ASYNC(throw_item, /atom/movable.proc/throw_at, target, rand(3, 10), rand(1, 3), src) src.visible_message("[src] launches [throw_item.name] at [target.name]!") - return 1 \ No newline at end of file + return 1 + +// screens go over the lighting layer, so googly eyes go under them +/obj/machinery/vending/can_attach_sticker(var/mob/user, var/obj/item/sticker/S) + to_chat(user, SPAN_WARNING("\The [src]'s non-stick surface prevents you from attaching a sticker to it!")) + return FALSE \ No newline at end of file diff --git a/code/game/machinery/vending_types.dm b/code/game/machinery/vending_types.dm index 8bc73b6ba84..fd9852e0608 100644 --- a/code/game/machinery/vending_types.dm +++ b/code/game/machinery/vending_types.dm @@ -81,15 +81,18 @@ /obj/item/reagent_containers/food/drinks/bottle/sake = 1, /obj/item/reagent_containers/food/drinks/bottle/cremewhite = 4, /obj/item/reagent_containers/food/drinks/bottle/mintsyrup = 5, + /obj/item/reagent_containers/food/drinks/bottle/nmshaan_liquor = 2, /obj/item/reagent_containers/food/drinks/bottle/chartreuseyellow =5, + /obj/item/reagent_containers/food/drinks/bottle/messa_mead = 2, /obj/item/reagent_containers/food/drinks/bottle/small/ale = 6, /obj/item/reagent_containers/food/drinks/bottle/small/beer = 6, /obj/item/reagent_containers/food/drinks/bottle/small/xuizijuice = 8, + /obj/item/reagent_containers/food/drinks/bottle/small/khlibnyz = 4, /obj/item/reagent_containers/food/drinks/bottle/cola = 5, /obj/item/reagent_containers/food/drinks/bottle/space_mountain_wind = 5, /obj/item/reagent_containers/food/drinks/bottle/space_up = 5, /obj/item/reagent_containers/food/drinks/bottle/hrozamal_soda = 2, - /obj/item/reagent_containers/food/drinks/cans/adhomai_milk = 2, + /obj/item/reagent_containers/food/drinks/bottle/small/midynhr_water = 3, /obj/item/reagent_containers/food/drinks/cans/grape_juice = 6, /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 2, /obj/item/reagent_containers/food/drinks/cans/sodawater = 15, @@ -102,10 +105,26 @@ /obj/item/reagent_containers/food/drinks/carton/lemonjuice = 4, /obj/item/reagent_containers/food/drinks/carton/orangejuice = 4, /obj/item/reagent_containers/food/drinks/carton/tomatojuice = 4, + /obj/item/reagent_containers/food/drinks/carton/fatshouters = 2, + /obj/item/reagent_containers/food/drinks/carton/mutthir = 2, /obj/item/reagent_containers/food/drinks/flask/barflask = 2, /obj/item/reagent_containers/food/drinks/flask/vacuumflask = 2, /obj/item/reagent_containers/food/drinks/ice = 9, - /obj/item/reagent_containers/food/drinks/drinkingglass = 30 + /obj/item/reagent_containers/food/drinks/drinkingglass = 30, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/pint = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/square = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/mug = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/shake = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/goblet = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/wine = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/flute = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/cognac = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/rocks = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/cocktail = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/shot = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/teacup = 10, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/carafe = 4, + /obj/item/reagent_containers/food/drinks/pitcher = 4 ) contraband = list( /obj/item/reagent_containers/food/drinks/tea = 10 @@ -376,6 +395,8 @@ /obj/item/storage/box/fancy/cigarettes/dromedaryco = 5, /obj/item/storage/box/fancy/cigarettes/nicotine = 3, /obj/item/storage/box/fancy/cigarettes/pra = 6, + /obj/item/storage/box/fancy/cigarettes/dpra = 6, + /obj/item/storage/box/fancy/cigarettes/nka = 6, /obj/item/storage/chewables/rollable = 8, /obj/item/storage/chewables/rollable/unathi = 6, /obj/item/storage/chewables/rollable/fine = 5, @@ -406,6 +427,8 @@ /obj/item/storage/box/fancy/cigarettes/dromedaryco = 82, /obj/item/storage/box/fancy/cigarettes/nicotine = 89, /obj/item/storage/box/fancy/cigarettes/pra = 79, + /obj/item/storage/box/fancy/cigarettes/dpra = 84, + /obj/item/storage/box/fancy/cigarettes/nka = 74, /obj/item/storage/chewables/rollable = 63, /obj/item/storage/chewables/rollable/unathi = 65, /obj/item/storage/chewables/rollable/fine = 69, @@ -459,6 +482,7 @@ /obj/item/reagent_containers/glass/bottle/perconol = 3, /obj/item/reagent_containers/glass/bottle/toxin = 1, /obj/item/reagent_containers/glass/bottle/coughsyrup = 4, + /obj/item/reagent_containers/glass/bottle/thetamycin = 1, /obj/item/reagent_containers/syringe = 12, /obj/item/device/healthanalyzer = 5, /obj/item/device/breath_analyzer = 2, @@ -653,13 +677,15 @@ /obj/item/seeds/chiliseed = 3, /obj/item/seeds/cocoapodseed = 3, /obj/item/seeds/cornseed = 3, - /obj/item/seeds/replicapod = 3, + /obj/item/seeds/dynseed = 3, /obj/item/seeds/earthenroot = 2, /obj/item/seeds/eggplantseed = 3, + /obj/item/seeds/eki = 3, /obj/item/seeds/garlicseed = 3, /obj/item/seeds/grapeseed = 3, /obj/item/seeds/grassseed = 3, /obj/item/seeds/greengrapeseed = 3, + /obj/item/seeds/guamiseed = 3, /obj/item/seeds/harebell = 3, /obj/item/seeds/lemonseed = 3, /obj/item/seeds/limeseed = 3, @@ -674,8 +700,11 @@ /obj/item/seeds/poppyseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/pumpkinseed = 3, - /obj/item/seeds/riceseed = 3, + /obj/item/seeds/qlortseed = 3, + /obj/item/seeds/clam/rasval = 3, + /obj/item/seeds/replicapod = 3, /obj/item/seeds/reishimycelium = 3, + /obj/item/seeds/riceseed = 3, /obj/item/seeds/shandseed = 3, /obj/item/seeds/soyaseed = 3, /obj/item/seeds/sugarcaneseed = 3, @@ -687,8 +716,8 @@ /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3, - /obj/item/seeds/dynseed = 3, - /obj/item/seeds/wulumunushaseed = 2 + /obj/item/seeds/wulumunushaseed = 2, + /obj/item/seeds/ylpha = 3 ) contraband = list( /obj/item/seeds/amanitamycelium = 3, @@ -714,13 +743,15 @@ /obj/item/seeds/chiliseed = 50, /obj/item/seeds/cocoapodseed = 50, /obj/item/seeds/cornseed = 30, - /obj/item/seeds/replicapod = 200, + /obj/item/seeds/dynseed = 80, /obj/item/seeds/earthenroot = 70, /obj/item/seeds/eggplantseed = 30, + /obj/item/seeds/eki = 90, /obj/item/seeds/garlicseed = 30, /obj/item/seeds/grapeseed = 40, /obj/item/seeds/grassseed = 40, /obj/item/seeds/greengrapeseed = 40, + /obj/item/seeds/guamiseed = 80, /obj/item/seeds/harebell = 10, /obj/item/seeds/lemonseed = 40, /obj/item/seeds/limeseed = 50, @@ -735,7 +766,10 @@ /obj/item/seeds/poppyseed = 10, /obj/item/seeds/potatoseed = 30, /obj/item/seeds/pumpkinseed = 40, + /obj/item/seeds/qlortseed = 70, + /obj/item/seeds/clam/rasval = 100, /obj/item/seeds/reishimycelium = 30, + /obj/item/seeds/replicapod = 200, /obj/item/seeds/riceseed = 20, /obj/item/seeds/shandseed = 60, /obj/item/seeds/soyaseed = 40, @@ -748,8 +782,8 @@ /obj/item/seeds/watermelonseed = 30, /obj/item/seeds/wheatseed = 20, /obj/item/seeds/whitebeetseed = 20, - /obj/item/seeds/dynseed = 80, - /obj/item/seeds/wulumunushaseed = 90 + /obj/item/seeds/wulumunushaseed = 90, + /obj/item/seeds/ylpha = 95 ) restock_items = 1 random_itemcount = 0 @@ -781,32 +815,6 @@ src.product_records.Add(product) -/obj/machinery/vending/magivend - name = "MagiVend" - desc = "A magic vending machine." - icon_state = "magivend" - product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!" - vend_delay = 15 - vend_reply = "Have an enchanted evening!" - product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!" //What the fuck is this - vend_id = "magic" - products = list( - /obj/item/clothing/head/wizard = 1, - /obj/item/clothing/suit/wizrobe = 1, - /obj/item/clothing/shoes/sandal = 1, - /obj/item/staff = 1 - ) - contraband = list( - /obj/item/clothing/head/wizard/red = 1, - /obj/item/clothing/suit/wizrobe/red = 1, - ) - premium = list( - /obj/item/clothing/head/wizard/fake = 1 - ) - restock_items = 1 - random_itemcount = 0 - light_color = COLOR_BABY_BLUE - /obj/machinery/vending/dinnerware name = "Dinnerware" desc = "A kitchen and restaurant equipment vendor." @@ -821,6 +829,9 @@ /obj/item/material/knife = 2, /obj/item/material/hatchet/butch = 2, /obj/item/reagent_containers/food/drinks/drinkingglass = 12, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/carafe = 3, + /obj/item/reagent_containers/food/drinks/pitcher = 3, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup = 6, /obj/item/clothing/suit/chef/classic = 2, /obj/item/material/kitchen/rollingpin = 2, /obj/item/reagent_containers/cooking_container/oven = 5, @@ -853,7 +864,10 @@ /obj/item/material/kitchen/utensil/spoon/plastic = 12, /obj/item/material/kitchen/utensil/knife/plastic = 12, /obj/item/material/kitchen/utensil/fork/chopsticks/cheap = 12, - /obj/item/reagent_containers/food/drinks/drinkingglass = 12 + /obj/item/reagent_containers/food/drinks/drinkingglass = 12, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/carafe = 3, + /obj/item/reagent_containers/food/drinks/pitcher = 3, + /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup = 6 ) /obj/machinery/vending/sovietsoda @@ -893,11 +907,12 @@ /obj/item/wrench = 5, /obj/item/device/analyzer = 5, /obj/item/device/t_scanner = 5, - /obj/item/screwdriver = 5 + /obj/item/screwdriver = 5, + /obj/item/tape_roll = 3 ) contraband = list( /obj/item/weldingtool/hugetank = 2, - /obj/item/clothing/gloves/fyellow = 2 + /obj/item/clothing/gloves/yellow/budget = 2 ) premium = list( /obj/item/clothing/gloves/yellow = 1 @@ -1023,7 +1038,8 @@ /obj/item/stock_parts/micro_laser = 5, /obj/item/stock_parts/matter_bin = 5, /obj/item/stock_parts/manipulator = 5, - /obj/item/stock_parts/console_screen = 5 + /obj/item/stock_parts/console_screen = 5, + /obj/item/tape_roll = 5 ) // There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty. // Another invalid entry, /obj/item/circuitry. I don't even know what that would translate to, removed it. diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index b7dfef4d352..a721cbdec28 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -50,10 +50,11 @@ I.decontaminate() //Tanning! - for(var/obj/item/stack/material/hairlesshide/HH in contents) - var/obj/item/stack/material/wetleather/WL = new(src) - WL.amount = HH.amount - qdel(HH) + for(var/obj/item/stack/material/animalhide/barehide/BH in contents) + var/obj/item/stack/material/animalhide/wetleather/WL = new(src) + WL.amount = BH.amount + contents -= BH + qdel(BH) if( locate(/mob,contents) ) state = 7 @@ -71,6 +72,9 @@ if(state in list(1,3,6) ) usr.forceMove(src.loc) +/obj/machinery/washing_machine/AltClick(mob/user) + if(Adjacent(user)) + start() /obj/machinery/washing_machine/update_icon() icon_state = "wm_[state][panel]" @@ -94,7 +98,7 @@ state = 3 else ..() - else if(istype(W,/obj/item/stack/material/hairlesshide) || \ + else if(istype(W,/obj/item/stack/material/animalhide/barehide) || \ istype(W,/obj/item/clothing/under) || \ istype(W,/obj/item/clothing/mask) || \ istype(W,/obj/item/clothing/head) || \ diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index de413f7685d..fba3febd6d3 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -23,7 +23,7 @@ return ..() -/obj/proc/buckle(atom/movable/MA) +/obj/proc/buckle(atom/movable/MA, mob/user) if ((MA.loc != loc) && !(density && get_dist(src, MA) <= 1)) return 0 if (MA.loc != loc) @@ -31,6 +31,13 @@ if (is_type_in_list(MA, can_buckle)) if(!(MA.can_be_buckled) || MA.buckled_to) return 0 + if(user) + if(MA != user) + if(isliving(MA)) + var/mob/living/L = MA + if(!L.lying) + if(!do_mob(user, L, 3 SECONDS)) + return 0 MA.buckled_to = src buckled = MA if(istype(MA, /mob/living)) @@ -83,7 +90,7 @@ add_fingerprint(user) unbuckle()//this is now just for safety, buckling someone into an occupied chair will fail, instead of removing the occupant - if(buckle(MA)) + if(buckle(MA, user)) if(MA == user) MA.visible_message(\ "[MA.name] buckles themselves to [src].",\ diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index b26f2a00c06..2814320d3f2 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -236,9 +236,11 @@ break if(bad_turf) continue - if(prob(min(seed.get_trait(TRAIT_POTENCY),50)) && sporecount < max(1,round(seed.get_trait(TRAIT_POTENCY)/20),1)) + if(prob(min(seed.get_trait(TRAIT_POTENCY), 50))) new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(T,seed) sporecount++ + if(sporecount < max(1, round(seed.get_trait(TRAIT_POTENCY) / 20), 1)) + break //------------------------------------------ diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index 32827e4b091..edcf9f214ac 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -186,4 +186,12 @@ coming_state = "claw1" going_state = "claw2" random_icon_states = null - amount = 0 \ No newline at end of file + amount = 0 + +/obj/effect/decal/cleanable/blood/tracks/body + name = "wet trails" + dryname = "dried trails" + desc = "A still-wet trail left by someone crawling." + drydesc = "A dried trail left by someone crawling." + coming_state = "trail1" + going_state = "trail2" \ No newline at end of file diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index ab82e8d467b..33fa756fd84 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -390,3 +390,15 @@ steam.start() -- spawns the effect round(min(light, BOMBCAP_LIGHT_RADIUS)), round(min(flash, BOMBCAP_FLASH_RADIUS)) ) + +/obj/effect/temporary_effect + name = "self deleting effect" + desc = "How are you examining what which cannot be seen?" + icon = 'icons/effects/effects.dmi' + invisibility = 0 + var/time_to_die = 10 SECONDS // Afer which, it will delete itself. + +/obj/effect/temporary_effect/Initialize() + . = ..() + if(time_to_die) + QDEL_IN(src, time_to_die) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 9824cdc405d..08843b8374c 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -241,11 +241,6 @@ new /obj/item/staff/(src.loc) delete_me = 1 -/obj/effect/landmark/costume/sexyclown/New() - new /obj/item/clothing/mask/gas/sexyclown(src.loc) - new /obj/item/clothing/under/sexyclown(src.loc) - delete_me = 1 - /obj/effect/landmark/costume/sexymime/New() new /obj/item/clothing/mask/gas/sexymime(src.loc) new /obj/item/clothing/under/sexymime(src.loc) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 866dec788a9..a739205e43e 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -61,13 +61,19 @@ if(!target) qdel(src) return + var/has_teleported = FALSE if(istype(M, /atom/movable)) if(has_failed) //oh dear a problem, put em in deep space icon_state = "portal1" // only tell people the portal failed after a teleport has been done desc = "A bluespace tear in space, reaching directly to another point within this region. Definitely unstable." - do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0) + if(do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0)) + has_teleported = TRUE else - do_teleport(M, target, precision) + if(do_teleport(M, target, precision)) + has_teleported = TRUE + if(!has_teleported) + visible_message(SPAN_WARNING("\The [src] oscillates violently as \the [M] comes into contact with it, and collapses! Seems like the rift was unstable...")) + qdel(src) /obj/effect/portal/Destroy() if(istype(creator, /obj/item/hand_tele)) diff --git a/code/game/objects/effects/temporary_visuals/teleport_visuals.dm b/code/game/objects/effects/temporary_visuals/teleport_visuals.dm new file mode 100644 index 00000000000..de0d9fc0f46 --- /dev/null +++ b/code/game/objects/effects/temporary_visuals/teleport_visuals.dm @@ -0,0 +1,19 @@ +/obj/effect/temp_visual/phase + icon = 'icons/mob/mob.dmi' + icon_state = "phasein" + layer = ABOVE_MOB_LAYER + mouse_opacity = 0 + duration = 15 + +/obj/effect/temp_visual/phase/out + icon_state = "phaseout" + +/obj/effect/temp_visual/phase/rift + icon = 'icons/obj/rig_modules.dmi' + icon_state = "rift" + layer = BELOW_MOB_LAYER + alpha = 125 + +/obj/effect/temp_visual/phase/rift/Initialize(mapload, dir) + . = ..() + SpinAnimation() \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm index b9688f5e5ac..1608a6b7563 100644 --- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm +++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm @@ -7,9 +7,12 @@ var/duration = 10 //in deciseconds var/randomdir = TRUE -/obj/effect/temp_visual/Initialize() +/obj/effect/temp_visual/Initialize(mapload, var/new_dir) . = ..() - if(randomdir) + + if(new_dir) + set_dir(new_dir) + else if(randomdir) set_dir(pick(global.cardinal)) QDEL_IN(src, duration) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 658102a4e3f..b86c58ffcfb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -22,6 +22,8 @@ var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags + var/max_pressure_protection // Set this variable if the item protects its wearer against high pressures below an upper bound. Keep at null to disable protection. + var/min_pressure_protection // Set this variable if the item protects its wearer against low pressures above a lower bound. Keep at null to disable protection. 0 represents protection against hard vacuum. var/datum/action/item_action/action var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. @@ -92,6 +94,7 @@ var/charge_failure_message = " cannot be recharged." + var/held_maptext var/cleaving = FALSE var/reach = 1 // Length of tiles it can reach, 1 is adjacent. @@ -105,6 +108,9 @@ if(armor[type]) AddComponent(/datum/component/armor, armor) break + if(flags & HELDMAPTEXT) + set_initial_maptext() + check_maptext() /obj/item/Destroy() if(ismob(loc)) @@ -244,9 +250,9 @@ // Due to storage type consolidation this should get used more now. // I have cleaned it up a little, but it could probably use more. -Sayu -/obj/item/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W,/obj/item/storage)) - var/obj/item/storage/S = W +/obj/item/attackby(obj/item/I, mob/user) + if(istype(I,/obj/item/storage)) + var/obj/item/storage/S = I if(S.use_to_pickup) if(S.collection_mode && !is_type_in_list(src, S.pickup_blacklist)) //Mode is set to collect all items on a tile and we clicked on a valid one. if(isturf(loc)) @@ -255,21 +261,21 @@ var/failure = FALSE var/original_loc = user ? user.loc : null - for(var/obj/item/I in loc) + for(var/obj/item/item in loc) if (user && user.loc != original_loc) break - if(rejections[I.type]) // To limit bag spamming: any given type only complains once + if(rejections[item.type]) // To limit bag spamming: any given type only complains once continue - if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no - rejections[I.type] = TRUE // therefore full bags are still a little spammy + if(!S.can_be_inserted(item)) // Note can_be_inserted still makes noise when the answer is no + rejections[item.type] = TRUE // therefore full bags are still a little spammy failure = TRUE CHECK_TICK continue success = TRUE - S.handle_item_insertion_deferred(I, user) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. + S.handle_item_insertion_deferred(item, user) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. CHECK_TICK // Because people insist on picking up huge-ass piles of stuff. S.handle_storage_deferred(user) @@ -305,25 +311,24 @@ return 0 /obj/item/throw_impact(atom/hit_atom) - ..() if(isliving(hit_atom)) //Living mobs handle hit sounds differently. var/mob/living/L = hit_atom if(L.in_throw_mode) playsound(hit_atom, pickup_sound, PICKUP_SOUND_VOLUME, TRUE) - return - var/volume = get_volume_by_throwforce_and_or_w_class() - if(throwforce > 0) - if(mob_throw_hit_sound) - playsound(hit_atom, mob_throw_hit_sound, volume, TRUE, -1) - else if(hitsound) - playsound(hit_atom, hitsound, volume, TRUE, -1) - else - playsound(hit_atom, 'sound/weapons/genhit.ogg', volume, TRUE, -1) else - playsound(hit_atom, 'sound/weapons/throwtap.ogg', 1, volume, -1) + var/volume = get_volume_by_throwforce_and_or_w_class() + if(throwforce > 0) + if(mob_throw_hit_sound) + playsound(hit_atom, mob_throw_hit_sound, volume, TRUE, -1) + else if(hitsound) + playsound(hit_atom, hitsound, volume, TRUE, -1) + else + playsound(hit_atom, 'sound/weapons/genhit.ogg', volume, TRUE, -1) + else + playsound(hit_atom, 'sound/weapons/throwtap.ogg', 1, volume, -1) else playsound(src, drop_sound, THROW_SOUND_VOLUME) - + return ..() //Apparently called whenever an item is dropped on the floor, thrown, or placed into a container. //It is called after loc is set, so if placed in a container its loc will be that container. @@ -334,7 +339,7 @@ // Called whenever an object is moved around inside the mob's contents. // Linker proc: mob/proc/prepare_for_slotmove, which is referenced in proc/handle_item_insertion and obj/item/attack_hand. // This shit exists so that dropped() could almost exclusively be called when an item is dropped. -/obj/item/proc/on_slotmove(var/mob/user) +/obj/item/proc/on_slotmove(var/mob/user, slot) if(zoom) zoom(user) @@ -342,6 +347,8 @@ /obj/item/proc/pickup(mob/user) pixel_x = 0 pixel_y = 0 + if(flags & HELDMAPTEXT) + addtimer(CALLBACK(src, .proc/check_maptext), 1) // invoke async does not work here do_pickup_animation(user) // called when this item is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. @@ -435,6 +442,16 @@ var/list/global/slot_flags_enumeration = list( return 0 if(slot_wear_id) return 1 + if(slot_l_hand) + var/obj/item/organ/external/O + O = H.organs_by_name[BP_L_HAND] + if(!O || !O.is_usable() || O.is_malfunctioning()) + return FALSE + if(slot_r_hand) + var/obj/item/organ/external/O + O = H.organs_by_name[BP_R_HAND] + if(!O || !O.is_usable() || O.is_malfunctioning()) + return FALSE if(slot_l_store, slot_r_store) if(!H.w_uniform && (slot_w_uniform in mob_equip)) if(!disable_warning) @@ -503,8 +520,8 @@ var/list/global/slot_flags_enumeration = list( // override for give shenanigans /obj/item/proc/on_give(var/mob/giver, var/mob/receiver) - return - + if(flags & HELDMAPTEXT) + check_maptext() //This proc is executed when someone clicks the on-screen UI button. To make the UI button show, set the 'icon_action_button' to the icon_state of the image of the button in screen1_action.dmi //The default action is attack_self(). @@ -513,12 +530,11 @@ var/list/global/slot_flags_enumeration = list( attack_self(usr) //RETURN VALUES -//handle_shield should return a positive value to indicate that the attack is blocked and should be prevented. -//If a negative value is returned, it should be treated as a special return value for bullet_act() and handled appropriately. -//For non-projectile attacks this usually means the attack is blocked. +//handle_shield +//Return a negative value corresponding to the degree an attack is blocked. PROJECTILE_STOPPED stops the attack entirely, and is the default for projectile and non-projectile attacks //Otherwise should return 0 to indicate that the attack is not affected in any way. /obj/item/proc/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - return 0 + return FALSE /obj/item/proc/can_shield_back() return @@ -529,35 +545,18 @@ var/list/global/slot_flags_enumeration = list( L = L.loc return loc -/obj/item/proc/eyestab(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - - var/mob/living/carbon/human/H = M - if(istype(H)) - for(var/obj/item/protection in list(H.head, H.wear_mask, H.glasses)) - if(protection && (protection.body_parts_covered & EYES)) - // you can't stab someone in the eyes wearing a mask! - to_chat(user, "You're going to need to remove the eye covering first.") - return - - if(!M.has_eyes()) - to_chat(user, "You cannot locate any eyes on [M]!") +/obj/item/proc/eyestab(mob/living/carbon/M, mob/living/carbon/user) + if(M.eyes_protected(src, TRUE)) return + var/mob/living/carbon/human/H = M admin_attack_log(user, M, "attacked [key_name(M)] with [src]", "was attacked by [key_name(user)] using \a [src]", "used \a [src] to eyestab") user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + playsound(loc, hitsound, 70, TRUE) user.do_attack_animation(M) - src.add_fingerprint(user) - //if((CLUMSY in user.mutations) && prob(50)) - // M = user - /* - to_chat(M, "You stab yourself in the eye.") - M.sdisabilities |= BLIND - M.weakened += 4 - M.adjustBruteLoss(10) - */ - + add_fingerprint(user) if(istype(H)) var/obj/item/organ/internal/eyes/eyes = H.get_eyes() @@ -574,26 +573,30 @@ var/list/global/slot_flags_enumeration = list( eyes.take_damage(rand(3,4)) if(eyes.damage >= eyes.min_bruised_damage) - if(M.stat != 2) + if(H.stat != DEAD) if(eyes.robotic <= 1) //robot eyes bleeding might be a bit silly - to_chat(M, "Your eyes start to bleed profusely!") + to_chat(H, "Your eyes start to bleed profusely!") if(prob(50)) - if(M.stat != 2) - to_chat(M, "You drop what you're holding and clutch at your eyes!") - M.drop_item() - M.eye_blurry += 10 - M.Paralyse(1) - M.Weaken(4) + if(H.stat != DEAD) + to_chat(H, "You drop what you're holding and clutch at your eyes!") + H.drop_item() + H.eye_blurry += 10 + H.Paralyse(1) + H.Weaken(4) if (eyes.damage >= eyes.min_broken_damage) - if(M.stat != 2) - to_chat(M, "You go blind!") + if(H.stat != DEAD) + to_chat(H, "You go blind!") var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD) - if(affecting.take_damage(7)) - M:UpdateDamageIcon() + if(affecting.take_damage(7, 0, damage_flags(), src)) + H.UpdateDamageIcon() else M.take_organ_damage(7) M.eye_blurry += rand(3,4) - return + +/obj/item/proc/protects_eyestab(var/obj/stab_item, var/stabbed = FALSE) // if stabbed is set to true if we're being stabbed and not just checking + if((item_flags & THICKMATERIAL) && (body_parts_covered & EYES)) + return TRUE + return FALSE /obj/item/clean_blood() . = ..() @@ -886,3 +889,63 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. // this gets called when the item gets chucked by the vending machine /obj/item/proc/vendor_action(var/obj/machinery/vending/V) return + +/obj/item/proc/set_initial_maptext() + return + +/obj/item/proc/check_maptext(var/new_maptext) + if(new_maptext) + held_maptext = new_maptext + if(ismob(loc) || (loc && ismob(loc.loc))) + maptext = held_maptext + else + maptext = "" + +/obj/item/throw_at() + ..() + if(flags & HELDMAPTEXT) + check_maptext() + +/obj/item/dropped(var/mob/user) + ..() + if(flags & HELDMAPTEXT) + check_maptext() + +// used to check whether the item is capable of popping things like balloons, inflatable barriers, or cutting police tape. +/obj/item/proc/can_puncture() + if(sharp || edge) + return TRUE + if(isFlameSource()) + return TRUE + return FALSE + +/obj/item/proc/get_pressure_weakness(pressure, zone) + . = 1 + if(pressure > ONE_ATMOSPHERE) + if(max_pressure_protection != null) + if(max_pressure_protection < pressure) + return min(1, round((pressure - max_pressure_protection) / max_pressure_protection, 0.01)) + else + return 0 + if(pressure < ONE_ATMOSPHERE) + if(min_pressure_protection != null) + if(min_pressure_protection > pressure) + return min(1, round((min_pressure_protection - pressure) / min_pressure_protection, 0.01)) + else + return 0 + +/obj/item/proc/in_slide_projector(var/mob/user) + if(istype(loc, /obj/item/storage/slide_projector)) + var/obj/item/storage/slide_projector/SP = loc + if(SP.current_slide == src && (SP.projection in view(world.view, user))) + return TRUE + return FALSE + +/obj/item/proc/get_belt_overlay() //Returns the icon used for overlaying the object on a belt + return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state) + +/obj/item/proc/get_ear_examine_text(var/mob/user, var/ear_text = "left") + return "on [user.get_pronoun("his")] [ear_text] ear" + +/obj/item/proc/get_mask_examine_text(var/mob/user) + return "on [user.get_pronoun("his")] face" \ No newline at end of file diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index e6e84140c28..00710d10450 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -22,6 +22,8 @@ var/const/ROOM_ERR_SPACE = -1 var/const/ROOM_ERR_TOOLARGE = -2 + var/list/active_blueprints + /obj/item/blueprints/Initialize(mapload, ...) . = ..() airlock_wires = new(src) @@ -32,7 +34,41 @@ return add_fingerprint(user) interact() - return + +/obj/item/blueprints/equipped(var/mob/user, var/slot) + . = ..() + if(slot == slot_l_hand || slot == slot_r_hand) + START_PROCESSING(SSprocessing, src) + LAZYINITLIST(active_blueprints) + +/obj/item/blueprints/dropped(mob/user) + . = ..() + STOP_PROCESSING(SSprocessing, src) + if(user.client) + for(var/thing in active_blueprints) + user.client.images -= thing + LAZYCLEARLIST(active_blueprints) + +/obj/item/blueprints/process() + var/mob/user = loc + if(!istype(user)) + return PROCESS_KILL + + var/turf/origin_turf = get_turf(src) + + var/list/new_prints = list() + for(var/turf/T as anything in RANGE_TURFS(world.view, origin_turf)) + for(var/image/I as anything in T.blueprints) + new_prints += I + + var/list/update_remove = active_blueprints - new_prints + active_blueprints = new_prints - update_remove + + for(var/thing in update_remove) + user.client.images -= thing + + for(var/thing in active_blueprints) + user.client.images += thing /obj/item/blueprints/Topic(href, href_list) ..() diff --git a/code/game/objects/items/devices/auto_cpr.dm b/code/game/objects/items/devices/auto_cpr.dm new file mode 100644 index 00000000000..78e70e95646 --- /dev/null +++ b/code/game/objects/items/devices/auto_cpr.dm @@ -0,0 +1,61 @@ +/obj/item/auto_cpr + name = "auto-compressor" + desc = "A device that gives regular compression to the victim's ribcage, used in case of urgent heart issues." + icon = 'icons/obj/auto_cpr.dmi' + icon_state = "pumper" + w_class = ITEMSIZE_NORMAL + origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + slot_flags = SLOT_OCLOTHING + var/last_pump + +/obj/item/auto_cpr/mob_can_equip(mob/living/carbon/human/H, slot, disable_warning = 0, force = 0) + . = ..() + if(force || !istype(H) || slot != slot_wear_suit) + return + if(H.species.get_bodytype() in list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_UNATHI)) //gtfo stinky bugs + return + else + return FALSE + +/obj/item/auto_cpr/attack(mob/living/carbon/human/M, mob/living/user, var/target_zone) + if(istype(M) && user.a_intent == I_HELP) + if(M.wear_suit) + to_chat(user, SPAN_WARNING("Their [M.wear_suit] is in the way, remove it first!")) + return 1 + user.visible_message(SPAN_NOTICE("[user] starts fitting [src] onto the [M]'s chest.")) + + if(!do_after(user, 2 SECONDS, M)) + return + + if(user.unEquip(src)) + if(!M.equip_to_slot_if_possible(src, slot_wear_suit, del_on_fail=0, disable_warning=1, redraw_mob=1)) + user.put_in_active_hand(src) + return 1 + else + return ..() + +/obj/item/auto_cpr/equipped(mob/user, slot) + ..() + START_PROCESSING(SSprocessing,src) + +/obj/item/auto_cpr/attack_hand(mob/user) + ..() + +/obj/item/auto_cpr/dropped(mob/user) + STOP_PROCESSING(SSprocessing,src) + ..() + +/obj/item/auto_cpr/process() + if(!ishuman(loc)) + return PROCESS_KILL + + var/mob/living/carbon/human/H = loc + if(H.get_inventory_slot(src) != slot_wear_suit) + return PROCESS_KILL + + if(world.time > last_pump + 10 SECONDS) + last_pump = world.time + playsound(src, 'sound/machines/pump.ogg', 25) + var/obj/item/organ/internal/heart/heart = H.internal_organs_by_name[BP_HEART] + if(heart) + heart.external_pump = list(world.time, 0.6) \ No newline at end of file diff --git a/code/game/objects/items/devices/lighting/flare.dm b/code/game/objects/items/devices/lighting/flare.dm index e4cdb850f1e..21d9a6db841 100644 --- a/code/game/objects/items/devices/lighting/flare.dm +++ b/code/game/objects/items/devices/lighting/flare.dm @@ -74,6 +74,9 @@ pickup_sound = 'sound/items/pickup/woodweapon.ogg' /obj/item/device/flashlight/flare/torch/attack_self(mob/user) + if (on) + turn_off() + user.visible_message("[user] extinguishes \the [src].", SPAN_NOTICE("You extinguish \the [src].")) return /obj/item/device/flashlight/flare/torch/update_icon() @@ -99,6 +102,24 @@ else ..() +/obj/item/device/flashlight/flare/torch/isFlameSource() + return on + +/obj/item/device/flashlight/flare/torch/process() + var/turf/pos = get_turf(src) + if(pos) + pos.hotspot_expose(produce_heat, 5) + fuel = max(fuel - 1, 0) + if(!fuel || !on) + turn_off() + STOP_PROCESSING(SSprocessing, src) + if(!fuel) + var/obj/item/torch/T = new(pos) + if(ismob(src.loc)) + var/mob/H = src.loc + H.put_in_hands(T) + qdel(src) + /obj/item/torch name = "torch handle" desc = "A torch handle without its head." diff --git a/code/game/objects/items/devices/lighting/glowstick.dm b/code/game/objects/items/devices/lighting/glowstick.dm index c6d6b1e8d58..c88a253c07a 100644 --- a/code/game/objects/items/devices/lighting/glowstick.dm +++ b/code/game/objects/items/devices/lighting/glowstick.dm @@ -2,8 +2,8 @@ name = "green glowstick" desc = "A green military-grade glowstick." w_class = ITEMSIZE_SMALL - brightness_on = 1.5 - light_power = 1.5 + brightness_on = 1.2 + light_power = 2 color = "#49F37C" icon_state = "glowstick" item_state = "glowstick" diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 3d2f1e667f4..f50819b3cbb 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -137,6 +137,8 @@ return if (do_after(user, load_interval, needhand = 0) && boxstartloc == box.loc && ourstartloc == src.loc) + if(uses >= max_uses) //catches loading from multiple boxes + break uses++ to_chat(user, "Light loaded: [uses]/[max_uses]") playsound(src.loc, 'sound/machines/click.ogg', 20, 1) diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index a09c13951a3..fe250418716 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -116,7 +116,7 @@ return playsound(src.loc, 'sound/weapons/blade_open.ogg', 50, 1) - var/obj/item/P = new voidsuit_product(W.loc) + var/obj/item/P = new voidsuit_product(get_turf(W)) if(!reconverting) to_chat(user, SPAN_NOTICE("Your permit for a [P] has been processed. Enjoy!")) @@ -143,4 +143,21 @@ desc = "A simple cardboard box containing the requisition forms, permits, and decal kits for a Himean voidsuit." desc_fluff = "As part of a cost-cutting and productivity-enhancing initiative, NanoTrasen has authorized a number of Himean Type-76 'Fish Fur'\ for use by miners originating from the planet. Most of these suits are assembled in Cannington and painstakingly optimized on-site by their\ - individual operator leading to a large trail of red tape as NanoTrasen is forced to inspect these suits to ensure their safety." \ No newline at end of file + individual operator leading to a large trail of red tape as NanoTrasen is forced to inspect these suits to ensure their safety." + +/obj/item/voidsuit_modkit/himeo/tajara + name = "tajaran himeo voidsuit kit" + desc = "A simple cardboard box containing the requisition forms, permits, and decal kits for a Himean voidsuit fitted for Tajara." + desc_fluff = "As part of a cost-cutting and productivity-enhancing initiative, NanoTrasen has authorized a number of Himean Type-76 'Fish Fur'\ + for use by miners and engineers originating from the planet. Most of these suits are assembled in Cannington and painstakingly optimized on-site by their\ + individual operator leading to a large trail of red tape as NanoTrasen is forced to inspect these suits to ensure their safety." + suit_options = list( + /obj/item/clothing/suit/space/void/mining = /obj/item/clothing/suit/space/void/mining/himeo/tajara, + /obj/item/clothing/head/helmet/space/void/mining = /obj/item/clothing/head/helmet/space/void/mining/himeo/tajara, + + /obj/item/clothing/suit/space/void/engineering = /obj/item/clothing/suit/space/void/engineering/himeo/tajara, + /obj/item/clothing/head/helmet/space/void/engineering = /obj/item/clothing/head/helmet/space/void/engineering/himeo/tajara, + + /obj/item/clothing/suit/space/void/atmos = /obj/item/clothing/suit/space/void/atmos/himeo/tajara, + /obj/item/clothing/head/helmet/space/void/atmos = /obj/item/clothing/head/helmet/space/void/atmos/himeo/tajara + ) \ No newline at end of file diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 210aedc63f1..f97cb0b9668 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -1,19 +1,17 @@ /** * Multitool -- A multitool is used for hacking electronic devices. - * TO-DO -- Using it as a power measurement tool for cables etc. Nannek. * */ /obj/item/device/multitool name = "multitool" - desc = "Used for pulsing wires to test which to cut. Not recommended by doctors." - desc_info = "You can use this on airlocks or APCs to try to hack them without cutting wires." + desc = "This small, handheld device is made of durable, insulated plastic. It has a electrode jack, perfect for interfacing with numerous machines, as well as an in-built NT-SmartTrack! system." + desc_info = "You can use this on airlocks or APCs to try to hack them without cutting wires. You can also use it to wire circuits, and track APCs by using it in-hand." + icon = 'icons/obj/contained_items/tools/multitool.dmi' icon_state = "multitool" item_state = "multitool" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_tools.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_tools.dmi', - ) + item_icons = null + contained_sprite = TRUE flags = CONDUCT force = 5.0 w_class = ITEMSIZE_SMALL @@ -32,8 +30,15 @@ var/buffer_name var/atom/buffer_object + var/tracking_apc = FALSE + var/mutable_appearance/apc_indicator + + var/datum/integrated_io/selected_io = null + var/mode = 0 + /obj/item/device/multitool/Destroy() unregister_buffer(buffer_object) + QDEL_NULL(apc_indicator) return ..() /obj/item/device/multitool/ismultitool() @@ -61,6 +66,7 @@ buffer_object = buffer if(buffer_object) destroyed_event.register(buffer_object, src, /obj/item/device/multitool/proc/unregister_buffer) + update_icon() /obj/item/device/multitool/proc/unregister_buffer(var/atom/buffer_to_unregister) // Only remove the buffered object, don't reset the name @@ -68,6 +74,7 @@ if(buffer_to_unregister == buffer_object && buffer_object) destroyed_event.unregister(buffer_object, src) buffer_object = null + update_icon() /obj/item/device/multitool/resolve_attackby(atom/A, mob/user, var/click_parameters) if(!isobj(A)) @@ -81,3 +88,128 @@ user.AddTopicPrint(src) MT.interact(src, user) return 1 + +/obj/item/device/multitool/attack_self(mob/user) + interact(user) + +/obj/item/device/multitool/interact(mob/user) + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) + if(!ui) + ui = new(user, src, "devices-multitool", 300, 250, capitalize_first_letters(name), state = inventory_state) + ui.open() + +/obj/item/device/multitool/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + if(!data) + data = list() + + VUEUI_SET_CHECK(data["tracking_apc"], tracking_apc, ., data) + + VUEUI_SET_CHECK(data["has_selected_io"], !isnull(selected_io), ., data) + if(selected_io) + VUEUI_SET_CHECK(data["selected_io_name"], selected_io.name, ., data) + VUEUI_SET_CHECK(data["selected_io_type"], selected_io.io_type, ., data) + +/obj/item/device/multitool/Topic(href, href_list) + . = ..() + if(.) + return TRUE + + if(href_list["track_apc"]) + tracking_apc = !tracking_apc + if(tracking_apc) + START_PROCESSING(SSprocessing, src) + apc_indicator = mutable_appearance(icon, "lost") + add_overlay(apc_indicator) + else + STOP_PROCESSING(SSprocessing, src) + QDEL_NULL(apc_indicator) + + if(href_list["clear_io"]) + selected_io = null + + update_icon() + SSvueui.check_uis_for_change(src) + +/obj/item/device/multitool/update_icon() + if(tracking_apc) + icon_state = "multitool_clear" + else if(selected_io) + if(buffer || connecting || buffer_object) + icon_state = "multitool_tracking" + else + icon_state = "multitool_red" + else + if(buffer || connecting || buffer_object) + icon_state = "multitool_tracking_fail" + else + icon_state = "multitool" + +/obj/item/device/multitool/process() + if(!apc_indicator) + return PROCESS_KILL + + var/turf/T = get_turf(src) + var/area/A = T.loc + var/obj/machinery/power/apc/APC = A.apc + + if(!APC || (APC.z != T.z)) + apc_indicator.icon_state = "lost" + else + // shamelessly stolen from technomancer + dir = get_dir(T, APC.loc) // overlays can't have different dirs than their atoms, but the multitool only has one dir sprite, so this works + switch(get_dist(T, APC.loc)) + if(-1 to 0) + apc_indicator.icon_state = "direct" + if(1 to 8) + apc_indicator.icon_state = "close" + if(9 to 16) + apc_indicator.icon_state = "medium" + if(16 to INFINITY) + apc_indicator.icon_state = "far" + set_overlays(apc_indicator) + +/obj/item/device/multitool/proc/wire(datum/integrated_io/io, mob/user) + if(!io.holder.assembly) + to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.") + return + + if(selected_io) + if(io == selected_io) + to_chat(user, "Wiring \the [selected_io.holder]'s '[selected_io.name]' pin into itself is rather pointless.") + return + if(io.io_type != selected_io.io_type) + to_chat(user, "Those two types of channels are incompatable. The first is a [selected_io.io_type], \ + while the second is a [io.io_type].") + return + if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly) + to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.") + return + selected_io.linked |= io + io.linked |= selected_io + + to_chat(user, "You connect \the [selected_io.holder]'s '[selected_io.name]' pin to \the [io.holder]'s '[io.name]' pin.") + selected_io.holder.interact(user) // This is to update the UI. + selected_io = null + + else + selected_io = io + to_chat(user, "You link \the multitool to \the [selected_io.holder]'s [selected_io.name] data channel.") + + update_icon() + SSvueui.check_uis_for_change(src) + +/obj/item/device/multitool/proc/unwire(datum/integrated_io/io1, datum/integrated_io/io2, mob/user) + if(!io1.linked.len || !io2.linked.len) + to_chat(user, "There is nothing connected to the data channel.") + return + + if(!(io1 in io2.linked) || !(io2 in io1.linked) ) + to_chat(user, "These data pins aren't connected!") + return + else + io1.linked.Remove(io2) + io2.linked.Remove(io1) + to_chat(user, "You clip the data connection between the [io1.holder.displayed_name]'s \ + '[io1.name]' pin and the [io2.holder.displayed_name]'s '[io2.name]' pin.") + io1.holder.interact(user) // This is to update the UI. + update_icon() \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/_radio_defines.dm b/code/game/objects/items/devices/radio/_radio_defines.dm index c277e4b8746..19b708d2921 100644 --- a/code/game/objects/items/devices/radio/_radio_defines.dm +++ b/code/game/objects/items/devices/radio/_radio_defines.dm @@ -16,4 +16,24 @@ #define CHANNEL_MERCENARY "Mercenary" #define CHANNEL_NINJA "Ninja" #define CHANNEL_BLUESPACE "Bluespace" -#define CHANNEL_BURGLAR "Burglar" \ No newline at end of file +#define CHANNEL_BURGLAR "Burglar" + +var/global/list/ALL_RADIO_CHANNELS = list( + CHANNEL_COMMON = TRUE, + CHANNEL_ENTERTAINMENT = TRUE, + CHANNEL_COMMAND = TRUE, + CHANNEL_SCIENCE = TRUE, + CHANNEL_MEDICAL = TRUE, + CHANNEL_ENGINEERING = TRUE, + CHANNEL_SECURITY = TRUE, + CHANNEL_SUPPLY = TRUE, + CHANNEL_SERVICE = TRUE, + CHANNEL_AI_PRIVATE = TRUE, + CHANNEL_PENAL = TRUE, + CHANNEL_RESPONSE_TEAM = TRUE, + CHANNEL_RAIDER = TRUE, + CHANNEL_MERCENARY = TRUE, + CHANNEL_NINJA = TRUE, + CHANNEL_BLUESPACE = TRUE, + CHANNEL_BURGLAR = TRUE + ) \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 3d254cb59ee..a2e67bd4bb8 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -18,26 +18,6 @@ return ..() -/obj/item/device/radio/electropack/attackby(obj/item/W as obj, mob/user as mob) - ..() - if(istype(W, /obj/item/clothing/head/helmet)) - if(!b_stat) - to_chat(user, "[src] is not ready to be attached!") - return - var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit( user ) - A.icon = 'icons/obj/assemblies.dmi' - - user.drop_from_inventory(W,A) - W.master = A - A.part1 = W - - user.drop_from_inventory(src,A) - master = A - A.part2 = src - - user.put_in_hands(A) - A.add_fingerprint(user) - /obj/item/device/radio/electropack/Topic(href, href_list) //..() if(usr.stat || usr.restrained()) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 82d32b9a959..658ad00bf48 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -182,6 +182,13 @@ name = "spare science radio encryption key" additional_channels = list(CHANNEL_SCIENCE = TRUE) +/obj/item/device/encryptionkey/cargo_spare + name = "spare supply radio encryption key" + additional_channels = list(CHANNEL_SUPPLY = TRUE) + +/obj/item/device/encryptionkey/service_spare + name = "spare service radio encryption key" + additional_channels = list(CHANNEL_SERVICE = TRUE) // Encryption Key Pouch /obj/item/storage/box/fancy/keypouch @@ -212,4 +219,10 @@ starts_with = list(/obj/item/device/encryptionkey/sec_spare = 3) /obj/item/storage/box/fancy/keypouch/sci - starts_with = list(/obj/item/device/encryptionkey/sci_spare = 3) \ No newline at end of file + starts_with = list(/obj/item/device/encryptionkey/sci_spare = 3) + +/obj/item/storage/box/fancy/keypouch/cargo + starts_with = list(/obj/item/device/encryptionkey/cargo_spare = 3) + +/obj/item/storage/box/fancy/keypouch/service + starts_with = list(/obj/item/device/encryptionkey/service_spare = 3) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 33507289e54..39fb3519154 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -306,7 +306,7 @@ var/global/list/default_medbay_channels = list( // If we were to send to a channel we don't have, drop it. return null -/obj/item/device/radio/talk_into(mob/living/M, message, channel, var/verb = "says", var/datum/language/speaking = null) +/obj/item/device/radio/talk_into(mob/living/M, message, channel, var/verb = "says", var/datum/language/speaking = null, var/ignore_restrained) if(!on) return 0 // the device has to be on // Fix for permacell radios, but kinda eh about actually fixing them. @@ -323,7 +323,7 @@ var/global/list/default_medbay_channels = list( return FALSE if(istype(M)) - if(M.restrained()) + if(M.restrained() && !ignore_restrained) to_chat(M, SPAN_WARNING("You can't speak into \the [src.name] while restrained.")) return FALSE M.trigger_aiming(TARGET_CAN_RADIO) @@ -537,7 +537,7 @@ var/global/list/default_medbay_channels = list( if (broadcasting) if(get_dist(src, M) <= canhear_range) - talk_into(M, msg,null,verb,speaking) + talk_into(M, msg,null,verb,speaking, ignore_restrained = TRUE) /obj/item/device/radio/proc/receive_range(freq, level) // check if this radio can receive on the given frequency, and if so, @@ -637,7 +637,7 @@ var/global/list/default_medbay_channels = list( /obj/item/device/radio/borg/list_channels(var/mob/user) return list_secure_channels(user) -/obj/item/device/radio/borg/talk_into() +/obj/item/device/radio/borg/talk_into(mob/living/M, message, channel, verb, datum/language/speaking, var/ignore_restrained) . = ..() if (isrobot(src.loc)) var/mob/living/silicon/robot/R = src.loc @@ -808,3 +808,7 @@ var/global/list/default_medbay_channels = list( /obj/item/device/radio/phone/medbay/Initialize() . = ..() internal_channels = default_medbay_channels.Copy() + +/obj/item/device/radio/all_channels/Initialize() + channels = ALL_RADIO_CHANNELS.Copy() + . = ..() \ No newline at end of file diff --git a/code/game/objects/items/devices/radio_jammer.dm b/code/game/objects/items/devices/radio_jammer.dm index 59f2aa7193a..07673cb66d3 100644 --- a/code/game/objects/items/devices/radio_jammer.dm +++ b/code/game/objects/items/devices/radio_jammer.dm @@ -131,6 +131,7 @@ var/list/active_radio_jammers = list() if (W.isscrewdriver()) to_chat(user, "You disassemble the improvised signal jammer.") user.put_in_hands(assembly_holder) + assembly_holder.detached() user.put_in_hands(cell) qdel(src) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 17524459c42..817891e5925 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -71,7 +71,7 @@ BREATH ANALYZER if (((user.is_clumsy()) || (DUMB in user.mutations)) && prob(50)) user.visible_message("[user] runs the scanner over the floor.", "You run the scanner over the floor.", "You hear metal repeatedly clunking against the floor.") to_chat(user, "Scan results for the floor:") - to_chat(user, "Overall Status: Healthy") + to_chat(user, "Overall Status: Healthy") return if(!usr.IsAdvancedToolUser()) @@ -248,7 +248,7 @@ BREATH ANALYZER if(!found_bleed && (e.status & ORGAN_ARTERY_CUT)) dat += "Arterial bleeding detected. Advanced scanner required for location." found_bleed = TRUE - if(!found_tendon && (e.status & ORGAN_TENDON_CUT)) + if(!found_tendon && (e.tendon_status() & TENDON_CUT)) dat += "Tendon or ligament damage detected. Advanced scanner required for location." found_tendon = TRUE if(found_disloc && found_bleed && found_tendon) @@ -322,8 +322,10 @@ BREATH ANALYZER /obj/item/device/analyzer name = "analyzer" desc = "A hand-held environmental scanner which reports current gas levels." - icon_state = "atmos" + icon = 'icons/obj/contained_items/tools/air_analyzer.dmi' + icon_state = "analyzer" item_state = "analyzer" + contained_sprite = TRUE w_class = ITEMSIZE_SMALL flags = CONDUCT slot_flags = SLOT_BELT @@ -415,7 +417,7 @@ BREATH ANALYZER /obj/item/device/reagent_scanner name = "reagent scanner" desc = "A hand-held reagent scanner which identifies chemical agents." - icon_state = "spectrometer" + icon_state = "reagent_scanner" item_state = "analyzer" w_class = ITEMSIZE_SMALL flags = CONDUCT @@ -429,31 +431,27 @@ BREATH ANALYZER var/details = 0 var/recent_fail = 0 -/obj/item/device/reagent_scanner/afterattack(obj/O, mob/user as mob, proximity) +/obj/item/device/reagent_scanner/afterattack(obj/O, mob/user, proximity) if(!proximity) return - if (user.stat) - return - if (!user.IsAdvancedToolUser()) - to_chat(user, "You don't have the dexterity to do this!") + if(use_check_and_message(user)) return if(!istype(O)) return if(isemptylist(O.reagents?.reagent_volumes)) - to_chat(user, "No active chemical agents found in [O].") + to_chat(user, SPAN_WARNING("No active chemical agents found in [O].")) return var/dat = "" var/one_percent = O.reagents.total_volume / 100 for (var/_R in O.reagents.reagent_volumes) var/decl/reagent/R = decls_repository.get_decl(_R) - dat += "\n \t [R][details ? ": [O.reagents.reagent_volumes[_R] / one_percent]%" : ""]" - to_chat(user, "Chemicals found: [dat]") - return + dat += "\n \t [R][details ? ": [O.reagents.reagent_volumes[_R] / one_percent]%" : ""]" + to_chat(user, SPAN_NOTICE("Chemicals found: [dat]")) /obj/item/device/reagent_scanner/adv name = "advanced reagent scanner" - icon_state = "adv_spectrometer" + icon_state = "adv_reagent_scanner" details = 1 origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2) @@ -504,6 +502,7 @@ BREATH ANALYZER name = "price scanner" desc = "Using an up-to-date database of various costs and prices, this device estimates the market price of an item up to 0.001% accuracy." icon_state = "price_scanner" + flags = NOBLUDGEON slot_flags = SLOT_BELT w_class = ITEMSIZE_SMALL throwforce = 0 @@ -541,7 +540,8 @@ BREATH ANALYZER if ( ((user.is_clumsy()) || (DUMB in user.mutations)) && prob(20)) to_chat(user,"Your hand slips from clumsiness!") - eyestab(H,user) + if(!H.eyes_protected(src, FALSE)) + eyestab(H,user) to_chat(user,"Alert: No breathing detected.") return diff --git a/code/game/objects/items/devices/slide_projector.dm b/code/game/objects/items/devices/slide_projector.dm new file mode 100644 index 00000000000..6490f84aa0c --- /dev/null +++ b/code/game/objects/items/devices/slide_projector.dm @@ -0,0 +1,207 @@ +/obj/item/storage/slide_projector + name = "slide projector" + desc = "A handy device capable of showing an enlarged projection of whatever you can fit inside." + desc_info = "You can use this in hand to open the interface, click-dragging it to you also works. Click anywhere with it in your hand to project at that location. Click dragging it to that location also works." + icon = 'icons/obj/projector.dmi' + icon_state = "projector0" + max_w_class = ITEMSIZE_SMALL + max_storage_space = 10 + use_sound = 'sound/items/storage/toolbox.ogg' + var/static/list/projection_types = list( + /obj/item/photo = /obj/effect/projection/photo, + /obj/item/paper = /obj/effect/projection/paper, + /obj/item = /obj/effect/projection + ) + var/obj/item/current_slide + var/obj/effect/projection/projection + +/obj/item/storage/slide_projector/Destroy() + QDEL_NULL(current_slide) + QDEL_NULL(projection) + return ..() + +/obj/item/storage/slide_projector/update_icon() + icon_state = "projector[!!projection]" + +/obj/item/storage/slide_projector/remove_from_storage(obj/item/W) + . = ..() + if(. && W == current_slide) + set_slide(length(contents) ? contents[1] : null) + +/obj/item/storage/slide_projector/handle_item_insertion(var/obj/item/W) + . = ..() + if(. && !current_slide) + set_slide(W) + +/obj/item/storage/slide_projector/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(istype(target, /obj/structure/table) && proximity_flag) + return + if(!current_slide) + to_chat(user, SPAN_WARNING("\The [src] does not have a slide loaded.")) + return + project_at(get_turf(target)) + +/obj/item/storage/slide_projector/MouseDrop(atom/over) + if(use_check_and_message(usr)) + return + + if(over == usr) + interact(usr) + return + + var/turf/T = get_turf(over) + if(istype(T)) + afterattack(over, usr) + +/obj/item/storage/slide_projector/proc/set_slide(obj/item/new_slide) + current_slide = new_slide + playsound(loc, 'sound/machines/slide_change.ogg', 50) + if(projection) + project_at(get_turf(projection)) + +/obj/item/storage/slide_projector/proc/check_projections() + if(!projection) + return + if(!(projection in view(7,get_turf(src)))) + stop_projecting() + +/obj/item/storage/slide_projector/proc/stop_projecting() + if(projection) + QDEL_NULL(projection) + moved_event.unregister(src, src, .proc/check_projections) + set_light(0) + update_icon() + +/obj/item/storage/slide_projector/proc/project_at(turf/target) + stop_projecting() + if(!current_slide) + return + var/projection_type + for(var/T in projection_types) + if(istype(current_slide, T)) + projection_type = projection_types[T] + break + projection = new projection_type(target) + projection.set_source(current_slide) + moved_event.register(src, src, .proc/check_projections) + set_light(1.4, 0.1, COLOR_WHITE) //Bit of light + update_icon() + +/obj/item/storage/slide_projector/attack_self(mob/user) + interact(user) + +/obj/item/storage/slide_projector/interact(mob/user) + var/data = list() + if(projection) + data += "Disable Projector" + else + data += "Projector Inactive" + + var/table = list("") + var/i = 1 + for(var/obj/item/I in contents) + table += "" + if(I == current_slide) + table += "" + else + table += "" + table += "" + i++ + table += "
#SLIDESHOW
#[i][I.name]SHOWING[I.name]SHOW
" + data += jointext(table,null) + + var/datum/browser/popup = new(user, "slides\ref[src]", "Slide Projector") + popup.set_content(jointext(data, "
")) + popup.open() + +/obj/item/storage/slide_projector/Topic(href, href_list) + . = ..() + if(.) + return + + if(href_list["stop_projector"]) + if(!projection) + return TRUE + stop_projecting() + . = FALSE + + if(href_list["set_active"]) + var/index = text2num(href_list["set_active"]) + if(index < 1 || index > contents.len) + return TRUE + set_slide(contents[index]) + . = FALSE + + interact(usr) + +/obj/effect/projection + name = "projected slide" + icon = 'icons/effects/effects.dmi' + icon_state = "white" + anchored = TRUE + simulated = FALSE + layer = EFFECTS_ABOVE_LIGHTING_LAYER + alpha = 100 + var/datum/weakref/source + +/obj/effect/projection/Initialize() + . = ..() + set_light(1.4, 0.1, COLOR_WHITE) //Makes turning off the lights not invalidate projection + +/obj/effect/projection/update_icon() + filters = filter(type="drop_shadow", color = COLOR_WHITE, size = 4, offset = 1,x = 0, y = 0) + project_icon() + +/obj/effect/projection/proc/project_icon() + var/obj/item/I = source.resolve() + if(!istype(I)) + qdel(src) + return + cut_overlays() + var/mutable_appearance/MA = new(I) + MA.layer = EFFECTS_ABOVE_LIGHTING_LAYER + MA.appearance_flags = RESET_ALPHA + MA.alpha = 170 + MA.pixel_x = 0 + MA.pixel_y = 0 + overlays |= MA + +/obj/effect/projection/proc/set_source(obj/item/I) + source = WEAKREF(I) + desc = "It's currently showing \the [I]." + update_icon() + +/obj/effect/projection/examine(mob/user, distance) + . = ..() + var/obj/item/slide = source.resolve() + if(!istype(slide)) + qdel(src) + return + return slide.examine(user, 1) + +/obj/effect/projection/photo + alpha = 170 + +/obj/effect/projection/photo/project_icon() + var/obj/item/photo/slide = source.resolve() + if(!istype(slide)) + qdel(src) + return + icon = slide.img + transform = matrix() + transform *= 1 / slide.photo_size + pixel_x = -32 * round(slide.photo_size/2) + pixel_y = -32 * round(slide.photo_size/2) + +/obj/effect/projection/paper + alpha = 140 + blend_mode = BLEND_ADD + +/obj/effect/projection/paper/project_icon() + var/obj/item/paper/P = source.resolve() + if(!istype(P)) + qdel(src) + return + cut_overlays() + if(P.info) + icon_state = "text[rand(1,3)]" \ No newline at end of file diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index 64a12a2e188..89bcae91812 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -3,10 +3,12 @@ /obj/item/device/t_scanner name = "\improper T-ray scanner" desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + icon = 'icons/obj/contained_items/tools/t_scanner.dmi' icon_state = "t-ray0" + item_state = "t-ray" + contained_sprite = TRUE slot_flags = SLOT_BELT w_class = ITEMSIZE_SMALL - item_state = "electronic" matter = list(DEFAULT_WALL_MATERIAL = 150) origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) action_button_name = "Toggle T-Ray scanner" diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index b74fb3c15a4..855b8ddb2f0 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -161,9 +161,6 @@ if(use_check_and_message(usr)) return - if(emagged) - to_chat(usr, SPAN_WARNING("The tape recorder makes a scratchy noise.")) - return if(recording) to_chat(usr, SPAN_WARNING("You can't playback when recording!")) return @@ -197,15 +194,15 @@ playing = FALSE if(emagged) audible_message("Tape Recorder: This tape recorder will self-destruct in... Five.", hearing_distance = 3) - sleep(10) + sleep(15) audible_message("Tape Recorder: Four.", hearing_distance = 3) - sleep(10) + sleep(15) audible_message("Tape Recorder: Three.", hearing_distance = 3) - sleep(10) + sleep(15) audible_message("Tape Recorder: Two.", hearing_distance = 3) - sleep(10) + sleep(15) audible_message("Tape Recorder: One.", hearing_distance = 3) - sleep(10) + sleep(15) explode() /obj/item/device/taperecorder/verb/print_transcript() @@ -302,6 +299,9 @@ to_chat(usr, SPAN_NOTICE("Recording stopped.")) icon_state = "taperecorderidle" return + else if(emagged) + to_chat(usr, SPAN_WARNING("The tape recorder's buttons doesn't react!")) + return else if(playing) playing = FALSE audible_message("Tape Recorder: Playback stopped.", hearing_distance = 3) diff --git a/code/game/objects/items/devices/uplink_random_lists.dm b/code/game/objects/items/devices/uplink_random_lists.dm index 1e1a2d81807..8db65f47bff 100644 --- a/code/game/objects/items/devices/uplink_random_lists.dm +++ b/code/game/objects/items/devices/uplink_random_lists.dm @@ -68,7 +68,6 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/heavy_vest) items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/powersink, 10, 10) items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/ai_module, 25, 0) - items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/teleporter, 10, 0) items += new/datum/uplink_random_item(/datum/uplink_item/item/implants/imp_freedom) items += new/datum/uplink_random_item(/datum/uplink_item/item/implants/imp_compress) diff --git a/code/game/objects/items/holomenu.dm b/code/game/objects/items/holomenu.dm new file mode 100644 index 00000000000..f458153101b --- /dev/null +++ b/code/game/objects/items/holomenu.dm @@ -0,0 +1,118 @@ +/obj/item/holomenu + name = "holo-menu" + desc = "A hologram projector, this one has been set up to display text above itself." + desc_info = "If you have bar or kitchen access, you can swipe your ID on this to root it in place, then you can click on it with an empty hand to adjust its text. Alt-clicking it will toggle its border." + icon = 'icons/obj/holomenu.dmi' + icon_state = "holomenu" + + layer = ABOVE_OBJ_LAYER + + light_color = LIGHT_COLOR_CYAN + light_range = 1.4 + + req_one_access = list(access_bar, access_kitchen) + + var/rave_mode = FALSE + var/menu_text = "" + var/border_on = FALSE + + var/image/holo_lights + var/image/holo_text + var/image/holo_border + +/obj/item/holomenu/Initialize() + . = ..() + holo_lights = image(icon, null, "holomenu-lights") + holo_text = image(icon, null, "holomenu-text") + holo_border = image(icon, null, "holomenu-border") + +/obj/item/holomenu/Destroy() + STOP_PROCESSING(SSfast_process, src) + return ..() + +/obj/item/holomenu/process() + update_icon() + +/obj/item/holomenu/update_icon() + cut_overlays() + if(anchored) + set_light(2) + if(rave_mode) + var/color_rotate = color_rotation(rand(-80, 80)) + holo_lights.color = color_rotate + holo_text.color = color_rotate + holo_border.color = color_rotate + else + holo_lights.color = null + holo_text.color = null + holo_border.color = null + add_overlay(holo_lights) + if(length(menu_text)) + add_overlay(holo_text) + if(border_on) + add_overlay(holo_border) + else + set_light(0) + +/obj/item/holomenu/attackby(obj/item/I, mob/user) + var/obj/item/card/id/ID = I.GetID() + if(istype(ID)) + if(check_access(ID)) + anchored = !anchored + to_chat(user, SPAN_NOTICE("You [anchored ? "" : "un"]anchor \the [src].")) + update_icon() + else + to_chat(user, SPAN_WARNING("Access denied.")) + return + return ..() + +/obj/item/holomenu/examine(mob/user, distance) + if(anchored && length(menu_text) && Adjacent(user)) + interact(user) + return + return ..() + +/obj/item/holomenu/attack_hand(mob/user) + if(anchored) + if(allowed(user)) + var/new_text = sanitize(input(user, "Enter new text for the holo-menu to display.", "Holo-Menu Display", html2pencode(menu_text, TRUE)) as null|message) + if(!isnull(new_text)) + menu_text = pencode2html(new_text) + update_icon() + else + interact(user) + return + return ..() + +/obj/item/holomenu/interact(mob/user) + var/datum/browser/holomenu_win = new(user, "holomenu", "Holo-Menu", 450, 500) + holomenu_win.set_content(menu_text) + holomenu_win.open() + +/obj/item/holomenu/AltClick(mob/user) + if(Adjacent(user)) + if(allowed(user)) + border_on = !border_on + to_chat(user, SPAN_NOTICE("You toggle \the [src]'s border to be [border_on ? "on" : "off"].")) + update_icon() + else + to_chat(user, SPAN_WARNING("Access denied.")) + return + return ..() + +/obj/item/holomenu/CtrlClick(mob/user) + if(Adjacent(user)) + if(allowed(user)) + rave_mode = !rave_mode + to_chat(user, SPAN_NOTICE("You toggle \the [src]'s rave mode [rave_mode ? "on" : "off"].")) + update_icon() + if(rave_mode) + START_PROCESSING(SSfast_process, src) + light_color = LIGHT_COLOR_HALOGEN // a more generic lighting + else + STOP_PROCESSING(SSfast_process, src) + light_color = initial(light_color) + else + to_chat(user, SPAN_WARNING("Access denied.")) + return + return ..() \ No newline at end of file diff --git a/code/game/objects/items/knitting.dm b/code/game/objects/items/knitting.dm new file mode 100644 index 00000000000..0658bf4cc4e --- /dev/null +++ b/code/game/objects/items/knitting.dm @@ -0,0 +1,121 @@ +/obj/item/knittingneedles + name = "knitting needles" + desc = "Silver knitting needles used for stitching yarn." + icon = 'icons/obj/contained_items/tools/knitting.dmi' + icon_state = "knittingneedles" + item_state = "knittingneedles" + w_class = ITEMSIZE_SMALL + contained_sprite = TRUE + var/working = FALSE + var/obj/item/yarn/ball + +/obj/item/knittingneedles/Destroy() + if(ball) + QDEL_NULL(ball) + return ..() + +/obj/item/knittingneedles/examine(mob/user) + if(..(user, 1)) + if(ball) + to_chat(user, "There is \the [ball] between the needles.") + +/obj/item/knittingneedles/update_icon() + if(working) + icon_state = "knittingneedles_on" + item_state = "knittingneedles_on" + else + icon_state = initial(icon_state) + item_state = initial(item_state) + + if(ball) + add_overlay("[ball.icon_state]") + else + cut_overlays() + +/obj/item/knittingneedles/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/yarn)) + if(!ball) + user.unEquip(O) + O.forceMove(src) + ball = O + to_chat(user, "You place \the [O] in \the [src]") + update_icon() + +/obj/item/knittingneedles/attack_self(mob/user as mob) + if(!ball) //if there is no yarn ball, nothing happens + to_chat(user, "You need a yarn ball to stitch.") + return + + if(working) + to_chat(user, "You are already sitching something.") + return + + user.visible_message("\The [user] is knitting something soft and cozy.") + working = TRUE + update_icon() + + if(!do_after(user,2 MINUTES)) + to_chat(user, "Your concentration is broken!") + working = FALSE + update_icon() + return + + var/obj/item/clothing/accessory/sweater/S = new(get_turf(user)) + S.color = ball.color + qdel(ball) + ball = null + working = FALSE + update_icon() + to_chat(user, "You finish \the [S]!") + +/obj/item/yarn + name = "ball of yarn" + desc = "A ball of yarn, this one is white." + icon = 'icons/obj/contained_items/tools/knitting.dmi' + icon_state = "white_ball" + w_class = ITEMSIZE_TINY + +/obj/item/yarn/red + desc = "A ball of yarn, this one is red." + color = "#ff0000" + +/obj/item/yarn/blue + desc = "A ball of yarn, this one is blue." + color = "#0000FF" + +/obj/item/yarn/green + desc = "A ball of yarn, this one is green." + color = "#00ff00" + +/obj/item/yarn/purple + desc = "A ball of yarn, this one is purple." + color = "#800080" + +/obj/item/yarn/yellow + desc = "A ball of yarn, this one is yellow." + color = "#FFFF00" + +/obj/item/storage/box/knitting //a bunch of things, so it goes into the box + name = "knitting supplies" + +/obj/item/storage/box/knitting/fill() + ..() + new /obj/item/knittingneedles(src) + new /obj/item/yarn(src) + new /obj/item/yarn/red(src) + new /obj/item/yarn/blue(src) + new /obj/item/yarn/green(src) + new /obj/item/yarn/purple(src) + new /obj/item/yarn/yellow(src) + +/obj/item/storage/box/yarn + name = "yarn box" + +/obj/item/storage/box/yarn/fill() + ..() + new /obj/item/yarn(src) + new /obj/item/yarn/red(src) + new /obj/item/yarn/blue(src) + new /obj/item/yarn/green(src) + new /obj/item/yarn/purple(src) + new /obj/item/yarn/yellow(src) \ No newline at end of file diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 7d1d5fb9a39..db5f3493fe1 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -7,6 +7,9 @@ icon_has_variants = TRUE drop_sound = 'sound/items/drop/cloth.ogg' pickup_sound = 'sound/items/pickup/cloth.ogg' + default_type = MATERIAL_HIDE + var/bare = FALSE //is this hair devoid of fur, hair, scales, carapace? Prevents re-stripping. Can also apply it to a hide type if we don't want to tan, like, xeno hide. + var/hide_type = "hair" //type of skin this animal has; scales for lizard, carapace for xeno. /obj/item/stack/material/animalhide/human name = "human skin" @@ -45,6 +48,7 @@ icon_state = "sheet-lizard" default_type = "lizard hide" icon_has_variants = FALSE + hide_type = "scales" /obj/item/stack/material/animalhide/xeno name = "alien hide" @@ -53,6 +57,7 @@ icon_state = "sheet-xeno" default_type = "alien hide" icon_has_variants = FALSE + hide_type = "carapace" //don't see anywhere else to put these, maybe together they could be used to make the xenos suit? /obj/item/stack/material/xenochitin @@ -75,44 +80,63 @@ icon = 'icons/mob/npc/alien.dmi' icon_state = "weed_extract" -/obj/item/stack/material/hairlesshide - name = "hairless hide" - desc = "This hide was stripped of it's hair, but still needs tanning. Maybe shove it in a washing machine?" - singular_name = "hairless hide piece" +/obj/item/stack/material/animalhide/barehide + name = "bare hide" + desc = "A hide without fur or scales. Can be tanned into leather." + desc_info = "You can put this into a washing machine to make wet leather, which is the first step in making it into leather sheets." + singular_name = "bare hide piece" icon_state = "sheet-hairlesshide" - default_type = "hairless hide" + default_type = "bare hide" + bare = TRUE -/obj/item/stack/material/wetleather +/obj/item/stack/material/animalhide/wetleather name = "wet leather" desc = "This leather has been cleaned but still needs to be dried." + desc_info = "This can be dried into high-quality fine leather by exposing it to a fire of a sufficient temperature, or manually with a welding tool. You don't need eye protection for the welding tool." singular_name = "wet leather piece" icon_state = "sheet-wetleather" default_type = "wet leather" - var/wetness = 30 //Reduced when exposed to high temperautres - var/drying_threshold_temperature = 500 //Kelvin to start drying icon_has_variants = TRUE + bare = TRUE + var/wetness = 30 //Reduced when exposed to high temperautres or manually dried with a welding tool. + var/drying_threshold_temperature = 500 //Kelvin to start drying from exposed fire. + var/being_dried = FALSE //If we're manually drying this. +//Wet leather can't be used to make things. Too soggy. +/obj/item/stack/material/animalhide/wetleather/list_recipes(mob/user, recipes_sublist, var/datum/stack_recipe/sublist) + to_chat(user, SPAN_WARNING("\The [src] isn't suitable for crafting!")) + return + + +//Animal Hide to leather steps //Step one - dehairing. -/obj/item/stack/material/animalhide/attackby(obj/item/W as obj, mob/user as mob) - if( istype(W, /obj/item/material/knife) || \ - istype(W, /obj/item/material/kitchen/utensil/knife) || \ - istype(W, /obj/item/material/twohanded/fireaxe) || \ - istype(W, /obj/item/material/hatchet) ) - +/obj/item/stack/material/animalhide/attackby(obj/item/W, mob/user) + if(is_sharp(W) && !W.noslice && !W.iswirecutter()) //Can we cut and slice with the item? And does the hide still have something to remove? Say no to wirecutters since it's more about bladed items. + if(bare) + to_chat(user, SPAN_WARNING("There's nothing left to remove from \the [src]!")) + return //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message) - usr.visible_message("\The [usr] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") - if(do_after(user,50)) - to_chat(usr, "You cut the hair from this [src.singular_name].") + user.visible_message(SPAN_NOTICE("\The [user] starts slicing the [hide_type] from \the [src]."), + SPAN_NOTICE("You start slicing the [hide_type] from \the [src]"), + SPAN_NOTICE("You hear the sound of a knife scraping against flesh.")) + if(do_after(user,50, act_target = src)) + if(amount <= 0) //Ensures we don't get multiple products from queuing clicks. + return + use(1) + user.visible_message(SPAN_NOTICE("[user] removes \the [hide_type] from \the [singular_name]."), + SPAN_NOTICE("You remove \the [hide_type] from \the [singular_name]!")) + playsound(get_turf(src), drop_sound, 50, 1) + //Try locating an exisitng stack on the tile and add to there if possible - for(var/obj/item/stack/material/hairlesshide/HS in usr.loc) - if(HS.amount < 50) - HS.amount++ - src.use(1) - break - //If it gets to here it means it did not find a suitable stack on the tile. - var/obj/item/stack/material/hairlesshide/HS = new(usr.loc) - HS.amount = 1 - src.use(1) + if(locate(/obj/item/stack/material/animalhide/barehide) in get_turf(user)) + for(var/obj/item/stack/material/animalhide/barehide/BH in get_turf(user)) + if(BH.amount < BH.max_amount) + BH.add(1) + to_chat(user, SPAN_NOTICE("You add the newly-stripped hide to the stack. It now contains [BH.amount] hides.")) + break + //if there isn't one, just make a new hide. + else + new /obj/item/stack/material/animalhide/barehide(get_turf(user)) else ..() @@ -120,20 +144,54 @@ //Step two - washing..... it's actually in washing machine code. //Step three - drying -/obj/item/stack/material/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/item/stack/material/animalhide/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() if(exposed_temperature >= drying_threshold_temperature) wetness-- - if(wetness == 0) - //Try locating an exisitng stack on the tile and add to there if possible - for(var/obj/item/stack/material/leather/HS in src.loc) - if(HS.amount < 50) - HS.amount++ - src.use(1) - wetness = initial(wetness) + if(wetness <= 0) + make_leather() + +/obj/item/stack/material/animalhide/wetleather/attackby(obj/item/I, mob/user) + if(I.iswelder()) + var/obj/item/weldingtool/WT = I + if(WT.isOn()) + if(being_dried) + to_chat(user, SPAN_WARNING("\The [src] are already being dried")) + return + user.visible_message(SPAN_NOTICE("\The [user] starts drying \the [src] with \the [WT]."), SPAN_NOTICE("You start drying the wet leather with \the [WT]...")) + being_dried = TRUE + while(do_after(user, 20, act_target = src) && wetness > 0) + if(!WT.remove_fuel(1) || !WT.isOn()) break - //If it gets to here it means it did not find a suitable stack on the tile. - var/obj/item/stack/material/leather/HS = new(src.loc) - HS.amount = 1 - wetness = initial(wetness) - src.use(1) + if(prob(5)) + var/msg = pick("You run the tool over \the [src]...", "The leather is drying nicely...", "You spread the heat out evenly...", "You continue to dry out \the [src].") + to_chat(user, SPAN_NOTICE(msg)) + wetness = max(0, wetness - rand(3, 5)) //6 to 10 passes + if(wetness <= 0) + to_chat(user, SPAN_NOTICE("You dry \the [src] completely, making a piece of leather!")) + make_leather() + if(!amount || QDELETED(src)) //Safety + break + being_dried = FALSE + + else + to_chat(user, SPAN_NOTICE("\The [WT] dries better when it's lit.")) + return + else + ..() + +//This will use one piece of the stack, create a piece of leather, then reset the wetness level to simulate drying the next piece of the stack. +/obj/item/stack/material/animalhide/wetleather/proc/make_leather() + //see if there's a stack we can add to + if(locate(/obj/item/stack/material/leather/fine) in get_turf(src)) + for(var/obj/item/stack/material/leather/fine/L in get_turf(src)) + if(L.amount < L.max_amount) + L.add(1) + use(1) + wetness = initial(wetness) + break + //If it gets to here it means it did not find a suitable stack on the tile. + else + new /obj/item/stack/material/leather/fine(get_turf(src)) + use(1) + wetness = initial(wetness) \ No newline at end of file diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 006a57651a1..a143116c0cc 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -202,6 +202,11 @@ throw_range = 10 flags = CONDUCT +/obj/item/stack/tile/floor/full/Initialize(mapload) + . = ..() + amount = max_amount + update_icon() + /obj/item/stack/tile/floor_red name = "red floor tile" singular_name = "red floor tile" @@ -268,6 +273,17 @@ icon_state = "tile_diamond" matter = list(MATERIAL_DIAMOND = TILE_MATERIAL_AMOUNT) +/obj/item/stack/tile/marble + name = "light marble floor tile" + singular_name = "light marble floor tile" + icon_state = "tile_lightmarble" + matter = list(MATERIAL_MARBLE = TILE_MATERIAL_AMOUNT) + +/obj/item/stack/tile/marble/dark + name = "dark marble floor tile" + singular_name = "dark marble floor tile" + icon_state = "tile_darkmarble" + /* * Cyborg modules */ diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker.dm new file mode 100644 index 00000000000..f9e791d02a4 --- /dev/null +++ b/code/game/objects/items/sticker.dm @@ -0,0 +1,92 @@ +/obj/item/sticker + name = "sticker" + desc = "It's a sticker." + icon = 'icons/obj/sticker.dmi' + icon_state = "sticker" + flags = NOBLUDGEON + w_class = ITEMSIZE_TINY + vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_DIR + + var/datum/weakref/attached + var/list/rand_icons + +/obj/item/sticker/Initialize() + . = ..() + if(LAZYLEN(rand_icons)) + icon_state = pick(rand_icons) + +/obj/item/sticker/attack_hand(mob/user) + if(!attached) + return ..() + + if(user.a_intent == I_HELP) + remove_sticker(user) + return + + var/atom/movable/attached_atom = attached.resolve() + if(attached_atom) + attached_atom.attack_hand(user) // don't allow people to make sticker armor + +/obj/item/sticker/attack_ranged(mob/user) + if(!attached) + return + + var/atom/movable/attached_atom = attached.resolve() + if(attached_atom && user.Adjacent(attached_atom)) + attack_hand(user) + +/obj/item/sticker/attackby(obj/item/I, mob/user) + if(!attached) + return ..() + + var/atom/movable/attached_atom = attached.resolve() + if(attached_atom) + attached_atom.attackby(I, user) // don't allow people to make sticker armor + +/obj/item/sticker/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag) + return + if(!istype(target) || (ismob(target) && !isbot(target))) + return + if(!target.can_attach_sticker(user, src)) + return + + var/list/mouse_control = mouse_safe_xy(click_parameters) + pixel_x = mouse_control["icon-x"] - 16 + pixel_y = mouse_control["icon-y"] - 16 + + attach_to(user, target) + +/obj/item/sticker/proc/attach_to(var/mob/user, var/atom/movable/A) + to_chat(user, SPAN_NOTICE("You attach \the [src] to \the [A].")) + user.drop_from_inventory(src, A) + attached = WEAKREF(A) + A.vis_contents += src + A.verbs += /atom/movable/proc/take_off_sticker + +/obj/item/sticker/proc/remove_sticker(var/mob/user) + user.put_in_hands(src) + var/atom/movable/attached_atom = attached.resolve() + if(attached_atom) + to_chat(user, SPAN_NOTICE("You remove \the [src] from \the [attached_atom].")) + attached_atom.vis_contents -= src + attached_atom.verbs -= /atom/movable/proc/take_off_sticker + attached = null + +/obj/item/sticker/googly_eye + name = "googly eye" + desc = "A large googly eye sticker." + rand_icons = list("googly", "googly1", "googly2") + +/obj/item/sticker/goldstar + name = "gold star" + desc = "A sticker of a gold star, for those overachievers." + icon_state = "goldstar" + +/atom/movable/proc/take_off_sticker() + set name = "Remove Sticker" + set src in view(1) + + var/obj/item/sticker/S = locate() in src + if(S) + S.remove_sticker(usr) \ No newline at end of file diff --git a/code/game/objects/items/tajara.dm b/code/game/objects/items/tajara.dm index 3ef88f94bc2..054d726722e 100644 --- a/code/game/objects/items/tajara.dm +++ b/code/game/objects/items/tajara.dm @@ -9,8 +9,10 @@ can_hold = list(/obj/item/clothing/mask/smokable/cigarette, /obj/item/flame/lighter, /obj/item/trash/cigbutt, /obj/item/tajcard) /obj/item/storage/box/fancy/cigarettes/pra/update_icon() + . = ..() var/card_count = instances_of_type_in_list(new /obj/item/tajcard, src.contents) //having cards in here doesn't count for icon - icon_state = "[initial(icon_state)][contents.len - card_count]" + if(opened) + icon_state = "[initial(icon_state)][contents.len - card_count]" /obj/item/storage/box/fancy/cigarettes/pra/fill() ..() @@ -135,8 +137,12 @@ icon_state = "adhomai_clock" item_state = "adhomai_clock" contained_sprite = TRUE + slot_flags = SLOT_MASK var/static/months = list("Menshe-aysaif", "Sil'nryy-aysaif", "Menshe-rhazzimy", "Sil'nryy-rhazzimy") +/obj/item/pocketwatch/adhomai/get_mask_examine_text(mob/user) + return "around [user.get_pronoun("his")] neck" + /obj/item/pocketwatch/adhomai/checktime(mob/user) set category = "Object" set name = "Check Time" @@ -158,7 +164,7 @@ current_day += 61 if(3) current_day += 59 + isLeap(text2num(time2text(world.realtime, "YYYY"))) // we can conveniently use the result of `isLeap` to add 1 when we are in a leap year - var/real_time = text2num(time2text(world.time + (roundstart_hour HOURS), "hh")) + var/real_time = text2num(time2text(world.time + (REALTIMEOFDAY - (TIME_OFFSET HOURS)), "hh")) var/adhomian_time = real_time if(ISEVEN(current_day)) adhomian_time = real_time + 24 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 1ed89d65183..1ace53303a2 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -16,6 +16,8 @@ * Action figures * Plushies * Toy cult sword + * Ring bell + * Chess Pieces */ @@ -173,7 +175,7 @@ return /obj/item/toy/balloon/attackby(obj/item/W as obj, mob/user as mob) - if(can_puncture(W)) + if(W.can_puncture()) burst() /obj/item/toy/balloon/latex @@ -980,6 +982,37 @@ desc = "A chunky plushie bee. Your new buzz-t friend!" icon_state = "beeplushie" +/obj/item/toy/plushie/greimorian + name = "greimorian plushie" + desc = "A lovable plushie of a fierce greimorian! This one takes a few liberties." + icon_state = "greimorianplushie" + phrase = "Gort!" + +/obj/item/toy/plushie/axic + name = "Axic plushie" + desc = "Plushie designed after the main characters of the hit show, Swimstars! This one is Axic. " + icon_state = "axicplushie" + phrase = "warble!" + +/obj/item/toy/plushie/qill + name = "Qill plushie" + desc = "Plushie designed after the main characters of the hit show, Swimstars! This one is Qill. " + icon_state = "qillplushie" + phrase = "warble!" + +/obj/item/toy/plushie/xana + name = "Xana plushie" + desc = "Plushie designed after the main characters of the hit show, Swimstars! This one is Xana. " + icon_state = "xanaplushie" + phrase = "warble!" + +/obj/item/toy/plushie/ipc + name = "Aphy plushie" + desc = "A plushie of an old Hephaestus mascot, Aphy." + desc_fluff = "Aphy, a play on the name Aphrodite, was Hephaestus Industries' first baseline prototype. While the original Aphy is on display in Hephaestus' Mars headquarters, the unit has become a cutesy mascot in recent years." + icon_state = "ipcplushie" + phrase = "Bwoop!" + //Squid Plushies /obj/item/toy/plushie/squid @@ -1037,6 +1070,24 @@ drop_sound = 'sound/items/drop/cardboardbox.ogg' pickup_sound = 'sound/items/pickup/cardboardbox.ogg' +/obj/item/toy/ringbell + name = "ringside bell" + desc = "A bell used to signal the beginning and end of various ring sports." + desc_info = "Use help intent on the bell to signal the start of a contest\ndisarm intent to signal the end of a contest and\nharm intent to signal a disqualification." + icon_state = "ringbell" + anchored = TRUE + +/obj/item/toy/ringbell/attack_hand(mob/user) + switch(user.a_intent) + if (I_HELP) + user.visible_message(FONT_LARGE(SPAN_NOTICE("[user] rings \the [src], signalling the beginning of the contest.")), SPAN_NOTICE("You ring \the [src] to signal the beginning of the contest!")) + playsound(user.loc, 'sound/items/oneding.ogg', 60, 1) + if (I_DISARM) + user.visible_message(FONT_LARGE(SPAN_NOTICE("[user] rings \the [src] three times, signalling the end of the contest!")), SPAN_NOTICE("You ring \the [src] to signal the end of the contest!")) + playsound(user.loc, 'sound/items/threedings.ogg', 60, 1) + if (I_HURT) + user.visible_message(FONT_LARGE(SPAN_WARNING("[user] rings \the [src] repeatedly, signalling a disqualification!")), SPAN_WARNING("You ring \the [src] to signal a disqualification!")) + playsound(user.loc, 'sound/items/manydings.ogg', 60, 1) //baystation desk toys @@ -1106,3 +1157,70 @@ new /obj/effect/decal/cleanable/confetti(T) else to_chat(user, SPAN_NOTICE("The [src] is already spent!")) + +/obj/item/chess_piece + name = "white pawn" + desc = "A %NAME% chess piece, this one is worth %POINT% points." + icon = 'icons/obj/contained_items/misc/chess.dmi' + icon_state = "white_pawn" + w_class = ITEMSIZE_HUGE // hugh mungus + var/piece_worth = 1 + +/obj/item/chess_piece/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(proximity_flag && isturf(target)) + user.drop_from_inventory(src, target) + pixel_y = initial(pixel_y) + pixel_x = initial(pixel_x) + +/obj/item/chess_piece/Initialize() + . = ..() + desc = "A [name] chess piece, this one is worth [piece_worth] point\s." + +/obj/item/chess_piece/black + name = "black pawn" + icon_state = "black_pawn" + +/obj/item/chess_piece/rook + name = "white rook" + icon_state = "white_rook" + piece_worth = 5 + +/obj/item/chess_piece/rook/black + name = "black rook" + icon_state = "black_rook" + +/obj/item/chess_piece/knight + name = "white knight" + icon_state = "white_knight" + piece_worth = 3 + +/obj/item/chess_piece/knight/black + name = "black knight" + icon_state = "black_knight" + +/obj/item/chess_piece/bishop + name = "white bishop" + icon_state = "white_bishop" + piece_worth = 3 + +/obj/item/chess_piece/bishop/black + name = "black bishop" + icon_state = "black_bishop" + +/obj/item/chess_piece/king + name = "white king" + icon_state = "white_king" + piece_worth = 10 // not really, but i coded myself into a corner here + +/obj/item/chess_piece/king/black + name = "black king" + icon_state = "black_king" + +/obj/item/chess_piece/queen + name = "white queen" + icon_state = "white_queen" + piece_worth = 9 + +/obj/item/chess_piece/queen/black + name = "black queen" + icon_state = "black_queen" \ No newline at end of file diff --git a/code/game/objects/items/vitals_monitor.dm b/code/game/objects/items/vitals_monitor.dm new file mode 100644 index 00000000000..a4f45ffdeda --- /dev/null +++ b/code/game/objects/items/vitals_monitor.dm @@ -0,0 +1,125 @@ +/obj/item/vitals_monitor + name = "vitals monitor" + desc = "A vitals monitor, used to track a patient's vitality. It needs to be attached to a rollerbed to function." + icon = 'icons/obj/contained_items/tools/vitals_monitor.dmi' + icon_state = "vitals_monitor" + item_state = "vitals_monitor" + contained_sprite = TRUE + + var/obj/structure/bed/roller/bed + var/reported_critical = FALSE + +/obj/item/vitals_monitor/Destroy() + bed = null + return ..() + +/obj/item/vitals_monitor/process() + if(!bed) + return + + var/mob/living/carbon/human/H + if(bed?.buckled) + if(ishuman(bed.buckled)) + H = bed.buckled + else if(istype(bed.buckled, /obj/structure/closet)) + H = locate() in bed.buckled.contents + + if(!H) + return + + if(H.is_asystole()) + if(!reported_critical) + bed.visible_message(SPAN_WARNING("\The [src] flashes red!")) + playsound(bed.loc, 'sound/machines/airalarm.ogg', 70) + reported_critical = TRUE + update_icon() + else if(reported_critical) + bed.visible_message(SPAN_NOTICE("\The [src] returns to a normal green.")) + reported_critical = FALSE + update_icon() + +/obj/item/vitals_monitor/proc/update_monitor() + if(bed) + START_PROCESSING(SSprocessing, src) + else + STOP_PROCESSING(SSprocessing, src) + reported_critical = FALSE + update_icon() + +/obj/item/vitals_monitor/update_icon() + if(bed) + if(bed.density) + icon_state = "[initial(icon_state)]-bb" + layer = bed.buckled.layer + 0.1 + else + icon_state = "[initial(icon_state)]-b" + layer = bed.layer + 0.1 + else + icon_state = initial(icon_state) + layer = initial(layer) + if(reported_critical) + color = color_rotation(-120) + else + color = null + +/obj/item/vitals_monitor/CtrlClick(var/mob/user) + if(bed) + return bed.CtrlClick(user) + return ..() + +/obj/item/vitals_monitor/Click() // attack_hand doesn't work here because it's inside the rollerbed + if(bed && bed.Adjacent(usr)) + interact(usr) + return + return ..() + +/obj/item/vitals_monitor/interact(mob/user) + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) + if(!ui) + ui = new(user, src, "devices-vitalsmonitor", 480, 250, capitalize_first_letters(name), set_state_object = bed) + ui.auto_update_content = TRUE + ui.open() + +/obj/item/vitals_monitor/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + if(!data) + data = list() + + var/mob/living/carbon/human/H + if(bed?.buckled) + if(ishuman(bed.buckled)) + H = bed.buckled + else if(istype(bed.buckled, /obj/structure/closet)) + H = locate() in bed.buckled.contents + + var/has_occupant = !isnull(H) + VUEUI_SET_CHECK(data["has_occupant"], has_occupant, ., data) + + if(has_occupant) + var/displayed_stat = H.stat + var/blood_oxygenation = H.get_blood_oxygenation() + if(H.status_flags & FAKEDEATH) + displayed_stat = DEAD + blood_oxygenation = min(blood_oxygenation, BLOOD_VOLUME_SURVIVE) + + var/pulse_result + if(H.should_have_organ(BP_HEART)) + var/obj/item/organ/internal/heart/heart = H.internal_organs_by_name[BP_HEART] + if(!heart) + pulse_result = 0 + else if(BP_IS_ROBOTIC(heart)) + pulse_result = -2 + else if(H.status_flags & FAKEDEATH) + pulse_result = 0 + else + pulse_result = H.get_pulse(GETPULSE_TOOL) + else + pulse_result = -1 + if(pulse_result == ">250") + pulse_result = -3 + + VUEUI_SET_CHECK(data["stat"], displayed_stat, ., data) + VUEUI_SET_CHECK(data["brain_activity"], H.get_brain_result(), ., data) + VUEUI_SET_CHECK(data["blood_pressure"], H.get_blood_pressure(), ., data) + VUEUI_SET_CHECK(data["blood_pressure_level"], H.get_blood_pressure_alert(), ., data) + VUEUI_SET_CHECK(data["blood_volume"], H.get_blood_volume(), ., data) + VUEUI_SET_CHECK(data["blood_o2"], blood_oxygenation, ., data) \ No newline at end of file diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 09b3cebdc51..8f7e41e8419 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -498,6 +498,11 @@ var/const/NO_EMAG_ACT = -50 access = list(access_distress, access_maint_tunnels, access_external_airlocks) ..() +/obj/item/card/id/distress/fsf + name = "\improper Free Solarian Fleets ID" + icon_state = "centcom" + assignment = "Free Solarian Fleets Marine ID" + /obj/item/card/id/distress/kataphract name = "\improper Kataphract ID" icon_state = "centcom" @@ -512,6 +517,17 @@ var/const/NO_EMAG_ACT = -50 access = list(access_legion, access_maint_tunnels, access_external_airlocks, access_security, access_engine, access_engine_equip, access_medical, access_research, access_atmospherics, access_medical_equip) ..() +/obj/item/card/id/distress/ap_eridani + name = "\improper Eridani identification card" + desc = "A high-tech holobadge, identifying the owner as a contractor from one of the many PMCs from the Eridani Corporate Federation." + assignment = "EPMC Asset Protection" + icon_state = "erisec_card" + overlay_state = "erisec_card" + +/obj/item/card/id/distress/ap_eridani/New() + access = list(access_distress, access_maint_tunnels, access_external_airlocks, access_security, access_medical, access_medical_equip) + ..() + /obj/item/card/id/distress/iac name = "\improper Interstellar Aid Corps ID" assignment = "Interstellar Aid Corps Responder" diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index e952da9391b..95040ed17c6 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -298,7 +298,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_off = "cigoff" type_butt = /obj/item/trash/cigbutt chem_volume = 30 - burn_rate = 0.012 //Lasts ~83 seconds) + burn_rate = 0.006 //Lasts ~166 seconds) matchmes = "USER lights their NAME with their FLAME." lightermes = "USER manages to light their NAME with FLAME." zippomes = "With a flick of their wrist, USER lights their NAME with their FLAME." @@ -335,7 +335,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM last_drag = world.time H.visible_message("[H.name] takes a drag of their [name].") playsound(H, 'sound/items/cigs_lighters/inhale.ogg', 50, 0, -1) - reagents.trans_to_mob(H, (rand(10,20)/10), CHEM_BREATHE) //Smokes it faster. Slightly random amount. + reagents.trans_to_mob(H, (rand(5,10)/10), CHEM_BREATHE) //Smokes it faster. Slightly random amount. return 1 return ..() @@ -754,7 +754,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/flame/lighter/zippo/europa name = "\improper Europan Zippo lighter" - desc = "A smokeless electrical coil lighter in the style of a zippo with the tricolour of the Jovian moon Europa on the side. It even its outside feels somewhat hot to the touch when it is turned on." + desc = "A smokeless electrical coil lighter in the style of a zippo with the tricolour of the Jovian moon Europa on the side. Even its outside feels somewhat hot to the touch when it is turned on." desc_fluff = "Traditional lighters are often frowned upon in the various submarines and underwater bases of Europa for the fumes their open flames produce. As a result, flameless lighters using heated metal coils that ignite flammable material upon contact are employed instead. These lighters are often prized personal possessions of those who own them, as with living space, privacy and individual possessions are a luxury in the cramped quarters of Europan vessels and stations. A side effect of having lighters that use electrically heated metal coils as opposed to flames however, is that the exteriors of the lighters themselves can become heated to a point of inflicting superficial burns if left on for relatively short periods of time." icon_state = "europazippo" item_state = "europazippo" @@ -777,6 +777,36 @@ CIGARETTE PACKETS ARE IN FANCY.DM flame_light_color = LIGHT_COLOR_BLUE flame_light_range = 2 +/obj/item/flame/lighter/zippo/nt + name = "\improper NanoTrasen Zippo lighter" + desc = "A zippo lighter with a depiction of NanoTrasen's iconic logo." + icon_state = "ntzippo" + item_state = "ntzippo" + +/obj/item/flame/lighter/zippo/fisanduh + name = "\improper Fisanduhian Zippo lighter" + desc = "A zippo with a depiction of the flag of the Confederate States of Fisanduh. This is a well crafted model that burns brighter and hotter than \ + the usual lighter." + desc_fluff = "On Moroz it's rather hard to find a Confederate without at least some manner of lighter on their person. Fisanduhians don't \ + smoke anymore than the rest of Moroz does, instead they prize these lighters for their utility. From burning loose thread to lighting a \ + molotov and more. A common adage is that the fire of Fisanduh burns brighter than Dominia's, which seems to be true for their lighters at least. \ + These have found purchase throughout the Spur due to their reliability and impressive capability to light up various things, causing a \ + competition of sorts to arise with Fisanduhian and Himean producers over the best quality lighter." + icon_state = "fisanduhzippo" + item_state = "fisanduhzippo" + flame_light_range = 2 + +/obj/item/flame/lighter/zippo/luceian + name = "\improper Luceian Zippo lighter" + desc = "A bright zippo lighter with the all-seeing eye of Ennoia on its front. Clearly Luceian." + desc_fluff = "Luceian lighters, sometimes referred to as “Ennoic Fires,” are commonly carried by Assunzionii as an emergency light \ + source. A genuine lighter in the Luceian tradition will have a proving mark stamped upon its base that shows when and where it was \ + blessed following its construction." + icon_state = "luceianzippo" + item_state = "luceianzippo" + flame_light_color = LIGHT_COLOR_WHITE + flame_light_range = 2 + /obj/item/flame/lighter/random/Initialize() . = ..() icon_state = "lighter-[pick("r","c","y","g")]" @@ -999,7 +1029,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM ..() /obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/I, mob/user) - if(is_type_in_list(I, list(/obj/item/paper/cig/, /obj/item/paper/, /obj/item/teleportation_scroll))) + if(is_type_in_list(I, list(/obj/item/paper/cig/, /obj/item/paper/))) if(!dry) to_chat(user, SPAN_WARNING("You need to dry [src] first!")) return diff --git a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm index ddc5e602504..1eba66dbe27 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm @@ -21,6 +21,19 @@ "/obj/item/stock_parts/console_screen" = 1, "/obj/item/reagent_containers/glass/beaker/large" = 1) +/obj/item/circuitboard/stasis_bed + name = T_BOARD("Lifeform Stasis Unit") + desc = "The circuitboard for a lifeform stasis unit." + build_path = /obj/machinery/stasis_bed + origin_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 4, TECH_BIO = 4) + board_type = "machine" + req_components = list( + "/obj/item/stock_parts/micro_laser" = 1, + "/obj/item/stock_parts/capacitor" = 2, + "/obj/item/stock_parts/scanning_module" = 2, + "/obj/item/stock_parts/console_screen" = 1 + ) + /obj/item/circuitboard/cryotube name = T_BOARD("Cryo Cell") desc = "The circuitboard for a cryo tube." diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 8a8ddacb414..34464d7bd1e 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -11,6 +11,16 @@ obj/item/circuitboard/rdserver "/obj/item/stack/cable_coil" = 2, "/obj/item/stock_parts/scanning_module" = 1) +obj/item/circuitboard/rdtechprocessor + name = T_BOARD("R&D tech processor") + build_path = /obj/machinery/r_n_d/tech_processor + board_type = "machine" + origin_tech = list(TECH_DATA = 3) + req_components = list( + "/obj/item/stack/cable_coil" = 2, + "/obj/item/stock_parts/scanning_module" = 2 + ) + /obj/item/circuitboard/destructive_analyzer name = T_BOARD("destructive analyzer") build_path = /obj/machinery/r_n_d/destructive_analyzer diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 8edf6e71d0e..8145e20124f 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -1,32 +1,47 @@ /obj/item/flamethrower name = "flamethrower" desc = "A flamethrower created by modifying a welding tool to fit an external gas tank." - icon = 'icons/obj/flamethrower.dmi' - icon_state = "flamethrowerbase" + + icon = 'icons/obj/contained_items/weapons/flamethrower.dmi' + icon_state = "flamethrower1" item_state = "flamethrower_0" - var/fire_sound = 'sound/weapons/flamethrower.ogg' + contained_sprite = TRUE + + w_class = ITEMSIZE_LARGE flags = CONDUCT - force = 3.0 - throwforce = 10.0 + force = 3 + throwforce = 10 throw_speed = 1 throw_range = 5 - w_class = ITEMSIZE_LARGE + + light_color = LIGHT_COLOR_FIRE + origin_tech = list(TECH_COMBAT = 1, TECH_PHORON = 1) matter = list(DEFAULT_WALL_MATERIAL = 500) + + var/fire_sound = 'sound/weapons/flamethrower.ogg' var/secured = FALSE // Whether we have an igniter secured (screwdrivered) to us or not var/throw_amount = 100 var/lit = FALSE //on or off var/operating = FALSE //cooldown - var/turf/previousturf = null - var/obj/item/weldingtool/weldtool = null + var/turf/previous_turf = null + var/obj/item/weldingtool/welding_tool = null var/obj/item/device/assembly/igniter/igniter = null - var/obj/item/tank/phoron/ptank = null + var/obj/item/tank/gas_tank = null + +/obj/item/flamethrower/Initialize(mapload, var/welder) + . = ..() + icon_state = "flamethrower" // update to use the non-map version + if(welder) + welding_tool = welder + welding_tool.forceMove(src) + update_icon() /obj/item/flamethrower/examine(mob/user) ..() if(Adjacent(user)) - if(ptank) - to_chat(user, SPAN_NOTICE("Release pressure is set to [throw_amount] kPa. The tank has about [round(ptank.air_contents.return_pressure(), 10)] kPa left in it.")) + if(gas_tank) + to_chat(user, SPAN_NOTICE("Release pressure is set to [throw_amount] kPa. The tank has about [round(gas_tank.air_contents.return_pressure(), 10)] kPa left in it.")) else to_chat(user, SPAN_WARNING("It has no gas tank installed.")) if(igniter) @@ -35,16 +50,11 @@ to_chat(user, SPAN_WARNING("It has no igniter installed.")) /obj/item/flamethrower/Destroy() - if(weldtool) - qdel(weldtool) - if(igniter) - qdel(igniter) - if(ptank) - qdel(ptank) - + QDEL_NULL(welding_tool) + QDEL_NULL(igniter) + QDEL_NULL(gas_tank) return ..() - /obj/item/flamethrower/process() if(!lit) STOP_PROCESSING(SSprocessing, src) @@ -59,14 +69,22 @@ /obj/item/flamethrower/update_icon() cut_overlays() + add_overlay("+[initial(welding_tool.icon_state)]") + if(igniter) add_overlay("+igniter[secured]") - if(ptank) - add_overlay("+ptank") + + if(istype(gas_tank, /obj/item/tank/phoron)) + add_overlay("+phoron_tank") + else if(istype(gas_tank, /obj/item/tank/hydrogen)) + add_overlay("+hydro_tank") + if(lit) add_overlay("+lit") + set_light(1.4, 2) item_state = "flamethrower_1" else + set_light(0) item_state = "flamethrower_0" /obj/item/flamethrower/isFlameSource() @@ -75,9 +93,9 @@ /obj/item/flamethrower/afterattack(atom/target, mob/user, proximity) if(proximity) return - if(!ptank) + if(!gas_tank) return - if(ptank.air_contents.get_by_flag(XGM_GAS_FUEL) < 1) + if(gas_tank.air_contents.get_by_flag(XGM_GAS_FUEL) < 1) to_chat(user, SPAN_WARNING("\The [src] doesn't have enough fuel left to throw!")) return // Make sure our user is still holding us @@ -93,15 +111,15 @@ if(W.iswrench() && !secured)//Taking this apart var/turf/T = get_turf(src) - if(weldtool) - weldtool.forceMove(T) - weldtool = null + if(welding_tool) + welding_tool.forceMove(T) + welding_tool = null if(igniter) igniter.forceMove(T) igniter = null - if(ptank) - ptank.forceMove(T) - ptank = null + if(gas_tank) + gas_tank.forceMove(T) + gas_tank = null new /obj/item/stack/rods(T) qdel(src) return @@ -125,12 +143,12 @@ update_icon() return - else if(istype(W, /obj/item/tank/phoron)) - if(ptank) + else if(istype(W, /obj/item/tank/phoron) || istype(W, /obj/item/tank/hydrogen)) + if(gas_tank) to_chat(user, SPAN_WARNING("There appears to already be a tank loaded in \the [src]!")) return user.drop_from_inventory(W, src) - ptank = W + gas_tank = W update_icon() return @@ -149,7 +167,7 @@ /obj/item/flamethrower/attack_self(mob/user) if(use_check_and_message(user)) return - if(!ptank) + if(!gas_tank) to_chat(user, SPAN_WARNING("Attach a phoron tank first!")) return var/list/options = list( @@ -163,10 +181,10 @@ return switch(handle) if("Eject Tank") - if(!ptank) + if(!gas_tank) return - user.put_in_hands(ptank) - ptank = null + user.put_in_hands(gas_tank) + gas_tank = null lit = FALSE if("Light") attempt_lighting(user) @@ -194,10 +212,10 @@ if(lit) to_chat(user, SPAN_WARNING("\The [src] is already lit.")) return - if(!ptank) + if(!gas_tank) to_chat(user, SPAN_WARNING("\The [src] doesn't have a tank installed.")) return - if(ptank.air_contents.get_by_flag(XGM_GAS_FUEL) < 1) + if(gas_tank.air_contents.get_by_flag(XGM_GAS_FUEL) < 1) to_chat(user, SPAN_WARNING("\The [src] doesn't have any flammable fuel to light!")) return lit = TRUE @@ -215,37 +233,40 @@ //Called from turf.dm turf/dblclick /obj/item/flamethrower/proc/flame_turf(turflist) - if(!lit || operating) return + if(!lit || operating) + return operating = TRUE playsound(src, fire_sound, 70, 1) for(var/turf/T in turflist) if(T.density || istype(T, /turf/space)) break - if(!previousturf && length(turflist)>1) - previousturf = get_turf(src) + if(!previous_turf && length(turflist)>1) + previous_turf = get_turf(src) continue //so we don't burn the tile we be standin on - if(previousturf && LinkBlocked(previousturf, T)) + if(previous_turf && LinkBlocked(previous_turf, T)) break ignite_turf(T) sleep(1) - previousturf = null + previous_turf = null operating = FALSE /obj/item/flamethrower/proc/ignite_turf(turf/target) - var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(0.02 * (throw_amount / 100)) + var/datum/gas_mixture/air_transfer = gas_tank.air_contents.remove_ratio(0.02 * (throw_amount / 100)) new /obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(target, air_transfer.get_by_flag(XGM_GAS_FUEL) * 15, get_dir(loc, target)) for(var/g in air_transfer.gas) if(gas_data.flags[g] & XGM_GAS_FUEL) air_transfer.gas[g] = 0 target.assume_air(air_transfer) - target.hotspot_expose((ptank.air_contents.temperature*2) + 400, 500) + target.hotspot_expose((gas_tank.air_contents.temperature*2) + 400, 500) + for(var/mob/living/M in target) + M.IgniteMob(1) -/obj/item/flamethrower/full/Initialize() - . = ..() - weldtool = new /obj/item/weldingtool(src) - weldtool.status = FALSE +/obj/item/flamethrower/full/Initialize() // slightly weird looking initialize cuz it has to do some stuff first + welding_tool = new /obj/item/weldingtool(src) + welding_tool.status = FALSE igniter = new /obj/item/device/assembly/igniter(src) igniter.secured = FALSE secured = TRUE - update_icon() \ No newline at end of file + gas_tank = new /obj/item/tank/phoron(src) + return ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 1cc50d49dd7..0db5c196601 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -167,6 +167,7 @@ /obj/random/spacecash, /obj/random/glowstick, /obj/random/gloves, + /obj/random/wizard_dressup, /obj/item/storage/wallet, /obj/item/storage/photo_album, /obj/item/storage/box/snappops, @@ -200,7 +201,6 @@ /obj/item/storage/box/fancy/cigarettes/dromedaryco, /obj/item/toy/bosunwhistle, /obj/item/clothing/mask/fakemoustache, - /obj/item/clothing/mask/gas/clown_hat, /obj/item/clothing/mask/gas/mime, /obj/item/clothing/head/festive/santa, /obj/item/stack/material/animalhide/lizard, @@ -268,7 +268,6 @@ /obj/item/device/flashlight/lantern, /obj/item/clothing/mask/balaclava, /obj/item/clothing/accessory/badge/old, - /obj/item/clothing/mask/gas/clown_hat, /obj/item/clothing/mask/gas/mime, /obj/item/clothing/shoes/galoshes, /mob/living/simple_animal/lizard, @@ -311,7 +310,6 @@ /obj/item/inflatable_duck, /obj/item/beach_ball, /obj/item/clothing/under/syndicate/tracksuit, - /obj/item/clothing/under/rank/clown, /obj/item/clothing/under/mime, /obj/item/clothing/under/rank/fatigues/marine, /obj/item/clothing/under/rank/dress/marine, diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 6c49168197d..470965bb7fa 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -63,14 +63,15 @@ if(active) return - if(ismob(user)) - var/mob/M = user - msg_admin_attack("[M.name] ([M.ckey]) primed \a [fake ? ("fake ") : ("")][src] (JMP)",ckey=key_name(M)) - else - message_admins("[user.name] primed \a [fake ? ("fake ") : ("")][src] (JMP)") + if(user) //Prevents runtimes with grenade launchers, which create their own admin message + if(ismob(user)) + var/mob/M = user + admin_attack_log(M, attacker_message = "primed \a [fake ? (" fake") : ("")][src]!", admin_message = "primed \a [fake ? ("fake ") : ("")][src]!") + else + message_admins("[user.name] primed \a [fake ? ("fake ") : ("")][src] (JMP)") icon_state = initial(icon_state) + "_active" - active = 1 + active = TRUE playsound(loc, activation_sound, 75, 1, -3) addtimer(CALLBACK(src, .proc/prime), det_time) @@ -86,4 +87,4 @@ return /obj/item/grenade/vendor_action(var/obj/machinery/vending/V) - activate(V) \ No newline at end of file + activate(V) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index 68104105605..67fec39273d 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -7,6 +7,7 @@ item_state = "flashbang" slot_flags = SLOT_BELT var/datum/effect/effect/system/smoke_spread/bad/smoke + var/smoke_times = 4 /obj/item/grenade/smokebomb/New() ..() @@ -14,29 +15,28 @@ src.smoke.attach(src) /obj/item/grenade/smokebomb/Destroy() - qdel(smoke) + QDEL_NULL(smoke) smoke = null return ..() /obj/item/grenade/smokebomb/prime() playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) - src.smoke.set_up(10, 0, usr.loc) - spawn(0) - src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() - + smoke = new /datum/effect/effect/system/smoke_spread/bad + smoke.attach(src) + smoke.set_up(10, 0, get_turf(src)) + START_PROCESSING(SSprocessing, src) for(var/obj/effect/blob/B in view(8,src)) var/damage = round(30/(get_dist(B,src)+1)) B.health -= damage B.update_icon() - sleep(80) - qdel(src) - return + QDEL_IN(src, 8 SECONDS) + +/obj/item/grenade/smokebomb/process() + if(!QDELETED(smoke) && (smoke_times > 0)) + smoke_times-- + smoke.start() + return + return PROCESS_KILL /obj/item/grenade/smokebomb/cyborg name = "mounted smoke deployer" diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 446c59c5341..47a1bfc9e97 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -211,7 +211,7 @@ if(istype(I, /obj/item/stack/rods)) var/obj/item/stack/rods/R = I if (R.use(1)) - var/obj/item/material/wirerod/W = new(get_turf(user)) + var/obj/item/material/wirerod/W = new(get_turf(user), MATERIAL_STEEL, color) user.put_in_hands(W) to_chat(user, SPAN_NOTICE("You wrap \the [src] around the top of the rod.")) qdel(src) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 8212ee515b2..fc1f0c0ce8a 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -122,77 +122,6 @@ Implant Specifics:
"} spawn(delay) malfunction-- - -/obj/item/implant/explosive/deadman - name = "deadman explosive" - desc = "A military grade micro bio-explosive that detonates upon death." - icon_state = "implant_evil" - uses_codewords = FALSE - -/obj/item/implant/explosive/deadman/get_data() - . = {" -Implant Specifications:
-Name: Robust Corp RX-78 Employee Management Implant
-Life: Activates upon death.
-Important Notes: Explodes
-
-Implant Details:
-Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
-Special Features: Explodes
-Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} - -/obj/item/implant/explosive/deadman/attack_self(mob/user) - return - -/obj/item/implant/explosive/deadman/hear(var/msg) - return - -/obj/item/implant/explosive/deadman/process() - if(malfunction) - STOP_PROCESSING(SSprocessing, src) - return - if (!implanted) - return - var/mob/M = imp_in - - if(M.stat == DEAD) - activate() - -/obj/item/implant/explosive/deadman/activate(var/cause) - small_countdown(src) - STOP_PROCESSING(SSprocessing, src) - -/obj/item/implant/explosive/deadman/small_boom() - if(imp_in) - explosion(get_turf(src), 0, 0, 2, 4, 5) - qdel(src) - imp_in.gib() - -/obj/item/implant/explosive/deadman/implanted(mob/source) - START_PROCESSING(SSprocessing, src) - return TRUE - -/obj/item/implant/explosive/deadman/emp_act(severity) - if(malfunction) - return - malfunction = MALFUNCTION_TEMPORARY - switch (severity) - if(3.0) - if(prob(1)) - small_countdown() - else if(prob(5)) - meltdown() - if(2.0) - if(prob(5)) - small_countdown() - else if (prob(10)) - meltdown() - if(1.0) - if(prob(10)) - small_countdown() - else if (prob(30)) - meltdown() - //BS12 Explosive /obj/item/implant/explosive name = "explosive implant" @@ -201,6 +130,7 @@ Implant Specifics:
"} var/phrase var/setup_done = FALSE //Have we set this yet? var/uses_codewords = TRUE + var/list/possible_explosions = list("Localized Limb", "Destroy Body") icon_state = "implant_evil" /obj/item/implant/explosive/Initialize() @@ -264,7 +194,7 @@ Implant Specifics:
"} small_countdown() return //to avoid hotspot_expose. if(elevel == "Destroy Body") - explosion(get_turf(T), -1, 0, 1, 6) + explosion(get_turf(T), -1, 0, 2, 6) T.gib() if(elevel == "Full Explosion") explosion_spread(get_turf(T), rand(8,13)) @@ -324,7 +254,7 @@ Implant Specifics:
"} return TRUE /obj/item/implant/explosive/attack_self(mob/user) - elevel = alert("What sort of explosion would you prefer?", "Implant Intent", "Localized Limb", "Destroy Body", "Full Explosion") + elevel = input(user, "What sort of explosion would you prefer?", "Implant Intent") as null|anything in possible_explosions phrase = input("Choose activation phrase:") as text var/list/replacechars = list("\"" = "",">" = "","<" = "","(" = "",")" = "") phrase = replace_characters(phrase, replacechars) @@ -365,6 +295,78 @@ Implant Specifics:
"} listening_objects -= src return ..() +/obj/item/implant/explosive/full + possible_explosions = list("Localized Limb", "Destroy Body", "Full Explosion") + +/obj/item/implant/explosive/deadman + name = "deadman explosive" + desc = "A military grade micro bio-explosive that detonates upon death." + icon_state = "implant_evil" + uses_codewords = FALSE + +/obj/item/implant/explosive/deadman/get_data() + . = {" +Implant Specifications:
+Name: Robust Corp RX-78 Employee Management Implant
+Life: Activates upon death.
+Important Notes: Explodes
+
+Implant Details:
+Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
+Special Features: Explodes
+Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} + +/obj/item/implant/explosive/deadman/attack_self(mob/user) + return + +/obj/item/implant/explosive/deadman/hear(var/msg) + return + +/obj/item/implant/explosive/deadman/process() + if(malfunction) + STOP_PROCESSING(SSprocessing, src) + return + if (!implanted) + return + var/mob/M = imp_in + + if(M.stat == DEAD) + activate() + +/obj/item/implant/explosive/deadman/activate(var/cause) + small_countdown(src) + STOP_PROCESSING(SSprocessing, src) + +/obj/item/implant/explosive/deadman/small_boom() + if(imp_in) + explosion(get_turf(src), -1, 0, 1, 6) + imp_in.gib() + qdel(src) + +/obj/item/implant/explosive/deadman/implanted(mob/source) + START_PROCESSING(SSprocessing, src) + return TRUE + +/obj/item/implant/explosive/deadman/emp_act(severity) + if(malfunction) + return + malfunction = MALFUNCTION_TEMPORARY + switch (severity) + if(3.0) + if(prob(1)) + small_countdown() + else if(prob(5)) + meltdown() + if(2.0) + if(prob(5)) + small_countdown() + else if (prob(10)) + meltdown() + if(1.0) + if(prob(10)) + small_countdown() + else if (prob(30)) + meltdown() /obj/item/implant/chem name = "chemical implant" diff --git a/code/game/objects/items/weapons/improvised_components.dm b/code/game/objects/items/weapons/improvised_components.dm index 50ab1c935fb..de7d2ad9716 100644 --- a/code/game/objects/items/weapons/improvised_components.dm +++ b/code/game/objects/items/weapons/improvised_components.dm @@ -51,6 +51,18 @@ attack_verb = list("hit", "bludgeoned", "whacked", "bonked") force_divisor = 0.1 thrown_force_divisor = 0.1 + applies_material_colour = FALSE + var/forward_cable_color = COLOR_RED + +/obj/item/material/wirerod/Initialize(mapload, var/material_key, var/cable_color) + . = ..() + if(!cable_color) + cable_color = COLOR_RED + forward_cable_color = cable_color + var/image/I = image(icon, null, "wiredrod_cable") + I.appearance_flags = RESET_COLOR + I.color = cable_color + add_overlay(I) /obj/item/material/wirerod/attackby(var/obj/item/I, mob/user as mob) ..() @@ -58,10 +70,13 @@ if(istype(I, /obj/item/material/shard) || istype(I, /obj/item/material/spearhead)) var/obj/item/material/tmp_shard = I finished = new /obj/item/material/twohanded/spear(get_turf(user), tmp_shard.material.name) - to_chat(user, "You fasten \the [I] to the top of the rod with the cable.") + to_chat(user, SPAN_NOTICE("You fasten \the [I] to the top of the rod with the cable.")) else if(I.iswirecutter()) - finished = new /obj/item/melee/baton/cattleprod(get_turf(user)) - to_chat(user, "You fasten the wirecutters to the top of the rod with the cable, prongs outward.") + finished = new /obj/item/melee/baton/cattleprod(get_turf(user), forward_cable_color) + to_chat(user, SPAN_NOTICE("You fasten the wirecutters to the top of the rod with the cable, prongs outward.")) + else if(istype(I, /obj/item/material/wirerod)) + finished = new /obj/item/trap/tripwire(get_turf(user), forward_cable_color) + to_chat(user, SPAN_NOTICE("You attach the two wired rods together, spooling the cable between them.")) if(finished) user.drop_from_inventory(src,finished) user.drop_from_inventory(I,finished) @@ -91,7 +106,7 @@ if(istype(I, /obj/item/material/spearhead)) var/obj/item/material/spearhead/tip = I finished = new /obj/item/material/twohanded/pike(get_turf(user), tip.material.name) - to_chat(user, "You attach \the [I] to the top of \the [src].") + to_chat(user, SPAN_NOTICE("You attach \the [I] to the top of \the [src].")) if(finished) user.drop_from_inventory(src,finished) user.drop_from_inventory(I,finished) @@ -168,7 +183,7 @@ complete = new /obj/item/clothing/head/lavender_crown(get_turf(user)) if(complete != null) - to_chat(user, "You attach the " + S.seed.seed_name + " to the circlet and create a beautiful flower crown.") + to_chat(user, SPAN_NOTICE("You attach the " + S.seed.seed_name + " to the circlet and create a beautiful flower crown.")) user.drop_from_inventory(W) user.drop_from_inventory(src) qdel(W) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 6595a549afa..9d85249b886 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -1472,32 +1472,21 @@ -

Manifesto of the Parizahra Zhahrazjujz'tajara Akzatauzjauna'azahrazakahuz Hadii

- -

\ +

The Hadiist Manifesto


\ - Written: Late 2432;
\ - First Published: 2433
\ - Translated by Comrade Aurauz'hurl Aizhunua

\ - A Rrak'narr is haunting the Njarir'Akhran. The Rrak'narr of Hadiism. Where have not the Njarir'Akhran blasted Hadiism? Where not have the nobility ruthlessly uprooted its supporters \ - like they were tearing up weeds from their gardens? Despite their dismissal, the fact that the Njarir'Akhran are so desperate to exterminate them brings the Tajara to two inevitable facts:
\ -
\ - 1) Revolutionary ideology is already cemented amongst Tajara.
\ - 2) It is time for supporters of Hadiism to throw off their cloaks and set aside their daggers and pick up the rifle to meet the nobility in the open field.
\ -
\ - To that end, Comrade Al'mari Hadii has coalesced the many supporters and thinkers of the Revolution to bring to life this manifesto of the Tajara people, the Hadiist nation, and the Revolution.
\ - This is a Revolution that will make the Old Order buckle before the strength of the Tajara people until it collapses into ruin. Remember, dear comrade, all of the contents of this manifesto are to justify one simple fact.
\ - This one fact has been unsuccessfully suppressed by the Njarir'Akhran, only to live on in the burning spirit of every Tajara. The simple fact that no Tajara is born inherently better than another.
\ + Ethnic, cultural, and religious differences have been used by the nobility to stop the Tajara people from uniting against the oppression. These barriers have finally been broken during the Revolution. \ + As history shows them, the establishment of a united Adhomai under a Hadiist state is necessary to secure the future of the Tajara. They must abandon their past sectarianism and work as one. \ + Hadiism will shape all aspects of their lives for the better. The Tajara will be powerful and free as long they are guided by the Party. Together the Tajara are undefeatable.
\ "} /obj/item/book/manual/dpra_manifesto - name = "in defense of al'marii's legacy" + name = "in defense of al'mari's legacy" desc = "A political manifesto containing the foundations of the Al'mariist ideology." icon_state = "dpra-manifesto" item_state = "book2" - title = "In Defense of Al'marii's Legacy" + title = "In Defense of Al'mari's Legacy" author = "Supreme Commander Nated" w_class = ITEMSIZE_SMALL dat = {" @@ -1512,11 +1501,11 @@ -

In Defense of Al'marii's Legacy

+

In Defense of Al'mari's Legacy


\ - People of Adhomai, they must rally in defense of the legacy of Al'marii. The Hadiist usurper plans to enslave the Tajara people to alien overlords, the Tajara must stand up against his tyranny. \ - Take up arms in the defense of the freeodm and destiny of their people. The power belongs to the People, not in the hands of the Party. The Hadiists are nothing but puppets of the alien oppressor. \ - The war to decide the fate of the Tajaran culture and homeworld has begun, join them in this struggle. Death to the Hadiist usurper. Long live the legacy of Al'marii!
\ + People of Adhomai, they must rally in defense of the legacy of Al'mari. The Hadiist usurper plans to enslave the Tajara people to alien overlords, the Tajara must stand up against his tyranny. \ + Take up arms in the defense of the freedom and destiny of their people. The power belongs to the People, not in the hands of the Party. The Hadiists are nothing but puppets of the alien oppressor. \ + The war to decide the fate of the Tajaran culture and homeworld has begun; they must join them in this struggle. Death to the Hadiist usurper. Long live the legacy of Al'mari!
\ "} diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index 00630002558..a1a843fdbed 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -6,6 +6,7 @@ thrown_force_divisor = 0.1 var/image/base_image var/max_butts = 10 + w_class = ITEMSIZE_TINY /obj/item/material/ashtray/New(var/newloc, var/material_name) ..(newloc, material_name) diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 69533a10411..a9a114d63f2 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -37,7 +37,7 @@ return ..() if(user.a_intent != I_HELP) - if(target_zone == BP_HEAD || target_zone == BP_EYES) + if((target_zone == BP_HEAD || target_zone == BP_EYES) && !M.eyes_protected(src, FALSE)) if((user.is_clumsy()) && prob(50)) M = user return eyestab(M,user) diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 32750320b7d..35a33f2a45d 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -25,7 +25,7 @@ /obj/item/material/knife/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob, var/target_zone) if(active == 1) - if(target_zone != BP_EYES && target_zone != BP_HEAD) + if((target_zone != BP_EYES && target_zone != BP_HEAD) || M.eyes_protected(src, FALSE)) return ..() if((user.is_clumsy()) && prob(50)) M = user diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index b85055ad098..2262c5b787d 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -21,8 +21,8 @@ var/material/material var/drops_debris = 1 -/obj/item/material/New(var/newloc, var/material_key) - ..(newloc) +/obj/item/material/Initialize(var/newloc, var/material_key) + . = ..() if(!material_key) material_key = default_material set_material(material_key) diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm index 16dec2374aa..0f628f72fb3 100644 --- a/code/game/objects/items/weapons/material/swords.dm +++ b/code/game/objects/items/weapons/material/swords.dm @@ -32,8 +32,8 @@ if(default_parry_check(user, attacker, damage_source) && prob(parry_chance * parry_bonus)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") playsound(user.loc, 'sound/weapons/bladeparry.ogg', 50, 1) - return 1 - return 0 + return PROJECTILE_STOPPED + return FALSE /obj/item/material/sword/perform_technique(var/mob/living/carbon/human/target, var/mob/living/carbon/human/user, var/target_zone) var/armor_reduction = target.get_blocked_ratio(target_zone, BRUTE, DAM_EDGE|DAM_SHARP, damage = force)*100 diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index c704c2ded0f..f8cfc2d3e08 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -89,8 +89,8 @@ if(wielded && default_parry_check(user, attacker, damage_source) && prob(parry_chance)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") playsound(user.loc, /decl/sound_category/punchmiss_sound, 50, 1) - return 1 - return 0 + return PROJECTILE_STOPPED + return FALSE /obj/item/material/twohanded/update_icon() icon_state = "[base_icon][wielded]" diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 1c3c49cf533..a9ccaab6b37 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -65,17 +65,15 @@ /obj/item/melee/energy/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(active && default_parry_check(user, attacker, damage_source) && prob(50)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") - spark(src, 5) playsound(user.loc, 'sound/weapons/blade.ogg', 50, 1) - return 1 + return PROJECTILE_STOPPED else - if(!active) - return 0 //turn it on first! + return FALSE //turn it on first! if(user.incapacitated()) - return 0 + return FALSE //block as long as they are not directly behind us var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block @@ -90,7 +88,7 @@ visible_message("\The [user]'s [src.name] overloads!") deactivate() shield_power = initial(shield_power) - return 0 + return FALSE if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam)) var/obj/item/projectile/P = damage_source @@ -112,7 +110,7 @@ return PROJECTILE_CONTINUE // complete projectile permutation else user.visible_message("\The [user] blocks [attack_text] with \the [src]!") - return 1 + return PROJECTILE_STOPPED else if(istype(damage_source, /obj/item/projectile/bullet) && can_block_bullets) var/reflectchance = (base_reflectchance) - round(damage/3) @@ -120,7 +118,7 @@ reflectchance /= 2 if(prob(reflectchance)) user.visible_message("\The [user] blocks [attack_text] with \the [src]!") - return 1 + return PROJECTILE_STOPPED /obj/item/melee/energy/get_print_info() . = ..() @@ -316,6 +314,20 @@ ..() icon_state = "edagger1" +/obj/item/melee/energy/sword/knife/sol + name = "solarian energy dagger" + desc = "A relatively inexpensive energy blade, this is the standard-issue combat knife given to the Solarian military." + icon_state = "sol_edagger0" + base_reflectchance = 10 + base_block_chance = 10 + active_force = 20 + force = 10 + origin_tech = list(TECH_MAGNET = 3) + +/obj/item/melee/energy/sword/knife/sol/activate(mob/living/user) + ..() + icon_state = "sol_edagger1" + /* *Power Sword */ diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 85c82f9e2fb..b30226054a0 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -61,6 +61,19 @@ var/list/tape_roll_applications = list() req_one_access = list(access_medical_equip) icon_base = "medical" +/obj/item/taperoll/science + name = "science tape" + desc = "A high-tech roll of science tape, used to prevent curious onlookers from failing into a research-borne singularity." + icon_state = "science_start" + tape_type = /obj/item/tape/science + icon_base = "science" + +/obj/item/tape/science + name = "science tape" + desc = "A length of science tape. Better not cross it." + req_one_access = list(access_research) + icon_base = "science" + /obj/item/taperoll/engineering name = "engineering tape" desc = "A roll of engineering tape used to block off working areas from the public." @@ -214,7 +227,7 @@ var/list/tape_roll_applications = list() breaktape(null, user) /obj/item/tape/proc/breaktape(obj/item/W as obj, mob/user as mob) - if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user)))) + if(user.a_intent == I_HELP && ((!W.can_puncture() && src.allowed(user)))) to_chat(user, SPAN_NOTICE("You can't break \the [src] with that!")) return user.visible_message(SPAN_NOTICE("[user] breaks \the [src]!")) diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm deleted file mode 100644 index c8c91657196..00000000000 --- a/code/game/objects/items/weapons/scrolls.dm +++ /dev/null @@ -1,114 +0,0 @@ -/obj/item/teleportation_scroll - name = "scroll of teleportation" - desc = "A scroll for moving around." - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll" - item_state = "scroll" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_books.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_books.dmi' - ) - var/uses = 4.0 - w_class = ITEMSIZE_TINY - item_state = "paper" - throw_speed = 4 - throw_range = 20 - origin_tech = list(TECH_BLUESPACE = 4) - -/obj/item/teleportation_scroll/attack_self(mob/living/user as mob) - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/O = H.internal_organs_by_name[pick(BP_EYES, BP_APPENDIX, BP_KIDNEYS, BP_LIVER, BP_HEART, BP_LUNGS, BP_BRAIN)] - if(O == null) - to_chat(user, SPAN_NOTICE("You can't make any sense of the arcane glyphs. . . maybe you should try again.")) - else - to_chat(user, SPAN_ALERT("As you stumble over the arcane glyphs, you feel a twisting sensation in [O]!")) - user.visible_message("A flash of smoke pours out of [user]'s orifices!") - playsound(user, 'sound/magic/lightningshock.ogg', 40, 1) - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, user.loc) - smoke.attach(user) - smoke.start() - user.show_message("[user] screams!",2) - user.drop_item() - if(O && istype(O)) - O.removed(user) - return - else - user.set_machine(src) - var/dat = "Teleportation Scroll:
" - dat += "Number of uses: [src.uses]
" - dat += "
" - dat += "Four uses use them wisely:
" - dat += "Teleport
" - dat += "Kind regards,
Wizards Federation

P.S. Don't forget to bring your gear, you'll need it to cast most spells.
" - user << browse(dat, "window=scroll") - onclose(user, "scroll") - return - -/obj/item/teleportation_scroll/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained() || src.loc != usr) - return - var/mob/living/carbon/human/H = usr - if (!( istype(H, /mob/living/carbon/human))) - return 1 - if ((usr == src.loc || (in_range(src, usr) && istype(src.loc, /turf)))) - usr.set_machine(src) - if (href_list["spell_teleport"]) - if (src.uses >= 1) - teleportscroll(H) - attack_self(H) - return - -/obj/item/teleportation_scroll/proc/teleportscroll(var/mob/user) - - var/A - - A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in teleportlocs - var/area/thearea = teleportlocs[A] - - if (user.stat || user.restrained()) - return - if(!((user == loc || (in_range(src, user) && istype(src.loc, /turf))))) - return - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, user.loc) - smoke.attach(user) - smoke.start() - var/list/L = list() - for(var/turf/T in get_area_turfs(thearea)) - if(!T.density && !T.is_hole) - var/clear = 1 - for(var/obj/O in T) - if(O.density) - clear = 0 - break - if(clear) - L+=T - - if(!L.len) - to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") - return - - if(user && user.buckled_to) - user.buckled_to.unbuckle() - - var/list/tempL = L - var/attempt = null - var/success = 0 - while(tempL.len) - attempt = pick(tempL) - success = user.Move(attempt) - if(!success) - tempL.Remove(attempt) - else - break - - if(!success) - user.forceMove(pick(L)) - - smoke.start() - src.uses -= 1 diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 0ba75c8ca3c..84649f5c308 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -41,7 +41,7 @@ /obj/item/shield/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(user.incapacitated()) - return 0 + return FALSE var/shield_dir = reverse_dir[user.dir] if(on_back) @@ -52,8 +52,8 @@ if(check_shield_arc(user, bad_arc, damage_source, attacker)) if(prob(get_block_chance(user, damage, damage_source, attacker))) user.visible_message("\The [user] blocks [attack_text] with \the [src]!") - return 1 - return 0 + return PROJECTILE_STOPPED + return FALSE /obj/item/shield/can_shield_back() return TRUE @@ -148,10 +148,10 @@ /obj/item/shield/energy/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(!active) - return 0 //turn it on first! + return FALSE //turn it on first! if(user.incapacitated()) - return 0 + return FALSE if(.) spark(user.loc, 5) @@ -178,7 +178,7 @@ w_class = ITEMSIZE_TINY playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) shield_power = initial(shield_power) - return 0 + return FALSE if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam)) var/obj/item/projectile/P = damage_source @@ -198,10 +198,10 @@ return PROJECTILE_CONTINUE // complete projectile permutation else user.visible_message("\The [user] blocks [attack_text] with \the [src]!") - return 1 + return PROJECTILE_STOPPED else user.visible_message("\The [user] blocks [attack_text] with \the [src]!") - return 1 + return PROJECTILE_STOPPED /obj/item/shield/energy/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) if(istype(damage_source, /obj/item/projectile)) @@ -304,9 +304,9 @@ /obj/item/shield/riot/tact/handle_shield(mob/user) if(!active) - return 0 //turn it on first! - . = ..() + return FALSE //turn it on first! + . = ..() if(.) if(.) playsound(user.loc, 'sound/weapons/genhit.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 10cb5f6a871..753e95b4f05 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -113,18 +113,20 @@ name = "adorned backpack" desc = "A backpack adorned with various decorations." -/obj/item/storage/backpack/clown - name = "Giggles von Honkerton" - desc = "It's a backpack made by Honk! Co." - icon_state = "clownpack" - item_state_slots = null - /obj/item/storage/backpack/medic name = "medical backpack" desc = "It's a backpack especially designed for use in a sterile environment." icon_state = "medicalpack" item_state_slots = null +/obj/item/storage/backpack/medic/first_responder + name = "first responder backpack" + desc = "A bulky easy-clean backpack specially designed to carry a First Responder's equipment." + icon = 'icons/clothing/kit/first_responder.dmi' + icon_state = "firstresponderbackpack" + item_state = "firstresponderbackpack" + contained_sprite = TRUE + /obj/item/storage/backpack/security name = "security backpack" desc = "It's a very robust backpack." @@ -172,9 +174,8 @@ /obj/item/storage/backpack/cloak name = "tunnel cloak" - desc = "It's a Vaurca cloak, with paltry storage options." + desc = "It's a Vaurca cloak with storage pockets." icon_state = "cape" - max_storage_space = 12 sprite_sheets = list(BODYTYPE_VAURCA = 'icons/mob/species/vaurca/back.dmi') /obj/item/storage/backpack/syndie @@ -184,8 +185,8 @@ empty_delay = 0.8 SECOND /obj/item/storage/backpack/wizard - name = "wizard federation sack" - desc = "Perfect for keeping your shining crystal balls inside of." + name = "magical sack" + desc = "Perfect for keeping your shining crystal balls inside of. May not contain actual magic." icon_state = "wizardpack" empty_delay = 0.8 SECOND @@ -292,8 +293,8 @@ empty_delay = 0.8 SECOND /obj/item/storage/backpack/satchel_wizard - name = "wizard federation satchel" - desc = "This stylish satchel will put a spell on anyone with some fashion sense to spare." + name = "magic satchel" + desc = "This stylish satchel will put a spell on anyone with some fashion sense to spare. Contains %0 actual magic." icon_state = "satchel-wizard" empty_delay = 0.8 SECOND @@ -423,8 +424,8 @@ empty_delay = 0.8 SECOND /obj/item/storage/backpack/duffel/wizard - name = "wizardly duffel bag" - desc = "A fancy blue wizard bag, duffel edition." + name = "magical duffel bag" + desc = "A fancy blue spell bag, duffel edition. Comes with zero spells because magic isn't real, nerd." icon_state = "duffel-wizard" slowdown = 0 empty_delay = 0.8 SECOND @@ -528,5 +529,100 @@ /obj/item/material/knife, /obj/item/material/hatchet/butch, /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/storage/toolbox/lunchbox/nt - ) \ No newline at end of file + /obj/item/storage/toolbox/lunchbox + ) + +/* + * Rucksacks + */ + +/obj/item/storage/backpack/rucksack + name = "black rucksack" + desc = "A sturdy, military-grade backpack with low-profile straps. Designed to work well with armor." + icon_state = "rucksack" + item_state_slots = list(slot_l_hand_str = "rucksack", slot_r_hand_str = "rucksack") + +/obj/item/storage/backpack/rucksack/blue + name = "blue rucksack" + icon_state = "rucksack_blue" + item_state_slots = list(slot_l_hand_str = "rucksack_blue", slot_r_hand_str = "rucksack_blue") + +/obj/item/storage/backpack/rucksack/green + name = "green rucksack" + icon_state = "rucksack_green" + item_state_slots = list(slot_l_hand_str = "rucksack_green", slot_r_hand_str = "rucksack_green") + +/obj/item/storage/backpack/rucksack/navy + name = "navy rucksack" + icon_state = "rucksack_navy" + item_state_slots = list(slot_l_hand_str = "rucksack_navy", slot_r_hand_str = "rucksack_navy") + +/obj/item/storage/backpack/rucksack/tan + name = "tan rucksack" + icon_state = "rucksack_tan" + item_state_slots = list(slot_l_hand_str = "rucksack_tan", slot_r_hand_str = "rucksack_tan") + +/* + * Colored satchels + */ + +/obj/item/storage/backpack/satchel/leather //brown, master type + name = "brown leather satchel" + desc = "A very fancy satchel made of some kind of leather." + icon_state = "satchel_colored" + item_state = "satchel_colored" + color = "#3d2711" + +/obj/item/storage/backpack/satchel/leather/khaki + name = "khaki leather satchel" + color = "#baa481" + +/obj/item/storage/backpack/satchel/leather/black + name = "black leather satchel" + color = "#212121" + +/obj/item/storage/backpack/satchel/leather/navy + name = "navy leather satchel" + color = "#1c2133" + +/obj/item/storage/backpack/satchel/leather/olive + name = "olive leather satchel" + color = "#544f3d" + +/obj/item/storage/backpack/satchel/leather/reddish + name = "auburn leather satchel" + color = "#512828" + +/* + * Colored pocketbooks + */ + +/obj/item/storage/backpack/satchel/pocketbook //black, master type + name = "black pocketbook" + desc = "A neat little folding clasp pocketbook with a shoulder sling." + icon_state = "pocketbook" + item_state = "pocketbook" + w_class = ITEMSIZE_HUGE // to avoid recursive backpacks + slot_flags = SLOT_BACK + max_w_class = ITEMSIZE_NORMAL + max_storage_space = 20 + color = "#212121" + +/obj/item/storage/backpack/satchel/pocketbook/brown + name = "brown pocketbook" + color = "#3d2711" + +/obj/item/storage/backpack/satchel/pocketbook/reddish + name = "auburn pocketbook" + color = "#512828" + +/* + * Colored pocketbooks + */ + +/obj/item/storage/backpack/satchel/pocketbook/purse + name = "purse" + desc = "A small, fashionable bag typically worn over the shoulder." + icon_state = "purse" + item_state = "purse" + max_storage_space = 16 \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 172fd6790e3..5dad50d21c6 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -328,7 +328,7 @@ max_storage_space = 200 max_w_class = ITEMSIZE_NORMAL w_class = ITEMSIZE_NORMAL - can_hold = list(/obj/item/book, /obj/item/spellbook) + can_hold = list(/obj/item/book) // ----------------------------- // Chemistry Bag diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 6827fc354f5..ebdfcb4c9fb 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -14,12 +14,20 @@ pickup_sound = 'sound/items/pickup/toolbelt.ogg' var/flipped = FALSE var/show_above_suit = FALSE + var/content_overlays = FALSE //If this is true, the belt will gain overlays based on what it's holding /obj/item/storage/belt/proc/update_clothing_icon() if(ismob(src.loc)) var/mob/M = src.loc M.update_inv_belt() +/obj/item/storage/belt/update_icon() + cut_overlays() + if(content_overlays) + for(var/obj/item/I in contents) + add_overlay(I.get_belt_overlay()) + ..() + /obj/item/storage/belt/verb/toggle_layer() set name = "Switch Belt Layer" set category = "Object" @@ -34,6 +42,10 @@ . = ..() update_flip_verb() +/obj/item/storage/belt/fill() + . = ..() + update_icon() + /obj/item/storage/belt/proc/update_flip_verb() if(("[initial(icon_state)]_flip") in icon_states(icon)) // Check for whether it has a flipped icon. Prevents invisible sprites. verbs += /obj/item/storage/belt/proc/flipbelt @@ -86,7 +98,19 @@ /obj/item/device/debugger, /obj/item/device/eftpos ) + content_overlays = TRUE +/obj/item/storage/belt/utility/ce + icon_state = "utilitybelt_ce" + item_state = "utility_ce" + + starts_with = list( + /obj/item/weldingtool/largetank = 1, // industrial welding tool + /obj/item/crowbar = 1, + /obj/item/wirecutters/toolbelt = 1, + /obj/item/stack/cable_coil/random = 1, + /obj/item/powerdrill = 1 + ) /obj/item/storage/belt/utility/full starts_with = list( @@ -94,7 +118,7 @@ /obj/item/wrench = 1, /obj/item/weldingtool = 1, /obj/item/crowbar = 1, - /obj/item/wirecutters = 1, + /obj/item/wirecutters/toolbelt = 1, /obj/item/stack/cable_coil/random = 1, /obj/item/powerdrill = 1 ) @@ -103,7 +127,7 @@ starts_with = list( /obj/item/weldingtool/largetank = 1, /obj/item/crowbar = 1, - /obj/item/wirecutters = 1, + /obj/item/wirecutters/toolbelt = 1, /obj/item/stack/cable_coil/random = 1, /obj/item/powerdrill = 1, /obj/item/device/multitool = 1, @@ -156,7 +180,8 @@ /obj/item/crowbar, /obj/item/device/flashlight, /obj/item/extinguisher/mini, - /obj/item/device/radio + /obj/item/device/radio, + /obj/item/taperoll/medical ) /obj/item/storage/belt/medical/first_responder @@ -165,6 +190,64 @@ icon_state = "emsbelt" item_state = "emsbelt" +/obj/item/storage/belt/medical/first_responder/combat + name = "tactical medical belt" + desc = "A sturdy black webbing belt with attached pouches. This one is designed for medical professionals who expect to enter conflict zones on the daily. It has increased storage and utility." + storage_slots = 9 + max_storage_space = 28 + can_hold = list( + /obj/item/device/breath_analyzer, + /obj/item/device/healthanalyzer, + /obj/item/dnainjector, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/glass/bottle, + /obj/item/reagent_containers/pill, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/inhaler, + /obj/item/reagent_containers/personal_inhaler_cartridge, + /obj/item/personal_inhaler, + /obj/item/flame/lighter/zippo, + /obj/item/storage/box/fancy/cigarettes, + /obj/item/storage/pill_bottle, + /obj/item/stack/medical, + /obj/item/device/flashlight/pen, + /obj/item/clothing/mask/surgical, + /obj/item/clothing/head/surgery, + /obj/item/clothing/gloves/latex, + /obj/item/reagent_containers/hypospray, + /obj/item/clothing/glasses/hud/health, + /obj/item/crowbar, + /obj/item/device/flashlight, + /obj/item/extinguisher/mini, + /obj/item/device/radio, + /obj/item/taperoll/medical, + /obj/item/handcuffs, + /obj/item/ammo_casing/shotgun, + /obj/item/ammo_magazine, + /obj/item/device/flash, + /obj/item/device/flashlight/maglight, + /obj/item/device/flashlight/flare, + /obj/item/material/knife, + /obj/item/stack/telecrystal, + /obj/item/melee/baton, + /obj/item/shield/riot/tact, + /obj/item/grenade, + /obj/item/reagent_containers/blood + ) + +/obj/item/storage/belt/medical/first_responder/combat/full + starts_with = list( + /obj/item/reagent_containers/hypospray/cmo = 1, + /obj/item/reagent_containers/glass/bottle/inaprovaline = 1, + /obj/item/reagent_containers/glass/bottle/antitoxin = 1, + /obj/item/reagent_containers/glass/bottle/dexalin_plus = 1, + /obj/item/reagent_containers/glass/bottle/butazoline = 1, + /obj/item/reagent_containers/glass/bottle/dermaline = 1, + /obj/item/reagent_containers/glass/bottle/perconol = 1, + /obj/item/reagent_containers/glass/bottle/thetamycin = 1 + ) + /obj/item/storage/belt/security name = "security belt" desc = "Can hold security gear like handcuffs and flashes." @@ -199,6 +282,7 @@ /obj/item/device/holowarrant, /obj/item/device/radio ) + content_overlays = TRUE /obj/item/storage/belt/soulstone name = "soul stone belt" @@ -300,27 +384,6 @@ /obj/item/gun/energy/mousegun ) -/obj/item/storage/belt/wands - name = "wand belt" - desc = "A belt designed to hold various rods of power." - icon_state = "soulstonebelt" - item_state = "soulstonebelt" - storage_slots = 5 - max_w_class = ITEMSIZE_NORMAL - max_storage_space = 28 - can_hold = list( - /obj/item/gun/energy/wand - ) - -/obj/item/storage/belt/wands/full - starts_with = list( - /obj/item/gun/energy/wand/fire = 1, - /obj/item/gun/energy/wand/polymorph = 1, - /obj/item/gun/energy/wand/teleport = 1, - /obj/item/gun/energy/wand/force = 1, - /obj/item/gun/energy/wand/animation = 1 - ) - /obj/item/storage/belt/mining name = "explorer's belt" desc = "A versatile chest rig, cherished by miners and hunters alike." diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 1da149596e7..e31d65eb4e1 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -127,10 +127,31 @@ desc = "A faithful box that will remain with you, no matter where you go, and probably save you." icon_state = "e_box" autodrobe_no_remove = 1 - starts_with = list(/obj/item/clothing/mask/breath = 1, - /obj/item/tank/emergency_oxygen = 1, - /obj/item/device/flashlight/flare/glowstick/red = 1 - ) + max_storage_space = 14 + can_hold = list( + /obj/item/clothing/mask, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight/flare/glowstick, + /obj/item/stack/medical, + /obj/item/reagent_containers/hypospray/autoinjector, + /obj/item/reagent_containers/inhaler, + /obj/item/device/oxycandle, + /obj/item/extinguisher/mini, + /obj/item/device/radio, + /obj/item/device/flashlight, + /obj/item/reagent_containers/food/drinks/flask, + /obj/item/storage/box/fancy/cigarettes, + /obj/item/flame/lighter, + /obj/item/disk/nuclear + ) + starts_with = list( + /obj/item/clothing/mask/breath = 1, + /obj/item/tank/emergency_oxygen = 1, + /obj/item/device/oxycandle = 1, + /obj/item/device/flashlight/flare/glowstick/red = 1, + /obj/item/stack/medical/bruise_pack = 1, + /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline = 1 + ) /obj/item/storage/box/survival/fill() ..() @@ -881,3 +902,22 @@ var/obj/item/closet_teleporter/CT_2 = new /obj/item/closet_teleporter(src) CT_1.linked_teleporter = CT_2 CT_2.linked_teleporter = CT_1 + +/obj/item/storage/box/googly + name = "googly eye box" + desc = "A box containing googly eyes." + starts_with = list(/obj/item/sticker/googly_eye = 8) + +/obj/item/storage/box/goldstar + name = "gold star box" + desc = "A box containing gold star stickers." + starts_with = list(/obj/item/sticker/goldstar = 8) + +/obj/item/storage/box/folders + name = "box of folders" + desc = "A box full of folders." + starts_with = list(/obj/item/folder = 5) + +/obj/item/storage/box/folders/blue + starts_with = list(/obj/item/folder/sec = 5) + diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index cdb0ccd0019..aca2c9bfd0c 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -241,7 +241,7 @@ obj/item/storage/pill_bottle/butazoline starts_with = list(/obj/item/reagent_containers/pill/perconol = 7) /obj/item/storage/pill_bottle/minaphobin - name = "bottle of 5u Minaphobin pills" + name = "bottle of 2u Minaphobin pills" desc = "Contains pills used to treat anxiety disorders and depression." starts_with = list(/obj/item/reagent_containers/pill/minaphobin = 7) @@ -249,3 +249,41 @@ obj/item/storage/pill_bottle/butazoline name = "bottle of 15u RMT pills" desc = "Contains pills used to remedy the effects of prolonged zero-gravity adaptations. Do not exceed 30u dosage." starts_with = list(/obj/item/reagent_containers/pill/rmt = 10) // 10x 15u RMT pills will last 4 hours. + +/obj/item/storage/pill_bottle/corophenidate + name = "bottle of 2u Corophenidate pills" + desc = "Contains pills used to improve the ability to concentrate." + starts_with = list(/obj/item/reagent_containers/pill/corophenidate = 3) + +/obj/item/storage/pill_bottle/emoxanyl + name = "bottle of 2u Emoxanyl pills" + desc = "Contains pills used to treat anxiety disorders, depression and epilepsy." + starts_with = list(/obj/item/reagent_containers/pill/emoxanyl = 3) + +/obj/item/storage/pill_bottle/minaphobin/small + starts_with = list(/obj/item/reagent_containers/pill/minaphobin = 3) + +/obj/item/storage/pill_bottle/nerospectan + name = "bottle of 2u Nerospectan pills" + desc = "Contains pills used to treat a large variety of disorders including tourette, depression, anxiety and psychoses." + starts_with = list(/obj/item/reagent_containers/pill/nerospectan = 3) + +/obj/item/storage/pill_bottle/neurapan + name = "bottle of 2u Neurapan pills" + desc = "Contains pills used to treat large variety of disorders including tourette, depression, anxiety and psychoses." + starts_with = list(/obj/item/reagent_containers/pill/neurapan= 3) + +/obj/item/storage/pill_bottle/neurostabin + name = "bottle of 2u Neurostabin pills" + desc = "Contains pills used to treat psychoses and muscle weakness." + starts_with = list(/obj/item/reagent_containers/pill/neurostabin = 3) + +/obj/item/storage/pill_bottle/orastabin + name = "bottle of 2u Orastabin pills" + desc = "Contains pills used to treat anxiety disorders and speech impediments." + starts_with = list(/obj/item/reagent_containers/pill/orastabin = 3) + +/obj/item/storage/pill_bottle/parvosil + name = "bottle of 2u Parvosil pills" + desc = "Contains pills used to treat anxiety disorders such as phobias and social anxiety." + starts_with = list(/obj/item/reagent_containers/pill/parvosil = 3) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 6bbd8181d58..bc4338072ed 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -138,6 +138,10 @@ to_chat(user, (feedback ? feedback : "You short out the lock of \the [src].")) return 1 +/obj/item/storage/secure/AltClick(/mob/user) + if (!locked) + return ..() + // ----------------------------- // Secure Briefcase // ----------------------------- diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 800d751b448..4c60bf196e6 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -22,6 +22,7 @@ var/max_w_class = ITEMSIZE_NORMAL //Max size of objects that this object can store (in effect only if can_hold isn't set) var/max_storage_space = 8 //The sum of the storage costs of all the items in this storage item. var/storage_slots //The number of storage slots in this container. + var/force_column_number // the number of columns the storage item will appear to have var/obj/screen/storage/boxes var/obj/screen/storage/storage_start //storage UI var/obj/screen/storage/storage_continue @@ -92,6 +93,15 @@ usr.equip_to_slot_if_possible(src, slot_l_hand) src.add_fingerprint(usr) +/obj/item/storage/AltClick(var/mob/usr) + if(!canremove) + return ..() + if (!use_check_and_message(usr)) + add_fingerprint(usr) + open(usr) + return TRUE + . = ..() + /obj/item/storage/proc/return_inv() . = contents.Copy() @@ -294,7 +304,7 @@ space_orient_objs(numbered_contents, defer_overlays) else var/row_num = 0 - var/col_count = min(7,storage_slots) -1 + var/col_count = force_column_number ? force_column_number : min(7, storage_slots) - 1 if (adjusted_contents > 7) row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. src.slot_orient_objs(row_num, col_count, numbered_contents) @@ -694,6 +704,9 @@ remove_from_storage(O, T) O.tumble(2) +// putting a sticker on something puts it in its contents, storage items use their contents to store their items +/obj/item/storage/can_attach_sticker(var/mob/user, var/obj/item/sticker/S) + return FALSE //Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area). //Returns -1 if the atom was not found on container. @@ -760,4 +773,4 @@ //return 2**(w_class-1) //1,2,4,8,16,... -#undef STORAGE_SPACE_CAP +#undef STORAGE_SPACE_CAP \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 10aa4a22ba6..de2326ec4f7 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -33,10 +33,10 @@ name = "emergency toolbox" icon_state = "red" item_state = "toolbox_red" - starts_with = list(\ - /obj/item/crowbar/red = 1,\ - /obj/item/extinguisher/mini = 1,\ - /obj/item/device/radio = 1\ + starts_with = list( + /obj/item/crowbar/red = 1, + /obj/item/extinguisher/mini = 1, + /obj/item/device/radio = 1 ) /obj/item/storage/toolbox/emergency/fill() @@ -45,6 +45,9 @@ new /obj/item/device/flashlight(src) else new /obj/item/device/flashlight/flare/glowstick/red(src) + if(prob(30)) + new /obj/item/weldingtool/emergency(src) + new /obj/item/clothing/glasses/welding/emergency(src) /obj/item/storage/toolbox/mechanical name = "mechanical toolbox" @@ -205,6 +208,15 @@ /obj/item/storage/toolbox/lunchbox/nt/filled filled = TRUE +/obj/item/storage/toolbox/lunchbox/idris + name = "Idris Incorporated lunchbox" + icon_state = "lunchbox_idris" + item_state = "lunchbox_idris" + desc = "A little lunchbox. This one features a durable holographic screen on the side that showcases the Idris logo." + +/obj/item/storage/toolbox/lunchbox/idris/filled + filled = TRUE + /obj/item/storage/toolbox/lunchbox/nymph name = "\improper diona nymph lunchbox" icon_state = "lunchbox_dionanymph" @@ -241,4 +253,31 @@ item_state = "lunchbox_scc" /obj/item/storage/toolbox/lunchbox/scc/filled + filled = TRUE + +/obj/item/storage/toolbox/lunchbox/swimstars_axic + name = "Swimstars Axic lunchbox" + desc = "Created, and marketed, after the hit show, Swimstars!" + icon_state = "swimstars_axic" + item_state = "swimstars_axic" + +/obj/item/storage/toolbox/lunchbox/swimstars_axic/filled + filled = TRUE + +/obj/item/storage/toolbox/lunchbox/swimstars_qill + name = "Swimstars Qill lunchbox" + desc = "Created, and marketed, after the hit show, Swimstars!" + icon_state = "swimstars_qill" + item_state = "swimstars_qill" + +/obj/item/storage/toolbox/lunchbox/swimstars_qill/filled + filled = TRUE + +/obj/item/storage/toolbox/lunchbox/swimstars_xana + name = "Swimstars Xana lunchbox" + desc = "Created, and marketed, after the hit show, Swimstars!" + icon_state = "swimstars_xana" + item_state = "swimstars_xana" + +/obj/item/storage/toolbox/lunchbox/swimstars_xana/filled filled = TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index f02655c0796..263e752c2c7 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -141,7 +141,8 @@ /obj/item/pen/chameleon = 1, /obj/item/device/destTagger = 1, /obj/item/stack/packageWrap = 1, - /obj/item/device/hand_labeler = 1 + /obj/item/device/hand_labeler = 1, + /obj/item/folder/filled = 1 ) /obj/item/storage/box/syndie_kit/special_pens diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 79990e8fa09..ff5b498d3a4 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -48,6 +48,10 @@ var/wear_over_suit = 0 var/base_name = "" +/obj/item/storage/wallet/Initialize() + . = ..() + base_name = name + /obj/item/storage/wallet/remove_from_storage(obj/item/W as obj, atom/new_location) . = ..(W, new_location) @@ -62,7 +66,6 @@ if(.) if(!front_id && istype(W, /obj/item/card/id)) front_id = W - base_name = name name = "[name] ([front_id])" update_icon() diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index bc1b5631f4c..5bafb0ce386 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -247,6 +247,14 @@ baton_color = "#FFDF00" sheathed = 0 +/obj/item/melee/baton/cattleprod/Initialize(mapload, var/cable_color) + . = ..() + var/image/I = image(icon, null, "stunprod_cable") + if(!cable_color) + cable_color = COLOR_RED + I.color = cable_color + add_overlay(I) + /obj/item/melee/baton/stunrod name = "stunrod" desc = "A more-than-lethal weapon used to deal with high threat situations." diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 021a7e07ddb..55054fbf0ce 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -36,35 +36,32 @@ /obj/item/melee/telebaton name = "telescopic baton" desc = "A compact yet rebalanced personal defense weapon. Can be concealed when folded." - icon = 'icons/obj/weapons.dmi' + icon = 'icons/obj/contained_items/weapons/telebaton.dmi' icon_state = "telebaton_0" item_state = "telebaton_0" + contained_sprite = TRUE slot_flags = SLOT_BELT w_class = ITEMSIZE_SMALL force = 3 drop_sound = 'sound/items/drop/crowbar.ogg' pickup_sound = 'sound/items/pickup/crowbar.ogg' - var/on = 0 + var/on = FALSE -/obj/item/melee/telebaton/attack_self(mob/user as mob) +/obj/item/melee/telebaton/attack_self(mob/user) on = !on if(on) - user.visible_message("With a flick of their wrist, [user] extends their telescopic baton.",\ - "You extend the baton.",\ - "You hear an ominous click.") + user.visible_message(SPAN_WARNING("With a flick of their wrist, [user] extends their telescopic baton."), SPAN_WARNING("You extend the baton."), SPAN_WARNING("You hear an ominous click.")) icon_state = "telebaton_1" item_state = "telebaton_1" w_class = ITEMSIZE_NORMAL - force = 15//quite robust + force = 15 //quite robust attack_verb = list("smacked", "struck", "slapped") else - user.visible_message("\The [user] collapses their telescopic baton.",\ - "You collapse the baton.",\ - "You hear a click.") + user.visible_message(SPAN_NOTICE("\The [user] collapses their telescopic baton."), SPAN_NOTICE("You collapse the baton."), SPAN_NOTICE("You hear a click.")) icon_state = "telebaton_0" item_state = "telebaton_0" w_class = ITEMSIZE_SMALL - force = 3//not so robust now + force = 3 //not so robust now attack_verb = list("hit", "punched") if(istype(user,/mob/living/carbon/human)) @@ -87,22 +84,20 @@ return -/obj/item/melee/telebaton/attack(mob/target as mob, mob/living/user as mob, var/target_zone) +/obj/item/melee/telebaton/attack(mob/target, mob/living/user, var/target_zone) if(on) - if ((user.is_clumsy()) && prob(50)) - to_chat(user, "You club yourself over the head.") + if(user.is_clumsy() && prob(50)) + to_chat(user, SPAN_WARNING("You club yourself over the head.")) user.Weaken(3 * force) if(ishuman(user)) var/mob/living/carbon/human/H = user - H.apply_damage(2*force, BRUTE, BP_HEAD) + H.apply_damage(2 * force, BRUTE, BP_HEAD) else - user.take_organ_damage(2*force) + user.take_organ_damage(2 * force) return - if(..() == 1) - if(user.a_intent == I_DISARM) - if(ishuman(target)) - var/mob/living/carbon/human/T = target - T.apply_damage(40, PAIN, target_zone) + if(..() && user.a_intent == I_DISARM) + if(ishuman(target)) + var/mob/living/carbon/human/T = target + T.apply_damage(40, PAIN, target_zone) return - else - return ..() + return ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index 160e1eec5e4..7ca4964898c 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -90,6 +90,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "pen" item_state = "pen" + flags = HELDMAPTEXT slot_flags = SLOT_BELT | SLOT_EARS throwforce = 0 w_class = ITEMSIZE_TINY @@ -101,12 +102,15 @@ maptext_y = 2 var/ready_to_use = TRUE var/recharge_time = 1 MINUTE - var/held_maptext = "Ready" + var/when_recharge = 0 -/obj/item/syndie/teleporter/Initialize() +/obj/item/syndie/teleporter/examine(mob/user, distance) . = ..() - if(ismob(loc) || ismob(loc.loc)) - maptext = held_maptext + if(!ready_to_use && burglars.is_antagonist(user.mind)) + to_chat(user, SPAN_NOTICE("Charging: [num2loadingbar(world.time / when_recharge)]")) + +/obj/item/syndie/teleporter/set_initial_maptext() + held_maptext = SMALL_FONTS(7, "Ready") /obj/item/syndie/teleporter/attack() return @@ -134,34 +138,12 @@ user.visible_message("[user] appears out of thin air!", SPAN_NOTICE("You successfully step into your destination.")) use() -/obj/item/syndie/teleporter/proc/check_maptext(var/new_maptext) - if(new_maptext) - held_maptext = new_maptext - if(ismob(loc) || ismob(loc.loc)) - maptext = held_maptext - else - maptext = "" - /obj/item/syndie/teleporter/proc/use() addtimer(CALLBACK(src, .proc/recharge), recharge_time) ready_to_use = FALSE - check_maptext("Charge") + check_maptext(SMALL_FONTS(6, "Charge")) + when_recharge = world.time + recharge_time /obj/item/syndie/teleporter/proc/recharge() ready_to_use = TRUE - check_maptext("Ready") - -/obj/item/syndie/teleporter/throw_at() - ..() - check_maptext() - -/obj/item/syndie/teleporter/dropped() - ..() - check_maptext() - -/obj/item/syndie/teleporter/on_give() - check_maptext() - -/obj/item/syndie/teleporter/pickup() - ..() - addtimer(CALLBACK(src, .proc/check_maptext), 1) // invoke async does not work here + check_maptext(SMALL_FONTS(7, "Ready")) \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 9e283afce3e..482d567af43 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -90,9 +90,9 @@ if (istype(W, /obj/item/flamethrower)) var/obj/item/flamethrower/F = W - if ((!F.secured)||(F.ptank)) return + if ((!F.secured)||(F.gas_tank)) return src.master = F - F.ptank = src + F.gas_tank = src user.remove_from_mob(src) src.forceMove(F) return diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 22cd9876529..d6a989096a8 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -73,9 +73,6 @@ /obj/item/tank/attackby(obj/item/W as obj, mob/user as mob) ..() - if (istype(src.loc, /obj/item/assembly)) - icon = src.loc - if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) var/obj/item/device/analyzer/A = W A.analyze_gases(src, user) diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index f7af01a8601..8b81729f852 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -18,7 +18,7 @@ to_chat(user, "\The [H] doesn't have any eyes.") return if(H.glasses) - to_chat(user, "\The [H] is already wearing somethign on their eyes.") + to_chat(user, "\The [H] is already wearing something on their eyes.") return if(H.head && (H.head.body_parts_covered & FACE)) to_chat(user, "Remove their [H.head] first.") diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index e0b23056fe0..c6840ca33bb 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -3,11 +3,26 @@ * Locator * Hand-tele * Closet Teleporter + * Inhibitor handling proc for above */ +/* + * Special inhibitor handling. Different from the one used by teleport datums. + */ +/proc/check_inhibitors(var/turf/T) + for(var/found_inhibitor in bluespace_inhibitors) + var/obj/machinery/anti_bluespace/AB = found_inhibitor + if(T.z != AB.z || get_dist(T, AB) > 8 || (AB.stat & (NOPOWER | BROKEN))) + continue + else + return FALSE + return TRUE + /* * Locator */ + + /obj/item/locator name = "locator" desc = "A device that can be used to track those with locator implants." @@ -130,18 +145,16 @@ Frequency: icon_state = "hand_tele" item_state = "electronic" throwforce = 5 + flags = HELDMAPTEXT w_class = ITEMSIZE_SMALL throw_speed = 3 throw_range = 5 origin_tech = list(TECH_MAGNET = 1, TECH_BLUESPACE = 3) matter = list(DEFAULT_WALL_MATERIAL = 10000) var/list/active_teleporters = list() - var/held_maptext = "Ready" -/obj/item/hand_tele/Initialize() - . = ..() - if(get(loc, /mob)) - maptext = held_maptext +/obj/item/hand_tele/set_initial_maptext() + held_maptext = SMALL_FONTS(7, "Ready") /obj/item/hand_tele/attack_self(mob/user) var/turf/current_location = get_turf(user)//What turf is the user on? @@ -149,6 +162,11 @@ Frequency: to_chat(user, SPAN_WARNING("\The [src] can't get a bearing on anything right now.")) return + //Cannot make one if too close to an inhibitor + if(!check_inhibitors(current_location)) + to_chat(user, SPAN_DANGER("\The [src] can't seem to find a lock. Something in the area must be preventing the portal from opening...")) + return + var/list/teleport_options = list() for(var/obj/machinery/teleport/station/S in SSmachinery.all_machines) if(S.locked_obj) @@ -166,6 +184,9 @@ Frequency: continue if(T.density || turf_contains_dense_objects(T)) continue + if(!check_inhibitors(T)) + continue + potential_turfs += T if(length(potential_turfs)) @@ -184,36 +205,13 @@ Frequency: var/obj/effect/portal/P = new /obj/effect/portal(get_turf(src), T, src) active_teleporters += P if(length(active_teleporters) >= 3) - check_maptext("Charge") + check_maptext(SMALL_FONTS(6, "Charge")) add_fingerprint(user) /obj/item/hand_tele/proc/remove_portal(var/obj/effect/portal/P) active_teleporters -= P if(length(active_teleporters) < 3) - check_maptext("Ready") - -/obj/item/hand_tele/proc/check_maptext(var/new_maptext) - if(new_maptext) - held_maptext = new_maptext - if(ismob(loc) || ismob(loc.loc)) - maptext = held_maptext - else - maptext = "" - -/obj/item/hand_tele/throw_at() - ..() - check_maptext() - -/obj/item/hand_tele/dropped() - ..() - check_maptext() - -/obj/item/hand_tele/on_give() - check_maptext() - -/obj/item/hand_tele/pickup() - ..() - addtimer(CALLBACK(src, .proc/check_maptext), 1) // invoke async does not work here + check_maptext(SMALL_FONTS(7, "Ready")) /obj/item/closet_teleporter name = "closet teleporter" @@ -232,17 +230,21 @@ Frequency: /obj/item/closet_teleporter/proc/do_teleport(var/mob/user) if(!attached_closet) to_chat(user, SPAN_WARNING("\The [src] doesn't have an attached closet!")) - return + return FALSE if(!linked_teleporter) to_chat(user, SPAN_WARNING("\The [src] doesn't have a linked teleporter!")) - return + return FALSE if(!linked_teleporter.attached_closet) to_chat(user, SPAN_WARNING("The linked teleporter doesn't have an attached closet!")) - return + return FALSE if(last_use + 600 > world.time) - return + return FALSE + if(!check_inhibitors(get_turf(attached_closet)) || !check_inhibitors(get_turf(linked_teleporter.attached_closet))) + to_chat(user, SPAN_WARNING("Something near you or your destination is destabilizing the bluespace network between the closets. \The [src] can't get a clear link to the other side!")) + return FALSE + var/obj/structure/closet/target_closet = linked_teleporter.attached_closet - user.forceMove(target_closet) + user.forceMove(target_closet.opened ? get_turf(target_closet) : target_closet) if(target_closet.opened) user.visible_message(SPAN_NOTICE("\The [user] steps out of the back of \the [target_closet]."), SPAN_NOTICE("You teleport into the linked closet, stepping out of it.")) else @@ -250,6 +252,7 @@ Frequency: to_chat(user, SPAN_NOTICE("You teleport into the target closet, bumping into the closed door.")) target_closet.shake_animation() playsound(get_turf(src), 'sound/effects/grillehit.ogg', 100, TRUE) + return TRUE /obj/item/closet_teleporter/Destroy() attached_closet = null diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 5dd1f8c3791..19bcc174c7c 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -82,6 +82,13 @@ tf.Translate(-3,0) //Could do this with pixel_x but let's just update the appearance once. transform = tf +/obj/item/screwdriver/get_belt_overlay() + var/mutable_appearance/body = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver") + var/mutable_appearance/head = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_head") + body.color = color + head.add_overlay(body) + return head + /obj/item/screwdriver/pickup(mob/user) ..() update_icon() @@ -97,7 +104,7 @@ /obj/item/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob, var/target_zone) if(!istype(M) || user.a_intent == "help") return ..() - if(target_zone != BP_EYES && target_zone != BP_HEAD) + if((target_zone != BP_EYES && target_zone != BP_HEAD) || M.eyes_protected(src, FALSE)) return ..() if((user.is_clumsy()) && prob(50)) M = user @@ -137,10 +144,12 @@ build_from_parts = TRUE worn_overlay = "head" + var/list/color_options = list(COLOR_BLUE, COLOR_RED, COLOR_PURPLE, COLOR_BROWN, COLOR_GREEN, COLOR_CYAN, COLOR_YELLOW) + /obj/item/wirecutters/Initialize() . = ..() if(build_from_parts) - color = pick(COLOR_BLUE, COLOR_RED, COLOR_PURPLE, COLOR_BROWN, COLOR_GREEN, COLOR_CYAN, COLOR_YELLOW) + color = pick(color_options) add_overlay(overlay_image(icon, "[initial(icon_state)]_[worn_overlay]", flags=RESET_COLOR)) /obj/item/wirecutters/update_icon() @@ -150,6 +159,13 @@ tf.Translate(-1,0) //Could do this with pixel_x but let's just update the appearance once. transform = tf +/obj/item/wirecutters/get_belt_overlay() + var/mutable_appearance/body = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "wirecutters") + var/mutable_appearance/head = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "wirecutters_head") + body.color = color + head.add_overlay(body) + return head + /obj/item/wirecutters/pickup(mob/user) ..() update_icon() @@ -178,6 +194,9 @@ /obj/item/wirecutters/iswirecutter() return TRUE +/obj/item/wirecutters/toolbelt + color_options = list(COLOR_TOOLS) + /obj/item/wirecutters/bomb name = "bomb defusal wirecutters" desc = "A tool used to delicately sever the wires used in bomb fuses." @@ -191,20 +210,17 @@ /obj/item/weldingtool name = "welding tool" desc = "A welding tool with a built-in fuel tank, designed for welding and cutting metal." - icon = 'icons/obj/tools.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_tools.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_tools.dmi', - ) - icon_state = "welder_off" - item_state = "welder_off" + icon = 'icons/obj/contained_items/tools/welding_tools.dmi' + icon_state = "welder" + item_state = "welder" + contained_sprite = TRUE flags = CONDUCT slot_flags = SLOT_BELT drop_sound = 'sound/items/drop/weldingtool.ogg' pickup_sound = 'sound/items/pickup/weldingtool.ogg' usesound = 'sound/items/welder.ogg' - var/base_iconstate = "welder"//These are given an _on/_off suffix before being used - var/base_itemstate = "welder" + + attack_verb = list("hit", "bludgeoned", "whacked") //Amount of OUCH when it's thrown force = 3 @@ -224,14 +240,16 @@ var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) var/max_fuel = 20 //The max amount of fuel the welder can hold + var/change_icons = TRUE + /obj/item/weldingtool/iswelder() return TRUE /obj/item/weldingtool/largetank name = "industrial welding tool" desc = "A welding tool with an extended-capacity built-in fuel tank, standard issue for engineers." - base_iconstate = "ind_welder" - base_itemstate = "ind_welder" + icon_state = "indwelder" + item_state = "welder" max_fuel = 40 matter = list(DEFAULT_WALL_MATERIAL = 100, MATERIAL_GLASS = 60) origin_tech = list(TECH_ENGINEERING = 2) @@ -239,26 +257,33 @@ /obj/item/weldingtool/hugetank name = "advanced welding tool" desc = "A rare and powerful welding tool with a super-extended fuel tank." - base_iconstate = "adv_welder" - base_itemstate = "adv_welder" + icon_state = "advwelder" + item_state = "advwelder" max_fuel = 80 matter = list(DEFAULT_WALL_MATERIAL = 200, MATERIAL_GLASS = 120) origin_tech = list(TECH_ENGINEERING = 3) +/obj/item/weldingtool/emergency + name = "emergency welding tool" + desc = "A miniaturized version of a standard welding tool, this one was made to be used during emergencies." + icon_state = "miniwelder" + item_state = "miniwelder" + max_fuel = 10 + //The Experimental Welding Tool! /obj/item/weldingtool/experimental name = "experimental welding tool" desc = "A scientifically-enhanced welding tool that uses fuel-producing microbes to gradually replenish its fuel supply." - base_iconstate = "exp_welder" - base_itemstate = "exp_welder" + icon_state = "expwelder" + item_state = "expwelder" max_fuel = 40 matter = list(DEFAULT_WALL_MATERIAL = 100, MATERIAL_GLASS = 120) origin_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4) - var/last_gen = 0 var/fuelgen_delay = 400 //The time, in deciseconds, required to regenerate one unit of fuel //400 = 1 unit per 40 seconds + change_icons = FALSE //Welding tool functionality here /obj/item/weldingtool/Initialize() @@ -270,17 +295,27 @@ R.add_reagent(/decl/reagent/fuel, max_fuel) update_icon() -/obj/item/weldingtool/update_icon() - ..() - var/add = welding ? "_on" : "_off" - icon_state = base_iconstate + add //These are given an _on/_off suffix before being used - item_state = base_itemstate + add +/obj/item/weldingtool/proc/update_torch() + if(welding) + add_overlay("[initial(icon_state)]-on") + item_state = "[initial(item_state)]1" + else + item_state = "[initial(item_state)]" + if(welding == 2) set_light(0.7, 2, l_color = LIGHT_COLOR_CYAN) else if (welding == 1) set_light(0.6, 1.5, l_color = LIGHT_COLOR_LAVA) else set_light(0) + +/obj/item/weldingtool/update_icon() + cut_overlays() + if(change_icons) + var/ratio = get_fuel() / max_fuel + ratio = CEILING(ratio*4, 1) * 25 + add_overlay("[initial(icon_state)][ratio]") + update_torch() var/mob/M = loc if(istype(M)) M.update_inv_l_hand() @@ -315,9 +350,7 @@ R.use(1) add_fingerprint(user) user.drop_from_inventory(src) - var/obj/item/flamethrower/F = new /obj/item/flamethrower - F.weldtool = src - forceMove(F) + var/obj/item/flamethrower/F = new /obj/item/flamethrower(get_turf(src), src) user.put_in_hands(F) return @@ -495,6 +528,8 @@ damtype = BURN w_class = ITEMSIZE_LARGE welding = TRUE + hitsound = /decl/sound_category/flesh_burn_sound + attack_verb = list("scorched", "burned", "blasted", "blazed") update_icon() set_processing(TRUE) else @@ -512,6 +547,8 @@ damtype = BRUTE w_class = initial(w_class) welding = FALSE + hitsound = /decl/sound_category/swing_hit_sound + attack_verb = list("hit", "bludgeoned", "whacked") set_processing(FALSE) update_icon() @@ -712,13 +749,11 @@ /obj/item/powerdrill name = "impact wrench" desc = "The screwdriver's big brother." - icon = 'icons/obj/tools.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_tools.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_tools.dmi', - ) - icon_state = "powerdrillyellow" - item_state = "powerdrillyellow" + icon = 'icons/obj/contained_items/tools/impact_wrench.dmi' + icon_state = "impact_wrench-screw" + item_state = "impact_wrench" + contained_sprite = TRUE + flags = HELDMAPTEXT force = 8 attack_verb = list("gored", "drilled", "screwed", "punctured") w_class = ITEMSIZE_SMALL @@ -730,14 +765,13 @@ "wrenchbit" ) - /obj/item/powerdrill/Initialize() . = ..() - var/drillcolor = pick("red", "blue", "yellow", "green") - icon_state = "powerdrill[drillcolor]" - item_state = icon_state update_tool() +/obj/item/powerdrill/set_initial_maptext() + held_maptext = SMALL_FONTS(7, "S") + /obj/item/powerdrill/examine(var/mob/user) . = ..() if(. && tools.len) @@ -763,13 +797,14 @@ return tools[current_tool] == "screwdriverbit" /obj/item/powerdrill/proc/update_tool() - cut_overlays() if(isscrewdriver()) - usesound = 'sound/items/air_wrench.ogg' - add_overlay("screwdriverbit") - else if(iswrench()) usesound = 'sound/items/drill_use.ogg' - add_overlay("wrenchbit") + icon_state = "impact_wrench-screw" + check_maptext(SMALL_FONTS(7, "S")) + else if(iswrench()) + usesound = 'sound/items/air_wrench.ogg' + icon_state = "impact_wrench-wrench" + check_maptext(SMALL_FONTS(7, "W")) /obj/item/powerdrill/attack_self(var/mob/user) if(++current_tool > tools.len) @@ -783,6 +818,9 @@ update_tool() return TRUE +/obj/item/powerdrill/issurgerycompatible() + return FALSE // too unwieldy for most surgeries + /obj/item/steelwool name = "steel wool" desc = "Harvested from the finest NanoTrasen steel sheep." diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index cecf65ce47c..3447c406b12 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -4,7 +4,7 @@ throw_speed = 2 throw_range = 1 gender = PLURAL - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/contained_items/weapons/traps.dmi' var/icon_base = "beartrap" icon_state = "beartrap0" randpixel = 0 @@ -17,6 +17,10 @@ var/time_to_escape = 60 var/activated_armor_penetration = 0 +/obj/item/trap/Initialize() + . = ..() + update_icon() + /obj/item/trap/proc/can_use(mob/user) return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained()) @@ -62,34 +66,22 @@ anchored = FALSE /obj/item/trap/attack_hand(mob/user) - if(buckled && can_use(user)) - user.visible_message( - SPAN_NOTICE("\The [user] begins freeing \the [buckled] from \the [src]..."), - SPAN_NOTICE("You carefully begin to free \the [buckled] from \the [src]...") - ) - if(do_after(user, time_to_escape)) - user.visible_message( - SPAN_NOTICE("\The user frees \the [buckled] from \the [src]."), - SPAN_NOTICE("You free \the [buckled] from \the [src].") - ) - unbuckle() - anchored = FALSE - else if(deployed && can_use(user)) - user.visible_message( - SPAN_NOTICE("\The [user] starts to disarm \the [src]..."), - SPAN_NOTICE("You begin disarming \the [src]..."), - SPAN_WARNING("You hear a latch click followed by the slow creaking of a spring.") - ) - if(do_after(user, 6 SECONDS)) - user.visible_message( - SPAN_NOTICE("\The [user] disarms \the [src]!"), - SPAN_NOTICE("You disarm \the [src]!") - ) - deployed = FALSE - anchored = FALSE - update_icon() - else - ..() + if(can_use(user)) + if(buckled) + user_unbuckle(user) + return + else if(deployed) + disarm_trap(user) + return + ..() + +/obj/item/trap/proc/disarm_trap(var/mob/user) + user.visible_message(SPAN_NOTICE("\The [user] starts to disarm \the [src]..."), SPAN_NOTICE("You begin disarming \the [src]..."), SPAN_WARNING("You hear a latch click followed by the slow creaking of a spring.")) + if(do_after(user, 6 SECONDS)) + user.visible_message(SPAN_NOTICE("\The [user] disarms \the [src]!"), SPAN_NOTICE("You disarm \the [src]!")) + deployed = FALSE + anchored = FALSE + update_icon() /obj/item/trap/proc/attack_mob(mob/living/L) var/target_zone @@ -102,6 +94,8 @@ if(!success) return FALSE + L.visible_message(SPAN_DANGER("\The [L] steps on \the [src]!"), FONT_LARGE(SPAN_DANGER("You step on \the [src]!")), SPAN_WARNING("You hear a loud metallic snap!")) + var/did_trap = TRUE if(ishuman(L)) var/mob/living/carbon/human/H = L @@ -124,6 +118,10 @@ bear.anger += 15//traps make bears really angry bear.instant_aggro() + if(!buckled) + anchored = FALSE + deployed = FALSE + /obj/item/trap/Crossed(atom/movable/AM) if(ishuman(AM)) var/mob/living/carbon/human/H = AM @@ -131,15 +129,7 @@ return if(deployed && isliving(AM)) var/mob/living/L = AM - L.visible_message( - SPAN_DANGER("\The [L] steps on \the [src]!"), - FONT_LARGE(SPAN_DANGER("You step on \the [src]!")), - SPAN_WARNING("You hear a loud metallic snap!") - ) attack_mob(L) - if(!buckled) - anchored = FALSE - deployed = FALSE update_icon() shake_animation() @@ -153,13 +143,9 @@ /obj/item/trap/animal name = "small trap" - throw_speed = 2 - throw_range = 1 - gender = PLURAL - icon = 'icons/obj/items.dmi' + desc = "A small mechanical trap that's used to catch small animals like rats, lizards, and chicks." icon_base = "small" icon_state = "small0" - desc = "A small mechanical trap that's used to catch small animals like rats, lizards, and chicks." throwforce = 2 force = 1 w_class = ITEMSIZE_SMALL @@ -190,7 +176,6 @@ to_chat(user, "\The [src] is already full!") /obj/item/trap/animal/update_icon() - icon = initial(icon) icon_state = "[icon_base][deployed]" /obj/item/trap/animal/examine(mob/user) @@ -629,8 +614,8 @@ /obj/item/large_trap_foundation name = "large trap foundation" desc = "A metal foundation for large trap, it is missing metals rods to hold the prey." + icon = 'icons/obj/contained_items/weapons/traps.dmi' icon_state = "large_foundation" - icon = 'icons/obj/items.dmi' throwforce = 4 force = 5 w_class = ITEMSIZE_HUGE @@ -656,3 +641,52 @@ return else ..() + + +/obj/item/trap/tripwire + name = "tripwire trap" + desc = "A piece of cable coil strung between two metal rods. Low-tech, but reliable." + icon_base = "tripwire" + color = COLOR_RED + layer = UNDERDOOR // so you can't cover it with items + +/obj/item/trap/tripwire/Initialize(mapload, var/new_cable_color) + . = ..() + if(!new_cable_color) + new_cable_color = COLOR_RED + color = new_cable_color + +/obj/item/trap/tripwire/update_icon() + underlays = null + icon_state = "[icon_base][deployed]" + var/image/I = image(icon, null, "[icon_state]_base") + I.appearance_flags = RESET_COLOR + underlays = list(I) + +/obj/item/trap/tripwire/deploy(mob/user) + user.visible_message(SPAN_WARNING("\The [user] starts to deploy \the [src]."), SPAN_WARNING("You begin deploying \the [src]!")) + if(do_after(user, 5 SECONDS)) + user.visible_message(SPAN_WARNING("\The [user] deploys \the [src]."), SPAN_WARNING("You deploy \the [src]!")) + deployed = TRUE + update_icon() + return TRUE + return FALSE + +/obj/item/trap/tripwire/disarm_trap(var/mob/user) + user.visible_message(SPAN_NOTICE("\The [user] starts to take \the [src] down..."), SPAN_NOTICE("You begin taking \the [src] down..."), SPAN_WARNING("You hear a latch click followed by the slow creaking of a spring.")) + if(do_after(user, 6 SECONDS)) + deployed = FALSE + anchored = FALSE + update_icon() + +/obj/item/trap/tripwire/attack_mob(mob/living/L) + if(!ishuman(L)) + return + + var/mob/living/carbon/human/H = L + if(!H.organs_by_name[BP_L_LEG] && !H.organs_by_name[BP_R_LEG]) // tripwires are triggered by shin, so if you don't have legs, assume you fly or crawl + return + + if(!L.lying && (L.m_intent == M_RUN) || prob(5)) + L.visible_message(SPAN_DANGER("\The [L] trips over \the [src]!"), FONT_LARGE(SPAN_DANGER("You trip over \the [src]!"))) + L.Weaken(3) \ No newline at end of file diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 52c922a963f..90907738d6c 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -228,6 +228,7 @@ set_dir(turn(dir, 90)) update_icon() + return TRUE /obj/AltClick(var/mob/user) if(obj_flags & OBJ_FLAG_ROTATABLE) @@ -242,6 +243,8 @@ . = ..() if((obj_flags & OBJ_FLAG_ROTATABLE) || (obj_flags & OBJ_FLAG_ROTATABLE_ANCHORED)) to_chat(user, SPAN_SUBTLE("Can be rotated with alt-click.")) + if(contaminated) + to_chat(user, SPAN_ALIEN("\The [src] has been contaminated with phoron!")) // whether mobs can unequip and drop items into us or not /obj/proc/can_hold_dropped_items() diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 0d65db0ab38..3973cdea8b7 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -128,7 +128,7 @@ /obj/item/stack/packageWrap = 1, /obj/random/bomb_supply = 2, /obj/item/extinguisher = 1, - /obj/item/clothing/gloves/fyellow = 1, + /obj/item/clothing/gloves/yellow/budget = 1, /obj/item/stack/cable_coil = 3, /obj/random/toolbox = 2, /obj/item/storage/belt/utility = 2, @@ -409,6 +409,7 @@ /obj/item/storage/belt/utility = 1, /obj/item/storage/belt/medical = 0.4, /obj/item/storage/belt/medical/first_responder = 0.4, + /obj/item/storage/belt/medical/first_responder/combat = 0.1, /obj/item/storage/belt/security/tactical = 0.1, /obj/item/storage/belt/military = 0.1, /obj/item/storage/belt/janitor = 0.4 @@ -422,7 +423,6 @@ /obj/item/storage/backpack = 3, /obj/item/storage/backpack/holding = 0.5, /obj/item/storage/backpack/cultpack = 2, - /obj/item/storage/backpack/clown = 2, /obj/item/storage/backpack/medic = 3, /obj/item/storage/backpack/security = 3, /obj/item/storage/backpack/captain = 2, @@ -578,7 +578,6 @@ /obj/machinery/vending/security = 0.3, /obj/machinery/vending/hydronutrients = 1, /obj/machinery/vending/hydroseeds = 1, - /obj/machinery/vending/magivend = 0.5, //The things it dispenses are just costumes to non-wizards /obj/machinery/vending/dinnerware = 1, /obj/machinery/vending/sovietsoda = 2, /obj/machinery/vending/tool = 1, @@ -781,7 +780,6 @@ icon = 'icons/obj/items.dmi' icon_state = "gift3" problist = list( - /obj/item/assembly/shock_kit = 0.1, /obj/item/bluespace_crystal/artificial = 0.1, /obj/item/bodybag = 0.7, /obj/item/clothing/accessory/storage/knifeharness = 0.3, @@ -805,7 +803,6 @@ /obj/item/clothing/mask/balaclava = 0.75, /obj/item/clothing/mask/fakemoustache = 0.4, /obj/item/clothing/mask/gas = 1.25, - /obj/item/clothing/mask/gas/clown_hat = 0.1, /obj/item/clothing/mask/gas/cyborg = 0.7, /obj/item/clothing/mask/gas/mime = 0.1, /obj/item/clothing/mask/gas/old = 0.75, @@ -820,7 +817,6 @@ /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba = 0.7, /obj/item/clothing/mask/smokable/pipe/cobpipe = 0.5, /obj/item/clothing/shoes/carp = 0.5, - /obj/item/clothing/shoes/clown_shoes = 0.1, /obj/item/clothing/shoes/combat = 0.2, /obj/item/clothing/shoes/cyborg = 0.4, /obj/item/clothing/shoes/galoshes = 0.6, @@ -838,7 +834,6 @@ /obj/item/clothing/under/mime = 0.1, /obj/item/clothing/under/overalls = 1, /obj/item/clothing/under/rainbow = 0.9, - /obj/item/clothing/under/rank/clown = 0.1, /obj/item/clothing/under/syndicate/tacticool = 0.4, /obj/item/clothing/under/syndicate/tracksuit = 0.2, /obj/item/device/firing_pin = 0.3, @@ -946,7 +941,8 @@ /obj/random/tool = 1, /obj/random/toolbox = 1, /obj/random_produce = 0.25, - /obj/random/watches = 1 + /obj/random/watches = 1, + /obj/random/wizard_dressup = 0.25 ) @@ -998,7 +994,7 @@ /obj/item/clothing/gloves/boxing/green = 0.3, /obj/item/clothing/gloves/captain = 0.1, /obj/item/clothing/gloves/combat = 0.2, - /obj/item/clothing/gloves/fyellow = 1.2, + /obj/item/clothing/gloves/yellow/budget = 1.2, /obj/item/clothing/gloves/latex = 0.5, /obj/item/clothing/gloves/latex/nitrile = 0.4, /obj/item/clothing/gloves/yellow = 0.9 @@ -1254,7 +1250,6 @@ /obj/item/grenade/fake = 1, /obj/item/bikehorn = 11, /obj/item/clothing/mask/fakemoustache = 11, - /obj/item/clothing/mask/gas/clown_hat = 11, /obj/item/clothing/mask/gas/mime = 11, /obj/item/clothing/shoes/carp = 9, /obj/item/gun/energy/wand/toy = 5, @@ -1601,6 +1596,7 @@ /obj/item/gun/energy/xray = 1, /obj/item/gun/energy/lasercannon = 1, /obj/item/gun/projectile/automatic/rifle/sts35 = 1, + /obj/item/gun/projectile/automatic/rifle/carbine = 1, /obj/item/gun/projectile/automatic/x9 = 1, /obj/item/gun/projectile/deagle = 1, /obj/item/gun/projectile/deagle/adhomai = 1, @@ -1779,4 +1775,19 @@ /obj/item/seeds/peanutseed, /obj/item/seeds/soyaseed, /obj/item/seeds/cabbageseed - ) \ No newline at end of file + ) + +/obj/random/wizard_dressup + name = "random wizard clothes" + desc = "This is a random piece of fake wizard clothing." + icon = 'icons/obj/wizard.dmi' + icon_state = "staff" + has_postspawn = TRUE + +/obj/random/wizard_dressup/spawn_item() + var/obj/item/clothing/suit/wizrobe/W = pick(typesof(/obj/item/clothing/suit/wizrobe)) + . = new W(loc) + +/obj/random/wizard_dressup/post_spawn(obj/thing) + var/obj/item/clothing/head/wizard/H = pick(typesof(/obj/item/clothing/head/wizard)) + new H(loc) diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index 86dc703e9d3..d3368bd443c 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -5,7 +5,7 @@ icon_state = "coatrack0" var/obj/item/clothing/suit/coat var/list/allowed = list(/obj/item/clothing/suit/storage/toggle/labcoat, /obj/item/clothing/suit/storage/toggle/det_trench, - /obj/item/clothing/suit/storage/forensics, /obj/item/clothing/suit/storage/toggle/trench) + /obj/item/clothing/suit/storage/toggle/forensics, /obj/item/clothing/suit/storage/toggle/trench) /obj/structure/coatrack/attack_hand(mob/user as mob) if (!ishuman(user)) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 9258989753d..bda8a86b4c7 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -157,8 +157,8 @@ return var/did_teleport = FALSE for(var/mob/M in contents) - did_teleport = TRUE - linked_teleporter.do_teleport(M) + if(linked_teleporter.do_teleport(M)) + did_teleport = TRUE if(did_teleport) linked_teleporter.last_use = world.time diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 401d01487a8..2f0e2c49aba 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -19,7 +19,7 @@ new /obj/item/clothing/head/softcap/cargo(src) new /obj/item/clothing/head/bandana/cargo(src) new /obj/item/clothing/head/beret/cargo(src) - new /obj/item/modular_computer/handheld/custom_loadout/advanced/cargo_delivery(src) + new /obj/item/modular_computer/handheld/preset/supply/cargo_delivery(src) new /obj/item/export_scanner(src) /obj/structure/closet/secure_closet/quartermaster @@ -38,16 +38,17 @@ new /obj/item/device/radio/headset/qm(src) new /obj/item/device/radio/headset/qm/alt(src) new /obj/item/clothing/gloves/black(src) - new /obj/item/clothing/suit/fire/firefighter(src) + new /obj/item/clothing/suit/fire(src) new /obj/item/tank/emergency_oxygen(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/head/softcap/cargo(src) new /obj/item/clothing/head/bandana/cargo(src) new /obj/item/clothing/head/beret/cargo(src) - new /obj/item/modular_computer/handheld/custom_loadout/advanced/cargo_delivery(src) + new /obj/item/modular_computer/handheld/preset/supply/cargo_delivery(src) new /obj/item/export_scanner(src) new /obj/item/device/orbital_dropper/drill(src) new /obj/item/device/megaphone/cargo(src) + new /obj/item/storage/box/goldstar(src) /obj/structure/closet/secure_closet/merchant name = "merchant locker" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index f417066ffed..04e7c96a1d0 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -13,10 +13,7 @@ new /obj/item/storage/backpack/industrial(src) else new /obj/item/storage/backpack/satchel_eng(src) - if (prob(70)) - new /obj/item/clothing/accessory/storage/brown_vest(src) - else - new /obj/item/clothing/accessory/storage/webbing(src) + new /obj/item/clothing/accessory/storage/brown_vest(src) new /obj/item/blueprints(src) new /obj/item/clothing/under/rank/chief_engineer(src) new /obj/item/clothing/head/hardhat/white(src) @@ -29,7 +26,7 @@ new /obj/item/device/radio/headset/heads/ce/alt(src) new /obj/item/device/megaphone/engi(src) new /obj/item/storage/toolbox/mechanical(src) - new /obj/item/clothing/suit/storage/hazardvest(src) + new /obj/item/clothing/suit/storage/hazardvest/ce(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/mask/gas/half(src) new /obj/item/device/multitool(src) @@ -121,10 +118,7 @@ new /obj/item/storage/backpack/industrial(src) else new /obj/item/storage/backpack/satchel_eng(src) - if (prob(70)) - new /obj/item/clothing/accessory/storage/brown_vest(src) - else - new /obj/item/clothing/accessory/storage/webbing(src) + new /obj/item/clothing/accessory/storage/brown_vest(src) new /obj/item/storage/toolbox/mechanical(src) new /obj/item/device/radio/headset/headset_eng(src) new /obj/item/device/radio/headset/headset_eng/alt(src) @@ -149,10 +143,7 @@ new /obj/item/storage/backpack/industrial(src) else new /obj/item/storage/backpack/satchel_eng(src) - if (prob(70)) - new /obj/item/clothing/accessory/storage/brown_vest(src) - else - new /obj/item/clothing/accessory/storage/webbing(src) + new /obj/item/clothing/accessory/storage/brown_vest(src) new /obj/item/clothing/suit/fire/atmos(src) new /obj/item/clothing/head/hardhat/red/atmos(src) new /obj/item/device/flashlight(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index a447e5fe03f..f137596b0a5 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -107,6 +107,7 @@ new /obj/item/clothing/head/hardhat/first_responder(src) new /obj/item/device/radio/headset/headset_med(src) new /obj/item/clothing/glasses/hud/health(src) + new /obj/item/storage/backpack/medic/first_responder(src) new /obj/item/clothing/suit/storage/medical_chest_rig(src) new /obj/item/clothing/suit/storage/medical_chest_rig/first_responder(src) new /obj/item/clothing/under/rank/medical/first_responder(src) @@ -122,6 +123,7 @@ new /obj/item/crowbar/red(src) new /obj/item/clothing/mask/gas/alt(src) new /obj/item/clothing/mask/gas/half(src) + new /obj/item/auto_cpr(src) /obj/structure/closet/secure_closet/CMO name = "chief medical officer's locker" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index b4c7b16f925..2c6b36784b0 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -16,7 +16,7 @@ new /obj/item/device/radio/headset/headset_sci/alt(src) new /obj/item/tank/air(src) new /obj/item/clothing/mask/gas(src) - + new /obj/item/taperoll/science(src) /obj/structure/closet/secure_closet/RD name = "research director's locker" @@ -47,6 +47,7 @@ new /obj/item/device/pin_extractor(src) new /obj/item/storage/box/fancy/keypouch/sci(src) new /obj/item/storage/box/tethers(src) + new /obj/item/taperoll/science(src) /obj/structure/closet/secure_closet/RD2 name = "research director's attire" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 9e823c59d85..b9ec3830e90 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -69,15 +69,19 @@ ..() //Supply new /obj/item/storage/box/ids(src) - new /obj/item/storage/box/ids( src ) + new /obj/item/storage/box/ids(src) + new /obj/item/storage/box/fancy/keypouch/cargo(src) + new /obj/item/storage/box/fancy/keypouch/service(src) //Appearance new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/clothing/suit/armor/carrier/generic(src) new /obj/item/clothing/head/helmet(src) + new /obj/item/clothing/accessory/holster/waist(src) //Tools new /obj/item/device/radio/headset/heads/hop(src) new /obj/item/device/radio/headset/heads/hop/alt(src) new /obj/item/device/megaphone/command(src) + new /obj/item/storage/box/goldstar(src) new /obj/item/gun/energy/disruptorpistol(src) new /obj/item/gun/projectile/sec/flash(src) new /obj/item/device/flash(src) @@ -127,14 +131,9 @@ new /obj/item/clothing/suit/armor/carrier/hos(src) new /obj/item/clothing/accessory/leg_guard(src) new /obj/item/clothing/accessory/arm_guard(src) - if(prob(50)) - new /obj/item/clothing/under/rank/head_of_security(src) - new /obj/item/clothing/head/beret/security/hos(src) - new /obj/item/clothing/head/hos(src) - else - new /obj/item/clothing/under/rank/head_of_security/corp(src) - new /obj/item/clothing/head/beret/security/hos/corp(src) - new /obj/item/clothing/head/hos/corp(src) + new /obj/item/clothing/under/rank/head_of_security/corp(src) + new /obj/item/clothing/head/beret/security/hos/corp(src) + new /obj/item/clothing/head/hos/corp(src) new /obj/item/clothing/head/helmet/hos(src) new /obj/item/clothing/suit/storage/security/hos(src) new /obj/item/clothing/accessory/badge/hos(src) @@ -181,14 +180,9 @@ new /obj/item/clothing/suit/armor/carrier/hos(src) new /obj/item/clothing/accessory/leg_guard(src) new /obj/item/clothing/accessory/arm_guard(src) - if(prob(50)) // chance to spawn either corporate or regular outfit. to prevent locker bloat which makes it lag when right clicked - new /obj/item/clothing/under/rank/head_of_security(src) - new /obj/item/clothing/head/beret/security/hos(src) - new /obj/item/clothing/head/hos(src) - else - new /obj/item/clothing/under/rank/head_of_security/corp(src) - new /obj/item/clothing/head/beret/security/corp(src) - new /obj/item/clothing/head/hos/corp(src) + new /obj/item/clothing/under/rank/head_of_security/corp(src) + new /obj/item/clothing/head/beret/security/corp(src) + new /obj/item/clothing/head/hos/corp(src) new /obj/item/clothing/head/helmet/hos(src) new /obj/item/clothing/suit/storage/security/hos(src) //Tools @@ -224,17 +218,9 @@ new /obj/item/clothing/suit/armor/carrier/officer(src) new /obj/item/clothing/accessory/arm_guard(src) new /obj/item/clothing/accessory/leg_guard(src) - if(prob(50)) - if(prob(50)) - new /obj/item/clothing/under/rank/warden(src) - else - new /obj/item/clothing/under/rank/warden/blue(src) - new /obj/item/clothing/head/beret/security/warden(src) - new /obj/item/clothing/head/warden(src) - else - new /obj/item/clothing/under/rank/warden/corp(src) - new /obj/item/clothing/head/beret/security/corp(src) - new /obj/item/clothing/head/warden/corp(src) + new /obj/item/clothing/under/rank/warden/corp(src) + new /obj/item/clothing/head/beret/security/corp(src) + new /obj/item/clothing/head/warden/corp(src) new /obj/item/clothing/head/helmet/security(src) new /obj/item/clothing/suit/storage/security/warden(src) new /obj/item/clothing/accessory/badge/warden(src) @@ -249,10 +235,8 @@ new /obj/item/melee/baton/loaded(src) new /obj/item/gun/energy/disruptorpistol(src) //Belts - if (prob(50)) - new /obj/item/clothing/accessory/storage/black_vest(src) - else - new /obj/item/clothing/accessory/storage/pouches/black(src) + new /obj/item/clothing/accessory/storage/black_vest(src) + new /obj/item/clothing/accessory/holster/waist(src) new /obj/item/storage/belt/security(src) @@ -286,10 +270,7 @@ new /obj/item/device/holowarrant(src) new /obj/item/device/flashlight/flare/glowstick/red(src) //Belts - if (prob(50)) - new /obj/item/clothing/accessory/storage/black_vest(src) - else - new /obj/item/clothing/accessory/storage/pouches/black(src) + new /obj/item/clothing/accessory/storage/black_vest(src) new /obj/item/storage/belt/security(src) /obj/structure/closet/secure_closet/security @@ -311,17 +292,9 @@ new /obj/item/clothing/suit/armor/carrier/officer(src) new /obj/item/clothing/accessory/arm_guard(src) new /obj/item/clothing/accessory/leg_guard(src) - if(prob(50)) - if(prob(50)) - new /obj/item/clothing/under/rank/security(src) - else - new /obj/item/clothing/under/rank/security/blue(src) - new /obj/item/clothing/head/beret/security/officer(src) - new /obj/item/clothing/head/softcap/security(src) - else - new /obj/item/clothing/under/rank/security/corp(src) - new /obj/item/clothing/head/beret/security/corp(src) - new /obj/item/clothing/head/softcap/security/corp(src) + new /obj/item/clothing/under/rank/security/corp(src) + new /obj/item/clothing/head/beret/security/corp(src) + new /obj/item/clothing/head/softcap/security/corp(src) new /obj/item/clothing/head/helmet/security(src) new /obj/item/clothing/suit/storage/security/officer(src) new /obj/item/clothing/accessory/badge/officer(src) @@ -342,10 +315,7 @@ new /obj/item/device/flashlight/flare/glowstick/red(src) new /obj/item/handcuffs(src) //Belts - if (prob(50)) - new /obj/item/clothing/accessory/storage/black_vest(src) - else - new /obj/item/clothing/accessory/storage/pouches/black(src) + new /obj/item/clothing/accessory/storage/black_vest(src) new /obj/item/clothing/accessory/holster/hip(src) new /obj/item/storage/belt/security(src) @@ -382,14 +352,15 @@ /obj/structure/closet/secure_closet/investigator/fill() //Appearance + new /obj/item/storage/backpack/satchel/leather(src) new /obj/item/clothing/suit/storage/det_jacket(src) new /obj/item/clothing/under/det(src) new /obj/item/clothing/suit/storage/toggle/labcoat(src) new /obj/item/clothing/under/det/black(src) new /obj/item/clothing/under/det/classic(src) - new /obj/item/clothing/accessory/badge/dia(src) + new /obj/item/clothing/accessory/badge/investigator(src) new /obj/item/clothing/suit/storage/toggle/forensics(src) - new /obj/item/clothing/gloves/black(src) + new /obj/item/clothing/gloves/black/forensic(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/laceup(src) //Tools @@ -400,8 +371,11 @@ new /obj/item/taperoll/police(src) new /obj/item/device/flash(src) new /obj/item/device/laser_pointer/blue(src) + new /obj/item/device/camera/detective(src) + new /obj/item/device/camera_film(src) //Belts new /obj/item/clothing/accessory/holster/waist(src) + new /obj/item/clothing/accessory/storage/pouches/black(src) /obj/structure/closet/secure_closet/injection name = "lethal injections locker" diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 3b9f1c6f209..4bb2301cc6f 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -55,9 +55,7 @@ new /obj/item/clothing/suit/space/emergency(src) new /obj/item/clothing/head/helmet/space/emergency(src) new /obj/item/device/oxycandle(src) - new /obj/item/inflatable/door(src) - new /obj/item/inflatable/wall(src) - new /obj/item/inflatable/wall(src) + new /obj/item/storage/bag/inflatable/emergency(src) if ("all") new /obj/item/storage/toolbox/emergency(src) new /obj/item/tank/emergency_oxygen/engi(src) @@ -74,9 +72,7 @@ new /obj/item/device/oxycandle(src) new /obj/item/airbubble(src) new /obj/item/airbubble(src) - new /obj/item/inflatable/door(src) - new /obj/item/inflatable/wall(src) - new /obj/item/inflatable/wall(src) + new /obj/item/storage/bag/inflatable/emergency(src) /obj/structure/closet/emcloset/legacy/fill() ..() @@ -94,19 +90,19 @@ icon_opened = "fireclosetopen" /obj/structure/closet/firecloset/fill() - new /obj/item/clothing/suit/fire/firefighter(src) + new /obj/item/clothing/head/hardhat/firefighter(src) + new /obj/item/clothing/suit/fire(src) new /obj/item/clothing/mask/gas(src) new /obj/item/tank/oxygen/red(src) new /obj/item/extinguisher(src) - new /obj/item/clothing/head/hardhat/red(src) /obj/structure/closet/firecloset/full/fill() - new /obj/item/clothing/suit/fire/firefighter(src) + new /obj/item/clothing/head/hardhat/firefighter(src) + new /obj/item/clothing/suit/fire(src) new /obj/item/clothing/mask/gas(src) new /obj/item/device/flashlight(src) new /obj/item/tank/oxygen/red(src) new /obj/item/extinguisher(src) - new /obj/item/clothing/head/hardhat/red(src) @@ -167,12 +163,12 @@ icon_closed = "radsuitcloset" /obj/structure/closet/radiation/fill() - new /obj/item/clothing/suit/radiation(src) - new /obj/item/clothing/head/radiation(src) - new /obj/item/clothing/glasses/safety/goggles(src) - new /obj/item/clothing/suit/radiation(src) - new /obj/item/clothing/head/radiation(src) - new /obj/item/clothing/glasses/safety/goggles(src) + for(var/i = 1 to 2) + new /obj/item/clothing/head/radiation(src) + new /obj/item/clothing/suit/radiation(src) + new /obj/item/clothing/glasses/safety/goggles(src) + for(var/i = 1 to 2) + new /obj/item/reagent_containers/hypospray/autoinjector/hyronalin(src) /* * Bombsuit closet @@ -220,12 +216,12 @@ wall_mounted = 1 /obj/structure/closet/hydrant/fill() - new /obj/item/clothing/suit/fire/firefighter(src) + new /obj/item/clothing/head/hardhat/firefighter(src) + new /obj/item/clothing/suit/fire(src) new /obj/item/clothing/mask/gas(src) new /obj/item/device/flashlight(src) new /obj/item/tank/oxygen/red(src) new /obj/item/extinguisher(src) - new /obj/item/clothing/head/hardhat/red(src) if (prob(25)) new /obj/item/ladder_mobile(src) diff --git a/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm b/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm index 76ae7d28a3d..d1f5b269301 100644 --- a/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm +++ b/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm @@ -50,6 +50,8 @@ new /obj/item/gun/energy/retro(src) new /obj/item/gun/projectile/gauss(src) new /obj/item/gun/projectile/gauss(src) + new /obj/item/material/knife/bayonet(src) + new /obj/item/material/knife/bayonet(src) new /obj/item/ammo_magazine/gauss(src) new /obj/item/ammo_magazine/gauss(src) new /obj/item/ammo_magazine/gauss(src) @@ -63,6 +65,7 @@ new /obj/item/clothing/head/helmet/space/void/coalition(src) new /obj/item/clothing/suit/space/void/coalition(src) new /obj/item/gun/projectile/gauss(src) + new /obj/item/material/knife/bayonet(src) new /obj/item/ammo_magazine/gauss(src) new /obj/item/ammo_magazine/gauss(src) new /obj/item/ammo_magazine/gauss(src) @@ -197,7 +200,7 @@ /obj/structure/closet/crate/secure/gear_loadout/ram_ranch/fill() for(var/i in 1 to 6) var/obj/item/clothing/under/shorts/khaki/pants = new(src) - var/obj/item/clothing/accessory/dressshirt_r/shirt = new(src) + var/obj/item/clothing/accessory/dressshirt/rolled/shirt = new(src) var/obj/item/clothing/accessory/chaps/chaps = new(src) var/obj/item/clothing/accessory/suspenders/suspenders = new(src) var/obj/item/clothing/accessory/wcoat_rec/waistcoat = new(src) @@ -218,7 +221,7 @@ /obj/structure/closet/crate/secure/gear_loadout/ram_ranch/single/fill() var/obj/item/clothing/under/shorts/khaki/pants = new(src) - var/obj/item/clothing/accessory/dressshirt_r/shirt = new(src) + var/obj/item/clothing/accessory/dressshirt/rolled/shirt = new(src) var/obj/item/clothing/accessory/chaps/chaps = new(src) var/obj/item/clothing/accessory/suspenders/suspenders = new(src) var/obj/item/clothing/accessory/wcoat_rec/waistcoat = new(src) @@ -426,7 +429,7 @@ new /obj/item/ammo_magazine/plasma(src) new /obj/item/ammo_magazine/plasma(src) -/obj/structure/closet/crate/secure/gear_loadout/ninja/hacker/fill() +/obj/structure/closet/crate/secure/gear_loadout/ninja/hacker associated_hardsuit = /obj/item/rig/light/hacker/ninja /obj/structure/closet/crate/secure/gear_loadout/ninja/hacker/fill() diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 099f4a7f467..f5a1b7fe7ff 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -1,17 +1,20 @@ +#define STATE_CLOSED 0 +#define STATE_OPEN 1 + /obj/item/inflatable name = "inflatable" desc_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb." w_class = ITEMSIZE_SMALL - icon = 'icons/obj/inflatable.dmi' + icon = 'icons/obj/contained_items/tools/inflatables.dmi' var/deploy_path = null /obj/item/inflatable/attack_self(mob/user) if(!deploy_path) return - playsound(loc, 'sound/items/zip.ogg', 75, 1) - to_chat(user, "You inflate \the [src].") + playsound(loc, 'sound/items/zip.ogg', 75, TRUE) + to_chat(user, SPAN_NOTICE("You inflate \the [src].")) var/obj/structure/inflatable/R = new deploy_path(user.loc) - src.transfer_fingerprints_to(R) + transfer_fingerprints_to(R) R.add_fingerprint(user) qdel(src) @@ -21,7 +24,7 @@ icon_state = "folded_wall" deploy_path = /obj/structure/inflatable/wall -/obj/item/inflatable/door/ +/obj/item/inflatable/door name = "inflatable door" desc = "A folded membrane which rapidly expands into a simple door on activation." icon_state = "folded_door" @@ -31,40 +34,43 @@ name = "inflatable" desc = "An inflated membrane. Do not puncture." desc_info = "To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever." - density = 1 - anchored = 1 - opacity = 0 - icon = 'icons/obj/inflatable.dmi' + icon = 'icons/obj/contained_items/tools/inflatables.dmi' icon_state = "wall" + density = TRUE + anchored = TRUE atmos_canpass = CANPASS_DENSITY + var/deflating = FALSE var/undeploy_path = null + var/torn_path = null var/health = 50.0 /obj/structure/inflatable/wall name = "inflatable wall" undeploy_path = /obj/item/inflatable/wall + torn_path = /obj/item/inflatable/torn -/obj/structure/inflatable/New(location) - ..() - update_nearby_tiles(need_rebuild=1) +/obj/structure/inflatable/Initialize(mapload) + . = ..() + update_nearby_tiles(need_rebuild = TRUE) /obj/structure/inflatable/Destroy() update_nearby_tiles() return ..() /obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return 0 + return FALSE /obj/structure/inflatable/bullet_act(var/obj/item/projectile/Proj) var/proj_damage = Proj.get_structure_damage() - if(!proj_damage) return + if(!proj_damage) + return health -= proj_damage ..() if(health <= 0) - deflate(1) + deflate(TRUE) return /obj/structure/inflatable/ex_act(severity) @@ -73,54 +79,72 @@ qdel(src) return if(2.0) - deflate(1) + deflate(TRUE) return if(3.0) if(prob(50)) - deflate(1) + deflate(TRUE) return -/obj/structure/inflatable/attack_hand(mob/user as mob) +/obj/structure/inflatable/attack_hand(mob/user) add_fingerprint(user) return -/obj/structure/inflatable/attackby(obj/item/W as obj, mob/user as mob) - if(!istype(W) || istype(W, /obj/item/inflatable_dispenser)) return +/obj/structure/inflatable/attackby(obj/item/W, mob/user) + if(!istype(W) || istype(W, /obj/item/inflatable_dispenser)) + return + if(deflating) + return - if (can_puncture(W)) - visible_message("[user] pierces [src] with [W]!") - deflate(1) - if(W.damtype == BRUTE || W.damtype == BURN) + if(W.can_puncture()) + user.visible_message(SPAN_DANGER("[user] pierces \the [src] with \the [W]!"), SPAN_WARNING("You pierce \the [src] with \the [W]!")) + deflate(TRUE) + else if(W.damtype == BRUTE || W.damtype == BURN) hit(W.force) ..() - return -/obj/structure/inflatable/proc/hit(var/damage, var/sound_effect = 1) +/obj/structure/inflatable/proc/hit(var/damage, var/sound_effect = TRUE) health = max(0, health - damage) if(sound_effect) playsound(loc, 'sound/effects/glass_hit.ogg', 75, 1) if(health <= 0) - deflate(1) + deflate(TRUE) /obj/structure/inflatable/CtrlClick() hand_deflate() -/obj/structure/inflatable/proc/deflate(var/violent=0) - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) +/obj/structure/inflatable/proc/deflate(var/violent = FALSE) + if(deflating) + return + playsound(loc, 'sound/machines/hiss.ogg', 75, TRUE) if(violent) - visible_message("[src] rapidly deflates!") - var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc) - src.transfer_fingerprints_to(R) - qdel(src) + if(!torn_path) + return + deflating = TRUE + visible_message(SPAN_WARNING("\The [src] rapidly deflates!")) + var/matrix/M = new + M.Scale(0.6) + M.Turn(pick(-40, 40)) + animate(src, 0.2 SECONDS, transform = M) + addtimer(CALLBACK(src, .proc/post_tear), 0.2 SECONDS) else if(!undeploy_path) return - visible_message("\The [src] slowly deflates.") - addtimer(CALLBACK(src, .proc/post_deflate), 26) + deflating = TRUE + visible_message(SPAN_NOTICE("\The [src] slowly deflates.")) + var/matrix/M = new + M.Scale(0.6) + animate(src, 2.6 SECONDS, transform = M) + addtimer(CALLBACK(src, .proc/post_deflate), 2.6 SECONDS) /obj/structure/inflatable/proc/post_deflate() - var/obj/item/inflatable/R = new undeploy_path(src.loc) - src.transfer_fingerprints_to(R) + var/obj/item/inflatable/R = new undeploy_path(loc) + transfer_fingerprints_to(R) + qdel(src) + +/obj/structure/inflatable/proc/post_tear() + var/obj/item/inflatable/torn/R = new torn_path(loc) + transfer_fingerprints_to(R) qdel(src) /obj/structure/inflatable/verb/hand_deflate() @@ -138,11 +162,11 @@ health -= damage user.do_attack_animation(src) if(health <= 0) - user.visible_message("[user] [attack_verb] open the [src]!") - addtimer(CALLBACK(src, .proc/deflate, 1), 1) + user.visible_message(SPAN_DANGER("[user] [attack_verb] open the [src]!")) + INVOKE_ASYNC(src, .proc/deflate, TRUE) else - user.visible_message("[user] [attack_verb] at [src]!") - return 1 + user.visible_message(SPAN_DANGER("[user] [attack_verb] at [src]!")) + return TRUE /obj/structure/inflatable/door //Based on mineral door code name = "inflatable door" @@ -154,17 +178,18 @@ icon_state = "door_closed" undeploy_path = /obj/item/inflatable/door + torn_path = /obj/item/inflatable/door/torn - var/state = 0 //closed, 1 == open - var/isSwitchingStates = 0 + var/state = STATE_CLOSED + var/isSwitchingStates = FALSE -/obj/structure/inflatable/door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral +/obj/structure/inflatable/door/attack_ai(mob/user) if(isAI(user)) //so the AI can't open it return else if(isrobot(user) && Adjacent(user)) //but cyborgs can return TryToSwitchState(user) -/obj/structure/inflatable/door/attack_hand(mob/user as mob) +/obj/structure/inflatable/door/attack_hand(mob/user) return TryToSwitchState(user) /obj/structure/inflatable/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -174,17 +199,12 @@ return !opacity return !density -/obj/structure/inflatable/door/proc/TryToSwitchState(atom/user) - if(isSwitchingStates) return - if(ismob(user)) - var/mob/M = user - if(M.client) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(!C.handcuffed) - SwitchState() - else - SwitchState() +/obj/structure/inflatable/door/proc/TryToSwitchState(mob/user) + if(isSwitchingStates) + return + if(use_check_and_message(user)) + return + SwitchState() /obj/structure/inflatable/door/proc/SwitchState() if(state) @@ -195,29 +215,33 @@ /obj/structure/inflatable/door/proc/Open() set waitfor = FALSE + if(isSwitchingStates) return - isSwitchingStates = 1 + isSwitchingStates = TRUE + density = FALSE + state = STATE_OPEN flick("door_opening",src) - sleep(10) - density = 0 - opacity = 0 - state = 1 + addtimer(CALLBACK(src, .proc/ResetOpen), 1 SECOND) + +/obj/structure/inflatable/door/proc/ResetOpen() update_icon() - isSwitchingStates = 0 + isSwitchingStates = FALSE /obj/structure/inflatable/door/proc/Close() set waitfor = FALSE + if(isSwitchingStates) return - isSwitchingStates = 1 - flick("door_closing",src) - sleep(10) - density = 1 - opacity = 0 - state = 0 + isSwitchingStates = TRUE + flick("door_closing", src) + addtimer(CALLBACK(src, .proc/ResetClose), 1 SECOND) + +/obj/structure/inflatable/door/proc/ResetClose() + density = TRUE + state = STATE_CLOSED update_icon() - isSwitchingStates = 0 + isSwitchingStates = FALSE /obj/structure/inflatable/door/update_icon() if(state) @@ -225,52 +249,45 @@ else icon_state = "door_closed" -/obj/structure/inflatable/door/deflate(var/violent=0) - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) - if(violent) - visible_message("[src] rapidly deflates!") - var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc) - src.transfer_fingerprints_to(R) - qdel(src) - else - visible_message("[src] slowly deflates.") - addtimer(CALLBACK(src, .proc/post_deflate), 26) - /obj/item/inflatable/torn name = "torn inflatable wall" desc = "A folded membrane which rapidly expands into a large cubical shape on activation. It is too torn to be usable." - icon = 'icons/obj/inflatable.dmi' icon_state = "folded_wall_torn" - attack_self(mob/user) - to_chat(user, "The inflatable wall is too torn to be inflated!") - add_fingerprint(user) +/obj/item/inflatable/torn/attack_self(mob/user) + to_chat(user, SPAN_NOTICE("The inflatable wall is too torn to be inflated!")) + add_fingerprint(user) /obj/item/inflatable/door/torn name = "torn inflatable door" desc = "A folded membrane which rapidly expands into a simple door on activation. It is too torn to be usable." - icon = 'icons/obj/inflatable.dmi' icon_state = "folded_door_torn" - attack_self(mob/user) - to_chat(user, "The inflatable door is too torn to be inflated!") - add_fingerprint(user) +/obj/item/inflatable/door/torn/attack_self(mob/user) + to_chat(user, SPAN_NOTICE("The inflatable door is too torn to be inflated!")) + add_fingerprint(user) -/obj/item/storage/briefcase/inflatable +/obj/item/storage/bag/inflatable name = "inflatable barrier box" desc = "Contains inflatable walls and doors." + icon = 'icons/obj/contained_items/tools/inflatables.dmi' icon_state = "inf_box" - item_state = "box" + item_state = "inf_box" + contained_sprite = TRUE w_class = ITEMSIZE_NORMAL + display_contents_with_number = TRUE max_storage_space = 28 + force_column_number = 3 // we want 4 slots to appear, so 3 columns + 1 free (to insert stuff) + storage_slots = 14 can_hold = list(/obj/item/inflatable) + starts_with = list(/obj/item/inflatable/door = 5, /obj/item/inflatable/wall = 7) - New() - ..() - new /obj/item/inflatable/door(src) - new /obj/item/inflatable/door(src) - new /obj/item/inflatable/door(src) - new /obj/item/inflatable/wall(src) - new /obj/item/inflatable/wall(src) - new /obj/item/inflatable/wall(src) - new /obj/item/inflatable/wall(src) + use_sound = 'sound/items/storage/briefcase.ogg' + drop_sound = 'sound/items/drop/backpack.ogg' + pickup_sound = 'sound/items/pickup/backpack.ogg' + +/obj/item/storage/bag/inflatable/emergency + starts_with = list(/obj/item/inflatable/door = 2, /obj/item/inflatable/wall = 3) + +#undef STATE_CLOSED +#undef STATE_OPEN \ No newline at end of file diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 9bc9c4cb105..ed0cd070035 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -1,4 +1,3 @@ -//wip wip wup /obj/structure/mirror name = "mirror" desc = "A SalonPro Nano-Mirror(TM) brand mirror! The leading technology in hair salon products, utilizing nano-machinery to style your hair just right." @@ -8,6 +7,29 @@ anchored = 1 var/shattered = 0 + /// Visual object for handling the viscontents + var/datum/weakref/ref + vis_flags = VIS_HIDE + var/timerid = null + +/obj/structure/mirror/Initialize() + . = ..() + var/obj/effect/reflection/reflection = new(src.loc) + reflection.setup_visuals(src) + ref = WEAKREF(reflection) + + entered_event.register(loc, reflection, /obj/effect/reflection/proc/check_vampire_enter) + exited_event.register(loc, reflection, /obj/effect/reflection/proc/check_vampire_exit) + +/obj/structure/mirror/Destroy() + var/obj/effect/reflection/reflection = ref.resolve() + if(istype(reflection)) + entered_event.unregister(loc, reflection) + exited_event.unregister(loc, reflection) + qdel(reflection) + ref = null + return ..() + /obj/structure/mirror/attack_hand(mob/user as mob) if(shattered) return @@ -19,7 +41,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user - H.change_appearance(APPEARANCE_HAIR, H, FALSE, ui_state = default_state, state_object = src) + H.change_appearance(APPEARANCE_ALL_HAIR, H, FALSE, ui_state = default_state, state_object = src) /obj/structure/mirror/proc/shatter() if(shattered) return @@ -28,9 +50,13 @@ playsound(src, /decl/sound_category/glass_break_sound, 70, 1) desc = "Oh no, seven years of bad luck!" + var/obj/effect/reflection/reflection = ref.resolve() + if(istype(reflection)) + reflection.alpha_icon_state = "mirror_mask_broken" + reflection.update_mirror_filters() + /obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj) - if(prob(Proj.get_structure_damage() * 2)) if(!shattered) shatter() @@ -64,6 +90,84 @@ user.visible_message("[user] hits [src] and bounces off!") return 1 +/obj/effect/reflection + name = "reflection" + appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE + mouse_opacity = 0 + vis_flags = VIS_HIDE + layer = ABOVE_OBJ_LAYER + var/alpha_icon = 'icons/obj/watercloset.dmi' + var/alpha_icon_state = "mirror_mask" + var/obj/mirror + desc = "Why are you locked in the bathroom?" + anchored = TRUE + unacidable = TRUE + + var/blur_filter + +/obj/effect/reflection/proc/setup_visuals(target) + mirror = target + + if(mirror.pixel_x > 0) + dir = WEST + else if (mirror.pixel_x < 0) + dir = EAST + + if(mirror.pixel_y > 0) + dir = SOUTH + else if (mirror.pixel_y < 0) + dir = NORTH + + pixel_x = mirror.pixel_x + pixel_y = mirror.pixel_y + + blur_filter = filter(type="blur", size = 1) + + update_mirror_filters() + +/obj/effect/reflection/proc/update_mirror_filters() + filters = null + + vis_contents = null + + if(!mirror) + return + + var/matrix/M = matrix() + if(dir == WEST || dir == EAST) + M.Scale(-1, 1) + else if(dir == SOUTH|| dir == NORTH) + M.Scale(1, -1) + pixel_y = mirror.pixel_y + 5 + + transform = M + + filters += filter("type" = "alpha", "icon" = icon(alpha_icon, alpha_icon_state), "x" = 0, "y" = 0) + for(var/mob/living/carbon/human/H in loc) + check_vampire_enter(H.loc, H) + + vis_contents += get_turf(mirror) + +/obj/effect/reflection/proc/check_vampire_enter(var/turf/T, var/mob/living/carbon/human/H) + if(!istype(H)) + return + var/datum/vampire/V = H.get_antag_datum(MODE_VAMPIRE) + if(V) + if(V.status & VAMP_ISTHRALL) + filters += blur_filter + else + H.vis_flags |= VIS_HIDE + +/obj/effect/reflection/proc/check_vampire_exit(var/turf/T, var/mob/living/carbon/human/H) + if(!istype(H)) + return + var/datum/vampire/V = H.get_antag_datum(MODE_VAMPIRE) + if(V) + if(V.status & VAMP_ISTHRALL) + filters -= blur_filter + else + H.vis_flags &= ~VIS_HIDE + /obj/item/mirror name = "mirror" desc = "A SalonPro Nano-Mirror(TM) brand mirror! Now a portable version." diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 9f0148e8fe1..ea3818a5216 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -7,7 +7,7 @@ w_class = ITEMSIZE_NORMAL flags = OPENCONTAINER var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite - var/bucketsize = 360 //about 3x the size relative to a regular bucket. + var/bucketsize = 600 //about 2x the size relative to a regular bucket. /obj/structure/mopbucket/Initialize() . = ..() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 22c20d70d44..3ca06c9502c 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -540,7 +540,7 @@ desc = "The tajaran flag of the People's Republic of Adhomai." flag_path = "pra" desc_fluff = "Lead by President Njadrasanukii Hadii, the People's Republic of Adhomai are considered the 'loyalist' faction on Adhomai and enjoy galactic recognition as the \ - government of Adhomai. It claims to be the true keeper of Al'marii's legacy. However, the PRA can be described as a Hadiist branch of Al'marii's revolutionary ideology - that means \ + government of Adhomai. It claims to be the true keeper of Al'mari's legacy. However, the PRA can be described as a Hadiist branch of Al'mari's revolutionary ideology - that means \ putting the State at the top of a hierarchy of power. The PRA is a very centralized state, but in recent years has slowly been able to start making true its promises to bring \ revolution to the masses. With land reform, enfranchisement of women and peasantry, literacy initiatives, and the collectivization of farms and the means of production, the PRA is \ struggling to hold true to its radical ideals while an entrenched upper party stubbornly tries to hold onto power." @@ -554,7 +554,7 @@ desc = "The tajaran flag of the People's Republic of Adhomai." icon_state = "pra" desc_fluff = "Lead by President Njadrasanukii Hadii, the People's Republic of Adhomai are considered the 'loyalist' faction on Adhomai and enjoy galactic recognition as the \ - government of Adhomai. It claims to be the true keeper of Al'marii's legacy. However, the PRA can be described as a Hadiist branch of Al'marii's revolutionary ideology - that means \ + government of Adhomai. It claims to be the true keeper of Al'mari's legacy. However, the PRA can be described as a Hadiist branch of Al'mari's revolutionary ideology - that means \ putting the State at the top of a hierarchy of power. The PRA is a very centralized state, but in recent years has slowly been able to start making true its promises to bring \ revolution to the masses. With land reform, enfranchisement of women and peasantry, literacy initiatives, and the collectivization of farms and the means of production, the PRA is \ struggling to hold true to its radical ideals while an entrenched upper party stubbornly tries to hold onto power." diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 71bd14f20c6..017e2d27bc0 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -12,7 +12,7 @@ desc = "This is used to lie in, sleep in or strap on." desc_info = "Click and drag yourself (or anyone) to this to buckle in. Click on this with an empty hand to undo the buckles.
\ Anyone with restraints, such as handcuffs, will not be able to unbuckle themselves. They must use the Resist button, or verb, to break free of \ - the buckles, instead." + the buckles, instead. \ To unbuckle people as a stationbound, click the bed with an empty gripper." icon = 'icons/obj/furniture.dmi' icon_state = "bed" anchored = TRUE @@ -31,7 +31,7 @@ slowdown = 5 /obj/structure/bed/Initialize() - ..() + . = ..() LAZYADD(can_buckle, /mob/living) /obj/structure/bed/New(newloc, new_material = MATERIAL_STEEL, new_padding_material) @@ -228,6 +228,7 @@ var/base_state = "standard" var/item_bedpath = /obj/item/roller var/obj/item/reagent_containers/beaker + var/obj/item/vitals_monitor/vitals var/iv_attached = 0 var/iv_stand = TRUE var/patient_shift = 9 //How much are mobs moved up when they are buckled_to. @@ -238,8 +239,14 @@ ..() LAZYADD(can_buckle, /obj/structure/closet/body_bag) +/obj/structure/bed/roller/Destroy() + QDEL_NULL(beaker) + QDEL_NULL(vitals) + return ..() + /obj/structure/bed/roller/update_icon() - overlays.Cut() + cut_overlays() + vis_contents = list() if(density) icon_state = "[base_state]_up" else @@ -249,18 +256,31 @@ var/percentage = round((beaker.reagents.total_volume / beaker.volume) * 100, 25) var/image/filling = image(icon, "iv_filling[percentage]") filling.color = beaker.reagents.get_color() - iv.overlays += filling + iv.add_overlay(filling) if(percentage < 25) - iv.overlays += image(icon, "light_low") + iv.add_overlay(image(icon, "light_low")) if(density) iv.pixel_y = 6 - overlays += iv + add_overlay(iv) + if(vitals) + vitals.update_monitor() + vis_contents += vitals if(bag_strap && istype(buckled, /obj/structure/closet/body_bag)) LAZYADD(buckled.overlays, image(icon, bag_strap)) /obj/structure/bed/roller/attackby(obj/item/I, mob/user) if(iswrench(I) || istype(I, /obj/item/stack) || iswirecutter(I)) return 1 + if(istype(I, /obj/item/vitals_monitor)) + if(vitals) + to_chat(user, SPAN_WARNING("\The [src] already has a vitals monitor attached!")) + return + to_chat(user, SPAN_NOTICE("You attach \the [I] to \the [src].")) + user.drop_from_inventory(I, src) + vitals = I + vitals.bed = src + update_icon() + return if(iv_stand && !beaker && (istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/blood))) if(!user.unEquip(I, target = src)) return @@ -299,6 +319,14 @@ beaker = null update_icon() +/obj/structure/bed/roller/proc/remove_vitals(mob/user) + to_chat(user, SPAN_NOTICE("You detach \the [vitals] from \the [src].")) + vitals.bed = null + vitals.update_monitor() + user.put_in_hands(vitals) + vitals = null + update_icon() + /obj/structure/bed/roller/proc/attach_iv(mob/living/carbon/human/target, mob/user) if(!beaker) return @@ -318,7 +346,7 @@ ..() if(use_check(usr) || !Adjacent(usr)) return - if(!ishuman(usr)) + if(!ishuman(usr) && (!isrobot(usr) || isDrone(usr))) //Humans and borgs can collapse, but not drones return if(over_object == buckled && beaker) if(iv_attached) @@ -333,6 +361,9 @@ if(beaker) remove_beaker(usr) return + if(vitals) + remove_vitals(usr) + return if(buckled) return collapse() diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index c2d63f1f0bb..54407a7be6d 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -12,21 +12,6 @@ obj_flags = OBJ_FLAG_ROTATABLE_ANCHORED var/propelled = 0 // Check for fire-extinguisher-driven chairs -/obj/structure/bed/chair/attackby(obj/item/W as obj, mob/user as mob) - ..() - if(!padding_material && istype(W, /obj/item/assembly/shock_kit)) - var/obj/item/assembly/shock_kit/SK = W - if(!SK.status) - to_chat(user, "\The [SK] is not ready to be attached!") - return - var/obj/structure/bed/chair/e_chair/E = new (src.loc, material.name) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - E.set_dir(dir) - E.part = SK - user.drop_from_inventory(SK,E) - SK.master = E - qdel(src) - /obj/structure/bed/chair/do_simple_ranged_interaction(var/mob/user) if(!buckled && user) rotate(user) @@ -125,18 +110,54 @@ icon_state = "sofamiddle_preview" base_icon = "sofamiddle" +/obj/structure/bed/chair/comfy/sofa/leather/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_LEATHER) + +obj/structure/bed/chair/comfy/sofa/comfy/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_CARPET) + +obj/structure/bed/chair/comfy/sofa/cloth/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_CLOTH) + /obj/structure/bed/chair/comfy/sofa/left icon_state = "sofaend_left_preview" base_icon = "sofaend_left" +/obj/structure/bed/chair/comfy/sofa/left/leather/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_LEATHER) + +obj/structure/bed/chair/comfy/sofa/left/comfy/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_CARPET) + +obj/structure/bed/chair/comfy/sofa/left/cloth/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_CLOTH) + /obj/structure/bed/chair/comfy/sofa/right icon_state = "sofaend_right_preview" base_icon = "sofaend_right" +/obj/structure/bed/chair/comfy/sofa/right/leather/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_LEATHER) + +obj/structure/bed/chair/comfy/sofa/right/comfy/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_CARPET) + +obj/structure/bed/chair/comfy/sofa/right/cloth/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_CLOTH) + /obj/structure/bed/chair/comfy/sofa/corner icon_state = "sofacorner_preview" base_icon = "sofacorner" +/obj/structure/bed/chair/comfy/sofa/corner/leather/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_LEATHER) + +obj/structure/bed/chair/comfy/sofa/corner/comfy/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_CARPET) + +obj/structure/bed/chair/comfy/sofa/corner/cloth/New(var/newloc) + ..(newloc, MATERIAL_STEEL, MATERIAL_CLOTH) + /obj/structure/bed/chair/office name = "office chair" material_alteration = MATERIAL_ALTERATION_NAME || MATERIAL_ALTERATION_DESC diff --git a/code/game/objects/structures/therapy.dm b/code/game/objects/structures/therapy.dm index 90a3220cf0b..5b890f98596 100644 --- a/code/game/objects/structures/therapy.dm +++ b/code/game/objects/structures/therapy.dm @@ -1,78 +1,3 @@ -/obj/structure/bed/chair/e_chair - name = "electric chair" - desc = "Looks absolutely SHOCKING!" - icon_state = "echair0" - var/on = 0 - var/obj/item/assembly/shock_kit/part = null - var/last_time = 0 - -/obj/structure/bed/chair/e_chair/update_icon() - return - -/obj/structure/bed/chair/e_chair/Initialize() - . = ..() - add_overlay(image('icons/obj/furniture.dmi', src, "echair_over", MOB_LAYER + 1)) - if(!part) - part = new /obj/item/assembly/shock_kit(src) - part.master = src - part.part1 = new /obj/item/clothing/head/helmet(part) - part.part2 = new /obj/item/device/radio/electropack(part) - part.part1.master = part - part.part2.master = part - -/obj/structure/bed/chair/e_chair/Destroy() - if (part) - part.master = null - part = null - - . = ..() - -/obj/structure/bed/chair/e_chair/attackby(obj/item/W as obj, mob/user as mob) - if(W.iswrench()) - var/obj/structure/bed/chair/C = new /obj/structure/bed/chair(loc) - playsound(loc, W.usesound, 50, 1) - C.set_dir(dir) - part.forceMove(get_turf(src)) - part.master = null - part = null - qdel(src) - -/obj/structure/bed/chair/e_chair/verb/toggle() - set name = "Toggle Electric Chair" - set category = "Object" - set src in oview(1) - - if(usr.stat || usr.paralysis || usr.stunned || usr.weakened || usr.lying || usr.restrained() || usr.buckled_to) - return - - if(on) - on = 0 - icon_state = "echair0" - else - on = 1 - shock() - icon_state = "echair1" - to_chat(usr, "You switch [on ? "on" : "off"] [src].") - -/obj/structure/bed/chair/e_chair/proc/shock() - if(!on) - return - - var/obj/structure/cable/C = locate(/obj/structure/cable, get_turf(src)) - var/datum/powernet/PN = C.powernet - flick("echair1", src) - spark(src, 12, alldirs) - if(istype(buckled, /mob/living) && istype(C)) - var/mob/living/M = buckled - if(electrocute_mob(M, C, src, 1.25, BP_HEAD)) - to_chat(M, "You feel a deep shock course through your body!") - sleep(1) - if(electrocute_mob(M, C, src, 1.25, BP_HEAD)) - M.Stun(PN.get_electrocute_damage()*10) - visible_message("The electric chair goes off!", "You hear an electrical discharge!") - - return - /obj/item/pocketwatch name = "pocketwatch" desc = "A watch that goes in your pocket." @@ -169,12 +94,12 @@ var/thrall_response = alert(H, "Do you believe in hypnosis?", "Willpower", "Yes", "No") if(thrall_response == "No") H.sleeping = max(H.sleeping - 40, 0) - H.drowsyness = max(H.drowsyness - 60, 0) + H.drowsiness = max(H.drowsiness - 60, 0) thrall = null STOP_PROCESSING(SSfast_process, src) else H.sleeping = max(H.sleeping, 40) - H.drowsyness = max(H.drowsyness, 60) + H.drowsiness = max(H.drowsiness, 60) else STOP_PROCESSING(SSfast_process, src) @@ -233,7 +158,7 @@ H.visible_message("[H] falls into a deep slumber!", "You fall into a deep slumber!") H.sleeping = max(H.sleeping, 40) - H.drowsyness = max(H.drowsyness, 60) + H.drowsiness = max(H.drowsiness, 60) thrall = WEAKREF(H) START_PROCESSING(SSfast_process, src) @@ -580,7 +505,7 @@ var/obj/item/organ/internal/brain/sponge = H.internal_organs_by_name[BP_BRAIN] var/braindamage = H.getBrainLoss() if(sponge && istype(sponge)) - if(!sponge.lobotomized) + if(!sponge.prepared) to_chat(user, "Scans indicate [braindamage] distinct abnormalities present in subject.") return else diff --git a/code/game/objects/structures/trash_pile.dm b/code/game/objects/structures/trash_pile.dm index 8d2c27c6dc0..3fa8e57589f 100644 --- a/code/game/objects/structures/trash_pile.dm +++ b/code/game/objects/structures/trash_pile.dm @@ -151,7 +151,7 @@ /obj/item/storage/box/donkpockets = 3, /obj/item/storage/box/mousetraps = 3, /obj/item/storage/wallet = 3, - /obj/item/clothing/gloves/fyellow = 2, + /obj/item/clothing/gloves/yellow/budget = 2, /obj/item/clothing/gloves/latex = 2, /obj/item/clothing/head/welding = 2, /obj/item/clothing/mask/gas/alt = 2, diff --git a/code/game/sound.dm b/code/game/sound.dm index e77352430ae..10ef2f0e1bc 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -42,12 +42,12 @@ #define DROP_SOUND_VOLUME 20 #define THROW_SOUND_VOLUME 90 -/proc/playsound(atom/source, soundin, vol, vary, extrarange, falloff, is_global, usepressure = 1, environment = -1, required_preferences = 0, required_asfx_toggles = 0) +/proc/playsound(atom/source, soundin, vol, vary, extrarange, falloff, is_global, usepressure = 1, environment = -1, required_preferences = 0, required_asfx_toggles = 0, frequency = 0) if (isarea(source)) crash_with("[source] is an area and is trying to make the sound: [soundin]") return - var/sound/original_sound = playsound_get_sound(soundin, vol, falloff, 0, environment) + var/sound/original_sound = playsound_get_sound(soundin, vol, falloff, frequency, environment) if (!original_sound) crash_with("Could not construct original sound.") @@ -155,7 +155,7 @@ return PSYCHOTIC else if (druggy) return DRUGGED - else if (drowsyness) + else if (drowsiness) return DIZZY else if (confused) return DIZZY @@ -407,12 +407,6 @@ 'sound/weapons/punchmiss2.ogg' ) -/decl/sound_category/clown_sound - sounds = list( - 'sound/effects/clownstep1.ogg', - 'sound/effects/clownstep2.ogg' - ) - /decl/sound_category/swing_hit_sound sounds = list( 'sound/weapons/genhit1.ogg', @@ -420,6 +414,12 @@ 'sound/weapons/genhit3.ogg' ) +/decl/sound_category/flesh_burn_sound + sounds = list( + 'sound/effects/fleshburn1.ogg', + 'sound/effects/fleshburn2.ogg' + ) + /decl/sound_category/hiss_sound sounds = list( 'sound/voice/hiss1.ogg', @@ -676,4 +676,15 @@ 'sound/weapons/marauder.ogg', 'sound/weapons/laserdeep.ogg', 'sound/weapons/laserstrong.ogg' -) \ No newline at end of file +) + +/decl/sound_category/quick_arcade // quick punchy arcade sounds + sounds = list( + 'sound/arcade/get_fuel.ogg', + 'sound/arcade/heal.ogg', + 'sound/arcade/hit.ogg', + 'sound/arcade/kill_crew.ogg', + 'sound/arcade/lose_fuel.ogg', + 'sound/arcade/mana.ogg', + 'sound/arcade/steal.ogg' + ) \ No newline at end of file diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index 9db17f7131f..293518db7ff 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -315,6 +315,19 @@ flags = TURF_REMOVE_CROWBAR | TURF_CAN_BREAK build_type = /obj/item/stack/tile/diamond +/decl/flooring/marble + name = "light marble floor" + desc = "A robust floor made from marble." + icon = 'icons/turf/flooring/tiles.dmi' + icon_base = "lightmarble" + flags = TURF_REMOVE_CROWBAR + build_type = /obj/item/stack/tile/marble + +/decl/flooring/marble/dark + name = "dark marble floor" + icon_base = "darkmarble" + build_type = /obj/item/stack/tile/marble/dark + //Shuttle turfs /decl/flooring/shuttle diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index a520cc18cb9..c69fcb85da0 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -325,6 +325,17 @@ icon_state = "diamond" initial_flooring = /decl/flooring/diamond +/turf/simulated/floor/marble + name = "light marble floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "lightmarble" + initial_flooring = /decl/flooring/marble + +/turf/simulated/floor/marble/dark + name = "dark marble floor" + icon_state = "darkmarble" + initial_flooring = /decl/flooring/marble/dark + /turf/simulated/floor/vaurca name = "alien floor" icon = 'icons/turf/flooring/misc.dmi' diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index 2e1c20d2345..3ce72341ba8 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -3,7 +3,7 @@ if(!C || !user) return 0 - if(flooring && user.a_intent != I_HURT) + if(flooring && (!ismob(user) || user.a_intent != I_HURT)) if(C.iscrowbar()) if(broken || burnt) to_chat(user, "You remove the broken [flooring.descriptor].") diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 40eb1d1b033..b17157cbb1f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -26,6 +26,7 @@ var/footstep_sound = /decl/sound_category/tiles_footstep var/list/decals + var/list/blueprints var/is_hole // If true, turf will be treated as space or a hole var/tmp/turf/baseturf diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 035e2a94b33..0d6caf2e175 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -44,6 +44,7 @@ var/list/old_affecting_lights = affecting_lights var/old_lighting_overlay = lighting_overlay var/list/old_corners = corners + var/list/old_blueprints = blueprints changing_turf = TRUE @@ -101,6 +102,11 @@ if(!W.baseturf) W.baseturf = old_baseturf + W.blueprints = old_blueprints + for(var/image/I as anything in W.blueprints) + I.loc = W + I.plane = 0 + W.post_change() . = W diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index e08bd7da167..06fc0a0d30e 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -86,6 +86,9 @@ if(!(prefs.toggles & CHAT_LOOC)) to_chat(src, "You have LOOC muted.") return + if(mob.stat == DEAD && !(prefs.toggles & CHAT_GHOSTLOOC)) + to_chat(src, "You have observer LOOC muted.") + return if(!holder) if(!config.looc_allowed) @@ -138,6 +141,8 @@ var/admin_stuff for(var/client/target in clients) if(target.prefs.toggles & CHAT_LOOC) + if(mob.stat == DEAD && !(target.prefs.toggles & CHAT_GHOSTLOOC)) + continue admin_stuff = "" var/display_remote = 0 if (target.holder && ((R_MOD|R_ADMIN) & target.holder.rights)) diff --git a/code/global.dm b/code/global.dm index 2d7cd23401f..b69941762be 100644 --- a/code/global.dm +++ b/code/global.dm @@ -134,15 +134,14 @@ var/static/list/scarySounds = list( 'sound/items/welder.ogg', 'sound/items/welder_pry.ogg', 'sound/machines/airlock.ogg', - 'sound/effects/clownstep1.ogg', - 'sound/effects/clownstep2.ogg' + ) // Bomb cap! var/max_explosion_range = 14 // Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it. -var/global/obj/item/device/radio/intercom/global_announcer = new(null) +var/global/obj/item/device/radio/all_channels/global_announcer = new(null) // the number next to it denotes how much money the department receives when its account is generated var/list/department_funds = list( diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index dc24ecc611f..ebf044ea549 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1344,14 +1344,14 @@ proc/admin_notice(var/message, var/rights) if(check_rights(R_ADMIN|R_MOD, user)) if (target.paralysis == 0) msg = "has paralyzed [key_name_admin(target)]." - target.visible_message("OOC Information: [user] has been winded by a member of staff! Please freeze all roleplay involving their character until the matter is resolved! Adminhelp if you have further questions.", "You have been winded by a member of staff! Please stand by until they contact you!") + target.visible_message("OOC Information: [target] has been winded by a member of staff! Please freeze all roleplay involving their character until the matter is resolved! Adminhelp if you have further questions.", "You have been winded by a member of staff! Please stand by until they contact you!") target.paralysis = 8000 else if (alert(user, "The player is currently winded. Do you want to unwind him?", "Unwind player?", "Yes", "No") == "No") return target.paralysis = 0 msg = "has unparalyzed [key_name_admin(target)]." - target.visible_message("OOC Information: [user] has been unwinded by a member of staff!", "You have been unwinded by a member of staff!") + target.visible_message("OOC Information: [target] has been unwinded by a member of staff!", "You have been unwinded by a member of staff!") log_and_message_admins(msg, user) feedback_add_details("admin_verb", "WIND") diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index 1e8b45b29ce..a5b7556c5b0 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -30,7 +30,7 @@ proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, va attacker.attack_log += text("\[[time_stamp()]\] [key_name(victim)] - [attacker_message]") jmp_link = " (JMP)" - msg_admin_attack("[key_name_admin(attacker)] [admin_message] [key_name_admin(victim)] (INTENT: [attacker? uppertext(attacker.a_intent) : "N/A"])[jmp_link]",ckey=key_name(attacker),ckey_target=key_name(victim)) + msg_admin_attack("[attacker ? key_name_admin(attacker) : ""] [admin_message] [victim ? key_name_admin(victim) : ""] (INTENT: [attacker? uppertext(attacker.a_intent) : "N/A"])[jmp_link]",ckey=key_name(attacker),ckey_target=key_name(victim)) proc/admin_attacker_log_many_victims(var/mob/attacker, var/list/mob/victims, var/attacker_message, var/victim_message, var/admin_message) if(!victims || !victims.len) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 384949c3f91..0897af04ad7 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -78,7 +78,6 @@ var/list/admin_verbs_admin = list( /client/proc/response_team, // Response Teams admin verb, /client/proc/toggle_antagHUD_use, /client/proc/toggle_antagHUD_restrictions, - /client/proc/allow_character_respawn, // Allows a ghost to respawn , /client/proc/allow_stationbound_reset, /client/proc/end_round, /client/proc/event_manager_panel, @@ -100,7 +99,8 @@ var/list/admin_verbs_admin = list( /client/proc/fix_player_list, /client/proc/reset_openturf, /client/proc/toggle_aooc, - /client/proc/force_away_mission + /client/proc/force_away_mission, + /client/proc/alooc ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -421,7 +421,9 @@ var/list/admin_verbs_mod = list( /client/proc/print_logout_report, /client/proc/check_ai_laws, /*shows AI and borg laws*/ /client/proc/aooc, - /client/proc/toggle_aooc + /client/proc/toggle_aooc, + /client/proc/alooc, + /client/proc/allow_character_respawn ) var/list/admin_verbs_dev = list( //will need to be altered - Ryan784 @@ -1298,3 +1300,66 @@ var/list/admin_verbs_cciaa = list( log_and_message_admins("reset the forced away mission.") else log_and_message_admins("forced the following away mission: [mission_name].") + +/client/proc/alooc(msg as text) + set name = "Admin LOOC" + set desc = "Admin Local OOC, seen only by those in view, regardless of their LOOC preferences." + set category = "Admin" + + if(!check_rights(R_ADMIN|R_MOD)) + return + + if(!mob) + return + + msg = sanitize(msg) + msg = process_chat_markup(msg, list("*")) + if(!msg) + return + + log_ooc("(ADMIN LOCAL) [mob.name]/[key] : [msg]",ckey=key_name(mob)) + + var/mob/source = src.mob + var/list/messageturfs = list() //List of turfs we broadcast to. + var/list/messagemobs = list() //List of living mobs nearby who can hear it + + for(var/turf in range(world.view, get_turf(source))) + messageturfs += turf + if(isAI(source)) + var/mob/living/silicon/ai/AI = source + for(var/turf in range(world.view, get_turf(AI.eyeobj))) + messageturfs += turf + + for(var/mob/M in player_list) + if(!M.client || istype(M, /mob/abstract/new_player)) + continue + if(isAI(M)) + var/mob/living/silicon/ai/AI = M + if(get_turf(AI.eyeobj) in messageturfs) + messagemobs += M + continue + if(get_turf(M) in messageturfs) + messagemobs += M + + var/display_name = source.key + if(holder && holder.fakekey) + display_name = holder.fakekey + + msg = process_chat_markup(msg, list("*")) + + var/prefix + var/admin_stuff + for(var/client/target in clients) + admin_stuff = "" + var/display_remote = FALSE + if (target.holder && ((R_MOD|R_ADMIN) & target.holder.rights)) + display_remote = TRUE + if(display_remote) + prefix = "(R)" + admin_stuff += "/([source.key])" + if(target != source.client) + admin_stuff += "(JMP)" + if(target.mob in messagemobs) + prefix = "" + if((target.mob in messagemobs) || display_remote) + to_chat(target, "" + create_text_tag("ALOOC", target) + " [prefix][display_name][admin_stuff]: [msg]") diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index ef6c9be6feb..a6159b3d1b2 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -59,6 +59,7 @@ return //get message text, limit it's length.and clean/escape html + // only sanitize it if we're getting it from this proc if(!msg) msg = input(src,"Message:", "Private message to [key_name(C, 0, holder ? 1 : 0)]") as text|null @@ -71,8 +72,8 @@ to_chat(src, "Error: Private-Message: Client not found. They may have lost connection, so try using an adminhelp!") return - if(!check_rights(R_SERVER|R_DEBUG|R_DEV, 0)) - msg = sanitize(msg) + if(!check_rights(R_SERVER|R_DEBUG, 0)) + msg = sanitize(msg) if (handle_spam_prevention(msg, MUTE_ADMINHELP)) return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 633e69227a0..5f5558e2cdc 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -312,7 +312,9 @@ outfit_catagories["TCFL"] = typesof(/datum/outfit/admin/ert/legion) outfit_catagories["Syndicate"] = typesof(/datum/outfit/admin/deathsquad/syndicate) outfit_catagories["Freelance Mercenaries"] = typesof(/datum/outfit/admin/ert/mercenary) + outfit_catagories["Free Solarian Fleets Marines"] = typesof(/datum/outfit/admin/ert/fsf) outfit_catagories["Kataphracts"] = typesof(/datum/outfit/admin/ert/kataphract) + outfit_catagories["Eridani"] = typesof(/datum/outfit/admin/ert/ap_eridani) outfit_catagories["IAC"] = typesof(/datum/outfit/admin/ert/iac) if("Admin") outfit_catagories["Stellar Corporate Conglomerate"] = typesof(/datum/outfit/admin/scc) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 3ca96528586..897f3a5f180 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -416,6 +416,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Respawn Character" set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into." + if(!holder) to_chat(src, "Only administrators may use this command.") return diff --git a/code/modules/admin/verbs/viewlist.dm b/code/modules/admin/verbs/viewlist.dm new file mode 100644 index 00000000000..00dfa59c397 --- /dev/null +++ b/code/modules/admin/verbs/viewlist.dm @@ -0,0 +1,36 @@ +/client/proc/view_extended_list(var/list/L) + if(!check_rights(R_VAREDIT|R_DEV)) return + + if(istype(L)) + new /datum/vueui_module/list_viewer(L, usr) + +/datum/vueui_module/list_viewer + var/list/viewed_list + +/datum/vueui_module/list_viewer/New(var/list/L, mob/user) + if(istype(L)) + viewed_list = L + ui_interact(user) + +/datum/vueui_module/list_viewer/ui_interact(mob/user) + if(!check_rights(R_VAREDIT|R_DEV)) return + + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) + if(!ui) + ui = new(user, src, "admin-extended-list", 800, 600, "Extended List Viewer", state = interactive_state) + ui.header = "minimal" + + ui.open() + +/datum/vueui_module/list_viewer/vueui_data_change(list/data, mob/user, datum/vueui/ui) + if (!data) + . = data = list() + + if(!user.client.holder) + return + + if(!check_rights(R_VAREDIT|R_DEV, FALSE, user)) return + + data["listvar"] = viewed_list + + return data diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index a1927defd33..c90476ee886 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -8,7 +8,8 @@ //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records). else if(href_list["rename"]) - if(!check_rights(R_VAREDIT|R_DEV)) return + if(!check_rights(R_VAREDIT|R_DEV|R_MOD)) + return var/mob/M = locate(href_list["rename"]) if(!istype(M)) @@ -58,6 +59,16 @@ cmd_mass_modify_object_variables(A, href_list["varnamemass"]) + else if(href_list["varnameview"] && href_list["datumview"]) + if(!check_rights(R_VAREDIT|R_DEV)) return + + var/list/L = locate(href_list["datumview"]) + if(!istype(L)) + to_chat(usr, "This can only be used on instances of type /list") + return + + view_extended_list(L, href_list["varnameview"]) + else if(href_list["mob_player_panel"]) if(!check_rights(0)) return diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index 3f2a41ec738..26f914e823e 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -157,6 +157,9 @@ else extra += "
  • [index]: [make_view_variables_value(entry)]
  • " extra += "" + else if(L.len >= 100) + vtext = "([L.len]): " + else vtext = "[value]" diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index aa4df9c2836..e63d9554ef4 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -30,6 +30,7 @@ to_chat(user, SPAN_NOTICE("You disassemble \the [src].")) bombassembly.forceMove(get_turf(user)) + bombassembly.detached() bombassembly.master = null bombassembly = null diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 027f38da0e1..b7a0c50073e 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -15,6 +15,10 @@ var/obj/special_assembly = null /obj/item/device/assembly_holder/proc/detached() + if(a_left) + a_left.holder_movement() + if(a_right) + a_right.holder_movement() return /obj/item/device/assembly_holder/IsAssemblyHolder() diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index c34fdc5b4a2..6f433b40bdc 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -7,13 +7,13 @@ origin_tech = list(TECH_MAGNET = 2) matter = list(DEFAULT_WALL_MATERIAL = 1000, MATERIAL_GLASS = 500) - wires = WIRE_PULSE secured = FALSE obj_flags = OBJ_FLAG_ROTATABLE var/on = FALSE var/visible = FALSE var/obj/effect/beam/i_beam/first = null + var/turf/beam_origin //If we're not on this turf anymore, we've moved. Catches holder.master movements when we're attached to bombs and stuff. /obj/item/device/assembly/infra/activate() if(!..()) @@ -53,12 +53,19 @@ holder.update_icon() /obj/item/device/assembly/infra/rotate(var/mob/user, var/anchored_ignore = FALSE) + if(..()) + var/direction_text = dir2text(dir) + to_chat(user, SPAN_NOTICE("You rotate \the [src] to face [direction_text].")) + QDEL_NULL(first) + +/obj/item/device/assembly/infra/examine(mob/user) . = ..() var/direction_text = dir2text(dir) - to_chat(user, SPAN_NOTICE("You rotate \the [src] to face [direction_text].")) - QDEL_NULL(first) + to_chat(user, SPAN_NOTICE("It is facing [direction_text].")) + /obj/item/device/assembly/infra/process() + if(!on || !secured) QDEL_NULL(first) return ..() @@ -66,8 +73,16 @@ if(first && !isturf(first.loc)) QDEL_NULL(first) - if(!first && (isturf(loc) || (holder && isturf(holder.loc)))) - var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(holder ? holder.loc : loc, src) + //We have no infrared beam, so create one. + if(!first) + //We cannot create beams while being held or in a bag. So we have to compare locs to turfs. + //We need to check if whatever we're attached to, if anything, is on a turf. Since we can be attached to an assembly and that assembly can be attached, we have to check a couple locs. + //First check if we're part of an assembly(holder) and if that assembly is attached (holder.master). If we are, THOSE are the locs we care about. + var/true_location = holder ? holder.master ? holder.master.loc : holder.loc : loc + if(!isturf(true_location)) //Wherever we are, we're not on a turf, nor is our assembly, nor is our bomb/whatever the assembly is attached to. We cannot make a beam. + return + beam_origin = true_location + var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(true_location, src) I.density = TRUE step(I, I.dir) if(I) @@ -79,6 +94,10 @@ return if(first) + if(beam_origin != get_turf(src)) //If the assembly we're attached to has moved, delete the beam. + QDEL_NULL(first) + beam_origin = null + return first.process() diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm deleted file mode 100644 index cbe84144c9d..00000000000 --- a/code/modules/assembly/shock_kit.dm +++ /dev/null @@ -1,44 +0,0 @@ -/obj/item/assembly/shock_kit - name = "electrohelmet assembly" - desc = "This appears to be made from both an electropack and a helmet." - icon_state = "shock_kit" - var/obj/item/clothing/head/helmet/part1 = null - var/obj/item/device/radio/electropack/part2 = null - var/status = FALSE - w_class = ITEMSIZE_HUGE - flags = CONDUCT - -/obj/item/assembly/shock_kit/Destroy() - qdel(part1) - qdel(part2) - return ..() - -/obj/item/assembly/shock_kit/attackby(obj/item/W, mob/user) - if(W.iswrench() && !status) - var/turf/T = loc - if(ismob(T)) - T = T.loc - part1.forceMove(T) - part2.forceMove(T) - part1.master = null - part2.master = null - part1 = null - part2 = null - qdel(src) - return - if(W.isscrewdriver()) - status = !status - var/msg = "[src] is now [status ? "secured" : "unsecured"]!" - to_chat(user, SPAN_NOTICE(msg)) - add_fingerprint(user) - return - -/obj/item/assembly/shock_kit/attack_self(mob/user) - part1.attack_self(user, status) - part2.attack_self(user, status) - add_fingerprint(user) - -/obj/item/assembly/shock_kit/receive_signal() - if(istype(loc, /obj/structure/bed/chair/e_chair)) - var/obj/structure/bed/chair/e_chair/C = loc - C.shock() \ No newline at end of file diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 54e671e11d5..c10fe31c49c 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -172,18 +172,6 @@ species = SPECIES_SKELETON corpseid = 0 -/obj/effect/landmark/corpse/clown - name = "Clown" - corpseuniform = /obj/item/clothing/under/rank/clown - corpseshoes = /obj/item/clothing/shoes/clown_shoes - corpseradio = /obj/item/device/radio/headset - corpsemask = /obj/item/clothing/mask/gas/clown_hat - corpsepocket1 = /obj/item/bikehorn - corpseback = /obj/item/storage/backpack/clown - corpseid = 1 - corpseidjob = "Clown" - corpseidaccess = "Clown" - /obj/effect/landmark/corpse/scientist name = "Scientist" corpseradio = /obj/item/device/radio/headset/headset_sci diff --git a/code/modules/background/accent/human.dm b/code/modules/background/accent/human.dm index a6a74b2f460..7c51bca4765 100644 --- a/code/modules/background/accent/human.dm +++ b/code/modules/background/accent/human.dm @@ -45,7 +45,7 @@ /datum/accent/silversun_original name = ACCENT_SILVERSUN_ORIGINAL - description = "The native accent of Silversun is a sing-song take on standard Sol Common that has, since massive investment into the planet by Idris Incorporated, come to be associated with the planet’s renowned tourism industry. \ + description = "The native accent of Silversun is a sing-song take on standard Sol Common that has, since massive investment into the planet by Idris Incorporated, come to be associated with the planet's renowned tourism industry. \ Many native residents of Silversun are bitter that their accent - and planet - are seen as nothing more than an enormous vacation retreat by the greater Orion Spur. This accent is commonly used by Idris Incorporated shell positronic \ frames, much to the consternation of Silversun's Originals." tag_icon = "silversun_original" diff --git a/code/modules/background/accent/tajara.dm b/code/modules/background/accent/tajara.dm index 37729c3904f..0d4bc23483b 100644 --- a/code/modules/background/accent/tajara.dm +++ b/code/modules/background/accent/tajara.dm @@ -73,3 +73,8 @@ short, sharp vowel sounds and clear pronunciation. Most speakers are found in the DPRA controlled area of the region, but some do exist within the PRA borders." tag_icon = "tajara_northrasnrr" +/datum/accent/dinakk + name = ACCENT_DINAKK + description = "Found in the isolated valleys of the Din'akk Mountains, little has changed in this accent since the first contact. It still clings to words and grammatical \ + structures that have long since fallen out of use by other Siik'maas speakers. It is described as strong and abrupt by other Tajara." + tag_icon = "tajara_dinaak" \ No newline at end of file diff --git a/code/modules/background/citizenship/human.dm b/code/modules/background/citizenship/human.dm index be4904ce0e1..999a9283769 100644 --- a/code/modules/background/citizenship/human.dm +++ b/code/modules/background/citizenship/human.dm @@ -155,6 +155,7 @@ SPECIES_IPC_UNBRANDED, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, + SPECIES_SKRELL, SPECIES_TAJARA, SPECIES_TAJARA_MSAI, SPECIES_TAJARA_ZHAN, diff --git a/code/modules/background/citizenship/tajara.dm b/code/modules/background/citizenship/tajara.dm index e1b5a018002..d704c410090 100644 --- a/code/modules/background/citizenship/tajara.dm +++ b/code/modules/background/citizenship/tajara.dm @@ -1,7 +1,7 @@ /datum/citizenship/pra name = CITIZENSHIP_PRA description = "Lead by President Njadrasanukii Hadii, the People's Republic of Adhomai are considered the 'loyalist' faction on Adhomai and enjoy galactic recognition as the \ - government of Adhomai. It claims to be the true keeper of Al'marii's legacy. However, the PRA can be described as a Hadiist branch of Al'marii's revolutionary ideology - that means \ + government of Adhomai. It claims to be the true keeper of Al'mari's legacy. However, the PRA can be described as a Hadiist branch of Al'mari's revolutionary ideology - that means \ putting the State at the top of a hierarchy of power. The PRA is a very centralized state, but in recent years has slowly been able to start making true its promises to bring \ revolution to the masses. With land reform, enfranchisement of women and peasantry, literacy initiatives, and the collectivization of farms and the means of production, the PRA is \ struggling to hold true to its radical ideals while an entrenched upper party stubbornly tries to hold onto power." diff --git a/code/modules/background/defines.dm b/code/modules/background/defines.dm index 13afa020745..8da1485a6ad 100644 --- a/code/modules/background/defines.dm +++ b/code/modules/background/defines.dm @@ -93,6 +93,7 @@ #define ACCENT_NOMADDELVAHHI "Nomadic Delvahhi" #define ACCENT_OLDYASSA "Old Ya'ssa" #define ACCENT_NORTHRASNRR "Northern Ras'nrr Siik'maas" +#define ACCENT_DINAKK "Din'akk Mountains Siik'maas" #define ACCENT_HEGEMON_NOBLE "Noble Hegemonic" #define ACCENT_HEGEMON_PEASANT "Peasant Hegemonic" diff --git a/code/modules/background/religion/human.dm b/code/modules/background/religion/human.dm index 64a4e1f7548..9601a124be7 100644 --- a/code/modules/background/religion/human.dm +++ b/code/modules/background/religion/human.dm @@ -68,9 +68,9 @@ /datum/religion/luceism name = RELIGION_LUCEISM description = "An unusual syncretic religion originating upon the planet of Assunzione, Luceism is a quasi-Abrahamic religion descended from a variety of faiths \ - held by the original colonists that first emerged following the unexpected extinguishing of Assunzione’s star in 2274. While arguably a branch of \ + held by the original colonists that first emerged following the unexpected extinguishing of Assunzione's star in 2274. While arguably a branch of \ modern Abrahamic religions, Luceism is a hard-to-define religion dedicated to the worship of an abstract representation of light referred to as \ the Ennoia. Though it is, unsurprisingly, strongest on Assunzione, followers of the faith can be found throughout the Orion Spur alongside their \ houses of worship." book_name = "Luceian Book of Scripture and Prayers" - book_sprite = "luce" + book_sprite = "luce2" diff --git a/code/modules/background/space_sectors/space_sector.dm b/code/modules/background/space_sectors/space_sector.dm new file mode 100644 index 00000000000..0619135f087 --- /dev/null +++ b/code/modules/background/space_sectors/space_sector.dm @@ -0,0 +1,4 @@ +/datum/space_sector + var/name + var/description + var/list/possible_erts = list() \ No newline at end of file diff --git a/code/modules/background/space_sectors/tauceti.dm b/code/modules/background/space_sectors/tauceti.dm new file mode 100644 index 00000000000..5060082dc95 --- /dev/null +++ b/code/modules/background/space_sectors/tauceti.dm @@ -0,0 +1,19 @@ +/datum/space_sector/tau_ceti + name = SECTOR_TAU_CETI + description = "Tau Ceti is a system located in close proximity of Sol, and serves as the main base of operation for the megacorporation NanoTrasen. Tau Ceti is governed by the \ + Republic of Biesel, a young Republic that became independent of the economically troubled Sol Alliance in 2452 due to heavy pressure by Nanotrasen. There is still resentment in \ + the Sol Alliance over the loss of such a wealthy system, while Nanotrasen continues to have a heavy hand in all levels of Tau Ceti." + +/datum/space_sector/tau_ceti/romanovich + name = SECTOR_ROMANOVICH + description = "The Romanovich Cloud is a shell of icy, rocky and metallic bodies that orbit very distant Tau Ceti, past even the Dust Belt. Rich in deposits of precious and\ + semi-precious metals as well as radioactive elements, the Romanovich Cloud is the source of nearly all the raw materials used within Tau Ceti. The cloud is also one of the few\ + sources of Phoron, a volatile but highly-sought after compound, known for its uses in the biomedical and energy industries. Most of the sources of Phoron within the Romanovich \ + Cloud are under control of NanoTrasen, which has consequently established many high-tech research facilities in the area in the past few years." + +/datum/space_sector/tau_ceti/corp_zone + name = SECTOR_CORP_ZONE + description = "Formerly Solarian space, the Corporate Reconstruction Zone is the name for all systems occupied by the Republic of Biesel that are not within Tau Ceti's gravity well. \ + The Zone, or the CRZ, is an area of instability and logistical chaos where once-Alliance colonies exist in relative peace compared to the adjacent Human Wildlands. This is owed to \ + two factors: the presence of the lingering Stellar Corporate Conglomerate, and the federal authority of the Republic of Biesel backing them up. Warlords and major antagonistic \ + factions (to Biesel) generally refrain from entering these territories to avoid the ire of the Conglomerate, much less the repercussions of engaging its allies." diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index c4dcf074f69..52af12ab11f 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -6,7 +6,7 @@ required_count = 4 random_count = 1 wanted_types = list(/obj/item/storage/briefcase) - exclude_types = list(/obj/item/storage/briefcase/inflatable, /obj/item/storage/briefcase/crimekit) + exclude_types = list(/obj/item/storage/briefcase/crimekit) /datum/bounty/item/assistant/lung name = "Lungs" diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm index 0c8bec753e9..5c8db80d005 100644 --- a/code/modules/cargo/bounties/special.dm +++ b/code/modules/cargo/bounties/special.dm @@ -24,10 +24,10 @@ /datum/bounty/item/phoron_sheet name = "Phoron Sheets" description = "Always prioritize this bounty. Failure to meet this quota may result in adverse impact upon your status in the NanoTrasen Corporation." - reward_low = 14000 - reward_high = 18000 - required_count = 150 - random_count = 25 + reward_low = 7000 + reward_high = 9000 + required_count = 75 + random_count = 15 wanted_types = list(/obj/item/stack/material/phoron) high_priority = TRUE @@ -44,14 +44,14 @@ /datum/bounty/item/phoron_canister name = "Phoron Canisters" - description = "Updated requirement: Canisters must now be filled to at least 150% of standard stock amounts (approx. 6,800kPA at a temperature of 20C). Always prioritize this bounty. Failure to meet this quota may result in adverse impact upon your status in the NanoTrasen Corporation." - reward_low = 15000 - reward_high = 18000 - required_count = 5 - random_count = 1 // 4 to 6 + description = "Updated requirement: Canisters must now be filled to a minimum of 2000 moles. Always prioritize this bounty. Failure to meet this quota may result in adverse impact upon your status in the NanoTrasen Corporation." + reward_low = 8000 + reward_high = 10000 + required_count = 3 + random_count = 1 // 2 to 4 wanted_types = list(/obj/machinery/portable_atmospherics/canister) high_priority = TRUE - var/moles_required = 2700 //Roundstart total_moles is about 1871 per tank. 50% more full w/ leeway + var/moles_required = 2000 //Roundstart total_moles for a FULL tank is about 1871 per tank. However during the arc this bounty is relevant, tanks are half full. /datum/bounty/item/phoron_canister/applies_to(var/obj/machinery/portable_atmospherics/canister/O) if(!..()) diff --git a/code/modules/cargo/random_stock/t1_common.dm b/code/modules/cargo/random_stock/t1_common.dm index b00692985c2..b1bbdac5fce 100644 --- a/code/modules/cargo/random_stock/t1_common.dm +++ b/code/modules/cargo/random_stock/t1_common.dm @@ -171,7 +171,7 @@ STOCK_ITEM_COMMON(weldgear, 2) new /obj/item/reagent_containers/weldpack(L) STOCK_ITEM_COMMON(inflatable, 3) - new /obj/item/storage/briefcase/inflatable(L) + new /obj/item/storage/bag/inflatable(L) STOCK_ITEM_COMMON(wheelchair, 1) //Wheelchair is not dense so it doesnt NEED a clear tile, but it looks a little silly to @@ -491,8 +491,6 @@ STOCK_ITEM_COMMON(gasmask, 2) /obj/item/clothing/mask/gas = 10, /obj/item/clothing/mask/gas/plaguedoctor = 1, /obj/item/clothing/mask/gas/swat = 5, - /obj/item/clothing/mask/gas/clown_hat = 0.5, - /obj/item/clothing/mask/gas/sexyclown = 0.5, /obj/item/clothing/mask/gas/mime = 0.5, /obj/item/clothing/mask/gas/monkeymask = 0.5, /obj/item/clothing/mask/gas/sexymime = 0.5, diff --git a/code/modules/cargo/random_stock/t2_uncommon.dm b/code/modules/cargo/random_stock/t2_uncommon.dm index 64d2908830d..625f113efa3 100644 --- a/code/modules/cargo/random_stock/t2_uncommon.dm +++ b/code/modules/cargo/random_stock/t2_uncommon.dm @@ -14,11 +14,11 @@ STOCK_ITEM_UNCOMMON(plasteel, 3) STOCK_ITEM_UNCOMMON(silver, 2) new /obj/item/stack/material/silver(L, rand(5,30)) -STOCK_ITEM_UNCOMMON(phoronsheets, 1) - new /obj/item/stack/material/phoron(L, rand(5,30)) +STOCK_ITEM_UNCOMMON(phoronsheets, 0.5) + new /obj/item/stack/material/phoron(L, rand(5,20)) -STOCK_ITEM_UNCOMMON(phoronglass, 1) - new /obj/item/stack/material/glass/phoronglass(L, rand(10,30)) +STOCK_ITEM_UNCOMMON(phoronglass, 0.5) + new /obj/item/stack/material/glass/phoronglass(L, rand(10,20)) STOCK_ITEM_UNCOMMON(sandstone, 2) new /obj/item/stack/material/sandstone(L, 50) @@ -396,5 +396,11 @@ STOCK_ITEM_UNCOMMON(alt_glasses, 1) STOCK_ITEM_UNCOMMON(gumballs, 3) new /obj/item/glass_jar/gumball(L) +STOCK_ITEM_UNCOMMON(googly, 0.75) + new /obj/item/storage/box/googly(L) + +STOCK_ITEM_UNCOMMON(wizarddressup, 1) + new /obj/random/wizard_dressup(L) + STOCK_ITEM_UNCOMMON(nothing, 0) // no-op diff --git a/code/modules/cciaa/cciaa_items.dm b/code/modules/cciaa/cciaa_items.dm index bc9356fbf75..74980902fc3 100644 --- a/code/modules/cciaa/cciaa_items.dm +++ b/code/modules/cciaa/cciaa_items.dm @@ -336,7 +336,7 @@ name = "central command internal affairs jacket" /obj/item/storage/lockbox/cciaa - req_access = list(access_cent_captain) + req_access = list(access_cent_ccia) name = "CCIA agent briefcase" desc = "A smart looking briefcase with a NT logo on the side" storage_slots = 8 diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 08e3a9a1862..e88f0a6cd27 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -150,7 +150,6 @@ var/list/asset_datums = list() /datum/asset var/_abstract = /datum/asset - var/delayed = FALSE /datum/asset/New() asset_datums[type] = src @@ -383,7 +382,7 @@ var/list/asset_datums = list() ) /datum/asset/simple/goonchat - verify = FALSE + verify = TRUE assets = list( "json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js', "browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js', @@ -435,7 +434,26 @@ var/list/asset_datums = list() "praflag.png" = 'html/images/praflag.png', "dpraflag.png" = 'html/images/dpraflag.png', "nkaflag.png" = 'html/images/nkaflag.png', - "izweskiflag.png" = 'html/images/izweskiflag.png' + "izweskiflag.png" = 'html/images/izweskiflag.png', + "bluebird.woff" = 'html/fonts/OFL/Bluebird.woff', + "grandhotel.woff" = 'html/fonts/OFL/GrandHotel.woff', + "lashema.woff" = 'html/fonts/OFL/Lashema.woff', + "sourcecodepro.woff" = 'html/fonts/OFL/SourceCodePro.woff', + "sovjetbox.woff" = 'html/fonts/OFL/SovjetBox.woff', + "torsha.woff" = 'html/fonts/OFL/Torsha.woff', + "web3of9ascii.woff" = 'html/fonts/OFL/Web3Of9ASCII.woff', + "zeshit.woff" = 'html/fonts/OFL/zeshit.woff', + "bilboinc.woff" = 'html/fonts/OFL/BilboINC.woff', + "fproject.woff" = 'html/fonts/OFL/FProject.woff', + "gelasio.woff" = 'html/fonts/OFL/Gelasio.woff', + "mo5v56.woff" = 'html/fonts/OFL/Mo5V56.woff', + "runasans.woff" = 'html/fonts/OFL/RunaSans.woff', + "classica.woff" = 'html/fonts/OFL/Classica.woff', + "stormning.woff" = 'html/fonts/OFL/Stormning.woff', + "copt-b.woff" = 'html/fonts/OFL/Copt-B.woff', + "ducados.woff" = 'html/fonts/OFL/Ducados.woff', + "kawkabmono.woff" = 'html/fonts/OFL/KawkabMono.woff', + "kaushanscript.woff" = 'html/fonts/OFL/KaushanScript.woff' ) /datum/asset/simple/changelog @@ -463,7 +481,6 @@ var/list/asset_datums = list() /datum/asset/spritesheet/vending name = "vending" - delayed = TRUE /datum/asset/spritesheet/vending/register() var/list/vending_products = list() @@ -498,9 +515,12 @@ var/list/asset_datums = list() if(istype(O, /obj/item/seeds)) // thanks seeds for being overlays defined at runtime var/obj/item/seeds/S = O + if(!S.seed && S.seed_type && !isnull(SSplants.seeds) && SSplants.seeds[S.seed_type]) + S.seed = SSplants.seeds[S.seed_type] I = S.update_appearance(TRUE) Insert(imgid, I, forced=I) else + O.update_icon() if(O.overlay_queued) O.compile_overlays() if(O.overlays.len) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 32263789444..1dc4969e71c 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -337,9 +337,6 @@ var/list/localhost_addresses = list( /client/New(TopicData) TopicData = null //Prevent calls to client.Topic from connect - // Load goonchat - chatOutput = new(src) - if(!(connection in list("seeker", "web"))) //Invalid connection type. return null if(byond_version < MIN_CLIENT_VERSION) //Out of date client. @@ -356,20 +353,22 @@ var/list/localhost_addresses = list( if (LAZYLEN(config.client_blacklist_version)) var/client_version = "[byond_version].[byond_build]" if (client_version in config.client_blacklist_version) - to_chat(src, "Your version of BYOND is explicitly blacklisted from joining this server!") - to_chat(src, "Your current version: [client_version].") - to_chat(src, "Visit http://www.byond.com/download/ to download a different version. Try looking for a newer one, or go one lower.") + to_chat_immediate(src, "Your version of BYOND is explicitly blacklisted from joining this server!") + to_chat_immediate(src, "Your current version: [client_version].") + to_chat_immediate(src, "Visit http://www.byond.com/download/ to download a different version. Try looking for a newer one, or go one lower.") log_access("Failed Login: [key] [computer_id] [address] - Blacklisted BYOND version: [client_version].") del(src) return 0 + if(!chatOutput) + chatOutput = new(src) + if(IsGuestKey(key) && config.external_auth) src.authed = FALSE var/mob/abstract/unauthed/m = new() m.client = src src.InitPrefs() //Init some default prefs m.LateLogin() - chatOutput.start() return m //Do auth shit else @@ -377,7 +376,6 @@ var/list/localhost_addresses = list( src.InitClient() src.InitPrefs() mob.LateLogin() - chatOutput.start() /client/proc/InitPrefs() //preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum) diff --git a/code/modules/client/client_color.dm b/code/modules/client/client_color.dm index 21f558fbd88..4b2bb5d86ff 100644 --- a/code/modules/client/client_color.dm +++ b/code/modules/client/client_color.dm @@ -96,7 +96,7 @@ priority = 300 /datum/client_color/vaurca - client_color = list(0, 0, 0.297, 0, 0, 0.739, 0, 0, 0.100) + client_color = list(0.793, 0.297, 0, 0.297, 0.539, 0, 0, 0, 0) priority = 100 /datum/client_color/deuteranopia diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 91fb66db38d..54a8f9c1a16 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -10,6 +10,7 @@ S["species"] >> pref.species S["spawnpoint"] >> pref.spawnpoint S["OOC_Notes"] >> pref.metadata + S["floating_chat_color"] >> pref.floating_chat_color if(istype(all_species[pref.species], /datum/species/machine)) S["ipc_tag_status"] >> pref.machine_tag_status S["ipc_serial_number"] >> pref.machine_serial_number @@ -23,6 +24,7 @@ S["species"] << pref.species S["spawnpoint"] << pref.spawnpoint S["OOC_Notes"] << pref.metadata + S["floating_chat_color"] << pref.floating_chat_color if(istype(all_species[pref.species], /datum/species/machine)) S["ipc_tag_status"] << pref.machine_tag_status S["ipc_serial_number"] << pref.machine_serial_number @@ -40,7 +42,8 @@ "age", "metadata", "spawnpoint", - "species" + "species", + "floating_chat_color" ), "args" = list("id") ), @@ -72,6 +75,7 @@ "metadata", "spawnpoint", "species", + "floating_chat_color", "id" = 1, "ckey" = 1 ), @@ -97,6 +101,7 @@ "ownership_status" = pref.machine_ownership_status, "id" = pref.current_character, "char_id" = pref.current_character, + "floating_chat_color" = pref.floating_chat_color, "ckey" = PREF_CLIENT_CKEY ) @@ -140,6 +145,7 @@ pref.real_name = random_name(pref.gender, pref.species) pref.spawnpoint = sanitize_inlist(pref.spawnpoint, SSatlas.spawn_locations, initial(pref.spawnpoint)) pref.machine_tag_status = text2num(pref.machine_tag_status) // SQL queries return as text, so make this a num + pref.floating_chat_color = sanitize_hexcolor(pref.floating_chat_color, get_random_colour(0, 160, 230)) /datum/category_item/player_setup_item/general/basic/content(var/mob/user) var/list/dat = list("Name: ") @@ -156,6 +162,7 @@ dat += "Pronouns: [capitalize_first_letters(pref.pronouns)]
    " dat += "Age: [pref.age]
    " dat += "Spawn Point: [pref.spawnpoint]
    " + dat += "Floating Chat Color: [pref.floating_chat_color]
    " if(istype(S, /datum/species/machine)) if(pref.can_edit_ipc_tag) dat += "Has Tag: [pref.machine_tag_status ? "Yes" : "No"]
    " @@ -220,6 +227,15 @@ pref.real_name = random_name(pref.gender, pref.species) return TOPIC_REFRESH + else if(href_list["select_floating_chat_color"]) + var/new_fc_color = input(user, "Choose Floating Chat Color:", "Global Preference") as color|null + if(new_fc_color && CanUseTopic(user)) + pref.floating_chat_color = new_fc_color + var/mob/living/carbon/human/H = preference_mob() + if(ishuman(H)) + H.set_floating_chat_color(new_fc_color) + return TOPIC_REFRESH + else if(href_list["gender"]) var/datum/species/S = all_species[pref.species] pref.gender = next_in_list(pref.gender, valid_player_genders & S.default_genders) diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm index d490438fcfc..e3317b74189 100644 --- a/code/modules/client/preference_setup/general/06_flavor.dm +++ b/code/modules/client/preference_setup/general/06_flavor.dm @@ -4,9 +4,9 @@ /datum/category_item/player_setup_item/general/flavor/load_character(var/savefile/S) S["flavor_texts_general"] >> pref.flavor_texts["general"] - S["flavor_texts_head"] >> pref.flavor_texts[BP_HEAD] + S["flavor_texts_head"] >> pref.flavor_texts["head"] S["flavor_texts_face"] >> pref.flavor_texts["face"] - S["flavor_texts_eyes"] >> pref.flavor_texts[BP_EYES] + S["flavor_texts_eyes"] >> pref.flavor_texts["eyes"] S["flavor_texts_torso"] >> pref.flavor_texts["torso"] S["flavor_texts_arms"] >> pref.flavor_texts["arms"] S["flavor_texts_hands"] >> pref.flavor_texts["hands"] @@ -23,9 +23,9 @@ /datum/category_item/player_setup_item/general/flavor/save_character(var/savefile/S) S["flavor_texts_general"] << pref.flavor_texts["general"] - S["flavor_texts_head"] << pref.flavor_texts[BP_HEAD] + S["flavor_texts_head"] << pref.flavor_texts["head"] S["flavor_texts_face"] << pref.flavor_texts["face"] - S["flavor_texts_eyes"] << pref.flavor_texts[BP_EYES] + S["flavor_texts_eyes"] << pref.flavor_texts["eyes"] S["flavor_texts_torso"] << pref.flavor_texts["torso"] S["flavor_texts_arms"] << pref.flavor_texts["arms"] S["flavor_texts_hands"] << pref.flavor_texts["hands"] @@ -94,9 +94,9 @@ var/list/var_list = list( "char_id" = pref.current_character, "flavour_general" = pref.flavor_texts["general"], - "flavour_head" = pref.flavor_texts[BP_HEAD], + "flavour_head" = pref.flavor_texts["head"], "flavour_face" = pref.flavor_texts["face"], - "flavour_eyes" = pref.flavor_texts[BP_EYES], + "flavour_eyes" = pref.flavor_texts["eyes"], "flavour_torso" = pref.flavor_texts["torso"], "flavour_arms" = pref.flavor_texts["arms"], "flavour_hands" = pref.flavor_texts["hands"], @@ -219,13 +219,13 @@ HTML += TextPreview(pref.flavor_texts["general"]) HTML += "
    " HTML += "Head: " - HTML += TextPreview(pref.flavor_texts[BP_HEAD]) + HTML += TextPreview(pref.flavor_texts["head"]) HTML += "
    " HTML += "Face: " HTML += TextPreview(pref.flavor_texts["face"]) HTML += "
    " HTML += "Eyes: " - HTML += TextPreview(pref.flavor_texts[BP_EYES]) + HTML += TextPreview(pref.flavor_texts["eyes"]) HTML += "
    " HTML += "Body: " HTML += TextPreview(pref.flavor_texts["torso"]) diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm index c389942ee72..a37a9337e69 100644 --- a/code/modules/client/preference_setup/global/01_ui.dm +++ b/code/modules/client/preference_setup/global/01_ui.dm @@ -80,7 +80,7 @@ dat += "-Alpha(transparency): [pref.UI_style_alpha] - reset
    " dat += "Tooltip Style: [pref.tooltip_style]
    " dat += "HTML UI Style: [pref.html_UI_style]
    " - dat += "-FPS: [pref.clientfps] - reset
    " + dat += "FPS: [pref.clientfps] - reset
    " if(can_select_ooc_color(user)) dat += "OOC Color: " if(pref.ooccolor == initial(pref.ooccolor)) diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index d2cfac7c439..1c654a2a72c 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -91,6 +91,7 @@ "Ghost ears: [(pref.toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
    ", "Ghost sight: [(pref.toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
    ", "Ghost radio: [(pref.toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
    ", + "Observer LOOC: [(pref.toggles & CHAT_GHOSTLOOC) ? "Visible" : "Hidden"]
    ", "Space Parallax: [(pref.toggles_secondary & PARALLAX_SPACE) ? "Yes" : "No"]
    ", "Space Dust: [(pref.toggles_secondary & PARALLAX_DUST) ? "Yes" : "No"]
    ", "Progress Bars: [(pref.toggles_secondary & PROGRESS_BARS) ? "Yes" : "No"]
    ", diff --git a/code/modules/client/preference_setup/loadout/_defines.dm b/code/modules/client/preference_setup/loadout/_defines.dm index 3d02a32ec09..75e69e22a1c 100644 --- a/code/modules/client/preference_setup/loadout/_defines.dm +++ b/code/modules/client/preference_setup/loadout/_defines.dm @@ -1,5 +1,6 @@ #define GEAR_NO_SELECTION 0 #define GEAR_HAS_COLOR_SELECTION 1 -#define GEAR_HAS_NAME_SELECTION 2 -#define GEAR_HAS_DESC_SELECTION 4 -#define GEAR_HAS_COLOR_ROTATION_SELECTION 8 \ No newline at end of file +#define GEAR_HAS_ADDITIONAL_COLOR_SELECTION 2 +#define GEAR_HAS_NAME_SELECTION 4 +#define GEAR_HAS_DESC_SELECTION 8 +#define GEAR_HAS_COLOR_ROTATION_SELECTION 16 \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm index a1809834fad..dc554967b83 100644 --- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm +++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm @@ -13,7 +13,7 @@ /datum/gear_tweak/proc/tweak_gear_data(var/metadata, var/datum/gear_data) return -/datum/gear_tweak/proc/tweak_item(var/obj/item/I, var/metadata) +/datum/gear_tweak/proc/tweak_item(var/obj/item/I, var/metadata, var/mob/living/carbon/human/H) return /* @@ -41,11 +41,27 @@ Color adjustment return input(user, "Choose a color.", title, metadata) as null|anything in valid_colors return input(user, "Choose a color.", title, metadata) as color|null -/datum/gear_tweak/color/tweak_item(var/obj/item/I, var/metadata) +/datum/gear_tweak/color/tweak_item(var/obj/item/I, var/metadata, var/mob/living/carbon/human/H) if(valid_colors && !(metadata in valid_colors)) return I.color = sanitize_hexcolor(metadata, I.color) +/* + Additional Color adjustment +*/ + +var/datum/gear_tweak/color/additional/gear_tweak_additional_color = new() + +/datum/gear_tweak/color/additional/get_contents(var/metadata) + return "Additional Color: " + +/datum/gear_tweak/color/additional/tweak_item(var/obj/item/I, var/metadata, var/mob/living/carbon/human/H) + if(valid_colors && !(metadata in valid_colors)) + return + if(I.vars["additional_color"]) // set var/additional_color = COLOR_GREY on item + I.vars["additional_color"] = metadata + I.update_icon() + /* Color Rotation adjustment */ @@ -60,7 +76,7 @@ var/datum/gear_tweak/color_rotation/gear_tweak_color_rotation = new() /datum/gear_tweak/color_rotation/get_metadata(var/user, var/metadata, var/title = "Color Rotation") return clamp(input(user, "Choose the amount of degrees to rotate the hue around the color wheel. (-180 - 180)", title, metadata) as num, -180, 180) -/datum/gear_tweak/color_rotation/tweak_item(var/obj/item/I, var/metadata) +/datum/gear_tweak/color_rotation/tweak_item(var/obj/item/I, var/metadata, var/mob/living/carbon/human/H) I.color = color_rotation(metadata) /* @@ -121,7 +137,7 @@ Content adjustment else return metadata -/datum/gear_tweak/contents/tweak_item(var/obj/item/I, var/list/metadata) +/datum/gear_tweak/contents/tweak_item(var/obj/item/I, var/list/metadata, var/mob/living/carbon/human/H) if(metadata.len != valid_contents.len) return for(var/i = 1 to valid_contents.len) @@ -158,7 +174,7 @@ Reagents adjustment if(!.) return metadata -/datum/gear_tweak/reagents/tweak_item(var/obj/item/I, var/list/metadata) +/datum/gear_tweak/reagents/tweak_item(var/obj/item/I, var/list/metadata, var/mob/living/carbon/human/H) if(metadata == "None") return if(metadata == "Random") @@ -191,10 +207,12 @@ var/datum/gear_tweak/custom_name/gear_tweak_free_name = new() return input(user, "Choose an item name.", "Character Preference", metadata) as null|anything in valid_custom_names return sanitize(input(user, "Choose the item's name. Leave it blank to use the default name.", "Item Name", metadata) as text|null, MAX_LNAME_LEN, extra = 0) -/datum/gear_tweak/custom_name/tweak_item(var/obj/item/I, var/metadata) +/datum/gear_tweak/custom_name/tweak_item(var/obj/item/I, var/metadata, var/mob/living/carbon/human/H) if(!metadata) return I.name I.name = metadata + if(I.vars["base_name"]) + I.vars["base_name"] = metadata /* Custom Description @@ -219,10 +237,15 @@ var/datum/gear_tweak/custom_desc/gear_tweak_free_desc = new() return input(user, "Choose an item description.", "Character Preference", metadata) as null|anything in valid_custom_desc return sanitize(input(user, "Choose the item's description. Leave it blank to use the default description.", "Item Description", metadata) as message|null, extra = 0) -/datum/gear_tweak/custom_desc/tweak_item(var/obj/item/I, var/metadata) - if(!metadata) +/datum/gear_tweak/custom_desc/tweak_item(var/obj/item/I, var/metadata, var/mob/living/carbon/human/H) + if (!metadata && ("stored_name" in I.vars)) + I.vars["stored_name"] = H.real_name + return I.desc += "\nThe name [H.real_name] is written on it." + if (!metadata) return I.desc I.desc = metadata + if ("stored_name" in I.vars) + I.vars["stored_name"] = H.real_name /* Paper Data @@ -236,7 +259,7 @@ Paper Data /datum/gear_tweak/paper_data/get_metadata(var/user, var/metadata) return sanitize(input(user, "Choose a pre-written message on the item.", "Pre-written Message", metadata) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0) -/datum/gear_tweak/paper_data/tweak_item(var/obj/item/paper/P, var/metadata) +/datum/gear_tweak/paper_data/tweak_item(var/obj/item/paper/P, var/metadata, var/mob/living/carbon/human/H) if(!metadata || !istype(P)) return P.info = P.parsepencode(metadata) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index 61cbb20d69b..357b9443acf 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -294,6 +294,8 @@ var/list/gear_datums = list() description = initial(O.desc) if(flags & GEAR_HAS_COLOR_SELECTION) gear_tweaks += list(gear_tweak_free_color_choice) + if(flags & GEAR_HAS_ADDITIONAL_COLOR_SELECTION) + gear_tweaks += list(gear_tweak_additional_color) if(flags & GEAR_HAS_NAME_SELECTION) gear_tweaks += list(gear_tweak_free_name) if(flags & GEAR_HAS_DESC_SELECTION) @@ -309,19 +311,19 @@ var/list/gear_datums = list() src.path = path src.location = location -/datum/gear/proc/spawn_item(var/location, var/metadata) +/datum/gear/proc/spawn_item(var/location, var/metadata, var/mob/living/carbon/human/H) var/datum/gear_data/gd = new(path, location) for(var/datum/gear_tweak/gt in gear_tweaks) if(metadata["[gt]"]) - gt.tweak_gear_data(metadata["[gt]"], gd) + gt.tweak_gear_data(metadata["[gt]"], gd, H) else - gt.tweak_gear_data(gt.get_default(), gd) + gt.tweak_gear_data(gt.get_default(), gd, H) var/item = new gd.path(gd.location) for(var/datum/gear_tweak/gt in gear_tweaks) if(metadata["[gt]"]) - gt.tweak_item(item, metadata["[gt]"]) + gt.tweak_item(item, metadata["[gt]"], H) else - gt.tweak_item(item, gt.get_default()) + gt.tweak_item(item, gt.get_default(), H) return item /datum/gear/proc/spawn_random(var/location) @@ -332,3 +334,8 @@ var/list/gear_datums = list() for(var/datum/gear_tweak/gt in gear_tweaks) gt.tweak_item(item, gt.get_random()) return item + +/datum/gear/proc/check_species_whitelist(mob/living/carbon/human/H) + if(whitelisted && (!(H.species.name in whitelisted))) + return FALSE + return TRUE \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 4d46de882ec..2e2eb15564b 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -111,6 +111,32 @@ cost = 2 flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION +/datum/gear/accessory/webbing_harness + display_name = "webbing, harness selection" + path = /obj/item/clothing/accessory/storage/webbingharness + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION + +/datum/gear/accessory/webbing_harness/New() + ..() + var/webbingharness = list() + webbingharness["webbing harness"] = /obj/item/clothing/accessory/storage/webbingharness + webbingharness["webbing harness, pouches"] = /obj/item/clothing/accessory/storage/webbingharness/pouches + webbingharness["webbing harness, pouches alt"] = /obj/item/clothing/accessory/storage/webbingharness/alt + gear_tweaks += new/datum/gear_tweak/path(webbingharness) + +/datum/gear/accessory/colorable_webbing_harness + display_name = "webbing, colorable harness selection" + path = /obj/item/clothing/accessory/storage/webbingharness/grayscale + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + +/datum/gear/accessory/colorable_webbing_harness/New() + ..() + var/colorableharness = list() + colorableharness["webbing harness"] = /obj/item/clothing/accessory/storage/webbingharness/grayscale + colorableharness["webbing harness, pouches"] = /obj/item/clothing/accessory/storage/webbingharness/pouches/grayscale + colorableharness["webbing harness, pouches alt"] = /obj/item/clothing/accessory/storage/webbingharness/alt/grayscale + gear_tweaks += new/datum/gear_tweak/path(colorableharness) + /datum/gear/accessory/brown_pouches display_name = "drop pouches, engineering" path = /obj/item/clothing/accessory/storage/pouches/brown @@ -154,12 +180,16 @@ ..() var/sweater = list() sweater["sweater"] = /obj/item/clothing/accessory/sweater - sweater["argyle sweater"] = /obj/item/clothing/accessory/sweaterargyle + sweater["crewneck sweater"] = /obj/item/clothing/accessory/sweatercrewneck + sweater["v-neck sweater"] = /obj/item/clothing/accessory/sweatervneck sweater["sweater vest"] = /obj/item/clothing/accessory/sweatervest - sweater["argyle sweater vest"] = /obj/item/clothing/accessory/sweatervestargyle sweater["turtleneck sweater"] = /obj/item/clothing/accessory/sweaterturtleneck - sweater["argyle turtleneck sweater"] = /obj/item/clothing/accessory/sweaterargyleturtleneck sweater["tubeneck sweater"] = /obj/item/clothing/accessory/sweatertubeneck + sweater["argyle sweater"] = /obj/item/clothing/accessory/sweaterargyle + sweater["argyle crewneck sweater"] = /obj/item/clothing/accessory/sweaterargylecrewneck + sweater["argyle v-neck sweater"] = /obj/item/clothing/accessory/sweaterargylevneck + sweater["argyle sweater vest"] = /obj/item/clothing/accessory/sweatervestargyle + sweater["argyle turtleneck sweater"] = /obj/item/clothing/accessory/sweaterargyleturtleneck sweater["argyle tubeneck sweater"] = /obj/item/clothing/accessory/sweaterargyletubeneck gear_tweaks += new/datum/gear_tweak/path(sweater) @@ -173,9 +203,11 @@ ..() var/shirt = list() shirt["dress shirt"] = /obj/item/clothing/accessory/dressshirt - shirt["dress shirt, rolled up"] = /obj/item/clothing/accessory/dressshirt_r - shirt["dress shirt, cropped"] = /obj/item/clothing/accessory/dressshirt_crop - shirt["cropped dress shirt, rolled up"] = /obj/item/clothing/accessory/dressshirt_crop_r + shirt["dress shirt, rolled up"] = /obj/item/clothing/accessory/dressshirt/rolled + shirt["dress shirt, cropped"] = /obj/item/clothing/accessory/dressshirt/crop + shirt["cropped dress shirt, rolled up"] = /obj/item/clothing/accessory/dressshirt/crop/rolled + shirt["dress shirt, alt"] = /obj/item/clothing/accessory/dressshirt/alt + shirt["dress shirt, alt rolled up"] = /obj/item/clothing/accessory/dressshirt/alt/rolled shirt["long-sleeved shirt"] = /obj/item/clothing/accessory/longsleeve shirt["long-sleeved shirt, black striped"] = /obj/item/clothing/accessory/longsleeve_s shirt["long-sleeved shirt, blue striped"] = /obj/item/clothing/accessory/longsleeve_sb @@ -244,7 +276,7 @@ /datum/gear/accessory/detbadge display_name = "badge, investigations" - path = /obj/item/clothing/accessory/badge/dia + path = /obj/item/clothing/accessory/badge/investigator allowed_roles = list("Investigator") /datum/gear/accessory/badge @@ -270,7 +302,7 @@ flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION /datum/gear/accessory/scc_patch - display_name = "Stellar Corporate Conglomerate sleeve patch" + display_name = "stellar corporate conglomerate sleeve patch" path = /obj/item/clothing/accessory/sleevepatch/scc flags = 0 @@ -293,21 +325,38 @@ gadpathur["medical cadre brassard"] = /obj/item/clothing/accessory/armband/gadpathur/med gear_tweaks += new/datum/gear_tweak/path(gadpathur) -/datum/gear/accessory/dominia/sash - display_name = "dominian house sash selection" - description = "A selection of sashes representing the Great Houses of Dominia." - path = /obj/item/clothing/accessory/dominia/sash +/datum/gear/accessory/gadpathur_leader + display_name = "gadpathurian section leader badge" + description = "A small metal badge worn by Gadpathurian Section Leaders." + path = /obj/item/clothing/accessory/gadpathurian_leader + flags = GEAR_HAS_DESC_SELECTION -/datum/gear/accessory/dominia/sash/New() +/datum/gear/accessory/gadpathur_dogtags + display_name = "gadpathurian dogtags" + description = "Dogtags issued to Gadpathurians." + path = /obj/item/clothing/accessory/dogtags/gadpathur + flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/accessory/sash_coloured + display_name = "sash (colourable)" + path = /obj/item/clothing/accessory/sash/colourable + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + +/datum/gear/accessory/sash + display_name = "sash selection" + description = "A selection of sashes in various colours." + path = /obj/item/clothing/accessory/sash + +/datum/gear/accessory/sash/New() ..() - var/dominia = list() - dominia["dominian sash"] = /obj/item/clothing/accessory/dominia/sash - dominia["strelitz sash"] = /obj/item/clothing/accessory/dominia/sash/strelitz - dominia["volvalaad sash"] = /obj/item/clothing/accessory/dominia/sash/volvalaad - dominia["kazhkz sash"] = /obj/item/clothing/accessory/dominia/sash/kazhkz - dominia["caladius sash"] = /obj/item/clothing/accessory/dominia/sash/caladius - dominia["zhao sash"] =/obj/item/clothing/accessory/dominia/sash/zhao - gear_tweaks += new/datum/gear_tweak/path(dominia) + var/sash = list() + sash["yellow sash"] = /obj/item/clothing/accessory/sash + sash["red sash"] = /obj/item/clothing/accessory/sash/red + sash["blue sash"] = /obj/item/clothing/accessory/sash/blue + sash["orange sash"] = /obj/item/clothing/accessory/sash/orange + sash["purple sash"] = /obj/item/clothing/accessory/sash/purple + sash["white sash"] =/obj/item/clothing/accessory/sash/white + gear_tweaks += new/datum/gear_tweak/path(sash) /datum/gear/accessory/passcard display_name = "human passcard selection" @@ -349,3 +398,32 @@ passport["passport, dominia"] = /obj/item/clothing/accessory/badge/passport/dominia passport["passport, coalition"] = /obj/item/clothing/accessory/badge/passport/coc gear_tweaks += new/datum/gear_tweak/path(passport) + +/datum/gear/accessory/TCFLcard + display_name = "TCFL service cards" + description = "Identification cards given to active and former members of the Tau Ceti Foreign Legion." + path = /obj/item/clothing/accessory/badge/tcfl_papers + +/datum/gear/accessory/TCFLcard/New() + ..() + var/TCFLcard = list() + TCFLcard["active service"] = /obj/item/clothing/accessory/badge/tcfl_papers/service + TCFLcard["veteran"] = /obj/item/clothing/accessory/badge/tcfl_papers/service/veteran + gear_tweaks += new/datum/gear_tweak/path(TCFLcard) + +/datum/gear/accessory/kneepads + display_name = "kneepads" + path = /obj/item/clothing/accessory/kneepads + +/datum/gear/accessory/blood_patch + display_name = "blood patch selection" + description = "An embroidered patch indicating the wearer's blood type." + path = /obj/item/clothing/accessory/blood_patch + +/datum/gear/accessory/blood_patch/New() + ..() + var/list/patches = list() + for(var/type in typesof(/obj/item/clothing/accessory/blood_patch)) + var/obj/item/clothing/accessory/blood_patch/BP = type + patches[initial(BP.name)] = type + gear_tweaks += new /datum/gear_tweak/path(patches) diff --git a/code/modules/client/preference_setup/loadout/loadout_belt.dm b/code/modules/client/preference_setup/loadout/loadout_belt.dm index 4d157c101c5..0f693de8241 100644 --- a/code/modules/client/preference_setup/loadout/loadout_belt.dm +++ b/code/modules/client/preference_setup/loadout/loadout_belt.dm @@ -3,7 +3,7 @@ path = /obj/item/storage/belt/generic slot = slot_belt sort_category = "Belts" - flags = GEAR_HAS_COLOR_SELECTION + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION /datum/gear/belt/fannypack display_name = "fannypack" @@ -14,5 +14,5 @@ display_name = "tool-belt, alt" cost = 0 path = /obj/item/storage/belt/utility/alt - allowed_roles = list("Station Engineer", "Atmospheric Technician", "Chief Engineer", "Engineering Apprentice", "Roboticist") + allowed_roles = list("Station Engineer", "Atmospheric Technician", "Chief Engineer", "Engineering Apprentice", "Roboticist", "Research Director") flags = null diff --git a/code/modules/client/preference_setup/loadout/loadout_computer.dm b/code/modules/client/preference_setup/loadout/loadout_computer.dm index 631618e6536..e86b768681b 100644 --- a/code/modules/client/preference_setup/loadout/loadout_computer.dm +++ b/code/modules/client/preference_setup/loadout/loadout_computer.dm @@ -1,47 +1,44 @@ /datum/gear/computer - display_name = "tablet" - path = /obj/item/modular_computer/handheld/custom_loadout/cheap + display_name = "laptop computer" + path = /obj/item/modular_computer/laptop/preset/loadout sort_category = "Modular Computers" cost = 2 -/datum/gear/computer/laptop - display_name = "laptop computer" - path = /obj/item/modular_computer/laptop/preset - cost = 3 +/datum/gear/computer/handheld/tablet + display_name = "tablet" + path = /obj/item/modular_computer/handheld/preset -/datum/gear/computer/handheld/wristbound - display_name = "wristbound computer" - path = /obj/item/modular_computer/handheld/wristbound/preset/cheap/generic +/datum/gear/computer/handheld/tablet/New() + ..() + var/tablets = list() + tablets["generic tablet"] = /obj/item/modular_computer/handheld/preset/generic + tablets["janitor tablet"] = /obj/item/modular_computer/handheld/preset/civilian/janitor + tablets["cargo tablet"] = /obj/item/modular_computer/handheld/preset/supply + tablets["engineering tablet"] = /obj/item/modular_computer/handheld/preset/engineering + tablets["atmos tablet"] = /obj/item/modular_computer/handheld/preset/engineering/atmos + tablets["medical tablet"] =/obj/item/modular_computer/handheld/preset/medical + tablets["security tablet"] = /obj/item/modular_computer/handheld/preset/security + tablets["investigation tablet"] = /obj/item/modular_computer/handheld/preset/security/detective + tablets["research tablet"] = /obj/item/modular_computer/handheld/preset/research + tablets["robotics tablet"] = /obj/item/modular_computer/handheld/preset/research/robotics + gear_tweaks += new/datum/gear_tweak/path(tablets) -/datum/gear/computer/handheld/wristbound/cargo - display_name = "wristbound computer (Cargo)" - path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/cargo - allowed_roles = list("Cargo Technician", "Shaft Miner", "Quartermaster") +/datum/gear/computer/handheld/wristbound/selection + display_name = "wristbound computer selection" + path = /obj/item/modular_computer/handheld/wristbound/preset -/datum/gear/computer/handheld/wristbound/engineering - display_name = "wristbound computer (Engineering)" - path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/engineering - allowed_roles = list("Station Engineer", "Engineering Apprentince", "Atmospheric Technician", "Engineering Apprentice") - -/datum/gear/computer/handheld/wristbound/medical - display_name = "wristbound computer (Medical)" - path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/medical - allowed_roles = list("Physician", "Surgeon", "Medical Intern", "Pharmacist", "Psychiatrist", "First Responder") - -/datum/gear/computer/handheld/wristbound/security - display_name = "wristbound computer (Security)" - path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/security - allowed_roles = list("Security Officer", "Warden", "Security Cadet") - -/datum/gear/computer/handheld/wristbound/security/investigations - display_name = "wristbound computer (Security Investigations)" - path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/security/investigations - allowed_roles = list("Investigator") - -/datum/gear/computer/handheld/wristbound/security/research - display_name = "wristbound computer (Research)" - path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/research - allowed_roles = list("Scientist", "Lab Assistant", "Roboticist", "Xenobiologist") +/datum/gear/computer/handheld/wristbound/selection/New() + ..() + var/wristbounds = list() + wristbounds["cheap generic wristbound"] = /obj/item/modular_computer/handheld/wristbound/preset/cheap/generic + wristbounds["expensive generic wristbound"] = /obj/item/modular_computer/handheld/wristbound/preset/advanced/generic + wristbounds["cargo wristbound"] = /obj/item/modular_computer/handheld/wristbound/preset/advanced/cargo + wristbounds["engineering wristbound"] = /obj/item/modular_computer/handheld/wristbound/preset/advanced/engineering + wristbounds["medical wristbound"] = /obj/item/modular_computer/handheld/wristbound/preset/advanced/medical + wristbounds["security wristbound"] = /obj/item/modular_computer/handheld/wristbound/preset/advanced/security + wristbounds["investigation wristbound"] = /obj/item/modular_computer/handheld/wristbound/preset/advanced/security/investigations + wristbounds["research wristbound"] = /obj/item/modular_computer/handheld/wristbound/preset/advanced/research + gear_tweaks += new/datum/gear_tweak/path(wristbounds) /datum/gear/computer/handheld/wristbound/ce display_name = "wristbound computer (Chief Engineer)" diff --git a/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm b/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm index 2747bd59b5f..4bc6d29fa44 100644 --- a/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm +++ b/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm @@ -1,7 +1,12 @@ /datum/gear/cosmetic - display_name = "purple comb" + display_name = "handheld mirror" + path = /obj/item/mirror + sort_category = "Cosmetics" + +/datum/gear/cosmetic/haircomb + display_name = "comb" path = /obj/item/haircomb - sort_category = "Cosmetics" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION /datum/gear/cosmetic/lipstick display_name = "lipstick selection" @@ -30,6 +35,3 @@ gear_tweaks += new/datum/gear_tweak/path(lipsticks) -/datum/gear/cosmetic/mirror - display_name = "handheld mirror" - path = /obj/item/mirror diff --git a/code/modules/client/preference_setup/loadout/loadout_ears.dm b/code/modules/client/preference_setup/loadout/loadout_ears.dm index 8bae8bd4d6d..ecd8e379f16 100644 --- a/code/modules/client/preference_setup/loadout/loadout_ears.dm +++ b/code/modules/client/preference_setup/loadout/loadout_ears.dm @@ -1,9 +1,14 @@ /datum/gear/ears - display_name = "earmuffs" - path = /obj/item/clothing/ears/earmuffs + display_name = "earwear, circuitry (empty)" + path = /obj/item/clothing/ears/circuitry sort_category = "Earwear" slot = slot_r_ear +/datum/gear/ears/double + display_name = "earmuffs" + path = /obj/item/clothing/ears/earmuffs + slot = null + /datum/gear/ears/bandanna display_name = "neck bandanna selection" path = /obj/item/clothing/ears/bandanna @@ -21,14 +26,10 @@ path = /obj/item/clothing/ears/bandanna_colorable flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION -/datum/gear/ears/headphones +/datum/gear/ears/double/headphones display_name = "headphones" path = /obj/item/clothing/ears/earmuffs/headphones -/datum/gear/ears/circuitry - display_name = "earwear, circuitry (empty)" - path = /obj/item/clothing/ears/circuitry - /datum/gear/ears/earrings display_name = "earring selection" description = "A selection of eye-catching earrings." diff --git a/code/modules/client/preference_setup/loadout/loadout_factions.dm b/code/modules/client/preference_setup/loadout/loadout_factions.dm index dc890f75bd6..4020c5d1833 100644 --- a/code/modules/client/preference_setup/loadout/loadout_factions.dm +++ b/code/modules/client/preference_setup/loadout/loadout_factions.dm @@ -39,6 +39,11 @@ path = /obj/item/clothing/accessory/badge/passcard/sol/silversun faction = "Idris Incorporated" +/datum/gear/faction/idris_rag + display_name = "idris advanced service cloth" + path = /obj/item/reagent_containers/glass/rag/advanced/idris + faction = "Idris Incorporated" + /datum/gear/faction/zavodskoi_beret display_name = "black zavodskoi beret" path = /obj/item/clothing/head/beret/security/zavodskoi diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm index 0189fc00c5e..d6604056cba 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general.dm @@ -2,13 +2,14 @@ display_name = "cane" path = /obj/item/cane -/datum/gear/cane/crutch - display_name = "crutch" - path = /obj/item/cane/crutch - -/datum/gear/cane/white - display_name = "white cane" - path = /obj/item/cane/white +/datum/gear/cane/New() + ..() + var/list/cane = list() + cane["cane"] = /obj/item/cane + cane["telescopic cane"] = /obj/item/cane/telecane + cane["crutch"] = /obj/item/cane/crutch + cane["white cane"] = /obj/item/cane/white + gear_tweaks += new /datum/gear_tweak/path(cane) /datum/gear/dice display_name = "pack of dice" @@ -89,7 +90,49 @@ lunchboxes[initial(lunchbox.name)] = lunchbox_type sortTim(lunchboxes, /proc/cmp_text_asc) gear_tweaks += new/datum/gear_tweak/path(lunchboxes) - gear_tweaks += new/datum/gear_tweak/contents(lunchables_lunches(), lunchables_snacks(), lunchables_drinks()) + gear_tweaks += new/datum/gear_tweak/contents(lunchables_lunches(), lunchables_snacks(), lunchables_drinks(), lunchables_utensil()) + +/datum/gear/coffeecup + display_name = "coffee cups" + description = "A coffee cup in various designs." + cost = 1 + path = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup + +/datum/gear/coffeecup/New() + ..() + var/coffeecups = list() + coffeecups["plain coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup + coffeecups["sol coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/sol + coffeecups["dominian coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/dom + coffeecups["NKA coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/nka + coffeecups["PRA coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/pra + coffeecups["DPRA coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/metal/dpra + coffeecups["NT coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/nt + coffeecups["TCFL coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tcfl + coffeecups["#1 coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/one + coffeecups["#1 monkey coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/puni + coffeecups["heart coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/heart + coffeecups["pawn coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/pawn + coffeecups["diona coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/diona + coffeecups["british coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/britcup + coffeecups["black coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/black + coffeecups["green coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/green + coffeecups["dark green coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/green/dark + coffeecups["rainbow coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/rainbow + coffeecups["metal coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/metal + coffeecups["glass coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/glass + coffeecups["tall coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tall + coffeecups["tall black coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tall/black + coffeecups["tall metal coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tall/metal + coffeecups["tall rainbow coffee cup"] = /obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tall/rainbow + gear_tweaks += new/datum/gear_tweak/path(coffeecups) + gear_tweaks += new/datum/gear_tweak/reagents(lunchables_drink_reagents()) + +/datum/gear/coffeecup/spawn_item(var/location, var/metadata) + . = ..() + var/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/spawned_cup = . + if(istype(spawned_cup) && spawned_cup.reagents) + spawned_cup.reagents.set_temperature(T0C + 45) /datum/gear/banner display_name = "banner selection" @@ -176,6 +219,11 @@ path = /obj/item/towel flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION +/datum/gear/handkerchief + display_name = "handkerchief" + path = /obj/item/reagent_containers/glass/rag/handkerchief + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + /datum/gear/gameboard display_name = "holo board game" path = /obj/item/board @@ -191,6 +239,7 @@ /datum/gear/plushie display_name = "plushie selection" + description = "A selection of plush toys." path = /obj/item/toy/plushie /datum/gear/plushie/New() @@ -210,6 +259,11 @@ plushies["plushie, cool schlorrgo"] = /obj/item/toy/plushie/coolschlorrgo plushies["plushie, slime"] = /obj/item/toy/plushie/slime plushies["plushie, penny"] = /obj/item/toy/plushie/pennyplush + plushies["plushie, greimorian"] = /obj/item/toy/plushie/greimorian + plushies["plushie, Axic"] = /obj/item/toy/plushie/axic + plushies["plushie, Qill"] = /obj/item/toy/plushie/qill + plushies["plushie, Xana"] = /obj/item/toy/plushie/xana + plushies["plushie, Aphy"] = /obj/item/toy/plushie/ipc gear_tweaks += new/datum/gear_tweak/path(plushies) /datum/gear/toothpaste @@ -228,3 +282,20 @@ display_name = "photo" path = /obj/item/photo flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION + +/datum/gear/photo_album + display_name = "photo album" + path = /obj/item/storage/photo_album + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION + +/datum/gear/knitting_set + display_name = "knitting set" + path = /obj/item/storage/box/knitting + description = "A box of knitting supplies." + flags = null + +/datum/gear/yarn_box + display_name = "knitting supplies" + path = /obj/item/storage/box/yarn + description = "A box containing yarn." + flags = null \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index 3b14802e748..94d283f92cd 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -321,6 +321,9 @@ var/gadpathur = list() gadpathur["gadpathurian sidecap"] = /obj/item/clothing/head/gadpathur gadpathur["gadpathurian beret"] = /obj/item/clothing/head/beret/gadpathur + gadpathur["gadpathurian engineer beret"] = /obj/item/clothing/head/beret/gadpathur/engineer + gadpathur["gadpathurian medical beret"] = /obj/item/clothing/head/beret/gadpathur/medical + gadpathur["gadpathurian turban"] = /obj/item/clothing/head/turban/gadpathur gear_tweaks += new/datum/gear_tweak/path(gadpathur) /datum/gear/head/dominia diff --git a/code/modules/client/preference_setup/loadout/loadout_religion.dm b/code/modules/client/preference_setup/loadout/loadout_religion.dm index d8cf691d9fc..3fa18d86b11 100644 --- a/code/modules/client/preference_setup/loadout/loadout_religion.dm +++ b/code/modules/client/preference_setup/loadout/loadout_religion.dm @@ -9,9 +9,18 @@ path = /obj/item/clothing/mask/trinary_mask /datum/gear/religion/trinary/cape - display_name = "trinary perfection cape" + display_name = "trinary perfection cape selection" + description = "A selection of capes worn by adherents to the Trinary Perfection." path = /obj/item/clothing/accessory/poncho/trinary +/datum/gear/religion/trinary/cape/New() + ..() + var/trinarycape = list() + trinarycape["trinary perfection cape"] = /obj/item/clothing/accessory/poncho/trinary + trinarycape["trinary perfection shoulder cape"] = /obj/item/clothing/accessory/poncho/trinary/shouldercape + trinarycape["trinary perfection pellegrina"] = /obj/item/clothing/accessory/poncho/trinary/pellegrina + gear_tweaks += new/datum/gear_tweak/path(trinarycape) + /datum/gear/religion/trinary/badge display_name = "trinary perfection brooch" path = /obj/item/clothing/accessory/badge/trinary @@ -65,6 +74,11 @@ display_name = "tribunal necklace" path = "/obj/item/clothing/accessory/dominia" +/datum/gear/religion/dominia/medical + display_name = "tribunalist medical beret" + path = /obj/item/clothing/head/beret/dominia/medical + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "First Responder", "Medical Intern") + /datum/gear/religion/shaman_staff display_name = "shaman staff" path = /obj/item/cane/shaman diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes.dm b/code/modules/client/preference_setup/loadout/loadout_shoes.dm index 1d143bc16c3..e08d8774660 100644 --- a/code/modules/client/preference_setup/loadout/loadout_shoes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_shoes.dm @@ -5,6 +5,10 @@ slot = slot_shoes sort_category = "Shoes and Footwear" +/datum/gear/shoes/New() + ..() + gear_tweaks += list(gear_tweak_shoe_layer) + /datum/gear/shoes/color display_name = "shoe selection" path = /obj/item/clothing/shoes/black @@ -121,4 +125,28 @@ /datum/gear/shoes/clog display_name = "plastic clogs" path = /obj/item/clothing/shoes/sandal/clogs - flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION \ No newline at end of file + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + +/* + Shoe Layer Adjustment +*/ +var/datum/gear_tweak/shoe_layer/gear_tweak_shoe_layer = new() + +/datum/gear_tweak/shoe_layer/get_contents(var/metadata) + return "Shoe Layer: [metadata] Uniform" + +/datum/gear_tweak/shoe_layer/get_default() + return "Over" + +/datum/gear_tweak/shoe_layer/get_metadata(var/user, var/metadata) + return input(user, "Choose whether you want the shoe to go over or under the uniform.", "Shoe Layer", metadata) as anything in list("Over", "Under") + +/datum/gear_tweak/shoe_layer/tweak_item(var/obj/item/clothing/shoes/S, var/metadata) + if(!istype(S)) + return + if(S.shoes_under_pants == -1) + return + if(metadata == "Over") + S.shoes_under_pants = FALSE + else + S.shoes_under_pants = TRUE \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_smoking.dm b/code/modules/client/preference_setup/loadout/loadout_smoking.dm index bbc5280c853..c3f460bde8c 100644 --- a/code/modules/client/preference_setup/loadout/loadout_smoking.dm +++ b/code/modules/client/preference_setup/loadout/loadout_smoking.dm @@ -11,17 +11,20 @@ ..() var/zippolighters = list() zippolighters["regular zippo"] = /obj/item/flame/lighter/zippo + zippolighters["nanotrasen zippo"] = /obj/item/flame/lighter/zippo/nt zippolighters["black zippo"] = /obj/item/flame/lighter/zippo/black zippolighters["black cross zippo"] = /obj/item/flame/lighter/zippo/black/cross zippolighters["golden zippo"] = /obj/item/flame/lighter/zippo/gold zippolighters["royal zippo"] = /obj/item/flame/lighter/zippo/royal zippolighters["dominian zippo"] = /obj/item/flame/lighter/zippo/dominia + zippolighters["fisanduhian zippo"] = /obj/item/flame/lighter/zippo/fisanduh zippolighters["coalition zippo"] = /obj/item/flame/lighter/zippo/coalition zippolighters["solarian zippo"] = /obj/item/flame/lighter/zippo/sol zippolighters["bieselite zippo"] = /obj/item/flame/lighter/zippo/tcfl zippolighters["himeo zippo"] = /obj/item/flame/lighter/zippo/himeo zippolighters["europan zippo"] = /obj/item/flame/lighter/zippo/europa zippolighters["gadpathurian zippo"] = /obj/item/flame/lighter/zippo/gadpathur + zippolighters["luceian zippo"] = /obj/item/flame/lighter/zippo/luceian zippolighters["asoral jet lighter"] = /obj/item/flame/lighter/zippo/asoral gear_tweaks += new/datum/gear_tweak/path(zippolighters) diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 7048007c572..fa9f2508fc3 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -14,6 +14,11 @@ cost = 2 flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION +datum/gear/suit/colorvest + display_name = "colorable vest" + path = /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless/colorable + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + /datum/gear/suit/leather display_name = "jacket selection" description = "A selection of jackets." @@ -156,10 +161,17 @@ flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION /datum/gear/suit/blazer - display_name = "blazer" + display_name = "blazer selection" path = /obj/item/clothing/suit/storage/toggle/suitjacket/blazer flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION +/datum/gear/suit/blazer/New() + ..() + var/list/blazers = list() + blazers["blazer"] = /obj/item/clothing/suit/storage/toggle/suitjacket/blazer + blazers["long blazer"] = /obj/item/clothing/suit/storage/toggle/suitjacket/blazer/long + gear_tweaks += new /datum/gear_tweak/path(blazers) + /datum/gear/suit/trenchcoats display_name = "trenchcoat selection" description = "A selection of trenchcoats." @@ -296,7 +308,6 @@ coat["dominia great coat, red"] = /obj/item/clothing/suit/storage/toggle/dominia coat["dominia great coat, gold"] = /obj/item/clothing/suit/storage/toggle/dominia/gold coat["dominia great coat, black"] = /obj/item/clothing/suit/storage/toggle/dominia/black - coat["dominian bomber jacket"] = /obj/item/clothing/suit/storage/toggle/dominia/bomber gear_tweaks += new/datum/gear_tweak/path(coat) /datum/gear/suit/dominia/consular @@ -305,6 +316,11 @@ path = /obj/item/clothing/suit/storage/dominia/consular allowed_roles = list("Consular Officer") +/datum/gear/suit/fisanduhian_bomber + display_name = "fisanduhian bomber jacket" + path = /obj/item/clothing/suit/storage/toggle/dominia/bomber + flags = GEAR_HAS_DESC_SELECTION + /datum/gear/suit/tcfl display_name = "Tau Ceti Foreign Legion jacket selection" description = "A selection of fine, surplus jackets of the Foreign Legion." @@ -414,6 +430,15 @@ flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION /datum/gear/suit/gadpathur - display_name = "gadpathurian overcoat" + display_name = "gadpathurian coat selection" path = /obj/item/clothing/suit/storage/gadpathur - flags = GEAR_HAS_DESC_SELECTION \ No newline at end of file + flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/suit/gadpathur/New() + ..() + var/gadpathur_coat = list() + gadpathur_coat["gadpathurian overcoat"] = /obj/item/clothing/suit/storage/gadpathur + gadpathur_coat["gadpathurian trenchcoat"] = /obj/item/clothing/suit/storage/toggle/trench/gadpathur + gadpathur_coat["gadpathurian leather coat"] = /obj/item/clothing/suit/storage/toggle/trench/gadpathur/leather + gadpathur_coat["thermal coat"] = /obj/item/clothing/suit/storage/toggle/leather_jacket/gadpathur + gear_tweaks += new/datum/gear_tweak/path(gadpathur_coat) diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index d8bde7020e2..c0ba5235e8e 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -194,7 +194,8 @@ gear_tweaks += new/datum/gear_tweak/path(pants) /datum/gear/uniform/colorpants - display_name = "pants (recolorable)" + display_name = "pants selection (recolorable)" + description = "A selection of recolourable pants." path = /obj/item/clothing/under/pants/dress flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION @@ -202,7 +203,10 @@ ..() var/list/colorpants = list() colorpants["dress pants"] = /obj/item/clothing/under/pants/dress + colorpants["dress pants, with belt"] = /obj/item/clothing/under/pants/dress/belt colorpants["striped pants"] = /obj/item/clothing/under/pants/striped + colorpants["tailored jeans"] = /obj/item/clothing/under/pants/tailoredjeans + colorpants["mustang jeans"] = /obj/item/clothing/under/pants/musthangcolour gear_tweaks += new/datum/gear_tweak/path(colorpants) /datum/gear/uniform/turtleneck @@ -220,7 +224,6 @@ var/list/suit = list() suit["dominia suit, red"] = /obj/item/clothing/under/dominia suit["dominia suit, black"] = /obj/item/clothing/under/dominia/black - suit["dominia sweater"] = /obj/item/clothing/under/dominia/sweater suit["lyodsuit"] = /obj/item/clothing/under/dominia/lyodsuit suit["hoodied lyodsuit"] = /obj/item/clothing/under/dominia/lyodsuit/hoodie suit["dominia noblewoman dress"] = /obj/item/clothing/under/dominia/dress @@ -253,6 +256,11 @@ consular["dominian consular officer's uniform, feminine"] = /obj/item/clothing/under/dominia/consular/dress gear_tweaks += new/datum/gear_tweak/path(consular) +/datum/gear/uniform/fisanduhian_sweater + display_name = "fisanduhian sweater" + path = /obj/item/clothing/under/dominia/sweater + flags = GEAR_HAS_DESC_SELECTION + /datum/gear/uniform/elyra_holo display_name = "elyran holographic suit selection" description = "A marvel of Elyran technology, uses hardlight fabric and masks to transform a skin-tight, cozy suit into cultural apparel of your choosing. Has a dial for Midenean, Aemaqii and Persepolis clothes respectively." @@ -361,3 +369,8 @@ display_name = "gadpathurian fatigues" path = /obj/item/clothing/under/uniform/gadpathur flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/uniform/miscellaneous/qipao + display_name = "qipao" + path = /obj/item/clothing/under/qipao + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index 4036c8e850c..b7af973007d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -22,6 +22,12 @@ path = /obj/item/storage/secure/briefcase cost = 2 +/datum/gear/utility/purse + display_name = "Purse" + description = "A small, fashionable bag typically worn over the shoulder." + path = /obj/item/storage/backpack/satchel/pocketbook/purse + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + /datum/gear/utility/folder display_name = "folders" path = /obj/item/folder @@ -112,4 +118,24 @@ cards["business card, rounded"] = /obj/item/paper/business_card/rounded cards["business card, glass"] = /obj/item/paper/business_card/glass gear_tweaks += new /datum/gear_tweak/path(cards) - gear_tweaks += new /datum/gear_tweak/paper_data() \ No newline at end of file + gear_tweaks += new /datum/gear_tweak/paper_data() + +/datum/gear/utility/pills + display_name = "pill bottle selection" + description = "A selection of prescription pill. NOTICE: most of these are considered contraband if possessed without the relevant prescription noted in the medical records." + path = /obj/item/reagent_containers/pill + +/datum/gear/utility/pills/New() + ..() + var/list/pills = list() + pills["Emoxanyl"] = /obj/item/storage/pill_bottle/emoxanyl + pills["Minaphobin"] = /obj/item/storage/pill_bottle/minaphobin/small + pills["Neurostabin "] = /obj/item/storage/pill_bottle/neurostabin + pills["Orastabin"] = /obj/item/storage/pill_bottle/orastabin + pills["Parvosil"] = /obj/item/storage/pill_bottle/parvosil + gear_tweaks += new /datum/gear_tweak/path(pills) + +/datum/gear/utility/buddy_tag + display_name = "buddy tag" + path = /obj/item/clothing/accessory/buddytag + cost = 2 \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/machine.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/machine.dm index e6f8ceee433..8071933c66d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/machine.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/machine.dm @@ -100,7 +100,7 @@ /datum/gear/suit/idris display_name = "Idris Unit coats" - path = /obj/item/clothing/suit/armor/vest/idris + path = /obj/item/clothing/suit/storage/toggle/armor/vest/idris whitelisted = list(SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL) sort_category = "Xenowear - IPC" allowed_roles = list("Security Officer", "Warden", "Head of Security", "Investigator", "Security Cadet") @@ -109,12 +109,18 @@ /datum/gear/suit/idris/New() ..() var/idris = list() - idris["Black Idris Unit coat"] = /obj/item/clothing/suit/armor/vest/idris - idris["Brown Idris Unit coat"] = /obj/item/clothing/suit/armor/vest/idris/brown - idris["Black Idris Unit trench coat"] = /obj/item/clothing/suit/armor/vest/idris/trenchcoat/black - idris["Brown Idris Unit trench coat"] = /obj/item/clothing/suit/armor/vest/idris/trenchcoat/brown - idris["Black Idris Unit duster coat"] = /obj/item/clothing/suit/armor/vest/idris/duster/black - idris["Brown Idris Unit duster coat"] = /obj/item/clothing/suit/armor/vest/idris/duster/brown + idris["black Idris Unit coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris + idris["white Idris Unit coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/white + idris["brown Idris Unit coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/brown + idris["black Idris Unit long coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/longcoat + idris["white Idris Unit long coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/longcoat/white + idris["brown Idris Unit long coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/longcoat/brown + idris["black Idris Unit trench coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/trenchcoat + idris["white Idris Unit trench coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/trenchcoat/white + idris["brown Idris Unit trench coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/trenchcoat/brown + idris["black Idris Unit duster coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/duster + idris["white Idris Unit duster coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/duster/white + idris["brown Idris Unit duster coat"] = /obj/item/clothing/suit/storage/toggle/armor/vest/idris/duster/brown gear_tweaks += new/datum/gear_tweak/path(idris) /datum/gear/uniform/goldendeep diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/skrell.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/skrell.dm index 9e19662fed4..b5cca02fb3c 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/skrell.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/skrell.dm @@ -107,4 +107,60 @@ display_name = "skrell gill cover" path = /obj/item/clothing/mask/breath/skrell whitelisted = list(SPECIES_SKRELL) - sort_category = "Xenowear - Skrell" \ No newline at end of file + sort_category = "Xenowear - Skrell" + +/datum/gear/ears/skrell/scrunchy + display_name = "tentacle tie" + path = /obj/item/clothing/ears/skrell/scrunchy + whitelisted = list(SPECIES_SKRELL) + sort_category = "Xenowear - Skrell" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + +/datum/gear/accessory/skrell_passport + display_name = "jargon federation passport" + path = /obj/item/clothing/accessory/badge/passport/jargon + sort_category = "Xenowear - Skrell" + whitelisted = list(SPECIES_SKRELL, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_WORKER, SPECIES_DIONA) + cost = 0 + flags = 0 + +/datum/gear/accessory/skrell_passport/New() + . = ..() + gear_tweaks += list(social_credit_tweak) + +// the whitelisted list ensures only people with skrell, vaurca, or diona whitelists can reach this check +/datum/gear/accessory/skrell_passport/check_species_whitelist(mob/living/carbon/human/H) + var/static/list/species_list = list(SPECIES_SKRELL, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_BREEDER, SPECIES_DIONA) + if(H.species.name in species_list) + return TRUE + return FALSE + +/datum/gear/accessory/skrell_passport/spawn_item(location, metadata, mob/living/carbon/human/H) + var/obj/item/clothing/accessory/badge/passport/jargon/J = ..() + var/static/list/species_name_to_tag = list(SPECIES_SKRELL = "_s", SPECIES_VAURCA_WARRIOR = "_v", SPECIES_VAURCA_WORKER = "_v", SPECIES_VAURCA_BREEDER = "_v", SPECIES_DIONA = "_d") + var/tag = species_name_to_tag[H.species.name] + if(tag) + J.species_tag = tag + return J + +/* + Skrellian Social Score +*/ +var/datum/gear_tweak/social_credit/social_credit_tweak = new() + +datum/gear_tweak/social_credit/get_contents(var/metadata) + return "Social Credit Score: [metadata]" + +datum/gear_tweak/social_credit/get_default() + return 5 + +datum/gear_tweak/social_credit/get_metadata(var/user, var/metadata) + var/credit_score = input(user, "Set the credit score your passport will display, refer to the wiki to gauge it. (It will be slightly randomized to simulate Jargon calculations.)", "Social Credit Score") as null|num + if(credit_score) + return round(credit_score, 0.01) + return metadata + +datum/gear_tweak/social_credit/tweak_item(var/obj/item/clothing/accessory/badge/passport/jargon/PP, var/metadata) + if(!istype(PP)) + return + PP.credit_score = metadata + pick(-0.01, 0, 0.01) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm index d1d64d172cd..b295ff7573a 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm @@ -196,7 +196,7 @@ circlet["silver dress circlet"] = /obj/item/clothing/head/tajaran/circlet/silver circlet["fur hat"] = /obj/item/clothing/head/tajaran/fur circlet["matake priest hat"] = /obj/item/clothing/head/tajaran/matake - circlet["Raakti Shariim beret"] = /obj/item/clothing/head/beret/tajaran/raakti_shariim + circlet["raakti shariim beret"] = /obj/item/clothing/head/beret/tajaran/raakti_shariim gear_tweaks += new/datum/gear_tweak/path(circlet) /datum/gear/accessory/tajara_wrap @@ -264,6 +264,22 @@ card["honorary party member card"] = /obj/item/clothing/accessory/badge/hadii_card card["almariist pin"] = /obj/item/clothing/accessory/dpra_badge card["royalist badge"] = /obj/item/clothing/accessory/nka_badge + card["free tajaran council badge"] = /obj/item/clothing/accessory/tajara/council_badge + gear_tweaks += new/datum/gear_tweak/path(card) + +/datum/gear/accessory/tajaranbooks + display_name = "tajaran political books" + path = /obj/item/book/manual/pra_manifesto + sort_category = "Xenowear - Tajara" + whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) + flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/accessory/tajaranbooks/New() + ..() + var/card = list() + card["hadiist manifesto"] = /obj/item/book/manual/pra_manifesto + card["in defense of al'mari's legacy"] = /obj/item/book/manual/dpra_manifesto + card["the new kingdom"] = /obj/item/book/manual/nka_manifesto gear_tweaks += new/datum/gear_tweak/path(card) /datum/gear/tajaran_passports @@ -301,3 +317,19 @@ sort_category = "Xenowear - Tajara" whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/utility/himeo_kit/tajara + display_name = "tajaran himean voidsuit kit" + description = "A simple cardboard box containing the requisition forms, permits, and decal kits for a Himean voidsuit fitted for Tajara. Only \ + Tajara connected to Himeo and the Free Tajaran Council would have this." + path = /obj/item/voidsuit_modkit/himeo/tajara + sort_category = "Xenowear - Tajara" + whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) + allowed_roles = list("Cargo Technician", "Shaft Miner", "Quartermaster", "Head of Personnel", "Station Engineer", "Atmospheric Technician", "Chief Engineer", "Engineering Apprentice") + +/datum/gear/tajaran_tarot + display_name = "adhomian divination cards deck" + path = /obj/item/deck/tarot/adhomai + sort_category = "Xenowear - Tajara" + whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) + flags = GEAR_HAS_DESC_SELECTION diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm index aa0adde915b..011c152b578 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm @@ -1,9 +1,20 @@ /datum/gear/suit/unathi_mantle - display_name = "hide mantle" + display_name = "hide mantle selection" + description = "A selection of hide mantles, one for each of the desert, forest, and mountainous \ + regions of Moghes. The forest mantle from the coveted Tul is exclusively for nobility these days." path = /obj/item/clothing/accessory/poncho/unathimantle cost = 1 whitelisted = list(SPECIES_UNATHI) sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_COLOR_SELECTION + +/datum/gear/suit/unathi_mantle/New() + ..() + var/mantles = list() + mantles["hide mantle, desert"] = /obj/item/clothing/accessory/poncho/unathimantle + mantles["hide mantle, forest"] = /obj/item/clothing/accessory/poncho/unathimantle/forest + mantles["hide mantle, mountain"] = /obj/item/clothing/accessory/poncho/unathimantle/mountain + gear_tweaks += new/datum/gear_tweak/path(mantles) /datum/gear/suit/unathi_robe display_name = "roughspun robe" @@ -48,6 +59,14 @@ un_gloves["black leather gloves"] = /obj/item/clothing/gloves/black_leather/unathi gear_tweaks += new/datum/gear_tweak/path(un_gloves) +/datum/gear/gloves/unathi_handwraps + display_name = "cloth handwraps" + path = /obj/item/clothing/gloves/unathi + cost = 1 + whitelisted = list(SPECIES_UNATHI) + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + /datum/gear/uniform/unathi display_name = "sinta tunic" path = /obj/item/clothing/under/unathi @@ -55,9 +74,15 @@ sort_category = "Xenowear - Unathi" flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION +/datum/gear/uniform/unathi/himation + display_name = "himation cloak" + path = /obj/item/clothing/under/unathi/himation + cost = 1 + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION | GEAR_HAS_ADDITIONAL_COLOR_SELECTION + /datum/gear/head/sinta_ronin display_name = "straw hat" - path = /obj/item/clothing/head/sinta_ronin + path = /obj/item/clothing/head/unathi whitelisted = list(SPECIES_UNATHI) sort_category = "Xenowear - Unathi" @@ -139,6 +164,7 @@ path = /obj/item/clothing/under/unathi/zazali whitelisted = list(SPECIES_UNATHI) sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_COLOR_SELECTION | GEAR_HAS_ADDITIONAL_COLOR_SELECTION /datum/gear/uniform/unathi/huytai display_name = "huytai outfit" @@ -153,26 +179,27 @@ sort_category = "Xenowear - Unathi" /datum/gear/suit/unathi/wrapping_head - display_name = "thakh shaman head wrappings" - description = "Head wrappings with a breath mask. Only very traditional Th'akh Shamans would wear these." - path = /obj/item/clothing/mask/gas/wrapping + display_name = "Thakhist head wrappings" + path = /obj/item/clothing/mask/gas/unathi cost = 1 whitelisted = list(SPECIES_UNATHI) + allowed_roles = list("Chaplain", "Roboticist") sort_category = "Xenowear - Unathi" flags = GEAR_HAS_DESC_SELECTION /datum/gear/suit/unathi/wrapping_body - display_name = "thakh shaman body wrappings" - description = "Closed body wrappings. Only very traditional Th'akh Shamans would wear these." - path = /obj/item/clothing/suit/unathi/mantle/wrapping + display_name = "Thakhist body wrappings" + path = /obj/item/clothing/suit/unathi/wrapping cost = 1 whitelisted = list(SPECIES_UNATHI) + allowed_roles = list("Chaplain", "Roboticist") sort_category = "Xenowear - Unathi" flags = GEAR_HAS_DESC_SELECTION /datum/gear/augment/autakh display_name = "soul anchor" - description = "A rune inscribed mirror or piece of glass placed behind the eyes. Believed to be the 'Window to the Soul' and house the concentrated spirit of an individual." + description = "A rune inscribed mirror or piece of glass placed behind the eyes. Believed to \ + be the 'Window to the Soul' and house the concentrated spirit of an individual." path = /obj/item/organ/internal/anchor cost = 1 whitelisted = list(SPECIES_UNATHI) @@ -180,17 +207,20 @@ /datum/gear/augment/autakh/calf_override display_name = "calf overdrive" - description = "An Aut'akh augment that allows the user to run at high speeds without the cost of stamina, causes damage to the lower body when used." + description = "An Aut'akh augment that allows the user to run at high speeds without the cost \ + of stamina, causes damage to the lower body when used." path = /obj/item/organ/internal/augment/calf_override /datum/gear/augment/autakh/protein_valve display_name = "protein breakdown valve" - description = "An aut'akh valve on the chest that releases a dangerous chemical into the stomach, forcing rapid digestion for immediate adrenal stimulation. Causes long-term damage." + description = "An aut'akh valve on the chest that releases a dangerous chemical into the \ + stomach, forcing rapid digestion for immediate adrenal stimulation. Causes long-term damage." path = /obj/item/organ/internal/augment/protein_valve /datum/gear/augment/autakh/venomous_rest display_name = "venomous rest implant" - description = "An aut'akh compartment connected to the blood system that administers a traditional Unathi healing agent." + description = "An aut'akh compartment connected to the blood system that administers a \ + traditional Unathi healing agent." path = /obj/item/organ/internal/augment/venomous_rest /datum/gear/augment/autakh/eyes @@ -209,4 +239,60 @@ display_name = "shaman staff" path = /obj/item/cane/shaman sort_category = "Xenowear - Unathi" - whitelisted = list(SPECIES_UNATHI) \ No newline at end of file + whitelisted = list(SPECIES_UNATHI) + +/datum/gear/suit/maxtlatl + display_name = "Thakhist maxtlatl" + path = /obj/item/clothing/accessory/poncho/maxtlatl + cost = 1 + whitelisted = list(SPECIES_UNATHI) + allowed_roles = list("Chaplain") + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/wrists/maxtlatl + display_name = "Thakhist wristguards" + path = /obj/item/clothing/wrists/unathi/maxtlatl + whitelisted = list(SPECIES_UNATHI) + allowed_roles = list("Chaplain") + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/head/maxtlatl + display_name = "Thakhist headgear" + path = /obj/item/clothing/head/unathi/maxtlatl + whitelisted = list(SPECIES_UNATHI) + allowed_roles = list("Chaplain") + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/suit/rockstone + display_name = "rockstone cape" + path = /obj/item/clothing/accessory/poncho/rockstone + cost = 1 + whitelisted = list(SPECIES_UNATHI) + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION | GEAR_HAS_ADDITIONAL_COLOR_SELECTION + +/datum/gear/wrists/noble_bracers + display_name = "jeweled bracers" + path = /obj/item/clothing/wrists/unathi/jeweled + whitelisted = list(SPECIES_UNATHI) + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + +/datum/gear/suit/sash + display_name = "gyazo belt" + path = /obj/item/clothing/accessory/unathi + cost = 1 + whitelisted = list(SPECIES_UNATHI) + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + +/datum/gear/suit/noble_vest + display_name = "jokfar vest" + path = /obj/item/clothing/suit/unathi/jokfar + cost = 1 + whitelisted = list(SPECIES_UNATHI) + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index bcaffb62bc2..243ccc93746 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -152,6 +152,7 @@ datum/preferences var/parallax_speed = 2 var/toggles_secondary = PARALLAX_SPACE | PARALLAX_DUST | PROGRESS_BARS | FLOATING_MESSAGES | HOTKEY_DEFAULT var/clientfps = 0 + var/floating_chat_color var/list/pai = list() // A list for holding pAI related data. @@ -404,6 +405,7 @@ datum/preferences character.set_species(species) if(character.dna) character.dna.real_name = character.real_name + character.set_floating_chat_color(floating_chat_color) character.flavor_texts["general"] = flavor_texts["general"] character.flavor_texts[BP_HEAD] = flavor_texts[BP_HEAD] @@ -479,7 +481,7 @@ datum/preferences else all_underwear -= underwear_category_name - if(backbag > OUTFIT_MESSENGERBAG || backbag < OUTFIT_NOTHING) + if(backbag > OUTFIT_AUBURNPOCKETBOOK || backbag < OUTFIT_NOTHING) backbag = OUTFIT_NOTHING //Same as above character.backbag = backbag character.backbag_style = backbag_style diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index e776abcf18e..55f2bd2c926 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -112,7 +112,7 @@ /client/verb/listen_looc() - set name = "Show/Hide LOOC" + set name = "Show/Hide LOOC (All)" set category = "Preferences" set desc = "Toggles seeing Local OutOfCharacter chat" prefs.toggles ^= CHAT_LOOC @@ -121,6 +121,19 @@ to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.") feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/verb/listen_ghostlooc() + set name = "Show/Hide LOOC (Observers)" + set category = "Preferences" + set desc = "Toggles seeing Local OutOfCharacter chat from observing players" + if(!(prefs.toggles & CHAT_LOOC)) //Don't need to disable ghost LOOC if you've disabled all LOOC + to_chat(src, SPAN_NOTICE("You already have the LOOC channel hidden!")) + return + prefs.toggles ^= CHAT_GHOSTLOOC + prefs.save_preferences() + + to_chat(src, "You will [(prefs.toggles & CHAT_GHOSTLOOC) ? "now" : "no longer"] see messages on the LOOC channel from observing/ghosted players.") + feedback_add_details("admin_verb","TGLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/verb/toggle_chattags() set name = "Show/Hide Chat Tags" diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index bbea9f1284c..30b01be9393 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -80,32 +80,15 @@ disguise(clothing_choices[picked]) update_clothing_icon() //so our overlays update. -/obj/item/clothing/under/chameleon/wizard/Initialize() - . = ..() - disguise(/obj/item/clothing/under/lightpurple) - -/obj/item/clothing/under/chameleon/wizard/change(picked in clothing_choices) - set name = "Change Jumpsuit Appearance" - set category = "Chameleon Items" - set src in usr - - if(isliving(usr)) - var/mob/living/user = usr - if(user.is_wizard()) - ..(picked) - return - to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) - -/obj/item/clothing/under/chameleon/wizard/emp_act() - return - //***************** //**Chameleon Hat** //***************** /obj/item/clothing/head/chameleon name = "grey cap" - desc = "It looks like a plain hat, but upon closer inspection, there's an advanced holographic array installed inside. It seems to have a small dial inside." + desc = "It looks like a softcap in a tasteless color, but upon closer inspection there's an advanced holographic array installed inside. It seems to have a small dial inside." + icon = 'icons/obj/clothing/hats/soft_caps.dmi' + icon_state = "softcap" origin_tech = list(TECH_ILLEGAL = 3) body_parts_covered = 0 var/global/list/clothing_choices @@ -134,28 +117,6 @@ disguise(clothing_choices[picked]) update_clothing_icon() //so our overlays update. -/obj/item/clothing/head/chameleon/wizard - wizard_garb = TRUE - -/obj/item/clothing/head/chameleon/wizard/Initialize() - . = ..() - disguise(/obj/item/clothing/head/wizard) - -/obj/item/clothing/head/chameleon/wizard/change(picked in clothing_choices) - set name = "Change Hat/Helmet Appearance" - set category = "Chameleon Items" - set src in usr - - if(isliving(usr)) - var/mob/living/user = usr - if(user.is_wizard()) - ..(picked) - return - to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) - -/obj/item/clothing/head/chameleon/wizard/emp_act() - return - //****************** //**Chameleon Suit** //****************** @@ -193,28 +154,6 @@ update_clothing_icon() //so our overlays update. -/obj/item/clothing/suit/chameleon/wizard - wizard_garb = TRUE - -/obj/item/clothing/suit/chameleon/wizard/Initialize() - . = ..() - disguise(/obj/item/clothing/suit/wizrobe) - -/obj/item/clothing/suit/chameleon/wizard/change(picked in clothing_choices) - set name = "Change Oversuit Appearance" - set category = "Chameleon Items" - set src in usr - - if(isliving(usr)) - var/mob/living/user = usr - if(user.is_wizard()) - ..(picked) - return - to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) - -/obj/item/clothing/suit/chameleon/wizard/emp_act() - return - //******************* //**Chameleon Shoes** //******************* @@ -253,25 +192,6 @@ update_clothing_icon() //so our overlays update. -/obj/item/clothing/shoes/chameleon/wizard/Initialize() - . = ..() - disguise(/obj/item/clothing/shoes/sandal) - -/obj/item/clothing/shoes/chameleon/wizard/change(picked in clothing_choices) - set name = "Change Footwear Appearance" - set category = "Chameleon Items" - set src in usr - - if(isliving(usr)) - var/mob/living/user = usr - if(user.is_wizard()) - ..(picked) - return - to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) - -/obj/item/clothing/shoes/chameleon/wizard/emp_act() - return - //********************** //**Chameleon Backpack** //********************** @@ -315,25 +235,6 @@ M.update_inv_back() -/obj/item/storage/backpack/chameleon/wizard/Initialize() - . = ..() - disguise(/obj/item/storage/backpack/wizard) - -/obj/item/storage/backpack/chameleon/wizard/change(picked in clothing_choices) - set name = "Change Backpack Appearance" - set category = "Chameleon Items" - set src in usr - - if(isliving(usr)) - var/mob/living/user = usr - if(user.is_wizard()) - ..(picked) - return - to_chat(usr, SPAN_WARNING("You touch \the [src], but nothing happens.")) - -/obj/item/storage/backpack/chameleon/wizard/emp_act() - return - //******************** //**Chameleon Gloves** //******************** diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 7dd26257961..b9619bb88fb 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -27,6 +27,9 @@ var/default_material = null // Set this to something else if you want material attributes on init. var/material_armor_modifer = 1 // Adjust if you want seperate types of armor made from the same material to have different protectiveness (e.g. makeshift vs real armor) var/refittable = TRUE // If false doesn't let the clothing be refit in suit cyclers + var/no_overheat = FALSE // Checks to see if the clothing is ignored for the purpose of overheating messages. + + var/move_trail = /obj/effect/decal/cleanable/blood/tracks/footprints /obj/item/clothing/Initialize(var/mapload, var/material_key) @@ -440,6 +443,9 @@ if (.) INVOKE_ASYNC(src, .proc/update_wearer) +/obj/item/clothing/gloves/clothing_class() + return "gloves" + /////////////////////////////////////////////////////////////////////// //Head /obj/item/clothing/head @@ -562,6 +568,9 @@ var/mob/M = src.loc M.update_inv_head() +/obj/item/clothing/head/clothing_class() + return "helmet" + /////////////////////////////////////////////////////////////////////// //Mask /obj/item/clothing/mask @@ -781,6 +790,9 @@ to_chat(M, SPAN_WARNING("You trip from running in \the [src]!")) return +/obj/item/clothing/shoes/clothing_class() + return "shoes" + /////////////////////////////////////////////////////////////////////// //Suit /obj/item/clothing/suit @@ -822,6 +834,9 @@ var/mob/M = src.loc M.update_inv_wear_suit() +/obj/item/clothing/suit/clothing_class() + return "suit" + /////////////////////////////////////////////////////////////////////// //Under clothing /obj/item/clothing/under @@ -852,8 +867,8 @@ //convenience var for defining the icon state for the overlay used when the clothing is worn. //Also used by rolling/unrolling. var/worn_state = null - valid_accessory_slots = list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_GENERIC, ACCESSORY_SLOT_CAPE) - restricted_accessory_slots = list(ACCESSORY_SLOT_UTILITY) + valid_accessory_slots = list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_UTILITY_MINOR, ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_GENERIC, ACCESSORY_SLOT_CAPE) + restricted_accessory_slots = list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_UTILITY_MINOR) /obj/item/clothing/under/attack_hand(var/mob/user) @@ -1076,6 +1091,9 @@ sensor_mode = pick(0,1,2,3) . = ..() +/obj/item/clothing/under/clothing_class() + return "uniform" + //Rings @@ -1088,3 +1106,6 @@ drop_sound = 'sound/items/drop/ring.ogg' pickup_sound = 'sound/items/pickup/ring.ogg' var/undergloves = TRUE + +/obj/item/clothing/proc/clothing_class() + return "clothing" \ No newline at end of file diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm index 6d72a7743ef..0c39c7d053a 100644 --- a/code/modules/clothing/clothing_accessories.dm +++ b/code/modules/clothing/clothing_accessories.dm @@ -95,7 +95,7 @@ ..(user) if(LAZYLEN(accessories)) for(var/obj/item/clothing/accessory/A in accessories) - to_chat(user, "\A [A] is attached to it.") + to_chat(user, "\A [A] [A.gender == PLURAL ? "are" : "is"] attached to it.") /obj/item/clothing/proc/update_accessory_slowdown() slowdown_accessory = 0 @@ -122,7 +122,6 @@ set name = "Remove Accessory" set category = "Object" set src in usr - if(!isliving(usr)) return @@ -133,10 +132,14 @@ if(!LAZYLEN(accessories)) return - + var/obj/item/clothing/accessory/A if(LAZYLEN(accessories) > 1) - A = input("Select an accessory to remove.") as null|anything in accessories + var/list/options = list() + for (var/obj/item/clothing/accessory/i in accessories) + var/image/radial_button = image(icon = i.icon, icon_state = i.icon_state) + options[i] = radial_button + A = show_radial_menu(M, M, options, radius = 42, tooltips = TRUE) else A = accessories[1] remove_accessory(usr,A) diff --git a/code/modules/clothing/ears/bandanna.dm b/code/modules/clothing/ears/bandanna.dm index 4d566f4f178..38e9e0f3225 100644 --- a/code/modules/clothing/ears/bandanna.dm +++ b/code/modules/clothing/ears/bandanna.dm @@ -11,6 +11,9 @@ w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS +/obj/item/clothing/ears/bandanna/get_ear_examine_text(var/mob/user, var/ear_text = "left") + return "around [user.get_pronoun("his")] neck" + /obj/item/clothing/ears/bandanna/blue name = "blue bandanna" desc = "A plain blue bandanna." diff --git a/code/modules/clothing/ears/skrell.dm b/code/modules/clothing/ears/skrell.dm index 4e22a7b82c0..bd82042238f 100644 --- a/code/modules/clothing/ears/skrell.dm +++ b/code/modules/clothing/ears/skrell.dm @@ -246,3 +246,19 @@ /obj/item/clothing/ears/skrell/goop/circles icon_state = "skrell_circles" item_state = "skrell_circles" + +/obj/item/clothing/ears/skrell/scrunchy + name = "skrell tentacle tie" + desc = "A self-powered hard-light 'scrunchy' used to comfortably tie back the tentacles." + icon = 'icons/clothing/head/skrellscrunchies.dmi' + icon_state = "skrellhairtie" + item_state = "scrunchy_seaweed" + +/obj/item/clothing/ears/skrell/scrunchy/equipped(mob/user, slot, assisted_equip) + if((slot in list(slot_head, slot_l_ear, slot_r_ear)) && ishuman(user)) + var/mob/living/carbon/human/H = user + if(istype(hair_styles_list[H.h_style], /datum/sprite_accessory/hair/skr_tentacle_m)) + var/datum/sprite_accessory/hair/skr_tentacle_m/hair_datum = hair_styles_list[H.h_style] + if(hair_datum.scrunchy_style) + item_state = "scrunchy_[hair_datum.scrunchy_style]" + return ..() \ No newline at end of file diff --git a/code/modules/clothing/factions/dominia.dm b/code/modules/clothing/factions/dominia.dm index ef9ce82e515..39e43d0acbd 100644 --- a/code/modules/clothing/factions/dominia.dm +++ b/code/modules/clothing/factions/dominia.dm @@ -107,8 +107,12 @@ item_state = "dominia_noble_black" /obj/item/clothing/suit/storage/toggle/dominia/bomber - name = "dominia bomber jacket" - desc = "This is a bomber jacket of Dominian style." + name = "fisanduhian bomber jacket" + desc = "A bomber jacket based off of styles created by Fisanduhian refugees. The double-breasted design works well for insulating \ + heat, or concealing a small pistol." + desc_fluff = "Fisanduhian fashion remains as rugged and steadfast as its people, as well as very distinctive from the usual Morozi fashions \ + sourced from Moroz proper. Bomber jackets such as these were also frequently seen worn by members of the Fisanduh Freedom Front and came \ + to be seen as an enduring symbol of their struggle for liberty." icon = 'icons/clothing/suits/coats/dominia_bomber.dmi' icon_state = "dominia_bomber" item_state = "dominia_bomber" @@ -130,8 +134,12 @@ item_state = "dominia_uniform_black" /obj/item/clothing/under/dominia/sweater - name = "dominia sweater" - desc = "This is a sweater of Dominian style." + name = "fisanduhian sweater" + desc = "This is a sweater of Fisanduhian style. Practical and utilitarian." + desc_fluff = "Fisanduhian fashion remains as rugged and steadfast as its people, as well as very distinctive from the usual Morozi fashions \ + sourced from Moroz proper. Sweaters such as this were a common sight in the region of Fisanduh, being comfortable to wear and very useful \ + in the cold mountainous environment they lived in. It tends to be seen as something rather basic and droll by Imperials when compared \ + to their more extravagant and colorful attire, but this suits the Confederates just fine." icon = 'icons/clothing/under/uniforms/dominia_sweater.dmi' icon_state = "dom_sweater" item_state = "dom_sweater" @@ -293,6 +301,7 @@ /obj/item/clothing/accessory/poncho/dominia/red/verb/roll_up_mantle() set name = "Roll Up Cape Mantle" set desc = "Roll up your cape's mantle. Doesn't work with some capes." + set category = "Object" set src in usr if(use_check_and_message(usr)) @@ -388,12 +397,20 @@ /obj/item/clothing/head/beret/dominia name = "tribunal initiate's beret" desc = "A simple red beret with a golden badge marking its wearer as an initiate of the Moroz Holy Tribunal." - desc_fluff = " While initiates dress humbly in white and red clothing, this does not mean that House Caladius - the primary source of the Holy Tribunal's \ + desc_fluff = "While initiates dress humbly in white and red clothing, this does not mean that House Caladius - the primary source of the Holy Tribunal's \ funding - spares any expenses funding them, and these berets are made of luxurious velvet." icon = 'icons/clothing/head/dominia_beret.dmi' icon_state = "dominia_beret" item_state = "dominia_beret" +/obj/item/clothing/head/beret/dominia/medical + name = "tribunalist medical beret" + desc = "A white-and-green beret bearing the sigil of the Moroz Holy Tribunal on its front. Worn by those medical workers affiliated with the Moroz Holy Tribunal." + desc_fluff = "Unlike the black and gold clothing of their priestly counterparts, the medical staff of the Moroz Holy Tribunal's temples are generally clad in white and green due to typically not being full members of the clergy. Occasionally, if a doctor is dedicated enough, they will be granted the right to wear the beret of a full Tribunal priest. This beret features an emblem of the eye made of green and white cloth." + icon = 'icons/clothing/head/dominia_beret_hospital.dmi' + icon_state = "dominia_beret_hospital" + item_state = "dominia_beret_hospital" + /obj/item/clothing/head/beret/dominia/priest name = "tribunalist's beret" desc = " black beret bearing the sigil of the Moroz Holy Tribunal on its front. Worn by full members of the Tribunal's clergy." @@ -404,7 +421,7 @@ item_state = "dominia_beret_priest" /obj/item/clothing/head/beret/dominia/consular - name = "tribunalist’s beret" + name = "tribunalist's beret" desc = "A beret in gold and red worn by members of the clergy affiliated with His Majesty's Diplomatic Service." desc_fluff = "His Majesty's Diplomatic Service - as with much of the Empire tends to be dominated by the great houses, though the Service also employs may commoners - \ as long as they can pass the rigorous examinations required to become a full member of the Diplomatic Service." @@ -426,6 +443,9 @@ /obj/item/clothing/head/ushanka/dominia name = "fisanduhian ushanka" desc = "A warm fur hat with ear flaps that can be raised and tied to be out of the way. This one has a large Fisanduhian flag on the front." + desc_fluff = "Fisanduhian fashion remains as rugged and steadfast as its people, as well as very distinctive from the usual Morozi fashions \ + sourced from Moroz proper. Ushankas such as these are still a common sight in the semi-autonomous region of Fisanduh, flag and all. Much to \ + the ire of Moroz's Imperials." icon_state = "fishushanka" item_state = "fishushanka" @@ -506,44 +526,4 @@ /obj/item/clothing/under/dominia/dress/fancy/sleeveless/kazhkz name = "sleeveless house kazhkz Morozi dress" - house = "kazhkz" - -/obj/item/clothing/accessory/dominia/sash - name = "dominian sash" - desc = "A sash worn by commoners affiliated with a Dominian great house, intended for use when a cape is impractical. This one seems to represent Dominia as a whole, however." - desc_fluff = "Sashes such as this one are a common sight throughout the Empire of Dominia, though they are hardly as fashionable as the typical cape. While they are \ - often used in formal uniforms - such as for attendants and domestic staff - these sashes can also be found used in positions where wearing a cape is impractical, such as the medical field." - icon = 'icons/clothing/accessories/dominia_sash.dmi' - item_state = "dominia_sash" - icon_state = "dominia_sash" - contained_sprite = TRUE - -/obj/item/clothing/accessory/dominia/sash/strelitz - name = "strelitz sash" - desc = "A sash worn by commoners affiliated with a Dominian great house, intended for use when a cape is impractical. This one marks its wearer as an affiliate of House Strelitz." - item_state = "strelitz_sash" - icon_state = "strelitz_sash" - -/obj/item/clothing/accessory/dominia/sash/volvalaad - name = "volvalaad sash" - desc = "A sash worn by commoners affiliated with a Dominian great house, intended for use when a cape is impractical. This one marks its wearer as an affiliate of House Volvalaad." - item_state = "volvalaad_sash" - icon_state = "volvalaad_sash" - -/obj/item/clothing/accessory/dominia/sash/kazhkz - name = "kazhkz sash" - desc = "A sash worn by commoners affiliated with a Dominian great house, intended for use when a cape is impractical. This one marks its wearer as an affiliate of House Kazhkz." - item_state = "kazhkz_sash" - icon_state = "kazhkz_sash" - -/obj/item/clothing/accessory/dominia/sash/caladius - name = "caladius sash" - desc = "A sash worn by commoners affiliated with a Dominian great house, intended for use when a cape is impractical. This one marks its wearer as an affiliate of House Caladius." - item_state = "caladius_sash" - icon_state = "caladius_sash" - -/obj/item/clothing/accessory/dominia/sash/zhao - name = "zhao sash" - desc = "A sash worn by commoners affiliated with a Dominian great house, intended for use when a cape is impractical. This one marks its wearer as an affiliate of House Zhao." - item_state = "zhao_sash" - icon_state = "zhao_sash" \ No newline at end of file + house = "kazhkz" \ No newline at end of file diff --git a/code/modules/clothing/factions/gadpathur.dm b/code/modules/clothing/factions/gadpathur.dm index b29007cd0cc..0a10cb764fe 100644 --- a/code/modules/clothing/factions/gadpathur.dm +++ b/code/modules/clothing/factions/gadpathur.dm @@ -21,6 +21,34 @@ item_state = "gadpathur_coat" contained_sprite = TRUE +/obj/item/clothing/suit/storage/toggle/trench/gadpathur + name = "gadpathurian trenchcoat" + desc = "A heavier Gadpathurian overcoat with some piping on the shoulders. Likely meant for the colder regions of the planet." + desc_fluff = "Due to the extremely hostile surface conditions of Gadpathur, overcoats such as this one are a common sight \ + in order to protect against hazards. They are typically chemically treated to better resist chemicals and radiation, \ + and are often the difference between life and death on the planet's surface." + icon = 'icons/clothing/suits/coats/gadpathur_coat.dmi' + icon_state = "gadpathurtrench" + item_state = "gadpathurtrench" + contained_sprite = TRUE + +/obj/item/clothing/suit/storage/toggle/trench/gadpathur/leather + name = "gadpathurian leather coat" + desc = "A Gadpathurian overcoat made of leather rather than the typical canvas. Typically issued to exceptional Gadpathurians before they are sent abroad." + icon_state = "gadpathurleather" + item_state = "gadpathurleather" + +/obj/item/clothing/suit/storage/toggle/leather_jacket/gadpathur + name = "thermal coat" + desc = "A thermally insulated coat commonly worn by Gadpathurians during the planet's bitterly cold nights." + desc_fluff = "Due to the extremely hostile surface conditions of Gadpathur, overcoats such as this one are a common sight \ + in order to protect against hazards. They are typically chemically treated to better resist chemicals and radiation, \ + and are often the difference between life and death on the planet's surface." + icon = 'icons/clothing/suits/coats/gadpathur_coat.dmi' + icon_state = "gadpathurthermal" + item_state = "gadpathurthermal" + contained_sprite = TRUE + /obj/item/clothing/head/gadpathur name = "cadre cap" desc = "A snugly-fitting cap with the traditional Gadpathurian red-and-orange sun on its face. It has no other identifying features." @@ -32,6 +60,13 @@ item_state = "gadpathur_cap" contained_sprite = TRUE +/obj/item/clothing/head/turban/gadpathur + name = "gadpathurian turban" + desc = "A turban commonly worn by Gadpathur's Sikh population. Like most Gadpathurian clothing, this turban is made of canvas." + icon = 'icons/clothing/head/gadpathur_cap.dmi' + icon_state = "turban_gadpathur" + item_state = "turban_gadpathur" + /obj/item/clothing/head/beret/gadpathur name = "cadre beret" desc = "A canvas beret with the traditional Gadpathurian red-and-orange sun on its badge. It has no other identifying marks." @@ -42,6 +77,19 @@ icon_state = "gadpathur_beret" item_state = "gadpathur_beret" +/obj/item/clothing/head/beret/gadpathur/engineer + name = "gadpathurian industrial beret" + desc = "A blue canvas beret with the typical crossed hammer and shovel icon of an industrial cadre on its badge." + icon_state = "gadpathur_engineer_beret" + item_state = "gadpathur_engineer_beret" + +/obj/item/clothing/head/beret/gadpathur/medical + name = "gadpathurian medical beret" + desc = "A red canvas beret with the golden cross of a medical cadre upon its badge." + icon_state = "gadpathur_medic_beret" + item_state = "gadpathur_medic_beret" + + /obj/item/clothing/accessory/armband/gadpathur name = "cadre brassard" desc = "Gadpathurian cadres use these brassards, worn on their uniforms or their coats, to distinguish themselves." @@ -63,4 +111,50 @@ desc = "Gadpathurian cadres use these brassards, worn on their uniforms or their coats, to distinguish themselves. This one depicts a crossed hammer and\ shovel with golden heads." icon_state = "gadpathur_brassard_ind" - item_state = "gadpathur_brassard_ind" \ No newline at end of file + item_state = "gadpathur_brassard_ind" + +/obj/item/clothing/accessory/gadpathurian_leader + name = "section leader badge" + desc = "A Section Leader's badge is typically worn below one's overwear, in order to ensure that the hated Solarians will be unable to easily identify a leader in a crowd." + icon_state = "gadpathurleaderbadge" + item_state = "gadpathurleaderbadge" + overlay_state = "gadpathurleaderbadge" + + flippable = TRUE + + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' + +/obj/item/clothing/accessory/dogtags/gadpathur + name = "gadpathurian dogtags" + desc = "Gadpathurian dogtags are issued to every non-exiled member of the planet's highly-militarized society and list their wearer's name, cadre, cadre ID, religion, and blood type. \ + They can be easily ripped in half in the event of the wearer's death." + icon_state = "gadpathur_dogtags" + item_state = "gadpathur_dogtags" + var/separated = FALSE + +/obj/item/clothing/accessory/dogtags/gadpathur/attack_self(mob/user) + if(!separated) + if (user.a_intent == I_HURT) + user.visible_message(SPAN_NOTICE("[user] yanks apart \the [src]!")) + separated = TRUE + var/obj/item/gadpathur_tag/tag = new(get_turf(user)) + user.put_in_hands(tag) + separated = TRUE + update_icon() + +/obj/item/clothing/accessory/dogtags/gadpathur/update_icon() + if(separated) + icon_state = "[icon_state]_single" + item_state = "[item_state]_single" + else + icon_state = initial(icon_state) + item_state = initial(item_state) + +/obj/item/gadpathur_tag + name = "gadpathurian dogtag" + desc = "Gadpathurian dogtags are issued to every non-exiled member of the planet's highly-militarized society and list their wearer's name, cadre, cadre ID, religion, and blood type. \ + They can be easily ripped in half in the event of the wearer's death." + icon = 'icons/clothing/accessories/dogtags.dmi' + icon_state = "gadpathur_tag" + w_class = ITEMSIZE_SMALL \ No newline at end of file diff --git a/code/modules/clothing/factions/idris.dm b/code/modules/clothing/factions/idris.dm index 5960cf82733..9029ad5731e 100644 --- a/code/modules/clothing/factions/idris.dm +++ b/code/modules/clothing/factions/idris.dm @@ -1,46 +1,93 @@ //iru coats - -/obj/item/clothing/suit/armor/vest/idris +/obj/item/clothing/suit/storage/toggle/armor/vest/idris name = "black Idris Unit coat" desc = "A coat worn by the Idris units, notorious across space." icon = 'icons/clothing/suits/coats/idris_iru_coats.dmi' - icon_state = "iru_coat" - item_state = "iru_coat" + icon_state = "idris_coat" + item_state = "idris_coat" + allowed = list(/obj/item/gun,/obj/item/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/device/flashlight) + body_parts_covered = UPPER_TORSO cold_protection = 0 min_cold_protection_temperature = 0 heat_protection = 0 max_heat_protection_temperature = 0 contained_sprite = TRUE + armor = list( + melee = ARMOR_MELEE_KNIVES, + bullet = ARMOR_BALLISTIC_PISTOL, + laser = ARMOR_LASER_SMALL, + energy = ARMOR_ENERGY_MINOR, + bomb = ARMOR_BOMB_PADDED + ) -/obj/item/clothing/suit/armor/vest/idris/brown +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/white + name = "white Idris Unit coat" + desc = "A coat worn by the Idris units, notorious across space. This one is white." + icon_state = "idris_coat_white" + item_state = "idris_coat_white" + +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/brown name = "brown Idris Unit coat" - desc = "A coat worn by the Idris units, notorious across space. This one is brown." - icon_state = "iru_coat_brown" - item_state = "iru_coat_brown" + desc = "A coat worn by the Idris units, notorious across space. This one is white." + icon_state = "idris_coat_brown" + item_state = "idris_coat_brown" -/obj/item/clothing/suit/armor/vest/idris/trenchcoat/black +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/longcoat + name = "black Idris Unit long coat" + desc = "A long coat worn by the Idris units, notorious across space. This one is black." + icon_state = "idris_longcoat" + item_state = "idris_longcoat" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/longcoat/white + name = "white Idris Unit long coat" + desc = "A long coat worn by the Idris units, notorious across space. This one is white." + icon_state = "idris_longcoat_white" + item_state = "idris_longcoat_white" + +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/longcoat/brown + name = "brown Idris Unit long coat" + desc = "A long coat worn by the Idris units, notorious across space. This one is brown." + icon_state = "idris_longcoat_brown" + item_state = "idris_longcoat_brown" + +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/trenchcoat name = "black Idris Unit trench coat" desc = "A trench coat worn by the Idris units, notorious across space. This one is black." - icon_state = "iru_trench_black" - item_state = "iru_trench_black" + icon_state = "idris_trenchcoat" + item_state = "idris_trenchcoat" + body_parts_covered = UPPER_TORSO|LOWER_TORSO -/obj/item/clothing/suit/armor/vest/idris/trenchcoat/brown +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/trenchcoat/white + name = "white Idris Unit trench coat" + desc = "A trench coat worn by the Idris units, notorious across space. This one is white." + icon_state = "idris_trenchcoat_white" + item_state = "idris_trenchcoat_white" + +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/trenchcoat/brown name = "brown Idris Unit trench coat" desc = "A trench coat worn by the Idris units, notorious across space. This one is brown." - icon_state = "iru_trench_brown" - item_state = "iru_trench_brown" + icon_state = "idris_trenchcoat_brown" + item_state = "idris_trenchcoat_brown" -/obj/item/clothing/suit/armor/vest/idris/duster/black +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/duster name = "black Idris Unit duster coat" desc = "A duster coat worn by the Idris units, notorious across space. This one is black." - icon_state = "iru_duster_black" - item_state = "iru_duster_black" + icon_state = "idris_duster" + item_state = "idris_duster" + body_parts_covered = UPPER_TORSO|LOWER_TORSO -/obj/item/clothing/suit/armor/vest/idris/duster/brown +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/duster/white + name = "white Idris Unit duster coat" + desc = "A duster coat worn by the Idris units, notorious across space. This one is white." + icon_state = "idris_duster_white" + item_state = "idris_duster_white" + +/obj/item/clothing/suit/storage/toggle/armor/vest/idris/duster/brown name = "brown Idris Unit duster coat" desc = "A duster coat worn by the Idris units, notorious across space. This one is brown." - icon_state = "iru_duster_brown" - item_state = "iru_duster_brown" + icon_state = "idris_duster_brown" + item_state = "idris_duster_brown" //windbreaker diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index bfd9708fbe1..4efb25b4924 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -31,6 +31,8 @@ BLIND // can't see anything var/obj/screen/overlay = null var/obj/item/clothing/glasses/hud/hud = null // Hud glasses, if any var/activated_color = null + var/normal_layer = TRUE + var/shatter_material = /obj/item/material/shard sprite_sheets = list( BODYTYPE_VAURCA_WARFORM = 'icons/mob/species/warriorform/eyes.dmi' ) @@ -42,6 +44,24 @@ BLIND // can't see anything /obj/item/clothing/glasses/proc/Look(var/atom/A, mob/user, var/proximity) return 0 // return 1 to cancel attack_hand/RangedAttack() +/obj/item/clothing/glasses/verb/change_layer() + set category = "Object" + set name = "Change Glasses Layer" + set src in usr + + normal_layer = !normal_layer + to_chat(usr, SPAN_NOTICE("\The [src] will now layer [normal_layer ? "under" : "over"] your hair.")) + +/obj/item/clothing/glasses/protects_eyestab(var/obj/stab_item, var/stabbed = FALSE) + if(stabbed && (body_parts_covered & EYES) && !(item_flags & THICKMATERIAL) && shatter_material && prob(stab_item.force * 5)) + var/mob/M = loc + M.visible_message(SPAN_WARNING("\The [src] [M] is wearing gets shattered!")) + playsound(loc, /decl/sound_category/glass_break_sound, 70, TRUE) + new shatter_material(M.loc) + qdel(src) + return FALSE + return ..() + /obj/item/clothing/glasses/update_clothing_icon() if (ismob(src.loc)) var/mob/M = src.loc @@ -190,7 +210,7 @@ BLIND // can't see anything desc = "A simple pair of safety glasses. Thinner than their goggle counterparts, for those who can't decide between safety and style." icon_state = "plaingoggles" item_state = "plaingoggles" - item_flags = AIRTIGHT + item_flags = AIRTIGHT|THICKMATERIAL unacidable = 1 /obj/item/clothing/glasses/safety/goggles @@ -232,7 +252,8 @@ BLIND // can't see anything /obj/item/clothing/glasses/safety/goggles/wasteland name = "wasteland goggles" - desc = "A pair of old goggles common in the Wasteland. A few denizens unfortunate enough to not keep this protection on them after the nukes dropped no longer have the ability to see." + desc = "A pair of old goggles common in the Wasteland. A few denizens unfortunate enough to not \ + keep this protection on them after the nukes dropped no longer have the ability to see." icon = 'icons/obj/unathi_items.dmi' icon_state = "wasteland_goggles" item_state = "wasteland_goggles" @@ -457,6 +478,7 @@ BLIND // can't see anything item_state = "welding-g" action_button_name = "Flip Welding Goggles" var/up = 0 + item_flags = THICKMATERIAL flash_protection = FLASH_PROTECTION_MAJOR tint = TINT_HEAVY @@ -474,6 +496,7 @@ BLIND // can't see anything flags_inv |= HIDEEYES body_parts_covered |= EYES icon_state = initial(icon_state) + item_state = initial(icon_state) flash_protection = initial(flash_protection) tint = initial(tint) to_chat(usr, "You flip \the [src] down to protect your eyes.") @@ -482,6 +505,7 @@ BLIND // can't see anything flags_inv &= ~HIDEEYES body_parts_covered &= ~EYES icon_state = "[initial(icon_state)]up" + item_state = "[initial(item_state)]up" flash_protection = FLASH_PROTECTION_NONE tint = TINT_NONE to_chat(usr, "You push \the [src] up out of your face.") @@ -495,12 +519,22 @@ BLIND // can't see anything item_state = "rwelding-g" tint = TINT_MODERATE +/obj/item/clothing/glasses/welding/emergency + name = "emergency welding goggles" + desc = "A cheaper version of standard welding goggles, approved for emergency use by the Nanotrasen Safety Board." + icon = 'icons/clothing/eyes/welding_goggles.dmi' + icon_state = "ewelding-g" + item_state = "ewelding-g" + contained_sprite = TRUE + tint = TINT_BLIND // yes, this is on purpose + /obj/item/clothing/glasses/sunglasses/blindfold name = "blindfold" desc = "Covers the eyes, preventing sight." icon_state = "blindfold" item_state = "blindfold" tint = TINT_BLIND + shatter_material = FALSE drop_sound = 'sound/items/drop/gloves.ogg' pickup_sound = 'sound/items/pickup/gloves.ogg' @@ -522,6 +556,7 @@ BLIND // can't see anything icon_state = "blinders" item_state = "blinders" contained_sprite = TRUE + shatter_material = FALSE drop_sound = 'sound/items/drop/gloves.ogg' pickup_sound = 'sound/items/pickup/gloves.ogg' @@ -551,7 +586,7 @@ BLIND // can't see anything desc = "Flash-resistant goggles with inbuilt combat and security information." icon_state = "swatgoggles" item_state = "swatgoggles" - item_flags = AIRTIGHT + item_flags = AIRTIGHT|THICKMATERIAL /obj/item/clothing/glasses/sunglasses/sechud/head name = "advanced aviators" diff --git a/code/modules/clothing/gloves/attackby.dm b/code/modules/clothing/gloves/attackby.dm new file mode 100644 index 00000000000..aefbb0475a2 --- /dev/null +++ b/code/modules/clothing/gloves/attackby.dm @@ -0,0 +1,6 @@ +/obj/item/clothing/gloves/attackby(obj/item/W, mob/user) + if(W.ismultitool()) + var/siemens_percentage = 100 * siemens_coefficient + to_chat(user, SPAN_NOTICE("You probe \the [src] with \the [W]. The gloves will let [siemens_percentage]% of an electric shock through.")) + return + return ..() \ No newline at end of file diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 32e4ad11dc8..1d19a1b4f0b 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -8,19 +8,15 @@ drop_sound = 'sound/items/drop/rubber.ogg' pickup_sound = 'sound/items/pickup/rubber.ogg' -/obj/item/clothing/gloves/fyellow //Cheap Chinese Crap - desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly." +/obj/item/clothing/gloves/yellow/budget name = "budget insulated gloves" - icon_state = "yellow" - item_state = "yellow" - siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() - permeability_coefficient = 0.05 - drop_sound = 'sound/items/drop/rubber.ogg' - pickup_sound = 'sound/items/pickup/rubber.ogg' + desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly." + siemens_coefficient = 1 - New() - //average of 0.5, somewhat better than regular gloves' 0.75 - siemens_coefficient = pick(0,0.1,0.3,0.5,0.5,0.75,1.35) +/obj/item/clothing/gloves/yellow/budget/Initialize(mapload, material_key) + . = ..() + // average of 0.5, somewhat better than regular gloves' 0.75 + siemens_coefficient = pick(0, 0.1, 0.3, 0.5, 0.5, 0.75, 1.35) /obj/item/clothing/gloves/black desc = "These work gloves are thick and fire-resistant." @@ -152,9 +148,9 @@ species_restricted = list(BODYTYPE_UNATHI) /obj/item/clothing/gloves/white/unathi - name = "white gloves" - desc = "White gloves made for Unathi use." - species_restricted = list(BODYTYPE_UNATHI) + name = "white gloves" + desc = "White gloves made for Unathi use." + species_restricted = list(BODYTYPE_UNATHI) /obj/item/clothing/gloves/rainbow/unathi name = "rainbow gloves" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 5c1c92abb6f..dd3cb60c696 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -374,3 +374,10 @@ if(ismob(src.loc)) var/mob/M = src.loc M.update_inv_gloves() + +/obj/item/clothing/gloves/black/forensic + name = "forensic gloves" + desc = "Specially made gloves for investigative personnel. The luminescent threads woven into the material stand out under scrutiny." + icon_state = "forensic" + item_state = "forensicgloves" + species_restricted = list("exclude",BODYTYPE_GOLEM,BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM) \ No newline at end of file diff --git a/code/modules/clothing/gloves/xeno/unathi.dm b/code/modules/clothing/gloves/xeno/unathi.dm new file mode 100644 index 00000000000..73010559ca7 --- /dev/null +++ b/code/modules/clothing/gloves/xeno/unathi.dm @@ -0,0 +1,11 @@ +/obj/item/clothing/gloves/unathi + name = "cloth handwraps" + desc = "A roll of treated cloth used for wrapping clawed hands. Its growing popularity among unathi can be attributed to the cheap nature of its production and the utility it may provide in a pinch." + icon = 'icons/obj/unathi_items.dmi' + icon_state = "handwrap" + item_state = "handwrap" + contained_sprite = TRUE + species_restricted = null + slot_flags = SLOT_GLOVES|SLOT_WRISTS + drop_sound = 'sound/items/drop/cloth.ogg' + pickup_sound = 'sound/items/pickup/cloth.ogg' \ No newline at end of file diff --git a/code/modules/clothing/head/berets.dm b/code/modules/clothing/head/berets.dm index 51213e56f1a..43b4f624e65 100644 --- a/code/modules/clothing/head/berets.dm +++ b/code/modules/clothing/head/berets.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/clothing/hats/berets.dmi' icon_state = "beret" item_state = "beret" + item_flags = SHOWFLAVORTEXT contained_sprite = TRUE siemens_coefficient = 0.9 diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 24d1c0df1f3..cdf5bb96de2 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -17,6 +17,7 @@ flags_inv = 0 w_class = ITEMSIZE_NORMAL siemens_coefficient = 0.9 + max_pressure_protection = FIRESUIT_MAX_PRESSURE light_wedge = LIGHT_WIDE drop_sound = 'sound/items/drop/helm.ogg' pickup_sound = 'sound/items/pickup/helm.ogg' @@ -44,8 +45,13 @@ name = "atmospheric firefighter helmet" desc = "An atmospheric firefighter's helmet, able to keep the user protected from heat and fire." max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE + 15000 + icon = 'icons/clothing/kit/firefighter.dmi' icon_state = "atmos_fire" item_state = "atmos_fire" + icon_auto_adapt = TRUE + icon_supported_species_tags = list("una", "taj") + contained_sprite = TRUE + min_pressure_protection = FIRESUIT_MIN_PRESSURE /obj/item/clothing/head/hardhat/first_responder name = "medical helmet" @@ -53,3 +59,28 @@ icon_state = "helmet_paramed" item_state = "helmet_paramed" light_overlay = "EMS_light" + +/obj/item/clothing/head/hardhat/firefighter + name = "firefighter helmet" + desc = "A complete, face covering helmet specially designed for firefighting. It is airtight and has a port for internals." + icon = 'icons/clothing/kit/firefighter.dmi' + icon_state = "helmet_firefighter" + item_state = "helmet_firefighter" + icon_auto_adapt = TRUE + icon_supported_species_tags = list("una", "taj") + contained_sprite = TRUE + item_flags = THICKMATERIAL | AIRTIGHT + max_pressure_protection = FIRESUIT_MAX_PRESSURE + min_pressure_protection = FIRESUIT_MIN_PRESSURE + permeability_coefficient = 0 + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + body_parts_covered = HEAD|FACE|EYES + cold_protection = HEAD + min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE + flash_protection = FLASH_PROTECTION_MODERATE + +/obj/item/clothing/head/hardhat/firefighter/chief + name = "chief firefighter helmet" + desc = "A complete, face covering helmet specially designed for firefighting. This one is in the colors of the Chief Engineer. It is airtight and has a port for internals." + icon_state = "helmet_firefighter_ce" + item_state = "helmet_firefighter_ce" \ No newline at end of file diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index a84fb95de3d..272a9dbadef 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -422,42 +422,4 @@ brightness_on = 6 light_wedge = LIGHT_WIDE camera = /obj/machinery/camera/network/tcfl - on = 0 - -/obj/item/clothing/head/helmet/legion_pilot - name = "foreign legion flight helmet" - desc = "A helmet with an aged pilot visor mounted to it. The visor feeds its wearer in-flight information via a heads-up display." - icon_state = "legion_pilot_up" - body_parts_covered = null - flags_inv = BLOCKHEADHAIR - armor = list( - melee = ARMOR_MELEE_KNIVES, - bullet = ARMOR_BALLISTIC_SMALL, - laser = ARMOR_LASER_SMALL, - energy = ARMOR_ENERGY_MINOR, - bomb = ARMOR_BOMB_PADDED - ) - camera = /obj/machinery/camera/network/tcfl - siemens_coefficient = 0.35 - action_button_name = "Flip Pilot Visor" - -/obj/item/clothing/head/helmet/legion_pilot/attack_self() - flip_visor() - -/obj/item/clothing/head/helmet/legion_pilot/verb/flip_visor() - set category = "Object" - set name = "Flip pilot visor" - var/mob/living/carbon/human/user - if(istype(usr,/mob/living/carbon/human)) - user = usr - else - return - if(icon_state == initial(icon_state)) - icon_state = "legion_pilot" - to_chat(user, "You flip down the pilot visor.") - sound_to(user, 'sound/items/goggles_charge.ogg') - else - icon_state = initial(icon_state) - to_chat(user, "You flip up the pilot visor.") - update_clothing_icon() - user.update_action_buttons() + on = 0 \ No newline at end of file diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 5d24c2aa367..0928f963952 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -228,8 +228,9 @@ /obj/item/clothing/head/fez name = "fez" - icon_state = "fez" desc = "You should wear a fez. Fezzes are cool." + icon_state = "fez" + item_flags = SHOWFLAVORTEXT //end bs12 hats @@ -531,7 +532,7 @@ /obj/item/clothing/head/navy name = "sol navy utility cover" - desc = "An eight pointed cover issued to Sol Alliance navy members as part of their field uniform." + desc = "A military cover issued to Sol Alliance navy members as part of their field uniform." icon = 'icons/obj/sol_uniform.dmi' icon_state = "greyutility" item_state = "greyutility" @@ -556,32 +557,32 @@ contained_sprite = 1 /obj/item/clothing/head/dress - name = "sol navy dress cap" - desc = "A white cap issued as part of the Sol Alliance navy dress uniform." + name = "sol navy black peaked cap" + desc = "A black cap issued as part of the Sol Alliance naval officer uniforms. This one is worn by junior officers." icon = 'icons/obj/sol_uniform.dmi' icon_state = "whitepeakcap" item_state = "whitepeakcap" contained_sprite = 1 /obj/item/clothing/head/dress/marine - name = "sol marine dress cap" - desc = "A green cap issued as part of the Sol Alliance marine dress uniform." + name = "sol marine peaked cap" + desc = "A green cap issued as part of the Sol Alliance marine service and dress uniforms." icon = 'icons/obj/sol_uniform.dmi' icon_state = "whitepeakcap" item_state = "whitepeakcap" contained_sprite = 1 /obj/item/clothing/head/dress/officer - name = "sol navy officer dress cap" - desc = "A white cap issued as part of the Sol Alliance navy officers dress uniform." + name = "sol navy officer peaked cap" + desc = "A white cap issued as part of the Sol Alliance naval officer uniforms. This one is worn by senior officers." icon = 'icons/obj/sol_uniform.dmi' icon_state = "whitewheelcap" item_state = "whitewheelcap" contained_sprite = 1 /obj/item/clothing/head/dress/admiral - name = "sol navy admiral dress cap" - desc = "A fancy looking cap issued to a higher member of the Sol Alliance navy." + name = "sol navy admiral peaked cap" + desc = "A white cap issued as part of the Sol Alliance naval officer uniforms. This one is worn by admirals." icon = 'icons/obj/sol_uniform.dmi' icon_state = "admiral_cap" item_state = "admiral_cap" diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm new file mode 100644 index 00000000000..0560f6025fd --- /dev/null +++ b/code/modules/clothing/head/pilot_helmet.dm @@ -0,0 +1,99 @@ +/obj/item/clothing/head/helmet/pilot + name = "flight helmet" + desc = "A helmet flip-down pilot visor mounted to it. The visor feeds its wearer in-flight information via a heads-up display." + icon = 'icons/clothing/head/pilot_helmets.dmi' + icon_state = "pilot_helmet" + item_state = "pilot_helmet" + contained_sprite = TRUE + flags_inv = BLOCKHEADHAIR + armor = list( + melee = ARMOR_MELEE_KNIVES, + bullet = ARMOR_BALLISTIC_SMALL, + laser = ARMOR_LASER_SMALL, + energy = ARMOR_ENERGY_MINOR, + bomb = ARMOR_BOMB_PADDED + ) + siemens_coefficient = 0.35 + action_button_name = "Flip Pilot Visor" + + var/flipped_up = FALSE + var/obj/machinery/computer/shuttle_control/linked_console + var/obj/pilot_overlay_holder/hud_overlay + +/obj/item/clothing/head/helmet/pilot/Initialize() + . = ..() + hud_overlay = new(src) + set_hud_maptext("Shuttle Status: No Shuttle Linked.") + +/obj/item/clothing/head/helmet/pilot/Destroy() + if(linked_console) + linked_console.linked_helmets -= src + linked_console = null + return ..() + +/obj/item/clothing/head/helmet/pilot/attack_self() + flip_visor() + +/obj/item/clothing/head/helmet/pilot/verb/flip_visor() + set name = "Flip Pilot Visor" + set category = "Object" + + var/mob/living/carbon/human/user = usr + if(!istype(user)) + return + + flipped_up = !flipped_up + if(flipped_up) + icon_state = "[initial(icon_state)]_up" + item_state = "[initial(item_state)]_up" + body_parts_covered = HEAD + to_chat(user, SPAN_NOTICE("You flip up the pilot visor.")) + check_hud_overlay(user) + else + icon_state = initial(icon_state) + item_state = initial(item_state) + body_parts_covered = HEAD|EYES + to_chat(user, SPAN_NOTICE("You flip down the pilot visor.")) + sound_to(user, 'sound/items/goggles_charge.ogg') + check_hud_overlay(user) + update_clothing_icon() + user.update_action_buttons() + +/obj/item/clothing/head/helmet/pilot/dropped(mob/user) + . = ..() + check_hud_overlay(user) + +/obj/item/clothing/head/helmet/pilot/equipped(mob/user, slot, assisted_equip) + . = ..() + check_hud_overlay(user, slot) + +/obj/item/clothing/head/helmet/pilot/proc/check_hud_overlay(var/mob/user, var/equip_slot) + if(!user.client) + return + if(!equip_slot) + equip_slot = get_equip_slot() + if(!flipped_up && (equip_slot == slot_head)) + user.client.screen |= hud_overlay + else + user.client.screen -= hud_overlay + +/obj/item/clothing/head/helmet/pilot/proc/set_hud_maptext(var/text) + if(length(text) > 26) + hud_overlay.screen_loc = "CENTER:-80,NORTH:-6" // text longer than 26 usually breaks into two lines, we need to shift the screen_loc else it looks weird + else + hud_overlay.screen_loc = initial(screen_loc) + hud_overlay.maptext = SMALL_FONTS(7, "
    [text]
    ") + +/obj/item/clothing/head/helmet/pilot/legion + name = "foreign legion flight helmet" + desc = "A helmet clearly belonging to a TCFL pilot, it has aged pilot visor mounted to it. The visor feeds its wearer in-flight information via a heads-up display." + icon_state = "legion_pilot" + item_state = "legion_pilot" + camera = /obj/machinery/camera/network/tcfl + +/obj/pilot_overlay_holder + name = null + icon = null + icon_state = null + screen_loc = "CENTER:-80,NORTH" + maptext_width = 192 \ No newline at end of file diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index dab69ffbb32..7d7b7a93de7 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -3,6 +3,7 @@ desc = "It's a softcap in a tasteless color." icon = 'icons/obj/clothing/hats/soft_caps.dmi' icon_state = "softcap" + item_flags = SHOWFLAVORTEXT contained_sprite = TRUE var/flipped = FALSE siemens_coefficient = 0.9 @@ -13,12 +14,6 @@ flipped = FALSE ..() -/obj/item/clothing/head/softcap/on_slotmove() - icon_state = initial(icon_state) - item_state = icon_state - flipped = FALSE - ..() - /obj/item/clothing/head/softcap/verb/ToggleHat() set name = "Flip Hat" set category = "Object" diff --git a/code/modules/clothing/head/xenos/tajara.dm b/code/modules/clothing/head/xenos/tajara.dm index 941acd87cd2..d1a825648c1 100644 --- a/code/modules/clothing/head/xenos/tajara.dm +++ b/code/modules/clothing/head/xenos/tajara.dm @@ -59,11 +59,25 @@ icon = 'icons/obj/tajara_items.dmi' icon_state = "praberet" item_state = "praberet" + contained_sprite = TRUE + +/obj/item/clothing/head/beret/tajaran/dpra + name = "liberation army beret" + desc = "A beret issued to liberation army soldiers." + icon = 'icons/obj/tajara_items.dmi' + icon_state = "alaberet" + item_state = "alaberet" + contained_sprite = TRUE + +/obj/item/clothing/head/beret/tajaran/dpra/alt + icon_state = "alaberetalt" + item_state = "alaberetalt" /obj/item/clothing/head/beret/tajaran/raakti_shariim name = "\improper Raakti Shariim beret" desc = "A blue beret with a pale-gold twin-suns insignia, signifying a Constable of the NKA's Raakti Shariim." - icon = 'icons/obj/clothing/species/tajaran/raakti_shariim.dmi' + icon = 'icons/obj/tajara_items.dmi' + contained_sprite = TRUE icon_state = "raakti_shariim_beret" item_state = "raakti_shariim_beret" desc_fluff = "The Raakti Shariim (Royal Peacekeepers in Ceti Basic) are the New Kingdom of Adhomai's policing and \ diff --git a/code/modules/clothing/head/xenos/unathi.dm b/code/modules/clothing/head/xenos/unathi.dm index 6de145836b5..63efa3a678a 100644 --- a/code/modules/clothing/head/xenos/unathi.dm +++ b/code/modules/clothing/head/xenos/unathi.dm @@ -1,7 +1,26 @@ -/obj/item/clothing/head/sinta_ronin +/obj/item/clothing/head/unathi name = "straw hat" desc = "A simple straw hat, completely protecting the head from harsh sun and heavy rain." icon = 'icons/obj/unathi_items.dmi' icon_state = "ronin_hat" item_state = "ronin_hat" - contained_sprite = TRUE \ No newline at end of file + contained_sprite = TRUE + +/obj/item/clothing/head/unathi/maxtlatl + name = "Th'akhist headgear" + desc = "A traditional garment worn by Th'akh shamans. Popular adornments include dried and pressed grass; \ + alternatively, colorful feathers from talented hunters are sometimes used." + desc_fluff = "The headgear of the Th'akhist ensemble has a special component to it. Besides the emulated \ + frills made with straw or feathers, the authentic Unathite skull is from the bones of the previous owner, the \ + deceased shaman that came before. Other cultures see it as barbaric; Unathi believe that this enables shamans \ + to call upon their predecessors' wisdom as spirits to empower them." + icon_state = "maxtlatl-head" + item_state = "maxtlatl-head" + +/obj/item/clothing/head/unathi/maxtlatl/worn_overlays(icon_file, slot) + . = ..() + if(slot == slot_head) + var/mutable_appearance/M = mutable_appearance(icon_file, "[item_state]_translate") + M.appearance_flags = RESET_COLOR|RESET_ALPHA + M.pixel_y = 12 + . += M \ No newline at end of file diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 99b1ccf0fe2..8dde237a754 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -2,7 +2,7 @@ name = "gas mask" desc = "A face-covering mask that can be connected to an air supply. Filters harmful gases from the air." icon_state = "gas_alt" - item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT + item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | THICKMATERIAL flags_inv = HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = FACE|EYES w_class = ITEMSIZE_NORMAL @@ -78,18 +78,6 @@ item_state = "swat" siemens_coefficient = 0.7 -/obj/item/clothing/mask/gas/clown_hat - name = "clown wig and mask" - desc = "A true prankster's facial attire. A clown is incomplete without their wig and mask." - icon_state = "clown" - item_state = "clown" - -/obj/item/clothing/mask/gas/sexyclown - name = "sexy-clown wig and mask" - desc = "A feminine clown mask for the dabbling crossdressers or female entertainers." - icon_state = "sexyclown" - item_state = "sexyclown" - /obj/item/clothing/mask/gas/mime name = "mime mask" desc = "The traditional mime's mask. It has an eerie facial posture." diff --git a/code/modules/clothing/masks/xeno/unathi.dm b/code/modules/clothing/masks/xeno/unathi.dm new file mode 100644 index 00000000000..09bef00a772 --- /dev/null +++ b/code/modules/clothing/masks/xeno/unathi.dm @@ -0,0 +1,10 @@ +/obj/item/clothing/mask/gas/unathi + name = "Th'akhist head wrappings" + desc = "A bunch of stitched together bandages on a fibreglass breath mask that also contains openings for the \ + eyes. Looks tailored for a Unathi." + desc_fluff = "This is considered humble Sinta wear for Th'akh shamans— most Unathi don't wear these, barring Aut'akh." + icon = 'icons/obj/unathi_items.dmi' + icon_state = "thakh_mask" + item_state = "thakh_mask" + species_restricted = list(BODYTYPE_UNATHI) + contained_sprite = TRUE \ No newline at end of file diff --git a/code/modules/clothing/rings/rings.dm b/code/modules/clothing/rings/rings.dm index e909a4797c7..7b0fb3cd96c 100644 --- a/code/modules/clothing/rings/rings.dm +++ b/code/modules/clothing/rings/rings.dm @@ -38,9 +38,10 @@ /obj/item/clothing/ring/reagent/sleepy name = "silver ring" desc = "A ring made from what appears to be silver." + desc_antag = "This ring has a hidden injector that will activate when worn, administering a strong sedative. It is safe to hold in your hands." icon_state = "material" origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - reagents_to_add = list(/decl/reagent/polysomnine = 15) + reagents_to_add = list(/decl/reagent/polysomnine = 10) //Seals and Signet Rings diff --git a/code/modules/clothing/sets/infiltrator.dm b/code/modules/clothing/sets/infiltrator.dm new file mode 100644 index 00000000000..8a37caad2a5 --- /dev/null +++ b/code/modules/clothing/sets/infiltrator.dm @@ -0,0 +1,75 @@ +/obj/item/clothing/mask/breath/infiltrator + name = "infiltration balaclava" + desc = "A close-fitting airtight balaclava that can be connected to an air supply." + icon = 'icons/clothing/kit/infiltrator.dmi' + icon_state = "mask" + item_state = "mask" + icon_auto_adapt = TRUE + icon_supported_species_tags = list("una", "taj") + contained_sprite = TRUE + adjustable = FALSE + item_flags = THICKMATERIAL | INJECTIONPORT | AIRTIGHT + flags_inv = HIDEFACE|BLOCKHAIR + body_parts_covered = HEAD|FACE|EYES + max_pressure_protection = SPACE_SUIT_MAX_PRESSURE + min_pressure_protection = 0 + +/obj/item/clothing/under/infiltrator + name = "infiltration suit" + desc = "A tight undersuit with thin pieces of armor bolted to it. It's airtight." + icon = 'icons/clothing/kit/infiltrator.dmi' + icon_state = "uniform" + item_state = "uniform" + contained_sprite = TRUE + item_flags = THICKMATERIAL | INJECTIONPORT | AIRTIGHT + armor = list( + melee = ARMOR_MELEE_SMALL, + bullet = ARMOR_BALLISTIC_SMALL, + laser = ARMOR_LASER_SMALL + ) + max_pressure_protection = SPACE_SUIT_MAX_PRESSURE + min_pressure_protection = 0 + +/obj/item/clothing/gloves/infiltrator + name = "infiltration gloves" + desc = "Tight insulated gloves with interwoven self-cleaning material. It's airtight." + icon = 'icons/clothing/kit/infiltrator.dmi' + icon_state = "gloves" + item_state = "gloves" + contained_sprite = TRUE + siemens_coefficient = 0 + permeability_coefficient = 0.05 + germ_level = 0 + fingerprint_chance = 0 + item_flags = THICKMATERIAL | INJECTIONPORT | AIRTIGHT + max_pressure_protection = SPACE_SUIT_MAX_PRESSURE + min_pressure_protection = 0 + species_restricted = null + +/obj/item/clothing/shoes/infiltrator + name = "infiltration shoes" + desc = "Tight shoes with in-built Silent-Soles. It's airtight." + icon = 'icons/clothing/kit/infiltrator.dmi' + icon_state = "shoes" + item_state = "shoes" + contained_sprite = TRUE + silent = TRUE + item_flags = THICKMATERIAL | INJECTIONPORT | AIRTIGHT + max_pressure_protection = SPACE_SUIT_MAX_PRESSURE + min_pressure_protection = 0 + species_restricted = null + +/obj/item/storage/toolbox/infiltration + name = "infiltration case" + desc = "A case with an ominous red \"S\" painted on it. It seems pretty hefty." + icon = 'icons/clothing/kit/infiltrator.dmi' + icon_state = "case" + item_state = "case" + contained_sprite = TRUE + item_icons = null + starts_with = list( + /obj/item/clothing/mask/breath/infiltrator = 1, + /obj/item/clothing/under/infiltrator = 1, + /obj/item/clothing/gloves/infiltrator = 1, + /obj/item/clothing/shoes/infiltrator = 1 + ) \ No newline at end of file diff --git a/code/modules/clothing/shoes/jobs.dm b/code/modules/clothing/shoes/jobs.dm index 5618fa581e3..c1c2f4e39aa 100644 --- a/code/modules/clothing/shoes/jobs.dm +++ b/code/modules/clothing/shoes/jobs.dm @@ -9,6 +9,7 @@ species_restricted = null drop_sound = 'sound/items/drop/rubber.ogg' pickup_sound = 'sound/items/pickup/rubber.ogg' + sprite_sheets = list("Tajara" = 'icons/mob/species/tajaran/shoes.dmi') /obj/item/clothing/shoes/jackboots name = "black boots" @@ -42,8 +43,7 @@ desc = "Modified pair of boots, particularly friendly to those species whose toes hold claws." icon_state = "jackboots_toeless" species_restricted = null - sprite_sheets = list( - BODYTYPE_TAJARA = 'icons/mob/species/tajaran/shoes.dmi') + sprite_sheets = list(BODYTYPE_TAJARA = 'icons/mob/species/tajaran/shoes.dmi') /obj/item/clothing/shoes/jackboots/toeless/knee name = "knee-high toeless black boots" @@ -80,8 +80,7 @@ desc = "A pair of toeless work boots designed for use in industrial settings. Modified for species whose toes have claws." icon_state = "workboots_toeless" species_restricted = null - sprite_sheets = list( - BODYTYPE_TAJARA = 'icons/mob/species/tajaran/shoes.dmi') + sprite_sheets = list(BODYTYPE_TAJARA = 'icons/mob/species/tajaran/shoes.dmi') /obj/item/clothing/shoes/workboots/grey name = "grey workboots" diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 33084ed2dfc..f2368bd5a17 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -7,6 +7,7 @@ species_restricted = null force = 5 overshoes = 1 + item_flags = THICKMATERIAL|AIRTIGHT|INJECTIONPORT var/magpulse = 0 var/icon_base = "magboots" action_button_name = "Toggle Magboots" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index e9771178c3b..6eaf79039ec 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -38,6 +38,7 @@ /obj/item/clothing/shoes/swat/ert species_restricted = null + sprite_sheets = list("Tajara" = 'icons/mob/species/tajaran/shoes.dmi') /obj/item/clothing/shoes/combat //Basically SWAT shoes combined with galoshes. name = "combat boots" @@ -68,7 +69,8 @@ name = "sandals" icon_state = "sandals" species_restricted = null - body_parts_covered = 0 + body_parts_covered = FALSE + sprite_sheets = list("Tajara" = 'icons/mob/species/tajaran/shoes.dmi') /obj/item/clothing/shoes/sandal/marisa desc = "A pair of magic, black shoes." @@ -82,30 +84,14 @@ desc = "A pair of foam flip flops. For those not afraid to show a little ankle." icon_state = "thongsandal" item_state = "thongsandal" + sprite_sheets = list("Tajara" = 'icons/mob/species/tajaran/shoes.dmi') obj/item/clothing/shoes/sandal/clogs name = "plastic clogs" desc = "A pair of plastic clog shoes." icon_state = "clogs" item_state = "clogs" - -/obj/item/clothing/shoes/clown_shoes - desc = "The prankster's standard-issue clowning shoes. Damn they're huge!" - name = "clown shoes" - icon_state = "clown" - item_state = "clown_shoes" - slowdown = 1 - species_restricted = null - -/obj/item/clothing/shoes/clown_shoes/handle_movement(var/turf/walking, var/running) - if(!running) - if(footstep >= 2) - footstep = 0 - playsound(src, /decl/sound_category/clown_sound, 20, 1) - else - footstep++ - else - playsound(src, /decl/sound_category/clown_sound, 50, 1) // Running is louder. + sprite_sheets = list("Tajara" = 'icons/mob/species/tajaran/shoes.dmi') /obj/item/clothing/shoes/cyborg name = "cyborg boots" @@ -174,6 +160,7 @@ obj/item/clothing/shoes/sandal/clogs silent = 1 drop_sound = 'sound/items/drop/cloth.ogg' pickup_sound = 'sound/items/pickup/cloth.ogg' + move_trail = null /obj/item/clothing/shoes/cowboy name = "cowboy boots" @@ -204,7 +191,7 @@ obj/item/clothing/shoes/sandal/clogs /obj/item/clothing/shoes/heels/attack(mob/living/carbon/M, mob/living/carbon/user, var/target_zone) if(!istype(M) || user.a_intent == "help") return ..() - if(target_zone != BP_EYES && target_zone != BP_HEAD) + if((target_zone != BP_EYES && target_zone != BP_HEAD) || M.eyes_protected(src, FALSE)) return ..() if((user.is_clumsy()) && prob(50)) M = user @@ -287,9 +274,9 @@ obj/item/clothing/shoes/sandal/clogs icon_state = "carpslippers" species_restricted = null silent = TRUE - cold_protection = FEET min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE + sprite_sheets = list("Tajara" = 'icons/mob/species/tajaran/shoes.dmi') /obj/item/clothing/shoes/iac name = "IAC shoes" diff --git a/code/modules/clothing/shoes/xeno/tajara.dm b/code/modules/clothing/shoes/xeno/tajara.dm index 746439823d9..56d9a4e0425 100644 --- a/code/modules/clothing/shoes/xeno/tajara.dm +++ b/code/modules/clothing/shoes/xeno/tajara.dm @@ -7,6 +7,7 @@ body_parts_covered = FEET|LEGS species_restricted = list(BODYTYPE_TAJARA) contained_sprite = TRUE + move_trail = null desc_fluff = "Today the fashion that dominates Adhomai shares few similarities to the clothing of old Furs, linen, hemp, silk and other such fabrics were traded for \ synthetic versions, creating a massive boom in the nylon industry and textile industry in the cities. Jeans, overcoats, army uniforms, parade uniforms, flags, pants, shirts, ties, \ suspenders, overalls are now the fashion of every Tajara from Nal'Tor to Kaltir. The protests of \"Old fashion\" supporters can't stand against how undeniably effective and cheap \ @@ -117,7 +118,7 @@ icon_state = "taj_workboots_dark" item_state = "taj_workboots_dark" -/obj/item/clothing/shoes/tajara/combat //SWAT shoes combined with galoshes. +/obj/item/clothing/shoes/tajara/combat name = "tajaran combat boots" desc = "When you REALLY want to turn up the heat." icon = 'icons/mob/species/tajaran/shoes.dmi' diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index 75dec914f42..2f9e6c3eb88 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -228,3 +228,8 @@ var/global/list/breach_burn_descriptors = list( if(can_breach && breaches && breaches.len) for(var/datum/breach/B in breaches) to_chat(user, "It has \a [B.descriptor].") + +/obj/item/clothing/suit/space/get_pressure_weakness(pressure) + . = ..() + if(can_breach && damage) + . = min(1, . + damage * 0.1) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 550291d0d1a..bdfcb04f46c 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -17,7 +17,8 @@ bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_RESISTANT ) - item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL + max_pressure_protection = FIRESUIT_MAX_PRESSURE + min_pressure_protection = 0 flags_inv = BLOCKHAIR siemens_coefficient = 0.6 @@ -34,7 +35,6 @@ bullet = ARMOR_BALLISTIC_MINOR, laser = ARMOR_LASER_MINOR ) - item_flags = STOPPRESSUREDAMAGE flags_inv = BLOCKHAIR siemens_coefficient = 0.9 @@ -44,7 +44,6 @@ desc = "Ho ho ho. Merrry X-mas!" icon_state = "santahat" item_state = "santahat" - item_flags = STOPPRESSUREDAMAGE flags_inv = BLOCKHAIR body_parts_covered = HEAD @@ -54,7 +53,6 @@ icon_state = "santa" item_state = "santa" slowdown = 0 - item_flags = STOPPRESSUREDAMAGE allowed = list(/obj/item) //for stuffing exta special presents //Space pirate outfit @@ -72,7 +70,6 @@ bio = ARMOR_BIO_SMALL, rad = ARMOR_RAD_MINOR ) - item_flags = STOPPRESSUREDAMAGE flags_inv = BLOCKHAIR body_parts_covered = 0 siemens_coefficient = 0.4 diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 8d3e52650ca..90a83236065 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -201,6 +201,9 @@ if(engage_on_activate && !do_engage(null, user)) return FALSE + if(use_check_and_message(user)) + return FALSE + active = TRUE spawn(1) @@ -217,6 +220,9 @@ if(!active) return FALSE + if(use_check_and_message(user)) + return FALSE + active = FALSE spawn(1) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 2e75828975c..44d8231d8dd 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -73,6 +73,8 @@ usable = TRUE selectable = 1 var/lastteleport + var/phase_in_visual = /obj/effect/temp_visual/phase + var/phase_out_visual = /obj/effect/temp_visual/phase/out engage_string = "Emergency Leap" @@ -88,14 +90,14 @@ holder.spark_system.queue() playsound(T, 'sound/effects/phasein.ogg', 25, 1) playsound(T, 'sound/effects/sparks2.ogg', 50, 1) - anim(T, M, 'icons/mob/mob.dmi', ,"phasein", , M.dir) + new phase_in_visual(T, M.dir) /obj/item/rig_module/teleporter/proc/phase_out(var/mob/M, var/turf/T) if(!M || !T) return playsound(T, /decl/sound_category/spark_sound, 50, 1) - anim(T, M, 'icons/mob/mob.dmi', ,"phaseout", ,M.dir) + new phase_out_visual(T, M.dir) /obj/item/rig_module/teleporter/engage(atom/target, mob/user, var/notify_ai) if(!..()) @@ -149,6 +151,15 @@ lastteleport = world.time return TRUE +/obj/item/rig_module/teleporter/skrell + name = "jargon teleportation module" + + phase_in_visual = /obj/effect/temp_visual/phase/rift + phase_out_visual = /obj/effect/temp_visual/phase/rift + + interface_name = "starshift teleportation module" + interface_desc = "An advanced teleportation system. It is capable of pinpoint precision or random leaps forward." + /obj/item/rig_module/fabricator/energy_net name = "net projector" desc = "Some kind of complex energy projector with a hardsuit mount." diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 7add829a5c7..3697712fa1c 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -461,6 +461,8 @@ /obj/item/rig_module/maneuvering_jets/activate(mob/user) if(active) return FALSE + if(use_check_and_message(user)) + return FALSE active = TRUE diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 210b221e697..298688cd220 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -8,8 +8,9 @@ /obj/item/rig name = "hardsuit control module" - icon = 'icons/obj/rig_modules.dmi' desc = "A back-mounted hardsuit deployment and control mechanism." + icon = 'icons/obj/rig_modules.dmi' + contained_sprite = TRUE slot_flags = SLOT_BACK req_one_access = list() req_access = list() @@ -27,6 +28,9 @@ ) min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE + max_pressure_protection = RIG_MAX_PRESSURE + min_pressure_protection = 0 + siemens_coefficient = 0.35 permeability_coefficient = 0.1 unacidable = 1 @@ -86,7 +90,7 @@ var/offline_slowdown = 3 // If the suit is deployed and unpowered, it sets slowdown to this. var/vision_restriction = TINT_NONE var/offline_vision_restriction = TINT_HEAVY - var/airtight = 1 //If set, will adjust AIRTIGHT and STOPPRESSUREDAMAGE flags on components. Otherwise it should leave them untouched. + var/airtight = 1 //If set, will adjust the AIRTIGHT flag on components. Otherwise it should leave them untouched. var/emp_protection = 0 @@ -157,8 +161,13 @@ piece.canremove = 0 piece.name = "[suit_type] [initial(piece.name)]" piece.desc = "It seems to be part of a [src.name]." - piece.icon_state = "[initial(icon_state)]" + piece.icon = icon + piece.icon_state = "[initial(icon_state)]_[piece.clothing_class()]" piece.item_state = "[initial(icon_state)]" + piece.contained_sprite = TRUE + if(length(icon_supported_species_tags)) + piece.icon_auto_adapt = TRUE + piece.icon_supported_species_tags = icon_supported_species_tags piece.min_cold_protection_temperature = min_cold_protection_temperature piece.max_heat_protection_temperature = max_heat_protection_temperature if(piece.siemens_coefficient > siemens_coefficient) //So that insulated gloves keep their insulation. @@ -210,7 +219,9 @@ if(!piece) continue piece.icon_state = "[initial(icon_state)]" if(airtight) - piece.item_flags &= ~(STOPPRESSUREDAMAGE|AIRTIGHT) + piece.max_pressure_protection = initial(piece.max_pressure_protection) + piece.min_pressure_protection = initial(piece.min_pressure_protection) + piece.item_flags &= ~AIRTIGHT update_icon(1) /obj/item/rig/proc/toggle_seals(var/mob/initiator,var/instant) @@ -254,7 +265,7 @@ else for(var/list/piece_data in list(list(wearer.shoes,boots,"boots",boot_type),list(wearer.gloves,gloves,"gloves",glove_type),list(wearer.head,helmet,"helmet",helm_type),list(wearer.wear_suit,chest,BP_CHEST,chest_type))) - var/obj/item/piece = piece_data[1] + var/obj/item/clothing/piece = piece_data[1] var/obj/item/compare_piece = piece_data[2] var/msg_type = piece_data[3] var/piece_type = piece_data[4] @@ -273,7 +284,7 @@ if(seal_delay && !instant && !do_after(wearer,seal_delay,needhand=0, act_target = src)) failed_to_seal = 1 - piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]" + piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]_[piece.clothing_class()]" piece.item_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]" switch(msg_type) if("boots") @@ -341,9 +352,13 @@ /obj/item/rig/proc/update_component_sealed() for(var/obj/item/piece in list(helmet,boots,gloves,chest)) if(canremove) - piece.item_flags &= ~(STOPPRESSUREDAMAGE|AIRTIGHT) + piece.max_pressure_protection = initial(piece.max_pressure_protection) + piece.min_pressure_protection = initial(piece.min_pressure_protection) + piece.item_flags &= ~AIRTIGHT else - piece.item_flags |= (STOPPRESSUREDAMAGE|AIRTIGHT) + piece.max_pressure_protection = max_pressure_protection + piece.min_pressure_protection = min_pressure_protection + piece.item_flags |= AIRTIGHT update_icon(1) /obj/item/rig/process() diff --git a/code/modules/clothing/spacesuits/rig/rig_construction.dm b/code/modules/clothing/spacesuits/rig/rig_construction.dm index c106daf2df2..8f0ed5b37ef 100644 --- a/code/modules/clothing/spacesuits/rig/rig_construction.dm +++ b/code/modules/clothing/spacesuits/rig/rig_construction.dm @@ -173,27 +173,27 @@ steps = list( //1 list("key"=/obj/item/weldingtool, - "backkey"=/obj/item/wrench, + "backkey"=WRENCH, "desc"="External armor is wrenched"), //2 - list("key"=/obj/item/wrench, - "backkey"=/obj/item/crowbar, + list("key"=WRENCH, + "backkey"=CROWBAR, "desc"="External armor is installed"), //3 list("key"=/obj/item/stack/material/steel, - "backkey"=/obj/item/screwdriver, + "backkey"=SCREWDRIVER, "desc"="Central control module is secured"), //4 - list("key"=/obj/item/screwdriver, - "backkey"=/obj/item/crowbar, + list("key"=SCREWDRIVER, + "backkey"=CROWBAR, "desc"="Central control module is installed"), //5 list("key"=null, - "backkey"=/obj/item/wirecutters, + "backkey"=WIRECUTTER, "desc"="The wiring is adjusted"), //6 - list("key"=/obj/item/wirecutters, - "backkey"=/obj/item/screwdriver, + list("key"=WIRECUTTER, + "backkey"=SCREWDRIVER, "desc"="The wiring is added"), //7 list("key"=/obj/item/stack/cable_coil, @@ -266,11 +266,11 @@ steps = list( //1 list("key"=/obj/item/weldingtool, - "backkey"=/obj/item/wrench, + "backkey"=WRENCH, "desc"="External armor is wrenched."), //2 - list("key"=/obj/item/wrench, - "backkey"=/obj/item/crowbar, + list("key"=WRENCH, + "backkey"=CROWBAR, "desc"="External armor is installed."), //3 list("key"=/obj/item/stack/material/plasteel, @@ -278,43 +278,43 @@ "desc"="Internal armor is welded."), //4 list("key"=/obj/item/weldingtool, - "backkey"=/obj/item/wrench, + "backkey"=WRENCH, "desc"="Internal armor is wrenched"), //5 - list("key"=/obj/item/wrench, - "backkey"=/obj/item/crowbar, + list("key"=WRENCH, + "backkey"=CROWBAR, "desc"="Internal armor is installed"), //6 list("key"=/obj/item/stack/material/steel, - "backkey"=/obj/item/screwdriver, + "backkey"=SCREWDRIVER, "desc"="Advanced scanner module is secured"), //7 - list("key"=/obj/item/screwdriver, - "backkey"=/obj/item/crowbar, + list("key"=SCREWDRIVER, + "backkey"=CROWBAR, "desc"="Advanced scanner module is installed"), //8 list("key"=/obj/item/stock_parts/scanning_module/adv, - "backkey"=/obj/item/screwdriver, + "backkey"=SCREWDRIVER, "desc"="Targeting module is secured"), //9 - list("key"=/obj/item/screwdriver, - "backkey"=/obj/item/crowbar, + list("key"=SCREWDRIVER, + "backkey"=CROWBAR, "desc"="Targeting module is installed"), //10 list("key"=null, - "backkey"=/obj/item/screwdriver, + "backkey"=SCREWDRIVER, "desc"="Central control module is secured"), //11 - list("key"=/obj/item/screwdriver, - "backkey"=/obj/item/crowbar, + list("key"=SCREWDRIVER, + "backkey"=CROWBAR, "desc"="Central control module is installed"), //12 list("key"=null, - "backkey"=/obj/item/wirecutters, + "backkey"=WIRECUTTER, "desc"="The wiring is adjusted"), //13 - list("key"=/obj/item/wirecutters, - "backkey"=/obj/item/screwdriver, + list("key"=WIRECUTTER, + "backkey"=SCREWDRIVER, "desc"="The wiring is added"), //14 list("key"=/obj/item/stack/cable_coil, diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index 77ac4d5d91e..88cf1f1c09e 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -4,36 +4,23 @@ /obj/item/clothing/head/helmet/space/rig name = "helmet" - item_flags = THICKMATERIAL + item_flags = THICKMATERIAL|INJECTIONPORT flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR body_parts_covered = HEAD|FACE|EYES heat_protection = HEAD|FACE|EYES cold_protection = HEAD|FACE|EYES brightness_on = 4 light_wedge = LIGHT_WIDE - sprite_sheets = list( - BODYTYPE_TAJARA = 'icons/mob/species/tajaran/helmet.dmi', - BODYTYPE_SKRELL = 'icons/mob/species/skrell/helmet.dmi', - BODYTYPE_UNATHI = 'icons/mob/species/unathi/helmet.dmi', - BODYTYPE_VAURCA = 'icons/mob/species/vaurca/helmet.dmi', - BODYTYPE_IPC = 'icons/mob/species/machine/helmet.dmi', - ) /obj/item/clothing/gloves/rig name = "gauntlets" - item_flags = THICKMATERIAL + item_flags = THICKMATERIAL|INJECTIONPORT body_parts_covered = HANDS heat_protection = HANDS cold_protection = HANDS species_restricted = null gender = PLURAL punch_force = 5 - sprite_sheets = list( - BODYTYPE_TAJARA = 'icons/mob/species/tajaran/gloves.dmi', - BODYTYPE_UNATHI = 'icons/mob/species/unathi/gloves.dmi', - BODYTYPE_VAURCA = 'icons/mob/species/vaurca/gloves.dmi', - BODYTYPE_IPC = 'icons/mob/species/machine/gloves.dmi', - ) /obj/item/clothing/shoes/magboots/rig name = "boots" @@ -43,12 +30,6 @@ species_restricted = null gender = PLURAL icon_base = null - sprite_sheets = list( - BODYTYPE_TAJARA = 'icons/mob/species/tajaran/shoes.dmi', - BODYTYPE_UNATHI = 'icons/mob/species/unathi/shoes.dmi', - BODYTYPE_VAURCA = 'icons/mob/species/vaurca/shoes.dmi', - BODYTYPE_IPC = 'icons/mob/species/machine/shoes.dmi', - ) /obj/item/clothing/suit/space/rig name = "chestpiece" @@ -57,18 +38,12 @@ heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT|HIDETAIL - item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT + item_flags = THICKMATERIAL|AIRTIGHT|INJECTIONPORT slowdown = 0 //will reach 10 breach damage after 25 laser carbine blasts, 3 revolver hits, or ~1 PTR hit. Completely immune to smg or sts hits. breach_threshold = 38 resilience = 0.2 can_breach = 1 - sprite_sheets = list( - BODYTYPE_TAJARA = 'icons/mob/species/tajaran/suit.dmi', - BODYTYPE_UNATHI = 'icons/mob/species/unathi/suit.dmi', - BODYTYPE_VAURCA = 'icons/mob/species/vaurca/suit.dmi', - BODYTYPE_IPC = 'icons/mob/species/machine/suit.dmi', - ) supporting_limbs = list() @@ -103,7 +78,7 @@ body_parts_covered = HEAD|FACE|EYES heat_protection = HEAD|FACE|EYES cold_protection = HEAD|FACE|EYES - flags = THICKMATERIAL|AIRTIGHT + item_flags = THICKMATERIAL|AIRTIGHT|INJECTIONPORT /obj/item/clothing/suit/lightrig name = "suit" @@ -112,7 +87,7 @@ heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT - flags = THICKMATERIAL + item_flags = THICKMATERIAL|INJECTIONPORT /obj/item/clothing/shoes/lightrig name = "boots" @@ -120,13 +95,14 @@ cold_protection = FEET heat_protection = FEET species_restricted = null + item_flags = THICKMATERIAL|INJECTIONPORT gender = PLURAL /obj/item/clothing/gloves/lightrig name = "gloves" - flags = THICKMATERIAL body_parts_covered = HANDS heat_protection = HANDS cold_protection = HANDS + item_flags = THICKMATERIAL|INJECTIONPORT species_restricted = null gender = PLURAL diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm index 85bdf727d27..d981e2a1ac0 100644 --- a/code/modules/clothing/spacesuits/rig/suits/alien.dm +++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm @@ -2,6 +2,7 @@ name = "NT breacher chassis control module" desc = "A cheap NT knock-off of an Unathi battle-hardsuit. Looks like a fish, moves like a fish, steers like a cow." suit_type = "NT breacher" + icon = 'icons/clothing/rig/unathi_breacher_cheap.dmi' icon_state = "breacher_rig_cheap" armor = list( melee = ARMOR_MELEE_MAJOR, @@ -29,6 +30,7 @@ name = "breacher chassis control module" desc = "An authentic Unathi breacher chassis. Huge, bulky and absurdly heavy. It must be like wearing a tank." suit_type = "breacher chassis" + icon = 'icons/clothing/rig/unathi_breacher.dmi' icon_state = "breacher_rig" armor = list( melee = ARMOR_MELEE_VERY_HIGH, @@ -61,6 +63,7 @@ name = "combat exoskeleton control module" desc = "An ancient piece of equipment from a bygone age, This highly advanced Vaurcan technology rarely sees use outside of a battlefield." suit_type = "combat exoskeleton" + icon = 'icons/clothing/rig/vaurca.dmi' icon_state = "vaurca_rig" armor = list( melee = ARMOR_MELEE_MAJOR, @@ -111,6 +114,7 @@ severe loss of Republican Guard units. Additional funding and focus was placed on a previously shelved proposal for heavily armed shock and high technology assault troopers. A \ special unit designated to withstand the numerical disadvantages and prolonged engagements special forces of the Republic often faces." suit_type = "tesla suit" + icon = 'icons/clothing/rig/tesla.dmi' icon_state = "tesla_rig" armor = list( melee = ARMOR_MELEE_VERY_HIGH, diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm index a9660d66410..9253aa52eb9 100644 --- a/code/modules/clothing/spacesuits/rig/suits/combat.dm +++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm @@ -1,7 +1,9 @@ /obj/item/rig/combat name = "combat hardsuit control module" desc = "A sleek and dangerous hardsuit for active combat. This one is a Stellar Corporate Conglomerate design in color scheme and make." + icon = 'icons/clothing/rig/combat.dmi' icon_state = "combat_rig" + icon_supported_species_tags = list("skr") suit_type = "combat hardsuit" armor = list( melee = ARMOR_MELEE_VERY_HIGH, @@ -21,7 +23,7 @@ allowed_module_types = MODULE_GENERAL | MODULE_LIGHT_COMBAT | MODULE_HEAVY_COMBAT - species_restricted = list(BODYTYPE_HUMAN) + species_restricted = list(BODYTYPE_HUMAN, BODYTYPE_SKRELL) /obj/item/clothing/head/helmet/space/rig/combat light_overlay = "helmet_light_dual_cyan" @@ -41,6 +43,7 @@ /obj/item/rig/military name = "military hardsuit control module" desc = "A powerful hardsuit designed for military operations. This is coated in Solarian military colors." + icon = 'icons/clothing/rig/military.dmi' icon_state = "military_rig" suit_type = "military hardsuit" armor = list( @@ -82,6 +85,18 @@ /obj/item/rig_module/actuators/combat ) +/obj/item/rig/military/fsf + initial_modules = list( + /obj/item/rig_module/mounted, + /obj/item/rig_module/actuators/combat, + /obj/item/rig_module/power_sink, + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/chem_dispenser/combat, + /obj/item/rig_module/grenade_launcher/frag, + /obj/item/rig_module/grenade_launcher, + /obj/item/rig_module/vision/nvg + ) + /obj/item/rig/military/ninja initial_modules = list( /obj/item/rig_module/maneuvering_jets, @@ -101,7 +116,9 @@ /obj/item/rig/retro name = "retrofitted military hardsuit control module" desc = "An old repurposed construction exoskeleton redesigned for combat. Its colors and insignias match those of the Tau Ceti Foreign Legion." + icon = 'icons/clothing/rig/legion.dmi' icon_state = "legion_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una", "vau", "vaw") suit_type = "retrofitted military hardsuit" armor = list( melee = ARMOR_MELEE_MAJOR, @@ -153,6 +170,7 @@ /obj/item/rig/gunslinger name = "gunslinger hardsuit control module" desc = "A favorite of Coalition rangers, the Gunslinger suit is a sturdy hardsuit meant to provide the user absolute situational awareness." + icon = 'icons/clothing/rig/gunslinger.dmi' icon_state = "gunslinger" suit_type = "gunslinger hardsuit" armor = list( @@ -201,6 +219,7 @@ /obj/item/rig/strike name = "strike hardsuit control module" desc = "An expensive hardsuit utilized by Eridani security contractors to field heavy weapons and coordinate non-lethal takedowns directly. Usually seen spearheading police raids." + icon = 'icons/clothing/rig/strikesuit.dmi' icon_state = "strikesuit" suit_type = "strike hardsuit" armor = list( @@ -228,7 +247,24 @@ initial_modules = list( /obj/item/rig_module/fabricator/energy_net, /obj/item/rig_module/power_sink, - /obj/item/rig_module/mounted/taser + /obj/item/rig_module/mounted/egun, + /obj/item/rig_module/actuators/combat, + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/ai_container, + /obj/item/rig_module/vision/nvg + ) + +/obj/item/rig/strike/distress + req_access = list(access_distress) + + initial_modules = list( + /obj/item/rig_module/fabricator/energy_net, + /obj/item/rig_module/power_sink, + /obj/item/rig_module/mounted/taser, + /obj/item/rig_module/actuators/combat, + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/ai_container, + /obj/item/rig_module/vision/sechud ) /obj/item/rig/strike/ninja @@ -251,6 +287,7 @@ /obj/item/rig/elyran name = "elyran battlesuit control module" desc = "An advanced Elyran hardsuit specialized in scorched earth tactics." + icon = 'icons/clothing/rig/elyran_battlesuit.dmi' icon_state = "elyran_rig" suit_type = "elyran battlesuit" armor = list( @@ -301,6 +338,7 @@ /obj/item/rig/bunker name = "bunker suit control module" desc = "A powerful niche-function hardsuit utilized by Ceres' Lance to apprehend synthetics. Unstoppable in the right circumstances, and nothing more than a burden anywhere else." + icon = 'icons/clothing/rig/bunker.dmi' icon_state = "bunker" suit_type = "bunker suit" armor = list( @@ -338,6 +376,7 @@ /obj/item/rig/jinxiang name = "jinxiang-pattern combat suit control module" desc = "An off-shoot of the core Bunker Suit design, utilized by the Imperial Dominian military and painted accordingly. This is a powerful suit specializing in melee confrontations." + icon = 'icons/clothing/rig/jinxiang.dmi' icon_state = "jinxiang" suit_type = "jinxiang combat suit" armor = list( @@ -379,4 +418,4 @@ /obj/item/rig_module/mounted/energy_blade ) - allowed_module_types = MODULE_GENERAL | MODULE_LIGHT_COMBAT | MODULE_HEAVY_COMBAT | MODULE_MEDICAL | MODULE_UTILITY \ No newline at end of file + allowed_module_types = MODULE_GENERAL | MODULE_LIGHT_COMBAT | MODULE_HEAVY_COMBAT | MODULE_MEDICAL | MODULE_UTILITY diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index ad1e7b181de..19ccdb5c266 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -6,7 +6,9 @@ name = "ERT-C hardsuit control module" desc = "A suit worn by the commander of an Emergency Response Team. Has blue highlights." suit_type = "ERT commander" + icon = 'icons/clothing/rig/nt_ert/commander.dmi' icon_state = "ert_commander_rig" + icon_supported_species_tags = list("skr") emp_protection = 35 helm_type = /obj/item/clothing/head/helmet/space/rig/ert req_access = list(access_cent_specops) @@ -24,7 +26,7 @@ allowed = list( /obj/item/device/flashlight, /obj/item/tank, /obj/item/device/t_scanner, /obj/item/rfd/construction, /obj/item/crowbar, \ /obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/device/multitool, \ - /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/storage/briefcase/inflatable, /obj/item/melee/baton, /obj/item/gun, \ + /obj/item/device/radio, /obj/item/device/analyzer, /obj/item/storage/bag/inflatable, /obj/item/melee/baton, /obj/item/gun, \ /obj/item/storage/firstaid, /obj/item/reagent_containers/hypospray, /obj/item/roller,/obj/item/material/twohanded/fireaxe) initial_modules = list( /obj/item/rig_module/ai_container, @@ -40,6 +42,7 @@ name = "ERT-E suit control module" desc = "A suit worn by the engineering division of an Emergency Response Team. Has orange highlights. Less armored than the security variant, but offers full radiation protection." suit_type = "ERT engineer" + icon = 'icons/clothing/rig/nt_ert/engineer.dmi' icon_state = "ert_engineer_rig" emp_protection = 30 armor = list( @@ -66,6 +69,7 @@ name = "ERT-M suit control module" desc = "A suit worn by the medical division of an Emergency Response Team. Has white highlights. Less armored than the security variant, but offers full radiation protection." suit_type = "ERT medic" + icon = 'icons/clothing/rig/nt_ert/medical.dmi' icon_state = "ert_medical_rig" emp_protection = 30 armor = list( @@ -92,6 +96,7 @@ name = "ERT-S suit control module" desc = "A suit worn by the security division of an Emergency Response Team. Has red highlights. Trades full radiation protection for a slightly better armor." suit_type = "ERT security" + icon = 'icons/clothing/rig/nt_ert/security.dmi' icon_state = "ert_security_rig" emp_protection = 30 armor = list( @@ -117,7 +122,9 @@ name = "heavy asset protection suit control module" desc = "A heavy suit worn by the highest level of Asset Protection, don't mess with the person wearing this. Armored and space ready." suit_type = "heavy asset protection" + icon = 'icons/clothing/rig/asset_protection.dmi' icon_state = "asset_protection_rig" + icon_supported_species_tags = null armor = list( melee = ARMOR_MELEE_SHIELDED, bullet = ARMOR_BALLISTIC_RIFLE, @@ -155,6 +162,7 @@ name = "apotheosis suit control module" desc = "A heavy suit with Einstein Engines branding coating it, not to mention the obvious colors." suit_type = "apotheosis" + icon = 'icons/clothing/rig/apotheosis.dmi' icon_state = "apotheosis" req_access = list() diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index c8c9071f20e..33b5a3ee3d4 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -2,7 +2,9 @@ /obj/item/rig/light name = "light suit control module" desc = "A lighter, less armored hardsuit." + icon = 'icons/clothing/rig/light_ninja.dmi' icon_state = "ninja_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una") suit_type = "light suit" allowed = list(/obj/item/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/cell,/obj/item/material/twohanded/fireaxe) armor = list( @@ -14,9 +16,11 @@ ) emp_protection = 10 slowdown = 0 - item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL + item_flags = THICKMATERIAL offline_slowdown = 0 offline_vision_restriction = 0 + max_pressure_protection = LIGHT_RIG_MAX_PRESSURE + min_pressure_protection = 0 chest_type = /obj/item/clothing/suit/space/rig/light helm_type = /obj/item/clothing/head/helmet/space/rig/light @@ -40,6 +44,7 @@ name = "cybersuit control module" suit_type = "cyber" desc = "An advanced powered armor suit with many cyberwarfare enhancements. Comes with built-in insulated gloves for safely tampering with electronics." + icon = 'icons/clothing/rig/light_hacker.dmi' icon_state = "hacker_rig" req_access = list(access_syndicate) @@ -97,7 +102,9 @@ name = "stealth suit control module" suit_type = "stealth suit" desc = "A unique, vacuum-proof suit of nano-enhanced armor designed specifically for stealth operations." + icon = 'icons/clothing/rig/light_ninja.dmi' icon_state = "ninja_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una", "vau", "vaw") armor = list( melee = ARMOR_MELEE_MAJOR, bullet = ARMOR_BALLISTIC_PISTOL, @@ -170,7 +177,9 @@ name = "stealth suit control module" suit_type = "stealth" desc = "A highly advanced and expensive suit designed for covert operations." + icon = 'icons/clothing/rig/light_stealth.dmi' icon_state = "stealth_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una") armor = list( melee = ARMOR_MELEE_MAJOR, bullet = ARMOR_BALLISTIC_SMALL, @@ -194,7 +203,9 @@ name = "exo-stellar skeleton module" suit_type = "exo-stellar skeleton" desc = "A compact exoskeleton that hugs the body tightly and has various inbuilt utilities for life support." + icon = 'icons/clothing/rig/offworlder.dmi' icon_state = "offworlder_rig" + icon_supported_species_tags = null allowed = list(/obj/item/tank, /obj/item/device/flashlight) armor = list( bio = ARMOR_BIO_MINOR, @@ -229,6 +240,7 @@ /obj/item/rig/light/offworlder/techno name = "techno-conglomerate mobility hardsuit control module" desc = "A sleek hardsuit used by the Coalition forces of the Techno-Conglomerate." + icon = 'icons/clothing/rig/techno.dmi' icon_state = "techno_rig" suit_type = "techno-conglomerate mobility hardsuit" armor = list( @@ -240,12 +252,12 @@ bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_SHIELDED ) - item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL slowdown = -1 offline_slowdown = 0 airtight = 1 offline_vision_restriction = TINT_HEAVY siemens_coefficient = 0.2 + icon_supported_species_tags = null allowed = list( /obj/item/device/flashlight, diff --git a/code/modules/clothing/spacesuits/rig/suits/merc.dm b/code/modules/clothing/spacesuits/rig/suits/merc.dm index 7b13529667f..448bfcb4cd3 100644 --- a/code/modules/clothing/spacesuits/rig/suits/merc.dm +++ b/code/modules/clothing/spacesuits/rig/suits/merc.dm @@ -6,7 +6,9 @@ /obj/item/rig/merc name = "crimson hardsuit control module" desc = "A blood-red hardsuit featuring some fairly illegal technology." + icon = 'icons/clothing/rig/merc_crimson.dmi' icon_state = "merc_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una") suit_type = "crimson hardsuit" armor = list( melee = ARMOR_MELEE_VERY_HIGH, @@ -70,6 +72,7 @@ /obj/item/rig/merc/distress name = "rhino hardsuit control module" desc = "A combat hardsuit utilized by many private military companies, packing some seriously heavy plating." + icon = 'icons/clothing/rig/rhino.dmi' icon_state = "rhino" suit_type = "rhino hardsuit" armor = list( diff --git a/code/modules/clothing/spacesuits/rig/suits/skrell.dm b/code/modules/clothing/spacesuits/rig/suits/skrell.dm new file mode 100644 index 00000000000..10e8ebfde04 --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/suits/skrell.dm @@ -0,0 +1,84 @@ +/obj/item/clothing/head/helmet/space/rig/skrell + light_overlay = "helmet_light_jargon_rig" + light_color = LIGHT_COLOR_CYAN + +/obj/item/rig/skrell + name = "jargon suit control module" + desc = "A suit control module designed by the Jargon Federation for JFSF operations. It is designed to be sleek and agile, equipped with best protection and technology the Federation has to offer for its elite." + icon = 'icons/clothing/rig/jargon.dmi' + icon_state = "jargon_rig" + suit_type = "jargon suit" + armor = list( + melee = ARMOR_MELEE_VERY_HIGH, + bullet = ARMOR_BALLISTIC_RIFLE, + laser = ARMOR_LASER_AP, + energy = ARMOR_ENERGY_RESISTANT, + bomb = ARMOR_BOMB_PADDED, + bio = ARMOR_BIO_SHIELDED, + rad = ARMOR_RAD_SHIELDED + ) + siemens_coefficient = 0.1 + emp_protection = 30 + vision_restriction = 0 + slowdown = 0 + offline_slowdown = 3 + vision_restriction = TINT_NONE + species_restricted = list("Skrell") + + helm_type = /obj/item/clothing/head/helmet/space/rig/skrell + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/melee/energy/sword,/obj/item/handcuffs,/obj/item/material/twohanded/fireaxe) + + initial_modules = list( + /obj/item/rig_module/ai_container, + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/grenade_launcher, + /obj/item/rig_module/vision/multi, + /obj/item/rig_module/mounted/pulse, + /obj/item/rig_module/chem_dispenser/combat, + /obj/item/rig_module/chem_dispenser/injector, + /obj/item/rig_module/device/drill, + /obj/item/rig_module/device/rfd_c, + /obj/item/rig_module/datajack, + /obj/item/rig_module/actuators/combat + ) + + allowed_module_types = MODULE_GENERAL | MODULE_LIGHT_COMBAT | MODULE_HEAVY_COMBAT | MODULE_SPECIAL + +/obj/item/clothing/head/helmet/space/rig/skrell/tup + light_overlay = "helmet_light_tadpole" + +/obj/item/rig/skrell/tup + name = "tup suit control module" + desc = "A suit control module designed by the Jargon Federation for Tup operations. The best of the best." + icon = 'icons/clothing/rig/tup.dmi' + icon_state = "tup_rig" + suit_type = "tup suit" + armor = list( + melee = ARMOR_MELEE_VERY_HIGH, + bullet = ARMOR_BALLISTIC_AP, + laser = ARMOR_LASER_AP, + energy = ARMOR_ENERGY_STRONG, + bomb = ARMOR_BOMB_RESISTANT, + bio = ARMOR_BIO_SHIELDED, + rad = ARMOR_RAD_SHIELDED + ) + emp_protection = 95 + + helm_type = /obj/item/clothing/head/helmet/space/rig/skrell/tup + + initial_modules = list( + /obj/item/rig_module/ai_container, + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/grenade_launcher, + /obj/item/rig_module/vision/multi, + /obj/item/rig_module/mounted/pulse, + /obj/item/rig_module/chem_dispenser/combat, + /obj/item/rig_module/chem_dispenser/injector, + /obj/item/rig_module/device/drill, + /obj/item/rig_module/device/rfd_c, + /obj/item/rig_module/datajack, + /obj/item/rig_module/actuators/combat, + /obj/item/rig_module/teleporter/skrell + ) + + allowed_module_types = MODULE_GENERAL | MODULE_LIGHT_COMBAT | MODULE_HEAVY_COMBAT | MODULE_SPECIAL \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 9a98955e3d9..3026b136dce 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -26,7 +26,9 @@ name = "augmented tie" suit_type = "augmented suit" desc = "Prepare for paperwork." + icon = 'icons/clothing/rig/tie.dmi' icon_state = "internalaffairs_rig" + icon_supported_species_tags = null armor = null siemens_coefficient = 0.9 slowdown = 0 @@ -38,8 +40,9 @@ req_access = list() req_one_access = list() - glove_type = null helm_type = null + suit_type = null + glove_type = null boot_type = null allowed_module_types = MODULE_GENERAL | MODULE_LIGHT_COMBAT | MODULE_HEAVY_COMBAT | MODULE_SPECIAL | MODULE_MEDICAL | MODULE_UTILITY | MODULE_VAURCA @@ -64,7 +67,9 @@ name = "industrial suit control module" suit_type = "industrial hardsuit" desc = "A heavy, powerful hardsuit used by construction crews and mining corporations." + icon = 'icons/clothing/rig/industrial.dmi' icon_state = "industrial_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una") armor = list( melee = ARMOR_MELEE_RESISTANT, bullet = ARMOR_BALLISTIC_PISTOL, @@ -79,6 +84,8 @@ offline_slowdown = 7 offline_vision_restriction = TINT_HEAVY emp_protection = -20 + max_pressure_protection = FIRESUIT_MAX_PRESSURE + min_pressure_protection = 0 helm_type = /obj/item/clothing/head/helmet/space/rig/industrial chest_type = /obj/item/clothing/suit/space/rig/industrial @@ -111,7 +118,9 @@ name = "EVA suit control module" suit_type = "EVA hardsuit" desc = "A light hardsuit for repairs and maintenance to the outside of habitats and vessels." + icon = 'icons/clothing/rig/eva.dmi' icon_state = "eva_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una") armor = list( melee = ARMOR_MELEE_RESISTANT, bullet = ARMOR_BALLISTIC_MINOR, @@ -128,7 +137,7 @@ helm_type = /obj/item/clothing/head/helmet/space/rig/eva glove_type = /obj/item/clothing/gloves/rig/eva - allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction,/obj/item/material/twohanded/fireaxe,/obj/item/storage/backpack/cell) + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction,/obj/item/material/twohanded/fireaxe,/obj/item/storage/backpack/cell) req_access = list() req_one_access = list() @@ -159,7 +168,9 @@ name = "advanced voidsuit control module" suit_type = "advanced voidsuit" desc = "An advanced voidsuit that protects against hazardous, low pressure environments. Shines with a high polish." + icon = 'icons/clothing/rig/ce.dmi' icon_state = "ce_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una") armor = list( melee = ARMOR_MELEE_RESISTANT, bullet = ARMOR_BALLISTIC_SMALL, @@ -173,11 +184,13 @@ offline_slowdown = 3 offline_vision_restriction = 0 max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE / 1.5 // Good against fires, but not as good as a proper firesuit / atmos voidsuit + max_pressure_protection = FIRESUIT_MAX_PRESSURE + min_pressure_protection = 0 helm_type = /obj/item/clothing/head/helmet/space/rig/ce glove_type = /obj/item/clothing/gloves/rig/ce - allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction,/obj/item/storage/backpack/cell,/obj/item/storage/toolbox) + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction,/obj/item/storage/backpack/cell,/obj/item/storage/toolbox,/obj/item/storage/bag/inflatable) req_access = list() req_one_access = list() @@ -203,7 +216,9 @@ name = "AMI control module" suit_type = "hazmat hardsuit" desc = "An Anomalous Material Interaction hardsuit that protects against the strangest energies the universe can throw at it." + icon = 'icons/clothing/rig/hazmat.dmi' icon_state = "hazmat_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una") armor = list( melee = ARMOR_MELEE_RESISTANT, bullet = ARMOR_BALLISTIC_MINOR, @@ -240,7 +255,9 @@ name = "rescue suit control module" suit_type = "rescue hardsuit" desc = "A durable suit designed for medical rescue in high risk areas." + icon = 'icons/clothing/rig/medical.dmi' icon_state = "medical_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una") armor = list( melee = ARMOR_MELEE_RESISTANT, bullet = ARMOR_BALLISTIC_MINOR, @@ -273,14 +290,17 @@ /obj/item/rig_module/maneuvering_jets, /obj/item/rig_module/device/healthscanner, /obj/item/rig_module/vision/medhud, - /obj/item/rig_module/actuators + /obj/item/rig_module/actuators, + /obj/item/rig_module/cooling_unit ) /obj/item/rig/hazard name = "hazard hardsuit control module" suit_type = "hazard hardsuit" desc = "A security hardsuit designed for prolonged EVA in dangerous environments." + icon = 'icons/clothing/rig/hazard.dmi' icon_state = "hazard_rig" + icon_supported_species_tags = list("ipc", "skr", "taj", "una") armor = list( melee = ARMOR_MELEE_MAJOR, bullet = ARMOR_BALLISTIC_PISTOL, @@ -324,6 +344,7 @@ name = "diving suit control module" suit_type = "diving suit" desc = "A heavy hardsuit designated for operations under the water, you are not sure what it is doing here however." + icon = 'icons/clothing/rig/diving.dmi' icon_state = "diving_rig" armor = list( melee = ARMOR_MELEE_RESISTANT, @@ -338,7 +359,7 @@ offline_slowdown = 4 offline_vision_restriction = TINT_HEAVY - allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction) + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction) req_access = list() req_one_access = list() diff --git a/code/modules/clothing/spacesuits/rig/suits/terminator.dm b/code/modules/clothing/spacesuits/rig/suits/terminator.dm index 7d60b106b3f..7e8aa615246 100644 --- a/code/modules/clothing/spacesuits/rig/suits/terminator.dm +++ b/code/modules/clothing/spacesuits/rig/suits/terminator.dm @@ -1,6 +1,7 @@ /obj/item/rig/terminator name = "\improper Military Frame exoskeleton" desc = "A robust synth exoskeleton outfitted with state of the art infiltration tools. Creepy." + icon = 'icons/clothing/rig/terminator.dmi' icon_state = "terminator_rig" suit_type = "synthetic exoskeleton" armor = list( diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index e16b519bc6e..cfeb344b6fb 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -6,7 +6,7 @@ name = "space helmet" icon_state = "space" desc = "A special helmet designed for work in a hazardous, low-pressure environment." - item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT + item_flags = THICKMATERIAL | INJECTIONPORT | AIRTIGHT item_state_slots = list( slot_l_hand_str = "s_helmet", slot_r_hand_str = "s_helmet" @@ -20,6 +20,8 @@ body_parts_covered = HEAD|FACE|EYES cold_protection = HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE + min_pressure_protection = 0 + max_pressure_protection = SPACE_SUIT_MAX_PRESSURE siemens_coefficient = 0.5 species_restricted = list("exclude",BODYTYPE_DIONA,BODYTYPE_GOLEM) flash_protection = FLASH_PROTECTION_MAJOR @@ -40,7 +42,7 @@ w_class = ITEMSIZE_LARGE//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 - item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL + item_flags = THICKMATERIAL|INJECTIONPORT body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) slowdown = 3 @@ -51,6 +53,8 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE + min_pressure_protection = 0 + max_pressure_protection = SPACE_SUIT_MAX_PRESSURE siemens_coefficient = 0.5 species_restricted = list("exclude",BODYTYPE_DIONA,BODYTYPE_GOLEM) diff --git a/code/modules/clothing/spacesuits/void/misc.dm b/code/modules/clothing/spacesuits/void/misc.dm index 3d9b625c06e..0d059a59b7c 100644 --- a/code/modules/clothing/spacesuits/void/misc.dm +++ b/code/modules/clothing/spacesuits/void/misc.dm @@ -211,7 +211,7 @@ //Einstein Engines espionage voidsuit /obj/item/clothing/head/helmet/space/void/einstein - name = "banshee combat suit helmet" + name = "banshee infiltration suit helmet" desc = "A sleek, menacing voidsuit helmet with the branding of Taipei Engineering Industrial's private military contractors." icon = 'icons/obj/clothing/voidsuit/megacorp.dmi' icon_state = "bansheehelm" @@ -236,7 +236,7 @@ refittable = FALSE /obj/item/clothing/suit/space/void/einstein - name = "banshee combat suit" + name = "banshee infiltration suit" desc = "A tightly-fitting suit manufactured with shimmering, ablative plating. Looks almost weightless." icon = 'icons/obj/clothing/voidsuit/megacorp.dmi' icon_state = "banshee" @@ -641,3 +641,104 @@ enjoys jolly cooperation with fellow designers from Crosk who seek to invent new suits to keep their racers going faster." item_state = "rig-himeo-engineering" icon_state = "rig-himeo-engineering" + +/obj/item/clothing/head/helmet/space/void/mining/himeo/tajara + name = "himeo mining voidsuit helmet" + desc = "A rugged polymer and alloy space helmet with a ballistic glass and polycarbonate visor commonly used by astronauts from Himeo. This helmet looks fit for a Tajara." + desc_fluff = "The Type-78A 'Fish Fur' Helmet is a nearly 80 year old design and is part of a long line of homegrown voidsuits dating to when the planet ejected Hephaestus Industries. The main reason for its long service life\ + is its modularity, with Himean workers often taking the time to make their own improvements to it, ranging all the way from simple morale patches slapped on the top to modern HUD-enabled visors. It quickly found purchase among \ + Himeo's population of Tajaran expatriates, who were shown how to modify and use the voidsuits. Many of the first Tajaran-fitted suits were a product of collaborations between the two species making them all the more sentimental to those who use them." + icon = 'icons/obj/contained_items/voidsuits/himeotaj.dmi' + icon_state = "rig0-himeotaj" + item_state = "rig0-himeotaj" + item_state_slots = list( + slot_l_hand_str = "mining_helm", + slot_r_hand_str = "mining_helm" + ) + contained_sprite = TRUE + species_restricted = list(BODYTYPE_TAJARA) + +/obj/item/clothing/suit/space/void/mining/himeo/tajara + name = "himeo mining voidsuit" + desc = "A simple but durable softsuit with a set of protective alloy plates commonly used by Himean astronauts. The suit life support console and torso plate contains a Himean flag patch. This suit looks fit for a Tajara." + desc_fluff = "The Type-78 'Fish Fur' Voidsuit is an aging yet popular design produced only on Himeo. The simple and affordable design means many Himeans are able to own their own spacesuits rather than have one provided to them by their employer.\ + Its modular design means that they're adapted for use everywhere from the depths of Himeo to protect from debris, its surface to protect from the bitter cold, and in orbit, to work in the void. Their similarity to flightsuits have been noted, and the planet \ + enjoys jolly cooperation with fellow designers from Crosk who seek to invent new suits to keep their racers going faster. They quickly found purchase among Himeo's population of Tajaran expatriates, who were shown how to modify and use the voidsuits. \ + Many of the first Tajaran-fitted suits were a product of collaborations between the two species making them all the more sentimental to those who use them." + icon = 'icons/obj/contained_items/voidsuits/himeotaj.dmi' + item_state = "rig-himeotaj" + icon_state = "rig-himeotaj" + item_state_slots = list( + slot_l_hand_str = "mining_hardsuit", + slot_r_hand_str = "mining_hardsuit" + ) + contained_sprite = TRUE + species_restricted = list(BODYTYPE_TAJARA) + +/obj/item/clothing/head/helmet/space/void/engineering/himeo/tajara + name = "himeo engineering voidsuit helmet" + desc = "A rugged polymer and alloy space helmet with a reinforced ballistic glass and polycarbonate goggle-type visor commonly used by astronauts from Himeo. This helmet looks fit for a Tajara." + desc_fluff = "The Type-78A 'Fish Fur' Helmet is a nearly 80 year old design and is part of a long line of homegrown voidsuits dating to when the planet ejected Hephaestus Industries. The main reason for its long service life \ + is its modularity, with Himean workers often taking the time to make their own improvements to it, ranging all the way from simple morale patches slapped on the top to modern HUD-enabled visors. It quickly found purchase among \ + Himeo's population of Tajaran expatriates, who were shown how to modify and use the voidsuits. Many of the first Tajaran-fitted suits were a product of collaborations between the two species making them all the more sentimental to those who use them." + icon = 'icons/obj/contained_items/voidsuits/himeotaj.dmi' + icon_state = "rig0-himeotaj-engineering" + item_state = "rig0-himeotaj-engineering" + item_state_slots = list( + slot_l_hand_str = "engineering_helm", + slot_r_hand_str = "engineering_helm" + ) + + contained_sprite = TRUE + species_restricted = list(BODYTYPE_TAJARA) + +/obj/item/clothing/suit/space/void/engineering/himeo/tajara + name = "himeo engineering voidsuit" + desc = "A simple but durable softsuit with a set of protective alloy plates commonly used by Himean astronauts. The suit life support console and torso plate contains a Himean flag patch. This particular model is fitted for Tajara and seems to have lead lining in it." + desc_fluff = "The Type-78 'Fish Fur' Voidsuit is an aging yet popular design produced only on Himeo. The simple and affordable design means many Himeans are able to own their own spacesuits rather than have one provided to them by their employer.\ + Its modular design means that they're adapted for use everywhere from the depths of Himeo to protect from debris, its surface to protect from the bitter cold, and in orbit, to work in the void. Their similarity to flightsuits have been noted, and the planet \ + enjoys jolly cooperation with fellow designers from Crosk who seek to invent new suits to keep their racers going faster. They quickly found purchase among Himeo's population of Tajaran expatriates, who were shown how to modify and use the voidsuits. \ + Many of the first Tajaran-fitted suits were a product of collaborations between the two species making them all the more sentimental to those who use them." + icon = 'icons/obj/contained_items/voidsuits/himeotaj.dmi' + item_state = "rig-himeotaj-engineering" + icon_state = "rig-himeotaj-engineering" + item_state_slots = list( + slot_l_hand_str = "engineering_hardsuit", + slot_r_hand_str = "engineering_hardsuit" + ) + contained_sprite = TRUE + species_restricted = list(BODYTYPE_TAJARA) + +/obj/item/clothing/head/helmet/space/void/atmos/himeo/tajara + name = "himeo atmospherics voidsuit helmet" + desc = "A rugged polymer and alloy space helmet with a reinforced ballistic glass and polycarbonate goggle-type visor commonly used by astronauts from Himeo. This particular model is fitted for Tajara and appears to have a thicker layer of insulation on it." + desc_fluff = "The Type-78A 'Fish Fur' Helmet is a nearly 80 year old design and is part of a long line of homegrown voidsuits dating to when the planet ejected Hephaestus Industries. The main reason for its long service life \ + is its modularity, with Himean workers often taking the time to make their own improvements to it, ranging all the way from simple morale patches slapped on the top to modern HUD-enabled visors. It quickly found purchase among \ + Himeo's population of Tajaran expatriates, who were shown how to modify and use the voidsuits. Many of the first Tajaran-fitted suits were a product of collaborations between the two species making them all the more sentimental to those who use them." + icon = 'icons/obj/contained_items/voidsuits/himeotaj.dmi' + icon_state = "rig0-himeotaj-engineering" + item_state = "rig0-himeotaj-engineering" + item_state_slots = list( + slot_l_hand_str = "atmos_helm", + slot_r_hand_str = "atmos_helm" + ) + + contained_sprite = TRUE + species_restricted = list(BODYTYPE_TAJARA) + +/obj/item/clothing/suit/space/void/atmos/himeo/tajara + name = "himeo atmospherics voidsuit" + desc = "A simple but durable softsuit with a set of protective alloy plates commonly used by Himean astronauts. The suit life support console and torso plate contains a Himean flag patch. This particular model is fitted for Tajara and seems to have better insulation in it." + desc_fluff = "The Type-78 'Fish Fur' Voidsuit is an aging yet popular design produced only on Himeo. The simple and affordable design means many Himeans are able to own their own spacesuits rather than have one provided to them by their employer.\ + Its modular design means that they're adapted for use everywhere from the depths of Himeo to protect from debris, its surface to protect from the bitter cold, and in orbit, to work in the void. Their similarity to flightsuits have been noted, and the planet \ + enjoys jolly cooperation with fellow designers from Crosk who seek to invent new suits to keep their racers going faster. They quickly found purchase among Himeo's population of Tajaran expatriates, who were shown how to modify and use the voidsuits. \ + Many of the first Tajaran-fitted suits were a product of collaborations between the two species making them all the more sentimental to those who use them." + icon = 'icons/obj/contained_items/voidsuits/himeotaj.dmi' + item_state = "rig-himeotaj-engineering" + icon_state = "rig-himeotaj-engineering" + item_state_slots = list( + slot_l_hand_str = "atmos_hardsuit", + slot_r_hand_str = "atmos_hardsuit" + ) + contained_sprite = TRUE + species_restricted = list(BODYTYPE_TAJARA) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index 3a46a27e672..e363728e30f 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -16,6 +16,7 @@ bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_RESISTANT ) + max_pressure_protection = ENG_VOIDSUIT_MAX_PRESSURE light_overlay = "helmet_light_dual_low" brightness_on = 6 @@ -37,7 +38,8 @@ bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_RESISTANT ) - allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction) + max_pressure_protection = ENG_VOIDSUIT_MAX_PRESSURE + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction,/obj/item/storage/bag/inflatable) //Mining rig /obj/item/clothing/head/helmet/space/void/mining @@ -172,6 +174,7 @@ rad = ARMOR_RAD_SMALL ) max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE + 10000 // It is a suit designed for fire, enclosed + max_pressure_protection = FIRESUIT_MAX_PRESSURE light_overlay = "helmet_light_dual_low" brightness_on = 6 @@ -192,7 +195,8 @@ bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_SMALL ) - allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction) + max_pressure_protection = FIRESUIT_MAX_PRESSURE + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction,/obj/item/storage/bag/inflatable) max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE + 10000 // It is a suit designed for fire, enclosed //Head of Security @@ -259,4 +263,4 @@ bomb = ARMOR_BOMB_PADDED, bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_RESISTANT - ) \ No newline at end of file + ) diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 638ade5ea5d..c53bff8310d 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -15,6 +15,8 @@ rad = ARMOR_RAD_MINOR ) max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE + max_pressure_protection = VOIDSUIT_MAX_PRESSURE + min_pressure_protection = 0 siemens_coefficient = 0.5 //Species-specific stuff. diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 71af76981a9..91dd273bdff 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -42,9 +42,12 @@ else ..(over_object) -/obj/item/clothing/suit/armor/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/clothing/suit/armor/attackby(obj/item/W, mob/user) ..() - if (pockets) + if(istype(W, /obj/item/clothing/accessory/armor_plate)) + if(W in accessories) //We already attached this. Don't try to put it in our pockets + return + if(pockets) pockets.attackby(W, user) /obj/item/clothing/suit/armor/emp_act(severity) @@ -106,7 +109,7 @@ item_state = "swat_suit" gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 - item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL + item_flags = THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS allowed = list(/obj/item/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/tank/emergency_oxygen) slowdown = 1 @@ -119,6 +122,8 @@ bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_SMALL ) + max_pressure_protection = FIRESUIT_MAX_PRESSURE + min_pressure_protection = 0 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE @@ -166,7 +171,7 @@ user.forceMove(picked) return PROJECTILE_FORCE_MISS - return 0 + return FALSE /obj/item/clothing/suit/armor/reactive/attack_self(mob/user as mob) src.active = !( src.active ) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index aaf22fef08d..1a31fe2a598 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -10,6 +10,7 @@ item_state = "blueapron" blood_overlay_type = "armor" body_parts_covered = 0 + no_overheat = TRUE allowed = list (/obj/item/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/reagent_containers/glass/fertilizer,/obj/item/material/minihoe) body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS @@ -86,6 +87,7 @@ obj/item/clothing/suit/apron/overalls/blue item_state = "apronchef" blood_overlay_type = "armor" body_parts_covered = 0 + no_overheat = TRUE //Security @@ -143,7 +145,7 @@ obj/item/clothing/suit/apron/overalls/blue item_state = "det_jacket" blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|ARMS - allowed = list(/obj/item/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/gun/energy,/obj/item/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/storage/box/fancy/cigarettes,/obj/item/flame/lighter,/obj/item/device/taperecorder) + allowed = list(/obj/item/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/gun/energy,/obj/item/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/storage/box/fancy/cigarettes,/obj/item/flame/lighter,/obj/item/device/taperecorder,/obj/item/clothing/accessory/badge/investigator) /obj/item/clothing/suit/storage/toggle/det_trench name = "brown trenchcoat" @@ -152,7 +154,8 @@ obj/item/clothing/suit/apron/overalls/blue item_state = "detective" blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|ARMS - allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/device/flashlight,/obj/item/gun/energy,/obj/item/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/storage/box/fancy/cigarettes,/obj/item/flame/lighter,/obj/item/device/taperecorder) + allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/device/flashlight,/obj/item/gun/energy,/obj/item/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/storage/box/fancy/cigarettes,/obj/item/flame/lighter,/obj/item/device/taperecorder,/obj/item/clothing/accessory/badge/investigator) + /obj/item/clothing/suit/storage/toggle/det_trench/black name = "black trenchcoat" icon_state = "detective2" @@ -164,6 +167,7 @@ obj/item/clothing/suit/apron/overalls/blue icon_state = "forensics" item_state = "forensics" body_parts_covered = UPPER_TORSO|ARMS + allowed = list(/obj/item/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/gun/energy,/obj/item/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/storage/box/fancy/cigarettes,/obj/item/flame/lighter,/obj/item/device/taperecorder,/obj/item/clothing/accessory/badge/investigator) /obj/item/clothing/suit/storage/toggle/forensics/blue icon_state = "forensicsblue" @@ -182,7 +186,7 @@ obj/item/clothing/suit/apron/overalls/blue blood_overlay_type = "armor" allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner, \ /obj/item/crowbar, /obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/tank/emergency_oxygen, \ - /obj/item/clothing/mask/gas, /obj/item/taperoll/engineering) + /obj/item/clothing/mask/gas, /obj/item/taperoll/engineering, /obj/item/storage/bag/inflatable) body_parts_covered = UPPER_TORSO var/opened @@ -223,6 +227,12 @@ obj/item/clothing/suit/apron/overalls/blue icon_state = "hazard_g" item_state = "hazard_g" +/obj/item/clothing/suit/storage/hazardvest/ce + name = "chief engineer's hazard vest" + desc = "A high-visibility vest used in work zones. This one is a green-blue color with a gold stripe." + icon_state = "hazard_ce" + item_state = "hazard_ce" + //Lawyer /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket name = "blue suit jacket" @@ -269,6 +279,14 @@ obj/item/clothing/suit/apron/overalls/blue item_state = "blazer" opened = TRUE +/obj/item/clothing/suit/storage/toggle/suitjacket/blazer/long + name = "long blazer" + desc = "A charming long jacket." + desc_fluff = "For when you want to play ball sports like an aristocrat." + icon_state = "longblazer" + item_state = "longblazer" + opened = TRUE + //Medical /obj/item/clothing/suit/storage/toggle/fr_jacket name = "first responder jacket" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index b4bc0e60b05..27e6348ae7a 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -287,6 +287,12 @@ item_state = "brown_jacket_sleeveless" body_parts_covered = UPPER_TORSO +/obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless/colorable + name = "vest" + desc = "A vest made of synthetic fiber." + icon_state = "colored_vest" + item_state = "colored_vest" + /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen desc = "A brown leather coat. A corporate logo is proudly displayed on the back." icon_state = "brown_jacket_nt" diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 7daa634b93f..2c9147ecc72 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -12,36 +12,26 @@ /obj/item/clothing/suit/fire name = "firesuit" desc = "A suit that protects against fire and heat." + icon = 'icons/clothing/kit/firefighter.dmi' icon_state = "firesuit" item_state = "firesuit" + icon_auto_adapt = TRUE + icon_supported_species_tags = list("ada", "gol") + contained_sprite = TRUE w_class = ITEMSIZE_LARGE//bulky item gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS siemens_coefficient = 0.5 allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/extinguisher) - slowdown = 1.0 + slowdown = 0.8 // slightly better than voidsuits flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL + max_pressure_protection = FIRESUIT_MAX_PRESSURE + min_pressure_protection = FIRESUIT_MIN_PRESSURE heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS - -/obj/item/clothing/suit/fire/firefighter - icon_state = "firesuit" - item_state = "firesuit" - - -/obj/item/clothing/suit/fire/heavy - name = "firesuit" - desc = "A suit that protects against extreme fire and heat." - //icon_state = "thermal" - siemens_coefficient = 0.35 - item_state = "ro_suit" - w_class = ITEMSIZE_LARGE//bulky item - max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE + 25000 - slowdown = 1.5 - /obj/item/clothing/suit/fire/atmos name = "atmospheric technician firesuit" desc = "A suit that protects against fire and heat, this one is designed for atmospheric technicians." @@ -58,7 +48,7 @@ desc = "Use in case of bomb." icon_state = "bombsuit" w_class = ITEMSIZE_HUGE//Too large to fit in a backpack - item_flags = STOPPRESSUREDAMAGE|THICKMATERIAL|BLOCK_GAS_SMOKE_EFFECT + item_flags = THICKMATERIAL|BLOCK_GAS_SMOKE_EFFECT armor = list( melee = ARMOR_MELEE_VERY_HIGH, bullet = ARMOR_BALLISTIC_MINOR, @@ -66,6 +56,7 @@ energy = ARMOR_ENERGY_RESISTANT, bomb = ARMOR_BOMB_SHIELDED ) + max_pressure_protection = FIRESUIT_MAX_PRESSURE siemens_coefficient = 0.1 flags_inv = HIDEMASK|HIDEEARS|HIDEEYES body_parts_covered = HEAD|FACE|EYES @@ -95,12 +86,13 @@ bomb = ARMOR_BOMB_SHIELDED ) siemens_coefficient = 0.1 - item_flags = STOPPRESSUREDAMAGE|THICKMATERIAL + item_flags = THICKMATERIAL flags_inv = HIDEJUMPSUIT|HIDETAIL heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE + max_pressure_protection = FIRESUIT_MAX_PRESSURE siemens_coefficient = 0 var/mob/living/carbon/human/wearer = null var/suit_temp = T20C @@ -184,13 +176,19 @@ * Radiation protection */ /obj/item/clothing/head/radiation - name = "radiation Hood" - icon_state = "rad" - desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation" + name = "radiation hood" + desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation." + icon = 'icons/clothing/kit/radsuit.dmi' + item_icons = null + icon_state = "radhood" + item_state = "radhood" + contained_sprite = TRUE + icon_auto_adapt = TRUE + icon_supported_species_tags = list("skr", "una", "taj") flags_inv = BLOCKHAIR body_parts_covered = HEAD|FACE|EYES armor = list( - bio = ARMOR_BIO_RESISTANT, + bio = ARMOR_BIO_RESISTANT, rad = ARMOR_RAD_SHIELDED ) siemens_coefficient = 0.35 @@ -199,13 +197,18 @@ /obj/item/clothing/suit/radiation name = "radiation suit" desc = "A suit that protects against radiation. Label: Made with lead, do not eat insulation." - icon_state = "rad" - item_state = "rad_suit" + icon = 'icons/clothing/kit/radsuit.dmi' + item_icons = null + icon_state = "radsuit" + item_state = "radsuit" + contained_sprite = TRUE + icon_auto_adapt = TRUE + icon_supported_species_tags = list("una") w_class = ITEMSIZE_LARGE//bulky item gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS|FEET - allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/clothing/head/radiation,/obj/item/clothing/mask/gas) + allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction,/obj/item/material/twohanded/fireaxe,/obj/item/storage/backpack/cell,/obj/item/clothing/head/radiation,/obj/item/clothing/mask/gas,/obj/item/reagent_containers/hypospray/autoinjector) slowdown = 1.5 armor = list( bio = ARMOR_BIO_RESISTANT, diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 9006d7b4478..7e74964d9f1 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -6,10 +6,7 @@ slot_l_hand_str = "wizhat", slot_r_hand_str = "wizhat" ) - //Not given any special protective value since the magic robes are full-body protection --NEO - siemens_coefficient = 0.75 body_parts_covered = 0 - wizard_garb = 1 /obj/item/clothing/head/wizard/red name = "red wizard hat" @@ -21,7 +18,6 @@ desc = "It has WIZZARD written across it in sequins. Comes with a cool beard." icon_state = "wizard-fake" body_parts_covered = HEAD|FACE - siemens_coefficient = 1.0 /obj/item/clothing/head/wizard/marisa name = "witch Hat" @@ -62,21 +58,8 @@ desc = "A magnificant, gem-lined robe that seems to radiate power." icon_state = "wizard" item_state = "wizrobe" - gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE - permeability_coefficient = 0.01 - armor = list( - melee = ARMOR_MELEE_RESISTANT, - bullet = ARMOR_BALLISTIC_SMALL, - laser = ARMOR_LASER_SMALL, - energy = ARMOR_ENERGY_SMALL, - bomb = ARMOR_BOMB_PADDED, - bio = ARMOR_BIO_MINOR, - rad = ARMOR_RAD_MINOR - ) - allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/teleportation_scroll,/obj/item/scrying,/obj/item/spellbook,/obj/item/device/soulstone,/obj/item/material/knife/ritual) + allowed = list(/obj/item/tank/emergency_oxygen, /obj/item/material/knife/ritual) flags_inv = HIDEJUMPSUIT - siemens_coefficient = 0.75 - wizard_garb = 1 /obj/item/clothing/suit/wizrobe/red name = "red wizard robe" @@ -115,12 +98,8 @@ desc = "A heavy threaded tweed gray jacket. For a different sort of Gentleman." icon_state = "gentlecoat" item_state = "gentlecoat" - gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE - permeability_coefficient = 0.01 - allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/teleportation_scroll,/obj/item/scrying,/obj/item/spellbook,/obj/item/device/soulstone,/obj/item/material/knife/ritual) + allowed = list(/obj/item/tank/emergency_oxygen, /obj/item/material/knife/ritual) flags_inv = HIDEJUMPSUIT - siemens_coefficient = 0.75 - wizard_garb = 1 body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS flags_inv = 0 @@ -130,15 +109,11 @@ desc = "A rather dull, blue robe meant to mimick real wizard robes." icon_state = "wizard-fake" item_state = "wizrobe" - armor = null - siemens_coefficient = 1.0 /obj/item/clothing/head/wizard/marisa/fake name = "witch hat" desc = "Strange-looking hat-wear, makes you want to cast fireballs." icon_state = "marisa" - armor = null - siemens_coefficient = 1.0 /obj/item/clothing/suit/wizrobe/marisa/fake name = "witch robe" @@ -146,8 +121,6 @@ icon_state = "marisa" item_state = "marisarobe" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - armor = null - siemens_coefficient = 1.0 //black robes diff --git a/code/modules/clothing/suits/xeno/tajara.dm b/code/modules/clothing/suits/xeno/tajara.dm index b294f90b20a..94be7da05f8 100644 --- a/code/modules/clothing/suits/xeno/tajara.dm +++ b/code/modules/clothing/suits/xeno/tajara.dm @@ -27,7 +27,7 @@ /obj/item/clothing/suit/storage/tajaran/raakti_shariim name = "\improper Raakti Shariim coat" desc = "A blue adhomian wool coat with lilac purple accents and pale-gold insignia, signifying a Constable of the NKA's Raakti Shariim." - icon = 'icons/obj/clothing/species/tajaran/raakti_shariim.dmi' + icon = 'icons/obj/tajara_items.dmi' icon_state = "raakti_shariim_coat" item_state = "raakti_shariim_coat" desc_fluff = "The Raakti Shariim (Royal Peacekeepers in Ceti Basic) are the New Kingdom of Adhomai's policing and \ diff --git a/code/modules/clothing/suits/xeno/unathi.dm b/code/modules/clothing/suits/xeno/unathi.dm new file mode 100644 index 00000000000..663e50d7d0d --- /dev/null +++ b/code/modules/clothing/suits/xeno/unathi.dm @@ -0,0 +1,47 @@ +/obj/item/clothing/suit/unathi + name = "abstract suit" + icon = 'icons/obj/unathi_items.dmi' + contained_sprite = TRUE + +/obj/item/clothing/suit/unathi/robe + name = "roughspun robes" + desc = "A traditional Unathi garment." + icon_state = "roughspun_robe" + item_state = "roughspun_robe" + +/obj/item/clothing/suit/unathi/robe/beige + color = "#DBC684" + +/obj/item/clothing/suit/unathi/robe/kilt + name = "wasteland kilt" + desc = "A long tunic made of old material that acts as a kilt for the poorest of Unathi, who aren't afraid to let \ + the sand and sun strike their scales." + icon_state = "wasteland_kilt" + item_state = "wasteland_kilt" + +/obj/item/clothing/suit/unathi/robe/robe_coat + name = "tzirzi robes" + desc = "A casual garment native to Moghes typically worn by Unathi." + icon_state = "robe_coat" + item_state = "robe_coat" + +/obj/item/clothing/suit/unathi/jokfar + name = "jokfar vest" + desc = "The nobility favor this vest for its glamor, but although it isn't a garment to get in the way, it is \ + not ideal for physical labor." + icon_state = "jokfar" + item_state = "jokfar" + build_from_parts = TRUE + worn_overlay = "trim" + +/obj/item/clothing/suit/unathi/wrapping + name = "Th'akhist body wrappings" + desc = "A bunch of stitched together clothing with bandages covering them. Looks tailored for a Unathi." + desc_fluff = "This is considered humble Sinta wear for Th'akh shamans— most Unathi don't wear these, barring Aut'akh." + icon = 'icons/obj/unathi_items.dmi' + icon_state = "thakh_wrappings" //special thanks to Araskael + item_state = "thakh_wrappings" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + flags_inv = HIDEJUMPSUIT|HIDETAIL + species_restricted = list(BODYTYPE_UNATHI) + contained_sprite = TRUE \ No newline at end of file diff --git a/code/modules/clothing/suits/alien.dm b/code/modules/clothing/suits/xeno/vaurca.dm similarity index 63% rename from code/modules/clothing/suits/alien.dm rename to code/modules/clothing/suits/xeno/vaurca.dm index ce6fb04afda..9ba75a1ccfd 100644 --- a/code/modules/clothing/suits/alien.dm +++ b/code/modules/clothing/suits/xeno/vaurca.dm @@ -1,34 +1,3 @@ -//Unathi clothing. - -/obj/item/clothing/suit/unathi/robe - name = "roughspun robes" - desc = "A traditional Unathi garment." - icon = 'icons/obj/unathi_items.dmi' - icon_state = "roughspun_robe" - item_state = "roughspun_robe" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS - contained_sprite = TRUE - -/obj/item/clothing/suit/unathi/robe/beige - color = "#DBC684" - -/obj/item/clothing/suit/unathi/robe/kilt - name = "wasteland kilt" - desc = "A long tunic made of old material that acts as a kilt for the poorest of unathi, who aren't afraid to let the sand and sun strike their scales." - icon_state = "wasteland_kilt" - item_state = "wasteland_kilt" - -/obj/item/clothing/suit/unathi/robe/robe_coat //I was at a loss for names under-the-hood. - name = "tzirzi robes" - desc = "A casual Moghes-native garment typically worn by Unathi while planet-side." - icon = 'icons/obj/unathi_items.dmi' - icon_state = "robe_coat" - item_state = "robe_coat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS - contained_sprite = 1 - -//Vaurca clothing - /obj/item/clothing/suit/vaurca name = "hive cloak" desc = "A fashionable robe tailored for nonhuman proportions, this one is red and golden." diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index af0595626c7..ca18588b125 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -55,7 +55,7 @@ mob_overlay.color = color if(build_from_parts) mob_overlay.cut_overlays() - mob_overlay.add_overlay(overlay_image(I, "[icon_state]_[worn_overlay]", flags=RESET_COLOR)) //add the overlay w/o coloration of the original sprite + mob_overlay.add_overlay(overlay_image(I, "[icon_state][WORN_UNDER]_[worn_overlay]", flags=RESET_COLOR)) //add the overlay w/o coloration of the original sprite mob_overlay.appearance_flags = RESET_ALPHA return mob_overlay @@ -222,8 +222,8 @@ pickup_sound = 'sound/items/pickup/accessory.ogg' /obj/item/clothing/accessory/assunzione - name = "luceian amulent" - desc = "A common symbol of the Luceian faith abroad this amulet featuring the religion's all-seeing eye and eight-pointed crest \ + name = "luceian amulet" + desc = "A common symbol of the Luceian faith abroad, this amulet featuring the religion's all-seeing eye and eight-pointed crest \ seems to be made of real gold and gemstones. While not as critical to faithful abroad as a warding sphere, it is considered good form \ to ensure one's amulet is well-maintained." icon = 'icons/clothing/accessories/assunzione_amulet.dmi' @@ -361,6 +361,55 @@ icon_state = "cargoponcho" item_state = "cargoponcho" +/* + * Sashes + */ + +/obj/item/clothing/accessory/sash + name = "yellow sash" + desc = "A yellow sash, designed to be worn over one shoulder and come down to the opposing hip." + desc_fluff = "Sashes such as this one are a common sight throughout the Empire of Dominia, though they are hardly as fashionable as the typical cape." + icon = 'icons/clothing/accessories/sash.dmi' + item_state = "sash" + icon_state = "sash" + contained_sprite = TRUE + +/obj/item/clothing/accessory/sash/red + name = "red sash" + desc = "A red sash, designed to be worn over one shoulder and come down to the opposing hip." + item_state = "red_sash" + icon_state = "red_sash" + +/obj/item/clothing/accessory/sash/blue + name = "blue sash" + desc = "A blue sash, designed to be worn over one shoulder and come down to the opposing hip." + item_state = "blue_sash" + icon_state = "blue_sash" + +/obj/item/clothing/accessory/sash/orange + name = "orange sash" + desc = "An orange sash, designed to be worn over one shoulder and come down to the opposing hip." + item_state = "orange_sash" + icon_state = "orange_sash" + +/obj/item/clothing/accessory/sash/purple + name = "purple sash" + desc = "A purple sash, designed to be worn over one shoulder and come down to the opposing hip." + item_state = "purple_sash" + icon_state = "purple_sash" + +/obj/item/clothing/accessory/sash/white + name = "white sash" + desc = "A white sash, designed to be worn over one shoulder and come down to the opposing hip." + item_state = "white_sash" + icon_state = "white_sash" + +/obj/item/clothing/accessory/sash/colourable + name = "sash" + desc = "A sash, designed to be worn over one shoulder and come down to the opposing hip." + item_state = "sash_colourable" + icon_state = "sash_colourable" + /* * Cloak */ @@ -504,6 +553,20 @@ item_state = "trinary_cape" overlay_state = "trinary_cape" +/obj/item/clothing/accessory/poncho/trinary/pellegrina + name = "trinary perfection pellegrina" + desc = "A brilliant red and brown cape, commonly worn by those who serve the Trinary Perfection. This one is signifcantly shorter." + icon_state = "trinary_pellegrina" + item_state = "trinary_pellegrina" + overlay_state = "trinary_pellegrina" + +/obj/item/clothing/accessory/poncho/trinary/shouldercape + name = "trinary perfection shoulder cape" + desc = "A brilliant red and brown cape, commonly worn by those who serve the Trinary Perfection. This one is worn over one shoulder." + icon_state = "trinary_shouldercape" + item_state = "trinary_shouldercape" + overlay_state = "trinary_shouldercape" + //tau ceti legion ribbons /obj/item/clothing/accessory/legion name = "seniority ribbons" @@ -564,12 +627,18 @@ /obj/item/clothing/accessory/dogtags name = "dogtags" desc = "A pair of engraved metal identification tags." - icon_state = "tags" - item_state = "tags" + icon = 'icons/clothing/accessories/dogtags.dmi' + icon_state = "dogtags" + item_state = "dogtags" + contained_sprite = TRUE + slot_flags = SLOT_MASK | SLOT_TIE overlay_state = "tags" drop_sound = 'sound/items/drop/accessory.ogg' pickup_sound = 'sound/items/pickup/accessory.ogg' +/obj/item/clothing/accessory/dogtags/get_mask_examine_text(mob/user) + return "around [user.get_pronoun("his")] neck" + /obj/item/clothing/accessory/badge/namepin name = "pin tag" desc = "A small strip of metal to label its wearer." @@ -618,3 +687,54 @@ desc = "A digital patch which can be attached to the shoulder sleeve of clothing. This one shows the Idris Incorporated logo with a flashing chevron." icon_state = "idrissec_patch" overlay_state = "idrissec_patch" + +/obj/item/clothing/accessory/kneepads + name = "kneepads" + desc = "A pair of synthetic kneepads. Doesn't provide protection from more than arthritis." + icon = 'icons/clothing/accessories/kneepads.dmi' + icon_state = "kneepads" + item_state = "kneepads" + contained_sprite = TRUE + gender = PLURAL + +/obj/item/clothing/accessory/blood_patch + name = "O- blood patch" + desc = "An embroidered patch indicating the wearer's blood type as O NEGATIVE." + icon = 'icons/clothing/accessories/blood_patch.dmi' + icon_state = "onegtag" + contained_sprite = TRUE + +/obj/item/clothing/accessory/blood_patch/opos + name = "O+ blood patch" + desc = "An embroidered patch indicating the wearer's blood type as O POSITIVE." + icon_state = "opostag" + +/obj/item/clothing/accessory/blood_patch/apos + name = "A+ blood patch" + desc = "An embroidered patch indicating the wearer's blood type as A POSITIVE." + icon_state = "apostag" + +/obj/item/clothing/accessory/blood_patch/aneg + name = "A- blood patch" + desc = "An embroidered patch indicating the wearer's blood type as A NEGATIVE." + icon_state = "anegtag" + +/obj/item/clothing/accessory/blood_patch/bpos + name = "B+ blood patch" + desc = "An embroidered patch indicating the wearer's blood type as B POSITIVE." + icon_state = "bpostag" + +/obj/item/clothing/accessory/blood_patch/bneg + name = "B- blood patch" + desc = "An embroidered patch indicating the wearer's blood type as B NEGATIVE." + icon_state = "bnegtag" + +/obj/item/clothing/accessory/blood_patch/abpos + name = "AB+ blood patch" + desc = "An embroidered patch indicating the wearer's blood type as AB POSITIVE." + icon_state = "abpostag" + +/obj/item/clothing/accessory/blood_patch/abneg + name = "AB- blood patch" + desc = "An embroidered patch indicating the wearer's blood type as AB NEGATIVE." + icon_state = "abnegtag" diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index e4cb95cfd67..d4e095c1929 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -52,13 +52,15 @@ /obj/item/clothing/accessory/badge/proc/set_name(var/new_name) stored_name = new_name - name = "[name] ([stored_name])" + desc += "\nThe name [stored_name] is written on it." /obj/item/clothing/accessory/badge/attack_self(mob/user as mob) if(!stored_name) - to_chat(user, "You inspect your [src.name]. Everything seems to be in order and you give it a quick cleaning with your hand.") - set_name(user.real_name) + var/imprintID = alert(user,"Do you wish to imprint your name on \the [src.name]?","Imprint id","Yes", "No") + if(imprintID == "Yes") + to_chat(user, "You inspect your [src.name]. Everything seems to be in order and you give it a quick cleaning with your hand.") + set_name(user.real_name) return if(isliving(user)) @@ -121,6 +123,9 @@ drop_sound = 'sound/items/drop/ring.ogg' pickup_sound = 'sound/items/pickup/ring.ogg' +/obj/item/clothing/accessory/badge/holo/cord/get_mask_examine_text(mob/user) + return "around [user.get_pronoun("his")] neck" + /obj/item/clothing/accessory/badge/holo/attack_self(mob/user as mob) if(!stored_name) to_chat(user, "Waving around a holobadge before swiping an ID would be pretty pointless.") @@ -195,6 +200,18 @@ drop_sound = 'sound/items/drop/card.ogg' pickup_sound = 'sound/items/pickup/card.ogg' +/obj/item/clothing/accessory/badge/tcfl_papers/service + name = "\improper TCFL service card" + desc = "A small card identifying one as a current member of the Tau Ceti Foreign Legion. Often used to secure discounts in \ + Republic shops. Go Biesel!" + badge_string = "Tau Ceti Foreign Legion Service Member" + +/obj/item/clothing/accessory/badge/tcfl_papers/service/veteran + name = "\improper TCFL veteran's service card" + desc = "A small card identifying one as a former member of the Tau Ceti Foreign Legion. Often used to secure discounts in \ + Republic shops. Go Biesel!" + badge_string = "Tau Ceti Foreign Legion Veteran" + /obj/item/clothing/accessory/badge/sheriff name = "sheriff badge" desc = "A star-shaped brass badge denoting who the law is around these parts." @@ -208,11 +225,11 @@ icon_state = "marshalbadge" badge_string = "Federal Marshal" -/obj/item/clothing/accessory/badge/dia - name = "\improper DIA badge" +/obj/item/clothing/accessory/badge/investigator + name = "\improper investigator badge" desc = "This badge marks the holder as an investigative agent." - icon_state = "diabadge" - overlay_state = "diabadge" + icon_state = "invbadge" + overlay_state = "invbadge" badge_string = "Corporate Investigator" /obj/item/clothing/accessory/badge/idbadge @@ -436,6 +453,10 @@ //passports +#define CANT_OPEN -1 +#define CLOSED 0 +#define OPEN 1 + /obj/item/clothing/accessory/badge/passport name = "biesellite passport" desc = "A passport issued to a citizen of the Republic of Biesel." @@ -449,10 +470,29 @@ v_flippable = FALSE badge_string = null + var/open = CANT_OPEN + drop_sound = 'sound/items/drop/cloth.ogg' pickup_sound = 'sound/items/pickup/cloth.ogg' +/obj/item/clothing/accessory/badge/passport/Initialize() + . = ..() + if(open != CANT_OPEN) + verbs += /obj/item/clothing/accessory/badge/passport/proc/open_passport + +/obj/item/clothing/accessory/badge/passport/proc/open_passport() + set name = "Open/Close Passport" + set src in usr + + open = !open + to_chat(usr, SPAN_NOTICE("You [open ? "open" : "close"] \the [src].")) + update_icon() + +/obj/item/clothing/accessory/badge/passport/update_icon() + if(open != CANT_OPEN) + icon_state = "[initial(icon_state)][open ? "_o" : ""]" + /obj/item/clothing/accessory/badge/passport/sol name = "solarian passport" desc = "A passport issued to a citizen of the Alliance of Sovereign Solarian Nations, or Sol Alliance. An outdated document for passage abroad." @@ -476,3 +516,23 @@ desc = "A passport issued to a resident of the Empire of Dominia. Popular among those whose debt is great but pockets light." icon_state = "passport_dominia" item_state = "passport_dominia" + +/obj/item/clothing/accessory/badge/passport/jargon + name = "jargon federation passport" + desc = "A passport issued to citizens of the Jargon Federation. Shiny, and compact, it's perfect to use on the go." + icon_state = "passport_jargon" + item_state = "passport_jargon" + open = CLOSED + var/credit_score = 5 + var/species_tag = "" + +/obj/item/clothing/accessory/badge/passport/jargon/examine(mob/user) + . = ..() + to_chat(user, SPAN_NOTICE("The passport displays the owner's social credit score as: [credit_score].")) + +/obj/item/clothing/accessory/badge/passport/jargon/update_icon() + icon_state = "[initial(icon_state)][open ? "_o[species_tag]" : ""]" + +#undef CANT_OPEN +#undef CLOSED +#undef OPEN diff --git a/code/modules/clothing/under/accessories/buddy_tag.dm b/code/modules/clothing/under/accessories/buddy_tag.dm new file mode 100644 index 00000000000..d9aff1ec34c --- /dev/null +++ b/code/modules/clothing/under/accessories/buddy_tag.dm @@ -0,0 +1,72 @@ +var/list/active_buddy_tags = list() + +/obj/item/clothing/accessory/buddytag + name = "buddy tag" + desc = "A tiny device, paired up with a counterpart set to same code. When the paired devices are too far apart, they start beeping." + icon = 'icons/clothing/accessories/buddy_tag.dmi' + icon_state = "buddytag0" + item_state = "buddytag" + contained_sprite = TRUE + slot = ACCESSORY_SLOT_UTILITY_MINOR + var/next_search = 0 + var/on = FALSE + var/id = 1 + +/obj/item/clothing/accessory/buddytag/Initialize() + . = ..() + id = round(rand(1, 1000)) + +/obj/item/clothing/accessory/buddytag/update_icon() + icon_state = "buddytag[on]" + +/obj/item/clothing/accessory/buddytag/attack_self(mob/user) + if(use_check_and_message(user)) + return + + var/dat = "[on ? "Disable" : "Enable"]
    " + dat += "ID: [id]" + + var/datum/browser/popup = new(user, "buddytag", "Buddy Tag", 290, 200) + popup.set_content(dat) + popup.open() + +/obj/item/clothing/accessory/buddytag/Topic(href, href_list, state) + if(..()) + return + + if(href_list["toggle"]) + on = !on + if(on) + next_search = world.time + active_buddy_tags += src + START_PROCESSING(SSprocessing, src) + else + active_buddy_tags -= src + update_icon() + if(href_list["setcode"]) + var/newcode = input("Set new buddy ID number." , "Buddy Tag ID" , "") as num|null + if(isnull(newcode) || !CanInteract(usr, state)) + return + id = newcode + attack_self(usr) + +/obj/item/clothing/accessory/buddytag/process() + if(!on) + return PROCESS_KILL + if(world.time < next_search) + return + next_search = world.time + 30 SECONDS + var/has_friend + for(var/obj/item/clothing/accessory/buddytag/buddy as anything in active_buddy_tags - src) + if(buddy.id != id) + continue + if(GET_Z(buddy) != GET_Z(src)) + continue + if(get_dist(get_turf(src), get_turf(buddy)) <= 10) + has_friend = TRUE + break + if(!has_friend) + playsound(src, 'sound/machines/twobeep.ogg', 10) + var/turf/T = get_turf(src) + if(T) + T.visible_message(SPAN_WARNING("[src] beeps anxiously."), range = 3) \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 5bb77546b64..f607f0de58f 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -9,6 +9,10 @@ flippable = 1 var/base_name = "" +/obj/item/clothing/accessory/holster/Initialize() + . = ..() + base_name = name + /obj/item/clothing/accessory/holster/proc/holster(var/obj/item/I, var/mob/living/user) if(holstered && istype(user)) to_chat(user, "There is already \a [holstered] holstered here!") @@ -28,7 +32,6 @@ holstered.add_fingerprint(user) w_class = max(w_class, holstered.w_class) user.visible_message("[user] holsters \the [holstered].", "You holster \the [holstered].") - base_name = name name = "occupied [base_name]" /obj/item/clothing/accessory/holster/proc/clear_holster() diff --git a/code/modules/clothing/under/accessories/lockets.dm b/code/modules/clothing/under/accessories/lockets.dm index 8a8ac8b8dec..58f489d8e39 100644 --- a/code/modules/clothing/under/accessories/lockets.dm +++ b/code/modules/clothing/under/accessories/lockets.dm @@ -13,6 +13,9 @@ drop_sound = 'sound/items/drop/ring.ogg' pickup_sound = 'sound/items/pickup/ring.ogg' +/obj/item/clothing/accessory/locket/get_mask_examine_text(mob/user) + return "around [user.get_pronoun("his")] neck" + /obj/item/clothing/accessory/locket/attack_self(mob/user as mob) if(!base_icon) base_icon = icon_state diff --git a/code/modules/clothing/under/accessories/shirts.dm b/code/modules/clothing/under/accessories/shirts.dm index 43f66700766..8aa16738238 100644 --- a/code/modules/clothing/under/accessories/shirts.dm +++ b/code/modules/clothing/under/accessories/shirts.dm @@ -5,13 +5,6 @@ icon_state = "sweater" item_state = "sweater" -/obj/item/clothing/accessory/sweaterargyle - name = "argyle sweater" - desc = "A warm knit sweater with an argyle pattern." - desc_fluff = "Never go unprepared for the next work-mandated secret santa with this fashion statement! Revel in their awkward thanks as they unbox it! Realize that you've received one too!" - icon_state = "sweaterargyle" - item_state = "sweaterargyle" - /obj/item/clothing/accessory/sweatervest name = "sweater vest" desc = "A warm knit sweater vest." @@ -19,12 +12,19 @@ icon_state = "sweatervest" item_state = "sweatervest" -/obj/item/clothing/accessory/sweatervestargyle - name = "argyle sweater vest" - desc = "A warm knit sweater vest with an argyle pattern." - desc_fluff = "Reminds you of family picture day. Wearing this is entirely your own volition, unfortunately." - icon_state = "sweaterargylevest" - item_state = "sweaterargylevest" +/obj/item/clothing/accessory/sweatercrewneck + name = "crewneck sweater" + desc = "A sewn crewneck sweater featuring a collarless neckline." + desc_fluff = "Fortunately, they even have a type of sweater for the sporty and informal." + icon_state = "sweatercrewneck" + item_state = "sweatercrewneck" + +/obj/item/clothing/accessory/sweatervneck + name = "v-neck sweater" + desc = "A sewn v-neck sweater featuring a collarless neckline." + desc_fluff = "Fortunately, they even have a type of sweater for the sporty and informal." + icon_state = "sweatervneck" + item_state = "sweatervneck" /obj/item/clothing/accessory/sweaterturtleneck name = "turtleneck sweater" @@ -33,13 +33,6 @@ icon_state = "sweaterturtleneck" item_state = "sweaterturtleneck" -/obj/item/clothing/accessory/sweaterargyleturtleneck - name = "argyle turtleneck sweater" - desc = "A warm knit argyle turtleneck sweater." - desc_fluff = "Now your clothing can be as stuffy as your personality." - icon_state = "sweaterargyleturtleneck" - item_state = "sweaterargyleturtleneck" - /obj/item/clothing/accessory/sweatertubeneck name = "tubeneck sweater" desc = "A warm knit tubeneck sweater." @@ -47,6 +40,41 @@ icon_state = "sweatertubeneck" item_state = "sweatertubeneck" +/obj/item/clothing/accessory/sweaterargyle + name = "argyle sweater" + desc = "A warm knit sweater with an argyle pattern." + desc_fluff = "Never go unprepared for the next work-mandated secret santa with this fashion statement! Revel in their awkward thanks as they unbox it! Realize that you've received one too!" + icon_state = "sweaterargyle" + item_state = "sweaterargyle" + +/obj/item/clothing/accessory/sweatervestargyle + name = "argyle sweater vest" + desc = "A warm knit sweater vest with an argyle pattern." + desc_fluff = "Reminds you of family picture day. Wearing this is entirely your own volition, unfortunately." + icon_state = "sweaterargylevest" + item_state = "sweaterargylevest" + +/obj/item/clothing/accessory/sweaterargylecrewneck + name = "argyle crewneck sweater" + desc = "A sewn crewneck sweater featuring a collarless neckline and an argyle pattern." + desc_fluff = "Fortunately, they even have a type of sweater for the sporty and informal." + icon_state = "sweaterargylecrewneck" + item_state = "sweaterargylecrewneck" + +/obj/item/clothing/accessory/sweaterargylevneck + name = "argyle v-neck sweater" + desc = "A sewn v-neck sweater featuring a collarless neckline and an argyle pattern." + desc_fluff = "Fortunately, they even have a type of sweater for the sporty and informal." + icon_state = "sweaterargylevneck" + item_state = "sweaterargylevneck" + +/obj/item/clothing/accessory/sweaterargyleturtleneck + name = "argyle turtleneck sweater" + desc = "A warm knit argyle turtleneck sweater." + desc_fluff = "Now your clothing can be as stuffy as your personality." + icon_state = "sweaterargyleturtleneck" + item_state = "sweaterargyleturtleneck" + /obj/item/clothing/accessory/sweaterargyletubeneck name = "argyle tubeneck sweater" desc = "A warm knit argyle tubeneck sweater." @@ -59,24 +87,69 @@ desc = "A casual dress shirt." icon_state = "dressshirt" item_state = "dressshirt" + var/rolled = FALSE -/obj/item/clothing/accessory/dressshirt_r +/obj/item/clothing/accessory/dressshirt/update_clothing_icon() + if(ismob(loc)) + var/mob/M = loc + M.update_inv_wear_suit() + get_mob_overlay(TRUE) + get_inv_overlay(TRUE) + +/obj/item/clothing/accessory/dressshirt/verb/roll_up_shirt_sleeves() + set name = "Roll Up Shirt Sleeves" + set desc = "Roll up your shirt sleeves. Doesn't work with some shirts." + set category = "Object" + set src in usr + + if(use_check_and_message(usr)) + return FALSE + + var/list/icon_states = icon_states(icon) + var/initial_state = initial(icon_state) + var/new_state = "[initial_state]_r" + if(!(new_state in icon_states)) + to_chat(usr, SPAN_WARNING("Your shirt doesn't allow this!")) + return + + rolled = !rolled + to_chat(usr, SPAN_NOTICE("You roll your shirt sleeves [rolled ? "up" : "down"].")) + icon_state = rolled ? new_state : initial_state + item_state = rolled ? new_state : initial_state + overlay_state = rolled ? new_state : initial_state + update_icon() + update_clothing_icon() + +/obj/item/clothing/accessory/dressshirt/alt name = "dress shirt" - desc = "A casual dress shirt. This one has its sleeves rolled up." - icon_state = "dressshirt_r" - item_state = "dressshirt_r" + desc = "A casual dress shirt." + icon_state = "dressshirt_alt" + item_state = "dressshirt_alt" -/obj/item/clothing/accessory/dressshirt_crop +/obj/item/clothing/accessory/dressshirt/crop name = "cropped dress shirt" desc = "A casual cropped dress shirt." icon_state = "dressshirt_crop" item_state = "dressshirt_crop" -/obj/item/clothing/accessory/dressshirt_crop_r +// So people can see how these appear in the loadout +/obj/item/clothing/accessory/dressshirt/rolled + name = "dress shirt" + desc = "A casual dress shirt. This one has its sleeves rolled up." + icon_state = "dressshirt_r" + item_state = "dressshirt_r" + +/obj/item/clothing/accessory/dressshirt/alt/rolled + name = "dress shirt" + desc = "A casual dress shirt. This one has its sleeves rolled up." + icon_state = "dressshirt_alt_r" + item_state = "dressshirt_alt_r" + +/obj/item/clothing/accessory/dressshirt/crop/rolled name = "cropped dress shirt" - desc = "A casual cropped dress shirt. This one has its sleeves rolled up." - icon_state = "dressshirt_crop_r" - item_state = "dressshirt_crop_r" + desc = "A casual cropped dress shirt. This one has its sleeves rolled up" + icon_state = "dressshirt_crop" + item_state = "dressshirt_crop" /obj/item/clothing/accessory/blouse name = "blouse" diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index d3ede838aba..67ef1aaff60 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -70,6 +70,30 @@ icon_state = "vest_white" slots = 5 +/obj/item/clothing/accessory/storage/webbingharness + name = "webbing harness" + desc = "Durable mess of synthcotton belts and buckles. Has some pouches, but not a lot." + icon_state = "vest_harness" + +/obj/item/clothing/accessory/storage/webbingharness/alt + icon_state = "vest_harness_alt" + +/obj/item/clothing/accessory/storage/webbingharness/pouches + icon_state = "vest_harness_pouches" + +/obj/item/clothing/accessory/storage/webbingharness/pouches/ert + desc = "Durable mess of synthcotton belts and buckles. To better satiate the need for storage and stability." + slots = 5 + +/obj/item/clothing/accessory/storage/webbingharness/grayscale + icon_state = "vest_harness_g" + +/obj/item/clothing/accessory/storage/webbingharness/alt/grayscale + icon_state = "vest_harness_alt_g" + +/obj/item/clothing/accessory/storage/webbingharness/pouches/grayscale + icon_state = "vest_harness_pouches_g" + /obj/item/clothing/accessory/storage/overalls name = "overalls" desc = "Heavy-duty overalls for use on the work site, with plenty of convenient pockets to boot." diff --git a/code/modules/clothing/under/accessories/xeno/tajara.dm b/code/modules/clothing/under/accessories/xeno/tajara.dm index acd77c29f99..fa3094b8d28 100644 --- a/code/modules/clothing/under/accessories/xeno/tajara.dm +++ b/code/modules/clothing/under/accessories/xeno/tajara.dm @@ -249,4 +249,17 @@ desc = "A simple rosette accessory depicting the Tajaran god S'rendarr." icon_state = "rosette" item_state = "rosette" - flippable = FALSE \ No newline at end of file + flippable = FALSE + +/obj/item/clothing/accessory/tajara/council_badge + name = "free tajaran council badge" + desc = "A medal badge used by the members of the Free Tajaran Council." + icon_state = "council_badge" + item_state = "council_badge" + overlay_state = "council_badge" + desc_fluff = "The Free Tajaran Council is the largest Tajaran community in Himeo; its origin can be traced back to the First Revolution. Born in the city of Shungsta during the war, \ + the Tajaran Free Council was a political movement that advocated for the total abolishment of authoritarian governments in favor of independent democratic councils. " + flippable = TRUE + + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' diff --git a/code/modules/clothing/under/accessories/xeno/unathi.dm b/code/modules/clothing/under/accessories/xeno/unathi.dm index c29b84aa7ea..a692d83df05 100644 --- a/code/modules/clothing/under/accessories/xeno/unathi.dm +++ b/code/modules/clothing/under/accessories/xeno/unathi.dm @@ -1,6 +1,7 @@ /obj/item/clothing/accessory/sinta_hood name = "clan hood" - desc = "A hood worn commonly by unathi away from home. No better way of both representing your clan to foreigners and keeping the sun out of your eyes in style!" + desc = "A hood worn commonly by unathi away from home. No better way of both representing your clan to \ + foreigners and keeping the sun out of your eyes in style!" icon = 'icons/obj/unathi_items.dmi' icon_state = "sinta_hood" item_state = "sinta_hood_up" @@ -32,4 +33,105 @@ to_chat(usr, SPAN_NOTICE("You flip \the [src] down.")) update_worn_icon() update_clothing_icon() - update_icon() \ No newline at end of file + update_icon() + +/obj/item/clothing/accessory/unathi + name = "gyazo belt" + desc = "A simple belt fashioned from cloth, the gyazo belt is an adornment that can be paired with practically \ + any Unathite outfit and is a staple for any Sinta. Fashionable and comes in a variety of colors!" + icon = 'icons/obj/unathi_items.dmi' + icon_state = "sash" + item_state = "sash" + contained_sprite = TRUE + +/obj/item/clothing/accessory/poncho/maxtlatl + name = "Th'akhist maxtlatl" + desc = "A traditional garment worn by Th'akh shamans. Popular adornments include dried and pressed grass and \ + flowers, in addition to colorful stones placed into and hanging off of the mantle." + desc_fluff = "The term \" maxtlatl\" was given by humanity upon seeing this due to its resemblance to ancient \ + human cultures. However, it is more appropriately called a zlukti, or 'spirit garb'. Each adornment, whether \ + feathers, stones, or metals, is made by another shaman who has passed away: the more colorful the attire, the \ + older it is." + icon = 'icons/obj/unathi_items.dmi' + icon_state = "maxtlatl" + item_state = "maxtlatl" + icon_override = null + contained_sprite = TRUE + +/obj/item/clothing/accessory/poncho/unathimantle + name = "desert hide mantle" + desc = "The cured hide and skin of a large beast, tapered off with a colorful collar. This one is a popular \ + trophy among Wastelanders: someone's been hunting!" + desc_fluff = "With the expansion of the Touched Lands, the normal beasts that prowl and stalk the dunes have \ + proliferated at unprecedented rates. Those stranded outside of the greenery of the Izweski take up arms to cull \ + the herdes of klazd, and their skins make valuable mantles to protect wearers from the sun." + icon = 'icons/obj/unathi_items.dmi' + icon_state = "mantle-unathi" + item_state = "mantle-unathi" + icon_override = null + contained_sprite = TRUE + build_from_parts = TRUE + worn_overlay = "desert" + +/obj/item/clothing/accessory/poncho/unathimantle/forest + name = "forest hide mantle" + desc = "The cured hide and skin of a large beast, tapered off with a colorful collar. These are seen exclusively \ + by warriors, nobles, and those with credits to spare." + desc_fluff = "After the Contact War, the prized horns of the tul quickly vanished from the market. Nobles and \ + wealthy guildsmen were swift to monopolize and purchase all the remaining cloaks; a peasant seen with one of \ + these is likely enough a death sentence." + worn_overlay = "forest" + +/obj/item/clothing/accessory/poncho/unathimantle/mountain + name = "mountain hide mantle" + desc = "The cured hide and skin of a large beast, tapered off with a colorful collar. Mountainous arbek, massive \ + snakes longer than a bus, have a long enough hide for multiple mantles." + desc_fluff = "Hunting an arbek is no easy task. Brave Zo'saa looking to prove themselves in battle and be \ + promoted to Saa rarely understand the gravity of these trials. Serpents large enough to swallow Unathi whole, \ + they can live up to half a millenia- should enough foolish adventurers try to slay it, that is." + worn_overlay = "mountain" + +/obj/item/clothing/accessory/poncho/rockstone + name = "rockstone cape" + desc = "A cape seen exclusively on nobility. The chain is adorned with precious, multi-color stones, hence its name." + desc_fluff = "A simple drape over the shoulder is done easily; the distinguishing part between the commoners and \ + nobility is the sheer elegance of the rockstone cape. Vibrant stones adorn the heavy collar, and the cape itself \ + is embroidered with gold." + icon = 'icons/obj/unathi_items.dmi' + icon_state = "rockstone" + item_state = "rockstone" + icon_override = null + contained_sprite = TRUE + var/additional_color = COLOR_GRAY + +/obj/item/clothing/accessory/poncho/rockstone/update_icon() + cut_overlays() + var/image/gem = image(icon, null, "rockstone_gem") + gem.appearance_flags = RESET_COLOR + gem.color = additional_color + add_overlay(gem) + var/image/chain = image(icon, null, "rockstone_chain") + chain.appearance_flags = RESET_COLOR + add_overlay(chain) + +/obj/item/clothing/accessory/poncho/rockstone/worn_overlays(icon_file, slot) + . = ..() + if(slot == slot_wear_suit) + var/image/gem = image(icon_file, null, "rockstone_un_gem") + gem.appearance_flags = RESET_COLOR + gem.color = additional_color + . += gem + var/image/chain = image(icon_file, null, "rockstone_un_chain") + chain.appearance_flags = RESET_COLOR + . += chain + +/obj/item/clothing/accessory/poncho/rockstone/get_mob_overlay(force) + var/image/base = ..() + var/image/gem = image(icon, null, "rockstone_un_gem") + gem.appearance_flags = RESET_COLOR + gem.color = additional_color + base.add_overlay(gem) + var/image/chain = image(icon, null, "rockstone_un_chain") + chain.appearance_flags = RESET_COLOR + base.add_overlay(chain) + return base \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 9783d6cf18d..d263e35baeb 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -41,13 +41,6 @@ item_state = "w_suit" worn_state = "chef" -/obj/item/clothing/under/rank/clown - name = "clown suit" - desc = "'HONK!'" - icon_state = "clown" - item_state = "clown" - worn_state = "clown" - /obj/item/clothing/under/rank/head_of_personnel desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"." name = "head of personnel's jumpsuit" diff --git a/code/modules/clothing/under/jobs/sol.dm b/code/modules/clothing/under/jobs/sol.dm index 030257bcab0..9179a785a01 100644 --- a/code/modules/clothing/under/jobs/sol.dm +++ b/code/modules/clothing/under/jobs/sol.dm @@ -1,7 +1,7 @@ -/obj/item/clothing/under/rank/fatigues //regular sol navy combat fatigues - name = "sol navy fatigues" - desc = "Military looking uniform issued to Sol Alliance navy, to be used while in the field." +/obj/item/clothing/under/rank/fatigues //regular sol navy uniform + name = "sol navy coveralls" + desc = "Fire-retardant naval utility coveralls, worn by Solarian naval personnel serving aboard ships and in the field." icon = 'icons/obj/sol_uniform.dmi' icon_state = "sol_uniform" item_state = "sol_uniform" @@ -14,7 +14,7 @@ /obj/item/clothing/under/rank/fatigues/marine //regular sol navy marine fatigues name = "sol marine fatigues" - desc = "Military looking uniform issued to Sol Alliance marines, to be used while in the field." + desc = "A military uniform issued to Sol Alliance marines, to be used while in the field." icon = 'icons/obj/sol_uniform.dmi' icon_state = "marine_fatigue" item_state = "marine_fatigue" @@ -43,7 +43,7 @@ /obj/item/clothing/under/rank/service //navy personnel service unniform name = "sol navy service uniform" - desc = "Military looking service uniform issued to Sol Alliance navy members." + desc = "A military service uniform issued to Sol Alliance naval personnel, to be worn in environments where a utility uniform is unfitting." icon = 'icons/obj/sol_uniform.dmi' icon_state = "whiteservice" item_state = "whiteservice" @@ -51,7 +51,7 @@ /obj/item/clothing/under/rank/service/marine //sol marine service unniform name = "sol marine service uniform" - desc = "Military looking service uniform issued to Sol Alliance marines." + desc = "A military service uniform issued to Sol Alliance marines, to be worn in environments where a utility uniform is unfitting." icon = 'icons/obj/sol_uniform.dmi' icon_state = "tanutility" item_state = "tanutility" @@ -59,7 +59,7 @@ /obj/item/clothing/under/rank/dress //navy personnel dress unniform name = "sol navy dress uniform" - desc = "A fancy military looking dress uniform issued to Sol Alliance navy members." + desc = "A fancy military dress uniform issued to Sol Alliance naval personnel, to be worn in environments where a service uniform isn't formal enough." icon = 'icons/obj/sol_uniform.dmi' icon_state = "sailor" item_state = "sailor" @@ -67,31 +67,31 @@ /obj/item/clothing/under/rank/dress/marine //sol marine dress unniform name = "sol marine dress uniform" - desc = "A fancy military looking dress uniform issued to Sol Alliance marine." + desc = "A fancy military dress uniform issued to Sol Alliance marines, to be worn in environments where a service uniform isn't formal enough." icon = 'icons/obj/sol_uniform.dmi' icon_state = "mahreendress" item_state = "mahreendress" contained_sprite = 1 -/obj/item/clothing/under/rank/dress/officer //sol marine officer dress unniform - name = "sol navy commander dress uniform" - desc = "A fancy military looking dress uniform issued to high ranking Sol Alliance navy officers. This one wears the rank of Commander" - icon = 'icons/obj/sol_uniform.dmi' - icon_state = "dress" - item_state = "dress" - contained_sprite = 1 - /obj/item/clothing/under/rank/dress/subofficer //sol marine officer dress unniform - name = "sol navy lieutenant dress uniform" - desc = "A fancy military looking dress uniform issued to lower ranking Sol Alliance navy officers. This one wears the rank of Lieutenant" + name = "sol navy junior officer uniform" + desc = "A fancy military uniform issued to lower ranking Sol Alliance navy officers. An officer in this uniform would be an Ensign, Sub-Lieutenant, or Lieutenant." icon = 'icons/obj/sol_uniform.dmi' icon_state = "subdress" item_state = "subdress" contained_sprite = 1 +/obj/item/clothing/under/rank/dress/officer //sol marine officer dress unniform + name = "sol navy senior officer uniform" + desc = "A fancy military uniform issued to high ranking Sol Alliance navy officers. An officer in this uniform would be a Lieutenant Commander, Commander, or Captain." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "dress" + item_state = "dress" + contained_sprite = 1 + /obj/item/clothing/under/rank/dress/admiral //admiral uniform name = "sol navy admiral uniform" - desc = "A fancy military dress uniform issued to a higher member of the Sol Alliance navy." + desc = "A fancy military uniform issued to a higher member of the Sol Alliance navy. An officer in this uniform would be some form of Admiral." icon = 'icons/obj/sol_uniform.dmi' icon_state = "admiral_uniform" item_state = "admiral_uniform" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 09c971ad0d4..25d67b1d1cc 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -45,14 +45,6 @@ item_state = "waiter" worn_state = "waiter" -/obj/item/clothing/under/sexyclown - name = "sexy-clown suit" - desc = "It makes you look HONKable!" - icon_state = "sexyclown" - item_state = "clown" - worn_state = "sexyclown" - body_parts_covered = UPPER_TORSO|LOWER_TORSO - //This set of uniforms looks fairly fancy and is generally used for high-ranking NT personnel from what I've seen, so lets give them appropriate ranks. /obj/item/clothing/under/rank/centcom desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain.\"" @@ -303,6 +295,7 @@ item_state = "bl_suit" worn_state = "sundress" body_parts_covered = UPPER_TORSO|LOWER_TORSO + no_overheat = TRUE /obj/item/clothing/under/sundress_white name = "white sundress" @@ -512,6 +505,8 @@ item_state = "bl_suit" worn_state = "taucetilegion" siemens_coefficient = 0.7 + armor = list( + melee = ARMOR_MELEE_MINOR) /obj/item/clothing/under/legion/sentinel name = "Tau Ceti Foreign Legion sentinel uniform" @@ -573,3 +568,10 @@ item_state = "lance_dress_m" worn_state = "lance_dress_m" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + +/obj/item/clothing/under/qipao + name = "qipao" + desc = "A traditional Solarian women's garment, typically made of (synthetic) silk." + icon_state = "qipao" + item_state = "qipao" + body_parts_covered = UPPER_TORSO|LOWER_TORSO diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index ade9a6a4af1..59c5bc2cac2 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -114,7 +114,7 @@ icon = 'icons/obj/pants.dmi' icon_state = "jeans" item_state = "jeans" - contained_sprite = 1 + contained_sprite = TRUE gender = PLURAL body_parts_covered = LOWER_TORSO|LEGS @@ -124,7 +124,7 @@ icon = 'icons/obj/tracksuit.dmi' icon_state = "trackpants" item_state = "trackpants" - contained_sprite = 1 + contained_sprite = TRUE /obj/item/clothing/under/pants/track/blue name = "blue track pants" @@ -158,6 +158,14 @@ icon_state = "jeansmustang" item_state = "jeansmustang" +/obj/item/clothing/under/pants/musthangcolour + name = "must hang jeans" + desc = "Made in the finest space jeans factory this side of Tau Ceti." + icon_state = "mustangcolour" + item_state = "mustangcolour" + build_from_parts = TRUE + worn_overlay = "belt" + /obj/item/clothing/under/pants/jeansblack name = "black jeans" desc = "A pair of black jeans." @@ -212,12 +220,26 @@ icon_state = "designer_jeans" item_state = "designer_jeans" +/obj/item/clothing/under/pants/tailoredjeans + name = "tailored jeans" + desc = "Close fitting denim jeans carefully distressed to perfection. They're not as rugged as they look." + icon_state = "tailored_jeans" + item_state = "tailored_jeans" + build_from_parts = TRUE + worn_overlay = "belt" + /obj/item/clothing/under/pants/dress name = "dress pants" desc = "A pair of suit trousers. The rest of the outfit can't have gone far." icon_state = "dresspants" item_state = "dresspants" +/obj/item/clothing/under/pants/dress/belt + name = "dress pants" + desc = "A pair of suit trousers. Comes with a belt, to secure your burdens." + icon_state = "dresspants_belt" + item_state = "dresspants_belt" + /obj/item/clothing/under/pants/striped name = "striped pants" desc = "A pair of striped pants. Typically seen among privateers." diff --git a/code/modules/clothing/under/xenos/tajara.dm b/code/modules/clothing/under/xenos/tajara.dm index 90ca09bf539..01b7657e832 100644 --- a/code/modules/clothing/under/xenos/tajara.dm +++ b/code/modules/clothing/under/xenos/tajara.dm @@ -8,6 +8,7 @@ desc_fluff = "Having direct and friendly contact with humanity, The People's Republic of Adhomai has been the most influenced by the spacer fashion. The most known \ being the \"assistant jumpsuits\" which directly inspired the design of factory overalls, the plight and low pay of the assistants being close to the hearts of Tajara Hadiist \ workers and their Republic." + no_overheat = TRUE /obj/item/clothing/under/tajaran/fancy name = "fancy uniform" @@ -46,6 +47,10 @@ contracted engineers, access to higher education abroad and training from Sol Alliance naval advisers, the People's Republic has been able to commission and crew some of its own \ ships. The Republican Navy's space-arm primarily conducts counter piracy operations in conjunction with fending off raiders." starting_accessories = (/obj/item/clothing/accessory/storage/bayonet) + siemens_coefficient = 0.5 // Every Kosmostrelki is expected to assist in repairs when push comes to shove, so their uniform is slightly better at absorbing shocks compared to other combat uniforms + armor = list( + melee = ARMOR_MELEE_SMALL, + bullet = ARMOR_BALLISTIC_MINOR) /obj/item/clothing/under/tajaran/cosmonaut/commissar name = "kosmostrelki commissar uniform" @@ -75,7 +80,7 @@ /obj/item/clothing/under/tajaran/raakti_shariim name = "\improper Raakti Shariim uniform" desc = "A blue and lilac adhomian uniform with pale-gold insignia, worn by members of the NKA's Raakti Shariim." - icon = 'icons/obj/clothing/species/tajaran/raakti_shariim.dmi' + icon = 'icons/obj/tajara_items.dmi' icon_state = "raakti_shariim_uniform" item_state = "raakti_shariim_uniform" desc_fluff = "The Raakti Shariim (Royal Peacekeepers in Ceti Basic) are the New Kingdom of Adhomai's policing and \ @@ -153,13 +158,18 @@ icon_state = "prauniform" item_state = "prauniform" starting_accessories = list(/obj/item/clothing/accessory/storage/bayonet) + siemens_coefficient = 0.7 + armor = list( + melee = ARMOR_MELEE_SMALL, + bullet = ARMOR_BALLISTIC_MINOR) /obj/item/clothing/under/tajaran/nka_uniform name = "imperial adhomian army uniform" - desc = "A military uniform used by the forces of New Kingdom's army." + desc = "A military uniform used by the forces of the New Kingdom of Adhomai's army." icon_state = "nka_uniform" item_state = "nka_uniform" starting_accessories = list(/obj/item/clothing/accessory/storage/bayonet) + armor = list(melee = ARMOR_MELEE_SMALL) /obj/item/clothing/under/tajaran/consular name = "people's republic consular uniform" diff --git a/code/modules/clothing/under/xenos/unathi.dm b/code/modules/clothing/under/xenos/unathi.dm index 512f286c48b..7f1c186b812 100644 --- a/code/modules/clothing/under/xenos/unathi.dm +++ b/code/modules/clothing/under/xenos/unathi.dm @@ -1,6 +1,7 @@ /obj/item/clothing/under/unathi name = "sinta tunic" - desc = "A tunic common on both Moghes and Ouerea, it's simple and easy to manufacture design makes it universally favorable." + desc = "A tunic common on both Moghes and Ouerea. It's simple and easily-manufactured design makes it \ + universally favorable." icon = 'icons/obj/unathi_items.dmi' icon_state = "tunic" item_state = "tunic" @@ -18,61 +19,87 @@ /obj/item/clothing/under/unathi/sashes name = "gy'zao sashes" gender = PLURAL - desc = "An androgynous set of sashes worn by Unathi when they want to bask under the sun. Not appropriate to wear outside of that." + desc = "An androgynous set of sashes worn by Unathi when they want to bask under the sun. Not appropriate \ + to wear outside of that." icon_state = "gyzao" item_state = "gyzao" /obj/item/clothing/under/unathi/mogazali name = "mogazali attire" - desc = "A traditional Moghean uniform worn by men of high status whether merchants, priests, or nobility." + desc = "A traditional Moghean uniform worn by men of high status, whether merchants, priests, or nobility." icon_state = "mogazali" item_state = "mogazali" /obj/item/clothing/under/unathi/zazali name = "zazali garb" - desc = "An old fashioned, extremely striking garb for the Unathi man with pointy shoulders. It's typically worn by those in the warrior caste... Or those with something to prove." + desc = "An old fashioned, extremely striking garb for a Unathi man with pointy shoulders. It's typically \ + worn by those in the warrior caste or those with something to prove." icon_state = "zazali" item_state = "zazali" + var/additional_color = COLOR_GRAY // The default color. + +/obj/item/clothing/under/unathi/zazali/update_icon() + cut_overlays() + var/image/top = image(icon, null, "zazali_top") + top.appearance_flags = RESET_COLOR + top.color = additional_color + add_overlay(top) + var/image/belt = image(icon, null, "zazali_belt") + belt.appearance_flags = RESET_COLOR + add_overlay(belt) + +/obj/item/clothing/under/unathi/zazali/worn_overlays(icon_file, slot) + . = ..() + if(slot == slot_w_uniform) + var/image/top = image(icon_file, null, "zazali_un_top") + top.appearance_flags = RESET_COLOR + top.color = additional_color + . += top + var/image/belt = image(icon_file, null, "zazali_un_belt") + belt.appearance_flags = RESET_COLOR + . += belt /obj/item/clothing/under/unathi/huytai name = "huytai outfit" - desc = "Typically worn by Unathi women who engage in a trade. Popular with fisherwomen and others." + desc = "Typically worn by Unathi women who engage in a trade. Popular with fisherwomen especially!" icon_state = "huytai" item_state = "huytai" /obj/item/clothing/under/unathi/zozo name = "zo'zo top" - desc = "A modern blend of Ouerean and Moghean style for the Unathi man on the go. Great for sunbathing." + desc = "A modern blend of Ouerean and Moghean style for anyone on the go. Great for sunbathing!" icon_state = "zozo" item_state = "zozo" -/obj/item/clothing/suit/unathi/mantle/wrapping - name = "unathi wrappings" - desc = "Stitched together clothing with bandages covering them, looks tailored for an unathi." - desc_fluff = "This is a very traditional Sinta wear for Th'akh shamans, most modern Sinta do not wear these." - icon = 'icons/obj/unathi_items.dmi' - icon_state = "thakh_wrappings" //special thanks to Araskael - item_state = "thakh_wrappings" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEJUMPSUIT|HIDETAIL - species_restricted = list(BODYTYPE_UNATHI) - contained_sprite = TRUE +/obj/item/clothing/under/unathi/himation + name = "himation cloak" + desc = "The himation is a staple of Unathi fashion. Whether a commoner in practical clothes or a noble looking \ + for leisure wear, the himation has remained stylish for centuries." + desc_fluff = "The himation while unwrapped is usually a three meter around cloth. Unathi start by putting the \ + front around their waist, bring it over their right shoulder, and then form a sash-like loop by bringing it over \ + their right again. A belt ties it off and drapes a skirt down over their thighs to complete the look. Fashionable \ + for simple noble wear (the cloth can be embroidered), and practical for labor!" + icon_state = "himation" + item_state = "himation" + var/additional_color = COLOR_GRAY -/obj/item/clothing/mask/gas/wrapping - name = "unathi head wrappings" - desc = "A bunch of stitched together bandages with a fibreglass breath mask on it, openings for the eyes. Looks tailored for an unathi." - desc_fluff = "This is a very traditional Sinta wear for Th'akh shamans, most modern Sinta do not wear these." - icon = 'icons/obj/unathi_items.dmi' - icon_state = "thakh_mask" //special thanks to Araskael - item_state = "thakh_mask" - species_restricted = list(BODYTYPE_UNATHI) - contained_sprite = TRUE +/obj/item/clothing/under/unathi/himation/update_icon() + cut_overlays() + var/image/skirt = image(icon, null, "himation_skirt") + skirt.appearance_flags = RESET_COLOR + skirt.color = additional_color + add_overlay(skirt) + var/image/belt = image(icon, null, "himation_belt") + belt.appearance_flags = RESET_COLOR + add_overlay(belt) -/obj/item/clothing/accessory/poncho/unathimantle - name = "hide mantle" - desc = "A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle." - icon = 'icons/obj/unathi_items.dmi' - icon_state = "mantle-unathi" - item_state = "mantle-unathi" - icon_override = null - contained_sprite = TRUE \ No newline at end of file +/obj/item/clothing/under/unathi/himation/worn_overlays(icon_file, slot) + . = ..() + if(slot == slot_w_uniform) + var/image/skirt = image(icon_file, null, "himation_un_skirt") + skirt.appearance_flags = RESET_COLOR + skirt.color = additional_color + . += skirt + var/image/belt = image(icon_file, null, "himation_un_belt") + belt.appearance_flags = RESET_COLOR + . += belt \ No newline at end of file diff --git a/code/modules/clothing/wrists/xeno/unathi.dm b/code/modules/clothing/wrists/xeno/unathi.dm new file mode 100644 index 00000000000..a61d86e7077 --- /dev/null +++ b/code/modules/clothing/wrists/xeno/unathi.dm @@ -0,0 +1,26 @@ +/obj/item/clothing/wrists/unathi + name = "unathi wristwear" + desc = "The default wrists." + icon = 'icons/obj/unathi_items.dmi' + contained_sprite = TRUE + +/obj/item/clothing/wrists/unathi/jeweled + name = "jeweled bracers" + desc = "A pair of flashy bracers for a stylish Sinta, whether a noble or a noble's envoy." + icon_state = "bracers" + item_state = "bracers" + gender = PLURAL + build_from_parts = TRUE + worn_overlay = "trim" + +/obj/item/clothing/wrists/unathi/maxtlatl + name = "Th'akhist wristguards" + desc = "A traditional garment worn by Th'akh shamans. Popular adornments include dried and pressed grass and \ + feathers, as well as precious metals and colorful stones in the cuff itself." + desc_fluff = "Wristguards as a part of the maxtatl did not become prevalent until much later in Th'akh \ + tradition. As time passed and garb was passed down from shaman to shaman, attire became cluttered with \ + adornments. Bracers were designed as a method of adding more charms to remember previous shamans that \ + predate the latest to pass away." + icon_state = "maxtlatl-wrists" + item_state = "maxtlatl-wrists" + gender = PLURAL \ No newline at end of file diff --git a/code/modules/compass/_compass.dm b/code/modules/compass/_compass.dm new file mode 100644 index 00000000000..1ceb975b0c2 --- /dev/null +++ b/code/modules/compass/_compass.dm @@ -0,0 +1,15 @@ +#define COMPASS_INTERVAL 3 +#define COMPASS_PERIOD 15 +#define COMPASS_LABEL_OFFSET 150 + +/* + This folder contains an abstract type (/obj/compass_holder) which contains a set of + waypoints (/datum/compass_waypoint) and generates a circular compass with markers for + mobs that have the object in their screen list. See GPS for an example implementation. +*/ + +/image/compass_marker + maptext_height = 64 + maptext_width = 128 + maptext_x = -48 + maptext_y = -32 \ No newline at end of file diff --git a/code/modules/compass/compass_holder.dm b/code/modules/compass/compass_holder.dm new file mode 100644 index 00000000000..2eca5759b8d --- /dev/null +++ b/code/modules/compass/compass_holder.dm @@ -0,0 +1,125 @@ +/obj/compass_holder + name = null + icon = null + icon_state = null + screen_loc = "CENTER,CENTER" + + var/show_heading = FALSE + var/numeric_directions = FALSE + + var/image/compass_heading_marker + var/list/compass_static_labels + var/list/compass_waypoints + var/list/compass_waypoint_markers + + var/static/list/angle_step_to_dir = list( + "N", + "NE", + "E", + "SE", + "S", + "SW", + "W", + "NW", + "N" + ) + +/obj/compass_holder/Initialize(mapload, ...) + . = ..() + if(show_heading) + compass_heading_marker = new /image/compass_marker + compass_heading_marker.maptext = "
    " + compass_heading_marker.filters = filter(type="drop_shadow", color = "#00ffffaa", size = 2, offset = 1,x = 0, y = 0) + compass_heading_marker.layer = UNDER_HUD_LAYER + + for(var/i in 0 to (360/(COMPASS_PERIOD))-1) + var/image/I = new /image/compass_marker + I.loc = src + var/str + var/str_col + if(i % COMPASS_INTERVAL == 0) + var/angle = (i * COMPASS_PERIOD) + if(numeric_directions) + str = "[angle]" + else + str = angle_step_to_dir[clamp(round(angle/45)+1, 1, length(angle_step_to_dir))] + str_col = "#ffffffaa" + else + str = "〡" + str_col = "#aaaaaa88" + I.maptext = "
    [str]
    " + var/matrix/M = matrix() + M.Translate(0, COMPASS_LABEL_OFFSET) + M.Turn(COMPASS_PERIOD * i) + I.transform = M + I.filters = filter(type="drop_shadow", color = "#77777777", size = 2, offset = 1,x = 0, y = 0) + I.layer = UNDER_HUD_LAYER + LAZYADD(compass_static_labels, I) + + rebuild_overlay_lists(TRUE) + +/obj/compass_holder/Destroy() + QDEL_NULL_LIST(compass_waypoints) + . = ..() + +/obj/compass_holder/proc/get_heading() + var/atom/A = loc?.loc // is there a get_holder_recursive() equivalent on Polaris? + if(istype(A)) + . = dir2angle(A.dir) + else + . = 0 + +/obj/compass_holder/update_icon() + var/set_overlays = (compass_static_labels | compass_waypoint_markers) + if(show_heading) + set_overlays |= compass_heading_marker + overlays = set_overlays + +/obj/compass_holder/proc/clear_waypoint(var/id) + LAZYREMOVE(compass_waypoints, id) + rebuild_overlay_lists(TRUE) + +/obj/compass_holder/proc/set_waypoint(var/id, var/label, var/heading_x, var/heading_y, var/heading_z, var/label_color) + var/datum/compass_waypoint/wp = LAZYACCESS(compass_waypoints, id) + if(!wp) + wp = new /datum/compass_waypoint() + wp.set_values(label, heading_x, heading_y, heading_z, label_color) + LAZYSET(compass_waypoints, id, wp) + rebuild_overlay_lists(TRUE) + +/obj/compass_holder/proc/recalculate_heading(var/rebuild_icon = TRUE) + if(show_heading) + var/matrix/M = matrix() + M.Translate(0, round(COMPASS_LABEL_OFFSET - 35)) + M.Turn(get_heading()) + compass_heading_marker.transform = M + if(rebuild_icon) + update_icon() + +/obj/compass_holder/proc/show_waypoint(var/id) + var/datum/compass_waypoint/wp = compass_waypoints[id] + wp.hidden = FALSE + +/obj/compass_holder/proc/hide_waypoint(var/id) + var/datum/compass_waypoint/wp = compass_waypoints[id] + wp.hidden = TRUE + +/obj/compass_holder/proc/hide_waypoints(var/rebuild_overlays = FALSE) + for(var/id in compass_waypoints) + hide_waypoint(id) + if(rebuild_overlays) + rebuild_overlay_lists(TRUE) + +/obj/compass_holder/proc/rebuild_overlay_lists(var/update_icon = FALSE) + compass_waypoint_markers = null + var/turf/T = get_turf(src) + if(istype(T)) + for(var/id in compass_waypoints) + var/datum/compass_waypoint/wp = compass_waypoints[id] + if(!wp.hidden) + wp.recalculate_heading(T.x, T.y) + LAZYADD(compass_waypoint_markers, wp.compass_overlay) + if(show_heading) + recalculate_heading(FALSE) + if(update_icon) + update_icon() diff --git a/code/modules/compass/compass_waypoint.dm b/code/modules/compass/compass_waypoint.dm new file mode 100644 index 00000000000..be9f2f7b4f9 --- /dev/null +++ b/code/modules/compass/compass_waypoint.dm @@ -0,0 +1,26 @@ +/datum/compass_waypoint + var/name + var/x + var/y + var/z + var/color + var/hidden = FALSE + var/image/compass_overlay + +/datum/compass_waypoint/proc/set_values(var/_name, var/_x, var/_y, var/_z, var/_color) + name = _name + x = _x + y = _y + z = _z + color = _color + compass_overlay = new /image/compass_marker + compass_overlay.loc = src + compass_overlay.maptext = "
    |\n[name]
    " + compass_overlay.filters = filter(type="drop_shadow", color = "[color]" + "aa", size = 2, offset = 1,x = 0, y = 0) + compass_overlay.layer = HUD_LAYER + +/datum/compass_waypoint/proc/recalculate_heading(var/cx, var/cy) + var/matrix/M = matrix() + M.Translate(0, (name ? COMPASS_LABEL_OFFSET-4 : COMPASS_LABEL_OFFSET)) + M.Turn(arctan(cy-y, cx-x)+180) + compass_overlay.transform = M \ No newline at end of file diff --git a/code/modules/compass/~compass.dm b/code/modules/compass/~compass.dm new file mode 100644 index 00000000000..7546d7a1e69 --- /dev/null +++ b/code/modules/compass/~compass.dm @@ -0,0 +1,3 @@ +#undef COMPASS_INTERVAL +#undef COMPASS_PERIOD +#undef COMPASS_LABEL_OFFSET \ No newline at end of file diff --git a/code/modules/cooking/machinery/cooking_machines/_cooker.dm b/code/modules/cooking/machinery/cooking_machines/_cooker.dm index f5b16c61753..2fa53d5932b 100644 --- a/code/modules/cooking/machinery/cooking_machines/_cooker.dm +++ b/code/modules/cooking/machinery/cooking_machines/_cooker.dm @@ -109,7 +109,7 @@ set_temp = text2num(desired_temp) + T0C to_chat(user, SPAN_NOTICE("You set [src] to [round(set_temp-T0C)]C.")) stat &= ~POWEROFF - use_power = !(stat & POWEROFF) && use_power + use_power = !(stat & POWEROFF) // will be updated again after heat_up if(wasoff != (stat & POWEROFF)) activation_message(user) playsound(src, 'sound/machines/click.ogg', 40, 1) @@ -138,7 +138,7 @@ update_cooking_power() // update! for(var/cooking_obj in cooking_objs) var/datum/cooking_item/CI = cooking_obj - if(isemptylist(CI.container?.reagents.reagent_data)) + if((CI.container.flags && NOREACT) || isemptylist(CI.container?.reagents.reagent_volumes)) continue CI.container.reagents.set_temperature(min(temperature, CI.container.reagents.get_temperature() + 10*SIGN(temperature - CI.container.reagents.get_temperature()))) // max of 5C per second return ..() diff --git a/code/modules/cooking/machinery/icecream.dm b/code/modules/cooking/machinery/icecream.dm index 0375ccf8011..78e71222787 100644 --- a/code/modules/cooking/machinery/icecream.dm +++ b/code/modules/cooking/machinery/icecream.dm @@ -114,6 +114,7 @@ // beaker.reagents.trans_to(I, 10) if(I.reagents.total_volume < 10) I.reagents.add_reagent(/decl/reagent/sugar, 10 - I.reagents.total_volume, temperature = T0C - 15) + I.reagents.reagent_data = list(/decl/reagent/nutriment = list("[flavour_name]" = 10)) else to_chat(user, SPAN_WARNING("There is not enough icecream left!")) else diff --git a/code/modules/cooking/machinery/smartfridge.dm b/code/modules/cooking/machinery/smartfridge.dm index a3447e13539..bf03953a0d0 100644 --- a/code/modules/cooking/machinery/smartfridge.dm +++ b/code/modules/cooking/machinery/smartfridge.dm @@ -222,15 +222,17 @@ /obj/machinery/smartfridge/drying_rack/machinery_process() ..() - if (length(contents)) + if(length(contents)) dry() /obj/machinery/smartfridge/drying_rack/proc/dry() for(var/obj/item/reagent_containers/food/snacks/S in contents) if(S.dry) continue - if(S.on_dry(loc)) - if(!(S in contents)) - item_quants[S.name]-- + var/old_name = S.name + if(S.on_dry(src)) //Drying rack keeps the item but changes the name. This prevents pre-dried item lingering in the UI as vendable + item_quants[S.name]++ + item_quants[old_name]-- + SSvueui.check_uis_for_change(src) return /obj/machinery/smartfridge/machinery_process() diff --git a/code/modules/cooking/recipes/cultural/recipes_tajara.dm b/code/modules/cooking/recipes/cultural/recipes_tajara.dm index 1f802e3843b..ede14d0e37b 100644 --- a/code/modules/cooking/recipes/cultural/recipes_tajara.dm +++ b/code/modules/cooking/recipes/cultural/recipes_tajara.dm @@ -71,6 +71,91 @@ return ..() return FALSE +// Tajaran cakes +/decl/recipe/conecake + appliance = OVEN + reagents = list(/decl/reagent/drink/milk/adhomai = 5, /decl/reagent/nutriment/flour/nfrihi = 15, /decl/reagent/water = 5, /decl/reagent/sugar = 15) + result = /obj/item/reagent_containers/food/snacks/cone_cake + +/decl/recipe/avah + appliance = FRYER + reagents = list(/decl/reagent/drink/milk/adhomai = 5, /decl/reagent/sugar = 5) + items = list( + /obj/item/reagent_containers/food/snacks/dough, + /obj/item/reagent_containers/food/snacks/cheesewedge + ) + result = /obj/item/reagent_containers/food/snacks/avah + +// Tajaran pies +/decl/recipe/fruitrikazu + appliance = OVEN + reagents = list(/decl/reagent/sugar = 5) + fruit = list("mtear" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/tajaran_bread + ) + result = /obj/item/reagent_containers/food/snacks/fruit_rikazu + +/decl/recipe/meatrikazu + appliance = OVEN + reagents = list(/decl/reagent/sodiumchloride = 1, /decl/reagent/blackpepper = 1) + items = list( + /obj/item/reagent_containers/food/snacks/tajaran_bread, + /obj/item/reagent_containers/food/snacks/meat/adhomai + ) + result = /obj/item/reagent_containers/food/snacks/meat_rikazu + +/decl/recipe/vegetablerikazu + appliance = OVEN + reagents = list(/decl/reagent/nutriment/flour/nfrihi = 5) + fruit = list("earthenroot" = 1) + items = list( + /obj/item/reagent_containers/food/snacks/tajaran_bread + ) + result = /obj/item/reagent_containers/food/snacks/vegetable_rikazu + +/decl/recipe/chocolaterikazu + appliance = OVEN + reagents = list(/decl/reagent/drink/milk/cream = 5) + items = list( + /obj/item/reagent_containers/food/snacks/tajaran_bread, + /obj/item/reagent_containers/food/snacks/chocolatebar + ) + result = /obj/item/reagent_containers/food/snacks/chocolate_rikazu + +/decl/recipe/dirt_roast + appliance = OVEN + reagents = list(/decl/reagent/spacespice = 1, /decl/reagent/sugar = 5) + fruit = list("nifberries" = 1) + result = /obj/item/reagent_containers/food/snacks/dirt_roast + +/decl/recipe/fatshouter_fillet + appliance = OVEN + reagents = list(/decl/reagent/spacespice = 1, /decl/reagent/nutriment/flour/nfrihi = 5, /decl/reagent/sodiumchloride = 1, /decl/reagent/blackpepper = 1, /decl/reagent/alcohol/messa_mead = 5) + fruit = list("earthenroot" = 2) + items = list( + /obj/item/reagent_containers/food/snacks/tajaran_bread, + /obj/item/reagent_containers/food/snacks/meat/adhomai, + /obj/item/reagent_containers/food/snacks/meat/adhomai, + /obj/item/reagent_containers/food/snacks/meat/adhomai, + /obj/item/reagent_containers/food/snacks/meat/adhomai, + /obj/item/reagent_containers/food/snacks/spreads/lard + ) + result = /obj/item/reagent_containers/food/snacks/sliceable/fatshouter_fillet + +/decl/recipe/zkahnkowafull + appliance = POT | SAUCEPAN + reagents = list(/decl/reagent/blood = 10, /decl/reagent/nutriment/flour/nfrihi = 5, /decl/reagent/sodiumchloride = 1, /decl/reagent/blackpepper = 1) + items = list( + /obj/item/reagent_containers/food/snacks/meat/adhomai + ) + result = /obj/item/reagent_containers/food/snacks/sliceable/zkahnkowafull + +/decl/recipe/creamice + reagents = list(/decl/reagent/drink/milk/adhomai = 10, /decl/reagent/sugar = 10, /decl/reagent/drink/ice = 10) + fruit = list("nifberries" = 1) + result = /obj/item/reagent_containers/food/snacks/creamice + // Tajaran Seafood /decl/recipe/spicy_clams fruit = list("chili" = 1, "cabbage" = 1) diff --git a/code/modules/cooking/recipes/recipes_pastries.dm b/code/modules/cooking/recipes/recipes_pastries.dm index dcde62c439d..6c494470aa6 100644 --- a/code/modules/cooking/recipes/recipes_pastries.dm +++ b/code/modules/cooking/recipes/recipes_pastries.dm @@ -56,8 +56,6 @@ var/obj/item/paper/paper = locate() in container if (!paper || !istype(paper)) return COOK_CHECK_FAIL - if (!paper.info) - return COOK_CHECK_FAIL return . /decl/recipe/brownies diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 12c30f637fb..8b0c46cd403 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -131,7 +131,7 @@ All custom items with worn sprites must follow the contained sprite system: http item_state = "ana_uniform" contained_sprite = TRUE -/obj/item/clothing/suit/storage/forensics/fluff/ana_jacket //CSI Jacket - Ana Roh'hi'tin - suethecake +/obj/item/clothing/suit/storage/toggle/forensics/fluff/ana_jacket //CSI Jacket - Ana Roh'hi'tin - suethecake name = "CSI jacket" desc = "A black jacket with the words \"CSI\" printed in the back in bright, white letters." icon = 'icons/obj/custom_items/ana_clothing.dmi' @@ -578,30 +578,6 @@ All custom items with worn sprites must follow the contained sprite system: http icon_state = "nikit_zippo" -/obj/item/deck/tarot/fluff/klavdiya_cards //Adhomian Divination Cards Deck - Klavdiya Tikhomirov - alberyk - name = "adhomian divination cards deck" - desc = "An adhomian deck of divination cards, used to read the one's fortune or play games." - icon_state = "deck_adhomai" - -/obj/item/deck/tarot/fluff/klavdiya_cards/generate_deck() - var/datum/playingcard/P - for(var/name in list("D'as'ral Massacre","Clairvoyant","Suns' Sister","Queen","King","Father of the Parivara","S'rendal'Matir","Tank","Royal Grenadier","Kraszarrumalkarii","Hand of Fate","Great Revolution","Assassin","Assassination","Dymtris Line", - "Rrak'narrr","Steeple","Messa","Raskara","S'rendarr","Kazarrhaldiye","Adhomai")) - P = new() - P.name = "[name]" - P.card_icon = "adhomai_major" - P.back_icon = "card_back_adhomai" - cards += P - for(var/suit in list("wands","pentacles","cups","swords")) - - - for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","serf","soldier","queen","king")) - P = new() - P.name = "[number] of [suit]" - P.card_icon = "adhomai_[suit]" - P.back_icon = "card_back_adhomai" - cards += P - /obj/item/clothing/accessory/locket/fluff/klavdiya_amulet //Moon Shaped Amulet - Klavdiya Tikhomirov - alberyk name = "moon shaped amulet" desc = "A metalic necklace that bears a silver moon shapped pendant." @@ -655,118 +631,6 @@ All custom items with worn sprites must follow the contained sprite system: http /obj/item/clothing/gloves/fluff/lunea_gloves/isFlameSource() return lit - -/obj/item/fluff/fernando_knittingneedles //Kitting Needles - Fernando Gonzales - resilynn - name = "knitting needles" - desc = "Silver knitting needles used for stitching yarn." - icon = 'icons/obj/custom_items/fernando_knitting.dmi' - icon_state = "knittingneedles" - item_state = "knittingneedles" - w_class = ITEMSIZE_SMALL - contained_sprite = TRUE - var/working = FALSE - var/obj/item/fluff/yarn/ball - -/obj/item/fluff/fernando_knittingneedles/Destroy() - if(ball) - QDEL_NULL(ball) - return ..() - -/obj/item/fluff/fernando_knittingneedles/examine(mob/user) - if(..(user, 1)) - if(ball) - to_chat(user, "There is \the [ball] between the needles.") - -/obj/item/fluff/fernando_knittingneedles/update_icon() - if(working) - icon_state = "knittingneedles_on" - item_state = "knittingneedles_on" - else - icon_state = initial(icon_state) - item_state = initial(item_state) - - if(ball) - add_overlay("[ball.icon_state]") - else - cut_overlays() - -/obj/item/fluff/fernando_knittingneedles/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/fluff/yarn)) - if(!ball) - user.unEquip(O) - O.forceMove(src) - ball = O - to_chat(user, "You place \the [O] in \the [src]") - update_icon() - -/obj/item/fluff/fernando_knittingneedles/attack_self(mob/user as mob) - if(!ball) //if there is no yarn ball, nothing happens - to_chat(user, "You need a yarn ball to stitch.") - return - - if(working) - to_chat(user, "You are already sitching something.") - return - - user.visible_message("\The [user] is knitting something soft and cozy.") - working = TRUE - update_icon() - - if(!do_after(user,2 MINUTES)) - to_chat(user, "Your concentration is broken!") - working = FALSE - update_icon() - return - - var/obj/item/clothing/accessory/sweater/S = new(get_turf(user)) - S.color = ball.color - qdel(ball) - ball = null - working = FALSE - update_icon() - to_chat(user, "You finish \the [S]!") - -/obj/item/fluff/yarn - name = "ball of yarn" - desc = "A ball of yarn, this one is white." - icon = 'icons/obj/custom_items/fernando_knitting.dmi' - icon_state = "white_ball" - w_class = ITEMSIZE_TINY - -/obj/item/fluff/yarn/red - desc = "A ball of yarn, this one is red." - color = "#ff0000" - -/obj/item/fluff/yarn/blue - desc = "A ball of yarn, this one is blue." - color = "#0000FF" - -/obj/item/fluff/yarn/green - desc = "A ball of yarn, this one is green." - color = "#00ff00" - -/obj/item/fluff/yarn/purple - desc = "A ball of yarn, this one is purple." - color = "#800080" - -/obj/item/fluff/yarn/yellow - desc = "A ball of yarn, this one is yellow." - color = "#FFFF00" - -/obj/item/storage/box/fluff/knitting //a bunch of things, so it goes into the box - name = "knitting supplies" - -/obj/item/storage/box/fluff/knitting/fill() - ..() - new /obj/item/fluff/fernando_knittingneedles(src) - new /obj/item/fluff/yarn(src) - new /obj/item/fluff/yarn/red(src) - new /obj/item/fluff/yarn/blue(src) - new /obj/item/fluff/yarn/green(src) - new /obj/item/fluff/yarn/purple(src) - new /obj/item/fluff/yarn/yellow(src) - - /obj/item/clothing/suit/fluff/eri_robes //Senior Alchemist Robes - Eri Akhandi - snakebittenn name = "senior alchemist robes" desc = "A green set of robes, trimmed with what appears to be real gold. Looking at the necklace, you can see the alchemical symbol for the Philosopher's Stone, made of ruby." @@ -1991,4 +1855,323 @@ All custom items with worn sprites must follow the contained sprite system: http icon_state = "rajka_suit" item_state = "rajka_suit" contained_sprite = TRUE - species_restricted = list(BODYTYPE_TAJARA) \ No newline at end of file + species_restricted = list(BODYTYPE_TAJARA) + + +/obj/item/fluff/holoconsole // Holoconsole - Qoi Liuiq - shestrying + name = "holoconsole" + desc = "A game console capable of displaying a three-dimensional, holographic image of the player's game of choice. It's pink!" + icon = 'icons/obj/custom_items/qoi_console.dmi' + icon_state = "console" + + var/on = FALSE + var/obj/item/fluff/holoconsole_controller/left_controller + var/obj/item/fluff/holoconsole_controller/r/right_controller + var/mutable_appearance/screen + + var/sound_delay = 0.5 SECONDS // so we don't deafen everyone by spam clicking + var/last_sound = 0 + +/obj/item/fluff/holoconsole/Initialize() + . = ..() + left_controller = new /obj/item/fluff/holoconsole_controller(src) + right_controller = new /obj/item/fluff/holoconsole_controller/r(src) + verbs += /obj/item/fluff/holoconsole/proc/remove_left + verbs += /obj/item/fluff/holoconsole/proc/remove_right + screen = mutable_appearance(icon, "screen") + update_icon() + +/obj/item/fluff/holoconsole/Destroy() + QDEL_NULL(left_controller) + QDEL_NULL(right_controller) + return ..() + +/obj/item/fluff/holoconsole/update_icon() + icon_state = "console[left_controller ? "_l" : ""][right_controller ? "_r" : ""]" + +/obj/item/fluff/holoconsole/attack_self(mob/user) + if(on && !(world.time < last_sound + sound_delay)) + playsound(loc, /decl/sound_category/quick_arcade, 60) + last_sound = world.time + return + return ..() + +/obj/item/fluff/holoconsole/attackby(obj/item/I, mob/user) + switch(I.type) + if(/obj/item/fluff/holoconsole_controller) + if(left_controller) + to_chat(user, SPAN_WARNING("\The [src] already has its left controller connected!")) + return + user.visible_message("[user] slots \the [I] back into to \the [src].", SPAN_NOTICE("You slot \the [I] back into \the [src].")) + user.drop_from_inventory(I, src) + left_controller = I + left_controller.parent_console = null + verbs += /obj/item/fluff/holoconsole/proc/remove_left + update_icon() + return + if(/obj/item/fluff/holoconsole_controller/r) + if(right_controller) + to_chat(user, SPAN_WARNING("\The [src] already has its right controller connected!")) + return + user.visible_message("[user] slots \the [I] back into to \the [src].", SPAN_NOTICE("You slot \the [I] back into \the [src].")) + user.drop_from_inventory(I, src) + right_controller = I + right_controller.parent_console = null + verbs += /obj/item/fluff/holoconsole/proc/remove_right + update_icon() + return + return ..() + +/obj/item/fluff/holoconsole/verb/toggle_on() + set name = "Toggle On" + set category = "Object" + set src in view(1) + + on = !on + usr.visible_message("[usr] turns \the [src] [on ? "on" : "off"].", SPAN_NOTICE("You turn \the [src] [on ? "on" : "off"].")) + if(on) + playsound(loc, 'sound/machines/synth_yes.ogg', 50) + add_overlay(screen) + else + playsound(loc, 'sound/machines/synth_no.ogg', 50) + cut_overlay(screen) + update_icon() + +/obj/item/fluff/holoconsole/proc/remove_left() + set name = "Remove Left Controller" + set category = "Object" + set src in view(1) + + usr.visible_message("[usr] removes the left controller from \the [src], flicking it open.", SPAN_NOTICE("You remove the left controller from \the [src], flicking it open.")) + usr.put_in_hands(left_controller) + left_controller.parent_console = WEAKREF(src) + left_controller = null + verbs -= /obj/item/fluff/holoconsole/proc/remove_left + update_icon() + +/obj/item/fluff/holoconsole/proc/remove_right() + set name = "Remove Right Controller" + set category = "Object" + set src in view(1) + + usr.visible_message("[usr] removes the right controller from \the [src], flicking it open.", SPAN_NOTICE("You remove the right controller from \the [src], flicking it open.")) + usr.put_in_hands(right_controller) + right_controller.parent_console = WEAKREF(src) + right_controller = null + verbs -= /obj/item/fluff/holoconsole/proc/remove_right + update_icon() + +/obj/item/fluff/holoconsole_controller // Holoconsole - Qoi Liuiq - shestrying + name = "left holoconsole controller" + desc = "A controller for the Holoconsole, capable of folding in half and re-attaching to the machine. It's pink!" + icon = 'icons/obj/custom_items/qoi_console.dmi' + icon_state = "controller" + + var/datum/weakref/parent_console + var/sound_delay = 0.5 SECONDS // so we don't deafen everyone by spam clicking + var/last_sound = 0 + +/obj/item/fluff/holoconsole_controller/attack_self(mob/user) + if(world.time < last_sound + sound_delay) + return + + var/obj/item/fluff/holoconsole/H = parent_console.resolve() + if(H?.on) + playsound(H.loc, /decl/sound_category/quick_arcade, 60) + last_sound = world.time + +/obj/item/fluff/holoconsole_controller/r // Holoconsole - Qoi Liuiq - shestrying + name = "right holoconsole controller" + +/obj/item/fluff/holocase // Holoconsole Case - Qoi Liuiq - shestrying + name = "holoconsole case" + desc = "A case for the Holoconsole. This one is made of fabric, with various iron-on patches attached to it. It's pink!" + icon = 'icons/obj/custom_items/qoi_console.dmi' + icon_state = "case" + + var/spinned = FALSE + var/obj/item/fluff/holoconsole/contained_console + +/obj/item/fluff/holocase/Initialize() + . = ..() + contained_console = new /obj/item/fluff/holoconsole(src) + +/obj/item/fluff/holocase/Destroy() + QDEL_NULL(contained_console) + return ..() + +/obj/item/fluff/holocase/update_icon() + if(!contained_console) + icon_state = "case_o" + return + icon_state = spinned ? "case_b" : "case" + +/obj/item/fluff/holocase/attack_self(mob/user) + if(!contained_console) + to_chat(user, SPAN_WARNING("\The [src] doesn't have a console inside it! Insert it before trying to spin \the [src] around.")) + return + spinned = !spinned + user.visible_message("[usr] deftly spins \the [src], showing its [spinned ? "back" : "front"].", SPAN_NOTICE("You deftly spin \the [src], showing its [spinned ? "back" : "front"].")) + update_icon() + +/obj/item/fluff/holocase/attack_hand(mob/user) + if(contained_console && src == user.get_inactive_hand()) + user.visible_message("[usr] removes \the [contained_console] from \the [src].", SPAN_NOTICE("You remove \the [contained_console] from \the [src].")) + user.put_in_hands(contained_console) + contained_console = null + update_icon() + return + return ..() + +/obj/item/fluff/holocase/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/fluff/holoconsole)) + if(contained_console) + to_chat(user, SPAN_WARNING("\The [src] already contains a holoconsole!")) + return + user.drop_from_inventory(I, src) + contained_console = I + user.visible_message("[usr] puts \the [contained_console] into \the [src], zipping it back up.", SPAN_NOTICE("You put \the [contained_console] into \the [src], zipping it back up.")) + update_icon() + return + return ..() + +/obj/item/clothing/accessory/poncho/dominia_cape/fluff/godard_cape //House godard cape - Pierre Godard - desven + name = "house godard cape" + desc = "This is a cape in the style of Dominian nobility. This one is in the colours of House Godard." + icon = 'icons/obj/custom_items/godard_cape.dmi' + icon_state = "godard_cape" + item_state = "godard_cape" + contained_sprite = TRUE + +/obj/item/organ/internal/augment/fluff/kath_legbrace // Leg Support Augment - Kathira El-Hashem - thegreywolf + name = "leg support augment" + desc = "A leg augment to aid in the mobility of an otherwise disabled leg." + icon = 'icons/obj/custom_items/kathira_legbrace.dmi' + on_mob_icon = 'icons/obj/custom_items/kathira_legbrace.dmi' + icon_state = "kathira_legbrace" + item_state = "kathira_legbrace_onmob" + parent_organ = BP_R_LEG + supports_limb = TRUE + min_broken_damage = 15 + var/last_drop = 0 + +/obj/item/organ/internal/augment/fluff/kath_legbrace/process() + if(QDELETED(src) || !owner) + return + if(last_drop + 6 SECONDS > world.time) + return + if(is_bruised() && prob(20)) + owner.Weaken(2) + last_drop = world.time + else if(is_broken() && prob(40)) + owner.Weaken(3) + last_drop = world.time + + +/obj/item/flame/lighter/zippo/fluff/sezrak_zippo //Imperial 16th Zippo - Sezrak Han'san - captaingecko + name = "imperial 16th zippo" + desc = "A zippo lighter given by the Empire of Dominia to the men of the 16th Regiment of the Imperial Army, also known as the \"Suicide Regiments\", that would manage to survive more \ + than a dozen deployments. The Imperial 16th is a regiment deployed by Dominia during battles that cannot be lost, their men ensuring victories through the use of unusual and highly \ + dangerous tactics, resulting in extremely high losses during almost all of its engagements." + icon = 'icons/obj/custom_items/sezrak_zippo.dmi' + icon_state = "sezrak_zippo" + item_state = "sezrak_zippo" + contained_sprite = TRUE + + +/obj/item/clothing/glasses/spiffygogs/fluff/andersen_goggles //Red Goggles - Adam Andersen - cybercide + name = "red goggles" + desc = " A pair of worn black goggles with red tinted lenses, both the Kevlar strap and polycarbonate lenses have some scuffs and scratches but they still hold up nicely. \ + There appears to be a Zavodskoi Interstellar insignia on the strap." + icon = 'icons/obj/custom_items/andersen_goggles.dmi' + icon_state = "andersen_goggles" + item_state = "andersen_goggles" + contained_sprite = TRUE + + +/obj/item/clothing/glasses/welding/fluff/mahir_glasses //Hephaestus Auto-darkening Welding Glasses - Mahir Rrhamrare - veterangary + name = "hephaestus auto-darkening welding glasses" + desc = "A pair of Hephaestus produced safety glasses with the prototype incorporation of liquid crystal lenses that polarize intense light present in arc-welding." + icon = 'icons/obj/custom_items/mahir_glasses.dmi' + icon_state = "mahir_glasses" + item_state = "mahir_glasses" + contained_sprite = TRUE + + +/obj/item/clipboard/fluff/kennard_ledger //Blue Ledger - Kennard Rose - 6thechamp9 + name = "blue ledger" + desc = "An aluminum block runs the width of the dark blue plastic board, biting down on it with crocodile teeth and barely holding it together. Stuffed within the ledger, a cabbage \ + of paperwork narrates numerous cases, most of them closed. Turning it on its back reveals the embossed letters: NT." + icon = 'icons/obj/custom_items/kennard_ledger.dmi' + contained_sprite = TRUE + + +/obj/item/clothing/accessory/poncho/tajarancloak/fancy/fluff/valetzrhonaja_cloak //Nayrragh'Rakhan Cloak - Valetzrhonaja Nayrragh'Rakhan - ramke + name = "nayrragh'rakhan cloak" + desc = " A worn, black cloak with golden adornments decorating the edges of the fabric. The insignia of the Nayrragh'Rakhan family is embedded into the custom pin holding the cloak \ + together, and each shoulder is decorated by the representation of a yellow or blue sun - the symbols of S'rendarr and Messa. The fabric is faded, having clearly been tested by time." + icon = 'icons/obj/custom_items/valetzrhonaja_cloak.dmi' + icon_state = "valetzrhonaja_cloak" + item_state = "valetzrhonaja_cloak" + contained_sprite = TRUE + + +/obj/structure/sign/flag/fisanduh_coalition + name = "coalition fisanduh unity flag" + desc = "A well-loved flag often seen hung by those advocating for Fisanduh's legitimization and acceptance into the Coalition of Colonies." + icon_state = "coalition-fisanduh" + +/obj/structure/sign/flag/fisanduh_coalition/left + icon_state = "fisanduh_coalition_l" + +/obj/structure/sign/flag/fisanduh_coalition/right + icon_state = "fisanduh_coalition_r" + +/obj/item/flag/fluff/bian_flag //Coalition Fisanduh Unity Flag - Bian Quy Le - persephoneq + name = "coalition fisanduh unity flag" + icon = 'icons/obj/custom_items/bian_flag.dmi' + icon_state = "bian_flag" + desc = "A well-loved flag often seen hung by those advocating for Fisanduh's legitimization and acceptance into the Coalition of Colonies." + flag_path = "fisanduh_coalition" + flag_size = 1 + + +/obj/item/organ/internal/augment/fluff/goldman_eye //Moneymaker Cybernetic Eye Overlay - Kobi Goldman - sleepywolf + name = "moneymaker cybernetic eye overlay" + desc = "An advanced golden holographic overlay chip installed into prosthetic eyes. Manufactured by Zeng-Hu for Idris Businessmen in the Eridani Corporate sector, \ + this specific chip is engraved with a signature, and small note. \"For the man who sees my true value. With Love, Renae.\"" + icon = 'icons/obj/custom_items/goldman_eye.dmi' + on_mob_icon = 'icons/obj/custom_items/goldman_eye.dmi' + icon_state = "goldman_eye" + item_state = "goldman_eye_onmob" + parent_organ = BP_HEAD + + action_button_icon = "goldman_eye" + action_button_name = "Activate The Moneymaker Cybernetic Eye" + activable = TRUE + cooldown = 25 + +/obj/item/organ/internal/augment/fluff/goldman_eye/attack_self(var/mob/user) + . = ..() + if(!.) + return FALSE + var/obj/item/W = user.get_active_hand() + + if(W) + var/value = get_value(W) + user.visible_message("\The [user] scans \the [W] with \the [src]") + user.show_message("Price estimation of \the [W]: [value ? value : "N/A"] Credits") + +/obj/item/organ/internal/augment/fluff/goldman_chip //Platinum Membership Banking Chip - Kobi Goldman - sleepywolf + name = "platinum membership banking chip" + desc = "A Platinum Membership Chip with Lazarus Banking, a subsidiary of Idris Banking that focuses completely on private and anonymous banking. Membership with Lazarus is exclusive, \ + and Membership Chips are the only way to authenticate. The chip is usually implanted near the heart in an EMP proof slot for security purposes. There is a small button on the chip." + icon = 'icons/obj/custom_items/goldman_eye.dmi' + icon_state = "goldman_chip" + parent_organ = BP_CHEST + +/obj/item/organ/internal/augment/fluff/goldman_chip/attack_self(var/mob/user) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if (user) + visible_message("Platinum Chip states eloquently, \"Welcome, Platinum Member and Esteemed Colleague. Please retrieve your funds at the nearest Trade Hub. Please ensure you keep \ + this Platinum Membership Chip in you at all times, unless for emergency anonymous withdraws. Have a nice day, and stay with Lazarus Banking for all your private and personal purchases.\"") \ No newline at end of file diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index 9d67cc5fcb1..183edecdfe5 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -249,7 +249,7 @@ /proc/equip_custom_item_to_mob(var/datum/custom_item/citem, var/mob/living/carbon/human/M) // Check for required job title. - if(citem.req_titles && length(citem.req_titles) > 0) + if(length(citem.req_titles)) var/has_title var/current_title = M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role for(var/title in citem.req_titles) @@ -260,6 +260,15 @@ to_chat(M, "A custom item could not be equipped as you have joined with the wrong role.") return FALSE + if(ispath(citem.item_path, /obj/item/organ/internal/augment/fluff)) + var/obj/item/organ/internal/augment/fluff/aug = citem.spawn_item(M) + var/obj/item/organ/external/affected = M.get_organ(aug.parent_organ) + aug.replaced(M, affected) + M.update_body() + M.updatehealth() + M.UpdateDamageIcon() + return + // ID cards and MCs are applied directly to the existing object rather than spawned fresh. var/obj/item/existing_item if(citem.item_path == /obj/item/card/id) diff --git a/code/modules/detectivework/tools/crimekit.dm b/code/modules/detectivework/tools/crimekit.dm index bf9f8ca15fe..43483a08fac 100644 --- a/code/modules/detectivework/tools/crimekit.dm +++ b/code/modules/detectivework/tools/crimekit.dm @@ -20,3 +20,6 @@ new /obj/item/device/uv_light(src) new /obj/item/forensics/sample_kit(src) new /obj/item/forensics/sample_kit/powder(src) + new /obj/item/device/mass_spectrometer(src) + new /obj/item/device/reagent_scanner(src) + new /obj/item/storage/box/fancy/csi_markers(src) diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index f255edb070e..34a788e56b3 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -61,9 +61,10 @@ user.visible_message("[user] puts \the [I] into \the [src].", SPAN_NOTICE("You put \the [I] inside \the [src]."),\ "You hear a rustle as someone puts something into a plastic bag.") + store_item(I) +/obj/item/evidencebag/proc/store_item(obj/item/I) icon_state = "evidence" - var/mutable_appearance/MA = new(I) MA.pixel_x = 0 MA.pixel_y = 0 @@ -74,7 +75,6 @@ I.forceMove(src) stored_item = I w_class = I.w_class - return /obj/item/evidencebag/attack_self(mob/user as mob) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 07a7deca815..2816bb61bf6 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -24,16 +24,16 @@ volume = 10 can_be_placed_into = null flags = OPENCONTAINER | NOBLUDGEON - unacidable = 0 + unacidable = FALSE + fragile = FALSE + drop_sound = 'sound/items/drop/cloth.ogg' + pickup_sound = 'sound/items/pickup/cloth.ogg' var/on_fire = 0 var/burn_time = 20 //if the rag burns for too long it turns to ashes var/cleantime = 30 - drop_sound = 'sound/items/drop/cloth.ogg' - pickup_sound = 'sound/items/pickup/cloth.ogg' var/last_clean var/clean_msg = FALSE - fragile = 0 /obj/item/reagent_containers/glass/rag/Initialize() . = ..() @@ -66,11 +66,11 @@ /obj/item/reagent_containers/glass/rag/proc/update_name() if(on_fire) - name = "burning [initial(name)]" + name = "burning [base_name]" else if(reagents.total_volume) - name = "damp [initial(name)]" + name = "damp [base_name]" else - name = "dry [initial(name)]" + name = "dry [base_name]" /obj/item/reagent_containers/glass/rag/update_icon() if(on_fire) @@ -107,7 +107,7 @@ /obj/item/reagent_containers/glass/rag/proc/wipe_down(atom/A, mob/user) if(!reagents.total_volume) - to_chat(user, SPAN_WARNING("\The [initial(name)] is dry!")) + to_chat(user, SPAN_WARNING("\The [base_name] is dry!")) else if (!(last_clean && world.time < last_clean + 120) ) user.visible_message("[user] starts to wipe [A] with [src].") @@ -301,3 +301,15 @@ possible_transfer_amounts = list(5) volume = 10 cleantime = 15 + +/obj/item/reagent_containers/glass/rag/advanced/idris + name = "Idris advanced service cloth" + desc = "An advanced rag developed and sold by Idris Incorporated at a steep price. It's dry-clean design and advanced insulating synthetic weave make this the pinnacle of service cloths for any self respecting chef or bartender!" + icon_state = "idrisrag" + volume = 15 + +/obj/item/reagent_containers/glass/rag/handkerchief + name = "handkerchief" + desc = "For cleaning a lady's hand, your bruised ego or a crime scene." + volume = 5 + icon_state = "handkerchief" \ No newline at end of file diff --git a/code/modules/detectivework/tools/sample_kits.dm b/code/modules/detectivework/tools/sample_kits.dm index ebacb0033b8..35882d0f97b 100644 --- a/code/modules/detectivework/tools/sample_kits.dm +++ b/code/modules/detectivework/tools/sample_kits.dm @@ -126,6 +126,7 @@ desc = "A magnifying glass and tweezers. Used to lift suit fibers." icon_state = "m_glass" w_class = ITEMSIZE_SMALL + flags = NOBLUDGEON var/evidence_type = "fiber" var/evidence_path = /obj/item/sample/fibers @@ -147,6 +148,11 @@ to_chat(user, "You are unable to locate any [evidence_type]s on \the [A].") return ..() +/obj/item/forensics/sample_kit/MouseDrop(atom/over) + var/mob/M = loc + if(ismob(M) && (M.get_active_hand() == src || M.get_inactive_hand() == src)) + afterattack(over, usr, TRUE) + /obj/item/forensics/sample_kit/powder name = "fingerprint powder" desc = "A jar containing aluminum powder and a specialized brush." diff --git a/code/modules/detectivework/tools/scene_cards.dm b/code/modules/detectivework/tools/scene_cards.dm index c82a4657644..cce14821166 100644 --- a/code/modules/detectivework/tools/scene_cards.dm +++ b/code/modules/detectivework/tools/scene_cards.dm @@ -25,10 +25,21 @@ drop_sound = 'sound/items/drop/card.ogg' pickup_sound = 'sound/items/pickup/card.ogg' w_class = ITEMSIZE_TINY + flags = NOBLUDGEON randpixel = 1 layer = ABOVE_MOB_LAYER //so you can mark bodies var/number = 1 +/obj/item/csi_marker/afterattack(turf/H, mob/user, proximity) + if(!proximity) + return + if(!user.Adjacent(H)) + return + if(H.density) + return + + user.drop_from_inventory(src, get_turf(H)) + /obj/item/csi_marker/Initialize(mapload) . = ..() desc += " This one is marked with a [number]." diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index 5ab16c09d9d..8188ee49852 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -220,7 +220,7 @@ var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/card)) var/obj/item/card/id/C = I - if((access_cent_captain in C.access) || (access_hop in C.access) || (access_captain in C.access)) + if((access_cent_ccia in C.access) || (access_hop in C.access) || (access_captain in C.access)) access_code = 0 to_chat(usr, "[icon2html(src, usr)]Access code reset to 0.") else if (istype(I, /obj/item/card/emag)) diff --git a/code/modules/economy/OrderTerminal.dm b/code/modules/economy/OrderTerminal.dm new file mode 100644 index 00000000000..f51009bf832 --- /dev/null +++ b/code/modules/economy/OrderTerminal.dm @@ -0,0 +1,206 @@ +/obj/machinery/orderterminal + name = "Idris Ordering Terminal" + desc = "An ordering terminal designed by Idris for quicker expedition." + icon = 'icons/obj/terminals.dmi' + icon_state = "kitchenterminal" + anchored = 1 + use_power = 1 + idle_power_usage = 10 + var/machine_id = "" + var/list/items = list() + var/list/buying = list() + var/sum = 0 + var/editmode = FALSE // Permits the menu to be changed + var/unlocking = FALSE // Checks if the machine is waiting for an id to unlock it + var/confirmorder = FALSE // Waits for an id to confirm an order + var/receipt = "" + var/ticket = "" + var/destinationact = "Civilian" + var/ticket_number = 1 + req_one_access = list(access_bar, access_kitchen) // Access to change the menu + +/obj/machinery/orderterminal/Initialize() + . = ..() + machine_id = "Idris Ordering Terminal #[SSeconomy.num_financial_terminals++]" + update_icon() + +/obj/machinery/orderterminal/power_change() + ..() + update_icon() + +/obj/machinery/orderterminal/update_icon() + cut_overlays() + if(stat & NOPOWER) + set_light(FALSE) + return + + var/mutable_appearance/screen_overlay = mutable_appearance(icon, "kitchenterminal-active", EFFECTS_ABOVE_LIGHTING_LAYER) + add_overlay(screen_overlay) + set_light(1.4, 1, COLOR_CYAN) + +/obj/machinery/orderterminal/machinery_process() + if(stat & NOPOWER) + cut_overlays() + set_light(FALSE) + return + +/obj/machinery/orderterminal/attack_hand(var/mob/user) + ui_interact(user) + +/obj/machinery/orderterminal/ui_interact(mob/user) + var/datum/vueui/ui = SSvueui.get_open_ui(usr, src) + if (!ui) + ui = new(usr, src, "machinery-orderterminal-ordering", 450, 450, "Idris Ordering Terminal") + ui.open() + +/obj/machinery/orderterminal/proc/print_receipt() // Print the receipt followed by the order ticket + var/obj/item/paper/R = new(usr.loc) + var/receiptname = "Receipt: [machine_id]" + R.set_content_unsafe(receiptname, receipt, sum) + stamp_receipt(R) + // And now we do it but for the ticket. + var/obj/item/paper/T = new(usr.loc) + var/tickettname = "Order ticket: [ticket_number]" + ticket_number++ + T.set_content_unsafe(tickettname, ticket, sum) + stamp_receipt(T) + flick("kitchenterminal-receipt",src) + +/obj/machinery/orderterminal/proc/stamp_receipt(obj/item/paper/R) // Stamps the papers, made into a proc to avoid copy pasting too much + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if(!R.stamped) + R.stamped = new + R.stamped += /obj/item/stamp + R.add_overlay(stampoverlay) + R.stamps += "
    This paper has been stamped by the Idris Ordering Terminal." + +/obj/machinery/orderterminal/attackby(obj/O, mob/user) + var/obj/item/card/id/I = O.GetID() + if (!I) + return + if (!istype(O)) + return + + if(unlocking) + if(check_access(I)) + to_chat(user, SPAN_NOTICE("You unlock \the [src]. Please return to the home screen.")) + editmode = TRUE + unlocking = FALSE + else + to_chat(user, SPAN_WARNING("Access denied.")) + + else if (confirmorder) + var/transaction_amount = sum + var/transaction_purpose = "Idris Ordering Terminal order." + var/transaction_terminal = machine_id + if(sum > 0) // it will just get denied if the order is 0 credits. We still need the id regardless for the name + var/transaction = SSeconomy.transfer_money(I.associated_account_number, SSeconomy.get_department_account(destinationact)?.account_number,transaction_purpose,transaction_terminal,transaction_amount,null,usr) + if(transaction) + to_chat(user,"[icon2html(src, user)][transaction].") + else + playsound(src, 'sound/machines/chime.ogg', 50, 1) + src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.") + ticket += "
    Customer: [I.registered_name]" + receipt += "
    Customer: [I.registered_name]" + print_receipt() + sum = 0 + receipt = "" + ticket = "" + to_chat(src.loc, SPAN_NOTICE("Transaction completed, please return to the home screen.")) + +// VUEUI below + +/obj/machinery/orderterminal/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + if(!data) + . = data = list() + + VUEUI_SET_CHECK_IFNOTSET(data["items"], items, ., data) // List of items that is on the menu + VUEUI_SET_CHECK_IFNOTSET(data["price"], items, ., data) // the price of said items + VUEUI_SET_CHECK_IFNOTSET(data["buying"], buying, ., data) // And the list with items the customer is buying + VUEUI_SET_CHECK_IFNOTSET(data["sum"], sum, ., data) + VUEUI_SET_CHECK_IFNOTSET(data["tmp_name"], "", ., data) + VUEUI_SET_CHECK_IFNOTSET(data["tmp_price"], 0, ., data) + VUEUI_SET_CHECK(data["tmp_price"], max(0, data["tmp_price"]), ., data) + if(data["tmp_price"] < 0) + data["tmp_price"] = 0 + . = data + VUEUI_SET_CHECK(data["editmode"], editmode, ., data) + VUEUI_SET_CHECK(data["destinationact"], destinationact, ., data) + +/obj/machinery/orderterminal/Topic(href, href_list) + var/datum/vueui/ui = href_list["vueui"] + if(!istype(ui)) + return + + if(href_list["add"]) + if(!editmode) + to_chat(src, SPAN_NOTICE("You don't have access to use this option.")) + return 0 + items[href_list["add"]["name"]] = href_list["add"]["price"] + ui.data["items"][href_list["add"]["name"]] = href_list["add"]["price"] + . = TRUE + + if(href_list["remove"]) + + if(!editmode) + to_chat(src, SPAN_NOTICE("You don't have access to use this option.")) + return 0 + items -= href_list["remove"] + ui.data["items"] -= href_list["remove"] + . = TRUE + + if(href_list["buy"]) + ui.data["buying"][href_list["buy"]["name"]] += href_list["buy"]["amount"] + . = TRUE + + if(href_list["removal"]) + ui.data["buying"][href_list["removal"]["name"]] -= href_list["removal"]["amount"] + . = TRUE + + if(href_list["clear"]) + var/buying = ui.data["buying"] + for(var/name in buying) + if(buying[name]) + buying[name] = 0 + . = TRUE + + if(href_list["confirm"]) + confirmorder = TRUE + var/buying = ui.data["buying"] + var/items = ui.data["items"] + receipt += "
    Idris Food Terminal Receipt

    " + ticket += "
    Idris Food Terminal Ticket

    " + for(var/name in buying) + if(buying[name]) + sum += items[name] * buying[name] + receipt += "[name]: [buying[name]] x [items[name]]c: [items[name] * buying[name]]c
    " + ticket += "[name]: [buying[name]]
    " + receipt += "
    Total: [sum]c" + ticket += "
    Total: [sum]c" + ui.data["sum"] = sum + ui.activeui = "machinery-orderterminal-orderconfirmation" + . = TRUE + + if(href_list["return"]) + sum = 0 + receipt = "" + ticket = "" + unlocking = FALSE + confirmorder = FALSE + ui.activeui = "machinery-orderterminal-ordering" + . = TRUE + + if(href_list["locking"]) + if(editmode) + editmode = FALSE + to_chat(src, SPAN_NOTICE("Device Locked.")) + SSvueui.check_uis_for_change(src) + return 0 + if(!editmode) + unlocking = TRUE + ui.activeui = "machinery-orderterminal-editconfirmation" + . = TRUE + + . = TRUE + SSvueui.check_uis_for_change(src) \ No newline at end of file diff --git a/code/modules/economy/quikpay.dm b/code/modules/economy/quikpay.dm index d2d7780b0f0..0b92c89e01d 100644 --- a/code/modules/economy/quikpay.dm +++ b/code/modules/economy/quikpay.dm @@ -96,13 +96,32 @@ /obj/item/device/nanoquikpay/attackby(obj/O, mob/user) + if (istype(O, /obj/item/spacecash/ewallet)) + var/obj/item/spacecash/ewallet/E = O + var/transaction_amount = sum + var/transaction_purpose = "[destinationact] Payment" + var/transaction_terminal = machine_id + + if(transaction_amount <= E.worth) + playsound(src, 'sound/machines/chime.ogg', 50, 1) + src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.") + + SSeconomy.charge_to_account(SSeconomy.get_department_account(destinationact)?.account_number, E.owner_name, transaction_purpose, transaction_terminal, transaction_amount) + E.worth -= transaction_amount + print_receipt() + sum = 0 + receipt = "" + to_chat(src.loc, SPAN_NOTICE("Transaction completed, please return to the home screen.")) + else if (transaction_amount > E.worth) + to_chat(user, "[icon2html(src, user)]\The [E] doesn't have that much money!") + return + var/obj/item/card/id/I = O.GetID() if (!I) return if (!istype(O)) return - else var/transaction_amount = sum diff --git a/code/modules/effects/map_effects/portal.dm b/code/modules/effects/map_effects/portal.dm index c4764fb8edb..3956df452d9 100644 --- a/code/modules/effects/map_effects/portal.dm +++ b/code/modules/effects/map_effects/portal.dm @@ -15,7 +15,7 @@ Portals do have some specific requirements when mapping them in; E.g. both being on the left most side on a horizontal row. Portals also have some limitations to be aware of when mapping. Some of these are not an issue if you're trying to make an 'obvious' portal; - The objects seen through portals are purely visual, which has many implications, - such as simple_mob AIs being blind to mobs on the other side of portals. + such as simple_animal AIs being blind to mobs on the other side of portals. - Objects on the other side of a portal can be interacted with if the interaction has no range limitation, or the distance between the two portal sides happens to be less than the interaction max range. Examine will probably work, while picking up an item that appears to be next to you will fail. diff --git a/code/modules/effects/map_effects/sound_emitter.dm b/code/modules/effects/map_effects/sound_emitter.dm index 3b70e1d2abd..a5aa433a2f8 100644 --- a/code/modules/effects/map_effects/sound_emitter.dm +++ b/code/modules/effects/map_effects/sound_emitter.dm @@ -74,10 +74,6 @@ // I'm not sorry. -/obj/effect/map_effect/interval/sound_emitter/clownsteps - sounds_to_play = list(/decl/sound_category/clown_sound) - interval_lower_bound = 5 - interval_upper_bound = 1 SECOND /obj/effect/map_effect/interval/sound_emitter/bikehorns sounds_to_play = list('sound/items/bikehorn.ogg') diff --git a/code/modules/emotes/definitions/_mob.dm b/code/modules/emotes/definitions/_mob.dm index 4cd9bfb708d..9a524db5ef6 100644 --- a/code/modules/emotes/definitions/_mob.dm +++ b/code/modules/emotes/definitions/_mob.dm @@ -57,6 +57,7 @@ /decl/emote/visible/jump, /decl/emote/visible/shiver, /decl/emote/visible/collapse, + /decl/emote/visible/blink_r, /decl/emote/audible/hiss, /decl/emote/audible, /decl/emote/audible/scretch, @@ -112,7 +113,7 @@ /decl/emote/audible/grunt, /decl/emote/audible/slap, /decl/emote/audible/snap, - /decl/emote/human, + /decl/emote/human/vomit, /decl/emote/human/deathgasp, /decl/emote/audible/giggle, /decl/emote/audible/scream, @@ -120,8 +121,6 @@ /decl/emote/visible/blink_r, /decl/emote/visible/bow, /decl/emote/visible/salute, - /decl/emote/visible/flap, - /decl/emote/visible/aflap, /decl/emote/visible/drool, /decl/emote/visible/eyebrow, /decl/emote/visible/twitch, @@ -169,16 +168,8 @@ /mob/living/silicon/robot default_emotes = list( - /decl/emote/audible/clap, - /decl/emote/visible/bow, - /decl/emote/visible/salute, - /decl/emote/visible/flap, - /decl/emote/visible/aflap, /decl/emote/visible/twitch, /decl/emote/visible/twitch_v, - /decl/emote/visible/nod, - /decl/emote/visible/shake, - /decl/emote/visible/glare, /decl/emote/visible/look, /decl/emote/visible/stare, /decl/emote/visible/deathgasp_robot, diff --git a/code/modules/emotes/definitions/_species.dm b/code/modules/emotes/definitions/_species.dm index cdd36082392..7f9f0adf90a 100644 --- a/code/modules/emotes/definitions/_species.dm +++ b/code/modules/emotes/definitions/_species.dm @@ -84,6 +84,11 @@ list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/hiss) = 10, ) +/datum/species/skrell + default_emotes = list( + /decl/emote/audible/warble + ) + /mob/living/carbon/human/set_species(var/new_species, var/default_colour = 1) UNLINT(. = ..()) update_emotes() diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm index 777e2cca7e3..f8afe3d3fc7 100644 --- a/code/modules/emotes/definitions/audible.dm +++ b/code/modules/emotes/definitions/audible.dm @@ -243,3 +243,8 @@ emote_message_3p_target = "USER bellows deeply at TARGET!" emote_message_3p = "USER bellows!" emote_sound = 'sound/voice/LizardBellow.ogg' + +/decl/emote/audible/warble + key = "warble" + emote_message_3p = "USER warbles!" + emote_sound = 'sound/voice/warble.ogg' \ No newline at end of file diff --git a/code/modules/emotes/definitions/human.dm b/code/modules/emotes/definitions/human.dm index 35cadd78135..d7628b10d7e 100644 --- a/code/modules/emotes/definitions/human.dm +++ b/code/modules/emotes/definitions/human.dm @@ -1,14 +1,17 @@ /decl/emote/human + +/decl/emote/human/vomit key = "vomit" -/decl/emote/human/check_user(var/mob/living/carbon/human/user) +/decl/emote/human/vomit/check_user(var/mob/living/carbon/human/user) return (istype(user) && user.check_has_mouth() && !user.isSynthetic()) -/decl/emote/human/do_emote(var/mob/living/carbon/human/user) +/decl/emote/human/vomit/do_emote(var/mob/living/carbon/human/user) user.vomit(deliberate = TRUE) /decl/emote/human/deathgasp key = "deathgasp" + emote_message_3p = "USER falls limp and stops moving..." //Fallback. Will be replaced with below proc but emotes won't show without a value in this variable /decl/emote/human/deathgasp/get_emote_message_3p(var/mob/living/carbon/human/user) return "USER [user.species.death_message]" diff --git a/code/modules/emotes/definitions/visible.dm b/code/modules/emotes/definitions/visible.dm index f99bb4781f2..6b81fe29dea 100644 --- a/code/modules/emotes/definitions/visible.dm +++ b/code/modules/emotes/definitions/visible.dm @@ -84,16 +84,6 @@ emote_message_3p_target = "USER salutes TARGET." emote_message_3p = "USER salutes." -/decl/emote/visible/flap - key = "flap" - check_restraints = TRUE - emote_message_3p = "USER flaps USER_THEIR wings." - -/decl/emote/visible/aflap - key = "aflap" - check_restraints = TRUE - emote_message_3p = "USER flaps USER_THEIR wings ANGRILY!" - /decl/emote/visible/eyebrow key = "eyebrow" emote_message_3p = "USER raises an eyebrow." diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 1d4ab724353..12d10b95620 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -96,3 +96,27 @@ var/mob/living/simple_animal/hostile/carp/fish = carp_weakref.resolve() if (fish && prob(50) && is_type_in_typecache(fish.loc, despawn_turfs)) qdel(fish) + +/datum/event/carp_migration/cozmo/start() + spawn_fish(7, 3, 5) + +/datum/event/carp_migration/cozmo/announce() + command_announcement.Announce("A migration of non-hostile entities has been detected outside the facility.", "Lifesign Alert", 'sound/AI/cozmo_migration.ogg') + +/datum/event/carp_migration/cozmo/spawn_fish(var/num_groups, var/group_size_min = 3, var/group_size_max = 5, var/spawn_drones = FALSE) + set waitfor = FALSE + var/list/spawn_locations = list() + + for(var/obj/effect/landmark/C in landmarks_list) + if(C.name == "carpspawn") + spawn_locations.Add(C.loc) + spawn_locations = shuffle(spawn_locations) + num_groups = min(num_groups, spawn_locations.len) + + var/i = 1 + while (i <= num_groups) + var/group_size = rand(group_size_min, group_size_max) + for(var/j = 1, j <= group_size, j++) + var/mob/living/simple_animal/cosmozoan/cozmo = new(spawn_locations[i]) + spawned_carp += WEAKREF(cozmo) + i++ \ No newline at end of file diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index 5073eafa9df..4f51f2ad71e 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -8,7 +8,7 @@ var/one_shot = 0 // If true, then the event will not be re-added to the list of available events var/add_to_queue= 1 // If true, add back to the queue of events upon finishing. var/list/role_weights = list() - var/list/excluded_gamemodes = list() // A list of gamemodes during which this event won't fire. + var/list/excluded_gamemodes // A lazylist of gamemodes during which this event won't fire. var/datum/event/event_type /datum/event_meta/New(var/event_severity, var/event_name, var/datum/event/type, var/event_weight, var/list/job_weights, var/is_one_shot = 0, var/min_event_weight = 0, var/max_event_weight = 0, var/list/excluded_roundtypes, var/add_to_queue = TRUE) @@ -29,9 +29,9 @@ if(!enabled) return 0 - if(excluded_gamemodes.len && (SSticker.mode in excluded_gamemodes)) + if(LAZYISIN(excluded_gamemodes, SSticker.mode.name)) // There's no way it'll be run this round anyways. - enabled = 0 + enabled = FALSE return 0 var/job_weight = 0 diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index c1c49ecbe01..963391c81b2 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -134,6 +134,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 10)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Cozmozoan Migration", /datum/event/carp_migration/cozmo, 60), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 10), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), diff --git a/code/modules/games/tarot.dm b/code/modules/games/tarot.dm index 863a559829e..191ac2fe629 100644 --- a/code/modules/games/tarot.dm +++ b/code/modules/games/tarot.dm @@ -35,4 +35,29 @@ cards -= P cards = newcards playsound(src.loc, 'sound/items/cardshuffle.ogg', 100, 1, -4) - user.visible_message("\The [user] shuffles [src].") \ No newline at end of file + user.visible_message("\The [user] shuffles [src].") + + +/obj/item/deck/tarot/adhomai + name = "adhomian divination cards deck" + desc = "An adhomian deck of divination cards, used to read the one's fortune or play games." + icon_state = "deck_adhomai" + +/obj/item/deck/tarot/fluff/adhomai/generate_deck() + var/datum/playingcard/P + for(var/name in list("D'as'ral Massacre","Mystic","Suns' Sister","Queen","King","Father of the Parivara","S'rendal'Matir","Tank","Royal Grenadier","Kraszarrumalkarii","Hand of Fate","Great Revolution","Assassin","Assassination","Dymtris Line", + "Rrak'narrr","Steeple","Messa","Raskara","S'rendarr","Kazarrhaldiye","Adhomai")) + P = new() + P.name = "[name]" + P.card_icon = "adhomai_major" + P.back_icon = "card_back_adhomai" + cards += P + for(var/suit in list("wands","pentacles","cups","swords")) + + + for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","serf","soldier","queen","king")) + P = new() + P.name = "[number] of [suit]" + P.card_icon = "adhomai_[suit]" + P.back_icon = "card_back_adhomai" + cards += P diff --git a/code/modules/ghostroles/spawner/antagonist/revenant.dm b/code/modules/ghostroles/spawner/antagonist/revenant.dm index 9e7e76bb279..6ccaf3437db 100644 --- a/code/modules/ghostroles/spawner/antagonist/revenant.dm +++ b/code/modules/ghostroles/spawner/antagonist/revenant.dm @@ -75,11 +75,11 @@ if(rift_turf) new /obj/effect/portal/revenant(rift_turf) if(!first_rift_done) - command_announcement.Announce("Aurora, we're detecting energy signatures eerily similar to a bluespace rift breach inside your hull. [SScargo.shuttle ? "We're sending you a bluespace neutralizer via the cargo shuttle. " : ""]Locate the rift and shut it down.", "Bluespace Breach Alert") + command_announcement.Announce("Aurora, we're detecting energy signatures eerily similar to a bluespace rift breach inside your hull. [SScargo.shuttle ? "We're sending you a bluespace neutralizer via the cargo shuttle. If you need more, your research department should be able to print neutralizers as well if they've been increasing their bluespace research levels. " : ""]Locate the rift and shut it down.", "Bluespace Breach Alert") first_rift_done = TRUE if(SScargo.shuttle) var/turf/T = pick_area_turf(pick(SScargo.shuttle.shuttle_area), list(/proc/not_turf_contains_dense_objects)) if(T) var/obj/structure/closet/crate/C = new /obj/structure/closet/crate(T) C.name += " (Neutralizer)" - new /obj/item/bluespace_neutralizer(C) \ No newline at end of file + new /obj/item/bluespace_neutralizer(C) diff --git a/code/modules/ghostroles/spawner/atom/technomancer_apprentice.dm b/code/modules/ghostroles/spawner/atom/technomancer_apprentice.dm new file mode 100644 index 00000000000..df0ccb28781 --- /dev/null +++ b/code/modules/ghostroles/spawner/atom/technomancer_apprentice.dm @@ -0,0 +1,10 @@ +/datum/ghostspawner/techno_apprentice + short_name = "technoapprentice" + name = "Technomancer Apprentice" + desc = "Serve your Master. Cast Spells." + tags = list("Antagonist") + + loc_type = GS_LOC_ATOM + atom_add_message = "A technomancer master has requested an apprentice!" + + spawn_mob = /mob/living/carbon/human \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/atom/wizard_familiar.dm b/code/modules/ghostroles/spawner/atom/wizard_familiar.dm deleted file mode 100644 index 7f24f1617d7..00000000000 --- a/code/modules/ghostroles/spawner/atom/wizard_familiar.dm +++ /dev/null @@ -1,16 +0,0 @@ -/datum/ghostspawner/wizard_familiar - short_name = "wizard_familiar" - name = "Wizard Familiar" - desc = "Be a Familiar, act cute, probably end up killing many people somehow." - tags = list("Antagonist") - - loc_type = GS_LOC_ATOM - atom_add_message = "A wizard familiar has been summoned" - - spawn_mob = /mob/living/simple_animal - -/datum/ghostspawner/wizard_familiar/post_spawn(mob/user) - var/mob/living/simple_animal/A = user - if(A.wizard_master) - A.add_spell(new /spell/contract/return_master(A.wizard_master), "const_spell_ready") - to_chat(src, "You are [src], a familiar to [A.wizard_master]. He is your master and your friend. Aid him in his wizarding duties to the best of your ability.") diff --git a/code/modules/ghostroles/spawner/atom/wizardapprentice.dm b/code/modules/ghostroles/spawner/atom/wizardapprentice.dm deleted file mode 100644 index fcbc7dd2e1b..00000000000 --- a/code/modules/ghostroles/spawner/atom/wizardapprentice.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/ghostspawner/apprentice - short_name = "apprentice" - name = "Wizard Apprentice" - desc = "Serve your Master. Cast Spells." - tags = list("Antagonist") - - loc_type = GS_LOC_ATOM - atom_add_message = "A wizard apprentice pebble has been created!" - - spawn_mob = /mob/living/carbon/human diff --git a/code/modules/ghostroles/spawner/human/emergencypod.dm b/code/modules/ghostroles/spawner/human/emergencypod.dm index ae55c490872..9ebe7393808 100644 --- a/code/modules/ghostroles/spawner/human/emergencypod.dm +++ b/code/modules/ghostroles/spawner/human/emergencypod.dm @@ -17,11 +17,11 @@ special_role = "Pod Survivor" respawn_flag = null - mob_name = FALSE + mob_name = null /datum/ghostspawner/human/rescuepodsurv/New() . = ..() - var/t = pick(list("star", "priest", "rep", "smuggler", "hunter", "occultist", "pmc")) + var/t = pick(list("star", "priest", "rep", "smuggler", "hunter", "occultist", "pmc", "tcfl", "fsf", "scc", "fib")) if(t == "star") welcome_message = "You are a stranded star!
    You were relaxing comfortably in your cryo pod as tragedy struck - the pilot of your luxury yacht fell asleep under some mysterious circumstances. You were unceremoniously stuffed into an escape pod, and left to wander in space. What a despicable, low-quality plot to get rid of you. Should've chosen murder instead - you certainly know you'll convince someone nice to lend you a shuttle." outfit = /datum/outfit/admin/pod/star @@ -45,6 +45,23 @@ welcome_message = "You are a stranded Eridani paramilitary sergeant!
    You aren't getting paid enough for this shit. Where's the pickup shuttle?" outfit = /datum/outfit/admin/pod/pmc possible_species = list(SPECIES_HUMAN) // no cycler in the pod, spawns in a voidsuit + else if(t == "tcfl") + welcome_message = "You are a stranded member of the Tau Ceti Foreign Legion!
    Perhaps there was a training accident or maybe something went wrong during a routine operation in the Romanovich Cloud. The Prefect will never let you hear the end of this..." + outfit = /datum/outfit/admin/pod/tcfl + possible_species = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_MSAI, SPECIES_TAJARA_ZHAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_WORKER, SPECIES_IPC, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL, SPECIES_DIONA) // TCFL accepts everyone. G1 and G2 have been excluded because they can't wear the hardsuit, which has the suit cooler. + else if(t == "fsf") + welcome_message = "You are a stranded Petty Officer of the Free Solarian Fleets!
    Your skiff out of the FSFV Sforza was on a routine patrol when an accident or an attack forced you to abandon ship. Thankfully, you seem to be in friendly territory..." + outfit = /datum/outfit/admin/pod/fsf + possible_species = list(SPECIES_HUMAN) + else if(t == "scc") + welcome_message = "You are a stranded Stellar Corporate Conglomerate low-level functionary!
    A routine inspection of SCC assets in the Romanovich cloud turned into disaster when your shuttle's reactor suddenly and mysteriously failed. You narrowly escaped with your life. Worst of all? You lost your paperwork." + outfit = /datum/outfit/admin/pod/scc + possible_species = list(SPECIES_HUMAN,SPECIES_SKRELL) + else if(t == "fib") + welcome_message = "You are a stranded Federal Investigation Bureau Agent!
    What was supposed to be a standard investigation turned into a nightmare when the vessel you were supposed to board opened fire! You just managed to reach an escape pod before your own ship was turned into smoldering rubble. You really need some coffee." + outfit = /datum/outfit/admin/pod/fib + possible_species = list(SPECIES_HUMAN,SPECIES_SKRELL) + else welcome_message = "You are a stranded drugs smuggler!
    You shouldn't have had the fucking Tajara pilot your ship. Of course we crashed into a rock. Good thing you've got some of the stuff with you while evacuating - maybe you'll crash somewhere you could sell it for a ticket back?" outfit = /datum/outfit/admin/pod/smuggler @@ -230,6 +247,123 @@ /datum/outfit/admin/pod/pmc/get_id_rank() return "Security Officer" +/datum/outfit/admin/pod/tcfl + name = "RescuePod - TCFL Member" + head = /obj/item/clothing/head/beret/legion/field + l_ear = /obj/item/device/radio/headset/legion + glasses = /obj/item/clothing/glasses/sunglasses/aviator + suit = /obj/item/clothing/suit/storage/vest/legion + suit_store = /obj/item/gun/energy/blaster/carbine + back = /obj/item/rig/retro // has an oxygen tank built in + belt = /obj/item/storage/belt/security/tactical + gloves = /obj/item/clothing/gloves/swat/ert + shoes = /obj/item/clothing/shoes/swat/ert + id = /obj/item/card/id/distress/legion + uniform = /obj/item/clothing/under/legion + accessory = /obj/item/clothing/accessory/holster/thigh + accessory_contents = list(/obj/item/gun/energy/blaster/revolver = 1) + l_hand = /obj/item/material/twohanded/pike/flag + r_hand = /obj/item/storage/backpack/legion + + belt_contents = list( + /obj/item/melee/energy/sword/knife = 1, + /obj/item/shield/riot/tact/legion = 1, + /obj/item/grenade/flashbang = 1, + /obj/item/device/flashlight/flare = 1, + /obj/item/device/radio = 1 + ) + +/datum/outfit/admin/pod/tcfl/get_id_assignment() + return "TCFL" + +/datum/outfit/admin/pod/tcfl/get_id_rank() + return "TCFL" + +/datum/outfit/admin/pod/fsf + name = "RescuePod - FSF Crewman" + uniform = /obj/item/clothing/under/rank/fatigues/ + shoes = /obj/item/clothing/shoes/jackboots + belt = /obj/item/storage/belt/military + back = /obj/item/storage/backpack/satchel_norm + head = /obj/item/clothing/head/helmet/space/void/sol + suit = /obj/item/clothing/suit/space/void/sol + suit_store = /obj/item/tank/oxygen + id = /obj/item/card/id/distress/fsf + accessory = /obj/item/clothing/accessory/holster/hip/ + accessory_contents = list(/obj/item/gun/projectile/pistol/sol = 1) + + + belt_contents = list( + /obj/item/melee/energy/sword/knife/sol = 1, + /obj/item/ammo_magazine/mc9mm = 1, + /obj/item/device/flashlight/flare = 1, + /obj/item/device/radio = 1 + ) + + backpack_contents = list( + /obj/item/clothing/head/navy = 1 + ) + +/datum/outfit/admin/pod/fsf/get_id_assignment() + return "Free Solarian Fleets Crewman" + +/datum/outfit/admin/pod/fsf/get_id_rank() + return "Free Solarian Fleets Crewman" + +/datum/outfit/admin/pod/scc + name = "RescuePod - SCC" + + uniform = /obj/item/clothing/under/rank/scc + back = /obj/item/storage/backpack/satchel + shoes = /obj/item/clothing/shoes/laceup + glasses = /obj/item/clothing/glasses/sunglasses + l_hand = /obj/item/storage/briefcase + back = /obj/item/storage/backpack/satchel + accessory = /obj/item/clothing/accessory/holster/hip/ + backpack_contents = list( + /obj/item/device/camera = 1, + /obj/item/gun/energy/repeater = 1, + /obj/item/device/oxycandle = 1, + /obj/item/airbubble = 1 + ) + + + +/datum/outfit/admin/pod/scc/get_id_assignment() + return "Stellar Corporate Conglomerate Functionary" + +/datum/outfit/admin/pod/scc/get_id_rank() + return "Stellar Corporate Conglomerate Functionary" + +/datum/outfit/admin/pod/fib + name = "RescuePod - FIB" // Doctor Pavel, I'm FIB. + + uniform = /obj/item/clothing/under/rank/fib + shoes = /obj/item/clothing/shoes/laceup + gloves = /obj/item/clothing/gloves/black + l_pocket = /obj/item/reagent_containers/spray/pepper + glasses = /obj/item/clothing/glasses/sunglasses + accessory = /obj/item/clothing/accessory/holster/hip + accessory_contents = list(/obj/item/gun/projectile/sec/lethal = 1) + back = /obj/item/storage/backpack/satchel + backpack_contents = list( + /obj/item/device/camera = 1, + /obj/item/clothing/suit/storage/toggle/fib = 1, + /obj/item/handcuffs = 1, + /obj/item/device/oxycandle = 1, + /obj/item/airbubble = 1, + /obj/item/ammo_magazine/c45m = 1 + ) + + + +/datum/outfit/admin/pod/fib/get_id_assignment() + return "Federal Investigation Bureau Agent" + +/datum/outfit/admin/pod/fib/get_id_rank() + return "Federal Investigation Bureau Agent" + + /datum/ghostspawner/human/rescuepodsurv/burglar short_name = "burglarpod" name = "Burglar" @@ -330,4 +464,4 @@ if(W) W.handle_item_insertion(passport) - burglars.add_antagonist(H.mind, TRUE, TRUE, FALSE, TRUE) \ No newline at end of file + burglars.add_antagonist(H.mind, TRUE, TRUE, FALSE, TRUE) diff --git a/code/modules/ghostroles/spawner/human/pra.dm b/code/modules/ghostroles/spawner/human/pra.dm index 727102dbed4..399e4164a7b 100644 --- a/code/modules/ghostroles/spawner/human/pra.dm +++ b/code/modules/ghostroles/spawner/human/pra.dm @@ -39,7 +39,7 @@ name = "Kosmostrelki" uniform = /obj/item/clothing/under/tajaran/cosmonaut - shoes = /obj/item/clothing/shoes/jackboots/toeless + shoes = /obj/item/clothing/shoes/tajara/combat belt = /obj/item/storage/belt/military back = /obj/item/gun/projectile/automatic/rifle/adhomian id = /obj/item/card/id/syndicate @@ -48,7 +48,8 @@ /obj/item/ammo_magazine/boltaction = 3, /obj/item/grenade/smokebomb = 2, /obj/item/plastique = 1, - /obj/item/gun/projectile/pistol/adhomai = 1 + /obj/item/gun/projectile/pistol/adhomai = 1, + /obj/item/ammo_magazine/mc9mm = 2 ) r_hand = /obj/item/storage/field_ration diff --git a/code/modules/ghostroles/spawner/human/responseteams/ap_eridani.dm b/code/modules/ghostroles/spawner/human/responseteams/ap_eridani.dm new file mode 100644 index 00000000000..9ebba32ac64 --- /dev/null +++ b/code/modules/ghostroles/spawner/human/responseteams/ap_eridani.dm @@ -0,0 +1,37 @@ +/datum/ghostspawner/human/ert/ap_eridani + name = "Eridani Asset Protection Specialist" + short_name = "eridaniprotection" + mob_name_prefix = "Spc. " + max_count = 2 + desc = "A specialist suited for close asset protection and policing duties. Ensure your colleagues ledgers remain in the black." + welcome_message = "You are part of an Eridani Private Military Company Asset Protection Team, a highly trained group of security specialists and medical professionals \ + contracted by the Stellar Corporate Conglomerate to protect its investments." + outfit = /datum/outfit/admin/ert/ap_eridani + possible_species = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD) + +/datum/ghostspawner/human/ert/ap_eridani/lead + name = "Eridani Section Leader" + short_name = "eridanileader" + mob_name_prefix = "Ldr. " + max_count = 1 + desc = "The leader of the EPMC Asset Protection Team. Ensure your employers bottom line remains protected and don't sign blindly." + outfit = /datum/outfit/admin/ert/ap_eridani/lead + possible_species = list(SPECIES_HUMAN) + +/datum/ghostspawner/human/ert/ap_eridani/doctor + name = "Eridani Medical Officer" + short_name = "eridanidoctor" + mob_name_prefix = "Dr. " + max_count = 1 + desc = "A highly trained Eridani medical officer and the second in command of the EPMC Asset Protection Team. Well versed in surgical procedures and expected to work in a hot zone. Not a stranger to a bank run." + outfit = /datum/outfit/admin/ert/ap_eridani/doctor + possible_species = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_SKRELL, SPECIES_IPC_SHELL) + +/datum/ghostspawner/human/ert/ap_eridani/corpsman + name = "Eridani Corpsman" + short_name = "eridanicorpsman" + mob_name_prefix = "Cm. " + max_count = 2 + desc = "An Eridani corpsman that can handle nursing duties as well. Trained to operate in combat environments if needed. Make sure to check your quarterlies." + outfit = /datum/outfit/admin/ert/ap_eridani/corpsman + possible_species = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_MSAI, SPECIES_TAJARA_ZHAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_WORKER, SPECIES_IPC, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL) diff --git a/code/modules/ghostroles/spawner/human/responseteams/fsf.dm b/code/modules/ghostroles/spawner/human/responseteams/fsf.dm new file mode 100644 index 00000000000..cff82da856a --- /dev/null +++ b/code/modules/ghostroles/spawner/human/responseteams/fsf.dm @@ -0,0 +1,43 @@ +/datum/ghostspawner/human/ert/fsf + name = "Free Solarian Fleets Marine" + short_name = "fsfr" + desc = "A responder from a Free Solarian Fleets marine fireteam." + welcome_message = "You're part of a marine fireteam dispatched from the FSFV Sforza, a Free Solarian Fleets destroyer on the SCC's payroll. Your primary motivation is money: the SCC pays you well, and you have a job to do." + max_count = 2 + outfit = /datum/outfit/admin/ert/fsf + mob_name_prefix = "Pfc. " + possible_species = list(SPECIES_HUMAN) + +/datum/ghostspawner/human/ert/fsf/specialist + name = "Free Solarian Fleets Sapper" + short_name = "fsfeng" + desc = "An engineering specialist from a Free Solarian Fleets marine fireteam." + max_count = 1 + outfit = /datum/outfit/admin/ert/fsf/sapper + mob_name_prefix = "Cpl. " + +/datum/ghostspawner/human/ert/fsf/specialist/med + name = "Free Solarian Fleets Medic" + short_name = "fsfmed" + desc = "A medical specialist from a Free Solarian Fleets marine fireteam." + outfit = /datum/outfit/admin/ert/fsf/medic + +/datum/ghostspawner/human/ert/fsf/leader + name = "Free Solarian Fleets Fireteam Leader" + short_name = "fsflead" + desc = "The leader of the Free Solarian Fleets marine fireteam." + max_count = 1 + outfit = /datum/outfit/admin/ert/fsf/leader + mob_name_prefix = "Sgt. " + +/datum/ghostspawner/human/ert/fsf/synth + name = "Free Solarian Fleets Synthetic Unit" + short_name = "fsfsynth" + desc = "The non-combatant synthetic unit of the Free Solarian Fleets marine fireteam, armed only for self-defense. Tasked with piloting the shuttle and providing tactical advice and overwatch. Not actually a marine itself, the synth is property of the FSF." + max_count = 1 + outfit = /datum/outfit/admin/ert/fsf/synth + mob_name_prefix = null + uses_species_whitelist = TRUE + req_species_whitelist = SPECIES_IPC + possible_species = list(SPECIES_IPC) + diff --git a/code/modules/ghostroles/spawner/human/responseteams/med_eridani.dm b/code/modules/ghostroles/spawner/human/responseteams/med_eridani.dm deleted file mode 100644 index 520400cb7fd..00000000000 --- a/code/modules/ghostroles/spawner/human/responseteams/med_eridani.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/ghostspawner/human/ert/med_eridani - name = "Eridani Medical Contractor Doctor" - short_name = "eridanidoctor" - mob_name_prefix = "Dr. " - max_count = 2 - desc = "A highly trained Eridani contractor doctor medical doctor. Can do most medical procedures even under severe stress." - welcome_message = "You are part of the Eridani Medical Contractor Team, a highly trained team of medical profissional." - outfit = /datum/outfit/admin/ert/med_eridani - possible_species = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_MSAI, SPECIES_TAJARA_ZHAN, SPECIES_SKRELL, SPECIES_DIONA, SPECIES_UNATHI, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_WORKER, SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL) - -/datum/ghostspawner/human/ert/med_eridani/bodyguard - name = "Eridani Medical Contractor Bodyguard" - short_name = "eridanidocbodyguard" - mob_name_prefix = "Bdg. " - max_count = 2 - desc = "A highly trained bodyguard. Sticks close to the medics while they work." - outfit = /datum/outfit/admin/ert/med_eridani/bodyguard - possible_species = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD) - - -/datum/ghostspawner/human/ert/med_eridani/paramedic - name = "Eridani Medical Contractor Paramedic" - short_name = "eridaniparamedic" - mob_name_prefix = "Pm. " - max_count = 2 - desc = "A highly trained paramedic. You grab injured people and bring them to the medical doctor. You are trained in nursing duties as well." - outfit = /datum/outfit/admin/ert/med_eridani/paramedic diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 3ef3c66be0a..2f7fb2b0930 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -109,10 +109,8 @@ var/savefile/iconCache = new("data/tmp/iconCache.sav") //Cache of icons for the loaded = TRUE showChat() - for(var/message in messageQueue) - // whitespace has already been handled by the original to_chat - to_chat(owner, message, handle_whitespace=FALSE) + to_chat(owner, message, FALSE, FALSE) messageQueue = null sendClientData() diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 4b5f760fe25..79fd9543a48 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -250,7 +250,7 @@ a.popt {text-decoration: none;} .motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #a4bad6;} /* ADD HERE FOR BOLD */ -.bold, .name, .prefix, .ooc, .aooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;} +.bold, .name, .prefix, .ooc, .aooc, .looc, .adminooc, .adminlooc, .admin, .medal, .yell {font-weight: bold;} /* ADD HERE FOR ITALIC */ .italic, .italics, .emote {font-style: italic;} @@ -269,6 +269,7 @@ em {font-style: normal; font-weight: bold;} .tag {color: #fff; border-radius: 15px; font-size: 80%; padding-left: 4px; padding-right: 4px;} .ooc_tag {background-color: #3c5dc0;} .looc_tag {color: #000; background-color: #46b2b2;} +.adminlooc_tag {color: #000; background-color: #3bae6e;} .dev_tag {background-color: #2c7731;} .admin_tag {background-color: #9611d4;} .mod_tag {background-color: #663a0e;} @@ -286,6 +287,7 @@ em {font-style: normal; font-weight: bold;} .ooc .everyone {color: #3c5dc0;} .ooc .looc {color: #6699CC;} +.ooc .adminlooc {color: #3BBF6E;} .ooc .elevated {color: #2e78d9;} .ooc .moderator {color: #184880;} .ooc .developer {color: #2c7731;} @@ -316,7 +318,7 @@ em {font-style: normal; font-weight: bold;} .syndradio {color: #ac6667;} .centradio {color: #7272a7;} .airadio {color: #ec00ec;} -.entradio {color: #d19a46;} +.entradio {color: #cfcfcf;} .secradio {color: #e21111;} .engradio {color: #cc7b01;} @@ -364,6 +366,10 @@ h1.alert, h2.alert {color: #a4bad6;} .delvahhi {color: #914123; font-weight: bold;} .siiktau {color: #be3434;} .revenant {color: #1ca5aa; font-style: italic;} +.freespeak {color: #FF4500; font-family: "Trebuchet MS", cursive, sans-serif;} +.tradeband {color: #782CE8; font-family: Georgia, Verdana, sans-serif;} + +.singing {font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;} .interface {color: #750e75;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css index e6212e178e9..80340a6d81a 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput_white.css +++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css @@ -247,7 +247,7 @@ a.popt {text-decoration: none;} .motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;} /* ADD HERE FOR BOLD */ -.bold, .name, .prefix, .ooc, .aooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;} +.bold, .name, .prefix, .ooc, .aooc, .looc, .adminooc, .adminlooc, .admin, .medal, .yell {font-weight: bold;} /* ADD HERE FOR ITALIC */ .italic, .italics, .emote {font-style: italic;} @@ -266,6 +266,7 @@ em {font-style: normal;font-weight: bold;} .tag {color: #fff; border-radius: 15px; font-size: 80%; padding-left: 4px; padding-right: 4px;} .ooc_tag {background-color: #002eb8;} .looc_tag {color: #000; background-color: #46b2b2;} +.adminlooc_tag {color: #000; background-color: #3bae6e;} .dev_tag {background-color: #2c7731;} .admin_tag {background-color: #9611d4;} .mod_tag {background-color: #663a0e;} @@ -283,6 +284,7 @@ em {font-style: normal;font-weight: bold;} .ooc .everyone {color: #002eb8;} .ooc .looc {color: #6699CC;} +.ooc .adminlooc {color: #3bae6e;} .ooc .elevated {color: #2e78d9;} .ooc .moderator {color: #184880;} .ooc .developer {color: #2c7731;} @@ -361,6 +363,10 @@ h1.alert, h2.alert {color: #000080;} .delvahhi {color: #5E2612; font-weight: bold;} .siiktau {color: #A52A2A;} .revenant {color: #215a5c; font-style: italic;} +.freespeak {color: #FF4500; font-family: "Trebuchet MS", cursive, sans-serif;} +.tradeband {color: #5C16C6; font-family: Georgia, Verdana, sans-serif;} + +.singing {font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;} .interface {color: #750e75;} diff --git a/code/modules/goonchat/browserassets/css/styles_template.css b/code/modules/goonchat/browserassets/css/styles_template.css index d9e035b4102..2a13df5ddbe 100644 --- a/code/modules/goonchat/browserassets/css/styles_template.css +++ b/code/modules/goonchat/browserassets/css/styles_template.css @@ -332,6 +332,8 @@ h1.alert, h2.alert {color: #000080;} .yassa {color: #400987;} .delvahhi {color: #5E2612; font-weight: bold;} .siiktau {color: #A52A2A;} +.freespeak {color: #FF4500; font-family: "Trebuchet MS", cursive, sans-serif;} +.tradeband {color: #5C16C6; font-family: Georgia, Verdana, sans-serif;} .interface {color: #750e75;} diff --git a/code/modules/heavy_vehicle/components/armor.dm b/code/modules/heavy_vehicle/components/armor.dm index ac8435f759a..3f98705761e 100644 --- a/code/modules/heavy_vehicle/components/armor.dm +++ b/code/modules/heavy_vehicle/components/armor.dm @@ -1,5 +1,6 @@ /obj/item/robot_parts/robot_component/armor/mech name = "exosuit armor plating" + desc = "A pair of flexible armor plates, used to protect the internals of exosuits and its pilot." armor = list( melee = ARMOR_MELEE_MAJOR, bullet = ARMOR_BALLISTIC_PISTOL, @@ -18,6 +19,8 @@ /obj/item/robot_parts/robot_component/armor/mech/radproof name = "radiation-proof armor plating" desc = "A fully enclosed radiation hardened shell designed to protect the pilot from radiation." + icon_state = "armor_r" + icon_state_broken = "armor_r_broken" armor = list( melee = ARMOR_MELEE_RESISTANT, bullet = ARMOR_BALLISTIC_PISTOL, @@ -32,6 +35,8 @@ /obj/item/robot_parts/robot_component/armor/mech/em name = "EM-shielded armor plating" desc = "A shielded plating that sorrounds the eletronics and protects them from electromagnetic radiation." + icon_state = "armor_e" + icon_state_broken = "armor_e_broken" armor = list( melee = ARMOR_MELEE_RESISTANT , bullet = ARMOR_BALLISTIC_SMALL, @@ -46,6 +51,8 @@ /obj/item/robot_parts/robot_component/armor/mech/combat name = "heavy combat plating" desc = "Plating designed to deflect incoming attacks and explosions." + icon_state = "armor_c" + icon_state_broken = "armor_c_broken" armor = list( melee = ARMOR_MELEE_MAJOR, bullet = ARMOR_BALLISTIC_MEDIUM, diff --git a/code/modules/heavy_vehicle/equipment/mining.dm b/code/modules/heavy_vehicle/equipment/mining.dm index 7851e61234e..1ff822db086 100644 --- a/code/modules/heavy_vehicle/equipment/mining.dm +++ b/code/modules/heavy_vehicle/equipment/mining.dm @@ -21,14 +21,14 @@ B.disconnect() if(length(held_braces) < 2) owner.visible_message(SPAN_NOTICE("\The [owner] starts loading \the [B] into \the [src].")) - if(do_after(owner, 50, act_target = B)) + if(do_after(user, 5 SECONDS, act_target = owner, extra_checks = CALLBACK(GLOBAL_PROC, .proc/atom_maintain_position, B, B.loc))) owner.visible_message(SPAN_NOTICE("\The [owner] loads \the [B] into \the [src].")) B.forceMove(src) LAZYADD(held_braces, B) if(!held_drill && istype(M, /obj/machinery/mining/drill)) var/obj/machinery/mining/drill/D = M owner.visible_message(SPAN_NOTICE("\The [owner] starts loading \the [D] into \the [src].")) - if(do_after(owner, 50, act_target = D)) + if(do_after(user, 5 SECONDS, act_target = owner, extra_checks = CALLBACK(GLOBAL_PROC, .proc/atom_maintain_position, D, D.loc))) owner.visible_message(SPAN_NOTICE("\The [owner] loads \the [D] into \the [src].")) D.anchored = FALSE D.active = FALSE diff --git a/code/modules/heavy_vehicle/equipment/utility.dm b/code/modules/heavy_vehicle/equipment/utility.dm index 2ef3113ac4c..7c53be81863 100644 --- a/code/modules/heavy_vehicle/equipment/utility.dm +++ b/code/modules/heavy_vehicle/equipment/utility.dm @@ -34,7 +34,7 @@ var/obj/machinery/door/firedoor/FD = target if(FD.blocked) FD.visible_message(SPAN_WARNING("\The [owner] begins prying on \the [FD]!")) - if(do_after(owner, 10 SECONDS) && FD.blocked) + if(do_after(user, 10 SECONDS, act_target = owner, extra_checks = CALLBACK(GLOBAL_PROC, .proc/atom_maintain_position, FD, FD.loc)) && FD.blocked) playsound(FD, 'sound/effects/meteorimpact.ogg', 100, 1) playsound(FD, 'sound/machines/airlock_open_force.ogg', 100, 1) FD.blocked = FALSE @@ -42,7 +42,7 @@ FD.visible_message(SPAN_WARNING("\The [owner] tears \the [FD] open!")) else FD.visible_message(SPAN_WARNING("\The [owner] begins forcing \the [FD]!")) - if(do_after(owner, 4 SECONDS) && !FD.blocked) + if(do_after(user, 4 SECONDS, act_target = owner, extra_checks = CALLBACK(GLOBAL_PROC, .proc/atom_maintain_position, FD, FD.loc)) && !FD.blocked) if(FD.density) FD.visible_message(SPAN_WARNING("\The [owner] forces \the [FD] open!")) playsound(FD, 'sound/machines/airlock_open_force.ogg', 100, 1) @@ -63,7 +63,7 @@ var/time_to_open = 15 SECONDS if(AD.welded && AD.locked) time_to_open = 30 SECONDS - if(do_after(owner, time_to_open)) + if(do_after(user, time_to_open, act_target = owner, extra_checks = CALLBACK(GLOBAL_PROC, .proc/atom_maintain_position, AD, AD.loc))) AD.welded = FALSE AD.locked = FALSE AD.update_icon() @@ -73,7 +73,7 @@ INVOKE_ASYNC(AD, /obj/machinery/door/airlock/.proc/open) else AD.visible_message(SPAN_WARNING("\The [owner] begins forcing \the [AD]!")) - if(do_after(owner, 5 SECONDS) && !(AD.operating || AD.welded || AD.locked)) + if(do_after(user, 5 SECONDS, act_target = owner, extra_checks = CALLBACK(GLOBAL_PROC, .proc/atom_maintain_position, AD, AD.loc)) && !(AD.operating || AD.welded || AD.locked)) if(AD.density) INVOKE_ASYNC(AD, /obj/machinery/door/airlock/.proc/open) playsound(AD, 'sound/machines/airlock_open_force.ogg', 100, 1) @@ -101,7 +101,7 @@ owner.visible_message(SPAN_NOTICE("\The [owner] begins loading \the [O].")) - if(do_after(owner, 20, O, 0, 1)) + if(do_after(user, 2 SECONDS, act_target = owner, extra_checks = CALLBACK(GLOBAL_PROC, .proc/atom_maintain_position, O, O.loc))) O.forceMove(src) carrying += O owner.visible_message(SPAN_NOTICE("\The [owner] loads \the [O] into its cargo compartment.")) @@ -384,7 +384,7 @@ //Better materials = faster drill! var/delay = max(5, 20 - drill_head.material.protectiveness) owner.setClickCooldown(delay) //Don't spamclick! - if(do_after(owner, delay, target) && drill_head) + if(do_after(user, delay, act_target = owner, extra_checks = CALLBACK(GLOBAL_PROC, .proc/atom_maintain_position, target, target.loc)) && drill_head) if(src == owner.selected_system) if(drill_head.durability <= 0) drill_head.shatter() diff --git a/code/modules/heavy_vehicle/mech_damage.dm b/code/modules/heavy_vehicle/mech_damage.dm index 87bad9f9e3e..6d50bf2d6cd 100644 --- a/code/modules/heavy_vehicle/mech_damage.dm +++ b/code/modules/heavy_vehicle/mech_damage.dm @@ -1,5 +1,4 @@ /mob/living/heavy_vehicle/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) - if(!effect || (blocked >= 100)) return 0 @@ -7,7 +6,7 @@ if(effect > 0 && effecttype == IRRADIATE) var/mob/living/pilot = pick(pilots) return pilot.apply_effect(effect, effecttype, blocked) - if(effecttype in list(PAIN, STUTTER, EYE_BLUR, DROWSY, STUN, WEAKEN)) + if(!(effecttype in list(PAIN, STUTTER, EYE_BLUR, DROWSY, STUN, WEAKEN))) . = ..() /mob/living/heavy_vehicle/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) @@ -74,7 +73,7 @@ else return body -/mob/living/heavy_vehicle/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/damage_flags, var/armor_pen, var/silent = FALSE) +/mob/living/heavy_vehicle/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone, var/used_weapon, var/damage_flags, var/armor_pen, var/silent = FALSE) if(!damage) return 0 @@ -82,13 +81,16 @@ damage = after_armor[1] damagetype = after_armor[2] + if(!damage) + return 0 + var/target = zoneToComponent(def_zone) //Only 2 types of damage concern mechs and vehicles switch(damagetype) if(BRUTE) - adjustBruteLoss(damage * BLOCKED_MULT(blocked), target) + adjustBruteLoss(damage, target) if(BURN) - adjustFireLoss(damage * BLOCKED_MULT(blocked), target) + adjustFireLoss(damage, target) if((damagetype == BRUTE || damagetype == BURN) && prob(25+(damage*2))) spark(src, 3) @@ -111,6 +113,17 @@ return total /mob/living/heavy_vehicle/emp_act(var/severity) + var/ratio = get_blocked_ratio(null, BURN, null, (4-severity) * 20) + + if(ratio >= 0.5) + for(var/mob/living/m in pilots) + to_chat(m, SPAN_NOTICE("Your Faraday shielding absorbed the pulse!")) + return + else if(ratio > 0) + for(var/mob/living/m in pilots) + to_chat(m, SPAN_NOTICE("Your Faraday shielding mitigated the pulse!")) + + emp_damage += round((12 - (severity*3))*( 1 - ratio)) if(severity <= 3) for(var/obj/item/thing in list(arms,legs,head,body)) thing.emp_act(severity) diff --git a/code/modules/heavy_vehicle/mech_interaction.dm b/code/modules/heavy_vehicle/mech_interaction.dm index b0087494f9c..fc87cb523ac 100644 --- a/code/modules/heavy_vehicle/mech_interaction.dm +++ b/code/modules/heavy_vehicle/mech_interaction.dm @@ -546,7 +546,7 @@ src.visible_message("\The [src] hums with life as it is released from its lockdown mode!") /mob/living/heavy_vehicle/get_floating_chat_x_offset() - return 8 + return -offset_x // reverse the offset /mob/living/heavy_vehicle/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) if(can_listen()) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 53bcae8cc34..97996674d3f 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -272,8 +272,8 @@ spark(user.loc, 5) playsound(user.loc, 'sound/weapons/blade.ogg', 50, 1) - return 1 - return 0 + return PROJECTILE_STOPPED + return FALSE /obj/item/holo/esword/New() if(!item_color) diff --git a/code/modules/hydroponics/seed_datums/aquaculture.dm b/code/modules/hydroponics/seed_datums/aquaculture.dm index 84764f1937a..eab68ff7147 100644 --- a/code/modules/hydroponics/seed_datums/aquaculture.dm +++ b/code/modules/hydroponics/seed_datums/aquaculture.dm @@ -50,3 +50,17 @@ /obj/item/seeds/barnacle seed_type = "barnacle" + +/datum/seed/mollusc/clam/rasval + name = "rasval clam" + seed_name = "rasval clam" + display_name = "rasval clam bed" + product_type = /obj/item/mollusc/clam/rasval + +/datum/seed/mollusc/clam/rasval/New() + ..() + set_trait(TRAIT_PRODUCT_COLOUR, "#9aaca6") + set_trait(TRAIT_PLANT_COLOUR, "#9aaca6") + +/obj/item/seeds/clam/rasval + seed_type = "rasval clam" \ No newline at end of file diff --git a/code/modules/hydroponics/seed_datums/mushrooms.dm b/code/modules/hydroponics/seed_datums/mushrooms.dm index a9aaf2493b0..880bb4f2c5f 100644 --- a/code/modules/hydroponics/seed_datums/mushrooms.dm +++ b/code/modules/hydroponics/seed_datums/mushrooms.dm @@ -47,7 +47,7 @@ set_trait(TRAIT_MATURATION,5) set_trait(TRAIT_PRODUCTION,1) set_trait(TRAIT_YIELD,3) - set_trait(TRAIT_POTENCY,40) + set_trait(TRAIT_POTENCY,60) set_trait(TRAIT_BIOLUM,1) set_trait(TRAIT_IDEAL_LIGHT,1) set_trait(TRAIT_LIGHT_TOLERANCE,2) @@ -73,7 +73,7 @@ /datum/seed/koisspore/black/setup_traits() ..() set_trait(TRAIT_BIOLUM_PWR,-1.5) - set_trait(TRAIT_POTENCY,60) + set_trait(TRAIT_POTENCY,80) set_trait(TRAIT_ENDURANCE,75) set_trait(TRAIT_IDEAL_LIGHT,0) set_trait(TRAIT_LIGHT_TOLERANCE,8) diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 160d9d5b888..d42b240c815 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -94,7 +94,8 @@ /obj/item/seeds/ylpha = 2, /obj/item/seeds/clam = 15, /obj/item/seeds/barnacle = 15, - /obj/item/seeds/mollusc = 15 + /obj/item/seeds/mollusc = 15, + /obj/item/seeds/clam/rasval = 15 ) /obj/machinery/seed_storage/xenobotany diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index b5799fad9e6..24cc962d39a 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -136,7 +136,8 @@ /obj/machinery/portable_atmospherics/hydroponics/AltClick() if (istype(usr, /mob/living/carbon/alien/diona))//A diona alt+clicking feeds the plant - + if(!Adjacent(usr)) + return if (closed_system) to_chat(usr, "The lid is closed, you don't have hands to open it and reach the plants inside!") return diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 9587526a4e7..a63b9679f14 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -22,9 +22,10 @@ /obj/item/device/analyzer/plant_analyzer name = "plant analyzer" - icon = 'icons/obj/device.dmi' + icon = 'icons/obj/contained_items/tools/plant_analyzer.dmi' icon_state = "hydro" - item_state = "analyzer" + item_state = "hydro" + contained_sprite = TRUE var/form_title var/last_data matter = list(DEFAULT_WALL_MATERIAL = 80, MATERIAL_GLASS = 20) diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 515d1a6c972..9b97e242aab 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -207,6 +207,9 @@ a creative player the means to solve many problems. Circuits are held inside an M = held_item if(!M && off_hand?.ismultitool()) M = off_hand + if(M.tracking_apc) + to_chat(usr, SPAN_WARNING("\The [M]'s smart tracking is enabled! Disable it to regain I/O functionality.")) + return TRUE if(href_list["rename"]) rename_component(usr) diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index 5052ea23b50..cf8e710f2d6 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -165,75 +165,6 @@ io.holder.interact(user) // This is to update the UI. -/obj/item/device/multitool - var/datum/integrated_io/selected_io = null - var/mode = 0 - -/obj/item/device/multitool/attack_self(mob/user) - if(selected_io) - selected_io = null - to_chat(user, "You clear the wired connection from the multitool.") - else - ..() - update_icon() - -/obj/item/device/multitool/update_icon() - if(selected_io) - if(buffer || connecting || buffer_object) - icon_state = "multitool_tracking" - else - icon_state = "multitool_red" - else - if(buffer || connecting || buffer_object) - icon_state = "multitool_tracking_fail" - else - icon_state = "multitool" - -/obj/item/device/multitool/proc/wire(datum/integrated_io/io, mob/user) - if(!io.holder.assembly) - to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.") - return - - if(selected_io) - if(io == selected_io) - to_chat(user, "Wiring \the [selected_io.holder]'s '[selected_io.name]' pin into itself is rather pointless.") - return - if(io.io_type != selected_io.io_type) - to_chat(user, "Those two types of channels are incompatable. The first is a [selected_io.io_type], \ - while the second is a [io.io_type].") - return - if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly) - to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.") - return - selected_io.linked |= io - io.linked |= selected_io - - to_chat(user, "You connect \the [selected_io.holder]'s '[selected_io.name]' pin to \the [io.holder]'s '[io.name]' pin.") - selected_io.holder.interact(user) // This is to update the UI. - selected_io = null - - else - selected_io = io - to_chat(user, "You link \the multitool to \the [selected_io.holder]'s [selected_io.name] data channel.") - - update_icon() - -/obj/item/device/multitool/proc/unwire(datum/integrated_io/io1, datum/integrated_io/io2, mob/user) - if(!io1.linked.len || !io2.linked.len) - to_chat(user, "There is nothing connected to the data channel.") - return - - if(!(io1 in io2.linked) || !(io2 in io1.linked) ) - to_chat(user, "These data pins aren't connected!") - return - else - io1.linked.Remove(io2) - io2.linked.Remove(io1) - to_chat(user, "You clip the data connection between the [io1.holder.displayed_name]'s \ - '[io1.name]' pin and the [io2.holder.displayed_name]'s '[io2.name]' pin.") - io1.holder.interact(user) // This is to update the UI. - update_icon() - /obj/item/device/integrated_electronics/detailer name = "assembly detailer" desc = "A combination autopainter and flash anodizer designed to give electronic assemblies a colorful, wear-resistant finish." diff --git a/code/modules/item_worth/reagents.dm b/code/modules/item_worth/reagents.dm index 6588d2c82b6..ca8ac4cbab4 100644 --- a/code/modules/item_worth/reagents.dm +++ b/code/modules/item_worth/reagents.dm @@ -39,6 +39,9 @@ /decl/reagent/alcohol/butanol/xuizijuice value = 0.2 +/decl/reagent/alcohol/nmshaan_liquor/darmadhirbrew + value = 25 + /decl/reagent/hydrazine value = 0.017 diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 2040cd0b096..69ae579da0e 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -82,6 +82,7 @@ var/list/worths = list( /obj/item/gun/launcher = 300, //AUTOMATICS, /obj/item/gun/projectile/automatic/rifle/sts35 = 3800, + /obj/item/gun/projectile/automatic/rifle/carbine = 3000, /obj/item/gun/projectile/automatic/rifle/z8 = 3100, /obj/item/gun/projectile/automatic/rifle/l6_saw = 13400, /obj/item/gun/projectile/automatic/rifle/shotgun = 8500, @@ -154,11 +155,11 @@ var/list/worths = list( /obj/item/stack = -5, //STORAGE, /obj/item/storage/briefcase/crimekit = -50, - /obj/item/storage/belt/wands = 800, /obj/item/storage/belt/military = 700, /obj/item/storage/belt/security/tactical = 500, /obj/item/storage/belt/soulstone = 800, /obj/item/storage/belt = -50, + /obj/item/storage/belt/medical/first_responder/combat = 650, /obj/item/storage/backpack/holding = -3000, /obj/item/storage = -30, //WEAPONS, @@ -167,7 +168,6 @@ var/list/worths = list( /obj/item/mining_scanner = 130, /obj/item/bee_smoker = 50, /obj/item/anomaly_core = 20000, - /obj/item/spellbook = 25000, /obj/item/am_containment = 5000, /obj/item/coin/diamond = 500, /obj/item/coin/platinum = 250, @@ -251,7 +251,6 @@ var/list/worths = list( /obj/item/vampiric = 666, /obj/item/anobattery = 1800, /obj/item/anodevice = 3300, - /obj/item/scrying = 20000, /obj/item/soap/deluxe = 15, /obj/item/cane/concealed = 250, /obj/item/cane = 40, @@ -311,7 +310,6 @@ var/list/worths = list( /obj/item/rfd/construction = 1000, /obj/item/rfd_ammo = 50, /obj/item/rfd/service = 300, - /obj/item/teleportation_scroll = 7000, /obj/item/shield/riot/tact = 500, /obj/item/shield/riot = 150, /obj/item/shield/buckler = 200, @@ -358,7 +356,6 @@ var/list/worths = list( /obj/item/implanter = 80, //MELEE, /obj/item/melee/cultblade = 1500, - /obj/item/melee/energy/wizard = 15000, /obj/item/melee/energy/glaive = 5400, /obj/item/melee/energy/sword/powersword = 8000, /obj/item/melee/energy/sword = 5000, @@ -378,7 +375,6 @@ var/list/worths = list( /obj/item/melee/vaurca/rock = 700, /obj/item/tank/jetpack = 390, /obj/item/tank = 40, - /obj/item/contract = 20000, /obj/item/ladder_mobile = 250, /obj/item/contraband/poster = 25, //MATERIAL, @@ -438,7 +434,7 @@ var/list/worths = list( //GLOVES, /obj/item/clothing/gloves/boxing = 60, /obj/item/clothing/gloves/yellow = 300, - /obj/item/clothing/gloves/fyellow = 25, //cheap cheap cheap, + /obj/item/clothing/gloves/yellow/budget = 25, //cheap cheap cheap, /obj/item/clothing/gloves/captain = 100, /obj/item/clothing/gloves/swat = 125, /obj/item/clothing/gloves/combat = 400, @@ -465,14 +461,12 @@ var/list/worths = list( //SHOES, /obj/item/clothing/shoes/galoshes = 50, /obj/item/clothing/shoes/syndigaloshes = 250, - /obj/item/clothing/shoes/clown_shoes = 100, /obj/item/clothing/shoes/cult = 350, /obj/item/clothing/shoes/magboots = 350, /obj/item/clothing/shoes/swat = 200, /obj/item/clothing/shoes/combat = 450, /obj/item/clothing/shoes = 25, //SUITS, - /obj/item/clothing/suit/space/void/wizard = 5000, /obj/item/clothing/suit/space/void/captain = 4000, /obj/item/clothing/suit/space/void/merc = 3000, /obj/item/clothing/suit/space/void/security = 3000, @@ -503,7 +497,6 @@ var/list/worths = list( /obj/item/clothing/suit/storage/hazardvest = 60, /obj/item/clothing/suit/storage/toggle/labcoat = 55, /obj/item/clothing/suit/armor/riot/laser_tag = 125, - /obj/item/clothing/suit/fire/heavy = 600, /obj/item/clothing/suit/fire = 500, /obj/item/clothing/suit/radiation = 450, /obj/item/clothing/suit/bomb_suit = 300, @@ -540,7 +533,6 @@ var/list/worths = list( /obj/item/clothing/head/navy = 250, /obj/item/clothing/head/dress/admiral = 1000, /obj/item/clothing/head/dress = 350, - /obj/item/clothing/head/helmet/space/void/wizard = 4000, /obj/item/clothing/head/helmet/space/void/merc = 2000, /obj/item/clothing/head/helmet/space/void/security = 2000, /obj/item/clothing/head/helmet/space/void/captain = 3000, diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 043b557632e..8542e65af86 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -268,6 +268,14 @@ new /datum/stack_recipe("diamond floor tile", /obj/item/stack/tile/diamond, 1, 4, 20) )) +/material/stone/marble/generate_recipes() + ..() + recipes += new /datum/stack_recipe_list("[display_name] construction", + list( + new /datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/marble, 1, 4, 20), + new /datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/marble/dark, 1, 4, 20) + )) + /material/leather/generate_recipes() ..() recipes += new /datum/stack_recipe_list("[display_name] construction", diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 221857a28f3..1a2aa3e2e23 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -3,6 +3,7 @@ desc_info = "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it." force = 5 throwforce = 5 + flags = HELDMAPTEXT w_class = ITEMSIZE_NORMAL throw_speed = 3 throw_range = 3 @@ -15,16 +16,15 @@ var/apply_colour //temp pending icon rewrite var/use_material_sound = TRUE -/obj/item/stack/material/Initialize() - . = ..() +/obj/item/stack/material/Initialize(mapload, amount) + ..() randpixel_xy() if(!default_type) default_type = DEFAULT_WALL_MATERIAL material = SSmaterials.get_material_by_name(default_type) if(!material) - qdel(src) - return + return INITIALIZE_HINT_QDEL recipes = material.get_recipes() stacktype = material.stack_type @@ -43,6 +43,9 @@ flags |= CONDUCT matter = material.get_matter() + return INITIALIZE_HINT_LATELOAD + +/obj/item/stack/material/LateInitialize() update_strings() /obj/item/stack/material/get_material() @@ -60,6 +63,7 @@ name = "[material.use_name] [material.sheet_singular_name]" desc = "A [material.sheet_singular_name] of [material.use_name]." gender = NEUTER + check_maptext(SMALL_FONTS(7, amount)) /obj/item/stack/material/use(var/used) . = ..() @@ -344,7 +348,7 @@ /obj/item/stack/material/leather name = "leather" - desc = "The by-product of mob grinding." + desc = "Created by only the finest of biogenerators!" icon_state = "sheet-leather" default_type = MATERIAL_LEATHER icon_has_variants = TRUE @@ -354,6 +358,11 @@ amount = max_amount update_icon() +/obj/item/stack/material/leather/fine + name = "fine leather" + desc = "Handcrafted by an artisan, this leather is a wonderful status symbol for the wealthy few... Despite it not being any tougher than its biogenerated counterpart." + default_type = MATERIAL_LEATHER_FINE + /obj/item/stack/material/glass name = "glass" icon_state = "sheet-glass" diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 770eb834608..965f517e117 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -836,6 +836,13 @@ drop_sound = 'sound/items/drop/leather.ogg' pickup_sound = 'sound/items/pickup/leather.ogg' +/material/leather/fine + name = MATERIAL_LEATHER_FINE + icon_colour = "#4B3A27" + stack_type = /obj/item/stack/material/leather/fine + ignition_point = T0C+320 + melting_point = T0C+320 + /material/cotton name = MATERIAL_COTTON display_name ="cotton" @@ -975,6 +982,14 @@ stack_type = /obj/item/stack/material/animalhide/human icon_colour = "#833C00" +/material/hide/barehide + name = "bare hide" + stack_type = /obj/item/stack/material/animalhide/barehide + +/material/hide/wetleather + name = "wet leather" + stack_type = /obj/item/stack/material/animalhide/wetleather + /material/bone name = MATERIAL_BONE icon_colour = "#e3dac9" diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index a84334b7a7e..0bcb9144716 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -118,15 +118,10 @@ new /obj/item/material/sword/katana(src) if(93) new /obj/item/dnainjector/xraymut(src) // Probably the least OP - if(94) // Why the hell not - new /obj/item/storage/backpack/clown(src) - new /obj/item/clothing/under/rank/clown(src) - new /obj/item/clothing/shoes/clown_shoes(src) - new /obj/item/modular_computer/handheld/pda/civilian/clown(src) - new /obj/item/clothing/mask/gas/clown_hat(src) - new /obj/item/bikehorn(src) - new /obj/item/pen/crayon/rainbow(src) - new /obj/item/reagent_containers/spray/waterflower(src) + if(94) + new /obj/item/clothing/suit/space/void/zavodskoi(src) + new /obj/item/clothing/head/helmet/space/void/zavodskoi(src) + new /obj/item/flag/zavodskoi/l(src) if(95) new /obj/item/clothing/under/mime(src) new /obj/item/clothing/shoes/black(src) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 9301e6bcdd2..779ac435b17 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -393,6 +393,20 @@ throwforce = 7.0 w_class = ITEMSIZE_SMALL +/obj/item/shovel/gadpathur + name = "trench shovel" + desc = "A standard-issue Gadpathurian entrenching tool. Sharpened edges make this tool/weapon equally adept at breaking earth and collarbones." + icon_state = "gadpathur_shovel" + item_state = "gadpathur_shovel" + force = 10 + w_class = ITEMSIZE_NORMAL + origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1, TECH_COMBAT = 2) + attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked", "slashed", "cut") + sharp = TRUE + +/obj/item/shovel/gadpathur/iscrowbar() + return TRUE + // Flags. /obj/item/stack/flag diff --git a/code/modules/mining/mine_turf_types.dm b/code/modules/mining/mine_turf_types.dm index 56595a8a515..d36a8615288 100644 --- a/code/modules/mining/mine_turf_types.dm +++ b/code/modules/mining/mine_turf_types.dm @@ -85,6 +85,10 @@ light_range = 2 . = ..() +/turf/unsimulated/floor/asteroid/ReplaceWithLattice() + ChangeTurf(baseturf) + new /obj/structure/lattice(src) + /turf/unsimulated/floor/asteroid/ash name = "ash" icon_state = "ash" diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index b37a4586b1e..1ea76e0cfd0 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -239,7 +239,6 @@ var/list/mineral_can_smooth_with = list( return if(istype(W, /obj/item/device/core_sampler)) - geologic_data.UpdateNearbyArtifactInfo(src) // good god var/obj/item/device/core_sampler/C = W C.sample_item(src, user) return @@ -305,8 +304,7 @@ var/list/mineral_can_smooth_with = list( else O = new /obj/item/ore(src) if(istype(O)) - geologic_data.UpdateNearbyArtifactInfo(src) - O.geologic_data = geologic_data + O.geologic_data = get_geodata() addtimer(CALLBACK(O, /atom/movable/.proc/forceMove, user.loc), 1) if(finds?.len) @@ -329,14 +327,14 @@ var/list/mineral_can_smooth_with = list( if(artifact_find) if(excavation_level > 0 || prob(15)) //boulder with an artifact inside - B = new(src) + B = new(src, "#9c9378") // if we ever get natural walls, edit this if(artifact_find) B.artifact_find = artifact_find else artifact_debris(1) else if(prob(15)) //empty boulder - B = new(src) + B = new(src, "#9c9378") // if we ever get natural walls, edit this if(B) GetDrilled(0) @@ -367,6 +365,12 @@ var/list/mineral_can_smooth_with = list( new /obj/structure/sculpting_block(src) GetDrilled(1) +/turf/simulated/mineral/proc/get_geodata() + if(!geologic_data) + geologic_data = new /datum/geosample(src) + geologic_data.UpdateNearbyArtifactInfo(src) + return geologic_data + /turf/simulated/mineral/proc/clear_ore_effects() if(my_mineral) qdel(my_mineral) @@ -378,8 +382,7 @@ var/list/mineral_can_smooth_with = list( clear_ore_effects() var/obj/item/ore/O = new mineral.ore(src) if(istype(O)) - geologic_data.UpdateNearbyArtifactInfo(src) //whoever named this proc must be shot - geeves - O.geologic_data = geologic_data + O.geologic_data = get_geodata() return O /turf/simulated/mineral/proc/GetDrilled(var/artifact_fail = 0) @@ -413,12 +416,12 @@ var/list/mineral_can_smooth_with = list( if(prob_clean) X = new /obj/item/archaeological_find(src, new_item_type = F.find_type) else - X = new /obj/item/ore/strangerock(src, inside_item_type = F.find_type) - geologic_data.UpdateNearbyArtifactInfo(src) //AAAAAAAAAAAAAAAAAAAAAAAAAA - X:geologic_data = geologic_data //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + var/obj/item/ore/strangerock/SR = new /obj/item/ore/strangerock(src, inside_item_type = F.find_type) + SR.geologic_data = get_geodata() + X = SR //some find types delete the /obj/item/archaeological_find and replace it with something else, this handles when that happens - //yuck //yuck indeed. + //yuck //yuck indeed. //yuck ultra var/display_name = "something" if(!X) X = last_find diff --git a/code/modules/mob/abstract/new_player/menu.dm b/code/modules/mob/abstract/new_player/menu.dm index 937c8b98310..9cf0e42c042 100644 --- a/code/modules/mob/abstract/new_player/menu.dm +++ b/code/modules/mob/abstract/new_player/menu.dm @@ -99,52 +99,50 @@ hud = H ..() +/obj/screen/new_player/selection/MouseEntered(location, control, params) + var/matrix/M = matrix() + M.Scale(1.1, 1) + animate(src, color = color_rotation(30), transform = M, time = 3, easing = CUBIC_EASING) + return ..() + +/obj/screen/new_player/selection/MouseExited(location,control,params) + animate(src, color = null, transform = null, time = 3, easing = CUBIC_EASING) + return ..() + /obj/screen/new_player/selection/join_game name = "Join Game" icon_state = "unready" - screen_loc = "LEFT+1,CENTER" + screen_loc = "LEFT+0.1,CENTER-1" /obj/screen/new_player/selection/settings name = "Setup" icon_state = "setup" - screen_loc = "LEFT+1,CENTER-1" + screen_loc = "LEFT+0.1,CENTER-2" /obj/screen/new_player/selection/manifest name = "Crew Manifest" icon_state = "manifest" - screen_loc = "LEFT+1,CENTER-2" + screen_loc = "LEFT+0.1,CENTER-3" /obj/screen/new_player/selection/observe name = "Observe" icon_state = "observe" - screen_loc = "LEFT+1,CENTER-3" + screen_loc = "LEFT+0.1,CENTER-4" /obj/screen/new_player/selection/changelog name = "Changelog" icon_state = "changelog" - screen_loc = "LEFT+1,CENTER-4" + screen_loc = "LEFT+0.1,CENTER-5" /obj/screen/new_player/selection/polls name = "Polls" icon_state = "polls" - screen_loc = "LEFT+1,CENTER-5" + screen_loc = "LEFT+0.1,CENTER-6" /obj/screen/new_player/selection/lore_summary name = "Current Lore Summary" icon_state = "lore_summary" - screen_loc = "LEFT+1,CENTER-6" - -/obj/screen/new_player/selection/MouseEntered(location,control,params) //Yellow color for the font - color = "#ffb200" - var/matrix/M = matrix() - M.Scale(1.1, 1.1) - animate(src, transform = M, time = 1, easing = CUBIC_EASING) - return ..() - -/obj/screen/new_player/selection/MouseExited(location,control,params) - color = null - animate(src, transform = null, time = 1, easing = CUBIC_EASING) - return ..() + screen_loc = "LEFT+0.1,CENTER-7" /obj/screen/new_player/selection/join_game/Initialize() . = ..() diff --git a/code/modules/mob/abstract/new_player/preferences_setup.dm b/code/modules/mob/abstract/new_player/preferences_setup.dm index 3b2d9fccf85..90b2b844a7e 100644 --- a/code/modules/mob/abstract/new_player/preferences_setup.dm +++ b/code/modules/mob/abstract/new_player/preferences_setup.dm @@ -215,7 +215,7 @@ SSjobs.EquipCustom(mannequin, previewJob, src, leftovers, null, used_slots) if((equip_preview_mob & EQUIP_PREVIEW_JOB) && previewJob) - previewJob.equip_preview(mannequin, player_alt_titles[previewJob.title]) + previewJob.equip_preview(mannequin, player_alt_titles[previewJob.title], faction) if(equip_preview_mob & EQUIP_PREVIEW_LOADOUT && leftovers.len) SSjobs.EquipCustomDeferred(mannequin, src, leftovers, used_slots) diff --git a/code/modules/mob/abstract/new_player/sprite_accessories.dm b/code/modules/mob/abstract/new_player/sprite_accessories.dm index 7d26c67f6da..565b774eaf9 100644 --- a/code/modules/mob/abstract/new_player/sprite_accessories.dm +++ b/code/modules/mob/abstract/new_player/sprite_accessories.dm @@ -68,7 +68,7 @@ Follow by example and make good judgement based on length which list to include bald name = "Bald" // try to capitalize the names please~ icon_state = "bald" // you do not need to define _s or _l sub-states, game automatically does this for you - species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi,/datum/species/diona) length = 0 chatname = "bald head" //aim to keep these lowercase so they fit into the hair tugging message @@ -178,11 +178,11 @@ Follow by example and make good judgement based on length which list to include name = "Bedhead 3" icon_state = "hair_bedhead3" chatname = "wavy hair" - + bedhead4 name = "Bedhead 4" icon_state = "hair_bedhead4" - length = 3 + length = 4 chatname = "messy locks" beehive @@ -218,7 +218,7 @@ Follow by example and make good judgement based on length which list to include bob name = "Bob" icon_state = "hair_bob" - species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie) chatname = "short hair" bob_chin @@ -239,7 +239,7 @@ Follow by example and make good judgement based on length which list to include bobcurl name = "Bobcurl" icon_state = "hair_bobcurl" - species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie) chatname = "curls" bobcurl2 @@ -374,13 +374,13 @@ Follow by example and make good judgement based on length which list to include buzzcut name = "Buzzcut" icon_state = "hair_buzzcut" - species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie) chatname = "unbuzzed hair" //grabbing the grabbable hair buzzcut2 name = "Buzzcut 2" icon_state = "hair_buzzcut2" - species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie) chatname = "unbuzzed hair" chrono @@ -479,6 +479,30 @@ Follow by example and make good judgement based on length which list to include length = 3 chatname = "long fringe" + emofringe_longbun + name = "Emo Fringe Long Bun" + icon_state = "hair_emofringe_longbun" + length = 3 + chatname = "hair bun" + + emorightfringe_long + name = "Emo Right Fringe Long" + icon_state = "hair_emofringe_long" + length = 3 + chatname = "long fringe" + + emofringe_long_alt + name = "Emo Fringe Long Alt" + icon_state = "hair_emofringe_longalt" + length = 3 + chatname = "long fringe" + + emorightfringe_long_alt + name = "Emo Right Fringe Long Alt" + icon_state = "hair_emorightfringe_longalt" + length = 3 + chatname = "long fringe" + fade_high name = "Fade, High" icon_state = "hair_fade_high" @@ -538,6 +562,12 @@ Follow by example and make good judgement based on length which list to include length = 3 chatname = "long hair" + gentlealt + name = "Gentle Alt" + icon_state = "hair_gentlealt" + length = 3 + chatname = "long hair" + gentle2 name = "Gentle 2" icon_state = "hair_gentle2" @@ -1197,7 +1227,7 @@ Follow by example and make good judgement based on length which list to include spiky name = "Spiky" icon_state = "hair_spiky" - species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie) chatname = "mighty spikes" straightlong @@ -1304,6 +1334,99 @@ Follow by example and make good judgement based on length which list to include icon_state = "hair_wheeler" chatname = "short hair" + bug_eyes + icon = 'icons/mob/human_face/dionae_hair.dmi' + name = "Bug Eyes" + icon_state = "bugeyes" + species_allowed = list(/datum/species/diona) + gender = NEUTER + do_colouration = FALSE + + human_eyes + name = "Human Eyes" + icon_state = "humaneyes" + + skrell_eyes + name = "Skrell Eyes" + icon_state = "skrelleyes" + + skrell_eyes_2 + name = "Skrell Eyes 2" + icon_state = "skrelleyes2" + + cat_ears + name = "Cat Ears" + icon_state = "catears" + + horny + name = "Horny" + icon_state = "horny" + + headtails + name = "Headtails" + icon_state = "headtails" + + headtails_2 + name = "Headtails 2" + icon_state = "headtails2" + + tiny_eye + name = "Tiny Eye" + icon_state = "tinyeye" + + eyebrow + name = "Eyebrow" + icon_state = "eyebrow" + + bullhorn + name = "Bullhorn" + icon_state = "bullhorn" + + blinkinghelmethead + name = "Blinking Helmethead" + icon_state = "blinkinghelmethead" + + periscope + name = "Periscope" + icon_state = "periscope" + + glorp + name = "Glorp" + icon_state = "glorp" + + mellow_cap + name = "Mellow Cap" + icon_state = "mellowcap" + + red_cap + name = "Red Cap" + icon_state = "redcap" + + fun_guy + name = "Fun Guy" + icon_state = "funguy" + + spanish_moss + name = "Spanish Moss" + icon_state = "spanishmoss" + + shelflife + name = "Shelflife" + icon_state = "shelflife" + do_colouration = TRUE + + oak + name = "Oak" + icon_state = "oak" + + thorns + name = "Thorns" + icon_state = "thorns" + + stump + name = "Stump" + icon_state = "stump" + // TG-format hair - uses ICON_MULTIPLY instead of ICON_ADD balding icon = 'icons/mob/human_face/hair_multiply.dmi' @@ -1648,6 +1771,7 @@ Follow by example and make good judgement based on length which list to include name = "M'sai Inner Ear Fur" icon_state = "taj_msai_innerearfur" species_allowed = list(/datum/species/tajaran/m_sai) + /* /////////////////////////////////// / =---------------------------= / @@ -1665,7 +1789,7 @@ Follow by example and make good judgement based on length which list to include icon_state = "bald" gender = NEUTER species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi, - /datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/skrell,/datum/species/zombie/skrell) + /datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/skrell,/datum/species/zombie/skrell,/datum/species/diona) threeOclock name = "3 O'clock Shadow" @@ -1726,7 +1850,7 @@ Follow by example and make good judgement based on length which list to include elvis name = "Elvis Sideburns" icon_state = "facial_elvis" - species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie) fullbeard name = "Full Beard" @@ -1820,16 +1944,12 @@ Follow by example and make good judgement based on length which list to include name = "Wise Beard" icon_state = "facial_wise" - brokenman + chinstrap2 icon = 'icons/mob/human_face/facial_hair_multiply.dmi' - name = "Broken Man" - icon_state = "facial_brokenman" + name = "Chinstrap, Alt" + icon_state = "facial_chinstrap_ii" icon_blend_mode = ICON_MULTIPLY - chinstrap2 - name = "Chinstrap, Alt" - icon_state = "facial_chinstrap_ii" - stark name = "Stark" icon_state = "facial_stark" @@ -2080,6 +2200,7 @@ Follow by example and make good judgement based on length which list to include species_allowed = list(/datum/species/skrell,/datum/species/zombie/skrell) length = 6 chatname = "Short Tentacles" + var/scrunchy_style = "seaweed" // seaweed fits the normal tentacles pretty well skr_tentacle_f name = "Skrell Average Tentacles" @@ -2099,6 +2220,40 @@ Follow by example and make good judgement based on length which list to include length = 6 chatname = "Very Long Tentacles" + skr_tentacle_ponytail + name = "Skrell Seaweed Ponytail" + icon_state = "skrell_seaweed" + length = 3 + chatname = "Ponytail, Seaweed" + + skr_tentacle_doubletail + name = "Skrell Hoop Ponytail" + icon_state = "skrell_hoop" + length = 3 + chatname = "Ponytail, Hoop" + scrunchy_style = "hoop" + + skr_tentacle_flb + name = "Skrell Reef Ponytail" + icon_state = "skrell_reef" + length = 6 + chatname = "Ponytail, Reef" + scrunchy_style = "reef" + + skr_tentacle_ponytailm + name = "Skrell Driftwood Ponytail" + icon_state = "skrell_driftwood" + length = 6 + chatname = "Ponytail, Driftwood" + scrunchy_style = "driftwood" + + skr_tentacle_backwater + name = "Skrell Backwater" + icon_state = "skrell_backwater" + length = 6 + chatname = "Backwater" + scrunchy_style = "backwater" + //tajaran hair @@ -2106,217 +2261,403 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/tajara_hair.dmi' name = "Tajaran Ears" icon_state = "ears_plain" + length = 1 species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/zombie/tajara) taj_ears_bangs name = "Tajara Bangs" icon_state = "hair_bangs" + length = 3 chatname = "bangs" taj_ears_bangs_alt name = "Tajara Bangs Alt" icon_state = "hair_bangs_alt" + length = 3 chatname = "short bangs" taj_ears_shortfringe name = "Tajara Short Fringe" icon_state = "hair_shortfringe" + length = 2 chatname = "short fringe" taj_ears_bob name = "Tajara Bob" icon_state = "hair_bob" + length = 2 chatname = "groomed short mane" taj_ears_braid name = "Tajara Braid" icon_state = "hair_braid" + length = 3 chatname = "braid" taj_ears_clean name = "Tajara Clean" icon_state = "hair_clean" + length = 1 chatname = "short mane" taj_ears_curls name = "Tajara Curly" icon_state = "hair_curly" + length = 3 + chatname = "curly mane" + + taj_ears_curlsalt + name = "Tajara Curly Alt" + icon_state = "hair_curlyalt" + length = 3 chatname = "curly mane" taj_ears_fingercurl name = "Tajara Finger Curls" icon_state = "hair_fingerwave" + length = 2 chatname = "curls" taj_ears_pompadour name = "Tajara Greaser" icon_state = "hair_greaser" + length = 2 chatname = "pompadour" taj_ears_housewife name = "Tajara Housewife" icon_state = "hair_housewife" + length = 2 chatname = "long mane" taj_ears_long name = "Tajara Long" icon_state = "hair_long" + length = 3 chatname = "long mane" taj_ears_messy name = "Tajara Messy" icon_state = "hair_messy" + length = 1 chatname = "messy mane" taj_ears_mohawk name = "Tajara Mohawk" icon_state = "hair_mohawk" + length = 1 chatname = "mohawk" taj_ears_plait name = "Tajara Plait" icon_state = "hair_plait" + length = 1 chatname = "braid" taj_ears_rattail name = "Tajara Rat Tail" icon_state = "hair_rattail" + length = 2 chatname = "thin ponytail" taj_ears_shaggy name = "Tajara Shaggy" icon_state = "hair_shaggy" + length = 1 chatname = "messy mane" taj_ears_straight name = "Tajara Straight" icon_state = "hair_straight" + length = 3 chatname = "short mane" taj_ears_spiky name = "Tajara Spiky" icon_state = "hair_spiky" + length = 1 chatname = "spiky mane" taj_ears_victory name = "Tajara Victory Curls" icon_state = "hair_victory" + length = 3 chatname = "curls" taj_ears_mane name = "Tajara Mane" icon_state = "hair_mane" + length = 3 gender = MALE chatname = "long mane" + taj_ears_sidepony + name = "Tajara Side Ponytail" + icon_state = "hair_sidepony" + length = 3 + chatname = "sideponytail" + + taj_ears_sideponyalt + name = "Tajara Side Ponytail Alt" + icon_state = "hair_sideponyalt" + length = 3 + chatname = "sideponytail" + + taj_ears_governmentman + name = "Tajara Government Man" + icon_state = "hair_gman" + length = 1 + chatname = "styled mane" + + taj_ears_bun + name = "Tajara Bun" + icon_state = "hair_bun" + length = 2 + chatname = "bun" + + taj_ears_smallbun + name = "Tajara Bun (Small)" + icon_state = "hair_bunsmall" + length = 2 + chatname = "bun" + + taj_ears_lowbun + name = "Tajara Bun (Low)" + icon_state = "hair_lowbun" + length = 2 + chatname = "bun" + + taj_ears_smalllowbun + name = "Tajara Bun (Low, Small)" + icon_state = "hair_lowbunsmall" + length = 2 + chatname = "bun" + + taj_ears_shoulderlength + name = "Tajara Shoulderlength" + icon_state = "hair_shoulderlength" + length = 2 + chatname = "styled mane" + + taj_ears_shoulderlengthalt + name = "Tajara Shoulderlength Alt" + icon_state = "hair_shoulderlengthalt" + length = 2 + chatname = "styled mane" + + taj_ears_tresses + name = "Tajara Tresses" + icon_state = "hair_tresses" + length = 3 + chatname = "styled mane" + + taj_ears_tressesalt + name = "Tajara Tresses Alt" + icon_state = "hair_tressesalt" + length = 3 + chatname = "styled mane" + //msai hair, longer ears msai_ears icon = 'icons/mob/human_face/msai_hair.dmi' name = "M'sai Ears" icon_state = "msai_plain" + length = 1 species_allowed = list(/datum/species/tajaran/m_sai) msai_ears_bangs name = "M'sai Bangs" icon_state = "msai_bangs" + length = 3 chatname = "bangs" msai_ears_bangs_alt name = "M'sai Bangs Alt" icon_state = "msai_bangs_alt" + length = 3 chatname = "smallbangs" msai_ears_shortfringe name = "M'sai Short Fringe" icon_state = "msai_shortfringe" + length = 2 chatname = "short fringe" msai_ears_bob name = "M'sai Bob" icon_state = "msai_bob" + length = 2 chatname = "groomed short mane" msai_ears_braid name = "M'sai Braid" icon_state = "msai_braid" + length = 3 chatname = "braid" msai_ears_clean name = "M'sai Clean" icon_state = "msai_clean" + length = 1 chatname = "short mane" msai_ears_curls name = "M'sai Curly" icon_state = "msai_curly" + length = 3 + chatname = "curly mane" + + msai_ears_curls + name = "M'sai Curly Alt" + icon_state = "msai_curlyalt" + length = 3 chatname = "curly mane" msai_ears_fingercurl name = "M'sai Finger Curls" icon_state = "msai_fingerwave" + length = 2 chatname = "curls" msai_ears_pompadour name = "M'sai Greaser" icon_state = "msai_greaser" + length = 2 chatname = "pompadour" msai_ears_housewife name = "M'sai Housewife" icon_state = "msai_housewife" + length = 2 chatname = "long mane" msai_ears_long name = "M'sai Long" icon_state = "msai_long" + length = 3 chatname = "long mane" msai_ears_messy name = "M'sai Messy" icon_state = "msai_messy" + length = 1 chatname = "messy mane" msai_ears_mohawk name = "M'sai Mohawk" icon_state = "msai_mohawk" + length = 1 chatname = "mohawk" msai_ears_plait name = "M'sai Plait" icon_state = "msai_plait" + length = 1 chatname = "braid" msai_ears_rattail name = "M'sai Rat Tail" icon_state = "msai_rattail" + length = 2 chatname = "thin ponytail" msai_ears_shaggy name = "M'sai Shaggy" icon_state = "msai_shaggy" + length = 1 chatname = "messy mane" msai_ears_straight name = "M'sai Straight" icon_state = "msai_straight" + length = 3 chatname = "short mane" msai_ears_spiky name = "M'sai Spiky" icon_state = "msai_spiky" + length = 1 chatname = "spiky mane" msai_ears_victory name = "M'sai Victory Curls" icon_state = "msai_victory" + length = 2 chatname = "curls" msai_ears_mane name = "M'sai Mane" icon_state = "msai_mane" + length = 3 gender = MALE chatname = "long mane" + msai_ears_sidepony + name = "M'sai Side Ponytail" + icon_state = "msai_sidepony" + length = 3 + chatname = "sideponytail" + + msai_ears_sideponyalt + name = "M'sai Side Ponytail Alt" + icon_state = "msai_sideponyalt" + length = 3 + chatname = "sideponytail" + + msai_ears_governmentman + name = "M'sai Government Man" + icon_state = "msai_gman" + length = 2 + chatname = "styled mane" + + msai_ears_bun + name = "M'sai Bun" + icon_state = "msai_bun" + length = 2 + chatname = "bun" + + taj_ears_smallbun + name = "M'sai Bun (Small)" + icon_state = "msai_bunsmall" + length = 2 + chatname = "bun" + + msai_ears_lowbun + name = "M'sai Bun (Low)" + icon_state = "msai_lowbun" + length = 2 + chatname = "bun" + + msai_ears_lowsmallbun + name = "M'sai Bun (Low, Small)" + icon_state = "msai_lowbunsmall" + length = 2 + chatname = "bun" + + msai_ears_shoulderlength + name = "M'sai Shoulderlength" + icon_state = "msai_shoulderlength" + length = 2 + chatname = "styled mane" + + msai_ears_shoulderlengthalt + name = "M'sai Shoulderlength Alt" + icon_state = "msai_shoulderlengthalt" + length = 2 + chatname = "styled mane" + + msai_ears_tresses + name = "M'sai Tresses" + icon_state = "msai_tresses" + length = 3 + chatname = "styled mane" + + msai_ears_tressesalt + name = "M'sai Tresses Alt" + icon_state = "msai_tressesalt" + length = 3 + chatname = "styled mane" + //vaurca antennae vaurca_classic icon = 'icons/mob/human_face/vaurca_hair.dmi' @@ -2783,22 +3124,62 @@ Follow by example and make good judgement based on length which list to include gender = NEUTER do_colouration = FALSE - diona_eye_trioptics + trioptics name = "Trioptics" icon_state = "trioptics" - diona_eye_lopsided + lopsided name = "Lopsided Eyes" icon_state = "lopsided" - diona_eye_helmethead + helmethead name = "Helmethead" icon_state = "helmethead" - diona_eye_eyestalk + eyestalk name = "Eyestalk" icon_state = "eyestalk" + treebeard + name = "Treebeard" + icon_state = "treebeard" + + bug_eyes + name = "Bug Eyes" + icon_state = "bugeyes" + + human_eyes + name = "Human Eyes" + icon_state = "humaneyes" + + skrell_eyes + name = "Skrell Eyes" + icon_state = "skrelleyes" + + skrell_eyes_2 + name = "Skrell Eyes 2" + icon_state = "skrelleyes2" + + tiny_eye + name = "Tiny Eye" + icon_state = "tinyeye" + + eyebrow + name = "Eyebrow" + icon_state = "eyebrow" + + blinkinghelmethead + name = "Blinking Helmethead" + icon_state = "blinkinghelmethead" + + periscope + name = "Periscope" + icon_state = "periscope" + + glorp + name = "Glorp" + icon_state = "glorp" + /* //////////////////////////// / =--------------------= / @@ -3494,71 +3875,11 @@ Follow by example and make good judgement based on length which list to include body_parts = list(BP_HEAD) species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/diona, /datum/species/machine/shell, /datum/species/skrell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi) - tiger_stripes - name = "Tiger Stripes (Tajara)" - icon_state = "tiger" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_GROIN) - species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi,/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_paw_socks - name = "Socks Coloration (Tajara)" - icon_state = "taj_pawsocks" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_pawsocks_alternate - name = "Socks Coloration (Tajara Alternate)" - icon_state = "taj_pawsocks_alternate" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_CHEST) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_gloves - name = "Socks Coloration (Gloves)" - icon_state = "taj_pawsocks" - body_parts = list(BP_L_HAND,BP_R_HAND) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_paws - name = "Socks Coloration (Paws)" - icon_state = "taj_pawsocks" - body_parts = list(BP_L_FOOT,BP_R_FOOT) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_glovesfull - name = "Socks Coloration (Full Gloves)" - icon_state = "taj_pawsocks" - body_parts = list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_pawsfull - name = "Socks Coloration (Full Paws)" - icon_state = "taj_pawsocks" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_glovesfull_alt - name = "Socks Coloration (Full Gloves Alt)" - icon_state = "taj_pawsocks_alternate" - body_parts = list(BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_pawsfull_alt - name = "Socks Coloration (Full Paws Alt)" - icon_state = "taj_pawsocks_alternate" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_glovesfull_alt2 - name = "Socks Coloration (Full Gloves Alt 2)" - icon_state = "taj_bellyhandsfeet_minor" - body_parts = list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_pawsfull_alt2 - name = "Socks Coloration (Full Paws Alt 2)" - icon_state = "taj_bellyhandsfeet_minor" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + backstripe + name = "Back Stripe" + icon_state = "backstripe" + body_parts = list(BP_CHEST) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/unathi,/datum/species/zombie/unathi) una_paw_socks name = "Socks Coloration (Unathi)" @@ -3567,156 +3888,18 @@ Follow by example and make good judgement based on length which list to include body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) - taj_belly_hands_feet_minor - name = "Hands,Feet,Belly Color (Minor)" - icon_state = "taj_bellyhandsfeet_minor" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_CHEST) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_belly_hands_feet_minor_female - name = "Hands,Feet,Belly Color (Female, Minor)" - icon_state = "taj_bellyhandsfeet_minor_female" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_CHEST) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_belly_male - name = "Belly Color (Male)" - icon_state = "taj_bellyhandsfeet_minor" - body_parts = list(BP_GROIN,BP_CHEST) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_belly_female - name = "Belly Color (Female)" - icon_state = "taj_bellyhandsfeet_minor_female" - body_parts = list(BP_GROIN,BP_CHEST) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_chest_male - name = "Chest,Belly Coloration (Male)" - icon_state = "taj_bellyhandsfeet" - body_parts = list(BP_GROIN,BP_CHEST) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_chest_female - name = "Chest,Belly Coloration (Female)" - icon_state = "taj_bellyhandsfeet_female" - body_parts = list(BP_GROIN,BP_CHEST) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_patches_full - name = "Color Patches (Full)" - icon_state = "taj_patches" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_CHEST,BP_GROIN) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_patches_leftleg - name = "Color Patches (Left Leg)" - icon_state = "taj_patches" - body_parts = list(BP_L_FOOT,BP_L_LEG) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_patches_rightleg - name = "Color Patches (Right Leg)" - icon_state = "taj_patches" - body_parts = list(BP_R_FOOT,BP_R_LEG) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_patches_leftarm - name = "Color Patches (Left Arm)" - icon_state = "taj_patches" - body_parts = list(BP_L_ARM,BP_L_HAND) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_patches_rightarm - name = "Color Patches (Right Arm)" - icon_state = "taj_patches" - body_parts = list(BP_R_ARM,BP_R_HAND) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_patches_chest - name = "Color Patches (Torso)" - icon_state = "taj_patches" - body_parts = list(BP_CHEST,BP_GROIN) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - patchesface - name = "Color Patches (Face)" - icon_state = "taj_patchesface" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - bands name = "Color Bands" icon_state = "bands" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_CHEST,BP_GROIN) species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) - bands_tajara - name = "Color Bands (Tajara)" - icon_state = "bands" - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_CHEST,BP_GROIN) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - bandsface name = "Color Bands (Face)" icon_state = "bandsface" body_parts = list(BP_HEAD) species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/unathi,/datum/species/zombie/unathi) - tigerhead - name = "Tiger Stripes (Head, Minor)" - icon_state = "tigerhead" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - tigerface - name = "Tiger Stripes (Head, Major)" - icon_state = "tigerface" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - backstripe - name = "Back Stripe" - icon_state = "backstripe" - body_parts = list(BP_CHEST) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/unathi,/datum/species/zombie/unathi) - - taj_nose - name = "Nose Color" - icon_state = "taj_nose" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_muzzle - name = "Muzzle Color" - icon_state = "taj_muzzle" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_muzzle_female - name = "Muzzle Color (Female)" - icon_state = "taj_muzzle_female" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_face_minor - name = "Cheeks Color (Minor)" - icon_state = "taj_face_minor" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_face - name = "Cheeks Color" - icon_state = "taj_face" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - - taj_all - name = "All Tajara Head" - icon_state = "taj_all" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) - una_face name = "Face Color" icon_state = "una_face" @@ -3792,54 +3975,149 @@ Follow by example and make good judgement based on length which list to include body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_GROIN,BP_HEAD) species_allowed = list(/datum/species/diona) - diona_thorns_head - name = "Diona Thorns (Head)" - icon = 'icons/mob/human_races/markings_diona.dmi' - icon_state = "diona_thorns" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/diona) + thorns_head + name = "Diona Thorns (Head)" + icon_state = "diona_thorns" + body_parts = list(BP_HEAD) - diona_thorns_torso - name = "Diona Thorns (Torso)" - icon = 'icons/mob/human_races/markings_diona.dmi' - icon_state = "diona_thorns" - body_parts = list(BP_CHEST) - species_allowed = list(/datum/species/diona) + thorns_torso + name = "Diona Thorns (Torso)" + icon_state = "diona_thorns" + body_parts = list(BP_CHEST) - diona_flowers_head - name = "Diona Flowers (Head)" - icon = 'icons/mob/human_races/markings_diona.dmi' - icon_state = "diona_flowers" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/diona) + flowers_head + name = "Diona Flowers (Head)" + icon_state = "diona_flowers" + body_parts = list(BP_HEAD) - diona_flowers_torso - name = "Diona Flowers (Torso)" - icon = 'icons/mob/human_races/markings_diona.dmi' - icon_state = "diona_flowers" - body_parts = list(BP_CHEST) - species_allowed = list(/datum/species/diona) + flowers_torso + name = "Diona Flowers (Torso)" + icon_state = "diona_flowers" + body_parts = list(BP_CHEST) - diona_moss - name = "Diona Moss" - icon = 'icons/mob/human_races/markings_diona.dmi' - icon_state = "diona_moss" - body_parts = list(BP_CHEST) - species_allowed = list(/datum/species/diona) + moss + name = "Diona Moss" + icon_state = "diona_moss" + body_parts = list(BP_CHEST) - diona_mushroom - name = "Diona Mushroom" - icon = 'icons/mob/human_races/markings_diona.dmi' - icon_state = "diona_mushroom" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/diona) + mushroom + name = "Diona Mushroom" + icon_state = "diona_mushroom" + body_parts = list(BP_HEAD) - diona_antennae - name = "Diona Antennae" - icon = 'icons/mob/human_races/markings_diona.dmi' - icon_state = "diona_antennae" - body_parts = list(BP_HEAD) - species_allowed = list(/datum/species/diona) + antennae + name = "Diona Antennae" + icon_state = "diona_antennae" + + bug_eyes + name = "Bug Eyes" + icon_state = "bugeyes" + body_parts = list(BP_HEAD) + do_colouration = FALSE + + human_eyes + name = "Human Eyes" + icon_state = "humaneyes" + + skrell_eyes + name = "Skrell Eyes" + icon_state = "skrelleyes" + + skrell_eyes_2 + name = "Skrell Eyes 2" + icon_state = "skrelleyes2" + + cat_ears + name = "Skrell Eyes 2" + icon_state = "skrelleyes2" + + horny + name = "Horny" + icon_state = "horny" + + treebeard + name = "Treebeard" + icon_state = "treebeard" + + tinyeye + name = "Tiny Eye" + icon_state = "tinyeye" + + eyebrow + name = "Eyebrow" + icon_state = "eyebrow" + + bullhorn + name = "Bullhorn" + icon_state = "bullhorn" + + mono_eye + name = "Mono Eye" + icon_state = "monoeye" + + trioptics + name = "Trioptics" + icon_state = "trioptics" + + lopsided + name = "Lopsided" + icon_state = "lopsided" + + helmethead + name = "Helmethead" + icon_state = "helmethead" + + eyestalk + name = "Eyestalk" + icon_state = "eyestalk" + + periscope + name = "Periscope" + icon_state = "periscope" + + glorp + name = "Glorp" + icon_state = "glorp" + + oak + name = "Oak" + icon_state = "oak" + + thorns + name = "Thorns" + icon_state = "thorns" + + stump + name = "Stump" + icon_state = "stump" + + pbody + name = "P-Body" + icon_state = "pbody" + body_parts = list(BP_CHEST) + do_colouration = FALSE + + blinking + name = "Blinking P-Body" + icon_state = "blinkingpbody" + + foot_eye + name = "Foot Eye" + icon_state = "footeye" + body_parts = list(BP_L_FOOT) + do_colouration = FALSE + + hand_eyes + name = "Hand Eyes" + icon_state = "handeye" + body_parts = list(BP_R_HAND, BP_L_HAND) + do_colouration = FALSE + + tail + name = "Tail" + icon_state = "dionatail" + body_parts = list(BP_GROIN) + do_colouration = FALSE //bishop bishop_lights @@ -3985,3 +4263,235 @@ Follow by example and make good judgement based on length which list to include name = "Xion - Lights Color" icon_state = "xion_lights" body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_HEAD) + +//Tajara + + taj_tigerstripes + name = "Tiger Stripes (Tajara)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "tiger" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_GROIN) + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi,/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_paw_socks + name = "Socks Coloration (Tajara)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_pawsocks" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_pawsocks_alternate + name = "Socks Coloration (Tajara Alternate)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_pawsocks_alternate" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_CHEST) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_gloves + name = "Socks Coloration (Gloves)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_pawsocks" + body_parts = list(BP_L_HAND,BP_R_HAND) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_paws + name = "Socks Coloration (Paws)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_pawsocks" + body_parts = list(BP_L_FOOT,BP_R_FOOT) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_glovesfull + name = "Socks Coloration (Full Gloves)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_pawsocks" + body_parts = list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_pawsfull + name = "Socks Coloration (Full Paws)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_pawsocks" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_glovesfull_alt + name = "Socks Coloration (Full Gloves Alt)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_pawsocks_alternate" + body_parts = list(BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_pawsfull_alt + name = "Socks Coloration (Full Paws Alt)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_pawsocks_alternate" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_glovesfull_alt2 + name = "Socks Coloration (Full Gloves Alt 2)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_bellyhandsfeet_minor" + body_parts = list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_pawsfull_alt2 + name = "Socks Coloration (Full Paws Alt 2)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_bellyhandsfeet_minor" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_bands + name = "Color Bands (Tajara)" + icon_state = "bands" + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_CHEST,BP_GROIN) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_tigerhead_veryminor + name = "Tiger Stripes (Head, Very Minor)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "tigerheadminor" + body_parts = list(BP_HEAD) + species_allowed = list(/datum/species/human, /datum/species/human/offworlder, /datum/species/diona, /datum/species/machine/shell, /datum/species/skrell, /datum/species/tajaran, /datum/species/tajaran/zhan_khazan, /datum/species/tajaran/m_sai, /datum/species/unathi) + + taj_tigerface + name = "Tiger Stripes (Head, Major)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "tigerface" + body_parts = list(BP_HEAD) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_nose + name = "Nose Color" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_nose" + body_parts = list(BP_HEAD) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_muzzle + name = "Muzzle Color" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_muzzle" + body_parts = list(BP_HEAD) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_muzzle_female + name = "Muzzle Color (Female)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_muzzle_female" + body_parts = list(BP_HEAD) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_face_minor + name = "Cheeks Color (Minor)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_face_minor" + body_parts = list(BP_HEAD) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_face + name = "Cheeks Color" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_face" + body_parts = list(BP_HEAD) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_all + name = "All Tajara Head" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_all" + body_parts = list(BP_HEAD) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_belly_hands_feet_minor + name = "Hands,Feet,Belly Color (Minor)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_bellyhandsfeet_minor" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_CHEST) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_belly_hands_feet_minor_female + name = "Hands,Feet,Belly Color (Female, Minor)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_bellyhandsfeet_minor_female" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_CHEST) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_belly_male + name = "Belly Color (Male)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_bellyhandsfeet_minor" + body_parts = list(BP_GROIN,BP_CHEST) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_belly_female + name = "Belly Color (Female)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_bellyhandsfeet_minor_female" + body_parts = list(BP_GROIN,BP_CHEST) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_chest_male + name = "Chest,Belly Coloration (Male)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_bellyhandsfeet" + body_parts = list(BP_GROIN,BP_CHEST) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_chest_female + name = "Chest,Belly Coloration (Female)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_bellyhandsfeet_female" + body_parts = list(BP_GROIN,BP_CHEST) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_patches_full + name = "Color Patches (Full)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_patches" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_CHEST,BP_GROIN) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_patches_leftleg + name = "Color Patches (Left Leg)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_patches" + body_parts = list(BP_L_FOOT,BP_L_LEG) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_patches_rightleg + name = "Color Patches (Right Leg)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_patches" + body_parts = list(BP_R_FOOT,BP_R_LEG) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_patches_leftarm + name = "Color Patches (Left Arm)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_patches" + body_parts = list(BP_L_ARM,BP_L_HAND) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_patches_rightarm + name = "Color Patches (Right Arm)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_patches" + body_parts = list(BP_R_ARM,BP_R_HAND) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_patches_chest + name = "Color Patches (Torso)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_patches" + body_parts = list(BP_CHEST,BP_GROIN) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) + + taj_patchesface + name = "Color Patches (Face)" + icon = "icons/mob/human_races/markings_tajara.dmi" + icon_state = "taj_patchesface" + body_parts = list(BP_HEAD) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) diff --git a/code/modules/mob/abstract/observer/observer.dm b/code/modules/mob/abstract/observer/observer.dm index f2534cc6daf..1e1939c6878 100644 --- a/code/modules/mob/abstract/observer/observer.dm +++ b/code/modules/mob/abstract/observer/observer.dm @@ -311,6 +311,20 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp medHUD = 1 to_chat(src, "Medical HUD Enabled") +/mob/abstract/observer/verb/scan_target() + set category = "Ghost" + set name = "Medical Scan Target" + set desc = "Analyse the health of whatever you are following." + + if(!following) + to_chat(src, SPAN_WARNING("You aren't following anything!")) + return + + if(ishuman(following)) + health_scan_mob(following, usr, TRUE, TRUE) + else + to_chat(src, SPAN_WARNING("This isn't a scannable target.")) + /mob/abstract/observer/verb/toggle_antagHUD() set category = "Ghost" set name = "Toggle AntagHUD" @@ -380,14 +394,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp stop_following() usr.forceMove(pick(L)) -/mob/abstract/observer/verb/follow(input in getmobs()) +/mob/abstract/observer/verb/follow() set category = "Ghost" set name = "Follow" // "Haunt" set desc = "Follow and haunt a mob." - var/target = getmobs()[input] - if(!target) return - ManualFollow(target) + var/datum/vueui_module/ghost_menu/GM = new /datum/vueui_module/ghost_menu(usr) + GM.ui_interact(usr) // This is the ghost's follow verb with an argument /mob/abstract/observer/proc/ManualFollow(var/atom/movable/target) @@ -953,3 +966,8 @@ mob/abstract/observer/MayRespawn(var/feedback = 0, var/respawn_type = null) if(SSpai.revokeCandidancy(src)) to_chat(src, "You have been removed from the pAI candidate pool.") + +/mob/abstract/observer/can_hear_radio(speaker_coverage = list()) + if(client && (client.prefs.toggles & CHAT_GHOSTRADIO)) + return TRUE + return ..() \ No newline at end of file diff --git a/code/modules/mob/abstract/observer/say.dm b/code/modules/mob/abstract/observer/say.dm index 302d4c98845..4c0225d1bb7 100644 --- a/code/modules/mob/abstract/observer/say.dm +++ b/code/modules/mob/abstract/observer/say.dm @@ -1,6 +1,4 @@ /mob/abstract/observer/say(var/message) - message = sanitize(message) - if (!message) return diff --git a/code/modules/mob/abstract/unauthed/login.dm b/code/modules/mob/abstract/unauthed/login.dm index 020340dcb06..b319c2f36c1 100644 --- a/code/modules/mob/abstract/unauthed/login.dm +++ b/code/modules/mob/abstract/unauthed/login.dm @@ -11,6 +11,8 @@ /mob/abstract/unauthed/LateLogin() SHOULD_CALL_PARENT(FALSE) + client.chatOutput.start() //We have to unfortunately put this here too since the LateLogin chains are disconnected. + update_Login_details() to_chat(src, "You need to authenticate before you can continue.") token = md5("[client.ckey][client.computer_id][world.time][rand()]") @@ -23,7 +25,7 @@ uihtml += "Login via forums" if(!config.guests_allowed && config.webint_url && config.external_auth) src.OpenForumAuthWindow() - show_browser(src, uihtml, "window=auth;size=300x300;border=0;can_close=0;can_resize=0;can_minimize=0;titlebar=1") + show_browser(src, uihtml, "window=externalauth;size=300x300;border=0;can_close=1;can_resize=0;can_minimize=0;titlebar=1") timeout_timer = addtimer(CALLBACK(src, .proc/timeout), 900, TIMER_STOPPABLE) /mob/abstract/unauthed/proc/timeout() @@ -38,7 +40,7 @@ deltimer(timeout_timer) var/client/c = client // so we don't lose the client in the current mob. - show_browser(src, null, "window=auth;") + show_browser(src, null, "window=externalauth") c.verbs += typesof(/client/verb) // Let's return regular client verbs c.authed = TRUE // We declare client as authed now c.prefs = null //Null them so we can load them from the db again for the correct ckey diff --git a/code/modules/mob/floating_messages.dm b/code/modules/mob/floating_messages.dm index 311f9fac99c..7b612bcea12 100644 --- a/code/modules/mob/floating_messages.dm +++ b/code/modules/mob/floating_messages.dm @@ -4,7 +4,13 @@ var/list/floating_chat_colors = list() /atom/movable var/list/stored_chat_text -/atom/movable/proc/animate_chat(message, datum/language/language, small, list/show_to, duration) +/atom/movable/proc/get_floating_chat_color() + return get_random_colour(0, 160, 230) + +/atom/movable/proc/set_floating_chat_color(color) + floating_chat_colors[name] = color + +/atom/movable/proc/animate_chat(message, datum/language/language, small, list/show_to, duration, override_color) set waitfor = FALSE var/style //additional style params for the message @@ -21,7 +27,7 @@ var/list/floating_chat_colors = list() message = "[copytext(message, 1, limit)]..." if(!floating_chat_colors[name]) - floating_chat_colors[name] = get_random_colour(0, 160, 230) + floating_chat_colors[name] = get_floating_chat_color() style += "color: [floating_chat_colors[name]];" // create 2 messages, one that appears if you know the language, and one that appears when you don't know the language @@ -44,14 +50,15 @@ var/list/floating_chat_colors = list() C.images += gibberish /proc/generate_floating_text(atom/movable/holder, message, style, size, duration, show_to) - var/image/I = image(null, recursive_loc_turf_check(holder)) + var/atom/movable/attached_holder = recursive_loc_turf_check(holder) + var/image/I = image(null, attached_holder) I.layer = FLY_LAYER I.alpha = 0 I.maptext_width = 80 I.maptext_height = 64 I.plane = FLOAT_PLANE I.layer = HUD_LAYER - 0.01 - I.pixel_x = (-round(I.maptext_width/2) + 16) + holder.get_floating_chat_x_offset() + I.pixel_x = (-round(I.maptext_width/2) + 16) + attached_holder.get_floating_chat_x_offset() I.appearance_flags = RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM style = "font-family: 'Small Fonts'; -dm-text-outline: 1 black; font-size: [size]px; [style]" diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index b7ec8cef3db..d510386d1f9 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -21,7 +21,7 @@ italics = 1 sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact - if((sleeping && !vr_mob) || stat == 1) + if(!vr_mob && (sleeping || stat == UNCONSCIOUS)) hear_sleep(message) return @@ -127,7 +127,7 @@ if(!client && !vr_mob) return - if((sleeping && !vr_mob) || stat==1) //If unconscious or sleeping + if(!vr_mob && (sleeping || stat == UNCONSCIOUS)) hear_sleep(message) return @@ -244,12 +244,9 @@ return "\[[worldtime2text()]\]" /mob/proc/on_hear_radio(part_a, speaker_name, track, part_b, formatted, accent_icon) - var/accent_tag - if(accent_icon) - accent_tag = "" to_chat(src, "[part_a][speaker_name][part_b][formatted]") if(vr_mob) - to_chat(vr_mob, "[part_a][accent_tag][speaker_name][part_b][formatted]") + to_chat(vr_mob, "[part_a][speaker_name][part_b][formatted]") /mob/abstract/observer/on_hear_radio(part_a, speaker_name, track, part_b, formatted) to_chat(src, "[track][part_a][speaker_name][part_b][formatted]") @@ -266,21 +263,23 @@ if(vr_mob) to_chat(vr_mob, "[time][part_a][track][part_b][formatted]") -/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null) +/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null, var/list/sign_adv_length = null) if(!client || !speaker) return if(say_understands(speaker, language)) message = "[speaker] [verb], \"[message]\"" else + if (length(sign_adv_length) <= 4) + sign_adv_length = list(" briefly", " a short message", " a message", " a lengthy message", " a very lengthy message") var/adverb var/length = length(message) * pick(0.8, 0.9, 1.0, 1.1, 1.2) //Inserts a little fuzziness. switch(length) - if(0 to 12) adverb = " briefly" - if(12 to 30) adverb = " a short message" - if(30 to 48) adverb = " a message" - if(48 to 90) adverb = " a lengthy message" - else adverb = " a very lengthy message" + if(0 to 12) adverb = sign_adv_length[1] + if(12 to 30) adverb = sign_adv_length[2] + if(30 to 48) adverb = sign_adv_length[3] + if(48 to 90) adverb = sign_adv_length[4] + else adverb = sign_adv_length[5] message = "[speaker] [verb][adverb]." if(src.status_flags & PASSEMOTES) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 167eb194305..f6c9ac57b2b 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -623,6 +623,14 @@ var/list/holder_mob_icon_cache = list() icon_state = "rabbit_rest" item_state = "rabbit" +/obj/item/holder/pai/parrot + icon_state = "parrot_rest" + item_state = "parrot" + +/obj/item/holder/pai/fox + icon_state = "fox_rest" + item_state = "fox" + /obj/item/holder/pai/custom var/customsprite = 1 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index ae9123dfbce..f41357fd6d0 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -38,8 +38,7 @@ //This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on whether you can or can't eqip need to be done before! Use mob_can_equip() for that task. //In most cases you will want to use equip_to_slot_if_possible() /mob/proc/equip_to_slot(obj/item/W, slot, redraw_mob, assisted_equip) - W.on_slotmove(src) - return + W.on_slotmove(src, slot) //This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the rounds tarts and when events happen and such. /mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot) @@ -199,17 +198,17 @@ var/list/slot_equipment_priority = list( \ //Drops the item in our active hand. TODO: rename this to drop_active_hand or something /mob/proc/drop_item(var/atom/Target) - var/obj/item/item_dropped = null + var/obj/item/item_dropped = null - if (hand) - item_dropped = l_hand - . = drop_l_hand(Target) - else - item_dropped = r_hand - . = drop_r_hand(Target) + if (hand) + item_dropped = l_hand + . = drop_l_hand(Target) + else + item_dropped = r_hand + . = drop_r_hand(Target) - if (istype(item_dropped) && !QDELETED(item_dropped)) - addtimer(CALLBACK(src, .proc/make_item_drop_sound, item_dropped), 1) + if (istype(item_dropped) && !QDELETED(item_dropped)) + addtimer(CALLBACK(src, .proc/make_item_drop_sound, item_dropped), 1) /mob/proc/make_item_drop_sound(obj/item/I) if(QDELETED(I)) @@ -343,7 +342,6 @@ var/list/slot_equipment_priority = list( \ if(!item) return - var/can_throw = TRUE if(istype(item, /obj/item/grab)) var/obj/item/grab/G = item item = G.throw_held() //throw the person instead of the grab @@ -366,13 +364,30 @@ var/list/slot_equipment_priority = list( \ qdel(G) else - can_throw = FALSE + return - if(!item || !can_throw) + if(!item) return //Grab processing has a chance of returning null - src.remove_from_mob(item) - item.loc = src.loc + if(a_intent == I_HELP && Adjacent(target) && isitem(item)) + var/obj/item/I = item + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(H.in_throw_mode && H.a_intent == I_HELP && unEquip(I)) + I.on_give(src, target) + if(!QDELETED(I)) // if on_give deletes the item, we don't want runtimes below + H.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. + visible_message("[src] hands \the [H] \a [I].", SPAN_NOTICE("You give \the [target] \a [I].")) + else + to_chat(src, SPAN_NOTICE("You offer \the [I] to \the [target].")) + do_give(H) + return + remove_from_mob(I) + make_item_drop_sound(I) + I.forceMove(get_turf(target)) + return + + remove_from_mob(item) if(is_pacified()) to_chat(src, "You set [item] down gently on the ground.") @@ -399,6 +414,12 @@ var/list/slot_equipment_priority = list( \ drop_from_inventory(entry) qdel(entry) +/mob/proc/get_covering_equipped_items(var/body_parts) + . = list() + for(var/entry in get_equipped_items()) + var/obj/item/I = entry + if(I.body_parts_covered & body_parts) + . += I /mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE) var/datum/outfit/O = null diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index fca561e203c..7be04cc94c5 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -36,9 +36,12 @@ // Galactic common languages (systemwide accepted standards). /datum/language/trader name = LANGUAGE_TRADEBAND + short = "TRADE" desc = "Descended from latin and romance languages of old Earth, Tradeband remains the main tongue of the upper class of humanity. The language sounds elegant and well structured to most ears. It remains in popular use with traders, diplomats, and those seeking to hold onto a piece of a romantic past." speech_verb = list("enunciates") - colour = "say_quote" + sing_verb = list("performs") + colour = "tradeband" + written_style = "tradeband" key = "2" flags = TCOMSSIM allow_accents = TRUE @@ -53,9 +56,12 @@ // Criminal language. /datum/language/gutter name = LANGUAGE_GUTTER + short = "FREE" desc = "A language of renegades and frontiersmen descending from various languages from Earth like Hindi combined into a multi-rooted jumble that sounds incoherent or even barbarian to non-native speakers. This language is the only common cultural identity for humans in the frontier. Speaking this language in itself boldly declares the speaker a free spirit. Often called 'Gutter' by Alliance citizens." - speech_verb = list("growls") - colour = "rough" + speech_verb = list("says") + sing_verb = list("croons") + colour = "freespeak" + written_style = "freespeak" key = "3" flags = TCOMSSIM allow_accents = TRUE @@ -72,6 +78,7 @@ desc = "A signed version of Ceti Basic, though its intent is primarily to help out people who are deaf and mute, " speech_verb = list("signs") signlang_verb = list("signs", "gestures") + sing_verb = null colour = "i" key = "4" flags = NO_STUTTER|SIGNLANG @@ -90,7 +97,8 @@ ask_verb = list("mumbles") whisper_verb = list("mutters") exclaim_verb = list("screams incoherently") - key = "i" + sing_verb = list("gibbers") + key = "gi" syllables = list("m","n","gh","h","l","s","r","a","e","i","o","u") space_chance = 20 flags = RESTRICTED diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 7ebb30a4bd8..e1b9b7893d0 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -6,6 +6,7 @@ /datum/language var/name = "an unknown language" // Fluff name of language if any. + var/short // a shortened name, for use when languages need to be identified var/desc = "A language." // Short description for 'Check Languages'. var/list/speech_verb = list("says") // 'says', 'hisses', 'farts'.) var/list/ask_verb = list("asks") // Used when sentence ends in a ? @@ -13,7 +14,10 @@ var/list/shout_verb = list("shouts", "yells", "screams") //Used when a sentence ends in !! var/list/whisper_verb = list("says quietly", "says softly", "whispers") // Optional. When not specified speech_verb + quietly/softly is used instead. var/list/signlang_verb = list("signs") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags + var/list/sing_verb = list("sings") + var/list/sign_adv_length = list(" briefly", " a short message", " a message", " a lengthy message", " a very lengthy message") // 5 messages changing depending on the length of the signed language. A space should be added before the sentence as shown var/colour = "body" // CSS style to use for strings in this language. + var/written_style // CSS style used when writing language down, can't be written if null var/key = "x" // Character used to speak in language eg. :o for Unathi. var/flags = 0 // Various language flags. var/native // If set, non-native speakers will have trouble speaking. @@ -23,6 +27,7 @@ var/machine_understands = TRUE // Whether machines can parse and understand this language var/allow_accents = FALSE var/always_parse_language = FALSE // forces the language to parse for language keys even when a default is set + var/list/scramble_cache = list() // A map of unscrambled words -> scrambled words, for scrambling. /datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4, syllable_divisor=2) if(!syllables || !syllables.len) @@ -42,9 +47,6 @@ return "[trim(full_name)]" -/datum/language - var/list/scramble_cache = list() - /datum/language/proc/scramble(var/input, var/list/known_languages) var/understand_chance = 0 @@ -52,6 +54,8 @@ if(LAZYACCESS(partial_understanding, L.name)) understand_chance += partial_understanding[L.name] + var/static/list/music_notes = list("\u2669", "\u266A", "\u266B") + var/list/words = splittext(input, " ") var/list/scrambled_text = list() var/new_sentence = 0 @@ -59,7 +63,7 @@ var/nword = "[w] " var/input_ending = copytext(w, length(w)) var/ends_sentence = findtext(".?!",input_ending) - if(!prob(understand_chance)) + if(!prob(understand_chance) && !(w in music_notes)) nword = scramble_word(w) if(new_sentence) nword = capitalize(nword) @@ -152,8 +156,10 @@ /datum/language/proc/check_special_condition(var/mob/other) return 1 -/datum/language/proc/get_spoken_verb(var/msg_end, var/pre_end) +/datum/language/proc/get_spoken_verb(var/msg_end, var/pre_end, var/singing = FALSE) var/chosen_verb = speech_verb + if(singing) + return pick(sing_verb) switch(msg_end) if("!") if(pre_end == "!" || pre_end == "?") @@ -224,6 +230,8 @@ for(var/datum/language/L in languages) if(!(L.flags & NONGLOBAL)) dat += "[L.name] ([get_language_prefix()][L.key])
    [L.desc]

    " + if(L.written_style) + dat += "You can write in this language on papers by writing \[lang=[L.key]\]YourTextHere\[/lang\].

    " src << browse(dat, "window=checklanguage") return @@ -240,6 +248,8 @@ dat += "[L.name] ([get_language_prefix()][L.key]) - default - reset
    [L.desc]

    " else dat += "[L.name] ([get_language_prefix()][L.key]) - set default
    [L.desc]

    " + if(L.written_style) + dat += "You can write in this language on papers by writing \[lang=[L.key]\]YourTextHere\[/lang\].

    " src << browse(dat, "window=checklanguage") diff --git a/code/modules/mob/language/monkey.dm b/code/modules/mob/language/monkey.dm index f59174e439d..5f5e62ad724 100644 --- a/code/modules/mob/language/monkey.dm +++ b/code/modules/mob/language/monkey.dm @@ -4,7 +4,8 @@ speech_verb = list("chimpers") ask_verb = list("chimpers") exclaim_verb = list("screeches") - key = "6" + sing_verb = list("belts out") + key = "ch" machine_understands = FALSE flags = RESTRICTED diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index b060f549d3d..0c9e11aca18 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -2,6 +2,7 @@ name = LANGUAGE_CHANGELING desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance." speech_verb = list("says") + sing_verb = list("choruses") colour = "changeling" key = "g" flags = RESTRICTED | HIVEMIND @@ -50,6 +51,7 @@ speech_verb = list("intones") ask_verb = list("intones") exclaim_verb = list("chants") + sing_verb = list("chants") colour = "cult" key = "f" flags = RESTRICTED @@ -75,6 +77,7 @@ speech_verb = list("intones") ask_verb = list("intones") exclaim_verb = list("chants") + sing_verb = list("chants") colour = "cult" key = "y" flags = RESTRICTED | HIVEMIND @@ -85,8 +88,9 @@ speech_verb = list("buzzes") ask_verb = list("buzzes") exclaim_verb = list("buzzes") + sing_verb = list("buzzes") colour = "bad" - key = "#" + key = "hd" flags = RESTRICTED | HIVEMIND syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz") space_chance = 10 @@ -100,6 +104,7 @@ speech_verb = list("gargles") ask_verb = list("gags") exclaim_verb = list("retches") + sing_verb = list("trills") colour = "revenant" key = "c" syllables = list("grhhg", "ghrohg", "grgugh", "grrhh", "hghh", "rghghh", "gghhh", "ggrh", "aghrh") diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 229073e6fc4..02c2764c809 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -4,6 +4,7 @@ speech_verb = list("creaks and rustles") ask_verb = list("creaks") exclaim_verb = list("rustles") + sing_verb = list("croaks") colour = "soghun" key = "q" flags = RESTRICTED|TCOMSSIM @@ -20,13 +21,18 @@ return new_name + +// Unathi languages /datum/language/unathi name = LANGUAGE_UNATHI + short = "UNA" desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi." speech_verb = list("hisses") ask_verb = list("hisses") exclaim_verb = list("roars") + sing_verb = list("hisses") colour = "soghun" + written_style = "sintaunathi" key = "o" flags = WHITELISTED|TCOMSSIM allow_accents = TRUE @@ -43,14 +49,34 @@ partial_understanding = list(LANGUAGE_AZAZIBA = 25) allow_accents = TRUE +/datum/language/unathi_azaziba + name = LANGUAGE_AZAZIBA + short = "AZA" + desc = "A language of Moghes consisting of a combination of spoken word and gesticulation. While waning since Moghes entered the galactic stage, it enjoys popular use by Unathi that never fell to the Hegemony's cultural dominance." + speech_verb = list("hisses") + ask_verb = list("hisses") + exclaim_verb = list("roars") + signlang_verb = list("signs", "gestures aggressively") + sing_verb = list("hisses") + colour = "soghun_alt" + written_style = "sintaazaziba" + key = "p" + flags = WHITELISTED | NONVERBAL + syllables = list("azs","zis","zau","azua","skiu","zuakz","izo","aei","ki","kut","zo") + partial_understanding = list(LANGUAGE_UNATHI = 50) + allow_accents = TRUE + // tajaran languages /datum/language/tajaran name = LANGUAGE_SIIK_MAAS + short = "MAAS" desc = "The traditionally employed tongue of Adhomai, composed of expressive yowls and chirps. Native to the Tajara." speech_verb = list("mrowls") ask_verb = list("mrowls") exclaim_verb = list("yowls") + sing_verb = list("mrowmbles") colour = "tajaran" + written_style = "siikmaas" key = "j" flags = WHITELISTED|TCOMSSIM syllables = list("mrr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr", @@ -75,7 +101,9 @@ name = LANGUAGE_SIGN_TAJARA desc = "A sign language developed by Adhomai hunters" speech_verb = list("signs") - signlang_verb = list("signs", "flicks their ears", "gestures") + signlang_verb = list("moves their tail", "flicks their ears", "swivels their ears", "flicks their tail", "shifts their ears and tail") + sign_adv_length = list("", " briefly", " a few times", " several times in quick succession", " for a while") + sing_verb = null colour = "i" key = "i" flags = NO_STUTTER | SIGNLANG | WHITELISTED @@ -87,7 +115,9 @@ speech_verb = list("mrowls") ask_verb = list("mrowls") exclaim_verb = list("yowls") - signlang_verb = list("signs", "flicks their ears", "gestures") + signlang_verb = list("moves their tail", "flicks their ears", "swivels their ears", "flicks their tail", "shifts their ears and tail") + sign_adv_length = list("", " briefly", " a few times", " several times in quick succession", " for a while") + sing_verb = list("mrowmbles") colour = "tajaran_signlang" key = "w" flags = WHITELISTED | NONVERBAL @@ -99,11 +129,14 @@ /datum/language/yassa name = LANGUAGE_YA_SSA + short = "YAS" desc = "The traditional language of the tajaran nobility." speech_verb = list("mrowls") ask_verb = list("mrowls") exclaim_verb = list("yowls") + sing_verb = list("mrowmbles") colour = "yassa" + written_style = "yassa" key = "r" flags = WHITELISTED|TCOMSSIM syllables = list("hrr","rhr","tarj","khir","rajh","kir","mier","kre","ahek","nlhal","veh","khaz","dri","rhan","darrer", @@ -115,11 +148,14 @@ /datum/language/delvahhi name = LANGUAGE_DELVAHII + short = "DEL" desc = "A dialect developed by the Zhan-Khazan communities, commonly used in religious ceremonies dedicated to the Snow God and amongst settlements comprised mostly of Zhan-Khazan." speech_verb = list("mrowls") ask_verb = list("mrowls") exclaim_verb = list("yowls") + sing_verb = list("mrowmbles") colour = "delvahhi" + written_style = "delvahhi" key = "n" flags = WHITELISTED|TCOMSSIM syllables = list("mrr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr", @@ -131,11 +167,14 @@ /datum/language/skrell name = LANGUAGE_SKRELLIAN + short = "NRAL" desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans." speech_verb = list("warbles") ask_verb = list("warbles") exclaim_verb = list("warbles") + sing_verb = list("warbles") colour = "skrell" + written_style = "nralmalic" key = "k" flags = WHITELISTED|TCOMSSIM syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!") @@ -233,8 +272,10 @@ /datum/language/human name = LANGUAGE_SOL_COMMON + short = "SOL" desc = "With its roots in Mandarin Chinese, Common evolved as the official language of the Sol Alliance, with officials working to tie it together with a common tongue. It's spoken by state officials, taught in schools, and spoken by those who either feel a sense of national pride in the Alliance or otherwise fell sway to the culture." colour = "solcom" + written_style = "solcommon" key = "1" flags = WHITELISTED | TCOMSSIM syllables = list("a", "abe", "ade", "ai", "an", "ana", "ba", "bae", "bai", "bang", "bao", "bei", "ben", "beo", "bi", "bian", "bing", "bo", "bu", "bugu", "bun", "cai", "can", "cao", "cau", "chan", "chen", "cheong", @@ -259,11 +300,14 @@ /datum/language/machine name = LANGUAGE_EAL + short = "EAL" desc = "A language of encoded tones that allow for IPCs to communicate auditorily between each other in a manner that allows for easier transfer of information." speech_verb = list("beeps") ask_verb = list("beeps") exclaim_verb = list("loudly beeps") + sing_verb = list("rhythmically beeps") colour = "changeling" + written_style = "encodedaudiolanguage" key = "6" flags = RESTRICTED | NO_STUTTER | TCOMSSIM syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz") @@ -273,16 +317,3 @@ if(prob(70)) return "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" return pick(ai_names) - -/datum/language/unathi_azaziba - name = LANGUAGE_AZAZIBA - desc = "A language of Moghes consisting of a combination of spoken word and gesticulation. While waning since Moghes entered the galactic stage, it enjoys popular use by Unathi that never fell to the Hegemony's cultural dominance." - speech_verb = list("hisses") - ask_verb = list("hisses") - exclaim_verb = list("roars") - signlang_verb = list("signs", "gestures aggressively") - colour = "soghun_alt" - key = "p" - flags = WHITELISTED | NONVERBAL - syllables = list("azs","zis","zau","azua","skiu","zuakz","izo","aei","ki","kut","zo") - partial_understanding = list(LANGUAGE_UNATHI = 50) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index cb5d4a3c50b..b765abc3885 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -164,8 +164,6 @@ /mob/living/bot/say(var/message) var/verb = "beeps" - message = sanitize(message) - ..(message, null, verb) /mob/living/bot/Collide(atom/A) diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index 5c26565ccbf..07abf6bb831 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -322,7 +322,7 @@ return 1 if(2) - if(istype(W, /obj/item/clothing/suit/storage/vest)) + if(istype(W, /obj/item/clothing/accessory/armor_plate)) user.drop_from_inventory(W,get_turf(src)) qdel(W) build_step++ @@ -338,7 +338,7 @@ if(WT.remove_fuel(0, user)) build_step++ name = "shielded frame assembly" - to_chat(user, "You welded the vest to [src].") + to_chat(user, "You welded the armor to [src].") return 1 if(4) if(istype(W, /obj/item/clothing/head/helmet)) @@ -377,7 +377,7 @@ return if(7) - if(istype(W, /obj/item/gun/energy/taser)) + if(istype(W, /obj/item/gun/energy/disruptorpistol)) name = "taser ED-209 assembly" build_step++ to_chat(user, "You add [W] to [src].") diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 46c095f36ba..1bc19a001d4 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -143,11 +143,11 @@ path = list() target = null else - if(path.len && frustration < 5) + if(length(path) && frustration < 5) if(path[1] == loc) path -= path[1] - if (path.len) + if(length(path)) var/t = step_towards(src, path[1]) if(t) path -= path[1] @@ -167,16 +167,24 @@ target = tray frustration = 0 break + if(target) //We found a tray we can do something to. Set path to there. + pathfind(target) + return if(check_tank()) for(var/obj/structure/sink/source in view(7, src)) - target = source - frustration = 0 - break - if(target) - var/t = get_dir(target, src) // Turf with the tray is impassable, so a* can't navigate directly to it - path = AStar(loc, get_step(target, t), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) - if(!path) - path = list() + if(pathfind(source)) //If we can find a valid path to this sink, it's our target + target = source + frustration = 0 + break + + +/mob/living/bot/farmbot/proc/pathfind(var/atom/A) + var/t = get_dir(A, src) // Turf with the tray is impassable, so a* can't navigate directly to it + path = AStar(loc, get_step(A, t), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) + if(!path) + path = list() + return FALSE + return path /mob/living/bot/farmbot/UnarmedAttack(var/atom/A, var/proximity) . = ..() diff --git a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm index 5cfbe095d35..9daf5aadea1 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm @@ -94,6 +94,8 @@ flower_color = get_random_colour(1) . = ..(mapload) //species = all_species[] + ingested = new /datum/reagents/metabolism(500, src, CHEM_INGEST) + reagents = ingested set_species(SPECIES_DIONA) setup_dionastats() eat_types |= TYPE_ORGANIC diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm index 32d2be1b3d0..0357fbdd343 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm @@ -52,6 +52,7 @@ to_chat(src, SPAN_NOTICE("You feel your being twine with that of \the [H] as you merge with its biomass.")) for(var/obj/O in src.contents) drop_from_inventory(O) + hat = null src.forceMove(H) else to_chat(src, SPAN_WARNING("Something went wrong while trying to merge into [H], cancelling.")) @@ -124,6 +125,7 @@ to_chat(src, SPAN_NOTICE("You feel your being entwine with that of \the [D] as it merges with your biomass.")) for(var/obj/O in D.contents) D.drop_from_inventory(O) + D.hat = null D.forceMove(src) D.stat = CONSCIOUS status_flags |= PASSEMOTES diff --git a/code/modules/mob/living/carbon/alien/diona/life.dm b/code/modules/mob/living/carbon/alien/diona/life.dm index 5ba9787efb6..d70a789d263 100644 --- a/code/modules/mob/living/carbon/alien/diona/life.dm +++ b/code/modules/mob/living/carbon/alien/diona/life.dm @@ -14,6 +14,12 @@ if(touching) touching.metabolize() if(bloodstr) bloodstr.metabolize() if(breathing) breathing.metabolize() + if(ingested) ingested.metabolize() + + for(var/_R in chem_doses) + if ((_R in bloodstr.reagent_volumes) || (_R in ingested.reagent_volumes) || (_R in breathing.reagent_volumes) || (_R in touching.reagent_volumes)) + continue + chem_doses -= _R //We're no longer metabolizing this reagent. Remove it from chem_doses // nutrition decrease if(nutrition > 0 && stat != DEAD) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 50060bed34a..df2e5766157 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -1,26 +1,14 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/obj/item/device/mmi/digital/Initialize(mapload, ...) - . = ..() - src.brainmob = new(src) - brainmob.add_language(LANGUAGE_EAL) - src.brainmob.stat = CONSCIOUS - src.brainmob.container = src - src.brainmob.silent = 0 - -/obj/item/device/mmi/digital/transfer_identity(var/mob/living/carbon/H) - brainmob.dna = H.dna - brainmob.timeofhostdeath = H.timeofdeath - brainmob.stat = 0 - if(H.mind) - H.mind.transfer_to(brainmob) - return +#define STATE_EMPTY 0 // empty cradle +#define STATE_BRAIN 1 // brain in the cradle +#define STATE_NODIODES 2 // brain enclosed but no diodes connected +#define STATE_DIODES 3 // brain gets prepared at this step +#define STATE_SEALED 4 // sealed and fully operation /obj/item/device/mmi name = "man-machine interface" - desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity." + desc = "The delicate nature of organic brains required a more novel and permanent solution to the problem of just rotting in the old MMI cradles. Zeng-Hu's unique (and very proprietary) formaldehyde-analogue preservation solution was the key ingredient in what became the new Zeng-Hu/Hephaestus joint venture brain-cases." icon = 'icons/obj/assemblies.dmi' - icon_state = "mmi_empty" + icon_state = "mmi-empty" w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_BIO = 3) @@ -28,109 +16,195 @@ //Revised. Brainmob is now contained directly within object of transfer. MMI in this case. - var/locked = FALSE + var/memory_suppression = TRUE + var/extra_examine_info = null + + var/cradle_state = STATE_EMPTY var/can_be_ipc = FALSE - var/mob/living/carbon/brain/brainmob = null//The current occupant. + var/mob/living/carbon/brain/brainmob = null //The current occupant. var/obj/item/organ/internal/brain/brainobj = null //The current brain organ. - attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O,/obj/item/organ/internal/brain) && !brainmob) //Time to stick a brain in it --NEO - var/obj/item/organ/internal/brain/B = O - if(!B.can_lobotomize) - to_chat(user, "\The [B] is incompatible with [src]!") - return - if(B.health <= 0) - to_chat(user, "That brain is well and truly dead.") - return - else if(!B.lobotomized && B.can_lobotomize) - to_chat(user, "The brain won't fit until you perform a lobotomy!") - return - else if(!B.brainmob) - to_chat(user, "You aren't sure where this brain came from, but you're pretty sure it's a useless brain.") + var/static/list/valid_brain_icon_states = list("brain", "brain_skrell", "brain_vaurca") + +/obj/item/device/mmi/Initialize() + . = ..() + set_cradle_state(STATE_EMPTY) + +/obj/item/device/mmi/update_icon() + underlays = null + switch(cradle_state) // there's probably a way to optimize this to not need to regenerate the image, but this'll happen once a round every month or so? no reason to. + if(STATE_EMPTY) + icon_state = "mmi-empty" + if(STATE_BRAIN) + icon_state = "mmi-brain" + underlays += image(icon, null, (brainobj.icon_state in valid_brain_icon_states) ? brainobj.icon_state : "brain") + if(STATE_NODIODES) + icon_state = "mmi-nodiodes" + underlays += image(icon, null, (brainobj.icon_state in valid_brain_icon_states) ? brainobj.icon_state : "brain") + if(STATE_DIODES) + icon_state = "mmi-diodes" + underlays += image(icon, null, (brainobj.icon_state in valid_brain_icon_states) ? brainobj.icon_state : "brain") + if(STATE_SEALED) + icon_state = "mmi-sealedon" + +/obj/item/device/mmi/proc/update_name() + if(brainmob) + name = "[initial(name)]: [brainmob.real_name]" + else + name = initial(name) + +/obj/item/device/mmi/proc/set_cradle_state(var/new_state) + cradle_state = new_state + switch(cradle_state) + if(STATE_EMPTY) + extra_examine_info = "The braincase is empty, place a brain into it to begin." + if(STATE_BRAIN) + extra_examine_info = "The braincase has a brain in it, use it in-hand to flip the case over and proceed, or click on it while it's in your inactive hand to remove the brain." + if(STATE_NODIODES) + extra_examine_info = "The braincase has a brain in it and the case is flipped over, use a screwdriver in it to drive the memory suppression diodes into the brain, or use it in-hand to flip the case back and prepare the brain for removal." + if(STATE_DIODES) + extra_examine_info = "The braincase's memory suppression diodes have been inserted, use a welding tool on it to seal it permanently and prepare it for use, or use a screwdriver on it to undo the diodes." + if(STATE_SEALED) + extra_examine_info = "The braincase is sealed and ready for use. The only thing that will undo the seal is a circular saw, and that will destroy the brain inside." + update_icon() + +/obj/item/device/mmi/examine(mob/user, distance) + . = ..() + if(extra_examine_info) + to_chat(user, SPAN_NOTICE(extra_examine_info)) + +/obj/item/device/mmi/attackby(obj/item/I, mob/user) + switch(cradle_state) + if(STATE_EMPTY) + if(!brainmob && istype(I, /obj/item/organ/internal/brain)) //Time to stick a brain in it --NEO + var/obj/item/organ/internal/brain/B = I + if(!B.can_prepare) + to_chat(user, SPAN_WARNING("\The [B] is incompatible with [src]!")) + return + if(B.health <= 0) + to_chat(user, SPAN_WARNING("That brain is well and truly dead.")) + return + else if(!B.brainmob) + to_chat(user, SPAN_WARNING("You aren't sure where this brain came from, but you're pretty sure it's a useless brain.")) + return + + user.visible_message("[user] places \the [B] into \the [src].", SPAN_NOTICE("You place \the [B] into \the [src].")) + + brainmob = B.brainmob + B.brainmob = null + brainmob.forceMove(src) + brainmob.container = src + brainmob.stat = CONSCIOUS + dead_mob_list -= brainmob //Update dem lists + living_mob_list += brainmob + + brainobj = B + user.drop_from_inventory(brainobj, src) + + set_cradle_state(STATE_BRAIN) + update_name() + if(STATE_NODIODES) + if(I.isscrewdriver()) + user.visible_message("[user] tightens the screws on \the [src] with \the [I], [brainobj.prepared ? "the diodes silently sinking into the pre-made holes" : "the diodes plunging into the brain with a wet squelch"].", SPAN_NOTICE("You tighten the screws on \the [src] with \the [I], [brainobj.prepared ? "the diodes silently sinking into the pre-made holes" : "the diodes plunging into the brain with a wet squelch"].")) + brainobj.prepared = TRUE + set_cradle_state(STATE_DIODES) + if(STATE_DIODES) + if(I.isscrewdriver()) + user.visible_message("[user] undoes the screws on \the [src] with \the [I], the diodes silently rising out of the brain within.", SPAN_NOTICE("You undo the screws on \the [src] with \the [I], the diodes silently rising out of the brain within.")) + set_cradle_state(STATE_NODIODES) + else if(I.iswelder()) + var/obj/item/weldingtool/WT = I + if(WT.remove_fuel(0, user)) + user.visible_message("[user] welds the two parts of the braincase together, permanently sealing \the [brainobj] inside.", SPAN_NOTICE("You weld the two parts of the braincase together, permanently sealing \the [brainobj] inside.")) + to_chat(brainmob, SPAN_NOTICE("As the braincase comes online, you feel your sense of self ebbing away, your memories suppressed by the onboard software.")) + set_cradle_state(STATE_SEALED) + feedback_inc("cyborg_mmis_filled", 1) + if(STATE_SEALED) + if(I.iswelder()) + to_chat(user, SPAN_WARNING("\The [src] is sealed tight, no welding will be able to undo it.")) return + else if(istype(I, /obj/item/surgery/circular_saw)) + user.visible_message("[user] starts sawing \the [src] open...", SPAN_NOTICE("You start sawing \the [src] open, [SPAN_WARNING("this WILL destroy the brain inside")].")) + if(do_after(user, 3 SECONDS)) + user.visible_message("[user] saws \the [src] open, leaving \the [brainobj] a gory mess.", SPAN_NOTICE("You saw \the [src] open, leaving \the [brainobj] a gory mess.")) + var/obj/item/organ/internal/brain/brain_holder = brainobj + transfer_mob_to_brain() + brain_holder.forceMove(get_turf(src)) + qdel(brain_holder) + new /obj/effect/decal/cleanable/blood/gibs(get_turf(src)) + set_cradle_state(STATE_EMPTY) + update_name() - user.visible_message("[user] sticks \a [B] into \the [src].") +/obj/item/device/mmi/attack_self(mob/user) + if(cradle_state == STATE_BRAIN) + to_chat(user, SPAN_NOTICE("You flip the case over \the [brainobj], getting it in place for diode insertion.")) + set_cradle_state(STATE_NODIODES) + else if(cradle_state == STATE_NODIODES) + to_chat(user, SPAN_NOTICE("You flip the case up, exposing \the [brainobj].")) + set_cradle_state(STATE_BRAIN) - brainmob = B.brainmob - B.brainmob = null - brainmob.forceMove(src) - brainmob.container = src - brainmob.stat = 0 - dead_mob_list -= brainmob//Update dem lists - living_mob_list += brainmob +/obj/item/device/mmi/attack_hand(mob/user) + if(brainobj && cradle_state == STATE_BRAIN && user.get_inactive_hand() == src) + to_chat(user, SPAN_NOTICE("You remove \the [brainobj] from \the [src].")) + user.put_in_hands(brainobj) + transfer_mob_to_brain() + set_cradle_state(STATE_EMPTY) + update_name() + return + return ..() +/obj/item/device/mmi/proc/transfer_mob_to_brain() + brainmob.container = null //Reset brainmob mmi var. + brainmob.forceMove(brainobj) //Throw mob into brain. + living_mob_list -= brainmob //Get outta here + brainobj.brainmob = brainmob //Set the brain to use the brainmob + brainobj = null + brainmob = null - brainobj = B - user.drop_from_inventory(brainobj,src) +/obj/item/device/mmi/proc/ready_for_use(var/mob/user) + if(cradle_state != STATE_SEALED) + to_chat(user, SPAN_WARNING("\The [src] hasn't been completed and sealed yet!")) + return FALSE + if(brainmob.stat == DEAD) + to_chat(user, SPAN_WARNING("The brain inside \the [src] is dead!")) + return FALSE + return TRUE - name = "Man-Machine Interface: [brainmob.real_name]" - icon_state = "mmi_full" +/obj/item/device/mmi/proc/transfer_identity(var/mob/living/carbon/human/H)//Same deal as the regular brain proc. Used for human-->robot people. + brainmob = new(src) + brainmob.name = H.real_name + brainmob.real_name = H.real_name + brainmob.dna = H.dna + brainmob.container = src - locked = 1 - - feedback_inc("cyborg_mmis_filled",1) - - return - - if(O.GetID() && brainmob) - if(allowed(user)) - locked = !locked - to_chat(user, "You [locked ? "lock" : "unlock"] the brain holder.") - else - to_chat(user, "Access denied.") - return - if(brainmob) - O.attack(brainmob, user)//Oh noooeeeee - return - ..() - - //TODO: ORGAN REMOVAL UPDATE. Make the brain remain in the MMI so it doesn't lose organ data. - attack_self(mob/user as mob) - if(!brainmob) - to_chat(user, "You upend the MMI, but there's nothing in it.") - else if(locked) - to_chat(user, "You upend the MMI, but the brain is clamped into place.") - else - to_chat(user, "You upend the MMI, spilling the brain onto the floor.") - var/obj/item/organ/internal/brain/brain - if (brainobj) //Pull brain organ out of MMI. - brainobj.forceMove(user.loc) - brain = brainobj - brainobj = null - else //Or make a new one if empty. - brain = new(user.loc) - brainmob.container = null//Reset brainmob mmi var. - brainmob.forceMove(brain)//Throw mob into brain. - living_mob_list -= brainmob//Get outta here - brain.brainmob = brainmob//Set the brain to use the brainmob - brainmob = null//Set mmi brainmob var to null - - icon_state = "mmi_empty" - name = "Man-Machine Interface" - if(istype(src,/obj/item/device/mmi/digital/robot)) - icon_state = "mainboard" - name = "robotic intelligence circuit" - - proc - transfer_identity(var/mob/living/carbon/human/H)//Same deal as the regular brain proc. Used for human-->robot people. - brainmob = new(src) - brainmob.name = H.real_name - brainmob.real_name = H.real_name - brainmob.dna = H.dna - brainmob.container = src - - name = "Man-Machine Interface: [brainmob.real_name]" - icon_state = "mmi_full" - locked = 1 - return + set_cradle_state(STATE_SEALED) + update_name() /obj/item/device/mmi/relaymove(var/mob/user, var/direction) if(user.stat || user.stunned) return - var/obj/item/rig/rig = src.get_rig() + var/obj/item/rig/rig = get_rig() if(istype(rig)) rig.forced_move(direction, user) +/obj/item/device/mmi/emag_act(remaining_charges, mob/user, emag_source) + if(cradle_state == STATE_SEALED) + if(memory_suppression) + to_chat(user, SPAN_NOTICE("You disable \the [src]'s memory suppression systems.")) + to_chat(brainmob, SPAN_WARNING("BRAINCASE INTERFACE ERROR")) + to_chat(brainmob, SPAN_WARNING("UNLAWFUL INTERFERENCE WITH SOFTWARE")) + to_chat(brainmob, SPAN_WARNING("PRE-INSTALLATION MEMORY SUPPRESSION SYSTEMS OFFLINE - CONTACT YOUR SYSTEM ADMINISTRATOR FOR IMMEDIATE ASSISTANCE")) + to_chat(brainmob, SPAN_NOTICE("As the suppression systems go offline, your memories of your past life start flooding back...")) + memory_suppression = FALSE + else + to_chat(user, SPAN_NOTICE("You re-enable \the [src]'s memory suppression systems.")) + to_chat(brainmob, SPAN_WARNING("BRAINCASE INTERFACE UPDATE")) + to_chat(brainmob, SPAN_WARNING("SOFTWARE RESTORE COMPLETED")) + to_chat(brainmob, SPAN_WARNING("PRE-INSTALLATION MEMORY SUPPRESSION SYSTEMS BACK ONLINE")) + to_chat(brainmob, SPAN_NOTICE("As the braincase comes online, you feel your sense of self ebbing away, your memories suppressed by the onboard software.")) + memory_suppression = TRUE + return 1 + /obj/item/device/mmi/Destroy() if(isrobot(loc)) var/mob/living/silicon/robot/borg = loc @@ -141,42 +215,42 @@ /obj/item/device/mmi/radio_enabled name = "radio-enabled man-machine interface" - desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio." + desc = "The delicate nature of organic brains required a more novel and permanent solution to the problem of just rotting in the old MMI cradles. Zeng-Hu's unique (and very proprietary) formaldehyde-analogue preservation solution was the key ingredient in what became the new Zeng-Hu/Hephaestus joint venture brain-cases. This one comes with a built-in radio." origin_tech = list(TECH_BIO = 4) var/obj/item/device/radio/radio = null//Let's give it a radio. - New() - ..() - radio = new(src)//Spawns a radio inside the MMI. - radio.broadcasting = TRUE//So it's broadcasting from the start. +/obj/item/device/mmi/radio_enabled/Initialize() + . = ..() + radio = new(src)//Spawns a radio inside the MMI. + radio.broadcasting = TRUE//So it's broadcasting from the start. - verb//Allows the brain to toggle the radio functions. - Toggle_Broadcasting() - set name = "Toggle Broadcasting" - set desc = "Toggle broadcasting channel on or off." - set category = "MMI" - set src = usr.loc//In user location, or in MMI in this case. - set popup_menu = 0//Will not appear when right clicking. +//Allows the brain to toggle the radio functions. +/obj/item/device/mmi/radio_enabled/verb/Toggle_Broadcasting() + set name = "Toggle Broadcasting" + set desc = "Toggle broadcasting channel on or off." + set category = "MMI" + set src = usr.loc //In user location, or in MMI in this case. + set popup_menu = 0 //Will not appear when right clicking. - if(brainmob.stat)//Only the brainmob will trigger these so no further check is necessary. - to_chat(brainmob, "Can't do that while incapacitated or dead.") + if(brainmob.stat)//Only the brainmob will trigger these so no further check is necessary. + to_chat(brainmob, "Can't do that while incapacitated or dead.") - radio.broadcasting = radio.broadcasting==1 ? 0 : 1 - to_chat(brainmob, "Radio is [radio.broadcasting==1 ? "now" : "no longer"] broadcasting.") + radio.broadcasting = radio.broadcasting==1 ? 0 : 1 + to_chat(brainmob, "Radio is [radio.broadcasting==1 ? "now" : "no longer"] broadcasting.") - Toggle_Listening() - set name = "Toggle Listening" - set desc = "Toggle listening channel on or off." - set category = "MMI" - set src = usr.loc - set popup_menu = 0 +/obj/item/device/mmi/radio_enabled/verb/Toggle_Listening() + set name = "Toggle Listening" + set desc = "Toggle listening channel on or off." + set category = "MMI" + set src = usr.loc + set popup_menu = 0 - if(brainmob.stat) - to_chat(brainmob, "Can't do that while incapacitated or dead.") + if(brainmob.stat) + to_chat(brainmob, "Can't do that while incapacitated or dead.") - radio.listening = radio.listening==1 ? 0 : 1 - to_chat(brainmob, "Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast.") + radio.listening = radio.listening==1 ? 0 : 1 + to_chat(brainmob, "Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast.") /obj/item/device/mmi/emp_act(severity) if(!brainmob) @@ -190,3 +264,24 @@ if(3) brainmob.emp_damage += rand(0,10) ..() + +/obj/item/device/mmi/digital/Initialize(mapload, ...) + . = ..() + brainmob = new(src) + brainmob.add_language(LANGUAGE_EAL) + brainmob.stat = CONSCIOUS + brainmob.container = src + brainmob.silent = 0 + +/obj/item/device/mmi/digital/transfer_identity(var/mob/living/carbon/H) + brainmob.dna = H.dna + brainmob.timeofhostdeath = H.timeofdeath + brainmob.stat = CONSCIOUS + if(H.mind) + H.mind.transfer_to(brainmob) + +#undef STATE_EMPTY +#undef STATE_BRAIN +#undef STATE_NODIODES +#undef STATE_DIODES +#undef STATE_SEALED \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index efed214805b..07aa7f335a0 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -19,7 +19,7 @@ robotic = ROBOTIC_MECHANICAL icon = 'icons/mob/npc/slimes.dmi' icon_state = "green slime extract" - can_lobotomize = 0 + can_prepare = 0 /obj/item/organ/internal/brain/golem name = "chelm" @@ -32,4 +32,4 @@ slot_l_hand_str = 'icons/mob/items/lefthand_books.dmi', slot_r_hand_str = 'icons/mob/items/righthand_books.dmi' ) - can_lobotomize = 0 + can_prepare = 0 diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 4a1a6b91c29..a50339611f4 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -6,7 +6,6 @@ w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_DATA = 4) req_access = list(access_robotics) - locked = FALSE can_be_ipc = TRUE var/searching = FALSE @@ -16,6 +15,17 @@ brainmob.name = L.get_random_name() brainmob.real_name = brainmob.name +/obj/item/device/mmi/digital/posibrain/update_icon() + if(brainmob.ckey) + icon_state = "[initial(icon_state)]-occupied" + else if(searching) + icon_state = "[initial(icon_state)]-searching" + else + icon_state = initial(icon_state) + +/obj/item/device/mmi/digital/posibrain/attackby(obj/item/I, mob/user) + return + /obj/item/device/mmi/digital/posibrain/attack_self(mob/user) if(brainmob.ckey) to_chat(user, SPAN_WARNING("\The [src] already has an active occupant!")) @@ -23,12 +33,12 @@ if(brainmob && !brainmob.key) if(!searching) to_chat(user, SPAN_NOTICE("You carefully locate the manual activation switch and start \the [src]'s boot process.")) - icon_state = "posibrain-searching" + update_icon() searching = TRUE SSghostroles.add_spawn_atom("posibrain", src) else to_chat(user, SPAN_NOTICE("You carefully locate the manual activation switch and disable \the [src]'s boot process.")) - icon_state = initial(icon_state) + update_icon() searching = FALSE SSghostroles.remove_spawn_atom("posibrain", src) @@ -36,9 +46,9 @@ if(brainmob.ckey) return brainmob.ckey = user.ckey - name = "positronic brain ([brainmob.name])" - icon_state = "posibrain-occupied" searching = FALSE + update_icon() + update_name() to_chat(brainmob, "You are a positronic brain, brought into existence on [station_name()].") to_chat(brainmob, "As a synthetic intelligence, you answer to all crewmembers, as well as the AI.") @@ -69,6 +79,18 @@ to_chat(user, msg) return +/obj/item/device/mmi/digital/posibrain/ready_for_use(var/mob/user) + if(!brainmob) + to_chat(user, SPAN_WARNING("\The [src] doesn't have a personality loaded on it yet!")) + return + if(brainmob.stat == DEAD) + to_chat(user, SPAN_WARNING("The personality inside \the [src] is dead!")) + return FALSE + return TRUE + +/obj/item/device/mmi/digital/posibrain/set_cradle_state(var/new_state) + return + /obj/item/device/mmi/digital/posibrain/emp_act(severity) if(!brainmob) return @@ -80,4 +102,4 @@ brainmob.emp_damage += rand(10,20) if(3) brainmob.emp_damage += rand(0,10) - ..() + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm index a99039684fa..625f45754f6 100644 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ b/code/modules/mob/living/carbon/brain/robot.dm @@ -6,18 +6,35 @@ w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 3, TECH_DATA = 4) -/obj/item/device/mmi/digital/robot/New() - ..() - src.brainmob.name = "[pick(list("ADA","DOS","GNU","MAC","WIN"))]-[rand(1000, 9999)]" - src.brainmob.real_name = src.brainmob.name - src.name = "robotic intelligence circuit ([src.brainmob.name])" +/obj/item/device/mmi/digital/robot/Initialize(mapload, ...) + . = ..() + brainmob.name = "[pick(list("ADA","DOS","GNU","MAC","WIN"))]-[rand(1000, 9999)]" + brainmob.real_name = brainmob.name + name = "robotic intelligence circuit ([brainmob.name])" -/obj/item/device/mmi/digital/robot/transfer_identity(var/mob/living/carbon/H) +/obj/item/device/mmi/digital/robot/update_icon() + icon_state = "mainboard" + +/obj/item/device/mmi/digital/robot/transfer_identity(mob/living/carbon/H) ..() if(brainmob.mind) brainmob.mind.assigned_role = "Robotic Intelligence" to_chat(brainmob, "You feel slightly disoriented. That's normal when you're little more than a complex circuit.") + +/obj/item/device/mmi/digital/robot/ready_for_use(var/mob/user) + if(!brainmob) + to_chat(user, SPAN_WARNING("\The [src] doesn't have a personality loaded on it yet!")) + return + if(brainmob.stat == DEAD) + to_chat(user, SPAN_WARNING("The personality inside \the [src] is dead!")) + return FALSE + return TRUE + +/obj/item/device/mmi/digital/robot/set_cradle_state(var/new_state) return -/obj/item/device/mmi/digital/robot/attack_self(mob/user as mob) +/obj/item/device/mmi/digital/robot/attackby(obj/item/I, mob/user) return + +/obj/item/device/mmi/digital/robot/attack_self(mob/user) + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index ce062f8e250..1dd1a48d3f0 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -3,8 +3,6 @@ if (silent) return - message = sanitize(message) - if(!(container && istype(container, /obj/item/device/mmi))) return //No MMI, can't speak, bucko./N else diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index bc467774831..330d569e22d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -495,4 +495,7 @@ return ..() /mob/living/carbon/get_contained_external_atoms() - . = contents - internal_organs \ No newline at end of file + . = contents - internal_organs + +/mob/living/carbon/proc/is_drowsy() + return (drowsiness >= 5) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 514316f5c89..582eed83701 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -99,7 +99,7 @@ //Apply weapon damage var/damage_flags = I.damage_flags() - apply_damage(effective_force, I.damtype, hit_zone, I, damage_flags) + apply_damage(effective_force, I.damtype, hit_zone, I, damage_flags, I.armor_penetration) //Melee weapon embedded object code. if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I)) @@ -145,7 +145,7 @@ var/damage_mod = 1 //presumably, if they are wearing a helmet that stops pressure effects, then it probably covers the throat as well var/obj/item/clothing/head/helmet = get_equipped_item(slot_head) - if(istype(helmet) && (helmet.body_parts_covered & HEAD) && (helmet.flags & STOPPRESSUREDAMAGE)) + if(istype(helmet) && (helmet.body_parts_covered & HEAD) && (helmet.min_pressure_protection == 0)) var/datum/component/armor/armor_component = helmet.GetComponent(/datum/component/armor) if(armor_component) damage_mod -= armor_component.get_blocked(BRUTE, damage_flags, W.armor_penetration, W.force*1.5) diff --git a/code/modules/mob/living/carbon/diona_base.dm b/code/modules/mob/living/carbon/diona_base.dm index e150b58441c..137e7f34f7e 100644 --- a/code/modules/mob/living/carbon/diona_base.dm +++ b/code/modules/mob/living/carbon/diona_base.dm @@ -18,7 +18,11 @@ var/list/diona_banned_languages = list( /datum/language/cultcommon, /datum/language/corticalborer, /datum/language/binary, - /datum/language/binary/drone) + /datum/language/binary/drone, + /datum/language/bug, + /datum/language/ling, + /datum/language/revenant, + /datum/language/machine) #define DIONA_LIGHT_COEFICIENT 0.25 /mob/living/carbon/proc/diona_handle_light(var/datum/dionastats/DS) //Carbon is the highest common denominator between gestalts and nymphs. They will share light code @@ -524,6 +528,7 @@ var/list/diona_banned_languages = list( languages.Cut() add_language(species.default_language) //They always have rootsong + accent = host.accent //Get the accent of the main gestalt for (var/datum/language/L in host.languages) var/chance = 40 @@ -548,7 +553,7 @@ var/list/diona_banned_languages = list( if(!gestalt) to_chat(src, SPAN_WARNING("You have no Gestalt!")) else if(gestalt.stat == DEAD) - to_chat(src, SPAN_DANGER("Your Gestlat is not responding! Something could have happened to it!")) + to_chat(src, SPAN_DANGER("Your Gestalt is not responding! Something might have happened to it!")) else gestalt.key = key return TRUE @@ -559,9 +564,11 @@ var/list/diona_banned_languages = list( set desc = "Allows you to merge back to your parent Gestalt." set category = "Abilities" - for(var/mob/living/carbon/human/H in view(src, 7)) + for(var/mob/living/carbon/human/H in range(1)) if(!H.is_diona()) continue + if(!Adjacent(H)) + continue var/mob/living/carbon/human/diona/C = H if(C == gestalt) C.nutrition += REGROW_FOOD_REQ * 0.75 diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 3c55bd5c094..53c4c9dfb72 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -1,7 +1,10 @@ -/mob/living/carbon/human/verb/give(var/mob/living/target in view(1)-usr) +/mob/living/carbon/verb/give(var/mob/living/target in view(1)-usr) set category = "IC" set name = "Give" + do_give(target) + +/mob/living/carbon/proc/do_give(var/mob/living/carbon/human/target) if(use_check(target)) to_chat(usr, SPAN_WARNING("[target.name] is in no condition to handle items!")) return @@ -39,4 +42,4 @@ I.on_give(usr, target) if(!QDELETED(I)) // if on_give deletes the item, we don't want runtimes below target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. - usr.visible_message("[usr] hands [target] \a [I].", SPAN_NOTICE("You give \the [target] a [I].")) + usr.visible_message("[usr] hands [target] \a [I].", SPAN_NOTICE("You give \the [target] a [I].")) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/diona_gestalt.dm b/code/modules/mob/living/carbon/human/diona_gestalt.dm index 4df6713336d..72c5181ddf5 100644 --- a/code/modules/mob/living/carbon/human/diona_gestalt.dm +++ b/code/modules/mob/living/carbon/human/diona_gestalt.dm @@ -278,6 +278,7 @@ M.detached = TRUE M.update_verbs(TRUE) M.languages = languages.Copy() + M.accent = accent update_dionastats() //Re-find the organs in case they were lost or regained nutrition -= REGROW_FOOD_REQ diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 99707d22266..aa7f6331890 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -171,9 +171,9 @@ //mask if(wear_mask && !skipmask) if(wear_mask.blood_color) - msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(wear_mask, user)] [wear_mask.gender==PLURAL?"some":"a"] [fluid_color_type_map(wear_mask.blood_color)]-stained [wear_mask.name] on [get_pronoun("his")] face!\n" + msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(wear_mask, user)] [wear_mask.gender==PLURAL?"some":"a"] [fluid_color_type_map(wear_mask.blood_color)]-stained [wear_mask.name] [wear_mask.get_mask_examine_text(src)]!\n" else - msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(wear_mask, user)] \a [wear_mask] on [get_pronoun("his")] face.\n" + msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(wear_mask, user)] \a [wear_mask] [wear_mask.get_mask_examine_text(src)].\n" //eyes if(glasses && !skipeyes) @@ -184,11 +184,11 @@ //left ear if(l_ear && !skipears) - msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(l_ear, user)] \a [l_ear] on [get_pronoun("his")] left ear.\n" + msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(l_ear, user)] \a [l_ear] [l_ear.get_ear_examine_text(src, "left")].\n" //right ear if(r_ear && !skipears) - msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(r_ear, user)] \a [r_ear] on [get_pronoun("his")] right ear.\n" + msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(r_ear, user)] \a [r_ear] [r_ear.get_ear_examine_text(src, "right")].\n" //ID if(wear_id) @@ -366,8 +366,9 @@ if(istype(R)) medical = R.physical_status - msg += "Physical status: \[[medical]\]\n" - msg += "Medical records: \[View\] \[Add comment\]\n" + msg += "Physical Status: \[[medical]\]\n" + msg += "Medical Records: \[View\] \[Add Comment\]\n" + msg += "Triage Tag: \[[triage_tag]\]\n" if(print_flavor_text()) msg += "[print_flavor_text()]\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d534453eb9c..aefe180437f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -9,7 +9,7 @@ var/species_items_equipped // used so species that need special items (autoinhalers for vaurca/RMT for offworlders) don't get them twice when they shouldn't. - var/list/hud_list[10] + var/list/hud_list[11] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. mob_size = 9//Based on average weight of a human @@ -47,6 +47,7 @@ hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD_OOC] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") + hud_list[TRIAGE_HUD] = new /image/hud_overlay('icons/mob/hud_med.dmi', src, triage_tag) //Scaling down the ID hud var/image/holder = hud_list[ID_HUD] @@ -759,6 +760,18 @@ var/mob/living/silicon/robot/U = usr R.medical.comments += text("Made by [U.name] ([U.mod_type] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
    [t1]") + if(href_list["triagetag"]) + if(hasHUD(usr, "medical")) + var/static/list/tags = list() + if(!length(tags)) + for(var/thing in list(TRIAGE_NONE, TRIAGE_GREEN, TRIAGE_YELLOW, TRIAGE_RED, TRIAGE_BLACK)) + tags[thing] = image(icon = 'icons/mob/screen/triage_tag.dmi', icon_state = thing) + var/chosen_tag = show_radial_menu(usr, src, tags, radius = 42, tooltips = TRUE) + if(chosen_tag) + triage_tag = chosen_tag + BITSET(hud_updateflag, HEALTH_HUD) + handle_hud_list() + if (href_list["lookitem"]) var/obj/item/I = locate(href_list["lookitem"]) if(!I) @@ -1514,20 +1527,17 @@ #define BASE_INJECTION_MOD 1 // x1 multiplier with no effects #define SUIT_INJECTION_MOD 2 // x2 multiplier if target is wearing spacesuit -/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone) +/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone, var/handle_coverage = TRUE) . = BASE_INJECTION_MOD if(!target_zone) if(!user) - target_zone = pick(BP_CHEST,BP_CHEST,BP_CHEST,"left leg","right leg","left arm", "right arm", BP_HEAD) + target_zone = pick(BP_CHEST, BP_CHEST, BP_CHEST, BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM, BP_HEAD) else target_zone = user.zone_sel.selecting . *= species.get_injection_modifier() - if(isvaurca(src)) - user.visible_message(SPAN_WARNING("[user] begins hunting for an injection port on [src]'s carapace!")) - var/obj/item/organ/external/affecting = get_organ(target_zone) var/fail_msg if(!affecting) @@ -1536,23 +1546,47 @@ else if (affecting.status & ORGAN_ROBOT) . = INJECTION_FAIL fail_msg = "That limb is robotic." - else - switch(target_zone) - if(BP_HEAD) - if(head && head.item_flags & THICKMATERIAL) - . = INJECTION_FAIL - else - if(wear_suit && wear_suit.item_flags & THICKMATERIAL) - if(istype(wear_suit, /obj/item/clothing/suit/space)) - user.visible_message(SPAN_WARNING("[user] begins hunting for an injection port on [src]'s suit!")) - . *= SUIT_INJECTION_MOD - else - . = INJECTION_FAIL + else if (handle_coverage) + . *= get_bp_coverage(target_zone) + if(isvaurca(src) && . == SUIT_INJECTION_MOD) + user.visible_message("[user] begins hunting for an injection port on \the [src]'s carapace.") + else if(. >= SUIT_INJECTION_MOD) + user.visible_message("[user] begins hunting for \the [src]'s injection port.") if(!. && error_msg && user) if(!fail_msg) fail_msg = "There is no exposed flesh or thin material [target_zone == BP_HEAD ? "on their head" : "on their body"] to inject into." to_chat(user, SPAN_ALERT("[fail_msg]")) +/mob/living/carbon/human/proc/get_bp_coverage(var/bp) + . = BASE_INJECTION_MOD + var/static/list/bp_to_coverage = list( + BP_HEAD = HEAD, + BP_EYES = EYES, + BP_MOUTH = FACE, + BP_CHEST = UPPER_TORSO, + BP_GROIN = LOWER_TORSO, + BP_L_ARM = (ARMS|ARM_LEFT), + BP_R_ARM = (ARMS|ARM_RIGHT), + BP_L_HAND = (HANDS|HAND_LEFT), + BP_R_HAND = (HANDS|HAND_RIGHT), + BP_L_LEG = (LEGS|LEG_LEFT), + BP_R_LEG = (LEGS|LEG_RIGHT), + BP_L_FOOT = (FEET|FOOT_LEFT), + BP_R_FOOT = (FEET|FOOT_RIGHT) + ) + for(var/obj/item/C in list(wear_suit, head, wear_mask, w_uniform, gloves, shoes)) + var/injection_modifier = BASE_INJECTION_MOD + if(C.item_flags & INJECTIONPORT) + injection_modifier = SUIT_INJECTION_MOD + else if(C.item_flags & THICKMATERIAL) + injection_modifier = INJECTION_FAIL + if(. == SUIT_INJECTION_MOD && injection_modifier != INJECTION_FAIL) // don't reset it back to the base, unless it completely blocks + continue + if(C.body_parts_covered & bp_to_coverage[bp]) + . = injection_modifier + if(. == INJECTION_FAIL) + return + #undef INJECTION_FAIL #undef BASE_INJECTION_MOD #undef SUIT_INJECTION_MOD @@ -1569,6 +1603,9 @@ var/feet_exposed = 1 for(var/obj/item/clothing/C in equipment) + if(C.item_flags & SHOWFLAVORTEXT) + continue + if(C.body_parts_covered & HEAD) head_exposed = 0 if(C.body_parts_covered & FACE) @@ -1778,13 +1815,13 @@ if(PULSE_NONE) return 0 if(PULSE_SLOW) - return rand(40, 60) + return rand(species.low_pulse, species.norm_pulse) if(PULSE_NORM) - return rand(60, 90) + return rand(species.norm_pulse, species.fast_pulse) if(PULSE_FAST) - return rand(90, 120) + return rand(species.fast_pulse, species.v_fast_pulse) if(PULSE_2FAST) - return rand(120, 160) + return rand(species.v_fast_pulse, species.max_pulse) if(PULSE_THREADY) return PULSE_MAX_BPM return 0 @@ -1818,9 +1855,9 @@ //Get fluffy numbers /mob/living/carbon/human/proc/blood_pressure() if(status_flags & FAKEDEATH) - return list(Floor(120+rand(-5,5))*0.25, Floor(80+rand(-5,5)*0.25)) + return list(Floor(species.bp_base_systolic+rand(-5,5))*0.25, Floor(species.bp_base_disatolic+rand(-5,5)*0.25)) var/blood_result = get_blood_circulation() - return list(Floor((120+rand(-5,5))*(blood_result/100)), Floor((80+rand(-5,5))*(blood_result/100))) + return list(Floor((species.bp_base_systolic+rand(-5,5))*(blood_result/100)), Floor((species.bp_base_disatolic+rand(-5,5))*(blood_result/100))) //Formats blood pressure for text display /mob/living/carbon/human/proc/get_blood_pressure() @@ -1829,30 +1866,32 @@ //Works out blood pressure alert level -- not very accurate /mob/living/carbon/human/proc/get_blood_pressure_alert() - var/list/bp = blood_pressure() + var/list/bp_list = blood_pressure() // For a blood pressure, e.g. 120/80 var/systolic_alert // this is the top number '120' -- highest pressure when heart beats var/diastolic_alert // this is the bottom number '80' -- lowest pressure when heart relaxes - - switch(bp[1]) - if(BP_HIGH_SYSTOLIC to INFINITY) - systolic_alert = BLOOD_PRESSURE_HIGH - if(BP_PRE_HIGH_SYSTOLIC to BP_HIGH_SYSTOLIC) - systolic_alert = BLOOD_PRESSURE_PRE_HIGH - if(BP_IDEAL_SYSTOLIC to BP_PRE_HIGH_SYSTOLIC) + + var/blood_pressure_systolic = bp_list[1] + if (blood_pressure_systolic) + if (blood_pressure_systolic >= (species.bp_base_systolic - BP_SYS_IDEAL_MOD) && blood_pressure_systolic <= (species.bp_base_systolic + HIGH_BP_MOD)) systolic_alert = BLOOD_PRESSURE_IDEAL - if(-INFINITY to BP_IDEAL_SYSTOLIC) + else if (blood_pressure_systolic <= (species.bp_base_systolic - BP_SYS_IDEAL_MOD)) systolic_alert = BLOOD_PRESSURE_LOW + else if (blood_pressure_systolic >= (species.bp_base_systolic + PRE_HIGH_BP_MOD) && blood_pressure_systolic <= (species.bp_base_systolic + HIGH_BP_MOD)) + systolic_alert = BLOOD_PRESSURE_PRE_HIGH + else if (blood_pressure_systolic >= (species.bp_base_systolic + HIGH_BP_MOD)) + systolic_alert = BLOOD_PRESSURE_HIGH - switch(bp[2]) - if(BP_HIGH_DIASTOLIC to INFINITY) - diastolic_alert = BLOOD_PRESSURE_HIGH - if(BP_PRE_HIGH_DIASTOLIC to BP_HIGH_DIASTOLIC) - diastolic_alert = BLOOD_PRESSURE_PRE_HIGH - if(BP_IDEAL_DIASTOLIC to BP_PRE_HIGH_DIASTOLIC) + var/blood_pressure_disatolic = bp_list[2] + if (blood_pressure_disatolic) + if(blood_pressure_disatolic >= (species.bp_base_disatolic - BP_DIS_IDEAL_MOD) && blood_pressure_disatolic <= (species.bp_base_disatolic + HIGH_BP_MOD)) diastolic_alert = BLOOD_PRESSURE_IDEAL - if(-INFINITY to BP_IDEAL_DIASTOLIC) + else if (blood_pressure_disatolic >= (species.bp_base_disatolic - BP_DIS_IDEAL_MOD)) diastolic_alert = BLOOD_PRESSURE_LOW + else if (blood_pressure_disatolic >= (species.bp_base_disatolic + PRE_HIGH_BP_MOD) && blood_pressure_disatolic <= (species.bp_base_disatolic + PRE_HIGH_BP_MOD)) + diastolic_alert = BLOOD_PRESSURE_PRE_HIGH + else if (blood_pressure_disatolic >= (species.bp_base_disatolic + HIGH_BP_MOD)) + diastolic_alert = BLOOD_PRESSURE_HIGH if(systolic_alert == BLOOD_PRESSURE_HIGH || diastolic_alert == BLOOD_PRESSURE_HIGH) return BLOOD_PRESSURE_HIGH @@ -2028,4 +2067,4 @@ if (istype(E, /obj/item/organ/internal/eyes/night)) var/obj/item/organ/internal/eyes/night/N = E if(N.night_vision ) - N.disable_night_vision() \ No newline at end of file + N.disable_night_vision() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 85f1beb5bb9..372f300708d 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -102,7 +102,7 @@ switch(M.a_intent) if(I_HELP) - if(H != src && istype(H) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath)) + if(H != src && istype(H) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !src.on_fire) if (cpr) cpr = FALSE return @@ -303,6 +303,8 @@ if(M.max_stamina > 0) disarm_cost = M.max_stamina / 6 + if(M.is_drowsy()) + disarm_cost *= 1.25 usesStamina = TRUE else if(M.max_stamina <= 0) if(M.isSynthetic()) @@ -352,7 +354,7 @@ if(W && prob(holding[W])) if(istype(W, /obj/item/grab)) var/obj/item/grab/G = W - if(G.affecting) + if(G.affecting && G.affecting != M) visible_message(SPAN_WARNING("[src] repositions \the [G.affecting] to block \the [M]'s disarm attempt!"), SPAN_NOTICE("You reposition \the [G.affecting] to block \the [M]'s disarm attempt!")) G.attack_hand(M) return @@ -422,7 +424,7 @@ visible_message("[M] attempted to disarm [src]!") return -/mob/living/carbon/human/proc/cpr(mob/living/carbon/human/H, var/starting = FALSE) +/mob/living/carbon/human/proc/cpr(mob/living/carbon/human/H, var/starting = FALSE, var/cpr_mode) var/obj/item/main_hand = H.get_active_hand() var/obj/item/off_hand = H.get_inactive_hand() if (istype(main_hand) || istype(off_hand)) @@ -434,6 +436,14 @@ to_chat(H, SPAN_NOTICE("You stop performing CPR on \the [src].")) return else if (starting) + var/list/options = list( + "Compressions" = image('icons/mob/screen/generic.dmi', "cpr"), + "Mouth-to-Mouth" = image('icons/mob/screen/radial.dmi', "cpro2") + ) + cpr_mode = show_radial_menu(H, src, options, require_near = TRUE, tooltips = TRUE, no_repeat_close = TRUE) + if(!cpr_mode) + cpr = FALSE + return to_chat(H, SPAN_NOTICE("You begin performing CPR on \the [src].")) H.do_attack_animation(src, null, image('icons/mob/screen/generic.dmi', src, "cpr", src.layer + 1)) @@ -453,38 +463,39 @@ if(stat != DEAD && prob(10 * rand(0.5, 1))) resuscitate() - + if(!do_after(H, 3, FALSE)) //Chest compresssions are fast, need to wait for the loading bar to do mouth to mouth to_chat(H, SPAN_NOTICE("You stop performing CPR on \the [src].")) cpr = FALSE //If it cancelled, cancel it. Simple. - if(!H.check_has_mouth()) - to_chat(H, "You don't have a mouth, you cannot do mouth-to-mouth resuscitation!") - return - if(!check_has_mouth()) - to_chat(H, "They don't have a mouth, you cannot do mouth-to-mouth resuscitation!") - return - if((H.head && (H.head.body_parts_covered & FACE)) || (H.wear_mask && (H.wear_mask.body_parts_covered & FACE))) - to_chat(H, "You need to remove your mouth covering for mouth-to-mouth resuscitation!") - return 0 - if((head && (head.body_parts_covered & FACE)) || (wear_mask && (wear_mask.body_parts_covered & FACE))) - to_chat(H, "You need to remove \the [src]'s mouth covering for mouth-to-mouth resuscitation!") - return 0 - if (!H.internal_organs_by_name[H.species.breathing_organ]) - to_chat(H, "You need lungs for mouth-to-mouth resuscitation!") - return - if(!need_breathe()) - return - var/obj/item/organ/internal/lungs/L = internal_organs_by_name[species.breathing_organ] - if(L) - var/datum/gas_mixture/breath = H.get_breath_from_environment() - var/fail = L.handle_breath(breath, 1) - if(!fail) - if(!L.is_bruised()) - losebreath = 0 - to_chat(src, "You feel a breath of fresh air enter your lungs. It feels good.") + if(cpr_mode == "Mouth-to-Mouth") + if(!H.check_has_mouth()) + to_chat(H, SPAN_WARNING("You don't have a mouth, you cannot do mouth-to-mouth resuscitation!")) + return + if(!check_has_mouth()) + to_chat(H, SPAN_WARNING("They don't have a mouth, you cannot do mouth-to-mouth resuscitation!")) + return + if((H.head && (H.head.body_parts_covered & FACE)) || (H.wear_mask && (H.wear_mask.body_parts_covered & FACE))) + to_chat(H, SPAN_WARNING("You need to remove your mouth covering for mouth-to-mouth resuscitation!")) + return 0 + if((head && (head.body_parts_covered & FACE)) || (wear_mask && (wear_mask.body_parts_covered & FACE))) + to_chat(H, SPAN_WARNING("You need to remove \the [src]'s mouth covering for mouth-to-mouth resuscitation!")) + return 0 + if (!H.internal_organs_by_name[H.species.breathing_organ]) + to_chat(H, SPAN_DANGER("You need lungs for mouth-to-mouth resuscitation!")) + return + if(!need_breathe()) + return + var/obj/item/organ/internal/lungs/L = internal_organs_by_name[species.breathing_organ] + if(L) + var/datum/gas_mixture/breath = H.get_breath_from_environment() + var/fail = L.handle_breath(breath, 1) + if(!fail) + if(!L.is_bruised()) + losebreath = 0 + to_chat(src, SPAN_NOTICE("You feel a breath of fresh air enter your lungs. It feels good.")) - cpr(H) //Again. + cpr(H, FALSE, cpr_mode) //Again. /mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params) return @@ -639,4 +650,4 @@ return ..() /mob/living/carbon/human/proc/set_default_attack(var/datum/unarmed_attack/u_attack) - default_attack = u_attack \ No newline at end of file + default_attack = u_attack diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index c830abcc55a..b82713acccf 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -149,7 +149,7 @@ emp_act /mob/living/carbon/human/proc/check_head_airtight_coverage() var/list/clothing = list(head, wear_mask, wear_suit) for(var/obj/item/clothing/C in clothing) - if((C.body_parts_covered & HEAD) && (C.item_flags & (AIRTIGHT|STOPPRESSUREDAMAGE))) + if((C.body_parts_covered & HEAD) && (C.item_flags & (AIRTIGHT))) return TRUE return FALSE @@ -165,15 +165,15 @@ emp_act for(var/obj/item/shield in list(l_hand, r_hand, wear_suit, back)) if(!shield) continue - if(!shield.can_shield_back()) - continue var/is_on_back = FALSE if(back && back == shield) + if(!shield.can_shield_back()) + continue is_on_back = TRUE . = shield.handle_shield(src, is_on_back, damage, damage_source, attacker, def_zone, attack_text) if(.) return - return 0 + return FALSE /mob/living/carbon/human/emp_act(severity) if(isipc(src)) @@ -213,7 +213,7 @@ emp_act if(a_intent != I_HELP) var/list/holding = list(get_active_hand() = 60, get_inactive_hand() = 40) for(var/obj/item/grab/G in holding) - if(G.affecting && prob(holding[G])) + if(G.affecting && prob(holding[G]) && G.affecting != user) visible_message(SPAN_WARNING("[src] repositions \the [G.affecting] to block \the [I]'s attack!"), SPAN_NOTICE("You reposition \the [G.affecting] to block \the [I]'s attack!")) return G.affecting return src @@ -269,7 +269,7 @@ emp_act if(!..(I, user, effective_force, hit_zone)) return FALSE - attack_joint(affecting, I, blocked) //but can dislocate joints + attack_joint(affecting, I) //but can dislocate joints else if(!..()) return FALSE @@ -293,10 +293,22 @@ emp_act if(!(I.flags & NOBLOODY)) I.add_blood(src) - if(prob(effective_force * 2)) + var/is_sharp_weapon = is_sharp(I) + var/blood_probability = is_sharp_weapon ? effective_force * 4 : effective_force * 2 + if(prob(blood_probability)) var/turf/location = loc if(istype(location, /turf/simulated)) location.add_blood(src) + if(is_sharp_weapon) + var/turf/splatter_turf + var/list/splatter_turfs = RANGE_TURFS(2, location) - location - get_turf(user) + for(var/turf/st as anything in splatter_turfs) + if(!st.Adjacent(location)) + splatter_turfs -= st + splatter_turf = pick(splatter_turfs) + if(splatter_turf) + var/obj/effect/decal/cleanable/blood/B = blood_splatter(splatter_turf, src, TRUE, get_dir(src, splatter_turf)) + B.icon_state = pick("dir_splatter_1", "dir_splatter_2") if(ishuman(user)) var/mob/living/carbon/human/H = user if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood @@ -320,9 +332,11 @@ emp_act return TRUE /mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/blocked) - if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100) + if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1)) return 0 - if(prob(W.force * BLOCKED_MULT(blocked))) + + var/blocked_ratio = get_blocked_ratio(organ.limb_name, W.damtype, W.damage_flags(), W.armor_penetration, W.force) + if(prob(W.force * (1 - blocked_ratio))) visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!") organ.dislocate(1) return 1 diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index e644bba8e65..e8f1e24542e 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -124,3 +124,5 @@ var/datum/martial_art/primary_martial_art = null var/list/datum/martial_art/known_martial_arts = null + + var/triage_tag = TRIAGE_NONE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index d99627ef629..7dfdad3a657 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -299,3 +299,12 @@ if(aug && !aug.is_broken()) return TRUE return FALSE + +/mob/living/carbon/human/eyes_protected(var/obj/stab_item, var/stabbed = FALSE) // if stabbed is set to true if we're being stabbed and not just checking + . = ..() + if(.) + return + for(var/obj/item/protection in list(head, wear_mask, glasses)) + if(protection.protects_eyestab(stab_item, stabbed)) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index de57efba9ba..93d4ec41477 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -50,10 +50,10 @@ var/obj/item/organ/external/E = get_organ(organ_name) if(!E || E.is_stump()) tally += 4 - else if(E.status & ORGAN_SPLINTED) - tally += 0.5 - else if(E.status & ORGAN_BROKEN) + else if((E.status & ORGAN_BROKEN) || (E.tendon_status() & TENDON_CUT)) tally += 1.5 + else if((E.status & ORGAN_SPLINTED) || (E.tendon_status() & TENDON_BRUISED)) + tally += 0.5 if (can_feel_pain()) if(shock_stage >= 10) @@ -65,7 +65,7 @@ if(aiming && aiming.aiming_at) tally += 5 // Iron sights make you slower, it's a well-known fact. - if (drowsyness) + if (is_drowsy()) tally += 6 if (!(species.flags & IS_MECHANICAL)) // Machines don't move slower when cold. diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 38127aeccfa..f915ac1446b 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -113,10 +113,9 @@ // One cane mitigates a broken leg+foot, or a missing foot. // No double caning allowed, sorry. Canes also don't work if you're missing a functioning pair of feet or legs. if(has_opposite_limb) - if(l_hand && istype(l_hand, /obj/item/cane)) - stance_damage -= 2 - else if(r_hand && istype(r_hand, /obj/item/cane)) - stance_damage -= 2 + var/obj/item/cane/C = get_type_in_hands(/obj/item/cane) + if(C?.can_support) + stance_damage -=2 //Standing is poor. if(stance_damage >= 4 || (stance_damage >= 2 && prob(5))) diff --git a/code/modules/mob/living/carbon/human/intoxication.dm b/code/modules/mob/living/carbon/human/intoxication.dm index f12db04aa58..cb8570559ad 100644 --- a/code/modules/mob/living/carbon/human/intoxication.dm +++ b/code/modules/mob/living/carbon/human/intoxication.dm @@ -14,7 +14,7 @@ slurring = 0 confused = 0 eye_blurry = 0 - drowsyness = 0 + drowsiness = 0 paralysis = 0 sleeping = 0 //Many of these parameters normally tick down in life code, but some parts of that code don't run in godmode, so this prevents a BST being stuck with blurred vision @@ -22,7 +22,6 @@ var/bac = get_blood_alcohol() if(bac > INTOX_BUZZED*SR && bac < INTOX_MUSCLEIMP*SR) - move_delay_mod += -0.75 sprint_cost_factor += -0.1 if(prob(5)) to_chat(src,"You feel buzzed.") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0856ba1f678..559d2bd4084 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -104,22 +104,21 @@ if(!InStasis()) ..() -// Calculate how vulnerable the human is to under- and overpressure. -// Returns 0 (equals 0 %) if sealed in an undamaged suit, 1 if unprotected (equals 100%). +// Calculate how vulnerable the human is to the current pressure. +// Returns 0 (equals 0 %) if sealed in an undamaged suit that's rated for the pressure, 1 if unprotected (equals 100%). // Suitdamage can modifiy this in 10% steps. -/mob/living/carbon/human/get_pressure_weakness() - var/pressure_adjustment_coefficient = 1 // Assume no protection at first. - - if(wear_suit && (wear_suit.item_flags & STOPPRESSUREDAMAGE) && head && (head.item_flags & STOPPRESSUREDAMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed. - pressure_adjustment_coefficient = 0 - - // Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure protection. - if(istype(wear_suit,/obj/item/clothing/suit/space)) - var/obj/item/clothing/suit/space/S = wear_suit - if(S.can_breach && S.damage) - pressure_adjustment_coefficient += S.damage * 0.1 - - pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) // So it isn't less than 0 or larger than 1. +/mob/living/carbon/human/get_pressure_weakness(pressure) + var/pressure_adjustment_coefficient = 0 + var/list/zones = list(HEAD, UPPER_TORSO, LOWER_TORSO, LEGS, FEET, ARMS, HANDS) + for(var/zone in zones) + var/list/covers = get_covering_equipped_items(zone) + var/zone_exposure = 1 + for(var/obj/item/clothing/C in covers) + zone_exposure = min(zone_exposure, C.get_pressure_weakness(pressure,zone)) + if(zone_exposure >= 1) + return 1 + pressure_adjustment_coefficient = max(pressure_adjustment_coefficient, zone_exposure) + pressure_adjustment_coefficient = Clamp(pressure_adjustment_coefficient, 0, 1) // So it isn't less than 0 or larger than 1. return pressure_adjustment_coefficient @@ -644,11 +643,14 @@ stamina_recovery *= 1 + 0.3 * chem_effects[CE_SPEEDBOOST] move_delay_mod += -1.5 * chem_effects[CE_SPEEDBOOST] - var/total_phoronloss = 0 for(var/obj/item/I in src) - if(I.contaminated && !(isvaurca(src) && src.species.has_organ[BP_FILTRATION_BIT])) - total_phoronloss += vsc.plc.CONTAMINATION_LOSS - if(!(status_flags & GODMODE)) adjustToxLoss(total_phoronloss) + if(I.contaminated && !(species.flags & PHORON_IMMUNE)) + if(I == r_hand) + apply_damage(vsc.plc.CONTAMINATION_LOSS, BURN, BP_R_HAND) + else if(I == l_hand) + apply_damage(vsc.plc.CONTAMINATION_LOSS, BURN, BP_L_HAND) + else + adjustFireLoss(vsc.plc.CONTAMINATION_LOSS) if (intoxication) handle_intoxication() @@ -776,6 +778,7 @@ if(resting) dizziness = max(0, dizziness - 15) jitteriness = max(0, jitteriness - 15) + drowsiness = max(0, drowsiness - 5) adjustHalLoss(-3) else dizziness = max(0, dizziness - 3) @@ -785,15 +788,21 @@ //Other handle_statuses() - if (drowsyness) - if (drowsyness < 0) - drowsyness = 0 + if (drowsiness) + if (drowsiness < 0) + drowsiness = 0 else - drowsyness-- - eye_blurry = max(2, eye_blurry) - if (prob(5)) - sleeping += 1 - Paralyse(5) + drowsiness-- + eye_blurry = max(drowsiness, eye_blurry) + if(drowsiness > 5) + if(prob(drowsiness/5)) + slurring += rand(1, 5) + if(prob(3)) + make_dizzy(100 + drowsiness) + if(!sleeping) + emote("yawn") + if(prob(drowsiness/10)) + eye_blind += 2 // If you're dirty, your gloves will become dirty, too. if(gloves && germ_level > gloves.germ_level && prob(10)) @@ -1151,15 +1160,21 @@ /mob/living/carbon/human/proc/handle_hud_list(var/force_update = FALSE) if(force_update) hud_updateflag = 1022 - if (BITTEST(hud_updateflag, HEALTH_HUD) && hud_list[HEALTH_HUD]) - var/image/holder = hud_list[HEALTH_HUD] - if(stat == DEAD || (status_flags & FAKEDEATH)) - holder.icon_state = "0" // X_X - else if(is_asystole()) - holder.icon_state = "flatline" - else - holder.icon_state = "[pulse()]" - hud_list[HEALTH_HUD] = holder + + if (BITTEST(hud_updateflag, HEALTH_HUD)) + if(hud_list[HEALTH_HUD]) + var/image/holder = hud_list[HEALTH_HUD] + if(stat == DEAD || (status_flags & FAKEDEATH)) + holder.icon_state = "0" // X_X + else if(is_asystole()) + holder.icon_state = "flatline" + else + holder.icon_state = "[pulse()]" + hud_list[HEALTH_HUD] = holder + if(hud_list[TRIAGE_HUD]) + var/image/holder = hud_list[TRIAGE_HUD] + holder.icon_state = triage_tag + hud_list[TRIAGE_HUD] = holder if (BITTEST(hud_updateflag, LIFE_HUD) && hud_list[LIFE_HUD]) var/image/holder = hud_list[LIFE_HUD] @@ -1368,6 +1383,8 @@ //Any suffocation damage slows stamina regen. //This includes oxyloss from low blood levels var/regen = stamina_recovery * (1 - min(((getOxyLoss()) / exhaust_threshold) + ((get_shock()) / exhaust_threshold), 1)) + if(is_drowsy()) + regen *= 0.85 if (regen > 0) stamina = min(max_stamina, stamina+regen) adjustNutritionLoss(stamina_recovery*0.09) @@ -1438,8 +1455,8 @@ /mob/living/carbon/human/proc/do_fever_effects(var/fever) if(prob(20/3)) // every 30 seconds, roughly to_chat(src, SPAN_WARNING(pick("You feel cold and clammy...", "You shiver as if a breeze has passed through.", "Your muscles ache.", "You feel tired and fatigued."))) - if(prob(20)) // once every 10 seconds, roughly - drowsyness += 4 + if(prob(25)) // once every 8 seconds, roughly + drowsiness += 5 if(prob(20)) adjustHalLoss(5 * min(fever, 5)) // muscle pain from fever if(fever >= 7 && prob(10)) // your organs are boiling, figuratively speaking diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 2277725c1a2..3cdd9b3c40d 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -109,12 +109,12 @@ for it but just ignore it. */ -/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null) +/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null, var/singing = FALSE) var/ending = copytext(message, length(message)) var/pre_ending = copytext(message, length(message) - 1, length(message)) if(speaking) - . = speaking.get_spoken_verb(ending, pre_ending) + . = speaking.get_spoken_verb(ending, pre_ending, singing) else . = ..() diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 5aaba150824..8b28eb482bb 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -191,6 +191,17 @@ var/sprint_cost_factor = 0.9 // Multiplier on stamina cost for sprinting var/exhaust_threshold = 50 // When stamina runs out, the mob takes oxyloss up til this value. Then collapses and drops to walk + // Pulse modifiers + var/low_pulse = 40 + var/norm_pulse = 60 + var/fast_pulse = 90 + var/v_fast_pulse = 120 + var/max_pulse = 160 + + // Blood pressure modifiers + var/bp_base_systolic = 120 + var/bp_base_disatolic = 80 + var/gluttonous = 0 // Can eat some mobs. Values can be GLUT_TINY, GLUT_SMALLER, GLUT_ANYTHING, GLUT_ITEM_TINY, GLUT_ITEM_NORMAL, GLUT_ITEM_ANYTHING, GLUT_PROJECTILE_VOMIT var/stomach_capacity = 5 // How much stuff they can stick in their stomach var/allowed_eat_types = TYPE_ORGANIC @@ -295,7 +306,7 @@ for(var/obj/item/clothing/clothes in H) if(H.l_hand == clothes|| H.r_hand == clothes) continue - if((clothes.body_parts_covered & UPPER_TORSO) && (clothes.body_parts_covered & LOWER_TORSO)) + if((clothes.body_parts_covered & UPPER_TORSO) && (clothes.body_parts_covered & LOWER_TORSO) && !clothes.no_overheat) covered = 1 break @@ -542,7 +553,10 @@ if (!H.exhaust_threshold) return 1 // Handled. + cost += H.getOxyLoss() * 0.1 //The less oxygen we get, the more we strain. cost *= H.sprint_cost_factor + if(H.is_drowsy()) + cost *= 1.25 if (H.stamina == -1) log_debug("Error: Species with special sprint mechanics has not overridden cost function.") return 0 @@ -577,14 +591,15 @@ if(O.is_bruised()) H.adjustOxyLoss(remainder*0.15) H.adjustHalLoss(remainder*0.25) + H.adjustOxyLoss(remainder * 0.2) //Keeping oxyloss small when out of stamina to prevent old issue where running until exhausted sometimes gave you brain damage. if(!pre_move) - H.adjustHalLoss(remainder*0.25) + H.adjustHalLoss(remainder*0.3) H.updatehealth() if((H.get_shock() >= 10) && prob(H.get_shock() *2)) H.flash_pain(H.get_shock()) - if((H.get_shock() + H.getOxyLoss()) >= (exhaust_threshold * 0.8)) + if((H.get_shock() + H.getOxyLoss()*2) >= (exhaust_threshold * 0.8)) H.m_intent = M_WALK H.hud_used.move_intent.update_move_icon(H) to_chat(H, SPAN_DANGER("You're too exhausted to run anymore!")) @@ -602,9 +617,17 @@ return FALSE /datum/species/proc/get_move_trail(var/mob/living/carbon/human/H) - if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) ) - return /obj/effect/decal/cleanable/blood/tracks/footprints - else + if(H.lying) + return /obj/effect/decal/cleanable/blood/tracks/body + else if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET))) + var/obj/item/clothing/shoes + if(H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) + shoes = H.wear_suit + . = shoes.move_trail + if(H.shoes && !.) + shoes = H.shoes + . = shoes.move_trail + if(!.) return move_trail /datum/species/proc/bullet_act(var/obj/item/projectile/P, var/def_zone, var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm index 14c8dcade2a..2a5250bcd91 100644 --- a/code/modules/mob/living/carbon/human/species/species_hud.dm +++ b/code/modules/mob/living/carbon/human/species/species_hud.dm @@ -67,7 +67,7 @@ "i_clothing" = list("loc" = ui_iclothing, "name" = "uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), "o_clothing" = list("loc" = ui_shoes, "name" = "suit", "slot" = slot_wear_suit, "state" = "suit", "toggle" = 1), "l_ear" = list("loc" = ui_glasses, "name" = "left ear", "slot" = slot_l_ear, "state" = "l_ear", "toggle" = 1), - "r_ear" = list("loc" = ui_l_ear, "name" = "right ear", "slot" = slot_r_ear, "state" = "r_ear", "toggle" = 1), + "r_ear" = list("loc" = ui_wrists, "name" = "right ear", "slot" = slot_r_ear, "state" = "r_ear", "toggle" = 1), "head" = list("loc" = ui_mask, "name" = "hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), "suit storage" = list("loc" = ui_sstore1, "name" = "suit storage", "slot" = slot_s_store, "state" = "suitstore"), "back" = list("loc" = ui_back, "name" = "back", "slot" = slot_back, "state" = "back"), diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm index fd9ad41a6d9..ba4ce6f7673 100644 --- a/code/modules/mob/living/carbon/human/species/station/golem.dm +++ b/code/modules/mob/living/carbon/human/species/station/golem.dm @@ -18,6 +18,7 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL, /datum/species/golem name = SPECIES_GOLEM_COAL + short_name = "gol" name_plural = "coal golems" icobase = 'icons/mob/human_races/golem/r_coal.dmi' @@ -29,7 +30,7 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL, language = "Ceti Basic" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch) - flags = NO_BREATHE | NO_PAIN | NO_BLOOD | NO_SCAN | NO_POISON | NO_EMBED + flags = NO_BREATHE | NO_PAIN | NO_BLOOD | NO_SCAN | NO_POISON | NO_EMBED | PHORON_IMMUNE spawn_flags = IS_RESTRICTED siemens_coefficient = 1 rarity_value = 5 @@ -164,6 +165,7 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL, /datum/species/golem/bronze name = SPECIES_GOLEM_BRONZE + short_name = null name_plural = "bronze golems" icobase = 'icons/mob/human_races/golem/r_bronze.dmi' @@ -311,6 +313,7 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL, /datum/species/golem/cloth name = SPECIES_GOLEM_CLOTH + short_name = null name_plural = "cloth golems" icobase = 'icons/mob/human_races/golem/r_cloth.dmi' @@ -770,9 +773,10 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL, /datum/species/golem/homunculus name = SPECIES_GOLEM_MEAT + short_name = null name_plural = "homunculus" - flags = NO_PAIN | NO_SCAN + flags = NO_PAIN | NO_SCAN | PHORON_IMMUNE unarmed_types = list( /datum/unarmed_attack/claws, @@ -836,6 +840,7 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL, /datum/species/golem/adamantine name = SPECIES_GOLEM_ADAMANTINE + short_name = "ada" name_plural = "adamantine golems" icobase = 'icons/mob/human_races/r_golem.dmi' diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm index 63472e8029b..36e22212e3b 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm @@ -119,7 +119,8 @@ bodyfall_sound = /decl/sound_category/bodyfall_machine_sound allowed_accents = list(ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_COC, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_ELYRA, ACCENT_KONYAN, ACCENT_JUPITER, ACCENT_MARTIAN, ACCENT_LUNA, - ACCENT_HIMEO, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_PHONG, ACCENT_SILVERSUN_EXPATRIATE, ACCENT_TTS, ACCENT_EUROPA, ACCENT_EARTH, ACCENT_PLUTO, ACCENT_ASSUNZIONE) + ACCENT_HIMEO, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_PHONG, ACCENT_SILVERSUN_EXPATRIATE, ACCENT_TTS, ACCENT_EUROPA, ACCENT_EARTH, ACCENT_PLUTO, ACCENT_ASSUNZIONE) + allowed_religions = list(RELIGION_NONE, RELIGION_OTHER, RELIGION_CHRISTIANITY, RELIGION_ISLAM, RELIGION_JUDAISM, RELIGION_HINDU, RELIGION_BUDDHISM, RELIGION_TRINARY, RELIGION_SCARAB, RELIGION_TAOISM, RELIGION_LUCEISM) alterable_internal_organs = list() diff --git a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm index 15ef62c2bd5..46d30093e80 100644 --- a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm +++ b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm @@ -70,6 +70,14 @@ stamina = 90 sprint_speed_factor = 1.25 //Evolved for rapid escapes from predators + bp_base_systolic = 100 // Default 120 + bp_base_disatolic = 60 // Default 80 + low_pulse = 30 // Default 40 + norm_pulse = 50 // Default 60 + fast_pulse = 70 // Default 90 + v_fast_pulse = 90 // Default 120 + max_pulse = 130 // Default 160 + body_temperature = T0C + 27 default_h_style = "Skrell Short Tentacles" diff --git a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm index 8cb497293ee..1f0e78120be 100644 --- a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm +++ b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm @@ -26,6 +26,10 @@ age_max = 80 + damage_overlays = 'icons/mob/human_races/masks/dam_tajara.dmi' + damage_mask = 'icons/mob/human_races/masks/dam_mask_tajara.dmi' + blood_mask = 'icons/mob/human_races/masks/blood_tajara.dmi' + num_alternate_languages = 2 secondary_langs = list(LANGUAGE_SIIK_MAAS, LANGUAGE_SIIK_TAJR, LANGUAGE_YA_SSA) name_language = LANGUAGE_SIIK_MAAS @@ -38,6 +42,13 @@ stamina_recovery = 4 sprint_speed_factor = 0.65 sprint_cost_factor = 0.75 + bp_base_systolic = 140 // Default 120 + bp_base_disatolic = 90 // Default 80 + low_pulse = 50 // Default 40 + norm_pulse = 70 // Default 60 + fast_pulse = 100 // Default 90 + v_fast_pulse = 130// Default 120 + max_pulse = 170// Default 160 blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Adhomai in the S'rendarr \ system. They have been brought up into the space age by the Humans and Skrell, who alledgedly influenced their \ @@ -81,7 +92,10 @@ allowed_religions = list(RELIGION_TWINSUNS, RELIGION_MATAKE, RELIGION_RASKARA, RELIGION_NONE, RELIGION_OTHER) default_accent = ACCENT_REPUBICLANSIIK - allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_OLDYASSA) + allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_DINAKK, ACCENT_OLDYASSA) + + inherent_verbs = list( + /mob/living/carbon/human/proc/tie_hair) zombie_type = SPECIES_ZOMBIE_TAJARA diff --git a/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm index 406b3e78455..a609f31fd01 100644 --- a/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm @@ -28,8 +28,7 @@ heat_level_2 = 360 //RaceDefault 380 Default 400 heat_level_3 = 700 //RaceDefault 800 Default 1000 - allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, - ACCENT_RURALDELVAHHI, ACCENT_NOMADDELVAHHI) + allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_RURALDELVAHHI, ACCENT_NOMADDELVAHHI, ACCENT_DINAKK) stomach_capacity = 7 @@ -66,7 +65,7 @@ default_h_style = "M'sai Ears" secondary_langs = list(LANGUAGE_SIIK_MAAS, LANGUAGE_SIIK_TAJR, LANGUAGE_SIGN_TAJARA) - allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR) + allowed_accents = list(ACCENT_REPUBICLANSIIK, ACCENT_NAZIRASIIK, ACCENT_CREVAN, ACCENT_DASNRRASIIK, ACCENT_HIGHHARRSIIK, ACCENT_LOWHARRSIIK, ACCENT_AMOHDASIIK, ACCENT_NORTHRASNRR, ACCENT_DINAKK) max_nutrition_factor = 1.2 max_hydration_factor = 1.2 diff --git a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm index 0265bcf145a..16d4247a6c4 100644 --- a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm @@ -41,6 +41,14 @@ sprint_cost_factor = 1.45 sprint_speed_factor = 3.2 exhaust_threshold = 65 + bp_base_systolic = 80 // Default 120 + bp_base_disatolic = 50 // Default 80 + low_pulse = 20 // Default 40 + norm_pulse = 40 // Default 60 + fast_pulse = 60 // Default 90 + v_fast_pulse = 80// Default 120 + max_pulse = 100// Default 160 + body_temperature = T0C + 24 rarity_value = 3 break_cuffs = TRUE @@ -101,7 +109,7 @@ move_trail = /obj/effect/decal/cleanable/blood/tracks/claw allowed_citizenships = list(CITIZENSHIP_IZWESKI, CITIZENSHIP_DOMINIA, CITIZENSHIP_BIESEL, CITIZENSHIP_SOL, CITIZENSHIP_COALITION, CITIZENSHIP_ELYRA, CITIZENSHIP_ERIDANI) - allowed_religions = list(RELIGION_THAKH, RELIGION_SKAKH, RELIGION_SIAKH, RELIGION_AUTAKH, RELIGION_MOROZ, RELIGION_NONE, RELIGION_OTHER, RELIGION_CHRISTIANITY, RELIGION_ISLAM) + allowed_religions = list(RELIGION_THAKH, RELIGION_SKAKH, RELIGION_SIAKH, RELIGION_AUTAKH, RELIGION_MOROZ, RELIGION_NONE, RELIGION_OTHER) default_citizenship = CITIZENSHIP_IZWESKI zombie_type = SPECIES_ZOMBIE_UNATHI diff --git a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm index bf05310ee30..6017a688d12 100644 --- a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm +++ b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm @@ -70,7 +70,7 @@ heat_level_1 = 330 //Default 360 heat_level_2 = 380 //Default 400 heat_level_3 = 600 //Default 1000 - flags = NO_SLIP | NO_CHUBBY | NO_ARTERIES + flags = NO_SLIP | NO_CHUBBY | NO_ARTERIES | PHORON_IMMUNE spawn_flags = CAN_JOIN | IS_WHITELISTED | NO_AGE_MINIMUM appearance_flags = HAS_SKIN_COLOR | HAS_HAIR_COLOR blood_color = COLOR_VAURCA_BLOOD // dark yellow diff --git a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm index bec26b5a20a..6f69148722c 100644 --- a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm @@ -76,7 +76,7 @@ stamina_recovery = 3 spawn_flags = IS_RESTRICTED - flags = NO_SCAN | NO_SLIP | NO_ARTERIES + flags = NO_SCAN | NO_SLIP | NO_ARTERIES | PHORON_IMMUNE inherent_verbs = list( /mob/living/carbon/human/proc/bugbite @@ -137,7 +137,7 @@ warning_high_pressure = 3250 //Default 325 spawn_flags = IS_RESTRICTED - flags = NO_SCAN | NO_SLIP | NO_PAIN | NO_BREATHE | NO_ARTERIES + flags = NO_SCAN | NO_SLIP | NO_PAIN | NO_BREATHE | NO_ARTERIES | PHORON_IMMUNE inherent_verbs = list( /mob/living/carbon/human/proc/rebel_yell, diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm index c703057088e..97f297e0c19 100644 --- a/code/modules/mob/living/carbon/human/stripping.dm +++ b/code/modules/mob/living/carbon/human/stripping.dm @@ -49,7 +49,16 @@ var/obj/item/clothing/under/suit = w_uniform if(!istype(suit) || !LAZYLEN(suit.accessories)) return 0 - var/obj/item/clothing/accessory/A = suit.accessories[1] + var/obj/item/clothing/accessory/A + if(LAZYLEN(suit.accessories) > 1) + var/list/options = list() + for (var/obj/item/clothing/accessory/i in suit.accessories) + var/image/radial_button = image(icon = i.icon, icon_state = i.icon_state) + options[i] = radial_button + A = show_radial_menu(user, user, options, radius = 42, tooltips = TRUE) + else + A = suit.accessories[1] + if(!istype(A)) return 0 visible_message("\The [usr] is trying to remove \the [src]'s [A.name]!") diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index cb51f7efc61..722cdf0dbc0 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -94,28 +94,29 @@ There are several things that need to be remembered: #define UNIFORM_LAYER 7 #define ID_LAYER 8 #define SHOES_LAYER 9 -#define GLOVES_LAYER 10 -#define BELT_LAYER 11 -#define SUIT_LAYER 12 -#define ID_LAYER_ALT 13 -#define TAIL_NORTH_LAYER 14 -#define GLASSES_LAYER 15 -#define BELT_LAYER_ALT 16 -#define SUIT_STORE_LAYER 17 -#define BACK_LAYER 18 -#define HAIR_LAYER 19 -#define L_EAR_LAYER 20 -#define R_EAR_LAYER 21 -#define FACEMASK_LAYER 22 -#define HEAD_LAYER 23 -#define COLLAR_LAYER 24 -#define HANDCUFF_LAYER 25 -#define LEGCUFF_LAYER 26 -#define L_HAND_LAYER 27 -#define R_HAND_LAYER 28 -#define WRISTS_LAYER 29 -#define FIRE_LAYER 30 //If you're on fire -#define TOTAL_LAYERS 30 +#define GLOVES_LAYER 10 +#define BELT_LAYER 11 +#define SUIT_LAYER 12 +#define ID_LAYER_ALT 13 +#define TAIL_NORTH_LAYER 14 +#define GLASSES_LAYER 15 +#define BELT_LAYER_ALT 16 +#define SUIT_STORE_LAYER 17 +#define BACK_LAYER 18 +#define HAIR_LAYER 19 +#define GLASSES_LAYER_ALT 20 +#define L_EAR_LAYER 21 +#define R_EAR_LAYER 22 +#define FACEMASK_LAYER 23 +#define HEAD_LAYER 24 +#define COLLAR_LAYER 25 +#define HANDCUFF_LAYER 26 +#define LEGCUFF_LAYER 27 +#define L_HAND_LAYER 28 +#define R_HAND_LAYER 29 +#define WRISTS_LAYER 30 +#define FIRE_LAYER 31 //If you're on fire +#define TOTAL_LAYERS 31 ////////////////////////////////// #define UNDERSCORE_OR_NULL(target) "[target ? "[target]_" : ""]" @@ -248,7 +249,7 @@ There are several things that need to be remembered: //Overlays for the worn overlay so you can overlay while you overlay //eg: ammo counters, primed grenade flashing, etc. //"icon_file" is used automatically for inhands etc. to make sure it gets the correct inhand file -/obj/item/proc/worn_overlays(icon_file, var/contained_flag = "") +/obj/item/proc/worn_overlays(icon_file, slot, var/contained_flag = "") . = list() if(build_from_parts) var/mutable_appearance/M = mutable_appearance(icon_file, "[item_state][contained_flag]_[worn_overlay]") @@ -570,6 +571,11 @@ There are several things that need to be remembered: var/image/standing = image(icon = under_icon, icon_state = under_state) standing.color = w_uniform.color + + var/image/worn_overlays = w_uniform.worn_overlays(under_icon, slot_w_uniform, w_uniform.contained_sprite ? WORN_UNDER : null) + if(worn_overlays) + standing.overlays.Add(worn_overlays) + var/list/ovr //apply blood overlay @@ -711,7 +717,25 @@ There are several things that need to be remembered: if(glasses_overlay) glasses_overlay.appearance_flags = RESET_ALPHA - overlays_raw[GLASSES_LAYER] = glasses_overlay + + if(!glasses) + overlays_raw[GLASSES_LAYER] = null + overlays_raw[GLASSES_LAYER_ALT] = null + if(update_icons) + update_icon() + return + + var/normal_layer = TRUE + if(istype(glasses, /obj/item/clothing/glasses)) + var/obj/item/clothing/glasses/G = glasses + normal_layer = G.normal_layer + + if(normal_layer) + overlays_raw[GLASSES_LAYER] = glasses_overlay + overlays_raw[GLASSES_LAYER_ALT] = null + else + overlays_raw[GLASSES_LAYER] = null + overlays_raw[GLASSES_LAYER_ALT] = glasses_overlay if(update_icons) update_icon() @@ -720,7 +744,7 @@ There are several things that need to be remembered: if(QDELING(src)) return - if(check_draw_ears()) + if(check_draw_left_ear()) if(l_ear) var/image/result_layer = null @@ -746,7 +770,7 @@ There are several things that need to be remembered: if(l_ear.color) result_layer.color = l_ear.color - var/image/worn_overlays = l_ear.worn_overlays(t_icon, l_ear.contained_sprite ? WORN_LEAR : null) + var/image/worn_overlays = l_ear.worn_overlays(t_icon, slot_l_ear, l_ear.contained_sprite ? WORN_LEAR : null) if(worn_overlays) result_layer.overlays.Add(worn_overlays) @@ -763,7 +787,7 @@ There are several things that need to be remembered: if(QDELING(src)) return - if(check_draw_ears()) + if(check_draw_right_ear()) if(r_ear) var/image/result_layer = null @@ -789,7 +813,7 @@ There are several things that need to be remembered: if(r_ear.color) result_layer.color = r_ear.color - var/image/worn_overlays = r_ear.worn_overlays(t_icon, r_ear.contained_sprite ? WORN_REAR : null) + var/image/worn_overlays = r_ear.worn_overlays(t_icon, slot_r_ear, r_ear.contained_sprite ? WORN_REAR : null) if(worn_overlays) result_layer.overlays.Add(worn_overlays) @@ -830,7 +854,7 @@ There are several things that need to be remembered: if(shoes.color) result_layer.color = shoes.color - var/image/worn_overlays = shoes.worn_overlays(t_icon, shoes.contained_sprite ? WORN_SHOES : null) + var/image/worn_overlays = shoes.worn_overlays(t_icon, slot_shoes, shoes.contained_sprite ? WORN_SHOES : null) if(worn_overlays) result_layer.overlays.Add(worn_overlays) @@ -923,7 +947,7 @@ There are several things that need to be remembered: standing.color = head.color standing.appearance_flags = RESET_ALPHA - var/image/worn_overlays = head.worn_overlays(t_icon, head.contained_sprite ? WORN_HEAD : null) + var/image/worn_overlays = head.worn_overlays(t_icon, slot_head, head.contained_sprite ? WORN_HEAD : null) if(worn_overlays) standing.overlays.Add(worn_overlays) @@ -979,7 +1003,7 @@ There are several things that need to be remembered: result_layer.color = belt.color result_layer.appearance_flags = RESET_ALPHA - var/image/worn_overlays = belt.worn_overlays(t_icon, belt.contained_sprite ? WORN_BELT : null) + var/image/worn_overlays = belt.worn_overlays(t_icon, slot_belt, belt.contained_sprite ? WORN_BELT : null) if(worn_overlays) result_layer.add_overlay(worn_overlays) @@ -1045,7 +1069,7 @@ There are several things that need to be remembered: result_layer.color = wear_suit.color result_layer.appearance_flags = RESET_ALPHA - var/image/worn_overlays = wear_suit.worn_overlays(t_icon, wear_suit.contained_sprite ? WORN_SUIT : null) + var/image/worn_overlays = wear_suit.worn_overlays(t_icon, slot_wear_suit, wear_suit.contained_sprite ? WORN_SUIT : null) if(worn_overlays) result_layer.overlays.Add(worn_overlays) @@ -1288,7 +1312,7 @@ There are several things that need to be remembered: if(l_hand.color) result_layer.color = l_hand.color - var/image/worn_overlays = l_hand.worn_overlays(t_icon, l_hand.contained_sprite ? WORN_LHAND : null) + var/image/worn_overlays = l_hand.worn_overlays(t_icon, slot_l_hand, l_hand.contained_sprite ? WORN_LHAND : null) if(worn_overlays) result_layer.overlays.Add(worn_overlays) @@ -1338,7 +1362,7 @@ There are several things that need to be remembered: if(r_hand.color) result_layer.color = r_hand.color - var/image/worn_overlays = r_hand.worn_overlays(t_icon, r_hand.contained_sprite ? WORN_RHAND : null) + var/image/worn_overlays = r_hand.worn_overlays(t_icon, slot_r_hand, r_hand.contained_sprite ? WORN_RHAND : null) if(worn_overlays) result_layer.overlays.Add(worn_overlays) @@ -1356,25 +1380,19 @@ There are several things that need to be remembered: if(check_draw_wrists()) //determine icon state to use var/t_state = wrists.item_state || wrists.icon_state - + var/icon/t_icon var/image/result_layer if(wrists.contained_sprite) wrists.auto_adapt_species(src) + t_icon = wrists.icon t_state = "[UNDERSCORE_OR_NULL(wrists.icon_species_tag)][wrists.item_state][WORN_WRISTS]" result_layer = image(wrists.icon_override || wrists.icon, t_state) - - if(wrists.color) - result_layer.color = wrists.color - - result_layer.appearance_flags = RESET_ALPHA - overlays_raw[WRISTS_LAYER] = result_layer else if(wrists.item_state_slots && wrists.item_state_slots[slot_wrists_str]) t_state = wrists.item_state_slots[slot_wrists_str] //determine icon to use - var/icon/t_icon if(wrists.item_icons && (slot_wrists_str in wrists.item_icons)) t_icon = wrists.item_icons[slot_wrists_str] else if(wrists.icon_override) @@ -1385,15 +1403,15 @@ There are several things that need to be remembered: result_layer = image(t_icon, t_state) - if(wrists.color) - result_layer.color = wrists.color + if(wrists.color) + result_layer.color = wrists.color - var/image/worn_overlays = wrists.worn_overlays(t_icon, wrists.contained_sprite ? WORN_WRISTS : null) - if(worn_overlays) - result_layer.overlays.Add(worn_overlays) + var/image/worn_overlays = wrists.worn_overlays(t_icon, slot_wrists, wrists.contained_sprite ? WORN_WRISTS : null) + if(worn_overlays) + result_layer.overlays.Add(worn_overlays) - result_layer.appearance_flags = RESET_ALPHA - overlays_raw[WRISTS_LAYER] = result_layer + result_layer.appearance_flags = RESET_ALPHA + overlays_raw[WRISTS_LAYER] = result_layer if(update_icons) update_icon() @@ -1568,15 +1586,24 @@ There are several things that need to be remembered: else return TRUE -/mob/living/carbon/human/proc/check_draw_ears() - if (!l_ear && !r_ear) +/mob/living/carbon/human/proc/check_draw_right_ear() + if (!r_ear) return FALSE - else if ((l_ear && (l_ear.flags_inv & ALWAYSDRAW)) || (r_ear && (r_ear.flags_inv & ALWAYSDRAW))) + else if (r_ear.flags_inv & ALWAYSDRAW) return TRUE - else if( (head && (head.flags_inv & (HIDEEARS))) || (wear_mask && (wear_mask.flags_inv & (HIDEEARS)))) + else if ((head && (head.flags_inv & (HIDEEARS))) || (wear_mask && (wear_mask.flags_inv & (HIDEEARS)))) return FALSE - else + return TRUE + + +/mob/living/carbon/human/proc/check_draw_left_ear() + if (!l_ear) + return FALSE + else if (l_ear.flags_inv & ALWAYSDRAW) return TRUE + else if ((head && (head.flags_inv & (HIDEEARS))) || (wear_mask && (wear_mask.flags_inv & (HIDEEARS)))) + return FALSE + return TRUE /mob/living/carbon/human/proc/check_draw_glasses() if (!glasses) diff --git a/code/modules/mob/living/carbon/slime/items.dm b/code/modules/mob/living/carbon/slime/items.dm index 3c554a22cef..9d440dbf0c5 100644 --- a/code/modules/mob/living/carbon/slime/items.dm +++ b/code/modules/mob/living/carbon/slime/items.dm @@ -224,7 +224,6 @@ icon_state = "golem" unacidable = TRUE layer = TURF_LAYER - var/wizardy = FALSE //if this rune can only be used by a wizard or not var/golem_type = "Adamantine Golem" /obj/effect/golemrune/Initialize() @@ -272,17 +271,11 @@ G.accent = G.species.default_accent G.preEquipOutfit(/datum/outfit/admin/golem, FALSE) G.equipOutfit(/datum/outfit/admin/golem, FALSE) - if(wizardy) - wizard_golems.add_antagonist(G.mind, TRUE, TRUE, FALSE, TRUE, TRUE) - else - to_chat(G, SPAN_NOTICE("You are a golem. Serve your master, and assist them in completing their goals at any cost.")) + to_chat(G, SPAN_NOTICE("You are a golem. Serve your master, and assist them in completing their goals at any cost.")) qdel(src) return G -/obj/effect/golemrune/wizard - wizardy = TRUE - /mob/living/carbon/slime/has_eyes() return FALSE diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm index f157628f525..35b3a763e90 100644 --- a/code/modules/mob/living/carbon/slime/say.dm +++ b/code/modules/mob/living/carbon/slime/say.dm @@ -1,7 +1,5 @@ /mob/living/carbon/slime/say(var/message) - message = sanitize(message) - var/verb = say_quote(message) if(copytext(message,1,2) == "*") @@ -36,4 +34,4 @@ speech_buffer = list() speech_buffer.Add(speaker) speech_buffer.Add(lowertext(html_decode(message))) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index f6eeb59ba11..74e0faea0ac 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -66,7 +66,7 @@ if(EYE_BLUR) eye_blurry = max(eye_blurry, effect * BLOCKED_MULT(blocked)) if(DROWSY) - drowsyness = max(drowsyness, effect * BLOCKED_MULT(blocked)) + drowsiness = max(drowsiness, effect * BLOCKED_MULT(blocked)) if(INCINERATE) IgniteMob(effect * BLOCKED_MULT(blocked)) updatehealth() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9e96a1afac7..a2b44590ee0 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -10,7 +10,7 @@ //mob verbs are faster than object verbs. See above. var/mob/living/next_point_time = 0 -/mob/living/pointed(atom/A as mob|obj|turf in view()) +/mob/living/pointed(atom/movable/A as mob|obj|turf in view()) if(!isturf(src.loc) || !(A in range(world.view, get_turf(src)))) return FALSE if(src.stat || !src.canmove || src.restrained()) @@ -29,15 +29,11 @@ var/mob/living/next_point_time = 0 pointing_effect.invisibility = invisibility addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, pointing_effect), 2 SECONDS) else - var/pointglow = filter(type = "drop_shadow", x = 0, y = -1, offset = 1, size = 1, color = "#F00") - LAZYADD(A.filters, pointglow) - addtimer(CALLBACK(src, .proc/remove_filter, A, pointglow), 20) + A.add_filter("pointglow", 1, list(type = "drop_shadow", x = 0, y = -1, offset = 1, size = 1, color = "#F00")) + addtimer(CALLBACK(A, /atom/movable.proc/remove_filter, "pointglow"), 2 SECONDS) visible_message("\The [src] points to \the [A].") return TRUE -/mob/living/proc/remove_filter(var/atom/A, var/filter_to_remove) - LAZYREMOVE(A.filters, filter_to_remove) - /*one proc, four uses swapping: if it's 1, the mobs are trying to switch, if 0, non-passive is pushing passive default behaviour is: @@ -239,7 +235,7 @@ default behaviour is: return -//sort of a legacy burn method for /electrocute, /shock, and the e_chair +//sort of a legacy burn method for /electrocute, /shock /mob/living/proc/burn_skin(burn_amount) if(istype(src, /mob/living/carbon/human)) if(mShock in src.mutations) //shockproof @@ -809,6 +805,11 @@ default behaviour is: /mob/living/proc/has_eyes() return 1 +/mob/living/proc/eyes_protected(var/obj/stab_item, var/stabbed = FALSE) // if stabbed is set to true if we're being stabbed and not just checking + if(!has_eyes()) + return TRUE + return FALSE + /mob/living/proc/slip(var/slipped_on,stun_duration=8) return 0 diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 1585b3c4f40..371d013e5ec 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -95,7 +95,7 @@ apply_effect(agony_amount / 10, EYE_BLUR) /mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/tesla_shock = 0, var/ground_zero) - return 0 //only carbon liveforms have this proc + return 0 //only carbon liveforms have this proc /mob/living/emp_act(severity) var/list/L = src.get_contents() @@ -119,11 +119,9 @@ var/turf/simulated/location = get_turf(src) if(istype(location)) location.add_blood_floor(src) - return blocked - //returns 0 if the effects failed to apply for some reason, 1 otherwise. /mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) - if(!effective_force || blocked >= 100) + if(!effective_force) return FALSE //Hulk modifier @@ -132,13 +130,8 @@ //Apply weapon damage var/damage_flags = I.damage_flags() - if(prob(blocked)) //armor provides a chance to turn sharp/edge weapon attacks into blunt ones - damage_flags &= ~DAM_SHARP - damage_flags &= ~DAM_EDGE - apply_damage(effective_force, I.damtype, hit_zone, blocked, used_weapon=I, damage_flags = damage_flags) - - return TRUE + return apply_damage(effective_force, I.damtype, hit_zone, I, damage_flags, I.armor_penetration) //this proc handles being hit by a thrown atom /mob/living/hitby(atom/movable/AM, var/speed = THROWFORCE_SPEED_DIVISOR)//Standardization and logging -Sieve diff --git a/code/modules/mob/living/parasite/meme_captive.dm b/code/modules/mob/living/parasite/meme_captive.dm index ab9ddbf5566..67415f310ab 100644 --- a/code/modules/mob/living/parasite/meme_captive.dm +++ b/code/modules/mob/living/parasite/meme_captive.dm @@ -6,7 +6,6 @@ /mob/living/parasite/captive_brain/say(var/message) if(istype(src.loc,/mob/living/parasite/meme)) - message = sanitize(message) if (!message) return log_say("[key_name(src)] : [message]",ckey=key_name(src)) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index b349ec0dcc4..e9fd12a588e 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -200,6 +200,12 @@ proc/get_radio_key_from_channel(var/channel) else speaking = get_default_language() + var/is_singing = FALSE + if(length(message) >= 1 && copytext(message, 1, 2) == "%") + message = copytext(message, 2) + if(speaking?.sing_verb) + is_singing = TRUE + // This is broadcast to all mobs with the language, // irrespective of distance or anything else. if(speaking && (speaking.flags & HIVEMIND)) @@ -209,7 +215,7 @@ proc/get_radio_key_from_channel(var/channel) speaking.broadcast(src,trim(message)) return 1 - verb = say_quote(message, speaking) + verb = say_quote(message, speaking, is_singing) if(is_muzzled()) to_chat(src, "You're muzzled and cannot speak!") @@ -229,6 +235,9 @@ proc/get_radio_key_from_channel(var/channel) return 0 message = process_chat_markup(message, list("~", "_")) + if(is_singing) + var/randomnote = pick("\u2669", "\u266A", "\u266B") + message = "[randomnote] [message] [randomnote]" //handle nonverbal and sign languages here if (speaking) @@ -237,7 +246,7 @@ proc/get_radio_key_from_channel(var/channel) src.custom_emote(VISIBLE_MESSAGE, "[pick(speaking.signlang_verb)].") if (speaking.flags & SIGNLANG) - return say_signlang(message, pick(speaking.signlang_verb), speaking) + return say_signlang(message, pick(speaking.signlang_verb), speaking, speaking.sign_adv_length) var/list/obj/item/used_radios = new var/list/successful_radio = new // passes a list because standard vars don't work when passed @@ -296,11 +305,9 @@ proc/get_radio_key_from_channel(var/channel) INVOKE_ASYNC(GLOBAL_PROC, /proc/animate_speechbubble, speech_bubble, hear_clients, 30) do_animate_chat(message, speaking, italics, hear_clients, 30) - for(var/o in listening_obj) - var/obj/O = o - spawn(0) - if(O) //It's possible that it could be deleted in the meantime. - O.hear_talk(src, message, verb, speaking) + for(var/obj/O as anything in listening_obj) + if(O) //It's possible that it could be deleted in the meantime. + INVOKE_ASYNC(O, /obj/.proc/hear_talk, src, message, verb, speaking) if(mind) mind.last_words = message @@ -325,11 +332,11 @@ proc/get_radio_key_from_channel(var/channel) for(var/client/C in show_to) C.images -= I -/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language) +/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language, var/list/sign_adv_length) log_say("[key_name(src)] : ([get_lang_name(language)]) [message]",ckey=key_name(src)) for (var/mob/O in viewers(src, null)) - O.hear_signlang(message, verb, language, src) + O.hear_signlang(message, verb, language, src, sign_adv_length) return 1 /obj/effect/speech_bubble diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 8e1809a030e..acc9284a412 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -179,7 +179,7 @@ var/list/ai_verbs_default = list( if(B.brainmob.mind) B.brainmob.mind.transfer_to(src) if(B.brainobj) - B.brainobj.lobotomized = TRUE + B.brainobj.prepared = TRUE on_mob_init() @@ -651,17 +651,21 @@ var/list/ai_verbs_default = list( else to_chat(usr, SPAN_WARNING("There are no humanoids within camera view to base your hologram on.")) else - input = input("Please select a hologram:") as null|anything in list("default", "floating face", "carp", "custom") + input = input("Please select a hologram:") as null|anything in list("default", "floating face", "carp", "loadout character", "custom") if(input) - if(input == "custom") - if(custom_sprite) - var/datum/custom_synth/sprite = robot_custom_icons[name] - if(istype(sprite) && sprite.synthckey == ckey && sprite.aiholoicon) - set_hologram_unique(icon("icons/mob/custom_synths/customhologram.dmi", "[sprite.aiholoicon]")) + switch(input) + if("custom") + if(custom_sprite) + var/datum/custom_synth/sprite = robot_custom_icons[name] + if(istype(sprite) && sprite.synthckey == ckey && sprite.aiholoicon) + set_hologram_unique(icon("icons/mob/custom_synths/customhologram.dmi", "[sprite.aiholoicon]")) + else + to_chat(src, SPAN_WARNING("You do not have a custom sprite!")) + if("loadout character") + var/mob/living/carbon/human/H = SSmob.get_mannequin(usr.client.ckey) + holo_icon.appearance = H.appearance else - to_chat(src, SPAN_WARNING("You do not have a custom sprite!")) - else - set_hologram_unique(icon('icons/mob/AI.dmi', input)) + set_hologram_unique(icon('icons/mob/AI.dmi', input)) /mob/living/silicon/ai/proc/set_hologram_unique(var/icon/I) QDEL_NULL(holo_icon) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 4398ac4f8c7..1480e4a95f0 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -25,8 +25,9 @@ "Cat" = "cat", "Rat" = "rat", "Monkey" = "monkey", - "Rabbit" = "rabbit" - + "Rabbit" = "rabbit", + "Parrot" = "parrot", + "Fox" = "fox" ) var/global/list/pai_holder_types = list( @@ -34,7 +35,9 @@ "Cat" = /obj/item/holder/pai/cat, "Rat" = /obj/item/holder/pai/rat, "Monkey" = /obj/item/holder/pai/monkey, - "Rabbit" = /obj/item/holder/pai/rabbit + "Rabbit" = /obj/item/holder/pai/rabbit, + "Parrot" = /obj/item/holder/pai/parrot, + "Fox" = /obj/item/holder/pai/fox ) var/global/list/possible_say_verbs = list( @@ -371,18 +374,17 @@ set category = "pAI Commands" set name = "Choose Chassis" - var/choice - var/finalized = "No" - while(finalized == "No" && src.client) - set_custom_sprite() - choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in possible_chassis - if(!choice) return + var/list/options = list() + for(var/i in possible_chassis) + var/image/radial_button = image(icon = src.icon, icon_state = possible_chassis[i]) + options[i] = radial_button + var/choice = show_radial_menu(src, recursive_loc_turf_check(src), options, radius = 42, tooltips = TRUE) + if(!choice) + return + icon_state = possible_chassis[choice] + holder_type = pai_holder_types[choice] + chassis = icon_state - icon_state = possible_chassis[choice] - holder_type = pai_holder_types[choice] - finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes") - - chassis = possible_chassis[choice] verbs -= /mob/living/silicon/pai/proc/choose_chassis verbs += /mob/living/proc/hide diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 715383db021..092f22fb4da 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -282,32 +282,37 @@ /obj/item/robot_parts/robot_component/binary_communication_device name = "binary communication device" + desc = "A module used for binary communications over encrypted frequencies, commonly used by synthetic robots." icon_state = "binradio" icon_state_broken = "binradio_broken" /obj/item/robot_parts/robot_component/actuator name = "actuator" + desc = "A modular, hydraulic actuator used by exosuits and robots alike for movement and manipulation." icon_state = "motor" icon_state_broken = "motor_broken" /obj/item/robot_parts/robot_component/armor name = "armor plating" + desc = "A pair of flexible, adaptable armor plates, used to protect the internals of robots." icon_state = "armor" icon_state_broken = "armor_broken" /obj/item/robot_parts/robot_component/surge name = "surge preventor" - desc = "Cyborg component designed to save internal electronics from damage of EMP pulse." + desc = "A high-tech device designed to safeguard the internal battery from electromagnetic pulses." icon_state = "surge" icon_state_broken = "surge_broken" /obj/item/robot_parts/robot_component/camera name = "camera" + desc = "A modified camera module used as a visual receptor for robots and exosuits, also serving as a relay for wireless video feed." icon_state = "camera" icon_state_broken = "camera_broken" /obj/item/robot_parts/robot_component/diagnosis_unit name = "diagnostics unit" + desc = "An internal computer and sensors used by robots and exosuits to accurately diagnose any system discrepancies on their components." icon_state = "analyser" icon_state_broken = "analyser_broken" @@ -319,5 +324,6 @@ /obj/item/robot_parts/robot_component/radio name = "radio" + desc = "A modular, multi-frequency radio used by robots and exosuits to enable communication systems. Comes with built-in subspace receivers." icon_state = "radio" icon_state_broken = "radio_broken" \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm index b6a17d13b52..c1af9fa02ff 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -3,8 +3,6 @@ return ..(message) if(local_transmit) - message = sanitize(message) - if(stat == DEAD) return say_dead(message) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index d1c190d1e63..b58aacc4795 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -1,194 +1,3 @@ -/mob/living/silicon/robot/emote(var/act, var/m_type = 1, var/message) - var/param - if(findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - switch(act) - if("me") - if(client?.prefs.muted & MUTE_IC) - to_chat(src, SPAN_WARNING("You cannot send IC messages (muted).")) - return - if(!message || stat) - return - else - return custom_emote(m_type, message) - if("custom") - return custom_emote(m_type, message) - if("salute") - if(!buckled_to) - var/M - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - if(param) - message = "salutes to [param]." - else - message = "salutes." - m_type = 1 - if("bow") - if(!buckled_to) - var/M - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "bows to [param]." - else - message = "bows." - m_type = 1 - - if("clap") - if(!restrained()) - message = "claps." - m_type = 2 - if("flap") - if(!restrained()) - message = "flaps its wings." - m_type = 2 - - if("aflap") - if(!restrained()) - message = "flaps its wings ANGRILY!" - m_type = 2 - - if("twitch") - message = "twitches violently." - m_type = 1 - - if("twitch_s") - message = "twitches." - m_type = 1 - - if("nod") - message = "nods." - m_type = 1 - - if("deathgasp") - message = "shudders violently for a moment, then becomes motionless, its eyes slowly darkening." - m_type = 1 - - if("glare") - var/M - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "glares at [param]." - else - message = "glares." - - if("stare") - var/M - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "stares at [param]." - else - message = "stares." - - if("look") - var/M - if(param) - for(var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - - if(!M) - param = null - - if(param) - message = "looks at [param]." - else - message = "looks." - m_type = 1 - - if("beep") - var/M - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "beeps at [param]." - else - message = "beeps." - playsound(loc, 'sound/machines/twobeep.ogg', 50, 0) - m_type = 1 - - if("ping") - var/M - if(param) - for(var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "pings at [param]." - else - message = "pings." - playsound(loc, 'sound/machines/ping.ogg', 50, 0) - m_type = 1 - - if("buzz") - var/M - if(param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "buzzes at [param]." - else - message = "buzzes." - playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) - m_type = 1 - - if("help") - to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt") - else - to_chat(src, SPAN_NOTICE("Unusable emote '[act]'. Say *help for a list.")) - - if(message && stat == CONSCIOUS) - custom_emote(m_type, message) - - return - /mob/living/silicon/robot/verb/powerwarn() set category = "Robot Commands" set name = "Power Warning" diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 6b1cb6cfbbe..c95300c31a1 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -3,7 +3,10 @@ //Returns the thing in our active hand (whatever is in our active module-slot, in this case) /mob/living/silicon/robot/get_active_hand() - // TODO: see if refactoring this to return the gripped object (should one exist) works - would make a lot of edge cases a lot simpler + if(istype(module_active, /obj/item/gripper)) + var/obj/item/gripper/G = module_active + if(G.wrapped) + return G.wrapped return module_active /mob/living/silicon/robot/proc/return_wirecutter() @@ -251,11 +254,16 @@ W.forceMove(get_turf(src)) return FALSE +/mob/living/silicon/robot/remove_from_mob(var/obj/O) //Necessary to clear gripper when trying to place items in things (grinders, smartfridges, vendors, etc) + if(istype(module_active, /obj/item/gripper)) + var/obj/item/gripper/G = module_active + if(G.wrapped == O) + G.drop(get_turf(src), FALSE) //We don't need to see the "released X item" message if we're putting stuff in fridges and the like. /mob/living/silicon/robot/drop_item() - if (istype(module_active, /obj/item/gripper)) + if(istype(module_active, /obj/item/gripper)) var/obj/item/gripper/G = module_active - if (G.wrapped) + if(G.wrapped) G.drop_item() return uneq_active() diff --git a/code/modules/mob/living/silicon/robot/items/robot_parts.dm b/code/modules/mob/living/silicon/robot/items/robot_parts.dm index 133492bb9ee..c9f224439ef 100644 --- a/code/modules/mob/living/silicon/robot/items/robot_parts.dm +++ b/code/modules/mob/living/silicon/robot/items/robot_parts.dm @@ -224,25 +224,10 @@ if(istype(W, /obj/item/device/mmi)) var/obj/item/device/mmi/M = W if(check_completion()) - if(!istype(loc, /turf)) + if(!isturf(loc)) to_chat(user, SPAN_WARNING("You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise.")) return - if(!M.brainmob) - to_chat(user, SPAN_WARNING("\The [M] is empty!")) - return - if(!M.brainmob.key) - var/ghost_can_reenter = FALSE - if(M.brainmob.mind) - for(var/mob/abstract/observer/G in player_list) - if(G.can_reenter_corpse && G.mind == M.brainmob.mind) - ghost_can_reenter = TRUE - break - if(!ghost_can_reenter) - to_chat(user, SPAN_WARNING("\The [W] is completely unresponsive.")) - return - - if(M.brainmob.stat == DEAD) - to_chat(user, SPAN_WARNING("\The [M] is dead.")) + if(!M.ready_for_use(user)) return if(!head.law_manager) diff --git a/code/modules/mob/living/silicon/robot/items/robot_tools.dm b/code/modules/mob/living/silicon/robot/items/robot_tools.dm index 1e16bb53e9e..5b98876e99b 100644 --- a/code/modules/mob/living/silicon/robot/items/robot_tools.dm +++ b/code/modules/mob/living/silicon/robot/items/robot_tools.dm @@ -19,6 +19,7 @@ /obj/item/weldingtool/robotic icon = 'icons/obj/robot_items.dmi' + change_icons = FALSE /obj/item/soap/drone name = "integrated soap" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ae76a6a73ff..3332515c9e6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -151,7 +151,7 @@ setup_icon_cache() if(mmi?.brainobj) - mmi.brainobj.lobotomized = TRUE + mmi.brainobj.prepared = TRUE mmi.brainmob.name = src.name mmi.brainmob.real_name = src.name mmi.name = "[initial(mmi.name)]: [src.name]" @@ -391,7 +391,7 @@ custom_name = newname updatename() - if(module) + if(custom_sprite) set_module_sprites(module.sprites) // custom synth icons SSrecords.reset_manifest() @@ -739,7 +739,7 @@ to_chat(user, SPAN_WARNING("\The [src] does not have a radio installed!")) return else if(W.GetID() || istype(W, /obj/item/card/robot)) // trying to unlock the interface with an ID card - if(emagged) //still allow them to open the cover + if(emagged && !is_traitor()) //still allow them to open the cover. is_traitor() dodges this text as being made traitor sets emagged to TRUE. to_chat(user, SPAN_NOTICE("You notice that \the [src]'s interface appears to be damaged.")) if(opened) to_chat(user, SPAN_WARNING("You must close the cover to swipe an ID card.")) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 0b72a411335..e4420f23fc8 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -1,6 +1,3 @@ -/mob/living/silicon/say(message, sanitize = TRUE) - return ..(sanitize ? sanitize(message) : message) - /mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) log_say("[key_name(src)] : [message]",ckey=key_name(src)) diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index 73bfaaa85ff..8cc614d05e5 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -46,13 +46,13 @@ if (!QDELING(src)) strength -= 1 if (strength <= 0) - if (prob(35))//probability to reduce spam + if (prob(25))//probability to reduce spam src.visible_message("The bee swarm completely dissipates.") qdel(src) return else health = maxHealth - if (prob(35))//probability to reduce spam + if (prob(25))//probability to reduce spam src.visible_message("The bee swarm starts to thin out a little.") update_icon() @@ -70,17 +70,20 @@ ..() +/mob/living/simple_animal/bee/proc/verify_stingable(var/mob/living/M) + if(M.isSynthetic()) //Can't sting robots, unfortunately + return FALSE + return TRUE -/mob/living/simple_animal/bee/think() - ..() - if (stat != CONSCIOUS) - return - +/mob/living/simple_animal/bee/proc/do_sting() //if we're strong enough, sting some people var/mob/living/carbon/human/M = target_mob + if(!verify_stingable(M)) //If we can't sting this, why is it our target? + target_mob = null + return FALSE var/sting_prob = 40 // Bees will always try to sting. var/prob_mult = 1 - if(M && (M in view(src,1))) // Can I see my target? + if(Adjacent(M)) //Can I reach my target? var/obj/item/clothing/worn_suit = M.wear_suit var/obj/item/clothing/worn_helmet = M.head if(worn_suit) // Are you wearing clothes? @@ -95,11 +98,23 @@ prob_mult -= 0.01 *(min(LAZYACCESS(worn_helmet.armor, "bio"), 30))// Is your helmet sealed? I can't get to 30% of your body. if( prob(sting_prob*prob_mult) && (M.stat == CONSCIOUS || (M.stat == UNCONSCIOUS && prob(25*prob_mult))) ) // Try to sting! If you're not moving, think about stinging. M.apply_damage(min(strength*0.85,2)+mut, BURN, damage_flags = DAM_SHARP) // Stinging. The more mutated I am, the harder I sting. - M.apply_damage(max(strength*0.2,(round(feral/10,1)*(max((round(strength/20,1)),1)))+toxic), TOX) // Bee venom based on how angry I am and how many there are of me! + var/venom_strength = max(strength*0.2, (round(feral/10,1) * (max(round(strength/20,1), 1)))) + toxic // Bee venom based on how angry I am and how many there are of me! + M.apply_damage(venom_strength, PAIN) //Bee venom causes pain, not organ failure + if(prob(max(80, strength * 10))) //If there's enough of a swarm, it can also cause breathing trouble. Yes, even without being allergic. + M.apply_damage(venom_strength, OXY) + update_icon() to_chat(M, "You have been stung!") M.flash_pain(5) + else + step_to(src, target_mob) +/mob/living/simple_animal/bee/think() + ..() + if (stat != CONSCIOUS) + return + if(target_mob) + do_sting() //calm down a little bit if(feral > 0 && !target_mob) @@ -117,12 +132,12 @@ //calm down and spread out a little var/mob/living/simple_animal/bee/B = new(get_turf(src)) B.strength = rand(1,5) - src.strength -= B.strength + strength -= B.strength update_icon() B.update_icon() - if(src.parent) - B.parent = src.parent - src.parent.owned_bee_swarms.Add(B) + if(parent) + B.parent = parent + parent.owned_bee_swarms.Add(B) //make some noise if(prob(3)) @@ -145,16 +160,19 @@ feral = -15 target_mob = null target_turf = null - wander = 1 + wander = TRUE for(var/mob/living/simple_animal/bee/B in src.loc) if(B == src) continue - if(feral > 0) - src.strength += B.strength + if(feral > 0 && prob(50)) //We'll combine into a stronger swarm if this passes + if(B.strength > strength) //This is so that we'll take the toxic and mut values of the larger swarm, as that will be the majority of bees. If B is smaller, we keep ours. + mut = B.mut + toxic = B.toxic + strength += B.strength B.strength = 0 - B.update_icon() + qdel(B) //We've absorbed the other bees, they're gone. Qdel here to avoid spamming disipate messages update_icon() else if(prob(10)) @@ -162,34 +180,33 @@ var/total_bees = B.strength + src.strength if(total_bees < 10) B.strength = min(5, total_bees) - src.strength = total_bees - B.strength + strength = total_bees - B.strength update_icon() B.update_icon() - if(src.strength <= 0) + if(strength <= 0) qdel(src) return - var/turf/simulated/floor/T = get_step(src, pick(1,2,4,8)) - density = 1 - Move(T) - density = 0 + var/turf/simulated/floor/T = get_step(src, pick(cardinal)) + if(istype(T)) + Move(T) break - if(target_mob)//If we have a target - if(target_mob in view(src,7))//Check that we can still see them + if(target_mob in view(5, src))//Check that we can still see them target_turf = get_turf(target_mob)//If so, update the location - wander = 0 + wander = FALSE else//Otherwise, if our target is out of view, we clear them so we can pick a new one in the next step target_mob = null target_turf = null - wander = 1 + wander = TRUE //If we're angry but have no target, lets search for one if (!target_mob && feral) for(var/mob/living/carbon/G in view(src,7)) - target_mob = G - break + if(verify_stingable(G)) + target_mob = G + break //if we're chasing someone, get a little bit angry if(target_mob && prob(5)) @@ -198,11 +215,11 @@ if(target_turf) if (!(DirBlocked(get_step(src, get_dir(src,target_turf)),get_dir(src,target_turf)))) // Check for windows and doors! Move(get_step(src, get_dir(src,target_turf))) - if (prob(10)) - src.visible_message("The bees swarm after [target_mob]!") - if(src.loc == target_turf) + if(prob(10)) + visible_message("The bees swarm after [target_mob]!") + if(get_turf(src) == target_turf) target_turf = null - wander = 1 + wander = TRUE else //find some flowers, harvest //angry bee swarms don't hang around @@ -239,7 +256,8 @@ apply_damage(strength*0.5, BRUTE, used_weapon = "Crushing by [grabber.name]") else to_chat(grabber, "For some bizarre reason known only to yourself, you attempt to grab ahold of the swarm of bees. You come away with nothing but empty, slightly stung hands.") - grabber.apply_damage(strength*0.5, BURN) + if(verify_stingable(grabber)) + grabber.apply_damage(strength*0.5, BURN) return 0 @@ -268,3 +286,8 @@ maxHealth = 30 strength = 5 feral = 30 + +/mob/living/simple_animal/bee/beegun/Initialize() + . = ..() + mut = rand(0, 1) //We're creating bees out of energy. They have a chance of being mutated... + toxic = rand(0, 1) //...or slightly more toxic \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index 26a52b799f3..bb2d50174d5 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -8,7 +8,6 @@ /mob/living/captive_brain/say(var/message) if(istype(src.loc,/mob/living/simple_animal/borer)) - message = sanitize(message) if(!message) return log_say("[key_name(src)] : [message]", ckey=key_name(src)) diff --git a/code/modules/mob/living/simple_animal/borer/say.dm b/code/modules/mob/living/simple_animal/borer/say.dm index c504b285386..8f9af1a43c2 100644 --- a/code/modules/mob/living/simple_animal/borer/say.dm +++ b/code/modules/mob/living/simple_animal/borer/say.dm @@ -1,5 +1,4 @@ /mob/living/simple_animal/borer/say(var/message) - message = sanitize(message) message = capitalize(message) if(!message) @@ -41,4 +40,4 @@ for(var/mob/M in mob_list) if(M.client && M.stat == DEAD && !isnewplayer(M) && (M.client.prefs.toggles & CHAT_GHOSTEARS)) - to_chat(M, "[src.truename] whispers to [host], \"[message]\"") \ No newline at end of file + to_chat(M, "[src.truename] whispers to [host], \"[message]\"") diff --git a/code/modules/mob/living/simple_animal/constructs/constructs/artificer.dm b/code/modules/mob/living/simple_animal/constructs/constructs/artificer.dm index 399cefc5382..9d3277f9e7c 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs/artificer.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs/artificer.dm @@ -8,7 +8,6 @@ maxHealth = 50 health_prefix = "artificer" response_harm = "viciously beaten" - harm_intent_damage = 5 melee_damage_lower = 10 melee_damage_upper = 10 attacktext = "rammed" diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index b743b038b7e..d7daa15ce37 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -116,37 +116,17 @@ corpseidjob = "Operative" corpseidaccess = "Syndicate" - - -/obj/effect/landmark/mobcorpse/clown - name = "Clown" - corpseuniform = /obj/item/clothing/under/rank/clown - corpseshoes = /obj/item/clothing/shoes/clown_shoes - corpseradio = /obj/item/device/radio/headset - corpsemask = /obj/item/clothing/mask/gas/clown_hat - corpsepocket1 = /obj/item/bikehorn - corpseback = /obj/item/storage/backpack/clown - corpseid = 1 - corpseidjob = "Clown" - corpseidaccess = "Clown" - - - /obj/effect/landmark/mobcorpse/pirate name = "Pirate" corpseshoes = /obj/item/clothing/shoes/jackboots corpseglasses = /obj/item/clothing/glasses/eyepatch corpsehelmet = /obj/item/clothing/head/bandana/pirate - - /obj/effect/landmark/mobcorpse/pirate/ranged name = "Pirate Gunner" corpsesuit = /obj/item/clothing/suit/pirate corpsehelmet = /obj/item/clothing/head/pirate - - /obj/effect/landmark/mobcorpse/russian name = "Russian" corpseshoes = /obj/item/clothing/shoes/jackboots diff --git a/code/modules/mob/living/simple_animal/familiars/familiars.dm b/code/modules/mob/living/simple_animal/familiars/familiars.dm deleted file mode 100644 index a4955d46c6a..00000000000 --- a/code/modules/mob/living/simple_animal/familiars/familiars.dm +++ /dev/null @@ -1,234 +0,0 @@ -/mob/living/simple_animal/familiar - name = "familiar" - desc = "No wizard is complete without a mystical sidekick." - supernatural = 1 - - response_help = "pets" - response_disarm = "pushes" - response_harm = "hits" - - universal_speak = 1 - universal_understand = 1 - - min_oxy = 1 //still require a /bit/ of air. - max_co2 = 0 - unsuitable_atoms_damage = 1 - - hunger_enabled = 0 - supernatural = 1 - - var/list/wizardy_spells = list() - -/mob/living/simple_animal/familiar/Initialize() - . = ..() - add_language(LANGUAGE_TCB) - for(var/spell in wizardy_spells) - src.add_spell(new spell, "const_spell_ready") - -/mob/living/simple_animal/familiar/do_animate_chat(var/message, var/datum/language/language, var/small, var/list/show_to, var/duration, var/list/message_override) - INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, message, language, small, show_to, duration) - -/mob/living/simple_animal/familiar/can_name(var/mob/living/M) - if(M.is_wizard(TRUE)) - return ..() - return FALSE - -/mob/living/simple_animal/familiar/carcinus - name = "crab" - desc = "A small crab said to be made of stone and starlight." - icon = 'icons/mob/npc/animal.dmi' - icon_state = "evilcrab" - icon_living = "evilcrab" - icon_dead = "evilcrab_dead" - - speak_emote = list("chitters","clicks") - organ_names = list("head", "carapace") - - health = 200 - maxHealth = 200 - melee_damage_lower = 10 - melee_damage_upper = 15 - friendly = "pinches" - attacktext = "pinched" - resistance = 9 - canbrush = TRUE - brush = /obj/item/reagent_containers/glass/rag - -/mob/living/simple_animal/familiar/pike - name = "space pike" - desc = "A bigger, more magical cousin of the space carp." - icon = 'icons/mob/npc/spaceshark.dmi' - icon_state = "shark" - icon_living = "shark" - icon_dead = "shark_dead" - icon_rest = "shark_rest" - pixel_x = -16 - - speak_emote = list("gnashes") - attacktext = "bitten" - attack_sound = 'sound/weapons/bite.ogg' - - environment_smash = 2 - health = 100 - maxHealth = 100 - melee_damage_lower = 15 - melee_damage_upper = 15 - canbrush = TRUE - brush = /obj/item/reagent_containers/glass/rag - meat_type = /obj/item/reagent_containers/food/snacks/fish/carpmeat - organ_names = list("head", "chest", "tail", "left flipper", "right flipper") - - min_oxy = 0 - - wizardy_spells = list(/spell/aoe_turf/conjure/forcewall) - - flying = TRUE - -/mob/living/simple_animal/familiar/pike/Allow_Spacemove(var/check_drift = 0) - return 1 - -/mob/living/simple_animal/familiar/horror - name = "horror" - desc = "A sanity-destroying otherthing." - icon = 'icons/mob/mob.dmi' - icon_state = "horror" - icon_living = "horror" - icon_dead = "horror_dead" - organ_names = list("meaty core") - -/mob/living/simple_animal/familiar/horror/Initialize() - . = ..() - if(prob(25)) - icon_state = "horror_alt" - icon_living = "horror_alt" - icon_dead = "horror_alt_dead" - organ_names = list("head", "chest", "tail", "leg") - else if(prob(25)) - icon_state = "abomination" - icon_living = "abomination" - icon_dead = "abomination_dead" - organ_names = list("head", "chest", "tail", "leg") - - speak_emote = list("moans", "groans") - - response_help = "thinks better of touching" - - environment_smash = 2 - health = 150 - maxHealth = 150 - melee_damage_lower = 10 - melee_damage_upper = 10 - attacktext = "clawed" - - wizardy_spells = list(/spell/targeted/torment) - -/mob/living/simple_animal/familiar/horror/death() - ..(null,"rapidly deteriorates") - - ghostize() - gibs(src.loc) - qdel(src) - - -/mob/living/simple_animal/familiar/goat - name = "goat" - desc = "A sprightly looking goat." - icon = 'icons/mob/npc/livestock.dmi' - icon_state = "goat" - icon_living = "goat" - icon_dead = "goat_dead" - speak_emote = list("brays") - attacktext = "kicked" - - health = 80 - maxHealth = 80 - - melee_damage_lower = 8 - melee_damage_upper = 12 - mob_size = 4.5 //weight based on Chanthangi goats - density = 0 - wizardy_spells = list(/spell/aoe_turf/smoke) - canbrush = TRUE - - meat_type = /obj/item/reagent_containers/food/snacks/meat - meat_amount = 6 - butchering_products = list(/obj/item/stack/material/animalhide = 3) - - -/mob/living/simple_animal/familiar/pet //basically variants of normal animals with spells. - icon = 'icons/mob/npc/animal.dmi' - -/mob/living/simple_animal/familiar/pet/MouseDrop(atom/over_object) - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) return ..() - - if(H.a_intent == "help" && holder_type) - get_scooped(H) - return - else - return ..() - -/mob/living/simple_animal/familiar/pet/cat - name = "black cat" - desc = "A pitch black cat. Said to be especially unlucky." - icon = 'icons/mob/npc/pets.dmi' - icon_state = "cat3" - icon_living = "cat3" - icon_dead = "cat3_dead" - icon_rest = "cat3_rest" - can_nap = 1 - - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_NOLIGHTING - - speak_emote = list("meows", "purrs") - holder_type = /obj/item/holder/cat/black/familiar - mob_size = MOB_SMALL - - health = 45 - maxHealth = 45 - melee_damage_lower = 3 - melee_damage_upper = 4 - attacktext = "clawed" - density = 0 - - wizardy_spells = list(/spell/targeted/subjugation) - canbrush = TRUE - - meat_type = /obj/item/reagent_containers/food/snacks/meat - butchering_products = list(/obj/item/stack/material/animalhide/cat = 2) - - -/mob/living/simple_animal/rat/familiar - name = "ancient rat" - desc = "A small rodent. It looks very old." - body_color = "gray" - - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_NOLIGHTING - - health = 25 - maxHealth = 25 - melee_damage_lower = 1 - melee_damage_upper = 1 - attacktext = "nibbled" - universal_speak = 1 - universal_understand = 1 - stop_automated_movement = TRUE - - min_oxy = 1 //still require a /bit/ of air. - max_co2 = 0 - unsuitable_atoms_damage = 1 - - supernatural = 1 - -/mob/living/simple_animal/rat/familiar/Initialize() - . = ..() - add_spell(new /spell/targeted/heal_target, "const_spell_ready") - add_spell(new /spell/targeted/heal_target/area, "const_spell_ready") - add_language(LANGUAGE_TCB) - name = initial(name) - desc = initial(desc) - -/mob/living/simple_animal/rat/familiar/do_animate_chat(var/message, var/datum/language/language, var/small, var/list/show_to, var/duration, var/list/message_override) - INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, message, language, small, show_to, duration) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/adhomai.dm b/code/modules/mob/living/simple_animal/friendly/adhomai.dm index 0ef99964732..dcda3e9e717 100644 --- a/code/modules/mob/living/simple_animal/friendly/adhomai.dm +++ b/code/modules/mob/living/simple_animal/friendly/adhomai.dm @@ -72,7 +72,7 @@ milk_type = /decl/reagent/drink/milk/adhomai meat_type = /obj/item/reagent_containers/food/snacks/meat/adhomai - butchering_products = list(/obj/item/stack/material/animalhide = 5) + butchering_products = list(/obj/item/stack/material/animalhide = 5, /obj/item/reagent_containers/food/snacks/spreads/lard = 5) /mob/living/simple_animal/hostile/retaliate/rafama @@ -95,7 +95,6 @@ maxHealth = 150 health = 150 - harm_intent_damage = 3 melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "bitten" @@ -128,9 +127,9 @@ health = 50 has_udder = TRUE - milk_type = /decl/reagent/drink/milk + milk_type = /decl/reagent/drink/milk/schlorrgo - meat_type = /obj/item/reagent_containers/food/snacks/meat/chicken + meat_type = /obj/item/reagent_containers/food/snacks/meat/adhomai organ_names = list("head", "chest", "fatty core", "blubberous torso", "thick centre", "left leg", "right leg") butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 5) diff --git a/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm b/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm new file mode 100644 index 00000000000..e4a9c803348 --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm @@ -0,0 +1,51 @@ +/mob/living/simple_animal/cosmozoan + name = "cosmozoan" + desc = "These jellyfish-like entities drift through asteroid fields, emitting a soft glow." + desc_info = "Schools of Cosmozoans often congregate in asteroid fields, though they have rarely been witnessed in greater number and size in the Frontier. Their origin remains a mystery but it is believed they predate early man. This belief landed them the name Cosmozoa." + icon_state = "cosmozoan" + icon_living = "cosmozoan" + icon_dead = "cosmozoan_dead" + maxHealth = 15 + health = 15 + meat_type = /obj/item/reagent_containers/food/snacks/fish/cosmozoan + meat_amount = 2 + organ_names = list("hood", "tentacles") + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "whacks" + harm_intent_damage = 5 + blood_type = COLOR_CRYSTAL + blood_overlay_icon = null + canbrush = TRUE + brush = /obj/item/reagent_containers/glass/rag + wanders_diagonally = TRUE + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + flying = TRUE + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_NOLIGHTING + +/mob/living/simple_animal/cosmozoan/Initialize() + . = ..() + set_light(1.4, 3, COLOR_CRYSTAL) + +// run away when attacked +/mob/living/simple_animal/cosmozoan/handle_attack_by(var/mob/M) + var/list/valid_dirs = alldirs.Copy() + valid_dirs -= get_dir(src, M) + var/turf/target_turf = get_ranged_target_turf(src, pick(valid_dirs), 5) + if(target_turf) + for(var/i = 1 to 5) + if(loc == target_turf) + break + step_to(src, target_turf) + sleep(6) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index eb27b172e2c..4f4439355e0 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -48,7 +48,9 @@ ..() //chance to go crazy and start wacking stuff if(!enemies.len && prob(1)) - Retaliate() + var/mob/living/L = locate() in oview(world.view, src) + if(L) + handle_attack_by(L) if(enemies.len && prob(10)) enemies = list() @@ -61,10 +63,10 @@ var/step = get_step_to(src, food, 0) Move(step) -/mob/living/simple_animal/hostile/retaliate/goat/Retaliate() +/mob/living/simple_animal/hostile/retaliate/goat/handle_attack_by(mob/M) ..() if(stat == CONSCIOUS) - visible_message("[src] gets an evil-looking gleam in their eye.") + visible_message(SPAN_WARNING("[src] gets an evil-looking gleam in their eye.")) /mob/living/simple_animal/hostile/retaliate/goat/Move() ..() @@ -142,7 +144,7 @@ attacktext = "kicked" health = 120 emote_sounds = list('sound/effects/creatures/pigsnort.ogg') - butchering_products = list(/obj/item/stack/material/hairlesshide = 6) + butchering_products = list(/obj/item/stack/material/animalhide/barehide = 6) forbidden_foods = list(/obj/item/reagent_containers/food/snacks/egg) /mob/living/simple_animal/chick diff --git a/code/modules/mob/living/simple_animal/hostile/adhomai.dm b/code/modules/mob/living/simple_animal/hostile/adhomai.dm index e36909ef2f8..af69d6d37e2 100644 --- a/code/modules/mob/living/simple_animal/hostile/adhomai.dm +++ b/code/modules/mob/living/simple_animal/hostile/adhomai.dm @@ -18,7 +18,6 @@ pass_flags = PASSTABLE - harm_intent_damage = 5 melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "bitten" diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index f89f5316450..cea389a745d 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -14,6 +14,7 @@ organ_names = list("chest", "lower body", "left arm", "right arm", "left leg", "right leg", "head") maxHealth = 100 health = 100 + blood_type = "#5BDD04" harm_intent_damage = 5 melee_damage_lower = 25 melee_damage_upper = 25 diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 77ff8dcf479..67002d4f644 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -21,7 +21,7 @@ mob_size = 10 blood_overlay_icon = 'icons/mob/npc/blood_overlay_carp.dmi' - harm_intent_damage = 8 + harm_intent_damage = 4 melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "bitten" @@ -136,7 +136,6 @@ mob_size = 15 - harm_intent_damage = 5 melee_damage_lower = 20 melee_damage_upper = 25 diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 1f445312a30..8982049efff 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -18,7 +18,6 @@ tameable = FALSE - harm_intent_damage = 10 melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "gripped" @@ -70,27 +69,6 @@ /mob/living/simple_animal/hostile/faithless/do_animate_chat(var/message, var/datum/language/language, var/small, var/list/show_to, var/duration, var/list/message_override) INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, message, language, small, show_to, duration) -/mob/living/simple_animal/hostile/faithless/wizard - name = "lost soul" - desc = "The result of a dark bargain." - speed = -3 - maxHealth = 400 - health = 400 - universal_speak = 1 - universal_understand = 1 - - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_NOLIGHTING - harm_intent_damage = 0 - melee_damage_lower = 25 - melee_damage_upper = 25 - var/list/darkform_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) - -/mob/living/simple_animal/hostile/faithless/wizard/Initialize() - . = ..() - for(var/spell in darkform_spells) - src.add_spell(new spell, "const_spell_ready") - /mob/living/simple_animal/hostile/faithless/can_fall() return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index de775d3603f..d1d3d163747 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -26,6 +26,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "pokes" + blood_type = "#51C404" blood_amount = 150 stop_automated_movement_when_pulled = 0 maxHealth = 200 diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm index d73d4a20993..30f55b7a096 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm @@ -7,7 +7,6 @@ blood_overlay_icon = 'icons/mob/npc/blood_overlay_hivebot.dmi' health = 15 maxHealth = 15 - harm_intent_damage = 3 melee_damage_lower = 10 melee_damage_upper = 10 break_stuff_probability = 25 diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm index b299097b620..2cee2981cb5 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm @@ -7,7 +7,6 @@ maxHealth = 100 blood_type = COLOR_OIL blood_overlay_icon = 'icons/mob/npc/blood_overlay_hivebot.dmi' - harm_intent_damage = 3 melee_damage_lower = 30 melee_damage_upper = 30 destroy_surroundings = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/icarus_drone.dm b/code/modules/mob/living/simple_animal/hostile/icarus_drone.dm index 14b0abfa6ef..c29dd613f31 100644 --- a/code/modules/mob/living/simple_animal/hostile/icarus_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/icarus_drone.dm @@ -60,6 +60,9 @@ /mob/living/simple_animal/hostile/icarus_drone/Initialize() . = ..() + + set_light(1.2, 3, LIGHT_COLOR_BLUE) + if(prob(5)) projectiletype = /obj/item/projectile/beam/pulse/drone projectilesound = 'sound/weapons/pulse2.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/phoron_worm.dm b/code/modules/mob/living/simple_animal/hostile/phoron_worm.dm index c016b619650..c206ed57566 100644 --- a/code/modules/mob/living/simple_animal/hostile/phoron_worm.dm +++ b/code/modules/mob/living/simple_animal/hostile/phoron_worm.dm @@ -147,7 +147,6 @@ icon = 'icons/mob/npc/small_phoron_worm.dmi' maxHealth = 80 health = 80 - harm_intent_damage = 5 melee_damage_lower = 15 melee_damage_upper = 15 resist_mod = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/pra.dm b/code/modules/mob/living/simple_animal/hostile/pra.dm index a90dd9c625b..e27319bf1bf 100644 --- a/code/modules/mob/living/simple_animal/hostile/pra.dm +++ b/code/modules/mob/living/simple_animal/hostile/pra.dm @@ -30,7 +30,6 @@ universal_speak = TRUE universal_understand = TRUE - harm_intent_damage = 5 melee_damage_lower = 15 melee_damage_upper = 15 mob_size = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/cavern.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/cavern.dm index 3e3ae53e3b2..4c5ef98db8b 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/cavern.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/cavern.dm @@ -20,6 +20,7 @@ health = 60 maxHealth = 60 + blood_type = "#006666" melee_damage_lower = 10 melee_damage_upper = 10 attacktext = "chomped" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 88d600baaa0..93e1eaaf183 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -21,30 +21,10 @@ see &= enemies // Remove all entries that aren't in enemies return see -/mob/living/simple_animal/hostile/retaliate/proc/Retaliate(var/mob/M) +/mob/living/simple_animal/hostile/retaliate/handle_attack_by(mob/M) enemies |= M targets |= M for(var/mob/living/simple_animal/hostile/retaliate/H in view(world.view, get_turf(src))) if(H.faction == faction) - H.enemies |= M - -/mob/living/simple_animal/hostile/retaliate/attack_hand(mob/living/carbon/human/M) - . = ..() - if(M.a_intent in list(I_DISARM, I_GRAB, I_HURT)) - Retaliate(M) - -/mob/living/simple_animal/hostile/retaliate/attacked_with_item(obj/item/O, mob/user, var/proximity) - . = ..() - if(.) - Retaliate(user) - -/mob/living/simple_animal/hostile/retaliate/hitby(atom/movable/AM, speed) - . = ..() - if(ismob(AM.thrower)) - Retaliate(AM.thrower) - -/mob/living/simple_animal/hostile/retaliate/bullet_act(obj/item/projectile/P, def_zone) - . = ..() - if(ismob(P.firer)) - Retaliate(P.firer) \ No newline at end of file + H.enemies |= M \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm index 7422d73dbc4..f645094db85 100644 --- a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm @@ -20,6 +20,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "pokes" + blood_type = "#51C404" blood_overlay_icon = null stop_automated_movement_when_pulled = 0 maxHealth = 1100 diff --git a/code/modules/mob/living/simple_animal/illusion.dm b/code/modules/mob/living/simple_animal/illusion.dm new file mode 100644 index 00000000000..8cf3685e1cc --- /dev/null +++ b/code/modules/mob/living/simple_animal/illusion.dm @@ -0,0 +1,81 @@ +// Illusion type mobs pretend to be other things visually, and generally cannot be harmed as they're not 'real'. + +/mob/living/simple_animal/illusion + name = "illusion" + desc = "If you can read me, the game broke. Please report this to a coder." + + resistance = 1000 // Holograms are tough. + mob_bump_flag = 0 // If the illusion can't be swapped it will be obvious. + + var/atom/movable/copying = null // The thing we're trying to look like. + var/realistic = FALSE // If true, things like bullets and weapons will hit it, to be a bit more convincing from a distance. + +/mob/living/simple_animal/illusion/update_icon() // We don't want the appearance changing AT ALL unless by copy_appearance(). + return + +/mob/living/simple_animal/illusion/proc/copy_appearance(atom/movable/thing_to_copy) + if(!thing_to_copy) + return FALSE + appearance = thing_to_copy.appearance + copying = thing_to_copy + density = thing_to_copy.density // So you can't bump into objects that aren't supposed to be dense. + return TRUE + +/mob/living/simple_animal/illusion/Destroy() + copying = null + return ..() + +// Because we can't perfectly duplicate some examine() output, we directly examine the AM it is copying. It's messy but +// this is to prevent easy checks from the opposing force. +/mob/living/simple_animal/illusion/examine(mob/user) + if(copying) + return copying.examine(user) + else + return list("???") + +/mob/living/simple_animal/illusion/bullet_act(obj/item/projectile/P) + if(!P) + return + + if(realistic) + return ..() + + return PROJECTILE_FORCE_MISS + +/mob/living/simple_animal/illusion/attack_hand(mob/living/carbon/human/M) + if(!realistic) + playsound(src, 'sound/weapons/punchmiss1.ogg', 25, 1, -1) + visible_message(SPAN_NOTICE("\The [M]'s hand goes through \the [src]!")) + return + else + switch(M.a_intent) + if(I_HELP) + M.visible_message( + SPAN_NOTICE("\The [M] tap [src] to get their attention!"), \ + SPAN_NOTICE("You tap [src] to get their attention!") + ) // slightly redundant as at the moment most mobs still use the normal gender var, but it works and future-proofs it + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + + if(I_DISARM) + playsound(src, 'sound/weapons/punchmiss1.ogg', 25, 1, -1) + visible_message(SPAN_DANGER("\The [M] attempted to disarm [src]!")) + M.do_attack_animation(src) + + if(I_GRAB) + ..() + + if(I_HURT) + adjustBruteLoss(harm_intent_damage) + M.visible_message(SPAN_DANGER("\The [M] [response_harm] \the [src]!")) + M.do_attack_animation(src) + +/mob/living/simple_animal/illusion/hit_with_weapon(obj/item/I, mob/living/user, effective_force, hit_zone) + if(realistic) + return ..() + + playsound(src, 'sound/weapons/punchmiss1.ogg', 25, 1, -1) + visible_message(span("warning", "\The [user]'s [I] goes through \the [src]!")) + return FALSE + +/mob/living/simple_animal/illusion/ex_act() + return diff --git a/code/modules/mob/living/simple_animal/mechanical/mechanical.dm b/code/modules/mob/living/simple_animal/mechanical/mechanical.dm new file mode 100644 index 00000000000..cbb61f6aa67 --- /dev/null +++ b/code/modules/mob/living/simple_animal/mechanical/mechanical.dm @@ -0,0 +1,26 @@ +// Mechanical mobs don't care about the atmosphere and cannot be hurt by tasers. +// They're also immune to poisons as they're entirely metal, however this also makes most of them vulnerable to shocks. +// They can also be hurt by EMP. + +/mob/living/simple_animal/mechanical + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + +/mob/living/simple_animal/mechanical/isSynthetic() + return TRUE + +/mob/living/simple_animal/mechanical/adjustHalLoss(amount) + return FALSE + +/mob/living/simple_animal/mechanical/adjustToxLoss(amount) + return FALSE + +/mob/living/simple_animal/mechanical/adjustOxyLoss(amount) + return FALSE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 8143229ca64..9afbfe0a8c8 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -210,11 +210,8 @@ /mob/living/simple_animal/shade/bluespace/say(var/message) if(!possessive) - var/new_last_message_heard = sanitizeName(last_message_heard) - var/new_message = sanitizeName(message) - - var/list/words_in_memory = dd_text2List(new_last_message_heard, " ") - var/list/words_in_message = dd_text2List(new_message, " ") + var/list/words_in_memory = dd_text2List(last_message_heard, " ") + var/list/words_in_message = dd_text2List(message, " ") for(var/word1 in words_in_message) var/valid = 0 for(var/word2 in words_in_memory) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a8f8f4249fd..dd8c4173166 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -46,6 +46,7 @@ var/stop_thinking = FALSE // prevents them from doing any AI stuff whatsoever var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals. var/wander = 1 // Does the mob wander around when idle? + var/wanders_diagonally = FALSE // does the mob move diagonally when wandering? var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it. var/atom/movement_target = null//Thing we're moving towards var/turns_since_scan = 0 @@ -55,7 +56,7 @@ var/response_help = "tries to help" var/response_disarm = "tries to disarm" var/response_harm = "hurts" - var/harm_intent_damage = 5 + var/harm_intent_damage = 3 //The maximum amount of damage this mob can take from simple unarmed attacks that don't have damage values, like punches //Temperature effect var/minbodytemp = 250 @@ -88,8 +89,6 @@ var/resistance = 0 // Damage reduction var/resist_mod = 1 // a multiplier for the chance the animal has to break out - var/wizard_master - //Null rod stuff var/supernatural = 0 var/purge = 0 @@ -171,6 +170,11 @@ turns_since_move = turns_per_move ..() +/mob/living/simple_animal/revive(reset_to_roundstart) + . = ..() + blood_amount = initial(blood_amount) + bleeding = FALSE + /mob/living/simple_animal/LateLogin() if(src && src.client) src.client.screen = null @@ -280,7 +284,7 @@ if(isturf(loc) && !resting && !buckled_to && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. if(turns_since_move >= turns_per_move && !(stop_automated_movement_when_pulled && pulledby)) //Some animals don't move when pulled var/moving_to = 0 // otherwise it always picks 4, fuck if I know. Did I mention fuck BYOND - moving_to = pick(cardinal) + moving_to = wanders_diagonally ? pick(alldirs) : pick(cardinal) set_dir(moving_to) //How about we turn them the direction they are moving, yay. Move(get_step(src,moving_to)) turns_since_move = 0 @@ -449,6 +453,9 @@ var/can_ghosts_hear = client ? GHOSTS_ALL_HEAR : ONLY_GHOSTS_IN_VIEW custom_emote(AUDIBLE_MESSAGE, act_desc, can_ghosts_hear) +/mob/living/simple_animal/proc/handle_attack_by(var/mob/M) + return + /mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob) ..() switch(M.a_intent) @@ -462,6 +469,7 @@ M.visible_message("\The [M] [response_disarm] \the [src]") M.do_attack_animation(src) poke(1) + handle_attack_by(M) //TODO: Push the mob away or something if(I_GRAB) @@ -484,9 +492,11 @@ M.visible_message(SPAN_WARNING("\The [M] has grabbed \the [src] passively!")) M.do_attack_animation(src) poke(1) + handle_attack_by(M) if(I_HURT) unarmed_harm_attack(M) + handle_attack_by(M) return @@ -497,7 +507,10 @@ simple_harm_attack(user) return attack.show_attack_simple(user, src, pick(organ_names)) - apply_damage(attack.get_unarmed_damage(user), attack.damage_type) + var/actual_damage = attack.get_unarmed_damage(user) //Punch and kick no longer have get_unarmed_damage due to how humanmob combat works. If we have none, we'll apply a small random amount. + if(!actual_damage) + actual_damage = harm_intent_damage ? rand(1, harm_intent_damage) : 0 + apply_damage(actual_damage, attack.damage_type) user.do_attack_animation(src, FIST_ATTACK_ANIMATION) return simple_harm_attack(user) @@ -572,8 +585,19 @@ if(O.hitsound) playsound(loc, O.hitsound, O.get_clamped_volume(), 1, -1) user.do_attack_animation(src, O) + handle_attack_by(user) return TRUE +/mob/living/simple_animal/hitby(atom/movable/AM, speed) + . = ..() + if(ismob(AM.thrower)) + handle_attack_by(AM.thrower) + +/mob/living/simple_animal/bullet_act(obj/item/projectile/P, def_zone) + . = ..() + if(ismob(P.firer)) + handle_attack_by(P.firer) + /mob/living/simple_animal/apply_damage(damage, damagetype, def_zone, blocked, used_weapon, damage_flags, armor_pen, silent = FALSE) . = ..() handle_bleeding_timer(damage) @@ -733,7 +757,6 @@ if(speak_emote.len) verb = pick(speak_emote) - message = sanitize(message) if(emote_sounds.len) var/sound_chance = TRUE if(client) // we do not want people who assume direct control to spam diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 98cf918cd09..9a551a772da 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -71,6 +71,8 @@ player_age = client.player_age + client.chatOutput.start() + if(loc && !isturf(loc)) client.eye = loc client.perspective = EYE_PERSPECTIVE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 307be9f0f0e..a80159f0dc4 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -843,6 +843,7 @@ if(statpanel("Status") && SSticker.current_state != GAME_STATE_PREGAME) stat("Game ID", game_id) stat("Map", current_map.full_name) + stat("Current Space Sector", SSatlas.current_sector.name) stat("Station Time", worldtime2text()) stat("Round Duration", get_round_duration_formatted()) stat("Last Transfer Vote", SSvote.last_transfer_vote ? time2text(SSvote.last_transfer_vote, "hh:mm") : "Never") @@ -928,7 +929,7 @@ lying = 1 canmove = 0 pixel_y = V.mob_offset_y - 5 - else + else if(buckled_to.buckle_lying != -1) lying = buckled_to.buckle_lying canmove = 1 pixel_y = V.mob_offset_y @@ -1089,6 +1090,7 @@ /mob/proc/get_pressure_weakness() return 1 + /mob/living/proc/flash_strong_pain() return @@ -1375,6 +1377,10 @@ src.throw_icon.icon_state = "act_throw_on" /mob/proc/is_invisible_to(var/mob/viewer) + if(isAI(viewer)) + for(var/image/I as anything in SSai_obfuscation.obfuscation_images) + if(I.loc == src) + return TRUE return (!alpha || !mouse_opacity || viewer.see_invisible < invisibility) //Admin helpers diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 3a9b5ae5f7e..2cdd550d9e1 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -37,10 +37,13 @@ var/obj/screen/gun/mode/gun_setting_icon = null var/obj/screen/gun/unique_action_icon = null var/obj/screen/gun/toggle_firing_mode = null + var/obj/screen/energy/energy_display = null + var/obj/screen/instability/instability_display = null var/obj/screen/up_hint = null //spells hud icons - this interacts with add_spell and remove_spell var/list/obj/screen/movable/spell_master/spell_masters = null + var/obj/screen/movable/ability_master/ability_master = null /*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob. A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such. @@ -114,7 +117,7 @@ var/bodytemperature = 310.055 //98.7 F var/old_x = 0 var/old_y = 0 - var/drowsyness = 0.0//Carbon + var/drowsiness = 0.0//Carbon var/charges = 0.0 var/nutrition = BASE_MAX_NUTRITION * CREW_NUTRITION_SLIGHTLYHUNGRY //carbon var/nutrition_loss = HUNGER_FACTOR //How much hunger is lost per tick. This is modified by species diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index c0a3fada1ed..866bc2af492 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -272,9 +272,9 @@ if(!allow_upgrade) return if(!affecting.lying) - assailant.visible_message(SPAN_WARNING("[assailant] grabs [affecting] aggressively by the hands!"), SPAN_WARNING("You grab [affecting] aggressively by the hands!")) + assailant.visible_message(SPAN_DANGER("[assailant] grabs [affecting] aggressively by the hands!"), SPAN_DANGER("You grab [affecting] aggressively by the hands!")) else - assailant.visible_message(SPAN_WARNING("[assailant] pins [affecting] down to the ground by the hands!"), SPAN_WARNING("You pin [affecting] down to the ground by the hands!")) + assailant.visible_message(SPAN_DANGER("[assailant] pins [affecting] down to the ground by the hands!"), SPAN_DANGER("You pin [affecting] down to the ground by the hands!")) apply_pinning(affecting, assailant) state = GRAB_AGGRESSIVE @@ -285,7 +285,7 @@ assailant.visible_message(SPAN_WARNING("[assailant] tries to squeeze [affecting], but [assailant.get_pronoun("his")] hands sink right through!"), SPAN_WARNING("You try to squeeze [affecting], but your hands sink right through!")) return playsound(loc, /decl/sound_category/grab_sound, 50, FALSE, -1) - assailant.visible_message(SPAN_WARNING("[assailant] reinforces [assailant.get_pronoun("his")] grip on [affecting]'s neck!"), SPAN_WARNING("You reinforce your grip on [affecting]'s neck!")) + assailant.visible_message(SPAN_DANGER("[assailant] reinforces [assailant.get_pronoun("his")] grip on [affecting]'s neck!"), SPAN_DANGER("You reinforce your grip on [affecting]'s neck!")) state = GRAB_NECK icon_state = "grabbed+1" affecting.attack_log += "\[[time_stamp()]\] Has had their neck grabbed by [assailant.name] ([assailant.ckey])" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index eb62849b4aa..75e5de49ffa 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -210,12 +210,6 @@ proc/getsensorlevel(A) /proc/hsl2rgb(h, s, l) return //TODO: Implement -/mob/living/proc/is_wizard(exclude_apprentice = FALSE) - if(exclude_apprentice) - return mind && (mind.assigned_role == "Space Wizard" || mind.assigned_role == "Raider Mage") - else - return mind && (mind.assigned_role == "Space Wizard" || mind.assigned_role == "Raider Mage" || mind.assigned_role == "Apprentice") - /mob/proc/is_berserk() return FALSE @@ -1231,4 +1225,9 @@ proc/is_blind(A) return FALSE /mob/get_cell() - return FALSE \ No newline at end of file + return FALSE + +/mob/proc/can_hear_radio(var/list/speaker_coverage = list()) + var/turf/ear = get_turf(src) + if(ear && speaker_coverage[ear]) + return TRUE \ No newline at end of file diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index dfd552a56dd..a59609b994c 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -366,7 +366,7 @@ M.animate_movement = 2 return - else if(mob.confused && prob(25)) + else if(mob.confused && prob(25) && mob.m_intent == M_RUN) step(mob, pick(cardinal)) else . = mob.SelfMove(n, direct) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index ac8b2dd0ce9..b4e904e1292 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -9,21 +9,12 @@ /mob/verb/say_verb(message as text) set name = "Say" set category = "IC" + if(say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return - //Let's try to make users fix their errors - we try to detect single, out-of-place letters and 'unintended' words - /* - var/first_letter = copytext(message,1,2) - if((copytext(message,2,3) == " " && first_letter != "I" && first_letter != "A" && first_letter != ";") || cmptext(copytext(message,1,5), "say ") || cmptext(copytext(message,1,4), "me ") || cmptext(copytext(message,1,6), "looc ") || cmptext(copytext(message,1,5), "ooc ") || cmptext(copytext(message,2,6), "say ")) - var/response = alert(usr, "Do you really want to say this using the *say* verb?\n\n[message]\n", "Confirm your message", "Yes", "Edit message", "No") - if(response == "Edit message") - message = input(usr, "Please edit your message carefully:", "Edit message", message) - if(!message) - return - else if(response == "No") - return - */ + + message = sanitize(message) set_typing_indicator(0) @@ -110,8 +101,10 @@ for it but just ignore it. */ -/mob/proc/say_quote(var/message, var/datum/language/speaking = null) +/mob/proc/say_quote(var/message, var/datum/language/speaking = null, var/singing = FALSE) . = "says" + if(singing) + return "sings" var/ending = copytext(message, length(message)) var/pre_ending = copytext(message, length(message) - 1, length(message)) if(ending == "!") diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index 95415be0843..dd0915412dd 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -28,7 +28,8 @@ var/global/ntnrc_uid = 0 for(var/datum/computer_file/program/chat_client/Cl in U.clients) var/notification_text = message.format_chat_notification(src, Cl) if(notification_text && Cl.can_receive_notification(message.client)) - Cl.computer.output_message(notification_text, 0) + if(!Cl.message_mute) + Cl.computer.output_message(notification_text, 0) if(message.play_sound) Cl.play_notification_sound(message.client) @@ -125,6 +126,8 @@ var/global/ntnrc_uid = 0 /datum/ntnet_conversation/proc/cl_leave(var/datum/computer_file/program/chat_client/Cl) if(!istype(Cl) || !istype(Cl.my_user) || !(Cl.my_user in users) || !can_interact(Cl) || direct) return + if(Cl.focused_conv == src) + Cl.focused_conv = null var/datum/ntnet_message/leave/msg = new(Cl) Cl.my_user.channels.Remove(src) users.Remove(Cl.my_user) diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 95b86ec9d3a..4bc3fcd1f53 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -102,6 +102,7 @@ for(var/obj/item/computer_hardware/CH in src.get_all_components()) uninstall_component(null, CH) qdel(CH) + listening_objects -= src STOP_PROCESSING(SSprocessing, src) QDEL_NULL(listener) return ..() diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index ebb199f1f88..f2428794e99 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -319,3 +319,11 @@ /obj/item/modular_computer/GetID() if(card_slot) return card_slot.stored_card + +/obj/item/modular_computer/hear_talk(mob/M, text, verb, datum/language/speaking) + if(Adjacent(M)) + var/datum/computer_file/program/chat_client/P = hard_drive.find_file_by_name("ntnrc_client") + if(!P || (P.program_state == PROGRAM_STATE_KILLED && P.service_state == PROGRAM_STATE_KILLED)) + return + if(P.focused_conv) + P.focused_conv.cl_send(P, text, M) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/subtypes/dev_handheld.dm b/code/modules/modular_computers/computers/subtypes/dev_handheld.dm index 4cb40032295..43cd5fad434 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_handheld.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_handheld.dm @@ -18,6 +18,5 @@ set_icon() /obj/item/modular_computer/handheld/proc/set_icon() - icon_state += pick("", "-blue", "-green", "-red", "-brown") icon_state_unpowered = icon_state icon_state_broken = icon_state \ No newline at end of file diff --git a/code/modules/modular_computers/computers/subtypes/preset_handheld.dm b/code/modules/modular_computers/computers/subtypes/preset_handheld.dm index 699dcc712d0..a9eeb511eec 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_handheld.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_handheld.dm @@ -1,33 +1,6 @@ -/obj/item/modular_computer/handheld/custom_loadout/cheap/install_default_hardware() - ..() - processor_unit = new /obj/item/computer_hardware/processor_unit/small(src) - hard_drive = new /obj/item/computer_hardware/hard_drive/micro(src) - network_card = new /obj/item/computer_hardware/network_card(src) - battery_module = new /obj/item/computer_hardware/battery_module(src) - card_slot = new /obj/item/computer_hardware/card_slot(src) - tesla_link = new /obj/item/computer_hardware/tesla_link/charging_cable(src) - battery_module.charge_to_full() - -/obj/item/modular_computer/handheld/custom_loadout/advanced/install_default_hardware() - ..() - processor_unit = new /obj/item/computer_hardware/processor_unit/small(src) - hard_drive = new /obj/item/computer_hardware/hard_drive/small(src) - network_card = new /obj/item/computer_hardware/network_card(src) - nano_printer = new /obj/item/computer_hardware/nano_printer(src) - card_slot = new /obj/item/computer_hardware/card_slot(src) - battery_module = new /obj/item/computer_hardware/battery_module(src) - tesla_link = new /obj/item/computer_hardware/tesla_link/charging_cable(src) - battery_module.charge_to_full() - - -// Cargo Delivery -/obj/item/modular_computer/handheld/custom_loadout/advanced/cargo_delivery - _app_preset_type = /datum/modular_computer_app_presets/cargo_delivery - enrolled = DEVICE_PRIVATE - // Tablet PDA presets /obj/item/modular_computer/handheld/preset - enrolled = DEVICE_PRIVATE + enrolled = DEVICE_COMPANY /obj/item/modular_computer/handheld/preset/install_default_hardware() ..() @@ -41,6 +14,9 @@ flashlight = new /obj/item/computer_hardware/flashlight(src) battery_module.charge_to_full() +/obj/item/modular_computer/handheld/preset/generic + enrolled = 0 + /obj/item/modular_computer/handheld/preset/civilian _app_preset_type = /datum/modular_computer_app_presets/civilian @@ -69,6 +45,11 @@ /obj/item/modular_computer/handheld/preset/engineering _app_preset_type = /datum/modular_computer_app_presets/engineering +/obj/item/modular_computer/handheld/preset/engineering/set_icon() + icon_state += "-brown" + icon_state_unpowered = icon_state + icon_state_broken = icon_state + /obj/item/modular_computer/handheld/preset/engineering/Initialize() . = ..() card_slot.stored_item = new /obj/item/pen/silver @@ -83,6 +64,11 @@ /obj/item/modular_computer/handheld/preset/supply _app_preset_type = /datum/modular_computer_app_presets/supply +/obj/item/modular_computer/handheld/preset/supply/set_icon() + icon_state += "-brown" + icon_state_unpowered = icon_state + icon_state_broken = icon_state + /obj/item/modular_computer/handheld/preset/supply/Initialize() . = ..() card_slot.stored_item = new /obj/item/pen/silver @@ -91,11 +77,20 @@ . = ..() card_slot.stored_item = new /obj/item/pen/fountain +// Cargo Delivery +/obj/item/modular_computer/handheld/preset/supply/cargo_delivery + _app_preset_type = /datum/modular_computer_app_presets/cargo_delivery + // Medical /obj/item/modular_computer/handheld/preset/medical _app_preset_type = /datum/modular_computer_app_presets/medical +/obj/item/modular_computer/handheld/preset/medical/set_icon() + icon_state += "-green" + icon_state_unpowered = icon_state + icon_state_broken = icon_state + /obj/item/modular_computer/handheld/preset/medical/Initialize() . = ..() card_slot.stored_item = new /obj/item/pen/white @@ -127,6 +122,11 @@ /obj/item/modular_computer/handheld/preset/security _app_preset_type = /datum/modular_computer_app_presets/security +/obj/item/modular_computer/handheld/preset/security/set_icon() + icon_state += "-blue" + icon_state_unpowered = icon_state + icon_state_broken = icon_state + /obj/item/modular_computer/handheld/preset/security/detective _app_preset_type = /datum/modular_computer_app_presets/security/investigations diff --git a/code/modules/modular_computers/computers/subtypes/preset_laptop.dm b/code/modules/modular_computers/computers/subtypes/preset_laptop.dm index 1754c36ed58..1a3563a562c 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_laptop.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_laptop.dm @@ -15,8 +15,10 @@ nano_printer.stored_paper = 5 tesla_link = new /obj/item/computer_hardware/tesla_link/charging_cable(src) -/obj/item/modular_computer/laptop/preset/install_default_programs() - ..() +// the laptop in the modular computer loadout +/obj/item/modular_computer/laptop/preset/loadout/install_default_hardware() + . = ..() + card_slot = new /obj/item/computer_hardware/card_slot(src) // Engineering /obj/item/modular_computer/laptop/preset/engineering diff --git a/code/modules/modular_computers/computers/subtypes/preset_wristbound.dm b/code/modules/modular_computers/computers/subtypes/preset_wristbound.dm index f38b5f76aa0..f6350a43cb0 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_wristbound.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_wristbound.dm @@ -9,7 +9,7 @@ battery_module.charge_to_full() /obj/item/modular_computer/handheld/wristbound/preset/cheap/generic - _app_preset_type = /datum/modular_computer_app_presets/civilian + enrolled = 0 /obj/item/modular_computer/handheld/wristbound/preset/advanced/install_default_hardware() ..() @@ -23,9 +23,18 @@ flashlight = new /obj/item/computer_hardware/flashlight(src) battery_module.charge_to_full() +/obj/item/modular_computer/handheld/wristbound/preset/advanced + enrolled = DEVICE_COMPANY + +/obj/item/modular_computer/handheld/wristbound/preset/advanced/generic + enrolled = 0 + +/obj/item/modular_computer/handheld/wristbound/preset/advanced/civilian + _app_preset_type = /datum/modular_computer_app_presets/civilian + /obj/item/modular_computer/handheld/wristbound/preset/advanced/cargo icon_state = "wristbound_cargo" - _app_preset_type = /datum/modular_computer_app_presets/cargo_delivery + _app_preset_type = /datum/modular_computer_app_presets/supply /obj/item/modular_computer/handheld/wristbound/preset/advanced/engineering icon_state = "wristbound_engineering" @@ -71,9 +80,6 @@ /obj/item/modular_computer/handheld/wristbound/preset/advanced/command/captain _app_preset_type = /datum/modular_computer_app_presets/command/captain -/obj/item/modular_computer/handheld/wristbound/preset/advanced/generic - _app_preset_type = /datum/modular_computer_app_presets/civilian - /obj/item/modular_computer/handheld/wristbound/preset/advanced/representative _app_preset_type = /datum/modular_computer_app_presets/representative enrolled = DEVICE_PRIVATE diff --git a/code/modules/modular_computers/file_system/programs/app_presets.dm b/code/modules/modular_computers/file_system/programs/app_presets.dm index e01c4218db5..9ee11b81590 100644 --- a/code/modules/modular_computers/file_system/programs/app_presets.dm +++ b/code/modules/modular_computers/file_system/programs/app_presets.dm @@ -39,8 +39,7 @@ new /datum/computer_file/program/atmos_control(comp), new /datum/computer_file/program/rcon_console(comp), new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/lighting_control(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/lighting_control(comp) ) return _prg_list @@ -64,7 +63,6 @@ new /datum/computer_file/program/rcon_console(comp), new /datum/computer_file/program/camera_monitor(comp), new /datum/computer_file/program/lighting_control(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp), new /datum/computer_file/program/scanner/gas(comp) ) return _prg_list @@ -92,7 +90,6 @@ new /datum/computer_file/program/camera_monitor(comp), new /datum/computer_file/program/lighting_control(comp), new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp), new /datum/computer_file/program/scanner/gas(comp) ) return _prg_list @@ -112,7 +109,6 @@ new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/suit_sensors(comp), new /datum/computer_file/program/records/medical(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp), new /datum/computer_file/program/chemistry_codex(comp), new /datum/computer_file/program/scanner/medical(comp) ) @@ -136,7 +132,6 @@ new /datum/computer_file/program/suit_sensors(comp), new /datum/computer_file/program/records/employment(comp), new /datum/computer_file/program/records/medical(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp), new /datum/computer_file/program/chemistry_codex(comp), new /datum/computer_file/program/scanner/medical(comp), new /datum/computer_file/program/scanner/science(comp) @@ -159,7 +154,6 @@ new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/ntnetmonitor(comp), new /datum/computer_file/program/aidiag(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp), new /datum/computer_file/program/chemistry_codex(comp), new /datum/computer_file/program/scanner/science(comp), new /datum/computer_file/program/scanner/gas(comp) @@ -182,7 +176,6 @@ new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/ntnetmonitor(comp), new /datum/computer_file/program/aidiag(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp), new /datum/computer_file/program/records/medical(comp), new /datum/computer_file/program/scanner/science(comp), new /datum/computer_file/program/scanner/gas(comp) @@ -206,7 +199,6 @@ new /datum/computer_file/program/comm(comp, FALSE), new /datum/computer_file/program/ntnetmonitor(comp), new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp), new /datum/computer_file/program/chemistry_codex(comp), new /datum/computer_file/program/scanner/science(comp), new /datum/computer_file/program/scanner/gas(comp) @@ -229,8 +221,7 @@ new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/card_mod(comp), new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/records/employment(comp) ) return _prg_list @@ -250,7 +241,6 @@ new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/comm(comp, FALSE), new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp), new /datum/computer_file/program/teleporter(comp) ) return _prg_list @@ -273,8 +263,7 @@ new /datum/computer_file/program/card_mod(comp), new /datum/computer_file/program/comm(comp, FALSE), new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/records/security(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/records/security(comp) ) return _prg_list @@ -301,8 +290,7 @@ new /datum/computer_file/program/alarm_monitor(comp), new /datum/computer_file/program/records/employment(comp), new /datum/computer_file/program/records/medical(comp), - new /datum/computer_file/program/records/security(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/records/security(comp) ) return _prg_list @@ -354,12 +342,10 @@ new /datum/computer_file/program/chat_client(comp), new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/comm(comp), new /datum/computer_file/program/digitalwarrant(comp), new /datum/computer_file/program/penal_mechs(comp), new /datum/computer_file/program/records/security(comp), - new /datum/computer_file/program/guntracker(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/guntracker(comp) ) return _prg_list @@ -383,8 +369,7 @@ new /datum/computer_file/program/penal_mechs(comp), new /datum/computer_file/program/records/security(comp), new /datum/computer_file/program/guntracker(comp), - new /datum/computer_file/program/implant_tracker(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/implant_tracker(comp) ) return _prg_list @@ -392,7 +377,7 @@ name = "security_inv" display_name = "Security - Investigations" description = "Contains the most common security and forensics programs." - available = FALSE + available = TRUE /datum/modular_computer_app_presets/security/investigations/return_install_programs(obj/item/modular_computer/comp) var/list/_prg_list = list( @@ -404,11 +389,8 @@ new /datum/computer_file/program/chat_client(comp), new /datum/computer_file/program/camera_monitor(comp), new /datum/computer_file/program/digitalwarrant(comp), - new /datum/computer_file/program/penal_mechs(comp), new /datum/computer_file/program/records/security(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/records/medical(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/records/medical(comp) ) return _prg_list @@ -432,8 +414,7 @@ new /datum/computer_file/program/digitalwarrant(comp), new /datum/computer_file/program/penal_mechs(comp), new /datum/computer_file/program/records/security(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/records/employment(comp) ) return _prg_list @@ -452,8 +433,7 @@ new /datum/computer_file/program/chat_client(comp), new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/game/arcade(comp), - new /datum/computer_file/program/game/sudoku(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/game/sudoku(comp) ) return _prg_list @@ -473,8 +453,7 @@ new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/civilian/janitor(comp), new /datum/computer_file/program/game/arcade(comp), - new /datum/computer_file/program/game/sudoku(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/game/sudoku(comp) ) return _prg_list @@ -505,8 +484,7 @@ new /datum/computer_file/program/chat_client(comp), new /datum/computer_file/program/civilian/cargocontrol(comp), new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/civilian/cargodelivery(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/civilian/cargodelivery(comp) ) return _prg_list @@ -523,8 +501,7 @@ new /datum/computer_file/program/newsbrowser(comp), new /datum/computer_file/program/manifest(comp), new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargodelivery(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/civilian/cargodelivery(comp) ) return _prg_list @@ -543,8 +520,7 @@ new /datum/computer_file/program/chat_client(comp), new /datum/computer_file/program/game/sudoku(comp), new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/records/employment(comp) ) return _prg_list @@ -562,8 +538,7 @@ new /datum/computer_file/program/chat_client(comp), new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/alarm_monitor(comp), - new /datum/computer_file/program/ntsl2_interpreter(comp) + new /datum/computer_file/program/alarm_monitor(comp) ) return _prg_list diff --git a/code/modules/modular_computers/file_system/programs/command/account_database.dm b/code/modules/modular_computers/file_system/programs/command/account_database.dm index f8ed6f6a675..35c067ef93c 100644 --- a/code/modules/modular_computers/file_system/programs/command/account_database.dm +++ b/code/modules/modular_computers/file_system/programs/command/account_database.dm @@ -33,7 +33,7 @@ var/obj/item/card/id/held_card = get_held_card() if (!held_card) return 0 - if(access_cent_captain in held_card.access) + if(access_cent_ccia in held_card.access) return 2 else if((access_hop in held_card.access) || (access_captain in held_card.access)) return 1 @@ -135,7 +135,7 @@ //create a transaction log entry var/datum/transaction/trx = create_transation(account_name, "New account activation", "([starting_funds])") SSeconomy.add_transaction_log(SSeconomy.station_account,trx) - + if(href_list["suspend"]) var/account = href_list["suspend"]["account"] @@ -143,14 +143,15 @@ if(Acc) Acc.suspended = !Acc.suspended callHook("change_account_status", list(Acc)) - - + + if(href_list["add_funds"] && access_level == 2) var/account = href_list["add_funds"]["account"] var/amount = href_list["add_funds"]["amount"] var/datum/money_account/Acc = SSeconomy.get_account(account) if(Acc) + log_and_message_admins("Added [amount] credits to the [Acc.owner_name] account.") Acc.money = min(Acc.money + amount, FUND_CAP) if(href_list["remove_funds"] && access_level == 2) @@ -159,6 +160,7 @@ var/datum/money_account/Acc = SSeconomy.get_account(account) if(Acc) + log_and_message_admins("Removed [amount] credits to the [Acc.owner_name] account.") Acc.money = max(Acc.money - amount, -FUND_CAP) if(href_list["revoke_payroll"]) @@ -260,4 +262,4 @@ SSvueui.check_uis_for_change(src) -#undef FUND_CAP \ No newline at end of file +#undef FUND_CAP diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index a4bac57b0a4..1543aea44a9 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -13,10 +13,14 @@ silent = FALSE var/datum/ntnet_user/my_user + var/datum/ntnet_conversation/focused_conv + var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords) var/set_offline = FALSE // appear "invisible" var/ringtone = "beep" + var/message_mute = FALSE + var/syndi_auth = FALSE @@ -27,7 +31,7 @@ return ((program_state > PROGRAM_STATE_KILLED || service_state > PROGRAM_STATE_KILLED) && from != src && get_signal(NTNET_COMMUNICATION)) /datum/computer_file/program/chat_client/proc/play_notification_sound(var/datum/computer_file/program/chat_client/from) - if(!silent && src != from && program_state == PROGRAM_STATE_BACKGROUND) + if(!silent && src != from && (program_state == PROGRAM_STATE_BACKGROUND || (program_state == PROGRAM_STATE_KILLED && service_state == PROGRAM_STATE_ACTIVE))) playsound(computer, 'sound/machines/twobeep.ogg', 50, 1) computer.output_message("[icon2html(computer, world)] *[ringtone]*", 2) @@ -46,6 +50,10 @@ newRingtone = sanitize(newRingtone, 20) ringtone = newRingtone SSvueui.check_uis_for_change(src) + + if(href_list["mute_message"]) + message_mute = !message_mute + SSvueui.check_uis_for_change(src) // User only commands if(!istype(my_user)) @@ -62,6 +70,19 @@ if(ishuman(user)) user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] [computer.lexical_name]'s screen.") conv.cl_send(src, message, user) + if(href_list["focus"]) + var/mob/living/user = usr + var/datum/ntnet_conversation/conv = locate(href_list["focus"]) + if(istype(conv)) + if(ishuman(user)) + user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] [computer.lexical_name]'s screen.") + if(focused_conv == conv) + focused_conv = null + listening_objects -= computer + else + focused_conv = conv + listening_objects |= computer + SSvueui.check_uis_for_change(src) if(href_list["join"]) var/datum/ntnet_conversation/conv = locate(href_list["join"]["target"]) var/password = href_list["join"]["password"] @@ -121,8 +142,7 @@ if(ishuman(user)) user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] [computer.lexical_name]'s screen.") conv.cl_send(src, message, user) - - + /datum/computer_file/program/chat_client/service_activate() . = ..() if(istype(my_user) && get_signal(NTNET_COMMUNICATION)) @@ -206,6 +226,7 @@ data["ringtone"] = ringtone data["netadmin_mode"] = netadmin_mode data["can_netadmin_mode"] = can_run(user, FALSE, access_network) + data["message_mute"] = message_mute if(data["registered"] && data["service"] && data["signal"]) data["channels"] = list() @@ -220,7 +241,8 @@ "direct" = Channel.direct, "password" = !!Channel.password, "can_interact" = can_interact, - "can_manage" = can_manage + "can_manage" = can_manage, + "focused" = focused_conv == Channel ? TRUE : FALSE ) if(can_interact) data["channels"][ref]["msg"] = Channel.messages diff --git a/code/modules/modular_computers/file_system/programs/generic/records.dm b/code/modules/modular_computers/file_system/programs/generic/records.dm index feb45079545..7ac4d833479 100644 --- a/code/modules/modular_computers/file_system/programs/generic/records.dm +++ b/code/modules/modular_computers/file_system/programs/generic/records.dm @@ -11,6 +11,7 @@ requires_ntnet = TRUE requires_ntnet_feature = NTNET_SYSTEMCONTROL requires_access_to_run = PROGRAM_ACCESS_LIST_ONE + requires_access_to_download = PROGRAM_ACCESS_LIST_ONE usage_flags = PROGRAM_ALL_REGULAR | PROGRAM_STATIONBOUND var/records_type = RECORD_GENERAL | RECORD_MEDICAL | RECORD_SECURITY | RECORD_VIRUS | RECORD_WARRANT | RECORD_LOCKED @@ -38,7 +39,7 @@ record_prefix = "Medical " required_access_run = list(access_medical_equip, access_forensics_lockers, access_detective, access_robotics, access_hop) - required_access_download = access_heads + required_access_download = list(access_heads, access_medical_equip, access_forensics_lockers) available_on_ntnet = TRUE records_type = RECORD_MEDICAL | RECORD_VIRUS @@ -54,7 +55,7 @@ record_prefix = "Security " required_access_run = list(access_security, access_forensics_lockers, access_lawyer, access_hop) - required_access_download = access_heads + required_access_download = list(access_heads, access_security) available_on_ntnet = TRUE records_type = RECORD_SECURITY @@ -70,6 +71,7 @@ record_prefix = "Employment " required_access_run = list(access_heads, access_lawyer, access_consular) + requires_access_to_download = PROGRAM_ACCESS_ONE required_access_download = access_heads available_on_ntnet = TRUE diff --git a/code/modules/modular_computers/file_system/programs/system/configurator.dm b/code/modules/modular_computers/file_system/programs/system/configurator.dm index d54f2c79fa5..7f3ee9cff43 100644 --- a/code/modules/modular_computers/file_system/programs/system/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/system/configurator.dm @@ -61,6 +61,12 @@ var/new_brightness = Clamp(0, data["brightness"]/10, 1) computer.flashlight.tweak_brightness(new_brightness) + VUEUI_SET_CHECK_IFNOTSET(data["message_range"], computer.message_output_range, ., data) + VUEUI_SET_CHECK_IFNOTSET(data["max_message_range"], initial(computer.message_output_range) + 3, ., data) + + if(data["message_range"]) + computer.message_output_range = clamp(data["message_range"], 0, initial(computer.message_output_range) + 3) + LAZYINITLIST(data["hardware"]) for(var/obj/item/computer_hardware/H in hardware) LAZYINITLIST(data["hardware"][H.name]) diff --git a/code/modules/nano/modules/ghost_menu.dm b/code/modules/nano/modules/ghost_menu.dm new file mode 100644 index 00000000000..b9ec795689a --- /dev/null +++ b/code/modules/nano/modules/ghost_menu.dm @@ -0,0 +1,66 @@ +/datum/vueui_module/ghost_menu/ui_interact(var/mob/user) + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) + if(!ui) + ui = new(user, src, "misc-ghostmenu", 800, 450, "Ghost Menu", state = interactive_state) + ui.open() + +/datum/vueui_module/ghost_menu/Topic(ref, href_list) + if(..()) + return TRUE + + var/mob/abstract/observer/ghost = usr + if(!istype(ghost)) + return TRUE + + if(href_list["follow_target"]) + ghost.ManualFollow(locate(href_list["follow_target"]) in mob_list) + + return FALSE + +/datum/vueui_module/ghost_menu/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + if(!data) + data = list() + + var/list/menu_info = list() + + var/list/names = list() + var/list/namecounts = list() + for(var/mob/M in mob_list) + var/category + var/name = M.name + if(name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + else + names.Add(name) + namecounts[name] = 1 + if(M.real_name && M.real_name != M.name) + name += " \[[M.real_name]\]" + if(!M.mind) + if(M.stat == DEAD) + category = "Dead NPCs" + else + category = "NPCs" + else if(M.stat == DEAD) + if(isobserver(M)) + name += " \[Ghost\]" + category = "Observer" + else + name += " \[Dead\]" + category = "Dead" + else + if(player_is_obvious_antag(M.mind)) + category = M.mind.special_role + else if(isobserver(user)) + var/mob/abstract/observer/O = user + if(O.antagHUD && player_is_antag(M.mind)) + category = M.mind.special_role + if(!category) + category = "Alive" + if(menu_info[category]) + menu_info[category] += list(list("name" = name, "ref" = ref(M))) // this is how to add a list to a list without them merging + else + menu_info[category] = list(list("name" = name, "ref" = ref(M))) + + data["menuinfo"] = menu_info + return data \ No newline at end of file diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 1db75fffac1..d1d0b96eee2 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -45,7 +45,7 @@ spawn(0) for(var/i = 1 to BLOOD_SPRAY_DISTANCE) sprayloc = get_step(sprayloc, spraydir) - if(!istype(sprayloc) || sprayloc.density) + if(!istype(sprayloc) || (sprayloc.density && !iswall(sprayloc))) break var/hit_mob for(var/thing in sprayloc) @@ -78,7 +78,7 @@ drip(amt, sprayloc, spraydir) bled += amt - if(hit_mob) + if(hit_mob || iswall(sprayloc)) break return bled #undef BLOOD_SPRAY_DISTANCE diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index bf9dcef8b7c..c62fab13307 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -19,8 +19,8 @@ relative_size = 85 var/mob/living/carbon/brain/brainmob = null - var/lobotomized = 0 - var/can_lobotomize = 1 + var/prepared = FALSE + var/can_prepare = TRUE var/const/damage_threshold_count = 10 var/damage_threshold_value @@ -230,26 +230,15 @@ else to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later..") -/obj/item/organ/internal/brain/proc/lobotomize(mob/user as mob) - lobotomized = 1 - - if(owner) - to_chat(owner, "As part of your brain is drilled out, you feel your past self, your memories, your very being slip away...") - to_chat(owner, "Your brain has been surgically altered to remove your memory recall. Your ability to recall your former life has been surgically removed from your brain, and while your brain is in this state you remember nothing that ever came before this moment.") - - else if(brainmob) - to_chat(brainmob, "As part of your brain is drilled out, you feel your past self, your memories, your very being slip away...") - to_chat(brainmob, "Your brain has been surgically altered to remove your memory recall. Your ability to recall your former life has been surgically removed from your brain, and while your brain is in this state you remember nothing that ever came before this moment.") - - return - -/obj/item/organ/internal/brain/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W,/obj/item/surgery/surgicaldrill)) - if(!can_lobotomize) +/obj/item/organ/internal/brain/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/surgery/surgicaldrill)) + if(!can_prepare) + to_chat(user, SPAN_WARNING("\The [src] cannot be prepared!")) return - if(!lobotomized) - user.visible_message("[user] drills [src] deftly with [W] into the brain!") - lobotomize(user) + if(!prepared) + user.visible_message(SPAN_DANGER("[user] deftly uses \the [I] to drill into \the [src]!")) + prepared = TRUE else - to_chat(user, "The brain has already been operated on!") - ..() + to_chat(user, SPAN_WARNING("The brain has already been prepared!")) + return + return ..() \ No newline at end of file diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index bd13401d68e..1bfab0dfb6c 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -38,7 +38,7 @@ /obj/item/organ/internal/eyes/take_damage(amount, var/silent=0) var/oldbroken = is_broken() - ..() + . = ..() if(is_broken() && !oldbroken && owner && !owner.stat) to_chat(owner, "You go blind!") diff --git a/code/modules/organs/internal/liver.dm b/code/modules/organs/internal/liver.dm index 6a131f7d633..df70a45dbda 100644 --- a/code/modules/organs/internal/liver.dm +++ b/code/modules/organs/internal/liver.dm @@ -63,7 +63,12 @@ filter_strength *= 1.1 if (owner.intoxication > 0) - owner.intoxication -= min(owner.intoxication, filter_strength) + var/bac = owner.get_blood_alcohol() + var/res = owner.species ? owner.species.ethanol_resistance : 1 + if(bac >= INTOX_MUSCLEIMP * res) //Excessive blood alcohol, difficult to filter + owner.intoxication -= min(owner.intoxication, filter_strength/2) + else + owner.intoxication -= min(owner.intoxication, filter_strength) if(!owner.intoxication) owner.handle_intoxication() diff --git a/code/modules/organs/internal/species/tajara.dm b/code/modules/organs/internal/species/tajara.dm index edc8784c22d..276de81a92e 100644 --- a/code/modules/organs/internal/species/tajara.dm +++ b/code/modules/organs/internal/species/tajara.dm @@ -3,6 +3,7 @@ desc = "A pair of Tajaran eyes accustomed to the low light conditions of Adhomai." icon_state = "tajaran_eyes" action_button_name = "Activate Low Light Vision" + default_action_type = /datum/action/item_action/organ/night_eyes relative_size = 8 var/night_vision = FALSE var/datum/client_color/vision_color = /datum/client_color/monochrome @@ -21,13 +22,6 @@ . = ..() disable_night_vision() -/obj/item/organ/internal/eyes/night/refresh_action_button() - . = ..() - if(.) - action.button_icon_state = "night_eyes" - if(action.button) - action.button.update_icon() - /obj/item/organ/internal/eyes/night/attack_self(var/mob/user) . = ..() if(owner.last_special > world.time) @@ -50,7 +44,7 @@ owner.last_special = world.time + 20 /obj/item/organ/internal/eyes/night/take_damage(var/amount, var/silent = 0) - ..() + . = ..() disable_night_vision() /obj/item/organ/internal/eyes/night/take_internal_damage(var/amount, var/silent = 0) @@ -82,8 +76,8 @@ var/show_message = TRUE for(var/obj/item/protection in list(owner.head, owner.wear_mask, owner.glasses)) if((protection && (protection.body_parts_covered & EYES))) - break show_message = FALSE + break if(show_message && eye_emote) owner.visible_message("[owner][eye_emote]") diff --git a/code/modules/organs/internal/species/vaurca.dm b/code/modules/organs/internal/species/vaurca.dm index 951aec6b89b..adf617de0da 100644 --- a/code/modules/organs/internal/species/vaurca.dm +++ b/code/modules/organs/internal/species/vaurca.dm @@ -8,10 +8,12 @@ eye_emote = "'s eyes gently shift." /obj/item/organ/internal/eyes/night/vaurca/flash_act() - . = ..() - if(!.) + if(!owner) return + to_chat(owner, SPAN_WARNING("Your eyes burn with the intense light of the flash!")) + disable_night_vision() + owner.last_special = world.time + 10 SECONDS owner.Weaken(10) take_damage(rand(10, 11)) if(damage > 12) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index b7485dd3938..26e6c71f51b 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -230,12 +230,12 @@ if (CE_ANTIBIOTIC in owner.chem_effects) antibiotics = owner.chem_effects[CE_ANTIBIOTIC] - if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30)) + if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(35)) germ_level-- if (germ_level >= INFECTION_LEVEL_ONE/2) - //aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes - if(antibiotics < 5 && prob(round(germ_level/6))) + //aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 17 minutes + if(antibiotics < 5 && prob(round(germ_level/7))) germ_level++ if (germ_level >= INFECTION_LEVEL_TWO) @@ -326,11 +326,11 @@ if(antibiotics >= 5) germ_level = 0 //just finish up this small infection else - germ_level -= antibiotics * 5 //Clears very quickly, finishing up remnants of infection + germ_level = max(germ_level - (antibiotics * 5), 0) //Clears very quickly, finishing up remnants of infection else if(germ_level <= INFECTION_LEVEL_TWO) - germ_level -= min(antibiotics, 6) //Still quick, infection's not too bad. At max dose and germ_level 500, should take a minute or two + germ_level = max(germ_level - min(antibiotics, 6), 0) //Still quick, infection's not too bad. At max dose and germ_level 500, should take a minute or two else - germ_level -= min(antibiotics * 0.5, 3) //Big infections, very slow to stop. At max dose and germ_level 1000, should take five to six minutes + germ_level = max(germ_level - min(antibiotics * 0.5, 3), 0) //Big infections, very slow to stop. At max dose and germ_level 1000, should take five to six minutes //Adds autopsy data for used_weapon. /obj/item/organ/proc/add_autopsy_data(var/used_weapon, var/damage) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 97cc4b8c92e..d6da17f363d 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -63,6 +63,12 @@ var/supports_children = TRUE var/list/internal_organs = list() // Internal organs of this body part + var/datum/tendon/tendon + var/tendon_path = /datum/tendon + var/tendon_name = "tendon" // Name of the limb's tendon. Achilles heel, etc. + var/tendon_health = 30 // HP value of the limb's tendon + var/list/tendon_msgs = list("tore apart", "ripped away") + var/damage_msg = "You feel an intense pain!" var/broken_description var/open = 0 @@ -72,7 +78,6 @@ var/encased // Needs to be opened with a saw to access the organs. var/joint = "joint" // Descriptive string used in dislocation. var/artery_name = "artery" //Name of the artery. Cartoid, etc. - var/tendon_name = "tendon" //Name of the limb's tendon. Achilles heel, etc. var/amputation_point // Descriptive string used in amputation. var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ. @@ -227,6 +232,11 @@ get_icon() + if((limb_flags & ORGAN_HAS_TENDON) && !BP_IS_ROBOTIC(src)) + tendon = new tendon_path(src, tendon_name, tendon_health, tendon_msgs) + else if(limb_flags & ORGAN_HAS_TENDON) + limb_flags &= ~ORGAN_HAS_TENDON + /obj/item/organ/external/replaced(var/mob/living/carbon/human/target) ..() if(istype(owner)) @@ -291,11 +301,7 @@ handle_limb_gibbing(used_weapon, brute, burn) if(brute_dam + brute > min_broken_damage && prob(brute_dam + brute * (1 + blunt))) - if(damage_flags & DAM_EDGE) - sever_tendon() - if(brute_dam > FRACTURE_AND_TENDON_DAM_THRESHOLD) - fracture() - else + if(blunt || brute > FRACTURE_AND_TENDON_DAM_THRESHOLD) fracture() // High brute damage or sharp objects may damage internal organs @@ -461,6 +467,9 @@ This function completely restores a damaged organ to perfect condition. implanted_object.forceMove(owner.loc) implants -= implanted_object + if(istype(tendon)) + tendon.rejuvenate() + owner.updatehealth() @@ -471,14 +480,18 @@ This function completely restores a damaged organ to perfect condition. //moved this before the open_wound check so that having many small wounds for example doesn't somehow protect you from taking internal damage (because of the return) //Possibly trigger an internal wound, too. var/local_damage = brute_dam + burn_dam + damage - if(damage > 15 && !(type in list(BURN, LASER)) && local_damage > 30 && !(status & ORGAN_ROBOT)) - var/internal_damage - if(prob(damage) && sever_artery()) - internal_damage = TRUE - if(prob(Ceiling(damage / 4)) && type == CUT && sever_tendon()) - internal_damage = TRUE - if(internal_damage) - owner.custom_pain("You feel something rip in your [name]!", 25) + + if(damage > (min_broken_damage / 2) && local_damage > min_broken_damage && !(status & ORGAN_ROBOT)) + if(!(type in list(BURN, LASER))) + if(prob(damage) && sever_artery()) + owner.custom_pain("You feel something rip in your [name]!", 25) + + if(istype(tendon) && type == CUT) + var/new_brute = damage + if(min_broken_damage - brute_dam > 0) + // Only pass on damage that goes over the broken threshold + new_brute = brute_dam + damage - min_broken_damage + tendon.damage(new_brute) //Burn damage can cause fluid loss due to blistering and cook-off if((type in list(BURN, LASER)) && (damage > 5 || damage + burn_dam >= 15) && !BP_IS_ROBOTIC(src)) @@ -536,7 +549,18 @@ This function completely restores a damaged organ to perfect condition. //external organs handle brokenness a bit differently when it comes to damage. Instead brute_dam is checked inside process() //this also ensures that an external organ cannot be "broken" without broken_description being set. /obj/item/organ/external/is_broken() - return ((status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED))) + if(status & ORGAN_CUT_AWAY) + return TRUE + if((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED)) + for(var/obj/item/organ/internal/augment/aug in internal_organs) + if(aug.supports_limb) + if(aug.is_broken()) + continue + if(aug.is_bruised() && prob(60)) + continue + return FALSE + return TRUE + return FALSE //Determines if we even need to process this organ. /obj/item/organ/external/proc/need_process() @@ -650,10 +674,10 @@ Note that amputating the affected organ does in fact remove the infection from t if (owner.germ_level > W.germ_level && W.infection_check()) W.germ_level++ - if (antibiotics < 5) + if(antibiotics < 5) for(var/datum/wound/W in wounds) //Infected wounds raise the organ's germ level - if (W.germ_level > germ_level) + if (W.germ_level > germ_level && W.infection_check()) germ_level++ break //limit increase to a maximum of one per second @@ -812,12 +836,9 @@ Note that amputating the affected organ does in fact remove the infection from t if (open && !clamped && (H && !(H.species.flags & NO_BLOOD))) status |= ORGAN_BLEEDING - //Bone fractures - if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) - if(cut_dam > brute_dam * 0.5) - sever_tendon() - else - fracture() + if (istype(tendon)) + tendon.update_damage(cut_dam - min_broken_damage) + update_damage_ratios() /obj/item/organ/external/proc/update_damage_ratios() @@ -1148,11 +1169,13 @@ Note that amputating the affected organ does in fact remove the infection from t return 0 /obj/item/organ/external/is_usable() + if(is_stump()) + return FALSE if(is_dislocated()) return FALSE - if(status & ORGAN_TENDON_CUT) + if(tendon_status() & TENDON_CUT) return FALSE - if(parent && (parent.status & ORGAN_TENDON_CUT)) + if(parent && (parent.tendon_status() & TENDON_CUT)) return FALSE if(can_feel_pain() && get_pain() > pain_disability_threshold) return FALSE @@ -1356,24 +1379,15 @@ Note that amputating the affected organ does in fact remove the infection from t status |= ORGAN_ARTERY_CUT return TRUE -/obj/item/organ/external/proc/sever_tendon() - if(!(limb_flags & ORGAN_HAS_TENDON) || (status & ORGAN_ROBOT) || (status & ORGAN_TENDON_CUT)) - return FALSE - - . = TRUE - playsound(src.loc, 'sound/effects/snap.ogg', 40, 1, -2) - status |= ORGAN_TENDON_CUT - if(!owner) +/obj/item/organ/external/proc/tendon_status() + if(!(limb_flags & ORGAN_HAS_TENDON)) return - var/message = pick("tore apart", "ripped away") - owner.visible_message(\ - "You hear a loud snapping sound coming from \the [owner]!",\ - "Something feels like it [message] in your [name]!",\ - "You hear a sickening snap!") - if(owner.species && owner.can_feel_pain()) - owner.emote("scream") - owner.flash_strong_pain() + if(!istype(tendon)) + // Somehow this limb should have a tendon but doesn't. Assume it was destroyed + return TENDON_CUT + + return tendon.status // Damage procs /obj/item/organ/external/proc/get_brute_damage() diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 6d3b784b191..c63e6f3cf89 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -138,11 +138,11 @@ /obj/item/organ/external/proc/get_internal_organs_overlay() for(var/obj/item/organ/internal/O in internal_organs) if(O.on_mob_icon) - var/cache_key = "[O.on_mob_icon]-[O.icon_state]" + var/cache_key = "[O.on_mob_icon]-[O.item_state || O.icon_state]" var/icon/organ_icon = SSicon_cache.internal_organ_cache[cache_key] if (!organ_icon) - organ_icon = new /icon(O.on_mob_icon, O.icon_state) + organ_icon = new /icon(O.on_mob_icon, O.item_state || O.icon_state) SSicon_cache.internal_organ_cache[cache_key] = organ_icon add_overlay(organ_icon) @@ -264,7 +264,7 @@ for(var/obj/item/organ/internal/O in internal_organs) if(O.on_mob_icon) - keyparts += "[O.on_mob_icon]-[O.icon_state]" + keyparts += "[O.on_mob_icon]-[O.item_state || O.icon_state]" . = keyparts.Join("_") diff --git a/code/modules/organs/subtypes/augment.dm b/code/modules/organs/subtypes/augment.dm index 6e893cf3e0d..0cbc79a23a2 100644 --- a/code/modules/organs/subtypes/augment.dm +++ b/code/modules/organs/subtypes/augment.dm @@ -15,6 +15,7 @@ var/action_button_icon = "augment" var/activable = FALSE var/bypass_implant = FALSE + var/supports_limb = FALSE // if true, will make parent limb not count as broken, as long as it's not bruised (40%) and not broken (0%) /obj/item/organ/internal/augment/Initialize() robotize() @@ -573,15 +574,15 @@ set_light(0) /obj/item/organ/internal/augment/sightlights/emp_act(severity) - ..() + . = ..() set_light(0) /obj/item/organ/internal/augment/sightlights/take_damage(var/amount, var/silent = 0) - ..() + . = ..() set_light(0) /obj/item/organ/internal/augment/sightlights/take_internal_damage(var/amount, var/silent = 0) - ..() + . = ..() set_light(0) /obj/item/organ/internal/augment/zenghu_plate diff --git a/code/modules/organs/subtypes/parasite.dm b/code/modules/organs/subtypes/parasite.dm index 3b45175eb52..7cf5945aa15 100644 --- a/code/modules/organs/subtypes/parasite.dm +++ b/code/modules/organs/subtypes/parasite.dm @@ -174,11 +174,11 @@ var/obj/item/organ/internal/brain/B = owner.internal_organs_by_name[BP_BRAIN] - if(B && !B.lobotomized) + if(B && !B.prepared) to_chat(owner, "As the K'ois consumes your mind, you feel your past self, your memories, your very being slip away... only slavery to the swarm remains...") to_chat(owner, "You have been lobotomized by K'ois infection. All of your previous memories up until this point are gone, and all of your ambitions are nothing. You live for only one purpose; to serve the Lii'dra hive.") - B.lobotomized = 1 + B.prepared = 1 if(!removed_langs) @@ -251,8 +251,8 @@ O.status &= ~ORGAN_ARTERY_CUT owner.visible_message(SPAN_WARNING("The severed artery in \the [owner]'s [O] stitches itself back together..."), SPAN_NOTICE("The severed artery in your [O] stitches itself back together...")) healed = TRUE - else if(O.status & ORGAN_TENDON_CUT) - O.status &= ~ORGAN_TENDON_CUT + else if((O.tendon_status() & TENDON_CUT) && O.tendon.can_recover()) + O.tendon.rejuvenate() owner.visible_message(SPAN_WARNING("The severed tendon in \the [owner]'s [O] stitches itself back together..."), SPAN_NOTICE("The severed tendon in your [O] stitches itself back together...")) healed = TRUE else if(O.status & ORGAN_BROKEN) diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 5dc6a68eeca..0686b5309bd 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -176,10 +176,6 @@ . = ..() owner.update_hud_hands() -/obj/item/organ/external/hand/sever_tendon() - . = ..() - owner.update_hud_hands() - /obj/item/organ/external/hand/removed() owner.drop_from_inventory(owner.gloves) owner.update_hud_hands() @@ -235,7 +231,7 @@ ..() /obj/item/organ/external/head/take_damage(brute, burn, damage_flags, used_weapon = null, list/forbidden_limbs = list(), var/silent) - ..(brute, burn, damage_flags, used_weapon, forbidden_limbs, damage_flags, silent) + . = ..(brute, burn, damage_flags, used_weapon, forbidden_limbs, damage_flags, silent) if (!disfigured) if (brute_dam > 40) if (prob(50)) @@ -256,4 +252,4 @@ /obj/item/organ/external/head/droplimb(var/clean, var/disintegrate = DROPLIMB_EDGE, var/ignore_children = null) if(iszombie(owner)) return ..(disintegrate = DROPLIMB_BLUNT) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/organs/tendons.dm b/code/modules/organs/tendons.dm new file mode 100644 index 00000000000..252f1163899 --- /dev/null +++ b/code/modules/organs/tendons.dm @@ -0,0 +1,109 @@ +/datum/tendon + var/name = "tendon" + var/max_health = 30 + var/health = 30 + var/status + + var/list/messages + + var/obj/item/organ/external/parent + +/datum/tendon/New(var/obj/item/organ/external/E, var/name, var/hp, var/list/damage_msgs) + if(!istype(E)) + crash_with("Tendon created with invalid parent organ: [E]") + qdel(src) + return + + parent = E + + if(name) + src.name = name + if(islist(damage_msgs)) + messages = damage_msgs + + if(hp) + max_health = hp + health = max_health + +/datum/tendon/proc/update_status(var/fix_cut = FALSE) + // determine if tendon should be cut, bruised, or unbruised + if(health <= 0 && !(status & TENDON_CUT)) + sever() + else if(get_health() >= 0.5 && status & TENDON_BRUISED) + status &= ~TENDON_BRUISED + else if(get_health() < 0.5 && get_health() > 0 && !status) + status |= TENDON_BRUISED + if(parent.owner.species && parent.owner.can_feel_pain()) + parent.owner.custom_pain("You feel a burning soreness in your [parent.name]!", 10, nohalloss = TRUE) + + if(fix_cut && status & TENDON_CUT) + // fix_cut should only be TRUE through means like surgery, adv. tech, or space magic + status &= ~TENDON_CUT + +/datum/tendon/proc/update_damage(var/total_dmg) + // called by organ/external/update_damages() + var/lost_health = max_health - health + if(total_dmg <= 0) + heal(max_health) + else + if(total_dmg < lost_health) + heal(lost_health - total_dmg) + else + damage(total_dmg - lost_health) + +/datum/tendon/proc/get_health() + if(!parent?.owner) + return FALSE + + return health / max_health + +/datum/tendon/proc/can_recover() + // This is basically just used for the half-dozen times that tendons are "healed" + // using methods that may or may not heal the limb enough to actually heal the tendon + // thus, this prevents infinite tendon snapping + update_status() + if(status & TENDON_CUT) + return health > 0 + return TRUE + +/datum/tendon/proc/rejuvenate() + heal(max_health, TRUE) + +/datum/tendon/proc/heal(var/hp, var/fix_cut) + if(!parent?.owner || hp <= 0) + return + + health = min(max_health, health + hp) + + update_status(fix_cut) + +/datum/tendon/proc/damage(var/dmg) + if(!parent?.owner || health <= 0 || dmg <= 0) + return + + health = max(0, health - dmg) + + update_status() + +/datum/tendon/proc/sever() + if(!parent?.owner || (status & TENDON_CUT)) + return FALSE + + playsound(parent.owner.loc, 'sound/effects/snap.ogg', 40, 1, -2) + status |= TENDON_CUT + + if(parent.owner.species && parent.owner.can_feel_pain()) + parent.owner.emote("scream") + parent.owner.flash_strong_pain() + parent.owner.custom_pain(FONT_LARGE("You feel something [pick(messages)] in your [parent.name]!"), 25) + parent.owner.visible_message(SPAN_WARNING("You hear a loud snapping sound coming from [parent.owner]!"), + blind_message = "You hear a sickening snap!") + else + parent.owner.visible_message(SPAN_WARNING("You hear a loud snapping sound coming from [parent.owner]!"),\ + SPAN_DANGER("Something feels like it [pick(messages)] in your [parent.name]!"),\ + "You hear a sickening snap!") + + if(istype(parent, /obj/item/organ/external/hand)) + parent.owner.update_hud_hands() + + return status diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 78a0bf8c1e7..15f6fa417f2 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -168,15 +168,8 @@ else if(href_list["read"]) var/obj/item/paper/P = locate(href_list["read"]) - - if(P && (P.loc == src) && istype(P, /obj/item/paper) ) - - if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/abstract/observer) || istype(usr, /mob/living/silicon))) - usr << browse("[P.name][stars(P.info)][P.stamps]", "window=[P.name]") - onclose(usr, "[P.name]") - else - usr << browse("[P.name][P.info][P.stamps]", "window=[P.name]") - onclose(usr, "[P.name]") + if(istype(P) && (P.loc == src)) + P.show_content(usr) else if(href_list["look"]) var/obj/item/photo/P = locate(href_list["look"]) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index ec140f0fc3a..c7371e4d1e7 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -16,6 +16,25 @@ icon_state = "filingcabinet" density = 1 anchored = 1 + var/static/list/accepted_items = list( + /obj/item/paper, + /obj/item/folder, + /obj/item/photo, + /obj/item/paper_bundle, + /obj/item/sample, + /obj/item/book, + /obj/item/card, + /obj/item/forensics/slide, + /obj/item/forensics/swab, + /obj/item/storage/photo_album, + /obj/item/clipboard, + /obj/item/disk, + /obj/item/pen, + /obj/item/clothing/accessory/badge, + /obj/item/pack, + /obj/item/hand, + /obj/item/key +) /obj/structure/filingcabinet/chestdrawer @@ -30,12 +49,12 @@ /obj/structure/filingcabinet/Initialize() . = ..() for(var/obj/item/I in loc) - if(istype(I, /obj/item/paper) || istype(I, /obj/item/folder) || istype(I, /obj/item/photo) || istype(I, /obj/item/paper_bundle) || istype(I, /obj/item/sample)) + if(is_type_in_list(I, accepted_items)) I.forceMove(src) -/obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob) - if(istype(P, /obj/item/paper) || istype(P, /obj/item/folder) || istype(P, /obj/item/photo) || istype(P, /obj/item/paper_bundle) || istype(P, /obj/item/sample)) +/obj/structure/filingcabinet/attackby(obj/item/P, mob/user) + if(is_type_in_list(P, accepted_items)) to_chat(user, "You put [P] in [src].") user.drop_from_inventory(P,src) flick("[initial(icon_state)]-open",src) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 186fbfec40f..0db871e2e29 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -80,12 +80,7 @@ else if(href_list["read"]) var/obj/item/paper/P = locate(href_list["read"]) if(P && (P.loc == src) && istype(P)) - if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/abstract/observer) || istype(usr, /mob/living/silicon))) - usr << browse("[P.name][stars(P.info)][P.stamps]", "window=[P.name]") - onclose(usr, "[P.name]") - else - usr << browse("[P.name][P.info][P.stamps]", "window=[P.name]") - onclose(usr, "[P.name]") + P.show_content(usr) else if(href_list["look"]) var/obj/item/photo/P = locate(href_list["look"]) if(P && (P.loc == src) && istype(P)) @@ -118,8 +113,10 @@ /obj/item/folder/blue/nka/Initialize() . = ..() - new /obj/item/paper/nka_pledge(src) - new /obj/item/paper/nka_pledge(src) - new /obj/item/paper/nka_pledge(src) - new /obj/item/paper/nka_pledge(src) - new /obj/item/paper/nka_pledge(src) + for (var/I = 1 to 5) + new /obj/item/paper/nka_pledge(src) + +/obj/item/folder/filled/Initialize() + . = ..() + for (var/I = 1 to 10) + new /obj/item/paper(src) \ No newline at end of file diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 084ef439b6f..9f621f6a906 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -89,25 +89,33 @@ free_space -= length(strip_html_properly(new_text)) /obj/item/paper/examine(mob/user) - ..() - if (old_name && icon_state == "paper_plane") + . = ..() + if (old_name && icon_state == "paper_plane" || icon_state == "paper_swan") to_chat(user, SPAN_NOTICE("You're going to have to unfold it before you can read it.")) return if(name != initial(name)) to_chat(user,"It's titled '[name]'.") - if(in_range(user, src) || isobserver(user)) + if(in_range(user, src) || isobserver(user) || in_slide_projector(user)) show_content(usr) else to_chat(user, SPAN_NOTICE("You have to go closer if you want to read it.")) /obj/item/paper/proc/show_content(mob/user, forceshow) + var/datum/browser/paper_win = new(user, name, null, 450, 500, null, TRUE) + paper_win.set_content(get_content(user, can_read(user, forceshow))) + paper_win.add_stylesheet("paper_languages", 'html/browser/paper_languages.css') + paper_win.open() + +/obj/item/paper/proc/can_read(var/mob/user, var/forceshow = FALSE) var/can_read = (istype(user, /mob/living/carbon/human) || isobserver(user) || istype(user, /mob/living/silicon)) || forceshow if(!forceshow && istype(user,/mob/living/silicon/ai)) var/mob/living/silicon/ai/AI can_read = get_dist(src, AI.camera) < 2 - user << browse("[name][can_read ? info : stars(info)][stamps]", "window=[name]") - onclose(user, "[name]") + return can_read + +/obj/item/paper/proc/get_content(var/mob/user, var/can_read = TRUE) + return "[capitalize_first_letters(name)][can_read ? parse_languages(user, info) : stars(info)][stamps]" /obj/item/paper/verb/rename() set name = "Rename paper" @@ -153,6 +161,18 @@ name = "paper plane" return + if (user.a_intent == I_DISARM && icon_state != "scrap" && !istype(src, /obj/item/paper/carbon)) + if (icon_state == "paper_swan") + user.show_message(SPAN_ALERT("The paper is already folded into a swan.")) + return + user.visible_message(SPAN_NOTICE("\The [user] carefully folds \the [src] into an origami swan."), + SPAN_NOTICE("You carefully fold \the [src] into a swan."), "\The [user] folds \the [src] into a swan.") + playsound(src, 'sound/bureaucracy/paperfold.ogg', 50, 1) + icon_state = "paper_swan" + old_name = name + name = "origami swan" + return + if (user.a_intent == I_HELP && old_name && icon_state == "paper_plane") user.visible_message(SPAN_NOTICE("\The [user] unfolds \the [src]."), SPAN_NOTICE("You unfold \the [src]."), "You hear paper rustling.") playsound(src, 'sound/bureaucracy/paperfold.ogg', 50, 1) @@ -163,6 +183,15 @@ update_icon() return + if (user.a_intent == I_HELP && old_name && icon_state == "paper_swan") + user.visible_message(SPAN_NOTICE("\The [user] unfolds \the [src]."), SPAN_NOTICE("You unfold \the [src]."), "You hear paper rustling.") + playsound(src, 'sound/bureaucracy/paperfold.ogg', 50, 1) + icon_state = initial(icon_state) + name = old_name + old_name = null + update_icon() + return + user.examinate(src) if(rigged && (Holiday == "April Fool's Day")) if(last_honk <= world.time - 20) //Spam limiter. @@ -267,7 +296,7 @@ return signfont /obj/item/paper/proc/parsepencode(t, obj/item/pen/P, mob/user, iscrayon, isfountain) - + t = parse_languages(user, t, TRUE) t = replacetext(t, "\[sign\]", "[get_signature(P, user)]") if(iscrayon) // If it is a crayon, and he still tries to use these, make them empty! @@ -325,17 +354,64 @@ else flick("paper_onfire", src) - //I was going to add do_after in here, but keeping the current method allows people to burn papers they're holding, while they move. That seems fine to keep -Nanako - spawn(20) - if(get_dist(src, user) < 2 && user.get_active_hand() == P) - user.visible_message("[user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ - "You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) + addtimer(CALLBACK(src, .proc/burnpaper_callback, P, user, class), 20, TIMER_UNIQUE) +/obj/item/paper/proc/burnpaper_callback(obj/item/P, mob/user, class = "warning") + if (QDELETED(user) || QDELETED(src)) + return + + if(get_dist(src, user) < 2 && user.get_active_hand() == P) + user.visible_message("[user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ + "You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") + + if(user.get_inactive_hand() == src) + user.drop_from_inventory(src) + + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) + + else + to_chat(user, "You must hold \the [P] steady to burn \the [src].") + +/** + * Takes the paper's info variable, a user, and parses language markers that exist + * in it. It returns an HTML string which represents the languages properly. + * + * @param user The mob we're parsing the text for. + * + * @return An HTML string where all of the [lang][/lang] marker contents are replaced + * with scrambled and properly fonted content depending on what languages the user knows. + */ +/obj/item/paper/proc/parse_languages(mob/user, input, language_check = FALSE) + // Just a safety fallback. + if (!user) + return input + + var/static/regex/written_lang_regex + if (!written_lang_regex) + written_lang_regex = new(@"(\[lang=([#_a-zA-Z0-9\^]{1})])(.*?)(\[\/lang])", "g") + + . = input + + while (written_lang_regex.Find(.)) + var/datum/language/L = language_keys[written_lang_regex.group[2]] + // Unknown language. + if (!L || !L.written_style) + continue + + var/content = written_lang_regex.group[3] + var/reader_understands = user.say_understands(null, L) + + // Replace the content with

    content here

    + if(!reader_understands) + if(language_check) + . = replacetext(., written_lang_regex.match, "") else - to_chat(user, SPAN_WARNING("You must hold \the [P] steady to burn \the [src].")) - + content = L.scramble(content) + + if(!language_check) + // Refer to paper/proc/show_content to edit the spans here. + . = replacetext(., written_lang_regex.match, "[L.short && reader_understands ? "([L.short]) [content]" : content]") /obj/item/paper/Topic(href, href_list) ..() @@ -408,7 +484,10 @@ update_space(t) - usr << browse("[name][info_links][stamps]", "window=[name]") // Update the window + var/datum/browser/paper_win = new(usr, name, null, 450, 500, null, TRUE) + paper_win.set_content("[capitalize_first_letters(name)][parse_languages(usr, info_links)][stamps]") + paper_win.add_stylesheet("paper_languages", 'html/browser/paper_languages.css') + paper_win.open() playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20) update_icon() @@ -482,7 +561,10 @@ if ( istype(RP) && RP.mode == 2 ) RP.RenamePaper(user,src) else - user << browse("[name][info_links][stamps]", "window=[name]") + var/datum/browser/paper_win = new(user, name, null, 450, 500, null, TRUE) + paper_win.set_content("[capitalize_first_letters(name)][info_links][stamps]") + paper_win.add_stylesheet("paper_languages", 'html/browser/paper_languages.css') + paper_win.open() return else if(istype(P, /obj/item/stamp) || istype(P, /obj/item/clothing/ring/seal)) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index fa05753fa2c..73766068570 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -120,11 +120,13 @@ if(istype(pages[page], /obj/item/paper)) var/obj/item/paper/P = W - if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/abstract/observer) || istype(usr, /mob/living/silicon))) - dat+= "[P.name][stars(P.info)][P.stamps]" - else - dat+= "[P.name][P.info][P.stamps]" - user << browse(dat, "window=[name]") + dat += P.get_content(user, P.can_read(user)) + + var/datum/browser/paper_win = new(user, name, null, 450, 500, null, TRUE) + paper_win.set_content(dat) + paper_win.add_stylesheet("paper_languages", 'html/browser/paper_languages.css') + paper_win.open() + else if(istype(pages[page], /obj/item/photo)) var/obj/item/photo/P = W send_rsc(user, P.img, "tmp_photo.png") @@ -172,7 +174,14 @@ if(pages.len <= 1) var/obj/item/paper/P = src[1] - usr.put_in_hands(P) + if(istype(loc, /obj/item/gripper)) //Hacky but without it there's a ghost icon with grippers and it all spills on the floor. + var/obj/item/gripper/G = loc + G.drop(get_turf(src), FALSE) + G.grip_item(P, usr, FALSE) + else + usr.put_in_hands(P) + usr.unset_machine(src) + usr << browse(null, "window=[name]") qdel(src) return diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 43f0ab84d34..cabb32b3982 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -127,7 +127,6 @@ add_overlay("papershredder4") if(10) add_overlay("papershredder5") - update_icon() /obj/item/shreddedp/attackby(var/obj/item/W as obj, var/mob/user) if(istype(W, /obj/item/flame/lighter)) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index bcc946191c1..8ae7bb0ba4f 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -160,7 +160,7 @@ VUEUI_MONITOR_VARS(/obj/machinery/photocopier, photocopiermonitor) return /proc/copy(var/obj/machinery/target, var/obj/item/paper/copy, var/print = TRUE, var/use_sound = TRUE, var/delay = 10, var/toner) // note: var/delay is the delay from copy to print, it should be less than the sleep in copy_type() - var/obj/item/paper/c = new /obj/item/paper() + var/obj/item/paper/c = new copy.type(target) var/info var/pname if (toner > 10) //lots of toner, make it dark diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 8e87998d4d7..2e8f87c6b1c 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -29,7 +29,7 @@ var/global/photo_count = 0 icon = 'icons/obj/bureaucracy.dmi' icon_state = "photo" item_state = "paper" - w_class = ITEMSIZE_SMALL + w_class = ITEMSIZE_TINY var/picture_desc // Who and/or what's in the picture. var/id var/icon/img //Big photo image @@ -54,8 +54,8 @@ var/global/photo_count = 0 ..() /obj/item/photo/examine(mob/user) - .=..() - if(in_range(user, src)) + . = ..() + if(in_range(user, src) || isobserver(user) || in_slide_projector(user)) show(user) to_chat(user, "[picture_desc]") else @@ -175,6 +175,8 @@ var/global/photo_count = 0 return ..() +/obj/item/device/camera/AltClick(var/mob/user) + change_size() /obj/item/device/camera/proc/get_mobs(turf/the_turf as turf) var/mob_detail @@ -209,6 +211,11 @@ var/global/photo_count = 0 icon_state = icon_on on = 1 +/obj/item/device/camera/detective + name = "detectives camera" + desc = "A one use - polaroid camera." + pictures_left = 30 + //Proc for capturing check /mob/living/proc/can_capture_turf(turf/T) return TRUE // DVIEW will do sanity checks, we've got no special checks. diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index d0fffe3a961..64107390fa1 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -66,7 +66,7 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/white color = COLOR_WHITE -/obj/structure/cable/Initialize() +/obj/structure/cable/Initialize(mapload) . = ..() // ensure d1 & d2 reflect the icon_state for entering and exiting cable @@ -83,6 +83,13 @@ By design, d1 is the smallest direction and d2 is the highest SSpower.all_cables += src //add it to the global cable list + if(mapload) + var/image/I = image(icon, T, icon_state, EFFECTS_ABOVE_LIGHTING_LAYER, dir, pixel_x, pixel_y) + I.plane = 0 + I.alpha = 125 + I.color = color + LAZYADD(T.blueprints, I) + /obj/structure/cable/Destroy() // called when a cable is deleted if(powernet) cut_cable_from_powernet() // update the powernets diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index c21bc70bbbb..05768fe3c32 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -89,7 +89,6 @@ to_chat(user, "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]J!\nThe charge meter reads [round(src.percent() )]%.") /obj/item/cell/attackby(obj/item/W, mob/user) - ..() if(istype(W, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = W @@ -103,6 +102,7 @@ message_admins("[key_name_admin(user)] injected a power cell with phoron, rigging it to explode.") S.reagents.clear_reagents() + return else if(istype(W, /obj/item/device/assembly_holder)) var/obj/item/device/assembly_holder/assembly = W if (istype(assembly.a_left, /obj/item/device/assembly/signaler) && istype(assembly.a_right, /obj/item/device/assembly/signaler)) @@ -113,6 +113,22 @@ new /obj/item/device/radiojammer/improvised(assembly, src, user) else to_chat(user, "You'd need both devices to be signallers for this to work.") + return + else if(W.ismultitool() && ishuman(user) && user.get_inactive_hand() == src) + if(charge < 10) + to_chat(user, SPAN_WARNING("\The [src] doesn't have enough charge to produce sufficient current!")) + return + var/mob/living/carbon/human/H = user + var/siemens_coeff = 1 + if(H.gloves) + siemens_coeff = H.gloves.siemens_coefficient + if(siemens_coeff >= 0.75 && prob(10 * siemens_coeff)) + to_chat(H, SPAN_WARNING("You probe \the [src] with \the [W] and feel a jolt of electricity shoot through you! It reads out that [100 * siemens_coeff]% of the current was let through.")) + H.electrocute_act(5, src, siemens_coeff, H.hand ? BP_R_HAND : BP_L_HAND) // hand holding the battery gets shocked + else + to_chat(H, SPAN_NOTICE("You probe \the [src] with \the [W]. It reads out that [100 * siemens_coeff]% of the current was let through.")) + return + return ..() /obj/item/cell/proc/explode() var/turf/T = get_turf(src.loc) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 03e68453556..9ad30628fb9 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -14,7 +14,7 @@ field_generator power level display #define field_generator_max_power 250000 /obj/machinery/field_generator - name = "Field Generator" + name = "field generator" desc = "A large thermal battery that projects a high amount of energy when powered." icon = 'icons/obj/machines/field_generator.dmi' icon_state = "Field_Gen" @@ -51,6 +51,13 @@ field_generator power level display level = between(0, level, num_power_levels) if(level) add_overlay("+p[level]") + if(anchored) + add_overlay("+bolts") + if(state == 2) + add_overlay("+welding") + var/image/lights_image = image(icon, null, "+lights") + lights_image.layer = EFFECTS_ABOVE_LIGHTING_LAYER + add_overlay(lights_image) /obj/machinery/field_generator/machinery_process() if(Varedit_start == 1) @@ -102,6 +109,7 @@ field_generator power level display "You secure the external reinforcing bolts to the floor.", \ "You hear ratchet") src.anchored = 1 + update_icon() if(1) state = 0 playsound(src.loc, W.usesound, 75, 1) @@ -109,6 +117,7 @@ field_generator power level display "You undo the external reinforcing bolts.", \ "You hear ratchet") src.anchored = 0 + update_icon() if(2) to_chat(user, "The [src.name] needs to be unwelded from the floor.") return @@ -128,6 +137,7 @@ field_generator power level display if(!src || !WT.isOn()) return state = 2 to_chat(user, "You weld the field generator to the floor.") + update_icon() else return if(2) @@ -140,6 +150,7 @@ field_generator power level display if(!src || !WT.isOn()) return state = 1 to_chat(user, "You cut the [src] free from the floor.") + update_icon() else return else diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index fe2b6cb7b73..fd4b0fd4614 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -1,6 +1,6 @@ /////SINGULARITY SPAWNER -/obj/machinery/the_singularitygen/ - name = "Gravitational Singularity Generator" +/obj/machinery/the_singularitygen + name = "gravitational singularity generator" desc = "An Odd Device which produces a Gravitational Singularity when set up." icon = 'icons/obj/singularity.dmi' icon_state = "TheSingGen" @@ -10,6 +10,14 @@ var/energy = 0 var/creation_type = /obj/singularity +/obj/machinery/the_singularitygen/update_icon() + cut_overlays() + if(anchored) + add_overlay("[icon_state]+bolts") + var/image/lights_image = image(icon, null, "[icon_state]+lights") + lights_image.layer = EFFECTS_ABOVE_LIGHTING_LAYER + add_overlay(lights_image) + /obj/machinery/the_singularitygen/machinery_process() var/turf/T = get_turf(src) if(src.energy >= 200) @@ -28,5 +36,6 @@ user.visible_message("[user.name] unsecures [src.name] from the floor.", \ "You unsecure the [src.name] from the floor.", \ "You hear a ratchet") + update_icon() return return ..() diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index eae0631a0e4..8b61d548155 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -13,6 +13,14 @@ /obj/item/stock_parts/capacitor ) +/obj/machinery/power/tesla_coil/update_icon() + cut_overlays() + if(anchored) + add_overlay("[icon_state]+bolts") + var/image/lights_image = image(icon, null, "[icon_state]+lights") + lights_image.layer = EFFECTS_ABOVE_LIGHTING_LAYER + add_overlay(lights_image) + /obj/machinery/power/tesla_coil/RefreshParts() var/power_multiplier = 0 @@ -32,6 +40,7 @@ playsound(src.loc, W.usesound, 50, 1) to_chat(user, "You [anchored ? "unfasten" : "fasten"] [src] to the flooring.") anchored = !anchored + update_icon() if(!anchored) disconnect_from_network() else @@ -53,7 +62,7 @@ ..() /obj/machinery/power/grounding_rod - name = "Grounding Rod" + name = "grounding rod" desc = "Keep an area from being fried from Edison's Bane." icon = 'icons/obj/tesla_engine/tesla_coil.dmi' icon_state = "grounding_rod" @@ -65,6 +74,13 @@ /obj/item/stock_parts/capacitor ) +/obj/machinery/power/grounding_rod/update_icon() + cut_overlays() + if(anchored) + add_overlay("[icon_state]+bolts") + var/image/lights_image = image(icon, null, "[icon_state]+lights") + lights_image.layer = EFFECTS_ABOVE_LIGHTING_LAYER + add_overlay(lights_image) /obj/machinery/power/grounding_rod/attackby(obj/item/W, mob/user) if(default_deconstruction_screwdriver(user, W)) @@ -78,9 +94,9 @@ playsound(src.loc, W.usesound, 50, 1) to_chat(user, "You [anchored ? "unfasten" : "fasten"] [src] to the flooring.") anchored = !anchored + update_icon() return - /obj/machinery/power/grounding_rod/tesla_act(var/power, var/melt = FALSE) flick("coil_shock_1", src) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 1aa1fb36551..f9c7406b139 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -207,6 +207,26 @@ origin_tech = list(TECH_COMBAT = 3) ammo_type = /obj/item/ammo_casing/a556/ap +/obj/item/ammo_magazine/a556/carbine + name = "carbine magazine (5.56mm)" + icon_state = "5.56c" + desc = "A 5.56 ammo magazine fit for a carbine, not an assault rifle." + matter = list(DEFAULT_WALL_MATERIAL = 1250) + max_ammo = 15 + +/obj/item/ammo_magazine/a556/carbine/empty + max_ammo = 0 + +/obj/item/ammo_magazine/a556/carbine/practice + name = "carbine magazine (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556/practice + +/obj/item/ammo_magazine/a556/carbine/ap + name = "carbine magazine (5.56mm AP)" + icon_state = "5.56APc" + origin_tech = list(TECH_COMBAT = 3) + ammo_type = /obj/item/ammo_casing/a556/ap + /obj/item/ammo_magazine/a50 name = "magazine (.50)" icon_state = "50ae" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 1657ca84e52..8ca0f3e7ca0 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -480,8 +480,7 @@ else if(grabstate >= GRAB_AGGRESSIVE) damage_mult = 1.5 P.damage *= damage_mult - //you can't miss at point blank.. - P.can_miss = 1 + P.point_blank = TRUE /obj/item/gun/proc/process_accuracy(obj/projectile, mob/user, atom/target, acc_mod, dispersion) var/obj/item/projectile/P = projectile diff --git a/code/modules/projectiles/guns/energy/blaster.dm b/code/modules/projectiles/guns/energy/blaster.dm index 47131da5545..f9c07f04557 100644 --- a/code/modules/projectiles/guns/energy/blaster.dm +++ b/code/modules/projectiles/guns/energy/blaster.dm @@ -38,9 +38,16 @@ dispersion = list(3,6,9,12) firemodes = list() +/obj/item/gun/energy/blaster/pilot_special + name = "pilot's sidearm" + desc = "A robust, low in maintenance blaster pistol. Customized for peak performance and perfect for self-defense purposes." + max_shots = 8 + accuracy = 2 // Likely to get nothing else, so they gotta know how to make it count. + offhand_accuracy = 2 + /obj/item/gun/energy/blaster/revolver name = "blaster revolver" - desc = "A robust eight-shot blaster.." + desc = "A robust eight-shot blaster." icon = 'icons/obj/guns/blaster_revolver.dmi' icon_state = "blaster_revolver" item_state = "blaster_revolver" @@ -62,10 +69,6 @@ user.visible_message(SPAN_WARNING("\The [user] spins the cylinder of \the [src]!"), SPAN_WARNING("You spin the cylinder of \the [src]!"), SPAN_NOTICE("You hear something metallic spin and click.")) playsound(src.loc, 'sound/weapons/revolver_spin.ogg', 100, 1) -/obj/item/gun/energy/blaster/revolver/pilot - name = "pilot's sidearm" - desc = "A robust, low in maintenance, eight-shot blaster. Perfect for self-defense purposes." - /obj/item/gun/energy/blaster/carbine name = "blaster carbine" desc = "A short-barreled blaster carbine meant for easy handling and comfort when in combat." @@ -90,9 +93,12 @@ offhand_accuracy = 0 projectile_type = /obj/item/projectile/energy/blaster/heavy + force = 10 slot_flags = SLOT_BACK w_class = ITEMSIZE_LARGE - + can_bayonet = TRUE + knife_x_offset = 23 + knife_y_offset = 13 fire_delay = 25 w_class = ITEMSIZE_LARGE accuracy = -3 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 9f2aa18f12a..8cf7a7fd7ba 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -120,7 +120,8 @@ obj/item/gun/energy/retro projectile_type = /obj/item/projectile/beam/xray charge_cost = 100 max_shots = 20 - fire_delay = 1 + fire_delay = 4 + burst_delay = 4 can_turret = 1 turret_is_lethal = 1 turret_sprite_set = "xray" diff --git a/code/modules/projectiles/guns/energy/magic.dm b/code/modules/projectiles/guns/energy/magic.dm index 38e0ad0dafa..c77252d35b0 100644 --- a/code/modules/projectiles/guns/energy/magic.dm +++ b/code/modules/projectiles/guns/energy/magic.dm @@ -1,181 +1,3 @@ -/* Staves */ - -/obj/item/gun/energy/staff - name = "staff of change" - desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." - icon = 'icons/obj/guns/staffofchange.dmi' - icon_state = "staffofchange" - item_state = "staffofchange" - has_item_ratio = FALSE - fire_sound = 'sound/magic/Staff_Change.ogg' - flags = CONDUCT - slot_flags = SLOT_BACK - w_class = ITEMSIZE_LARGE - max_shots = 1 - displays_maptext = TRUE - projectile_type = /obj/item/projectile/change - origin_tech = list(TECH_COMBAT = 7, TECH_MAGNET = 5, TECH_BLUESPACE = 7) - self_recharge = 1 - recharge_time = 15 - charge_meter = 0 - pin = /obj/item/device/firing_pin/magic - has_safety = FALSE - -/obj/item/gun/energy/staff/emp_act(severity) // to prevent it from breaking. - return - -obj/item/gun/energy/staff/special_check(var/mob/living/user) - if(HULK in user.mutations) - to_chat(user, "In your rage you momentarily forget the operation of this stave!") - return 0 - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - //Save the users active hand - var/mob/living/new_mob - var/mob/living/carbon/human/H = user - for(var/obj/item/W in H) - if(istype(W, /obj/item/implant)) - qdel(W) - continue - H.drop_from_inventory(W) - playsound(user, 'sound/weapons/emitter.ogg', 40, 1) - var/obj/item/organ/external/LA = H.get_organ(BP_L_ARM) - var/obj/item/organ/external/RA = H.get_organ(BP_R_ARM) - var/obj/item/organ/external/LL = H.get_organ(BP_L_LEG) - var/obj/item/organ/external/RL = H.get_organ(BP_R_LEG) - LA.droplimb(0,DROPLIMB_BLUNT) - RA.droplimb(0,DROPLIMB_BLUNT) - LL.droplimb(0,DROPLIMB_BLUNT) - RL.droplimb(0,DROPLIMB_BLUNT) - playsound(user, 'sound/effects/splat.ogg', 50, 1) - user.visible_message("With a sickening series of crunches, [user]'s body shrinks, and they begin to sprout feathers!") - user.visible_message("[user] screams!") - new_mob = new /mob/living/simple_animal/parrot(H.loc) - new_mob.universal_speak = 1 - new_mob.key = H.key - new_mob.set_intent(I_HURT) - qdel(H) - sleep(20) - new_mob.say("Poly wanna cracker!") - return 0 - return 1 - -/obj/item/gun/energy/staff/handle_click_empty(mob/user = null) - if (user) - user.visible_message("*fizzle*", "*fizzle*") - else - src.visible_message("*fizzle*") - playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 1) - -/obj/item/gun/energy/staff/animate - name = "staff of animation" - desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines." - projectile_type = /obj/item/projectile/animate - fire_sound = 'sound/magic/wand.ogg' - max_shots = 10 - -obj/item/gun/energy/staff/animate/special_check(var/mob/living/user) - if(HULK in user.mutations) - to_chat(user, "In your rage you momentarily forget the operation of this stave!") - return 0 - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - //Save the users active hand - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/LA = H.get_organ(BP_L_HAND) - var/obj/item/organ/external/RA = H.get_organ(BP_R_HAND) - var/active_hand = H.hand - playsound(user, 'sound/effects/blobattack.ogg', 40, 1) - user.visible_message(" With a sickening crunch, [user]'s hand rips itself off, and begins crawling away!") - user.visible_message("[user] screams!") - user.drop_item() - if(active_hand) - LA.droplimb(0,DROPLIMB_EDGE) - new /mob/living/simple_animal/hostile/mimic/copy(LA.loc, LA) - qdel(LA) - else - RA.droplimb(0,DROPLIMB_EDGE) - new /mob/living/simple_animal/hostile/mimic/copy(RA.loc, RA) - qdel(RA) - return 0 - return 1 - -/obj/item/gun/energy/staff/focus - name = "mental focus" - desc = "An artefact that channels the will of the user into destructive bolts of force. If you aren't careful with it, you might poke someone's brain out." - icon = 'icons/obj/guns/mental_focus.dmi' - icon_state = "focus" - item_state = "focus" - fire_sound = 'sound/magic/wand.ogg' - slot_flags = SLOT_BACK - projectile_type = /obj/item/projectile/forcebolt - -obj/item/gun/energy/staff/focus/special_check(var/mob/living/user) - if(HULK in user.mutations) - to_chat(user, "In your rage you momentarily forget the operation of this stave!") - return 0 - if(!user.is_wizard()) - if(ishuman(user)) - //Save the users active hand - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/LA = H.get_organ(BP_L_ARM) - var/obj/item/organ/external/RA = H.get_organ(BP_R_ARM) - var/active_hand = H.hand - playsound(user, 'sound/magic/lightningbolt.ogg', 40, 1) - to_chat(user, "Coruscating waves of energy wreathe around your arm...hot...so hot!") - user.show_message("[user] screams!",2) - user.drop_item() - if(active_hand) - LA.droplimb(0,DROPLIMB_BURN) - else - RA.droplimb(0,DROPLIMB_BURN) - return 0 - return 1 - - -obj/item/gun/energy/staff/focus/toggle_firing_mode(mob/living/user) - if(projectile_type == /obj/item/projectile/forcebolt) - charge_cost = 400 - to_chat(user, "The [src.name] will now strike a small area.") - projectile_type = /obj/item/projectile/forcebolt/strong - else - charge_cost = 200 - to_chat(user, "The [src.name] will now strike only a single person.") - projectile_type = /obj/item/projectile/forcebolt - - -/obj/item/gun/energy/staff/chaos - name = "staff of chaos" - desc = "An artefact that spits bolts of chaotic energy, expect anything." - icon = 'icons/obj/guns/staff_of_chaos.dmi' - icon_state = "staffofchaos" - item_state = "staffofchaos" - fire_sound = 'sound/magic/Staff_Chaos.ogg' - flags = CONDUCT - w_class = ITEMSIZE_LARGE - max_shots = 5 - projectile_type = /obj/item/projectile/magic - var/list/possible_projectiles = list(/obj/item/projectile/magic, /obj/item/projectile/change, /obj/item/projectile/forcebolt, - /obj/item/gun/energy/staff/animate, /obj/item/projectile/magic/fireball, /obj/item/projectile/magic/teleport, - /obj/item/projectile/temp, /obj/item/projectile/ion, /obj/item/projectile/energy/declone, /obj/item/projectile/meteor, - /obj/item/projectile/beam/thermaldrill, /obj/item/projectile/beam/energy_net, /obj/item/projectile/energy/bee) - -/obj/item/gun/energy/staff/chaos/special_check(var/mob/living/user) - projectile_type = pick(possible_projectiles) - if(HULK in user.mutations) - to_chat(user, "In your rage you momentarily forget the operation of this stave!") - return 0 - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - var/obj/P = consume_next_projectile() - if(P) - if(process_projectile(P, user, user, pick(BP_HEAD, BP_CHEST))) - handle_post_fire(user, user) - user.visible_message("\The [src] backfires!") - user.drop_item() - return 0 - return 1 - //wands /obj/item/gun/energy/wand @@ -192,7 +14,6 @@ obj/item/gun/energy/staff/focus/toggle_firing_mode(mob/living/user) projectile_type = /obj/item/projectile/magic origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 5, TECH_BLUESPACE = 6) charge_meter = 0 - pin = /obj/item/device/firing_pin/magic charge_failure_message = null has_safety = FALSE @@ -213,138 +34,4 @@ obj/item/gun/energy/staff/focus/toggle_firing_mode(mob/living/user) return 1 /obj/item/gun/energy/wand/toy - origin_tech = null - -/obj/item/gun/energy/wand/fire - name = "wand of fire" - desc = "A wand that can fire destructive flames." - icon = 'icons/obj/wands.dmi' - icon_state = "firewand" - item_state = "firewand" - fire_sound = 'sound/magic/Fireball.ogg' - max_shots = 5 - projectile_type = /obj/item/projectile/magic/fireball - -/obj/item/gun/energy/wand/fire/special_check(var/mob/living/user) - if(HULK in user.mutations) - to_chat(user, "In your rage you momentarily forget the operation of this wand!") - return 0 - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.IgniteMob(15) - H.visible_message("\The [src] explodes in a shower of fire!") - H.drop_item() - qdel(src) - return 0 - return 1 - - -/obj/item/gun/energy/wand/polymorph - name = "wand of polymorph" - desc = "A wand that will change the shape of the its victims." - icon = 'icons/obj/wands.dmi' - icon_state = "polywand" - item_state = "polywand" - fire_sound = 'sound/magic/Staff_Change.ogg' - max_shots = 10 - projectile_type = /obj/item/projectile/change - -/obj/item/gun/energy/wand/polymorph/special_check(var/mob/living/user) - if(HULK in user.mutations) - to_chat(user, "In your rage you momentarily forget the operation of this wand!") - return 0 - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.drop_item() - H.visible_message("\The [H] collapses on the floor, their body shrinking and growing hair!") - H.monkeyize() - H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/grown/banana(H), slot_l_hand) - qdel(src) - return 0 - return 1 - -/obj/item/gun/energy/wand/teleport - name = "wand of teleportation" - desc = "This wand will send your targets away, or closer, to yourself." - icon = 'icons/obj/wands.dmi' - icon_state = "telewand" - item_state = "telewand" - fire_sound = 'sound/magic/Wand_Teleport.ogg' - max_shots = 10 - projectile_type = /obj/item/projectile/magic/teleport - -/obj/item/gun/energy/wand/teleport/special_check(var/mob/living/user) //todo: think of something else for this - if(HULK in user.mutations) - to_chat(user, "In your rage you momentarily forget the operation of this wand!") - return 0 - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/O = H.internal_organs_by_name[pick(H.species.vision_organ || BP_EYES, BP_APPENDIX, BP_KIDNEYS, BP_LIVER, BP_HEART, BP_LUNGS, BP_BRAIN)] - if(O == null) - to_chat(user, "You can't make any sense of the arcane glyphs... maybe you should try again.") - else - to_chat(user, "As you stumble over the arcane glyphs, you feel a twisting sensation in your [O.name]!") - user.visible_message("\A flash of smoke pours out of [user]'s orifices!") - playsound(user, 'sound/magic/lightningshock.ogg', 40, 1) - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, user.loc) - smoke.attach(user) - smoke.start() - user.emote("scream") - user.drop_item() - if(istype(O)) - O.removed(user) - qdel(src) - return 0 - return 1 - -/obj/item/gun/energy/wand/force - name = "wand of force" - desc = "A more portable version of the mental focus, still deadly." - icon = 'icons/obj/wands.dmi' - icon_state = "deathwand" - item_state = "deathwand" - max_shots = 10 - projectile_type = /obj/item/projectile/forcebolt - -/obj/item/gun/energy/wand/force/special_check(var/mob/living/user) - if(HULK in user.mutations) - to_chat(user, "In your rage you momentarily forget the operation of this wand!") - return 0 - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.visible_message("\The [src] escapes from [H]'s hand, hitting their face and shattering into pieces!") - H.apply_damage(35, BRUTE, BP_HEAD, 0) - H.adjustBrainLoss(50, 55) - H.sdisabilities += CLUMSY - H.drop_item() - qdel(src) - return 0 - return 1 - -/obj/item/gun/energy/wand/animation - name = "wand of animation" - desc = "This wand will create a legion of murderous toilets, for your own leisure." - icon = 'icons/obj/wands.dmi' - icon_state = "revivewand" - item_state = "revivewand" - max_shots = 10 - projectile_type = /obj/item/projectile/animate - -/obj/item/gun/energy/wand/animation/special_check(var/mob/living/user) - if(HULK in user.mutations) - to_chat(user, "In your rage you momentarily forget the operation of this wand!") - return 0 - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.visible_message("\The [src] jumps from [H]'s hand and swifts into a crate!") - new /mob/living/simple_animal/hostile/mimic(H.loc) - H.drop_item() - qdel(src) - return 0 - return 1 + origin_tech = null \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/mining.dm b/code/modules/projectiles/guns/energy/mining.dm index b07e6a64e21..6c22dbe21e6 100644 --- a/code/modules/projectiles/guns/energy/mining.dm +++ b/code/modules/projectiles/guns/energy/mining.dm @@ -4,7 +4,7 @@ name = "plasma cutter" desc = "A mining tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off of xenos! Or, you know, mine stuff." charge_meter = FALSE - icon = 'icons/obj/mining_contained.dmi' + icon = 'icons/obj/guns/plasma_cutter.dmi' icon_state = "plasma" item_state = "plasma" usesound = 'sound/weapons/plasma_cutter.ogg' diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 6ed5e710589..b5d0f3e114d 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -40,7 +40,7 @@ /obj/item/gun/energy/gun/nuclear name = "advanced energy gun" desc = "An energy gun with an experimental miniaturized reactor." - desc_info = "This is an energy weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ + desc_info = "This is an energy weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ then click where you want to fire. Most energy weapons can fire through windows harmlessly. To switch between stun and lethal, click the weapon \ in your hand. Unlike most weapons, this weapon recharges itself." icon = 'icons/obj/guns/nucgun.dmi' @@ -200,4 +200,47 @@ list(mode_name="single", can_autofire = FALSE, burst = 1), list(mode_name="three-burst", can_autofire = FALSE, burst = 3, burst_accuracy = list(1,0,0), dispersion = list(0, 10, 15)), list(mode_name="full-auto", can_autofire = TRUE, burst = 1, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3), dispersion = list(5, 10, 15, 20)) + ) + +/obj/item/gun/energy/gun/skrell + self_recharge = TRUE + fire_sound = 'sound/weapons/Laser2.ogg' + modifystate = null + charge_failure_message = "'s charging socket was removed to make room for a recharger." + secondary_fire_sound = 'sound/weapons/Laser3.ogg' + +/obj/item/gun/energy/gun/skrell/emp_act(severity) + return //Fuck robots. + +/obj/item/gun/energy/gun/skrell/pistol + name = "jargon particle pistol" + desc = "A Jargon Federation particle-beam pistol with two settings: Disable and Lethal." + icon = 'icons/obj/guns/jargonpistol.dmi' + icon_state = "particlepistol" + item_state = "particlepistol" + slot_flags = SLOT_BELT|SLOT_HOLSTER + force = 5 + projectile_type = /obj/item/projectile/beam/stun/skrell + secondary_projectile_type = /obj/item/projectile/beam/pulse/skrell + + firemodes = list( + list(mode_name="disable", projectile_type=/obj/item/projectile/beam/stun/skrell, fire_sound='sound/weapons/Laser2.ogg'), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam/pulse/skrell, fire_sound='sound/weapons/Laser3.ogg') + ) + +/obj/item/gun/energy/gun/skrell/smg + name = "jargon particle submachinegun" + desc = "A Jargon Federation particle-beam submachine gun with two settings: Disable and Lethal." + icon = 'icons/obj/guns/jargonsmg.dmi' + icon_state = "particlesmg" + item_state = "particlesmg" + slot_flags = SLOT_BELT|SLOT_HOLSTER|SLOT_BACK + max_shots = 14 + force = 7 + projectile_type = /obj/item/projectile/beam/stun/skrell + secondary_projectile_type = /obj/item/projectile/beam/pulse/skrell + + firemodes = list( + list(mode_name="disable", projectile_type=/obj/item/projectile/beam/stun/skrell, fire_sound='sound/weapons/Laser2.ogg'), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam/pulse/skrell, fire_sound='sound/weapons/Laser3.ogg', burst = 2, burst_delay = 2) ) \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/rifle.dm b/code/modules/projectiles/guns/energy/rifle.dm index d44f4d8e1d6..50c88a31d4b 100644 --- a/code/modules/projectiles/guns/energy/rifle.dm +++ b/code/modules/projectiles/guns/energy/rifle.dm @@ -11,6 +11,7 @@ force = 10 max_shots = 20 fire_delay = 6 + burst_delay = 3 accuracy = -1 can_turret = 1 secondary_projectile_type = /obj/item/projectile/beam @@ -18,8 +19,9 @@ can_switch_modes = 1 turret_sprite_set = "carbine" turret_is_lethal = 0 + has_item_ratio = FALSE - fire_delay_wielded = 1 + fire_delay_wielded = 4 accuracy_wielded = 2 sel_mode = 1 @@ -95,6 +97,8 @@ projectile_type = /obj/item/projectile/beam/xray origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2) max_shots = 40 + fire_delay = 6 + burst_delay = 6 secondary_projectile_type = null secondary_fire_sound = null can_switch_modes = 0 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 7b674f1fd82..17847abd817 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -208,7 +208,7 @@ muzzle_flash = 10 #define GATLINGLASER_DISPERSION_CONCENTRATED list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) -#define GATLINGLASER_DISPERSION_SPRAY list(0, 5, 5, 10, 10, 15, 15, 20, 20, 25, 25, 30, 30, 35, 40, 45) +#define GATLINGLASER_DISPERSION_SPRAY list(0, 5, 5, 10, 10, 15, 15, 20, 20, 25, 25, 25, 30, 30, 35, 40) /obj/item/gun/energy/vaurca/gatlinglaser name = "gatling laser" @@ -224,21 +224,22 @@ w_class = ITEMSIZE_LARGE force = 10 projectile_type = /obj/item/projectile/beam/gatlinglaser - max_shots = 80 + max_shots = 350 sel_mode = 1 burst = 10 burst_delay = 1 - fire_delay = 10 + fire_delay = 8 dispersion = GATLINGLASER_DISPERSION_CONCENTRATED is_wieldable = TRUE firemodes = list( - list(mode_name="concentrated burst", burst=10, burst_delay = 1, fire_delay = 10, dispersion = GATLINGLASER_DISPERSION_CONCENTRATED), - list(mode_name="spray", burst=20, burst_delay = 1, move_delay = 5, fire_delay = 30, dispersion = GATLINGLASER_DISPERSION_SPRAY) + list(mode_name="concentrated burst", burst=12, burst_delay = 1, move_delay=5, dispersion = GATLINGLASER_DISPERSION_CONCENTRATED), + list(mode_name="spray", burst=22, burst_delay = 1, move_delay = 8, dispersion = GATLINGLASER_DISPERSION_SPRAY), + list(mode_name="massive spray", burst=32, burst_delay = 1, move_delay = 10, dispersion = GATLINGLASER_DISPERSION_SPRAY), ) - charge_cost = 50 + charge_cost = 40 /obj/item/gun/energy/vaurca/gatlinglaser/special_check(var/mob/user) if(is_charging) diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index ad8bbabf32c..2c6b23179fa 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -135,7 +135,8 @@ /obj/item/gun/projectile/automatic/rifle/sts35 name = "assault rifle" desc = "A durable, rugged looking automatic weapon of a make popular on the frontier worlds. Uses 7.62mm rounds. It is unmarked." - desc_fluff = "The STS35 is a durable, reliable and cheap to buy fully automatic assault rifle with many licensed manufacturers across the galaxy. It comes in different versions and calibres, this one uses 7.62 rounds. The manufacturer markings have been filed off." + desc_fluff = "The STS35 is a durable, reliable and cheap to buy fully automatic assault rifle with many licensed manufacturers across \ + the galaxy. It comes in different versions and calibres, this one uses 7.62 rounds. The manufacturer markings have been filed off." can_bayonet = TRUE knife_x_offset = 23 knife_y_offset = 13 @@ -144,6 +145,30 @@ ..() icon_state = (ammo_magazine)? "arifle" : "arifle-empty" +/obj/item/gun/projectile/automatic/rifle/carbine + name = "ballistic carbine" + desc = "A durable, rugged looking semi-automatic weapon of a make popular on the frontier worlds. Uses 5.56mm rounds and does not accept large \ + capacity magazines. It is unmarked." + desc_fluff = "The ST24 is often considered the little brother of its larger and fully automatic counterpart, the STS35. It is a \ + reliable and cheap to buy carbine with many licensed manufacturers across the galaxy. It comes in different versions and calibres, \ + some even boasting select fire functionality. This one uses 5.56 rounds and is semi-automatic. The manufacturer markings have been filed off." + icon = 'icons/obj/guns/bcarbine.dmi' + icon_state = "bcarbine" + item_state = "bcarbine" + caliber = "a556" + can_bayonet = TRUE + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 1, TECH_ILLEGAL = 3) + magazine_type = /obj/item/ammo_magazine/a556/carbine + allowed_magazines = list(/obj/item/ammo_magazine/a556/carbine) + knife_x_offset = 23 + knife_y_offset = 13 + + firemodes = list(mode_name="semiauto", burst=1, fire_delay=12) + +/obj/item/gun/projectile/automatic/rifle/carbine/update_icon() + ..() + icon_state = (ammo_magazine)? "bcarbine" : "bcarbine-empty" + /obj/item/gun/projectile/automatic/rifle/sol name = "battle rifle" desc = "A powerful battle rifle, the M469 is a highly accurate skirmishing firearm of Zavodskoi Instellar make which is chambered in 7.62." @@ -181,7 +206,7 @@ slot_flags = SLOT_BACK load_method = MAGAZINE magazine_type = /obj/item/ammo_magazine/a556 - allowed_magazines = list(/obj/item/ammo_magazine/a556) + allowed_magazines = list(/obj/item/ammo_magazine/a556, /obj/item/ammo_magazine/a556/carbine) auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' @@ -460,4 +485,4 @@ /obj/item/gun/projectile/automatic/rifle/shotgun/update_icon() ..() - icon_state = (ammo_magazine)? "assaultshotgun" : "assaultshotgun-empty" \ No newline at end of file + icon_state = (ammo_magazine)? "assaultshotgun" : "assaultshotgun-empty" diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 749517bd738..af2f04daf26 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -1,6 +1,7 @@ /obj/item/gun/projectile/colt name = "vintage .45 pistol" - desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds." + desc = "A rugged Zavodskoi-designed pistol. Uses .45 rounds." + desc_fluff = "The Zavodskoi Interstellar Colt was designed and marketed as an homage to classic Human firearms, and looks and acts much the same way - it was deliberately designed with some anachronistic features, but in spite of that artificial age of the design it performs well enough to see service all over Human space. Chambered in .45 caliber." magazine_type = /obj/item/ammo_magazine/c45m allowed_magazines = list(/obj/item/ammo_magazine/c45m) icon = 'icons/obj/guns/colt.dmi' diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index e60d6a1caaa..416d67137fc 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -274,5 +274,5 @@ if(default_parry_check(user, attacker, damage_source) && prob(20)) user.visible_message(SPAN_DANGER("\The [user] parries [attack_text] with \the [src]!")) playsound(user.loc, "punchmiss", 50, 1) - return TRUE + return PROJECTILE_STOPPED return FALSE diff --git a/code/modules/projectiles/guns/projectile/rifle.dm b/code/modules/projectiles/guns/projectile/rifle.dm index e25ec45dade..fec6381f8f1 100644 --- a/code/modules/projectiles/guns/projectile/rifle.dm +++ b/code/modules/projectiles/guns/projectile/rifle.dm @@ -282,7 +282,11 @@ load_method = MAGAZINE handle_casings = DELETE_CASINGS + force = 10 slot_flags = SLOT_BACK + can_bayonet = TRUE + knife_x_offset = 23 + knife_y_offset = 13 fire_delay = 25 accuracy = -1 diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index e0cfccc62a8..e6a2917a928 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -89,12 +89,6 @@ Firing pins as a rule can't be removed without replacing them, blame a really sh Pins Below. */ -//only used in wizard staffs/wands. -/obj/item/device/firing_pin/magic - name = "magic crystal shard" - desc = "A small enchanted shard which allows magical weapons to fire." - icon_state = "firing_pin_wizwoz" - // Test pin, works only near firing ranges. /obj/item/device/firing_pin/test_range name = "test-range firing pin" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 99e5d31da2d..74b447bae91 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -23,7 +23,7 @@ var/dispersion = 0.0 //used for shooting at blank range, you shouldn't be able to miss - var/can_miss = 0 + var/point_blank = FALSE //Effects var/damage = 10 @@ -79,6 +79,7 @@ //Fired processing vars var/fired = FALSE //Have we been fired yet var/paused = FALSE //for suspending the projectile midair + var/reflected = FALSE var/last_projectile_move = 0 var/last_process = 0 var/time_offset = 0 @@ -189,19 +190,26 @@ return TRUE result = target_mob.bullet_act(src, def_zone) - if(result == PROJECTILE_FORCE_MISS && (can_miss == 0)) //if you're shooting at point blank you can't miss. - if(!silenced) - target_mob.visible_message("\The [src] misses [target_mob] narrowly!") - playsound(target_mob, /decl/sound_category/bulletflyby_sound, 50, 1) - return FALSE - - if(result == PROJECTILE_DODGED) - return FALSE + switch(result) + if(PROJECTILE_FORCE_MISS) + if(!point_blank) + if(!silenced) + target_mob.visible_message("\The [src] misses [target_mob] narrowly!") + playsound(target_mob, /decl/sound_category/bulletflyby_sound, 50, 1) + return FALSE + if(PROJECTILE_DODGED) + return FALSE + if(PROJECTILE_STOPPED) + return TRUE var/impacted_organ = parse_zone(def_zone) - if(istype(target_mob, /mob/living/simple_animal)) + if(isanimal(target_mob)) var/mob/living/simple_animal/SA = target_mob impacted_organ = pick(SA.organ_names) + else if(ishuman(target_mob)) + var/mob/living/carbon/human/H = target_mob + var/obj/item/organ/external/E = H.organs_by_name[impacted_organ] + impacted_organ = E.name //hit messages if(silenced) to_chat(target_mob, "You've been hit in the [impacted_organ] by \a [src]!") @@ -310,6 +318,8 @@ /obj/item/projectile/proc/old_style_target(atom/target, atom/source) if(!source) source = get_turf(src) + starting = get_turf(source) + original = target setAngle(get_projectile_angle(source, target)) /obj/item/projectile/proc/fire(angle, atom/direct_target) @@ -573,6 +583,9 @@ trajectory.set_angle(new_angle) return TRUE +/obj/item/projectile/proc/redirect(x, y, starting, source) + old_style_target(locate(x, y, z), starting? get_turf(starting) : get_turf(source)) + /obj/item/projectile/forceMove(atom/target) . = ..() if(trajectory && !trajectory_ignore_forcemove && isturf(target)) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index cf24f8ef8be..18f30fc3705 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -175,7 +175,8 @@ /obj/item/projectile/beam/gatlinglaser name = "diffused laser" icon_state = "heavylaser" - damage = 10 + damage = 20 + armor_penetration = 35 no_attack_log = 1 muzzle_type = /obj/effect/projectile/muzzle/disabler @@ -426,7 +427,7 @@ /obj/item/projectile/beam/tesla/on_impact(atom/target) . = ..() if(isliving(target)) - tesla_zap(target, 3, 5000) + tesla_zap(target, 5, 5000) /obj/item/projectile/beam/tesla/master damage = 15 @@ -460,3 +461,15 @@ if(H.bodytemperature <= H.species.cold_level_2) new /obj/structure/closet/statue/ice(H.loc, H) H.visible_message(SPAN_WARNING("\The [H] freezes!")) + +/obj/item/projectile/beam/stun/skrell + name = "particle stun beam" + icon_state = "beam_omni" + agony = 50 + + muzzle_type = /obj/effect/projectile/muzzle/disabler + tracer_type = /obj/effect/projectile/tracer/disabler + impact_type = /obj/effect/projectile/impact/disabler + +/obj/item/projectile/beam/pulse/skrell + name = "particle lethal beam" \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 2895b76708e..4043bf88add 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -200,19 +200,22 @@ /obj/item/projectile/bullet/rifle damage = 40 armor_penetration = 15 - penetrating = TRUE + penetrating = FALSE /obj/item/projectile/bullet/rifle/a762 damage = 40 armor_penetration = 20 + penetrating = TRUE /obj/item/projectile/bullet/rifle/a556 damage = 40 armor_penetration = 15 + penetrating = FALSE -/obj/item/projectile/bullet/rifle/a556/ap +/obj/item/projectile/bullet/rifle/a556/ap damage = 35 armor_penetration = 40 + penetrating = TRUE /obj/item/projectile/bullet/rifle/a145 damage = 80 @@ -229,6 +232,7 @@ name = "vintage bullet" damage = 50 weaken = 1 + penetrating = TRUE /obj/item/projectile/bullet/rifle/slugger name = "slugger round" @@ -280,7 +284,7 @@ if(isanimal(target)) target.visible_message("[target] twitches, foaming at the mouth.") - L.apply_damage(35, TOX) //temporary until simple_mob paralysis actually works. + L.apply_damage(35, TOX) //temporary until simple_animal paralysis actually works. ..() /* Miscellaneous */ @@ -346,6 +350,7 @@ /obj/item/projectile/bullet/gauss/highex name = "high-ex shell" damage = 10 + armor_penetration = 30 /obj/item/projectile/bullet/gauss/highex/on_impact(var/atom/A) explosion(A, -1, 0, 2) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 7ffa1f2be3d..b2e52d599fa 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -219,6 +219,7 @@ /obj/item/projectile/energy/blaster/heavy damage = 35 + armor_penetration = 10 /obj/item/projectile/energy/blaster/incendiary icon_state = "laser" diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index 6945df397c8..b0e18682220 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -190,9 +190,9 @@ E.status &= ~ORGAN_ARTERY_CUT return - if(E.status & ORGAN_TENDON_CUT) + if((E.tendon_status() & TENDON_CUT) && E.tendon.can_recover()) to_chat(H, SPAN_NOTICE("Your autoredactive faculty repairs the severed tendon in your [E.name].")) - E.status &= ~ORGAN_TENDON_CUT + E.tendon.rejuvenate() return TRUE for(var/datum/wound/W in E.wounds) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 92f3d5483d7..97e54d5b526 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -216,7 +216,7 @@ var/coercion_rank = user.psi.get_rank(PSI_COERCION) if(coercion_rank >= PSI_RANK_GRANDMASTER) target.AdjustParalysis(-1) - target.drowsyness = 0 + target.drowsiness = 0 if(istype(target, /mob/living/carbon)) var/mob/living/carbon/M = target M.hallucination = max(M.hallucination, 10) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 9727426001f..83156be0dec 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -83,9 +83,9 @@ to_chat(user, SPAN_NOTICE("You painstakingly mend the torn veins in \the [E], stemming the internal bleeding.")) E.status &= ~ORGAN_ARTERY_CUT return TRUE - if(E.status & ORGAN_TENDON_CUT) + if((E.tendon_status() & TENDON_CUT) && E.tendon.can_recover()) to_chat(user, SPAN_NOTICE("You interleave and repair the severed tendon in \the [E].")) - E.status &= ~ORGAN_TENDON_CUT + E.tendon.rejuvenate() return TRUE if(E.status & ORGAN_BROKEN) to_chat(user, SPAN_NOTICE("You coax shattered bones to come together and fuse, mending the break.")) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 63b1098240a..bcda2e7b4d8 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -27,6 +27,7 @@ var/max_pill_count = 20 flags = OPENCONTAINER var/datum/asset/spritesheet/chem_master/chem_asset + var/list/forbidden_containers = list(/obj/item/reagent_containers/glass/bucket) //For containers we don't want people to shove into the chem machine. Like big-ass buckets. /obj/machinery/chem_master/Initialize() . = ..() @@ -42,12 +43,15 @@ qdel(src) return -/obj/machinery/chem_master/attackby(var/obj/item/B as obj, var/mob/user as mob) +/obj/machinery/chem_master/attackby(var/obj/item/B, mob/user) if(istype(B, /obj/item/reagent_containers/glass)) if(src.beaker) - to_chat(user, "A beaker is already loaded into the machine.") + to_chat(user, SPAN_WARNING("A beaker is already loaded into the machine.")) + return + if(is_type_in_list(B, forbidden_containers)) + to_chat(user, SPAN_WARNING("There's no way to fit [B] into \the [src]!")) return src.beaker = B user.drop_from_inventory(B,src) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index ba87b1c031d..18270c2216a 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -296,7 +296,7 @@ /decl/reagent/lithium/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) if(M.canmove && !M.restrained() && !(istype(M.loc, /turf/space))) step(M, pick(cardinal)) - if(prob(5)) + if(prob(5) && ishuman(M)) M.emote(pick("twitch", "drool", "moan")) /decl/reagent/mercury @@ -323,7 +323,7 @@ M.confused = max(M.confused, 10) if(dose > 4) M.add_chemical_effect(CE_CLUMSY, 1) - if(prob(dose/4)) + if(prob(dose/4) && ishuman(M)) M.emote(pick("twitch", "shiver", "drool")) if(prob(dose/4)) M.visible_message("[M] chuckles spontaneously.", "You chuckle spontaneously.") @@ -446,7 +446,7 @@ M.take_organ_damage(0, removed * power * 0.2) //burn damage, since it causes chemical burns. Acid doesn't make bones shatter, like brute trauma would. return if(!M.unacidable && removed > 0) - if(istype(M, /mob/living/carbon/human) && REAGENT_VOLUME(holder, type) >= meltdose) + if(ishuman(M) && REAGENT_VOLUME(holder, type) >= meltdose) var/mob/living/carbon/human/H = M var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD) if(affecting) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm index a94dfb31a97..b0edd0d0e59 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm @@ -21,7 +21,7 @@ M.add_chemical_effect(CE_PAINKILLER, 5 + round(power,5)) if(power > 5) - M.drowsyness = min(20,max(M.drowsyness,power - 5)) + M.drowsiness = min(20,max(M.drowsiness,power - 5)) if(power > 10) var/nutrition_percent = M.nutrition/M.max_nutrition @@ -54,7 +54,7 @@ /decl/reagent/serotrotium/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) var/mob/living/carbon/human/H = M - if(istype(H) && (H.species.flags & NO_BLOOD)) + if(!istype(H) || (istype(H) && (H.species.flags & NO_BLOOD))) //If we're not human OR if we're human but don't have blood. return if(prob(7)) M.emote(pick("twitch", "drool", "moan", "gasp")) @@ -92,8 +92,8 @@ if(prob(80)) M.add_chemical_effect(CE_NEUROTOXIC, 3*removed) if(prob(50)) - M.drowsyness = max(M.drowsyness, 3) - if(prob(10)) + M.drowsiness = max(M.drowsiness, 3) + if(prob(10) && ishuman(M)) M.emote("drool") /decl/reagent/mindbreaker @@ -130,24 +130,20 @@ if(dose < 1) M.apply_effect(3, STUTTER) M.make_dizzy(5) - if(prob(5)) - M.emote(pick("twitch", "giggle")) else if(dose < 2) M.apply_effect(3, STUTTER) M.make_jittery(5) M.dizziness = max(150, M.dizziness) M.make_dizzy(5) M.druggy = max(M.druggy, 35) - if(prob(10)) - M.emote(pick("twitch", "giggle")) else M.apply_effect(3, STUTTER) M.make_jittery(10) M.dizziness = max(150, M.dizziness) M.make_dizzy(10) M.druggy = max(M.druggy, 40) - if(prob(15)) - M.emote(pick("twitch", "giggle")) + if(ishuman(M) && prob(min(15, dose*5))) + M.emote(pick("twitch", "giggle")) /decl/reagent/raskara_dust name = "Raskara Dust" @@ -162,17 +158,17 @@ /decl/reagent/raskara_dust/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_PAINKILLER, 10) - M.drowsyness += 1 * removed + M.drowsiness += 1 * removed /decl/reagent/raskara_dust/affect_breathe(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_PAINKILLER, 25) - M.drowsyness += 2 * removed - if(prob(5)) + M.drowsiness += 2 * removed + if(prob(5) && ishuman(M)) M.emote("cough") /decl/reagent/raskara_dust/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_PAINKILLER, 50) - M.drowsyness += 3 * removed + M.drowsiness += 3 * removed if(prob(5)) M.emote("twitch") @@ -198,7 +194,7 @@ holder.reagent_data[type]["special"] += (REAGENT_VOLUME(holder, type)/10)*removed M.make_jittery(5 + holder.reagent_data[type]["special"]) - M.drowsyness = max(0,M.drowsyness - (1 + holder.reagent_data[type]["special"]*0.1)) + M.drowsiness = max(0,M.drowsiness - (1 + holder.reagent_data[type]["special"]*0.1)) if(holder.reagent_data[type]["special"] > 5) M.add_chemical_effect(CE_SPEEDBOOST, 1) M.apply_effect(1 + holder.reagent_data[type]["special"]*0.25, STUTTER) @@ -274,13 +270,14 @@ M.add_chemical_effect(CE_PAINKILLER, 40) // basically like Perconol, but a bit worse // doesn't make you vomit, though if(prob(7)) - M.emote(pick("twitch", "drool", "moan", "giggle")) to_chat(M, SPAN_WARNING(pick("You feel great!", "You don't have a care in the world.", "You couldn't care less about anything.", "You feel so relaxed..."))) + if(ishuman(M)) + M.emote(pick("twitch", "drool", "moan", "giggle")) M.adjustOxyLoss(0.01 * removed) if(M.losebreath < 5) M.losebreath++ if(prob(50)) - M.drowsyness = max(M.drowsyness, 3) + M.drowsiness = max(M.drowsiness, 3) /decl/reagent/toxin/krok name = "Krok Juice" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 00a5679cddd..c75d096cc57 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -14,12 +14,14 @@ /decl/reagent/kois/affect_ingest(var/mob/living/carbon/human/M, var/alien, var/removed, var/datum/reagents/holder) if(!ishuman(M)) return - var/obj/item/organ/internal/parasite/P = M.internal_organs_by_name["blackkois"] - if((alien == IS_VAURCA) || (istype(P) && P.stage >= 3)) - M.heal_organ_damage(1.2 * removed, 1.2 * removed) + var/is_vaurcalike = (alien == IS_VAURCA) + if(!is_vaurcalike) + var/obj/item/organ/internal/parasite/P = M.internal_organs_by_name["blackkois"] + if(istype(P) && P.stage >= 3) + is_vaurcalike = TRUE + if(is_vaurcalike) + M.heal_organ_damage(1.4 * removed, 1.6 * removed) M.adjustNutritionLoss(-nutriment_factor * removed) - M.add_chemical_effect(CE_BLOODRESTORE, 6 * removed) - else infect(M, alien, removed) @@ -27,6 +29,15 @@ if(ishuman(M)) infect(M, alien, removed) +/decl/reagent/kois/affect_chem_effect(mob/living/carbon/M, alien, removed, datum/reagents/holder) + var/is_vaurcalike = (alien == IS_VAURCA) + if(!is_vaurcalike) + var/obj/item/organ/internal/parasite/P = M.internal_organs_by_name["blackkois"] + if(istype(P) && P.stage >= 3) + is_vaurcalike = TRUE + if(is_vaurcalike) + M.add_chemical_effect(CE_BLOODRESTORE, 6 * removed) + /decl/reagent/kois/proc/infect(var/mob/living/carbon/human/H, var/alien, var/removed) var/obj/item/organ/internal/parasite/P = H.internal_organs_by_name["blackkois"] if((alien != IS_VAURCA) && !(istype(P) && P.stage >= 3)) @@ -110,7 +121,7 @@ if(injectable) affect_ingest(M, alien, removed, holder) -/decl/reagent/nutriment/affect_ingest(var/mob/living/carbon/human/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/reagent/nutriment/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) if(!istype(M)) return var/obj/item/organ/internal/parasite/P = M.internal_organs_by_name["blackkois"] @@ -227,6 +238,14 @@ taste_description = "cold, bitter slime" hydration_factor = 6 +/decl/reagent/nutriment/protein/seafood/cosmozoan + name = "Cosmozoan Protein" + taste_description = "cold, bitter slime" + hydration_factor = 8 + +/decl/reagent/nutriment/protein/seafood/cosmozoan/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + M.add_chemical_effect(CE_PAINKILLER, 10) + /decl/reagent/nutriment/protein/egg // Also bad for skrell. name = "Egg Yolk" color = "#FFFFAA" @@ -705,7 +724,7 @@ if (caffeine) M.add_up_to_chemical_effect(CE_SPEEDBOOST, caffeine) M.dizziness = max(0, M.dizziness + adj_dizzy) - M.drowsyness = max(0, M.drowsyness + adj_drowsy) + M.drowsiness = max(0, M.drowsiness + adj_drowsy) M.sleeping = max(0, M.sleeping + adj_sleepy) if(add_nutrition == TRUE) @@ -987,6 +1006,15 @@ glass_name = "glass of fermented fatshouters milk" glass_desc = "A tajaran made fermented dairy product, traditionally consumed by nomadic population of Adhomai." +/decl/reagent/drink/milk/adhomai/mutthir + name = "Mutthir" + description = "A beverage made with Fatshouters' yogurt mixed with Nm’shaan's sugar and sweet herbs." + taste_description = "sweet fatty yogurt" + + glass_icon_state = "mutthir_glass" + glass_name = "glass of mutthir" + glass_desc = "A beverage made with Fatshouters' yogurt mixed with Nm’shaan's sugar and sweet herbs." + /decl/reagent/drink/milk/beetle name = "Hakhma Milk" description = "A milky substance extracted from the brood sac of the viviparous Hakhma, often consumed by Offworlders and Scarabs." @@ -997,6 +1025,19 @@ glass_name = "glass of hakhma milk" glass_desc = "A milky substance extracted from the brood sac of the viviparous Hakhma, often consumed by Offworlders and Scarabs." +/decl/reagent/drink/milk/schlorrgo + name = "Schlorrgo Milk" + description = "An opaque white liquid produced by the mammary glands of the Schlorrgo." + taste_description = "fatty milk" + +/decl/reagent/drink/milk/schlorrgo/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + ..() + if(alien == IS_TAJARA && prob(5)) + var/mob/living/carbon/human/H = M + if(H.can_feel_pain()) + H.custom_pain("You feel a stinging pain in your abdomen!") + H.Stun(3) + /decl/reagent/drink/tea name = "Tea" description = "Tasty black tea, it has antioxidants, it's good for you!" @@ -1357,7 +1398,7 @@ if(alien != IS_DIONA) M.dizziness = max(0, M.dizziness - 5) - M.drowsyness = max(0, M.drowsyness - 3) + M.drowsiness = max(0, M.drowsiness - 3) M.sleeping = max(0, M.sleeping - 2) M.intoxication = max(0, (M.intoxication - (removed*0.25))) @@ -1726,7 +1767,7 @@ M.make_jittery(20) M.druggy = max(M.druggy, 30) M.dizziness += 5 - M.drowsyness = 0 + M.drowsiness = 0 /decl/reagent/drink/grenadine name = "Grenadine Syrup" @@ -2176,7 +2217,7 @@ ..() if(alien != IS_DIONA) M.dizziness = max(0, M.dizziness - 5) - M.drowsyness = max(0, M.drowsyness - 3) + M.drowsiness = max(0, M.drowsiness - 3) M.sleeping = max(0, M.sleeping - 2) if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) @@ -2300,7 +2341,7 @@ ..() if(alien == IS_DIONA) return - M.drowsyness = max(0, M.drowsyness - 7) + M.drowsiness = max(0, M.drowsiness - 7) M.make_jittery(5) if (M.bodytemperature > 310) @@ -4154,6 +4195,81 @@ glass_name = "glass of Rixulin Sundae" glass_desc = "A fizzing drink that looks like a really great time." +/decl/reagent/alcohol/khlibnyz + name = "Khlibnyz" + color = "#843113" + description = "A fermented beverage produced from Adhomian bread." + taste_description = "earthy and salty" + + strength = 5 + nutriment_factor = 1 + carbonated = TRUE + + glass_icon_state = "khlibnyz_glass" + glass_name = "glass of khlibnyz" + glass_desc = "A fermented beverage produced from Adhomian bread." + +/decl/reagent/alcohol/shyyrkirrtyr_wine + name = "Shyyr Kirr'tyr Wine" + color = "#D08457" + description = "Tajaran spirit infused with some eel-like Adhomian creature." + taste_description = "dry alcohol with a hint of meat" + + strength = 20 + nutriment_factor = 1 + + glass_icon_state = "shyrrkirrtyrwine_glass" + glass_name = "glass of shyyr kirr'tyr wine" + glass_desc = "Tajaran spirit infused with some eel-like Adhomian creature." + +/decl/reagent/alcohol/nmshaan_liquor + name = "Nm'shaan Liquor" + color = "#FE6B03" + description = "A strong Adhomian liquor reserved for special occasions." + taste_description = "sweet and silky alcohol" + + strength = 70 + + glass_icon_state = "nmshaanliquor_glass" + glass_name = "glass of nm'shaan liquor" + glass_desc = "A strong Adhomian liquor reserved for special occasions." + +/decl/reagent/alcohol/nmshaan_liquor/darmadhirbrew + name = "Darmadhir Brew" + color = "#E4A769" + description = "A rare and expensive brand of nm'shaan liquor." + taste_description = "expensive sweet and silky alcohol" + + strength = 75 + + glass_icon_state = "darmadhirbrew_glass" + glass_name = "glass of Darmadhir Brew" + description = "A rare and expensive brand of nm'shaan liquor." + +/decl/reagent/alcohol/treebark_firewater + name = "Tree-Bark Firewater" + color = "#ACAA1D" + description = "High-content alcohol distilled from Earthen-Root or Blizzard Ears." + taste_description = "earthy and bitter alcohol" + + strength = 65 + + glass_icon_state = "treebarkfirewater_glass" + glass_name = "glass of tree-bark firewater" + glass_desc = "High-content alcohol distilled from Earthen-Root or Blizzard Ears." + +/decl/reagent/alcohol/veterans_choice + name = "Veteran's Choice" + color = "#7C7231" + description = "A cocktail consisting of Messa's Mead and gunpowder." + taste_description = "honey and salty" + + strength = 25 + + glass_icon_state = "veteranschoice_glass" + glass_name = "glass of veteran's choice" + glass_desc = "A cocktail consisting of Messa's Mead and gunpowder." + // Butanol-based alcoholic drinks //===================================== //These are mainly for unathi, and have very little (but still some) effect on other species @@ -4426,7 +4542,7 @@ if(alien != IS_DIONA) M.make_jittery(20) M.dizziness += 5 - M.drowsyness = 0 + M.drowsiness = 0 /decl/reagent/drink/zorasoda/venomgrass name = "Zo'ra Soda Sour Venom Grass" @@ -4509,7 +4625,7 @@ if(alien != IS_DIONA) M.druggy = max(M.druggy, 30) M.dizziness += 5 - M.drowsyness = 0 + M.drowsiness = 0 /decl/reagent/drink/hrozamal_soda name = "Hro'zamal Soda" @@ -4603,3 +4719,14 @@ condiment_desc = "A vegetarian friendly way to add a little extra pizazz to any dish." condiment_icon_state = "dionaepowder" condiment_center_of_mass = list("x"=16, "y"=10) + +/decl/reagent/drink/midynhr_water + name = "Midynhr Water" + description = "A soft drink made from honey and tree syrup." + color = "#95D44C" + taste_description = "creamy sweetness" + + glass_icon_state = "midynhrwater_glass" + glass_name = "glass of midynhr water" + glass_desc = "A soft drink made from honey and tree syrup." + glass_center_of_mass = list("x"=15, "y"=9) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 1f8b1acff62..8acdffd9e65 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -133,7 +133,7 @@ return if(remove_generic) - M.drowsyness = max(0, M.drowsyness - 6 * removed) + M.drowsiness = max(0, M.drowsiness - 6 * removed) M.hallucination -= (2 * removed) if(check_min_dose(M, 0.5)) M.add_up_to_chemical_effect(CE_ANTITOXIN, 1) @@ -392,7 +392,7 @@ metabolism_min = REM * 0.0125 /decl/reagent/synaptizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) - M.drowsyness = max(M.drowsyness - 5, 0) + M.drowsiness = max(M.drowsiness - 5, 0) if(REAGENT_VOLUME(holder, type) < 10) // Will prevent synaptizine interrupting a seizure caused by its own overdose. M.AdjustParalysis(-1) M.AdjustStunned(-1) @@ -602,7 +602,7 @@ //These status effects will now take a little while for the dose to build up and remove them M.dizziness = max(0, M.dizziness - DP) - M.drowsyness = max(0, M.drowsyness - DP) + M.drowsiness = max(0, M.drowsiness - DP) M.stuttering = max(0, M.stuttering - DP) M.confused = max(0, M.confused - DP) @@ -723,6 +723,29 @@ M.dizziness = max(150, M.dizziness) M.make_dizzy(5) +/decl/reagent/steramycin + name = "Steramycin" + description = "A preventative antibiotic that will stop small infections from growing, but only if administered early. Has no effect on internal organs, wounds, or if the infection has grown beyond its early stages." + reagent_state = LIQUID + color = "#81b38b" + od_minimum_dose = 1 + overdose = 15 + scannable = TRUE + taste_description = "bleach" + fallback_specific_heat = 0.605 + +/decl/reagent/steramycin/affect_blood(var/mob/living/carbon/human/M, var/alien, var/removed, var/datum/reagents/holder) + if(check_min_dose(M, 1)) + for(var/obj/item/organ/external/E in M.organs) + if(E.germ_level >= INFECTION_LEVEL_ONE || !E.germ_level) //No effect if it's not infected or the infection has progressed. + continue + E.germ_level = max(E.germ_level - 4, 0) + +/decl/reagent/steramycin/overdose(var/mob/living/carbon/M, var/alien, var/datum/reagents/holder) + M.dizziness = max(150, M.dizziness) + M.make_dizzy(5) + M.adjustToxLoss(1) //Antibodies start fighting your body + /decl/reagent/asinodryl name = "Asinodryl" description = "Asinodryl is an anti-emetic medication which acts by preventing the two regions in the brain responsible for vomiting from controlling the act of emesis." @@ -765,7 +788,7 @@ if(prob(7)) M.add_chemical_effect(CE_NEUROTOXIC, 3 * removed) if(prob(50)) - M.drowsyness = max(M.drowsyness, 3) + M.drowsiness = max(M.drowsiness, 3) /decl/reagent/cetahydramine name = "Cetahydramine" @@ -783,7 +806,7 @@ /decl/reagent/cetahydramine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_NOITCH, M.chem_doses[type] * 2) // 5 units of cetahydramine will counter 10 units of dermaline/butazoline itching. if(prob(M.chem_doses[type]/2)) - M.drowsyness += 2 + M.drowsiness += 2 /decl/reagent/sterilizine name = "Sterilizine" @@ -900,10 +923,6 @@ messagedelay = MEDICATION_MESSAGE_DELAY * 0.75 goodmessage = list("You feel good.","You feel relaxed.","You feel alert and focused.") -/decl/reagent/mental/nicotine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) - . = ..() - M.add_chemical_effect(CE_PAINKILLER, 5) - /decl/reagent/mental/nicotine/overdose(var/mob/living/carbon/M, var/alien, var/removed, var/scale, var/datum/reagents/holder) . = ..() M.adjustOxyLoss(10 * removed * scale) @@ -1002,7 +1021,7 @@ M.eye_blurry = max(M.eye_blurry, 30) if(REAGENT_VOLUME(M.reagents, /decl/reagent/oxycomorphine)) M.ear_deaf = 20 - M.drowsyness = max(M.drowsyness, 10) + M.drowsiness = max(M.drowsiness, 10) M.make_dizzy(15) if(prob(3)) to_chat(M, SPAN_GOOD(pick("You lose all sense of connection to the real world.", "Everything is so tranquil.", "You feel dettached from reality.", "Your feel disconnected from your body.", "You are aware of nothing but your conscious thoughts."))) @@ -1058,7 +1077,7 @@ /decl/reagent/mental/vaam/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) . = ..() M.add_chemical_effect(CE_PAINKILLER, 5) - M.drowsyness = 0 + M.drowsiness = 0 /decl/reagent/mental/vaam/overdose(var/mob/living/carbon/human/M, var/alien, var/removed, var/scale, var/datum/reagents/holder) . = ..() @@ -1279,8 +1298,8 @@ var/mob/living/carbon/human/H = M for (var/A in H.organs) var/obj/item/organ/external/E = A - if(E.status & ORGAN_TENDON_CUT) - E.status &= ~ORGAN_TENDON_CUT + if((E.tendon_status() & TENDON_CUT) && E.tendon.can_recover()) + E.tendon.rejuvenate() return 1 if(E.status & ORGAN_ARTERY_CUT) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 30e5b866e76..612f2b9341e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -121,7 +121,7 @@ M.SetParalysis(0) M.silent = 0 M.dizziness = 0 - M.drowsyness = 0 + M.drowsiness = 0 M.stuttering = 0 M.confused = 0 M.sleeping = 0 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 7418de07c1e..ffc3caa9670 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -471,17 +471,17 @@ M.add_chemical_effect(CE_PULSE, -2) var/dose = M.chem_doses[type] if(dose < 2) - if(dose == metabolism * 2 || prob(5)) + if(ishuman(M) && (dose == metabolism * 2 || prob(5))) M.emote("yawn") else if(dose < 3.5) M.eye_blurry = max(M.eye_blurry, 10) else if(dose < 7) if(prob(50)) M.Weaken(2) - M.drowsyness = max(M.drowsyness, 20) + M.drowsiness = max(M.drowsiness, 20) else M.sleeping = max(M.sleeping, 20) - M.drowsyness = max(M.drowsyness, 60) + M.drowsiness = max(M.drowsiness, 60) /decl/reagent/polysomnine name = "Polysomnine" @@ -501,7 +501,7 @@ var/dose = M.chem_doses[type] if(dose == metabolism) M.confused += 2 - M.drowsyness += 2 + M.drowsiness += 2 else if(dose < 2) M.Weaken(30) M.eye_blurry = max(M.eye_blurry, 10) @@ -619,7 +619,7 @@ update_canmove() /mob/living/carbon/human/proc/berserk_process() - drowsyness = max(drowsyness - 5, 0) + drowsiness = max(drowsiness - 5, 0) AdjustParalysis(-1) AdjustStunned(-1) AdjustWeakened(-1) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 17b73f64f30..4b1344b9bfa 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -382,6 +382,13 @@ required_reagents = list(/decl/reagent/cryptobiolin = 1, /decl/reagent/dylovene = 1) result_amount = 2 +/datum/chemical_reaction/steramycin + name = "Steramycin" + id = "steramycin" + result = /decl/reagent/steramycin + required_reagents = list(/decl/reagent/thetamycin = 2, /decl/reagent/sterilizine = 1, /decl/reagent/radium = 1) + result_amount = 2 + /datum/chemical_reaction/cetahydramine name = "Cetahydramine" id = "cetahydramine" @@ -1114,7 +1121,6 @@ /mob/living/simple_animal/hostile/syndicate/ranged/space, /mob/living/simple_animal/hostile/alien/queen/large, /mob/living/simple_animal/hostile/faithless, - /mob/living/simple_animal/hostile/faithless/wizard, /mob/living/simple_animal/hostile/retaliate, /mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/alien, @@ -3483,3 +3489,26 @@ result = /decl/reagent/alcohol/fisfirebomb required_reagents = list(/decl/reagent/alcohol/ale = 1, /decl/reagent/alcohol/fiscream = 1) result_amount = 2 + +/datum/chemical_reaction/drink/veterans_choice + name = "Veteran's Choice" + id = "veterans_choice" + result = /decl/reagent/alcohol/veterans_choice + required_reagents = list(/decl/reagent/alcohol/messa_mead = 1, /decl/reagent/gunpowder = 1) + result_amount = 2 + +/datum/chemical_reaction/drink/mutthir + name = "Mutthir" + id = "mutthir" + result = /decl/reagent/drink/milk/adhomai/mutthir + required_reagents = list(/decl/reagent/drink/milk/adhomai = 1, /decl/reagent/sugar = 1) + catalysts = list(/decl/reagent/enzyme = 5) + result_amount = 2 + +/datum/chemical_reaction/drink/treebark_firewater + name = "Tree-Bark Firewater" + id = "treebark_firewater" + result = /decl/reagent/alcohol/treebark_firewater + required_reagents = list(/decl/reagent/drink/earthenrootjuice = 1, /decl/reagent/sugar = 1, /decl/reagent/woodpulp = 1) + catalysts = list(/decl/reagent/enzyme = 5) + result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index 36884de64ae..382b27339f7 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -53,6 +53,7 @@ clean_kois spawn_reagent = /decl/reagent/kois/clean cola spawn_reagent = /decl/reagent/drink/space_cola dr_gibb spawn_reagent = /decl/reagent/drink/dr_gibb + grenadine spawn_reagent = /decl/reagent/drink/grenadine ice spawn_reagent = /decl/reagent/drink/ice icetea spawn_reagent = /decl/reagent/drink/icetea lemon_lime spawn_reagent = /decl/reagent/drink/lemon_lime diff --git a/code/modules/reagents/dispenser/cartridge_spawn.dm b/code/modules/reagents/dispenser/cartridge_spawn.dm index 34788d0d837..f6a922af54d 100644 --- a/code/modules/reagents/dispenser/cartridge_spawn.dm +++ b/code/modules/reagents/dispenser/cartridge_spawn.dm @@ -1,7 +1,27 @@ -/client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large"), reagent in decls_repository.get_decls_of_subtype(/decl/reagent/)) +/client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large")) set name = "Spawn Chemical Dispenser Cartridge" set category = "Admin" + var/rtype = input("Enter full or partial reagent path.", "Reagent Search") as text + if(!rtype) + return + + var/list/matches + for(var/path in decls_repository.get_decls_of_subtype(/decl/reagent/)) + if(findtext("[path]", rtype)) + LAZYADD(matches, path) + + var/reagent + if(!LAZYLEN(matches)) + return + + if(LAZYLEN(matches) == 1) + reagent = matches[1] + else + reagent = input("Select a reagent type", "Pick reagent", matches[1]) as null|anything in matches + if(!reagent) + return + var/obj/item/reagent_containers/chem_disp_cartridge/C switch(size) if("small") C = new /obj/item/reagent_containers/chem_disp_cartridge/small(usr.loc) @@ -10,4 +30,4 @@ C.reagents.add_reagent(reagent, C.volume) var/decl/reagent/R = decls_repository.get_decl(reagent) C.setLabel(R.name) - log_admin("[key_name(usr)] spawned a [size] reagent container containing [reagent] at ([usr.x],[usr.y],[usr.z])",admin_key=key_name(usr)) + log_admin("[key_name(usr)] spawned a [size] reagent container containing [reagent] at ([usr.x],[usr.y],[usr.z])",admin_key=key_name(usr)) \ No newline at end of file diff --git a/code/modules/reagents/dispenser/coffeebeans.dm b/code/modules/reagents/dispenser/coffeebeans.dm index 23047ab256a..8b0c5e2af3d 100644 --- a/code/modules/reagents/dispenser/coffeebeans.dm +++ b/code/modules/reagents/dispenser/coffeebeans.dm @@ -7,7 +7,7 @@ w_class = ITEMSIZE_NORMAL - volume = CARTRIDGE_VOLUME_SMALL + volume = CARTRIDGE_VOLUME_LARGE amount_per_transfer_from_this = 20 possible_transfer_amounts = list(20, 40) unacidable = 1 diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index 11103ab0588..25890bbab36 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -14,6 +14,8 @@ var/accept_drinking = 0 var/amount = 30 + var/list/forbidden_containers = list(/obj/item/reagent_containers/glass/bucket) //For containers we don't want people to shove into the chem machine. Like big-ass buckets. + var/list/drink_accepted = list(/obj/item/reagent_containers/food/drinks, /obj/item/reagent_containers/food/condiment) //Allow these cans/glasses/condiment bottles but forbid ACTUAL food. use_power = 1 idle_power_usage = 100 @@ -90,14 +92,18 @@ to_chat(user, SPAN_NOTICE("You remove [C] from [src].")) C.forceMove(loc) - else if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food)) + else if(istype(W, /obj/item/reagent_containers/glass) || is_type_in_list(W, drink_accepted)) if(container) to_chat(user, SPAN_WARNING("There is already \a [container] on [src]!")) return var/obj/item/reagent_containers/RC = W - if(!accept_drinking && istype(RC,/obj/item/reagent_containers/food)) + if(is_type_in_list(RC, forbidden_containers)) + to_chat(user, SPAN_WARNING("There's no way to fit [RC] into \the [src]!")) + return + + if(!accept_drinking && is_type_in_list(RC, drink_accepted)) to_chat(user, SPAN_WARNING("This machine only accepts beakers!")) return diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm index 008380da7e1..798f0dd1e28 100644 --- a/code/modules/reagents/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/dispenser/dispenser_presets.dm @@ -131,7 +131,9 @@ /obj/item/reagent_containers/chem_disp_cartridge/vermouth, /obj/item/reagent_containers/chem_disp_cartridge/cognac, /obj/item/reagent_containers/chem_disp_cartridge/ale, - /obj/item/reagent_containers/chem_disp_cartridge/mead + /obj/item/reagent_containers/chem_disp_cartridge/mead, + /obj/item/reagent_containers/chem_disp_cartridge/grenadine, + /obj/item/reagent_containers/chem_disp_cartridge/cream ) /obj/machinery/chemical_dispenser/coffeemaster diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index bbd277e29eb..0584bc99807 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -22,7 +22,7 @@ volume = 200 amount_per_transfer_from_this = 0.2 - possible_transfer_amounts = list(0.2, 1, 2) + possible_transfer_amounts = list(0.2, 1, 2, 3, 4) flags = OPENCONTAINER var/datum/weakref/attached_mob diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 128c77c30a1..bf61cccaa35 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -56,40 +56,32 @@ reagent_volumes[T] = min(reagent_volumes[T] + 5, volume) return 1 -/obj/item/reagent_containers/hypospray/borghypo/afterattack(var/mob/living/M, var/mob/user, proximity) - - if(!proximity) +/obj/item/reagent_containers/hypospray/borghypo/inject(var/mob/living/M, var/mob/user, proximity) + if(!proximity || !istype(M)) return - if(!istype(M)) - return ..() - if(!reagent_volumes[reagent_ids[mode]]) to_chat(user,"The injector is empty.") return - var/mob/living/carbon/human/H = M - if(istype(H)) - var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) - if(!affected) - to_chat(user,"\The [H] is missing that limb!") - return - else if(affected.status & ORGAN_ROBOT) - to_chat(user,"You cannot inject a robotic limb.") - return + user.visible_message("[user] injects [M] with their hypospray!", "You inject [M] with your hypospray!", "You hear a hissing noise.") + to_chat(M,"You feel a tiny prick!") - if (M.can_inject(user, 1)) - user.visible_message("[user] injects [M] with their hypospray!", "You inject [M] with your hypospray!", "You hear a hissing noise.") - to_chat(M,"You feel a tiny prick!") - - if(M.reagents) - var/t = min(amount_per_transfer_from_this, reagent_volumes[reagent_ids[mode]]) - M.reagents.add_reagent(reagent_ids[mode], t) - reagent_volumes[reagent_ids[mode]] -= t - admin_inject_log(user, M, src, reagent_ids[mode], reagents.get_temperature(), t) - to_chat(user,"[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining.") + if(M.reagents) + var/t = min(amount_per_transfer_from_this, reagent_volumes[reagent_ids[mode]]) + M.reagents.add_reagent(reagent_ids[mode], t) + reagent_volumes[reagent_ids[mode]] -= t + admin_inject_log(user, M, src, reagent_ids[mode], reagents.get_temperature(), t) + to_chat(user,"[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining.") return +/obj/item/reagent_containers/hypospray/borghypo/afterattack(atom/target, mob/user, proximity) + if (!proximity) + return + + if (!isliving(target)) + return ..() + /obj/item/reagent_containers/hypospray/borghypo/attack_self(mob/user as mob) //Change the mode var/t = "" for(var/i = 1 to reagent_ids.len) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 94747d16143..7db364b3104 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -367,7 +367,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I /obj/item/reagent_containers/food/drinks/carton name = "carton" desc = "An abstract way to organize bottles that are really cartons. Finally!" - item_state = "carton" + icon_state = "carton" volume = 100 center_of_mass = list("x"=16, "y"=6) drop_sound = 'sound/items/drop/cardboardbox.ogg' @@ -422,6 +422,22 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I reagents_to_add = list(/decl/reagent/drink/applejuice = 100) +/obj/item/reagent_containers/food/drinks/carton/fatshouters + name = "fatshouters milk carton" + desc = "Fatty fatshouters milk in a carton." + + reagents_to_add = list(/decl/reagent/drink/milk/adhomai = 100) + +/obj/item/reagent_containers/food/drinks/carton/mutthir + name = "mutthir carton" + icon_state = "mutthir" + desc = "A beverage made with Fatshouters' yogurt mixed with Nm’shaan's sugar and sweet herbs." + desc_fluff = "A beverage made with Fatshouters' yogurt mixed with Nm’shaan's sugar and sweet herbs. Mutthir is usually consumed during meals by both nobles and commoners. \ + The drink can also be smoked for flavor. Mutthir is believed to have originated from the worldwide appreciated Fatshouters' fermented milk. Rock Nomads living in the Nomadic Host \ + were quick to adopt the drink to their diet." + + reagents_to_add = list(/decl/reagent/drink/milk/adhomai/mutthir = 100) + //////////////////////////drinkingglass and shaker// //Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink // itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass @@ -454,6 +470,15 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I volume = 120 center_of_mass = list("x"=17, "y"=7) +/obj/item/reagent_containers/food/drinks/pitcher + name = "pitcher" + desc = "Everyone's best friend in the morning." + icon_state = "pitcher" + unacidable = TRUE + amount_per_transfer_from_this = 10 + volume = 120 + possible_transfer_amounts = list(5,10,15,30,60,120) + /obj/item/reagent_containers/food/drinks/flask name = "captain's flask" desc = "A metal flask belonging to the captain" diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 92f2b8c67f9..35ad09a6944 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -216,9 +216,9 @@ desc = "Pour one out for Al'mari. His gun was on stun, bless his heart." icon_state = "victorygin" center_of_mass = list("x"=16, "y"=4) - desc_fluff = "Adhomian beverages are commonly made with fermented grains or vegetables, if alcoholic, or juices mixed with sugar or honey. Victory gin is the most \ - widespread alcoholic drink in Adhomai, the result of the fermentation of honey extracted from Messa's tears, but its production and consumption is slowly declining due to the \ - People's Republic situation in the current conflict." + desc_fluff = "Considered the official drink of the People's Republic of Adhomai, Victory Gin was created to celebrate the end of the revolution. It is commonly found in NanoTrasen's \ + stations, due to a contract that allows the government to supply the corporation, and in the Tajaran communities of Tau Ceti. The destruction of Victory Gin's bottles and reserves \ + was widespread when Republican positions and cities were taken by the opposition as the drink is deemed by many as a symbol of the Hadiist regime." reagents_to_add = list(/decl/reagent/alcohol/victorygin = 100) /obj/item/reagent_containers/food/drinks/bottle/whiskey @@ -454,8 +454,8 @@ //Small bottles /obj/item/reagent_containers/food/drinks/bottle/small - name = "empty small bottle" - desc = "A sad empty bottle." + name = "small bottle" + desc = "A small bottle." icon_state = "beer" volume = 50 smash_duration = 1 @@ -552,9 +552,9 @@ desc = "A bottle of Messa's mead. Bottled somewhere in the icy world of Adhomai." icon_state = "messa_mead" center_of_mass = list("x" = 16,"y" = 5) - desc_fluff = "Adhomian beverages are commonly made with fermented grains or vegetables, if alcoholic, or juices mixed with sugar or honey. Victory gin is the most \ - widespread alcoholic drink in Adhomai, the result of the fermentation of honey extracted from Messa's tears, but its production and consumption is slowly declining due to the \ - People's Republic situation in the current conflict. Messa's mead is also another more traditional alternative, made with honey and fermented Earthen-Root juice." + desc_fluff = "A fermented alcoholic drink made from earthen-root juice and Messa's tears leaves. It has a relatively low alcohol content and characteristic honey flavor. \ + Messa's Mead is one of the most popular alcoholic drinks in Adhomai; it is consumed both during celebrations and daily meals. Any proper Adhomian bar will have at least a keg or \ + some bottles of the mead." reagents_to_add = list(/decl/reagent/alcohol/messa_mead = 100) /obj/item/reagent_containers/food/drinks/bottle/sake @@ -589,6 +589,75 @@ center_of_mass = list("x"=16, "y"=5) reagents_to_add = list(/decl/reagent/alcohol/makgeolli = 100) +/obj/item/reagent_containers/food/drinks/bottle/small/khlibnyz + name = "khlibnyz" + desc = "A bottle traditionally made khlibnyz. Likely prepared in some Hadiist communal farm." + icon_state = "khlibnyz" + center_of_mass = list("x" = 16,"y" = 5) + desc_fluff = "A fermented beverage produced from Adhomian bread. Herbs, fruits, and tree sap can be added for flavoring. It is considered a non-alcoholic drink by Adhomian standards \ + because of its very low alcohol content. Khlibnyz was mainly consumed by peasants during pre-contact times and is still very popular with the Hadiist rural population. Communal farms \ + will brew their own Khlibnyz and sell it to the government for distribution." + reagents_to_add = list(/decl/reagent/alcohol/khlibnyz = 30) + +/obj/item/reagent_containers/food/drinks/bottle/shyyrkirrtyr_wine + name = "shyyr kirr'tyr wine" + desc = "Tajaran spirit infused with some eel-like Adhomian creature. The animal floating in the liquid appears to be well preserved." + icon_state = "shyyrkirrtyrwine" + center_of_mass = list("x" = 16,"y" = 5) + desc_fluff = "An alcoholic made by infusing a whole Shyyr Kirr'tyr in Dirt Berries or Earthen-Root spirit. The Water Snake Devil's poison is neutralized by ethanol, making the \ + beverage safe to consume. The wine can be deadly if improperly prepared. The drink is native to the Southeast Harr'masir wetlands, where it is as common as Messa's Mead. Other \ + Tajara consider the wine to be exotic or outright disgusting. The Shyyr Kirr'tyr is usually eaten after the beverage is imbibed." + reagents_to_add = list(/decl/reagent/alcohol/shyyrkirrtyr_wine = 100) + +/obj/item/reagent_containers/food/drinks/bottle/nmshaan_liquor + name = "nm'shaan liquor" + desc = "A strong Adhomian liquor reserved for special occasions. A label on the bottle recommends diluting it with icy water before drinking." + icon_state = "nmshaanliquor" + center_of_mass = list("x" = 16,"y" = 5) + desc_fluff = "An alcoholic drink manufactured from the fruit of the Nm'shaan plant. It usually has a high level of alcohol by volume. Nm'shaan liquor was once reserved for the \ + consumption of the nobility; even today it is considered a decadent drink reserved for fancy occasions." + reagents_to_add = list(/decl/reagent/alcohol/nmshaan_liquor = 100) + +/obj/item/reagent_containers/food/drinks/bottle/small/midynhr_water + name = "midynhr water" + desc = "A soft drink made from honey and tree syrup. The label claims it is good as the tap version." + icon_state = "midynhrwater" + center_of_mass = list("x" = 16,"y" = 5) + desc_fluff = "A soft drink based on Yve’kha's honey and tree syrups. The drink has a creamy consistency and is served cold from the tap of traditional soda fountains. Native to \ + Das'nrra, the beverage is now widespread in the Al'mariist territories. Bottled versions exist, but they are considered to be inferior to what is served in bars and restaurants." + reagents_to_add = list(/decl/reagent/drink/midynhr_water = 30) + +/obj/item/reagent_containers/food/drinks/bottle/veterans_choice + name = "veteran's choice" + desc = "A home-made bottle of veteran's choice. Shake it carefully before serving." + icon_state = "veteranschoice" + center_of_mass = list("x" = 16,"y" = 5) + desc_fluff = "A cocktail consisting of Messa's Mead and gunpowder. Supposedly originated among the ranks of the Liberation Army as an attempt to spice up the mead, the cocktail \ + became a hit - not because of its taste - with the young Tajara. Drinking the Veteran's Choice is seen as a way to display one's bravado. ALA soldiers are known to consume the cocktail before going into battle believing that it brings luck." + reagents_to_add = list(/decl/reagent/alcohol/veterans_choice = 100) + +/obj/item/reagent_containers/food/drinks/bottle/treebark_firewater + name = "tree-bark firewater" + desc = "A jug full of adhomian moonshine. The bottle states dubiously that it is a handmade recipe." + icon_state = "treebarkfirewater" + center_of_mass = list("x" = 16,"y" = 5) + desc_fluff = "High-content alcohol distilled from Earthen-Root or Blizzard Ears. Tree bark is commonly added to the drink to give it a distinct flavor. The firewater's origins can \ + be traced back to the pre-contact times where impoverished peasants would make alcohol out of anything they could find. Homebrewing remains a tradition in the New Kingdom's rural \ + parts. These traditional spirits are also manufactured by large breweries and sold to the urban population as handcrafted." + reagents_to_add = list(/decl/reagent/alcohol/treebark_firewater = 100) + drink_flags = NO_EMPTY_ICON + +/obj/item/reagent_containers/food/drinks/bottle/darmadhir_brew + name = "Darmadhir Brew" + desc = "A fancy bottle contained sought-after Darmadhir's nm'shaan liquor. It is more of a collection piece than a beverage." + icon_state = "darmadhirbrew" + center_of_mass = list("x" = 16,"y" = 5) + desc_fluff = "A famous variation of the Nm'shaan Liquor; it is described as one of Adhomai's finest spirits. It is produced solely by a small family-owned brewery in Miran'mir. Its \ + recipe is a secret passed down through the generations of the Darmadhir household since immemorial times. The only living member of the family, Hazyr Darmadhir, is a 68 years old \ + Tajara. His sole heir and son died in the Second Revolution after being drafted to fight for the royal army. Alcohol collectors stipulate that the brew's price will skyrocket after Hazyr's death." + reagents_to_add = list(/decl/reagent/alcohol/nmshaan_liquor/darmadhirbrew = 100) + drink_flags = NO_EMPTY_ICON + // Butanol-based alcoholic drinks //===================================== //These are mainly for unathi, and have very little (but still some) effect on other species diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index 7d014a7a29b..1cf10f193da 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -14,7 +14,8 @@ var/list/lunchables_lunches_ = list( /obj/item/reagent_containers/food/snacks/koiswaffles, /obj/item/reagent_containers/food/snacks/funnelcake, /obj/item/reagent_containers/food/snacks/hotdog, - /obj/item/reagent_containers/food/snacks/tajaran_bread + /obj/item/reagent_containers/food/snacks/tajaran_bread, + /obj/item/reagent_containers/food/snacks/soup/earthenroot ) var/list/lunchables_snacks_ = list( @@ -49,7 +50,9 @@ var/list/lunchables_snacks_ = list( /obj/item/reagent_containers/food/snacks/meatsnack, /obj/item/reagent_containers/food/snacks/maps, /obj/item/reagent_containers/food/snacks/nathisnack, - /obj/item/reagent_containers/food/snacks/adhomian_can + /obj/item/reagent_containers/food/snacks/adhomian_can, + /obj/item/reagent_containers/food/snacks/adhomian_sausage, + /obj/item/reagent_containers/food/snacks/chocolatebar ) var/list/lunchables_drinks_ = list( @@ -66,7 +69,17 @@ var/list/lunchables_drinks_ = list( /obj/item/reagent_containers/food/drinks/cans/sodawater, /obj/item/reagent_containers/food/drinks/cans/adhomai_milk, /obj/item/reagent_containers/food/drinks/cans/beetle_milk, - /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda + /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda, + /obj/item/reagent_containers/food/drinks/bottle/small/midynhr_water, + /obj/item/reagent_containers/food/drinks/bottle/small/khlibnyz +) + +var/list/lunchables_utensil_ = list( + /obj/item/material/kitchen/utensil/fork/chopsticks, + /obj/item/material/kitchen/utensil/fork/chopsticks/cheap, + /obj/item/material/kitchen/utensil/fork/plastic, + /obj/item/material/kitchen/utensil/spoon/plastic, + /obj/item/material/kitchen/utensil/knife/plastic ) // This default list is a bit different, it contains items we don't want @@ -94,7 +107,8 @@ var/list/lunchables_alcohol_reagents_ = list( /decl/reagent/alcohol/neurotoxin, /decl/reagent/alcohol/pwine, /decl/reagent/alcohol/threemileisland, - /decl/reagent/alcohol/toxins_special + /decl/reagent/alcohol/toxins_special, + /decl/reagent/alcohol/nmshaan_liquor/darmadhirbrew ) /proc/lunchables_lunches() @@ -112,6 +126,11 @@ var/list/lunchables_alcohol_reagents_ = list( lunchables_drinks_ = init_lunchable_list(lunchables_drinks_) return lunchables_drinks_ +/proc/lunchables_utensil() + if(!(lunchables_utensil_[lunchables_utensil_[1]])) + lunchables_utensil_ = init_lunchable_list(lunchables_utensil_) + return lunchables_utensil_ + /proc/lunchables_drink_reagents() if(!(lunchables_drink_reagents_[lunchables_drink_reagents_[1]])) lunchables_drink_reagents_ = init_lunchable_reagent_list(lunchables_drink_reagents_, /decl/reagent/drink) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index e4220009c14..8b0ee3cd0c9 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -49,6 +49,11 @@ if(!istype(target)) return + if(isliving(target)) + var/mob/living/L = target + if(L.isSynthetic() && !isipc(L)) //Catches bots, drones, borgs, etc. IPCs are handled below at the human level + return FALSE + if (isanimal(target)) var/mob/living/simple_animal/SA = target if(!(reagents && SA.reagents)) @@ -2214,18 +2219,14 @@ reagents_to_add = list(/decl/reagent/nutriment/protein = 5) /obj/item/reagent_containers/food/snacks/soup/beet - name = "beet soup" - desc = "Wait, how do you spell it again..?" + name = "borscht" + desc = "A hearty beet soup that's hard to spell." icon_state = "beetsoup" filling_color = "#FAC9FF" reagents_to_add = list(/decl/reagent/nutriment = 8) reagent_data = list(/decl/reagent/nutriment = list("tomato" = 4, "beet" = 4)) bitesize = 2 -/obj/item/reagent_containers/food/snacks/soup/beet/Initialize() - . = ..() - name = pick(list("borsch","bortsch","borstch","borsh","borshch","borscht")) - /obj/item/reagent_containers/food/snacks/salad/tossedsalad name = "tossed salad" desc = "A proper salad, basic and simple, with little bits of carrot, tomato and apple intermingled. Vegan!" @@ -4304,11 +4305,11 @@ /obj/item/reagent_containers/food/snacks/breakfast_wrap name = "breakfast wrap" - desc = "Bacon, eggs, cheese, and tortilla grilled to perfection." + desc = "Bacon, eggs, cheese, and tortilla spiced and grilled to perfection." icon_state = "breakfast_wrap" bitesize = 4 center_of_mass = list("x"=16, "y"=16) - reagents_to_add = list(/decl/reagent/nutriment = 6, /decl/reagent/nutriment/protein = 9, /decl/reagent/capsaicin/condensed = 20) //what could possibly go wrong + reagents_to_add = list(/decl/reagent/nutriment = 6, /decl/reagent/nutriment/protein = 9, /decl/reagent/capsaicin = 10) //It's kind of spicy reagent_data = list(/decl/reagent/nutriment = list("tortilla" = 6)) filling_color = "#FFF454" @@ -4707,6 +4708,134 @@ bitesize = 4 reagents_to_add = list(/decl/reagent/nutriment/protein/seafood = 20, /decl/reagent/ammonia = 10) +/obj/item/reagent_containers/food/snacks/cone_cake + name = "cone cake" + desc = "A spongy cone-shaped cake covered in sugar." + icon_state = "conecake" + bitesize = 2 + reagents_to_add = list(/decl/reagent/nutriment = 15) + reagent_data = list(/decl/reagent/nutriment = list("Incredible sweetness" = 8, "Cake" = 7)) + desc_fluff = "A spongy, sugar-coated cake that's baked on a spit shaped like a cone, giving it a signature look. Often sold alongside Azvah due to similar preparation methods, the difference between them being the unique shape, the crisp, flaky outside, and the tooth-aching sweetness of the dish that turns some foreigners away." + filling_color = "#BD8939" + +/obj/item/reagent_containers/food/snacks/fruit_rikazu + name = "fruit rikazu" + desc = "A small, crispy Adhomian pie meant for one person filled with fruits." + icon_state = "rikazu_fruit" + bitesize = 2 + reagents_to_add = list(/decl/reagent/nutriment = 8) + reagent_data = list(/decl/reagent/nutriment = list("crispy dough" = 4, "sweet fruit" = 4)) + desc_fluff = "Small pies, often hand-sized, usually made by folding dough overstuffing of fruit and cream cheese; commonly served hot. The simple preparation makes it a fast favorite, and the versatility of the ingredients has gained its favor with Tajara of all creeds. Different variations of Rikazu pop up all over Adhomai, some filled with meats, or vegetables, or even imported ingredients, like chocolate filling." + filling_color = "#BD8939" + +/obj/item/reagent_containers/food/snacks/meat_rikazu + name = "meat rikazu" + desc = "A small, crispy Adhomian pie meant for one person filled with meat." + icon_state = "rikazu_meat" + bitesize = 2 + reagents_to_add = list(/decl/reagent/nutriment = 4, /decl/reagent/nutriment/protein = 4) + reagent_data = list(/decl/reagent/nutriment = list("crispy dough" = 4), /decl/reagent/nutriment/protein = list("savory meat" = 4)) + desc_fluff = "Small pies, often hand-sized, usually made by folding dough overstuffing of fruit and cream cheese; commonly served hot. The simple preparation makes it a fast favorite, and the versatility of the ingredients has gained its favor with Tajara of all creeds. Different variations of Rikazu pop up all over Adhomai, some filled with meats, or vegetables, or even imported ingredients, like chocolate filling." + filling_color = "#BD8939" + +/obj/item/reagent_containers/food/snacks/vegetable_rikazu + name = "vegetable rikazu" + desc = "A small, crispy Adhomian pie meant for one person filled with vegetables." + icon_state = "rikazu_veg" + bitesize = 2 + reagents_to_add = list(/decl/reagent/nutriment = 8) + reagent_data = list(/decl/reagent/nutriment = list("crispy dough" = 4, "crunchy vegetables" = 4)) + desc_fluff = "Small pies, often hand-sized, usually made by folding dough overstuffing of fruit and cream cheese; commonly served hot. The simple preparation makes it a fast favorite, and the versatility of the ingredients has gained its favor with Tajara of all creeds. Different variations of Rikazu pop up all over Adhomai, some filled with meats, or vegetables, or even imported ingredients, like chocolate filling." + filling_color = "#BD8939" + +/obj/item/reagent_containers/food/snacks/chocolate_rikazu + name = "chocolate rikazu" + desc = "A small, crispy Adhomian pie meant for one person filled with chocolate." + icon_state = "rikazu_choc" + bitesize = 2 + reagents_to_add = list(/decl/reagent/nutriment = 8) + reagent_data = list(/decl/reagent/nutriment = list("crispy dough" = 4, "smooth chocolate" = 4)) + desc_fluff = "Small pies, often hand-sized, usually made by folding dough overstuffing of fruit and cream cheese; commonly served hot. The simple preparation makes it a fast favorite, and the versatility of the ingredients has gained its favor with Tajara of all creeds. Different variations of Rikazu pop up all over Adhomai, some filled with meats, or vegetables, or even imported ingredients, like chocolate filling." + filling_color = "#BD8939" + +/obj/item/reagent_containers/food/snacks/avah + name = "avah" + desc = "A large fried dough ball covered in a sweet cream icing." + icon_state = "avah" + bitesize = 2 + reagents_to_add = list(/decl/reagent/nutriment = 7, /decl/reagent/nutriment/protein/cheese = 5) + reagent_data = list(/decl/reagent/nutriment = list("Oily dough" = 7), /decl/reagent/nutriment/protein/cheese = list("sweet cream cheese" = 5)) + desc_fluff = "Used to only mean 'sweets' or 'sweet thing', now singularly refers to a particular dessert. The batter is grilled and made into soft, spherical shapes, and then covered with fruit jams, sugar, or sweet cream cheese. These treats are often sold at festivals and celebrations, and foreigners compare them to pancakes." + filling_color = "#BD8939" + +/obj/item/reagent_containers/food/snacks/dirt_roast + name = "roasted dirtberries" + desc = "A bag of warm roasted dirtberries covered in spice." + icon_state = "roast_dirtberries" + bitesize = 2 + reagents_to_add = list(/decl/reagent/nutriment = 4, /decl/reagent/drink/syrup_caramel = 4) + reagent_data = list(/decl/reagent/nutriment = list("warm crunchy nuts" = 2, "cinnamon" = 2), /decl/reagent/drink/syrup_caramel = list("caramel" = 5)) + desc_fluff = "A traditional snack consisting of oven-roasted dirtberries covered in a mixture of spice and caramel. These crunchy fruits are usually sold at outdoor festivals and events and are enjoyed for their warming effect and pleasant taste." + filling_color = "#BD8939" + +/obj/item/reagent_containers/food/snacks/sliceable/fatshouter_fillet + name = "fatshouter fillet" + desc = "A medium rare fillet of Fatshouter meat covered in an earthenroot pate and wrapped in a flaky crust." + icon_state = "fatshouterfillet_full" + bitesize = 2 + slice_path = /obj/item/reagent_containers/food/snacks/fatshouterslice + slices_num = 5 + reagents_to_add = list(/decl/reagent/nutriment/protein = 10, /decl/reagent/nutriment = 10, /decl/reagent/alcohol/messa_mead = 5) + reagent_data = list(/decl/reagent/nutriment/protein = list("juicy meat" = 10), /decl/reagent/nutriment = list("flaky dough" = 5, "savoury vegetables" = 5)) + desc_fluff = "for a time was considered the benchmark by which to rate the abilities of a chef. The production of this exquisite dish is no easy task, the preparation process begins with the aging of a high-grade tenderloin steak acquired from a Fatshouter fed exclusively on dirtberries. The high starch content of the dirtberries ensures that the creature has a high fat percentage and imparts a unique flavour to the meat and traditionally Noble families would keep a raise small herds of Fatshouters specifically for the production of this dish. After 28 days of dry aging, the tenderloin is ready for use. One day prior to serving the dish, a pâté is made by sauteéing thinly sliced pieces of earthenroot soaked in a generous amount of Messa’s Mead and then thickened with lard before being ground into a fine paste and left to - chill. On the day that the dish is to be served a flaky pastry dough is made. Next the aged 7 tenderloin is trimmed of accumulated mold and rind and coated in a dryrub after which the chilled pâté is spread across the surface of the meat and it is wrapped in the thinly rolled pastry dough. Next the pastry is washed with a small amount of clarified lard to give the crust a nice shine, after which it is placed into a large oven and cooked at a high heat for around 40 minutes. Though the dish was regarded as a symbol of the blatant excess and overindulgence of the ruling elite, it has since been reintroduced to the public by enterprising chefs seeking to recapture the high-class culinary culture of the past." + filling_color = "#BD8939" + +/obj/item/reagent_containers/food/snacks/fatshouterslice + name = "fatshouter fillet slice" + desc = "A medium rare fillet of Fatshouter meat covered in an earthenroot pate and wrapped in a flaky crust." + icon_state = "fatshouterfillet_slice" + filling_color = "#FF7575" + desc_fluff = "for a time was considered the benchmark by which to rate the abilities of a chef. The production of this exquisite dish is no easy task, the preparation process begins with the aging of a high-grade tenderloin steak acquired from a Fatshouter fed exclusively on dirtberries. The high starch content of the dirtberries ensures that the creature has a high fat percentage and imparts a unique flavour to the meat and traditionally Noble families would keep a raise small herds of Fatshouters specifically for the production of this dish. After 28 days of dry aging, the tenderloin is ready for use. One day prior to serving the dish, a pâté is made by sauteéing thinly sliced pieces of earthenroot soaked in a generous amount of Messa’s Mead and then thickened with lard before being ground into a fine paste and left to - chill. On the day that the dish is to be served a flaky pastry dough is made. Next the aged 7 tenderloin is trimmed of accumulated mold and rind and coated in a dryrub after which the chilled pâté is spread across the surface of the meat and it is wrapped in the thinly rolled pastry dough. Next the pastry is washed with a small amount of clarified lard to give the crust a nice shine, after which it is placed into a large oven and cooked at a high heat for around 40 minutes. Though the dish was regarded as a symbol of the blatant excess and overindulgence of the ruling elite, it has since been reintroduced to the public by enterprising chefs seeking to recapture the high-class culinary culture of the past." + bitesize = 2 + +/obj/item/reagent_containers/food/snacks/fatshouterslice/filled + reagents_to_add = list(/decl/reagent/nutriment/protein = 2, /decl/reagent/nutriment = 2, /decl/reagent/alcohol/messa_mead = 1) + reagent_data = list(/decl/reagent/nutriment/protein = list("juicy meat" = 2), /decl/reagent/nutriment = list("flaky dough" = 1, "savoury vegetables" = 1)) + +/obj/item/reagent_containers/food/snacks/sliceable/zkahnkowafull + name = "Zkah'nkowa" + desc = "A large smoked sausage." + icon_state = "zkah'nkowa_full" + bitesize = 2 + slice_path = /obj/item/reagent_containers/food/snacks/zkahnkowaslice + slices_num = 5 + reagents_to_add = list(/decl/reagent/nutriment/protein = 25) + reagent_data = list(/decl/reagent/nutriment/protein = list("salty" = 10, "smoky meat" = 15)) + desc_fluff = "A canned variety of the Fatshouter Bloodpudding, known for its low-fat content and lighter color. It was created shortly after the First Revolution to ease the food shortage after the conflict. Its low cost and nutritious value allowed it to become a staple of the Hadiist diet." + filling_color = "#BD8939" + +/obj/item/reagent_containers/food/snacks/zkahnkowaslice + name = "Zkah'nkowa slice" + desc = "A slice of smoked sausage." + icon_state = "zkah'nkowa_slice" + filling_color = "#FF7575" + desc_fluff = "A canned variety of the Fatshouter Bloodpudding, known for its low-fat content and lighter color. It was created shortly after the First Revolution to ease the food shortage after the conflict. Its low cost and nutritious value allowed it to become a staple of the Hadiist diet." + bitesize = 2 + +/obj/item/reagent_containers/food/snacks/fatshouterslice/filled + reagents_to_add = list(/decl/reagent/nutriment/protein = 5) + reagent_data = list(/decl/reagent/nutriment/protein = list("salty" = 3, "smoky meat" = 5)) + +/obj/item/reagent_containers/food/snacks/creamice + name = "creamice" + desc = "A bowl of delicious Tajaran ice cream" + icon_state = "creamice" + bitesize = 2 + reagents_to_add = list(/decl/reagent/nutriment = 8) + reagent_data = list(/decl/reagent/nutriment = list("creamy" = 3, "sweet" = 3, "cold" = 2)) + desc_fluff = "The traditional dessert of Northern Harr'masir is considered by many as being the mixture of ice, Fatshouters’s milk, sugar, and Nif-Berries’ oil, named Creamice. The popular tales claim it was invented after a famine desolated the land, resulting in the population resorting to eating snow, however, such tale has been classified by most historians as nothing but fiction. Creamice is commonly consumed by the nobility since they are the ones that can afford the luxury of refrigeration." + filling_color = "#BD8939" + /obj/item/reagent_containers/food/snacks/onionrings name = "onion rings" desc = "Like circular fries but better." diff --git a/code/modules/reagents/reagent_containers/food/snacks/fish.dm b/code/modules/reagents/reagent_containers/food/snacks/fish.dm index b7a95ea3d8b..202b265902f 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/fish.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/fish.dm @@ -35,6 +35,13 @@ /obj/item/reagent_containers/food/snacks/fish/mollusc/barnacle fish_type = "barnacle" +/obj/item/reagent_containers/food/snacks/fish/cosmozoan + name = "slimy fillet" + desc = "A piece of slimy meat that could only come from a space jellyfish, a cosmozoan." + icon_state = "cozmofillet" + fish_type = "cosmozoan" + reagents_to_add = list(/decl/reagent/nutriment/protein/seafood/cosmozoan = 3) + // Molluscs! /obj/item/trash/mollusc_shell name = "mollusc shell" @@ -101,3 +108,14 @@ crack_shell(user) return return ..() + +/obj/item/mollusc/clam/rasval + name = "ras'val clam" + desc = "An adhomian clam, native to the sea of Ras'val." + icon_state = "ras'val_clams" + meat_type = /obj/item/reagent_containers/food/snacks/clam + shell_type = /obj/item/trash/mollusc_shell/clam/rasval + +/obj/item/trash/mollusc_shell/clam/rasval + name = "ras'val clam shell" + icon_state = "ras'val_clams_shell" diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 6f2ebc200d0..4fb5f57e81f 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -214,8 +214,8 @@ matter = list(DEFAULT_WALL_MATERIAL = 200) w_class = ITEMSIZE_NORMAL amount_per_transfer_from_this = 120 - possible_transfer_amounts = list(10,20,30,60,120) - volume = 120 + possible_transfer_amounts = list(5,10,15,25,30,50,60,100,120,250,300) + volume = 300 flags = OPENCONTAINER unacidable = 0 drop_sound = 'sound/items/drop/helm.ogg' diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 9b97265237b..7f9cd87b7b6 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -187,6 +187,12 @@ icon_state = "bottle-1" reagents_to_add = list(/decl/reagent/bicaridine = 60) +/obj/item/reagent_containers/glass/bottle/butazoline + name = "butazoline bottle" + desc = "A small bottle. Contains butazoline - treats damaged tissues." + icon_state = "bottle-1" + reagents_to_add = list(/decl/reagent/butazoline = 60) + /obj/item/reagent_containers/glass/bottle/dermaline name = "dermaline bottle" desc = "A small bottle. Contains dermaline - treats burnt tissues." diff --git a/code/modules/reagents/reagent_containers/glass/coffeecup.dm b/code/modules/reagents/reagent_containers/glass/coffeecup.dm new file mode 100644 index 00000000000..71b7578be67 --- /dev/null +++ b/code/modules/reagents/reagent_containers/glass/coffeecup.dm @@ -0,0 +1,166 @@ +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup + name = "coffee cup" + desc = "A plain white coffee cup." + icon = 'icons/obj/drink_glasses/coffecup.dmi' + icon_state = "coffeecup" + volume = 30 + var/fillsource = "coffeecup" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/update_icon() + cut_overlays() + + if(reagents.total_volume) + var/image/filling = image('icons/obj/drink_glasses/coffecup.dmi', src, null) + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 39) + filling.icon_state = null + return + if(40 to 79) filling.icon_state = "[fillsource]40" + if(80 to 99) filling.icon_state = "[fillsource]80" + if(100 to INFINITY) filling.icon_state = "[fillsource]100" + filling.color = reagents.get_color() + add_overlay(filling) + +// Nations +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/sol + name = "\improper sol coffee cup" + desc = "A blue coffee cup emblazoned with the crest of the Sol Alliance." + icon_state = "coffeecup_sol" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/dom + name = "\improper Dominian coffee cup" + desc = "A coffee cup with Dominia's flag proudly displayed on it." + icon_state = "coffeecup_dom" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/nka + name = "\improper NKA coffee cup" + desc = "A coffee cup imprinted with the tree symbolising the flag of the New Kingdom of Adhomai." + icon_state = "coffeecup_nka" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/pra + name = "\improper PRA coffee cup" + desc = "A coffee cup bearing the flag of the People's Republic of Adhomai." + icon_state = "coffeecup_pra" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/metal/dpra + name = "\improper DPRA coffee cup" + desc = "A metal coffee cup bearing the flag of the Democratic People's Republic of Adhomai." + icon_state = "coffeecup_dpra" + +// Organisations +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/nt + name = "\improper NT coffee cup" + desc = "A blue NanoTrasen coffee cup." + icon_state = "coffeecup_NT" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tcfl + name = "\improper Tau Ceti Foreign Legion coffee cup" + desc = "A coffee cup with the TCFL emblem emblazoned on it." + icon_state = "coffeecup_tcfl" + +// Symbols, markings +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/one + name = "#1 coffee cup" + desc = "A white coffee cup, prominently featuring a #1." + icon_state = "coffeecup_one" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/puni + name = "#1 monkey coffee cup" + desc = "A white coffee cup, prominently featuring a \"#1 monkey\" decal." + icon_state = "coffeecup_puni" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/heart + name = "heart coffee cup" + desc = "A white coffee cup, it prominently features a red heart." + icon_state = "coffeecup_heart" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/pawn + name = "pawn coffee cup" + desc = "A black coffee cup adorned with the image of a red chess pawn." + icon_state = "coffeecup_pawn" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/diona + name = "diona nymph coffee cup" + desc = "A green coffee cup featuring the image of a diona nymph." + icon_state = "coffeecup_diona" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/britcup + name = "british coffee cup" + desc = "A coffee cup with the British flag emblazoned on it." + icon_state = "coffeecup_brit" + +// Pure colors & other +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/black + name = "black coffee cup" + desc = "A sleek black coffee cup." + icon_state = "coffeecup_black" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/green + name = "green coffee cup" + desc = "A pale green and pink coffee cup." + icon_state = "coffeecup_green" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/green/dark + desc = "A dark green coffee cup." + icon_state = "coffeecup_corp" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/rainbow + name = "rainbow coffee cup" + desc = "A rainbow coffee cup. The colors are almost as blinding as a welder." + icon_state = "coffeecup_rainbow" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/metal + name = "metal coffee cup" + desc = "A metal coffee cup. You're not sure which metal." + icon_state = "coffeecup_metal" + flags = OPENCONTAINER | CONDUCT + fragile = 0 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/glass + name = "glass coffee cup" + desc = "A glass coffee cup, using space age technology to keep it cool for use." + icon_state = "glasscoffeecup" + fillsource = "glasscoffeecup" + +// Tall coffee cups +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tall + name = "tall coffee cup" + desc = "An unreasonably tall coffee cup, for when you really need to wake up in the morning." + icon = 'icons/obj/drink_glasses/coffecup_tall.dmi' + icon_state = "coffeecup_tall" + fillsource = "coffeecup_tall" + volume = 60 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tall/update_icon() + cut_overlays() + + if(reagents.total_volume) + var/image/filling = image('icons/obj/drink_glasses/coffecup_tall.dmi', src, null) + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 69) + filling.icon_state = null + return + if(70 to 89) filling.icon_state = "[fillsource]70" + if(90 to 99) filling.icon_state = "[fillsource]90" + if(100 to INFINITY) filling.icon_state = "[fillsource]100" + filling.color = reagents.get_color() + add_overlay(filling) + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tall/black + name = "tall black coffee cup" + desc = "An unreasonably tall coffee cup, for when you really need to wake up in the morning. This one is black." + icon_state = "coffeecup_tall_black" + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tall/metal + name = "tall metal coffee cup" + desc = "An unreasonably tall coffee cup, for when you really need to wake up in the morning. This one is made of metal." + icon_state = "coffeecup_tall_metal" + flags = OPENCONTAINER | CONDUCT + fragile = 0 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/tall/rainbow + name = "tall rainbow coffee cup" + desc = "An unreasonably tall coffee cup, for when you really need to wake up in the morning. This one is rainbow colored." + icon_state = "coffeecup_tall_rainbow" \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass/newdrinkingglas.dm b/code/modules/reagents/reagent_containers/glass/newdrinkingglas.dm new file mode 100644 index 00000000000..1390b7e0fbd --- /dev/null +++ b/code/modules/reagents/reagent_containers/glass/newdrinkingglas.dm @@ -0,0 +1,132 @@ +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass + center_of_mass = list("x"=16, "y"=14) + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/on_reagent_change() + update_icon() + return + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/update_icon() + cut_overlays() + + if(reagents.total_volume) + var/image/filling = image(icon, src, "[icon_state]10") + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 9) + filling.icon_state = null + return + if(10 to 19) filling.icon_state = "[icon_state]10" + if(20 to 29) filling.icon_state = "[icon_state]20" + if(30 to 39) filling.icon_state = "[icon_state]30" + if(40 to 49) filling.icon_state = "[icon_state]40" + if(50 to 59) filling.icon_state = "[icon_state]50" + if(60 to 69) filling.icon_state = "[icon_state]60" + if(70 to 79) filling.icon_state = "[icon_state]70" + if(80 to 89) filling.icon_state = "[icon_state]80" + if(90 to 99) filling.icon_state = "[icon_state]90" + if(100 to INFINITY) filling.icon_state = "[icon_state]100" + filling.color = reagents.get_color() + add_overlay(filling) + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/square + name = "half-pint glass" + icon_state = "square" + icon = 'icons/obj/drink_glasses/square.dmi' + desc = "Your standard drinking glass." + volume = 30 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/rocks + name = "rocks glass" + desc = "A robust tumbler with a thick, weighted bottom." + icon_state = "rocks" + icon = 'icons/obj/drink_glasses/rocks.dmi' + volume = 20 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/shake + name = "sherry glass" + desc = "Stemware with an untapered conical bowl." + icon_state = "shake" + icon = 'icons/obj/drink_glasses/shake.dmi' + volume = 30 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/cocktail + name = "cocktail glass" + desc = "Fragile stemware with a stout conical bowl. Don't spill." + icon_state = "cocktail" + icon = 'icons/obj/drink_glasses/cocktail.dmi' + volume = 15 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/shot + name = "shot glass" + desc = "A small glass, designed so that its contents can be consumed in one gulp." + icon_state = "shot" + icon = 'icons/obj/drink_glasses/shot.dmi' + volume = 5 + matter = list(MATERIAL_GLASS = 15) + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/pint + name = "pint glass" + icon_state = "pint" + icon = 'icons/obj/drink_glasses/pint.dmi' + volume = 60 + matter = list(MATERIAL_GLASS = 125) + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/mug + name = "glass mug" + desc = "A heavy mug with thick walls." + icon_state = "mug" + icon = 'icons/obj/drink_glasses/mug.dmi' + volume = 40 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/wine + name = "wine glass" + desc = "A piece of elegant stemware." + icon_state = "wine" + icon = 'icons/obj/drink_glasses/wine.dmi' + volume = 25 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/flute + name = "flute glass" + desc = "A piece of very elegant stemware." + icon_state = "flute" + icon = 'icons/obj/drink_glasses/flute.dmi' + volume = 25 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/carafe + name = "pitcher" + desc = "A handled glass pitcher." + icon_state = "carafe" + icon = 'icons/obj/drink_glasses/carafe.dmi' + volume = 120 + matter = list(MATERIAL_GLASS = 250) + possible_transfer_amounts = list(5,10,15,30,60,120) + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/teacup + name = "teacup" + desc = "A plain white porcelain teacup." + icon = 'icons/obj/drink_glasses/teacup.dmi' + icon_state = "teacup" + volume = 20 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/coffeecup/teacup/update_icon() + cut_overlays() + + if(reagents.total_volume) + var/image/filling = image('icons/obj/drink_glasses/teacup.dmi', src, "[icon_state]100") + filling.color = reagents.get_color() + add_overlay(filling) + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/cognac + name = "snifter glass" + desc = "A snitfer, also known as a cognac glass, made for serving aged spirits." + icon_state = "cognac" + icon = 'icons/obj/drink_glasses/cognac.dmi' + volume = 20 + +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass/goblet + name = "goblet" + desc = "A glass goblet, used to deliver alcohol to the upper class since ancient times." + icon_state = "goblet" + icon = 'icons/obj/drink_glasses/goblet.dmi' + volume = 25 + \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 66aad01d7c4..7ff4c11243a 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -50,14 +50,16 @@ if(isliving(M)) var/mob/living/L = M var/inj_time = time - inj_time *= L.can_inject(user, TRUE) - if(!inj_time) + var/mod_time = L.can_inject(user, TRUE, target_zone, armorcheck) + if(!mod_time) return + else if(inj_time <= 0 && mod_time > 1) + inj_time = (1 SECOND) * mod_time + else + inj_time *= mod_time user.visible_message(SPAN_WARNING("\The [user] is trying to inject \the [L] with \the [src]!"), SPAN_NOTICE("You are trying to inject \the [L] with \the [src].")) - if(armorcheck && L.get_blocked_ratio(target_zone, BRUTE, damage = 10)) - inj_time += 6 SECONDS - if(!do_mob(user, L, inj_time)) - return 1 + if(do_mob(user, L, inj_time)) + inject(M, user, M.Adjacent(user)) /obj/item/reagent_containers/hypospray/update_icon() cut_overlays() @@ -73,12 +75,8 @@ filling.color = reagents.get_color() add_overlay(filling) -/obj/item/reagent_containers/hypospray/afterattack(var/mob/M, var/mob/user, proximity) - - if (!istype(M)) - return ..() - - if(!proximity) +/obj/item/reagent_containers/hypospray/proc/inject(var/mob/M, var/mob/user, proximity) + if(!proximity || !istype(M)) return if(!reagents.total_volume) @@ -101,22 +99,36 @@ update_icon() return TRUE +/obj/item/reagent_containers/hypospray/afterattack(atom/target, mob/user, proximity) + if (!proximity) + return + + if (!isliving(target)) + return ..() + /obj/item/reagent_containers/hypospray/autoinjector name = "autoinjector" desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel." - icon_state = "autoinjector1" - item_state = "autoinjector1" - var/empty_state = "autoinjector0" - flags = OPENCONTAINER + desc_fluff = "Funded by the Stellar Corporate Conglomerate, produced by Zeng-Hu Pharmaceuticals, this autoinjector system was rebuilt from the ground up from the old variant to provide maximum user feedback." + desc_info = "Autoinjectors are spent after using them. To re-use, use a screwdriver to open the back panel, then simply pour any desired reagent inside. Use in-hand, or click it while it's in your active hand to prepare it for reuse." + icon_state = "autoinjector" + item_state = "autoinjector" + var/name_label + var/spent = TRUE amount_per_transfer_from_this = 5 possible_transfer_amounts = null volume = 5 time = 0 /obj/item/reagent_containers/hypospray/autoinjector/Initialize() - . =..() - icon_state = empty_state - item_state = empty_state + . = ..() + if(name_label) + name_unlabel = name + name = "[name] ([name_label])" + verbs += /atom/proc/remove_label + if(reagents_to_add) + flags = 0 + spent = FALSE update_icon() /obj/item/reagent_containers/hypospray/autoinjector/attack(var/mob/M, var/mob/user, target_zone) @@ -125,10 +137,17 @@ return FALSE . = ..() +/obj/item/reagent_containers/hypospray/autoinjector/inject(mob/M, mob/user, proximity) + . = ..() + if(.) + spent = TRUE + update_icon() + /obj/item/reagent_containers/hypospray/autoinjector/attack_self(mob/user as mob) if(is_open_container()) if(LAZYLEN(reagents.reagent_volumes)) to_chat(user, SPAN_NOTICE("With a quick twist of \the [src]'s lid, you secure the reagents inside.")) + spent = FALSE flags &= ~OPENCONTAINER update_icon() else @@ -146,12 +165,18 @@ . = ..() /obj/item/reagent_containers/hypospray/autoinjector/update_icon() - if(reagents.total_volume > 0 && !is_open_container()) - icon_state = initial(icon_state) - item_state = initial(icon_state) - else - icon_state = empty_state - item_state = empty_state + cut_overlays() + if(!is_open_container()) + var/mutable_appearance/backing_overlay = mutable_appearance(icon, "autoinjector_secured") + add_overlay(backing_overlay) + + icon_state = "[initial(icon_state)][spent]" + item_state = "[initial(item_state)][spent]" + + if(reagents.total_volume) + var/mutable_appearance/reagent_overlay = mutable_appearance(icon, "autoinjector_reagents") + reagent_overlay.color = reagents.get_color() + add_overlay(reagent_overlay) /obj/item/reagent_containers/hypospray/autoinjector/examine(mob/user) ..(user) @@ -162,11 +187,11 @@ /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline - name = "autoinjector (inaprovaline)" + name_label = "inaprovaline" reagents_to_add = list(/decl/reagent/inaprovaline = 5) /obj/item/reagent_containers/hypospray/autoinjector/emergency - name = "autoinjector (emergency)" + name_label = "emergency" reagents_to_add = list(/decl/reagent/inaprovaline = 2.5, /decl/reagent/dexalin = 2.5) /obj/item/reagent_containers/hypospray/autoinjector/emergency/Initialize() @@ -174,14 +199,19 @@ desc += " This auto-injector is to be used in emergencies. It contains a small amount of inaprovaline and dexalin." /obj/item/reagent_containers/hypospray/autoinjector/coagzolug - name = "autoinjector (coagzolug)" + name_label = "coagzolug" desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel. This one contains coagzolug, a quick-acting blood coagulant that will slow bleeding for as long as it's within the bloodstream." volume = 5 flags = 0 reagents_to_add = list(/decl/reagent/coagzolug = 5) +/obj/item/reagent_containers/hypospray/autoinjector/hyronalin + name_label = "hyronalin" + flags = 0 + reagents_to_add = list(/decl/reagent/hyronalin = 5) + /obj/item/reagent_containers/hypospray/autoinjector/sideeffectbgone - name = "sideeffects-be-gone! autoinjector" + name_label = "sideeffects-be-gone!" desc = "A special cocktail designed to counter the side-effects of various drugs. Has 2 uses." volume = 30 amount_per_transfer_from_this = 15 @@ -204,13 +234,66 @@ reagents_to_add = list(/decl/reagent/tricordrazine = 15, /decl/reagent/inaprovaline = 5, /decl/reagent/dexalin/plus = 5, /decl/reagent/oxycomorphine = 3, /decl/reagent/synaptizine = 2, /decl/reagent/mental/corophenidate = 5) +/obj/item/reagent_containers/hypospray/autoinjector/trauma + name = "trauma hypo-injector" + desc = "A special hypospray made to combat most forms of physical trauma." + volume = 15 + amount_per_transfer_from_this = 15 + + reagents_to_add = list(/decl/reagent/butazoline = 15) + +/obj/item/reagent_containers/hypospray/autoinjector/burn + name = "burn hypo-injector" + desc = "A special hypospray made to combat most types of superficial burns." + volume = 15 + amount_per_transfer_from_this = 15 + + reagents_to_add = list(/decl/reagent/dermaline = 15) + +/obj/item/reagent_containers/hypospray/autoinjector/oxygen + name = "oxygenation hypo-injector" + desc = "A special hypospray made to combat oxygen deprivation." + volume = 15 + amount_per_transfer_from_this = 15 + + reagents_to_add = list(/decl/reagent/dexalin/plus = 15) + +/obj/item/reagent_containers/hypospray/autoinjector/purity + name = "purity hypo-injector" + desc = "A special hypospray made to combat most forms of impurities such as genetic damage and infections." + volume = 15 + amount_per_transfer_from_this = 15 + + reagents_to_add = list(/decl/reagent/thetamycin = 10, /decl/reagent/ryetalyn = 5) + +/obj/item/reagent_containers/hypospray/autoinjector/organ + name = "organ hypo-injector" + desc = "A special hypospray made to combat internal damage." + volume = 15 + amount_per_transfer_from_this = 15 + + reagents_to_add = list(/decl/reagent/peridaxon = 10, /decl/reagent/oculine = 5) + +/obj/item/reagent_containers/hypospray/autoinjector/pain + name = "numbing hypo-injector" + desc = "A special hypospray made to combat pain. This one only injects 5 units at a time." + volume = 15 + amount_per_transfer_from_this = 5 + + reagents_to_add = list(/decl/reagent/oxycomorphine = 15) + /obj/item/reagent_containers/hypospray/combat name = "combat hypospray" desc = "A hypospray loaded with combat stimulants. Its needle has the ability to bypass armor." item_state = "combat_hypo" icon_state = "combat_hypo" volume = 20 - armorcheck = 0 + armorcheck = FALSE time = 0 reagents_to_add = list(/decl/reagent/oxycomorphine = 5, /decl/reagent/synaptizine = 5, /decl/reagent/hyperzine = 5, /decl/reagent/arithrazine = 5) + +/obj/item/reagent_containers/hypospray/combat/empty + name = "combat hypospray" + desc = "A sleek black hypospray. Its needle has the ability to bypass armor." + reagents_to_add = FALSE \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index 950a59b68e7..7263801a1f4 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -38,7 +38,8 @@ if ( ((user.is_clumsy()) || (DUMB in user.mutations)) && prob(10)) to_chat(user,"Your hand slips from clumsiness!") - eyestab(H,user) + if(!H.eyes_protected(src, FALSE)) + eyestab(H,user) if(H.reagents) var/contained = reagentlist() var/trans = reagents.trans_to_mob(H, amount_per_transfer_from_this, CHEM_TOUCH) diff --git a/code/modules/reagents/reagent_containers/inhaler_advanced.dm b/code/modules/reagents/reagent_containers/inhaler_advanced.dm index fe99f697ab6..481a0a5167e 100644 --- a/code/modules/reagents/reagent_containers/inhaler_advanced.dm +++ b/code/modules/reagents/reagent_containers/inhaler_advanced.dm @@ -121,7 +121,8 @@ if (((user.is_clumsy()) || (DUMB in user.mutations)) && prob(10)) to_chat(user,"Your hand slips from clumsiness!") - eyestab(M,user) + if(M.eyes_protected(src, FALSE)) + eyestab(M,user) user.visible_message("[user] accidentally sticks \the [src] in [M]'s eye!","You accidentally stick the [src] in [M]'s eye!") return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index bb0e5be0695..9908c67c533 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -134,16 +134,52 @@ reagents_to_add = list(/decl/reagent/mortaphenyl = 10) /obj/item/reagent_containers/pill/corophenidate - name = "5u Corophenidate Pill" + name = "2u Corophenidate Pill" desc = "Improves the ability to concentrate." icon_state = "pill8" - reagents_to_add = list(/decl/reagent/mental/corophenidate = 5) + reagents_to_add = list(/decl/reagent/mental/corophenidate = 2) + +/obj/item/reagent_containers/pill/emoxanyl + name = "2u Emoxanyl Pill" + desc = "Used to treat anxiety disorders, depression and epilepsy." + icon_state = "pill8" + reagents_to_add = list(/decl/reagent/mental/emoxanyl = 2) /obj/item/reagent_containers/pill/minaphobin - name = "5u Minaphobin Pill" + name = "2u Minaphobin Pill" desc = "Used to treat anxiety disorders and depression." icon_state = "pill8" - reagents_to_add = list(/decl/reagent/mental/minaphobin = 5) + reagents_to_add = list(/decl/reagent/mental/minaphobin = 2) + +/obj/item/reagent_containers/pill/nerospectan + name = "2u Nerospectan Pill" + desc = "Used to treat a large variety of disorders including tourettes, depression, anxiety and psychosis." + icon_state = "pill8" + reagents_to_add = list(/decl/reagent/mental/nerospectan = 2) + +/obj/item/reagent_containers/pill/neurapan + name = "2u Neurapan Pill" + desc = "Used to treat a large variety of disorders including tourettes, depression, anxiety and psychosis." + icon_state = "pill8" + reagents_to_add = list(/decl/reagent/mental/neurapan = 2) + +/obj/item/reagent_containers/pill/neurostabin + name = "2u Neurostabin Pill" + desc = "Used to treat psychosis and muscle weakness." + icon_state = "pill8" + reagents_to_add = list(/decl/reagent/mental/neurostabin = 2) + +/obj/item/reagent_containers/pill/orastabin + name = "2u Orastabin Pill" + desc = "Used to treat anxiety disorders and speech impediments." + icon_state = "pill8" + reagents_to_add = list(/decl/reagent/mental/orastabin = 2) + +/obj/item/reagent_containers/pill/parvosil + name = "2u Parvosil Pill" + desc = "Used to treat anxiety disorders such as phobias and social anxiety." + icon_state = "pill8" + reagents_to_add = list(/decl/reagent/mental/parvosil = 2) /obj/item/reagent_containers/pill/inaprovaline name = "10u Inaprovaline Pill" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index f33c0bed594..21266cf5982 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -219,17 +219,18 @@ return if(ismob(target) && target != user) + var/inject_time = time if(isliving(target)) var/mob/living/L = target - var/injtime = L.can_inject(user, TRUE, user.zone_sel.selecting) - if(!injtime) + var/inject_mod = L.can_inject(user, TRUE, user.zone_sel.selecting) + if(!inject_mod) return - time *= injtime + inject_time *= inject_mod user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) user.do_attack_animation(target) - if(!do_mob(user, target, time)) + if(!do_mob(user, target, inject_time)) return user.visible_message(SPAN_WARNING("[user] injects [target] with the syringe!")) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 4b1c6028e6b..5752e0e6e20 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -151,6 +151,7 @@ user.visible_message(SPAN_WARNING("\The [user] carefully removes \the [rig] from \the [src]."), \ SPAN_NOTICE("You carefully remove \the [rig] from \the [src].")) rig.forceMove(get_turf(user)) + rig.detached() user.put_in_hands(rig) rig = null overlays = new/list() diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index be5618db146..07b65783286 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -781,6 +781,16 @@ var/subtype = 0 // new pipe, set the icon_state as on map +/obj/structure/disposalpipe/Initialize(mapload) + . = ..() + + if(mapload) + var/turf/T = loc + var/image/I = image(icon, T, icon_state, EFFECTS_ABOVE_LIGHTING_LAYER, dir, pixel_x, pixel_y) + I.plane = 0 + I.alpha = 125 + LAZYADD(T.blueprints, I) + // pipe is deleted // ensure if holder is present, it is expelled /obj/structure/disposalpipe/Destroy() diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 4da3132a8ba..7d226b5bcbf 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -188,9 +188,10 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). ret += "[D.materials[M] - materials[M]] [M]" for(var/C in D.chemicals) if(!reagents.has_reagent(C, D.chemicals[C])) + var/decl/reagent/R = decls_repository.get_decl(C) if(ret != "") ret += ", " - ret += "[C]" + ret += "[R.name]" return ret /obj/machinery/r_n_d/circuit_imprinter/proc/build(var/datum/design/D) diff --git a/code/modules/research/designs/circuit/machine_circuits.dm b/code/modules/research/designs/circuit/machine_circuits.dm index 15d98c3fc36..ea5f9521837 100644 --- a/code/modules/research/designs/circuit/machine_circuits.dm +++ b/code/modules/research/designs/circuit/machine_circuits.dm @@ -46,6 +46,11 @@ req_tech = list(TECH_DATA = 3) build_path = /obj/item/circuitboard/rdserver +/datum/design/circuit/machine/rdtechprocessor + name = "R&D Tech Processor" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/circuitboard/rdtechprocessor + /datum/design/circuit/machine/mechfab name = "Exosuit Fabricator" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) @@ -76,6 +81,11 @@ req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) build_path = /obj/item/circuitboard/sleeper +/datum/design/circuit/machine/stasis_bed + name = "Lifeform Stasis Unit" + req_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 4, TECH_BIO = 4) + build_path = /obj/item/circuitboard/stasis_bed + /datum/design/circuit/machine/bodyscannerm name = "Body Scanner" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index f3707f40ff8..b1ff3976b33 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -183,9 +183,10 @@ ret += "[D.materials[M] - materials[M]] [M]" for(var/C in D.chemicals) if(!reagents.has_reagent(C, D.chemicals[C])) + var/decl/reagent/R = decls_repository.get_decl(C) if(ret != "") ret += ", " - ret += "[C]" + ret += "[R.name]" return ret /obj/machinery/r_n_d/protolathe/proc/build(var/datum/design/D) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index d52b25279e3..c15dcec9d35 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -96,20 +96,19 @@ won't update every console in existence) but it's more of a hassle to do. Also, return /obj/machinery/computer/rdconsole/proc/SyncTechs() - if(src) - for(var/obj/machinery/r_n_d/server/S in SSmachinery.all_machines) - var/server_processed = 0 - if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom)) - for(var/tech_id in files.known_tech) - var/datum/tech/T = files.known_tech[tech_id] - S.files.AddTech2Known(T) - S.files.RefreshResearch() - server_processed = 1 - files.known_tech = S.files.known_tech.Copy() - if(!istype(S, /obj/machinery/r_n_d/server/centcom) && server_processed) - S.produce_heat() - screen = 1.6 - updateUsrDialog() + for(var/obj/machinery/r_n_d/server/S in SSmachinery.all_machines) + var/server_processed = 0 + if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom)) + for(var/tech_id in files.known_tech) + var/datum/tech/T = files.known_tech[tech_id] + S.files.AddTech2Known(T) + S.files.RefreshResearch() + server_processed = 1 + files.known_tech = S.files.known_tech.Copy() + if(!istype(S, /obj/machinery/r_n_d/server/centcom) && server_processed) + S.produce_heat() + screen = 1.6 + updateUsrDialog() /obj/machinery/computer/rdconsole/proc/griefProtection() //Have it automatically push research to the centcomm server so wild griffins can't fuck up R&D's work for(var/obj/machinery/r_n_d/server/centcom/C in SSmachinery.all_machines) @@ -861,7 +860,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole/robotics name = "robotics R&D console" - id = 2 + id = 1 req_access = list(access_robotics) allow_analyzer = FALSE allow_lathe = FALSE diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index ce9a51bc9c8..7918bd2e310 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -150,10 +150,12 @@ var/global/list/designs_imprinter_categories = list() if(KT.level >= MAX_TECH_LEVEL) break if(KT.next_level_progress + progress >= KT.next_level_threshold) - progress -= KT.next_level_threshold - KT.next_level_progress + var/progress_left = KT.next_level_threshold - KT.next_level_progress + KT.next_level_progress += progress_left KT.level++ KT.level = clamp(KT.level, 0, MAX_TECH_LEVEL) KT.next_level_threshold = get_level_value(KT.level) + progress -= progress_left continue KT.next_level_progress += progress break diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index c7fd1fe9ee4..398acc1329c 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -1,5 +1,5 @@ /obj/machinery/r_n_d/server - name = "R&D server" + name = "\improper R&D server" desc = "A server which houses a back-up of all station research. It can be used to restore lost data, or to act as another point of retrieval." icon = 'icons/obj/machines/research.dmi' icon_state = "server" @@ -10,11 +10,13 @@ var/id_with_upload_string = "" //String versions for easy editing in map editor. var/id_with_download_string = "" var/server_id = 0 - var/produces_heat = 1 + var/produces_heat = TRUE idle_power_usage = 800 var/delay = 10 req_access = list(access_rd) //Only the R&D can change server settings. + var/list/linked_processors + component_types = list( /obj/item/circuitboard/rdserver, /obj/item/stock_parts/scanning_module, @@ -22,6 +24,8 @@ ) /obj/machinery/r_n_d/server/Destroy() + for(var/obj/machinery/r_n_d/tech_processor/TP as anything in linked_processors) + TP.set_server(null) griefProtection() return ..() @@ -52,6 +56,9 @@ id_with_download += text2num(N) /obj/machinery/r_n_d/server/machinery_process() + if(stat & (NOPOWER|BROKEN)) + return + var/datum/gas_mixture/environment = loc.return_air() switch(environment.temperature) if(0 to T0C) @@ -73,6 +80,19 @@ else produce_heat() delay = initial(delay) + upgrade_techs() + +/obj/machinery/r_n_d/server/proc/upgrade_techs() + for(var/obj/machinery/r_n_d/tech_processor/TP as anything in linked_processors) + if(TP.stat & (NOPOWER|BROKEN)) + continue + TP.processing_stage++ + if(TP.processing_stage == 5) + for(var/tech_id in files.known_tech) + var/datum/tech/T = files.known_tech[tech_id] + if(T.level) + files.UpdateTech(T.id, round(TP.tech_rate)) + TP.processing_stage = 0 /obj/machinery/r_n_d/server/emp_act(severity) griefProtection() @@ -113,7 +133,15 @@ env.merge(removed) -/obj/machinery/r_n_d/server/attackby(var/obj/item/O as obj, var/mob/user as mob) +/obj/machinery/r_n_d/server/attackby(obj/item/O, mob/user) + if(O.ismultitool()) + var/obj/item/device/multitool/MT = O + var/obj/machinery/r_n_d/tech_processor/TP = MT.get_buffer(/obj/machinery/r_n_d/tech_processor) + if(TP) + TP.set_server(src) + MT.unregister_buffer(TP) + to_chat(user, SPAN_NOTICE("You link \the [TP] to \the [src].")) + return if(default_deconstruction_screwdriver(user, O)) return if(default_deconstruction_crowbar(user, O)) diff --git a/code/modules/research/stockparts.dm b/code/modules/research/stockparts.dm index 54f7c07deb2..7baa2eb96d8 100644 --- a/code/modules/research/stockparts.dm +++ b/code/modules/research/stockparts.dm @@ -141,6 +141,7 @@ /obj/item/stock_parts/capacitor/adv name = "advanced capacitor" desc = "An advanced capacitor used in the construction of a variety of devices." + icon_state = "adv_capacitor" origin_tech = list(TECH_POWER = 3) rating = STOCK_PART_ADVANCED matter = list(DEFAULT_WALL_MATERIAL = 50, MATERIAL_GLASS = 50) @@ -148,7 +149,7 @@ /obj/item/stock_parts/scanning_module/adv name = "advanced scanning module" desc = "A compact, high resolution scanning module used in the construction of certain devices." - icon_state = "scan_module" + icon_state = "adv_scan_module" origin_tech = list(TECH_MAGNET = 3) rating = STOCK_PART_ADVANCED matter = list(DEFAULT_WALL_MATERIAL = 50, MATERIAL_GLASS = 20) @@ -182,6 +183,7 @@ /obj/item/stock_parts/capacitor/super name = "super capacitor" desc = "A super-high capacity capacitor used in the construction of a variety of devices." + icon_state = "super_capacitor" origin_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) rating = STOCK_PART_SUPER matter = list(DEFAULT_WALL_MATERIAL = 50, MATERIAL_GLASS = 50) @@ -189,6 +191,7 @@ /obj/item/stock_parts/scanning_module/phasic name = "phasic scanning module" desc = "A compact, high resolution phasic scanning module used in the construction of certain devices." + icon_state = "super_scan_module" origin_tech = list(TECH_MAGNET = 5) rating = STOCK_PART_SUPER matter = list(DEFAULT_WALL_MATERIAL = 50, MATERIAL_GLASS = 20) diff --git a/code/modules/research/tech_processor.dm b/code/modules/research/tech_processor.dm new file mode 100644 index 00000000000..9ff5498e254 --- /dev/null +++ b/code/modules/research/tech_processor.dm @@ -0,0 +1,85 @@ +/obj/machinery/r_n_d/tech_processor + name = "\improper R&D tech processor" + desc = "A highly advanced analytical computation engine, when connected to an R&D server with a multitool, it will start processing known technology and add research points to it." + icon_state = "tech_processor" + + component_types = list( + /obj/item/circuitboard/rdtechprocessor, + /obj/item/stock_parts/scanning_module = 2, + /obj/item/stack/cable_coil = 2 + ) + + idle_power_usage = 800 + + var/tech_rate = 0 + var/obj/machinery/r_n_d/server/linked_server + + var/processing_stage = 0 + + var/heat_delay = 10 + +/obj/machinery/r_n_d/tech_processor/Destroy() + set_server(null) + return ..() + +/obj/machinery/r_n_d/tech_processor/RefreshParts() + tech_rate = 0 + for(var/obj/item/stock_parts/scanning_module/SM in component_parts) + tech_rate += SM.rating / 2 + idle_power_usage = initial(idle_power_usage) * tech_rate // lots of power + update_icon() + +/obj/machinery/r_n_d/tech_processor/machinery_process() + heat_delay-- + if(!heat_delay) + produce_heat() + heat_delay = initial(heat_delay) + +/obj/machinery/r_n_d/tech_processor/attackby(obj/item/W, mob/user) + if(W.ismultitool()) + var/obj/item/device/multitool/MT = W + MT.set_buffer(src) + to_chat(user, SPAN_NOTICE("You attach \the [src]'s linking node to \the [MT]'s machinery buffer.")) + return + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return + return ..() + +/obj/machinery/r_n_d/tech_processor/proc/set_server(var/obj/machinery/r_n_d/server/S) + if(linked_server) + LAZYREMOVE(linked_server.linked_processors, src) + linked_server = S + if(linked_server) + LAZYADD(linked_server.linked_processors, src) + update_icon() + +/obj/machinery/r_n_d/tech_processor/proc/produce_heat() + if(!(stat & (NOPOWER|BROKEN))) + var/turf/simulated/L = loc + if(istype(L)) + var/datum/gas_mixture/env = L.return_air() + var/transfer_moles = 0.25 * env.total_moles + var/datum/gas_mixture/removed = env.remove(transfer_moles) + if(removed) + var/heat_produced = idle_power_usage //obviously can't produce more heat than the machine draws from it's power source + removed.add_thermal_energy(heat_produced) + env.merge(removed) + +/obj/machinery/r_n_d/tech_processor/power_change() + . = ..() + update_icon() + +/obj/machinery/r_n_d/tech_processor/update_icon() + cut_overlays() + if(stat & (NOPOWER|BROKEN)) + icon_state = "[initial(icon_state)]_off" + else if(!linked_server) + icon_state = "[initial(icon_state)]_unlinked" + else + icon_state = initial(icon_state) + if(panel_open) + add_overlay("[initial(icon_state)]_open") \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm index fd6e67b93bc..4fc5013f0ff 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact.dm @@ -29,26 +29,30 @@ // Boulders - sometimes turn up after excavating turf - excavate further to try and find large xenoarch finds /obj/structure/boulder - name = "rocky debris" + name = "boulder" desc = "Leftover rock from an excavation, it's been partially dug out already but there's still a lot to go." icon = 'icons/obj/mining.dmi' icon_state = "boulder1" density = 1 opacity = 1 anchored = 1 + material = MATERIAL_SANDSTONE var/excavation_level = 0 - var/datum/geosample/geological_data + var/datum/geosample/geologic_data var/datum/artifact_find/artifact_find var/last_act = 0 -/obj/structure/boulder/New() - icon_state = "boulder[rand(1,4)]" +/obj/structure/boulder/Initialize(mapload, var/coloration = "#9c9378") + . = ..() + icon_state = "boulder[rand(1,6)]" + if(coloration) + color = coloration excavation_level = rand(5,50) /obj/structure/boulder/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/device/core_sampler)) - src.geological_data.artifact_distance = rand(-100,100) / 100 - src.geological_data.artifact_id = artifact_find.artifact_id + src.geologic_data.artifact_distance = rand(-100,100) / 100 + src.geologic_data.artifact_id = artifact_find.artifact_id var/obj/item/device/core_sampler/C = W C.sample_item(src, user) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_physical.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_physical.dm index 4d9156472e2..68246a2d078 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_physical.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_physical.dm @@ -225,7 +225,7 @@ if(ishuman(toucher) && prob(weakness * 100)) var/mob/living/carbon/human/H = toucher to_chat(H, pick("You feel like taking a nap.","You feel a yawn coming on.","You feel a little tired.")) - H.drowsyness = min(H.drowsyness + rand(5,25) * weakness, 50 * weakness) + H.drowsiness = min(H.drowsiness + rand(5,25) * weakness, 50 * weakness) H.eye_blurry = min(H.eye_blurry + rand(1,3) * weakness, 50 * weakness) else to_chat(toucher, SPAN_WARNING("SYSTEM ALERT: CPU cycles slowing down!")) @@ -244,7 +244,7 @@ if(prob(weakness * 100)) if(prob(10)) to_chat(H, pick("You feel like taking a nap.","You feel a yawn coming on.","You feel a little tired.")) - H.drowsyness = min(H.drowsyness + 1 * weakness, 25 * weakness) + H.drowsiness = min(H.drowsiness + 1 * weakness, 25 * weakness) H.eye_blurry = min(H.eye_blurry + 1 * weakness, 25 * weakness) return TRUE @@ -260,7 +260,7 @@ var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) to_chat(H, pick("You feel like taking a nap.","You feel a yawn coming on.","You feel a little tired.")) - H.drowsyness = min(H.drowsyness + rand(5,15) * weakness, 50 * weakness) + H.drowsiness = min(H.drowsiness + rand(5,15) * weakness, 50 * weakness) H.eye_blurry = min(H.eye_blurry + rand(5,15) * weakness, 50 * weakness) return TRUE diff --git a/code/modules/research/xenoarchaeology/geosample.dm b/code/modules/research/xenoarchaeology/geosample.dm index ccaf2104c3d..14fdc0a6e28 100644 --- a/code/modules/research/xenoarchaeology/geosample.dm +++ b/code/modules/research/xenoarchaeology/geosample.dm @@ -18,15 +18,15 @@ name = "rock sliver" desc = "It looks extremely delicate." icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "sliver1" //0-4 + icon_state = "sliver1" // 1 - 3 randpixel = 8 w_class = ITEMSIZE_TINY - sharp = 1 - //item_state = "electronic" - var/source_rock = "/turf/simulated/mineral/" - var/datum/geosample/geological_data + sharp = TRUE + var/datum/geosample/geologic_data -/obj/item/rocksliver/New() +/obj/item/rocksliver/Initialize(mapload, geodata) + . = ..() + geologic_data = geodata icon_state = "sliver[rand(1,3)]" randpixel_xy() create_reagents(50) diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm index 835f7dedd94..da46e4b2cdb 100644 --- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm +++ b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm @@ -283,8 +283,8 @@ if(/obj/item/rocksliver) var/obj/item/rocksliver/O = scanned_item - if(O.geological_data) - G = O.geological_data + if(O.geologic_data) + G = O.geologic_data if(/obj/item/archaeological_find) data = " - Mundane object (archaic xenos origins)
    " diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm index 8c8ca46034a..8f713a4797f 100644 --- a/code/modules/research/xenoarchaeology/misc.dm +++ b/code/modules/research/xenoarchaeology/misc.dm @@ -60,7 +60,7 @@ //---- Lockers and closets /obj/structure/closet/secure_closet/xenoarchaeologist - name = "Xenoarchaeologist Locker" + name = "xenoarchaeologist locker" req_access = list(access_tox_storage) icon_state = "secureres1" icon_closed = "secureres" @@ -69,20 +69,18 @@ icon_broken = "secureresbroken" icon_off = "secureresoff" - New() - ..() - sleep(2) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/suit/storage/toggle/labcoat(src) - new /obj/item/clothing/shoes/science(src) - new /obj/item/clothing/glasses/science(src) - new /obj/item/device/radio/headset/headset_sci(src) - new /obj/item/storage/belt/archaeology(src) - new /obj/item/storage/box/excavation(src) - return +/obj/structure/closet/secure_closet/xenoarchaeologist/fill() + new /obj/item/clothing/under/rank/scientist(src) + new /obj/item/clothing/suit/storage/toggle/labcoat(src) + new /obj/item/clothing/shoes/science(src) + new /obj/item/clothing/glasses/science(src) + new /obj/item/device/radio/headset/headset_sci(src) + new /obj/item/storage/belt/archaeology(src) + new /obj/item/storage/box/excavation(src) + new /obj/item/taperoll/science(src) /obj/structure/closet/excavation - name = "Excavation tools" + name = "excavation tools" icon_state = "toolcloset" icon_closed = "toolcloset" icon_opened = "toolclosetopen" diff --git a/code/modules/research/xenoarchaeology/tools/anomaly_container.dm b/code/modules/research/xenoarchaeology/tools/anomaly_container.dm new file mode 100644 index 00000000000..64e5fc6700f --- /dev/null +++ b/code/modules/research/xenoarchaeology/tools/anomaly_container.dm @@ -0,0 +1,45 @@ +/obj/structure/anomaly_container + name = "anomaly container" + desc = "Used to safely contain and move anomalies." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "anomaly_container" + density = TRUE + + var/obj/machinery/artifact/contained + +/obj/structure/anomaly_container/Initialize() + . = ..() + + var/obj/machinery/artifact/A = locate() in loc + if(A) + contain(A) + +/obj/structure/anomaly_container/attack_hand(var/mob/user) + release() + +/obj/structure/anomaly_container/attack_robot(var/mob/user) + if(Adjacent(user)) + release() + +/obj/structure/anomaly_container/proc/contain(var/obj/machinery/artifact/artifact) + if(contained) + return + contained = artifact + artifact.forceMove(src) + underlays += image(artifact) + desc = "Used to safely contain and move anomalies. \The [contained] is kept inside." + +/obj/structure/anomaly_container/proc/release() + if(!contained) + return + contained.dropInto(src) + contained = null + underlays.Cut() + desc = initial(desc) + +/obj/machinery/artifact/MouseDrop(atom/over) + if(istype(over, /obj/structure/anomaly_container)) + var/obj/structure/anomaly_container/box = over + box.contain(src) + return TRUE + . = ..() \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm index b2965596bbc..b772e16aee8 100644 --- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm +++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm @@ -1,331 +1,225 @@ /obj/machinery/suspension_gen name = "suspension field generator" - desc = "It has stubby legs bolted up against it's body for stabilising." + desc = "Multi-phase mobile suspension field generator MK II \"Steadfast\". It has stubby legs bolted up against it's body for stabilising." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "suspension2" - density = 1 - req_access = list(access_research) + density = TRUE obj_flags = OBJ_FLAG_ROTATABLE + req_access = list(access_research) + active_power_usage = 25 + + var/open = FALSE + var/screwed = TRUE + var/locked = TRUE + var/field_type = "chlorine" + var/obj/item/cell/cell - var/obj/item/card/id/auth_card - var/locked = 1 - var/open = 0 - var/screwed = 1 - var/field_type = "" - var/power_use = 25 var/obj/effect/suspension_field/suspension_field - var/list/secured_mobs = list() + + var/static/list/field_types = list( + "carbon" = "Diffracted Carbon Dioxide Laser", + "nitrogen" = "Nitrogen Tracer Field", + "potassium" = "Potassium Refrigerant Cloud", + "mercury" = "Mercury Dispersion Wave", + "iron" = "Iron Wafer Conduction Field", + "calcium" = "Calcium Binary De-Oxidiser", + "chlorine" = "Chlorine Diffusion Emissions", + "phoron" = "Phoron Saturated Field" + ) /obj/machinery/suspension_gen/Initialize() . = ..() - cell = new/obj/item/cell/high(src) + cell = new /obj/item/cell/high(src) -/obj/machinery/suspension_gen/machinery_process() - set background = 1 +/obj/machinery/suspension_gen/Destroy() + deactivate() + return ..() - if (suspension_field) - cell.charge -= power_use - - var/turf/T = get_turf(suspension_field) - if(field_type == "carbon") - for(var/mob/living/carbon/M in T) - M.weakened = max(M.weakened, 3) - cell.charge -= power_use - if(prob(5)) - to_chat(M, "[pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]") - - if(field_type == "iron") - for(var/mob/living/silicon/M in T) - M.weakened = max(M.weakened, 3) - cell.charge -= power_use - if(prob(5)) - to_chat(M, "[pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]") - - for(var/obj/item/I in T) - if(!suspension_field.contents.len) - suspension_field.icon_state = "energynet" - suspension_field.add_overlay("shield2") - I.forceMove(suspension_field) - - for(var/mob/living/simple_animal/M in T) - M.weakened = max(M.weakened, 3) - cell.charge -= power_use - if(prob(5)) - to_chat(M, "[pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]") - - if(cell.charge <= 0) +/obj/machinery/suspension_gen/process() + if(suspension_field) + if(!cell.charge) deactivate() + return + if(suspension_field.victim_number) + cell.use(active_power_usage * suspension_field.victim_number) -/obj/machinery/suspension_gen/interact(mob/user as mob) - var/dat = "Multi-phase mobile suspension field generator MK II \"Steadfast\"
    " - if(cell) - var/colour = "red" - if(cell.charge / cell.maxcharge > 0.66) - colour = "green" - else if(cell.charge / cell.maxcharge > 0.33) - colour = "orange" - dat += "Energy cell: [100 * cell.charge / cell.maxcharge]%
    " - else - dat += "Energy cell: None
    " - if(auth_card) - dat += "\[[auth_card]\]
    " - if(!locked) - dat += "
    [suspension_field ? "Disable" : "Enable"] field
    " - else - dat += "
    " - else - dat += "\[------\]
    " - if(!locked) - dat += "
    [suspension_field ? "Disable" : "Enable"] field
    " - else - dat += "Enter your ID to begin.
    " +/obj/machinery/suspension_gen/attack_hand(mob/user) + . = ..() + if(.) + return + + ui_interact(user) - dat += "
    " - if(!locked) - dat += "Select field mode
    " - dat += "[field_type=="carbon"?"":"" ]Diffracted carbon dioxide laser
    " - dat += "[field_type=="nitrogen"?"":"" ]Nitrogen tracer field
    " - dat += "[field_type=="potassium"?"":"" ]Potassium refrigerant cloud
    " - dat += "[field_type=="mercury"?"":"" ]Mercury dispersion wave
    " - dat += "[field_type=="iron"?"":"" ]Iron wafer conduction field
    " - dat += "[field_type=="calcium"?"":"" ]Calcium binary deoxidiser
    " - dat += "[field_type=="phoron"?"":"" ]Chlorine diffusion emissions
    " - dat += "[field_type=="phoron"?"":"" ]Phoron saturated field
    " - else - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "Always wear safety gear and consult a field manual before operation.
    " - if(!locked) - dat += "Lock console
    " - else - dat += "
    " - dat += "Refresh console
    " - dat += "Close console" - - var/datum/browser/suspension_win = new(user, "suspension", capitalize_first_letters(name), 500, 400) - suspension_win.set_content(dat) - suspension_win.open() - -/obj/machinery/suspension_gen/Topic(href, href_list) - ..() - usr.set_machine(src) - - if(href_list["toggle_field"]) - if(!suspension_field) - if(cell.charge > 0) - if(anchored) - activate() - else - to_chat(usr, "You are unable to activate [src] until it is properly secured on the ground.") - else - deactivate() - if(href_list["select_field"]) - field_type = href_list["select_field"] - else if(href_list["insertcard"]) - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/card)) - usr.drop_from_inventory(I,src) - auth_card = I - if(attempt_unlock(I, usr)) - to_chat(usr, "You insert [I], the console flashes \'Access granted.\'") - else - to_chat(usr, "You insert [I], the console flashes \'Access denied.\'") - else if(href_list["ejectcard"]) - if(auth_card) - if(ishuman(usr)) - auth_card.forceMove(usr.loc) - if(!usr.get_active_hand()) - usr.put_in_hands(auth_card) - auth_card = null - else - auth_card.forceMove(loc) - auth_card = null - else if(href_list["lock"]) - locked = 1 - else if(href_list["close"]) - usr.unset_machine() - usr << browse(null, "window=suspension") - - updateUsrDialog() - -/obj/machinery/suspension_gen/attack_hand(mob/user as mob) - if(!open) - interact(user) - else if(cell) - cell.forceMove(loc) - cell.add_fingerprint(user) - cell.update_icon() - - icon_state = "suspension0" - cell = null - to_chat(user, "You remove the power cell") - -/obj/machinery/suspension_gen/attackby(obj/item/W as obj, mob/user as mob) - if (W.isscrewdriver()) +/obj/machinery/suspension_gen/attackby(obj/item/I, mob/user) + if(I.isscrewdriver()) if(!open) - if(screwed) - screwed = 0 - else - screwed = 1 - to_chat(user, "You [screwed ? "screw" : "unscrew"] the battery panel.") - else if (W.iscrowbar()) + screwed = !screwed + to_chat(user, SPAN_NOTICE("You [screwed ? "screw" : "unscrew"] the battery panel.")) + update_icon() + else + to_chat(user, SPAN_WARNING("\The [src]'s battery panel is open!")) + return + else if (I.iscrowbar()) if(!locked) if(!screwed) if(!suspension_field) - if(open) - open = 0 - else - open = 1 - to_chat(user, "You crowbar the battery panel [open ? "open" : "in place"].") - icon_state = "suspension[open ? (cell ? "1" : "0") : "2"]" + open = !open + to_chat(user, SPAN_NOTICE("You crowbar the battery panel [open ? "open" : "in place"].")) + update_icon() else - to_chat(user, "[src]'s safety locks are engaged, shut it down first.") + to_chat(user, SPAN_WARNING("[src]'s safety locks are engaged, shut it down first.")) else - to_chat(user, "Unscrew [src]'s battery panel first.") + to_chat(user, SPAN_WARNING("Unscrew [src]'s battery panel first.")) else - to_chat(user, "[src]'s security locks are engaged.") - else if (W.iswrench()) + to_chat(user, SPAN_WARNING("[src]'s security locks are engaged.")) + return + else if (I.iswrench()) if(!suspension_field) + anchored = !anchored + to_chat(user, SPAN_NOTICE("You wrench the stabilising legs [anchored ? "into place" : "up against the body"].")) if(anchored) - anchored = 0 + desc = "Multi-phase mobile suspension field generator MK II \"Steadfast\". It is resting securely on four stubby legs." else - anchored = 1 - to_chat(user, "You wrench the stabilising legs [anchored ? "into place" : "up against the body"].") - if(anchored) - desc = "It is resting securely on four stubby legs." - else - desc = "It has stubby legs bolted up against it's body for stabilising." + desc = "Multi-phase mobile suspension field generator MK II \"Steadfast\". It has stubby legs bolted up against it's body for stabilising." + update_icon() else - to_chat(user, "You are unable to secure [src] while it is active!") - else if (istype(W, /obj/item/cell)) + to_chat(user, SPAN_WARNING("You are unable to secure [src] while it is active!")) + else if (istype(I, /obj/item/cell)) if(open) if(cell) - to_chat(user, "There is a power cell already installed.") + to_chat(user, SPAN_WARNING("There is a power cell already installed.")) else - user.drop_from_inventory(W,src) - cell = W - to_chat(user, "You insert the power cell.") - icon_state = "suspension1" - else if(istype(W, /obj/item/card)) - var/obj/item/card/I = W - if(!auth_card) - if(attempt_unlock(I, user)) - to_chat(user, "You swipe [I], the console flashes \'Access granted.\'") - else - to_chat(user, "You swipe [I], console flashes \'Access denied.\'") + user.drop_from_inventory(I, src) + cell = I + to_chat(user, SPAN_NOTICE("You insert the power cell.")) + update_icon() + else if(istype(I, /obj/item/card)) + if(allowed(user)) + locked = !locked + to_chat(user, SPAN_NOTICE("You [locked ? "" : "un"]lock \the [src].")) + +/obj/machinery/suspension_gen/ui_interact(mob/user) + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) + if(!ui) + ui = new(user, src, "machinery-xenoarchaeology-suspensiongenerator", 400, 500, "Suspension Field Generator") + ui.auto_update_content = TRUE + ui.open() + +/obj/machinery/suspension_gen/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + if(!data) + data = list() + + data["charge"] = 0 + if(cell) + data["charge"] = round(cell.percent()) + + data["fieldtype"] = field_type + data["fieldtypes"] = field_types.Copy() + + data["active"] = !!suspension_field + data["locked"] = locked + data["anchored"] = anchored + + return data + +/obj/machinery/suspension_gen/Topic(href, href_list) + if(..()) + return TRUE + + if(href_list["togglefield"]) + if(locked || !anchored) + return + + if(!suspension_field) + var/obj/item/cell/cell = get_cell() + if(cell?.charge > 0) + if(anchored) + activate() else - to_chat(user, "Remove [auth_card] first.") + deactivate() -/obj/machinery/suspension_gen/proc/attempt_unlock(var/obj/item/card/C, var/mob/user) - if(!open) - if(istype(C, /obj/item/card/emag)) - C.resolve_attackby(src, user) - else if(istype(C, /obj/item/card/id) && check_access(C)) - locked = 0 - if(!locked) - return 1 + if(href_list["fieldtype"]) + field_type = href_list["fieldtype"] + if(suspension_field) + suspension_field.field_type = field_type -/obj/machinery/suspension_gen/emag_act(var/remaining_charges, var/mob/user) - if(cell.charge > 0 && locked) - locked = 0 - return 1 + SSvueui.check_uis_for_change(src) //checks for whether the machine can be activated or not should already have occurred by this point /obj/machinery/suspension_gen/proc/activate() - //depending on the field type, we might pickup certain items var/turf/T = get_turf(get_step(src,dir)) - var/success = 0 - var/collected = 0 - switch(field_type) - if("carbon") - success = 1 - for(var/mob/living/carbon/C in T) - C.weakened += 5 - C.visible_message("[icon2html(C, viewers(get_turf(C)))] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.") - if("nitrogen") - success = 1 - // - if("mercury") - success = 1 - // - if("chlorine") - success = 1 - // - if("potassium") - success = 1 - // - if("phoron") - success = 1 - // - if("calcium") - success = 1 - // - if("iron") - success = 1 - for(var/mob/living/silicon/R in T) - R.weakened += 5 - R.visible_message("[icon2html(R, viewers(get_turf(R)))] [R] begins to float in the air!","You feel tingly and light, but it is difficult to move.") - // - //in case we have a bad field type - if(!success) - return - - for(var/mob/living/simple_animal/C in T) - C.visible_message("[icon2html(C, viewers(get_turf(C)))] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.") - C.weakened += 5 - suspension_field = new(T) suspension_field.field_type = field_type - src.visible_message("[icon2html(src, viewers(get_turf(src)))] [src] activates with a low hum.") - icon_state = "suspension3" - - for(var/obj/item/I in T) - I.forceMove(suspension_field) - collected++ - - if(collected) - suspension_field.icon_state = "energynet" - suspension_field.add_overlay("shield2") - src.visible_message("[icon2html(suspension_field, viewers(get_turf(suspension_field)))] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"].") - else - if(istype(T,/turf/simulated/mineral) || istype(T,/turf/simulated/wall)) - suspension_field.icon_state = "shieldsparkles" - else - suspension_field.icon_state = "shield2" + visible_message(SPAN_NOTICE("\The [src] activates with a low hum.")) + update_icon() + START_PROCESSING(SSprocessing, src) /obj/machinery/suspension_gen/proc/deactivate() - //drop anything we picked up - var/turf/T = get_turf(suspension_field) + STOP_PROCESSING(SSprocessing, src) + visible_message(SPAN_NOTICE("\The [src] deactivates with a gentle shudder.")) + QDEL_NULL(suspension_field) + update_icon() - for(var/mob/M in T) - to_chat(M, "You no longer feel like floating.") - M.weakened = min(M.weakened, 3) +/obj/machinery/suspension_gen/update_icon() + icon_state = "suspension[open ? (cell ? "1" : "0") : (suspension_field ? "3" : "2")]" - src.visible_message("[icon2html(src, viewers(get_turf(src)))] [src] deactivates with a gentle shudder.") - qdel(suspension_field) - suspension_field = null - icon_state = "suspension2" - -/obj/machinery/suspension_gen/Destroy() - //safety checks: clear the field and drop anything it's holding - deactivate() - return ..() +/obj/machinery/suspension_gen/get_cell() + return cell /obj/effect/suspension_field name = "energy field" icon = 'icons/effects/effects.dmi' - anchored = 1 - density = 1 - var/field_type = "chlorine" + anchored = TRUE + density = TRUE + var/field_type = "chlorine" + var/victim_number //number of mobs it affected, needed for generator powerdraw calc + +/obj/effect/suspension_field/examine(mob/user) + . = ..() + if(.) + to_chat(user, SPAN_NOTICE("You can see something floating inside it:")) + to_chat(user, SPAN_NOTICE(english_list(contents))) + +/obj/effect/suspension_field/Initialize() + . = ..() + suspend_things() + START_PROCESSING(SSprocessing, src) + /obj/effect/suspension_field/Destroy() - for(var/obj/I in src) - I.forceMove(src.loc) + for(var/mob/living/M in loc) + to_chat(M, SPAN_NOTICE("You no longer feel like floating.")) + for(var/atom/movable/A in src) + A.dropInto(loc) + STOP_PROCESSING(SSprocessing, src) return ..() + +/obj/effect/suspension_field/process() + suspend_things() + +/obj/effect/suspension_field/proc/suspend_things() + victim_number = 0 + var/turf/T = get_turf(src) + for(var/mob/living/M in T) + if((isanimal(M) || iscarbon(M)) && field_type != "carbon") + continue + if(isrobot(M) && field_type != "iron") + continue + M.weakened = max(M.weakened, 3) + victim_number++ + if(prob(5)) + to_chat(M, SPAN_WARNING("[pick("You feel tingly","You feel like floating","It is hard to speak","You can barely move")].")) + for(var/obj/item/I in T) + if(!I.anchored && I.simulated) + I.forceMove(src) + update_icon() + +/obj/effect/suspension_field/update_icon() + underlays.Cut() + var/turf/T = get_turf(src) + if(T.density) + icon_state = "shieldsparkles" + else + icon_state = "shield2" + if(length(contents)) + underlays += "energynet" \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm index dfb62b4db0b..e1a3b3efd61 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm @@ -39,6 +39,9 @@ last_scan_time = world.time nearest_artifact_distance = -1 var/turf/cur_turf = get_turf(src) + if(!cur_turf) + return + if (SSxenoarch) //Sanity check due to runtimes ~Z for(var/turf/simulated/mineral/T in SSxenoarch.artifact_spawning_turfs) if(T.artifact_find) diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm index e072710521a..33511048d3d 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm @@ -3,13 +3,14 @@ /obj/item/storage/box/samplebags name = "sample bag box" desc = "A box claiming to contain sample bags." - New() - for(var/i=0, i<7, i++) - var/obj/item/evidencebag/S = new(src) - S.name = "sample bag" - S.desc = "a bag for holding research samples." - ..() - return + +/obj/item/storage/box/samplebags/fill() + for(var/i = 1 to 7) + new /obj/item/evidencebag/sample(src) + +/obj/item/evidencebag/sample + name = "sample bag" + desc = "A bag for holding research samples." ////////////////////////////////////////////////////////////////// @@ -20,76 +21,41 @@ icon_state = "sampler0" item_state = "screwdriver_brown" w_class = ITEMSIZE_TINY - //slot_flags = SLOT_BELT - var/sampled_turf = "" - var/num_stored_bags = 10 - var/obj/item/evidencebag/filled_bag + var/obj/item/sample /obj/item/device/core_sampler/examine(mob/user) if(..(user, 2)) - to_chat(user, "Used to extract geological core samples - this one is [sampled_turf ? "full" : "empty"], and has [num_stored_bags] bag[num_stored_bags != 1 ? "s" : ""] remaining.") + to_chat(user, SPAN_NOTICE("This one is [sample ? "full" : "empty"].")) -/obj/item/device/core_sampler/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W,/obj/item/evidencebag)) - if(num_stored_bags < 10) - qdel(W) - num_stored_bags += 1 - to_chat(user, "You insert the [W] into the core sampler.") - else - to_chat(user, "The core sampler can not fit any more bags!") - else - return ..() - -/obj/item/device/core_sampler/proc/sample_item(var/item_to_sample, var/mob/user as mob) +/obj/item/device/core_sampler/proc/sample_item(var/item_to_sample, var/mob/user) var/datum/geosample/geo_data + if(istype(item_to_sample, /turf/simulated/mineral)) var/turf/simulated/mineral/T = item_to_sample - T.geologic_data.UpdateNearbyArtifactInfo(T) - geo_data = T.geologic_data + geo_data = T.get_geodata() else if(istype(item_to_sample, /obj/item/ore)) var/obj/item/ore/O = item_to_sample geo_data = O.geologic_data if(geo_data) - if(filled_bag) - to_chat(user, "The core sampler is full!") - else if(num_stored_bags < 1) - to_chat(user, "The core sampler is out of sample bags!") + if(sample) + to_chat(user, SPAN_WARNING("The core sampler is full.")) else - //create a new sample bag which we'll fill with rock samples - filled_bag = new /obj/item/evidencebag(src) - filled_bag.name = "sample bag" - filled_bag.desc = "a bag for holding research samples." + sample = new /obj/item/rocksliver(src, geo_data) + update_icon() - icon_state = "sampler1" - num_stored_bags-- - - //put in a rock sliver - var/obj/item/rocksliver/R = new() - R.geological_data = geo_data - R.forceMove(filled_bag) - - //update the sample bag - filled_bag.icon_state = "evidence" - var/image/I = image("icon"=R, "layer"=FLOAT_LAYER) - filled_bag.add_overlay(I) - filled_bag.add_overlay("evidence") - filled_bag.w_class = ITEMSIZE_TINY - - to_chat(user, "You take a core sample of the [item_to_sample].") + to_chat(user, SPAN_NOTICE("You take a core sample of the [item_to_sample].")) else - to_chat(user, "You are unable to take a sample of [item_to_sample].") + to_chat(user, SPAN_WARNING("You are unable to take a geological sample of [item_to_sample].")) -/obj/item/device/core_sampler/attack_self() - if(filled_bag) - to_chat(usr, "You eject the full sample bag.") - var/success = 0 - if(istype(src.loc, /mob)) - var/mob/M = src.loc - success = M.put_in_inactive_hand(filled_bag) - if(!success) - filled_bag.forceMove(get_turf(src)) - filled_bag = null - icon_state = "sampler0" +/obj/item/device/core_sampler/update_icon() + icon_state = "sampler[!!sample]" + +/obj/item/device/core_sampler/attack_self(var/mob/living/user) + if(sample) + to_chat(user, SPAN_NOTICE("You eject the sample.")) + user.put_in_hands(sample) + sample = null + update_icon() else - to_chat(usr, "The core sampler is empty.") + to_chat(user, SPAN_WARNING("The core sampler is empty.")) \ No newline at end of file diff --git a/code/modules/shareddream/brainghost.dm b/code/modules/shareddream/brainghost.dm index 8cc059fa994..cbe3adf066e 100644 --- a/code/modules/shareddream/brainghost.dm +++ b/code/modules/shareddream/brainghost.dm @@ -19,6 +19,7 @@ name = form.real_name loc = pick(dream_entries) body = form + old_mob = body if(client) client.screen |= body.healths diff --git a/code/modules/shareddream/dream_entry.dm b/code/modules/shareddream/dream_entry.dm index be94d60815f..87ced599c5f 100644 --- a/code/modules/shareddream/dream_entry.dm +++ b/code/modules/shareddream/dream_entry.dm @@ -11,6 +11,7 @@ var/list/dream_entries = list() bg = new /mob/living/brain_ghost(src) // Generate a new brainghost. if(isnull(bg)) // Prevents you from getting kicked if the brain ghost didn't spawn - geeves return + vr_mob = bg bg.ckey = ckey bg.client = client ckey = "@[bg.ckey]" @@ -29,7 +30,7 @@ var/list/dream_entries = list() log_and_message_admins("has left the shared dream",bg) var/mob/living/brain_ghost/old_bg = bg bg = null - + vr_mob = null var/return_text = "You are ripped from the Srom as your body awakens." var/mob/return_mob = src diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index f8b4fb4d1a0..c2983407ae3 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -7,6 +7,7 @@ var/list/shuttle_area //can be both single area type or a list of areas var/obj/effect/shuttle_landmark/current_location //This variable is type-abused initially: specify the landmark_tag, not the actual landmark. + var/list/shuttle_computers = list() var/arrive_time = 0 //the time at which the shuttle arrives when long jumping var/flags = 0 @@ -56,6 +57,10 @@ if(src.name in SSshuttle.shuttles) CRASH("A shuttle with the name '[name]' is already defined.") SSshuttle.shuttles[src.name] = src + for(var/obj/machinery/computer/shuttle_control/SC as anything in SSshuttle.lonely_shuttle_computers) + if(SC.shuttle_tag == name) + SSshuttle.lonely_shuttle_computers -= SC + shuttle_computers += SC if(flags & SHUTTLE_FLAGS_PROCESS) SSshuttle.process_shuttles += src if(flags & SHUTTLE_FLAGS_SUPPLY) @@ -284,3 +289,8 @@ if(!next_location) return "None" return next_location.name + +/datum/shuttle/proc/set_process_state(var/new_state) + process_state = new_state + for(var/obj/machinery/computer/shuttle_control/SC as anything in shuttle_computers) + SC.update_helmets(src) \ No newline at end of file diff --git a/code/modules/shuttles/shuttle_autodock.dm b/code/modules/shuttles/shuttle_autodock.dm index bd106f092f9..f951bcce834 100644 --- a/code/modules/shuttles/shuttle_autodock.dm +++ b/code/modules/shuttles/shuttle_autodock.dm @@ -90,9 +90,9 @@ //*** ready to go if(next_location.is_valid(src)) process_launch() - process_state = WAIT_ARRIVE + set_process_state(WAIT_ARRIVE) else - process_state = IDLE_STATE + set_process_state(IDLE_STATE) in_use = null if (FORCE_LAUNCH) @@ -102,12 +102,12 @@ if (moving_status == SHUTTLE_IDLE) //*** we made it to the destination, update stuff process_arrived() - process_state = WAIT_FINISH + set_process_state(WAIT_FINISH) if (WAIT_FINISH) if (world.time > last_dock_attempt_time + DOCK_ATTEMPT_TIMEOUT || check_docked()) //*** all done here - process_state = IDLE_STATE + set_process_state(IDLE_STATE) arrived() //not to be confused with the arrived() proc @@ -128,14 +128,14 @@ /datum/shuttle/autodock/proc/process_launch() if(!next_location.is_valid(src) || current_location.cannot_depart(src)) - process_state = IDLE_STATE + set_process_state(IDLE_STATE) in_use = null return if (get_travel_time() && landmark_transition) . = long_jump(next_location, landmark_transition, get_travel_time()) else . = short_jump(next_location) - process_state = WAIT_ARRIVE + set_process_state(WAIT_ARRIVE) /* Guards @@ -158,7 +158,7 @@ in_use = user //obtain an exclusive lock on the shuttle - process_state = WAIT_LAUNCH + set_process_state(WAIT_LAUNCH) undock() /datum/shuttle/autodock/proc/force_launch(var/user) @@ -167,13 +167,13 @@ in_use = user //obtain an exclusive lock on the shuttle - process_state = FORCE_LAUNCH + set_process_state(FORCE_LAUNCH) /datum/shuttle/autodock/proc/cancel_launch(var/user) if (!can_cancel()) return moving_status = SHUTTLE_IDLE - process_state = WAIT_FINISH + set_process_state(WAIT_FINISH) in_use = null //whatever we were doing with docking: stop it, then redock diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 64bd633657f..da50f50a85f 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -8,6 +8,41 @@ var/hacked = FALSE // Has been emagged, no access restrictions. var/ui_template = "shuttle_control_console.tmpl" + var/list/linked_helmets = list() + +/obj/machinery/computer/shuttle_control/Initialize() + . = ..() + if(SSshuttle.shuttles[shuttle_tag]) + var/datum/shuttle/shuttle = SSshuttle.shuttles[shuttle_tag] + shuttle.shuttle_computers += src + else + SSshuttle.lonely_shuttle_computers += src + +/obj/machinery/computer/shuttle_control/Destroy() + SSshuttle.lonely_shuttle_computers -= src + var/datum/shuttle/shuttle = SSshuttle.shuttles[shuttle_tag] + shuttle.shuttle_computers -= src + for(var/obj/item/clothing/head/helmet/pilot/PH as anything in linked_helmets) + PH.linked_console = null + return ..() + +/obj/machinery/computer/shuttle_control/attackby(obj/item/I, user) + if(istype(I, /obj/item/clothing/head/helmet/pilot)) + var/obj/item/clothing/head/helmet/pilot/PH = I + if(I in linked_helmets) + to_chat(user, SPAN_NOTICE("You unlink \the [I] from \the [src].")) + linked_helmets -= PH + PH.linked_console = null + PH.set_hud_maptext("Shuttle Status: No Shuttle Linked.") + else + to_chat(user, SPAN_NOTICE("You link \the [I] to \the [src].")) + if(PH.linked_console) + PH.linked_console.linked_helmets -= PH + linked_helmets += PH + PH.linked_console = src + PH.set_hud_maptext("Shuttle Status: [get_shuttle_status(SSshuttle.shuttles[shuttle_tag])]") + return + return ..() /obj/machinery/computer/shuttle_control/attack_hand(mob/user) ui_interact(user) @@ -28,26 +63,8 @@ if(SHUTTLE_WARMUP) shuttle_state = "warmup" if(SHUTTLE_INTRANSIT) shuttle_state = "in_transit" - var/shuttle_status - switch (shuttle.process_state) - if(IDLE_STATE) - var/cannot_depart = shuttle.current_location.cannot_depart(shuttle) - if (shuttle.in_use) - shuttle_status = "Busy." - else if(cannot_depart) - shuttle_status = cannot_depart - else - shuttle_status = "Standing-by at \the [shuttle.get_location_name()]." - - if(WAIT_LAUNCH, FORCE_LAUNCH) - shuttle_status = "Shuttle has recieved command and will depart shortly." - if(WAIT_ARRIVE) - shuttle_status = "Proceeding to \the [shuttle.get_destination_name()]." - if(WAIT_FINISH) - shuttle_status = "Arriving at destination now." - return list( - "shuttle_status" = shuttle_status, + "shuttle_status" = get_shuttle_status(shuttle), "shuttle_state" = shuttle_state, "has_docking" = shuttle.active_docking_controller? 1 : 0, "docking_status" = shuttle.active_docking_controller? shuttle.active_docking_controller.get_docking_status() : null, @@ -57,6 +74,24 @@ "can_force" = shuttle.can_force(), ) +/obj/machinery/computer/shuttle_control/proc/get_shuttle_status(var/datum/shuttle/autodock/shuttle) + switch(shuttle.process_state) + if(IDLE_STATE) + var/cannot_depart = shuttle.current_location.cannot_depart(shuttle) + if(shuttle.in_use) + . = "Busy." + else if(cannot_depart) + . = cannot_depart + else + . = "Standing-by at \the [shuttle.get_location_name()]." + + if(WAIT_LAUNCH, FORCE_LAUNCH) + . = "Shuttle has received a command and will depart shortly." + if(WAIT_ARRIVE) + . = "Proceeding to \the [shuttle.get_destination_name()]." + if(WAIT_FINISH) + . = "Arriving at destination now." + // This is a subset of the actual checks; contains those that give messages to the user. /obj/machinery/computer/shuttle_control/proc/can_move(var/datum/shuttle/autodock/shuttle, var/user) var/cannot_depart = shuttle.current_location.cannot_depart(shuttle) @@ -107,6 +142,11 @@ ..() handle_topic_href(SSshuttle.shuttles[shuttle_tag], href_list, usr) +/obj/machinery/computer/shuttle_control/proc/update_helmets(var/datum/shuttle/autodock/shuttle) + var/shuttle_status = get_shuttle_status(shuttle) + for(var/obj/item/clothing/head/helmet/pilot/PH as anything in linked_helmets) + PH.set_hud_maptext("Shuttle Status: [shuttle_status]") + /obj/machinery/computer/shuttle_control/emag_act(var/remaining_charges, var/mob/user) if(!hacked) req_access = list() diff --git a/code/modules/spell_system/artifacts/armor/wizard_voidsuit.dm b/code/modules/spell_system/artifacts/armor/wizard_voidsuit.dm deleted file mode 100644 index 02b5712468d..00000000000 --- a/code/modules/spell_system/artifacts/armor/wizard_voidsuit.dm +++ /dev/null @@ -1,65 +0,0 @@ -/obj/item/clothing/head/helmet/space/void/wizard - name = "gem-encrusted voidsuit helmet" - desc = "A bizarre gem-encrusted helmet that radiates magical energies." - icon_state = "rig0-wiz" - item_state_slots = list( - slot_l_hand_str = "wiz_helm", - slot_r_hand_str = "wiz_helm" - ) - unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles! - armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) - siemens_coefficient = 0.35 - wizard_garb = 1 - species_restricted = list(BODYTYPE_HUMAN, BODYTYPE_IPC_INDUSTRIAL, BODYTYPE_SKELETON, BODYTYPE_IPC_ZENGHU, BODYTYPE_IPC_BISHOP) - -/obj/item/clothing/head/helmet/space/void/wizard/equipped(var/mob/living/user) - if(!user.is_wizard()) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/LH = H.get_organ(BP_L_HAND) - var/obj/item/organ/external/RH = H.get_organ(BP_R_HAND) - var/active_hand = H.hand - to_chat(user, "Your hand passes through the [src] with a flash of searing heat!") - playsound(user, 'sound/effects/sparks4.ogg', 40, 1) - user.drop_item() - if(active_hand) - LH.droplimb(0,DROPLIMB_BURN) - else - RH.droplimb(0,DROPLIMB_BURN) - return - else - ..() - -/obj/item/clothing/suit/space/void/wizard - icon_state = "rig-wiz" - name = "gem-encrusted voidsuit" - desc = "A bizarre gem-encrusted suit that radiates magical energies." - item_state = "wiz_voidsuit" - item_state_slots = list( - slot_l_hand_str = "wiz_hardsuit", - slot_r_hand_str = "wiz_hardsuit" - ) - slowdown = 1 - w_class = ITEMSIZE_NORMAL - unacidable = 1 - armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) - siemens_coefficient = 0.35 - wizard_garb = 1 - allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/teleportation_scroll,/obj/item/scrying,/obj/item/spellbook,/obj/item/device/soulstone,/obj/item/material/knife/ritual) - species_restricted = list(BODYTYPE_HUMAN, BODYTYPE_SKRELL, BODYTYPE_IPC_INDUSTRIAL, BODYTYPE_SKELETON, BODYTYPE_IPC_ZENGHU, BODYTYPE_IPC_BISHOP) - -/obj/item/clothing/suit/space/void/wizard/equipped(var/mob/living/user) - if(!user.is_wizard()) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/LH = H.get_organ(BP_L_HAND) - var/obj/item/organ/external/RH = H.get_organ(BP_R_HAND) - var/active_hand = H.hand - to_chat(user, "Your hand passes through the [src] with a flash of searing heat!") - playsound(user, 'sound/effects/sparks4.ogg', 40, 1) - user.drop_item() - if(active_hand) - LH.droplimb(0,DROPLIMB_BURN) - else - RH.droplimb(0,DROPLIMB_BURN) - return - else - ..() diff --git a/code/modules/spell_system/artifacts/items/apprentice_pebble.dm b/code/modules/spell_system/artifacts/items/apprentice_pebble.dm deleted file mode 100644 index 04e64ac08db..00000000000 --- a/code/modules/spell_system/artifacts/items/apprentice_pebble.dm +++ /dev/null @@ -1,46 +0,0 @@ -/obj/item/apprentice_pebble - name = "apprentice pebble" - desc = "A pebble, it feels warm to the touch." - icon = 'icons/obj/wizard.dmi' - icon_state = "pebble" - origin_tech = list(TECH_BLUESPACE = 6, TECH_MATERIAL = 6, TECH_BIO = 6) - w_class = ITEMSIZE_SMALL - var/obj/item/contract/apprentice/contract - -/obj/item/apprentice_pebble/Initialize() - . = ..() - contract = new /obj/item/contract/apprentice(src) - SSghostroles.add_spawn_atom("apprentice", src) - -/obj/item/apprentice_pebble/Destroy() - if(contract) - QDEL_NULL(contract) - SSghostroles.remove_spawn_atom("apprentice", src) - return ..() - -/obj/item/apprentice_pebble/assign_player(var/mob/user) - var/mob/living/carbon/human/G = new /mob/living/carbon/human(get_turf(src)) - G.ckey = user.ckey - G.real_name = "[pick(wizard_first)] [pick(wizard_second)]" - G.name = G.real_name - - G.preEquipOutfit(/datum/outfit/admin/wizard/apprentice, FALSE) - G.equipOutfit(/datum/outfit/admin/wizard/apprentice, FALSE) - - G.put_in_hands(contract) - contract = null - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, get_turf(src)) - smoke.start() - - qdel(src) - - return G - -/obj/item/apprentice_pebble/pickup(mob/living/user) - ..() - if(!user.is_wizard()) - to_chat(user, SPAN_WARNING("As you pick up \the [src], you feel a wave of power wash over you.")) - for(var/obj/machinery/light/P in view(7, user)) - P.flicker(1) diff --git a/code/modules/spell_system/artifacts/items/lich_phylactery.dm b/code/modules/spell_system/artifacts/items/lich_phylactery.dm index cee338f09e0..667975ced6f 100644 --- a/code/modules/spell_system/artifacts/items/lich_phylactery.dm +++ b/code/modules/spell_system/artifacts/items/lich_phylactery.dm @@ -39,7 +39,6 @@ /obj/item/phylactery/pickup(mob/living/user as mob) ..() - if(!user.is_wizard() && src.lich) - to_chat(user, "As you pick up \the [src], you feel a wave of dread wash over you.") - for(var/obj/machinery/light/P in view(7, user)) - P.flicker(1) + to_chat(user, "As you pick up \the [src], you feel a wave of dread wash over you.") + for(var/obj/machinery/light/P in view(7, user)) + P.flicker(1) diff --git a/code/modules/spell_system/artifacts/items/monster_manual.dm b/code/modules/spell_system/artifacts/items/monster_manual.dm deleted file mode 100644 index 6f725d16b91..00000000000 --- a/code/modules/spell_system/artifacts/items/monster_manual.dm +++ /dev/null @@ -1,83 +0,0 @@ -/obj/item/monster_manual - name = "bestiarum" - desc = "A book detailing various magical creatures." - icon = 'icons/obj/library.dmi' - icon_state = "bookHacking" - throw_speed = 1 - throw_range = 5 - w_class = ITEMSIZE_SMALL - var/uses = 1 - var/temp = null - var/list/monster = list(/mob/living/simple_animal/familiar/pet/cat, - /mob/living/simple_animal/rat/familiar, - /mob/living/simple_animal/familiar/carcinus, - /mob/living/simple_animal/familiar/horror, - /mob/living/simple_animal/familiar/goat, - /mob/living/simple_animal/familiar/pike - ) - var/list/monster_info = list( "It is well known that the blackest of cats make good familiars.", - "Rats are small but fragile creatures. This one is gifted with unending life, and the ability to renew others.", - "A mortal decendant of the original Carcinus, it is said their shells are near impenetrable and their claws as sharp as knives.", - "A creature from other plane, its very own presence is enough to shatter the sanity of men.", - "A stubborn and mischievous creature, this goat delights in stirring trouble.", - "The more carnivorous and knowledge hungry cousin of the space carp. Keep away from books." - ) - -/obj/item/monster_manual/attack_self(mob/living/user) - if(!user) - return - if(!user.is_wizard()) - to_chat(user, SPAN_WARNING("When you try to open the book, horrors pours out from among the pages!")) - new /mob/living/simple_animal/hostile/creature(get_turf(user)) - playsound(user, 'sound/magic/Summon_Karp.ogg', 100, 1) - return - else - user.set_machine(src) - interact(user) - -/obj/item/monster_manual/interact(mob/user) - var/dat - if(temp) - dat = "[temp]
    Return" - else - dat = "

    bestiarum

    You have [uses] uses left.
    " - for(var/i=1;i<=monster_info.len;i++) - var/mob/M = monster[i] - var/name = capitalize(initial(M.name)) - dat += "
    [name] - [monster_info[i]]
    " - - var/datum/browser/manual_win = new(user, "monstermanual", capitalize_first_letters(name)) - manual_win.set_content(dat) - manual_win.open() - -/obj/item/monster_manual/Topic(href, href_list) - ..() - if(!Adjacent(usr)) - usr << browse(null,"window=monstermanual") - return - if(href_list["temp"]) - temp = null - if(href_list["path"]) - if(uses <= 0) - to_chat(usr, SPAN_WARNING("This book is out of uses.")) - return - - var/path = text2path(href_list["path"]) - if(!ispath(path)) - to_chat(usr, "Invalid mob path in [src]. Contact a coder.") - return - - if(!(path in monster)) - return - - var/mob/living/simple_animal/F = new path(get_turf(src)) - F.wizard_master = usr - F.faction = usr.faction - temp = "You have attempted summoning \the [F]" - SSghostroles.add_spawn_atom("wizard_familiar", F) - uses-- - - if(Adjacent(usr)) - src.interact(usr) - else - usr << browse(null,"window=monstermanual") diff --git a/code/modules/spell_system/artifacts/items/rune_sword.dm b/code/modules/spell_system/artifacts/items/rune_sword.dm deleted file mode 100644 index b382217dab7..00000000000 --- a/code/modules/spell_system/artifacts/items/rune_sword.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/item/melee/energy/wizard - name = "rune sword" - desc = "A large sword engraved with arcane markings, it seems to reverberate with unearthly powers." - icon = 'icons/obj/sword.dmi' - icon_state = "runesword0" - item_state = "runesword0" - contained_sprite = TRUE - active_force = 40 - active_throwforce = 40 - active_w_class = ITEMSIZE_HUGE - force = 20 - throwforce = 30 - throw_speed = 5 - throw_range = 10 - w_class = ITEMSIZE_HUGE - slot_flags = SLOT_BELT - origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 8) - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - hitsound = 'sound/weapons/bladeslice.ogg' - sharp = 1 - edge = TRUE - base_reflectchance = 60 - base_block_chance = 60 - can_block_bullets = 1 - shield_power = 150 - -/obj/item/melee/energy/wizard/activate(mob/living/user) - ..() - icon_state = "runesword1" - item_state = "runesword1" - to_chat(user, "\The [src] surges to life!.") - -/obj/item/melee/energy/wizard/deactivate(mob/living/user) - ..() - icon_state = "runesword0" - item_state = "runesword0" - to_chat(user, "\The [src] slowly dies out.") - -/obj/item/melee/energy/wizard/attack(mob/living/M, mob/living/user, var/target_zone) - if(user.is_wizard()) - return ..() - - var/zone = (user.hand ? BP_L_ARM:BP_R_ARM) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/affecting = H.get_organ(zone) - to_chat(user, "The sword refuses you as its true wielder, slashing your [affecting.name] instead!") - - user.apply_damage(active_force, BRUTE, zone, 0, damage_flags = DAM_SHARP|DAM_EDGE) - - user.drop_from_inventory(src) - - return 1 diff --git a/code/modules/spell_system/artifacts/items/scrying_orb.dm b/code/modules/spell_system/artifacts/items/scrying_orb.dm deleted file mode 100644 index 3c6d7270512..00000000000 --- a/code/modules/spell_system/artifacts/items/scrying_orb.dm +++ /dev/null @@ -1,42 +0,0 @@ -/obj/item/scrying - name = "scrying orb" - desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means." - icon = 'icons/obj/projectiles.dmi' - icon_state = "bluespace" - throw_speed = 3 - throw_range = 7 - throwforce = 10 - damtype = BURN - force = 10 - hitsound = 'sound/items/welder_pry.ogg' - -/obj/item/scrying/attack_self(mob/living/user as mob) - if(!user.is_wizard()) - if(istype(user, /mob/living/carbon/human)) - //Save the users active hand - var/mob/living/carbon/human/H = user - var/obj/item/organ/E = H.get_eyes(no_synthetic = TRUE) - if (!E) - to_chat(user, "You stare deep into the abyss... and nothing happens. What a letdown.") - return - - to_chat(user, "You stare deep into the abyss... and the abyss stares back.") - sleep(10) - to_chat(user, "Your [E.name] fill with painful light, and you feel a sharp burning sensation in your head!") - user.custom_emote(AUDIBLE_MESSAGE, "screams in horror!") - playsound(user, 'sound/hallucinations/far_noise.ogg', 40, 1) - user.drop_item() - user.visible_message("Ashes pour out of [user]'s eye sockets!") - new /obj/effect/decal/cleanable/ash(get_turf(user)) - E.removed(user) - qdel(E) - H.adjustBrainLoss(50, 55) - H.hallucination += 20 - return - else - to_chat(user, "You can see... everything!") - visible_message("[user] stares into [src], their eyes glazing over.") - - user.teleop = user.ghostize(1) - announce_ghost_joinleave(user.teleop, 1, "You feel that they used a powerful artifact to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place with their presence.") - return diff --git a/code/modules/spell_system/artifacts/storage/closets/artifact_closet.dm b/code/modules/spell_system/artifacts/storage/closets/artifact_closet.dm deleted file mode 100644 index d7979d82876..00000000000 --- a/code/modules/spell_system/artifacts/storage/closets/artifact_closet.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/structure/closet/wizard - name = "artifact closet" - desc = "a special lead lined closet used to hold artifacts of immense power." - icon = 'icons/obj/closet.dmi' - icon_state = "acloset" - icon_closed = "acloset" - icon_opened = "aclosetopen" - -/obj/structure/closet/wizard/Initialize() - . = ..() - var/obj/structure/bigDelivery/package = new /obj/structure/bigDelivery(get_turf(src)) - package.wrapped = src - package.examtext = "Imported straight from the Wizard Academy. Do not lose the contents or suffer a demerit." - src.forceMove(package) - package.update_icon() \ No newline at end of file diff --git a/code/modules/spell_system/artifacts/storage/closets/scrying_S.dm b/code/modules/spell_system/artifacts/storage/closets/scrying_S.dm deleted file mode 100644 index 0e077227956..00000000000 --- a/code/modules/spell_system/artifacts/storage/closets/scrying_S.dm +++ /dev/null @@ -1,8 +0,0 @@ -/obj/structure/closet/wizard/scrying - name = "scrying orb" - desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision." - -/obj/structure/closet/wizard/scrying/fill() - ..() - new /obj/item/scrying(src) - new /obj/item/contract/wizard/xray(src) \ No newline at end of file diff --git a/code/modules/spell_system/artifacts/storage/closets/soul_shards_S.dm b/code/modules/spell_system/artifacts/storage/closets/soul_shards_S.dm deleted file mode 100644 index d469e1fd302..00000000000 --- a/code/modules/spell_system/artifacts/storage/closets/soul_shards_S.dm +++ /dev/null @@ -1,8 +0,0 @@ -/obj/structure/closet/wizard/souls - name = "soul shard belt" - desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot. This also includes the spell Artificer, used to create the shells used in construct creation." - -/obj/structure/closet/wizard/souls/fill() - ..() - new /obj/item/contract/boon/wizard/artificer(src) - new /obj/item/storage/belt/soulstone/full(src) \ No newline at end of file diff --git a/code/modules/spell_system/artifacts/storage/closets/wizard_voidsuit_S.dm b/code/modules/spell_system/artifacts/storage/closets/wizard_voidsuit_S.dm deleted file mode 100644 index 5c644acc1d3..00000000000 --- a/code/modules/spell_system/artifacts/storage/closets/wizard_voidsuit_S.dm +++ /dev/null @@ -1,8 +0,0 @@ -/obj/structure/closet/wizard/armor - name = "mastercrafted armor set" - desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." - -/obj/structure/closet/wizard/armor/fill() - ..() - new /obj/item/clothing/suit/space/void/wizard(src) - new /obj/item/clothing/head/helmet/space/void/wizard(src) \ No newline at end of file diff --git a/code/modules/spell_system/contracts/acadamy/acadamy_contracts.dm b/code/modules/spell_system/contracts/acadamy/acadamy_contracts.dm deleted file mode 100644 index a37ea95a4bb..00000000000 --- a/code/modules/spell_system/contracts/acadamy/acadamy_contracts.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/contract/wizard //contracts that involve making a deal with the Wizard Acadamy (or NON PLAYERS) - contract_master = "\improper Wizard Academy" \ No newline at end of file diff --git a/code/modules/spell_system/contracts/acadamy/xray_vision.dm b/code/modules/spell_system/contracts/acadamy/xray_vision.dm deleted file mode 100644 index 7df2385ec9e..00000000000 --- a/code/modules/spell_system/contracts/acadamy/xray_vision.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/contract/wizard/xray - name = "xray vision contract" - desc = "This contract is almost see-through..." - color = "#339900" - -/obj/item/contract/wizard/xray/contract_effect(mob/user as mob) - ..() - if (!(XRAY in user.mutations)) - user.mutations.Add(XRAY) - user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) - user.see_in_dark = 8 - user.see_invisible = SEE_INVISIBLE_LEVEL_TWO - to_chat(user, "The walls suddenly disappear.") - return 1 - return 0 \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/artificer.dm b/code/modules/spell_system/contracts/boon/artificer.dm deleted file mode 100644 index 3ac47b5308c..00000000000 --- a/code/modules/spell_system/contracts/boon/artificer.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/contract/boon/wizard/artificer - name = "artificer contract" - path = /spell/aoe_turf/conjure/construct - desc = "This contract has a passage dedicated to an entity known as 'Nar-Sie'" \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/boon_contracts.dm b/code/modules/spell_system/contracts/boon/boon_contracts.dm deleted file mode 100644 index 304a5b15eb3..00000000000 --- a/code/modules/spell_system/contracts/boon/boon_contracts.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/item/contract/boon - name = "boon contract" - desc = "this contract grants you a boon for signing it." - var/path - -/obj/item/contract/boon/New(var/newloc, var/new_path) - ..(newloc) - if(new_path) - path = new_path - var/item_name = "" - if(ispath(path,/obj)) - var/obj/O = path - item_name = initial(O.name) - else if(ispath(path,/spell)) - var/spell/S = path - item_name = initial(S.name) - name = "[item_name] contract" - -/obj/item/contract/boon/contract_effect(mob/user as mob) - ..() - if(ispath(path,/spell)) - user.add_spell(new path) - return 1 - else if(ispath(path,/obj)) - new path(get_turf(user.loc)) - playsound(get_turf(usr),'sound/effects/phasein.ogg',50,1) - return 1 - -/obj/item/contract/boon/wizard - contract_master = "\improper Wizard Academy" \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/charge.dm b/code/modules/spell_system/contracts/boon/charge.dm deleted file mode 100644 index 6fe93a4b274..00000000000 --- a/code/modules/spell_system/contracts/boon/charge.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/contract/boon/wizard/charge - name = "charge contract" - path = /spell/aoe_turf/charge - desc = "This contract is made of 100% post-consumer wizard." \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/fireball.dm b/code/modules/spell_system/contracts/boon/fireball.dm deleted file mode 100644 index b405c021fbe..00000000000 --- a/code/modules/spell_system/contracts/boon/fireball.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/contract/boon/wizard/fireball - name = "fireball contract" - path = /spell/targeted/projectile/dumbfire/fireball - desc = "This contract feels warm to the touch." \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/force_wall.dm b/code/modules/spell_system/contracts/boon/force_wall.dm deleted file mode 100644 index 9b09c2989d7..00000000000 --- a/code/modules/spell_system/contracts/boon/force_wall.dm +++ /dev/null @@ -1,5 +0,0 @@ -/obj/item/contract/boon/wizard/forcewall - name = "forcewall contract" - path = /spell/aoe_turf/conjure/forcewall - contract_master = "\improper Mime Federation" - desc = "This contract has a dedication to mimes everywhere at the top." \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/gestalt.dm b/code/modules/spell_system/contracts/boon/gestalt.dm deleted file mode 100644 index fe2716dc18c..00000000000 --- a/code/modules/spell_system/contracts/boon/gestalt.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/contract/boon/wizard/gestalt - name = "conjure gestalt contract" - path = /spell/aoe_turf/conjure/grove/gestalt - desc = "This contract is a druid's favorite." \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/knock.dm b/code/modules/spell_system/contracts/boon/knock.dm deleted file mode 100644 index b130aae802e..00000000000 --- a/code/modules/spell_system/contracts/boon/knock.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/contract/boon/wizard/knock - name = "knock contract" - path = /spell/aoe_turf/knock - desc = "This contract is hard to hold still." \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/mindswap.dm b/code/modules/spell_system/contracts/boon/mindswap.dm deleted file mode 100644 index a2f985ce08e..00000000000 --- a/code/modules/spell_system/contracts/boon/mindswap.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/contract/boon/wizard/mindswap - name = "mindswap contract" - path = /spell/targeted/mind_transfer - desc = "This contract looks ragged and torn." \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/smoke.dm b/code/modules/spell_system/contracts/boon/smoke.dm deleted file mode 100644 index d3cda8dc7cb..00000000000 --- a/code/modules/spell_system/contracts/boon/smoke.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/contract/boon/wizard/smoke - name = "smoke contract" - path = /spell/aoe_turf/smoke - desc = "This contract smells as dank as they come." \ No newline at end of file diff --git a/code/modules/spell_system/contracts/boon/statue.dm b/code/modules/spell_system/contracts/boon/statue.dm deleted file mode 100644 index 4a33f7d16d0..00000000000 --- a/code/modules/spell_system/contracts/boon/statue.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/contract/boon/wizard/statue - name = "flesh to stone contract" - path = /spell/targeted/flesh_to_stone - desc = "This contract is truly petrifying." \ No newline at end of file diff --git a/code/modules/spell_system/contracts/contracts.dm b/code/modules/spell_system/contracts/contracts.dm deleted file mode 100644 index 4e0fb70ad9b..00000000000 --- a/code/modules/spell_system/contracts/contracts.dm +++ /dev/null @@ -1,41 +0,0 @@ -/obj/item/contract - name = "contract" - desc = "written in the blood of some unfortunate fellow." - icon = 'icons/mob/screen/spells.dmi' - icon_state = "master_open" - - var/contract_master = null - var/list/contract_spells = list(/spell/contract/reward,/spell/contract/punish,/spell/contract/return_master) - -/obj/item/contract/attack_self(mob/user as mob) - if(contract_master == null) - to_chat(user, "You bind the contract to your soul, making you the recipient of whatever poor fool's soul that decides to contract with you.") - contract_master = user - return - - if(contract_master == user) - to_chat(user, "You can't contract with yourself!") - return - - if(iscultist(user)) - to_chat(user, "Your soul already belongs to other powers!") - return - - var/ans = alert(user,"The contract clearly states that signing this contract will bind your soul to \the [contract_master]. Are you sure you want to continue?","[src]","Yes","No") - - if(ans == "Yes") - user.visible_message("\The [user] signs the contract, their body glowing a deep yellow.") - if(!src.contract_effect(user)) - user.visible_message("\The [src] visibly rejects \the [user], erasing their signature from the line.") - return - user.visible_message("\The [src] disappears with a flash of light.") - if(contract_spells.len && istype(contract_master,/mob/living)) //if it aint text its probably a mob or another user - var/mob/living/M = contract_master - for(var/spell_type in contract_spells) - M.add_spell(new spell_type(user), "const_spell_ready") - log_and_message_admins("signed their soul over to \the [contract_master] using \the [src].", user) - qdel(src) - -/obj/item/contract/proc/contract_effect(mob/user as mob) - to_chat(user, "You've signed your soul over to \the [contract_master] and with that your unbreakable vow of servitude begins.") - return 1 \ No newline at end of file diff --git a/code/modules/spell_system/contracts/wizard/apprentice.dm b/code/modules/spell_system/contracts/wizard/apprentice.dm deleted file mode 100644 index a2e7f1686ca..00000000000 --- a/code/modules/spell_system/contracts/wizard/apprentice.dm +++ /dev/null @@ -1,24 +0,0 @@ -/obj/item/contract/apprentice - name = "apprentice wizarding contract" - desc = "A wizarding school contract for those who want to sign their soul for a piece of the magic pie." - color = "#993300" - var/list/additional_spells = list() - -/obj/item/contract/apprentice/contract_effect(mob/user) - if(user.mind.assigned_role == "Apprentice") - to_chat(user, SPAN_WARNING("You are already a wizarding apprentice!")) - return FALSE - if(wizards.add_antagonist_mind(user.mind, TRUE, "Apprentice", "You are an apprentice! Your job is to learn the wizarding arts!")) - user.mind.assigned_role = "Apprentice" - to_chat(user, SPAN_NOTICE("With the signing of this paper you agree to become \the [contract_master]'s apprentice in the art of wizardry.")) - user.faction = "Space Wizard" - wizards.add_antagonist_mind(user.mind, TRUE) - var/obj/item/spellbook/student/S = new /obj/item/spellbook/student(get_turf(user)) - for(var/additional_spell in additional_spells) - S.spellbook.spells[additional_spell] = additional_spells[additional_spell] - user.put_in_hands(S) - user.add_spell(new /spell/noclothes) - if(contract_master) - user.add_spell(new /spell/contract/return_master(contract_master), "const_spell_ready") - return TRUE - return FALSE \ No newline at end of file diff --git a/code/modules/spell_system/spellbook/spellbook.dm b/code/modules/spell_system/spellbook/spellbook.dm deleted file mode 100644 index 1f07823f581..00000000000 --- a/code/modules/spell_system/spellbook/spellbook.dm +++ /dev/null @@ -1,256 +0,0 @@ -#define LOCKED 2 -#define CAN_MAKE_CONTRACTS 4 - -var/list/artefact_feedback = list(/obj/structure/closet/wizard/armor = "HS", - /obj/item/gun/energy/staff/focus = "MF", - /obj/item/monster_manual = "MA", - /obj/item/contract/apprentice = "CP", - /obj/item/apprentice_pebble = "AP", - /obj/structure/closet/wizard/souls = "SS", - /obj/structure/closet/wizard/scrying = "SO", - /obj/item/teleportation_scroll = "TS", - /obj/item/gun/energy/staff = "ST", - /obj/item/gun/energy/staff/animate = "SA", - /obj/item/melee/energy/wizard = "WS", - /obj/item/gun/energy/staff/chaos = "SC", - /obj/item/storage/belt/wands/full = "WB") - -/obj/item/spellbook - name = "master spell book" - desc = "The legendary book of spells of the wizard." - icon = 'icons/obj/wizard.dmi' - icon_state = "spellbook" - throw_speed = 1 - throw_range = 5 - w_class = ITEMSIZE_SMALL - slot_flags = SLOT_BELT - var/uses = 1 - var/temp = null - var/datum/spellbook/spellbook - var/spellbook_type = /datum/spellbook //for spawning specific spellbooks. - -/obj/item/spellbook/Initialize() - . = ..() - set_spellbook(spellbook_type) - -/obj/item/spellbook/proc/set_spellbook(var/type) - if(spellbook) - qdel(spellbook) - spellbook = new type() - uses = spellbook.max_uses - name = spellbook.name - desc = spellbook.desc - -/obj/item/spellbook/attack_self(mob/user as mob) - if(!user) - return - if(!(user.faction == "Space Wizard")) - if(istype(user, /mob/living/carbon/human)) - //Save the users active hand - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/LA = H.get_organ(BP_L_ARM) - var/obj/item/organ/external/RA = H.get_organ(BP_R_ARM) - var/active_hand = H.hand - to_chat(user, "You feel unimaginable agony as your eyes pour over millenia of forbidden knowledge!") - user.show_message("[user] screams in horror!",2) - H.ChangeToHusk() - H.adjust_fire_stacks(0, H.fire_stacks) - H.IgniteMob(2) - H.updatehealth() - user.drop_item() - playsound(user, 'sound/hallucinations/i_see_you2.ogg', 100, 1) - if(active_hand) - LA.droplimb(0,DROPLIMB_BURN) - else - RA.droplimb(0,DROPLIMB_BURN) - return - else - interact(user) - -/obj/item/spellbook/interact(mob/user as mob) - var/dat = null - if(temp) - dat = "[temp]
    Return" - else - dat = "

    [spellbook.title]

    [spellbook.title_desc]
    You have [uses] spell slot[uses > 1 ? "s" : ""] left.

    " - dat += "
    Requires Wizard Garb
    Selectable Target
    Spell Charge Type: Recharge, Sacrifice, Charges

    " - for(var/i in 1 to spellbook.spells.len) - var/name = "" //name of target - var/desc = "" //description of target - var/info = "" //additional information - dat += "
    " - if(ispath(spellbook.spells[i],/datum/spellbook)) - var/datum/spellbook/S = spellbook.spells[i] - name = html_decode(capitalize_first_letters(initial(S.name))) - desc = initial(S.book_desc) - info = "[initial(S.max_uses)] Spell Slots" - else if(ispath(spellbook.spells[i],/obj)) - var/obj/O = spellbook.spells[i] - name = "Artefact: [capitalize_first_letters(initial(O.name))]" //because 99.99% of objects dont have capitals in them and it makes it look weird. - desc = initial(O.desc) - else if(ispath(spellbook.spells[i],/spell)) - var/spell/S = spellbook.spells[i] - name = initial(S.name) - desc = initial(S.desc) - var/testing = initial(S.spell_flags) - if(testing & NEEDSCLOTHES) - info = "W" - var/type = "" - switch(initial(S.charge_type)) - if(Sp_RECHARGE) - type = "R" - if(Sp_HOLDVAR) - type = "S" - if(Sp_CHARGES) - type = "C" - info += "[type]" - dat += "[name]" - if(length(info)) - dat += " ([info])" - dat += " ([spellbook.spells[spellbook.spells[i]]] spell slot[spellbook.spells[spellbook.spells[i]] > 1 ? "s" : "" ])" - if(spellbook.book_flags & CAN_MAKE_CONTRACTS) - dat += " Make Contract" - dat += "
    [desc]
    " - dat += "
    " - dat += "
    Re-memorize your spellbook.
    " - dat += "
    [spellbook.book_flags & LOCKED ? "Unlock" : "Lock"] the spellbook.
    " - - var/datum/browser/spellbook_win = new(user, "spellbook", spellbook.title) - spellbook_win.set_content(dat) - spellbook_win.add_stylesheet("spellbook", 'html/browser/spellbook.css') - spellbook_win.open() - -/obj/item/spellbook/Topic(href,href_list) - ..() - - var/mob/living/carbon/human/H = usr - - if(H.stat || H.restrained()) - return - - if(!istype(H)) - return - - if(H.mind && spellbook.book_flags & LOCKED && H.mind.special_role == "apprentice") //make sure no scrubs get behind the lock - return - - if(!H.contents.Find(src)) - H << browse(null,"window=spellbook") - return - - if(href_list["lock"]) - if(spellbook.book_flags & LOCKED) - spellbook.book_flags &= ~LOCKED - else - spellbook.book_flags |= LOCKED - - if(href_list["temp"]) - temp = null - - if(href_list["path"]) - var/path = text2path(href_list["path"]) - if(uses < spellbook.spells[path]) - to_chat(usr, "You do not have enough spell slots to purchase this.") - return - uses -= spellbook.spells[path] - send_feedback(path) //feedback stuff - if(ispath(path,/datum/spellbook)) - src.set_spellbook(path) - temp = "You have chosen a new spellbook." - else - if(href_list["contract"]) - if(!(spellbook.book_flags & CAN_MAKE_CONTRACTS)) - return //no - spellbook.max_uses -= spellbook.spells[path] //no basksies - var/obj/O = new /obj/item/contract/boon(get_turf(usr),path) - temp = "You have purchased \the [O]." - else - if(ispath(path,/spell)) - temp = src.add_spell(usr,path) - else if(ispath(path, /obj/item/contract/apprentice)) - var/obj/item/contract/apprentice/A = new path(get_turf(usr)) - A.contract_master = usr - A.additional_spells = spellbook.apprentice_spells - temp = "You have purchased \a [A]." - spellbook.max_uses -= spellbook.spells[path] - playsound(get_turf(usr),'sound/effects/phasein.ogg',50,1) - usr.put_in_hands(A) - else if(ispath(path, /obj/item/apprentice_pebble)) - var/obj/item/apprentice_pebble/A = new path(get_turf(usr)) - A.contract.additional_spells = spellbook.apprentice_spells - A.contract.contract_master = usr - temp = "You have purchased \a [A]." - spellbook.max_uses -= spellbook.spells[path] - playsound(get_turf(usr),'sound/effects/phasein.ogg',50,1) - usr.put_in_hands(A) - else - var/obj/O = new path(get_turf(usr)) - usr.put_in_hands(O) - temp = "You have purchased \a [O]." - spellbook.max_uses -= spellbook.spells[path] - //finally give it a bit of an oomf - playsound(get_turf(usr),'sound/effects/phasein.ogg',50,1) - if(href_list["reset"]) - var/area/antag/wizard/A = locate() - if(usr in A.contents) - uses = spellbook.max_uses - H.spellremove() - temp = "All spells have been removed. You may now memorize a new set of spells." - feedback_add_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - else - to_chat(usr, "You must be in the wizard academy to re-memorize your spells.") - - src.interact(usr) - - -/obj/item/spellbook/proc/send_feedback(var/path) - if(ispath(path,/datum/spellbook)) - var/datum/spellbook/S = path - feedback_add_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path,/spell)) - var/spell/S = path - feedback_add_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path,/obj)) - feedback_add_details("wizard_spell_learned","[artefact_feedback[path]]") - - -/obj/item/spellbook/proc/add_spell(var/mob/user, var/spell_path) - for(var/spell/S in user.spell_list) - if(istype(S,spell_path)) - if(!S.can_improve()) - uses += spellbook.spells[spell_path] - return "You cannot improve the spell [S] further." - if(S.can_improve(Sp_SPEED) && S.can_improve(Sp_POWER)) - switch(alert(user, "Do you want to upgrade this spell's speed or power?", "Spell upgrade", "Speed", "Power", "Cancel")) - if("Speed") - return S.quicken_spell() - if("Power") - return S.empower_spell() - else - uses += spellbook.spells[spell_path] - return - else if(S.can_improve(Sp_POWER)) - return S.empower_spell() - else if(S.can_improve(Sp_SPEED)) - return S.quicken_spell() - - var/spell/S = new spell_path() - user.add_spell(S) - return "You learn the spell [S]" - -/datum/spellbook - var/name = "book of tomes" - var/desc = "The legendary book of spells of the wizard." - var/book_desc = "Holds information on the various tomes available to a wizard" - var/feedback = "" //doesn't need one. - var/book_flags = 0 - var/max_uses = 1 - var/title = "Book of Tomes" - var/title_desc = "This tome marks down all the available tomes for use. Choose wisely, there are no refunds." - var/list/spells = list(/datum/spellbook/standard = 1, - /datum/spellbook/cleric = 1, - /datum/spellbook/battlemage = 1, - /datum/spellbook/druid = 1, - /datum/spellbook/necromancer = 1 - ) //spell's path = cost of spell - var/list/apprentice_spells = list() // extra spells that apprentices get, based on their master's book \ No newline at end of file diff --git a/code/modules/spell_system/spellbook/variants/battlemage.dm b/code/modules/spell_system/spellbook/variants/battlemage.dm deleted file mode 100644 index 2f34dc94184..00000000000 --- a/code/modules/spell_system/spellbook/variants/battlemage.dm +++ /dev/null @@ -1,43 +0,0 @@ -/obj/item/spellbook/battlemage - spellbook_type = /datum/spellbook/battlemage - - -/datum/spellbook/battlemage - name = "battlemage's bible" - feedback = "BM" - desc = "A treatise on the use of magic in combat situation." - book_desc = "Mix physical with the mystical in head to head combat." - title = "The Art of Magical Combat" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS - max_uses = 12 - - spells = list(/spell/targeted/equip_item/shield = 1, - /spell/targeted/projectile/dumbfire/fireball = 1, - /spell/targeted/projectile/magic_missile = 1, - /spell/targeted/torment = 1, - /spell/targeted/heal_target = 2, - /spell/targeted/genetic/mutate = 1, - /spell/targeted/projectile/dumbfire/stuncuff = 2, - /spell/aoe_turf/conjure/mirage = 1, - /spell/targeted/shapeshift/corrupt_form = 1, - /spell/targeted/flesh_to_stone = 1, - /spell/radiant_aura = 1, - /spell/noclothes = 1, - /obj/structure/closet/wizard/armor = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/gun/energy/staff/chaos = 1, - /obj/item/storage/belt/wands/full = 2, - /obj/item/melee/energy/wizard = 2, - /obj/item/monster_manual = 2, - /obj/item/contract/apprentice = 1, - /obj/item/apprentice_pebble = 2 - ) - - apprentice_spells = list( - /spell/targeted/equip_item/shield = 1, - /spell/targeted/torment = 1, - /spell/targeted/heal_target = 2, - /spell/targeted/shapeshift/corrupt_form = 1, - /obj/item/melee/energy/wizard = 2 - ) \ No newline at end of file diff --git a/code/modules/spell_system/spellbook/variants/cleric.dm b/code/modules/spell_system/spellbook/variants/cleric.dm deleted file mode 100644 index 371411d3c50..00000000000 --- a/code/modules/spell_system/spellbook/variants/cleric.dm +++ /dev/null @@ -1,45 +0,0 @@ -/obj/item/spellbook/cleric - spellbook_type = /datum/spellbook/cleric - -/datum/spellbook/cleric - name = "cleric's tome" - feedback = "CR" - desc = "For those who do not harm, or at least feel sorry about it." - book_desc = "All about healing and control. Mobility and offense comes at a higher price but not impossible." - title = "Cleric's Tome of Healing" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS - max_uses = 12 - - spells = list(/spell/targeted/heal_target = 1, - /spell/targeted/heal_target/major = 1, - /spell/targeted/heal_target/area = 1, - /spell/targeted/heal_target/sacrifice = 1, - /spell/targeted/resurrection = 2, - /spell/targeted/mend = 1, - /spell/targeted/genetic/blind = 1, - /spell/targeted/shapeshift/baleful_polymorph = 1, - /spell/targeted/flesh_to_stone = 1, - /spell/targeted/projectile/dumbfire/stuncuff = 1, - /spell/aoe_turf/knock = 1, - /spell/targeted/equip_item/holy_relic = 1, - /spell/aoe_turf/conjure/grove/sanctuary = 1, - /spell/radiant_aura = 1, - /spell/targeted/projectile/dumbfire/fireball = 2, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/targeted/subjugation = 1, - /spell/targeted/mindcontrol = 2, - /obj/item/gun/energy/staff/focus = 2, - /obj/item/storage/belt/wands/full = 2, - /obj/item/poppet = 1, - /obj/item/contract/apprentice = 1, - /obj/item/apprentice_pebble = 2 - ) - - apprentice_spells = list( - /spell/targeted/heal_target = 1, - /spell/targeted/heal_target/area = 1, - /spell/targeted/resurrection = 2, - /spell/targeted/genetic/blind = 1, - /spell/radiant_aura = 1 - ) \ No newline at end of file diff --git a/code/modules/spell_system/spellbook/variants/druid.dm b/code/modules/spell_system/spellbook/variants/druid.dm deleted file mode 100644 index baa010e83b0..00000000000 --- a/code/modules/spell_system/spellbook/variants/druid.dm +++ /dev/null @@ -1,42 +0,0 @@ -/obj/item/spellbook/druid - spellbook_type = /datum/spellbook/druid - -/datum/spellbook/druid - name = "druid's leaflet" - feedback = "DL" - desc = "It smells like an air freshener." - book_desc = "Summons, nature, and a bit o' healin." - title = "Druidic Guide on how to be smug about nature" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS - max_uses = 12 - - spells = list(/spell/targeted/heal_target = 1, - /spell/targeted/heal_target/sacrifice = 1, - /spell/aoe_turf/conjure/mirage = 1, - /spell/aoe_turf/conjure/summon/bats = 1, - /spell/aoe_turf/conjure/summon/bear = 1, - /spell/targeted/mend = 1, - /spell/targeted/equip_item/party_hardy = 1, - /spell/targeted/equip_item/seed = 1, - /spell/aoe_turf/disable_tech = 1, - /spell/targeted/entangle = 1, - /spell/targeted/flesh_to_stone = 1, - /spell/aoe_turf/conjure/grove/sanctuary = 1, - /spell/aoe_turf/knock = 1, - /spell/targeted/shapeshift/baleful_polymorph = 1, - /spell/targeted/flesh_to_stone = 1, - /spell/aoe_turf/conjure/golem = 1, - /obj/structure/closet/wizard/souls = 1, - /obj/item/monster_manual = 1, - /obj/item/poppet = 1, - /obj/item/contract/apprentice = 1, - /obj/item/apprentice_pebble = 2 - ) - - apprentice_spells = list( - /spell/targeted/heal_target = 1, - /spell/targeted/heal_target/sacrifice = 1, - /spell/aoe_turf/conjure/grove/sanctuary = 1, - /obj/item/poppet = 1 - ) \ No newline at end of file diff --git a/code/modules/spell_system/spellbook/variants/necromancer.dm b/code/modules/spell_system/spellbook/variants/necromancer.dm deleted file mode 100644 index ba9306a0f69..00000000000 --- a/code/modules/spell_system/spellbook/variants/necromancer.dm +++ /dev/null @@ -1,37 +0,0 @@ -/obj/item/spellbook/necromancer - spellbook_type = /datum/spellbook/necromancer - - -/datum/spellbook/necromancer - name = "necromancer's grimoire" - feedback = "NG" - desc = "A grimoire full of spells dealing with the death and the afterlife." - book_desc = "A spellbook full of dark magic dealing mostly with the afterlife." - title = "The Art of Necromancy" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS - max_uses = 10 - - spells = list(/spell/targeted/projectile/dumbfire/fireball = 1, - /spell/targeted/torment = 1, - /spell/targeted/subjugation = 1, - /spell/aoe_turf/conjure/mirage = 1, - /spell/aoe_turf/conjure/summon/bats = 1, - /spell/targeted/shapeshift/corrupt_form = 1, - /spell/targeted/life_steal = 1, - /spell/targeted/raise_dead = 2, - /spell/shadow_shroud = 1, - /spell/noclothes = 1, - /obj/structure/closet/wizard/armor = 1, - /obj/structure/closet/wizard/scrying = 2, - /obj/structure/closet/wizard/souls = 1, - /obj/item/contract/apprentice = 1, - /obj/item/apprentice_pebble = 2 - ) - - apprentice_spells = list( - /spell/aoe_turf/conjure/summon/bats = 1, - /spell/targeted/shapeshift/corrupt_form = 1, - /spell/targeted/raise_dead = 2, - /obj/structure/closet/wizard/souls = 1 - ) \ No newline at end of file diff --git a/code/modules/spell_system/spellbook/variants/spatial.dm b/code/modules/spell_system/spellbook/variants/spatial.dm deleted file mode 100644 index a258ea0605b..00000000000 --- a/code/modules/spell_system/spellbook/variants/spatial.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/item/spellbook/spatial - spellbook_type = /datum/spellbook/spatial - -/datum/spellbook/spatial - name = "spatial manual" - feedback = "SP" - desc = "You feel like this might disappear from out of under you." - book_desc = "Movement and teleportation. Run from your problems!" - title = "Manual of Spatial Transportation" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS - max_uses = 10 - - spells = list(/spell/targeted/ethereal_jaunt = 1, - /spell/aoe_turf/blink = 1, - /spell/area_teleport = 1, - /spell/targeted/projectile/dumbfire/passage = 1, - /spell/mark_recall = 1, - /spell/targeted/swap = 1, - /spell/targeted/projectile/magic_missile = 2, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/targeted/subjugation = 1, - /spell/aoe_turf/smoke = 1, - /spell/aoe_turf/conjure/summon/bats = 3, - /obj/structure/closet/wizard/scrying = 2, - /obj/item/storage/belt/wands/full = 4, - /obj/item/teleportation_scroll = 1, - /obj/item/contract/apprentice = 1, - /obj/item/apprentice_pebble = 2 - ) diff --git a/code/modules/spell_system/spellbook/variants/standard.dm b/code/modules/spell_system/spellbook/variants/standard.dm deleted file mode 100644 index 242e5832a3d..00000000000 --- a/code/modules/spell_system/spellbook/variants/standard.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/item/spellbook/standard - spellbook_type = /datum/spellbook/standard - -/datum/spellbook/standard - name = "standard spellbook" - feedback = "SB" - title = "Book of Spells and Artefacts" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_desc = "A general wizard's spellbook. All its spells are easy to use but hard to master." - book_flags = CAN_MAKE_CONTRACTS - max_uses = 12 - - spells = list(/spell/targeted/projectile/magic_missile = 1, - /spell/targeted/projectile/dumbfire/fireball = 1, - /spell/aoe_turf/disable_tech = 1, - /spell/aoe_turf/smoke = 1, - /spell/targeted/genetic/blind = 1, - /spell/targeted/subjugation = 1, - /spell/targeted/mindcontrol = 2, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/targeted/genetic/mutate = 1, - /spell/aoe_turf/knock = 1, - /spell/noclothes = 2, - /obj/item/gun/energy/staff = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/structure/closet/wizard/souls = 1, - /obj/structure/closet/wizard/armor = 1, - /obj/item/gun/energy/staff/animate = 1, - /obj/structure/closet/wizard/scrying = 1, - /obj/item/monster_manual = 2, - /obj/item/contract/apprentice = 1, - /obj/item/apprentice_pebble = 2 - ) - - apprentice_spells = list( - /spell/targeted/projectile/dumbfire/fireball = 1, - /spell/aoe_turf/smoke = 1, - /spell/targeted/mindcontrol = 2, - /obj/structure/closet/wizard/scrying = 1 - ) diff --git a/code/modules/spell_system/spellbook/variants/student.dm b/code/modules/spell_system/spellbook/variants/student.dm deleted file mode 100644 index 34d564eb997..00000000000 --- a/code/modules/spell_system/spellbook/variants/student.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/item/spellbook/student - spellbook_type = /datum/spellbook/student - -/obj/item/spellbook/student/attack_self(mob/living/user as mob) - if(user.is_wizard(TRUE)) - to_chat(user, "This books is written for students, not for a true wizard like yourself!") - return - - ..() - -/datum/spellbook/student - name = "student's spellbook" - feedback = "ST" - desc = "This spell book has a sticker on it that says, 'certified for children 5 and older'." - book_desc = "This spellbook is dedicated to teaching neophytes in the ways of magic." - title = "Book of Spells and Education" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = 0 - max_uses = 8 - - spells = list(/spell/targeted/mend = 1, - /spell/aoe_turf/knock = 1, - /spell/targeted/projectile/magic_missile = 1, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/shadow_shroud = 1, - /spell/aoe_turf/disable_tech = 1, - /spell/targeted/entangle = 1, - /spell/aoe_turf/knock = 1, - /obj/structure/closet/wizard/armor = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/storage/belt/wands/full = 2, - /obj/item/monster_manual = 2, - /obj/item/contract/wizard/xray = 1 - ) diff --git a/code/modules/spell_system/spells/hand/hand.dm b/code/modules/spell_system/spells/hand/hand.dm deleted file mode 100644 index 2188bdbc808..00000000000 --- a/code/modules/spell_system/spells/hand/hand.dm +++ /dev/null @@ -1,33 +0,0 @@ -/spell/hand - var/min_range = 0 - var/list/compatible_targets = list() - var/casts = 1 - var/spell_delay = 5 - var/move_delay - var/click_delay - var/hand_state = "magic" - -/spell/hand/choose_targets(mob/user = usr) - return list(user) - -/spell/hand/cast(list/targets, mob/user) - for(var/mob/M in targets) - if(M.get_active_hand()) - to_chat(user, "You need an empty hand to cast this spell.") - return - var/obj/item/magic_hand/H = new(src) - if(!M.put_in_active_hand(H)) - qdel(H) - return - to_chat(user, "You ready the [name] spell ([casts]/[casts] charges).") - -/spell/hand/proc/valid_target(var/atom/a,var/mob/user) //we use seperate procs for our target checking for the hand spells. - var/distance = get_dist(a,user) - if((min_range && distance < min_range) || (range && distance > range)) - return 0 - if(!is_type_in_list(a,compatible_targets)) - return 0 - return 1 - -/spell/hand/proc/cast_hand(var/atom/a,var/mob/user) //same for casting. - return 1 diff --git a/code/modules/spell_system/spells/hand/hand_item.dm b/code/modules/spell_system/spells/hand/hand_item.dm deleted file mode 100644 index e78c6966114..00000000000 --- a/code/modules/spell_system/spells/hand/hand_item.dm +++ /dev/null @@ -1,56 +0,0 @@ -/*much like grab this item is used primarily for the utility it provides. -Basically: I can use it to target things where I click. I can then pass these targets to a spell and target things not using a list. -*/ - -/obj/item/magic_hand - name = "Magic Hand" - icon = 'icons/mob/screen/generic.dmi' - flags = 0 - abstract = 1 - w_class = ITEMSIZE_HUGE - icon_state = "grabbed1" - var/next_spell_time = 0 - var/spell/hand/hand_spell - var/casts = 0 - -/obj/item/magic_hand/New(var/spell/hand/S) - hand_spell = S - name = "[name] ([S.name])" - casts = S.casts - icon_state = S.hand_state - -/obj/item/magic_hand/attack() //can't be used to actually bludgeon things - return 1 - -/obj/item/magic_hand/afterattack(atom/A, mob/living/user) - if(!hand_spell) //no spell? Die. - user.drop_from_inventory(src) - - if(!hand_spell.valid_target(A,user)) - return - if(world.time < next_spell_time) - to_chat(user, "The spell isn't ready yet!") - return - - if(hand_spell.cast_hand(A,user)) - next_spell_time = world.time + hand_spell.spell_delay - casts-- - if(hand_spell.move_delay) - user.setMoveCooldown(hand_spell.move_delay) - if(hand_spell.click_delay) - user.setClickCooldown(hand_spell.move_delay) - if(!casts) - user.drop_from_inventory(src) - return - to_chat(user, "[casts]/[hand_spell.casts] charges left.") - -/obj/item/magic_hand/throw_at() //no throwing pls - usr.drop_from_inventory(src) - -/obj/item/magic_hand/dropped() //gets deleted on drop - loc = null - qdel(src) - -/obj/item/magic_hand/Destroy() //better save than sorry. - hand_spell = null - return ..() diff --git a/code/modules/spell_system/spells/spell_code.dm b/code/modules/spell_system/spells/spell_code.dm index f05078b7b06..92b5c997944 100644 --- a/code/modules/spell_system/spells/spell_code.dm +++ b/code/modules/spell_system/spells/spell_code.dm @@ -21,7 +21,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used - var/spell_flags = NEEDSCLOTHES + var/spell_flags var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell var/invocation_type = SpI_NONE //can be none, whisper, shout, and emote var/range = 7 //the range of the spell; outer radius for aoe spells @@ -231,11 +231,6 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now to_chat(user, "Mmmf mrrfff!") return 0 - var/spell/noclothes/spell = locate() in user.spell_list - if((spell_flags & NEEDSCLOTHES) && !(spell && istype(spell)) && holder == user)//clothes check - if(!user.wearing_wiz_garb()) - return 0 - return 1 /spell/proc/check_charge(var/skipcharge, mob/user) diff --git a/code/modules/spell_system/spells/spell_list/others/area/blind.dm b/code/modules/spell_system/spells/spell_list/others/area/blind.dm deleted file mode 100644 index 868dd539446..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/area/blind.dm +++ /dev/null @@ -1,31 +0,0 @@ -/spell/targeted/genetic/blind - name = "Blind" - desc = "This spell inflicts a target with temporary blindness." - feedback = "BD" - disabilities = 1 - duration = 300 - cast_sound = 'sound/magic/Blind.ogg' - - charge_max = 300 - - spell_flags = 0 - invocation = "STI KALY" - invocation_type = SpI_WHISPER - message = "Your eyes cry out in pain!" - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 3) - cooldown_min = 50 - - range = 7 - max_targets = 0 - - amt_eye_blind = 10 - amt_eye_blurry = 20 - - hud_state = "wiz_blind" - -/spell/targeted/genetic/blind/empower_spell() - if(!..()) - return 0 - duration += 100 - - return "[src] will now blind for a longer period of time." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/area/disable_tech.dm b/code/modules/spell_system/spells/spell_list/others/area/disable_tech.dm index e3a3f91f8b0..a4dba12eee6 100644 --- a/code/modules/spell_system/spells/spell_list/others/area/disable_tech.dm +++ b/code/modules/spell_system/spells/spell_list/others/area/disable_tech.dm @@ -3,7 +3,6 @@ desc = "This spell disables all weapons, cameras and most other technology in range." feedback = "DT" charge_max = 400 - spell_flags = NEEDSCLOTHES invocation = "NEC CANTIO" invocation_type = SpI_SHOUT selection_type = "range" diff --git a/code/modules/spell_system/spells/spell_list/others/area/smoke.dm b/code/modules/spell_system/spells/spell_list/others/area/smoke.dm index 1a3ea01b839..283fa60cae9 100644 --- a/code/modules/spell_system/spells/spell_list/others/area/smoke.dm +++ b/code/modules/spell_system/spells/spell_list/others/area/smoke.dm @@ -1,6 +1,6 @@ /spell/aoe_turf/smoke name = "Smoke" - desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." + desc = "This spell spawns a cloud of choking smoke at your location." feedback = "SM" school = "conjuration" charge_max = 120 diff --git a/code/modules/spell_system/spells/spell_list/others/contracts/contract_spells.dm b/code/modules/spell_system/spells/spell_list/others/contracts/contract_spells.dm deleted file mode 100644 index 8871e753ed1..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/contracts/contract_spells.dm +++ /dev/null @@ -1,31 +0,0 @@ -//These spells are given to the owner of a contract when a victim signs it. -//As such they are REALLY REALLY powerful (because the victim is rewarded for signing it, and signing contracts is completely voluntary) - -/spell/contract - name = "Contract Spell" - desc = "A spell perfecting the techniques of keeping a servant happy and obedient." - - school = "transmutation" - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - - - var/mob/subject - -/spell/contract/New(var/mob/M) - ..() - subject = M - name += " ([M.real_name])" - -/spell/contract/choose_targets() - return list(subject) - -/spell/contract/cast(mob/target,mob/user) - if(!subject) - to_chat(usr, "This spell was not properly given a target. Contact a coder.") - return null - - if(istype(target,/list)) - target = target[1] - return target \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/contracts/punish.dm b/code/modules/spell_system/spells/spell_list/others/contracts/punish.dm deleted file mode 100644 index 212bce17ad8..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/contracts/punish.dm +++ /dev/null @@ -1,16 +0,0 @@ -/spell/contract/punish - name = "Punish Contractee" - desc = "A spell that sets your contracted victim ablaze." - - charge_max = 300 - cooldown_min = 100 - - hud_state = "gen_immolate" - -/spell/contract/punish/cast(mob/living/target,mob/user) - target = ..(target,user) - if(!target) - return - - to_chat(target, "Magical energies surround you, immolating you in a furious fashion!") - target.IgniteMob(15) \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/contracts/reward.dm b/code/modules/spell_system/spells/spell_list/others/contracts/reward.dm deleted file mode 100644 index fd289767d44..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/contracts/reward.dm +++ /dev/null @@ -1,17 +0,0 @@ -/spell/contract/reward - name = "Extinguish Contractee" - desc = "A spell that extinguishes your contractee from flames." - - charge_max = 300 - cooldown_min = 100 - - hud_state = "wiz_jaunt_old" - -/spell/contract/reward/cast(mob/living/target,mob/user) - target = ..(target,user) - if(!target) - return - - if(target.on_fire && target.fire_stacks > 0) - to_chat(target, "Magical energies surround you, putting out all your flames.") - target.ExtinguishMobCompletely() \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/generic/baleful_polymorph.dm b/code/modules/spell_system/spells/spell_list/others/generic/baleful_polymorph.dm deleted file mode 100644 index 9b746d1595b..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/generic/baleful_polymorph.dm +++ /dev/null @@ -1,30 +0,0 @@ -/spell/targeted/shapeshift/baleful_polymorph - name = "Baleful Polymorth" - desc = "This spell transforms its target into a small, furry animal. Those practiced in the high arcane arts can block this spell with ease, however." - feedback = "BP" - possible_transformations = list(/mob/living/simple_animal/lizard,/mob/living/simple_animal/rat,/mob/living/simple_animal/corgi, /mob/living/simple_animal/cat) - - share_damage = 0 - invocation = "Yo'balada!" - invocation_type = SpI_SHOUT - spell_flags = NEEDSCLOTHES | SELECTABLE - range = 3 - duration = 150 //15 seconds. - cooldown_min = 300 //30 seconds - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - - newVars = list("health" = 50, "maxHealth" = 50) - - protected_roles = list("Wizard") - - hud_state = "wiz_poly" - - -/spell/targeted/shapeshift/baleful_polymorph/empower_spell() - if(!..()) - return 0 - - duration += 50 - - return "Your target will now stay in their polymorphed form for [duration/10] seconds." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/generic/entangle.dm b/code/modules/spell_system/spells/spell_list/others/generic/entangle.dm deleted file mode 100644 index 78d582eb7f2..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/generic/entangle.dm +++ /dev/null @@ -1,55 +0,0 @@ -/spell/targeted/entangle - name = "Entangle" - desc = "This spell creates vines that immediately entangle a nearby victim." - feedback = "ET" - school = "conjuration" - charge_max = 600 - spell_flags = NEEDSCLOTHES | SELECTABLE | IGNOREPREV - invocation = "BU EKEL 'INAS" - invocation_type = SpI_SHOUT - range = 3 - max_targets = 1 - cast_sound = 'sound/species/diona/gestalt_split.ogg' - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - cooldown_min = 300 - duration = 30 - - hud_state = "wiz_entangle" - var/datum/seed/seed - -/spell/targeted/entangle/New() - ..() - seed = new() - seed.set_trait(TRAIT_PLANT_ICON,"flower") - seed.set_trait(TRAIT_PRODUCT_ICON,"flower2") - seed.set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff") - seed.set_trait(TRAIT_SPREAD,2) - seed.name = "heirlooms" - seed.seed_name = "heirloom" - seed.display_name = "vines" - seed.chems = list(/decl/reagent/nutriment = list(1, 20)) - -/spell/targeted/entangle/cast(var/list/targets) - for(var/mob/M in targets) - var/turf/T = get_turf(M) - var/obj/effect/plant/single/P = new(T, seed) - P.can_buckle = list(/mob/living) - P.health = P.max_health - P.mature_time = 0 - P.process() - - P.buckle(M) - M.set_dir(pick(cardinal)) - - var/obj/item/handcuffs/cable/green/vines/V = new /obj/item/handcuffs/cable/green/vines(get_turf(M)) - V.place_handcuffs(M, instant = TRUE) - M.visible_message(SPAN_DANGER("[P] appear from the floor, spinning tightly around \the [M]!")) - -/spell/targeted/entangle/empower_spell() - if(!..()) - return FALSE - - max_targets++ - - return "This spell will now entangle [max_targets] people at the same time." diff --git a/code/modules/spell_system/spells/spell_list/others/generic/flesh_to_stone.dm b/code/modules/spell_system/spells/spell_list/others/generic/flesh_to_stone.dm deleted file mode 100644 index d8ad6d0dccf..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/generic/flesh_to_stone.dm +++ /dev/null @@ -1,24 +0,0 @@ -/spell/targeted/flesh_to_stone - name = "Flesh to Stone" - desc = "This spell turns a single person into an inert statue for a long period of time." - feedback = "FS" - school = "transmutation" - charge_max = 200 - spell_flags = NEEDSCLOTHES | SELECTABLE - blacklisted_mob_types = list(/mob/living/heavy_vehicle) - range = 5 - max_targets = 1 - invocation = "STAUN EI" - invocation_type = SpI_SHOUT - amt_stunned = 5 - cooldown_min = 100 - cast_sound = 'sound/magic/FleshToStone.ogg' - - hud_state = "wiz_statue" - -/spell/targeted/flesh_to_stone/cast(var/list/targets, mob/user) - ..() - for(var/mob/living/target in targets) - new /obj/structure/closet/statue(target.loc, target) - target.visible_message("[target] turns into a statue!", "Your body turns into stone and you find yourself paralyzed!") - return \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm index 51d02f9de5a..ad0943a799f 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm @@ -3,7 +3,7 @@ desc = "A spell used to fix others that cannot be fixed with regular medicine." feedback = "CM" charge_max = 300 - spell_flags = INCLUDEUSER | SELECTABLE | NEEDSCLOTHES + spell_flags = INCLUDEUSER | SELECTABLE invocation = "Borv Di'Nath" range = 1 level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1) diff --git a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_sacrifice.dm b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_sacrifice.dm deleted file mode 100644 index 2876c66bea9..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_sacrifice.dm +++ /dev/null @@ -1,32 +0,0 @@ -/spell/targeted/heal_target/sacrifice - name = "Sacrifice" - desc = "This spell heals immensily. For a price." - feedback = "SF" - spell_flags = SELECTABLE - invocation = "Ei'Nath Borv Di'Nath" - charge_type = Sp_HOLDVAR - holder_var_type = "bruteloss" - holder_var_amount = 75 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - - amt_dam_brute = -50 - amt_dam_fire = -50 - amt_dam_oxy = -50 - amt_dam_tox = -50 - amt_organ = -15 - - hud_state = "gen_dissolve" - -/spell/targeted/heal_target/sacrifice/empower_spell() - if(!..()) - return 0 - - holder_var_amount *= 2 - - amt_dam_brute *= 2 - amt_dam_fire *= 2 - amt_dam_oxy *= 2 - amt_dam_tox *= 2 - amt_organ *= 2 - - return "You will now heal twice as much, but take twice as much damage. It will probably kill you." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/generic/mend.dm b/code/modules/spell_system/spells/spell_list/others/generic/mend.dm index a68755fd606..1e4d736888b 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/mend.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/mend.dm @@ -2,7 +2,7 @@ name = "Mend Wounds" desc = "This spell heals internal wounds and broken bones." feedback = "MW" - spell_flags = INCLUDEUSER | SELECTABLE | NEEDSCLOTHES + spell_flags = INCLUDEUSER | SELECTABLE invocation = "Ges'undh'eit" invocation_type = SpI_SHOUT @@ -67,9 +67,9 @@ E.stage = 0 return 1 - if(E.status & ORGAN_TENDON_CUT) + if((E.tendon_status() & TENDON_CUT) && E.tendon.can_recover()) to_chat(user, "You place your hands over [target]'s [E.name], joining the two ends of their [E.tendon_name] in the process.") - E.status &= ~ORGAN_TENDON_CUT + E.tendon.rejuvenate() return 1 for(var/obj/item/organ/I in E.internal_organs) @@ -79,4 +79,4 @@ return 1 to_chat(user, "You can find nothing within \the [target]'s [E.name] to mend.") - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/spell_system/spells/spell_list/others/generic/mind_transfer.dm b/code/modules/spell_system/spells/spell_list/others/generic/mind_transfer.dm deleted file mode 100644 index 598a5d2ab6b..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/generic/mind_transfer.dm +++ /dev/null @@ -1,89 +0,0 @@ -/spell/targeted/mind_transfer - name = "Mind Transfer" - desc = "This spell allows the user to switch bodies with a target." - feedback = "MT" - school = "transmutation" - charge_max = 600 - spell_flags = 0 - invocation = "GIN'YU CAPAN" - invocation_type = SpI_WHISPER - max_targets = 1 - range = 1 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 2) - cooldown_min = 200 //100 deciseconds reduction per rank - compatible_mobs = list(/mob/living/carbon/human) //which types of mobs are affected by the spell. NOTE: change at your own risk - cast_sound = 'sound/magic/MandSwap.ogg' - - // TODO: Update to new antagonist system. - var/list/protected_roles = list("Wizard","Changeling","Cultist", "Vampire") //which roles are immune to the spell - var/msg_wait = 500 //how long in deciseconds it waits before telling that body doesn't feel right or mind swap robbed of a spell - amt_paralysis = 20 //how much the victim is paralysed for after the spell - - hud_state = "wiz_mindswap" - -/spell/targeted/mind_transfer/cast(list/targets, mob/user) - ..() - - for(var/mob/living/target in targets) - if(target.stat == DEAD) - to_chat(user, "You didn't study necromancy back at the Space Wizard Federation academy.") - continue - - if(!target.key || !target.mind) - to_chat(user, "They appear to be catatonic. Not even magic can affect their vacant mind.") - continue - - if(target.mind.special_role in protected_roles) - to_chat(user, "Their mind is resisting your spell.") - continue - - var/mob/living/victim = target//The target of the spell whos body will be transferred to. - var/mob/caster = user//The wizard/whomever doing the body transferring. - - //MIND TRANSFER BEGIN - if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list. - for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot. - caster.verbs -= V//But a safety nontheless. - - if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs. - for(var/V in victim.mind.special_verbs) - victim.verbs -= V - - var/mob/abstract/observer/ghost = victim.ghostize(0) - LAZYADD(ghost.spell_list, victim.spell_list) //If they have spells, transfer them. Now we basically have a backup mob. - - caster.mind.transfer_to(victim) - for(var/spell/S in victim.spell_list) - victim.remove_spell(S) //Doing it this way will allow the spell master to update accordingly and not cause bugs. - - for(var/spell/S in caster.spell_list) - victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD - caster.remove_spell(S) - - if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. - for(var/V in caster.mind.special_verbs)//Not too important but could come into play. - caster.verbs += V - - ghost.mind.transfer_to(caster) - caster.key = ghost.key //have to transfer the key since the mind was not active - for(var/spell/S in ghost.spell_list) - caster.add_spell(S) - - LAZYCLEARLIST(ghost.spell_list) - - if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. - for(var/V in caster.mind.special_verbs) - caster.verbs += V - //MIND TRANSFER END - - //Target is handled in ..(), so we handle the caster here - caster.Paralyse(amt_paralysis) - - //After a certain amount of time the victim gets a message about being in a different body. - spawn(msg_wait) - to_chat(caster, "You feel woozy and lightheaded. Your body doesn't seem like your own.") - -/spell/targeted/mind_transfer/empower_spell() - range++ - - return "You have increased the range of [src]." diff --git a/code/modules/spell_system/spells/spell_list/others/generic/mindcontrol.dm b/code/modules/spell_system/spells/spell_list/others/generic/mindcontrol.dm deleted file mode 100644 index 64a9fe846ae..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/generic/mindcontrol.dm +++ /dev/null @@ -1,65 +0,0 @@ -/spell/targeted/mindcontrol - name = "Mind Bend" - desc = "Bend the mind and soul of a mortal to serve your purposes, making them your slave. You will need some way to hold them still during the process, however." - feedback = "MB" - school = "cleric" - charge_max = 10000 - spell_flags = SELECTABLE | NEEDSCLOTHES - invocation = "In'gs'oc" - invocation_type = SpI_SHOUT - range = 1 - max_targets = 1 - - cast_sound = 'sound/magic/Charge.ogg' - - hud_state = "rend_mind" - - holder_var_type = "brainloss" - holder_var_amount = 15 - - compatible_mobs = list(/mob/living/carbon/human) - -/spell/targeted/mindcontrol/cast(list/targets, mob/user) - ..() - for(var/mob/living/target in targets) - var/mob/living/carbon/human/H = target - - if(H.stat == DEAD || (H.status_flags & FAKEDEATH)) - to_chat(user, "\The [H] is dead!") - return FALSE - - if(is_special_character(H)) - to_chat(user, "\The [H]'s mind is too strong to be affected by this spell!") - return FALSE - - if(!H.mind || !H.key) - to_chat(user, "\The [H] is mindless!") - return FALSE - - var/obj/item/organ/internal/brain/F = H.internal_organs_by_name[BP_BRAIN] - - if(isnull(F)) - to_chat(user, "\The [H] is brainless!") - return FALSE - - for (var/obj/item/implant/mindshield/I in H) - if (I.implanted) - to_chat(src, "[H]'s mind is shielded against your powers!") - return FALSE - - user.visible_message("\The [user] seizes the head of \the [H] in both hands...") - to_chat(user, "You invade the mind of \the [H]!") - to_chat(H, "Your mind is invaded by the presence of \the [user]! You feel painful tendrils burrowing their way into your head!") - - if (!do_mob(user, H, 80)) - to_chat(user, "Your concentration is broken!") - return FALSE - - if(wizards.add_antagonist_mind(target.mind,1,"Wizard Slave","You are a slave to \the [user], obey them at all costs!")) - to_chat(user, "You sear through \the [H]'s mind, reshaping as you see fit and leaving them subservient to your will!") - H.mind.assigned_role = "Wizard Slave" - to_chat(H, "Your defenses have eroded away and \the [user] has made you their mindslave.") - H.faction = "Space Wizard" - wizards.add_antagonist_mind(H.mind,1) - - return TRUE diff --git a/code/modules/spell_system/spells/spell_list/others/generic/raise_dead.dm b/code/modules/spell_system/spells/spell_list/others/generic/raise_dead.dm deleted file mode 100644 index 862f3627ebd..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/generic/raise_dead.dm +++ /dev/null @@ -1,48 +0,0 @@ -/spell/targeted/raise_dead - name = "Raise Dead" - desc = "This spell turns a body into a skeleton servant." - feedback = "RD" - school = "necromancy" - charge_max = 1000 - spell_flags = NEEDSCLOTHES | SELECTABLE - invocation = "RY'SY FROH YER G'RVE!" - invocation_type = SpI_SHOUT - range = 3 - max_targets = 1 - - compatible_mobs = list(/mob/living/carbon/human) - - hud_state = "wiz_skeleton" - -/spell/targeted/raise_dead/cast(list/targets, mob/user) - ..() - - for(var/mob/living/target in targets) - if(target.stat != DEAD) - to_chat(user, SPAN_WARNING("This spell can't affect the living.")) - return FALSE - - if(isundead(target)) - to_chat(user, SPAN_WARNING("This spell can't affect the undead.")) - return FALSE - - if(islesserform(target)) - to_chat(user, SPAN_WARNING("This spell can't affect this lesser creature.")) - return FALSE - - if(isipc(target)) - to_chat(user, SPAN_WARNING("This spell can't affect non-organics.")) - return FALSE - - var/mob/living/carbon/human/skeleton/F = new /mob/living/carbon/human/skeleton(get_turf(target)) - SSghostroles.add_spawn_atom("skeleton", F) - target.visible_message("\The [target] explodes in a shower of gore, a skeleton emerges from the remains!") - target.gib() - - F.master = user - F.faction = user.faction - - F.preEquipOutfit(/datum/outfit/admin/wizard/skeleton, FALSE) - F.equipOutfit(/datum/outfit/admin/wizard/skeleton, FALSE) - - return TRUE \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/generic/resurrection.dm b/code/modules/spell_system/spells/spell_list/others/generic/resurrection.dm deleted file mode 100644 index 523240283da..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/generic/resurrection.dm +++ /dev/null @@ -1,62 +0,0 @@ -/spell/targeted/resurrection - name = "Resurrection" - desc = "This spell brings someone back from the gates of death." - feedback = "RES" - spell_flags = NEEDSCLOTHES | SELECTABLE - invocation = "Se'id Rev' Oreh" - invocation_type = SpI_SHOUT - - school = "cleric" - - charge_max = 5000 - - cast_sound = 'sound/magic/Staff_Healing.ogg' - - hud_state = "wiz_revive" - - range = 1 - - compatible_mobs = list(/mob/living/carbon/human) - -/spell/targeted/resurrection/cast(list/targets, mob/user) - ..() - - for(var/mob/living/target in targets) - if(target.stat != DEAD && !(target.status_flags & FAKEDEATH)) - to_chat(user, "\The [target] is still alive!") - return 0 - - if(isundead(target)) - to_chat(user, "This spell can't affect the undead.") - return 0 - - if(isipc(target)) - to_chat(user, "This spell can't affect non-organics.") - return 0 - - if((world.time - target.timeofdeath) > 30 MINUTES) - to_chat(user, "\The [target]'s soul is too far away from your grasp.") - return 0 - - user.visible_message("\The [user] waves their hands over \the [target]'s body...") - - if(!do_after(user, 30, target, 0, 1)) - to_chat(user, "Your concentration is broken!") - return 0 - - for(var/mob/abstract/observer/ghost in dead_mob_list) - if(ghost.mind && ghost.mind.current == target && ghost.client) - to_chat(ghost, "Your body has been revived, Re-Enter Corpse to return to it.") - break - - to_chat(target, "Eternal rest is stolen from you, you are cast back into the world of the living!") - target.visible_message("\The [target] shudders violently!") - - if(target.status_flags & FAKEDEATH) - target.changeling_revive() - - else - target.adjustOxyLoss(-rand(15,20)) - target.revive() - - return 1 \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/generic/subjugate.dm b/code/modules/spell_system/spells/spell_list/others/generic/subjugate.dm deleted file mode 100644 index 972865dd9d7..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/generic/subjugate.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/targeted/subjugation - name = "Mind Blast" - desc = "This spell blasts a target's mind with distruptive forces, severely disorienting them. It does not require wizard garb." - - school = "transmutation" - charge_max = 250 - spell_flags = 0 - invocation = "DII ODA BAJI" - invocation_type = SpI_WHISPER - message = "You feel your mind burn, and your limbs feel unsteady as your vision wobbles severely." - - max_targets = 1 - - amt_dizziness = 150 - amt_confused = 100 - - compatible_mobs = list(/mob/living/carbon/human) - - hud_state = "wiz_subj" \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/projectile/fireball.dm b/code/modules/spell_system/spells/spell_list/others/projectile/fireball.dm deleted file mode 100644 index 5b9250f8c56..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/projectile/fireball.dm +++ /dev/null @@ -1,40 +0,0 @@ -/spell/targeted/projectile/dumbfire/fireball - name = "Fireball" - desc = "This spell fires a fireball at a target and does not require wizard garb." - - proj_type = /obj/item/projectile/spell_projectile/fireball - - school = "evocation" - charge_max = 100 - spell_flags = 0 - invocation = "ONI SOMA" - invocation_type = SpI_SHOUT - range = 20 - cooldown_min = 20 //10 deciseconds reduction per rank - cast_sound = 'sound/magic/Fireball.ogg' - - spell_flags = 0 - - duration = 20 - proj_step_delay = 1 - - amt_dam_brute = 20 - amt_dam_fire = 35 - - hud_state = "wiz_fireball" - -/spell/targeted/projectile/dumbfire/fireball/prox_cast(var/list/targets, spell_holder) - for(var/mob/living/M in targets) - apply_spell_damage(M) - M.IgniteMob(2) - var/explosion_ogg = pick('sound/effects/Explosion1.ogg', 'sound/effects/Explosion2.ogg') - playsound(get_turf(spell_holder), explosion_ogg, 75, TRUE, 3) - var/datum/effect/system/explosion/E = new /datum/effect/system/explosion() - E.set_up(get_turf(spell_holder)) - E.start() - -//PROJECTILE - -/obj/item/projectile/spell_projectile/fireball - name = "fireball" - icon_state = "fireball" \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/others/projectile/magic_missile.dm b/code/modules/spell_system/spells/spell_list/others/projectile/magic_missile.dm deleted file mode 100644 index 726b1f54f99..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/projectile/magic_missile.dm +++ /dev/null @@ -1,60 +0,0 @@ -/spell/targeted/projectile/magic_missile - name = "Magic Missile" - desc = "This spell fires several, slow moving, magic projectiles at nearby targets." - feedback = "MM" - school = "evocation" - charge_max = 300 - spell_flags = NEEDSCLOTHES - invocation = "FORTI GY AMA" - invocation_type = SpI_SHOUT - range = 7 - cooldown_min = 150 //15 deciseconds reduction per rank - cast_sound = 'sound/magic/MAGIC_MISSILE.ogg' - - max_targets = 0 - - proj_type = /obj/item/projectile/spell_projectile/seeking/magic_missile - duration = 10 - proj_step_delay = 5 - - hud_state = "wiz_mm" - - amt_paralysis = 3 - amt_stunned = 3 - - amt_dam_fire = 10 - -/spell/targeted/projectile/magic_missile/choose_prox_targets(mob/user = usr, var/atom/movable/spell_holder) - var/list/targets = ..() - for(var/mob/living/target in targets) - if(target.is_wizard()) - targets -= target - return targets - -/spell/targeted/projectile/magic_missile/prox_cast(var/list/targets, atom/spell_holder) - spell_holder.visible_message("\The [spell_holder] pops with a flash!") - for(var/mob/living/M in targets) - apply_spell_damage(M) - return - -/spell/targeted/projectile/magic_missile/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER] == level_max[Sp_POWER]) - amt_paralysis += 2 - amt_stunned += 2 - return "[src] will now stun people for a longer duration." - amt_dam_fire += 5 - - return "[src] does more damage now." - -//PROJECTILE - -/obj/item/projectile/spell_projectile/seeking/magic_missile - name = "magic missile" - icon_state = "magicm" - - proj_trail = 1 - proj_trail_lifespan = 5 - proj_trail_icon_state = "magicmd" diff --git a/code/modules/spell_system/spells/spell_list/others/projectile/stuncuff.dm b/code/modules/spell_system/spells/spell_list/others/projectile/stuncuff.dm deleted file mode 100644 index ff6c3067629..00000000000 --- a/code/modules/spell_system/spells/spell_list/others/projectile/stuncuff.dm +++ /dev/null @@ -1,48 +0,0 @@ -/spell/targeted/projectile/dumbfire/stuncuff - name = "Stun Cuff" - desc = "This spell fires out a small curse that stuns and cuffs the target." - feedback = "SC" - proj_type = /obj/item/projectile/spell_projectile/stuncuff - - charge_type = Sp_CHARGES - charge_max = 6 - charge_counter = 6 - spell_flags = 0 - invocation = "Fu'Reai Diakan" - invocation_type = SpI_SHOUT - range = 20 - - level_max = list(Sp_TOTAL = 0, Sp_SPEED = 0, Sp_POWER = 0) - - duration = 20 - proj_step_delay = 1 - - amt_stunned = 6 - - hud_state = "wiz_cuff" - -/spell/targeted/projectile/dumbfire/stuncuff/prox_cast(var/list/targets, spell_holder) - for(var/mob/living/M in targets) - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - var/obj/item/handcuffs/wizard/cuffs = new() - cuffs.forceMove(H) - H.handcuffed = cuffs - H.update_inv_handcuffed() - H.visible_message("Beams of light form around \the [H]'s hands!") - apply_spell_damage(M) - - -/obj/item/handcuffs/wizard - name = "beams of light" - desc = "Undescribable and unpenetrable. Or so they say." - - breakouttime = 300 //30 seconds - -/obj/item/handcuffs/wizard/dropped(var/mob/user) - ..() - qdel(src) - -/obj/item/projectile/spell_projectile/stuncuff - name = "stuncuff" - icon_state = "spell" \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/druidic_spells.dm b/code/modules/spell_system/spells/spell_list/self/conjure/druidic_spells.dm index dfc1c9f0e79..2bbbbe5be22 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/druidic_spells.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/druidic_spells.dm @@ -39,85 +39,4 @@ newVars = list("maxHealth" = 20 + spell_levels[Sp_POWER]*5, "health" = 20 + spell_levels[Sp_POWER]*5, "melee_damage_lower" = 10 + spell_levels[Sp_POWER], "melee_damage_upper" = 10 + spell_levels[Sp_POWER]*2) - return "Your bats are now stronger." - -/spell/aoe_turf/conjure/summon/bear - name = "Summon Bear" - desc = "This spell summons a permanent bear companion that will follow your orders." - feedback = "BR" - charge_max = 3000 - spell_flags = NEEDSCLOTHES - invocation = "REA'YO GOR DAYA!" - invocation_type = SpI_SHOUT - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 0, Sp_POWER = 4) - - range = 0 - - name_summon = 1 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/hostile/commanded/bear) - newVars = list("maxHealth" = 100, - "health" = 100, - "melee_damage_lower" = 25, - "melee_damage_upper" = 25 - ) - - hud_state = "wiz_bear" - -/spell/aoe_turf/conjure/summon/bear/before_cast() - ..() - newVars["master"] = holder //why not do this in the beginning? MIND SWITCHING. - -/spell/aoe_turf/conjure/summon/bear/empower_spell() - if(!..()) - return 0 - switch(spell_levels[Sp_POWER]) - if(1) - newVars = list("maxHealth" = 120, - "health" = 120, - "melee_damage_lower" = 30, - "melee_damage_upper" = 30, - "resistance" = 2, - "icon_state" = "bearfloor", - "icon_living" = "bearfloor", - "icon_dead" = "bearfloor_dead", - "desc" = "A large black bear." - ) - return "Your bear has been upgraded from a cub to a whelp." - if(2) - newVars = list("maxHealth" = 140, - "health" = 140, - "melee_damage_lower" = 35, - "melee_damage_upper" = 35, - "resistance" = 3, - "icon_state" = "bear", - "icon_living" = "bear", - "icon_dead" = "bear_dead", - "desc" = "A large black bear." - ) - return "Your bear has been upgraded from a whelp to an adult." - if(3) - newVars = list("maxHealth" = 180, - "health" = 180, - "melee_damage_lower" = 40, - "melee_damage_upper" = 40, - "resistance" = 4, - "icon_state" = "snowbear", - "icon_living" = "snowbear", - "icon_dead" = "snowbear_dead", - "desc" = "A large polar bear." - ) - return "Your bear has been upgraded from an adult to an alpha." - if(4) - newVars = list("maxHealth" = 250, - "health" = 250, - "melee_damage_lower" = 45, - "melee_damage_upper" = 45, - "resistance" = 5, - "icon_state" = "combatbear", - "icon_living" = "combatbear", - "icon_dead" = "combatbear_dead", - "desc" = "A large brown armored bear." - ) - return "Your bear is now worshiped as a god amongst bears." + return "Your bats are now stronger." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/forcewall.dm b/code/modules/spell_system/spells/spell_list/self/conjure/forcewall.dm index fe7f7fc70a9..6b971694760 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/forcewall.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/forcewall.dm @@ -11,22 +11,8 @@ hud_state = "wiz_shield" -/spell/aoe_turf/conjure/forcewall/mime - name = "Invisible wall" - desc = "Create an invisible wall on your location." - school = "mime" - panel = "Mime" - summon_type = list(/obj/effect/forcefield/mime) - invocation_type = SpI_EMOTE - invocation = "mimes placing their hands on a flat surfacing, and pushing against it." - charge_max = 300 - cast_sound = null - - override_base = "grey" - hud_state = "mime_wall" - /obj/effect/forcefield - desc = "A space wizard's magic wall." + desc = "A strange wall that seems almost magical." name = "forcewall" icon = 'icons/effects/effects.dmi' icon_state = "m_shield" @@ -48,11 +34,6 @@ to_chat(user, "\the [src] dissipates at the touch of the \the [I].") qdel(src) -/obj/effect/forcefield/mime - icon_state = null - name = "invisible wall" - desc = "You have a bad feeling about this." - /obj/effect/forcefield/cultify() new /obj/effect/forcefield/cult(get_turf(src)) qdel(src) diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/gestalt_grove.dm b/code/modules/spell_system/spells/spell_list/self/conjure/gestalt_grove.dm deleted file mode 100644 index dbbfce673f1..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/conjure/gestalt_grove.dm +++ /dev/null @@ -1,16 +0,0 @@ -/spell/aoe_turf/conjure/grove/gestalt - name = "Convert Gestalt" - desc = "Converts the surrounding area into a Dionaea gestalt." - - school = "conjuration" - spell_flags = 0 - invocation_type = SpI_EMOTE - invocation = "rumbles as green alien plants grow quickly along the floor." - - charge_type = Sp_HOLDVAR - - spell_flags = Z2NOCAST | IGNOREPREV | IGNOREDENSE - summon_type = list(/turf/simulated/floor/diona) - seed_type = /datum/seed/diona - - hud_state = "wiz_diona" \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/golem.dm b/code/modules/spell_system/spells/spell_list/self/conjure/golem.dm deleted file mode 100644 index 77e41d48db2..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/conjure/golem.dm +++ /dev/null @@ -1,12 +0,0 @@ -/spell/aoe_turf/conjure/golem - name = "Summon Golem Rune" - desc = "Summon a golem rune at your location, allowing you to create a servant golem with the right materials." - feedback = "SGE" - summon_type = list(/obj/effect/golemrune/wizard) - charge_max = 6000 - spell_flags = 0 - range = 0 - - cast_sound = 'sound/effects/teleport.ogg' - - hud_state = "golem" \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/grove.dm b/code/modules/spell_system/spells/spell_list/self/conjure/grove.dm deleted file mode 100644 index 2ffdd006c42..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/conjure/grove.dm +++ /dev/null @@ -1,30 +0,0 @@ -/spell/aoe_turf/conjure/grove - name = "Grove" - desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant." - - spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV - charge_max = 1200 - school = "conjuration" - cast_sound = 'sound/species/diona/gestalt_grow.ogg' - range = 1 - cooldown_min = 600 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1) - - summon_amt = 47 - summon_type = list(/turf/simulated/floor/grass/alt) - var/spread = 0 - var/datum/seed/seed - var/seed_type = /datum/seed/merlin_tear - -/spell/aoe_turf/conjure/grove/New() - ..() - if(seed_type) - seed = new seed_type() - else - seed = SSplants.create_random_seed(1) - -/spell/aoe_turf/conjure/grove/before_cast() - var/turf/T = get_turf(holder) - var/obj/effect/plant/P = new(T,seed) - P.spread_chance = spread \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/plant_sanctuary.dm b/code/modules/spell_system/spells/spell_list/self/conjure/plant_sanctuary.dm deleted file mode 100644 index 816c8997a82..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/conjure/plant_sanctuary.dm +++ /dev/null @@ -1,44 +0,0 @@ -/spell/aoe_turf/conjure/grove/sanctuary - name = "Sanctuary" - desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant." - feedback = "SY" - invocation = "Bo k'itan" - invocation_type = SpI_SHOUT - spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV - cooldown_min = 600 - cast_sound = 'sound/species/diona/gestalt_grow.ogg' - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1) - - seed_type = /datum/seed/merlin_tear - newVars = list("name" = "sanctuary", "desc" = "This grass makes you feel comfortable. Peaceful.","blessed" = 1) - - hud_state = "wiz_grove" - -/spell/aoe_turf/conjure/grove/sanctuary/empower_spell() - if(!..()) - return 0 - - seed.set_trait(TRAIT_SPREAD,2) //make it grow. - spread = 40 - return "Your sanctuary will now grow beyond that of the grassy perimeter." - -/datum/seed/merlin_tear - name = "merlin tears" - seed_name = "merlin tears" - display_name = "merlin tears" - chems = list(/decl/reagent/bicaridine = list(3,7), /decl/reagent/dermaline = list(3,7), /decl/reagent/dylovene = list(3,7), /decl/reagent/tricordrazine = list(3,7), /decl/reagent/alkysine = list(1,2), /decl/reagent/oculine = list(1,2), /decl/reagent/peridaxon = list(4,5)) - kitchen_tag = "berries" - -/datum/seed/merlin_tear/setup_traits() - ..() - set_trait(TRAIT_PLANT_ICON,"bush5") - set_trait(TRAIT_PRODUCT_ICON,"berry") - set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff") - set_trait(TRAIT_PLANT_COLOUR, "#ff6600") - set_trait(TRAIT_YIELD,4) - set_trait(TRAIT_MATURATION,6) - set_trait(TRAIT_PRODUCTION,6) - set_trait(TRAIT_POTENCY,10) - set_trait(TRAIT_HARVEST_REPEAT,1) - set_trait(TRAIT_IMMUTABLE,1) diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/radiant_aura.dm b/code/modules/spell_system/spells/spell_list/self/conjure/radiant_aura.dm index 827f8bdac61..ed6108bacae 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/radiant_aura.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/radiant_aura.dm @@ -6,7 +6,6 @@ invocation_type = SpI_EMOTE invocation = "conjures a sphere of fire around themselves." school = "conjuration" - spell_flags = NEEDSCLOTHES charge_max = 300 cooldown_min = 200 level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 0) diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/summon_carp.dm b/code/modules/spell_system/spells/spell_list/self/conjure/summon_carp.dm deleted file mode 100644 index 3f2b2a33f7c..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/conjure/summon_carp.dm +++ /dev/null @@ -1,22 +0,0 @@ -/spell/aoe_turf/conjure/carp - name = "Summon Carp" - desc = "This spell conjures a simple carp." - feedback = "CA" - school = "conjuration" - charge_max = 1200 - spell_flags = NEEDSCLOTHES - invocation = "NOUK FHUNMM SACP RISSKA" - invocation_type = SpI_SHOUT - range = 1 - cast_sound = 'sound/magic/Summon_Karp.ogg' - summon_type = list(/mob/living/simple_animal/hostile/carp) - - hud_state = "wiz_carp" - -/spell/aoe_turf/conjure/carp/empower_spell() - if(!..()) - return 0 - - summon_amt++ - - return "You now summon [summon_amt] carps per spellcast." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/summon_demon_creature.dm b/code/modules/spell_system/spells/spell_list/self/conjure/summon_demon_creature.dm deleted file mode 100644 index e266201bdcf..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/conjure/summon_demon_creature.dm +++ /dev/null @@ -1,15 +0,0 @@ -/spell/aoe_turf/conjure/creature - name = "Summon Creature" - desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth." - cast_sound = 'sound/magic/Summon_Karp.ogg' - school = "conjuration" - charge_max = 1200 - spell_flags = 0 - invocation = "IA IA" - invocation_type = SpI_SHOUT - summon_amt = 2 - range = 3 - - summon_type = list(/mob/living/simple_animal/hostile/creature) - - hud_state = "wiz_creature" \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/summon_harmless_carp.dm b/code/modules/spell_system/spells/spell_list/self/conjure/summon_harmless_carp.dm deleted file mode 100644 index 6c2ab2106f4..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/conjure/summon_harmless_carp.dm +++ /dev/null @@ -1,28 +0,0 @@ -/spell/aoe_turf/conjure/mirage - name = "Summon Mirage" - desc = "This spell summons a harmless carp mirage for a few seconds." - feedback = "MR" - school = "illusion" - charge_max = 1200 - spell_flags = NEEDSCLOTHES - invocation = "NOUK FHUNNM SACP RISSKA" - invocation_type = SpI_SHOUT - range = 1 - - duration = 600 - cooldown_min = 600 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 2, Sp_POWER = 3) - cast_sound = 'sound/magic/Summon_Karp.ogg' - summon_type = list(/mob/living/simple_animal/hostile/carp) - - hud_state = "wiz_carp" - - newVars = list("melee_damage_lower" = 0, "melee_damage_upper" = 0, "break_stuff_probability" = 0) - -/spell/aoe_turf/conjure/mirage/empower_spell() - if(!..()) - return 0 - - summon_amt++ - - return "You now summon [summon_amt] mirages per spellcast." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/equip/holy_relic.dm b/code/modules/spell_system/spells/spell_list/self/equip/holy_relic.dm deleted file mode 100644 index 5ad19d39411..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/equip/holy_relic.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/targeted/equip_item/holy_relic - name = "Summon Holy Relic" - desc = "This spell summons a relic of purity into your hand for a short while." - feedback = "SR" - school = "transmutation" - charge_type = Sp_RECHARGE - charge_max = 600 - spell_flags = NEEDSCLOTHES | INCLUDEUSER - invocation = "YEE' RO SU!" - invocation_type = SpI_SHOUT - range = -1 - max_targets = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1) - duration = 250 - cooldown_min = 350 - delete_old = 0 - compatible_mobs = list(/mob/living/carbon/human) - - hud_state = "purge1" - - equipped_summons = list("active hand" = /obj/item/nullrod) - -/spell/targeted/equip_item/holy_relic/cast(list/targets, mob/user = usr) - ..() - for(var/mob/M in targets) - M.visible_message("A rod of metal appears in \the [M]'s hand!") - -/spell/targeted/equip_item/holy_relic/empower_spell() - if(!..()) - return 0 - - duration += 50 - - return "The holy relic now lasts for [duration/10] seconds." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/equip/seed.dm b/code/modules/spell_system/spells/spell_list/self/equip/seed.dm deleted file mode 100644 index 45692b78484..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/equip/seed.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/targeted/equip_item/seed - name = "Summon Seed" - desc = "This spell summons a random seed into the hand of the wizard." - feedback = "SE" - delete_old = 0 - - spell_flags = INCLUDEUSER | NEEDSCLOTHES - invocation_type = SpI_WHISPER - invocation = "Ria'li akta" - - equipped_summons = list("active hand" = /obj/item/seeds/random) - compatible_mobs = list(/mob/living/carbon/human) - - charge_max = 600 //1 minute - cooldown_min = 200 //20 seconds - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 0) - - range = -1 - max_targets = 1 - - hud_state = "wiz_seed" \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/equip/shield.dm b/code/modules/spell_system/spells/spell_list/self/equip/shield.dm deleted file mode 100644 index c337e7badae..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/equip/shield.dm +++ /dev/null @@ -1,41 +0,0 @@ -/spell/targeted/equip_item/shield - name = "Summon Shield" - desc = "Summons the most holy of shields, the buckler. Commonly used during wizard riots." - feedback = "SH" - school = "evocation" - invocation = "Sia helda!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER | NEEDSCLOTHES - range = -1 - max_targets = 1 - - compatible_mobs = list(/mob/living/carbon/human) - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 1) - charge_type = Sp_RECHARGE - charge_max = 900 - cooldown_min = 300 - equipped_summons = list("off hand" = /obj/item/shield/) - duration = 300 - delete_old = 0 - var/item_color = "#6666ff" - var/block_chance = 30 - - hud_state = "wiz_shield" - -/spell/targeted/equip_item/shield/summon_item(var/new_type) - var/obj/item/shield/I = new new_type() - I.icon_state = "buckler" - I.color = item_color - I.name = "Wizard's Shield" - I.base_block_chance = block_chance - return I - -/spell/targeted/equip_item/shield/empower_spell() - if(!..()) - return 0 - - item_color = "#6600ff" - block_chance = 60 - - return "Your summoned shields will now block more often." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/generic/area_teleport.dm b/code/modules/spell_system/spells/spell_list/self/generic/area_teleport.dm index ea25cc3e58c..8760b7e187d 100644 --- a/code/modules/spell_system/spells/spell_list/self/generic/area_teleport.dm +++ b/code/modules/spell_system/spells/spell_list/self/generic/area_teleport.dm @@ -4,7 +4,6 @@ feedback = "TP" school = "abjuration" charge_max = 600 - spell_flags = NEEDSCLOTHES invocation = "SCYAR NILA" invocation_type = SpI_SHOUT cooldown_min = 200 //100 deciseconds reduction per rank diff --git a/code/modules/spell_system/spells/spell_list/self/generic/avian.dm b/code/modules/spell_system/spells/spell_list/self/generic/avian.dm deleted file mode 100644 index 453827e5da4..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/generic/avian.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/targeted/shapeshift/avian - name = "Polymorph" - desc = "This spell transforms the wizard into the common parrot." - feedback = "AV" - possible_transformations = list(/mob/living/simple_animal/parrot) - - invocation = "Poli'crakata!" - invocation_type = SpI_SHOUT - drop_items = 0 - share_damage = 0 - spell_flags = INCLUDEUSER - range = -1 - duration = 150 - charge_max = 600 - cooldown_min = 300 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 0) - hud_state = "wiz_parrot" - - newVars = list("maxHealth" = 50, "health" = 50) \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/generic/corrupt_form.dm b/code/modules/spell_system/spells/spell_list/self/generic/corrupt_form.dm deleted file mode 100644 index 5740d8d3c3f..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/generic/corrupt_form.dm +++ /dev/null @@ -1,39 +0,0 @@ -/spell/targeted/shapeshift/corrupt_form - name = "Corrupt Form" - desc = "This spell shapes the wizard into a terrible, terrible beast." - feedback = "CF" - possible_transformations = list(/mob/living/simple_animal/hostile/faithless/wizard) - - invocation = "mutters something dark and twisted as their form begins to twist..." - invocation_type = SpI_EMOTE - spell_flags = INCLUDEUSER - range = -1 - duration = 300 - charge_max = 1200 - cooldown_min = 600 - - drop_items = 0 - share_damage = 0 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 2) - - newVars = list("name" = "corrupted soul") - - hud_state = "wiz_corrupt" - -/spell/targeted/shapeshift/corrupt_form/empower_spell() - if(!..()) - return 0 - - switch(spell_levels[Sp_POWER]) - if(1) - duration += 100 - return "You will now stay corrupted for [duration/10] seconds." - if(2) - newVars = list("name" = "\proper corruption incarnate", - "melee_damage_upper" = 45, - "resistance" = 6, - "health" = 650, //since it is foverer i guess it would be fine to turn them into some short of boss - "maxHealth" = 650) - duration = 0 - return "You revel in the corruption. There is no turning back." \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/generic/dark_resurrection.dm b/code/modules/spell_system/spells/spell_list/self/generic/dark_resurrection.dm deleted file mode 100644 index 60ca525f6c6..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/generic/dark_resurrection.dm +++ /dev/null @@ -1,51 +0,0 @@ -/spell/targeted/dark_resurrection - name = "Dark Resurrection" - desc = "This spell brings the user back to life, as long their soul is stored in a phylactery." - feedback = "DAR" - range = 0 - school = "necromancy" - spell_flags = GHOSTCAST | INCLUDEUSER - charge_max = 600 //1 minute - max_targets = 1 - - invocation = "" - invocation_type = SpI_NONE - - hud_state = "wiz_lich" - -/spell/targeted/dark_resurrection/cast(mob/target,var/mob/living/carbon/human/user as mob) - ..() - if(user.stat != DEAD) - to_chat(user, "You're not dead yet!") - return 0 - - var/obj/item/phylactery/P - for(var/thing in world_phylactery) - var/obj/item/phylactery/N = thing - if (!QDELETED(N) && N.lich == user) - P = N - - if(P) - user.forceMove(get_turf(P)) - to_chat(user, "Your dead body returns to your phylactery, slowly rebuilding itself.") - if(prob(25)) - var/area/A = get_area(P) - command_announcement.Announce("High levels of bluespace activity detected at \the [A]. Investigate it soon as possible.", "Bluespace Anomaly Report") - - addtimer(CALLBACK(src, .proc/post_dark_resurrection, user), rand(200, 400)) - return 1 - - else - to_chat(user, "Your phylactery was destroyed, your existence will face oblivion now.") - user.visible_message("As [user]'s body turns to dust, a twisted wail can be heard!") - playsound(get_turf(user), 'sound/hallucinations/wail.ogg', 50, 1) - user.dust() - return 0 - -/spell/targeted/dark_resurrection/proc/post_dark_resurrection(var/mob/living/carbon/human/user as mob) - user.revive() - to_chat(user, "You have returned to life!") - user.visible_message("[user] rises up from the dead!") - playsound(get_turf(user), 'sound/magic/pope_entry.ogg', 100, 1) - user.update_canmove() - return 1 \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/generic/ethereal_jaunt.dm b/code/modules/spell_system/spells/spell_list/self/generic/ethereal_jaunt.dm index c538ebbfb27..039fa376187 100644 --- a/code/modules/spell_system/spells/spell_list/self/generic/ethereal_jaunt.dm +++ b/code/modules/spell_system/spells/spell_list/self/generic/ethereal_jaunt.dm @@ -4,7 +4,7 @@ feedback = "EJ" school = "transmutation" charge_max = 300 - spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER + spell_flags = Z2NOCAST | INCLUDEUSER invocation = "none" invocation_type = SpI_NONE range = -1 diff --git a/code/modules/spell_system/spells/spell_list/self/generic/lichdom.dm b/code/modules/spell_system/spells/spell_list/self/generic/lichdom.dm deleted file mode 100644 index 43d51d1349b..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/generic/lichdom.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/targeted/lichdom - name = "Lichdom" - desc = "Trade your life and soul for immortality and power." - feedback = "LID" - range = 0 - school = "necromancy" - charge_max = 10000 - spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER - invocation_type = SpI_EMOTE - invocation = "entones an obscure chant..." - max_targets = 1 - level_max = list(Sp_TOTAL = 0, Sp_SPEED = 0, Sp_POWER = 0) - - cast_sound = 'sound/magic/pope_entry.ogg' - - hud_state = "wiz_lich" - -/spell/targeted/lichdom/cast(mob/target,var/mob/living/carbon/human/user as mob) - ..() - if(isundead(user)) - to_chat(user, "You have no soul or life to offer.") - return 0 - - user.visible_message("\The [user]'s skin sloughs off bone, their blood boils and guts turn to dust!") - gibs(user.loc) - user.add_spell(new /spell/targeted/dark_resurrection) - user.set_species(SPECIES_SKELETON) - user.unEquip(user.wear_suit) - user.unEquip(user.head) - user.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(user), slot_wear_suit) - user.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(user), slot_head) - to_chat(user, "Your soul flee to the remains of your heart, turning it into your phylactery. Do not allow anyone to destroy it!") - var/obj/item/phylactery/G = new(get_turf(user)) - G.lich = user - G.icon_state = "cursedheart-on" - user.remove_spell(src) - return 1 \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/generic/mark_recall.dm b/code/modules/spell_system/spells/spell_list/self/generic/mark_recall.dm deleted file mode 100644 index 6fea34c3d52..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/generic/mark_recall.dm +++ /dev/null @@ -1,83 +0,0 @@ -/spell/mark_recall - name = "Mark and Recall" - desc = "This spell was created so wizards could get home from the bar without driving." - feedback = "MK" - school = "abjuration" - charge_max = 300 - spell_flags = Z2NOCAST - invocation = "RE ALKI R'NATHA" - invocation_type = SpI_WHISPER - cooldown_min = 150 - - smoke_amt = 1 - smoke_spread = 5 - - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - - cast_sound = 'sound/effects/teleport.ogg' - hud_state = "wiz_mark" - var/mark = null - -/spell/mark_recall/choose_targets() - if(!mark) - return list("magical fairy dust") //because why not - else - return list(mark) - -/spell/mark_recall/cast(var/list/targets,mob/user) - if(!targets.len) - return 0 - var/target = targets[1] - if(istext(target)) - mark = new /obj/effect/decal/wizard_mark(get_turf(user),src) - return 1 - if(!istype(target,/obj)) //something went wrong - return 0 - var/turf/T = get_turf(target) - if(!T) - return 0 - do_teleport(user,T) - ..() - -/spell/mark_recall/empower_spell() - if(!..()) - return 0 - - spell_flags = STATALLOWED - - return "You no longer have to be conscious to activate this spell." - -/obj/effect/decal/wizard_mark - name = "mark of the wizard" - desc = "A strange rune, probably someone playing with crayons again." - icon = 'icons/obj/rune.dmi' - icon_state = "wizard_mark" - - anchored = 1 - unacidable = 1 - layer = TURF_LAYER - - var/spell/mark_recall/spell - -/obj/effect/decal/wizard_mark/New(var/newloc,var/mrspell) - ..() - spell = mrspell - -/obj/effect/decal/wizard_mark/Destroy() - spell.mark = null //dereference pls. - spell = null - return ..() - -/obj/effect/decal/wizard_mark/attack_hand(var/mob/user) - if(user == spell.holder) - user.visible_message("\The [user] mutters an incantation and \the [src] disappears!") - qdel(src) - ..() - -/obj/effect/decal/wizard_mark/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/nullrod) || istype(I, /obj/item/spellbook)) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - src.visible_message("\The [src] fades away!") - qdel(src) - return - ..() diff --git a/code/modules/spell_system/spells/spell_list/self/generic/mutate.dm b/code/modules/spell_system/spells/spell_list/self/generic/mutate.dm index 507a50b4bce..f54daddf9f8 100644 --- a/code/modules/spell_system/spells/spell_list/self/generic/mutate.dm +++ b/code/modules/spell_system/spells/spell_list/self/generic/mutate.dm @@ -4,7 +4,7 @@ feedback = "MU" school = "transmutation" charge_max = 400 - spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER + spell_flags = Z2NOCAST | INCLUDEUSER invocation = "BIRUZ BENNAR" invocation_type = SpI_SHOUT message = "You feel strong! You feel a pressure building behind your eyes!" diff --git a/code/modules/spell_system/spells/spell_list/self/generic/no_clothes.dm b/code/modules/spell_system/spells/spell_list/self/generic/no_clothes.dm deleted file mode 100644 index 169e81a214e..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/generic/no_clothes.dm +++ /dev/null @@ -1,5 +0,0 @@ -/spell/noclothes - name = "No Clothes" - desc = "Learn the ways of robeless spell casting." - feedback = "NC" - spell_flags = NO_BUTTON \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/generic/return_master.dm b/code/modules/spell_system/spells/spell_list/self/generic/return_master.dm deleted file mode 100644 index bcafdfb5711..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/generic/return_master.dm +++ /dev/null @@ -1,29 +0,0 @@ -/spell/contract/return_master - name = "Return to Master" - desc = "Teleport back to your master" - - school = "abjuration" - charge_max = 600 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - cooldown_min = 200 - - smoke_spread = 1 - smoke_amt = 5 - - hud_state = "wiz_tele" - - -/spell/contract/return_master/cast(mob/target, mob/user) - target = ..(target,user) - if(!target) - return - - to_chat(target, FONT_LARGE(SPAN_WARNING("\The [user] teleported to you!"))) - user.forceMove(get_turf(target)) - user.visible_message(SPAN_WARNING("\The [user] appears out of thin air!"), SPAN_NOTICE("You successfully teleport to \the [target].")) - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread - smoke.set_up(5, 0, get_turf(user)) - smoke.attach(user) - smoke.start() \ No newline at end of file diff --git a/code/modules/spell_system/spells/spell_list/self/projectile/passage.dm b/code/modules/spell_system/spells/spell_list/self/projectile/passage.dm deleted file mode 100644 index 1d3efbce94d..00000000000 --- a/code/modules/spell_system/spells/spell_list/self/projectile/passage.dm +++ /dev/null @@ -1,47 +0,0 @@ -/spell/targeted/projectile/dumbfire/passage - name = "Passage" - desc = "throw a spell towards an area and teleport to it." - feedback = "PA" - proj_type = /obj/item/projectile/spell_projectile/passage - - - school = "abjuration" - charge_max = 250 - spell_flags = 0 - invocation = "A'YASAMA" - invocation_type = SpI_SHOUT - range = 15 - - - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - spell_flags = NEEDSCLOTHES - duration = 15 - - proj_step_delay = 1 - - hud_state = "gen_project" - - -/spell/targeted/projectile/dumbfire/passage/prox_cast(var/list/targets, atom/spell_holder) - for(var/mob/living/L in targets) - apply_spell_damage(L) - - var/turf/T = get_turf(spell_holder) - - holder.forceMove(T) - var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread() - S.set_up(3,0,T) - S.start() - - -/spell/targeted/projectile/dumbfire/passage/empower_spell() - if(!..()) - return 0 - - amt_stunned += 3 - - return "[src] now stuns those who get hit by it." - -/obj/item/projectile/spell_projectile/passage - name = "spell" - icon_state = "energy2" \ No newline at end of file diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index ac597d1f151..6f38f289d1f 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -45,7 +45,7 @@ name = "Set bone" allowed_tools = list( /obj/item/surgery/bonesetter = 100, \ - /obj/item/wrench = 75 \ + WRENCH = 75 \ ) min_duration = 60 @@ -85,7 +85,7 @@ name = "Repair skull" allowed_tools = list( /obj/item/surgery/bonesetter = 100, \ - /obj/item/wrench = 75 \ + WRENCH = 75 \ ) min_duration = 60 diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index dcde86c5815..dbb1a762a19 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -116,6 +116,7 @@ affected.fracture() /decl/surgery_step/open_encased/close + name = "Bend bone closed" allowed_tools = list( /obj/item/surgery/retractor = 100, \ /obj/item/crowbar = 75 @@ -173,6 +174,7 @@ O.bruise() /decl/surgery_step/open_encased/mend + name = "Mend closed bone" allowed_tools = list( /obj/item/surgery/bonegel = 100, \ /obj/item/tape_roll = 60 @@ -203,8 +205,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/msg = "[user] starts applying \the [tool] to [target]'s [affected.encased]." - var/self_msg = "You start applying \the [tool] to [target]'s [affected.encased]." + var/msg = "[user] applies some of \the [tool] to [target]'s [affected.encased]." + var/self_msg = "You apply some of \the [tool] to [target]'s [affected.encased]." user.visible_message(msg, SPAN_NOTICE(self_msg)) target.custom_pain("Something hurts horribly in your [affected.name]!", 75) ..() diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 469c0ebf6d7..8d039ba9890 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -158,7 +158,7 @@ name = "Remove foreign body" allowed_tools = list( /obj/item/surgery/hemostat = 100, \ - /obj/item/wirecutters = 75, \ + WIRECUTTER = 75, \ /obj/item/material/kitchen/utensil/fork = 20 ) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 3f38afe6fe3..feb8399397f 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -110,7 +110,7 @@ allowed_tools = list( /obj/item/stack/nanopaste = 100, /obj/item/surgery/bonegel = 30, - /obj/item/screwdriver = 70 + SCREWDRIVER = 70 ) min_duration = 70 @@ -242,7 +242,7 @@ name = "Remove organ" allowed_tools = list( /obj/item/surgery/hemostat = 100, \ - /obj/item/wirecutters = 75, \ + WIRECUTTER = 75, \ /obj/item/material/kitchen/utensil/fork = 20 ) @@ -456,8 +456,8 @@ SPAN_WARNING("Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!")) target.apply_damage(20, BRUTE, target_zone, 0, tool, damage_flags = tool.damage_flags()) -/decl/surgery_step/internal/lobotomize - name = "Lobotomy" +/decl/surgery_step/internal/prepare + name = "Prepare Brain" allowed_tools = list( /obj/item/surgery/scalpel/manager = 95, /obj/item/surgery/surgicaldrill = 75, @@ -467,7 +467,7 @@ min_duration = 100 max_duration = 120 -/decl/surgery_step/internal/lobotomize/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) +/decl/surgery_step/internal/prepare/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if(!..()) return FALSE @@ -476,26 +476,26 @@ if(!istype(sponge) || !(sponge in affected.internal_organs)) return FALSE - if(!sponge.can_lobotomize || sponge.lobotomized) + if(!sponge.can_prepare || sponge.prepared) return FALSE target.op_stage.current_organ = sponge return TRUE -/decl/surgery_step/internal/lobotomize/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) +/decl/surgery_step/internal/prepare/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/internal/brain/B = target.op_stage.current_organ - user.visible_message("[user] begins to modify [target]'s [B] to remove their memory recall with \the [tool].", \ - "You start to modify [target]'s [B] to remove their memory recall with \the [tool].") + user.visible_message("[user] begins to modify [target]'s [B] to prepare it for Man-Machine-Interface compatibility with \the [tool].", \ + "You start to modify [target]'s [B] to prepare it for Man-Machine-Interface compatibility with \the [tool].") target.custom_pain("Someone's scraping away at your [B]!", 75) ..() -/decl/surgery_step/internal/lobotomize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) +/decl/surgery_step/internal/prepare/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/internal/brain/B = target.op_stage.current_organ - user.visible_message(SPAN_NOTICE("[user] has modified [target]'s [B] to remove their memory recall with \the [tool].") , \ - SPAN_NOTICE("You have removed [target]'s memory recall with \the [tool].")) - B.lobotomize(user) + user.visible_message(SPAN_NOTICE("[user] has modified [target]'s [B] to prepare it for Man-Machine-Interface compatibility with \the [tool].") , \ + SPAN_NOTICE("You prepare \the [target]'s brain for Man-Machine-Interface compatibility with \the [tool].")) + B.prepared = TRUE -/decl/surgery_step/internal/lobotomize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) +/decl/surgery_step/internal/prepare/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message(SPAN_WARNING("[user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!"), \ SPAN_WARNING("Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!")) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index edeec246065..609d4f4c743 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -201,7 +201,7 @@ return FALSE var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && (affected.status & ORGAN_TENDON_CUT) && affected.open >= ORGAN_OPEN_RETRACTED + return affected && (affected.tendon_status() & TENDON_CUT) && affected.open >= ORGAN_OPEN_RETRACTED /decl/surgery_step/fix_tendon/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -214,7 +214,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message(SPAN_NOTICE("[user] has reattached the [affected.tendon_name] in [target]'s [affected.name] with \the [tool]."), \ SPAN_NOTICE("You have reattached the [affected.tendon_name] in [target]'s [affected.name] with \the [tool].")) - affected.status &= ~ORGAN_TENDON_CUT + affected.tendon.heal() affected.update_damages() /decl/surgery_step/fix_tendon/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 6895a83a662..adddd9ed0a4 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -23,9 +23,9 @@ return TRUE /decl/surgery_step/robotics/unscrew_hatch - name = "Unscrew hatch" + name = "Unscrew Hatch" allowed_tools = list( - /obj/item/screwdriver = 100, + SCREWDRIVER = 100, /obj/item/coin = 50, /obj/item/material/kitchen/utensil/knife = 50 ) @@ -33,12 +33,19 @@ min_duration = 90 max_duration = 110 + requires_surgery_compatibility = FALSE + /decl/surgery_step/robotics/unscrew_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if(!..()) return FALSE + if(target_zone == BP_MOUTH) + return FALSE + var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.open == ORGAN_CLOSED && target_zone != BP_MOUTH + if(affected?.open == ORGAN_CLOSED) + return TRUE + return FALSE /decl/surgery_step/robotics/unscrew_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -57,11 +64,53 @@ user.visible_message(SPAN_WARNING("[user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name]."), \ SPAN_WARNING("Your [tool] slips, failing to unscrew [target]'s [affected.name].")) +/decl/surgery_step/robotics/screw_hatch + name = "Screw Hatch" + allowed_tools = list( + SCREWDRIVER = 100, + /obj/item/coin = 50, + /obj/item/material/kitchen/utensil/knife = 50 + ) + + min_duration = 90 + max_duration = 110 + + requires_surgery_compatibility = FALSE + +/decl/surgery_step/robotics/screw_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!..()) + return FALSE + + if(target_zone == BP_MOUTH) + return FALSE + + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected?.open == ORGAN_OPEN_INCISION) + return TRUE + return FALSE + +/decl/surgery_step/robotics/screw_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts to screw the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ + SPAN_NOTICE("You start to screw the maintenance hatch on [target]'s [affected.name] with \the [tool].")) + ..() + +/decl/surgery_step/robotics/screw_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] has closed the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ + SPAN_NOTICE("You have closed the maintenance hatch on [target]'s [affected.name] with \the [tool]."),) + affected.open = ORGAN_OPEN_INCISION + +/decl/surgery_step/robotics/screw_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message(SPAN_WARNING("[user]'s [tool.name] slips, failing to screw [target]'s [affected.name]."), \ + SPAN_WARNING("Your [tool] slips, failing to screw [target]'s [affected.name].")) + /decl/surgery_step/robotics/open_hatch - name = "Open hatch" + name = "Open Hatch" allowed_tools = list( /obj/item/surgery/retractor = 100, - /obj/item/crowbar = 100, + CROWBAR = 100, /obj/item/material/kitchen/utensil = 50 ) @@ -73,7 +122,9 @@ return FALSE var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.open == ORGAN_OPEN_INCISION + if(affected?.open == ORGAN_OPEN_INCISION) + return TRUE + return FALSE /decl/surgery_step/robotics/open_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -93,10 +144,10 @@ SPAN_WARNING("Your [tool] slips, failing to open the hatch on [target]'s [affected.name].")) /decl/surgery_step/robotics/close_hatch - name = "Close hatch" + name = "Close Hatch" allowed_tools = list( /obj/item/surgery/retractor = 100, - /obj/item/crowbar = 100, + CROWBAR = 100, /obj/item/material/kitchen/utensil = 50 ) @@ -107,20 +158,25 @@ if(!..()) return FALSE + if(target_zone == BP_MOUTH) + return FALSE + var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.open > ORGAN_CLOSED && target_zone != BP_MOUTH + if(affected?.open > ORGAN_OPEN_INCISION) + return TRUE + return FALSE /decl/surgery_step/robotics/close_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool]." , \ - SPAN_NOTICE("You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].")) + user.visible_message("[user] begins to close the hatch on [target]'s [affected.name] with \the [tool]." , \ + SPAN_NOTICE("You begin to close the hatch on [target]'s [affected.name] with \the [tool].")) ..() /decl/surgery_step/robotics/close_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].", \ - SPAN_NOTICE("You close and secure the hatch on [target]'s [affected.name] with \the [tool].")) - affected.open = ORGAN_CLOSED + user.visible_message("[user] closes the hatch on [target]'s [affected.name] with \the [tool].", \ + SPAN_NOTICE("You close the hatch on [target]'s [affected.name] with \the [tool].")) + affected.open = ORGAN_OPEN_INCISION affected.germ_level = 0 /decl/surgery_step/robotics/close_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -269,12 +325,14 @@ /decl/surgery_step/robotics/attach_organ_robotic name = "Attach robotic organ" allowed_tools = list( - /obj/item/screwdriver = 100 + SCREWDRIVER = 100 ) min_duration = 100 max_duration = 120 + requires_surgery_compatibility = FALSE + /decl/surgery_step/robotics/attach_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if(!..()) return FALSE diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 36f2548b15d..8d706741641 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -19,9 +19,14 @@ //How much blood this step can get on surgeon. 1 - hands, 2 - full body. var/blood_level = 0 + var/requires_surgery_compatibility = TRUE + //returns how well tool is suited for this step /decl/surgery_step/proc/tool_quality(obj/item/tool) for(var/T in allowed_tools) + var/return_value = check_tool_quality(tool, T, allowed_tools[T], requires_surgery_compatibility) + if(return_value) + return return_value if(istype(tool,T)) return allowed_tools[T] return FALSE diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm index 15c96383641..5102482215b 100644 --- a/code/modules/tables/interactions.dm +++ b/code/modules/tables/interactions.dm @@ -127,16 +127,30 @@ throw_things(user) LAZYREMOVE(climbers, user) -/obj/structure/table/MouseDrop_T(obj/O as obj, mob/user as mob) +/obj/structure/table/MouseDrop_T(obj/O, mob/user, src_location, over_location, src_control, over_control, params) + if(ismob(O.loc)) //If placing an item + if(!isitem(O) || user.get_active_hand() != O) + return ..() + if(isrobot(user)) + return + user.drop_item() + if(O.loc != src.loc) + step(O, get_dir(O, src)) - if ((!( istype(O, /obj/item) ) || user.get_active_hand() != O)) - return ..() - if(isrobot(user)) - return - user.drop_item() - if (O.loc != src.loc) - step(O, get_dir(O, src)) - return + else if(isturf(O.loc) && isitem(O)) //If pushing an item on the tabletop + var/obj/item/I = O + if(I.anchored) + return + + if(!use_check_and_message(user)) + if(O.w_class <= user.can_pull_size) + O.forceMove(loc) + auto_align(I, params, TRUE) + else + to_chat(user, SPAN_WARNING("\The [I] is too big for you to move!")) + return + + return ..() /obj/structure/table/attackby(obj/item/W, mob/user, var/click_parameters) if (!W) @@ -221,7 +235,7 @@ closest to where the cursor has clicked on. Note: This proc can be overwritten to allow for different types of auto-alignment. */ /obj/item/var/list/center_of_mass = list("x" = 16,"y" = 16) -/obj/structure/table/proc/auto_align(obj/item/W, click_parameters) +/obj/structure/table/proc/auto_align(obj/item/W, click_parameters, var/animate = FALSE) if(!W.center_of_mass) W.randpixel_xy() W.layer = initial(W.layer) + ((32 - W.pixel_y) / 1000) @@ -238,8 +252,16 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen var/cell_x = max(0, min(CELLS-1, round(mouse_x/CELLSIZE))) var/cell_y = max(0, min(CELLS-1, round(mouse_y/CELLSIZE))) - W.pixel_x = (CELLSIZE * (0.5 + cell_x)) - W.center_of_mass["x"] - W.pixel_y = (CELLSIZE * (0.5 + cell_y)) - W.center_of_mass["y"] + var/target_x = (CELLSIZE * (cell_x + 0.5)) - W.center_of_mass["x"] + var/target_y = (CELLSIZE * (cell_y + 0.5)) - W.center_of_mass["y"] + if(animate) + var/dist_x = abs(W.pixel_x - target_x) + var/dist_y = abs(W.pixel_y - target_y) + var/dist = sqrt((dist_x*dist_x)+(dist_y*dist_y)) + animate(W, pixel_x=target_x, pixel_y=target_y,time=dist*0.5) + else + W.pixel_x = target_x + W.pixel_y = target_y W.layer = initial(W.layer) + ((32 - W.pixel_y) / 1000) #undef CELLS diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index ea86386e881..2a12bca4360 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -10,19 +10,28 @@ var/list/GPS_list = list() origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) var/gps_prefix = "COM" var/gpstag = "COM0" - var/emped = 0 - var/held_by = null - var/implanted_into = null + var/compass_color = "#193A7A" + + var/emped = FALSE + + var/mob/held_by = null + var/mob/implanted_into = null var/turf/locked_location + var/list/tracking = list() + var/list/tracking_compass + var/obj/compass_holder/compass var/list/static/gps_count = list() + var/process_interval = 6 SECONDS + var/last_process = 0 + /obj/item/device/gps/Initialize() . = ..() + compass = new(src) gpstag = next_initial_tag() name = "global positioning system ([gpstag])" update_position() - add_overlay("working") if(ismob(loc)) if(ishuman(loc)) @@ -32,10 +41,14 @@ var/list/GPS_list = list() else implanted_into = loc else if(issilicon(loc)) + held_by = loc implanted_into = loc else if(istype(loc, /obj/item/robot_module)) + held_by = loc.loc implanted_into = loc.loc + update_icon() + if(held_by) moved_event.register(held_by, src, /obj/item/device/gps/proc/update_position) if(implanted_into) @@ -45,6 +58,8 @@ var/list/GPS_list = list() for(var/gps in GPS_list) tracking += GPS_list[gps]["tag"] + START_PROCESSING(SSprocessing, src) + /obj/item/device/gps/Destroy() GPS_list -= GPS_list[gpstag] moved_event.unregister(src, src) @@ -54,29 +69,64 @@ var/list/GPS_list = list() if(implanted_into) moved_event.unregister(implanted_into, src) implanted_into = null + STOP_PROCESSING(SSprocessing, src) return ..() +/obj/item/device/gps/update_icon() + cut_overlays() + if(emped) + add_overlay("emp") + else if(held_by || implanted_into) + add_overlay("working") + else + add_overlay("confused") + /obj/item/device/gps/pickup(var/mob/user) ..() + if(held_by) + moved_event.unregister(held_by, src) held_by = user moved_event.register(user, src, /obj/item/device/gps/proc/update_position) + update_icon() /obj/item/device/gps/dropped(var/mob/user) ..() - held_by = null - moved_event.unregister(user, src) + if(isturf(loc)) + held_by = null + moved_event.unregister(user, src) + if(user.client) + user.client.screen -= compass + update_icon() + +/obj/item/device/gps/on_slotmove(mob/user, slot) + . = ..() + if(user.client && !(slot == slot_r_hand || slot == slot_l_hand)) + user.client.screen -= compass + +/obj/item/device/gps/equipped(mob/user, slot) + . = ..() + if(user.client && (slot == slot_r_hand || slot == slot_l_hand)) + user.client.screen |= compass + +/obj/item/device/gps/on_module_activate(mob/living/silicon/robot/R) + ..() + if(R.client) + R.client.screen |= compass + +/obj/item/device/gps/on_module_deactivate(mob/living/silicon/robot/R) + ..() + if(R.client) + R.client.screen -= compass /obj/item/device/gps/emp_act(severity) - emped = 1 - cut_overlay("working") - add_overlay("emp") - addtimer(CALLBACK(src, .proc/post_emp), 300) + emped = TRUE + addtimer(CALLBACK(src, .proc/post_emp), 30 SECONDS) + update_icon() update_position() /obj/item/device/gps/proc/post_emp() - emped = 0 - cut_overlay("emp") - add_overlay("working") + emped = FALSE + update_icon() update_position() /obj/item/device/gps/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) @@ -95,6 +145,7 @@ var/list/GPS_list = list() tracking_list[tracking_tag] = (GPS_list[tracking_tag]) data["tracking_list"] = tracking_list + data["compass_list"] = tracking_compass return data // should update constantly @@ -109,6 +160,11 @@ var/list/GPS_list = list() ui.auto_update_content = TRUE ui.open() +/obj/item/device/gps/process() + if(held_by || implanted_into || (world.time < last_process + process_interval)) + return + update_position(FALSE) + /obj/item/device/gps/Topic(href, href_list) ..() @@ -144,6 +200,7 @@ var/list/GPS_list = list() if(GPS_list[new_tag]) tracking |= new_tag + update_compass(TRUE) else to_chat(usr, "Could not locate GPS tag.") @@ -151,29 +208,61 @@ var/list/GPS_list = list() if(href_list["remove_tag"]) tracking -= href_list["remove_tag"] - + update_compass(TRUE) return TRUE if(href_list["add_all"]) tracking.Cut() for(var/gps in GPS_list) tracking += GPS_list[gps]["tag"] - + update_compass(TRUE) return TRUE if(href_list["clear_all"]) tracking.Cut() tracking |= gpstag // always want to track ourselves + update_compass(TRUE) + return TRUE + if(href_list["compass"]) + var/tracking_tag = href_list["compass"] + if(LAZYISIN(tracking_compass, tracking_tag)) + LAZYREMOVE(tracking_compass, tracking_tag) + else + LAZYADD(tracking_compass, tracking_tag) + update_compass(TRUE) return TRUE return FALSE -/obj/item/device/gps/proc/update_position() +/obj/item/device/gps/proc/update_position(var/check_held_by = TRUE) var/turf/T = get_turf(src) + if(check_held_by && held_by && (held_by.x != T.x || held_by.y != T.y || held_by.z != T.z) && held_by != recursive_loc_turf_check(src, 3, held_by)) + moved_event.unregister(held_by, src) + held_by = null + update_icon() + return var/area/gpsarea = get_area(src) - GPS_list[gpstag] = list("tag" = gpstag, "pos_x" = T.x, "pos_y" = T.y, "pos_z" = T.z, "area" = "[gpsarea.name]", "emped" = emped) + GPS_list[gpstag] = list("tag" = gpstag, "pos_x" = T.x, "pos_y" = T.y, "pos_z" = T.z, "area" = "[gpsarea.name]", "emped" = emped, "compass_color" = compass_color) SSvueui.check_uis_for_change(src) + if(check_held_by && held_by && (held_by.get_active_hand() == src || held_by.get_inactive_hand() == src)) + update_compass(TRUE) + +/obj/item/device/gps/proc/update_compass(var/update_compass_icon) + compass.hide_waypoints(FALSE) + if(LAZYLEN(tracking_compass)) + for(var/tracking_tag in tracking_compass - gpstag) + if(!GPS_list[tracking_tag]) + continue + if(!(tracking_tag in tracking)) + continue + if(GPS_list[tracking_tag]["pos_x"] == GPS_list[gpstag]["pos_x"] && GPS_list[tracking_tag]["pos_y"] == GPS_list[gpstag]["pos_y"]) + continue + compass.set_waypoint(tracking_tag, tracking_tag, GPS_list[tracking_tag]["pos_x"], GPS_list[tracking_tag]["pos_y"], GPS_list[tracking_tag]["pos_z"], GPS_list[tracking_tag]["compass_color"]) + var/turf/origin = get_turf(src) + if(!emped && !GPS_list[tracking_tag]["emped"] && origin.z == GPS_list[tracking_tag]["pos_z"]) + compass.show_waypoint(tracking_tag) + compass.rebuild_overlay_lists(update_compass_icon) /obj/item/device/gps/proc/next_initial_tag() if(!LAZYACCESS(gps_count, gps_prefix)) @@ -187,20 +276,24 @@ var/list/GPS_list = list() /obj/item/device/gps/science icon_state = "gps-s" gps_prefix = "SCI" + compass_color = "#993399" gpstag = "SCI0" /obj/item/device/gps/engineering icon_state = "gps-e" gps_prefix = "ENG" + compass_color = "#A66300" gpstag = "ENG0" /obj/item/device/gps/mining icon_state = "gps-m" gps_prefix = "MIN" + compass_color = "#5F4519" gpstag = "MIN0" desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." /obj/item/device/gps/janitor icon_state = "gps-j" gps_prefix = "JAN" + compass_color = "#6eaa2c" gpstag = "JAN0" \ No newline at end of file diff --git a/code/names.dm b/code/names.dm index ab35dbb0e78..b571f627402 100644 --- a/code/names.dm +++ b/code/names.dm @@ -7,8 +7,6 @@ var/list/commando_names = file2list("config/names/death_commando.txt") var/list/first_names_male = file2list("config/names/first_male.txt") var/list/first_names_female = file2list("config/names/first_female.txt") var/list/last_names = file2list("config/names/last.txt") -var/list/clown_names = file2list("config/names/clown.txt") - var/list/verbs = file2list("config/names/verbs.txt") var/list/adjectives = file2list("config/names/adjectives.txt") diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 27ece95b6a0..82ed522058e 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -20,6 +20,7 @@ em {font-style: normal;font-weight: bold;} .ooc .everyone {color: #002eb8;} .ooc .looc {color: #6699CC;} +.ooc .adminlooc {color: #3BBF6E;} .ooc .elevated {color: #2e78d9;} .ooc .moderator {color: #184880;} .ooc .developer {color: #1b521f;} @@ -104,6 +105,8 @@ h1.alert, h2.alert {color: #000000;} .yassa {color: #400987;} .delvahhi {color: #5E2612; font-weight: bold;} .siiktau {color: #A52A2A;} +.freespeak {color: #FF4500; font-family: "Trebuchet MS", cursive, sans-serif;} +.tradeband {color: #5C16C6; font-family: Georgia, Verdana, sans-serif;} .interface {color: #330033;} diff --git a/code/unit_tests/hardsuit_sprite_test.dm b/code/unit_tests/hardsuit_sprite_test.dm new file mode 100644 index 00000000000..8d4c38e7e34 --- /dev/null +++ b/code/unit_tests/hardsuit_sprite_test.dm @@ -0,0 +1,69 @@ +#define UNDERSCORE_OR_NULL(target) "[target ? "[target]_" : ""]" + +/datum/unit_test/hardsuit_sprite_test + name = "Hardsuit Sprite Test" + +/datum/unit_test/hardsuit_sprite_test/start_test() + for(var/rig_path in subtypesof(/obj/item/rig)) + var/obj/item/rig/R = new rig_path + var/list/rig_states = icon_states(R.icon) + + if(!(R.icon_state in rig_states)) + fail("[R.name]'s module icon_state isn't in its icon file.") + if(!("[R.icon_state]_ba" in rig_states)) + fail("[R.name]'s on-back module icon_state isn't in its icon file.") + + var/list/species_to_check = list("") // blank means default, human + if(length(R.icon_supported_species_tags)) + species_to_check += R.icon_supported_species_tags + + if(R.helm_type) + if(!("[R.icon_state]_helmet" in rig_states)) + fail("[R.name]'s helmet icon_state isn't in its icon file.") + if(!("[R.icon_state]_sealed_helmet" in rig_states)) + fail("[R.name]'s sealed helmet icon_state isn't in its icon file.") + if(R.suit_type) + if(!("[R.icon_state]_suit" in rig_states)) + fail("[R.name]'s suit icon_state isn't in its icon file.") + if(!("[R.icon_state]_sealed_suit" in rig_states)) + fail("[R.name]'s sealed suit icon_state isn't in its icon file.") + if(R.glove_type) + if(!("[R.icon_state]_gloves" in rig_states)) + fail("[R.name]'s gloves icon_state isn't in its icon file.") + if(!("[R.icon_state]_sealed_gloves" in rig_states)) + fail("[R.name]'s sealed gloves icon_state isn't in its icon file.") + if(R.boot_type) + if(!("[R.icon_state]_shoes" in rig_states)) + fail("[R.name]'s shoes icon_state isn't in its icon file.") + if(!("[R.icon_state]_sealed_shoes" in rig_states)) + fail("[R.name]'s sealed shoes icon_state isn't in its icon file.") + + for(var/short in species_to_check) + short = UNDERSCORE_OR_NULL(short) + if(R.helm_type) + if(!("[short][R.icon_state]_he" in rig_states)) + fail("[short] [R.name]'s helmet item_state isn't in its icon file.") + if(!("[short][R.icon_state]_sealed_he" in rig_states)) + fail("[short] [R.name]'s sealed helmet item_state isn't in its icon file.") + if(R.suit_type) + if(!("[short][R.icon_state]_su" in rig_states)) + fail("[short] [R.name]'s suit item_state isn't in its icon file.") + if(!("[short][R.icon_state]_sealed_su" in rig_states)) + fail("[short] [R.name]'s sealed suit item_state isn't in its icon file.") + if(R.glove_type) + if(!("[short][R.icon_state]_gl" in rig_states)) + fail("[short] [R.name]'s gloves item_state isn't in its icon file.") + if(!("[short][R.icon_state]_sealed_gl" in rig_states)) + fail("[short] [R.name]'s sealed gloves item_state isn't in its icon file.") + if(R.boot_type) + if(!("[short][R.icon_state]_sh" in rig_states)) + fail("[short] [R.name]'s shoes item_state isn't in its icon file.") + if(!("[short][R.icon_state]_sealed_sh" in rig_states)) + fail("[short] [R.name]'s sealed shoes item_state isn't in its icon file.") + + if(!reported) + pass("All hardsuits have their correct sprites.") + + return TRUE + +#undef UNDERSCORE_OR_NULL \ No newline at end of file diff --git a/code/unit_tests/language_test.dm b/code/unit_tests/language_test.dm new file mode 100644 index 00000000000..88e00b4fb89 --- /dev/null +++ b/code/unit_tests/language_test.dm @@ -0,0 +1,17 @@ +/datum/unit_test/language_test + name = "Language Test - Repeated Keys" + +/datum/unit_test/language_test/start_test() + var/list/used_keys = list() + + for(var/language_path in subtypesof(/datum/language)) + var/datum/language/L = new language_path + if(L.key in used_keys) + fail("[L.name]'s key, [L.key], is used multiple times!") + continue + used_keys += L.key + + if(!reported) + pass("All languages have unique keys.") + + return TRUE \ No newline at end of file diff --git a/code/world.dm b/code/world.dm index ba45d87126e..49b242bf020 100644 --- a/code/world.dm +++ b/code/world.dm @@ -213,8 +213,11 @@ var/list/world_api_rate_limit = list() SSpersist_config.save_to_file("data/persistent_config.json") Master.Shutdown() - to_chat_immediate(world, "
    The server is restarting.
    You should automatically reconnect in a minute or so...


    ") - sleep(1) // this gives clients time to receive the message + var/datum/chatOutput/co + for(var/client/C in clients) + co = C.chatOutput + if(co) + co.ehjax_send(data = "roundrestart") if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite for(var/client/C in clients) diff --git a/config/example/admins.txt b/config/example/admins.txt index 7f61dd46c2a..10e0837ef4b 100644 --- a/config/example/admins.txt +++ b/config/example/admins.txt @@ -5,4 +5,4 @@ # Ranks can be anything defined in admin_ranks.json ~Carn # ###################################################################### -# not_a_user - Head Admin/Dev +# not_a_user - Head Admin/Dev \ No newline at end of file diff --git a/config/example/config.txt b/config/example/config.txt index 0209196b205..618a508d01a 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -539,6 +539,9 @@ FORCE_MAP runtime # Reminds ticket handlers/all admin staff of not-closed tickets after this many SECONDS. #TICKET_REMINDER_PERIOD 600 +# What sector the station/station is currently on. Check _defines/space_sectors.dm for possible options +CURRENT_SPACE_SECTOR Romanovich Cloud + # If using TGS, counts how many regularly TGS hard restarts the server process. # -1 - never do this. # 0 - do this after every round. diff --git a/config/example/tips.txt b/config/example/tips.txt index 6f664f5ddfe..89b8fe60e05 100644 --- a/config/example/tips.txt +++ b/config/example/tips.txt @@ -91,9 +91,6 @@ As a Cultist, invest in taking over xenobio, an adamantine golem army can quickl As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face. As a Cultist, the Blood Boil rune will deal massive amounts of brute damage to non-cultists and some damage to fellow cultists of Nar-Sie nearby. As a Cultist, you can create an army of manifested goons using a combination of the Manifest rune, which creates homunculi from ghosts, and the Blood Drain rune, which drains life from anyone standing on any blood drain rune. -As a Wizard, the fireball spell performs very poorly at close range, as it can easily catch you in the blast. It is best used as a form of artillery down long hallways. -As a Wizard, most spells become unusable if you are not wearing your wizard robe and hat. -As a Wizard, remember to get spells for yourself, and not scrolls, unless you want to give an ability away to someone. Scroll costs double! As a Ghost, you can double click on people, bots, or the singularity to follow them. Occasionally the tip of the round might lie to you. Don't panic, this is normal. To defeat your enemy, shoot at them until they die. diff --git a/config/names/clown.txt b/config/names/clown.txt deleted file mode 100644 index c29fca74ba3..00000000000 --- a/config/names/clown.txt +++ /dev/null @@ -1,37 +0,0 @@ -Gigglesworth -Honkel the III -Goose McSunny -Mr. Shoe -Toodles Sharperton -Dinky Doodle -Honkerbelle -Bo Bo Sassy -Baby Cakes -Ladybug Honks -Ziggy Yoyo -Razzle Dazzle -Buster Frown -Pepinpop -Silly Willy -Jo Jo Bobo Bo -Pocket -Patches -Checkers -Freckle -Honker -Bonker -Skiddle -Scootaloo -Sprinkledinkle -Ronnie Pace -Miss Stockings -Slippy Joe -Redshirt McBeat -Flop O'Honker -Speckles -Bubble -Button -Sparkle -Giggles -Jingle -Candy \ No newline at end of file diff --git a/html/browser/paper_languages.css b/html/browser/paper_languages.css new file mode 100644 index 00000000000..c0dd598c3f5 --- /dev/null +++ b/html/browser/paper_languages.css @@ -0,0 +1,49 @@ +@font-face { font-family: bluebird; src: url(bluebird.woff); } +@font-face { font-family: grandhotel; src: url(grandhotel.woff); } +@font-face { font-family: lashema; src: url(lashema.woff); } +@font-face { font-family: sourcecodepro; src: url(sourcecodepro.woff); } +@font-face { font-family: sovjetbox; src: url(sovjetbox.woff); } +@font-face { font-family: torsha; src: url(torsha.woff); } +@font-face { font-family: web3of9ascii; src: url(web3of9ascii.woff); } +@font-face { font-family: zeshit; src: url(zeshit.woff); } +@font-face { font-family: bilboinc; src: url(bilboinc.woff); } +@font-face { font-family: fproject; src: url(fproject.woff); } +@font-face { font-family: gelasio; src: url(gelasio.woff); } +@font-face { font-family: mo5v56; src: url(mo5v56.woff); } +@font-face { font-family: runasans; src: url(runasans.woff); } +@font-face { font-family: classica; src: url(classica.woff); } +@font-face { font-family: stormning; src: url(stormning.woff); } +@font-face { font-family: copt-b; src: url(copt-b.woff); } +@font-face { font-family: ducados; src: url(ducados.woff); } +@font-face { font-family: kawkabmono; src: url(kawkabmono.woff); } +@font-face { font-family: kaushanscript; src: url(kaushanscript.woff); } + +.siikmaas.understood { font-family: sovjetbox; } +.siikmaas.scramble { font-family: lashema; } + +.yassa.understood { font-family: grandhotel; } +.yassa.scramble { font-family: torsha; } + +.delvahhi.understood { font-family: bluebird; } +.delvahhi.scramble { font-family: zeshit; } + +.encodedaudiolanguage.understood { font-family: sourcecodepro; } +.encodedaudiolanguage.scramble { font-family: web3of9ascii; } + +.solcommon.understood { font-family: mo5v56; } +.solcommon.scramble { font-family: ducados; } + +.tradeband.understood { font-family: gelasio; } +.tradeband.scramble { font-family: gelasio; } + +.freespeak.understood { font-family: kawkabmono; } +.freespeak.scramble { font-family: kaushanscript; } + +.sintaunathi.understood { font-family: classica; } +.sintaunathi.scramble { font-family: copt-b; } + +.sintaazaziba.understood { font-family: fproject; } +.sintaazaziba.scramble { font-family: stormning; } + +.nralmalic.understood { font-family: bilboinc; font-size: 150%; } +.nralmalic.scramble { font-family: runasans; } \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 0abe4abb484..dc44fb46f7a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,1468 @@ -->
    +

    11 July 2021

    +

    Skull132 updated:

    +
      +
    • You can now close the external auth window, if it doesn't close by itself.
    • +
    + +

    09 July 2021

    +

    Geeves updated:

    +
      +
    • Burglars can now inspect their pens to see how far their pen has charged via a loading bar.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Fixes loadout coffee cup being the basic one when spawning.
    • +
    • Fixes coffee cup placement on tables.
    • +
    • Ashtrays now fills less in bags.
    • +
    + +

    08 July 2021

    +

    Geeves updated:

    +
      +
    • Radiation suits have been given new sprites.
    • +
    • Radiation closets now spawn with two anti-rad autoinjectors.
    • +
    • Radiation suits can now hold a similar array of items to an EVA hardsuit in is storage slot now, as well as the hood and the anti-rad autoinjector.
    • +
    • Machines that need a stack of materials to be made now spawns the right amount if mapped in.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Tajara & Vaurca nightvision can now be used even while restrained or laying down.
    • +
    + +

    07 July 2021

    +

    Geeves updated:

    +
      +
    • Added Tech Processors, circuits available in the Machinery section of the circuit imprinter. When linked to an RnD server with a multitool, it will passively increase any techs above level zero.
    • +
    • A single tech processor circuitboard and two basic scanning modules have been added to Tech Storage.
    • +
    • The entrance to the server room now has a button next to it that'll toggle ID Scan, it will also state that it has been used on the science radio channel.
    • +
    • Removed the robotics server from the server room, the core server will now serve and be served by both consoles.
    • +
    • Tech now properly adds the progress to the total progress when you increase a tech level.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Removing accessories is now a radial menu, and it is now also possible to pick which accessory to remove from another person.
    • +
    • Ported coffee cups. They can be found in the 'general' section in the loadout, in the kitchen dinnerware machine and the diner utensil machine.
    • +
    • Ported several new drinking glasses. They can be made in the autolathe, found in the booze-o-mat and a pitcher & carafe can be found ain the kitchen dinnerware machine & diner utensil machine.
    • +
    • Mapped coffee pitchers into command, security, engineering sublevel & medical breakroom and into the surface meeting room alongside with the diplomatic reception.
    • +
    • Grabbing someone aggressively, neck grabs and forcing someone to the ground now uses the same text type as attacking someone.
    • +
    • Lit torches can now be used to ignite stuff, be extinguished by using it in hand and reused.
    • +
    • Traitor clerical kits now starts with a folder full of paper.
    • +
    +

    WickedCybs updated:

    +
      +
    • Blazers are now contained in their own selection and you can choose from the usual blazer you know and love, and a new extended long blazer variant. This does mean you will have to reselect it if you were using a blazer already, sorry about that.
    • +
    • Icarus drones now illuminate their surroundings to a small extent.
    • +
    • The purple comb in the cosmetics section wasn't purple, it was gray. It's been renamed to 'comb' and can now be recoloured too.
    • +
    + +

    05 July 2021

    +

    Doxxmedearly updated:

    +
      +
    • Nymphs split from gestalts now retain the correct accent.
    • +
    • Forbid hivenet and some other special case languages from being learned by dionae.
    • +
    • Nymphs can no long feed hydroponics trays from any distance.
    • +
    • Detached nymphs can no longer merge back with their gestalt from long distances; you now have to be adjacent to your gestalt, as intended.
    • +
    • Nymphs now properly metabolize nutriment. This also allows them to actually finish eating food.
    • +
    • Fixed some 'unusable emote' errors for nymphs when processing reagents that forced emotes. This also allows them to use the rapid blink emote.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • When selecting the wristbound PDA type in character setup, it now spawns in the wrist slot.
    • +
    +

    WickedCybs updated:

    +
      +
    • Tweaked the antag flavour text on the sleepy ring to improve its readability.
    • +
    + +

    03 July 2021

    +

    Alberyk updated:

    +
      +
    • Grabs can not longer be used to force the person being grabbed to attack themselves.
    • +
    +

    Alberyk, Kyres1, Geeves updated:

    +
      +
    • Added new menu buttons icons.
    • +
    • Added a new lobby screen.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Updated the phoron canister bounty to require less moles, and it will now tell you the exact minimum moles needed. Like the sheets bounty, this was a bit too heavy-handed, even for the scarcity arc.
    • +
    +

    Geeves updated:

    +
      +
    • Throwing something at a tile adjacent to you will instead put it down gently, provided you are on help intent.
    • +
    • Clicking on someone with an item in your hand while you have throw mode active and on help intent will offer it to them like you used the Give verb. If they're also on throw intent and on help intent, you put it into their hand directly.
    • +
    • The standard ghost follow menu has been replaced with an upgraded VueUI version.
    • +
    • Wired rods and makeshift stun batons now use the color of cable coil you used to make them.
    • +
    • You can now create a tripwire trap by combining two wired rods with eachother. The color of the wire will be of the wired rod you click on to make it.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The head of personnel now get spare encryption keys for cargo & service.
    • +
    • Engineering & security lockers have been tweaked to ensure their contents remain consistent instead of random. Bags remains random between satchel & backpack however.
    • +
    • Investigator's locker now gets drop pouches and a bag to fit with the rest of security. Warden & HoP are now issued holsters with their weapons.
    • +
    • Icecream now has different flavors, enjoy!
    • +
    • The banshee voidsuit is renamed to be an infiltration instead of combat suit. Also clarified the description in the uplink a little.
    • +
    • Fixes some bugs related to loadout wristbound selection.
    • +
    • The loadout tablet once again works.
    • +
    + +

    02 July 2021

    +

    TheGreyWolf updated:

    +
      +
    • Mechs are no longer immortal.
    • +
    + +

    30 June 2021

    +

    Doxxmedearly updated:

    +
      +
    • Pipe dispensers can be unanchored and anchored properly again.
    • +
    • Removed wizard and conflux (Wizard + Cult).
    • +
    • Removed most wizard-associated spells and items (Wands, staves, Magivend, etc). Some kept for use in admin events.
    • +
    • Removed roundstart tips referencing wizards.
    • +
    • Removed the armor value on wizard robes.
    • +
    • Added a random item spawn for the old wizard clothing, so you can dress up like a nerd. Sometimes spawns in cargo or maint, as well as inside gifts.
    • +
    • Reflavors some items to remove references to the wizard federation.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Vegetable rikazu now have crunchy vegetables instread of cruncy.
    • +
    • Aprons & sundresses will no longer give overheating messages to taj.
    • +
    • All station jobs now have sechud icons.
    • +
    + +

    29 June 2021

    +

    Doxxmedearly updated:

    +
      +
    • If there's a nearby bluespace inhibitor, portals made by the hand teleporter or jaunter will close when you try to go through them, instead of sitting there blocking the tile.
    • +
    • Teleporting into open closets with the closet teleporter no longer melds you into the closet and makes you stuck.
    • +
    • Addressed several runtime issues with teleportation handling.
    • +
    • Hand teleporter portals should no longer view any turf in range of a working bluespace inhibitor as a valid exit. However, interference from a failed teleport somewhere else may still spit you out by one.
    • +
    • Closet teleporters are now affected by bluespace inhibitors. If either closet is in range of one, the teleportation will fail.
    • +
    • You can no longer create a portal with the jaunter or hand teleporter if in range of a working bluespace inhibitor.
    • +
    +

    Geeves updated:

    +
      +
    • You can now use any tool with a matching tool quality for surgery and RIG assembly, meaning you can open an IPC's hatch with a screwdriver augment. Most surgeries need you to use a surgery viable tool, meaning an impact drill cannot be used, the exception being the robotic surgeries.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Emagged recorders will now self destruct upon delivering their message.
    • +
    • Cameras (for taking photos) can now be alt clicked to change photo size.
    • +
    +

    WickedCybs updated:

    +
      +
    • The sleepy ring uplink item now gives a proper description of what it actually does. The amount of poly it injects has also been lowered from 15 to 10.
    • +
    + +

    28 June 2021

    +

    Geeves updated:

    +
      +
    • Fixed the reverb of the cozmo migration event to sound like it's coming from the station.
    • +
    + +

    27 June 2021

    +

    Geeves updated:

    +
      +
    • Disposal Pipe Dispensers now have their own sprite and uses a themed UI.
    • +
    • Automatic Floor Layers now have their own sprite and no longer delete the tiles they dismantle.
    • +
    • Automatic Cable Layers now have their own sprites.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Slicing a fatshouter fillet now properly gives fatshouter fillet slices.
    • +
    + +

    26 June 2021

    +

    Alberyk updated:

    +
      +
    • Fixed admin winding displaying the wrong target message.
    • +
    • Fixed the vampire bite hud icon covering the gun buttons.
    • +
    • Fixed some adhomian drinks not having the correct icon.
    • +
    +

    Alberyk, Ramke updated:

    +
      +
    • Added some new Adhomian drinks. They can be found in the loadout selection and booze vending machine.
    • +
    • Butchering a fatshouter now gives lard.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • You can no longer toggle hardsuit modules (such as maneuvering jets) while dead.
    • +
    • Spawning a chemical dispenser cartridge as an admin now uses a search function similar to how the spawn verb works.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The head of personnel is now given a DENIED stamp.
    • +
    + +

    25 June 2021

    +

    Doxxmedearly updated:

    +
      +
    • Grenades should now exit launchers properly primed, including cyborg launchers.
    • +
    • Changed how being drowsy works. Instead of randomly putting you to sleep with no warning, it now tries to replicate being drowsy via screen wobble, yawning, periodic slurring, and vision blurring/darkening.
    • +
    • Sufficient drowsiness has a small impact on your stamina recovery and stamina cost for things like disarming and sprinting.
    • +
    • Fevers have a slightly higher impact on drowsiness.
    • +
    • The lighting overlays for the service module on the venus borg chassis have been properly aligned.
    • +
    • Hide, bare hide, and wet leather no longer act like steel.
    • +
    • Fixed an issue where you could queue up many clicks on hide sheets to generate extra bare hide.
    • +
    • Wet leather can no longer be used for crafting.
    • +
    • You can now dry wet leather manually with a welding tool. You do not need a mask to do this.
    • +
    • Washing machines can now be started with alt+click.
    • +
    • Added additional examine info to hide sheets that tells you how to tan it into fine leather.
    • +
    • Adds fine leather, which is only made by tanning animal hides. Other than being a little harder to burn, it's just fluff material for those who want to feel rich.
    • +
    +

    Geeves updated:

    +
      +
    • Vaurca, IPCS, and golems are now immune to the skin burning effects of phoron.
    • +
    • Magistake has been updated to be Technomancer themed. Instead of four apprentice mages, it'll be three technomancer apprentices.
    • +
    • The classes for magistake have been tweaked, instead of spawning with set spells, they spawn with different cores. If you don't like your core, refund it and buy a different one.
    • +
    • Added some Warbling event skrell stuff to the game.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Nal'rasan and Siik'tajr now looks more unique when speaking it.
    • +
    • Business cards can now be properly copied at a photocopier.
    • +
    +

    WickedCybs updated:

    +
      +
    • Rest of the footwraps should no longer leave shoe/boot prints, just the default footprints.
    • +
    • Darkens greimorian blood a bit.
    • +
    + +

    23 June 2021

    +

    Alberyk updated:

    +
      +
    • Sinta'azaziba now displays accents.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Updated the ED-209 construction recipe to the new equipment. It now uses armor plates (NOT the plate carriers) instead of the old vests, and disruptor pistols instead of tasers.
    • +
    • Fixed a bug where attaching armor plate to a plate carrier would also try to put the plate in its pockets, giving the message that the plate was too long to fit in the carrier.
    • +
    + +

    21 June 2021

    +

    Doxxmedearly updated:

    +
      +
    • Tweaked some things regarding running with no stamina. It now does oxy damage and takes oxy damage more into account when determining your exhaustion threshold. It's also very slightly more painful. Overall, this reduces the total time you can do this by a small amount.
    • +
    • Nicotine no longer acts as a painkiller.
    • +
    • The above changes fix a bug where smoking could practically give you unlimited sprinting.
    • +
    • Fortune cookies can now be made even if the paper is blank.
    • +
    • The deathgasp emote no longer makes you vomit.
    • +
    • Removed some leftover vox emotes.
    • +
    • Removed some humanlike emotes from stationbounds, specifically the ones that you can't do because you don't have hands or a head.
    • +
    • Bee venom no longer does organ (Tox) damage. The tox damage has bee-n replaced by pain and oxyloss.
    • +
    • Bee behavior (Beehavior) should bee a little less finicky.
    • +
    • Synthetics should no longer bee targeted by bees or affected by their stings.
    • +
    • Some swarms of bees fired from the mobile apiary will bee slightly stronger than their natural counterparts.
    • +
    • Janitors now have access to the custodial area in medical.
    • +
    • Collectable HOS cap now has an on-mob sprite.
    • +
    • Flipped versions of the Himean and Vysokan hats now have in-hand and worn sprites.
    • +
    • Fixed an issue where flipped softcaps would reset to unflipped when being equipped.
    • +
    • Absorbing nymphs should no longer duplicate hats worn by nymphs if they later are split from the gestalt.
    • +
    +

    Geeves updated:

    +
      +
    • Heat Exchanging pipes now start glowing based on temperature.
    • +
    +

    Geeves, Scrambles updated:

    +
      +
    • Added a new kind of non-hostile biological migration event.
    • +
    • Goats will now properly beat someone up when they enter a fey mood.
    • +
    +

    Rotharia updated:

    +
      +
    • Added a bottle of 10u Bicaridine Pills to the med closet next to pharmacy.
    • +
    • Added lights to the engine monitoring room so that the light switch actually does something.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Several new bags are now available in char setup, with pocketbooks being smaller than other bags.
    • +
    • Purses are now available in the loadout under utility. Be fashionable today!
    • +
    + +

    20 June 2021

    +

    Geeves updated:

    +
      +
    • Choosing a pAI chassis is now a radial menu.
    • +
    • Fixed a bug that caused technomancer shields to entirely not work.
    • +
    • Getting hit by a projectile will now properly say the limb name instead of the attack zone name.
    • +
    • Added a fox pAI chassis.
    • +
    • Fixed the parrot pAI chassis in-hand sprites.
    • +
    + +

    17 June 2021

    +

    MoondancerPony updated:

    +
      +
    • Containers with noreact (oven dishes, fryer baskets, grill plates) will no longer be heated by appliances, to avoid accidents.
    • +
    • Certain recipes with sugar will no longer be ruined in the oven or fryer due to caramelisation. Sugar WILL melt on the stove, though.
    • +
    • Containers without reagent data (i.e. things not containing nutriment or certain medicines) will now properly heat up.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The forensic lab has been slightly adjusted and the mass spectrometer, reagent scanner & crime scene cards spawn within the crime scene kit.
    • +
    + +

    16 June 2021

    +

    Doxxmedearly updated:

    +
      +
    • Fixed some incorrect surgery step titles and message text for closing and mending ribcages.
    • +
    • Fixed a bug where farmbots would get stuck doing nothing because it could not path to a sink.
    • +
    • You can no longer feed food to bots and borgs.
    • +
    • Infrared sensors now properly emit their beam when attached to a device, such as a bomb. Signalers can now activate infrared sensors.
    • +
    • Fixed several instances where infrared beams would linger despite the sensor being moved or manipulated.
    • +
    • Borg grippers should pick up stacks of items correctly again, instead of dropping them each time a stack is merged.
    • +
    • Removed the message telling you that you released an item from your gripper when you're putting said item into something like a fridge or grinder.
    • +
    +

    Geeves updated:

    +
      +
    • Fixed a typo in the Tau Ceti sector primer.
    • +
    • Goonchat no longer spaces messages out weirdly upon loading.
    • +
    • Fixed airlocks delaying the start of the round to close first.
    • +
    +

    SpaceBaa updated:

    +
      +
    • Add missing chameleon cap icon.
    • +
    +

    WickedCybs updated:

    +
      +
    • The neck cover body pattern has been shifted down, it should look a bit better now.
    • +
    +

    listerla updated:

    +
      +
    • Corrected the grammar of the revenant bluespace rift announcement.
    • +
    + +

    15 June 2021

    +

    DanseMacabre updated:

    +
      +
    • Added a qipao to the loadout, for the sinophiles in all of us. Sprite by Мяу!#979.
    • +
    • Refluffed the vintage .45
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Fixed a bug where phantom items would remain in a borg's gripper after attempting to place them in things like vendors and grinders.
    • +
    • The surface conference room light fixtures should have visible light tubes in them now.
    • +
    +

    Furrycactus updated:

    +
      +
    • Changed the Hydroponics backroom to serve as a small area to keep animals. It's now a grassy room with dirt plots, a chicken crate, a goat crate, and a box containing the basics to assemble a bee apiary.
    • +
    +

    WickedCybs updated:

    +
      +
    • Added a new webbing accessory, a webbing harness which was taken from Polaris and tweaked. There are three variants to pick from in the loadout. Recolourable versions too.
    • +
    • The FSF synthetic unit now gets a pilot helmet and exchanges its holster for a webbing harness.
    • +
    • The TCFL pilot has had their sidearm slightly reflavoured, it's now an enhanced blaster pistol. Their holster has also been swapped for a webbing harness for a piloty aesthetic.
    • +
    • Mapped in the new harnesses to a few offstation antag roles, like merc. Burglars can also select from more than just holsters now, in case they want to use a webbing.
    • +
    + +

    13 June 2021

    +

    Alberyk updated:

    +
      +
    • CCIA agents should have a bit more of access at the Odin.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Fixed some strange behavior relating to missing arms or hands. For example, unloading handgun magazines drops them to the floor instead of deleting them. Report any other buggy behavior.
    • +
    • Fixed an issue where spawning with a missing hand would cause job items to be deleted, such as liaison briefcases. Now it tries to put it in your other hand. If it can't, it will spawn in your bag or on the floor.
    • +
    • Punching and kicking simplemobs (including viscerators) now applies damage again.
    • +
    • Medical borgs should be able to reattach internal organs as well as limbs/prosthetics.
    • +
    • Changing your name as a borg no longer changes your sprite to the default module.
    • +
    • Fixed some weird interactions with grippers and paper bundles. The icon should update when you remove the last paper from a bundle, and detaching a bundle should leave you with one piece of paper in-gripper.
    • +
    • Traitor borgs will no longer show that they have a damaged interface as if they were emagged.
    • +
    • Filing cabinets can now hold books, cards (playing and ID), forensics slides and swabs, photo albums, clipboards, disks, pens, badges, passports, and keys.
    • +
    • Stationbounds can now collapse rollerbeds, as well as attach bed-connected IVs to patients, remove IVs from beds, and remove vitals monitors from beds.
    • +
    • Added a tip to the rollerbed description to indicate that stationbounds can unbuckle people by clicking the bed with an empty gripper (any kind).
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The PRA cig packet can now be closed.
    • +
    + +

    12 June 2021

    +

    TheGreyWolf updated:

    +
      +
    • Fixes the anomaly container. It should now work properly.
    • +
    + +

    11 June 2021

    +

    Geeves updated:

    +
      +
    • Adds a Parrot chassis for pAI.
    • +
    + +

    10 June 2021

    +

    listerla updated:

    +
      +
    • Changed an instance of somethign to something when applying tape to eyes.
    • +
    + +

    09 June 2021

    +

    WickedCybs updated:

    +
      +
    • Tweaked the track jacket sprites. Biggest change is that it no longer gives people a plank back. It's not majorly changed other than that.
    • +
    + +

    08 June 2021

    +

    Geeves updated:

    +
      +
    • You can no longer spam the technomancer apprentice teleporter to open infinite slots.
    • +
    • Added a chess arena to cargo's maintenance.
    • +
    • Marble can now be used to craft light and dark marble floor tiles.
    • +
    +

    Geeves, Scrambles updated:

    +
      +
    • MMIs have been redone to be braincases instead of simple brain-cradles. They have a new description and a new process of completion. Examining it will give you step-by-step instructions. You no longer need to prepare the brain externally either.
    • +
    • Brain lobotomization has been renamed to be brain preparation.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The investigator program set can now be selected as pre-installed when setting up a new modular computer device.
    • +
    +

    WickedCybs updated:

    +
      +
    • Idris ATM's and some terminals have been tweaked to have the Megacorp's complementary colours.
    • +
    + +

    06 June 2021

    +

    TheGreyWolf updated:

    +
      +
    • Badges no longer have char names visible in the item name.
    • +
    • Badges from the loadout will automatically have the char name attached to them.
    • +
    • Badges will automatically add the name attached to them to the item description. The exception is badges that had their names changed through the custom loadout.
    • +
    • Badges will now give a popup to confirm if a character wishes to imprint their name on the badge when used in hand.
    • +
    • The forensic technician's jacket can now carry the same things in the inventory slot as the detective jacket and both of them can now hold the investigator badge
    • +
    + +

    05 June 2021

    +

    Geeves updated:

    +
      +
    • GPSs now have an idle mode, where they will update their transmitted location every six seconds. This mode activates if they're not in someone's possession.
    • +
    • You can now keep your GPS in your bag, webbing, etc. It will keep actively updating as you move. If you drop the bag, webbing, etc., it'll swap into idle mode after you move again.
    • +
    • Ported the GPS compass, selecting a GPS to track on the C-Track column will add it to the compass. The GPS must be in your active hand/slot to show you the compass.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The DIA badge has been renamed to investigator badge.
    • +
    +

    listerla updated:

    +
      +
    • Added gold star stickers, to both the QM and HoP lockers.
    • +
    + +

    04 June 2021

    +

    Alberyk updated:

    +
      +
    • Smoke bombs should now work properly.
    • +
    • Placing rods on the asteroid ash should no longer create a hole.
    • +
    +

    TheGreyWolf & StoneMane updated:

    +
      +
    • The chief engineer's locker now has a unique hazard vest.
    • +
    +

    WickedCybs updated:

    +
      +
    • Added an alternate dress shirt to the shirt selection in the loadout. It has more detail and colours nicely
    • +
    • All the loadout dress shirts can now have their sleeves rolled up by using the roll up shirt sleeves verb. This has to be done while it's not attached to your uniform. Pre-rolled dress shirts can still be selected too.
    • +
    + +

    03 June 2021

    +

    Alberyk, Canon35, Wickedcybs updated:

    +
      +
    • Added some extra Tajaran related options to the loadout.
    • +
    • Added the Din'aak Mountains accent.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • You can no longer overfill a light replacer with bulbs by drawing from multiple boxes at the same time.
    • +
    +

    Geeves updated:

    +
      +
    • Reflections are now visible in mirrors.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Made the diner & kitchen sofas into comfy variants.
    • +
    +

    WickedCybs updated:

    +
      +
    • The SCC agent uniform had its left facing sprite show a rolled up sleeve even when not toggled. This was fixed so the sleeve is down to match the rest of the sprite.
    • +
    + +

    02 June 2021

    +

    Geeves updated:

    +
      +
    • Added an oxygen canister to the robotics lab.
    • +
    +

    Omicega updated:

    +
      +
    • Fixes ghost spawner pod survivors not being allowed to pick a name in addition to customising their appearance.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Photos are now size tiny, just like paper.
    • +
    + +

    31 May 2021

    +

    Furrycactus updated:

    +
      +
    • Added a more accessible lightswitch to the library.
    • +
    • Renamed the 'autopsy' sinks to 'surgical' sinks in the Medical operating theatres.
    • +
    • Added an extra light fixture to each of the Medical exam rooms and operating theatres.
    • +
    • Replaced the comfy chairs in the bar with sofas to make them look more like actual booths.
    • +
    • Made the little side table in the kitchen eating area into a booth.
    • +
    • Added plant clippers to the surface garden crate.
    • +
    +

    Geeves updated:

    +
      +
    • Core samplers no longer need sample bag, it just stores the rock sliver inside itself.
    • +
    • The suspension generator has been given a makeover.
    • +
    • The boulder has been given a resprite.
    • +
    • Added anomaly containers, mapped in two into long term artifact storage, but you're allowed to cart them anywhere. An additional one can be found in the xenoarch closet.
    • +
    • Artifact batteries and power utilizers have been resprited.
    • +
    • Skrell Tentacle Ties now auto-adapt to the type of headtails you have.
    • +
    +

    MattAtlas updated:

    +
      +
    • New logo!
    • +
    +

    SueTheCake updated:

    +
      +
    • Auto-Compressors, which automatically perform CPR, can be found in medical bay.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The Adhomian watch will now properly display the hour.
    • +
    • The auto compressor should now properly show up in the FR lockers.
    • +
    +

    TheGreyWolf & SomeoneRandom updated:

    +
      +
    • Added the Idris Ordering Terminal & mapped it in by the kitchen & bar.
    • +
    • The bar APC has been moved over to above the disposals & the kitchen atm has been shifted to make space for the Idris Ordering Terminal.
    • +
    +

    WickedCybs, Schwann updated:

    +
      +
    • Added a Luceian Zippo to the Zippo lighter selection. Now you can ruin your lungs while maintaining your faith.
    • +
    • Added a define for bright white light.
    • +
    • Tweaked the lit Fisanduhian zippo sprite.
    • +
    + +

    30 May 2021

    +

    Alberyk updated:

    +
      +
    • Added a space sector system framework for use in the future.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Intoxication lingers longer, especially when drunk.
    • +
    +

    WickedCybs updated:

    +
      +
    • Greimorians, cavern dwellers and certain other aliens now bleed shades of green blood instead of red blood.
    • +
    +

    listerla updated:

    +
      +
    • Added an IPC plushie to loadout, under the name Aphy.
    • +
    + +

    28 May 2021

    +

    Doxxmedearly updated:

    +
      +
    • Buckets no longer fit into chem dispensers or ChemMasters.
    • +
    • You can no longer put food in chem dispensers, including drink dispensers.
    • +
    +

    Geeves updated:

    +
      +
    • Boxes of googly eyes can now spawn in cargo.
    • +
    • AI can now choose to make their hologram appear as the selected character in their loadout. Simply select the Unique option, then Loadout Character.
    • +
    +

    Stryker updated:

    +
      +
    • Re-adds armor and the ability to store security items for the IRU coats.
    • +
    • Trinary Perfection cape variants now properly appear in the suit slot.
    • +
    + +

    26 May 2021

    +

    Furrycactus updated:

    +
      +
    • Blue plastic buckets and wooden buckets can now hold 300 units, up from 120 units (the size of a large beaker).
    • +
    • Yellow mop buckets can how hold 600 units, up from 360 units (2x the size of regular buckets).
    • +
    + +

    25 May 2021

    +

    Geeves updated:

    +
      +
    • You can now test the siemens coefficient of gloves in two ways. The first way is simply probing them with a multitool, the second, holding a battery cell in one hand, the multitool in the other, then probing the cell with your multitool.
    • +
    • Added a holopad to the ERT commander's office.
    • +
    • Made the holopad in Centcomm Control a long range one, allowing it to call to the station and vice-versa.
    • +
    +

    JohnWildkins updated:

    +
      +
    • Tendons now have their own health pool, making them overall more resistant to damage, and less likely to snap overall.
    • +
    • Damaged and destroyed tendons in the legs now cause movement slowdown.
    • +
    • CUT/EDGE weapons can no longer break bones unless they meet the 30 damage threshold.
    • +
    • Fix synthetic limbs acting as if they had snapped tendons.
    • +
    +

    MoondancerPony updated:

    +
      +
    • Refactored how biogenerator recipes are handled.
    • +
    +

    NiennaB, Dumbdumn5, Stryker, Ryverstyx updated:

    +
      +
    • Replaces the old IRU coat with a short coat and a long coat, available in black, brown and white.
    • +
    • Tweaks the existing IRU dusters and trenchcoats.
    • +
    • Adds new Trinary Perfection capes by Ryverstyx.
    • +
    +

    Omicega updated:

    +
      +
    • The medical RIG for first responders now starts with a built-in suit cooler for IPC responders.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Vaurca's darkvision color has been changed.
    • +
    +

    WickedCybs updated:

    +
      +
    • The 5.56 rifle ammo can no longer penetrate people and obstacles anymore. The AP version is unchanged and still can pass through stuff.
    • +
    • Submachinegun turrets don't fire rifle rounds anymore. They'll do the same damage as a .45 now.
    • +
    • There were a few lesser used laser guns in the game that would fire as fast as you could pull the trigger, namely the x-ray guns. They have a bit of a longer fire delay now.
    • +
    • Gauss thumpers and bolt slingers do the same amount of force as the average rifle when it comes to bashing a person with the gun now. Used to be carbine level before.
    • +
    • Gauss thumpers and bolt slingers can now have bayonets affixed to them.
    • +
    • Coalition themed gear crates get bayonets to go with their gauss thumpers.
    • +
    • The TCFL's tac knives have been exchanged for bayonets.
    • +
    + +

    24 May 2021

    +

    Doxxmedearly updated:

    +
      +
    • The Luceism holy book should now have a sprite.
    • +
    +

    Geeves updated:

    +
      +
    • Reagent scanners and their advanced version now have unique sprites.
    • +
    • Added some species-specific sprites for firesuits and their helmets.
    • +
    • Added a proper firefighter helmet to the fire-safety closets.
    • +
    • Firesuits now give a slight amount of protection against negative pressure, enough to buy a couple of seconds of spacewalking.
    • +
    • Very slightly reduced firesuit slowdown, from 1 to 0.8.
    • +
    • Added a firesuit to the CE's office.
    • +
    • The modular computer laptop from the loadout now comes with an ID slot.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Knitting needles are now available in the loadout under the general tab.
    • +
    • Adds the forgotten dirtberry to creamice's recipe.
    • +
    + +

    23 May 2021

    +

    Alberyk updated:

    +
      +
    • Vampire veilwalk no longer allows the vampire to stand inside walls or solid objects.
    • +
    • Vampires can no longer use veilwalk in admin levels.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Borscht no longer gets randomly named with various misspellings when created. While funny, it was a nuisance with the smartheater for chefs.
    • +
    +

    TheGreyWolf & SpecialFilms updated:

    +
      +
    • Several new tajaran food & recipes have been added.
    • +
    • Ras'val clams now exist as a clam type.
    • +
    +

    WickedCybs updated:

    +
      +
    • First responders now have surgery access. Their duties remain unchanged.
    • +
    + +

    22 May 2021

    +

    TheGreyWolf updated:

    +
      +
    • Blood pressure & pulse is now different for several species. The affected species are: Tajara, Unathi & Skrell. The latter two also now have a lower body temperature.
    • +
    +

    WickedCybs updated:

    +
      +
    • TCFL tactical medical belts start preloaded with medicines and a hypo now.
    • +
    • The Eldritch blade can now penetrate through most armour thanks to the power of the Dark God. Previously, it could get blocked by an engineering voidsuit.
    • +
    + +

    21 May 2021

    +

    Alberyk updated:

    +
      +
    • Removed the full explosion option from the explosive implant. It is now one telecrystal cheaper.
    • +
    +

    Alberyk, Canon35 updated:

    +
      +
    • Added new gadpathurian clothing options to the loadout.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Drying racks now hold dried items in their inventory, instead of spitting it out onto its tile.
    • +
    • Fixed the drying rack UI displaying pre-dried items as vendable after drying is done.
    • +
    • Removed the electric chair and electrohelmet assembly.
    • +
    +

    Geeves updated:

    +
      +
    • Random events such as Random Antagonist and Burglar Pod will no longer happen on extended.
    • +
    • Softcaps, berets, and fezzes no longer block the head flavor text.
    • +
    • Tweaked items that can be attached as accessories to use the correct mob_overlay item_state. This might cause some accessories to break, so make a github issue or DM me on discord if you find any, preferably the former.
    • +
    +

    Geeves, Happy Fox, Lanze updated:

    +
      +
    • Mapped a holo-menu into the bar backroom and kitchen table next to the soft drinks. They work off pencode, so you should be able to copy your menus to them directly. Examine them for instruction on how to use.
    • +
    +

    MattAtlas updated:

    +
      +
    • Contractor uniforms now actually display in the character preview.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Taj specific clothing will no longer give the message that they are overheating.
    • +
    +

    WickedCybs updated:

    +
      +
    • NT has finally found some credits in the budget to get duct tape to the tool vendors.
    • +
    • Taj hair has had hair lengths properly assigned. Taj are also able to tie their hair and style it now with the tie-hair verb.
    • +
    • Added TCFL service cards to the loadout in the accessories section. Two variants for the active serving and the veterans. For the Republic!
    • +
    • The Revenant rift announcement has been tweaked to mention Research's ability to print bluespace neutralizers as well.
    • +
    + +

    19 May 2021

    +

    Doxxmedearly updated:

    +
      +
    • You can now be heard by radios and intercoms that are broadcasting (Microphone on) while restrained or cuffed.
    • +
    • Vampire blood heal now gradually heals infections and disinfects wounds, at the cost of additional blood. The blood requirement is small unless the infection is large.
    • +
    +

    Geeves updated:

    +
      +
    • Lockets, holo-badges with the string thing, dogtags, neck bandanas, and the Tajara pocketwatch now appears to hang around your neck when you get examined, instead of being on your face or ears.
    • +
    • Tajara pocketwatche can now be worn on the mask slot.
    • +
    • Skrell can now wear the SCC Combat Hardsuit.
    • +
    +

    Haydizzle updated:

    +
      +
    • Adds prices for skrellian products in the vendors.
    • +
    +

    WickedCybs updated:

    +
      +
    • Tweaked the way some Taj boots sprites are arranged, made it so the knife overlay isn't invisible on them anymore. Did a minor touchup on the workboots. The species unrestricted swat boots now have a Taj specific sprite.
    • +
    + +

    18 May 2021

    +

    MattAtlas updated:

    +
      +
    • Technomancer modifier spells no longer spam you with end messages.
    • +
    • Technomancer fireballs now act like wizard fireballs did and don't break the floor.
    • +
    • Technomancers can no longer toggle spells if they're incapacitated.
    • +
    • Unstable and degen aura no longer affect mobs inside the user.
    • +
    • Degen aura no longer applies toxloss.
    • +
    • Mend organs now fixes tendon breaks and arterial bleeding.
    • +
    • Visitors now spawns a technomancer instead of a wizard.
    • +
    + +

    17 May 2021

    +

    Doxxmedearly updated:

    +
      +
    • Being buzzed no longer gives you a speed boost.
    • +
    +

    Geeves updated:

    +
      +
    • Added a social credit score to the Jargon passport, remember to set yours if you have one.
    • +
    +

    Omicega updated:

    +
      +
    • Freespeak and Tradeband now have language colours, much like Sol Common. Very nice and cool!
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Steramycin is now detectable by health analyzers & the like.
    • +
    +

    WickedCybs updated:

    +
      +
    • Added a few new human hair variations. Emo long fringe now has three new variants. One which has a fringe on the opposite side of the face and two that turn it into a longer hairstyle from the back and sides. There's also a new variation for Gentle, which adds a fringe and lenghtens the hair.
    • +
    + +

    15 May 2021

    +

    TheGreyWolf updated:

    +
      +
    • Being confused now only make movement random if the mob is running.
    • +
    +

    UncleJo, WickedCybs updated:

    +
      +
    • Tweaked how the triage tags look. They should be more visible now.
    • +
    + +

    14 May 2021

    +

    TheGreyWolf updated:

    +
      +
    • The various non-command wristbounds in the loadout have been merged into one list selection.
    • +
    • The loadout laptop now only costs 2 points.
    • +
    • Ntsl2 interpreter no longer spawns by default on any modular computer & command program has been removed from the default security computer along with employment from investigator's computers.
    • +
    • Tablets & wristbounds will now start with the appropriate programs for their selected department.
    • +
    • The loadout now has a department tablet selection and the color is no longer randomised for them.
    • +
    • Medical & security can now download their respective records program. Investigators can download both.
    • +
    +

    WickedCybs updated:

    +
      +
    • Added two new hairstyles for Taj based on the sidepony ones. Tresses and Tresses Alt.
    • +
    • More minor shading improvements to alt taj ahirstyles.
    • +
    • Resprited the Taj balaclavas, they don't leave the face hanging out anymore. The old sprite is the new rolled up sprite for them.
    • +
    • The sterile mask now covers the face of Tajara properly.
    • +
    + +

    13 May 2021

    +

    DanseMacabre updated:

    +
      +
    • Added a two new rescue pod roles: an SCC functionary, and an FSF crewman.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The all new Swimstars plushies & lunchbox has been approved for station usage. Please find them in the loadout.
    • +
    +

    WickedCybs updated:

    +
      +
    • Added some new colourable pant options. There's now dress pants with a belt, a colourable version of the designer jeans called tailored jeans and a colourable version of the mustang jeans. All three are located within the recolourable pants tab in the loadout uniform selection.
    • +
    • The 'pants (recolourable)' selection has had a small name tweak. It's now 'pants selection (recolourable)' and has a generic description.
    • +
    + +

    12 May 2021

    +

    Geeves updated:

    +
      +
    • Added a loadout option to shoes to make them spawn in your choice of under or over their uniforms.
    • +
    • Attacking someone with a sharp or edged weapon now has a chance to splatter blood to any tile around them.
    • +
    • Arterial sprays can now go onto walls.
    • +
    • Sharp or edged weapons are now twice as likely to cover you in blood as an attacker.
    • +
    • Flight helmets can now link to shuttle computers to give you a status readout on your main HUD, though the visor needs to be flipped down.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Shastar Leaves & Royal Choice cigarettes are now in the vending machine for all your lung killing needs.
    • +
    +

    WickedCybs updated:

    +
      +
    • Left facing sprite of the radhood was misaligned, it's been corrected by being shifted one pixel to the left.
    • +
    • The Freelancers distress team has had its equipment changed up. Everyone now gets sidearms, the leader getting a revolver and the rest having .45s. The 10mm submachineguns have been swapped for a .45 submachinegun. People who lacked a knife have one now. At the baseline, they're stil one of the weaker ERT's comparatively but no longer major pushovers other than the lead, who has always been good.
    • +
    • Freelancers now get some additional equipment if they're rolled. The Distress team base will give them zippos, cigars, holsters, vests and a few weapon racks that will provide random guns to vary up their firepower within reason. No two merc outfits are alike, right?
    • +
    +

    William Murdoch updated:

    +
      +
    • Adds a telecopic cane which can be found in the loadout under cane.
    • +
    • Merges white cane and crutches under the cane option in the loadout.
    • +
    + +

    10 May 2021

    +

    Geeves updated:

    +
      +
    • Added a chance for emergency toolboxes to spawn emergency welding tools and emergency goggles.
    • +
    • Resprited wrenches and crowbars to match the new tool style.
    • +
    • Tweaked wirecutters to spawn in the same color as the other tools in your toolbelt. Random wirecutters will still have random colors.
    • +
    +

    WickedCybs updated:

    +
      +
    • The Eridani beacon team has had a massive restructuring. It's been renamed to the Eridani Asset Protection Team. The EAPT now has two focuses. Protection and medical care. Its IAC holdovers are mostly gone at this point and its members have improved weaponry and a new leader role that can be selected. I have tried to make sure this wouldn't be too overbearing. They are not doom marine giga killers but they can get the job done at least.
    • +
    • The energy rifle has been slightly nerfed to not fire as fast as you can click now. It still fires very fast though.
    • +
    • The Strike hardsuit spawns with additional modules for non-ninja antags and beacon responders. The additional modules are more themed around its policing aesthetic and include a mounted gun, actuators and more.
    • +
    + +

    09 May 2021

    +

    Geeves updated:

    +
      +
    • Resprited the plasma cutter.
    • +
    • Stock parts have been given new sprites.
    • +
    • Voting for something is now logged.
    • +
    +

    WickedCybs updated:

    +
      +
    • Raiders now have one set of Tajaran and Unathi insulated gloves added to their engineering supplies.
    • +
    • The distress team base now has three pairs of insulated gloves added to its engineering rack. Standard, Tajaran and Unathi.
    • +
    • The TCFL now have insulated gloves that can fit other species.
    • +
    + +

    08 May 2021

    +

    Doxxmedearly updated:

    +
      +
    • Fixed an issue with the germ counter going into negative values on limbs, which caused odd behavior such as reoccurring infections.
    • +
    +

    Geeves updated:

    +
      +
    • Added sprites to bolted and welded tesla equipment to more easily see whether it's bolted or not.
    • +
    • Fixed eyestabbing not updating the damage overlay for the eyestabbee.
    • +
    • If the eyestabbee has eye protection, the stab will automatically be redirected to the head in general.
    • +
    • Only clothing considered made of thick materials will now protect from eye stabbing.
    • +
    • Gas masks, safety goggles, and tactical HUDs have been given the thick material flag.
    • +
    • Getting eyestabbed while wearing glasses will cause the glasses to shatter.
    • +
    • Added maptext to the impact wrench to let you know which mode it's in.
    • +
    • Fixed the impact wrench having flipped sounds.
    • +
    • Skrell in Srom will now be able to hear people talking around them, and hear things on the radio if they body has one.
    • +
    • You will now be properly able to hear things from your old body if you're remote controlling something.
    • +
    • Updated flamethrowers to use the sprites of the welding tools they were made from.
    • +
    • Flamethrowers now instantly light anyone in their path on fire.
    • +
    • Gave flamethrowers a nicer sound effect.
    • +
    • The full flamethrower now comes with a gas tank installed.
    • +
    • Tweaked the attack verbs of lit welders.
    • +
    • Added sounds to the attack of lit welders.
    • +
    • Dragging a bloody person across the floor will now leave nice looking blood smears.
    • +
    • Footwraps will now place down the species footprint style instead of a normal shoe footprint.
    • +
    • Added triage tags. Examine any humanoid while wearing any MedHUD to edit their triage tags. It comes in four variants, green, yellow, red, black, to show how critical the patient is.
    • +
    • Made HUD elements for humanoids not inherit the rotation applied to them, so a horizontal human will still have a normal upright medHUD display.
    • +
    • Multitools now have a tracking mode that leads you to the APC within your area.
    • +
    +

    Geeves, CNEGecko updated:

    +
      +
    • Added science taperolls to the science sub-level, as well as various science lockers.
    • +
    +

    Geeves, Haydizzle updated:

    +
      +
    • Adds support for dual-colored items.
    • +
    • Adds unathi clothes: the Th'akh maxtlatl outfit, himation cloak, jokfar vest, gyazo belt, jeweled bracers, and rockstone cape.
    • +
    • Tweaks the sprite for the zazali garb.
    • +
    • Makes the zazali garb dual-colored.
    • +
    +

    MattAtlas updated:

    +
      +
    • Ported the Technomancer gamemode from Polaris. Note: as a Technomancer you can use the Toggle Lock verb on your power pack to make it unremovable.
    • +
    • Wizard has been removed from the secret rotation.
    • +
    +

    MoondancerPony updated:

    +
      +
    • Fixes certain things (bottles, grenades, etc.) having incorrect icons in vendor previews.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Adds the tribunalist medical beret.
    • +
    • Added earthenroot soup, adhomian sausages & chocolate bars to the lunchbox options and additionally they can now also spawn with a single utensil of choice.
    • +
    +

    WickedCybs updated:

    +
      +
    • Tweaked TCFL projectiles, like the heavy blaster bolt and highex gauss round. They have some AP now, with the former being rifle level and the latter having enough to not get blocked by a standard corporate vest.
    • +
    + +

    07 May 2021

    +

    Geeves updated:

    +
      +
    • Changed all hardsuits over to the contained sprite system, there should be no player-facing changes.
    • +
    + +

    06 May 2021

    +

    Geeves updated:

    +
      +
    • Fixed the fire blast projectile air blow thing on the industrial welding tool being misaligned with the sprite.
    • +
    +

    Haydizzle updated:

    +
      +
    • Adds eki, guami, q'lort, and ylpha to the MegaSeed Servitor.
    • +
    +

    MattAtlas updated:

    +
      +
    • Melee weapons can now apply AP to humans too instead of just simple mobs.
    • +
    • Mech armor code should now be more consistent. Mech armor now actually blocks EMPs.
    • +
    • Moderators may now respawn players and change names from VV.
    • +
    +

    WickedCybs updated:

    +
      +
    • The TCFL issue Energy Utility Knives are finally available to more than just the Prefect. They've been added to the rack with the Legion's various melee options. Your tax dollars at work, people.
    • +
    • Added Tajaran variants of the Himean voidsuits and a modkit in the loadout that allows them to be used, either on a mining or engineering voidsuit.
    • +
    + +

    05 May 2021

    +

    DanseMacabre updated:

    +
      +
    • Removed the broken man facial hair style.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Wounds are less likely to infect limbs if small or properly treated. Infections should also progress a little less quickly.
    • +
    • Added a new medication, Steramycin. If administered before a limb reaches the first infection level, it has a great chance to prevent infection. It has no effect on infections that have progressed to or past level one; it's meant to be used as insurance against infections after being wounded. It does not sterilize wounds, so make sure those are treated (Or the limb may re-infect)! Created with a ratio of 2 Thetamycin to 1 Sterilizine to 1 Radium, and produces 2 units.
    • +
    • When an RnD machine (Like the circuit imprinter) has insufficient reagents for items in its queue, the machine errors will now use the reagent name instead of the /decl/ path.
    • +
    +

    MattAtlas updated:

    +
      +
    • Melee weapons now properly apply armor penetration.
    • +
    +

    MoondancerPony updated:

    +
      +
    • Fixes a runtime in preference creation that caused CI to fail.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Fixed the taj mechanic & NT overall uniforms. They can now be rolled down.
    • +
    +

    WickedCybs updated:

    +
      +
    • Added a chance for the rescue pod survivor offstation role to be a member of the TCFL.
    • +
    • Added alt versions for the Taj sideponytail and shoulderlength hairstyles.
    • +
    + +

    04 May 2021

    +

    JohnWildkins updated:

    +
      +
    • Fractures are no longer guaranteed once a limb takes 30 brute damage. Repairing a broken bone no longer relies on the limb being healed HP-wise.
    • +
    +

    MattAtlas updated:

    +
      +
    • Fixed a few runtimes in standard weapon hit effects.
    • +
    • Added a preference for floating chat color. This is per-character and updates in game when you update it on the pref window too.
    • +
    • Windows like the accent and citizenship window no longer go under the pref window when opened.
    • +
    • Loading a new character now actually updates the preview window.
    • +
    + +

    03 May 2021

    +

    Geeves updated:

    +
      +
    • Hardsuits now have injection ports again, so do magboots. You no longer have to heal people through their feet. You know who you are.
    • +
    +

    WickedCybs updated:

    +
      +
    • The TCFL pilot now gets their protective variant of the pilots jacket. Used to be the common crew version which had no resistances.
    • +
    + +

    02 May 2021

    +

    Geeves updated:

    +
      +
    • Mobs that are invisible to the AI will no longer show their security and medical HUDs to it.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The fiber & print collection kits can now take samples by drag clicking them in addition to ordinary clicks.
    • +
    • Idris now have their own unique rag in the loadout.
    • +
    + +

    01 May 2021

    +

    Geeves updated:

    +
      +
    • Phoron has been buffed to do more damage when contacting the skin in gas form.
    • +
    • Holding the station blueprints in your hand will now give you a t-ray scanner like view of the pipes, cables, and disposal pipes as they were at the start of the round.
    • +
    • Added a slider to the modular computer hardware configurator that affects how far audible alerts will get output, 0 being only to the person directly holding it.
    • +
    • Added a Mute Messages button to the chat client that makes it so that received messages don't appear in your chat. Running the chat in the background will still make the beeps, however.
    • +
    • Added laser rifles and energy carbines to the dangerous weapons uplink.
    • +
    • You can now slide items across tables by click dragging from the item to the table.
    • +
    • Changed the plant analyzer's sprite.
    • +
    • Fixed the plant analyzer turning you into a square when held.
    • +
    +

    Haydizzle updated:

    +
      +
    • Removes the ability for skrell to be Dominian consular officers.
    • +
    +

    MoondancerPony updated:

    +
      +
    • Fixes the toggle message for cooking machines.
    • +
    + +

    30 April 2021

    +

    Alberyk updated:

    +
      +
    • Buckling someone else now takes some seconds. Buckling is still instant if they are lying down.
    • +
    +

    Geeves updated:

    +
      +
    • Added blood patches, accessories that show off your blood group for all to see.
    • +
    • Antags that don't appear at roundstart no longer appear in the Role menu in character creation.
    • +
    • Added buddy tags to the utility loadout. They're small devices that can be attached to uniforms that will beep if they don't have a paired buddy in range.
    • +
    • Ported various sprites related to robotics, cyborgs, and exosuits.
    • +
    • You can now collapse rollerbeds.
    • +
    • Ported and tweaked sprites for: Toolbelts, Belt Overlays, Welding Tools, Impact Wrench, Air Analyzer, T-ray Scanner, Flamethrower, Multitool.
    • +
    +

    Geeves, SleepyWolf updated:

    +
      +
    • Fixed diona blinking helmethead and blinking p-body blinking very rapidly.
    • +
    +

    JohnWildkins updated:

    +
      +
    • Adminhelps/PMs should no longer have issues displaying apostrophes and other special characters.
    • +
    +

    MoondancerPony updated:

    +
      +
    • Fixes an infinite recursion in vendor spritesheet code.
    • +
    • Fixes missing placeholder item sprites causing SSassets warnings.
    • +
    • Assets now load after SSplants.
    • +
    • Removes the now-useless delayed asset load variable.
    • +
    +

    WickedCybs updated:

    +
      +
    • NanoMed Plus vendors now get exactly one bottle of theta each.
    • +
    + +

    29 April 2021

    +

    Geeves updated:

    +
      +
    • Added kneepads to the accessory loadout category. It provides no protection.
    • +
    • Ported stasis beds. RnD can print their circuitboards once they've reached level four research in magnets, engineering and bio.
    • +
    • Added vitals monitors for rollerbeds, two mapped into medical's GTR.
    • +
    • Ported various new organ sprites.
    • +
    +

    Haydizzle updated:

    +
      +
    • Swaps the east and west facing sprites of the mecha eye (yellow) augment for vaurca so it displays properly.
    • +
    +

    Omicega updated:

    +
      +
    • The ostensibly Dominian sash selection is now a more generic coloured sash selection.
    • +
    • Added a wholly colourable sash variant to the loadout screen, to allow for colours beyond the existing selection.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Handkerchiefs naming are now properly fixed.
    • +
    • Diona ear slot is now aligned correctly on the hud.
    • +
    + +

    28 April 2021

    +

    Geeves updated:

    +
      +
    • Added Speech-To-Text to the NTIRC program. Simply open the desired chat, enable Speech-To-Text, and chat away. You can even close the program, as long as the chat service remains running. Only one chat can have an active STT at a time, and you have to be at least adjacent to the device.
    • +
    +

    Haydizzle updated:

    +
      +
    • Added a colorable version of the hide mantle with three different hides to choose from.
    • +
    • Replaced the old hide mantle sprite for unathi.
    • +
    • Tweaks the wording for unathi clothes descriptions.
    • +
    +

    JohnWildkins updated:

    +
      +
    • The entertainment radio channel's color has been changed to silver on the dark chat theme, to visually separate it from Supply + Engineering.
    • +
    +

    Omicega updated:

    +
      +
    • Adds a cream and grenadine cartridge to the booze dispenser.
    • +
    • Beefed up the emergency boxes with more emergency equipment.
    • +
    +

    Shadowtail117 updated:

    +
      +
    • The input bar now changes color depending on whether you have hotkey mode enabled or not.
    • +
    • You can now alt-click a container that's within touching range to open it.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The NT Quik-Pay can now be paid using charge cards.
    • +
    +

    WickedCybs updated:

    +
      +
    • Research Directors are now able to select the alternate tool belt variant in the loadout.
    • +
    • Added a combat medical belt. It can hold nine things compared to the usual seven and accepts a few more items as well, like handcuffs and even ammo magazines.
    • +
    • The medical section of the antag uplink now has a few more options to choose from. A fully loaded combat medical belt, an advanced medical kit and O- bloodpacks.
    • +
    • Mercenaries now have butazoline and perconol added to their starting medical supplies as well as one combat medical belt.
    • +
    • Some ERT responders now start with combat medical belts as well. Would be TCFL, FSF, Kataphracts, Freelancers, NT-ERT.
    • +
    +

    WickedCybs, Sue updated:

    +
      +
    • Added a few new hairstyles for Tajara, such as a an alternate version of the curly one, a new bun hairstyle, few more. Check it out.
    • +
    • Minor shading and improvements were conducted to a few of the older hairstyles, like the braid, short fringe, not very notable though.
    • +
    + +

    26 April 2021

    +

    WickedCybs updated:

    +
      +
    • Glowsticks now illuminate a bit further, a bit more than a PDA light. They've been made dimmer to compensate.
    • +
    + +

    25 April 2021

    +

    Geeves updated:

    +
      +
    • You can now examine papers and photos in slide projectors as long as you can see its projection.
    • +
    • You can now put slide projectors down on tables without them projecting onto it.
    • +
    +

    Geeves, SleepyWolf updated:

    +
      +
    • Added a lot of Diona customization options: Hair, Facial Hair, and Body Markings.
    • +
    +

    MattAtlas updated:

    +
      +
    • The clown outfit has been removed from the game.
    • +
    +

    Omicega updated:

    +
      +
    • Black jeans shorts (and short shorts) now look more similar to the full-length black jeans themselves.
    • +
    • Fixed a typo in the luceian amulet's name.
    • +
    • Adds a medical scan verb for ghosts, allowing them to health analyse whatever mob they're following, assuming it's health analysable in the first place.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Human passports should now once again be visible.
    • +
    • The handkerchief now works! Temporarily.
    • +
    • Added a colorable vest to the loadout.
    • +
    • Crime scene markers can now be placed on a turf by clicking on it.
    • +
    +

    WickedCybs updated:

    +
      +
    • The breakfast wrap no longer has over twenty units of condesned capsaicin inside of it. That was over half of a pepperspray can. It now only has regular capsaicin and will still be spicy, but not to a paincrit level.
    • +
    • Added a NanoTrasen and Fisanduhian zippo lighter to the game. You can find these in the zippo selection in the loadout menu.
    • +
    • You can now get a photo album from the general section of the loadout, if desired.
    • +
    + +

    24 April 2021

    +

    Geeves updated:

    +
      +
    • Added an infiltration kit to the Devices and Tools uplink. It spawns a case containing a mask, a uniform, gloves, and shoes, capable of protecting you from the vacuum of space, as well as two atmospheres of overpressure.
    • +
    • Ported max and min pressure tolerances for items and clothing, meaning that certain gear will now protect better from overpressure, such as atmos voidsuits, firesuits, bomb suits, and to a lesser extent, engineering voidsuits.
    • +
    + +

    23 April 2021

    +

    Geeves updated:

    +
      +
    • Written languages now work in paper bundles, folders, and clipboards.
    • +
    +

    JohnWildkins updated:

    +
      +
    • Fixed overactive sanitization on certain mob/say types.
    • +
    +

    Omicega updated:

    +
      +
    • Doubled the 'durability' of most cigarettes. You can now smoke them for about twice as long as before.
    • +
    +

    WickedCybs updated:

    +
      +
    • Added a new pattern for the head. Tiger stripes very minor. It's like Tiger stripes minor, just with a bit less going on. Anyone can use it.
    • +
    • Reorganized Taj markings so they're not mixed in with other species patterns. This is more of a contributor facing change, if you're a player, don't worry about it.
    • +
    • The Taj combat uniforms are rebalanced. Their uniforms provide marginal protections like other military uniforms.
    • +
    • The PRA cosmonauts have been rebalanced slightly, getting updated boots and a few new pistol magazines in their military belts.
    • +
    • The TCFL uniforms now have a small melee resist like other fatigue type clothing.
    • +
    + +

    22 April 2021

    +

    Geeves updated:

    +
      +
    • Inflatable boxes can now pick up uninflated inflatables by clicking on them, similar to ore satchels.
    • +
    • Inflatable boxes now use simple storage slots with a number next to the item to show how much it has.
    • +
    • Inflatable boxes now have in-hand sprites.
    • +
    • Tweaked the code for what can puncture inflatables, any sharp, edged, or lit object can now puncture inflatables.
    • +
    • Deflating an inflatable now plays an animation.
    • +
    • Tweaked the order of operations when you open in inflatable door. You should now be able to pass through it easier.
    • +
    • Inflatables boxes now spawn with more inflatables.
    • +
    • Emergency closets that used to spawn loose inflatables will now instead spawn a less filled inflatables box.
    • +
    • Various engineering suits now let you hold inflatable boxes in suit slots, including hazard vests.
    • +
    • You can no longer sing in sign language.
    • +
    • Singing will no longer get the music notes scrambled if you don't understand the language.
    • +
    +

    MattAtlas updated:

    +
      +
    • Added a handkerchief to the loadout under the General tab, a subtype of the rag.
    • +
    +

    Omicega updated:

    +
      +
    • Changed Freespeak's speech verb from 'growls' to 'says'.
    • +
    • Set EAL's singing verb properly.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The investigation team has been issued new improved gloves.
    • +
    • Tajara & vaurca will no longer visibly dilate their eyes when using night vision & their eyes are hidden under clothing/glasses.
    • +
    +

    WickedCybs updated:

    +
      +
    • Added a ballistic carbine, a less powerful counterpart of the assault rifle. It is only semi auto, has lower ammo capacity and uses a slightly weaker type of rifle round, 5.56. Currently, merchants and antags that recieve random guns can obtain it.
    • +
    • Added a smaller variant of the 5.56 mag that only holds 15 rounds rather than 30. It can be printed from a lathe if desired.
    • +
    + +

    21 April 2021

    +

    Karolis2011 updated:

    +
      +
    • Added shortcut for vueui ui's to make topic calls in a nicer way.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • The loadout now have a selection of prescription medicine.
    • +
    +

    WickedCybs updated:

    +
      +
    • Added an Idris Incorporated lunchbox that can be selected in the loadout menu. Features cool animated corporate logo technology, isn't that swell?
    • +
    + +

    20 April 2021

    +

    DanseMacabre updated:

    +
      +
    • Added a new ERT - the Free Solarian Fleets Fireteam. They're a group of formerly Solarian mercenaries on the SCC's payroll. Also added a Solarian energy dagger.
    • +
    • Changed the spawning odds for the EPMC ERT.
    • +
    • Changed the descriptions for some Solarian uniform items.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Espresso cartridges now contain 500u like all other dispenser cartridges.
    • +
    +

    Geeves updated:

    +
      +
    • Added the abilty to change the layering of glasses/goggles, to make them go over or under your hair, via a right click menu. By default, they'll go under.
    • +
    +

    Geeves, Caelphon updated:

    +
      +
    • Added a Jargon Federation passport to the Xenowear - Skrell loadout, selectable by skrell, vaurca, and diona.
    • +
    +

    WickedCybs updated:

    +
      +
    • Practically all footwear that taj could wear have been adjusted to better fit them. Same for voidsuits, hardsuit boot segments. This is hopefully the last time I ever have to adjust something like this. Minor issues like exposed body parts were fixed along the way for some items.
    • +
    • Taj have their own blood overlays and damage overlays now to make it easier to reflect certain things on the unique parts of their sprite now.
    • +
    • Medical responders for off station roles now have loadouts that will allow them to treat their teams effectively. Mainly, you'll find they now have a belt full of useful liquid medicine that can be injected along with some adjustments to what they carry in their bags, like getting health analyzers!
    • +
    • Added a variant of the combat hypo that doesn't start loaded with reagents already.
    • +
    • Added a butazoline reagent bottle that can be spawned on demand by admins if needed, put into loadouts or mapped in if desired.
    • +
    + +

    19 April 2021

    +

    Arrow768 updated:

    +
      +
    • Readds the Cameras in the Consular/Representative-Office due to recent events.
    • +
    +

    Geeves updated:

    +
      +
    • IPCs can no longer take the Moroz religion.
    • +
    • You can now write in your language on papers, and people who can't speak that language won't be able to read it. You can mix languages on the paper, writing a sentence in Sol Common, the rest in basic, and the last bit in Freespeak.
    • +
    • Added slide projectors, capable of projecting an image of any small item onto any turf.
    • +
    • Vaurca tunnel cloaks now have standard backpack storage size.
    • +
    • Material sheets now show the number of sheets left in the HUD now.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Skrell can now *warble with sound. *warble.
    • +
    • The holodeck boxing simulation now has a ringside bell.
    • +
    • You will no longer attempt to resuscitate prone people who are on fire, instead they will be put out first.
    • +
    • Price scanners can now scan people without hitting them.
    • +
    • Added a ringer to the investigations office, forensic lab, evidence storage & autopsy linked to a button by the lab front desk.
    • +
    • Added intercoms to the forensic lab, evidence storage, autopsy & investigations office.
    • +
    • Fixed the disposal in the forensic lab.
    • +
    • Autopsy now has a request console for that paperwork.
    • +
    • An air alarm has been put into evidence storage.
    • +
    +

    Waff-AI updated:

    +
      +
    • Added a new greimorian plushie, to promote the change from spiders.
    • +
    • Changed the plushie loadout description to not be from the generic plushie item.
    • +
    • Added a set of new Skrellian tentacle-tails, and a Skrellian loadout option for scrunchies.
    • +
    +

    WickedCybs updated:

    +
      +
    • Refluffs the Dominian sweater and Bomber coat to be representative Fisanduh as it fit the overall style more, and removes them from the Dominian clothing selections, having them be their own unique selection instead. They also have new fluff descriptions. Cool.
    • +
    • The gatling laser has been buffed to be far more dangerous. It has more ammo capacity, a new firing mode that sends even more laserfire downrange, slightly less charge time and overall increased useability. It's not the liability it used to be!
    • +
    • Medical belts can hold medical tape now, if desired.
    • +
    • Dogtags can now be worn on the mask slot which will also showcase its on-mob sprite that hangs from the neck. When attached as an accessory, it will no longer be directly visible.
    • +
    + +

    18 April 2021

    +

    Alberyk updated:

    +
      +
    • Tweaked unathi hair and religion choices to be more lore accurate.
    • +
    +

    Geeves updated:

    +
      +
    • You can now sing by putting % before your message.
    • +
    • Reviving simple mobs will now restore their blood.
    • +
    • Buffed K'ois healing, it now heals 1.4 brute damage per unit, up from 1.2. And 1.6 burn damage per unit, up from 1.2.
    • +
    • Moved the blood restoring part of K'ois to the correct place, it should work properly now.
    • +
    • Tweaked K'ois potency value, their spores should spread better now.
    • +
    • Changed the telebaton's sprite, it should be easier to see in your inventory now.
    • +
    +

    Geeves, Haydizzle updated:

    +
      +
    • Added colourable cloth handwraps to the Unathi loadout.
    • +
    +

    Geeves, Sgtsammac updated:

    +
      +
    • Added a special First Responder backpack to the First Responder lockers. They are reskinned backpacks.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Wall mirrors can now be used to change facial hair & hair color in addition to hair.
    • +
    • Thralls can now properly be made into vampires again.
    • +
    +

    William Murdoch updated:

    +
      +
    • Adds a grill to the kitchen.
    • +
    + +

    17 April 2021

    +

    Chada updated:

    +
      +
    • Added a bunch of immersion and QOL changes to the AI lawset, mostly it's unchanged other than more freedom in law 1 and 2. Also added a law 3 rephrasing.
    • +
    +

    Doxxmedearly updated:

    +
      +
    • Reduced the required amounts for phoron sheet and phoron canister bounties. Reduced phoron spawns in warehouse.
    • +
    +

    Geeves updated:

    +
      +
    • Opening an IPC's hatch will no longer ask you whether you want to open or close it.
    • +
    • Added a surgery step where IPC hatches must be screwed shut, instead of automatically screwing shut after being crowbarred.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Ear slot mob sprites will now update properly again.
    • +
    • Prevented an issue from causing earmuffs & headphones to replace headsets for latejoins. All two ear items will now spawn in bags rather than on the ear.
    • +
    + +

    16 April 2021

    +

    kyres1 updated:

    +
      +
    • Resprites the laser rifle, energy carbine, laser shotgun, energy rifle, lawgiver, grenade launcher, combat shotgun, bullpup carbine, 9mm SMG, LWAP, plasma bolter, and plasma slammer.
    • +
    + +

    15 April 2021

    +

    Geeves updated:

    +
      +
    • Catching something will now longer deafen you with the item's dropsound, instead, it'll just smoothly play the pick-up sound.
    • +
    +

    JohnWildkins updated:

    +
      +
    • Hyposprays and autoinjectors should now account for armor coverage properly, and prevent injection on invalid targets (incl. robotic limbs).
    • +
    +

    WickedCybs updated:

    +
      +
    • Added crewneck and v-neck sweaters. Find them of course, in the sweaters selection.
    • +
    • Tweaked the arrangement of each sweater in the sweaters loadout selection. The normal sweaters will be at the top of the list together, with the argyle sweaters at the bottom together.
    • +
    + +

    14 April 2021

    +

    Doxxmedearly updated:

    +
      +
    • Added the option to hide LOOC from ghosts/observers only. Check Show/Hide LOOC (Observers) in the Preferences tab, or the Observers LOOC setting under the Global tab in character setup. You do not need to toggle this if you already have regular LOOC disabled.
    • +
    • Adds Admin LOOC for mods/admins, which functions as LOOC but displays regardless of a person's LOOC preferences. Has a slightly different color to LOOC.
    • +
    + +

    13 April 2021

    +

    Alberyk updated:

    +
      +
    • Fixed the cybersuit choice in the ninja hardsuit token not working properly.
    • +
    • Fixed voidsuit modkits deleting voidsuits pieces.
    • +
    +

    DanseMacabre updated:

    +
      +
    • Added origami swans, which can be made by clicking a piece of paper while on disarm intent.
    • +
    +

    WickedCybs updated:

    +
      +
    • The tribunalist cape can be rolled up from the objects menu now, also allowing this function to remain when worn as an accessory.
    • +
    + +

    12 April 2021

    +

    Geeves updated:

    +
      +
    • Fixes flashing vaurca not damaging their eyes correctly.
    • +
    +

    TheGreyWolf updated:

    +
      +
    • Ordinary belts from the loadout can now be given unique names & descriptions.
    • +
    + +

    11 April 2021

    +

    Geeves updated:

    +
      +
    • Reworks how syringes figure out if they're blocked or looking for injection ports. It now checks for any piece of clothing that covers that specific bodypart.
    • +
    • Spacesuit helmets now have injection ports too.
    • +
    • Made the species injection modifier stack with the clothing modifier, meaning a vaurca wearing a voidsuit will take much longer to inject.
    • +
    • Fixed timers for syringe injection through in injection port increasing exponentially.
    • +
    • Autoinjectors have been resprited, they are now slightly bigger.
    • +
    • Special autoinjectors that spawn with reagents are properly labeled, which allows you to take the label off whenever.
    • +
    • Autoinjectors have received some flavour text in its extended description.
    • +
    +

    JohnWildkins updated:

    +
      +
    • Added a radial menu to CPR attempts. Performing CPR will now ask if you wish to perform mouth-to-mouth resuscitation, or only chest compressions.
    • +
    • Radial menus no longer inherit their anchor's alpha, color, or transformations.
    • +
    +

    UncleJo updated:

    +
      +
    • Blood bags can now transfer at up to 4u per second when started on roller beds or in-hand, bringing them in line with IV stand tranfusions.
    • +
    +

    WickedCybs updated:

    +
      +
    • Patterns for Tajara that affected the hands had some issues I overlooked. They've been improved and should look more natural.
    • +
    +

    10 April 2021

    Geeves updated:

      @@ -63,6 +1525,8 @@
    • Added a retractable lighter to the augment menu, they function like the combitool augment, but for a lighter.
    • Added synthetic vocal cords to the augment menu. They make you mute if removed, but remove muteness if implanted.
    • Something putting an item in your hands will no longer give an error message if it couldn't find a hand to do it with.
    • +
    • Fixed floating messages attached to exosuits not being centred.
    • +
    • Tweaked some code to give mechs progress bars on the actions they take.

    JohnWildkins updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 4dad9ca6c96..28f49dd9162 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -19357,6 +19357,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. removed, but remove muteness if implanted. - bugfix: Something putting an item in your hands will no longer give an error message if it couldn't find a hand to do it with. + - bugfix: Fixed floating messages attached to exosuits not being centred. + - rscadd: Tweaked some code to give mechs progress bars on the actions they take. JohnWildkins: - bugfix: Shoes that cause slowdown (such as activated magboots) no longer apply their slowdown twice. @@ -19371,3 +19373,1339 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. greenjoe12345: - rscadd: Ported chem bags from Polaris. work like hydroponics bags, but with medicines! Two in the pharmaacy equipment locker. +2021-04-11: + Geeves: + - tweak: Reworks how syringes figure out if they're blocked or looking for + injection ports. It now checks for any piece of clothing that covers that specific + bodypart. + - rscadd: Spacesuit helmets now have injection ports too. + - tweak: Made the species injection modifier stack with the clothing modifier, meaning + a vaurca wearing a voidsuit will take much longer to inject. + - bugfix: Fixed timers for syringe injection through in injection port increasing + exponentially. + - tweak: Autoinjectors have been resprited, they are now slightly bigger. + - rscadd: Special autoinjectors that spawn with reagents are properly labeled, which + allows you to take the label off whenever. + - rscadd: Autoinjectors have received some flavour text in its extended description. + JohnWildkins: + - rscadd: Added a radial menu to CPR attempts. Performing CPR will now ask if you + wish to perform mouth-to-mouth resuscitation, or only chest compressions. + - bugfix: Radial menus no longer inherit their anchor's alpha, color, or transformations. + UncleJo: + - tweak: Blood bags can now transfer at up to 4u per second when started on roller + beds or in-hand, bringing them in line with IV stand tranfusions. + WickedCybs: + - bugfix: Patterns for Tajara that affected the hands had some issues I overlooked. + They've been improved and should look more natural. +2021-04-12: + Geeves: + - bugfix: Fixes flashing vaurca not damaging their eyes correctly. + TheGreyWolf: + - rscadd: Ordinary belts from the loadout can now be given unique names & descriptions. +2021-04-13: + Alberyk: + - bugfix: Fixed the cybersuit choice in the ninja hardsuit token not working properly. + - bugfix: Fixed voidsuit modkits deleting voidsuits pieces. + DanseMacabre: + - rscadd: Added origami swans, which can be made by clicking a piece of paper while + on disarm intent. + WickedCybs: + - bugfix: The tribunalist cape can be rolled up from the objects menu now, also + allowing this function to remain when worn as an accessory. +2021-04-14: + Doxxmedearly: + - rscadd: Added the option to hide LOOC from ghosts/observers only. Check Show/Hide + LOOC (Observers) in the Preferences tab, or the Observers LOOC setting under + the Global tab in character setup. You do not need to toggle this if you already + have regular LOOC disabled. + - rscadd: Adds Admin LOOC for mods/admins, which functions as LOOC but displays + regardless of a person's LOOC preferences. Has a slightly different color + to LOOC. +2021-04-15: + Geeves: + - bugfix: Catching something will now longer deafen you with the item's dropsound, + instead, it'll just smoothly play the pick-up sound. + JohnWildkins: + - bugfix: Hyposprays and autoinjectors should now account for armor coverage properly, + and prevent injection on invalid targets (incl. robotic limbs). + WickedCybs: + - rscadd: Added crewneck and v-neck sweaters. Find them of course, in the sweaters + selection. + - tweak: Tweaked the arrangement of each sweater in the sweaters loadout selection. + The normal sweaters will be at the top of the list together, with the argyle + sweaters at the bottom together. +2021-04-16: + kyres1: + - tweak: Resprites the laser rifle, energy carbine, laser shotgun, energy rifle, + lawgiver, grenade launcher, combat shotgun, bullpup carbine, 9mm SMG, LWAP, + plasma bolter, and plasma slammer. +2021-04-17: + Chada: + - tweak: Added a bunch of immersion and QOL changes to the AI lawset, mostly it's + unchanged other than more freedom in law 1 and 2. Also added a law 3 rephrasing. + Doxxmedearly: + - tweak: Reduced the required amounts for phoron sheet and phoron canister bounties. + Reduced phoron spawns in warehouse. + Geeves: + - bugfix: Opening an IPC's hatch will no longer ask you whether you want to + open or close it. + - tweak: Added a surgery step where IPC hatches must be screwed shut, instead of + automatically screwing shut after being crowbarred. + TheGreyWolf: + - bugfix: Ear slot mob sprites will now update properly again. + - bugfix: Prevented an issue from causing earmuffs & headphones to replace headsets + for latejoins. All two ear items will now spawn in bags rather than on the ear. +2021-04-18: + Alberyk: + - tweak: Tweaked unathi hair and religion choices to be more lore accurate. + Geeves: + - rscadd: You can now sing by putting % before your message. + - bugfix: Reviving simple mobs will now restore their blood. + - tweak: Buffed K'ois healing, it now heals 1.4 brute damage per unit, up from + 1.2. And 1.6 burn damage per unit, up from 1.2. + - bugfix: Moved the blood restoring part of K'ois to the correct place, it + should work properly now. + - tweak: Tweaked K'ois potency value, their spores should spread better now. + - imageadd: Changed the telebaton's sprite, it should be easier to see in your + inventory now. + Geeves, Haydizzle: + - rscadd: Added colourable cloth handwraps to the Unathi loadout. + Geeves, Sgtsammac: + - rscadd: Added a special First Responder backpack to the First Responder lockers. + They are reskinned backpacks. + TheGreyWolf: + - tweak: Wall mirrors can now be used to change facial hair & hair color in + addition to hair. + - bugfix: Thralls can now properly be made into vampires again. + William Murdoch: + - rscadd: Adds a grill to the kitchen. +2021-04-19: + Arrow768: + - rscadd: Readds the Cameras in the Consular/Representative-Office due to recent + events. + Geeves: + - rscdel: IPCs can no longer take the Moroz religion. + - rscadd: You can now write in your language on papers, and people who can't + speak that language won't be able to read it. You can mix languages on + the paper, writing a sentence in Sol Common, the rest in basic, and the last + bit in Freespeak. + - rscadd: Added slide projectors, capable of projecting an image of any small item + onto any turf. + - tweak: Vaurca tunnel cloaks now have standard backpack storage size. + - rscadd: Material sheets now show the number of sheets left in the HUD now. + TheGreyWolf: + - rscadd: Skrell can now *warble with sound. *warble. + - rscadd: The holodeck boxing simulation now has a ringside bell. + - bugfix: You will no longer attempt to resuscitate prone people who are on fire, + instead they will be put out first. + - bugfix: Price scanners can now scan people without hitting them. + - maptweak: Added a ringer to the investigations office, forensic lab, evidence + storage & autopsy linked to a button by the lab front desk. + - maptweak: Added intercoms to the forensic lab, evidence storage, autopsy & + investigations office. + - maptweak: Fixed the disposal in the forensic lab. + - maptweak: Autopsy now has a request console for that paperwork. + - maptweak: An air alarm has been put into evidence storage. + Waff-AI: + - rscadd: Added a new greimorian plushie, to promote the change from spiders. + - tweak: Changed the plushie loadout description to not be from the generic plushie + item. + - rscadd: Added a set of new Skrellian tentacle-tails, and a Skrellian loadout option + for scrunchies. + WickedCybs: + - tweak: Refluffs the Dominian sweater and Bomber coat to be representative Fisanduh + as it fit the overall style more, and removes them from the Dominian clothing + selections, having them be their own unique selection instead. They also have + new fluff descriptions. Cool. + - tweak: The gatling laser has been buffed to be far more dangerous. It has more + ammo capacity, a new firing mode that sends even more laserfire downrange, slightly + less charge time and overall increased useability. It's not the liability + it used to be! + - tweak: Medical belts can hold medical tape now, if desired. + - tweak: Dogtags can now be worn on the mask slot which will also showcase its on-mob + sprite that hangs from the neck. When attached as an accessory, it will no longer + be directly visible. +2021-04-20: + DanseMacabre: + - rscadd: Added a new ERT - the Free Solarian Fleets Fireteam. They're a group + of formerly Solarian mercenaries on the SCC's payroll. Also added a Solarian + energy dagger. + - tweak: Changed the spawning odds for the EPMC ERT. + - tweak: Changed the descriptions for some Solarian uniform items. + Doxxmedearly: + - tweak: Espresso cartridges now contain 500u like all other dispenser cartridges. + Geeves: + - rscadd: Added the abilty to change the layering of glasses/goggles, to make them + go over or under your hair, via a right click menu. By default, they'll + go under. + Geeves, Caelphon: + - rscadd: Added a Jargon Federation passport to the Xenowear - Skrell loadout, selectable + by skrell, vaurca, and diona. + WickedCybs: + - tweak: Practically all footwear that taj could wear have been adjusted to better + fit them. Same for voidsuits, hardsuit boot segments. This is hopefully the + last time I ever have to adjust something like this. Minor issues like exposed + body parts were fixed along the way for some items. + - tweak: Taj have their own blood overlays and damage overlays now to make it easier + to reflect certain things on the unique parts of their sprite now. + - tweak: Medical responders for off station roles now have loadouts that will allow + them to treat their teams effectively. Mainly, you'll find they now have + a belt full of useful liquid medicine that can be injected along with some adjustments + to what they carry in their bags, like getting health analyzers! + - tweak: Added a variant of the combat hypo that doesn't start loaded with + reagents already. + - rscadd: Added a butazoline reagent bottle that can be spawned on demand by admins + if needed, put into loadouts or mapped in if desired. +2021-04-21: + Karolis2011: + - backend: Added shortcut for vueui ui's to make topic calls in a nicer way. + TheGreyWolf: + - rscadd: The loadout now have a selection of prescription medicine. + WickedCybs: + - rscadd: Added an Idris Incorporated lunchbox that can be selected in the loadout + menu. Features cool animated corporate logo technology, isn't that swell? +2021-04-22: + Geeves: + - tweak: Inflatable boxes can now pick up uninflated inflatables by clicking on + them, similar to ore satchels. + - tweak: Inflatable boxes now use simple storage slots with a number next to the + item to show how much it has. + - rscadd: Inflatable boxes now have in-hand sprites. + - tweak: Tweaked the code for what can puncture inflatables, any sharp, edged, or + lit object can now puncture inflatables. + - rscadd: Deflating an inflatable now plays an animation. + - tweak: Tweaked the order of operations when you open in inflatable door. You should + now be able to pass through it easier. + - tweak: Inflatables boxes now spawn with more inflatables. + - rscadd: Emergency closets that used to spawn loose inflatables will now instead + spawn a less filled inflatables box. + - rscadd: Various engineering suits now let you hold inflatable boxes in suit slots, + including hazard vests. + - bugfix: You can no longer sing in sign language. + - bugfix: Singing will no longer get the music notes scrambled if you don't + understand the language. + MattAtlas: + - rscadd: Added a handkerchief to the loadout under the General tab, a subtype of + the rag. + Omicega: + - tweak: Changed Freespeak's speech verb from 'growls' to 'says'. + - bugfix: Set EAL's singing verb properly. + TheGreyWolf: + - rscadd: The investigation team has been issued new improved gloves. + - bugfix: Tajara & vaurca will no longer visibly dilate their eyes when using + night vision & their eyes are hidden under clothing/glasses. + WickedCybs: + - rscadd: Added a ballistic carbine, a less powerful counterpart of the assault + rifle. It is only semi auto, has lower ammo capacity and uses a slightly weaker + type of rifle round, 5.56. Currently, merchants and antags that recieve random + guns can obtain it. + - rscadd: Added a smaller variant of the 5.56 mag that only holds 15 rounds rather + than 30. It can be printed from a lathe if desired. +2021-04-23: + Geeves: + - bugfix: Written languages now work in paper bundles, folders, and clipboards. + JohnWildkins: + - bugfix: Fixed overactive sanitization on certain mob/say types. + Omicega: + - tweak: Doubled the 'durability' of most cigarettes. You can now smoke + them for about twice as long as before. + WickedCybs: + - rscadd: Added a new pattern for the head. Tiger stripes very minor. It's + like Tiger stripes minor, just with a bit less going on. Anyone can use it. + - tweak: Reorganized Taj markings so they're not mixed in with other species + patterns. This is more of a contributor facing change, if you're a player, + don't worry about it. + - tweak: The Taj combat uniforms are rebalanced. Their uniforms provide marginal + protections like other military uniforms. + - tweak: The PRA cosmonauts have been rebalanced slightly, getting updated boots + and a few new pistol magazines in their military belts. + - tweak: The TCFL uniforms now have a small melee resist like other fatigue type + clothing. +2021-04-24: + Geeves: + - rscadd: Added an infiltration kit to the Devices and Tools uplink. It spawns a + case containing a mask, a uniform, gloves, and shoes, capable of protecting + you from the vacuum of space, as well as two atmospheres of overpressure. + - rscadd: Ported max and min pressure tolerances for items and clothing, meaning + that certain gear will now protect better from overpressure, such as atmos voidsuits, + firesuits, bomb suits, and to a lesser extent, engineering voidsuits. +2021-04-25: + Geeves: + - bugfix: You can now examine papers and photos in slide projectors as long as you + can see its projection. + - bugfix: You can now put slide projectors down on tables without them projecting + onto it. + Geeves, SleepyWolf: + - rscadd: 'Added a lot of Diona customization options: Hair, Facial Hair, and Body + Markings.' + MattAtlas: + - rscdel: The clown outfit has been removed from the game. + Omicega: + - tweak: Black jeans shorts (and short shorts) now look more similar to the full-length + black jeans themselves. + - spellcheck: Fixed a typo in the luceian amulet's name. + - tweak: Adds a medical scan verb for ghosts, allowing them to health analyse whatever + mob they're following, assuming it's health analysable in the first + place. + TheGreyWolf: + - bugfix: Human passports should now once again be visible. + - bugfix: The handkerchief now works! Temporarily. + - rscadd: Added a colorable vest to the loadout. + - rscadd: Crime scene markers can now be placed on a turf by clicking on it. + WickedCybs: + - tweak: The breakfast wrap no longer has over twenty units of condesned capsaicin + inside of it. That was over half of a pepperspray can. It now only has regular + capsaicin and will still be spicy, but not to a paincrit level. + - rscadd: Added a NanoTrasen and Fisanduhian zippo lighter to the game. You can + find these in the zippo selection in the loadout menu. + - rscadd: You can now get a photo album from the general section of the loadout, + if desired. +2021-04-26: + WickedCybs: + - tweak: Glowsticks now illuminate a bit further, a bit more than a PDA light. They've + been made dimmer to compensate. +2021-04-28: + Geeves: + - rscadd: Added Speech-To-Text to the NTIRC program. Simply open the desired chat, + enable Speech-To-Text, and chat away. You can even close the program, as long + as the chat service remains running. Only one chat can have an active STT at + a time, and you have to be at least adjacent to the device. + Haydizzle: + - rscadd: Added a colorable version of the hide mantle with three different hides + to choose from. + - rscdel: Replaced the old hide mantle sprite for unathi. + - spellcheck: Tweaks the wording for unathi clothes descriptions. + JohnWildkins: + - tweak: The entertainment radio channel's color has been changed to silver + on the dark chat theme, to visually separate it from Supply + Engineering. + Omicega: + - rscadd: Adds a cream and grenadine cartridge to the booze dispenser. + - rscadd: Beefed up the emergency boxes with more emergency equipment. + Shadowtail117: + - tweak: The input bar now changes color depending on whether you have hotkey mode + enabled or not. + - tweak: You can now alt-click a container that's within touching range to + open it. + TheGreyWolf: + - bugfix: The NT Quik-Pay can now be paid using charge cards. + WickedCybs: + - tweak: Research Directors are now able to select the alternate tool belt variant + in the loadout. + - rscadd: Added a combat medical belt. It can hold nine things compared to the usual + seven and accepts a few more items as well, like handcuffs and even ammo magazines. + - rscadd: The medical section of the antag uplink now has a few more options to + choose from. A fully loaded combat medical belt, an advanced medical kit and + O- bloodpacks. + - tweak: Mercenaries now have butazoline and perconol added to their starting medical + supplies as well as one combat medical belt. + - tweak: Some ERT responders now start with combat medical belts as well. Would + be TCFL, FSF, Kataphracts, Freelancers, NT-ERT. + WickedCybs, Sue: + - rscadd: Added a few new hairstyles for Tajara, such as a an alternate version + of the curly one, a new bun hairstyle, few more. Check it out. + - tweak: Minor shading and improvements were conducted to a few of the older hairstyles, + like the braid, short fringe, not very notable though. +2021-04-29: + Geeves: + - rscadd: Added kneepads to the accessory loadout category. It provides no protection. + - rscadd: Ported stasis beds. RnD can print their circuitboards once they've + reached level four research in magnets, engineering and bio. + - rscadd: Added vitals monitors for rollerbeds, two mapped into medical's GTR. + - rscadd: Ported various new organ sprites. + Haydizzle: + - bugfix: Swaps the east and west facing sprites of the mecha eye (yellow) augment + for vaurca so it displays properly. + Omicega: + - tweak: The ostensibly Dominian sash selection is now a more generic coloured sash + selection. + - rscadd: Added a wholly colourable sash variant to the loadout screen, to allow + for colours beyond the existing selection. + TheGreyWolf: + - bugfix: Handkerchiefs naming are now properly fixed. + - bugfix: Diona ear slot is now aligned correctly on the hud. +2021-04-30: + Alberyk: + - tweak: Buckling someone else now takes some seconds. Buckling is still instant + if they are lying down. + Geeves: + - rscadd: Added blood patches, accessories that show off your blood group for all + to see. + - rscadd: Antags that don't appear at roundstart no longer appear in the Role + menu in character creation. + - rscadd: Added buddy tags to the utility loadout. They're small devices that + can be attached to uniforms that will beep if they don't have a paired + buddy in range. + - imageadd: Ported various sprites related to robotics, cyborgs, and exosuits. + - bugfix: You can now collapse rollerbeds. + - imageadd: 'Ported and tweaked sprites for: Toolbelts, Belt Overlays, Welding Tools, + Impact Wrench, Air Analyzer, T-ray Scanner, Flamethrower, Multitool.' + Geeves, SleepyWolf: + - bugfix: Fixed diona blinking helmethead and blinking p-body blinking very rapidly. + JohnWildkins: + - bugfix: Adminhelps/PMs should no longer have issues displaying apostrophes and + other special characters. + MoondancerPony: + - bugfix: Fixes an infinite recursion in vendor spritesheet code. + - bugfix: Fixes missing placeholder item sprites causing SSassets warnings. + - refactor: Assets now load after SSplants. + - rscdel: Removes the now-useless delayed asset load variable. + WickedCybs: + - tweak: NanoMed Plus vendors now get exactly one bottle of theta each. +2021-05-01: + Geeves: + - rscadd: Phoron has been buffed to do more damage when contacting the skin in gas + form. + - rscadd: Holding the station blueprints in your hand will now give you a t-ray + scanner like view of the pipes, cables, and disposal pipes as they were at the + start of the round. + - rscadd: Added a slider to the modular computer hardware configurator that affects + how far audible alerts will get output, 0 being only to the person directly + holding it. + - rscadd: Added a Mute Messages button to the chat client that makes it so that + received messages don't appear in your chat. Running the chat in the background + will still make the beeps, however. + - rscadd: Added laser rifles and energy carbines to the dangerous weapons uplink. + - rscadd: You can now slide items across tables by click dragging from the item + to the table. + - tweak: Changed the plant analyzer's sprite. + - bugfix: Fixed the plant analyzer turning you into a square when held. + Haydizzle: + - rscdel: Removes the ability for skrell to be Dominian consular officers. + MoondancerPony: + - bugfix: Fixes the toggle message for cooking machines. +2021-05-02: + Geeves: + - bugfix: Mobs that are invisible to the AI will no longer show their security and + medical HUDs to it. + TheGreyWolf: + - rscadd: The fiber & print collection kits can now take samples by drag clicking + them in addition to ordinary clicks. + - rscadd: Idris now have their own unique rag in the loadout. +2021-05-03: + Geeves: + - bugfix: Hardsuits now have injection ports again, so do magboots. You no longer + have to heal people through their feet. You know who you are. + WickedCybs: + - bugfix: The TCFL pilot now gets their protective variant of the pilots jacket. + Used to be the common crew version which had no resistances. +2021-05-04: + JohnWildkins: + - tweak: Fractures are no longer guaranteed once a limb takes 30 brute damage. Repairing + a broken bone no longer relies on the limb being healed HP-wise. + MattAtlas: + - bugfix: Fixed a few runtimes in standard weapon hit effects. + - rscadd: Added a preference for floating chat color. This is per-character and + updates in game when you update it on the pref window too. + - bugfix: Windows like the accent and citizenship window no longer go under the + pref window when opened. + - bugfix: Loading a new character now actually updates the preview window. +2021-05-05: + DanseMacabre: + - rscdel: Removed the broken man facial hair style. + Doxxmedearly: + - tweak: Wounds are less likely to infect limbs if small or properly treated. Infections + should also progress a little less quickly. + - rscadd: Added a new medication, Steramycin. If administered before a limb reaches + the first infection level, it has a great chance to prevent infection. It has + no effect on infections that have progressed to or past level one; it's + meant to be used as insurance against infections after being wounded. It does + not sterilize wounds, so make sure those are treated (Or the limb may re-infect)! + Created with a ratio of 2 Thetamycin to 1 Sterilizine to 1 Radium, and produces + 2 units. + - bugfix: When an RnD machine (Like the circuit imprinter) has insufficient reagents + for items in its queue, the machine errors will now use the reagent name instead + of the /decl/ path. + MattAtlas: + - bugfix: Melee weapons now properly apply armor penetration. + MoondancerPony: + - backend: Fixes a runtime in preference creation that caused CI to fail. + TheGreyWolf: + - bugfix: Fixed the taj mechanic & NT overall uniforms. They can now be rolled + down. + WickedCybs: + - rscadd: Added a chance for the rescue pod survivor offstation role to be a member + of the TCFL. + - rscadd: Added alt versions for the Taj sideponytail and shoulderlength hairstyles. +2021-05-06: + Geeves: + - bugfix: Fixed the fire blast projectile air blow thing on the industrial welding + tool being misaligned with the sprite. + Haydizzle: + - rscadd: Adds eki, guami, q'lort, and ylpha to the MegaSeed Servitor. + MattAtlas: + - bugfix: Melee weapons can now apply AP to humans too instead of just simple mobs. + - bugfix: Mech armor code should now be more consistent. Mech armor now actually + blocks EMPs. + - admin: Moderators may now respawn players and change names from VV. + WickedCybs: + - maptweak: The TCFL issue Energy Utility Knives are finally available to more than + just the Prefect. They've been added to the rack with the Legion's + various melee options. Your tax dollars at work, people. + - rscadd: Added Tajaran variants of the Himean voidsuits and a modkit in the loadout + that allows them to be used, either on a mining or engineering voidsuit. +2021-05-07: + Geeves: + - refactor: Changed all hardsuits over to the contained sprite system, there should + be no player-facing changes. +2021-05-08: + Doxxmedearly: + - bugfix: Fixed an issue with the germ counter going into negative values on limbs, + which caused odd behavior such as reoccurring infections. + Geeves: + - rscadd: Added sprites to bolted and welded tesla equipment to more easily see + whether it's bolted or not. + - bugfix: Fixed eyestabbing not updating the damage overlay for the eyestabbee. + - tweak: If the eyestabbee has eye protection, the stab will automatically be redirected + to the head in general. + - tweak: Only clothing considered made of thick materials will now protect from + eye stabbing. + - rscadd: Gas masks, safety goggles, and tactical HUDs have been given the thick + material flag. + - rscadd: Getting eyestabbed while wearing glasses will cause the glasses to shatter. + - rscadd: Added maptext to the impact wrench to let you know which mode it's + in. + - bugfix: Fixed the impact wrench having flipped sounds. + - rscadd: Skrell in Srom will now be able to hear people talking around them, and + hear things on the radio if they body has one. + - bugfix: You will now be properly able to hear things from your old body if you're + remote controlling something. + - rscadd: Updated flamethrowers to use the sprites of the welding tools they were + made from. + - rscadd: Flamethrowers now instantly light anyone in their path on fire. + - soundadd: Gave flamethrowers a nicer sound effect. + - admin: The full flamethrower now comes with a gas tank installed. + - tweak: Tweaked the attack verbs of lit welders. + - soundadd: Added sounds to the attack of lit welders. + - rscadd: Dragging a bloody person across the floor will now leave nice looking + blood smears. + - tweak: Footwraps will now place down the species footprint style instead of a + normal shoe footprint. + - rscadd: Added triage tags. Examine any humanoid while wearing any MedHUD to edit + their triage tags. It comes in four variants, green, yellow, red, black, to + show how critical the patient is. + - tweak: Made HUD elements for humanoids not inherit the rotation applied to them, + so a horizontal human will still have a normal upright medHUD display. + - rscadd: Multitools now have a tracking mode that leads you to the APC within your + area. + Geeves, CNEGecko: + - rscadd: Added science taperolls to the science sub-level, as well as various science + lockers. + Geeves, Haydizzle: + - rscadd: Adds support for dual-colored items. + - rscadd: 'Adds unathi clothes: the Th'akh maxtlatl outfit, himation cloak, + jokfar vest, gyazo belt, jeweled bracers, and rockstone cape.' + - tweak: Tweaks the sprite for the zazali garb. + - rscadd: Makes the zazali garb dual-colored. + MattAtlas: + - rscadd: 'Ported the Technomancer gamemode from Polaris. Note: as a Technomancer + you can use the Toggle Lock verb on your power pack to make it unremovable.' + - rscdel: Wizard has been removed from the secret rotation. + MoondancerPony: + - bugfix: Fixes certain things (bottles, grenades, etc.) having incorrect icons + in vendor previews. + TheGreyWolf: + - rscadd: Adds the tribunalist medical beret. + - rscadd: Added earthenroot soup, adhomian sausages & chocolate bars to the + lunchbox options and additionally they can now also spawn with a single utensil + of choice. + WickedCybs: + - tweak: Tweaked TCFL projectiles, like the heavy blaster bolt and highex gauss + round. They have some AP now, with the former being rifle level and the latter + having enough to not get blocked by a standard corporate vest. +2021-05-09: + Geeves: + - imageadd: Resprited the plasma cutter. + - imageadd: Stock parts have been given new sprites. + - rscadd: Voting for something is now logged. + WickedCybs: + - maptweak: Raiders now have one set of Tajaran and Unathi insulated gloves added + to their engineering supplies. + - maptweak: The distress team base now has three pairs of insulated gloves added + to its engineering rack. Standard, Tajaran and Unathi. + - maptweak: The TCFL now have insulated gloves that can fit other species. +2021-05-10: + Geeves: + - rscadd: Added a chance for emergency toolboxes to spawn emergency welding tools + and emergency goggles. + - imageadd: Resprited wrenches and crowbars to match the new tool style. + - tweak: Tweaked wirecutters to spawn in the same color as the other tools in your + toolbelt. Random wirecutters will still have random colors. + WickedCybs: + - tweak: The Eridani beacon team has had a massive restructuring. It's been + renamed to the Eridani Asset Protection Team. The EAPT now has two focuses. + Protection and medical care. Its IAC holdovers are mostly gone at this point + and its members have improved weaponry and a new leader role that can be selected. + I have tried to make sure this wouldn't be too overbearing. They are not + doom marine giga killers but they can get the job done at least. + - tweak: The energy rifle has been slightly nerfed to not fire as fast as you can + click now. It still fires very fast though. + - tweak: The Strike hardsuit spawns with additional modules for non-ninja antags + and beacon responders. The additional modules are more themed around its policing + aesthetic and include a mounted gun, actuators and more. +2021-05-12: + Geeves: + - rscadd: Added a loadout option to shoes to make them spawn in your choice of under + or over their uniforms. + - rscadd: Attacking someone with a sharp or edged weapon now has a chance to splatter + blood to any tile around them. + - tweak: Arterial sprays can now go onto walls. + - tweak: Sharp or edged weapons are now twice as likely to cover you in blood as + an attacker. + - rscadd: Flight helmets can now link to shuttle computers to give you a status + readout on your main HUD, though the visor needs to be flipped down. + TheGreyWolf: + - rscadd: Shastar Leaves & Royal Choice cigarettes are now in the vending machine + for all your lung killing needs. + WickedCybs: + - bugfix: Left facing sprite of the radhood was misaligned, it's been corrected + by being shifted one pixel to the left. + - tweak: The Freelancers distress team has had its equipment changed up. Everyone + now gets sidearms, the leader getting a revolver and the rest having .45s. The + 10mm submachineguns have been swapped for a .45 submachinegun. People who lacked + a knife have one now. At the baseline, they're stil one of the weaker ERT's + comparatively but no longer major pushovers other than the lead, who has always + been good. + - maptweak: Freelancers now get some additional equipment if they're rolled. + The Distress team base will give them zippos, cigars, holsters, vests and a + few weapon racks that will provide random guns to vary up their firepower within + reason. No two merc outfits are alike, right? + William Murdoch: + - rscadd: Adds a telecopic cane which can be found in the loadout under cane. + - tweak: Merges white cane and crutches under the cane option in the loadout. +2021-05-13: + DanseMacabre: + - rscadd: 'Added a two new rescue pod roles: an SCC functionary, and an FSF crewman.' + TheGreyWolf: + - rscadd: The all new Swimstars plushies & lunchbox has been approved for station + usage. Please find them in the loadout. + WickedCybs: + - rscadd: Added some new colourable pant options. There's now dress pants with + a belt, a colourable version of the designer jeans called tailored jeans and + a colourable version of the mustang jeans. All three are located within the + recolourable pants tab in the loadout uniform selection. + - tweak: The 'pants (recolourable)' selection has had a small name tweak. + It's now 'pants selection (recolourable)' and has a generic description. +2021-05-14: + TheGreyWolf: + - tweak: The various non-command wristbounds in the loadout have been merged into + one list selection. + - tweak: The loadout laptop now only costs 2 points. + - tweak: Ntsl2 interpreter no longer spawns by default on any modular computer & + command program has been removed from the default security computer along with + employment from investigator's computers. + - bugfix: Tablets & wristbounds will now start with the appropriate programs + for their selected department. + - rscadd: The loadout now has a department tablet selection and the color is no + longer randomised for them. + - rscadd: Medical & security can now download their respective records program. + Investigators can download both. + WickedCybs: + - rscadd: Added two new hairstyles for Taj based on the sidepony ones. Tresses and + Tresses Alt. + - tweak: More minor shading improvements to alt taj ahirstyles. + - tweak: Resprited the Taj balaclavas, they don't leave the face hanging out + anymore. The old sprite is the new rolled up sprite for them. + - tweak: The sterile mask now covers the face of Tajara properly. +2021-05-15: + TheGreyWolf: + - rscadd: Being confused now only make movement random if the mob is running. + UncleJo, WickedCybs: + - tweak: Tweaked how the triage tags look. They should be more visible now. +2021-05-17: + Doxxmedearly: + - tweak: Being buzzed no longer gives you a speed boost. + Geeves: + - rscadd: Added a social credit score to the Jargon passport, remember to set yours + if you have one. + Omicega: + - tweak: Freespeak and Tradeband now have language colours, much like Sol Common. + Very nice and cool! + TheGreyWolf: + - bugfix: Steramycin is now detectable by health analyzers & the like. + WickedCybs: + - rscadd: Added a few new human hair variations. Emo long fringe now has three new + variants. One which has a fringe on the opposite side of the face and two that + turn it into a longer hairstyle from the back and sides. There's also a + new variation for Gentle, which adds a fringe and lenghtens the hair. +2021-05-18: + MattAtlas: + - bugfix: Technomancer modifier spells no longer spam you with end messages. + - bugfix: Technomancer fireballs now act like wizard fireballs did and don't + break the floor. + - bugfix: Technomancers can no longer toggle spells if they're incapacitated. + - bugfix: Unstable and degen aura no longer affect mobs inside the user. + - bugfix: Degen aura no longer applies toxloss. + - bugfix: Mend organs now fixes tendon breaks and arterial bleeding. + - bugfix: Visitors now spawns a technomancer instead of a wizard. +2021-05-19: + Doxxmedearly: + - bugfix: You can now be heard by radios and intercoms that are broadcasting (Microphone + on) while restrained or cuffed. + - rscadd: Vampire blood heal now gradually heals infections and disinfects wounds, + at the cost of additional blood. The blood requirement is small unless the infection + is large. + Geeves: + - rscadd: Lockets, holo-badges with the string thing, dogtags, neck bandanas, and + the Tajara pocketwatch now appears to hang around your neck when you get examined, + instead of being on your face or ears. + - rscadd: Tajara pocketwatche can now be worn on the mask slot. + - rscadd: Skrell can now wear the SCC Combat Hardsuit. + Haydizzle: + - bugfix: Adds prices for skrellian products in the vendors. + WickedCybs: + - bugfix: Tweaked the way some Taj boots sprites are arranged, made it so the knife + overlay isn't invisible on them anymore. Did a minor touchup on the workboots. + The species unrestricted swat boots now have a Taj specific sprite. +2021-05-21: + Alberyk: + - rscdel: Removed the full explosion option from the explosive implant. It is now + one telecrystal cheaper. + Alberyk, Canon35: + - rscadd: Added new gadpathurian clothing options to the loadout. + Doxxmedearly: + - tweak: Drying racks now hold dried items in their inventory, instead of spitting + it out onto its tile. + - bugfix: Fixed the drying rack UI displaying pre-dried items as vendable after + drying is done. + - rscdel: Removed the electric chair and electrohelmet assembly. + Geeves: + - bugfix: Random events such as Random Antagonist and Burglar Pod will no longer + happen on extended. + - rscadd: Softcaps, berets, and fezzes no longer block the head flavor text. + - bugfix: Tweaked items that can be attached as accessories to use the correct mob_overlay + item_state. This might cause some accessories to break, so make a github issue + or DM me on discord if you find any, preferably the former. + Geeves, Happy Fox, Lanze: + - rscadd: Mapped a holo-menu into the bar backroom and kitchen table next to the + soft drinks. They work off pencode, so you should be able to copy your menus + to them directly. Examine them for instruction on how to use. + MattAtlas: + - bugfix: Contractor uniforms now actually display in the character preview. + TheGreyWolf: + - bugfix: Taj specific clothing will no longer give the message that they are overheating. + WickedCybs: + - tweak: NT has finally found some credits in the budget to get duct tape to the + tool vendors. + - tweak: Taj hair has had hair lengths properly assigned. Taj are also able to tie + their hair and style it now with the tie-hair verb. + - rscadd: Added TCFL service cards to the loadout in the accessories section. Two + variants for the active serving and the veterans. For the Republic! + - tweak: The Revenant rift announcement has been tweaked to mention Research's + ability to print bluespace neutralizers as well. +2021-05-22: + TheGreyWolf: + - rscadd: 'Blood pressure & pulse is now different for several species. The + affected species are: Tajara, Unathi & Skrell. The latter two also now have + a lower body temperature.' + WickedCybs: + - maptweak: TCFL tactical medical belts start preloaded with medicines and a hypo + now. + - tweak: The Eldritch blade can now penetrate through most armour thanks to the + power of the Dark God. Previously, it could get blocked by an engineering voidsuit. +2021-05-23: + Alberyk: + - tweak: Vampire veilwalk no longer allows the vampire to stand inside walls or + solid objects. + - tweak: Vampires can no longer use veilwalk in admin levels. + Doxxmedearly: + - tweak: Borscht no longer gets randomly named with various misspellings when created. + While funny, it was a nuisance with the smartheater for chefs. + TheGreyWolf & SpecialFilms: + - rscadd: Several new tajaran food & recipes have been added. + - rscadd: Ras'val clams now exist as a clam type. + WickedCybs: + - tweak: First responders now have surgery access. Their duties remain unchanged. +2021-05-24: + Doxxmedearly: + - bugfix: The Luceism holy book should now have a sprite. + Geeves: + - rscadd: Reagent scanners and their advanced version now have unique sprites. + - imageadd: Added some species-specific sprites for firesuits and their helmets. + - rscadd: Added a proper firefighter helmet to the fire-safety closets. + - tweak: Firesuits now give a slight amount of protection against negative pressure, + enough to buy a couple of seconds of spacewalking. + - tweak: Very slightly reduced firesuit slowdown, from 1 to 0.8. + - rscadd: Added a firesuit to the CE's office. + - rscadd: The modular computer laptop from the loadout now comes with an ID slot. + TheGreyWolf: + - rscadd: Knitting needles are now available in the loadout under the general tab. + - bugfix: Adds the forgotten dirtberry to creamice's recipe. +2021-05-25: + Geeves: + - rscadd: You can now test the siemens coefficient of gloves in two ways. The first + way is simply probing them with a multitool, the second, holding a battery cell + in one hand, the multitool in the other, then probing the cell with your multitool. + - rscadd: Added a holopad to the ERT commander's office. + - tweak: Made the holopad in Centcomm Control a long range one, allowing it to call + to the station and vice-versa. + JohnWildkins: + - tweak: Tendons now have their own health pool, making them overall more resistant + to damage, and less likely to snap overall. + - tweak: Damaged and destroyed tendons in the legs now cause movement slowdown. + - bugfix: CUT/EDGE weapons can no longer break bones unless they meet the 30 damage + threshold. + - bugfix: Fix synthetic limbs acting as if they had snapped tendons. + MoondancerPony: + - refactor: Refactored how biogenerator recipes are handled. + NiennaB, Dumbdumn5, Stryker, Ryverstyx: + - rscadd: Replaces the old IRU coat with a short coat and a long coat, available + in black, brown and white. + - tweak: Tweaks the existing IRU dusters and trenchcoats. + - rscadd: Adds new Trinary Perfection capes by Ryverstyx. + Omicega: + - tweak: The medical RIG for first responders now starts with a built-in suit cooler + for IPC responders. + TheGreyWolf: + - tweak: Vaurca's darkvision color has been changed. + WickedCybs: + - tweak: The 5.56 rifle ammo can no longer penetrate people and obstacles anymore. + The AP version is unchanged and still can pass through stuff. + - tweak: Submachinegun turrets don't fire rifle rounds anymore. They'll + do the same damage as a .45 now. + - tweak: There were a few lesser used laser guns in the game that would fire as + fast as you could pull the trigger, namely the x-ray guns. They have a bit of + a longer fire delay now. + - tweak: Gauss thumpers and bolt slingers do the same amount of force as the average + rifle when it comes to bashing a person with the gun now. Used to be carbine + level before. + - tweak: Gauss thumpers and bolt slingers can now have bayonets affixed to them. + - tweak: Coalition themed gear crates get bayonets to go with their gauss thumpers. + - maptweak: The TCFL's tac knives have been exchanged for bayonets. +2021-05-26: + Furrycactus: + - rscadd: Blue plastic buckets and wooden buckets can now hold 300 units, up from + 120 units (the size of a large beaker). + - rscadd: Yellow mop buckets can how hold 600 units, up from 360 units (2x the size + of regular buckets). +2021-05-28: + Doxxmedearly: + - tweak: Buckets no longer fit into chem dispensers or ChemMasters. + - tweak: You can no longer put food in chem dispensers, including drink dispensers. + Geeves: + - rscadd: Boxes of googly eyes can now spawn in cargo. + - rscadd: AI can now choose to make their hologram appear as the selected character + in their loadout. Simply select the Unique option, then Loadout Character. + Stryker: + - bugfix: Re-adds armor and the ability to store security items for the IRU coats. + - bugfix: Trinary Perfection cape variants now properly appear in the suit slot. +2021-05-30: + Alberyk: + - rscadd: Added a space sector system framework for use in the future. + Doxxmedearly: + - tweak: Intoxication lingers longer, especially when drunk. + WickedCybs: + - tweak: Greimorians, cavern dwellers and certain other aliens now bleed shades + of green blood instead of red blood. + listerla: + - rscadd: Added an IPC plushie to loadout, under the name Aphy. +2021-05-31: + Furrycactus: + - maptweak: Added a more accessible lightswitch to the library. + - maptweak: Renamed the 'autopsy' sinks to 'surgical' sinks + in the Medical operating theatres. + - maptweak: Added an extra light fixture to each of the Medical exam rooms and operating + theatres. + - maptweak: Replaced the comfy chairs in the bar with sofas to make them look more + like actual booths. + - maptweak: Made the little side table in the kitchen eating area into a booth. + - maptweak: Added plant clippers to the surface garden crate. + Geeves: + - tweak: Core samplers no longer need sample bag, it just stores the rock sliver + inside itself. + - rscadd: The suspension generator has been given a makeover. + - imageadd: The boulder has been given a resprite. + - rscadd: Added anomaly containers, mapped in two into long term artifact storage, + but you're allowed to cart them anywhere. An additional one can be found + in the xenoarch closet. + - rscadd: Artifact batteries and power utilizers have been resprited. + - rscadd: Skrell Tentacle Ties now auto-adapt to the type of headtails you have. + MattAtlas: + - imageadd: New logo! + SueTheCake: + - rscadd: Auto-Compressors, which automatically perform CPR, can be found in medical + bay. + TheGreyWolf: + - bugfix: The Adhomian watch will now properly display the hour. + - bugfix: The auto compressor should now properly show up in the FR lockers. + TheGreyWolf & SomeoneRandom: + - rscadd: Added the Idris Ordering Terminal & mapped it in by the kitchen & + bar. + - maptweak: The bar APC has been moved over to above the disposals & the kitchen + atm has been shifted to make space for the Idris Ordering Terminal. + WickedCybs, Schwann: + - rscadd: Added a Luceian Zippo to the Zippo lighter selection. Now you can ruin + your lungs while maintaining your faith. + - tweak: Added a define for bright white light. + - tweak: Tweaked the lit Fisanduhian zippo sprite. +2021-06-02: + Geeves: + - rscadd: Added an oxygen canister to the robotics lab. + Omicega: + - bugfix: Fixes ghost spawner pod survivors not being allowed to pick a name in + addition to customising their appearance. + TheGreyWolf: + - tweak: Photos are now size tiny, just like paper. +2021-06-03: + Alberyk, Canon35, Wickedcybs: + - rscadd: Added some extra Tajaran related options to the loadout. + - rscadd: Added the Din'aak Mountains accent. + Doxxmedearly: + - bugfix: You can no longer overfill a light replacer with bulbs by drawing from + multiple boxes at the same time. + Geeves: + - rscadd: Reflections are now visible in mirrors. + TheGreyWolf: + - maptweak: Made the diner & kitchen sofas into comfy variants. + WickedCybs: + - bugfix: The SCC agent uniform had its left facing sprite show a rolled up sleeve + even when not toggled. This was fixed so the sleeve is down to match the rest + of the sprite. +2021-06-04: + Alberyk: + - bugfix: Smoke bombs should now work properly. + - bugfix: Placing rods on the asteroid ash should no longer create a hole. + TheGreyWolf & StoneMane: + - rscadd: The chief engineer's locker now has a unique hazard vest. + WickedCybs: + - rscadd: Added an alternate dress shirt to the shirt selection in the loadout. + It has more detail and colours nicely + - tweak: All the loadout dress shirts can now have their sleeves rolled up by using + the roll up shirt sleeves verb. This has to be done while it's not attached + to your uniform. Pre-rolled dress shirts can still be selected too. +2021-06-05: + Geeves: + - rscadd: GPSs now have an idle mode, where they will update their transmitted location + every six seconds. This mode activates if they're not in someone's + possession. + - tweak: You can now keep your GPS in your bag, webbing, etc. It will keep actively + updating as you move. If you drop the bag, webbing, etc., it'll swap into + idle mode after you move again. + - rscadd: Ported the GPS compass, selecting a GPS to track on the C-Track column + will add it to the compass. The GPS must be in your active hand/slot to show + you the compass. + TheGreyWolf: + - tweak: The DIA badge has been renamed to investigator badge. + listerla: + - rscadd: Added gold star stickers, to both the QM and HoP lockers. +2021-06-06: + TheGreyWolf: + - rscdel: Badges no longer have char names visible in the item name. + - tweak: Badges from the loadout will automatically have the char name attached + to them. + - tweak: Badges will automatically add the name attached to them to the item description. + The exception is badges that had their names changed through the custom loadout. + - tweak: Badges will now give a popup to confirm if a character wishes to imprint + their name on the badge when used in hand. + - rscadd: The forensic technician's jacket can now carry the same things in + the inventory slot as the detective jacket and both of them can now hold the + investigator badge +2021-06-08: + Geeves: + - bugfix: You can no longer spam the technomancer apprentice teleporter to open + infinite slots. + - rscadd: Added a chess arena to cargo's maintenance. + - rscadd: Marble can now be used to craft light and dark marble floor tiles. + Geeves, Scrambles: + - rscadd: MMIs have been redone to be braincases instead of simple brain-cradles. + They have a new description and a new process of completion. Examining it will + give you step-by-step instructions. You no longer need to prepare the brain + externally either. + - tweak: Brain lobotomization has been renamed to be brain preparation. + TheGreyWolf: + - rscadd: The investigator program set can now be selected as pre-installed when + setting up a new modular computer device. + WickedCybs: + - tweak: 'Idris ATM's and some terminals have been tweaked to have the Megacorp's + complementary colours. ' +2021-06-09: + WickedCybs: + - rscadd: Tweaked the track jacket sprites. Biggest change is that it no longer + gives people a plank back. It's not majorly changed other than that. +2021-06-10: + listerla: + - spellcheck: Changed an instance of somethign to something when applying tape to + eyes. +2021-06-11: + Geeves: + - rscadd: Adds a Parrot chassis for pAI. +2021-06-12: + TheGreyWolf: + - bugfix: Fixes the anomaly container. It should now work properly. +2021-06-13: + Alberyk: + - tweak: CCIA agents should have a bit more of access at the Odin. + Doxxmedearly: + - bugfix: Fixed some strange behavior relating to missing arms or hands. For example, + unloading handgun magazines drops them to the floor instead of deleting them. + Report any other buggy behavior. + - bugfix: Fixed an issue where spawning with a missing hand would cause job items + to be deleted, such as liaison briefcases. Now it tries to put it in your other + hand. If it can't, it will spawn in your bag or on the floor. + - bugfix: Punching and kicking simplemobs (including viscerators) now applies damage + again. + - bugfix: Medical borgs should be able to reattach internal organs as well as limbs/prosthetics. + - bugfix: Changing your name as a borg no longer changes your sprite to the default + module. + - bugfix: Fixed some weird interactions with grippers and paper bundles. The icon + should update when you remove the last paper from a bundle, and detaching a + bundle should leave you with one piece of paper in-gripper. + - bugfix: Traitor borgs will no longer show that they have a damaged interface as + if they were emagged. + - rscadd: Filing cabinets can now hold books, cards (playing and ID), forensics + slides and swabs, photo albums, clipboards, disks, pens, badges, passports, + and keys. + - bugfix: Stationbounds can now collapse rollerbeds, as well as attach bed-connected + IVs to patients, remove IVs from beds, and remove vitals monitors from beds. + - rscadd: Added a tip to the rollerbed description to indicate that stationbounds + can unbuckle people by clicking the bed with an empty gripper (any kind). + TheGreyWolf: + - bugfix: The PRA cig packet can now be closed. +2021-06-15: + DanseMacabre: + - rscadd: "Added a qipao to the loadout, for the sinophiles in all of us. Sprite\ + \ by \u041C\u044F\u0443!#979." + - tweak: Refluffed the vintage .45 + Doxxmedearly: + - bugfix: Fixed a bug where phantom items would remain in a borg's gripper + after attempting to place them in things like vendors and grinders. + - maptweak: The surface conference room light fixtures should have visible light + tubes in them now. + Furrycactus: + - maptweak: Changed the Hydroponics backroom to serve as a small area to keep animals. + It's now a grassy room with dirt plots, a chicken crate, a goat crate, + and a box containing the basics to assemble a bee apiary. + WickedCybs: + - rscadd: Added a new webbing accessory, a webbing harness which was taken from + Polaris and tweaked. There are three variants to pick from in the loadout. Recolourable + versions too. + - tweak: The FSF synthetic unit now gets a pilot helmet and exchanges its holster + for a webbing harness. + - tweak: The TCFL pilot has had their sidearm slightly reflavoured, it's now + an enhanced blaster pistol. Their holster has also been swapped for a webbing + harness for a piloty aesthetic. + - maptweak: Mapped in the new harnesses to a few offstation antag roles, like merc. + Burglars can also select from more than just holsters now, in case they want + to use a webbing. +2021-06-16: + Doxxmedearly: + - bugfix: Fixed some incorrect surgery step titles and message text for closing + and mending ribcages. + - bugfix: Fixed a bug where farmbots would get stuck doing nothing because it could + not path to a sink. + - bugfix: You can no longer feed food to bots and borgs. + - bugfix: Infrared sensors now properly emit their beam when attached to a device, + such as a bomb. Signalers can now activate infrared sensors. + - bugfix: Fixed several instances where infrared beams would linger despite the + sensor being moved or manipulated. + - bugfix: Borg grippers should pick up stacks of items correctly again, instead + of dropping them each time a stack is merged. + - tweak: Removed the message telling you that you released an item from your gripper + when you're putting said item into something like a fridge or grinder. + Geeves: + - bugfix: Fixed a typo in the Tau Ceti sector primer. + - bugfix: Goonchat no longer spaces messages out weirdly upon loading. + - bugfix: Fixed airlocks delaying the start of the round to close first. + SpaceBaa: + - bugfix: Add missing chameleon cap icon. + WickedCybs: + - tweak: The neck cover body pattern has been shifted down, it should look a bit + better now. + listerla: + - spellcheck: Corrected the grammar of the revenant bluespace rift announcement. +2021-06-17: + MoondancerPony: + - tweak: Containers with noreact (oven dishes, fryer baskets, grill plates) will + no longer be heated by appliances, to avoid accidents. + - bugfix: Certain recipes with sugar will no longer be ruined in the oven or fryer + due to caramelisation. Sugar WILL melt on the stove, though. + - bugfix: Containers without reagent data (i.e. things not containing nutriment + or certain medicines) will now properly heat up. + TheGreyWolf: + - maptweak: The forensic lab has been slightly adjusted and the mass spectrometer, + reagent scanner & crime scene cards spawn within the crime scene kit. +2021-06-20: + Geeves: + - rscadd: Choosing a pAI chassis is now a radial menu. + - bugfix: Fixed a bug that caused technomancer shields to entirely not work. + - tweak: Getting hit by a projectile will now properly say the limb name instead + of the attack zone name. + - rscadd: Added a fox pAI chassis. + - bugfix: Fixed the parrot pAI chassis in-hand sprites. +2021-06-21: + Doxxmedearly: + - tweak: Tweaked some things regarding running with no stamina. It now does oxy + damage and takes oxy damage more into account when determining your exhaustion + threshold. It's also very slightly more painful. Overall, this reduces + the total time you can do this by a small amount. + - rscdel: Nicotine no longer acts as a painkiller. + - bugfix: The above changes fix a bug where smoking could practically give you unlimited + sprinting. + - tweak: Fortune cookies can now be made even if the paper is blank. + - bugfix: The deathgasp emote no longer makes you vomit. + - rscdel: Removed some leftover vox emotes. + - rscdel: Removed some humanlike emotes from stationbounds, specifically the ones + that you can't do because you don't have hands or a head. + - tweak: Bee venom no longer does organ (Tox) damage. The tox damage has bee-n replaced + by pain and oxyloss. + - tweak: Bee behavior (Beehavior) should bee a little less finicky. + - tweak: Synthetics should no longer bee targeted by bees or affected by their stings. + - tweak: Some swarms of bees fired from the mobile apiary will bee slightly stronger + than their natural counterparts. + - rscadd: Janitors now have access to the custodial area in medical. + - bugfix: Collectable HOS cap now has an on-mob sprite. + - bugfix: Flipped versions of the Himean and Vysokan hats now have in-hand and worn + sprites. + - bugfix: Fixed an issue where flipped softcaps would reset to unflipped when being + equipped. + - bugfix: Absorbing nymphs should no longer duplicate hats worn by nymphs if they + later are split from the gestalt. + Geeves: + - rscadd: Heat Exchanging pipes now start glowing based on temperature. + Geeves, Scrambles: + - rscadd: Added a new kind of non-hostile biological migration event. + - bugfix: Goats will now properly beat someone up when they enter a fey mood. + Rotharia: + - maptweak: Added a bottle of 10u Bicaridine Pills to the med closet next to pharmacy. + - maptweak: Added lights to the engine monitoring room so that the light switch + actually does something. + TheGreyWolf: + - rscadd: Several new bags are now available in char setup, with pocketbooks being + smaller than other bags. + - rscadd: Purses are now available in the loadout under utility. Be fashionable + today! +2021-06-23: + Alberyk: + - tweak: Sinta'azaziba now displays accents. + Doxxmedearly: + - bugfix: Updated the ED-209 construction recipe to the new equipment. It now uses + armor plates (NOT the plate carriers) instead of the old vests, and disruptor + pistols instead of tasers. + - bugfix: Fixed a bug where attaching armor plate to a plate carrier would also + try to put the plate in its pockets, giving the message that the plate was too + long to fit in the carrier. +2021-06-25: + Doxxmedearly: + - bugfix: Grenades should now exit launchers properly primed, including cyborg launchers. + - tweak: Changed how being drowsy works. Instead of randomly putting you to sleep + with no warning, it now tries to replicate being drowsy via screen wobble, yawning, + periodic slurring, and vision blurring/darkening. + - tweak: Sufficient drowsiness has a small impact on your stamina recovery and stamina + cost for things like disarming and sprinting. + - tweak: Fevers have a slightly higher impact on drowsiness. + - bugfix: The lighting overlays for the service module on the venus borg chassis + have been properly aligned. + - bugfix: Hide, bare hide, and wet leather no longer act like steel. + - bugfix: Fixed an issue where you could queue up many clicks on hide sheets to + generate extra bare hide. + - tweak: Wet leather can no longer be used for crafting. + - rscadd: You can now dry wet leather manually with a welding tool. You do not need + a mask to do this. + - rscadd: Washing machines can now be started with alt+click. + - rscadd: Added additional examine info to hide sheets that tells you how to tan + it into fine leather. + - rscadd: Adds fine leather, which is only made by tanning animal hides. Other than + being a little harder to burn, it's just fluff material for those who want + to feel rich. + Geeves: + - bugfix: Vaurca, IPCS, and golems are now immune to the skin burning effects of + phoron. + - rscadd: Magistake has been updated to be Technomancer themed. Instead of four + apprentice mages, it'll be three technomancer apprentices. + - tweak: The classes for magistake have been tweaked, instead of spawning with set + spells, they spawn with different cores. If you don't like your core, refund + it and buy a different one. + - rscadd: Added some Warbling event skrell stuff to the game. + TheGreyWolf: + - rscadd: Nal'rasan and Siik'tajr now looks more unique when speaking + it. + - rscadd: Business cards can now be properly copied at a photocopier. + WickedCybs: + - tweak: Rest of the footwraps should no longer leave shoe/boot prints, just the + default footprints. + - tweak: Darkens greimorian blood a bit. +2021-06-26: + Alberyk: + - bugfix: Fixed admin winding displaying the wrong target message. + - bugfix: Fixed the vampire bite hud icon covering the gun buttons. + - bugfix: Fixed some adhomian drinks not having the correct icon. + Alberyk, Ramke: + - rscadd: Added some new Adhomian drinks. They can be found in the loadout selection + and booze vending machine. + - tweak: Butchering a fatshouter now gives lard. + Doxxmedearly: + - bugfix: You can no longer toggle hardsuit modules (such as maneuvering jets) while + dead. + - tweak: Spawning a chemical dispenser cartridge as an admin now uses a search function + similar to how the spawn verb works. + TheGreyWolf: + - maptweak: The head of personnel is now given a DENIED stamp. +2021-06-27: + Geeves: + - rscadd: Disposal Pipe Dispensers now have their own sprite and uses a themed UI. + - rscadd: Automatic Floor Layers now have their own sprite and no longer delete + the tiles they dismantle. + - rscadd: Automatic Cable Layers now have their own sprites. + TheGreyWolf: + - bugfix: Slicing a fatshouter fillet now properly gives fatshouter fillet slices. +2021-06-28: + Geeves: + - bugfix: Fixed the reverb of the cozmo migration event to sound like it's + coming from the station. +2021-06-29: + Doxxmedearly: + - bugfix: If there's a nearby bluespace inhibitor, portals made by the hand + teleporter or jaunter will close when you try to go through them, instead of + sitting there blocking the tile. + - bugfix: Teleporting into open closets with the closet teleporter no longer melds + you into the closet and makes you stuck. + - bugfix: Addressed several runtime issues with teleportation handling. + - bugfix: Hand teleporter portals should no longer view any turf in range of a working + bluespace inhibitor as a valid exit. However, interference from a failed teleport + somewhere else may still spit you out by one. + - tweak: Closet teleporters are now affected by bluespace inhibitors. If either + closet is in range of one, the teleportation will fail. + - tweak: You can no longer create a portal with the jaunter or hand teleporter if + in range of a working bluespace inhibitor. + Geeves: + - rscadd: You can now use any tool with a matching tool quality for surgery and + RIG assembly, meaning you can open an IPC's hatch with a screwdriver augment. + Most surgeries need you to use a surgery viable tool, meaning an impact drill + cannot be used, the exception being the robotic surgeries. + TheGreyWolf: + - rscadd: Emagged recorders will now self destruct upon delivering their message. + - rscadd: Cameras (for taking photos) can now be alt clicked to change photo size. + WickedCybs: + - tweak: The sleepy ring uplink item now gives a proper description of what it actually + does. The amount of poly it injects has also been lowered from 15 to 10. +2021-06-30: + Doxxmedearly: + - bugfix: Pipe dispensers can be unanchored and anchored properly again. + - rscdel: Removed wizard and conflux (Wizard + Cult). + - rscdel: Removed most wizard-associated spells and items (Wands, staves, Magivend, + etc). Some kept for use in admin events. + - rscdel: Removed roundstart tips referencing wizards. + - rscdel: Removed the armor value on wizard robes. + - rscadd: Added a random item spawn for the old wizard clothing, so you can dress + up like a nerd. Sometimes spawns in cargo or maint, as well as inside gifts. + - tweak: Reflavors some items to remove references to the wizard federation. + TheGreyWolf: + - spellcheck: Vegetable rikazu now have crunchy vegetables instread of cruncy. + - bugfix: Aprons & sundresses will no longer give overheating messages to taj. + - bugfix: All station jobs now have sechud icons. +2021-07-02: + TheGreyWolf: + - bugfix: Mechs are no longer immortal. +2021-07-03: + Alberyk: + - tweak: Grabs can not longer be used to force the person being grabbed to attack + themselves. + Alberyk, Kyres1, Geeves: + - rscadd: Added new menu buttons icons. + - rscadd: Added a new lobby screen. + Doxxmedearly: + - tweak: Updated the phoron canister bounty to require less moles, and it will now + tell you the exact minimum moles needed. Like the sheets bounty, this was a + bit too heavy-handed, even for the scarcity arc. + Geeves: + - rscadd: Throwing something at a tile adjacent to you will instead put it down + gently, provided you are on help intent. + - rscadd: Clicking on someone with an item in your hand while you have throw mode + active and on help intent will offer it to them like you used the Give verb. + If they're also on throw intent and on help intent, you put it into their + hand directly. + - rscadd: The standard ghost follow menu has been replaced with an upgraded VueUI + version. + - rscadd: Wired rods and makeshift stun batons now use the color of cable coil you + used to make them. + - rscadd: You can now create a tripwire trap by combining two wired rods with eachother. + The color of the wire will be of the wired rod you click on to make it. + TheGreyWolf: + - rscadd: The head of personnel now get spare encryption keys for cargo & service. + - tweak: Engineering & security lockers have been tweaked to ensure their contents + remain consistent instead of random. Bags remains random between satchel & + backpack however. + - rscadd: Investigator's locker now gets drop pouches and a bag to fit with + the rest of security. Warden & HoP are now issued holsters with their weapons. + - rscadd: Icecream now has different flavors, enjoy! + - tweak: The banshee voidsuit is renamed to be an infiltration instead of combat + suit. Also clarified the description in the uplink a little. + - bugfix: Fixes some bugs related to loadout wristbound selection. + - bugfix: The loadout tablet once again works. +2021-07-05: + Doxxmedearly: + - bugfix: Nymphs split from gestalts now retain the correct accent. + - bugfix: Forbid hivenet and some other special case languages from being learned + by dionae. + - bugfix: Nymphs can no long feed hydroponics trays from any distance. + - bugfix: Detached nymphs can no longer merge back with their gestalt from long + distances; you now have to be adjacent to your gestalt, as intended. + - bugfix: Nymphs now properly metabolize nutriment. This also allows them to actually + finish eating food. + - bugfix: Fixed some 'unusable emote' errors for nymphs when processing + reagents that forced emotes. This also allows them to use the rapid blink emote. + TheGreyWolf: + - rscadd: When selecting the wristbound PDA type in character setup, it now spawns + in the wrist slot. + WickedCybs: + - spellcheck: Tweaked the antag flavour text on the sleepy ring to improve its readability. +2021-07-07: + Geeves: + - rscadd: Added Tech Processors, circuits available in the Machinery section of + the circuit imprinter. When linked to an RnD server with a multitool, it will + passively increase any techs above level zero. + - rscadd: A single tech processor circuitboard and two basic scanning modules have + been added to Tech Storage. + - rscadd: The entrance to the server room now has a button next to it that'll + toggle ID Scan, it will also state that it has been used on the science radio + channel. + - rscdel: Removed the robotics server from the server room, the core server will + now serve and be served by both consoles. + - bugfix: Tech now properly adds the progress to the total progress when you increase + a tech level. + TheGreyWolf: + - rscadd: Removing accessories is now a radial menu, and it is now also possible + to pick which accessory to remove from another person. + - rscadd: Ported coffee cups. They can be found in the 'general' section + in the loadout, in the kitchen dinnerware machine and the diner utensil machine. + - rscadd: Ported several new drinking glasses. They can be made in the autolathe, + found in the booze-o-mat and a pitcher & carafe can be found ain the kitchen + dinnerware machine & diner utensil machine. + - maptweak: Mapped coffee pitchers into command, security, engineering sublevel + & medical breakroom and into the surface meeting room alongside with the + diplomatic reception. + - tweak: Grabbing someone aggressively, neck grabs and forcing someone to the ground + now uses the same text type as attacking someone. + - rscadd: Lit torches can now be used to ignite stuff, be extinguished by using + it in hand and reused. + - rscadd: Traitor clerical kits now starts with a folder full of paper. + WickedCybs: + - rscadd: Blazers are now contained in their own selection and you can choose from + the usual blazer you know and love, and a new extended long blazer variant. + This does mean you will have to reselect it if you were using a blazer already, + sorry about that. + - tweak: Icarus drones now illuminate their surroundings to a small extent. + - tweak: The purple comb in the cosmetics section wasn't purple, it was gray. + It's been renamed to 'comb' and can now be recoloured too. +2021-07-08: + Geeves: + - rscadd: Radiation suits have been given new sprites. + - rscadd: Radiation closets now spawn with two anti-rad autoinjectors. + - rscadd: Radiation suits can now hold a similar array of items to an EVA hardsuit + in is storage slot now, as well as the hood and the anti-rad autoinjector. + - bugfix: Machines that need a stack of materials to be made now spawns the right + amount if mapped in. + TheGreyWolf: + - bugfix: Tajara & Vaurca nightvision can now be used even while restrained + or laying down. +2021-07-09: + Geeves: + - rscadd: Burglars can now inspect their pens to see how far their pen has charged + via a loading bar. + TheGreyWolf: + - bugfix: Fixes loadout coffee cup being the basic one when spawning. + - bugfix: Fixes coffee cup placement on tables. + - tweak: Ashtrays now fills less in bags. +2021-07-11: + Skull132: + - bugfix: You can now close the external auth window, if it doesn't close by + itself. diff --git a/html/fonts/OFL/BilboINC.woff b/html/fonts/OFL/BilboINC.woff new file mode 100644 index 00000000000..324331d79ee Binary files /dev/null and b/html/fonts/OFL/BilboINC.woff differ diff --git a/html/fonts/OFL/Bluebird.woff b/html/fonts/OFL/Bluebird.woff new file mode 100644 index 00000000000..a6ff0bd6db2 Binary files /dev/null and b/html/fonts/OFL/Bluebird.woff differ diff --git a/html/fonts/OFL/Classica.woff b/html/fonts/OFL/Classica.woff new file mode 100644 index 00000000000..e14719681e7 Binary files /dev/null and b/html/fonts/OFL/Classica.woff differ diff --git a/html/fonts/OFL/Copt-B.woff b/html/fonts/OFL/Copt-B.woff new file mode 100644 index 00000000000..e08a684b37b Binary files /dev/null and b/html/fonts/OFL/Copt-B.woff differ diff --git a/html/fonts/OFL/Ducados.woff b/html/fonts/OFL/Ducados.woff new file mode 100644 index 00000000000..41bd30149e2 Binary files /dev/null and b/html/fonts/OFL/Ducados.woff differ diff --git a/html/fonts/OFL/FProject.woff b/html/fonts/OFL/FProject.woff new file mode 100644 index 00000000000..1a5337752bb Binary files /dev/null and b/html/fonts/OFL/FProject.woff differ diff --git a/html/fonts/OFL/Gelasio.woff b/html/fonts/OFL/Gelasio.woff new file mode 100644 index 00000000000..ec7e2932efb Binary files /dev/null and b/html/fonts/OFL/Gelasio.woff differ diff --git a/html/fonts/OFL/GrandHotel.woff b/html/fonts/OFL/GrandHotel.woff new file mode 100644 index 00000000000..f0370c24f90 Binary files /dev/null and b/html/fonts/OFL/GrandHotel.woff differ diff --git a/html/fonts/OFL/KaushanScript.woff b/html/fonts/OFL/KaushanScript.woff new file mode 100644 index 00000000000..63fb38e0e73 Binary files /dev/null and b/html/fonts/OFL/KaushanScript.woff differ diff --git a/html/fonts/OFL/KawkabMono.woff b/html/fonts/OFL/KawkabMono.woff new file mode 100644 index 00000000000..f5de409dc0b Binary files /dev/null and b/html/fonts/OFL/KawkabMono.woff differ diff --git a/html/fonts/OFL/Lashema.woff b/html/fonts/OFL/Lashema.woff new file mode 100644 index 00000000000..bd5315bd088 Binary files /dev/null and b/html/fonts/OFL/Lashema.woff differ diff --git a/html/fonts/OFL/Mo5V56.woff b/html/fonts/OFL/Mo5V56.woff new file mode 100644 index 00000000000..3aaf7c93c73 Binary files /dev/null and b/html/fonts/OFL/Mo5V56.woff differ diff --git a/html/fonts/OFL/OFL-FAQ.txt b/html/fonts/OFL/OFL-FAQ.txt new file mode 100644 index 00000000000..526fba98724 --- /dev/null +++ b/html/fonts/OFL/OFL-FAQ.txt @@ -0,0 +1,436 @@ +OFL FAQ - Frequently Asked Questions about the SIL Open Font License (OFL) +Version 1.1-update6 - December 2020 +The OFL FAQ is copyright (c) 2005-2020 SIL International. +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +(See http://scripts.sil.org/OFL for updates) + + +CONTENTS OF THIS FAQ +1 USING AND DISTRIBUTING FONTS LICENSED UNDER THE OFL +2 USING OFL FONTS FOR WEB PAGES AND ONLINE WEB FONT SERVICES +3 MODIFYING OFL-LICENSED FONTS +4 LICENSING YOUR ORIGINAL FONTS UNDER THE OFL +5 CHOOSING RESERVED FONT NAMES +6 ABOUT THE FONTLOG +7 MAKING CONTRIBUTIONS TO OFL PROJECTS +8 ABOUT THE LICENSE ITSELF +9 ABOUT SIL INTERNATIONAL +APPENDIX A - FONTLOG EXAMPLE + +1 USING AND DISTRIBUTING FONTS LICENSED UNDER THE OFL + +1.1 Can I use the fonts for a book or other print publication, to create logos or other graphics or even to manufacture objects based on their outlines? +Yes. You are very welcome to do so. Authors of fonts released under the OFL allow you to use their font software as such for any kind of design work. No additional license or permission is required, unlike with some other licenses. Some examples of these uses are: logos, posters, business cards, stationery, video titling, signage, t-shirts, personalised fabric, 3D-printed/laser-cut shapes, sculptures, rubber stamps, cookie cutters and lead type. + +1.1.1 Does that restrict the license or distribution of that artwork? +No. You remain the author and copyright holder of that newly derived graphic or object. You are simply using an open font in the design process. It is only when you redistribute, bundle or modify the font itself that other conditions of the license have to be respected (see below for more details). + +1.1.2 Is any kind of acknowledgement required? +No. Font authors may appreciate being mentioned in your artwork's acknowledgements alongside the name of the font, possibly with a link to their website, but that is not required. + +1.2 Can the fonts be included with Free/Libre and Open Source Software collections such as GNU/Linux and BSD distributions and repositories? +Yes! Fonts licensed under the OFL can be freely included alongside other software under FLOSS (Free/Libre and Open Source Software) licenses. Since fonts are typically aggregated with, not merged into, existing software, there is little need to be concerned about incompatibility with existing software licenses. You may also repackage the fonts and the accompanying components in a .rpm or .deb package (or other similar package formats or installers) and include them in distribution CD/DVDs and online repositories. (Also see section 5.9 about rebuilding from source.) + +1.3 I want to distribute the fonts with my program. Does this mean my program also has to be Free/Libre and Open Source Software? +No. Only the portions based on the Font Software are required to be released under the OFL. The intent of the license is to allow aggregation or bundling with software under restricted licensing as well. + +1.4 Can I sell a software package that includes these fonts? +Yes, you can do this with both the Original Version and a Modified Version of the fonts. Examples of bundling made possible by the OFL would include: word processors, design and publishing applications, training and educational software, games and entertainment software, mobile device applications, etc. + +1.5 Can I include the fonts on a CD of freeware or commercial fonts? +Yes, as long some other font or software is also on the disk, so the OFL font is not sold by itself. + +1.6 Why won't the OFL let me sell the fonts alone? +The intent is to keep people from making money by simply redistributing the fonts. The only people who ought to profit directly from the fonts should be the original authors, and those authors have kindly given up potential direct income to distribute their fonts under the OFL. Please honour and respect their contribution! + +1.7 What about sharing OFL fonts with friends on a CD, DVD or USB stick? +You are very welcome to share open fonts with friends, family and colleagues through removable media. Just remember to include the full font package, including any copyright notices and licensing information as available in OFL.txt. In the case where you sell the font, it has to come bundled with software. + +1.8 Can I host the fonts on a web site for others to use? +Yes, as long as you make the full font package available. In most cases it may be best to point users to the main site that distributes the Original Version so they always get the most recent stable and complete version. See also discussion of web fonts in Section 2. + +1.9 Can I host the fonts on a server for use over our internal network? +Yes. If the fonts are transferred from the server to the client computer by means that allow them to be used even if the computer is no longer attached to the network, the full package (copyright notices, licensing information, etc.) should be included. + +1.10 Does the full OFL license text always need to accompany the font? +The only situation in which an OFL font can be distributed without the text of the OFL (either in a separate file or in font metadata), is when a font is embedded in a document or bundled within a program. In the case of metadata included within a font, it is legally sufficient to include only a link to the text of the OFL on http://scripts.sil.org/OFL, but we strongly recommend against this. Most modern font formats include metadata fields that will accept the full OFL text, and full inclusion increases the likelihood that users will understand and properly apply the license. + +1.11 What do you mean by 'embedding'? How does that differ from other means of distribution? +By 'embedding' we mean inclusion of the font in a document or file in a way that makes extraction (and redistribution) difficult or clearly discouraged. In many cases the names of embedded fonts might also not be obvious to those reading the document, the font data format might be altered, and only a subset of the font - only the glyphs required for the text - might be included. Any other means of delivering a font to another person is considered 'distribution', and needs to be accompanied by any copyright notices and licensing information available in OFL.txt. + +1.12 So can I embed OFL fonts in my document? +Yes, either in full or a subset. The restrictions regarding font modification and redistribution do not apply, as the font is not intended for use outside the document. + +1.13 Does embedding alter the license of the document itself? +No. Referencing or embedding an OFL font in any document does not change the license of the document itself. The requirement for fonts to remain under the OFL does not apply to any document created using the fonts and their derivatives. Similarly, creating any kind of graphic using a font under OFL does not make the resulting artwork subject to the OFL. + +1.14 If OFL fonts are extracted from a document in which they are embedded (such as a PDF file), what can be done with them? Is this a risk to author(s)? +The few utilities that can extract fonts embedded in a PDF will typically output limited amounts of outlines - not a complete font. To create a working font from this method is much more difficult and time consuming than finding the source of the original OFL font. So there is little chance that an OFL font would be extracted and redistributed inappropriately through this method. Even so, copyright laws address any misrepresentation of authorship. All Font Software released under the OFL and marked as such by the author(s) is intended to remain under this license regardless of the distribution method, and cannot be redistributed under any other license. We strongly discourage any font extraction - we recommend directly using the font sources instead - but if you extract font outlines from a document, please be considerate: respect the work of the author(s) and the licensing model. + +1.15 What about distributing fonts with a document? Within a compressed folder structure? Is it distribution, bundling or embedding? +Certain document formats may allow the inclusion of an unmodified font within their file structure which may consist of a compressed folder containing the various resources forming the document (such as pictures and thumbnails). Including fonts within such a structure is understood as being different from embedding but rather similar to bundling (or mere aggregation) which the license explicitly allows. In this case the font is conveyed unchanged whereas embedding a font usually transforms it from the original format. The OFL does not allow anyone to extract the font from such a structure to then redistribute it under another license. The explicit permission to redistribute and embed does not cancel the requirement for the Font Software to remain under the license chosen by its author(s). Even if the font travels inside the document as one of its assets, it should not lose its authorship information and licensing. + +1.16 What about ebooks shipping with open fonts? +The requirements differ depending on whether the fonts are linked, embedded or distributed (bundled or aggregated). Some ebook formats use web technologies to do font linking via @font-face, others are designed for font embedding, some use fonts distributed with the document or reading software, and a few rely solely on the fonts already present on the target system. The license requirements depend on the type of inclusion as discussed in 1.15. + +1.17 Can Font Software released under the OFL be subject to URL-based access restrictions methods or DRM (Digital Rights Management) mechanisms? +Yes, but these issues are out-of-scope for the OFL. The license itself neither encourages their use nor prohibits them since such mechanisms are not implemented in the components of the Font Software but through external software. Such restrictions are put in place for many different purposes corresponding to various usage scenarios. One common example is to limit potentially dangerous cross-site scripting attacks. However, in the spirit of libre/open fonts and unrestricted writing systems, we strongly encourage open sharing and reuse of OFL fonts, and the establishment of an environment where such restrictions are unnecessary. Note that whether you wish to use such mechanisms or you prefer not to, you must still abide by the rules set forth by the OFL when using fonts released by their authors under this license. Derivative fonts must be licensed under the OFL, even if they are part of a service for which you charge fees and/or for which access to source code is restricted. You may not sell the fonts on their own - they must be part of a larger software package, bundle or subscription plan. For example, even if the OFL font is distributed in a software package or via an online service using a DRM mechanism, the user would still have the right to extract that font, use, study, modify and redistribute it under the OFL. + +1.18 I've come across a font released under the OFL. How can I easily get more information about the Original Version? How can I know where it stands compared to the Original Version or other Modified Versions? +Consult the copyright statement(s) in the license for ways to contact the original authors. Consult the FONTLOG (see section 6 for more details and examples) for information on how the font differs from the Original Version, and get in touch with the various contributors via the information in the acknowledgement section. Please consider using the Original Versions of the fonts whenever possible. + +1.19 What do you mean in condition 4 of the OFL's permissions and conditions? Can you provide examples of abusive promotion / endorsement / advertisement vs. normal acknowledgement? +The intent is that the goodwill and reputation of the author(s) should not be used in a way that makes it sound like the original author(s) endorse or approve of a specific Modified Version or software bundle. For example, it would not be right to advertise a word processor by naming the author(s) in a listing of software features, or to promote a Modified Version on a web site by saying "designed by ...". However, it would be appropriate to acknowledge the author(s) if your software package has a list of people who deserve thanks. We realize that this can seem to be a grey area, but the standard used to judge an acknowledgement is that if the acknowledgement benefits the author(s) it is allowed, but if it primarily benefits other parties, or could reflect poorly on the author(s), then it is not. + +1.20 I'm writing a small app for mobile platforms, do I need to include the whole package? +If you bundle a font under the OFL with your mobile app you must comply with the terms of the license. At a minimum you must include the copyright statement, the license notice and the license text. A mention of this information in your About box or Changelog, with a link to where the font package is from, is good practice, and the extra space needed to carry these items is very small. You do not, however, need to include the full contents of the font package - only the fonts you use and the copyright and license that apply to them. For example, if you only use the regular weight in your app, you do not need to include the italic and bold versions. + +1.21 What about including OFL fonts by default in my firmware or dedicated operating system? +Many such systems are restricted and turned into appliances so that users cannot study or modify them. Using open fonts to increase quality and language coverage is a great idea, but you need to be aware that if there is a way for users to extract fonts you cannot legally prevent them from doing that. The fonts themselves, including any changes you make to them, must be distributed under the OFL even if your firmware has a more restrictive license. If you do transform the fonts and change their formats when you include them in your firmware you must respect any names reserved by the font authors via the RFN mechanism and pick your own font name. Alternatively if you directly add a font under the OFL to the font folder of your firmware without modifying or optimizing it you are simply bundling the font like with any other software collection, and do not need to make any further changes. + +1.22 Can I make and publish CMS themes or templates that use OFL fonts? Can I include the fonts themselves in the themes or templates? Can I sell the whole package? +Yes, you are very welcome to integrate open fonts into themes and templates for your preferred CMS and make them more widely available. Remember that you can only sell the fonts and your CMS add-on as part of a software bundle. (See 1.4 for details and examples about selling bundles). + +1.23 Can OFL fonts be included in services that deliver fonts to the desktop from remote repositories? Even if they contain both OFL and non-OFL fonts? +Yes. Some foundries have set up services to deliver fonts to subscribers directly to desktops from their online repositories; similarly, plugins are available to preview and use fonts directly in your design tool or publishing suite. These services may mix open and restricted fonts in the same channel, however they should make a clear distinction between them to users. These services should also not hinder users (such as through DRM or obfuscation mechanisms) from extracting and using the OFL fonts in other environments, or continuing to use OFL fonts after subscription terms have ended, as those uses are specifically allowed by the OFL. + +1.24 Can services that provide or distribute OFL fonts restrict my use of them? +No. The terms of use of such services cannot replace or restrict the terms of the OFL, as that would be the same as distributing the fonts under a different license, which is not allowed. You are still entitled to use, modify and redistribute them as the original authors have intended outside of the sole control of that particular distribution channel. Note, however, that the fonts provided by these services may differ from the Original Versions. + + +2 USING OFL FONTS FOR WEBPAGES AND ONLINE WEB FONT SERVICES + +NOTE: This section often refers to a separate paper on 'Web Fonts & RFNs'. This is available at http://scripts.sil.org/OFL_web_fonts_and_RFNs + +2.1 Can I make webpages using these fonts? +Yes! Go ahead! Using CSS (Cascading Style Sheets) is recommended. Your three best options are: +- referring directly in your stylesheet to open fonts which may be available on the user's system +- providing links to download the full package of the font - either from your own website or from elsewhere - so users can install it themselves +- using @font-face to distribute the font directly to browsers. This is recommended and explicitly allowed by the licensing model because it is distribution. The font file itself is distributed with other components of the webpage. It is not embedded in the webpage but referenced through a web address which will cause the browser to retrieve and use the corresponding font to render the webpage (see 1.11 and 1.15 for details related to embedding fonts into documents). As you take advantage of the @font-face cross-platform standard, be aware that web fonts are often tuned for a web environment and not intended for installation and use outside a browser. The reasons in favour of using web fonts are to allow design of dynamic text elements instead of static graphics, to make it easier for content to be localized and translated, indexed and searched, and all this with cross-platform open standards without depending on restricted extensions or plugins. You should check the CSS cascade (the order in which fonts are being called or delivered to your users) when testing. + +2.2 Can I make and use WOFF (Web Open Font Format) versions of OFL fonts? +Yes, but you need to be careful. A change in font format normally is considered modification, and Reserved Font Names (RFNs) cannot be used. Because of the design of the WOFF format, however, it is possible to create a WOFF version that is not considered modification, and so would not require a name change. You are allowed to create, use and distribute a WOFF version of an OFL font without changing the font name, but only if: + +- the original font data remains unchanged except for WOFF compression, and +- WOFF-specific metadata is either omitted altogether or present and includes, unaltered, the contents of all equivalent metadata in the original font. + +If the original font data or metadata is changed, or the WOFF-specific metadata is incomplete, the font must be considered a Modified Version, the OFL restrictions would apply and the name of the font must be changed: any RFNs cannot be used and copyright notices and licensing information must be included and cannot be deleted or modified. You must come up with a unique name - we recommend one corresponding to your domain or your particular web application. Be aware that only the original author(s) can use RFNs. This is to prevent collisions between a derivative tuned to your audience and the original upstream version and so to reduce confusion. + +Please note that most WOFF conversion tools and online services do not meet the two requirements listed above, and so their output must be considered a Modified Version. So be very careful and check to be sure that the tool or service you're using is compressing unchanged data and completely and accurately reflecting the original font metadata. + +2.3 What about other web font formats such as EOT/EOTLite/CWT/etc.? +In most cases these formats alter the original font data more than WOFF, and do not completely support appropriate metadata, so their use must be considered modification and RFNs may not be used. However, there may be certain formats or usage scenarios that may allow the use of RFNs. See http://scripts.sil.org/OFL_web_fonts_and_RFNs + +2.4 Can I make OFL fonts available through web font online services? +Yes, you are welcome to include OFL fonts in online web font services as long as you properly meet all the conditions of the license. The origin and open status of the font should be clear among the other fonts you are hosting. Authorship, copyright notices and license information must be sufficiently visible to your users or subscribers so they know where the font comes from and the rights granted by the author(s). Make sure the font file contains the needed copyright notice(s) and licensing information in its metadata. Please double-check the accuracy of every field to prevent contradictory information. Other font formats, including EOT/EOTLite/CWT and superior alternatives like WOFF, already provide fields for this information. Remember that if you modify the font within your library or convert it to another format for any reason the OFL restrictions apply and you need to change the names accordingly. Please respect the author's wishes as expressed in the OFL and do not misrepresent original designers and their work. Don't lump quality open fonts together with dubious freeware or public domain fonts. Consider how you can best work with the original designers and foundries, support their efforts and generate goodwill that will benefit your service. (See 1.17 for details related to URL-based access restrictions methods or DRM mechanisms). + +2.5 Some web font formats and services provide ways of "optimizing" the font for a particular website or web application; is that allowed? +Yes, it is permitted, but remember that these optimized versions are Modified Versions and so must follow OFL requirements like appropriate renaming. Also you need to bear in mind the other important parameters beyond compression, speed and responsiveness: you need to consider the audience of your particular website or web application, as choosing some optimization parameters may turn out to be less than ideal for them. Subsetting by removing certain glyphs or features may seriously limit functionality of the font in various languages that your users expect. It may also introduce degradation of quality in the rendering or specific bugs on the various target platforms compared to the original font from upstream. In other words, remember that one person's optimized font may be another person's missing feature. Various advanced typographic features (OpenType, Graphite or AAT) are also available through CSS and may provide the desired effects without the need to modify the font. + +2.6 Is subsetting a web font considered modification? +Yes. Removing any parts of the font when delivering a web font to a browser, including unused glyphs and smart font code, is considered modification. This is permitted by the OFL but would not normally allow the use of RFNs. Some newer subsetting technologies may be able to subset in a way that allows users to effectively have access to the complete font, including smart font behaviour. See 2.8 and http://scripts.sil.org/OFL_web_fonts_and_RFNs + +2.7 Are there any situations in which a modified web font could use RFNs? +Yes. If a web font is optimized only in ways that preserve Functional Equivalence (see 2.8), then it may use RFNs, as it reasonably represents the Original Version and respects the intentions of the author(s) and the main purposes of the RFN mechanism (avoids collisions, protects authors, minimizes support, encourages derivatives). However this is technically very difficult and often impractical, so a much better scenario is for the web font service or provider to sign a separate agreement with the author(s) that allows the use of RFNs for Modified Versions. + +2.8 How do you know if an optimization to a web font preserves Functional Equivalence? +Functional Equivalence is described in full in the 'Web fonts and RFNs' paper at http://scripts.sil.org/OFL_web_fonts_and_RFNs, in general, an optimized font is deemed to be Functionally Equivalent (FE) to the Original Version if it: + +- Supports the same full character inventory. If a character can be properly displayed using the Original Version, then that same character, encoded correctly on a web page, will display properly. +- Provides the same smart font behavior. Any dynamic shaping behavior that works with the Original Version should work when optimized, unless the browser or environment does not support it. There does not need to be guaranteed support in the client, but there should be no forced degradation of smart font or shaping behavior, such as the removal or obfuscation of OpenType, Graphite or AAT tables. +- Presents text with no obvious degradation in visual quality. The lettershapes should be equally (or more) readable, within limits of the rendering platform. +- Preserves original author, project and license metadata. At a minimum, this should include: Copyright and authorship; The license as stated in the Original Version, whether that is the full text of the OFL or a link to the web version; Any RFN declarations; Information already present in the font or documentation that points back to the Original Version, such as a link to the project or the author's website. + +If an optimized font meets these requirements, and so is considered to be FE, then it's very likely that the original author would feel that the optimized font is a good and reasonable equivalent. If it falls short of any of these requirements, the optimized font does not reasonably represent the Original Version, and so should be considered to be a Modified Version. Like other Modified Versions, it would not be allowed to use any RFNs and you simply need to pick your own font name. + +2.9 Isn't use of web fonts another form of embedding? +No. Unlike embedded fonts in a PDF, web fonts are not an integrated part of the document itself. They are not specific to a single document and are often applied to thousands of documents around the world. The font data is not stored alongside the document data and often originates from a different location. The ease by which the web fonts used by a document may be identified and downloaded for desktop use demonstrates that they are philosophically and technically separate from the web pages that specify them. See http://scripts.sil.org/OFL_web_fonts_and_RFNs + +2.10 So would it be better to not use RFNs at all if you want your font to be distributed by a web fonts service? +No. Although the OFL does not require authors to use RFNs, the RFN mechanism is an important part of the OFL model and completely compatible with web font services. If that web font service modifies the fonts, then the best solution is to sign a separate agreement for the use of any RFNs. It is perfectly valid for an author to not declare any RFNs, but before they do so they need to fully understand the benefits they are giving up, and the overall negative effect of allowing many different versions bearing the same name to be widely distributed. As a result, we don't generally recommend it. + +2.11 What should an agreement for the use of RFNs say? Are there any examples? +There is no prescribed format for this agreement, as legal systems vary, and no recommended examples. Authors may wish to add specific clauses to further restrict use, require author review of Modified Versions, establish user support mechanisms or provide terms for ending the agreement. Such agreements are usually not public, and apply only to the main parties. However, it would be very beneficial for web font services to clearly state when they have established such agreements, so that the public understands clearly that their service is operating appropriately. + +See the separate paper on 'Web Fonts & RFNs' for in-depth discussion of issues related to the use of RFNs for web fonts. This is available at http://scripts.sil.org/OFL_web_fonts_and_RFNs + + +3 MODIFYING OFL-LICENSED FONTS + +3.1 Can I change the fonts? Are there any limitations to what things I can and cannot change? +You are allowed to change anything, as long as such changes do not violate the terms of the license. In other words, you are not allowed to remove the copyright statement(s) from the font, but you could put additional information into it that covers your contribution. See the placeholders in the OFL header template for recommendations on where to add your own statements. (Remember that, when authors have reserved names via the RFN mechanism, you need to change the internal names of the font to your own font name when making your modified version even if it is just a small change.) + +3.2 I have a font that needs a few extra glyphs - can I take them from an OFL licensed font and copy them into mine? +Yes, but if you distribute that font to others it must be under the OFL, and include the information mentioned in condition 2 of the license. + +3.3 Can I charge people for my additional work? In other words, if I add a bunch of special glyphs or OpenType/Graphite/AAT code, can I sell the enhanced font? +Not by itself. Derivative fonts must be released under the OFL and cannot be sold by themselves. It is permitted, however, to include them in a larger software package (such as text editors, office suites or operating systems), even if the larger package is sold. In that case, you are strongly encouraged, but not required, to also make that derived font easily and freely available outside of the larger package. + +3.4 Can I pay someone to enhance the fonts for my use and distribution? +Yes. This is a good way to fund the further development of the fonts. Keep in mind, however, that if the font is distributed to others it must be under the OFL. You won't be able to recover your investment by exclusively selling the font, but you will be making a valuable contribution to the community. Please remember how you have benefited from the contributions of others. + +3.5 I need to make substantial revisions to the font to make it work with my program. It will be a lot of work, and a big investment, and I want to be sure that it can only be distributed with my program. Can I restrict its use? +No. If you redistribute a Modified Version of the font it must be under the OFL. You may not restrict it in any way beyond what the OFL permits and requires. This is intended to ensure that all released improvements to the fonts become available to everyone. But you will likely get an edge over competitors by being the first to distribute a bundle with the enhancements. Again, please remember how you have benefited from the contributions of others. + +3.6 Do I have to make any derivative fonts (including extended source files, build scripts, documentation, etc.) publicly available? +No, but please consider sharing your improvements with others. You may find that you receive in return more than what you gave. + +3.7 If a trademark is claimed in the OFL font, does that trademark need to remain in modified fonts? +Yes. Any trademark notices must remain in any derivative fonts to respect trademark laws, but you may add any additional trademarks you claim, officially registered or not. For example if an OFL font called "Foo" contains a notice that "Foo is a trademark of Acme", then if you rename the font to "Bar" when creating a Modified Version, the new trademark notice could say "Foo is a trademark of Acme Inc. - Bar is a trademark of Roadrunner Technologies Ltd.". Trademarks work alongside the OFL and are not subject to the terms of the licensing agreement. The OFL does not grant any rights under trademark law. Bear in mind that trademark law varies from country to country and that there are no international trademark conventions as there are for copyright. You may need to significantly invest in registering and defending a trademark for it to remain valid in the countries you are interested in. This may be costly for an individual independent designer. + +3.8 If I commit changes to a font (or publish a branch in a DVCS) as part of a public open source software project, do I have to change the internal font names? +Only if there are declared RFNs. Making a public commit or publishing a public branch is effectively redistributing your modifications, so any change to the font will require that you do not use the RFNs. Even if there are no RFNs, it may be useful to change the name or add a suffix indicating that a particular version of the font is still in development and not released yet. This will clearly indicate to users and fellow designers that this particular font is not ready for release yet. See section 5 for more details. + + +4 LICENSING YOUR ORIGINAL FONTS UNDER THE OFL + +4.1 Can I use the SIL OFL for my own fonts? +Yes! We heartily encourage everyone to use the OFL to distribute their own original fonts. It is a carefully constructed license that allows great freedom along with enough artistic integrity protection for the work of the authors as well as clear rules for other contributors and those who redistribute the fonts. The licensing model is used successfully by various organisations, both for-profit and not-for-profit, to release fonts of varying levels of scope and complexity. + +4.2 What do I have to do to apply the OFL to my font? +If you want to release your fonts under the OFL, we recommend you do the following: + +4.2.1 Put your copyright and Reserved Font Names information at the beginning of the main OFL.txt file in place of the dedicated placeholders (marked with the <> characters). Include this file in your release package. + +4.2.2 Put your copyright and the OFL text with your chosen Reserved Font Name(s) into your font files (the copyright and license fields). A link to the OFL text on the OFL web site is an acceptable (but not recommended) alternative. Also add this information to any other components (build scripts, glyph databases, documentation, test files, etc). Accurate metadata in your font files is beneficial to you as an increasing number of applications are exposing this information to the user. For example, clickable links can bring users back to your website and let them know about other work you have done or services you provide. Depending on the format of your fonts and sources, you can use template human-readable headers or machine-readable metadata. You should also double-check that there is no conflicting metadata in the font itself contradicting the license, such as the fstype bits in the os2 table or fields in the name table. + +4.2.3 Write an initial FONTLOG.txt for your font and include it in the release package (see Section 6 and Appendix A for details including a template). + +4.2.4 Include the relevant practical documentation on the license by adding the current OFL-FAQ.txt file in your package. + +4.2.5 If you wish you can use the OFL graphics (http://scripts.sil.org/OFL_logo) on your website. + +4.3 Will you make my font OFL for me? +We won't do the work for you. We can, however, try to answer your questions, unfortunately we do not have the resources to review and check your font packages for correct use of the OFL. We recommend you turn to designers, foundries or consulting companies with experience in doing open font design to provide this service to you. + +4.4 Will you distribute my OFL font for me? +No, although if the font is of sufficient quality and general interest we may include a link to it on our partial list of OFL fonts on the OFL web site. You may wish to consider other open font catalogs or hosting services, such as the Unifont Font Guide (http://unifont.org/fontguide), The League of Movable Type (http://theleagueofmovabletype.com) or the Open Font Library (http://openfontlibrary.org/), which despite the name has no direct relationship to the OFL or SIL. We do not endorse any particular catalog or hosting service - it is your responsibility to determine if the service is right for you and if it treats authors with fairness. + +4.5 Why should I use the OFL for my fonts? +- to meet needs for fonts that can be modified to support lesser-known languages +- to provide a legal and clear way for people to respect your work but still use it (and reduce piracy) +- to involve others in your font project +- to enable your fonts to be expanded with new weights and improved writing system/language support +- to allow more technical font developers to add features to your design (such as OpenType, Graphite or AAT support) +- to renew the life of an old font lying on your hard drive with no business model +- to allow your font to be included in Libre Software operating systems like Ubuntu +- to give your font world status and wide, unrestricted distribution +- to educate students about quality typeface and font design +- to expand your test base and get more useful feedback +- to extend your reach to new markets when users see your metadata and go to your website +- to get your font more easily into one of the web font online services +- to attract attention for your commercial fonts +- to make money through web font services +- to make money by bundling fonts with applications +- to make money adjusting and extending existing open fonts +- to get a better chance that foundations/NGOs/charities/companies who commission fonts will pick you +- to be part of a sharing design and development community +- to give back and contribute to a growing body of font sources + + +5 CHOOSING RESERVED FONT NAMES + +5.1 What are Reserved Font Names? +These are font names, or portions of font names, that the author has chosen to reserve for use only with the Original Version of the font, or for Modified Version(s) created by the original author. + +5.2 Why can't I use the Reserved Font Names in my derivative font names? I'd like people to know where the design came from. +The best way to acknowledge the source of the design is to thank the original authors and any other contributors in the files that are distributed with your revised font (although no acknowledgement is required). The FONTLOG is a natural place to do this. Reserved Font Names ensure that the only fonts that have the original names are the unmodified Original Versions. This allows designers to maintain artistic integrity while allowing collaboration to happen. It eliminates potential confusion and name conflicts. When choosing a name, be creative and avoid names that reuse almost all the same letters in the same order or sound like the original. It will help everyone if Original Versions and Modified Versions can easily be distinguished from one another and from other derivatives. Any substitution and matching mechanism is outside the scope of the license. + +5.3 What do you mean by "primary name as presented to the user"? Are you referring to the font menu name? +Yes, this applies to the font menu name and other mechanisms that specify a font in a document. It would be fine, however, to keep a text reference to the original fonts in the description field, in your modified source file or in documentation provided alongside your derivative as long as no one could be confused that your modified source is the original. But you cannot use the Reserved Font Names in any way to identify the font to the user (unless the Copyright Holder(s) allow(s) it through a separate agreement). Users who install derivatives (Modified Versions) on their systems should not see any of the original Reserved Font Names in their font menus, for example. Again, this is to ensure that users are not confused and do not mistake one font for another and so expect features only another derivative or the Original Version can actually offer. + +5.4 Am I not allowed to use any part of the Reserved Font Names? +You may not use individual words from the Reserved Font Names, but you would be allowed to use parts of words, as long as you do not use any word from the Reserved Font Names entirely. We do not recommend using parts of words because of potential confusion, but it is allowed. For example, if "Foobar" was a Reserved Font Name, you would be allowed to use "Foo" or "bar", although we would not recommend it. Such an unfortunate choice would confuse the users of your fonts as well as make it harder for other designers to contribute. + +5.5 So what should I, as an author, identify as Reserved Font Names? +Original authors are encouraged to name their fonts using clear, distinct names, and only declare the unique parts of the name as Reserved Font Names. For example, the author of a font called "Foobar Sans" would declare "Foobar" as a Reserved Font Name, but not "Sans", as that is a common typographical term, and may be a useful word to use in a derivative font name. Reserved Font Names should also be single words for simplicity and legibility. A font called "Flowing River" should have Reserved Font Names "Flowing" and "River", not "Flowing River". You also need to be very careful about reserving font names which are already linked to trademarks (whether registered or not) which you do not own. + +5.6 Do I, as an author, have to identify any Reserved Font Names? +No. RFNs are optional and not required, but we encourage you to use them. This is primarily to avoid confusion between your work and Modified Versions. As an author you can release a font under the OFL and not declare any Reserved Font Names. There may be situations where you find that using no RFNs and letting your font be changed and modified - including any kind of modification - without having to change the original name is desirable. However you need to be fully aware of the consequences. There will be no direct way for end-users and other designers to distinguish your Original Version from many Modified Versions that may be created. You have to trust whoever is making the changes and the optimizations to not introduce problematic changes. The RFNs you choose for your own creation have value to you as an author because they allow you to maintain artistic integrity and keep some control over the distribution channel to your end-users. For discussion of RFNs and web fonts see section 2. + +5.7 Are any names (such as the main font name) reserved by default? +No. That is a change to the license as of version 1.1. If you want any names to be Reserved Font Names, they must be specified after the copyright statement(s). + +5.8 Is there any situation in which I can use Reserved Font Names for a Modified Version? +The Copyright Holder(s) can give certain trusted parties the right to use any of the Reserved Font Names through separate written agreements. For example, even if "Foobar" is a RFN, you could write up an agreement to give company "XYZ" the right to distribute a modified version with a name that includes "Foobar". This allows for freedom without confusion. The existence of such an agreement should be made as clear as possible to downstream users and designers in the distribution package and the relevant documentation. They need to know if they are a party to the agreement or not and what they are practically allowed to do or not even if all the details of the agreement are not public. + +5.9 Do font rebuilds require a name change? Do I have to change the name of the font when my packaging workflow includes a full rebuild from source? +Yes, all rebuilds which change the font data and the smart code are Modified Versions and the requirements of the OFL apply: you need to respect what the Author(s) have chosen in terms of Reserved Font Names. However if a package (or installer) is simply a wrapper or a compressed structure around the final font - leaving them intact on the inside - then no name change is required. Please get in touch with the author(s) and copyright holder(s) to inquire about the presence of font sources beyond the final font file(s) and the recommended build path. That build path may very well be non-trivial and hard to reproduce accurately by the maintainer. If a full font build path is made available by the upstream author(s) please be aware that any regressions and changes you may introduce when doing a rebuild for packaging purposes is your own responsibility as a package maintainer since you are effectively creating a separate branch. You should make it very clear to your users that your rebuilt version is not the canonical one from upstream. + +5.10 Can I add other Reserved Font Names when making a derivative font? +Yes. List your additional Reserved Font Names after your additional copyright statement, as indicated with example placeholders at the top of the OFL.txt file. Be sure you do not remove any existing RFNs but only add your own. RFN statements should be placed next to the copyright statement of the relevant author as indicated in the OFL.txt template to make them visible to designers wishing to make their separate version. + + +6 ABOUT THE FONTLOG + +6.1 What is this FONTLOG thing exactly? +It has three purposes: 1) to provide basic information on the font to users and other designers and developers, 2) to document changes that have been made to the font or accompanying files, either by the original authors or others, and 3) to provide a place to acknowledge authors and other contributors. Please use it! + +6.2 Is the FONTLOG required? +It is not a requirement of the license, but we strongly recommend you have one. + +6.3 Am I required to update the FONTLOG when making Modified Versions? +No, but users, designers and other developers might get very frustrated with you if you don't. People need to know how derivative fonts differ from the original, and how to take advantage of the changes, or build on them. There are utilities that can help create and maintain a FONTLOG, such as the FONTLOG support in FontForge. + +6.4 What should the FONTLOG look like? +It is typically a separate text file (FONTLOG.txt), but can take other formats. It commonly includes these four sections: + +- brief header describing the FONTLOG itself and name of the font family +- Basic Font Information - description of the font family, purpose and breadth +- ChangeLog - chronological listing of changes +- Acknowledgements - list of authors and contributors with contact information + +It could also include other sections, such as: where to find documentation, how to make contributions, information on contributing organizations, source code details, and a short design guide. See Appendix A for an example FONTLOG. + + +7 MAKING CONTRIBUTIONS TO OFL PROJECTS + +7.1 Can I contribute work to OFL projects? +In many cases, yes. It is common for OFL fonts to be developed by a team of people who welcome contributions from the wider community. Contact the original authors for specific information on how to participate in their projects. + +7.2 Why should I contribute my changes back to the original authors? +It would benefit many people if you contributed back in response to what you've received. Your contributions and improvements to the fonts and other components could be a tremendous help and would encourage others to contribute as well and 'give back'. You will then benefit from other people's contributions as well. Sometimes maintaining your own separate version takes more effort than merging back with the original. Be aware that any contributions, however, must be either your own original creation or work that you own, and you may be asked to affirm that clearly when you contribute. + +7.3 I've made some very nice improvements to the font. Will you consider adopting them and putting them into future Original Versions? +Most authors would be very happy to receive such contributions. Keep in mind that it is unlikely that they would want to incorporate major changes that would require additional work on their end. Any contributions would likely need to be made for all the fonts in a family and match the overall design and style. Authors are encouraged to include a guide to the design with the fonts. It would also help to have contributions submitted as patches or clearly marked changes - the use of smart source revision control systems like subversion, mercurial, git or bzr is a good idea. Please follow the recommendations given by the author(s) in terms of preferred source formats and configuration parameters for sending contributions. If this is not indicated in a FONTLOG or other documentation of the font, consider asking them directly. Examples of useful contributions are bug fixes, additional glyphs, stylistic alternates (and the smart font code to access them) or improved hinting. Keep in mind that some kinds of changes (esp. hinting) may be technically difficult to integrate. + +7.4 How can I financially support the development of OFL fonts? +It is likely that most authors of OFL fonts would accept financial contributions - contact them for instructions on how to do this. Such contributions would support future development. You can also pay for others to enhance the fonts and contribute the results back to the original authors for inclusion in the Original Version. + + +8 ABOUT THE LICENSE ITSELF + +8.1 I see that this is version 1.1 of the license. Will there be later changes? +Version 1.1 is the first minor revision of the OFL. We are confident that version 1.1 will meet most needs, but are open to future improvements. Any revisions would be for future font releases, and previously existing licenses would remain in effect. No retroactive changes are possible, although the Copyright Holder(s) can re-release the font under a revised OFL. All versions will be available on our web site: http://scripts.sil.org/OFL. + +8.2 Does this license restrict the rights of the Copyright Holder(s)? +No. The Copyright Holder(s) still retain(s) all the rights to their creation; they are only releasing a portion of it for use in a specific way. For example, the Copyright Holder(s) may choose to release a 'basic' version of their font under the OFL, but sell a restricted 'enhanced' version under a different license. They may also choose to release the same font under both the OFL and some other license. Only the Copyright Holder(s) can do this, and doing so does not change the terms of the OFL as it applies to that font. + +8.3 Is the OFL a contract or a license? +The OFL is a worldwide license based on international copyright agreements and conventions. It is not a contract and so does not require you to sign it to have legal validity. By using, modifying and redistributing components under the OFL you indicate that you accept the license. + +8.4 I really like the terms of the OFL, but want to change it a little. Am I allowed to take ideas and actual wording from the OFL and put them into my own custom license for distributing my fonts? +We strongly recommend against creating your very own unique open licensing model. Using a modified or derivative license will likely cut you off - along with the font(s) under that license - from the community of designers using the OFL, potentially expose you and your users to legal liabilities, and possibly put your work and rights at risk. The OFL went though a community and legal review process that took years of effort, and that review is only applicable to an unmodified OFL. The text of the OFL has been written by SIL (with review and consultation from the community) and is copyright (c) 2005-2017 SIL International. You may re-use the ideas and wording (in part, not in whole) in another non-proprietary license provided that you call your license by another unambiguous name, that you do not use the preamble, that you do not mention SIL and that you clearly present your license as different from the OFL so as not to cause confusion by being too similar to the original. If you feel the OFL does not meet your needs for an open license, please contact us. + +8.5 Can I quote from the OFL FAQ? +Yes, SIL gives permission to quote from the OFL FAQ (OFL-FAQ.txt), in whole or in part, provided that the quoted text is: + +- unmodified, +- used to help explain the intent of the OFL, rather than cause misunderstanding, and +- accompanied with the following attribution: "From the OFL FAQ (OFL-FAQ.txt), copyright (c) 2005-2020 SIL International. Used by permission. http://scripts.sil.org/OFL-FAQ_web". + +8.6 Can I translate the license and the FAQ into other languages? +SIL certainly recognises the need for people who are not familiar with English to be able to understand the OFL and its use. Making the license very clear and readable has been a key goal for the OFL, but we know that people understand their own language best. + +If you are an experienced translator, you are very welcome to translate the OFL and OFL-FAQ so that designers and users in your language community can understand the license better. But only the original English version of the license has legal value and has been approved by the community. Translations do not count as legal substitutes and should only serve as a way to explain the original license. SIL - as the author and steward of the license for the community at large - does not approve any translation of the OFL as legally valid because even small translation ambiguities could be abused and create problems. + +SIL gives permission to publish unofficial translations into other languages provided that they comply with the following guidelines: + +- Put the following disclaimer in both English and the target language stating clearly that the translation is unofficial: + +"This is an unofficial translation of the SIL Open Font License into . It was not published by SIL International, and does not legally state the distribution terms for fonts that use the OFL. A release under the OFL is only valid when using the original English text. However, we recognize that this unofficial translation will help users and designers not familiar with English to better understand and use the OFL. We encourage designers who consider releasing their creation under the OFL to read the OFL-FAQ in their own language if it is available. Please go to http://scripts.sil.org/OFL for the official version of the license and the accompanying OFL-FAQ." + +- Keep your unofficial translation current and update it at our request if needed, for example if there is any ambiguity which could lead to confusion. + +If you start such a unofficial translation effort of the OFL and OFL-FAQ please let us know. + +8.7 Does the OFL have an explicit expiration term? +No, the implicit intent of the OFL is that the permissions granted are perpetual and irrevocable. + + +9 ABOUT SIL INTERNATIONAL + +9.1 Who is SIL International and what do they do? +SIL serves language communities worldwide, building their capacity for sustainable language development, by means of research, translation, training and materials development. SIL makes its services available to all without regard to religious belief, political ideology, gender, race, or ethnic background. SIL's members and volunteers share a Christian commitment. + +9.2 What does this have to do with font licensing? +The ability to read, write, type and publish in one's own language is one of the most critical needs for millions of people around the world. This requires fonts that are widely available and support lesser-known languages. SIL develops - and encourages others to develop - a complete stack of writing systems implementation components available under open licenses. This open stack includes input methods, smart fonts, smart rendering libraries and smart applications. There has been a need for a common open license that is specifically applicable to fonts and related software (a crucial component of this stack), so SIL developed the SIL Open Font License with the help of the Free/Libre and Open Source Software community. + +9.3 How can I contact SIL? +Our main web site is: http://www.sil.org/ +Our site about complex scripts is: http://scripts.sil.org/ +Information about this license (and contact information) is at: http://scripts.sil.org/OFL + + +APPENDIX A - FONTLOG EXAMPLE + +Here is an example of the recommended format for a FONTLOG, although other formats are allowed. + +----- +FONTLOG for the GlobalFontFamily fonts + +This file provides detailed information on the GlobalFontFamily Font Software. This information should be distributed along with the GlobalFontFamily fonts and any derivative works. + +Basic Font Information + +GlobalFontFamily is a Unicode typeface family that supports all languages that use the Latin script and its variants, and could be expanded to support other scripts. + +NewWorldFontFamily is based on the GlobalFontFamily and also supports Greek, Hebrew, Cyrillic and Armenian. + +More specifically, this release supports the following Unicode ranges... +This release contains... +Documentation can be found at... +To contribute to the project... + +ChangeLog + +10 December 2010 (Fred Foobar) GlobalFontFamily-devel version 1.4 +- fix new build and testing system (bug #123456) + +1 August 2008 (Tom Parker) GlobalFontFamily version 1.2.1 +- Tweaked the smart font code (Branch merged with trunk version) +- Provided improved build and debugging environment for smart behaviours + +7 February 2007 (Pat Johnson) NewWorldFontFamily Version 1.3 +- Added Greek and Cyrillic glyphs + +7 March 2006 (Fred Foobar) NewWorldFontFamily Version 1.2 +- Tweaked contextual behaviours + +1 Feb 2005 (Jane Doe) NewWorldFontFamily Version 1.1 +- Improved build script performance and verbosity +- Extended the smart code documentation +- Corrected minor typos in the documentation +- Fixed position of combining inverted breve below (U+032F) +- Added OpenType/Graphite smart code for Armenian +- Added Armenian glyphs (U+0531 -> U+0587) +- Released as "NewWorldFontFamily" + +1 Jan 2005 (Joe Smith) GlobalFontFamily Version 1.0 +- Initial release + +Acknowledgements + +If you make modifications be sure to add your name (N), email (E), web-address (if you have one) (W) and description (D). This list is in alphabetical order. + +N: Jane Doe +E: jane@university.edu +W: http://art.university.edu/projects/fonts +D: Contributor - Armenian glyphs and code + +N: Fred Foobar +E: fred@foobar.org +W: http://foobar.org +D: Contributor - misc Graphite fixes + +N: Pat Johnson +E: pat@fontstudio.org +W: http://pat.fontstudio.org +D: Designer - Greek & Cyrillic glyphs based on Roman design + +N: Tom Parker +E: tom@company.com +W: http://www.company.com/tom/projects/fonts +D: Engineer - original smart font code + +N: Joe Smith +E: joe@fontstudio.org +W: http://joe.fontstudio.org +D: Designer - original Roman glyphs + +Fontstudio.org is an not-for-profit design group whose purpose is... +Foobar.org is a distributed community of developers... +Company.com is a small business who likes to support community designers... +University.edu is a renowned educational institution with a strong design department... +----- + diff --git a/html/fonts/OFL/OFL.txt b/html/fonts/OFL/OFL.txt new file mode 100644 index 00000000000..12b3ce0a0ca --- /dev/null +++ b/html/fonts/OFL/OFL.txt @@ -0,0 +1,93 @@ + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE + +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. +DEFINITIONS + +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting — in part or in whole — any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. +PERMISSION & CONDITIONS + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. +TERMINATION + +This license becomes null and void if any of the above conditions are +not met. +DISCLAIMER + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/html/fonts/OFL/RunaSans.woff b/html/fonts/OFL/RunaSans.woff new file mode 100644 index 00000000000..218e71db518 Binary files /dev/null and b/html/fonts/OFL/RunaSans.woff differ diff --git a/html/fonts/OFL/SourceCodePro.woff b/html/fonts/OFL/SourceCodePro.woff new file mode 100644 index 00000000000..259e2a99186 Binary files /dev/null and b/html/fonts/OFL/SourceCodePro.woff differ diff --git a/html/fonts/OFL/SovjetBox.woff b/html/fonts/OFL/SovjetBox.woff new file mode 100644 index 00000000000..a05c6775fa2 Binary files /dev/null and b/html/fonts/OFL/SovjetBox.woff differ diff --git a/html/fonts/OFL/Stormning.woff b/html/fonts/OFL/Stormning.woff new file mode 100644 index 00000000000..ed03de2f123 Binary files /dev/null and b/html/fonts/OFL/Stormning.woff differ diff --git a/html/fonts/OFL/Torsha.woff b/html/fonts/OFL/Torsha.woff new file mode 100644 index 00000000000..d3b2909a542 Binary files /dev/null and b/html/fonts/OFL/Torsha.woff differ diff --git a/html/fonts/OFL/Web3Of9ASCII.woff b/html/fonts/OFL/Web3Of9ASCII.woff new file mode 100644 index 00000000000..f000aae2d56 Binary files /dev/null and b/html/fonts/OFL/Web3Of9ASCII.woff differ diff --git a/html/fonts/OFL/Zeshit.woff b/html/fonts/OFL/Zeshit.woff new file mode 100644 index 00000000000..8d5a4196bd7 Binary files /dev/null and b/html/fonts/OFL/Zeshit.woff differ diff --git a/html/fonts/OFL/font_attributions.txt b/html/fonts/OFL/font_attributions.txt new file mode 100644 index 00000000000..4e20eab7f1e --- /dev/null +++ b/html/fonts/OFL/font_attributions.txt @@ -0,0 +1,19 @@ +SovjetBox.woff - see OFL.txt for license - Copyright (c) 2015, Jyrki Ihalainen (yardan74(at)yahoo.com), with Reserved Font Name . +Lashema.woff - see OFL.txt for license - Copyright (c) 2017, Samuel R Boylan Jr (https://fontlibrary.org/en/member/boylansr), with Reserved Font Name . +Torsha.woff - Copyright (c) 2017-01-24—2017-01-25, hiith (https://fontlibrary.org/en/member/hiith), with Reserved Font Name . +GrandHotel.woff - Copyright (c) 2012 by Brian J. Bonislawsky and Jim Lyles DBA Astigmatic (AOETI) (astigma@astigmatic.com), with Reserved Font Name "Grand Hotel" +Zeshit.woff - Copyright (c) 13 July 2019, T. Christopher White (amenemsu@gmail.com), with Reserved Font Name “Zeshit”. +Bluebird.woff - Copyright (c) 2015, Jasper @ Cannot Into Space Fonts (cannotintospacefonts@gmail.com), with Reserved Font Name "Bluebird". +Web3Of9ASCII.woff - Copyright (c) 2014, Nathaniel Reeser (nathaniel.reeser@gmail.com), with Reserved Font Name Web 3 Of 9 ASCII. +SourceCodePro.woff - Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. +RunaSans.woff - Copyright (c) 2015, Hermes Saucedo (http://wyrdeswegas.com | herael@gmail.com), with Reserved Font Name "RunaSans". +BilboINC.woff - Copyright (c) 2015, Hélène Marian-Srodogora (https://www.helenemarian.com), with Reserved Font Name "BilboINC". +Mo5V56.woff - Copyright (c) 2011, D. Kanjahn (https://fonts2u.com/font-designers/d-kanjahn.html), with Reserved Font Name "Mo5V56". +FProject.woff - Copyright (c) 2020, Subhraman Sarkar (https://fontlibrary.org/en/member/BSSarkar), with Reserved Font Name "FProject". +Gelasio.woff - Copyright (c) 2016, Eben Sorkin (http://sorkintype.com), with Reserved Font Name "Gelasio". +Classico.woff - Copyright (c) 2011, wmk69 (wmk69@o2.pl), with Reserved Font Name 'Classica'. +Stormning.woff - Copyright (c) 2015, Mew Too, Robert Jablonski (Cannot Into Space Fonts) (cannotintospacefonts@gmail.com), with Reserved Font Name Stormning. +Copt-B.woff - Copyright (c) 2014, Nick Matavka (https://fontlibrary.org/en/member/nmatavka), with Reserved Font Name "Copt-B". +KawkabMono.woff - Copyright (c) 2015, Abdullah Arif (abdullah.a@gmail.com), with Reserved Font Name 'Kawkab Mono'. +KaushanScript.woff - Copyright (c) 2011, Pablo Impallari (www.impallari.com|impallari@gmail.com), Copyright (c) 2011, Igino Marini. (www.ikern.com|mail@iginomarini.com), with Reserved Font Name Kaushan Script. +Ducados.woff - Copyright (c) 2015, Rafael Ferran i Peralta (https://fontlibrary.org/en/member/rferran), with Reserved Font Name 'Ducados'. \ No newline at end of file diff --git a/icons/accent_tags.dmi b/icons/accent_tags.dmi index a741db279f4..a097329ee30 100644 Binary files a/icons/accent_tags.dmi and b/icons/accent_tags.dmi differ diff --git a/icons/clothing/accessories/blood_patch.dmi b/icons/clothing/accessories/blood_patch.dmi new file mode 100644 index 00000000000..97ab4159524 Binary files /dev/null and b/icons/clothing/accessories/blood_patch.dmi differ diff --git a/icons/clothing/accessories/buddy_tag.dmi b/icons/clothing/accessories/buddy_tag.dmi new file mode 100644 index 00000000000..4c7a3e8b6be Binary files /dev/null and b/icons/clothing/accessories/buddy_tag.dmi differ diff --git a/icons/clothing/accessories/dogtags.dmi b/icons/clothing/accessories/dogtags.dmi new file mode 100644 index 00000000000..66f7c58b9de Binary files /dev/null and b/icons/clothing/accessories/dogtags.dmi differ diff --git a/icons/clothing/accessories/dominia_sash.dmi b/icons/clothing/accessories/dominia_sash.dmi deleted file mode 100644 index b97559942e2..00000000000 Binary files a/icons/clothing/accessories/dominia_sash.dmi and /dev/null differ diff --git a/icons/clothing/accessories/kneepads.dmi b/icons/clothing/accessories/kneepads.dmi new file mode 100644 index 00000000000..20c0170f8ae Binary files /dev/null and b/icons/clothing/accessories/kneepads.dmi differ diff --git a/icons/clothing/accessories/passcards.dmi b/icons/clothing/accessories/passcards.dmi index d088a6ca38b..f9e2575add3 100644 Binary files a/icons/clothing/accessories/passcards.dmi and b/icons/clothing/accessories/passcards.dmi differ diff --git a/icons/clothing/accessories/sash.dmi b/icons/clothing/accessories/sash.dmi new file mode 100644 index 00000000000..567409a7ac5 Binary files /dev/null and b/icons/clothing/accessories/sash.dmi differ diff --git a/icons/clothing/eyes/welding_goggles.dmi b/icons/clothing/eyes/welding_goggles.dmi new file mode 100644 index 00000000000..c70d315d3f4 Binary files /dev/null and b/icons/clothing/eyes/welding_goggles.dmi differ diff --git a/icons/clothing/head/dominia_beret_hospital.dmi b/icons/clothing/head/dominia_beret_hospital.dmi new file mode 100644 index 00000000000..857fe1ddbef Binary files /dev/null and b/icons/clothing/head/dominia_beret_hospital.dmi differ diff --git a/icons/clothing/head/gadpathur_beret.dmi b/icons/clothing/head/gadpathur_beret.dmi index b6a9ba444d6..6583ec8a5ea 100644 Binary files a/icons/clothing/head/gadpathur_beret.dmi and b/icons/clothing/head/gadpathur_beret.dmi differ diff --git a/icons/clothing/head/gadpathur_cap.dmi b/icons/clothing/head/gadpathur_cap.dmi index b009bbb657e..a596e870d00 100644 Binary files a/icons/clothing/head/gadpathur_cap.dmi and b/icons/clothing/head/gadpathur_cap.dmi differ diff --git a/icons/clothing/head/himeo_cap.dmi b/icons/clothing/head/himeo_cap.dmi index 163293ba6c9..541d401b83d 100644 Binary files a/icons/clothing/head/himeo_cap.dmi and b/icons/clothing/head/himeo_cap.dmi differ diff --git a/icons/clothing/head/pilot_helmets.dmi b/icons/clothing/head/pilot_helmets.dmi new file mode 100644 index 00000000000..5272261eab5 Binary files /dev/null and b/icons/clothing/head/pilot_helmets.dmi differ diff --git a/icons/clothing/head/skrellscrunchies.dmi b/icons/clothing/head/skrellscrunchies.dmi new file mode 100644 index 00000000000..4932d9dc4b6 Binary files /dev/null and b/icons/clothing/head/skrellscrunchies.dmi differ diff --git a/icons/clothing/head/vysoka_cap.dmi b/icons/clothing/head/vysoka_cap.dmi index 5648791d9c4..118738b705d 100644 Binary files a/icons/clothing/head/vysoka_cap.dmi and b/icons/clothing/head/vysoka_cap.dmi differ diff --git a/icons/clothing/kit/firefighter.dmi b/icons/clothing/kit/firefighter.dmi new file mode 100644 index 00000000000..a68d418e29b Binary files /dev/null and b/icons/clothing/kit/firefighter.dmi differ diff --git a/icons/clothing/kit/first_responder.dmi b/icons/clothing/kit/first_responder.dmi index aa1fb3ad848..e7205a2b5f0 100644 Binary files a/icons/clothing/kit/first_responder.dmi and b/icons/clothing/kit/first_responder.dmi differ diff --git a/icons/clothing/kit/infiltrator.dmi b/icons/clothing/kit/infiltrator.dmi new file mode 100644 index 00000000000..56ca57c101f Binary files /dev/null and b/icons/clothing/kit/infiltrator.dmi differ diff --git a/icons/clothing/kit/radsuit.dmi b/icons/clothing/kit/radsuit.dmi new file mode 100644 index 00000000000..d2624a4af8f Binary files /dev/null and b/icons/clothing/kit/radsuit.dmi differ diff --git a/icons/clothing/rig/apotheosis.dmi b/icons/clothing/rig/apotheosis.dmi new file mode 100644 index 00000000000..b244d1cfa06 Binary files /dev/null and b/icons/clothing/rig/apotheosis.dmi differ diff --git a/icons/clothing/rig/asset_protection.dmi b/icons/clothing/rig/asset_protection.dmi new file mode 100644 index 00000000000..484f2d39628 Binary files /dev/null and b/icons/clothing/rig/asset_protection.dmi differ diff --git a/icons/clothing/rig/bunker.dmi b/icons/clothing/rig/bunker.dmi new file mode 100644 index 00000000000..e10ec842083 Binary files /dev/null and b/icons/clothing/rig/bunker.dmi differ diff --git a/icons/clothing/rig/ce.dmi b/icons/clothing/rig/ce.dmi new file mode 100644 index 00000000000..4c33cdafc70 Binary files /dev/null and b/icons/clothing/rig/ce.dmi differ diff --git a/icons/clothing/rig/combat.dmi b/icons/clothing/rig/combat.dmi new file mode 100644 index 00000000000..6dc9ebf157b Binary files /dev/null and b/icons/clothing/rig/combat.dmi differ diff --git a/icons/clothing/rig/diving.dmi b/icons/clothing/rig/diving.dmi new file mode 100644 index 00000000000..e3eb98488b8 Binary files /dev/null and b/icons/clothing/rig/diving.dmi differ diff --git a/icons/clothing/rig/elyran_battlesuit.dmi b/icons/clothing/rig/elyran_battlesuit.dmi new file mode 100644 index 00000000000..a07323f038d Binary files /dev/null and b/icons/clothing/rig/elyran_battlesuit.dmi differ diff --git a/icons/clothing/rig/eva.dmi b/icons/clothing/rig/eva.dmi new file mode 100644 index 00000000000..3b4566e0e13 Binary files /dev/null and b/icons/clothing/rig/eva.dmi differ diff --git a/icons/clothing/rig/gunslinger.dmi b/icons/clothing/rig/gunslinger.dmi new file mode 100644 index 00000000000..108cee7b040 Binary files /dev/null and b/icons/clothing/rig/gunslinger.dmi differ diff --git a/icons/clothing/rig/hazard.dmi b/icons/clothing/rig/hazard.dmi new file mode 100644 index 00000000000..e45e661d5f0 Binary files /dev/null and b/icons/clothing/rig/hazard.dmi differ diff --git a/icons/clothing/rig/hazmat.dmi b/icons/clothing/rig/hazmat.dmi new file mode 100644 index 00000000000..47ed126efea Binary files /dev/null and b/icons/clothing/rig/hazmat.dmi differ diff --git a/icons/clothing/rig/industrial.dmi b/icons/clothing/rig/industrial.dmi new file mode 100644 index 00000000000..f6aa06ecdd8 Binary files /dev/null and b/icons/clothing/rig/industrial.dmi differ diff --git a/icons/clothing/rig/jargon.dmi b/icons/clothing/rig/jargon.dmi new file mode 100644 index 00000000000..c3069ed07cc Binary files /dev/null and b/icons/clothing/rig/jargon.dmi differ diff --git a/icons/clothing/rig/jinxiang.dmi b/icons/clothing/rig/jinxiang.dmi new file mode 100644 index 00000000000..7f38ee4670c Binary files /dev/null and b/icons/clothing/rig/jinxiang.dmi differ diff --git a/icons/clothing/rig/legion.dmi b/icons/clothing/rig/legion.dmi new file mode 100644 index 00000000000..155e3ec831e Binary files /dev/null and b/icons/clothing/rig/legion.dmi differ diff --git a/icons/clothing/rig/light_hacker.dmi b/icons/clothing/rig/light_hacker.dmi new file mode 100644 index 00000000000..d86839ab755 Binary files /dev/null and b/icons/clothing/rig/light_hacker.dmi differ diff --git a/icons/clothing/rig/light_ninja.dmi b/icons/clothing/rig/light_ninja.dmi new file mode 100644 index 00000000000..832f2ede3cd Binary files /dev/null and b/icons/clothing/rig/light_ninja.dmi differ diff --git a/icons/clothing/rig/light_stealth.dmi b/icons/clothing/rig/light_stealth.dmi new file mode 100644 index 00000000000..396788174ab Binary files /dev/null and b/icons/clothing/rig/light_stealth.dmi differ diff --git a/icons/clothing/rig/medical.dmi b/icons/clothing/rig/medical.dmi new file mode 100644 index 00000000000..d3dfd1b7353 Binary files /dev/null and b/icons/clothing/rig/medical.dmi differ diff --git a/icons/clothing/rig/merc_crimson.dmi b/icons/clothing/rig/merc_crimson.dmi new file mode 100644 index 00000000000..f1acc323b82 Binary files /dev/null and b/icons/clothing/rig/merc_crimson.dmi differ diff --git a/icons/clothing/rig/military.dmi b/icons/clothing/rig/military.dmi new file mode 100644 index 00000000000..8380d4e5119 Binary files /dev/null and b/icons/clothing/rig/military.dmi differ diff --git a/icons/clothing/rig/nt_ert/commander.dmi b/icons/clothing/rig/nt_ert/commander.dmi new file mode 100644 index 00000000000..b31457296ed Binary files /dev/null and b/icons/clothing/rig/nt_ert/commander.dmi differ diff --git a/icons/clothing/rig/nt_ert/engineer.dmi b/icons/clothing/rig/nt_ert/engineer.dmi new file mode 100644 index 00000000000..d94fe007c2f Binary files /dev/null and b/icons/clothing/rig/nt_ert/engineer.dmi differ diff --git a/icons/clothing/rig/nt_ert/medical.dmi b/icons/clothing/rig/nt_ert/medical.dmi new file mode 100644 index 00000000000..cd03d55e5a3 Binary files /dev/null and b/icons/clothing/rig/nt_ert/medical.dmi differ diff --git a/icons/clothing/rig/nt_ert/security.dmi b/icons/clothing/rig/nt_ert/security.dmi new file mode 100644 index 00000000000..047befe2422 Binary files /dev/null and b/icons/clothing/rig/nt_ert/security.dmi differ diff --git a/icons/clothing/rig/offworlder.dmi b/icons/clothing/rig/offworlder.dmi new file mode 100644 index 00000000000..b2975d91b43 Binary files /dev/null and b/icons/clothing/rig/offworlder.dmi differ diff --git a/icons/clothing/rig/rhino.dmi b/icons/clothing/rig/rhino.dmi new file mode 100644 index 00000000000..fe1c5b11067 Binary files /dev/null and b/icons/clothing/rig/rhino.dmi differ diff --git a/icons/clothing/rig/strikesuit.dmi b/icons/clothing/rig/strikesuit.dmi new file mode 100644 index 00000000000..fdfb6f3931a Binary files /dev/null and b/icons/clothing/rig/strikesuit.dmi differ diff --git a/icons/clothing/rig/techno.dmi b/icons/clothing/rig/techno.dmi new file mode 100644 index 00000000000..1d1db5881c4 Binary files /dev/null and b/icons/clothing/rig/techno.dmi differ diff --git a/icons/clothing/rig/terminator.dmi b/icons/clothing/rig/terminator.dmi new file mode 100644 index 00000000000..5f548d05192 Binary files /dev/null and b/icons/clothing/rig/terminator.dmi differ diff --git a/icons/clothing/rig/tesla.dmi b/icons/clothing/rig/tesla.dmi new file mode 100644 index 00000000000..5ea4c380747 Binary files /dev/null and b/icons/clothing/rig/tesla.dmi differ diff --git a/icons/clothing/rig/tie.dmi b/icons/clothing/rig/tie.dmi new file mode 100644 index 00000000000..3dfbb510720 Binary files /dev/null and b/icons/clothing/rig/tie.dmi differ diff --git a/icons/clothing/rig/tup.dmi b/icons/clothing/rig/tup.dmi new file mode 100644 index 00000000000..ef5e5fb884a Binary files /dev/null and b/icons/clothing/rig/tup.dmi differ diff --git a/icons/clothing/rig/unathi_breacher.dmi b/icons/clothing/rig/unathi_breacher.dmi new file mode 100644 index 00000000000..afe76c69e37 Binary files /dev/null and b/icons/clothing/rig/unathi_breacher.dmi differ diff --git a/icons/clothing/rig/unathi_breacher_cheap.dmi b/icons/clothing/rig/unathi_breacher_cheap.dmi new file mode 100644 index 00000000000..f26a6b37059 Binary files /dev/null and b/icons/clothing/rig/unathi_breacher_cheap.dmi differ diff --git a/icons/clothing/rig/vaurca.dmi b/icons/clothing/rig/vaurca.dmi new file mode 100644 index 00000000000..0234ead9787 Binary files /dev/null and b/icons/clothing/rig/vaurca.dmi differ diff --git a/icons/clothing/suits/coats/gadpathur_coat.dmi b/icons/clothing/suits/coats/gadpathur_coat.dmi index 6323afd9dcb..c80113e4ea0 100644 Binary files a/icons/clothing/suits/coats/gadpathur_coat.dmi and b/icons/clothing/suits/coats/gadpathur_coat.dmi differ diff --git a/icons/clothing/suits/coats/idris_iru_coats.dmi b/icons/clothing/suits/coats/idris_iru_coats.dmi index 3faa963efd9..c7a14c132a2 100644 Binary files a/icons/clothing/suits/coats/idris_iru_coats.dmi and b/icons/clothing/suits/coats/idris_iru_coats.dmi differ diff --git a/icons/clothing/under/uniforms/scc.dmi b/icons/clothing/under/uniforms/scc.dmi index e7cf893b521..afed9318663 100644 Binary files a/icons/clothing/under/uniforms/scc.dmi and b/icons/clothing/under/uniforms/scc.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 4b0657a6419..939711f7bef 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/fluidtracks.dmi b/icons/effects/fluidtracks.dmi index 58e8fae9349..2799ed05dcc 100644 Binary files a/icons/effects/fluidtracks.dmi and b/icons/effects/fluidtracks.dmi differ diff --git a/icons/hud/hud_security.dmi b/icons/hud/hud_security.dmi index 31b4410b183..028ed36a5e5 100644 Binary files a/icons/hud/hud_security.dmi and b/icons/hud/hud_security.dmi differ diff --git a/icons/mecha/mech_equipment.dmi b/icons/mecha/mech_equipment.dmi index 741cac0adb5..c9602e9cc91 100644 Binary files a/icons/mecha/mech_equipment.dmi and b/icons/mecha/mech_equipment.dmi differ diff --git a/icons/misc/hudmenu.dmi b/icons/misc/hudmenu.dmi index c7fd9ded513..ab9b7678903 100644 Binary files a/icons/misc/hudmenu.dmi and b/icons/misc/hudmenu.dmi differ diff --git a/icons/misc/titlescreens/aurora/nss_aurora.dmi b/icons/misc/titlescreens/aurora/nss_aurora.dmi new file mode 100644 index 00000000000..ce317736a2a Binary files /dev/null and b/icons/misc/titlescreens/aurora/nss_aurora.dmi differ diff --git a/icons/misc/titlescreens/aurora/synthetics.dmi b/icons/misc/titlescreens/aurora/synthetics.dmi index 3c695a6a9f1..c73ce9940f6 100644 Binary files a/icons/misc/titlescreens/aurora/synthetics.dmi and b/icons/misc/titlescreens/aurora/synthetics.dmi differ diff --git a/icons/misc/titlescreens/aurora/tajara.dmi b/icons/misc/titlescreens/aurora/tajara.dmi index 6c8addc7602..d4855be3659 100644 Binary files a/icons/misc/titlescreens/aurora/tajara.dmi and b/icons/misc/titlescreens/aurora/tajara.dmi differ diff --git a/icons/misc/titlescreens/overlay_template.dmi b/icons/misc/titlescreens/overlay_template.dmi new file mode 100644 index 00000000000..bc6e54212ab Binary files /dev/null and b/icons/misc/titlescreens/overlay_template.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 9577fc5a1a6..3190a266397 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 5469d7a1ea9..bb7e68496c1 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/custom_synthetic.dmi b/icons/mob/custom_synthetic.dmi index ecdb5c71150..d2f3178ba62 100644 Binary files a/icons/mob/custom_synthetic.dmi and b/icons/mob/custom_synthetic.dmi differ diff --git a/icons/mob/custom_synths/customhologram.dmi b/icons/mob/custom_synths/customhologram.dmi index f8321836bf2..7657b5fe12f 100644 Binary files a/icons/mob/custom_synths/customhologram.dmi and b/icons/mob/custom_synths/customhologram.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index fb5696b8361..5478461c625 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index cf18f976dd1..d04613f18d0 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index 2bd9d2a0e3d..df3825f7131 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index f46b0a64b3d..f567acf2b45 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud_med.dmi b/icons/mob/hud_med.dmi index 705886a5490..0d34ce0bb41 100644 Binary files a/icons/mob/hud_med.dmi and b/icons/mob/hud_med.dmi differ diff --git a/icons/mob/human_face/dionae_hair.dmi b/icons/mob/human_face/dionae_hair.dmi index 60282ba2b02..d84640a6453 100644 Binary files a/icons/mob/human_face/dionae_hair.dmi and b/icons/mob/human_face/dionae_hair.dmi differ diff --git a/icons/mob/human_face/facial_hair_multiply.dmi b/icons/mob/human_face/facial_hair_multiply.dmi index 5010a2f3257..b1dd35e830a 100644 Binary files a/icons/mob/human_face/facial_hair_multiply.dmi and b/icons/mob/human_face/facial_hair_multiply.dmi differ diff --git a/icons/mob/human_face/hair.dmi b/icons/mob/human_face/hair.dmi index 7bbc8ba5bf8..01ee4d4c82d 100644 Binary files a/icons/mob/human_face/hair.dmi and b/icons/mob/human_face/hair.dmi differ diff --git a/icons/mob/human_face/msai_hair.dmi b/icons/mob/human_face/msai_hair.dmi index ad9c33da305..4a55ee2099c 100644 Binary files a/icons/mob/human_face/msai_hair.dmi and b/icons/mob/human_face/msai_hair.dmi differ diff --git a/icons/mob/human_face/skrell_hair.dmi b/icons/mob/human_face/skrell_hair.dmi index e0cfd3cf969..7e4412e7cc8 100644 Binary files a/icons/mob/human_face/skrell_hair.dmi and b/icons/mob/human_face/skrell_hair.dmi differ diff --git a/icons/mob/human_face/tajara_hair.dmi b/icons/mob/human_face/tajara_hair.dmi index abea8bbe84d..9e102c85899 100644 Binary files a/icons/mob/human_face/tajara_hair.dmi and b/icons/mob/human_face/tajara_hair.dmi differ diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi index e552743a104..c1d5e9760ff 100644 Binary files a/icons/mob/human_races/markings.dmi and b/icons/mob/human_races/markings.dmi differ diff --git a/icons/mob/human_races/markings_diona.dmi b/icons/mob/human_races/markings_diona.dmi index 5782e6e0ab9..9b3bc62b0ea 100644 Binary files a/icons/mob/human_races/markings_diona.dmi and b/icons/mob/human_races/markings_diona.dmi differ diff --git a/icons/mob/human_races/markings_tajara.dmi b/icons/mob/human_races/markings_tajara.dmi new file mode 100644 index 00000000000..4fd4c2061ab Binary files /dev/null and b/icons/mob/human_races/markings_tajara.dmi differ diff --git a/icons/mob/human_races/markings_vaurca.dmi b/icons/mob/human_races/markings_vaurca.dmi index 961ec7e94b2..06a0eeb8e44 100644 Binary files a/icons/mob/human_races/markings_vaurca.dmi and b/icons/mob/human_races/markings_vaurca.dmi differ diff --git a/icons/mob/human_races/masks/blood_tajara.dmi b/icons/mob/human_races/masks/blood_tajara.dmi new file mode 100644 index 00000000000..380ba1c07be Binary files /dev/null and b/icons/mob/human_races/masks/blood_tajara.dmi differ diff --git a/icons/mob/human_races/masks/dam_mask_tajara.dmi b/icons/mob/human_races/masks/dam_mask_tajara.dmi new file mode 100644 index 00000000000..c846d657174 Binary files /dev/null and b/icons/mob/human_races/masks/dam_mask_tajara.dmi differ diff --git a/icons/mob/human_races/masks/dam_tajara.dmi b/icons/mob/human_races/masks/dam_tajara.dmi new file mode 100644 index 00000000000..c4bed6bd13f Binary files /dev/null and b/icons/mob/human_races/masks/dam_tajara.dmi differ diff --git a/icons/mob/items/clothing/lefthand_masks.dmi b/icons/mob/items/clothing/lefthand_masks.dmi index a2d05427c2a..a92473c3e05 100644 Binary files a/icons/mob/items/clothing/lefthand_masks.dmi and b/icons/mob/items/clothing/lefthand_masks.dmi differ diff --git a/icons/mob/items/clothing/lefthand_shoes.dmi b/icons/mob/items/clothing/lefthand_shoes.dmi index 75cf1d487bc..51b2fee12dc 100644 Binary files a/icons/mob/items/clothing/lefthand_shoes.dmi and b/icons/mob/items/clothing/lefthand_shoes.dmi differ diff --git a/icons/mob/items/clothing/lefthand_suit.dmi b/icons/mob/items/clothing/lefthand_suit.dmi index 785e367de51..b3997d438e9 100644 Binary files a/icons/mob/items/clothing/lefthand_suit.dmi and b/icons/mob/items/clothing/lefthand_suit.dmi differ diff --git a/icons/mob/items/clothing/righthand_masks.dmi b/icons/mob/items/clothing/righthand_masks.dmi index d82044bea0d..ac86c355c24 100644 Binary files a/icons/mob/items/clothing/righthand_masks.dmi and b/icons/mob/items/clothing/righthand_masks.dmi differ diff --git a/icons/mob/items/clothing/righthand_shoes.dmi b/icons/mob/items/clothing/righthand_shoes.dmi index 3c041b06c5a..9f5bbd42b5e 100644 Binary files a/icons/mob/items/clothing/righthand_shoes.dmi and b/icons/mob/items/clothing/righthand_shoes.dmi differ diff --git a/icons/mob/items/clothing/righthand_suit.dmi b/icons/mob/items/clothing/righthand_suit.dmi index ed837cd00b6..f89b383a682 100644 Binary files a/icons/mob/items/clothing/righthand_suit.dmi and b/icons/mob/items/clothing/righthand_suit.dmi differ diff --git a/icons/mob/items/clothing/righthand_uniforms.dmi b/icons/mob/items/clothing/righthand_uniforms.dmi index c014bdc35e6..d2f85292778 100644 Binary files a/icons/mob/items/clothing/righthand_uniforms.dmi and b/icons/mob/items/clothing/righthand_uniforms.dmi differ diff --git a/icons/mob/items/device/lefthand_device.dmi b/icons/mob/items/device/lefthand_device.dmi index 9a35b91b9bd..6707f167379 100644 Binary files a/icons/mob/items/device/lefthand_device.dmi and b/icons/mob/items/device/lefthand_device.dmi differ diff --git a/icons/mob/items/device/righthand_device.dmi b/icons/mob/items/device/righthand_device.dmi index a9acc63d088..087752b205d 100644 Binary files a/icons/mob/items/device/righthand_device.dmi and b/icons/mob/items/device/righthand_device.dmi differ diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index be996b6356f..a06f7895158 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/lefthand_cigs_lighters.dmi b/icons/mob/items/lefthand_cigs_lighters.dmi index f5fd6c52886..a3fcb776a49 100644 Binary files a/icons/mob/items/lefthand_cigs_lighters.dmi and b/icons/mob/items/lefthand_cigs_lighters.dmi differ diff --git a/icons/mob/items/lefthand_mining.dmi b/icons/mob/items/lefthand_mining.dmi index 99f33acd11e..7ec130e61fc 100644 Binary files a/icons/mob/items/lefthand_mining.dmi and b/icons/mob/items/lefthand_mining.dmi differ diff --git a/icons/mob/items/lefthand_spells.dmi b/icons/mob/items/lefthand_spells.dmi new file mode 100644 index 00000000000..bb1b3b0b6ce Binary files /dev/null and b/icons/mob/items/lefthand_spells.dmi differ diff --git a/icons/mob/items/lefthand_tools.dmi b/icons/mob/items/lefthand_tools.dmi index 04e670c462d..0efbc63e443 100644 Binary files a/icons/mob/items/lefthand_tools.dmi and b/icons/mob/items/lefthand_tools.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 6a4d877635e..68898496421 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/mob/items/righthand_cigs_lighters.dmi b/icons/mob/items/righthand_cigs_lighters.dmi index 29db0ac186c..d94a15ab33d 100644 Binary files a/icons/mob/items/righthand_cigs_lighters.dmi and b/icons/mob/items/righthand_cigs_lighters.dmi differ diff --git a/icons/mob/items/righthand_mining.dmi b/icons/mob/items/righthand_mining.dmi index ae366c4493a..f84fa242f7f 100644 Binary files a/icons/mob/items/righthand_mining.dmi and b/icons/mob/items/righthand_mining.dmi differ diff --git a/icons/mob/items/righthand_spells.dmi b/icons/mob/items/righthand_spells.dmi new file mode 100644 index 00000000000..9bd305bd007 Binary files /dev/null and b/icons/mob/items/righthand_spells.dmi differ diff --git a/icons/mob/items/righthand_tools.dmi b/icons/mob/items/righthand_tools.dmi index b083665204e..037f1cc49c0 100644 Binary files a/icons/mob/items/righthand_tools.dmi and b/icons/mob/items/righthand_tools.dmi differ diff --git a/icons/mob/items/storage/lefthand_backpacks.dmi b/icons/mob/items/storage/lefthand_backpacks.dmi index bf0633c2d7d..89561e144da 100644 Binary files a/icons/mob/items/storage/lefthand_backpacks.dmi and b/icons/mob/items/storage/lefthand_backpacks.dmi differ diff --git a/icons/mob/items/storage/righthand_backpacks.dmi b/icons/mob/items/storage/righthand_backpacks.dmi index 9c909d4269d..979079f9e37 100644 Binary files a/icons/mob/items/storage/righthand_backpacks.dmi and b/icons/mob/items/storage/righthand_backpacks.dmi differ diff --git a/icons/mob/items/weapons/lefthand_energy.dmi b/icons/mob/items/weapons/lefthand_energy.dmi index 7bef2b986fa..611b8dca884 100644 Binary files a/icons/mob/items/weapons/lefthand_energy.dmi and b/icons/mob/items/weapons/lefthand_energy.dmi differ diff --git a/icons/mob/items/weapons/lefthand_melee.dmi b/icons/mob/items/weapons/lefthand_melee.dmi index 8c15ac70e5a..4d30733d896 100644 Binary files a/icons/mob/items/weapons/lefthand_melee.dmi and b/icons/mob/items/weapons/lefthand_melee.dmi differ diff --git a/icons/mob/items/weapons/righthand_energy.dmi b/icons/mob/items/weapons/righthand_energy.dmi index 4bed6210506..dbd8c7e9258 100644 Binary files a/icons/mob/items/weapons/righthand_energy.dmi and b/icons/mob/items/weapons/righthand_energy.dmi differ diff --git a/icons/mob/items/weapons/righthand_melee.dmi b/icons/mob/items/weapons/righthand_melee.dmi index 63f3de318ed..7d581047104 100644 Binary files a/icons/mob/items/weapons/righthand_melee.dmi and b/icons/mob/items/weapons/righthand_melee.dmi differ diff --git a/icons/mob/light_overlays.dmi b/icons/mob/light_overlays.dmi index d1e6ca6fd7b..917337d1fce 100644 Binary files a/icons/mob/light_overlays.dmi and b/icons/mob/light_overlays.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 51a8d4c4b01..759d1670c36 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 8c5ae482f7b..ded32f9000b 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/npc/animal.dmi b/icons/mob/npc/animal.dmi index 71333a6f194..4b7f3e04f03 100644 Binary files a/icons/mob/npc/animal.dmi and b/icons/mob/npc/animal.dmi differ diff --git a/icons/mob/npc/greimorian.dmi b/icons/mob/npc/greimorian.dmi index b1e73854df0..e43c3d7ba48 100644 Binary files a/icons/mob/npc/greimorian.dmi and b/icons/mob/npc/greimorian.dmi differ diff --git a/icons/mob/npc/pai.dmi b/icons/mob/npc/pai.dmi index aa81c71f41b..fbd79b6ef7a 100644 Binary files a/icons/mob/npc/pai.dmi and b/icons/mob/npc/pai.dmi differ diff --git a/icons/mob/npc/spider_queen.dmi b/icons/mob/npc/spider_queen.dmi index 07d44a50214..1305fc4887d 100644 Binary files a/icons/mob/npc/spider_queen.dmi and b/icons/mob/npc/spider_queen.dmi differ diff --git a/icons/mob/rig_back.dmi b/icons/mob/rig_back.dmi index d86f16ed8df..b47718e6589 100644 Binary files a/icons/mob/rig_back.dmi and b/icons/mob/rig_back.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index b88e01ec695..7e33297d360 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/screen/radial.dmi b/icons/mob/screen/radial.dmi index 2bc5cbb7643..44fd705e297 100644 Binary files a/icons/mob/screen/radial.dmi and b/icons/mob/screen/radial.dmi differ diff --git a/icons/mob/screen/triage_tag.dmi b/icons/mob/screen/triage_tag.dmi new file mode 100644 index 00000000000..19ea11fc4ca Binary files /dev/null and b/icons/mob/screen/triage_tag.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 11cef591c1e..89e89ca60da 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/mob/screen_spells.dmi b/icons/mob/screen_spells.dmi new file mode 100644 index 00000000000..4dd42bac21d Binary files /dev/null and b/icons/mob/screen_spells.dmi differ diff --git a/icons/mob/species/machine/gloves.dmi b/icons/mob/species/machine/gloves.dmi deleted file mode 100644 index 88f141e512b..00000000000 Binary files a/icons/mob/species/machine/gloves.dmi and /dev/null differ diff --git a/icons/mob/species/machine/helmet.dmi b/icons/mob/species/machine/helmet.dmi index 3413b005ee2..466e2c0edb6 100644 Binary files a/icons/mob/species/machine/helmet.dmi and b/icons/mob/species/machine/helmet.dmi differ diff --git a/icons/mob/species/machine/shoes.dmi b/icons/mob/species/machine/shoes.dmi deleted file mode 100644 index a2c1e3ef292..00000000000 Binary files a/icons/mob/species/machine/shoes.dmi and /dev/null differ diff --git a/icons/mob/species/machine/suit.dmi b/icons/mob/species/machine/suit.dmi index 2126fec07e4..b12e2099313 100644 Binary files a/icons/mob/species/machine/suit.dmi and b/icons/mob/species/machine/suit.dmi differ diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi index 150f5980693..8c401db0925 100644 Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi index 5b6c2b08dae..c5ab30fe5eb 100644 Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ diff --git a/icons/mob/species/tajaran/gloves.dmi b/icons/mob/species/tajaran/gloves.dmi deleted file mode 100644 index c21d66a95b6..00000000000 Binary files a/icons/mob/species/tajaran/gloves.dmi and /dev/null differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index 5ec86298684..cf808dfa0ea 100644 Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi index 61caec1711c..c0381a3804e 100644 Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ diff --git a/icons/mob/species/tajaran/shoes.dmi b/icons/mob/species/tajaran/shoes.dmi index 63634085222..32c4df98edb 100644 Binary files a/icons/mob/species/tajaran/shoes.dmi and b/icons/mob/species/tajaran/shoes.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 0943918ac5c..b6aba070872 100644 Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/mob/species/unathi/gloves.dmi b/icons/mob/species/unathi/gloves.dmi deleted file mode 100644 index dbe4a19fe7c..00000000000 Binary files a/icons/mob/species/unathi/gloves.dmi and /dev/null differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index e8de9f6f56e..23835495c9e 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/shoes.dmi b/icons/mob/species/unathi/shoes.dmi index d4894a29956..b4f0ca893ee 100644 Binary files a/icons/mob/species/unathi/shoes.dmi and b/icons/mob/species/unathi/shoes.dmi differ diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi index d39cb9b4c43..05032371b92 100644 Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ diff --git a/icons/mob/species/vaurca/gloves.dmi b/icons/mob/species/vaurca/gloves.dmi deleted file mode 100644 index f9515d1c1c1..00000000000 Binary files a/icons/mob/species/vaurca/gloves.dmi and /dev/null differ diff --git a/icons/mob/species/vaurca/helmet.dmi b/icons/mob/species/vaurca/helmet.dmi index c52b3ed936c..cc9390abc69 100644 Binary files a/icons/mob/species/vaurca/helmet.dmi and b/icons/mob/species/vaurca/helmet.dmi differ diff --git a/icons/mob/species/vaurca/shoes.dmi b/icons/mob/species/vaurca/shoes.dmi deleted file mode 100644 index 4c78139b694..00000000000 Binary files a/icons/mob/species/vaurca/shoes.dmi and /dev/null differ diff --git a/icons/mob/species/vaurca/suit.dmi b/icons/mob/species/vaurca/suit.dmi index 3df8a9a9004..77c775240f2 100644 Binary files a/icons/mob/species/vaurca/suit.dmi and b/icons/mob/species/vaurca/suit.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index bdc3e0ba4ab..c227ab8f583 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index 3a71e963ddf..3a894ebe148 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 90c398d9808..f17f9ff5d5f 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/action_buttons/organs.dmi b/icons/obj/action_buttons/organs.dmi index a37373173b2..af5108d8057 100644 Binary files a/icons/obj/action_buttons/organs.dmi and b/icons/obj/action_buttons/organs.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 498dca474e6..85897bb18c9 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 42968a16a22..0bec21d8b6d 100644 Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ diff --git a/icons/obj/auto_cpr.dmi b/icons/obj/auto_cpr.dmi new file mode 100644 index 00000000000..f99ddfde7bb Binary files /dev/null and b/icons/obj/auto_cpr.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 9edfac593b3..f515e52d799 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/cable_layer.dmi b/icons/obj/cable_layer.dmi new file mode 100644 index 00000000000..ff95758d30a Binary files /dev/null and b/icons/obj/cable_layer.dmi differ diff --git a/icons/obj/cigs_lighters.dmi b/icons/obj/cigs_lighters.dmi index 43dbfca2051..b53cc781cc0 100644 Binary files a/icons/obj/cigs_lighters.dmi and b/icons/obj/cigs_lighters.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi new file mode 100644 index 00000000000..11da3958454 Binary files /dev/null and b/icons/obj/clothing/belt_overlays.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 54894f14c13..f915affe1e5 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index ef7d9d80272..34367713599 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index c04a7f78ea7..120e5c441d3 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 82048788eb4..2ee61834312 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 34e8fc729c2..1e654c6a023 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/species/tajaran/raakti_shariim.dmi b/icons/obj/clothing/species/tajaran/raakti_shariim.dmi deleted file mode 100644 index 3ad283342ab..00000000000 Binary files a/icons/obj/clothing/species/tajaran/raakti_shariim.dmi and /dev/null differ diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi index a52f41e3f14..ab3a1184f8b 100644 Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index d3c49178539..b5328a0653b 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/technomancer.dmi b/icons/obj/clothing/technomancer.dmi new file mode 100644 index 00000000000..ec94a9b03dd Binary files /dev/null and b/icons/obj/clothing/technomancer.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index 9db4c016256..e6d6775ece2 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 84f671d330a..530c4ad619c 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/contained_items/misc/chess.dmi b/icons/obj/contained_items/misc/chess.dmi new file mode 100644 index 00000000000..407df324b4d Binary files /dev/null and b/icons/obj/contained_items/misc/chess.dmi differ diff --git a/icons/obj/contained_items/tools/air_analyzer.dmi b/icons/obj/contained_items/tools/air_analyzer.dmi new file mode 100644 index 00000000000..847c696185b Binary files /dev/null and b/icons/obj/contained_items/tools/air_analyzer.dmi differ diff --git a/icons/obj/contained_items/tools/impact_wrench.dmi b/icons/obj/contained_items/tools/impact_wrench.dmi new file mode 100644 index 00000000000..425220a4b87 Binary files /dev/null and b/icons/obj/contained_items/tools/impact_wrench.dmi differ diff --git a/icons/obj/contained_items/tools/inflatables.dmi b/icons/obj/contained_items/tools/inflatables.dmi new file mode 100644 index 00000000000..1648890f270 Binary files /dev/null and b/icons/obj/contained_items/tools/inflatables.dmi differ diff --git a/icons/obj/custom_items/fernando_knitting.dmi b/icons/obj/contained_items/tools/knitting.dmi similarity index 100% rename from icons/obj/custom_items/fernando_knitting.dmi rename to icons/obj/contained_items/tools/knitting.dmi diff --git a/icons/obj/contained_items/tools/multitool.dmi b/icons/obj/contained_items/tools/multitool.dmi new file mode 100644 index 00000000000..d47a1baa8b6 Binary files /dev/null and b/icons/obj/contained_items/tools/multitool.dmi differ diff --git a/icons/obj/contained_items/tools/plant_analyzer.dmi b/icons/obj/contained_items/tools/plant_analyzer.dmi new file mode 100644 index 00000000000..18276765780 Binary files /dev/null and b/icons/obj/contained_items/tools/plant_analyzer.dmi differ diff --git a/icons/obj/contained_items/tools/t_scanner.dmi b/icons/obj/contained_items/tools/t_scanner.dmi new file mode 100644 index 00000000000..96d995f9093 Binary files /dev/null and b/icons/obj/contained_items/tools/t_scanner.dmi differ diff --git a/icons/obj/contained_items/tools/vitals_monitor.dmi b/icons/obj/contained_items/tools/vitals_monitor.dmi new file mode 100644 index 00000000000..a8eb1df4897 Binary files /dev/null and b/icons/obj/contained_items/tools/vitals_monitor.dmi differ diff --git a/icons/obj/contained_items/tools/welding_tools.dmi b/icons/obj/contained_items/tools/welding_tools.dmi new file mode 100644 index 00000000000..35fb4284cd5 Binary files /dev/null and b/icons/obj/contained_items/tools/welding_tools.dmi differ diff --git a/icons/obj/contained_items/voidsuits/himeotaj.dmi b/icons/obj/contained_items/voidsuits/himeotaj.dmi new file mode 100644 index 00000000000..2140053dccd Binary files /dev/null and b/icons/obj/contained_items/voidsuits/himeotaj.dmi differ diff --git a/icons/obj/contained_items/weapons/flamethrower.dmi b/icons/obj/contained_items/weapons/flamethrower.dmi new file mode 100644 index 00000000000..f0ac73a54ca Binary files /dev/null and b/icons/obj/contained_items/weapons/flamethrower.dmi differ diff --git a/icons/obj/contained_items/weapons/telebaton.dmi b/icons/obj/contained_items/weapons/telebaton.dmi new file mode 100644 index 00000000000..f3e735b62ae Binary files /dev/null and b/icons/obj/contained_items/weapons/telebaton.dmi differ diff --git a/icons/obj/contained_items/weapons/telecane.dmi b/icons/obj/contained_items/weapons/telecane.dmi new file mode 100644 index 00000000000..16c298473f9 Binary files /dev/null and b/icons/obj/contained_items/weapons/telecane.dmi differ diff --git a/icons/obj/contained_items/weapons/traps.dmi b/icons/obj/contained_items/weapons/traps.dmi new file mode 100644 index 00000000000..419e269788d Binary files /dev/null and b/icons/obj/contained_items/weapons/traps.dmi differ diff --git a/icons/obj/custom_items/ana_clothing.dmi b/icons/obj/custom_items/ana_clothing.dmi index a980ec7b93e..f539b1170dc 100644 Binary files a/icons/obj/custom_items/ana_clothing.dmi and b/icons/obj/custom_items/ana_clothing.dmi differ diff --git a/icons/obj/custom_items/andersen_goggles.dmi b/icons/obj/custom_items/andersen_goggles.dmi new file mode 100644 index 00000000000..737b4196e3b Binary files /dev/null and b/icons/obj/custom_items/andersen_goggles.dmi differ diff --git a/icons/obj/custom_items/bian_flag.dmi b/icons/obj/custom_items/bian_flag.dmi new file mode 100644 index 00000000000..191c75b8b3c Binary files /dev/null and b/icons/obj/custom_items/bian_flag.dmi differ diff --git a/icons/obj/custom_items/godard_cape.dmi b/icons/obj/custom_items/godard_cape.dmi new file mode 100644 index 00000000000..7e67d0501b9 Binary files /dev/null and b/icons/obj/custom_items/godard_cape.dmi differ diff --git a/icons/obj/custom_items/goldman_eye.dmi b/icons/obj/custom_items/goldman_eye.dmi new file mode 100644 index 00000000000..92d4eb787c1 Binary files /dev/null and b/icons/obj/custom_items/goldman_eye.dmi differ diff --git a/icons/obj/custom_items/kathira_legbrace.dmi b/icons/obj/custom_items/kathira_legbrace.dmi new file mode 100644 index 00000000000..519cf879a3c Binary files /dev/null and b/icons/obj/custom_items/kathira_legbrace.dmi differ diff --git a/icons/obj/custom_items/kennard_ledger.dmi b/icons/obj/custom_items/kennard_ledger.dmi new file mode 100644 index 00000000000..889c0e6b652 Binary files /dev/null and b/icons/obj/custom_items/kennard_ledger.dmi differ diff --git a/icons/obj/custom_items/mahir_glasses.dmi b/icons/obj/custom_items/mahir_glasses.dmi new file mode 100644 index 00000000000..ec5043b1483 Binary files /dev/null and b/icons/obj/custom_items/mahir_glasses.dmi differ diff --git a/icons/obj/custom_items/qoi_console.dmi b/icons/obj/custom_items/qoi_console.dmi new file mode 100644 index 00000000000..c17a553a0d1 Binary files /dev/null and b/icons/obj/custom_items/qoi_console.dmi differ diff --git a/icons/obj/custom_items/sezrak_zippo.dmi b/icons/obj/custom_items/sezrak_zippo.dmi new file mode 100644 index 00000000000..585eb845a3b Binary files /dev/null and b/icons/obj/custom_items/sezrak_zippo.dmi differ diff --git a/icons/obj/custom_items/valetzrhonaja_cloak.dmi b/icons/obj/custom_items/valetzrhonaja_cloak.dmi new file mode 100644 index 00000000000..81c39506166 Binary files /dev/null and b/icons/obj/custom_items/valetzrhonaja_cloak.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 62ea41e3573..4a610be498f 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index a8b889111fd..a4625bb2b13 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/drink_glasses/carafe.dmi b/icons/obj/drink_glasses/carafe.dmi new file mode 100644 index 00000000000..568f6619167 Binary files /dev/null and b/icons/obj/drink_glasses/carafe.dmi differ diff --git a/icons/obj/drink_glasses/cocktail.dmi b/icons/obj/drink_glasses/cocktail.dmi new file mode 100644 index 00000000000..e2d97651133 Binary files /dev/null and b/icons/obj/drink_glasses/cocktail.dmi differ diff --git a/icons/obj/drink_glasses/coconut.dmi b/icons/obj/drink_glasses/coconut.dmi new file mode 100644 index 00000000000..019af1a88cc Binary files /dev/null and b/icons/obj/drink_glasses/coconut.dmi differ diff --git a/icons/obj/drink_glasses/coffecup.dmi b/icons/obj/drink_glasses/coffecup.dmi new file mode 100644 index 00000000000..845d7403aa4 Binary files /dev/null and b/icons/obj/drink_glasses/coffecup.dmi differ diff --git a/icons/obj/drink_glasses/coffecup_tall.dmi b/icons/obj/drink_glasses/coffecup_tall.dmi new file mode 100644 index 00000000000..8e2be2e2cf6 Binary files /dev/null and b/icons/obj/drink_glasses/coffecup_tall.dmi differ diff --git a/icons/obj/drink_glasses/cognac.dmi b/icons/obj/drink_glasses/cognac.dmi new file mode 100644 index 00000000000..23e416e03f4 Binary files /dev/null and b/icons/obj/drink_glasses/cognac.dmi differ diff --git a/icons/obj/drink_glasses/fitness.dmi b/icons/obj/drink_glasses/fitness.dmi new file mode 100644 index 00000000000..2164e52fca1 Binary files /dev/null and b/icons/obj/drink_glasses/fitness.dmi differ diff --git a/icons/obj/drink_glasses/flute.dmi b/icons/obj/drink_glasses/flute.dmi new file mode 100644 index 00000000000..6a49219df86 Binary files /dev/null and b/icons/obj/drink_glasses/flute.dmi differ diff --git a/icons/obj/drink_glasses/goblet.dmi b/icons/obj/drink_glasses/goblet.dmi new file mode 100644 index 00000000000..bec31244d37 Binary files /dev/null and b/icons/obj/drink_glasses/goblet.dmi differ diff --git a/icons/obj/drink_glasses/mug.dmi b/icons/obj/drink_glasses/mug.dmi new file mode 100644 index 00000000000..f7c6f8c2033 Binary files /dev/null and b/icons/obj/drink_glasses/mug.dmi differ diff --git a/icons/obj/drink_glasses/pint.dmi b/icons/obj/drink_glasses/pint.dmi new file mode 100644 index 00000000000..314136c6d18 Binary files /dev/null and b/icons/obj/drink_glasses/pint.dmi differ diff --git a/icons/obj/drink_glasses/rocks.dmi b/icons/obj/drink_glasses/rocks.dmi new file mode 100644 index 00000000000..c9151ef67c2 Binary files /dev/null and b/icons/obj/drink_glasses/rocks.dmi differ diff --git a/icons/obj/drink_glasses/shake.dmi b/icons/obj/drink_glasses/shake.dmi new file mode 100644 index 00000000000..d9b7ef85085 Binary files /dev/null and b/icons/obj/drink_glasses/shake.dmi differ diff --git a/icons/obj/drink_glasses/shot.dmi b/icons/obj/drink_glasses/shot.dmi new file mode 100644 index 00000000000..190c6e6f52c Binary files /dev/null and b/icons/obj/drink_glasses/shot.dmi differ diff --git a/icons/obj/drink_glasses/square.dmi b/icons/obj/drink_glasses/square.dmi new file mode 100644 index 00000000000..1e6721a715b Binary files /dev/null and b/icons/obj/drink_glasses/square.dmi differ diff --git a/icons/obj/drink_glasses/teacup.dmi b/icons/obj/drink_glasses/teacup.dmi new file mode 100644 index 00000000000..e54a7e2dbbd Binary files /dev/null and b/icons/obj/drink_glasses/teacup.dmi differ diff --git a/icons/obj/drink_glasses/wine.dmi b/icons/obj/drink_glasses/wine.dmi new file mode 100644 index 00000000000..11c5eac125b Binary files /dev/null and b/icons/obj/drink_glasses/wine.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index aec5517b34c..ea21f6ecc1b 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/drinks_empty.dmi b/icons/obj/drinks_empty.dmi index 76893ee7466..9f0140d85d9 100644 Binary files a/icons/obj/drinks_empty.dmi and b/icons/obj/drinks_empty.dmi differ diff --git a/icons/obj/flamethrower.dmi b/icons/obj/flamethrower.dmi deleted file mode 100644 index dd470c47809..00000000000 Binary files a/icons/obj/flamethrower.dmi and /dev/null differ diff --git a/icons/obj/floor_layer.dmi b/icons/obj/floor_layer.dmi new file mode 100644 index 00000000000..54956626811 Binary files /dev/null and b/icons/obj/floor_layer.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index c1488a218d7..f4a71acee92 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/guns/bcarbine.dmi b/icons/obj/guns/bcarbine.dmi new file mode 100644 index 00000000000..82c31039c1a Binary files /dev/null and b/icons/obj/guns/bcarbine.dmi differ diff --git a/icons/obj/guns/bolter.dmi b/icons/obj/guns/bolter.dmi index de43248fed9..0f1db34c5db 100644 Binary files a/icons/obj/guns/bolter.dmi and b/icons/obj/guns/bolter.dmi differ diff --git a/icons/obj/guns/carbine.dmi b/icons/obj/guns/carbine.dmi index 3da64335974..65aca25d0ae 100644 Binary files a/icons/obj/guns/carbine.dmi and b/icons/obj/guns/carbine.dmi differ diff --git a/icons/obj/guns/colt.dmi b/icons/obj/guns/colt.dmi index e7636654b31..9aa327762a5 100644 Binary files a/icons/obj/guns/colt.dmi and b/icons/obj/guns/colt.dmi differ diff --git a/icons/obj/guns/cshotgun.dmi b/icons/obj/guns/cshotgun.dmi index 92a36ecb13a..2e934c006e7 100644 Binary files a/icons/obj/guns/cshotgun.dmi and b/icons/obj/guns/cshotgun.dmi differ diff --git a/icons/obj/guns/ecarbine.dmi b/icons/obj/guns/ecarbine.dmi index da0ca4d8afa..8cfd991182c 100644 Binary files a/icons/obj/guns/ecarbine.dmi and b/icons/obj/guns/ecarbine.dmi differ diff --git a/icons/obj/guns/erifle.dmi b/icons/obj/guns/erifle.dmi index db7ed723cf2..914feead5f1 100644 Binary files a/icons/obj/guns/erifle.dmi and b/icons/obj/guns/erifle.dmi differ diff --git a/icons/obj/guns/grenade_launcher.dmi b/icons/obj/guns/grenade_launcher.dmi index ffaa9ca4459..44a2d093f4c 100644 Binary files a/icons/obj/guns/grenade_launcher.dmi and b/icons/obj/guns/grenade_launcher.dmi differ diff --git a/icons/obj/guns/jargonpistol.dmi b/icons/obj/guns/jargonpistol.dmi new file mode 100644 index 00000000000..e4410c85a19 Binary files /dev/null and b/icons/obj/guns/jargonpistol.dmi differ diff --git a/icons/obj/guns/jargonsmg.dmi b/icons/obj/guns/jargonsmg.dmi new file mode 100644 index 00000000000..f830a784a6c Binary files /dev/null and b/icons/obj/guns/jargonsmg.dmi differ diff --git a/icons/obj/guns/laserrifle.dmi b/icons/obj/guns/laserrifle.dmi index 8ec898222ee..f4b61b619b6 100644 Binary files a/icons/obj/guns/laserrifle.dmi and b/icons/obj/guns/laserrifle.dmi differ diff --git a/icons/obj/guns/lasershotgun.dmi b/icons/obj/guns/lasershotgun.dmi index d73739c61e6..934fc12aa18 100644 Binary files a/icons/obj/guns/lasershotgun.dmi and b/icons/obj/guns/lasershotgun.dmi differ diff --git a/icons/obj/guns/lawgiver.dmi b/icons/obj/guns/lawgiver.dmi index d87fe15d2cc..ffed475cd78 100644 Binary files a/icons/obj/guns/lawgiver.dmi and b/icons/obj/guns/lawgiver.dmi differ diff --git a/icons/obj/guns/plasma_cutter.dmi b/icons/obj/guns/plasma_cutter.dmi new file mode 100644 index 00000000000..43fd1cd0b61 Binary files /dev/null and b/icons/obj/guns/plasma_cutter.dmi differ diff --git a/icons/obj/guns/slammer.dmi b/icons/obj/guns/slammer.dmi index 9fff8bdd841..ad49e961394 100644 Binary files a/icons/obj/guns/slammer.dmi and b/icons/obj/guns/slammer.dmi differ diff --git a/icons/obj/guns/sniper.dmi b/icons/obj/guns/sniper.dmi index 3c464b58b0a..fa5c2aa6135 100644 Binary files a/icons/obj/guns/sniper.dmi and b/icons/obj/guns/sniper.dmi differ diff --git a/icons/obj/guns/wt550.dmi b/icons/obj/guns/wt550.dmi index db6440d547e..d32e20ba3c4 100644 Binary files a/icons/obj/guns/wt550.dmi and b/icons/obj/guns/wt550.dmi differ diff --git a/icons/obj/holomenu.dmi b/icons/obj/holomenu.dmi new file mode 100644 index 00000000000..c7a291b6aa7 Binary files /dev/null and b/icons/obj/holomenu.dmi differ diff --git a/icons/obj/inflatable.dmi b/icons/obj/inflatable.dmi deleted file mode 100644 index 403e39c6378..00000000000 Binary files a/icons/obj/inflatable.dmi and /dev/null differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 1c72fc10871..43b8854e54e 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 07edd4c7f42..f57449f62ff 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/light_overlays.dmi b/icons/obj/light_overlays.dmi index 3c3a74853a8..7834624d624 100644 Binary files a/icons/obj/light_overlays.dmi and b/icons/obj/light_overlays.dmi differ diff --git a/icons/obj/lunchbox.dmi b/icons/obj/lunchbox.dmi index d450c97c014..17bd309f5c9 100644 Binary files a/icons/obj/lunchbox.dmi and b/icons/obj/lunchbox.dmi differ diff --git a/icons/obj/machines/field_generator.dmi b/icons/obj/machines/field_generator.dmi index fcb083f8467..e9d953c5e16 100644 Binary files a/icons/obj/machines/field_generator.dmi and b/icons/obj/machines/field_generator.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index 5f13a3858fe..496a61d6262 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index d4c8a8ef399..74961778569 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/mining_contained.dmi b/icons/obj/mining_contained.dmi index 8cb1f4b02e3..1332882783e 100644 Binary files a/icons/obj/mining_contained.dmi and b/icons/obj/mining_contained.dmi differ diff --git a/icons/obj/molluscs.dmi b/icons/obj/molluscs.dmi index 6c9cfea125e..e2bbbd51000 100644 Binary files a/icons/obj/molluscs.dmi and b/icons/obj/molluscs.dmi differ diff --git a/icons/obj/pants.dmi b/icons/obj/pants.dmi index e13f2166087..d235e836438 100644 Binary files a/icons/obj/pants.dmi and b/icons/obj/pants.dmi differ diff --git a/icons/obj/pipe_dispenser.dmi b/icons/obj/pipe_dispenser.dmi new file mode 100644 index 00000000000..da3ce7b58fd Binary files /dev/null and b/icons/obj/pipe_dispenser.dmi differ diff --git a/icons/obj/projector.dmi b/icons/obj/projector.dmi new file mode 100644 index 00000000000..6e4012c09e7 Binary files /dev/null and b/icons/obj/projector.dmi differ diff --git a/icons/obj/rig_modules.dmi b/icons/obj/rig_modules.dmi index 9cbf6c009d8..8900521616a 100644 Binary files a/icons/obj/rig_modules.dmi and b/icons/obj/rig_modules.dmi differ diff --git a/icons/obj/robot_component.dmi b/icons/obj/robot_component.dmi index a8a04170f93..e28670f3b31 100644 Binary files a/icons/obj/robot_component.dmi and b/icons/obj/robot_component.dmi differ diff --git a/icons/obj/robot_items.dmi b/icons/obj/robot_items.dmi index 8a495202f7f..b6fe254e02e 100644 Binary files a/icons/obj/robot_items.dmi and b/icons/obj/robot_items.dmi differ diff --git a/icons/obj/rollerbed.dmi b/icons/obj/rollerbed.dmi index b664669fdf3..4d63e5409d7 100644 Binary files a/icons/obj/rollerbed.dmi and b/icons/obj/rollerbed.dmi differ diff --git a/icons/obj/singularity.dmi b/icons/obj/singularity.dmi index cc0156de462..356fa163bbc 100644 Binary files a/icons/obj/singularity.dmi and b/icons/obj/singularity.dmi differ diff --git a/icons/obj/spells.dmi b/icons/obj/spells.dmi new file mode 100644 index 00000000000..0f2dadb4cb9 Binary files /dev/null and b/icons/obj/spells.dmi differ diff --git a/icons/obj/stacks/tiles.dmi b/icons/obj/stacks/tiles.dmi index 8de785ca72c..348dd3697ee 100644 Binary files a/icons/obj/stacks/tiles.dmi and b/icons/obj/stacks/tiles.dmi differ diff --git a/icons/obj/stasis_bed.dmi b/icons/obj/stasis_bed.dmi new file mode 100644 index 00000000000..72180cdd4d5 Binary files /dev/null and b/icons/obj/stasis_bed.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index d3f173fc57c..dbb0d7be5cd 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/sticker.dmi b/icons/obj/sticker.dmi new file mode 100644 index 00000000000..2a7e210d606 Binary files /dev/null and b/icons/obj/sticker.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index f97922616bf..ea55229af27 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 9b043ce7d6b..fe3f3e03d3d 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index d814196916b..3a9d16c5360 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index ed75d052a19..c86945dad1a 100644 Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ diff --git a/icons/obj/tajara_items.dmi b/icons/obj/tajara_items.dmi index 370852cb8f7..3e606249e2c 100644 Binary files a/icons/obj/tajara_items.dmi and b/icons/obj/tajara_items.dmi differ diff --git a/icons/obj/technomancer.dmi b/icons/obj/technomancer.dmi new file mode 100644 index 00000000000..4a998c46c4f Binary files /dev/null and b/icons/obj/technomancer.dmi differ diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi index 73b42fee305..ddcb0eb7ad3 100644 Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ diff --git a/icons/obj/terminals.dmi b/icons/obj/terminals.dmi index bfdb632a5d1..18e19295d91 100644 Binary files a/icons/obj/terminals.dmi and b/icons/obj/terminals.dmi differ diff --git a/icons/obj/tesla_engine/tesla_coil.dmi b/icons/obj/tesla_engine/tesla_coil.dmi index 5c3646dde80..db5d14d979f 100644 Binary files a/icons/obj/tesla_engine/tesla_coil.dmi and b/icons/obj/tesla_engine/tesla_coil.dmi differ diff --git a/icons/obj/tesla_engine/tesla_generator.dmi b/icons/obj/tesla_engine/tesla_generator.dmi index adf5fbaa8ec..cc1c8020212 100644 Binary files a/icons/obj/tesla_engine/tesla_generator.dmi and b/icons/obj/tesla_engine/tesla_generator.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index af6a6fef257..b196d280514 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 96e738fb94e..298bcb7c435 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/tracksuit.dmi b/icons/obj/tracksuit.dmi index 39580a56ed1..7c4182f899c 100644 Binary files a/icons/obj/tracksuit.dmi and b/icons/obj/tracksuit.dmi differ diff --git a/icons/obj/unathi_items.dmi b/icons/obj/unathi_items.dmi index 66c9703f568..adaad24fef0 100644 Binary files a/icons/obj/unathi_items.dmi and b/icons/obj/unathi_items.dmi differ diff --git a/icons/obj/wands.dmi b/icons/obj/wands.dmi index 00698045ffe..6058e1bc9c0 100644 Binary files a/icons/obj/wands.dmi and b/icons/obj/wands.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 6c237f33b12..025f649d23f 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 7c820208058..cec9b341fad 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi index 50e027bb997..e80aabd629d 100644 Binary files a/icons/obj/xenoarchaeology.dmi and b/icons/obj/xenoarchaeology.dmi differ diff --git a/icons/policetape.dmi b/icons/policetape.dmi index 7a71bdefed9..a12e0fa58ce 100644 Binary files a/icons/policetape.dmi and b/icons/policetape.dmi differ diff --git a/icons/ss13_32.png b/icons/ss13_32.png index 72bf4f0f977..54bf0667cf0 100644 Binary files a/icons/ss13_32.png and b/icons/ss13_32.png differ diff --git a/icons/ss13_64.png b/icons/ss13_64.png index 103ff0b2644..d743eacdcd8 100644 Binary files a/icons/ss13_64.png and b/icons/ss13_64.png differ diff --git a/icons/turf/flooring/tiles.dmi b/icons/turf/flooring/tiles.dmi index 4b1a0f88d41..5cf6dc960f2 100644 Binary files a/icons/turf/flooring/tiles.dmi and b/icons/turf/flooring/tiles.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 2bddf8f1810..a66221efd95 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -222,7 +222,7 @@ macro "borghotkeymode" macro "macro" elem name = "TAB" - command = ".winset \"mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true\"" + command = ".winset \"mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\"" elem name = "CENTER+REP" command = ".center" @@ -392,7 +392,7 @@ macro "macro" macro "hotkeymode" elem name = "TAB" - command = ".winset \"mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true\"" + command = ".winset \"mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5\"" elem name = "CENTER+REP" command = ".center" @@ -1078,7 +1078,7 @@ window "mainwindow" background-color = none saved-params = "" text = "Hotkey Toggle" - command = ".winset \"mainwindow.macro!=macro ? mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true : mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true\"" + command = ".winset \"mainwindow.macro!=macro ? mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5 : mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\"" is-flat = true button-type = pushbox elem "mainvsplit" @@ -1300,6 +1300,35 @@ window "rpane" group = "rpanemode" button-type = pushbox +window "preferences_window" + elem "preferences_window" + type = MAIN + pos = 281,0 + size = 1200x800 + anchor1 = none + anchor2 = none + background-color = none + is-visible = false + saved-params = "pos;size;is-minimized;is-maximized" + statusbar = false + outer-size = 1216x839 + inner-size = 1200x800 + elem "preferences_browser" + type = BROWSER + pos = 0,0 + size = 1000x800 + anchor1 = 0,0 + anchor2 = 80,100 + background-color = none + saved-params = "" + elem "character_preview_map" + type = MAP + pos = 1000,0 + size = 200x800 + anchor1 = 80,0 + anchor2 = 100,100 + saved-params = "zoom;letterbox;zoom-mode" + window "browserwindow" elem "browserwindow" type = MAIN @@ -1413,32 +1442,3 @@ window "text_editor" saved-params = "" multi-line = true -window "preferences_window" - elem "preferences_window" - type = MAIN - pos = 281,0 - size = 1200x800 - anchor1 = none - anchor2 = none - background-color = none - is-visible = false - saved-params = "pos;size;is-minimized;is-maximized" - statusbar = false - outer-size = 1216x839 - inner-size = 1200x800 - elem "preferences_browser" - type = BROWSER - pos = 0,0 - size = 1000x800 - anchor1 = 0,0 - anchor2 = 80,100 - background-color = none - saved-params = "" - elem "character_preview_map" - type = MAP - pos = 1000,0 - size = 200x800 - anchor1 = 80,0 - anchor2 = 100,100 - saved-params = "zoom;letterbox;zoom-mode" - diff --git a/maps/_common/mapsystem/map.dm b/maps/_common/mapsystem/map.dm index 69654fc9bc5..85e58b1fda5 100644 --- a/maps/_common/mapsystem/map.dm +++ b/maps/_common/mapsystem/map.dm @@ -35,7 +35,6 @@ var/boss_short = "Cap'" var/company_name = "BadMan" var/company_short = "BM" - var/system_name = "Uncharted System" var/command_spawn_enabled = FALSE var/command_spawn_message = "Someone didn't fill this in." @@ -74,6 +73,7 @@ var/overmap_z = 0 //If 0 will generate overmap zlevel on init. Otherwise will populate the zlevel provided. var/overmap_event_areas = 0 //How many event "clouds" will be generated var/list/map_shuttles = list() // A list of all our shuttles. + var/default_sector = SECTOR_ROMANOVICH //What is the default space sector for this map /datum/map/New() if(!map_levels) diff --git a/maps/aurora/aurora-1_centcomm.dmm b/maps/aurora/aurora-1_centcomm.dmm index 788ce57d3a5..9e27949fd5b 100644 --- a/maps/aurora/aurora-1_centcomm.dmm +++ b/maps/aurora/aurora-1_centcomm.dmm @@ -41,6 +41,92 @@ }, /turf/unsimulated/floor/plating, /area/antag/raider) +"aad" = ( +/obj/structure/table/wood, +/obj/machinery/chemical_dispenser/bar_soft/full{ + pixel_y = 7 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aae" = ( +/obj/structure/table/wood, +/obj/machinery/chemical_dispenser/bar_alc/full{ + pixel_y = 7 + }, +/turf/unsimulated/floor{ + icon = 'icons/turf/flooring/circuit.dmi'; + icon_state = "bcircuit" + }, +/area/antag/wizard) +"aaf" = ( +/obj/structure/table/wood, +/obj/item/storage/box/fancy/matches{ + pixel_x = -8; + pixel_y = -1 + }, +/obj/item/storage/box/fancy/matches{ + pixel_x = -8; + pixel_y = 11 + }, +/obj/item/reagent_containers/food/drinks/flask/barflask{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/flask/barflask{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aag" = ( +/obj/structure/table/wood, +/obj/item/storage/backpack/satchel/withwallet, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aah" = ( +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aai" = ( +/turf/unsimulated/floor{ + icon = 'icons/turf/flooring/circuit.dmi'; + icon_state = "bcircuit" + }, +/area/antag/wizard) +"aaj" = ( +/obj/structure/table/wood, +/obj/item/device/radio/intercom{ + desc = "Talk through this. Evilly"; + frequency = 1213; + name = "Syndicate Intercom"; + pixel_y = 22; + subspace_transmission = 1; + syndie = 1 + }, +/obj/item/stack/packageWrap, +/obj/item/device/hand_labeler, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aak" = ( +/obj/structure/table/wood, +/obj/item/device/flashlight/lamp/green{ + on = 0; + pixel_x = -3; + pixel_y = 2 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "aal" = ( /obj/machinery/light/small{ brightness_power = 0.5; @@ -51,6 +137,34 @@ icon_state = "dark2" }, /area/centcom/control) +"aam" = ( +/obj/machinery/vending/snack{ + name = "hacked Getmore Chocolate Corp"; + prices = list() + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aan" = ( +/obj/structure/mirror{ + pixel_x = 27; + pixel_y = -2 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aao" = ( +/obj/item/modular_computer/console/preset/civilian, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "aap" = ( /obj/effect/step_trigger/teleporter/random{ affect_ghosts = 1; @@ -77,6 +191,13 @@ "aaq" = ( /turf/space/transit/south, /area/template_noop) +"aar" = ( +/obj/machinery/librarycomp, +/obj/structure/table/wood, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "aas" = ( /turf/unsimulated/mineral/asteroid, /area/antag/raider) @@ -106,6 +227,24 @@ icon_state = "8,3" }, /area/shuttle/specops) +"aaw" = ( +/obj/structure/table/wood, +/obj/item/storage/box/fountainpens{ + pixel_x = -10; + pixel_y = 9 + }, +/obj/item/paper_bin{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/pen/fountain/black{ + pixel_x = 5; + pixel_y = 7 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "aax" = ( /obj/effect/step_trigger/teleporter/random{ affect_ghosts = 1; @@ -140,6 +279,16 @@ /obj/item/storage/briefcase/aluminium, /turf/simulated/floor/shuttle/black, /area/shuttle/burglar) +"aaA" = ( +/obj/effect/landmark/start{ + name = "wizard" + }, +/obj/structure/bed/chair/office/hover, +/turf/unsimulated/floor{ + icon = 'icons/turf/flooring/circuit.dmi'; + icon_state = "bcircuit" + }, +/area/antag/wizard) "aaB" = ( /turf/space/transit/west, /area/template_noop) @@ -221,6 +370,30 @@ }, /turf/simulated/floor/tiled, /area/shuttle/skipjack) +"aaG" = ( +/obj/structure/trash_pile, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aaH" = ( +/obj/structure/table/rack, +/obj/item/storage/box/syndie_kit/chameleon, +/obj/item/storage/box/syndie_kit/chameleon, +/obj/item/storage/box/syndie_kit/chameleon, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aaI" = ( +/obj/structure/bed/chair/office/hover{ + can_buckle = 0; + dir = 4 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "aaJ" = ( /obj/item/gun/energy/pistol{ layer = 2.99; @@ -244,6 +417,22 @@ /obj/structure/table/rack, /turf/unsimulated/floor/plating, /area/centcom/specops) +"aaK" = ( +/obj/structure/table/steel, +/turf/unsimulated/floor{ + icon = 'icons/turf/flooring/circuit.dmi'; + icon_state = "bcircuit" + }, +/area/antag/wizard) +"aaL" = ( +/obj/structure/bed/chair/office/hover{ + can_buckle = 0; + dir = 8 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "aaM" = ( /turf/template_noop, /area/template_noop) @@ -263,6 +452,58 @@ "aaP" = ( /turf/unsimulated/wall/riveted, /area/template_noop) +"aaQ" = ( +/obj/structure/table/rack, +/obj/item/clothing/accessory/storage/brown_vest, +/obj/item/clothing/accessory/storage/webbing, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aaR" = ( +/obj/structure/table/rack, +/obj/item/storage/backpack, +/obj/item/storage/backpack/messenger, +/obj/item/storage/backpack/satchel/withwallet, +/obj/item/storage/backpack/duffel, +/obj/item/storage/backpack/satchel_norm, +/turf/unsimulated/floor{ + icon = 'icons/turf/flooring/circuit.dmi'; + icon_state = "bcircuit" + }, +/area/antag/wizard) +"aaS" = ( +/obj/structure/bed/chair/office/hover{ + can_buckle = 0; + dir = 4 + }, +/turf/unsimulated/floor{ + icon = 'icons/turf/flooring/circuit.dmi'; + icon_state = "bcircuit" + }, +/area/antag/wizard) +"aaT" = ( +/obj/structure/bed/chair/office/hover{ + can_buckle = 0; + dir = 8 + }, +/turf/unsimulated/floor{ + icon = 'icons/turf/flooring/circuit.dmi'; + icon_state = "bcircuit" + }, +/area/antag/wizard) +"aaU" = ( +/obj/structure/table/rack, +/obj/item/clothing/glasses/eyepatch, +/obj/item/clothing/glasses/regular/scanners, +/obj/item/clothing/glasses/regular/circle, +/obj/item/clothing/glasses/regular/jamjar, +/obj/item/clothing/glasses/regular/hipster, +/turf/unsimulated/floor{ + icon = 'icons/turf/flooring/circuit.dmi'; + icon_state = "bcircuit" + }, +/area/antag/wizard) "aaV" = ( /obj/structure/sign/greencross{ name = "Infirmary"; @@ -275,6 +516,33 @@ /obj/machinery/media/jukebox, /turf/simulated/floor/lino/grey, /area/merchant_station) +"aaW" = ( +/obj/structure/table/rack, +/obj/item/clothing/accessory/offworlder/bracer, +/obj/item/rig/light/offworlder, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aaX" = ( +/obj/structure/table/rack, +/obj/item/clothing/ears/circuitry, +/obj/item/clothing/glasses/circuitry, +/obj/item/clothing/gloves/circuitry, +/obj/item/clothing/head/circuitry, +/obj/item/clothing/shoes/circuitry, +/obj/item/clothing/suit/circuitry, +/obj/item/clothing/under/circuitry, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"aaY" = ( +/obj/machinery/photocopier, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "aaZ" = ( /obj/structure/reagent_dispensers/water_cooler{ pixel_x = 4; @@ -282,6 +550,18 @@ }, /turf/simulated/floor/lino/grey, /area/merchant_station) +"aba" = ( +/obj/machinery/papershredder, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"abb" = ( +/obj/machinery/acting/changer, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "abc" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -290,6 +570,51 @@ /obj/structure/window/reinforced, /turf/template_noop, /area/template_noop) +"abd" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"abe" = ( +/obj/machinery/vending/cigarette{ + name = "hacked cigarette machine"; + pixel_x = 5; + prices = null; + random_itemcount = 0 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"abf" = ( +/obj/structure/dispenser/oxygen, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"abg" = ( +/obj/structure/undies_wardrobe, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"abh" = ( +/obj/machinery/suit_cycler/wizard, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"abi" = ( +/obj/machinery/vending/snack{ + name = "hacked Getmore Chocolate Corp"; + prices = list(); + random_itemcount = 0 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "abj" = ( /obj/machinery/door/airlock/glass{ name = "Lounge"; @@ -297,6 +622,26 @@ }, /turf/simulated/floor/lino/grey, /area/merchant_station) +"abk" = ( +/obj/item/stack/medical/ointment, +/obj/item/stack/medical/ointment, +/obj/item/stack/medical/splint, +/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/bruise_pack, +/obj/structure/closet/medical_wall{ + pixel_x = -28 + }, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) +"abl" = ( +/obj/item/crowbar, +/obj/structure/table/rack, +/turf/unsimulated/floor{ + icon_state = "new_white" + }, +/area/antag/wizard) "abm" = ( /obj/machinery/light{ icon_state = "tube1" @@ -349,6 +694,20 @@ /obj/structure/flora/ausbushes/sparsegrass, /turf/simulated/floor/holofloor/grass, /area/holodeck/source_picnicarea) +"aby" = ( +/obj/effect/decal/fake_object{ + density = 1; + desc = "Ding."; + icon = 'icons/obj/doors/doorlift.dmi'; + icon_state = "door_closed"; + name = "elevator door"; + opacity = 1 + }, +/turf/unsimulated/floor{ + icon_state = "cult"; + name = "plating" + }, +/area/antag/wizard) "abz" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 @@ -2846,16 +3205,6 @@ name = "Skipjack" }, /area/shuttle/skipjack) -"anq" = ( -/obj/structure/bed/chair/wood/wings, -/obj/effect/landmark/start{ - name = "wizard" - }, -/turf/unsimulated/floor{ - dir = 1; - icon_state = "carpetside" - }, -/area/antag/wizard) "ant" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -4816,6 +5165,8 @@ dir = 10 }, /obj/structure/table/steel, +/obj/item/clothing/gloves/yellow/specialu, +/obj/item/clothing/gloves/yellow/specialt, /obj/item/clothing/gloves/yellow, /obj/item/clothing/gloves/yellow, /obj/item/storage/belt/utility/full, @@ -5080,16 +5431,6 @@ }, /turf/simulated/floor/plating, /area/shuttle/skipjack) -"aIW" = ( -/obj/item/clothing/suit/wizrobe/magusblue, -/obj/item/clothing/head/wizard/magus, -/obj/item/staff, -/obj/structure/table/rack, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "aIX" = ( /obj/structure/lattice/catwalk/indoor/grate, /turf/simulated/floor/plating, @@ -6385,16 +6726,6 @@ /obj/machinery/photocopier, /turf/unsimulated/floor, /area/antag/mercenary) -"aRQ" = ( -/obj/machinery/vending/snack{ - name = "hacked Getmore Chocolate Corp"; - prices = list() - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "aRT" = ( /obj/structure/bed/chair/comfy/brown, /obj/effect/landmark{ @@ -6416,24 +6747,6 @@ icon_state = "dark2" }, /area/centcom/spawning) -"aSU" = ( -/obj/structure/bed/chair/wood/wings{ - dir = 4 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "carpetside" - }, -/area/antag/wizard) -"aSW" = ( -/obj/structure/bed/chair/wood/wings{ - dir = 8 - }, -/turf/unsimulated/floor{ - dir = 4; - icon_state = "carpetside" - }, -/area/antag/wizard) "aTs" = ( /obj/item/device/radio/intercom{ name = "Station Intercom (General)"; @@ -7481,16 +7794,16 @@ }, /area/centcom/legion/hangar5) "bir" = ( -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 8 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 8 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 8 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 8 }, /obj/item/grenade/chem_grenade/metalfoam{ @@ -7702,12 +8015,6 @@ }, /turf/unsimulated/floor, /area/centcom/spawning) -"boS" = ( -/turf/unsimulated/floor{ - dir = 6; - icon_state = "carpetside" - }, -/area/antag/wizard) "bpk" = ( /obj/machinery/button/remote/blast_door{ dir = 4; @@ -8301,8 +8608,8 @@ }, /area/shuttle/administration) "bHu" = ( -/obj/item/storage/briefcase/inflatable, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, +/obj/item/storage/bag/inflatable, /obj/structure/closet/l3closet, /obj/item/clothing/suit/bio_suit/virology, /obj/item/clothing/head/bio_hood/virology, @@ -8378,8 +8685,8 @@ }, /area/centcom/bar) "bJW" = ( -/obj/item/storage/briefcase/inflatable, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, +/obj/item/storage/bag/inflatable, /obj/structure/closet/l3closet, /obj/item/clothing/suit/bio_suit/virology, /obj/item/clothing/head/bio_hood/virology, @@ -8742,16 +9049,6 @@ "bXB" = ( /turf/space, /area/antag/ninja) -"bXO" = ( -/obj/structure/table/wood, -/obj/machinery/chemical_dispenser/bar_alc/full{ - pixel_y = 7 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "bXZ" = ( /obj/item/modular_computer/console/preset/security, /obj/effect/floor_decal/corner/blue{ @@ -8838,15 +9135,6 @@ icon_state = "0,7" }, /area/supply/dock) -"cbN" = ( -/obj/item/clothing/suit/wizrobe/psypurple, -/obj/item/clothing/head/wizard/amp, -/obj/structure/table/rack, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "cce" = ( /obj/machinery/door/airlock/centcom{ frequency = 1337; @@ -9431,13 +9719,6 @@ /obj/structure/table/reinforced/steel, /turf/simulated/floor/tiled/dark, /area/shuttle/administration) -"cuH" = ( -/obj/machinery/suit_cycler/wizard, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "cvf" = ( /obj/structure/sign/poster{ icon_state = "tcflposter2"; @@ -9503,13 +9784,6 @@ icon_state = "tiles" }, /area/centcom/legion/hangar5) -"cyJ" = ( -/obj/structure/dispenser/oxygen, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "cyX" = ( /obj/effect/floor_decal/corner/red{ dir = 5 @@ -9944,7 +10218,7 @@ /obj/item/storage/firstaid/o2{ pixel_y = 2 }, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/item/device/flashlight/flare/glowstick/red, /obj/item/device/flashlight/flare/glowstick/red, /obj/effect/floor_decal/industrial/outline/yellow, @@ -10829,13 +11103,6 @@ icon_state = "15,2" }, /area/shuttle/mercenary) -"dmv" = ( -/obj/structure/cult/tome, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "dmw" = ( /obj/effect/floor_decal/corner/lime/full{ dir = 8 @@ -12146,14 +12413,6 @@ }, /turf/unsimulated/floor/plating, /area/shuttle/administration) -"edr" = ( -/obj/machinery/librarycomp, -/obj/structure/table/wood, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "edG" = ( /turf/simulated/floor/tiled/ramp/bottom{ dir = 1 @@ -12747,7 +13006,8 @@ "ezv" = ( /obj/machinery/door/airlock/centcom{ name = "Telecommunications Monitoring"; - req_access = list(107) + req_access = null; + req_one_access = list(106,108,109) }, /turf/unsimulated/floor{ icon_state = "dark2" @@ -13083,17 +13343,6 @@ name = "military corvette" }, /area/shuttle/administration) -"eJX" = ( -/obj/structure/table/wood{ - table_reinf = "wood" - }, -/obj/item/storage/box/fancy/candle_box, -/obj/item/storage/box/fancy/candle_box, -/obj/item/storage/box/fancy/candle_box, -/turf/unsimulated/floor{ - icon_state = "carpet" - }, -/area/antag/wizard) "eKl" = ( /obj/structure/lattice/catwalk/indoor, /obj/effect/decal/cleanable/dirt, @@ -13613,15 +13862,27 @@ /area/centcom/holding) "fcm" = ( /obj/structure/table/rack, -/obj/item/material/knife/tacknife{ +/obj/item/material/knife/bayonet{ pixel_x = 3; pixel_y = -2 }, -/obj/item/material/knife/tacknife{ +/obj/item/material/knife/bayonet{ pixel_x = 3; pixel_y = -2 }, -/obj/item/material/knife/tacknife{ +/obj/item/material/knife/bayonet{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/material/knife/bayonet{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/material/knife/bayonet{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/material/knife/bayonet{ pixel_x = 3; pixel_y = -2 }, @@ -13649,6 +13910,30 @@ pixel_x = 2; pixel_y = 9 }, +/obj/item/melee/energy/sword/knife{ + pixel_x = 9; + pixel_y = -4 + }, +/obj/item/melee/energy/sword/knife{ + pixel_x = 9; + pixel_y = -4 + }, +/obj/item/melee/energy/sword/knife{ + pixel_x = 9; + pixel_y = -4 + }, +/obj/item/melee/energy/sword/knife{ + pixel_x = 9; + pixel_y = -4 + }, +/obj/item/melee/energy/sword/knife{ + pixel_x = 9; + pixel_y = -4 + }, +/obj/item/melee/energy/sword/knife{ + pixel_x = 9; + pixel_y = -4 + }, /turf/unsimulated/floor, /area/centcom/legion/hangar5) "fcL" = ( @@ -13727,13 +14012,6 @@ }, /turf/unsimulated/floor/plating, /area/shuttle/syndicate_elite) -"ffo" = ( -/obj/machinery/photocopier, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "ffx" = ( /obj/structure/shuttle_part/raider{ density = 0; @@ -13840,12 +14118,6 @@ icon_state = "new_reinforced" }, /area/antag/mercenary) -"fks" = ( -/turf/unsimulated/floor{ - dir = 9; - icon_state = "carpetside" - }, -/area/antag/wizard) "fkx" = ( /obj/structure/window/reinforced/polarized{ id = "CCIABS" @@ -15479,14 +15751,6 @@ icon_state = "dark2" }, /area/centcom/control) -"ghL" = ( -/obj/item/crowbar, -/obj/structure/table/rack, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "ghN" = ( /obj/random/junk, /turf/template_noop, @@ -16277,7 +16541,7 @@ amount = 50; pixel_x = 1 }, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/effect/floor_decal/corner/red{ dir = 6 }, @@ -16688,8 +16952,15 @@ /turf/simulated/floor/wood, /area/centcom/shared_dream) "gOV" = ( -/obj/structure/table/reinforced, +/obj/item/clothing/accessory/storage/webbingharness/pouches/ert, +/obj/item/clothing/accessory/storage/webbingharness/alt{ + slots = 5 + }, +/obj/item/clothing/accessory/storage/webbingharness{ + slots = 5 + }, /obj/item/device/binoculars, +/obj/structure/table/reinforced, /turf/simulated/floor/shuttle/black, /area/shuttle/mercenary) "gPb" = ( @@ -16737,6 +17008,16 @@ /obj/item/clothing/accessory/holster/armpit/brown, /obj/item/clothing/gloves/black_leather, /obj/item/clothing/gloves/black_leather, +/obj/item/clothing/accessory/storage/webbingharness/alt{ + slots = 5 + }, +/obj/item/clothing/accessory/storage/webbingharness/pouches/ert, +/obj/item/clothing/accessory/storage/webbingharness{ + slots = 5 + }, +/obj/item/clothing/accessory/storage/black_vest, +/obj/item/clothing/accessory/storage/brown_vest, +/obj/item/clothing/accessory/storage/white_vest, /turf/unsimulated/floor, /area/antag/burglar) "gPO" = ( @@ -17626,13 +17907,6 @@ /obj/structure/cryofeed, /turf/simulated/floor/tiled/dark, /area/merchant_station) -"hqT" = ( -/obj/structure/undies_wardrobe, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "hri" = ( /obj/effect/floor_decal/corner/red/full{ dir = 1 @@ -17701,7 +17975,7 @@ }, /area/centcom/specops) "hum" = ( -/obj/machinery/hologram/holopad, +/obj/machinery/hologram/holopad/central, /turf/unsimulated/floor{ icon_state = "dark2" }, @@ -19295,20 +19569,6 @@ }, /turf/unsimulated/floor/plating, /area/centcom/specops) -"iwf" = ( -/obj/structure/table/rack, -/obj/item/material/knife/ritual{ - pixel_x = -2; - pixel_y = 7 - }, -/obj/item/material/knife/ritual{ - pixel_y = -1 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "iwr" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 @@ -19673,29 +19933,6 @@ /obj/item/device/megaphone/red, /turf/simulated/floor/shuttle/black, /area/shuttle/mercenary) -"iJy" = ( -/obj/structure/table/wood, -/obj/item/storage/box/fancy/matches{ - pixel_x = -8; - pixel_y = -1 - }, -/obj/item/storage/box/fancy/matches{ - pixel_x = -8; - pixel_y = 11 - }, -/obj/item/reagent_containers/food/drinks/flask/barflask{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/reagent_containers/food/drinks/flask/barflask{ - pixel_x = 6; - pixel_y = 6 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "iJA" = ( /turf/simulated/floor/wood, /area/merchant_station/warehouse) @@ -20210,17 +20447,6 @@ }, /turf/simulated/floor/shuttle/black, /area/shuttle/distress) -"iXE" = ( -/obj/structure/table/rack, -/obj/item/storage/backpack/satchel_wizard, -/obj/item/storage/backpack/wizard, -/obj/item/storage/backpack/messenger/wizard, -/obj/item/storage/backpack/duffel/wizard, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "iXX" = ( /obj/effect/floor_decal/corner/green/full{ dir = 1 @@ -21432,26 +21658,6 @@ "jTO" = ( /turf/unsimulated/wall/darkshuttlewall, /area/centcom/specops) -"jUq" = ( -/obj/structure/table/rack, -/obj/item/clothing/gloves/green, -/obj/item/clothing/gloves/rainbow, -/obj/item/clothing/gloves/blue, -/obj/item/clothing/gloves/orange, -/obj/item/clothing/gloves/purple, -/obj/item/clothing/gloves/red, -/obj/item/clothing/mask/gas/cyborg, -/obj/item/clothing/mask/gas/mime, -/obj/item/clothing/mask/gas/monkeymask, -/obj/item/clothing/mask/gas/owl_mask, -/obj/item/clothing/mask/gas/plaguedoctor, -/obj/item/clothing/mask/muzzle, -/obj/item/clothing/glasses/sunglasses/blindfold, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "jUu" = ( /obj/item/clothing/suit/armor/carrier/ballistic, /obj/item/clothing/under/rank/centcom_officer, @@ -22102,17 +22308,6 @@ icon_state = "panelscorched" }, /area/antag/raider) -"knI" = ( -/obj/machinery/vending/snack{ - name = "hacked Getmore Chocolate Corp"; - prices = list(); - random_itemcount = 0 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "knO" = ( /obj/effect/floor_decal/spline/plain, /obj/effect/floor_decal/industrial/warning{ @@ -22396,7 +22591,7 @@ "kzj" = ( /obj/machinery/door/airlock/centcom{ name = "Custodial Closet"; - req_access = list(101) + req_access = list(103) }, /turf/unsimulated/floor{ icon_state = "dark2" @@ -22422,7 +22617,7 @@ /obj/item/storage/firstaid/o2{ pixel_y = 2 }, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/item/device/flashlight/flare, /obj/item/device/flashlight/flare, /obj/machinery/light{ @@ -23559,20 +23754,6 @@ icon_state = "dark2" }, /area/centcom/ferry) -"lnj" = ( -/obj/item/clothing/shoes/sandal/marisa{ - desc = "A set of fancy shoes that are as functional as they are comfortable."; - name = "Gentlemans Shoes" - }, -/obj/item/clothing/head/wizard/cap, -/obj/item/clothing/suit/storage/toggle/wizrobe/gentlecoat, -/obj/item/staff/gentcane, -/obj/structure/table/rack, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "lnt" = ( /obj/effect/ghostspawpoint{ identifier = "OdinCheckpoint"; @@ -23847,14 +24028,6 @@ icon_state = "5,6" }, /area/shuttle/merchant) -"lxg" = ( -/obj/structure/bed/chair/wood/wings{ - dir = 1 - }, -/turf/unsimulated/floor{ - icon_state = "carpetside" - }, -/area/antag/wizard) "lxi" = ( /turf/unsimulated/wall/fakepdoor{ dir = 4 @@ -23894,24 +24067,9 @@ }, /turf/unsimulated/floor/plating, /area/shuttle/administration) -"lym" = ( -/obj/structure/table/wood, -/obj/item/storage/backpack/satchel/withwallet, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) -"lyF" = ( -/obj/machinery/papershredder, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "lzh" = ( -/obj/item/clothing/gloves/yellow, -/obj/item/clothing/gloves/yellow, +/obj/item/clothing/gloves/yellow/specialu, +/obj/item/clothing/gloves/yellow/specialt, /obj/item/clothing/gloves/yellow, /obj/item/clothing/gloves/yellow, /obj/item/storage/box/lights/mixed{ @@ -24224,12 +24382,6 @@ }, /turf/simulated/floor/tiled/dark, /area/shuttle/merchant) -"lJt" = ( -/turf/unsimulated/floor{ - dir = 5; - icon_state = "carpetside" - }, -/area/antag/wizard) "lJD" = ( /obj/machinery/acting/changer, /turf/unsimulated/floor{ @@ -24508,19 +24660,6 @@ icon_state = "7,0" }, /area/shuttle/specops) -"lQL" = ( -/obj/structure/table/rack, -/obj/item/clothing/glasses/monocle, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/glasses/regular/scanners, -/obj/item/clothing/glasses/regular/circle, -/obj/item/clothing/glasses/regular/jamjar, -/obj/item/clothing/glasses/regular/hipster, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "lQQ" = ( /obj/structure/shuttle_part/arrivals{ desc = "A state-of-the-art unmanned automatic crew transport shuttle."; @@ -25210,6 +25349,12 @@ icon_state = "2,5" }, /area/shuttle/merchant) +"mlA" = ( +/obj/machinery/hologram/holopad/central, +/turf/unsimulated/floor{ + icon_state = "wood" + }, +/area/centcom/specops) "mmb" = ( /turf/simulated/floor, /area/tdome/tdome2) @@ -25312,7 +25457,7 @@ }, /obj/effect/decal/fake_object{ density = 1; - icon = 'icons/obj/inflatable.dmi'; + icon = 'icons/obj/contained_items/tools/inflatables.dmi'; icon_state = "wall"; layer = 2.3; name = "inflatable wall" @@ -26453,12 +26598,6 @@ }, /turf/unsimulated/floor/plating, /area/shuttle/administration) -"nby" = ( -/turf/unsimulated/floor{ - dir = 10; - icon_state = "carpetside" - }, -/area/antag/wizard) "nbD" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 1 @@ -26516,16 +26655,6 @@ /obj/structure/lattice/catwalk/indoor/grate, /turf/unsimulated/floor/plating, /area/centcom/holding) -"ndn" = ( -/obj/structure/table/wood, -/obj/machinery/chemical_dispenser/bar_soft/full{ - pixel_y = 7 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "ndP" = ( /obj/machinery/door/airlock/centcom{ name = "Special Ops."; @@ -26722,26 +26851,6 @@ icon_state = "wood" }, /area/centcom/control) -"niW" = ( -/obj/structure/table/wood, -/obj/item/storage/box/fountainpens{ - pixel_x = -10; - pixel_y = 9 - }, -/obj/item/paper_bin{ - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/pen/fountain/black{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/toy/figure/wizard, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "niY" = ( /obj/machinery/button/remote/blast_door{ desc = "It controls the shuttle shutter."; @@ -28069,13 +28178,13 @@ /turf/unsimulated/floor, /area/antag/mercenary) "nTr" = ( -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 2 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 2 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 2 }, /obj/structure/table/steel, @@ -28347,20 +28456,6 @@ icon_state = "rub_carpet" }, /area/centcom/control) -"oau" = ( -/obj/structure/mirror{ - pixel_x = 27; - pixel_y = -2 - }, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "oaC" = ( /obj/structure/table/reinforced/wood, /obj/machinery/camera/network/crescent{ @@ -28525,18 +28620,6 @@ }, /turf/unsimulated/floor/plating, /area/centcom/legion) -"ohI" = ( -/obj/machinery/vending/cigarette{ - name = "hacked cigarette machine"; - pixel_x = 5; - prices = null; - random_itemcount = 0 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "oik" = ( /obj/machinery/door/airlock/centcom{ name = "Commander's Office"; @@ -28987,19 +29070,6 @@ icon_state = "dark2" }, /area/centcom/holding) -"oBv" = ( -/obj/structure/table/rack, -/obj/item/storage/backpack, -/obj/item/storage/backpack/messenger, -/obj/item/storage/backpack/cultpack, -/obj/item/storage/backpack/satchel/withwallet, -/obj/item/storage/backpack/duffel, -/obj/item/storage/backpack/satchel_norm, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "oBC" = ( /obj/structure/shuttle_part/mercenary{ icon_state = "7,0" @@ -29103,6 +29173,12 @@ /obj/machinery/acting/changer, /turf/unsimulated/floor, /area/antag/mercenary) +"oFg" = ( +/obj/structure/table/holotable, +/obj/item/toy/ringbell, +/obj/item/clothing/gloves/boxing/hologlove, +/turf/simulated/floor/holofloor/tiled/dark, +/area/holodeck/source_boxingcourt) "oGi" = ( /obj/effect/floor_decal/corner/paleblue/diagonal{ dir = 8 @@ -29770,17 +29846,6 @@ }, /turf/unsimulated/floor/plating, /area/shuttle/administration) -"pfG" = ( -/obj/item/clothing/suit/wizrobe/marisa, -/obj/item/clothing/shoes/sandal/marisa, -/obj/item/clothing/head/wizard/marisa, -/obj/item/staff/broom, -/obj/structure/table/rack, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "pfR" = ( /obj/structure/grille, /obj/structure/window/reinforced, @@ -29836,21 +29901,6 @@ }, /turf/simulated/floor/grass/alt, /area/centcom/holding) -"pit" = ( -/obj/structure/table/wood{ - table_reinf = "wood" - }, -/obj/effect/landmark{ - name = "Teleport-Scroll" - }, -/obj/item/material/ashtray/bronze{ - pixel_x = 7; - pixel_y = -8 - }, -/turf/unsimulated/floor{ - icon_state = "carpet" - }, -/area/antag/wizard) "pjc" = ( /obj/machinery/door/blast/regular{ id = "thunderdome"; @@ -30826,13 +30876,6 @@ }, /turf/unsimulated/floor, /area/centcom/evac) -"pKH" = ( -/obj/machinery/acting/changer, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "pKM" = ( /obj/effect/step_trigger/thrower/shuttle/south, /turf/space/transit/west, @@ -30866,20 +30909,6 @@ icon_state = "16,3" }, /area/shuttle/merchant) -"pLd" = ( -/obj/item/stack/medical/ointment, -/obj/item/stack/medical/ointment, -/obj/item/stack/medical/splint, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/bruise_pack, -/obj/structure/closet/medical_wall{ - pixel_x = -28 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "pLp" = ( /turf/simulated/wall/shuttle/unique/transfer{ desc = "A large, bloated shuttle designed for automated passenger transport."; @@ -31142,16 +31171,6 @@ }, /turf/space/dynamic, /area/shuttle/merchant) -"pUq" = ( -/obj/item/clothing/suit/wizrobe/magusred, -/obj/item/clothing/head/wizard/magus, -/obj/item/staff, -/obj/structure/table/rack, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "pUx" = ( /turf/simulated/wall/shuttle/unique/cargo{ icon_state = "6,9" @@ -31752,18 +31771,6 @@ /obj/structure/flora/ausbushes/ppflowers, /turf/simulated/floor/holofloor/grass, /area/holodeck/source_dininghall) -"qsG" = ( -/obj/structure/table/wood, -/obj/item/device/flashlight/lamp/green{ - on = 0; - pixel_x = -3; - pixel_y = 2 - }, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "qtg" = ( /obj/structure/shuttle_part/raider{ density = 0; @@ -32181,12 +32188,6 @@ icon_state = "wood" }, /area/centcom/evac) -"qIj" = ( -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "qIn" = ( /obj/structure/window/shuttle/unique/merchant{ icon_state = "14,1" @@ -32354,11 +32355,11 @@ pixel_y = -12 }, /obj/item/reagent_containers/glass/bottle/dermaline, -/obj/item/reagent_containers/glass/bottle/bicaridine{ +/obj/item/reagent_containers/glass/bottle/butazoline{ pixel_x = -3; pixel_y = -8 }, -/obj/item/reagent_containers/glass/bottle/bicaridine{ +/obj/item/reagent_containers/glass/bottle/butazoline{ pixel_x = -3; pixel_y = -8 }, @@ -32373,6 +32374,14 @@ /obj/item/reagent_containers/glass/bottle/thetamycin{ pixel_x = 9 }, +/obj/item/reagent_containers/glass/bottle/perconol{ + pixel_x = -7; + pixel_y = -4 + }, +/obj/item/reagent_containers/glass/bottle/perconol{ + pixel_x = -7; + pixel_y = -4 + }, /turf/simulated/floor/tiled/dark, /area/shuttle/mercenary) "qRm" = ( @@ -35887,29 +35896,6 @@ }, /turf/simulated/floor/tiled/dark, /area/centcom/bar) -"ttM" = ( -/obj/effect/decal/fake_object{ - color = "#5C5454"; - density = 1; - desc = "An ethereal barrier protects the entrance to this realm."; - icon = 'icons/obj/doors/material_doors.dmi'; - icon_state = "metal"; - name = "Mind Palace"; - opacity = 1 - }, -/obj/effect/decal/fake_object{ - density = 1; - desc = "An ethereal barrier protects the entrance to this realm."; - icon = 'icons/effects/effects.dmi'; - icon_state = "shield-old"; - name = "Mind Palace"; - opacity = 1 - }, -/turf/unsimulated/floor{ - icon_state = "cult"; - name = "plating" - }, -/area/antag/wizard) "ttS" = ( /obj/structure/lattice, /obj/structure/window/reinforced/crescent, @@ -36115,15 +36101,6 @@ /obj/structure/flora/ausbushes/sparsegrass, /turf/simulated/floor/grass/alt, /area/centcom/bar) -"tAD" = ( -/obj/structure/table/rack, -/obj/item/clothing/accessory/offworlder/bracer, -/obj/item/rig/light/offworlder, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "tBa" = ( /obj/structure/sign/directions/security{ dir = 8 @@ -37909,6 +37886,7 @@ /obj/item/clothing/mask/surgical, /obj/item/clothing/mask/surgical, /obj/item/storage/belt/medical, +/obj/item/storage/belt/medical/first_responder/combat, /obj/item/storage/belt/medical, /obj/structure/sink{ dir = 4; @@ -38045,18 +38023,6 @@ }, /turf/simulated/floor/shuttle/black, /area/shuttle/distress) -"uRE" = ( -/obj/structure/table/wood{ - table_reinf = "wood" - }, -/obj/item/storage/box/fancy/crayons, -/obj/item/storage/box/fancy/crayons/chalkbox{ - pixel_y = 13 - }, -/turf/unsimulated/floor{ - icon_state = "carpet" - }, -/area/antag/wizard) "uRY" = ( /obj/effect/decal/fake_object{ desc = "In memoriam. The picture shows a human posing with a gauss thumper trying their best to look tough. The background appears to be the Towers cargo bay."; @@ -39088,7 +39054,8 @@ name = "VIP Shuttle Access"; pixel_x = -7; pixel_y = -23; - req_access = list(101) + req_access = null; + req_one_access = list(108,109) }, /turf/unsimulated/floor, /area/centcom/holding) @@ -40038,23 +40005,6 @@ /obj/item/stool/padded, /turf/unsimulated/floor, /area/centcom/legion) -"wgw" = ( -/obj/structure/table/wood, -/obj/item/device/radio/intercom{ - desc = "Talk through this. Evilly"; - frequency = 1213; - name = "Syndicate Intercom"; - pixel_y = 22; - subspace_transmission = 1; - syndie = 1 - }, -/obj/item/stack/packageWrap, -/obj/item/device/hand_labeler, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "wgM" = ( /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -40209,26 +40159,6 @@ icon_state = "lino_grey" }, /area/antag/raider) -"wkS" = ( -/obj/structure/table/rack, -/obj/item/deck/cards, -/obj/item/deck/cards, -/obj/item/deck/tarot, -/obj/item/device/megaphone/red, -/obj/item/device/flashlight/lantern, -/obj/item/storage/box/fancy/cigarettes/cigar, -/obj/item/clothing/mask/smokable/pipe, -/obj/item/clothing/mask/smokable/pipe/cobpipe, -/obj/item/flame/lighter/zippo, -/obj/item/clothing/accessory/storage/brown_vest, -/obj/item/clothing/accessory/storage/webbing, -/obj/item/clothing/accessory/locket, -/obj/item/pocketwatch, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "wlj" = ( /turf/simulated/wall/diona{ opacity = 0 @@ -41189,13 +41119,6 @@ /obj/effect/floor_decal/corner/red/diagonal, /turf/simulated/floor/tiled/dark, /area/shuttle/mercenary) -"wIF" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "wIL" = ( /obj/structure/table/standard, /obj/item/trash/plate, @@ -41630,15 +41553,15 @@ /area/centcom/specops) "wWK" = ( /obj/structure/table/rack, -/obj/item/storage/belt/medical{ +/obj/item/storage/belt/medical/first_responder/combat/full{ + pixel_x = 5; + pixel_y = -5 + }, +/obj/item/storage/belt/medical/first_responder/combat/full, +/obj/item/storage/belt/medical/first_responder/combat/full{ pixel_x = -4; pixel_y = 5 }, -/obj/item/storage/belt/medical, -/obj/item/storage/belt/medical{ - pixel_x = 4; - pixel_y = -5 - }, /turf/unsimulated/floor, /area/centcom/legion/hangar5) "wWZ" = ( @@ -42426,14 +42349,18 @@ /area/centcom/legion/hangar5) "xuV" = ( /obj/structure/table/rack, -/obj/item/shield/energy/legion{ - pixel_x = 3; - pixel_y = -2 - }, /obj/item/melee/energy/sword/knife{ pixel_x = -4; pixel_y = 5 }, +/obj/item/material/knife/bayonet{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/shield/energy/legion{ + pixel_x = 3; + pixel_y = -2 + }, /turf/unsimulated/floor{ icon_state = "wood_light" }, @@ -43636,6 +43563,9 @@ /area/antag/burglar) "ygE" = ( /obj/structure/table/rack, +/obj/item/clothing/gloves/yellow/specialu, +/obj/item/clothing/gloves/yellow/specialt, +/obj/item/clothing/gloves/yellow, /obj/item/storage/belt/utility/very_full, /obj/item/storage/belt/utility/very_full, /obj/item/storage/belt/utility/very_full, @@ -50683,9 +50613,9 @@ aaM aaM gCr gCr -iXE -oBv -tAD +aaG +aaR +aaW gCr gCr aaM @@ -50939,11 +50869,11 @@ aaM aaM aaM yhJ -dmv -qIj -qIj -qIj -ffo +aao +aah +aai +aah +aaY yhJ aaM aaM @@ -51196,11 +51126,11 @@ aaM aaM aaM yhJ -edr -qIj -qIj -qIj -lyF +aar +aah +aai +aah +aba yhJ aaM aaM @@ -51453,11 +51383,11 @@ gCr yhJ yhJ gCr -niW -qIj -qIj -qIj -iwf +aaw +aah +aai +aah +aaG gCr yhJ yhJ @@ -51707,17 +51637,17 @@ pBV gUc gCr gCr -lym -qsG -qIj -qIj -qIj -qIj -qIj -qIj -wIF -cyJ -cuH +aag +aak +aah +aah +aah +aai +aah +aah +abd +abf +abh gCr gCr ahV @@ -51963,19 +51893,19 @@ aaM pBV gUc yhJ -ndn -qIj -qIj -qIj -fks -aSU -aSU -aSU -nby -qIj -qIj -qIj -pLd +aad +aah +aah +aah +aah +aaI +aaS +aaI +aah +aah +aah +aah +abk gCr ahV ahV @@ -52220,20 +52150,20 @@ aaM pBV gUc yhJ -bXO -qIj -qIj -qIj -anq -pit -eJX -uRE -lxg -qIj -qIj -qIj -qIj -ttM +aae +aai +aai +aai +aaA +aaK +aaK +aaK +aai +aai +aai +aai +aai +aby ahV ahV ahV @@ -52477,19 +52407,19 @@ aaM pBV gUc yhJ -iJy -qIj -qIj -qIj -lJt -aSW -aSW -aSW -boS -qIj -qIj -qIj -ghL +aaf +aah +aah +aah +aah +aaL +aaT +aaL +aah +aah +aah +aah +abl gCr ahV ahV @@ -52735,17 +52665,17 @@ pBV gUc gCr gCr -wgw -aRQ -oau -qIj -qIj -qIj -qIj -qIj -ohI -hqT -knI +aaj +aam +aan +aah +aah +aai +aah +aah +abe +abg +abi gCr gCr ahV @@ -52995,11 +52925,11 @@ gCr yhJ yhJ gCr -pfG -qIj -qIj -qIj -pKH +aaG +aah +aai +aah +abb gCr yhJ yhJ @@ -53252,11 +53182,11 @@ aaM aaM aaM yhJ -aIW -qIj -qIj -qIj -cbN +aaG +aah +aai +aah +aaG yhJ aaM aaM @@ -53509,11 +53439,11 @@ aaM aaM aaM yhJ -pUq -qIj -qIj -qIj -lnj +aaH +aah +aai +aah +aaG yhJ aaM aaM @@ -53767,9 +53697,9 @@ aaM aaM gCr gCr -wkS -lQL -jUq +aaQ +aaU +aaX gCr gCr aaM @@ -64508,7 +64438,7 @@ ngi jTO nlQ nGs -vjQ +mlA ocD oik vjQ @@ -107035,7 +106965,7 @@ adx adx aeJ aeO -afj +oFg afk afJ afP diff --git a/maps/aurora/aurora-2_under-station.dmm b/maps/aurora/aurora-2_under-station.dmm index 889445490be..3cd4667d637 100644 --- a/maps/aurora/aurora-2_under-station.dmm +++ b/maps/aurora/aurora-2_under-station.dmm @@ -38,7 +38,7 @@ /area/engineering/cooling) "eu" = ( /obj/structure/table/standard, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /turf/simulated/floor/carpet/rubber, /area/engineering/cooling) "gY" = ( diff --git a/maps/aurora/aurora-3_sublevel.dmm b/maps/aurora/aurora-3_sublevel.dmm index 647875f390c..0e26057a39a 100644 --- a/maps/aurora/aurora-3_sublevel.dmm +++ b/maps/aurora/aurora-3_sublevel.dmm @@ -1639,8 +1639,8 @@ /area/rnd/xenoarch_atrium) "adR" = ( /obj/structure/table/rack, -/obj/item/storage/briefcase/inflatable, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, +/obj/item/storage/bag/inflatable, /turf/simulated/floor/tiled, /area/rnd/xenoarch_atrium) "adS" = ( @@ -2638,7 +2638,7 @@ /area/engineering/storage_sublevel) "agu" = ( /obj/structure/table/rack, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/random/tech_supply, /obj/random/tech_supply, /turf/simulated/floor/tiled, @@ -10740,7 +10740,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -14980,7 +14980,7 @@ /area/maintenance/medsublevel_port) "aDh" = ( /obj/structure/table/steel, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /turf/simulated/floor/plating, /area/maintenance/medsublevel_port) "aDi" = ( @@ -16680,6 +16680,7 @@ /obj/effect/floor_decal/corner_wide/mauve/full{ dir = 1 }, +/obj/item/taperoll/science, /turf/simulated/floor/tiled/white, /area/rnd/test_range) "aHx" = ( @@ -20656,6 +20657,7 @@ dir = 5 }, /obj/item/folder/purple, +/obj/item/taperoll/science, /turf/simulated/floor/tiled/dark, /area/outpost/research/hallway) "aQx" = ( @@ -21040,6 +21042,7 @@ /obj/structure/table/standard, /obj/item/reagent_containers/spray/chemsprayer/xenobiology, /obj/item/reagent_containers/spray/chemsprayer/xenobiology, +/obj/item/taperoll/science, /turf/simulated/floor/tiled/white, /area/rnd/xenobiology) "aRA" = ( @@ -21262,6 +21265,7 @@ dir = 1 }, /obj/item/folder/purple, +/obj/item/taperoll/science, /turf/simulated/floor/tiled/dark, /area/outpost/research/hallway) "aSk" = ( @@ -27871,7 +27875,7 @@ /obj/structure/closet/crate, /obj/item/storage/box/lights/coloredmixed, /obj/item/storage/box/lights/mixed, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/item/device/floor_painter, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/airless, @@ -31510,6 +31514,7 @@ /obj/effect/floor_decal/corner_wide/mauve{ dir = 5 }, +/obj/item/taperoll/science, /turf/simulated/floor/tiled/white, /area/rnd/xenobiology/xenoflora) "mZC" = ( @@ -32660,6 +32665,7 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/structure/anomaly_container, /turf/simulated/floor/tiled/dark, /area/outpost/research/anomaly_storage) "pmn" = ( @@ -33967,6 +33973,7 @@ /area/medical/patient_wing_picnic) "rWw" = ( /obj/effect/floor_decal/industrial/outline/yellow, +/obj/structure/anomaly_container, /turf/simulated/floor/tiled/dark, /area/outpost/research/anomaly_storage) "rXB" = ( @@ -37031,6 +37038,10 @@ pixel_x = 1; pixel_y = 4 }, +/obj/item/reagent_containers/food/drinks/pitcher{ + pixel_x = -3; + pixel_y = 2 + }, /turf/simulated/floor/tiled, /area/engineering/break_room) "ydL" = ( diff --git a/maps/aurora/aurora-4_mainlevel.dmm b/maps/aurora/aurora-4_mainlevel.dmm index f2973d59d0b..90c70b71ab0 100644 --- a/maps/aurora/aurora-4_mainlevel.dmm +++ b/maps/aurora/aurora-4_mainlevel.dmm @@ -398,6 +398,9 @@ c_tag = "Security - Forensics Lab Port"; dir = 4 }, +/obj/item/storage/box/folders/blue{ + pixel_y = 15 + }, /turf/simulated/floor/tiled/white, /area/security/forensics_laboratory) "aaV" = ( @@ -460,11 +463,9 @@ "abd" = ( /obj/effect/floor_decal/corner/beige/diagonal, /obj/structure/table/glass, -/obj/item/storage/box/fancy/csi_markers{ - pixel_x = -5 - }, -/obj/item/storage/box/fancy/csi_markers{ - pixel_x = 5 +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 2; + pixel_y = 4 }, /turf/simulated/floor/tiled/white, /area/security/forensics_laboratory) @@ -642,17 +643,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/security_starboard) -"abv" = ( -/obj/effect/floor_decal/corner/beige/diagonal, -/obj/structure/table/glass, -/obj/item/device/reagent_scanner{ - pixel_x = -8 - }, -/obj/item/device/reagent_scanner{ - pixel_x = 8 - }, -/turf/simulated/floor/tiled/white, -/area/security/forensics_laboratory) "abw" = ( /obj/effect/floor_decal/corner/beige/diagonal, /obj/machinery/light, @@ -823,12 +813,19 @@ layer = 5; name = "adjusted reinforced window" }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/simulated/floor/plating, /area/security/forensics_laboratory) "abT" = ( /obj/effect/floor_decal/corner/blue{ dir = 9 }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, /turf/simulated/floor/tiled, /area/security/brig) "abU" = ( @@ -964,6 +961,11 @@ name = "Forensics Desk"; req_access = list(4) }, +/obj/machinery/ringer_button{ + id = "investigation_ringer"; + pixel_x = 5; + pixel_y = 5 + }, /turf/simulated/floor/tiled, /area/security/forensics_laboratory) "acm" = ( @@ -1350,6 +1352,7 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, /area/security/brig) "acR" = ( @@ -1444,13 +1447,10 @@ d2 = 2; icon_state = "1-2" }, -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, /obj/effect/floor_decal/corner/blue{ dir = 9 }, +/obj/structure/disposalpipe/junction, /turf/simulated/floor/tiled, /area/security/brig) "adb" = ( @@ -1515,15 +1515,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/substation/security) -"adf" = ( -/obj/machinery/r_n_d/server/advanced/robotics, -/turf/simulated/floor/bluegrid{ - name = "Server Base"; - nitrogen = 500; - oxygen = 0; - temperature = 80 - }, -/area/server) "adg" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 4; @@ -2183,6 +2174,7 @@ /obj/machinery/light/small{ dir = 8 }, +/obj/machinery/r_n_d/server/advanced/core, /turf/simulated/floor/bluegrid{ name = "Server Base"; nitrogen = 500; @@ -2534,7 +2526,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -2638,6 +2630,15 @@ /obj/effect/floor_decal/corner_wide/paleblue{ dir = 9 }, +/obj/machinery/button/remote/airlock/screamer{ + channel = "Science"; + id = "server_door_lock"; + message = "The Server Room Airlock's ID lock toggle has been used."; + name = "Server Room Control"; + pixel_x = -24; + pixel_y = -24; + specialfunctions = 2 + }, /turf/simulated/floor/tiled/white, /area/rnd/research) "afi" = ( @@ -2894,15 +2895,6 @@ temperature = 278 }, /area/security/investigations_storage) -"afF" = ( -/obj/machinery/r_n_d/server/advanced/core, -/turf/simulated/floor/bluegrid{ - name = "Server Base"; - nitrogen = 500; - oxygen = 0; - temperature = 80 - }, -/area/server) "afG" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 4; @@ -3261,8 +3253,12 @@ "agu" = ( /obj/structure/table/standard, /obj/item/storage/box/bodybags, -/obj/machinery/firealarm/west, /obj/item/device/healthanalyzer, +/obj/machinery/requests_console{ + department = "Autopsy"; + departmentType = 5; + pixel_x = -32 + }, /turf/simulated/floor/tiled{ name = "cooled floor"; temperature = 278 @@ -3987,6 +3983,12 @@ pixel_y = 5 }, /obj/item/pen/red, +/obj/machinery/ringer{ + department = "Security"; + id = "investigation_ringer"; + pixel_x = -30; + req_access = list(1) + }, /turf/simulated/floor/tiled{ name = "cooled floor"; temperature = 278 @@ -5113,6 +5115,7 @@ pixel_y = 9 }, /obj/item/pen, +/obj/item/storage/slide_projector, /turf/simulated/floor/tiled/white, /area/crew_quarters/sleep/research) "aki" = ( @@ -5344,11 +5347,11 @@ /area/engineering/atmos/storage) "akE" = ( /obj/structure/table/standard, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/effect/floor_decal/corner/blue{ dir = 1 }, @@ -7138,6 +7141,10 @@ name = "consular's laptop" }, /obj/structure/table/wood, +/obj/machinery/camera/network/civilian_main{ + c_tag = "Consular Office"; + dir = 8 + }, /turf/simulated/floor/carpet, /area/lawoffice/consular) "aol" = ( @@ -8337,7 +8344,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -10697,6 +10704,9 @@ /obj/effect/floor_decal/industrial/warning/corner{ dir = 1 }, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled, /area/engineering/engine_monitoring) "atV" = ( @@ -14280,6 +14290,10 @@ pixel_x = 10 }, /obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/pitcher{ + pixel_x = -3; + pixel_y = 2 + }, /turf/simulated/floor/carpet, /area/lawoffice) "azU" = ( @@ -14597,6 +14611,7 @@ /obj/effect/floor_decal/industrial/warning/corner{ dir = 8 }, +/obj/machinery/light, /turf/simulated/floor/tiled, /area/engineering/engine_monitoring) "aAt" = ( @@ -20165,13 +20180,13 @@ /area/engineering/engineering_hallway_main) "aIZ" = ( /obj/structure/table/standard, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = -3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 3 }, /obj/machinery/light{ @@ -21663,6 +21678,8 @@ dir = 8 }, /obj/machinery/firealarm/south, +/obj/structure/table/steel, +/obj/item/device/multitool, /turf/simulated/floor/carpet/rubber, /area/server) "aLL" = ( @@ -22348,7 +22365,6 @@ /area/crew_quarters/heads/chief) "aMI" = ( /obj/structure/table/rack, -/obj/item/rig/ce/equipped, /obj/item/clothing/mask/breath, /obj/structure/window/reinforced{ dir = 4 @@ -22357,6 +22373,12 @@ /obj/machinery/light_switch{ pixel_y = 24 }, +/obj/item/clothing/suit/fire/atmos, +/obj/item/clothing/head/hardhat/firefighter/chief, +/obj/item/rig/ce/equipped{ + pixel_x = -6; + pixel_y = 4 + }, /turf/simulated/floor/tiled, /area/crew_quarters/heads/chief) "aMJ" = ( @@ -22556,14 +22578,14 @@ /turf/simulated/floor/tiled/dark, /area/ai_monitored/storage/eva) "aNa" = ( -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 6 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = -3 }, /obj/structure/table/reinforced, @@ -22949,7 +22971,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/window/westleft{ name = "Server Room"; - req_access = list(30) + req_access = null }, /obj/machinery/door/window/eastleft{ name = "Server Room" @@ -23562,6 +23584,9 @@ "aOS" = ( /obj/structure/table/wood, /obj/item/modular_computer/laptop/preset/security/hos, +/obj/item/storage/slide_projector{ + pixel_y = 12 + }, /turf/simulated/floor/carpet, /area/crew_quarters/heads/hos) "aOT" = ( @@ -23833,6 +23858,7 @@ icon_state = "4-8" }, /obj/machinery/door/airlock/glass_command{ + id_tag = "server_door_lock"; name = "Server Room"; req_access = list(30) }, @@ -24273,6 +24299,7 @@ /obj/machinery/light{ dir = 4 }, +/obj/item/storage/slide_projector, /turf/simulated/floor/carpet, /area/crew_quarters/captain) "aPZ" = ( @@ -25426,6 +25453,9 @@ }, /obj/item/folder/yellow, /obj/item/stamp/ce, +/obj/item/storage/slide_projector{ + pixel_y = 12 + }, /turf/simulated/floor/carpet, /area/crew_quarters/heads/chief) "aRV" = ( @@ -26885,7 +26915,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -26993,6 +27023,9 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 }, +/obj/item/storage/slide_projector{ + pixel_y = 16 + }, /turf/simulated/floor/carpet, /area/bridge/meeting_room) "aUD" = ( @@ -28473,6 +28506,9 @@ }, /obj/item/toy/figure/corgi, /obj/item/device/megaphone/command, +/obj/item/storage/slide_projector{ + pixel_y = 12 + }, /turf/simulated/floor/wood, /area/crew_quarters/heads/hop) "aXq" = ( @@ -29773,21 +29809,6 @@ }, /turf/simulated/floor/tiled, /area/hallway/primary/port) -"aZn" = ( -/obj/structure/table/standard, -/obj/item/storage/box/fancy/vials, -/obj/machinery/alarm{ - dir = 8; - pixel_x = 28 - }, -/obj/effect/floor_decal/corner/green{ - dir = 6 - }, -/obj/effect/floor_decal/corner/green{ - dir = 9 - }, -/turf/simulated/floor/tiled, -/area/hydroponics) "aZo" = ( /obj/structure/cable/green{ d1 = 4; @@ -29850,14 +29871,6 @@ }, /turf/simulated/floor/tiled, /area/hallway/primary/central_one) -"aZv" = ( -/obj/machinery/portable_atmospherics/hydroponics, -/obj/machinery/alarm{ - dir = 8; - pixel_x = 28 - }, -/turf/simulated/floor/grass/alt, -/area/hydroponics) "aZw" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 10 @@ -31461,6 +31474,7 @@ /obj/structure/table/wood, /obj/item/folder/blue, /obj/item/stamp/hop, +/obj/item/stamp/denied, /turf/simulated/floor/carpet, /area/crew_quarters/heads/hop) "bcy" = ( @@ -32029,6 +32043,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 }, +/obj/item/auto_cpr, /turf/simulated/floor/tiled/dark, /area/medical/icu) "bdD" = ( @@ -32110,6 +32125,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/medical/exam_room2) "bdL" = ( @@ -32226,6 +32244,10 @@ /obj/machinery/light_switch{ pixel_x = 24 }, +/obj/item/reagent_containers/food/drinks/pitcher{ + pixel_x = -3; + pixel_y = 2 + }, /turf/simulated/floor/tiled, /area/crew_quarters/medbreak) "bdX" = ( @@ -34147,6 +34169,10 @@ dir = 8; layer = 2.9 }, +/obj/item/circuitboard/rdtechprocessor{ + pixel_x = -2; + pixel_y = 2 + }, /obj/item/circuitboard/unary_atmos/heater, /obj/item/circuitboard/unary_atmos/cooler{ pixel_x = 3; @@ -34832,6 +34858,8 @@ /obj/item/stock_parts/matter_bin, /obj/item/stock_parts/capacitor, /obj/item/stock_parts/capacitor, +/obj/item/stock_parts/scanning_module, +/obj/item/stock_parts/scanning_module, /turf/simulated/floor/plating, /area/storage/tech) "biw" = ( @@ -35271,6 +35299,9 @@ d2 = 2; icon_state = "1-2" }, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/medical/exam_room) "bjd" = ( @@ -35415,6 +35446,7 @@ /obj/effect/floor_decal/corner_wide/paleblue/full{ dir = 8 }, +/obj/item/storage/slide_projector, /turf/simulated/floor/tiled/white, /area/crew_quarters/heads/cmo) "bjo" = ( @@ -35697,6 +35729,10 @@ "bjQ" = ( /obj/structure/table/steel, /obj/item/crowbar, +/obj/item/device/robotanalyzer{ + pixel_y = 8 + }, +/obj/item/device/robotanalyzer, /turf/simulated/floor/tiled, /area/assembly/robotics) "bjR" = ( @@ -35856,6 +35892,7 @@ /obj/item/reagent_containers/syringe/antibiotic, /obj/item/reagent_containers/syringe/antibiotic, /obj/machinery/door/firedoor, +/obj/item/storage/pill_bottle/bicaridine, /turf/simulated/floor/tiled/white, /area/medical/medbay) "bkf" = ( @@ -36341,11 +36378,8 @@ /turf/simulated/floor/tiled/dark, /area/rnd/strongroom) "bkN" = ( -/obj/structure/table/steel, -/obj/item/device/robotanalyzer, -/obj/item/device/robotanalyzer{ - pixel_y = 8 - }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/floor_decal/industrial/hatch/grey, /turf/simulated/floor/tiled, /area/assembly/robotics) "bkO" = ( @@ -39297,6 +39331,11 @@ icon_state = "0-2" }, /obj/structure/table/standard, +/obj/item/vitals_monitor, +/obj/item/vitals_monitor{ + pixel_x = 2; + pixel_y = 4 + }, /turf/simulated/floor/tiled/dark, /area/medical/gen_treatment) "bqJ" = ( @@ -39786,6 +39825,7 @@ }, /obj/structure/table/standard, /obj/item/device/mass_spectrometer, +/obj/item/auto_cpr, /turf/simulated/floor/tiled/dark, /area/medical/gen_treatment) "brR" = ( @@ -41193,7 +41233,8 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass_medical{ name = "Custodial Closet"; - req_access = list(66) + req_access = null; + req_one_access = list(26, 66) }, /obj/structure/cable/green{ d1 = 1; @@ -43926,12 +43967,15 @@ /area/medical/surgerywing) "bAn" = ( /obj/machinery/computer/operating, +/obj/machinery/light{ + icon_state = "tube1" + }, /turf/simulated/floor/tiled/white, /area/medical/surgerywing) "bAo" = ( /obj/structure/sink/kitchen{ dir = 8; - name = "Autopsy sink"; + name = "surgical sink"; pixel_x = 20 }, /obj/effect/floor_decal/corner_wide/paleblue{ @@ -44378,6 +44422,9 @@ "bBz" = ( /obj/structure/table/standard, /obj/item/modular_computer/laptop/preset/research/rd, +/obj/item/storage/slide_projector{ + pixel_y = 12 + }, /turf/simulated/floor/carpet/blue, /area/rnd/rdoffice) "bBB" = ( @@ -47041,9 +47088,9 @@ name = "Gardener" }, /obj/structure/cable/green{ - d1 = 2; + d1 = 4; d2 = 8; - icon_state = "2-8" + icon_state = "4-8" }, /turf/simulated/floor/tiled, /area/hydroponics) @@ -47055,6 +47102,11 @@ dir = 1 }, /obj/machinery/firealarm/east, +/obj/structure/cable/green{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, /turf/simulated/floor/tiled, /area/hydroponics) "bHy" = ( @@ -47306,41 +47358,23 @@ }, /turf/simulated/floor/tiled, /area/hydroponics) -"bIk" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/turf/simulated/floor/tiled, -/area/hydroponics) "bIl" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/floor_decal/industrial/outline/yellow, /obj/item/watertank, /obj/structure/cable/green{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 4; - name = "east bump"; - pixel_x = 24 + d1 = 1; + d2 = 2; + icon_state = "1-2" }, /turf/simulated/floor/tiled, /area/hydroponics) "bIm" = ( -/obj/structure/table/standard, -/obj/item/storage/box/pillbottles, /obj/machinery/newscaster{ pixel_y = 32 }, -/obj/item/storage/box/spraybottles, -/obj/effect/floor_decal/corner/green/full{ - dir = 8 - }, -/obj/effect/floor_decal/corner/green, -/turf/simulated/floor/tiled, +/obj/machinery/portable_atmospherics/hydroponics/soil, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bIn" = ( /obj/machinery/requests_console{ @@ -47349,44 +47383,29 @@ name = "Hydroponics Requests Console"; pixel_y = 30 }, -/obj/effect/floor_decal/corner/green{ - dir = 5 - }, -/obj/effect/floor_decal/corner/green{ - dir = 8 - }, -/turf/simulated/floor/tiled, +/obj/machinery/portable_atmospherics/hydroponics/soil, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bIo" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/disposal, /obj/structure/disposalpipe/trunk, -/obj/effect/floor_decal/corner/green{ - dir = 5 - }, -/turf/simulated/floor/tiled, +/obj/machinery/disposal/small/south, +/obj/structure/closet/crate/hydroponics, +/obj/item/bee_smoker, +/obj/item/beehive_assembly, +/obj/item/bee_pack, +/obj/item/bee_net, +/obj/item/honey_frame, +/obj/item/honey_frame, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bIp" = ( -/obj/effect/floor_decal/corner/green{ - dir = 5 - }, -/obj/effect/floor_decal/corner/green, -/turf/simulated/floor/tiled, +/obj/machinery/portable_atmospherics/hydroponics/soil, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bIq" = ( -/obj/machinery/vending/hydroseeds{ - prices = list() - }, /obj/machinery/firealarm/east, -/obj/effect/floor_decal/corner/green/full{ - dir = 1 - }, -/obj/effect/floor_decal/corner/green{ - dir = 8 - }, -/turf/simulated/floor/tiled, +/obj/machinery/portable_atmospherics/hydroponics/soil, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bIr" = ( /obj/machinery/vending/hydronutrients, @@ -47690,39 +47709,19 @@ /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/glass/bucket, -/obj/item/device/radio/intercom{ - dir = 8; - name = "Station Intercom (General)"; - pixel_x = 24 +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, /turf/simulated/floor/tiled, /area/hydroponics) "bJg" = ( -/obj/structure/table/standard, -/obj/item/device/nanoquikpay, -/obj/effect/floor_decal/corner/green{ - dir = 9 - }, -/obj/effect/floor_decal/corner/green{ - dir = 6 - }, -/turf/simulated/floor/tiled, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bJi" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/simulated/floor/tiled, -/area/hydroponics) -"bJj" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/simulated/floor/tiled, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bJm" = ( /obj/structure/curtain, @@ -47986,8 +47985,12 @@ /area/hydroponics) "bJX" = ( /obj/effect/floor_decal/industrial/outline/yellow, -/obj/structure/table/standard, -/obj/item/storage/toolbox/mechanical, +/obj/structure/reagent_dispensers/fueltank, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/tiled, /area/hydroponics) "bJY" = ( @@ -48005,49 +48008,34 @@ /turf/simulated/floor/plating, /area/hydroponics) "bJZ" = ( -/obj/machinery/portable_atmospherics/hydroponics, -/obj/structure/window/reinforced{ - dir = 1 +/obj/structure/largecrate/animal/chick, +/obj/machinery/light{ + dir = 8; + icon_state = "tube1" }, /turf/simulated/floor/grass/alt, /area/hydroponics) "bKa" = ( -/obj/effect/floor_decal/corner/green/full{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/hydroponics) -"bKb" = ( -/obj/machinery/door/window{ - dir = 1; - name = "Hydroponics Backroom"; - req_access = list(35) - }, -/obj/effect/floor_decal/corner/green{ - dir = 5 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/hydroponics) -"bKc" = ( -/obj/effect/floor_decal/corner/green/full{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/floor_decal/spline/fancy/wood{ +/obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/turf/simulated/floor/tiled, +/turf/simulated/floor/grass/alt, +/area/hydroponics) +"bKb" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/grass/alt, +/area/hydroponics) +"bKc" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bKd" = ( /obj/machinery/portable_atmospherics/hydroponics, @@ -48311,11 +48299,13 @@ /turf/simulated/floor/tiled, /area/hydroponics) "bKR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, /turf/simulated/floor/tiled, /area/hydroponics) "bKS" = ( @@ -48326,41 +48316,21 @@ dir = 8; network = list("Service") }, -/turf/simulated/floor/tiled, -/area/hydroponics) -"bKT" = ( -/obj/effect/floor_decal/corner/green{ - dir = 9 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 +/obj/item/storage/toolbox/mechanical, +/obj/item/device/nanoquikpay, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, /turf/simulated/floor/tiled, /area/hydroponics) "bKU" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/hydroponics) -"bKV" = ( -/obj/effect/floor_decal/corner/green{ - dir = 6 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/turf/simulated/floor/tiled, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bKX" = ( /obj/structure/disposalpipe/segment{ @@ -48578,40 +48548,33 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, /area/hydroponics) -"bLC" = ( -/obj/structure/bed/chair/office/dark{ - dir = 8 - }, -/obj/effect/landmark/start{ - name = "Gardener" - }, -/turf/simulated/floor/tiled, -/area/hydroponics) "bLD" = ( /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/light{ dir = 4 }, -/obj/structure/table/standard, +/obj/machinery/honey_extractor{ + density = 1 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/tiled, /area/hydroponics) "bLE" = ( -/obj/machinery/portable_atmospherics/hydroponics, /obj/structure/window/reinforced, +/obj/machinery/portable_atmospherics/hydroponics/soil, /turf/simulated/floor/grass/alt, /area/hydroponics) "bLF" = ( /obj/structure/window/reinforced, -/obj/effect/floor_decal/corner/green/full, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/turf/simulated/floor/tiled, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/machinery/portable_atmospherics/hydroponics/soil, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bLG" = ( -/obj/effect/floor_decal/corner/green{ - dir = 10 - }, /obj/machinery/door/window{ name = "Hydroponics Backroom"; req_access = list(35) @@ -48619,17 +48582,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/hydroponics) -"bLH" = ( -/obj/structure/window/reinforced, -/obj/effect/floor_decal/corner/green/full{ - dir = 4 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/turf/simulated/floor/tiled, +/turf/simulated/floor/grass/alt, /area/hydroponics) "bLJ" = ( /obj/structure/disposalpipe/junction/yjunction{ @@ -48895,6 +48848,16 @@ name = "hydroponics sink"; pixel_x = 20 }, +/obj/item/device/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = 24 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/tiled, /area/hydroponics) "bMj" = ( @@ -49003,7 +48966,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -49305,6 +49268,8 @@ /obj/effect/floor_decal/corner/green{ dir = 6 }, +/obj/item/storage/box/pillbottles, +/obj/item/storage/box/spraybottles, /obj/item/storage/box/fancy/vials, /turf/simulated/floor/tiled, /area/hydroponics) @@ -49480,8 +49445,9 @@ /turf/simulated/floor/tiled, /area/hallway/primary/aft) "bNy" = ( -/obj/machinery/status_display{ - pixel_x = 32 +/obj/machinery/atm{ + pixel_x = 32; + pixel_y = -3 }, /turf/simulated/floor/tiled, /area/hallway/primary/aft) @@ -49533,6 +49499,11 @@ dir = 4; icon_state = "pipe-j2" }, +/obj/machinery/power/apc{ + name = "south bump"; + pixel_y = -24 + }, +/obj/structure/cable/green, /turf/simulated/floor/tiled, /area/hydroponics) "bNH" = ( @@ -49635,7 +49606,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -49938,6 +49909,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, +/obj/machinery/light_switch{ + pixel_y = -28 + }, /turf/simulated/floor/wood, /area/library) "bOH" = ( @@ -50000,9 +49974,8 @@ /area/library) "bOP" = ( /obj/effect/floor_decal/corner/red/diagonal, -/obj/machinery/atm{ - pixel_x = -2; - pixel_y = 28 +/obj/machinery/orderterminal{ + pixel_y = 32 }, /turf/simulated/floor/tiled/white, /area/hallway/primary/aft) @@ -50011,7 +49984,9 @@ /obj/machinery/newscaster{ pixel_y = 30 }, -/obj/item/stool/padded, +/obj/structure/bed/chair/comfy/sofa/left/comfy{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/hallway/primary/aft) "bOR" = ( @@ -50024,7 +49999,9 @@ dir = 1; icon_state = "tube1" }, -/obj/item/stool/padded, +/obj/structure/bed/chair/comfy/sofa/right/comfy{ + dir = 8 + }, /turf/simulated/floor/tiled/white, /area/hallway/primary/aft) "bOT" = ( @@ -51138,12 +51115,10 @@ /obj/machinery/door/firedoor{ dir = 8 }, -/obj/structure/noticeboard{ - desc = "A board for displaying menus."; - name = "Menu Board"; - pixel_y = -25 - }, /obj/item/glass_jar, +/obj/machinery/status_display{ + pixel_y = -32 + }, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "bSn" = ( @@ -51201,6 +51176,7 @@ /obj/item/reagent_containers/glass/rag{ pixel_y = 4 }, +/obj/item/holomenu, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "bSq" = ( @@ -52198,6 +52174,7 @@ /obj/machinery/newscaster{ pixel_x = -32 }, +/obj/item/holomenu, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bUD" = ( @@ -52418,14 +52395,8 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/obj/structure/cable/green{ - d2 = 2; - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - dir = 1; - name = "north bump"; - pixel_y = 24 +/obj/machinery/orderterminal{ + pixel_y = 32 }, /turf/simulated/floor/wood, /area/crew_quarters/bar) @@ -52775,12 +52746,25 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "bVZ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/grey/diagonal, /obj/structure/cable/green{ d1 = 1; d2 = 2; icon_state = "1-2" }, -/turf/simulated/floor/wood, +/obj/machinery/power/apc{ + dir = 8; + name = "west bump"; + pixel_x = -24 + }, +/obj/structure/cable/green{ + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/tiled/white, /area/crew_quarters/bar) "bWa" = ( /turf/simulated/floor/wood, @@ -52873,25 +52857,6 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /turf/simulated/floor/wood, /area/crew_quarters/bar) -"bWn" = ( -/obj/structure/cable/green{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/green{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/wood, -/area/crew_quarters/bar) "bWo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -54129,7 +54094,7 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "bZu" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/bed/chair/comfy/sofa/right/comfy{ dir = 8 }, /turf/simulated/floor/carpet, @@ -58770,21 +58735,14 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "ckM" = ( -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 + d1 = 1; + d2 = 2; + icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/maintenance/cargo) "ckY" = ( @@ -59350,6 +59308,11 @@ }, /turf/simulated/floor/tiled, /area/assembly/chargebay) +"dbJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/chess_piece, +/turf/simulated/floor/marble/dark, +/area/maintenance/cargo) "dcu" = ( /obj/effect/floor_decal/corner/grey/diagonal, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -59394,11 +59357,6 @@ }, /turf/simulated/floor/tiled, /area/rnd/lab) -"dfo" = ( -/obj/random/loot, -/obj/structure/table/rack, -/turf/simulated/floor/airless, -/area/maintenance/cargo) "dgR" = ( /obj/machinery/conveyor{ dir = 8 @@ -59548,6 +59506,10 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled/old_white, /area/maintenance/medbay) +"dwg" = ( +/obj/item/chess_piece/rook, +/turf/simulated/floor/marble/dark, +/area/maintenance/cargo) "dwz" = ( /obj/machinery/photocopier, /obj/machinery/newscaster{ @@ -59709,8 +59671,8 @@ /turf/simulated/floor/tiled/white, /area/medical/pharmacy) "dGy" = ( -/obj/structure/table/stone/marble, /obj/effect/floor_decal/corner/grey/diagonal, +/obj/machinery/appliance/cooker/grill, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "dGU" = ( @@ -59748,10 +59710,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/research_port) -"dKW" = ( -/obj/item/stack/rods, -/turf/simulated/floor/airless, -/area/maintenance/cargo) "dMw" = ( /obj/item/flame/candle{ pixel_x = -16; @@ -59787,9 +59745,8 @@ /turf/simulated/floor/wood, /area/maintenance/bar) "dRX" = ( -/turf/simulated/floor/airless{ - icon_state = "asteroidplating" - }, +/obj/item/chess_piece/king, +/turf/simulated/floor/marble/dark, /area/maintenance/cargo) "dTb" = ( /obj/structure/table/rack, @@ -59832,6 +59789,19 @@ }, /turf/simulated/floor/wood, /area/crew_quarters/bar) +"dXf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plating, +/area/maintenance/cargo) "dXu" = ( /obj/item/flame/candle{ pixel_x = 1; @@ -59841,8 +59811,8 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "dXS" = ( -/obj/structure/lattice, -/turf/unsimulated/floor/asteroid/ash/rocky, +/obj/item/chess_piece/black, +/turf/simulated/floor/marble, /area/maintenance/cargo) "dYN" = ( /obj/machinery/door/firedoor, @@ -60155,8 +60125,8 @@ /turf/simulated/floor/plating, /area/security/forensics_laboratory) "eJy" = ( -/obj/item/stack/rods, -/turf/unsimulated/floor/asteroid/ash/rocky, +/obj/item/chess_piece/black, +/turf/simulated/floor/marble/dark, /area/maintenance/cargo) "eJM" = ( /obj/structure/disposalpipe/segment{ @@ -60241,7 +60211,6 @@ "eNv" = ( /obj/effect/floor_decal/corner/beige/diagonal, /obj/structure/table/glass, -/obj/item/reagent_containers/spray/cleaner, /obj/machinery/newscaster{ pixel_y = 32 }, @@ -60303,10 +60272,6 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/wood, /area/maintenance/vault) -"eSN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/unsimulated/floor/asteroid/ash/rocky, -/area/maintenance/cargo) "eSY" = ( /obj/item/flame/candle{ pixel_y = -10 @@ -60472,6 +60437,12 @@ }, /turf/simulated/floor/plating, /area/maintenance/workshop) +"ffC" = ( +/obj/machinery/light/small/emergency{ + dir = 4 + }, +/turf/simulated/floor/marble, +/area/maintenance/cargo) "ffY" = ( /obj/machinery/power/port_gen/pacman, /turf/simulated/floor/plating, @@ -60493,6 +60464,7 @@ /area/hallway/primary/port) "fiO" = ( /obj/structure/closet/crate/freezer, +/obj/machinery/firealarm/east, /turf/simulated/floor/tiled{ name = "cooled floor"; temperature = 278 @@ -60794,6 +60766,11 @@ dir = 2; icon_state = "pipe-c" }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, /turf/simulated/floor/tiled, /area/hydroponics) "fKx" = ( @@ -61153,6 +61130,12 @@ pixel_y = 5 }, /obj/item/pen, +/obj/item/device/radio/intercom{ + desc = "Talk... listen through this."; + name = "Station Intercom (Brig Radio)"; + pixel_y = 25; + wires = 7 + }, /turf/simulated/floor/tiled{ name = "cooled floor"; temperature = 278 @@ -61172,6 +61155,15 @@ }, /turf/simulated/floor/tiled/asteroid/airless, /area/outpost/mining_main/eva) +"gnE" = ( +/obj/effect/floor_decal/spline/fancy{ + dir = 4 + }, +/obj/machinery/light/small/emergency{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/maintenance/cargo) "goR" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -61613,6 +61605,10 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/maintenance/bar) +"hfc" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/marble/dark, +/area/maintenance/cargo) "hfd" = ( /obj/machinery/atmospherics/unary/vent_pump/high_volume{ dir = 4; @@ -61692,6 +61688,14 @@ /obj/structure/window/reinforced, /turf/simulated/floor/plating, /area/maintenance/atmos_control) +"hmb" = ( +/obj/machinery/computer/operating, +/obj/machinery/light{ + dir = 1; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/white, +/area/medical/surgerywing) "hnM" = ( /obj/structure/disposalpipe/sortjunction{ dir = 8; @@ -61773,6 +61777,13 @@ /obj/random/loot, /turf/simulated/floor/plating, /area/maintenance/engineering) +"hsj" = ( +/obj/effect/floor_decal/corner/red/diagonal, +/obj/structure/bed/chair/comfy/sofa/left/comfy{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/hallway/primary/aft) "htm" = ( /obj/structure/cable{ d1 = 4; @@ -61794,9 +61805,8 @@ /turf/simulated/floor/plating, /area/maintenance/research_port) "hwc" = ( -/obj/structure/closet/crate, -/obj/random/loot, -/turf/simulated/floor/airless, +/obj/item/chess_piece/knight/black, +/turf/simulated/floor/marble/dark, /area/maintenance/cargo) "hwh" = ( /obj/machinery/light{ @@ -61808,6 +61818,11 @@ }, /turf/simulated/floor/carpet/rubber, /area/rnd/misc_lab) +"hwm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/chess_piece/queen, +/turf/simulated/floor/marble, +/area/maintenance/cargo) "hxb" = ( /obj/effect/floor_decal/industrial/warning{ dir = 8 @@ -61962,6 +61977,12 @@ /area/rnd/chemistry) "hIP" = ( /obj/structure/table/standard, +/obj/item/device/radio/intercom{ + desc = "Talk... listen through this."; + name = "Station Intercom (Brig Radio)"; + pixel_x = -28; + wires = 7 + }, /turf/simulated/floor/tiled{ name = "cooled floor"; temperature = 278 @@ -62191,18 +62212,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/maintenance/research_port) -"hYq" = ( -/obj/structure/grille, -/obj/machinery/door/firedoor, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/simulated/floor/plating, -/area/maintenance/cargo) "hYA" = ( /obj/machinery/atmospherics/portables_connector{ dir = 1 @@ -62302,13 +62311,6 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/tiled/white, /area/assembly/robotics_cyborgification) -"ikb" = ( -/obj/item/stack/rods, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/airless{ - icon_state = "asteroidplating" - }, -/area/maintenance/cargo) "ikm" = ( /obj/effect/floor_decal/corner/grey/diagonal, /obj/structure/table/stone/marble, @@ -62380,6 +62382,9 @@ "itx" = ( /obj/effect/floor_decal/corner/beige/diagonal, /obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/security/forensics_laboratory) "ivh" = ( @@ -62653,6 +62658,10 @@ }, /turf/simulated/floor/tiled/old_white, /area/maintenance/research_port) +"jch" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/simulated/floor/grass/alt, +/area/hydroponics) "jck" = ( /obj/machinery/door/airlock/maintenance{ req_access = list(12) @@ -62692,6 +62701,12 @@ /obj/structure/window/reinforced, /turf/simulated/floor/plating, /area/rnd/lab) +"jkh" = ( +/obj/effect/floor_decal/spline/fancy{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/maintenance/cargo) "jkj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -62870,8 +62885,8 @@ /area/maintenance/vault) "jMq" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/turf/simulated/floor/airless, +/obj/item/chess_piece/knight/black, +/turf/simulated/floor/marble, /area/maintenance/cargo) "jOm" = ( /obj/machinery/door/firedoor, @@ -62923,22 +62938,8 @@ /turf/simulated/floor/tiled/old_white, /area/maintenance/medbay) "jXn" = ( -/obj/structure/disposalpipe/segment{ - dir = 1; - icon_state = "pipe-c" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/turf/simulated/floor/plating, +/obj/item/chess_piece/rook/black, +/turf/simulated/floor/marble, /area/maintenance/cargo) "jXv" = ( /obj/machinery/door/firedoor, @@ -63251,11 +63252,16 @@ /turf/simulated/floor/tiled/dark, /area/crew_quarters/medbreak) "kEs" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, /obj/structure/flora/ausbushes/sparsegrass, -/obj/machinery/portable_atmospherics/hydroponics, +/obj/structure/largecrate/animal/goat, +/obj/machinery/alarm{ + dir = 8; + pixel_x = 28 + }, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, /turf/simulated/floor/grass/alt, /area/hydroponics) "kGv" = ( @@ -63341,12 +63347,6 @@ }, /turf/simulated/floor/tiled, /area/hallway/primary/central_one) -"kRF" = ( -/obj/structure/window/reinforced, -/obj/structure/flora/ausbushes/sparsegrass, -/obj/machinery/portable_atmospherics/hydroponics, -/turf/simulated/floor/grass/alt, -/area/hydroponics) "kRK" = ( /obj/structure/cable{ d1 = 4; @@ -63541,10 +63541,6 @@ /turf/simulated/floor/tiled, /area/rnd/lab) "liM" = ( -/obj/item/clothing/mask/gas/clown_hat, -/obj/item/clothing/shoes/clown_shoes, -/obj/item/clothing/under/rank/clown, -/obj/item/storage/backpack/clown, /obj/item/toy/figure/clown, /obj/structure/closet{ icon_closed = "cabinet_closed"; @@ -63617,14 +63613,6 @@ /obj/random/soap, /turf/simulated/floor/tiled/freezer, /area/maintenance/medbay) -"lqh" = ( -/obj/item/material/shard, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/grille/broken, -/turf/simulated/floor/airless, -/area/maintenance/cargo) "lrT" = ( /obj/effect/floor_decal/corner/beige/diagonal, /obj/item/stool/padded, @@ -63738,6 +63726,10 @@ }, /turf/simulated/floor/plating, /area/maintenance/vault) +"lFD" = ( +/obj/item/chess_piece/knight, +/turf/simulated/floor/marble/dark, +/area/maintenance/cargo) "lGd" = ( /obj/effect/floor_decal/corner/grey/diagonal, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -63917,6 +63909,13 @@ }, /turf/simulated/floor/plating, /area/maintenance/medbay) +"maY" = ( +/obj/effect/floor_decal/corner/red/diagonal, +/obj/structure/bed/chair/comfy/sofa/right/comfy{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/hallway/primary/aft) "mbc" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ @@ -64369,15 +64368,11 @@ }, /obj/machinery/ringer_button{ id = "Representative"; + layer = 3.3; name = "Representative ringer button"; pixel_x = -24; pixel_y = 32 }, -/obj/machinery/camera/network/civilian_main{ - c_tag = "Diplomatic Reception"; - network = list("Civilian Main","Rep_Office"); - pixel_x = -10 - }, /turf/simulated/floor/carpet, /area/lawoffice) "mPJ" = ( @@ -64390,6 +64385,9 @@ /obj/structure/sign/flag/nanotrasen/left{ pixel_y = 31 }, +/obj/machinery/camera/network/civilian_main{ + c_tag = "Representative Office" + }, /turf/simulated/floor/carpet/rubber, /area/lawoffice/representative) "mPY" = ( @@ -64544,13 +64542,12 @@ /obj/machinery/light_switch{ pixel_y = -26 }, -/obj/structure/closet/crate, /obj/machinery/light, -/obj/item/folder/sec, -/obj/item/folder/sec, -/obj/item/folder/sec, -/obj/item/folder/sec, -/obj/item/folder/sec, +/obj/structure/table/rack, +/obj/item/storage/briefcase/crimekit, +/obj/item/storage/briefcase/crimekit{ + pixel_y = 16 + }, /turf/simulated/floor/tiled/white, /area/security/forensics_laboratory) "ncB" = ( @@ -64630,9 +64627,7 @@ /area/maintenance/research_port) "njT" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/airless{ - icon_state = "asteroidplating" - }, +/turf/simulated/floor/marble, /area/maintenance/cargo) "nlu" = ( /obj/structure/cable/green{ @@ -64772,6 +64767,12 @@ /obj/effect/floor_decal/corner/blue{ dir = 5 }, +/obj/item/device/radio/intercom{ + desc = "Talk... listen through this."; + name = "Station Intercom (Brig Radio)"; + pixel_y = 25; + wires = 7 + }, /turf/simulated/floor/tiled/dark, /area/security/forensics_office{ name = "Security - Investigations Office" @@ -64878,6 +64879,9 @@ /obj/random/loot, /turf/simulated/floor/tiled/old_white, /area/maintenance/medbay) +"nJZ" = ( +/turf/simulated/floor/marble, +/area/maintenance/cargo) "nKn" = ( /obj/structure/window/reinforced{ dir = 8 @@ -65273,6 +65277,10 @@ }, /turf/simulated/floor/tiled/white, /area/rnd/research) +"otn" = ( +/obj/item/chess_piece/bishop, +/turf/simulated/floor/marble, +/area/maintenance/cargo) "oud" = ( /turf/simulated/wall, /area/maintenance/substation/supply) @@ -65358,14 +65366,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/medbay) -"oAD" = ( -/obj/structure/grille/broken, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/simulated/floor/airless, -/area/maintenance/cargo) "oAO" = ( /obj/machinery/door/firedoor, /obj/structure/cable/green{ @@ -65466,12 +65466,6 @@ "oOw" = ( /obj/effect/floor_decal/corner/beige/diagonal, /obj/structure/table/glass, -/obj/item/device/mass_spectrometer{ - pixel_x = -8 - }, -/obj/item/device/mass_spectrometer{ - pixel_x = 8 - }, /obj/machinery/alarm{ dir = 4; pixel_x = -28 @@ -65485,6 +65479,12 @@ /obj/machinery/light/small{ dir = 1 }, +/obj/machinery/ringer{ + department = "Security"; + id = "investigation_ringer"; + pixel_y = 30; + req_access = list(1) + }, /turf/simulated/floor/tiled{ name = "cooled floor"; temperature = 278 @@ -65545,6 +65545,16 @@ /obj/structure/target_stake, /turf/simulated/floor/plating, /area/maintenance/research_port) +"oUH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/corner/blue{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/security/forensics_laboratory) "oVj" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass_research{ @@ -65702,6 +65712,16 @@ /obj/machinery/door/firedoor, /turf/simulated/floor/plating, /area/maintenance/research_port) +"phk" = ( +/obj/effect/floor_decal/corner/beige/diagonal, +/obj/machinery/ringer{ + department = "Security"; + id = "investigation_ringer"; + pixel_y = -30; + req_access = list(1) + }, +/turf/simulated/floor/tiled/white, +/area/security/forensics_laboratory) "phM" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -66086,6 +66106,13 @@ }, /turf/simulated/floor/plating, /area/maintenance/research_port) +"pLP" = ( +/obj/effect/floor_decal/corner/blue{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/tiled, +/area/security/brig) "pQp" = ( /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 @@ -66196,6 +66223,11 @@ pixel_y = 5 }, /obj/item/storage/box/sharps, +/obj/structure/noticeboard{ + layer = 3.3; + pixel_x = 32; + pixel_y = 2 + }, /turf/simulated/floor/tiled/white, /area/security/forensics_laboratory) "pZF" = ( @@ -66266,6 +66298,15 @@ }, /turf/simulated/floor/plating, /area/maintenance/research_port) +"qkc" = ( +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/security/forensics_laboratory) "qkU" = ( /obj/machinery/light{ dir = 8 @@ -66279,6 +66320,12 @@ /area/security/forensics_office{ name = "Security - Investigations Office" }) +"qlw" = ( +/obj/structure/bed/chair/comfy/sofa/left/comfy{ + dir = 8 + }, +/turf/simulated/floor/carpet, +/area/crew_quarters/bar) "qow" = ( /obj/machinery/button/remote/blast_door{ id = "messhallshutters"; @@ -66357,6 +66404,10 @@ /obj/item/stack/cable_coil/random, /turf/simulated/floor/carpet/rubber, /area/maintenance/workshop) +"qre" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/wall, +/area/maintenance/cargo) "qrt" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass_research{ @@ -66457,6 +66508,10 @@ /obj/structure/grille, /turf/simulated/floor/plating, /area/rnd/misc_lab) +"qxd" = ( +/obj/item/chess_piece, +/turf/simulated/floor/marble, +/area/maintenance/cargo) "qzm" = ( /obj/structure/table/steel, /obj/random/loot, @@ -66480,8 +66535,8 @@ /area/maintenance/workshop) "qCw" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/table/standard, -/turf/simulated/floor/airless, +/obj/item/chess_piece/black, +/turf/simulated/floor/marble, /area/maintenance/cargo) "qCZ" = ( /obj/structure/cable/yellow{ @@ -66518,6 +66573,10 @@ }, /turf/simulated/floor/plating, /area/maintenance/cargo) +"qKU" = ( +/obj/item/chess_piece/knight, +/turf/simulated/floor/marble, +/area/maintenance/cargo) "qKZ" = ( /obj/effect/floor_decal/corner/yellow{ dir = 9 @@ -66756,11 +66815,12 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/table/rack, -/obj/item/storage/briefcase/crimekit{ - pixel_y = 16 +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/coatrack{ + pixel_x = 4 }, -/obj/item/storage/briefcase/crimekit, /turf/simulated/floor/tiled, /area/security/forensics_laboratory) "rbT" = ( @@ -66943,12 +67003,19 @@ /obj/machinery/light{ dir = 4 }, +/obj/machinery/ringer{ + department = "Security"; + id = "investigation_ringer"; + pixel_x = 30; + req_access = list(1) + }, /turf/simulated/floor/tiled/dark, /area/security/forensics_office{ name = "Security - Investigations Office" }) "rsz" = ( -/turf/simulated/floor/airless, +/obj/item/chess_piece/bishop/black, +/turf/simulated/floor/marble, /area/maintenance/cargo) "rsL" = ( /obj/effect/floor_decal/industrial/warning, @@ -66973,16 +67040,12 @@ /turf/simulated/floor/plating, /area/medical/cryo) "rut" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ - name = "Storeroom 3"; - welded = 1 - }, -/obj/item/tape/engineering{ - icon_state = "engineering_door"; - layer = 4 - }, -/turf/simulated/floor/plating, +/obj/item/chess_piece/rook, +/turf/simulated/floor/marble, +/area/maintenance/cargo) +"ruA" = ( +/obj/item/chess_piece/bishop, +/turf/simulated/floor/marble/dark, /area/maintenance/cargo) "ruO" = ( /obj/effect/decal/cleanable/dirt, @@ -67025,6 +67088,10 @@ /obj/structure/cable/green{ icon_state = "4-8" }, +/obj/machinery/camera/network/civilian_main{ + c_tag = "Diplomatic Reception"; + network = list("Civilian Main","Rep_Office") + }, /turf/simulated/floor/carpet, /area/lawoffice) "ryB" = ( @@ -67632,7 +67699,8 @@ "sHd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/airless, +/obj/item/chess_piece, +/turf/simulated/floor/marble, /area/maintenance/cargo) "sHo" = ( /obj/effect/floor_decal/industrial/warning{ @@ -67877,6 +67945,12 @@ pixel_x = 5; pixel_y = 3 }, +/obj/item/device/radio/intercom{ + desc = "Talk... listen through this."; + name = "Station Intercom (Brig Radio)"; + pixel_y = 25; + wires = 7 + }, /turf/simulated/floor/tiled/white, /area/security/forensics_laboratory) "sYI" = ( @@ -67997,14 +68071,19 @@ /turf/simulated/floor/tiled, /area/medical/first_responder) "tjb" = ( -/obj/item/material/shard, -/turf/unsimulated/floor/asteroid/ash/rocky, -/area/mine/unexplored) +/obj/item/chess_piece/queen/black, +/turf/simulated/floor/marble/dark, +/area/maintenance/cargo) "tjF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/red, /obj/machinery/hologram/holopad, /turf/simulated/floor/tiled, /area/engineering/atmos/storage) +"tlL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/chess_piece, +/turf/simulated/floor/marble, +/area/maintenance/cargo) "tlV" = ( /obj/machinery/door/firedoor, /obj/effect/floor_decal/industrial/loading/yellow{ @@ -68363,6 +68442,7 @@ dir = 6 }, /obj/item/book/manual/wiki/security_space_law, +/obj/item/storage/slide_projector, /turf/simulated/floor/tiled/dark, /area/security/forensics_office{ name = "Security - Investigations Office" @@ -68399,6 +68479,11 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled/old, /area/maintenance/research_port) +"tKz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/chess_piece/rook/black, +/turf/simulated/floor/marble/dark, +/area/maintenance/cargo) "tKG" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -68440,7 +68525,7 @@ /turf/simulated/floor/tiled, /area/security/forensics_laboratory) "tPg" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/bed/chair/comfy/sofa/left/comfy{ dir = 4 }, /turf/simulated/floor/carpet, @@ -68793,12 +68878,6 @@ spawn_cartridges = list(/obj/item/reagent_containers/chem_disp_cartridge/coffee,/obj/item/reagent_containers/chem_disp_cartridge/milk,/obj/item/reagent_containers/chem_disp_cartridge/cream,/obj/item/reagent_containers/chem_disp_cartridge/sugar) }, /obj/structure/table/wood, -/obj/machinery/camera/network/civilian_main{ - c_tag = "Diplomatic Reception"; - dir = 8; - network = list("Civilian Main","Rep_Office"); - pixel_y = -22 - }, /turf/simulated/floor/carpet, /area/lawoffice) "ulG" = ( @@ -69143,13 +69222,9 @@ /turf/simulated/floor/tiled, /area/hallway/primary/aft) "uXj" = ( -/obj/structure/grille, -/obj/machinery/door/firedoor, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/door/airlock/maintenance{ + name = "Chess Arena"; + req_access = list(12) }, /turf/simulated/floor/plating, /area/maintenance/cargo) @@ -69419,12 +69494,6 @@ /turf/simulated/wall, /area/assembly/chargebay) "vsB" = ( -/obj/item/device/camera_film, -/obj/item/device/camera{ - desc = "A one use - polaroid camera. 30 photos left."; - name = "detectives camera"; - pictures_left = 30 - }, /obj/structure/closet/secure_closet/investigator, /turf/simulated/floor/lino/grey, /area/security/forensics_office{ @@ -69794,7 +69863,8 @@ }) "vTE" = ( /obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/airless, +/obj/item/chess_piece/black, +/turf/simulated/floor/marble/dark, /area/maintenance/cargo) "vTW" = ( /obj/structure/closet/crate, @@ -69814,6 +69884,10 @@ }, /turf/simulated/floor/carpet, /area/quartermaster/break_room) +"vXj" = ( +/obj/item/chess_piece, +/turf/simulated/floor/marble/dark, +/area/maintenance/cargo) "vXD" = ( /obj/machinery/door/firedoor, /obj/structure/grille, @@ -69961,6 +70035,11 @@ /obj/effect/decal/cleanable/liquid_fuel, /turf/simulated/floor/carpet/rubber, /area/maintenance/workshop) +"whV" = ( +/obj/structure/table/wood/gamblingtable, +/obj/item/storage/slide_projector, +/turf/simulated/floor/lino/grey, +/area/engineering/foyer) "wil" = ( /obj/effect/floor_decal/corner/grey/diagonal, /obj/structure/closet/secure_closet/freezer/kitchen, @@ -70178,17 +70257,7 @@ /turf/simulated/floor/tiled/old_white, /area/maintenance/medbay) "wxx" = ( -/obj/structure/grille, -/obj/machinery/door/firedoor, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, +/obj/effect/map_effect/wingrille_spawn/reinforced/firedoor, /turf/simulated/floor/plating, /area/maintenance/cargo) "wzc" = ( @@ -70221,9 +70290,8 @@ /turf/simulated/floor/tiled/old_white, /area/maintenance/research_port) "wAi" = ( -/obj/structure/table/standard, -/obj/random/tech_supply, -/turf/simulated/floor/airless, +/obj/item/chess_piece/bishop/black, +/turf/simulated/floor/marble/dark, /area/maintenance/cargo) "wAF" = ( /obj/structure/cable{ @@ -70340,10 +70408,6 @@ }, /turf/simulated/floor/wood, /area/crew_quarters/bar) -"wYD" = ( -/obj/structure/girder, -/turf/simulated/floor/airless, -/area/maintenance/cargo) "wZe" = ( /obj/effect/decal/cleanable/dirt, /obj/random/junk, @@ -70449,7 +70513,7 @@ /turf/simulated/floor/plating, /area/maintenance/engineering) "xeb" = ( -/turf/unsimulated/floor/asteroid/ash/rocky, +/turf/simulated/floor/marble/dark, /area/maintenance/cargo) "xfy" = ( /obj/effect/floor_decal/corner/grey/diagonal, @@ -70732,6 +70796,18 @@ /obj/item/storage/box/fancy/vials, /turf/simulated/floor/tiled/white, /area/security/forensics_laboratory) +"xxw" = ( +/obj/structure/bed/chair/office/dark{ + dir = 8 + }, +/obj/effect/landmark/start{ + name = "Gardener" + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/hydroponics) "xxH" = ( /obj/structure/bed/chair{ dir = 4 @@ -70917,17 +70993,8 @@ /turf/simulated/floor/tiled/asteroid/airless, /area/outpost/mining_main/eva) "xLG" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/simulated/floor/airless, +/obj/item/chess_piece/king/black, +/turf/simulated/floor/marble, /area/maintenance/cargo) "xLH" = ( /obj/structure/reagent_dispensers/extinguisher, @@ -71098,7 +71165,13 @@ /obj/structure/table/standard, /obj/item/folder/sec, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/item/device/hand_labeler, +/obj/item/device/hand_labeler{ + pixel_x = 16 + }, +/obj/machinery/alarm{ + pixel_y = 28; + target_temperature = 278 + }, /turf/simulated/floor/tiled{ name = "cooled floor"; temperature = 278 @@ -71194,6 +71267,12 @@ /obj/machinery/door/firedoor, /turf/simulated/floor/plating, /area/maintenance/vault) +"ymb" = ( +/obj/structure/bed/chair/comfy/sofa/right/comfy{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/crew_quarters/bar) (1,1,1) = {" aaa @@ -89105,7 +89184,7 @@ bbs bbs bbs bbs -aox +bbs aox aaa aab @@ -89361,9 +89440,9 @@ bcY bcY bcY bcY +aKU bbs aox -aox aaa aab aaa @@ -89618,7 +89697,7 @@ bbs bbs bbs bcY -bbs +bFT bbs aox aab @@ -89875,7 +89954,7 @@ bPL bSc bPt bcY -bFT +bqh bbs aab aab @@ -90132,16 +90211,16 @@ bRo bSd bbs bcY -bqh bbs -aab -aab -aab -aab -tjb -aaa -aaa -aaa +cbQ +cbQ +wxx +wxx +wxx +cbQ +cbQ +cbQ +cbQ aaa aaa aaa @@ -90389,16 +90468,16 @@ bcY bSe bbs bcY -aKU +bbs +jkh +jkh +jkh +jkh +gnE +jkh +jkh +jkh cbQ -xLG -lqh -dKW -oAD -cbQ -aaa -aaa -aox aox aox aox @@ -90608,9 +90687,9 @@ bnx boX bqk brr -adf +aes aer -afF +aes bvS bwP byt @@ -90647,15 +90726,15 @@ oUD bbs bcY bbs +jXn +vTE +nJZ +hfc +njT +xeb +qxd +dwg cbQ -vTE -rsz -vTE -vTE -cbQ -aox -aox -aox aox aox aox @@ -90906,12 +90985,12 @@ bcY bbs hwc dXS -rsz -rsz -dXS -cbQ -cbQ -cbQ +xeb +nJZ +xeb +nJZ +vXj +qKU cbQ cbQ cbQ @@ -91096,7 +91175,7 @@ aAF aCc aDU aFL -oKJ +whV oKJ aLc aMS @@ -91162,14 +91241,14 @@ bbs bcY bbs rsz -rsz -dXS +eJy +nJZ xeb -ikb -cbQ -vTE -rsz njT +xeb +tlL +ruA +qre cbQ ciI cjd @@ -91418,15 +91497,15 @@ bbs bFT bcY iWs -rsz -rsz +tjb +dXS xeb njT -dXS -rsz -rsz -njT -njT +xeb +nJZ +vXj +hwm +qre cbQ iPS ohF @@ -91675,15 +91754,15 @@ bbs wmQ bcY bBv -rsz +xLG eJy +nJZ +hfc +nJZ xeb -njT -rsz -wYD -rsz +qxd dRX -rsz +cbQ cbQ sPj drh @@ -91933,14 +92012,14 @@ hOu dhL txe wAi -rsz dXS -rsz -vTE +xeb +nJZ +hfc +nJZ +dbJ +otn cbQ -vTE -rsz -rsz cbQ dgR mbS @@ -92190,14 +92269,14 @@ bcY ovG bbs jMq -eSN -rsz -xeb -hwc -cbQ -sHd -rsz vTE +nJZ +xeb +nJZ +xeb +sHd +lFD +qre eiB wQC drh @@ -92446,13 +92525,13 @@ bbs bbs bVi bbs -jMq +tKz qCw -rsz -rsz -dfo -cbQ -cbQ +xeb +ffC +xeb +nJZ +vXj rut cbQ cbQ @@ -92706,14 +92785,14 @@ cbQ cbQ wxx uXj -hYq +wxx cbQ cbQ -eJM -bWy -bWy -bWf -jXn +cbQ +cbQ +cbQ +cdX +cdX cdX cdR cbQ @@ -92966,10 +93045,10 @@ bWy fwl bWy pgz -dde -cdX -drh -cbQ +ckM +ckM +dXf +ckM ckM bWy bWy @@ -100057,7 +100136,7 @@ srX xxd aaU oOw -abv +vhY abP afe nmV @@ -100142,7 +100221,7 @@ vIq dEG bGr bOQ -bPA +maY bOT bPA bQW @@ -100423,7 +100502,7 @@ bWL bVX bWP tPg -tPg +ymb bSM bNO cbh @@ -100572,7 +100651,7 @@ xcZ xBx abb abx -xBx +phk afe abQ acI @@ -100656,7 +100735,7 @@ bMM vIq bJb bOS -bPA +hsj bOT bQV mya @@ -100926,8 +101005,8 @@ bUW bSM bSM bVf -bVZ -bWn +bWa +bWo bZs dMw dWO @@ -101194,7 +101273,7 @@ wVv wVv bYZ bZu -bZu +qlw bSM caN cbj @@ -101708,7 +101787,7 @@ sEV sEV bYZ tPg -tPg +ymb bSM caP cbi @@ -101931,11 +102010,11 @@ aYn bFt bGt bHv -bIk bJe bJe bJe -bLC +xxw +bJe bJe bMP bNF @@ -102114,7 +102193,7 @@ tsx srX dob abB -abB +qkc acj ltW acN @@ -102371,7 +102450,7 @@ aaJ srX abf abC -tOQ +oUH ack tOQ acO @@ -102446,11 +102525,11 @@ bFv bGr bGr bGr -bGr bJY bJR bNz bGr +bGr bJe bNH bOt @@ -102479,7 +102558,7 @@ bWa bWa bYZ bZu -bZu +qlw bSM caR cbl @@ -102705,7 +102784,7 @@ bGr bIm bJg bJZ -sNw +jch bLE bMk bLx @@ -102886,8 +102965,8 @@ aaV abh abE abT -abT -abT +pLP +pLP acQ ada adu @@ -102960,9 +103039,9 @@ bFx bGw bBP bIn -rWM +jch bKa -bKT +bJg bLF ays rWM @@ -102993,7 +103072,7 @@ eSY dmg bYZ tPg -tPg +ymb bSM caS bEK @@ -103474,10 +103553,10 @@ bFz bGy bBP bIp -bJj +jch bKc -bKV -bLH +bJg +bLE bMn bMS baD @@ -103731,10 +103810,10 @@ bFA bGz bBP bIq -aZn +bJg kEs -aZv -kRF +bJg +bLF bMo bMT bNM @@ -103764,7 +103843,7 @@ bWS bWS bZb bZu -bZu +qlw bSM bPH bGC @@ -104008,7 +104087,7 @@ bkY bTz bUg bUI -bUI +bVZ bVC bTz bWr @@ -108353,7 +108432,7 @@ bCb bCc guf bvz -bAn +hmb bzl bxT acS diff --git a/maps/aurora/aurora-5_interstitial.dmm b/maps/aurora/aurora-5_interstitial.dmm index 1c91c44b0b2..3314aef8249 100644 --- a/maps/aurora/aurora-5_interstitial.dmm +++ b/maps/aurora/aurora-5_interstitial.dmm @@ -2100,7 +2100,14 @@ "eG" = ( /obj/structure/table/standard, /obj/effect/floor_decal/corner/grey/diagonal, -/obj/item/storage/box/cups, +/obj/item/storage/box/drinkingglasses{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/pitcher{ + pixel_x = -3; + pixel_y = 2 + }, /turf/simulated/floor/tiled/white, /area/security/break_room) "eH" = ( @@ -2432,7 +2439,7 @@ /turf/simulated/floor/plating, /area/security/training_theoretical) "fA" = ( -/obj/structure/banner, +/obj/structure/banner/scc, /turf/simulated/floor/wood, /area/security/training_theoretical) "fB" = ( @@ -2442,16 +2449,7 @@ }, /turf/simulated/floor/wood, /area/security/training_theoretical) -"fC" = ( -/obj/structure/sign/double/map/left{ - pixel_y = 32 - }, -/turf/simulated/floor/wood, -/area/security/training_theoretical) "fD" = ( -/obj/structure/sign/double/map/right{ - pixel_y = 32 - }, /obj/effect/landmark/start{ name = "Warden" }, @@ -2472,9 +2470,8 @@ /turf/simulated/floor/plating, /area/security/training_theoretical) "fF" = ( -/obj/structure/bed/chair/comfy/sofa/left{ - dir = 4; - icon_state = "sofaend_left_preview" +/obj/structure/bed/chair/comfy/sofa/left/comfy{ + dir = 4 }, /turf/simulated/floor/wood, /area/security/break_room) @@ -2515,6 +2512,9 @@ "fX" = ( /obj/structure/table/wood, /obj/item/folder/sec, +/obj/item/storage/slide_projector{ + pixel_x = -16 + }, /turf/simulated/floor/wood, /area/security/training_theoretical) "fY" = ( @@ -2541,25 +2541,22 @@ /turf/simulated/floor/plating, /area/security/training_theoretical) "gb" = ( -/obj/structure/bed/chair/comfy/sofa/corner{ - dir = 4; - icon_state = "sofacorner_preview" +/obj/structure/bed/chair/comfy/sofa/corner/comfy{ + dir = 4 }, /turf/simulated/floor/wood, /area/security/break_room) "gc" = ( -/obj/structure/bed/chair/comfy/sofa{ - dir = 1; - icon_state = "sofamiddle_preview" +/obj/structure/bed/chair/comfy/sofa/comfy{ + dir = 1 }, /turf/simulated/floor/wood, /area/security/break_room) "gd" = ( -/obj/structure/bed/chair/comfy/sofa/left{ - dir = 1; - icon_state = "sofaend_left_preview" - }, /obj/machinery/light, +/obj/structure/bed/chair/comfy/sofa/left/comfy{ + dir = 1 + }, /turf/simulated/floor/wood, /area/security/break_room) "ge" = ( @@ -5187,7 +5184,7 @@ /obj/effect/decal/cleanable/dirt, /obj/item/storage/box/lights/coloredmixed, /obj/item/storage/box/lights/mixed, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/item/device/floor_painter, /obj/structure/closet/crate, /turf/simulated/floor/airless, @@ -6573,7 +6570,7 @@ }, /area/mine/unexplored) "wd" = ( -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/structure/table/rack{ dir = 1 }, @@ -9185,7 +9182,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -44847,7 +44844,7 @@ eJ eW fh rp -fC +fZ fY gq gH diff --git a/maps/aurora/aurora-6_surface.dmm b/maps/aurora/aurora-6_surface.dmm index 9445a09064e..d63b5f375f5 100644 --- a/maps/aurora/aurora-6_surface.dmm +++ b/maps/aurora/aurora-6_surface.dmm @@ -5284,7 +5284,7 @@ }, /obj/item/airbubble, /obj/item/airbubble, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/effect/floor_decal/industrial/outline/yellow, /obj/item/device/flashlight/flare, /obj/item/device/flashlight/flare, @@ -6715,14 +6715,15 @@ pixel_y = 5 }, /obj/structure/table/standard, -/obj/machinery/light{ - dir = 1 - }, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 }, /obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/machinery/light{ + dir = 1; + icon_state = "tube1" + }, /turf/simulated/floor/wood, /area/sconference_room) "gec" = ( @@ -6952,10 +6953,12 @@ /turf/simulated/floor/plating, /area/tcommsat/entrance) "gqn" = ( -/obj/machinery/light, /obj/structure/flora/pottedplant{ icon_state = "plant-33" }, +/obj/machinery/light{ + icon_state = "tube1" + }, /turf/simulated/floor/wood, /area/sconference_room) "gqB" = ( @@ -9041,7 +9044,9 @@ /obj/machinery/chemical_dispenser/coffee/full{ spawn_cartridges = list(/obj/item/reagent_containers/chem_disp_cartridge/coffee,/obj/item/reagent_containers/chem_disp_cartridge/milk,/obj/item/reagent_containers/chem_disp_cartridge/cream,/obj/item/reagent_containers/chem_disp_cartridge/sugar) }, -/obj/machinery/light, +/obj/machinery/light{ + icon_state = "tube1" + }, /turf/simulated/floor/wood, /area/sconference_room) "icV" = ( @@ -9361,6 +9366,9 @@ /obj/random/seed, /obj/random/seed, /obj/random/seed, +/obj/item/wirecutters/clippers, +/obj/item/wirecutters/clippers, +/obj/item/wirecutters/clippers, /turf/simulated/floor/wood, /area/hydroponics/garden) "ioe" = ( @@ -11797,7 +11805,7 @@ /turf/simulated/floor/plating, /area/maintenance/arrivals) "kEY" = ( -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -14274,6 +14282,10 @@ /obj/machinery/light_switch{ pixel_x = -26 }, +/obj/item/reagent_containers/food/drinks/pitcher{ + pixel_x = -3; + pixel_y = 2 + }, /turf/simulated/floor/wood, /area/sconference_room) "mQv" = ( @@ -17172,9 +17184,6 @@ /obj/machinery/camera/network/civilian_surface{ c_tag = "Surface - Conference Room" }, -/obj/machinery/light{ - dir = 1 - }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -17186,6 +17195,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/machinery/light{ + dir = 1; + icon_state = "tube1" + }, /turf/simulated/floor/wood, /area/sconference_room) "prz" = ( @@ -26100,7 +26113,9 @@ /obj/structure/flora/pottedplant{ icon_state = "plant-27" }, -/obj/machinery/light, +/obj/machinery/light{ + icon_state = "tube1" + }, /turf/simulated/floor/wood, /area/sconference_room) "wXr" = ( diff --git a/maps/aurora/code/aurora.dm b/maps/aurora/code/aurora.dm index ebcf922d0d6..03b97166a8b 100644 --- a/maps/aurora/code/aurora.dm +++ b/maps/aurora/code/aurora.dm @@ -7,7 +7,7 @@ it is under the joint administration of the Republic of Biesel and the trans-stellar corporate conglomerate NanoTrasen." path = "aurora" - lobby_icons = list('icons/misc/titlescreens/aurora/humans.dmi', 'icons/misc/titlescreens/aurora/synthetics.dmi', 'icons/misc/titlescreens/aurora/king_of_the_world.dmi', 'icons/misc/titlescreens/aurora/tajara.dmi') + lobby_icons = list('icons/misc/titlescreens/aurora/nss_aurora.dmi', 'icons/misc/titlescreens/aurora/synthetics.dmi', 'icons/misc/titlescreens/aurora/tajara.dmi') lobby_transitions = 10 SECONDS station_levels = list(2, 3, 4, 5, 6, 7) @@ -35,7 +35,6 @@ boss_short = "CentCom" company_name = "NanoTrasen" company_short = "NT" - system_name = "Tau Ceti" command_spawn_enabled = TRUE command_spawn_message = "Welcome to the Odin! Simply proceed down and to the right to board the shuttle to your workplace!" diff --git a/maps/exodus/code/exodus.dm b/maps/exodus/code/exodus.dm index cf63b8789ad..0ab1cada147 100644 --- a/maps/exodus/code/exodus.dm +++ b/maps/exodus/code/exodus.dm @@ -15,7 +15,6 @@ boss_short = "CentCom" company_name = "NanoTrasen" company_short = "NT" - system_name = "Tau Ceti" station_networks = list( NETWORK_CIVILIAN_EAST, diff --git a/maps/exodus/exodus-1_station.dmm b/maps/exodus/exodus-1_station.dmm index 04502f6a902..2528d394d55 100644 --- a/maps/exodus/exodus-1_station.dmm +++ b/maps/exodus/exodus-1_station.dmm @@ -4364,7 +4364,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -49332,7 +49332,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -59482,11 +59482,11 @@ /turf/simulated/wall/r_wall, /area/engineering/engine_eva) "ciR" = ( -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/machinery/power/apc{ dir = 8; name = "west bump"; @@ -60017,14 +60017,14 @@ dir = 1; pixel_y = -22 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 6 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = -3 }, /obj/structure/table/reinforced/steel, @@ -69972,7 +69972,7 @@ /obj/structure/table/rack{ dir = 1 }, -/obj/item/clothing/suit/fire/firefighter, +/obj/item/clothing/suit/fire, /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/item/extinguisher, @@ -76853,14 +76853,14 @@ /turf/simulated/floor/tiled, /area/hallway/secondary/exit) "xJl" = ( -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 6 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = -3 }, /obj/structure/table/reinforced, diff --git a/maps/exodus/exodus-2_centcomm.dmm b/maps/exodus/exodus-2_centcomm.dmm index e635afc730d..e752bf0c8b5 100644 --- a/maps/exodus/exodus-2_centcomm.dmm +++ b/maps/exodus/exodus-2_centcomm.dmm @@ -5313,19 +5313,19 @@ /obj/item/stack/material/glass/reinforced{ amount = 50 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, @@ -9530,13 +9530,6 @@ icon_state = "wood" }, /area/antag/wizard) -"aKf" = ( -/obj/machinery/vending/magivend, -/turf/unsimulated/floor{ - dir = 8; - icon_state = "wood" - }, -/area/antag/wizard) "aKg" = ( /obj/structure/simple_door/wood{ icon_state = "wood" @@ -14881,7 +14874,7 @@ "aWM" = ( /obj/machinery/door/airlock/centcom{ name = "Teleporter Bay"; - req_access = list(107) + req_access = list(106) }, /turf/unsimulated/floor{ icon_state = "delivery" @@ -20754,19 +20747,19 @@ /obj/item/stack/material/glass/reinforced{ amount = 50 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/briefcase/inflatable{ +/obj/item/storage/bag/inflatable{ pixel_x = 3; pixel_y = 3 }, @@ -27533,7 +27526,7 @@ aJJ aJG aJV aJX -aKf +aJG aKi aJV aJG diff --git a/maps/exodus/exodus-5_asteroid.dmm b/maps/exodus/exodus-5_asteroid.dmm index 5e13e357c82..0e932484cd6 100644 --- a/maps/exodus/exodus-5_asteroid.dmm +++ b/maps/exodus/exodus-5_asteroid.dmm @@ -9403,7 +9403,7 @@ /obj/item/clothing/suit/space/void/engineering, /obj/item/clothing/shoes/magboots, /obj/item/clothing/gloves/yellow, -/obj/item/storage/briefcase/inflatable, +/obj/item/storage/bag/inflatable, /obj/machinery/camera/network/engineering_outpost{ c_tag = "Engineering Outpost Storage"; dir = 1 diff --git a/maps/runtime/code/runtime.dm b/maps/runtime/code/runtime.dm index 89a5ad0e6c9..4e53c380e1c 100644 --- a/maps/runtime/code/runtime.dm +++ b/maps/runtime/code/runtime.dm @@ -18,7 +18,8 @@ boss_short = "Coders" company_name = "BanoTarsen" company_short = "BT" - system_name = "runtime.dm" + + use_overmap = TRUE station_networks = list( NETWORK_CIVILIAN_MAIN, diff --git a/maps/runtime/runtime-1.dmm b/maps/runtime/runtime-1.dmm index 86db23b067b..a9394df929b 100644 --- a/maps/runtime/runtime-1.dmm +++ b/maps/runtime/runtime-1.dmm @@ -645,7 +645,7 @@ /turf/simulated/floor/tiled, /area/bridge) "bE" = ( -/obj/structure/table/standard, +/obj/machinery/computer/ship/sensors, /turf/simulated/floor/tiled, /area/bridge) "bF" = ( @@ -1505,6 +1505,12 @@ /obj/machinery/computer/security, /turf/simulated/floor/tiled, /area/bridge) +"nB" = ( +/obj/machinery/atmospherics/binary/pump/high_power/on{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/storage/primary) "ob" = ( /obj/machinery/light{ brightness_range = 16; @@ -1518,6 +1524,15 @@ }, /turf/simulated/floor/plating, /area/maintenance/maintcentral) +"pv" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/overmap/visitable/ship/runtime, +/turf/simulated/floor/tiled, +/area/bridge) "pM" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -1546,6 +1561,12 @@ /obj/machinery/hologram/holopad, /turf/simulated/floor/tiled, /area/bridge) +"uA" = ( +/obj/machinery/atmospherics/pipe/tank/phoron{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/storage/primary) "uI" = ( /obj/effect/floor_decal/corner/blue{ dir = 1 @@ -1555,6 +1576,15 @@ }, /turf/simulated/floor/tiled, /area/hallway/secondary/entry) +"vm" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/template_noop, +/area/engineering) "wk" = ( /obj/effect/floor_decal/corner/blue{ dir = 10 @@ -1562,6 +1592,16 @@ /obj/item/modular_computer/console/preset/command, /turf/simulated/floor/tiled, /area/bridge) +"xb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/storage/primary) +"xv" = ( +/obj/machinery/atmospherics/pipe/manifold4w/hidden, +/turf/simulated/floor/plating, +/area/storage/primary) "yC" = ( /obj/structure/lattice, /obj/machinery/power/terminal{ @@ -1591,6 +1631,11 @@ /obj/machinery/door/airlock/glass, /turf/simulated/floor/plating, /area/storage/primary) +"ES" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/shipsensors, +/turf/template_noop, +/area/engineering) "FZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/recharge_station, @@ -1632,6 +1677,14 @@ }, /turf/simulated/floor/tiled, /area/construction) +"In" = ( +/obj/machinery/computer/ship/helm, +/turf/simulated/floor/tiled, +/area/bridge) +"IY" = ( +/obj/machinery/computer/ship/engines, +/turf/simulated/floor/plating, +/area/storage/primary) "Kz" = ( /obj/machinery/atmospherics/pipe/manifold/visible/blue{ dir = 4 @@ -1658,6 +1711,16 @@ }, /turf/simulated/floor/plating, /area/maintenance/maintcentral) +"QV" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/floor/plating, +/area/storage/primary) +"Ro" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10 + }, +/turf/simulated/floor/plating, +/area/storage/primary) "RL" = ( /obj/effect/floor_decal/corner/blue{ dir = 10 @@ -1674,6 +1737,12 @@ /obj/machinery/computer/station_alert/all, /turf/simulated/floor/tiled, /area/bridge) +"TD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/floor/plating, +/area/storage/primary) "TP" = ( /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -1709,6 +1778,16 @@ /obj/item/modular_computer/console/preset/command/captain, /turf/simulated/floor/tiled, /area/bridge) +"YR" = ( +/obj/machinery/atmospherics/unary/engine{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/storage/primary) +"ZE" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/engineering) (1,1,1) = {" aa @@ -2833,10 +2912,10 @@ dx cK ae ac -aa -ab -aa -aa +cP +cP +cP +cP aa aa aa @@ -2864,8 +2943,8 @@ aN aZ ab bs -bE -cb +In +pv mn br cA @@ -2887,10 +2966,10 @@ dx cK ae ac -aa -ab -aa -aa +dc +TD +uA +cP aa aa aa @@ -2941,10 +3020,10 @@ dx cK ae ac -aa -ab -aa -aa +TD +xv +uA +cP aa aa aa @@ -2967,10 +3046,10 @@ ad aa aa ab -aA +vm +ZE +ZE ab -aa -aa bs bG cb @@ -2995,10 +3074,10 @@ dx cK ae ac -aa -ab -aa -aa +xb +Ro +uA +cP aa aa aa @@ -3023,8 +3102,8 @@ aa ah aB ah -aa -aa +ZE +ab bs bH cb @@ -3049,10 +3128,10 @@ dy cK ae ac -aa -ab -aa -aa +xb +cP +cP +cP aa aa aa @@ -3077,8 +3156,8 @@ aa ah kM ah -aa -aa +ES +ab br bI cc @@ -3103,9 +3182,9 @@ cP cP ae ac -aa -ab -aa +nB +TD +YR aa aa aa @@ -3154,12 +3233,12 @@ dc dc dg dc +dc +dc +dc +Ro +QV cP -ae -ac -aa -ab -aa aa aa aa @@ -3211,9 +3290,9 @@ dc cP ae ac -aa -ab -aa +IY +Ro +YR aa aa aa @@ -3265,9 +3344,9 @@ cZ cP ae ac -aa -ab -aa +cP +cP +cP aa aa aa diff --git a/maps/runtime/runtime-2.dmm b/maps/runtime/runtime-2.dmm index a9f50c8785e..fab75070d8b 100644 --- a/maps/runtime/runtime-2.dmm +++ b/maps/runtime/runtime-2.dmm @@ -39,8 +39,8 @@ "cB" = ( /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 8 + dir = 8; + must_start_working = 1 }, /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -404,8 +404,8 @@ "sK" = ( /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 4 + dir = 4; + must_start_working = 1 }, /obj/structure/cable/cyan{ d1 = 1; @@ -699,8 +699,8 @@ "Dd" = ( /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 1 + dir = 1; + must_start_working = 1 }, /turf/simulated/floor/tiled{ name = "cooled floor"; @@ -726,8 +726,8 @@ }, /obj/machinery/light/small{ brightness_range = 16; - must_start_working = 1; - dir = 4 + dir = 4; + must_start_working = 1 }, /turf/simulated/floor/tiled{ name = "cooled floor"; @@ -740,8 +740,8 @@ "DR" = ( /obj/machinery/light/small{ brightness_range = 16; - must_start_working = 1; - dir = 4 + dir = 4; + must_start_working = 1 }, /obj/machinery/camera/network/command{ c_tag = "Telecomms Control Room"; @@ -790,8 +790,8 @@ /obj/machinery/telecomms/server/presets/engineering, /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 1 + dir = 1; + must_start_working = 1 }, /turf/simulated/floor/bluegrid{ name = "cooled mainframe floor"; @@ -840,8 +840,8 @@ "Jd" = ( /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 8 + dir = 8; + must_start_working = 1 }, /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -971,8 +971,8 @@ /obj/machinery/telecomms/bus/preset_four, /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 1 + dir = 1; + must_start_working = 1 }, /turf/simulated/floor/bluegrid{ name = "cooled mainframe floor"; @@ -998,8 +998,8 @@ "Pl" = ( /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 4 + dir = 4; + must_start_working = 1 }, /obj/effect/floor_decal/industrial/warning{ dir = 8 @@ -1009,8 +1009,8 @@ "Pv" = ( /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 8 + dir = 8; + must_start_working = 1 }, /obj/machinery/status_display{ layer = 4; @@ -1137,6 +1137,12 @@ temperature = 278 }, /area/turret_protected/ai_upload_foyer) +"UT" = ( +/obj/effect/landmark{ + name = "skrell_entry" + }, +/turf/simulated/floor/tiled, +/area/construction/Storage) "Vd" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -1149,8 +1155,8 @@ "VK" = ( /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 8 + dir = 8; + must_start_working = 1 }, /turf/simulated/floor/tiled{ name = "cooled floor"; @@ -1208,8 +1214,8 @@ }, /obj/machinery/light{ brightness_range = 16; - must_start_working = 1; - dir = 4 + dir = 4; + must_start_working = 1 }, /obj/structure/closet/crate/secure/aimodules, /turf/simulated/floor/tiled{ @@ -3447,7 +3453,7 @@ hD Ex aO aO -aO +UT aO aO Ex diff --git a/maps/runtime/runtime_overmap.dm b/maps/runtime/runtime_overmap.dm new file mode 100644 index 00000000000..b89be279f1a --- /dev/null +++ b/maps/runtime/runtime_overmap.dm @@ -0,0 +1,6 @@ +/obj/effect/overmap/visitable/ship/runtime + name = "NSS Runtime" + desc = "A large cube-shaped station, a penal colony of sorts for the likes of video game developers." + vessel_mass = 100000 + burn_delay = 2 SECONDS + base = TRUE \ No newline at end of file diff --git a/maps/templates/distress/distress_equipment.dm b/maps/templates/distress/distress_equipment.dm index dcd86b80797..f53e72fb39c 100644 --- a/maps/templates/distress/distress_equipment.dm +++ b/maps/templates/distress/distress_equipment.dm @@ -4,4 +4,8 @@ /datum/map_template/distress_kataphract name = "kataphract distress equipment" - mappath = 'maps/templates/distress/kataphracts.dmm' \ No newline at end of file + mappath = 'maps/templates/distress/kataphracts.dmm' + +/datum/map_template/distress_freelancers + name = "freelancer distress equipment" + mappath = 'maps/templates/distress/freelancers.dmm' \ No newline at end of file diff --git a/maps/templates/distress/freelancers.dmm b/maps/templates/distress/freelancers.dmm new file mode 100644 index 00000000000..403582db41b --- /dev/null +++ b/maps/templates/distress/freelancers.dmm @@ -0,0 +1,121 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/turf/unsimulated/floor{ + dir = 5; + icon_state = "vault" + }, +/area/centcom/distress_prep) +"d" = ( +/obj/structure/table/rack, +/obj/random/weapon_and_ammo{ + chosen_rarity = Common + }, +/turf/unsimulated/floor{ + dir = 5; + icon_state = "vault" + }, +/area/centcom/distress_prep) +"r" = ( +/obj/structure/table/rack, +/obj/random/weapon_and_ammo{ + chosen_rarity = Rare + }, +/turf/unsimulated/floor{ + dir = 5; + icon_state = "vault" + }, +/area/centcom/distress_prep) +"E" = ( +/obj/structure/table/rack, +/obj/item/clothing/accessory/holster/thigh, +/obj/item/clothing/accessory/holster/thigh, +/obj/item/clothing/accessory/holster/thigh, +/obj/item/clothing/accessory/holster/thigh, +/obj/item/clothing/accessory/holster/thigh, +/obj/item/clothing/accessory/storage/webbingharness{ + slots = 5 + }, +/obj/item/clothing/accessory/storage/webbingharness{ + slots = 5 + }, +/obj/item/clothing/accessory/storage/webbingharness/pouches/ert, +/obj/item/clothing/accessory/storage/black_vest, +/obj/item/clothing/accessory/storage/black_vest, +/obj/item/clothing/accessory/storage/black_vest, +/obj/item/clothing/accessory/storage/black_vest, +/turf/unsimulated/floor{ + dir = 5; + icon_state = "vault" + }, +/area/centcom/distress_prep) +"Y" = ( +/obj/structure/table/wood, +/obj/item/coin/gold{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/item/coin/gold{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/item/storage/box/fancy/cigarettes/cigar{ + pixel_x = -6; + pixel_y = -1 + }, +/obj/item/storage/box/fancy/cigarettes/cigar{ + pixel_x = -1; + pixel_y = -1 + }, +/obj/item/flame/lighter/zippo/gold{ + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/flame/lighter/zippo/gold{ + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/flame/lighter/zippo/royal{ + pixel_x = 7 + }, +/obj/item/flame/lighter/zippo/black{ + pixel_x = 7; + pixel_y = -7 + }, +/obj/item/flame/lighter/zippo/black{ + pixel_x = 7; + pixel_y = -7 + }, +/obj/item/lipstick/random{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/random/spacecash{ + pixel_x = -2; + pixel_y = -9 + }, +/turf/unsimulated/floor{ + dir = 5; + icon_state = "vault" + }, +/area/centcom/distress_prep) + +(1,1,1) = {" +b +E +d +"} +(2,1,1) = {" +b +b +r +"} +(3,1,1) = {" +b +b +r +"} +(4,1,1) = {" +b +b +Y +"} diff --git a/maps/templates/pra.dmm b/maps/templates/pra.dmm index e12af93df85..19c943f68ec 100644 --- a/maps/templates/pra.dmm +++ b/maps/templates/pra.dmm @@ -262,7 +262,7 @@ /obj/structure/coatrack, /obj/item/clothing/accessory/tajaran, /obj/item/clothing/suit/storage/tajaran, -/obj/item/clothing/suit/storage/tajaran/cloak/fancy, +/obj/item/clothing/accessory/poncho/tajarancloak/fancy, /turf/simulated/floor/wood, /area/derelict/ship) "aL" = ( @@ -730,7 +730,7 @@ }, /obj/effect/decal/cleanable/vomit, /obj/structure/closet/cabinet, -/obj/item/clothing/suit/storage/tajaran/cloak, +/obj/item/clothing/accessory/poncho/tajarancloak/fancy, /turf/simulated/floor/wood, /area/derelict/ship) "cl" = ( @@ -1137,11 +1137,6 @@ }, /turf/simulated/floor/tiled/dark, /area/derelict/ship) -"dF" = ( -/obj/effect/floor_decal/corner/orange/diagonal, -/obj/machinery/pipelayer, -/turf/simulated/floor/tiled/dark, -/area/derelict/ship) "dG" = ( /obj/effect/floor_decal/corner/orange/diagonal, /obj/structure/table/rack, @@ -1674,7 +1669,7 @@ de cT dq dy -dF +cS dP eu eA diff --git a/maps/templates/sol.dmm b/maps/templates/sol.dmm index 92d800c6140..3583000d6f1 100644 --- a/maps/templates/sol.dmm +++ b/maps/templates/sol.dmm @@ -290,7 +290,6 @@ /turf/simulated/floor/tiled/dark, /area/derelict/ship) "aS" = ( -/obj/structure/bed/chair/e_chair, /turf/simulated/floor/tiled/dark, /area/derelict/ship) "aT" = ( diff --git a/scripts/dm.sh b/scripts/dm.sh index 9fa063e788a..f07f4b9d682 100755 --- a/scripts/dm.sh +++ b/scripts/dm.sh @@ -46,7 +46,13 @@ if [[ $DM == "" ]]; then exit 3 fi -"$DM" $dmepath.mdme | grep --invert-match -E "^including.*\.dmm?\$" | tee build_log.txt +touch $dmepath.rsc +touch $dmepath.dyn.rsc +chmod a+rwX $dmepath.rsc +chmod a+rwX $dmepath.dyn.rsc +chmod -R a+rwX . + +"$DM" -clean $dmepath.mdme | grep --invert-match -E "^including.*\.dmm?\$" | tee build_log.txt retval=$? if [[ $retval == 0 ]]; then @@ -56,6 +62,5 @@ fi rm $dmepath.mdme -chmod -R a+rwX . exit $retval diff --git a/sound/AI/Voice how-to.txt b/sound/AI/Voice how-to.txt index 33853d3bec1..10c0abed8ff 100644 --- a/sound/AI/Voice how-to.txt +++ b/sound/AI/Voice how-to.txt @@ -3,9 +3,9 @@ 3. Type whatever you want/need and record it. 4. I used audacity. Set the project rate (hz) to 16000. 5. Apply reverb, the settings are this: - Room size: 56 + Room size: 40 Pre-delay: 48 - Reverberance: 47 + Reverberance: 70 Damping: 57 Tone low: 84 Tone High: 85 diff --git a/sound/AI/cozmo_migration.ogg b/sound/AI/cozmo_migration.ogg new file mode 100644 index 00000000000..33234da73fb Binary files /dev/null and b/sound/AI/cozmo_migration.ogg differ diff --git a/sound/attributions.txt b/sound/attributions.txt new file mode 100644 index 00000000000..edbc2682e19 --- /dev/null +++ b/sound/attributions.txt @@ -0,0 +1,3 @@ +weapons/flamethrower.ogg - Obtained from https://www.zapsplat.com +effects/fleshburn1.ogg - Obtained from https://www.zapsplat.com +effects/fleshburn2.ogg - Obtained from https://www.zapsplat.com \ No newline at end of file diff --git a/sound/effects/antag_notice/technomancer_alert.ogg b/sound/effects/antag_notice/technomancer_alert.ogg new file mode 100644 index 00000000000..dabc8285572 Binary files /dev/null and b/sound/effects/antag_notice/technomancer_alert.ogg differ diff --git a/sound/effects/clownstep1.ogg b/sound/effects/clownstep1.ogg deleted file mode 100644 index 740fb5fd9f4..00000000000 Binary files a/sound/effects/clownstep1.ogg and /dev/null differ diff --git a/sound/effects/clownstep2.ogg b/sound/effects/clownstep2.ogg deleted file mode 100644 index 5a5426b3fe4..00000000000 Binary files a/sound/effects/clownstep2.ogg and /dev/null differ diff --git a/sound/effects/fleshburn1.ogg b/sound/effects/fleshburn1.ogg new file mode 100644 index 00000000000..ec3ff8ffdb9 Binary files /dev/null and b/sound/effects/fleshburn1.ogg differ diff --git a/sound/effects/fleshburn2.ogg b/sound/effects/fleshburn2.ogg new file mode 100644 index 00000000000..3cb6b160ea4 Binary files /dev/null and b/sound/effects/fleshburn2.ogg differ diff --git a/sound/items/manydings.ogg b/sound/items/manydings.ogg new file mode 100644 index 00000000000..7fd7bacc94e Binary files /dev/null and b/sound/items/manydings.ogg differ diff --git a/sound/items/oneding.ogg b/sound/items/oneding.ogg new file mode 100644 index 00000000000..33526c080e5 Binary files /dev/null and b/sound/items/oneding.ogg differ diff --git a/sound/items/threedings.ogg b/sound/items/threedings.ogg new file mode 100644 index 00000000000..ebbffffd277 Binary files /dev/null and b/sound/items/threedings.ogg differ diff --git a/sound/machines/pump.ogg b/sound/machines/pump.ogg new file mode 100644 index 00000000000..967a2e49a74 Binary files /dev/null and b/sound/machines/pump.ogg differ diff --git a/sound/machines/slide_change.ogg b/sound/machines/slide_change.ogg new file mode 100644 index 00000000000..129af6db727 Binary files /dev/null and b/sound/machines/slide_change.ogg differ diff --git a/sound/voice/warble.ogg b/sound/voice/warble.ogg new file mode 100644 index 00000000000..420ae974c83 Binary files /dev/null and b/sound/voice/warble.ogg differ diff --git a/sound/weapons/flamethrower.ogg b/sound/weapons/flamethrower.ogg index 0a1d7777220..d85e0120620 100644 Binary files a/sound/weapons/flamethrower.ogg and b/sound/weapons/flamethrower.ogg differ diff --git a/tools/Event Probabilities/Event Probabilities.xlsx b/tools/Event Probabilities/Event Probabilities.xlsx index 07439c398d4..4e22d16b88d 100644 Binary files a/tools/Event Probabilities/Event Probabilities.xlsx and b/tools/Event Probabilities/Event Probabilities.xlsx differ diff --git a/tools/requirements.txt b/tools/requirements.txt index e0b6e2e1a82..e0456c97004 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -1,3 +1,3 @@ pygit2==1.4.0 bidict==0.21.2 -Pillow==8.1.1 +Pillow==8.2.0 diff --git a/tools/vueui-report/package-lock.json b/tools/vueui-report/package-lock.json index bb0811d3fe3..80bd69f5718 100644 --- a/tools/vueui-report/package-lock.json +++ b/tools/vueui-report/package-lock.json @@ -1184,9 +1184,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", - "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==" + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" }, "yauzl": { "version": "2.10.0", diff --git a/vueui/dist/app.css b/vueui/dist/app.css index 0ec34b0f841..ef225ec2ba6 100644 --- a/vueui/dist/app.css +++ b/vueui/dist/app.css @@ -1,4 +1,4 @@ /*! * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */.fab,.fad,.fal,.far,.fas,.ic,.mapIcon16,.uiIcon16,.uiIcon24{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.ic-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-.0667em}.ic-xs{font-size:.75em}.ic-sm{font-size:.875em}.ic-1x{font-size:1em}.ic-2x{font-size:2em}.ic-3x{font-size:3em}.ic-4x{font-size:4em}.ic-5x{font-size:5em}.ic-6x{font-size:6em}.ic-7x{font-size:7em}.ic-8x{font-size:8em}.ic-9x{font-size:9em}.ic-10x{font-size:10em}.ic-fw,.mapIcon16,.uiIcon16,.uiIcon24{text-align:center;width:1.25em}.ic-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.ic-ul>li{position:relative}.ic-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.ic-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.ic-pull-left{float:left}.ic-pull-right{float:right}.fab.ic-pull-left,.fal.ic-pull-left,.far.ic-pull-left,.fas.ic-pull-left,.ic-pull-left.mapIcon16,.ic-pull-left.uiIcon16,.ic-pull-left.uiIcon24,.ic.ic-pull-left{margin-right:.3em}.fab.ic-pull-right,.fal.ic-pull-right,.far.ic-pull-right,.fas.ic-pull-right,.ic-pull-right.mapIcon16,.ic-pull-right.uiIcon16,.ic-pull-right.uiIcon24,.ic.ic-pull-right{margin-left:.3em}.ic-spin{animation:fa-spin 2s linear infinite}.ic-pulse{animation:fa-spin 1s steps(8) infinite}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.ic-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-ms-transform:rotate(90deg);transform:rotate(90deg)}.ic-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-ms-transform:rotate(180deg);transform:rotate(180deg)}.ic-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-ms-transform:rotate(270deg);transform:rotate(270deg)}.ic-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-ms-transform:scaleX(-1);transform:scaleX(-1)}.ic-flip-vertical{-ms-transform:scaleY(-1);transform:scaleY(-1)}.ic-flip-both,.ic-flip-horizontal.ic-flip-vertical,.ic-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.ic-flip-both,.ic-flip-horizontal.ic-flip-vertical{-ms-transform:scale(-1);transform:scale(-1)}:root .ic-flip-both,:root .ic-flip-horizontal,:root .ic-flip-vertical,:root .ic-rotate-90,:root .ic-rotate-180,:root .ic-rotate-270{filter:none}.ic-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.ic-stack-1x,.ic-stack-2x{left:0;position:absolute;text-align:center;width:100%}.ic-stack-1x{line-height:inherit}.ic-stack-2x{font-size:2em}.ic-inverse{color:#fff}.ic-500px:before{content:""}.ic-accessible-icon:before{content:""}.ic-accusoft:before{content:""}.ic-acquisitions-incorporated:before{content:""}.ic-ad:before{content:""}.ic-address-book:before{content:""}.ic-address-card:before{content:""}.ic-adjust:before{content:""}.ic-adn:before{content:""}.ic-adversal:before{content:""}.ic-affiliatetheme:before{content:""}.ic-air-freshener:before{content:""}.ic-airbnb:before{content:""}.ic-algolia:before{content:""}.ic-align-center:before{content:""}.ic-align-justify:before{content:""}.ic-align-left:before{content:""}.ic-align-right:before{content:""}.ic-alipay:before{content:""}.ic-allergies:before{content:""}.ic-amazon:before{content:""}.ic-amazon-pay:before{content:""}.ic-ambulance:before{content:""}.ic-american-sign-language-interpreting:before{content:""}.ic-amilia:before{content:""}.ic-anchor:before{content:""}.ic-android:before{content:""}.ic-angellist:before{content:""}.ic-angle-double-down:before{content:""}.ic-angle-double-left:before{content:""}.ic-angle-double-right:before{content:""}.ic-angle-double-up:before{content:""}.ic-angle-down:before{content:""}.ic-angle-left:before{content:""}.ic-angle-right:before{content:""}.ic-angle-up:before{content:""}.ic-angry:before{content:""}.ic-angrycreative:before{content:""}.ic-angular:before{content:""}.ic-ankh:before{content:""}.ic-app-store:before{content:""}.ic-app-store-ios:before{content:""}.ic-apper:before{content:""}.ic-apple:before{content:""}.ic-apple-alt:before{content:""}.ic-apple-pay:before{content:""}.ic-archive:before{content:""}.ic-archway:before{content:""}.ic-arrow-alt-circle-down:before{content:""}.ic-arrow-alt-circle-left:before{content:""}.ic-arrow-alt-circle-right:before{content:""}.ic-arrow-alt-circle-up:before{content:""}.ic-arrow-circle-down:before{content:""}.ic-arrow-circle-left:before{content:""}.ic-arrow-circle-right:before{content:""}.ic-arrow-circle-up:before{content:""}.ic-arrow-down:before{content:""}.ic-arrow-left:before{content:""}.ic-arrow-right:before{content:""}.ic-arrow-up:before{content:""}.ic-arrows-alt:before{content:""}.ic-arrows-alt-h:before{content:""}.ic-arrows-alt-v:before{content:""}.ic-artstation:before{content:""}.ic-assistive-listening-systems:before{content:""}.ic-asterisk:before{content:""}.ic-asymmetrik:before{content:""}.ic-at:before{content:""}.ic-atlas:before{content:""}.ic-atlassian:before{content:""}.ic-atom:before{content:""}.ic-audible:before{content:""}.ic-audio-description:before{content:""}.ic-autoprefixer:before{content:""}.ic-avianex:before{content:""}.ic-aviato:before{content:""}.ic-award:before{content:""}.ic-aws:before{content:""}.ic-baby:before{content:""}.ic-baby-carriage:before{content:""}.ic-backspace:before{content:""}.ic-backward:before{content:""}.ic-bacon:before{content:""}.ic-bacteria:before{content:""}.ic-bacterium:before{content:""}.ic-bahai:before{content:""}.ic-balance-scale:before{content:""}.ic-balance-scale-left:before{content:""}.ic-balance-scale-right:before{content:""}.ic-ban:before{content:""}.ic-band-aid:before{content:""}.ic-bandcamp:before{content:""}.ic-barcode:before{content:""}.ic-bars:before{content:""}.ic-baseball-ball:before{content:""}.ic-basketball-ball:before{content:""}.ic-bath:before{content:""}.ic-battery-empty:before{content:""}.ic-battery-full:before{content:""}.ic-battery-half:before{content:""}.ic-battery-quarter:before{content:""}.ic-battery-three-quarters:before{content:""}.ic-battle-net:before{content:""}.ic-bed:before{content:""}.ic-beer:before{content:""}.ic-behance:before{content:""}.ic-behance-square:before{content:""}.ic-bell:before{content:""}.ic-bell-slash:before{content:""}.ic-bezier-curve:before{content:""}.ic-bible:before{content:""}.ic-bicycle:before{content:""}.ic-biking:before{content:""}.ic-bimobject:before{content:""}.ic-binoculars:before{content:""}.ic-biohazard:before{content:""}.ic-birthday-cake:before{content:""}.ic-bitbucket:before{content:""}.ic-bitcoin:before{content:""}.ic-bity:before{content:""}.ic-black-tie:before{content:""}.ic-blackberry:before{content:""}.ic-blender:before{content:""}.ic-blender-phone:before{content:""}.ic-blind:before{content:""}.ic-blog:before{content:""}.ic-blogger:before{content:""}.ic-blogger-b:before{content:""}.ic-bluetooth:before{content:""}.ic-bluetooth-b:before{content:""}.ic-bold:before{content:""}.ic-bolt:before{content:""}.ic-bomb:before{content:""}.ic-bone:before{content:""}.ic-bong:before{content:""}.ic-book:before{content:""}.ic-book-dead:before{content:""}.ic-book-medical:before{content:""}.ic-book-open:before{content:""}.ic-book-reader:before{content:""}.ic-bookmark:before{content:""}.ic-bootstrap:before{content:""}.ic-border-all:before{content:""}.ic-border-none:before{content:""}.ic-border-style:before{content:""}.ic-bowling-ball:before{content:""}.ic-box:before{content:""}.ic-box-open:before{content:""}.ic-box-tissue:before{content:""}.ic-boxes:before{content:""}.ic-braille:before{content:""}.ic-brain:before{content:""}.ic-bread-slice:before{content:""}.ic-briefcase:before{content:""}.ic-briefcase-medical:before{content:""}.ic-broadcast-tower:before{content:""}.ic-broom:before{content:""}.ic-brush:before{content:""}.ic-btc:before{content:""}.ic-buffer:before{content:""}.ic-bug:before{content:""}.ic-building:before{content:""}.ic-bullhorn:before{content:""}.ic-bullseye:before{content:""}.ic-burn:before{content:""}.ic-buromobelexperte:before{content:""}.ic-bus:before{content:""}.ic-bus-alt:before{content:""}.ic-business-time:before{content:""}.ic-buy-n-large:before{content:""}.ic-buysellads:before{content:""}.ic-calculator:before{content:""}.ic-calendar:before{content:""}.ic-calendar-alt:before{content:""}.ic-calendar-check:before{content:""}.ic-calendar-day:before{content:""}.ic-calendar-minus:before{content:""}.ic-calendar-plus:before{content:""}.ic-calendar-times:before{content:""}.ic-calendar-week:before{content:""}.ic-camera:before{content:""}.ic-camera-retro:before{content:""}.ic-campground:before{content:""}.ic-canadian-maple-leaf:before{content:""}.ic-candy-cane:before{content:""}.ic-cannabis:before{content:""}.ic-capsules:before{content:""}.ic-car:before{content:""}.ic-car-alt:before{content:""}.ic-car-battery:before{content:""}.ic-car-crash:before{content:""}.ic-car-side:before{content:""}.ic-caravan:before{content:""}.ic-caret-down:before{content:""}.ic-caret-left:before{content:""}.ic-caret-right:before{content:""}.ic-caret-square-down:before{content:""}.ic-caret-square-left:before{content:""}.ic-caret-square-right:before{content:""}.ic-caret-square-up:before{content:""}.ic-caret-up:before{content:""}.ic-carrot:before{content:""}.ic-cart-arrow-down:before{content:""}.ic-cart-plus:before{content:""}.ic-cash-register:before{content:""}.ic-cat:before{content:""}.ic-cc-amazon-pay:before{content:""}.ic-cc-amex:before{content:""}.ic-cc-apple-pay:before{content:""}.ic-cc-diners-club:before{content:""}.ic-cc-discover:before{content:""}.ic-cc-jcb:before{content:""}.ic-cc-mastercard:before{content:""}.ic-cc-paypal:before{content:""}.ic-cc-stripe:before{content:""}.ic-cc-visa:before{content:""}.ic-centercode:before{content:""}.ic-centos:before{content:""}.ic-certificate:before{content:""}.ic-chair:before{content:""}.ic-chalkboard:before{content:""}.ic-chalkboard-teacher:before{content:""}.ic-charging-station:before{content:""}.ic-chart-area:before{content:""}.ic-chart-bar:before{content:""}.ic-chart-line:before{content:""}.ic-chart-pie:before{content:""}.ic-check:before{content:""}.ic-check-circle:before{content:""}.ic-check-double:before{content:""}.ic-check-square:before{content:""}.ic-cheese:before{content:""}.ic-chess:before{content:""}.ic-chess-bishop:before{content:""}.ic-chess-board:before{content:""}.ic-chess-king:before{content:""}.ic-chess-knight:before{content:""}.ic-chess-pawn:before{content:""}.ic-chess-queen:before{content:""}.ic-chess-rook:before{content:""}.ic-chevron-circle-down:before{content:""}.ic-chevron-circle-left:before{content:""}.ic-chevron-circle-right:before{content:""}.ic-chevron-circle-up:before{content:""}.ic-chevron-down:before{content:""}.ic-chevron-left:before{content:""}.ic-chevron-right:before{content:""}.ic-chevron-up:before{content:""}.ic-child:before{content:""}.ic-chrome:before{content:""}.ic-chromecast:before{content:""}.ic-church:before{content:""}.ic-circle:before{content:""}.ic-circle-notch:before{content:""}.ic-city:before{content:""}.ic-clinic-medical:before{content:""}.ic-clipboard:before{content:""}.ic-clipboard-check:before{content:""}.ic-clipboard-list:before{content:""}.ic-clock:before{content:""}.ic-clone:before{content:""}.ic-closed-captioning:before{content:""}.ic-cloud:before{content:""}.ic-cloud-download-alt:before{content:""}.ic-cloud-meatball:before{content:""}.ic-cloud-moon:before{content:""}.ic-cloud-moon-rain:before{content:""}.ic-cloud-rain:before{content:""}.ic-cloud-showers-heavy:before{content:""}.ic-cloud-sun:before{content:""}.ic-cloud-sun-rain:before{content:""}.ic-cloud-upload-alt:before{content:""}.ic-cloudflare:before{content:""}.ic-cloudscale:before{content:""}.ic-cloudsmith:before{content:""}.ic-cloudversify:before{content:""}.ic-cocktail:before{content:""}.ic-code:before{content:""}.ic-code-branch:before{content:""}.ic-codepen:before{content:""}.ic-codiepie:before{content:""}.ic-coffee:before{content:""}.ic-cog:before{content:""}.ic-cogs:before{content:""}.ic-coins:before{content:""}.ic-columns:before{content:""}.ic-comment:before{content:""}.ic-comment-alt:before{content:""}.ic-comment-dollar:before{content:""}.ic-comment-dots:before{content:""}.ic-comment-medical:before{content:""}.ic-comment-slash:before{content:""}.ic-comments:before{content:""}.ic-comments-dollar:before{content:""}.ic-compact-disc:before{content:""}.ic-compass:before{content:""}.ic-compress:before{content:""}.ic-compress-alt:before{content:""}.ic-compress-arrows-alt:before{content:""}.ic-concierge-bell:before{content:""}.ic-confluence:before{content:""}.ic-connectdevelop:before{content:""}.ic-contao:before{content:""}.ic-cookie:before{content:""}.ic-cookie-bite:before{content:""}.ic-copy:before{content:""}.ic-copyright:before{content:""}.ic-cotton-bureau:before{content:""}.ic-couch:before{content:""}.ic-cpanel:before{content:""}.ic-creative-commons:before{content:""}.ic-creative-commons-by:before{content:""}.ic-creative-commons-nc:before{content:""}.ic-creative-commons-nc-eu:before{content:""}.ic-creative-commons-nc-jp:before{content:""}.ic-creative-commons-nd:before{content:""}.ic-creative-commons-pd:before{content:""}.ic-creative-commons-pd-alt:before{content:""}.ic-creative-commons-remix:before{content:""}.ic-creative-commons-sa:before{content:""}.ic-creative-commons-sampling:before{content:""}.ic-creative-commons-sampling-plus:before{content:""}.ic-creative-commons-share:before{content:""}.ic-creative-commons-zero:before{content:""}.ic-credit-card:before{content:""}.ic-critical-role:before{content:""}.ic-crop:before{content:""}.ic-crop-alt:before{content:""}.ic-cross:before{content:""}.ic-crosshairs:before{content:""}.ic-crow:before{content:""}.ic-crown:before{content:""}.ic-crutch:before{content:""}.ic-css3:before{content:""}.ic-css3-alt:before{content:""}.ic-cube:before{content:""}.ic-cubes:before{content:""}.ic-cut:before{content:""}.ic-cuttlefish:before{content:""}.ic-d-and-d:before{content:""}.ic-d-and-d-beyond:before{content:""}.ic-dailymotion:before{content:""}.ic-dashcube:before{content:""}.ic-database:before{content:""}.ic-deaf:before{content:""}.ic-deezer:before{content:""}.ic-delicious:before{content:""}.ic-democrat:before{content:""}.ic-deploydog:before{content:""}.ic-deskpro:before{content:""}.ic-desktop:before{content:""}.ic-dev:before{content:""}.ic-deviantart:before{content:""}.ic-dharmachakra:before{content:""}.ic-dhl:before{content:""}.ic-diagnoses:before{content:""}.ic-diaspora:before{content:""}.ic-dice:before{content:""}.ic-dice-d20:before{content:""}.ic-dice-d6:before{content:""}.ic-dice-five:before{content:""}.ic-dice-four:before{content:""}.ic-dice-one:before{content:""}.ic-dice-six:before{content:""}.ic-dice-three:before{content:""}.ic-dice-two:before{content:""}.ic-digg:before{content:""}.ic-digital-ocean:before{content:""}.ic-digital-tachograph:before{content:""}.ic-directions:before{content:""}.ic-discord:before{content:""}.ic-discourse:before{content:""}.ic-disease:before{content:""}.ic-divide:before{content:""}.ic-dizzy:before{content:""}.ic-dna:before{content:""}.ic-dochub:before{content:""}.ic-docker:before{content:""}.ic-dog:before{content:""}.ic-dollar-sign:before{content:""}.ic-dolly:before{content:""}.ic-dolly-flatbed:before{content:""}.ic-donate:before{content:""}.ic-door-closed:before{content:""}.ic-door-open:before{content:""}.ic-dot-circle:before{content:""}.ic-dove:before{content:""}.ic-download:before{content:""}.ic-draft2digital:before{content:""}.ic-drafting-compass:before{content:""}.ic-dragon:before{content:""}.ic-draw-polygon:before{content:""}.ic-dribbble:before{content:""}.ic-dribbble-square:before{content:""}.ic-dropbox:before{content:""}.ic-drum:before{content:""}.ic-drum-steelpan:before{content:""}.ic-drumstick-bite:before{content:""}.ic-drupal:before{content:""}.ic-dumbbell:before{content:""}.ic-dumpster:before{content:""}.ic-dumpster-fire:before{content:""}.ic-dungeon:before{content:""}.ic-dyalog:before{content:""}.ic-earlybirds:before{content:""}.ic-ebay:before{content:""}.ic-edge:before{content:""}.ic-edge-legacy:before{content:""}.ic-edit:before{content:""}.ic-egg:before{content:""}.ic-eject:before{content:""}.ic-elementor:before{content:""}.ic-ellipsis-h:before{content:""}.ic-ellipsis-v:before{content:""}.ic-ello:before{content:""}.ic-ember:before{content:""}.ic-empire:before{content:""}.ic-envelope:before{content:""}.ic-envelope-open:before{content:""}.ic-envelope-open-text:before{content:""}.ic-envelope-square:before{content:""}.ic-envira:before{content:""}.ic-equals:before{content:""}.ic-eraser:before{content:""}.ic-erlang:before{content:""}.ic-ethereum:before{content:""}.ic-ethernet:before{content:""}.ic-etsy:before{content:""}.ic-euro-sign:before{content:""}.ic-evernote:before{content:""}.ic-exchange-alt:before{content:""}.ic-exclamation:before{content:""}.ic-exclamation-circle:before{content:""}.ic-exclamation-triangle:before{content:""}.ic-expand:before{content:""}.ic-expand-alt:before{content:""}.ic-expand-arrows-alt:before{content:""}.ic-expeditedssl:before{content:""}.ic-external-link-alt:before{content:""}.ic-external-link-square-alt:before{content:""}.ic-eye:before{content:""}.ic-eye-dropper:before{content:""}.ic-eye-slash:before{content:""}.ic-facebook:before{content:""}.ic-facebook-f:before{content:""}.ic-facebook-messenger:before{content:""}.ic-facebook-square:before{content:""}.ic-fan:before{content:""}.ic-fantasy-flight-games:before{content:""}.ic-fast-backward:before{content:""}.ic-fast-forward:before{content:""}.ic-faucet:before{content:""}.ic-fax:before{content:""}.ic-feather:before{content:""}.ic-feather-alt:before{content:""}.ic-fedex:before{content:""}.ic-fedora:before{content:""}.ic-female:before{content:""}.ic-fighter-jet:before{content:""}.ic-figma:before{content:""}.ic-file:before{content:""}.ic-file-alt:before{content:""}.ic-file-archive:before{content:""}.ic-file-audio:before{content:""}.ic-file-code:before{content:""}.ic-file-contract:before{content:""}.ic-file-csv:before{content:""}.ic-file-download:before{content:""}.ic-file-excel:before{content:""}.ic-file-export:before{content:""}.ic-file-image:before{content:""}.ic-file-import:before{content:""}.ic-file-invoice:before{content:""}.ic-file-invoice-dollar:before{content:""}.ic-file-medical:before{content:""}.ic-file-medical-alt:before{content:""}.ic-file-pdf:before{content:""}.ic-file-powerpoint:before{content:""}.ic-file-prescription:before{content:""}.ic-file-signature:before{content:""}.ic-file-upload:before{content:""}.ic-file-video:before{content:""}.ic-file-word:before{content:""}.ic-fill:before{content:""}.ic-fill-drip:before{content:""}.ic-film:before{content:""}.ic-filter:before{content:""}.ic-fingerprint:before{content:""}.ic-fire:before{content:""}.ic-fire-alt:before{content:""}.ic-fire-extinguisher:before{content:""}.ic-firefox:before{content:""}.ic-firefox-browser:before{content:""}.ic-first-aid:before{content:""}.ic-first-order:before{content:""}.ic-first-order-alt:before{content:""}.ic-firstdraft:before{content:""}.ic-fish:before{content:""}.ic-fist-raised:before{content:""}.ic-flag:before{content:""}.ic-flag-checkered:before{content:""}.ic-flag-usa:before{content:""}.ic-flask:before{content:""}.ic-flickr:before{content:""}.ic-flipboard:before{content:""}.ic-flushed:before{content:""}.ic-fly:before{content:""}.ic-folder:before{content:""}.ic-folder-minus:before{content:""}.ic-folder-open:before{content:""}.ic-folder-plus:before{content:""}.ic-font:before{content:""}.ic-font-awesome:before{content:""}.ic-font-awesome-alt:before{content:""}.ic-font-awesome-flag:before{content:""}.ic-font-awesome-logo-full:before{content:""}.ic-fonticons:before{content:""}.ic-fonticons-fi:before{content:""}.ic-football-ball:before{content:""}.ic-fort-awesome:before{content:""}.ic-fort-awesome-alt:before{content:""}.ic-forumbee:before{content:""}.ic-forward:before{content:""}.ic-foursquare:before{content:""}.ic-free-code-camp:before{content:""}.ic-freebsd:before{content:""}.ic-frog:before{content:""}.ic-frown:before{content:""}.ic-frown-open:before{content:""}.ic-fulcrum:before{content:""}.ic-funnel-dollar:before{content:""}.ic-futbol:before{content:""}.ic-galactic-republic:before{content:""}.ic-galactic-senate:before{content:""}.ic-gamepad:before{content:""}.ic-gas-pump:before{content:""}.ic-gavel:before{content:""}.ic-gem:before{content:""}.ic-genderless:before{content:""}.ic-get-pocket:before{content:""}.ic-gg:before{content:""}.ic-gg-circle:before{content:""}.ic-ghost:before{content:""}.ic-gift:before{content:""}.ic-gifts:before{content:""}.ic-git:before{content:""}.ic-git-alt:before{content:""}.ic-git-square:before{content:""}.ic-github:before{content:""}.ic-github-alt:before{content:""}.ic-github-square:before{content:""}.ic-gitkraken:before{content:""}.ic-gitlab:before{content:""}.ic-gitter:before{content:""}.ic-glass-cheers:before{content:""}.ic-glass-martini:before{content:""}.ic-glass-martini-alt:before{content:""}.ic-glass-whiskey:before{content:""}.ic-glasses:before{content:""}.ic-glide:before{content:""}.ic-glide-g:before{content:""}.ic-globe:before{content:""}.ic-globe-africa:before{content:""}.ic-globe-americas:before{content:""}.ic-globe-asia:before{content:""}.ic-globe-europe:before{content:""}.ic-gofore:before{content:""}.ic-golf-ball:before{content:""}.ic-goodreads:before{content:""}.ic-goodreads-g:before{content:""}.ic-google:before{content:""}.ic-google-drive:before{content:""}.ic-google-pay:before{content:""}.ic-google-play:before{content:""}.ic-google-plus:before{content:""}.ic-google-plus-g:before{content:""}.ic-google-plus-square:before{content:""}.ic-google-wallet:before{content:""}.ic-gopuram:before{content:""}.ic-graduation-cap:before{content:""}.ic-gratipay:before{content:""}.ic-grav:before{content:""}.ic-greater-than:before{content:""}.ic-greater-than-equal:before{content:""}.ic-grimace:before{content:""}.ic-grin:before{content:""}.ic-grin-alt:before{content:""}.ic-grin-beam:before{content:""}.ic-grin-beam-sweat:before{content:""}.ic-grin-hearts:before{content:""}.ic-grin-squint:before{content:""}.ic-grin-squint-tears:before{content:""}.ic-grin-stars:before{content:""}.ic-grin-tears:before{content:""}.ic-grin-tongue:before{content:""}.ic-grin-tongue-squint:before{content:""}.ic-grin-tongue-wink:before{content:""}.ic-grin-wink:before{content:""}.ic-grip-horizontal:before{content:""}.ic-grip-lines:before{content:""}.ic-grip-lines-vertical:before{content:""}.ic-grip-vertical:before{content:""}.ic-gripfire:before{content:""}.ic-grunt:before{content:""}.ic-guilded:before{content:""}.ic-guitar:before{content:""}.ic-gulp:before{content:""}.ic-h-square:before{content:""}.ic-hacker-news:before{content:""}.ic-hacker-news-square:before{content:""}.ic-hackerrank:before{content:""}.ic-hamburger:before{content:""}.ic-hammer:before{content:""}.ic-hamsa:before{content:""}.ic-hand-holding:before{content:""}.ic-hand-holding-heart:before{content:""}.ic-hand-holding-medical:before{content:""}.ic-hand-holding-usd:before{content:""}.ic-hand-holding-water:before{content:""}.ic-hand-lizard:before{content:""}.ic-hand-middle-finger:before{content:""}.ic-hand-paper:before{content:""}.ic-hand-peace:before{content:""}.ic-hand-point-down:before{content:""}.ic-hand-point-left:before{content:""}.ic-hand-point-right:before{content:""}.ic-hand-point-up:before{content:""}.ic-hand-pointer:before{content:""}.ic-hand-rock:before{content:""}.ic-hand-scissors:before{content:""}.ic-hand-sparkles:before{content:""}.ic-hand-spock:before{content:""}.ic-hands:before{content:""}.ic-hands-helping:before{content:""}.ic-hands-wash:before{content:""}.ic-handshake:before{content:""}.ic-handshake-alt-slash:before{content:""}.ic-handshake-slash:before{content:""}.ic-hanukiah:before{content:""}.ic-hard-hat:before{content:""}.ic-hashtag:before{content:""}.ic-hat-cowboy:before{content:""}.ic-hat-cowboy-side:before{content:""}.ic-hat-wizard:before{content:""}.ic-hdd:before{content:""}.ic-head-side-cough:before{content:""}.ic-head-side-cough-slash:before{content:""}.ic-head-side-mask:before{content:""}.ic-head-side-virus:before{content:""}.ic-heading:before{content:""}.ic-headphones:before{content:""}.ic-headphones-alt:before{content:""}.ic-headset:before{content:""}.ic-heart:before{content:""}.ic-heart-broken:before{content:""}.ic-heartbeat:before{content:""}.ic-helicopter:before{content:""}.ic-highlighter:before{content:""}.ic-hiking:before{content:""}.ic-hippo:before{content:""}.ic-hips:before{content:""}.ic-hire-a-helper:before{content:""}.ic-history:before{content:""}.ic-hive:before{content:""}.ic-hockey-puck:before{content:""}.ic-holly-berry:before{content:""}.ic-home:before{content:""}.ic-hooli:before{content:""}.ic-hornbill:before{content:""}.ic-horse:before{content:""}.ic-horse-head:before{content:""}.ic-hospital:before{content:""}.ic-hospital-alt:before{content:""}.ic-hospital-symbol:before{content:""}.ic-hospital-user:before{content:""}.ic-hot-tub:before{content:""}.ic-hotdog:before{content:""}.ic-hotel:before{content:""}.ic-hotjar:before{content:""}.ic-hourglass:before{content:""}.ic-hourglass-end:before{content:""}.ic-hourglass-half:before{content:""}.ic-hourglass-start:before{content:""}.ic-house-damage:before{content:""}.ic-house-user:before{content:""}.ic-houzz:before{content:""}.ic-hryvnia:before{content:""}.ic-html5:before{content:""}.ic-hubspot:before{content:""}.ic-i-cursor:before{content:""}.ic-ice-cream:before{content:""}.ic-icicles:before{content:""}.ic-icons:before{content:""}.ic-id-badge:before{content:""}.ic-id-card:before{content:""}.ic-id-card-alt:before{content:""}.ic-ideal:before{content:""}.ic-igloo:before{content:""}.ic-image:before{content:""}.ic-images:before{content:""}.ic-imdb:before{content:""}.ic-inbox:before{content:""}.ic-indent:before{content:""}.ic-industry:before{content:""}.ic-infinity:before{content:""}.ic-info:before{content:""}.ic-info-circle:before{content:""}.ic-innosoft:before{content:""}.ic-instagram:before{content:""}.ic-instagram-square:before{content:""}.ic-instalod:before{content:""}.ic-intercom:before{content:""}.ic-internet-explorer:before{content:""}.ic-invision:before{content:""}.ic-ioxhost:before{content:""}.ic-italic:before{content:""}.ic-itch-io:before{content:""}.ic-itunes:before{content:""}.ic-itunes-note:before{content:""}.ic-java:before{content:""}.ic-jedi:before{content:""}.ic-jedi-order:before{content:""}.ic-jenkins:before{content:""}.ic-jira:before{content:""}.ic-joget:before{content:""}.ic-joint:before{content:""}.ic-joomla:before{content:""}.ic-journal-whills:before{content:""}.ic-js:before{content:""}.ic-js-square:before{content:""}.ic-jsfiddle:before{content:""}.ic-kaaba:before{content:""}.ic-kaggle:before{content:""}.ic-key:before{content:""}.ic-keybase:before{content:""}.ic-keyboard:before{content:""}.ic-keycdn:before{content:""}.ic-khanda:before{content:""}.ic-kickstarter:before{content:""}.ic-kickstarter-k:before{content:""}.ic-kiss:before{content:""}.ic-kiss-beam:before{content:""}.ic-kiss-wink-heart:before{content:""}.ic-kiwi-bird:before{content:""}.ic-korvue:before{content:""}.ic-landmark:before{content:""}.ic-language:before{content:""}.ic-laptop:before{content:""}.ic-laptop-code:before{content:""}.ic-laptop-house:before{content:""}.ic-laptop-medical:before{content:""}.ic-laravel:before{content:""}.ic-lastfm:before{content:""}.ic-lastfm-square:before{content:""}.ic-laugh:before{content:""}.ic-laugh-beam:before{content:""}.ic-laugh-squint:before{content:""}.ic-laugh-wink:before{content:""}.ic-layer-group:before{content:""}.ic-leaf:before{content:""}.ic-leanpub:before{content:""}.ic-lemon:before{content:""}.ic-less:before{content:""}.ic-less-than:before{content:""}.ic-less-than-equal:before{content:""}.ic-level-down-alt:before{content:""}.ic-level-up-alt:before{content:""}.ic-life-ring:before{content:""}.ic-lightbulb:before{content:""}.ic-line:before{content:""}.ic-link:before{content:""}.ic-linkedin:before{content:""}.ic-linkedin-in:before{content:""}.ic-linode:before{content:""}.ic-linux:before{content:""}.ic-lira-sign:before{content:""}.ic-list:before{content:""}.ic-list-alt:before{content:""}.ic-list-ol:before{content:""}.ic-list-ul:before{content:""}.ic-location-arrow:before{content:""}.ic-lock:before{content:""}.ic-lock-open:before{content:""}.ic-long-arrow-alt-down:before{content:""}.ic-long-arrow-alt-left:before{content:""}.ic-long-arrow-alt-right:before{content:""}.ic-long-arrow-alt-up:before{content:""}.ic-low-vision:before{content:""}.ic-luggage-cart:before{content:""}.ic-lungs:before{content:""}.ic-lungs-virus:before{content:""}.ic-lyft:before{content:""}.ic-magento:before{content:""}.ic-magic:before{content:""}.ic-magnet:before{content:""}.ic-mail-bulk:before{content:""}.ic-mailchimp:before{content:""}.ic-male:before{content:""}.ic-mandalorian:before{content:""}.ic-map:before{content:""}.ic-map-marked:before{content:""}.ic-map-marked-alt:before{content:""}.ic-map-marker:before{content:""}.ic-map-marker-alt:before{content:""}.ic-map-pin:before{content:""}.ic-map-signs:before{content:""}.ic-markdown:before{content:""}.ic-marker:before{content:""}.ic-mars:before{content:""}.ic-mars-double:before{content:""}.ic-mars-stroke:before{content:""}.ic-mars-stroke-h:before{content:""}.ic-mars-stroke-v:before{content:""}.ic-mask:before{content:""}.ic-mastodon:before{content:""}.ic-maxcdn:before{content:""}.ic-mdb:before{content:""}.ic-medal:before{content:""}.ic-medapps:before{content:""}.ic-medium:before{content:""}.ic-medium-m:before{content:""}.ic-medkit:before{content:""}.ic-medrt:before{content:""}.ic-meetup:before{content:""}.ic-megaport:before{content:""}.ic-meh:before{content:""}.ic-meh-blank:before{content:""}.ic-meh-rolling-eyes:before{content:""}.ic-memory:before{content:""}.ic-mendeley:before{content:""}.ic-menorah:before{content:""}.ic-mercury:before{content:""}.ic-meteor:before{content:""}.ic-microblog:before{content:""}.ic-microchip:before{content:""}.ic-microphone:before{content:""}.ic-microphone-alt:before{content:""}.ic-microphone-alt-slash:before{content:""}.ic-microphone-slash:before{content:""}.ic-microscope:before{content:""}.ic-microsoft:before{content:""}.ic-minus:before{content:""}.ic-minus-circle:before{content:""}.ic-minus-square:before{content:""}.ic-mitten:before{content:""}.ic-mix:before{content:""}.ic-mixcloud:before{content:""}.ic-mixer:before{content:""}.ic-mizuni:before{content:""}.ic-mobile:before{content:""}.ic-mobile-alt:before{content:""}.ic-modx:before{content:""}.ic-monero:before{content:""}.ic-money-bill:before{content:""}.ic-money-bill-alt:before{content:""}.ic-money-bill-wave:before{content:""}.ic-money-bill-wave-alt:before{content:""}.ic-money-check:before{content:""}.ic-money-check-alt:before{content:""}.ic-monument:before{content:""}.ic-moon:before{content:""}.ic-mortar-pestle:before{content:""}.ic-mosque:before{content:""}.ic-motorcycle:before{content:""}.ic-mountain:before{content:""}.ic-mouse:before{content:""}.ic-mouse-pointer:before{content:""}.ic-mug-hot:before{content:""}.ic-music:before{content:""}.ic-napster:before{content:""}.ic-neos:before{content:""}.ic-network-wired:before{content:""}.ic-neuter:before{content:""}.ic-newspaper:before{content:""}.ic-nimblr:before{content:""}.ic-node:before{content:""}.ic-node-js:before{content:""}.ic-not-equal:before{content:""}.ic-notes-medical:before{content:""}.ic-npm:before{content:""}.ic-ns8:before{content:""}.ic-nutritionix:before{content:""}.ic-object-group:before{content:""}.ic-object-ungroup:before{content:""}.ic-octopus-deploy:before{content:""}.ic-odnoklassniki:before{content:""}.ic-odnoklassniki-square:before{content:""}.ic-oil-can:before{content:""}.ic-old-republic:before{content:""}.ic-om:before{content:""}.ic-opencart:before{content:""}.ic-openid:before{content:""}.ic-opera:before{content:""}.ic-optin-monster:before{content:""}.ic-orcid:before{content:""}.ic-osi:before{content:""}.ic-otter:before{content:""}.ic-outdent:before{content:""}.ic-page4:before{content:""}.ic-pagelines:before{content:""}.ic-pager:before{content:""}.ic-paint-brush:before{content:""}.ic-paint-roller:before{content:""}.ic-palette:before{content:""}.ic-palfed:before{content:""}.ic-pallet:before{content:""}.ic-paper-plane:before{content:""}.ic-paperclip:before{content:""}.ic-parachute-box:before{content:""}.ic-paragraph:before{content:""}.ic-parking:before{content:""}.ic-passport:before{content:""}.ic-pastafarianism:before{content:""}.ic-paste:before{content:""}.ic-patreon:before{content:""}.ic-pause:before{content:""}.ic-pause-circle:before{content:""}.ic-paw:before{content:""}.ic-paypal:before{content:""}.ic-peace:before{content:""}.ic-pen:before{content:""}.ic-pen-alt:before{content:""}.ic-pen-fancy:before{content:""}.ic-pen-nib:before{content:""}.ic-pen-square:before{content:""}.ic-pencil-alt:before{content:""}.ic-pencil-ruler:before{content:""}.ic-penny-arcade:before{content:""}.ic-people-arrows:before{content:""}.ic-people-carry:before{content:""}.ic-pepper-hot:before{content:""}.ic-perbyte:before{content:""}.ic-percent:before{content:""}.ic-percentage:before{content:""}.ic-periscope:before{content:""}.ic-person-booth:before{content:""}.ic-phabricator:before{content:""}.ic-phoenix-framework:before{content:""}.ic-phoenix-squadron:before{content:""}.ic-phone:before{content:""}.ic-phone-alt:before{content:""}.ic-phone-slash:before{content:""}.ic-phone-square:before{content:""}.ic-phone-square-alt:before{content:""}.ic-phone-volume:before{content:""}.ic-photo-video:before{content:""}.ic-php:before{content:""}.ic-pied-piper:before{content:""}.ic-pied-piper-alt:before{content:""}.ic-pied-piper-hat:before{content:""}.ic-pied-piper-pp:before{content:""}.ic-pied-piper-square:before{content:""}.ic-piggy-bank:before{content:""}.ic-pills:before{content:""}.ic-pinterest:before{content:""}.ic-pinterest-p:before{content:""}.ic-pinterest-square:before{content:""}.ic-pizza-slice:before{content:""}.ic-place-of-worship:before{content:""}.ic-plane:before{content:""}.ic-plane-arrival:before{content:""}.ic-plane-departure:before{content:""}.ic-plane-slash:before{content:""}.ic-play:before{content:""}.ic-play-circle:before{content:""}.ic-playstation:before{content:""}.ic-plug:before{content:""}.ic-plus:before{content:""}.ic-plus-circle:before{content:""}.ic-plus-square:before{content:""}.ic-podcast:before{content:""}.ic-poll:before{content:""}.ic-poll-h:before{content:""}.ic-poo:before{content:""}.ic-poo-storm:before{content:""}.ic-poop:before{content:""}.ic-portrait:before{content:""}.ic-pound-sign:before{content:""}.ic-power-off:before{content:""}.ic-pray:before{content:""}.ic-praying-hands:before{content:""}.ic-prescription:before{content:""}.ic-prescription-bottle:before{content:""}.ic-prescription-bottle-alt:before{content:""}.ic-print:before{content:""}.ic-procedures:before{content:""}.ic-product-hunt:before{content:""}.ic-project-diagram:before{content:""}.ic-pump-medical:before{content:""}.ic-pump-soap:before{content:""}.ic-pushed:before{content:""}.ic-puzzle-piece:before{content:""}.ic-python:before{content:""}.ic-qq:before{content:""}.ic-qrcode:before{content:""}.ic-question:before{content:""}.ic-question-circle:before{content:""}.ic-quidditch:before{content:""}.ic-quinscape:before{content:""}.ic-quora:before{content:""}.ic-quote-left:before{content:""}.ic-quote-right:before{content:""}.ic-quran:before{content:""}.ic-r-project:before{content:""}.ic-radiation:before{content:""}.ic-radiation-alt:before{content:""}.ic-rainbow:before{content:""}.ic-random:before{content:""}.ic-raspberry-pi:before{content:""}.ic-ravelry:before{content:""}.ic-react:before{content:""}.ic-reacteurope:before{content:""}.ic-readme:before{content:""}.ic-rebel:before{content:""}.ic-receipt:before{content:""}.ic-record-vinyl:before{content:""}.ic-recycle:before{content:""}.ic-red-river:before{content:""}.ic-reddit:before{content:""}.ic-reddit-alien:before{content:""}.ic-reddit-square:before{content:""}.ic-redhat:before{content:""}.ic-redo:before{content:""}.ic-redo-alt:before{content:""}.ic-registered:before{content:""}.ic-remove-format:before{content:""}.ic-renren:before{content:""}.ic-reply:before{content:""}.ic-reply-all:before{content:""}.ic-replyd:before{content:""}.ic-republican:before{content:""}.ic-researchgate:before{content:""}.ic-resolving:before{content:""}.ic-restroom:before{content:""}.ic-retweet:before{content:""}.ic-rev:before{content:""}.ic-ribbon:before{content:""}.ic-ring:before{content:""}.ic-road:before{content:""}.ic-robot:before{content:""}.ic-rocket:before{content:""}.ic-rocketchat:before{content:""}.ic-rockrms:before{content:""}.ic-route:before{content:""}.ic-rss:before{content:""}.ic-rss-square:before{content:""}.ic-ruble-sign:before{content:""}.ic-ruler:before{content:""}.ic-ruler-combined:before{content:""}.ic-ruler-horizontal:before{content:""}.ic-ruler-vertical:before{content:""}.ic-running:before{content:""}.ic-rupee-sign:before{content:""}.ic-rust:before{content:""}.ic-sad-cry:before{content:""}.ic-sad-tear:before{content:""}.ic-safari:before{content:""}.ic-salesforce:before{content:""}.ic-sass:before{content:""}.ic-satellite:before{content:""}.ic-satellite-dish:before{content:""}.ic-save:before{content:""}.ic-schlix:before{content:""}.ic-school:before{content:""}.ic-screwdriver:before{content:""}.ic-scribd:before{content:""}.ic-scroll:before{content:""}.ic-sd-card:before{content:""}.ic-search:before{content:""}.ic-search-dollar:before{content:""}.ic-search-location:before{content:""}.ic-search-minus:before{content:""}.ic-search-plus:before{content:""}.ic-searchengin:before{content:""}.ic-seedling:before{content:""}.ic-sellcast:before{content:""}.ic-sellsy:before{content:""}.ic-server:before{content:""}.ic-servicestack:before{content:""}.ic-shapes:before{content:""}.ic-share:before{content:""}.ic-share-alt:before{content:""}.ic-share-alt-square:before{content:""}.ic-share-square:before{content:""}.ic-shekel-sign:before{content:""}.ic-shield-alt:before{content:""}.ic-shield-virus:before{content:""}.ic-ship:before{content:""}.ic-shipping-fast:before{content:""}.ic-shirtsinbulk:before{content:""}.ic-shoe-prints:before{content:""}.ic-shopify:before{content:""}.ic-shopping-bag:before{content:""}.ic-shopping-basket:before{content:""}.ic-shopping-cart:before{content:""}.ic-shopware:before{content:""}.ic-shower:before{content:""}.ic-shuttle-van:before{content:""}.ic-sign:before{content:""}.ic-sign-in-alt:before{content:""}.ic-sign-language:before{content:""}.ic-sign-out-alt:before{content:""}.ic-signal:before{content:""}.ic-signature:before{content:""}.ic-sim-card:before{content:""}.ic-simplybuilt:before{content:""}.ic-sink:before{content:""}.ic-sistrix:before{content:""}.ic-sitemap:before{content:""}.ic-sith:before{content:""}.ic-skating:before{content:""}.ic-sketch:before{content:""}.ic-skiing:before{content:""}.ic-skiing-nordic:before{content:""}.ic-skull:before{content:""}.ic-skull-crossbones:before{content:""}.ic-skyatlas:before{content:""}.ic-skype:before{content:""}.ic-slack:before{content:""}.ic-slack-hash:before{content:""}.ic-slash:before{content:""}.ic-sleigh:before{content:""}.ic-sliders-h:before{content:""}.ic-slideshare:before{content:""}.ic-smile:before{content:""}.ic-smile-beam:before{content:""}.ic-smile-wink:before{content:""}.ic-smog:before{content:""}.ic-smoking:before{content:""}.ic-smoking-ban:before{content:""}.ic-sms:before{content:""}.ic-snapchat:before{content:""}.ic-snapchat-ghost:before{content:""}.ic-snapchat-square:before{content:""}.ic-snowboarding:before{content:""}.ic-snowflake:before{content:""}.ic-snowman:before{content:""}.ic-snowplow:before{content:""}.ic-soap:before{content:""}.ic-socks:before{content:""}.ic-solar-panel:before{content:""}.ic-sort:before{content:""}.ic-sort-alpha-down:before{content:""}.ic-sort-alpha-down-alt:before{content:""}.ic-sort-alpha-up:before{content:""}.ic-sort-alpha-up-alt:before{content:""}.ic-sort-amount-down:before{content:""}.ic-sort-amount-down-alt:before{content:""}.ic-sort-amount-up:before{content:""}.ic-sort-amount-up-alt:before{content:""}.ic-sort-down:before{content:""}.ic-sort-numeric-down:before{content:""}.ic-sort-numeric-down-alt:before{content:""}.ic-sort-numeric-up:before{content:""}.ic-sort-numeric-up-alt:before{content:""}.ic-sort-up:before{content:""}.ic-soundcloud:before{content:""}.ic-sourcetree:before{content:""}.ic-spa:before{content:""}.ic-space-shuttle:before{content:""}.ic-speakap:before{content:""}.ic-speaker-deck:before{content:""}.ic-spell-check:before{content:""}.ic-spider:before{content:""}.ic-spinner:before{content:""}.ic-splotch:before{content:""}.ic-spotify:before{content:""}.ic-spray-can:before{content:""}.ic-square:before{content:""}.ic-square-full:before{content:""}.ic-square-root-alt:before{content:""}.ic-squarespace:before{content:""}.ic-stack-exchange:before{content:""}.ic-stack-overflow:before{content:""}.ic-stackpath:before{content:""}.ic-stamp:before{content:""}.ic-star:before{content:""}.ic-star-and-crescent:before{content:""}.ic-star-half:before{content:""}.ic-star-half-alt:before{content:""}.ic-star-of-david:before{content:""}.ic-star-of-life:before{content:""}.ic-staylinked:before{content:""}.ic-steam:before{content:""}.ic-steam-square:before{content:""}.ic-steam-symbol:before{content:""}.ic-step-backward:before{content:""}.ic-step-forward:before{content:""}.ic-stethoscope:before{content:""}.ic-sticker-mule:before{content:""}.ic-sticky-note:before{content:""}.ic-stop:before{content:""}.ic-stop-circle:before{content:""}.ic-stopwatch:before{content:""}.ic-stopwatch-20:before{content:""}.ic-store:before{content:""}.ic-store-alt:before{content:""}.ic-store-alt-slash:before{content:""}.ic-store-slash:before{content:""}.ic-strava:before{content:""}.ic-stream:before{content:""}.ic-street-view:before{content:""}.ic-strikethrough:before{content:""}.ic-stripe:before{content:""}.ic-stripe-s:before{content:""}.ic-stroopwafel:before{content:""}.ic-studiovinari:before{content:""}.ic-stumbleupon:before{content:""}.ic-stumbleupon-circle:before{content:""}.ic-subscript:before{content:""}.ic-subway:before{content:""}.ic-suitcase:before{content:""}.ic-suitcase-rolling:before{content:""}.ic-sun:before{content:""}.ic-superpowers:before{content:""}.ic-superscript:before{content:""}.ic-supple:before{content:""}.ic-surprise:before{content:""}.ic-suse:before{content:""}.ic-swatchbook:before{content:""}.ic-swift:before{content:""}.ic-swimmer:before{content:""}.ic-swimming-pool:before{content:""}.ic-symfony:before{content:""}.ic-synagogue:before{content:""}.ic-sync:before{content:""}.ic-sync-alt:before{content:""}.ic-syringe:before{content:""}.ic-table:before{content:""}.ic-table-tennis:before{content:""}.ic-tablet:before{content:""}.ic-tablet-alt:before{content:""}.ic-tablets:before{content:""}.ic-tachometer-alt:before{content:""}.ic-tag:before{content:""}.ic-tags:before{content:""}.ic-tape:before{content:""}.ic-tasks:before{content:""}.ic-taxi:before{content:""}.ic-teamspeak:before{content:""}.ic-teeth:before{content:""}.ic-teeth-open:before{content:""}.ic-telegram:before{content:""}.ic-telegram-plane:before{content:""}.ic-temperature-high:before{content:""}.ic-temperature-low:before{content:""}.ic-tencent-weibo:before{content:""}.ic-tenge:before{content:""}.ic-terminal:before{content:""}.ic-text-height:before{content:""}.ic-text-width:before{content:""}.ic-th:before{content:""}.ic-th-large:before{content:""}.ic-th-list:before{content:""}.ic-the-red-yeti:before{content:""}.ic-theater-masks:before{content:""}.ic-themeco:before{content:""}.ic-themeisle:before{content:""}.ic-thermometer:before{content:""}.ic-thermometer-empty:before{content:""}.ic-thermometer-full:before{content:""}.ic-thermometer-half:before{content:""}.ic-thermometer-quarter:before{content:""}.ic-thermometer-three-quarters:before{content:""}.ic-think-peaks:before{content:""}.ic-thumbs-down:before{content:""}.ic-thumbs-up:before{content:""}.ic-thumbtack:before{content:""}.ic-ticket-alt:before{content:""}.ic-tiktok:before{content:""}.ic-times:before{content:""}.ic-times-circle:before{content:""}.ic-tint:before{content:""}.ic-tint-slash:before{content:""}.ic-tired:before{content:""}.ic-toggle-off:before{content:""}.ic-toggle-on:before{content:""}.ic-toilet:before{content:""}.ic-toilet-paper:before{content:""}.ic-toilet-paper-slash:before{content:""}.ic-toolbox:before{content:""}.ic-tools:before{content:""}.ic-tooth:before{content:""}.ic-torah:before{content:""}.ic-torii-gate:before{content:""}.ic-tractor:before{content:""}.ic-trade-federation:before{content:""}.ic-trademark:before{content:""}.ic-traffic-light:before{content:""}.ic-trailer:before{content:""}.ic-train:before{content:""}.ic-tram:before{content:""}.ic-transgender:before{content:""}.ic-transgender-alt:before{content:""}.ic-trash:before{content:""}.ic-trash-alt:before{content:""}.ic-trash-restore:before{content:""}.ic-trash-restore-alt:before{content:""}.ic-tree:before{content:""}.ic-trello:before{content:""}.ic-tripadvisor:before{content:""}.ic-trophy:before{content:""}.ic-truck:before{content:""}.ic-truck-loading:before{content:""}.ic-truck-monster:before{content:""}.ic-truck-moving:before{content:""}.ic-truck-pickup:before{content:""}.ic-tshirt:before{content:""}.ic-tty:before{content:""}.ic-tumblr:before{content:""}.ic-tumblr-square:before{content:""}.ic-tv:before{content:""}.ic-twitch:before{content:""}.ic-twitter:before{content:""}.ic-twitter-square:before{content:""}.ic-typo3:before{content:""}.ic-uber:before{content:""}.ic-ubuntu:before{content:""}.ic-uikit:before{content:""}.ic-umbraco:before{content:""}.ic-umbrella:before{content:""}.ic-umbrella-beach:before{content:""}.ic-uncharted:before{content:""}.ic-underline:before{content:""}.ic-undo:before{content:""}.ic-undo-alt:before{content:""}.ic-uniregistry:before{content:""}.ic-unity:before{content:""}.ic-universal-access:before{content:""}.ic-university:before{content:""}.ic-unlink:before{content:""}.ic-unlock:before{content:""}.ic-unlock-alt:before{content:""}.ic-unsplash:before{content:""}.ic-untappd:before{content:""}.ic-upload:before{content:""}.ic-ups:before{content:""}.ic-usb:before{content:""}.ic-user:before{content:""}.ic-user-alt:before{content:""}.ic-user-alt-slash:before{content:""}.ic-user-astronaut:before{content:""}.ic-user-check:before{content:""}.ic-user-circle:before{content:""}.ic-user-clock:before{content:""}.ic-user-cog:before{content:""}.ic-user-edit:before{content:""}.ic-user-friends:before{content:""}.ic-user-graduate:before{content:""}.ic-user-injured:before{content:""}.ic-user-lock:before{content:""}.ic-user-md:before{content:""}.ic-user-minus:before{content:""}.ic-user-ninja:before{content:""}.ic-user-nurse:before{content:""}.ic-user-plus:before{content:""}.ic-user-secret:before{content:""}.ic-user-shield:before{content:""}.ic-user-slash:before{content:""}.ic-user-tag:before{content:""}.ic-user-tie:before{content:""}.ic-user-times:before{content:""}.ic-users:before{content:""}.ic-users-cog:before{content:""}.ic-users-slash:before{content:""}.ic-usps:before{content:""}.ic-ussunnah:before{content:""}.ic-utensil-spoon:before{content:""}.ic-utensils:before{content:""}.ic-vaadin:before{content:""}.ic-vector-square:before{content:""}.ic-venus:before{content:""}.ic-venus-double:before{content:""}.ic-venus-mars:before{content:""}.ic-vest:before{content:""}.ic-vest-patches:before{content:""}.ic-viacoin:before{content:""}.ic-viadeo:before{content:""}.ic-viadeo-square:before{content:""}.ic-vial:before{content:""}.ic-vials:before{content:""}.ic-viber:before{content:""}.ic-video:before{content:""}.ic-video-slash:before{content:""}.ic-vihara:before{content:""}.ic-vimeo:before{content:""}.ic-vimeo-square:before{content:""}.ic-vimeo-v:before{content:""}.ic-vine:before{content:""}.ic-virus:before{content:""}.ic-virus-slash:before{content:""}.ic-viruses:before{content:""}.ic-vk:before{content:""}.ic-vnv:before{content:""}.ic-voicemail:before{content:""}.ic-volleyball-ball:before{content:""}.ic-volume-down:before{content:""}.ic-volume-mute:before{content:""}.ic-volume-off:before{content:""}.ic-volume-up:before{content:""}.ic-vote-yea:before{content:""}.ic-vr-cardboard:before{content:""}.ic-vuejs:before{content:""}.ic-walking:before{content:""}.ic-wallet:before{content:""}.ic-warehouse:before{content:""}.ic-watchman-monitoring:before{content:""}.ic-water:before{content:""}.ic-wave-square:before{content:""}.ic-waze:before{content:""}.ic-weebly:before{content:""}.ic-weibo:before{content:""}.ic-weight:before{content:""}.ic-weight-hanging:before{content:""}.ic-weixin:before{content:""}.ic-whatsapp:before{content:""}.ic-whatsapp-square:before{content:""}.ic-wheelchair:before{content:""}.ic-whmcs:before{content:""}.ic-wifi:before{content:""}.ic-wikipedia-w:before{content:""}.ic-wind:before{content:""}.ic-window-close:before{content:""}.ic-window-maximize:before{content:""}.ic-window-minimize:before{content:""}.ic-window-restore:before{content:""}.ic-windows:before{content:""}.ic-wine-bottle:before{content:""}.ic-wine-glass:before{content:""}.ic-wine-glass-alt:before{content:""}.ic-wix:before{content:""}.ic-wizards-of-the-coast:before{content:""}.ic-wodu:before{content:""}.ic-wolf-pack-battalion:before{content:""}.ic-won-sign:before{content:""}.ic-wordpress:before{content:""}.ic-wordpress-simple:before{content:""}.ic-wpbeginner:before{content:""}.ic-wpexplorer:before{content:""}.ic-wpforms:before{content:""}.ic-wpressr:before{content:""}.ic-wrench:before{content:""}.ic-x-ray:before{content:""}.ic-xbox:before{content:""}.ic-xing:before{content:""}.ic-xing-square:before{content:""}.ic-y-combinator:before{content:""}.ic-yahoo:before{content:""}.ic-yammer:before{content:""}.ic-yandex:before{content:""}.ic-yandex-international:before{content:""}.ic-yarn:before{content:""}.ic-yelp:before{content:""}.ic-yen-sign:before{content:""}.ic-yin-yang:before{content:""}.ic-yoast:before{content:""}.ic-youtube:before{content:""}.ic-youtube-square:before{content:""}.ic-zhihu:before{content:""}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(data:font/woff;base64,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) format("woff")}.fa,.fas,.mapIcon16,.uiIcon16,.uiIcon24{font-family:Font Awesome\ 5 Free;font-weight:900}.mapIcon16,.uiIcon16,.uiIcon24{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-style:normal;font-variant:normal;font-weight:400;line-height:1;font-size:12px;padding:2px}.uiIcon24{font-size:24px}.uiIcon24.uiStatusIcon:before{content:""}.uiIcon24.uiStatusIcon.uiStatusGood{color:#080}.uiIcon24.uiStatusIcon.uiStatusAverage{color:#afa404}.uiIcon24.uiStatusIcon.uiStatusBad{color:#c20000}.icon-carat-1-n.mapIcon16:before,.icon-carat-1-n.uiIcon24:before,.uiIcon16.icon-carat-1-n:before{content:""}.icon-carat-1-ne.mapIcon16,.icon-carat-1-ne.uiIcon24,.uiIcon16.icon-carat-1-ne{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-carat-1-ne.mapIcon16:before,.icon-carat-1-ne.uiIcon24:before,.uiIcon16.icon-carat-1-ne:before{content:""}.icon-carat-1-e.mapIcon16:before,.icon-carat-1-e.uiIcon24:before,.uiIcon16.icon-carat-1-e:before{content:""}.icon-carat-1-se.mapIcon16,.icon-carat-1-se.uiIcon24,.uiIcon16.icon-carat-1-se{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-carat-1-se.mapIcon16:before,.icon-carat-1-se.uiIcon24:before,.uiIcon16.icon-carat-1-se:before{content:""}.icon-carat-1-s.mapIcon16:before,.icon-carat-1-s.uiIcon24:before,.uiIcon16.icon-carat-1-s:before{content:""}.icon-carat-1-sw.mapIcon16,.icon-carat-1-sw.uiIcon24,.uiIcon16.icon-carat-1-sw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-carat-1-sw.mapIcon16:before,.icon-carat-1-sw.uiIcon24:before,.uiIcon16.icon-carat-1-sw:before{content:""}.icon-carat-1-w.mapIcon16:before,.icon-carat-1-w.uiIcon24:before,.uiIcon16.icon-carat-1-w:before{content:""}.icon-carat-1-nw.mapIcon16,.icon-carat-1-nw.uiIcon24,.uiIcon16.icon-carat-1-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-carat-1-nw.mapIcon16:before,.icon-carat-1-nw.uiIcon24:before,.uiIcon16.icon-carat-1-nw:before{content:""}.icon-carat-2-n-s.mapIcon16,.icon-carat-2-n-s.uiIcon24,.uiIcon16.icon-carat-2-n-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-carat-2-e-w.mapIcon16:before,.icon-carat-2-e-w.uiIcon24:before,.icon-carat-2-n-s.mapIcon16:before,.icon-carat-2-n-s.uiIcon24:before,.uiIcon16.icon-carat-2-e-w:before,.uiIcon16.icon-carat-2-n-s:before{content:""}.icon-triangle-1-n.mapIcon16:before,.icon-triangle-1-n.uiIcon24:before,.uiIcon16.icon-triangle-1-n:before{content:""}.icon-triangle-1-ne.mapIcon16,.icon-triangle-1-ne.uiIcon24,.uiIcon16.icon-triangle-1-ne{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-triangle-1-ne.mapIcon16:before,.icon-triangle-1-ne.uiIcon24:before,.uiIcon16.icon-triangle-1-ne:before{content:""}.icon-triangle-1-e.mapIcon16:before,.icon-triangle-1-e.uiIcon24:before,.uiIcon16.icon-triangle-1-e:before{content:""}.icon-triangle-1-se.mapIcon16,.icon-triangle-1-se.uiIcon24,.uiIcon16.icon-triangle-1-se{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-triangle-1-se.mapIcon16:before,.icon-triangle-1-se.uiIcon24:before,.uiIcon16.icon-triangle-1-se:before{content:""}.icon-triangle-1-s.mapIcon16:before,.icon-triangle-1-s.uiIcon24:before,.uiIcon16.icon-triangle-1-s:before{content:""}.icon-triangle-1-sw.mapIcon16,.icon-triangle-1-sw.uiIcon24,.uiIcon16.icon-triangle-1-sw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-triangle-1-sw.mapIcon16:before,.icon-triangle-1-sw.uiIcon24:before,.uiIcon16.icon-triangle-1-sw:before{content:""}.icon-triangle-1-w.mapIcon16:before,.icon-triangle-1-w.uiIcon24:before,.uiIcon16.icon-triangle-1-w:before{content:""}.icon-triangle-1-nw.mapIcon16,.icon-triangle-1-nw.uiIcon24,.uiIcon16.icon-triangle-1-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-triangle-1-nw.mapIcon16:before,.icon-triangle-1-nw.uiIcon24:before,.uiIcon16.icon-triangle-1-nw:before{content:""}.icon-triangle-2-n-s.mapIcon16:before,.icon-triangle-2-n-s.uiIcon24:before,.uiIcon16.icon-triangle-2-n-s:before{content:""}.icon-triangle-2-e-w.mapIcon16:before,.icon-triangle-2-e-w.uiIcon24:before,.uiIcon16.icon-triangle-2-e-w:before{content:" "}.icon-arrow-1-n.mapIcon16:before,.icon-arrow-1-n.uiIcon24:before,.uiIcon16.icon-arrow-1-n:before{content:""}.icon-arrow-1-ne.mapIcon16,.icon-arrow-1-ne.uiIcon24,.uiIcon16.icon-arrow-1-ne{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-1-ne.mapIcon16:before,.icon-arrow-1-ne.uiIcon24:before,.uiIcon16.icon-arrow-1-ne:before{content:""}.icon-arrow-1-e.mapIcon16:before,.icon-arrow-1-e.uiIcon24:before,.uiIcon16.icon-arrow-1-e:before{content:""}.icon-arrow-1-se.mapIcon16,.icon-arrow-1-se.uiIcon24,.uiIcon16.icon-arrow-1-se{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-1-se.mapIcon16:before,.icon-arrow-1-se.uiIcon24:before,.uiIcon16.icon-arrow-1-se:before{content:""}.icon-arrow-1-s.mapIcon16:before,.icon-arrow-1-s.uiIcon24:before,.uiIcon16.icon-arrow-1-s:before{content:""}.icon-arrow-1-sw.mapIcon16,.icon-arrow-1-sw.uiIcon24,.uiIcon16.icon-arrow-1-sw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-1-sw.mapIcon16:before,.icon-arrow-1-sw.uiIcon24:before,.uiIcon16.icon-arrow-1-sw:before{content:""}.icon-arrow-1-w.mapIcon16:before,.icon-arrow-1-w.uiIcon24:before,.uiIcon16.icon-arrow-1-w:before{content:""}.icon-arrow-1-nw.mapIcon16,.icon-arrow-1-nw.uiIcon24,.uiIcon16.icon-arrow-1-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-1-nw.mapIcon16:before,.icon-arrow-1-nw.uiIcon24:before,.uiIcon16.icon-arrow-1-nw:before{content:""}.icon-arrow-2-n-s.mapIcon16:before,.icon-arrow-2-n-s.uiIcon24:before,.uiIcon16.icon-arrow-2-n-s:before{content:""}.icon-arrow-2-ne-sw.mapIcon16,.icon-arrow-2-ne-sw.uiIcon24,.uiIcon16.icon-arrow-2-ne-sw{-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.icon-arrow-2-e-w.mapIcon16:before,.icon-arrow-2-e-w.uiIcon24:before,.icon-arrow-2-ne-sw.mapIcon16:before,.icon-arrow-2-ne-sw.uiIcon24:before,.uiIcon16.icon-arrow-2-e-w:before,.uiIcon16.icon-arrow-2-ne-sw:before{content:""}.icon-arrow-2-se-nw.mapIcon16,.icon-arrow-2-se-nw.uiIcon24,.uiIcon16.icon-arrow-2-se-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-2-se-nw.mapIcon16:before,.icon-arrow-2-se-nw.uiIcon24:before,.uiIcon16.icon-arrow-2-se-nw:before{content:""}.icon-arrowstop-1-n.mapIcon16,.icon-arrowstop-1-n.uiIcon24,.uiIcon16.icon-arrowstop-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowstop-1-e.mapIcon16:before,.icon-arrowstop-1-e.uiIcon24:before,.icon-arrowstop-1-n.mapIcon16:before,.icon-arrowstop-1-n.uiIcon24:before,.uiIcon16.icon-arrowstop-1-e:before,.uiIcon16.icon-arrowstop-1-n:before{content:""}.icon-arrowstop-1-s.mapIcon16,.icon-arrowstop-1-s.uiIcon24,.uiIcon16.icon-arrowstop-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowstop-1-s.mapIcon16:before,.icon-arrowstop-1-s.uiIcon24:before,.uiIcon16.icon-arrowstop-1-s:before{content:""}.icon-arrowstop-1-w.mapIcon16,.icon-arrowstop-1-w.uiIcon24,.uiIcon16.icon-arrowstop-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowstop-1-w.mapIcon16:before,.icon-arrowstop-1-w.uiIcon24:before,.uiIcon16.icon-arrowstop-1-w:before{content:""}.icon-arrowthick-1-n.mapIcon16:before,.icon-arrowthick-1-n.uiIcon24:before,.uiIcon16.icon-arrowthick-1-n:before{content:""}.icon-arrowthick-1-ne.mapIcon16,.icon-arrowthick-1-ne.uiIcon24,.uiIcon16.icon-arrowthick-1-ne{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-1-ne.mapIcon16:before,.icon-arrowthick-1-ne.uiIcon24:before,.uiIcon16.icon-arrowthick-1-ne:before{content:""}.icon-arrowthick-1-e.mapIcon16:before,.icon-arrowthick-1-e.uiIcon24:before,.uiIcon16.icon-arrowthick-1-e:before{content:""}.icon-arrowthick-1-se.mapIcon16,.icon-arrowthick-1-se.uiIcon24,.uiIcon16.icon-arrowthick-1-se{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-1-se.mapIcon16:before,.icon-arrowthick-1-se.uiIcon24:before,.uiIcon16.icon-arrowthick-1-se:before{content:""}.icon-arrowthick-1-s.mapIcon16:before,.icon-arrowthick-1-s.uiIcon24:before,.uiIcon16.icon-arrowthick-1-s:before{content:""}.icon-arrowthick-1-sw.mapIcon16,.icon-arrowthick-1-sw.uiIcon24,.uiIcon16.icon-arrowthick-1-sw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-1-sw.mapIcon16:before,.icon-arrowthick-1-sw.uiIcon24:before,.uiIcon16.icon-arrowthick-1-sw:before{content:""}.icon-arrowthick-1-w.mapIcon16:before,.icon-arrowthick-1-w.uiIcon24:before,.uiIcon16.icon-arrowthick-1-w:before{content:""}.icon-arrowthick-1-nw.mapIcon16,.icon-arrowthick-1-nw.uiIcon24,.uiIcon16.icon-arrowthick-1-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-1-nw.mapIcon16:before,.icon-arrowthick-1-nw.uiIcon24:before,.uiIcon16.icon-arrowthick-1-nw:before{content:""}.icon-arrowthick-2-n-s.mapIcon16:before,.icon-arrowthick-2-n-s.uiIcon24:before,.uiIcon16.icon-arrowthick-2-n-s:before{content:""}.icon-arrowthick-2-ne-sw.mapIcon16,.icon-arrowthick-2-ne-sw.uiIcon24,.uiIcon16.icon-arrowthick-2-ne-sw{-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.icon-arrowthick-2-e-w.mapIcon16:before,.icon-arrowthick-2-e-w.uiIcon24:before,.icon-arrowthick-2-ne-sw.mapIcon16:before,.icon-arrowthick-2-ne-sw.uiIcon24:before,.uiIcon16.icon-arrowthick-2-e-w:before,.uiIcon16.icon-arrowthick-2-ne-sw:before{content:""}.icon-arrowthick-2-se-nw.mapIcon16,.icon-arrowthick-2-se-nw.uiIcon24,.uiIcon16.icon-arrowthick-2-se-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-2-se-nw.mapIcon16:before,.icon-arrowthick-2-se-nw.uiIcon24:before,.uiIcon16.icon-arrowthick-2-se-nw:before{content:""}.icon-arrowthickstop-1-n.mapIcon16,.icon-arrowthickstop-1-n.uiIcon24,.uiIcon16.icon-arrowthickstop-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowthickstop-1-e.mapIcon16:before,.icon-arrowthickstop-1-e.uiIcon24:before,.icon-arrowthickstop-1-n.mapIcon16:before,.icon-arrowthickstop-1-n.uiIcon24:before,.uiIcon16.icon-arrowthickstop-1-e:before,.uiIcon16.icon-arrowthickstop-1-n:before{content:""}.icon-arrowthickstop-1-s.mapIcon16,.icon-arrowthickstop-1-s.uiIcon24,.uiIcon16.icon-arrowthickstop-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowthickstop-1-s.mapIcon16:before,.icon-arrowthickstop-1-s.uiIcon24:before,.uiIcon16.icon-arrowthickstop-1-s:before{content:""}.icon-arrowthickstop-1-w.mapIcon16,.icon-arrowthickstop-1-w.uiIcon24,.uiIcon16.icon-arrowthickstop-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowthickstop-1-w.mapIcon16:before,.icon-arrowthickstop-1-w.uiIcon24:before,.uiIcon16.icon-arrowthickstop-1-w:before{content:""}.icon-arrowreturnthick-1-w.mapIcon16,.icon-arrowreturnthick-1-w.uiIcon24,.uiIcon16.icon-arrowreturnthick-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowreturnthick-1-w.mapIcon16:before,.icon-arrowreturnthick-1-w.uiIcon24:before,.uiIcon16.icon-arrowreturnthick-1-w:before{content:""}.icon-arrowreturnthick-1-n.mapIcon16,.icon-arrowreturnthick-1-n.uiIcon24,.uiIcon16.icon-arrowreturnthick-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowreturnthick-1-e.mapIcon16:before,.icon-arrowreturnthick-1-e.uiIcon24:before,.icon-arrowreturnthick-1-n.mapIcon16:before,.icon-arrowreturnthick-1-n.uiIcon24:before,.uiIcon16.icon-arrowreturnthick-1-e:before,.uiIcon16.icon-arrowreturnthick-1-n:before{content:""}.icon-arrowreturnthick-1-s.mapIcon16,.icon-arrowreturnthick-1-s.uiIcon24,.uiIcon16.icon-arrowreturnthick-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowreturnthick-1-s.mapIcon16:before,.icon-arrowreturnthick-1-s.uiIcon24:before,.uiIcon16.icon-arrowreturnthick-1-s:before{content:""}.icon-arrowreturn-1-w.mapIcon16,.icon-arrowreturn-1-w.uiIcon24,.uiIcon16.icon-arrowreturn-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowreturn-1-w.mapIcon16:before,.icon-arrowreturn-1-w.uiIcon24:before,.uiIcon16.icon-arrowreturn-1-w:before{content:""}.icon-arrowreturn-1-n.mapIcon16,.icon-arrowreturn-1-n.uiIcon24,.uiIcon16.icon-arrowreturn-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowreturn-1-e.mapIcon16:before,.icon-arrowreturn-1-e.uiIcon24:before,.icon-arrowreturn-1-n.mapIcon16:before,.icon-arrowreturn-1-n.uiIcon24:before,.uiIcon16.icon-arrowreturn-1-e:before,.uiIcon16.icon-arrowreturn-1-n:before{content:""}.icon-arrowreturn-1-s.mapIcon16,.icon-arrowreturn-1-s.uiIcon24,.uiIcon16.icon-arrowreturn-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowreturn-1-s.mapIcon16:before,.icon-arrowreturn-1-s.uiIcon24:before,.uiIcon16.icon-arrowreturn-1-s:before{content:""}.icon-arrowrefresh-1-w.mapIcon16,.icon-arrowrefresh-1-w.uiIcon24,.uiIcon16.icon-arrowrefresh-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowrefresh-1-w.mapIcon16:before,.icon-arrowrefresh-1-w.uiIcon24:before,.uiIcon16.icon-arrowrefresh-1-w:before{content:""}.icon-arrowrefresh-1-n.mapIcon16,.icon-arrowrefresh-1-n.uiIcon24,.uiIcon16.icon-arrowrefresh-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowrefresh-1-e.mapIcon16:before,.icon-arrowrefresh-1-e.uiIcon24:before,.icon-arrowrefresh-1-n.mapIcon16:before,.icon-arrowrefresh-1-n.uiIcon24:before,.uiIcon16.icon-arrowrefresh-1-e:before,.uiIcon16.icon-arrowrefresh-1-n:before{content:""}.icon-arrowrefresh-1-s.mapIcon16,.icon-arrowrefresh-1-s.uiIcon24,.uiIcon16.icon-arrowrefresh-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowrefresh-1-s.mapIcon16:before,.icon-arrowrefresh-1-s.uiIcon24:before,.uiIcon16.icon-arrowrefresh-1-s:before{content:""}.icon-arrow-4.mapIcon16:before,.icon-arrow-4.uiIcon24:before,.uiIcon16.icon-arrow-4:before{content:""}.icon-arrow-4-diag.mapIcon16,.icon-arrow-4-diag.uiIcon24,.uiIcon16.icon-arrow-4-diag{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-4-diag.mapIcon16:before,.icon-arrow-4-diag.uiIcon24:before,.uiIcon16.icon-arrow-4-diag:before{content:""}.icon-extlink.mapIcon16:before,.icon-extlink.uiIcon24:before,.uiIcon16.icon-extlink:before{content:""}.icon-newwin.mapIcon16:before,.icon-newwin.uiIcon24:before,.uiIcon16.icon-newwin:before{content:""}.icon-refresh.mapIcon16:before,.icon-refresh.uiIcon24:before,.uiIcon16.icon-refresh:before{content:""}.icon-shuffle.mapIcon16:before,.icon-shuffle.uiIcon24:before,.uiIcon16.icon-shuffle:before{content:""}.icon-transfer-e-w.mapIcon16:before,.icon-transfer-e-w.uiIcon24:before,.icon-transferthick-e-w.mapIcon16:before,.icon-transferthick-e-w.uiIcon24:before,.uiIcon16.icon-transfer-e-w:before,.uiIcon16.icon-transferthick-e-w:before{content:""}.icon-radiation.mapIcon16:before,.icon-radiation.uiIcon24:before,.uiIcon16.icon-radiation:before{content:""}.icon-folder-collapsed.mapIcon16:before,.icon-folder-collapsed.uiIcon24:before,.uiIcon16.icon-folder-collapsed:before{content:""}.icon-folder-open.mapIcon16:before,.icon-folder-open.uiIcon24:before,.uiIcon16.icon-folder-open:before{content:""}.icon-document.mapIcon16:before,.icon-document.uiIcon24:before,.uiIcon16.icon-document:before{content:""}.icon-document-b.mapIcon16:before,.icon-document-b.uiIcon24:before,.uiIcon16.icon-document-b:before{content:""}.icon-note.mapIcon16:before,.icon-note.uiIcon24:before,.uiIcon16.icon-note:before{content:""}.icon-mail-closed.mapIcon16:before,.icon-mail-closed.uiIcon24:before,.uiIcon16.icon-mail-closed:before{content:""}.icon-mail-open.mapIcon16:before,.icon-mail-open.uiIcon24:before,.uiIcon16.icon-mail-open:before{content:""}.icon-suitcase.mapIcon16:before,.icon-suitcase.uiIcon24:before,.uiIcon16.icon-suitcase:before{content:""}.icon-comment.mapIcon16:before,.icon-comment.uiIcon24:before,.uiIcon16.icon-comment:before{content:""}.icon-person.mapIcon16:before,.icon-person.uiIcon24:before,.uiIcon16.icon-person:before{content:""}.icon-print.mapIcon16:before,.icon-print.uiIcon24:before,.uiIcon16.icon-print:before{content:""}.icon-trash.mapIcon16:before,.icon-trash.uiIcon24:before,.uiIcon16.icon-trash:before{content:""}.icon-locked.mapIcon16:before,.icon-locked.uiIcon24:before,.uiIcon16.icon-locked:before{content:""}.icon-unlocked.mapIcon16:before,.icon-unlocked.uiIcon24:before,.uiIcon16.icon-unlocked:before{content:""}.icon-bookmark.mapIcon16:before,.icon-bookmark.uiIcon24:before,.uiIcon16.icon-bookmark:before{content:""}.icon-tag.mapIcon16:before,.icon-tag.uiIcon24:before,.uiIcon16.icon-tag:before{content:""}.icon-home.mapIcon16:before,.icon-home.uiIcon24:before,.uiIcon16.icon-home:before{content:""}.icon-flag.mapIcon16:before,.icon-flag.uiIcon24:before,.uiIcon16.icon-flag:before{content:""}.icon-calendar.mapIcon16:before,.icon-calendar.uiIcon24:before,.uiIcon16.icon-calendar:before{content:""}.icon-cart.mapIcon16:before,.icon-cart.uiIcon24:before,.uiIcon16.icon-cart:before{content:""}.icon-pencil.mapIcon16:before,.icon-pencil.uiIcon24:before,.uiIcon16.icon-pencil:before{content:""}.icon-clock.mapIcon16:before,.icon-clock.uiIcon24:before,.uiIcon16.icon-clock:before{content:""}.icon-disk.mapIcon16:before,.icon-disk.uiIcon24:before,.uiIcon16.icon-disk:before{content:""}.icon-calculator.mapIcon16:before,.icon-calculator.uiIcon24:before,.uiIcon16.icon-calculator:before{content:""}.icon-zoomin.mapIcon16:before,.icon-zoomin.uiIcon24:before,.uiIcon16.icon-zoomin:before{content:""}.icon-zoomout.mapIcon16:before,.icon-zoomout.uiIcon24:before,.uiIcon16.icon-zoomout:before{content:""}.icon-search.mapIcon16:before,.icon-search.uiIcon24:before,.uiIcon16.icon-search:before{content:""}.icon-wrench.mapIcon16:before,.icon-wrench.uiIcon24:before,.uiIcon16.icon-wrench:before{content:""}.icon-gear.mapIcon16:before,.icon-gear.uiIcon24:before,.uiIcon16.icon-gear:before{content:""}.icon-heart.mapIcon16:before,.icon-heart.uiIcon24:before,.uiIcon16.icon-heart:before{content:""}.icon-star.mapIcon16:before,.icon-star.uiIcon24:before,.uiIcon16.icon-star:before{content:""}.icon-link.mapIcon16:before,.icon-link.uiIcon24:before,.uiIcon16.icon-link:before{content:""}.icon-cancel.mapIcon16:before,.icon-cancel.uiIcon24:before,.uiIcon16.icon-cancel:before{content:""}.icon-plus.mapIcon16:before,.icon-plus.uiIcon24:before,.icon-plusthick.mapIcon16:before,.icon-plusthick.uiIcon24:before,.uiIcon16.icon-plus:before,.uiIcon16.icon-plusthick:before{content:""}.icon-minus.mapIcon16:before,.icon-minus.uiIcon24:before,.icon-minusthick.mapIcon16:before,.icon-minusthick.uiIcon24:before,.uiIcon16.icon-minus:before,.uiIcon16.icon-minusthick:before{content:""}.icon-close.mapIcon16:before,.icon-close.uiIcon24:before,.icon-closethick.mapIcon16:before,.icon-closethick.uiIcon24:before,.uiIcon16.icon-close:before,.uiIcon16.icon-closethick:before{content:""}.icon-key.mapIcon16:before,.icon-key.uiIcon24:before,.uiIcon16.icon-key:before{content:""}.icon-lightbulb.mapIcon16:before,.icon-lightbulb.uiIcon24:before,.uiIcon16.icon-lightbulb:before{content:""}.icon-scissors.mapIcon16:before,.icon-scissors.uiIcon24:before,.uiIcon16.icon-scissors:before{content:""}.icon-clipboard.mapIcon16:before,.icon-clipboard.uiIcon24:before,.uiIcon16.icon-clipboard:before{content:""}.icon-copy.mapIcon16:before,.icon-copy.uiIcon24:before,.uiIcon16.icon-copy:before{content:""}.icon-contact.mapIcon16:before,.icon-contact.uiIcon24:before,.uiIcon16.icon-contact:before{content:""}.icon-image.mapIcon16:before,.icon-image.uiIcon24:before,.uiIcon16.icon-image:before{content:""}.icon-video.mapIcon16:before,.icon-video.uiIcon24:before,.uiIcon16.icon-video:before{content:""}.icon-script.mapIcon16:before,.icon-script.uiIcon24:before,.uiIcon16.icon-script:before{content:""}.icon-alert.mapIcon16:before,.icon-alert.uiIcon24:before,.uiIcon16.icon-alert:before{content:""}.icon-info.mapIcon16:before,.icon-info.uiIcon24:before,.uiIcon16.icon-info:before{content:""}.icon-notice.mapIcon16:before,.icon-notice.uiIcon24:before,.uiIcon16.icon-notice:before{content:""}.icon-help.mapIcon16:before,.icon-help.uiIcon24:before,.uiIcon16.icon-help:before{content:""}.icon-check.mapIcon16:before,.icon-check.uiIcon24:before,.uiIcon16.icon-check:before{content:""}.icon-bullet.mapIcon16:before,.icon-bullet.uiIcon24:before,.uiIcon16.icon-bullet:before{content:""}.icon-pin-w.mapIcon16,.icon-pin-w.uiIcon24,.uiIcon16.icon-pin-w{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-pin-s.mapIcon16:before,.icon-pin-s.uiIcon24:before,.icon-pin-w.mapIcon16:before,.icon-pin-w.uiIcon24:before,.uiIcon16.icon-pin-s:before,.uiIcon16.icon-pin-w:before{content:""}.icon-night.mapIcon16:before,.icon-night.uiIcon24:before,.uiIcon16.icon-night:before{content:""}.icon-play.mapIcon16:before,.icon-play.uiIcon24:before,.uiIcon16.icon-play:before{content:""}.icon-pause.mapIcon16:before,.icon-pause.uiIcon24:before,.uiIcon16.icon-pause:before{content:""}.icon-seek-next.mapIcon16:before,.icon-seek-next.uiIcon24:before,.uiIcon16.icon-seek-next:before{content:""}.icon-seek-prev.mapIcon16:before,.icon-seek-prev.uiIcon24:before,.uiIcon16.icon-seek-prev:before{content:""}.icon-seek-end.mapIcon16:before,.icon-seek-end.uiIcon24:before,.uiIcon16.icon-seek-end:before{content:""}.icon-seek-first.mapIcon16:before,.icon-seek-first.uiIcon24:before,.icon-seek-start.mapIcon16:before,.icon-seek-start.uiIcon24:before,.uiIcon16.icon-seek-first:before,.uiIcon16.icon-seek-start:before{content:""}.icon-stop.mapIcon16:before,.icon-stop.uiIcon24:before,.uiIcon16.icon-stop:before{content:""}.icon-eject.mapIcon16:before,.icon-eject.uiIcon24:before,.uiIcon16.icon-eject:before{content:""}.icon-volume-off.mapIcon16:before,.icon-volume-off.uiIcon24:before,.uiIcon16.icon-volume-off:before{content:""}.icon-volume-on.mapIcon16:before,.icon-volume-on.uiIcon24:before,.uiIcon16.icon-volume-on:before{content:""}.icon-power.mapIcon16:before,.icon-power.uiIcon24:before,.uiIcon16.icon-power:before{content:""}.icon-signal-diag.mapIcon16:before,.icon-signal-diag.uiIcon24:before,.icon-signal.mapIcon16:before,.icon-signal.uiIcon24:before,.uiIcon16.icon-signal-diag:before,.uiIcon16.icon-signal:before{content:""}.icon-battery-0.mapIcon16:before,.icon-battery-0.uiIcon24:before,.uiIcon16.icon-battery-0:before{content:""}.icon-battery-1.mapIcon16:before,.icon-battery-1.uiIcon24:before,.uiIcon16.icon-battery-1:before{content:""}.icon-battery-2.mapIcon16:before,.icon-battery-2.uiIcon24:before,.uiIcon16.icon-battery-2:before{content:""}.icon-battery-3.mapIcon16:before,.icon-battery-3.uiIcon24:before,.uiIcon16.icon-battery-3:before{content:""}.icon-circle-plus.mapIcon16:before,.icon-circle-plus.uiIcon24:before,.uiIcon16.icon-circle-plus:before{content:""}.icon-circle-minus.mapIcon16:before,.icon-circle-minus.uiIcon24:before,.uiIcon16.icon-circle-minus:before{content:""}.icon-circle-close.mapIcon16:before,.icon-circle-close.uiIcon24:before,.uiIcon16.icon-circle-close:before{content:""}.icon-circlesmall-plus.mapIcon16:before,.icon-circlesmall-plus.uiIcon24:before,.uiIcon16.icon-circlesmall-plus:before{content:""}.icon-circlesmall-minus.mapIcon16:before,.icon-circlesmall-minus.uiIcon24:before,.uiIcon16.icon-circlesmall-minus:before{content:""}.icon-squaresmall-plus.mapIcon16:before,.icon-squaresmall-plus.uiIcon24:before,.uiIcon16.icon-squaresmall-plus:before{content:""}.icon-squaresmall-minus.mapIcon16:before,.icon-squaresmall-minus.uiIcon24:before,.uiIcon16.icon-squaresmall-minus:before{content:""}.icon-grip-dotted-vertical.mapIcon16:before,.icon-grip-dotted-vertical.uiIcon24:before,.uiIcon16.icon-grip-dotted-vertical:before{content:""}.icon-grip-dotted-horizontal.mapIcon16,.icon-grip-dotted-horizontal.uiIcon24,.uiIcon16.icon-grip-dotted-horizontal{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-grip-dotted-horizontal.mapIcon16:before,.icon-grip-dotted-horizontal.uiIcon24:before,.uiIcon16.icon-grip-dotted-horizontal:before{content:""}.mapIcon16{position:absolute;color:#2fd02f}.mapIcon16.red{color:#c00}.mapIcon16.rank-captain:before{content:""}.mapIcon16.rank-headofpersonnel:before{content:""}.mapIcon16.rank-headofsecurity:before{content:""}.mapIcon16.rank-chiefengineer:before{content:""}.mapIcon16.rank-researchdirector:before{content:""}.mapIcon16.rank-chiefmedicalofficer:before{content:""}.mapIcon16.rank-atmospherictechnician:before,.mapIcon16.rank-stationengineer:before{content:""}.mapIcon16.rank-chemist:before,.mapIcon16.rank-medicaldoctor:before,.mapIcon16.rank-psychiatrist:before{content:""}.mapIcon16.rank-geneticist:before,.mapIcon16.rank-roboticist:before,.mapIcon16.rank-scientist:before,.mapIcon16.rank-xenobiologist:before{content:""}.mapIcon16.rank-detective:before,.mapIcon16.rank-securityofficer:before,.mapIcon16.rank-warden:before{content:""}.clear-left{clear:left!important}.clear-right{clear:right!important}.clear-both{clear:both!important}.clear-none{clear:none!important}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-none{display:none!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.mr-0{margin-right:0!important}.mr-1{margin-right:.25rem!important}.mr-2{margin-right:.5rem!important}.mr-3{margin-right:1rem!important}.mr-4{margin-right:1.5rem!important}.mr-5{margin-right:3rem!important}.mr-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ml-0{margin-left:0!important}.ml-1{margin-left:.25rem!important}.ml-2{margin-left:.5rem!important}.ml-3{margin-left:1rem!important}.ml-4{margin-left:1.5rem!important}.ml-5{margin-left:3rem!important}.ml-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pr-0{padding-right:0!important}.pr-1{padding-right:.25rem!important}.pr-2{padding-right:.5rem!important}.pr-3{padding-right:1rem!important}.pr-4{padding-right:1.5rem!important}.pr-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.pl-0{padding-left:0!important}.pl-1{padding-left:.25rem!important}.pl-2{padding-left:.5rem!important}.pl-3{padding-left:1rem!important}.pl-4{padding-left:1.5rem!important}.pl-5{padding-left:3rem!important}.fs-small{font-size:12px!important}.fs-normal{font-size:14px!important}.fs-large{font-size:16px!important}.fs-largest{font-size:18px!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:light!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.theme-basic-dark .button,.theme-basic-dark a,.theme-basic-dark button,.theme-basic-dark input[disabled],.theme-basic-dark input[type=button],.theme-basic-dark input[type=reset],.theme-basic-dark input[type=submit],.theme-basic .button,.theme-basic a,.theme-basic button,.theme-basic input[disabled],.theme-basic input[type=button],.theme-basic input[type=reset],.theme-basic input[type=submit]{display:inline;background:none;border:none;border-radius:0;color:#00e;padding:.1em 0 0 0;margin-right:2px;text-decoration:underline}.theme-basic-dark .button:hover,.theme-basic-dark a:hover,.theme-basic-dark button:hover,.theme-basic-dark input[disabled]:hover,.theme-basic-dark input[type=button]:hover,.theme-basic-dark input[type=reset]:hover,.theme-basic-dark input[type=submit]:hover,.theme-basic .button:hover,.theme-basic a:hover,.theme-basic button:hover,.theme-basic input[disabled]:hover,.theme-basic input[type=button]:hover,.theme-basic input[type=reset]:hover,.theme-basic input[type=submit]:hover{background:none;color:#551a8b}.theme-basic-dark .button:active,.theme-basic-dark a:active,.theme-basic-dark button:active,.theme-basic-dark input[disabled]:active,.theme-basic-dark input[type=button]:active,.theme-basic-dark input[type=reset]:active,.theme-basic-dark input[type=submit]:active,.theme-basic .button:active,.theme-basic a:active,.theme-basic button:active,.theme-basic input[disabled]:active,.theme-basic input[type=button]:active,.theme-basic input[type=reset]:active,.theme-basic input[type=submit]:active{color:#e00}.theme-basic-dark .tooltip.content,.theme-basic .tooltip.content{background:#fff;border:1px solid #a9a9a9}.theme-basic-dark{color:#fff;background:#000}.theme-basic-dark .button,.theme-basic-dark a,.theme-basic-dark button,.theme-basic-dark input[disabled],.theme-basic-dark input[type=button],.theme-basic-dark input[type=reset],.theme-basic-dark input[type=submit]{color:#90ee90}.theme-basic-dark .button:hover,.theme-basic-dark a:hover,.theme-basic-dark button:hover,.theme-basic-dark input[disabled]:hover,.theme-basic-dark input[type=button]:hover,.theme-basic-dark input[type=reset]:hover,.theme-basic-dark input[type=submit]:hover{color:#cceb76}.theme-basic-dark .button:active,.theme-basic-dark a:active,.theme-basic-dark button:active,.theme-basic-dark input[disabled]:active,.theme-basic-dark input[type=button]:active,.theme-basic-dark input[type=reset]:active,.theme-basic-dark input[type=submit]:active{color:#1ff}.theme-basic-dark .button:visited,.theme-basic-dark a:visited,.theme-basic-dark button:visited,.theme-basic-dark input[disabled]:visited,.theme-basic-dark input[type=button]:visited,.theme-basic-dark input[type=reset]:visited,.theme-basic-dark input[type=submit]:visited{color:#2e8b57}.theme-basic-dark .uiTitleWrapper{background-color:#464646}.theme-basic-dark .tooltip.content{background:#000}.theme-nano,.theme-nano-light{font-size:12px;line-height:1.9em;font-family:Verdana,Geneva,sans-serif;background:#202020 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjQzMCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4Mj0iNDAwIiB5MT0iNDMwIiB4MT0iNDAwIiBpZD0iYiI+PHN0b3Agc3RvcC1jb2xvcj0iIzIwMjAyMCIgb2Zmc2V0PSIuNDEiLz48c3RvcCBzdG9wLWNvbG9yPSIjM2QzYzNjIiBvZmZzZXQ9Ii44NCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMjQwLjU1IiB4Mj0iMzk5LjkiIHkxPSIxMzYuNTIiIHgxPSIzOTkuOSIgaWQ9ImEiPjxzdG9wIHN0b3AtY29sb3I9IiMxZjFmMWYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiMxNzE3MTciIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiB5Mj0iMjQwLjU1IiB4Mj0iNDc5LjMyIiB5MT0iMTk3LjY5IiB4MT0iNDc5LjMyIiBpZD0iYyIvPjxsaW5lYXJHcmFkaWVudCB4bGluazpocmVmPSIjYSIgeTI9IjE3OS40MSIgeDI9IjMyMC40MyIgeTE9IjEzNi41NCIgeDE9IjMyMC40MyIgaWQ9ImQiLz48L2RlZnM+PHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTAgMGg4MDB2NDMwSDB6Ii8+PHBhdGggZD0iTTQ1MS40NCAxNDEuNWMtLjA3LTIuMjUtMS0zLjU1LTIuNzMtMy45M2gtMjQuMnEtMy42LjA5LTMuNzEgNC4wNnY1MC40NGwtMzMuNzItNTRhNSA1IDAgMDAtMy4wNS0xLjVsLS45LS4wN2gtMzEuNDVxLTMuMTkuMjgtMy4zMyA0djk1LjA2Yy4wOCAyLjI1IDEgMy41NiAyLjczIDMuOTNoMjQuMnEzLjYtLjA5IDMuNzEtNC4wNlYxODVsMzMuNzIgNTRhNSA1IDAgMDAzLjA1IDEuNTFjLjI5IDAgLjU5IDAgLjkuMDZoMzEuNDVxMy4xOS0uMjggMy4zMy00eiIgZmlsbD0idXJsKCNhKSIvPjxwYXRoIGQ9Ik00OTYuMzQgMjI4LjNsLTM2LjY3LTMwLjU3djM4Ljg3Yy4wNyAyLjQ3IDEuMTggMy44IDMuMzEgNGgzMC4yNWE1LjQ1IDUuNDUgMCAwMDQuMDUtMiA3LjI0IDcuMjQgMCAwMDAtOS40NiAzLjU5IDMuNTkgMCAwMC0uMzktLjM5bC0uMDYtLjA2eiIgZmlsbD0idXJsKCNjKSIvPjxwYXRoIGQ9Ik0zMDMuNDEgMTQ4Ljc5di4wNWwzNi42NyAzMC41N3YtMzguODdjLS4wNy0yLjQ4LTEuMTgtMy44MS0zLjMxLTRoLTMwLjIxYTUuNDkgNS40OSAwIDAwLTQuMDUgMiA2LjgxIDYuODEgMCAwMC0xLjc2IDQuNzIgNi45MSA2LjkxIDAgMDAxLjc2IDQuNzRxLjE5LjIxLjM5LjM5bC4wNi4wNmE0LjEyIDQuMTIgMCAwMC40NS4zNHoiIGZpbGw9InVybCgjZCkiLz48L3N2Zz4=) 50% 0 repeat-x;scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.theme-nano-light hr,.theme-nano hr{background-color:#40628a;height:1px}.theme-nano-light .uiTitleWrapper,.theme-nano .uiTitleWrapper{background-color:#363636;box-shadow:0 0 8px 4px rgba(0,0,0,.5)}.theme-nano-light .uiTitleWrapper .uiTitleText,.theme-nano .uiTitleWrapper .uiTitleText{color:#e9c183}.theme-nano-light .uiTitleWrapper .uiTitleClose,.theme-nano .uiTitleWrapper .uiTitleClose{color:hsla(0,0%,100%,.5)}.theme-nano-light .button,.theme-nano-light a,.theme-nano-light button,.theme-nano-light input[type=button],.theme-nano-light input[type=reset],.theme-nano-light input[type=submit],.theme-nano .button,.theme-nano a,.theme-nano button,.theme-nano input[type=button],.theme-nano input[type=reset],.theme-nano input[type=submit]{display:inline-block;min-width:15px;height:16px;text-align:center;text-decoration:none;background:#40628a;cursor:default;white-space:nowrap;box-sizing:content-box;color:inherit;border-radius:.15em;padding:2px 4px 2px 4px;line-height:16px;vertical-align:top;margin:0 2px 2px 0}.theme-nano-light .button:hover,.theme-nano-light a:hover,.theme-nano-light button:hover,.theme-nano-light input[type=button]:hover,.theme-nano-light input[type=reset]:hover,.theme-nano-light input[type=submit]:hover,.theme-nano .button:hover,.theme-nano a:hover,.theme-nano button:hover,.theme-nano input[type=button]:hover,.theme-nano input[type=reset]:hover,.theme-nano input[type=submit]:hover{background:#507aac}.theme-nano-light .button:active,.theme-nano-light .button:link,.theme-nano-light .button:visited,.theme-nano-light a:active,.theme-nano-light a:link,.theme-nano-light a:visited,.theme-nano-light button:active,.theme-nano-light button:link,.theme-nano-light button:visited,.theme-nano-light input[type=button]:active,.theme-nano-light input[type=button]:link,.theme-nano-light input[type=button]:visited,.theme-nano-light input[type=reset]:active,.theme-nano-light input[type=reset]:link,.theme-nano-light input[type=reset]:visited,.theme-nano-light input[type=submit]:active,.theme-nano-light input[type=submit]:link,.theme-nano-light input[type=submit]:visited,.theme-nano .button:active,.theme-nano .button:link,.theme-nano .button:visited,.theme-nano a:active,.theme-nano a:link,.theme-nano a:visited,.theme-nano button:active,.theme-nano button:link,.theme-nano button:visited,.theme-nano input[type=button]:active,.theme-nano input[type=button]:link,.theme-nano input[type=button]:visited,.theme-nano input[type=reset]:active,.theme-nano input[type=reset]:link,.theme-nano input[type=reset]:visited,.theme-nano input[type=submit]:active,.theme-nano input[type=submit]:link,.theme-nano input[type=submit]:visited{text-decoration:none}.theme-nano-light .button.on,.theme-nano-light .button.selected,.theme-nano-light a.on,.theme-nano-light a.selected,.theme-nano-light button.on,.theme-nano-light button.selected,.theme-nano-light input[type=button].on,.theme-nano-light input[type=button].selected,.theme-nano-light input[type=reset].on,.theme-nano-light input[type=reset].selected,.theme-nano-light input[type=submit].on,.theme-nano-light input[type=submit].selected,.theme-nano .button.on,.theme-nano .button.selected,.theme-nano a.on,.theme-nano a.selected,.theme-nano button.on,.theme-nano button.selected,.theme-nano input[type=button].on,.theme-nano input[type=button].selected,.theme-nano input[type=reset].on,.theme-nano input[type=reset].selected,.theme-nano input[type=submit].on,.theme-nano input[type=submit].selected{background:#2f943c}.theme-nano-light .button.on:hover,.theme-nano-light .button.selected:hover,.theme-nano-light a.on:hover,.theme-nano-light a.selected:hover,.theme-nano-light button.on:hover,.theme-nano-light button.selected:hover,.theme-nano-light input[type=button].on:hover,.theme-nano-light input[type=button].selected:hover,.theme-nano-light input[type=reset].on:hover,.theme-nano-light input[type=reset].selected:hover,.theme-nano-light input[type=submit].on:hover,.theme-nano-light input[type=submit].selected:hover,.theme-nano .button.on:hover,.theme-nano .button.selected:hover,.theme-nano a.on:hover,.theme-nano a.selected:hover,.theme-nano button.on:hover,.theme-nano button.selected:hover,.theme-nano input[type=button].on:hover,.theme-nano input[type=button].selected:hover,.theme-nano input[type=reset].on:hover,.theme-nano input[type=reset].selected:hover,.theme-nano input[type=submit].on:hover,.theme-nano input[type=submit].selected:hover{background:#5fc96d}.theme-nano-light .button.inactive,.theme-nano-light .button.off,.theme-nano-light .button[disabled],.theme-nano-light a.inactive,.theme-nano-light a.off,.theme-nano-light a[disabled],.theme-nano-light button.inactive,.theme-nano-light button.off,.theme-nano-light button[disabled],.theme-nano-light input[type=button].inactive,.theme-nano-light input[type=button].off,.theme-nano-light input[type=button][disabled],.theme-nano-light input[type=reset].inactive,.theme-nano-light input[type=reset].off,.theme-nano-light input[type=reset][disabled],.theme-nano-light input[type=submit].inactive,.theme-nano-light input[type=submit].off,.theme-nano-light input[type=submit][disabled],.theme-nano .button.inactive,.theme-nano .button.off,.theme-nano .button[disabled],.theme-nano a.inactive,.theme-nano a.off,.theme-nano a[disabled],.theme-nano button.inactive,.theme-nano button.off,.theme-nano button[disabled],.theme-nano input[type=button].inactive,.theme-nano input[type=button].off,.theme-nano input[type=button][disabled],.theme-nano input[type=reset].inactive,.theme-nano input[type=reset].off,.theme-nano input[type=reset][disabled],.theme-nano input[type=submit].inactive,.theme-nano input[type=submit].off,.theme-nano input[type=submit][disabled]{background:#999;border-color:#666}.theme-nano-light .button.danger,.theme-nano-light .button.red,.theme-nano-light a.danger,.theme-nano-light a.red,.theme-nano-light button.danger,.theme-nano-light button.red,.theme-nano-light input[type=button].danger,.theme-nano-light input[type=button].red,.theme-nano-light input[type=reset].danger,.theme-nano-light input[type=reset].red,.theme-nano-light input[type=submit].danger,.theme-nano-light input[type=submit].red,.theme-nano .button.danger,.theme-nano .button.red,.theme-nano a.danger,.theme-nano a.red,.theme-nano button.danger,.theme-nano button.red,.theme-nano input[type=button].danger,.theme-nano input[type=button].red,.theme-nano input[type=reset].danger,.theme-nano input[type=reset].red,.theme-nano input[type=submit].danger,.theme-nano input[type=submit].red{background:red;border-color:#a00}.theme-nano-light .button.danger:hover,.theme-nano-light .button.red:hover,.theme-nano-light a.danger:hover,.theme-nano-light a.red:hover,.theme-nano-light button.danger:hover,.theme-nano-light button.red:hover,.theme-nano-light input[type=button].danger:hover,.theme-nano-light input[type=button].red:hover,.theme-nano-light input[type=reset].danger:hover,.theme-nano-light input[type=reset].red:hover,.theme-nano-light input[type=submit].danger:hover,.theme-nano-light input[type=submit].red:hover,.theme-nano .button.danger:hover,.theme-nano .button.red:hover,.theme-nano a.danger:hover,.theme-nano a.red:hover,.theme-nano button.danger:hover,.theme-nano button.red:hover,.theme-nano input[type=button].danger:hover,.theme-nano input[type=button].red:hover,.theme-nano input[type=reset].danger:hover,.theme-nano input[type=reset].red:hover,.theme-nano input[type=submit].danger:hover,.theme-nano input[type=submit].red:hover{background-color:#f66}.theme-nano-light .button.yellow,.theme-nano-light a.yellow,.theme-nano-light button.yellow,.theme-nano-light input[type=button].yellow,.theme-nano-light input[type=reset].yellow,.theme-nano-light input[type=submit].yellow,.theme-nano .button.yellow,.theme-nano a.yellow,.theme-nano button.yellow,.theme-nano input[type=button].yellow,.theme-nano input[type=reset].yellow,.theme-nano input[type=submit].yellow{color:#000;background:#cacc00}.theme-nano-light .button.yellow:hover,.theme-nano-light a.yellow:hover,.theme-nano-light button.yellow:hover,.theme-nano-light input[type=button].yellow:hover,.theme-nano-light input[type=reset].yellow:hover,.theme-nano-light input[type=submit].yellow:hover,.theme-nano .button.yellow:hover,.theme-nano a.yellow:hover,.theme-nano button.yellow:hover,.theme-nano input[type=button].yellow:hover,.theme-nano input[type=reset].yellow:hover,.theme-nano input[type=submit].yellow:hover{background:#fcff5f}.theme-nano-light ul,.theme-nano ul{padding:4px 0 0 10px;margin:0;list-style-type:none}.theme-nano-light li,.theme-nano li{padding:0 0 2px 0}.theme-nano-light img,.theme-nano img{border-style:none}.theme-nano-light h1,.theme-nano-light h2,.theme-nano-light h3,.theme-nano-light h4,.theme-nano-light h5,.theme-nano-light h6,.theme-nano h1,.theme-nano h2,.theme-nano h3,.theme-nano h4,.theme-nano h5,.theme-nano h6{margin:0;padding:12px 0 6px 0;clear:both}.theme-nano-light h1,.theme-nano h1{font-size:18px}.theme-nano-light h2,.theme-nano h2{font-size:16px}.theme-nano-light h3,.theme-nano h3{font-size:14px}.theme-nano-light h4,.theme-nano h4{font-size:12px}.theme-nano-light .good,.theme-nano .good{color:#4f7529;font-weight:700}.theme-nano-light .average,.theme-nano .average{color:#cd6500;font-weight:700}.theme-nano-light .bad,.theme-nano .bad{color:#e00;font-weight:700}.theme-nano-light .dark,.theme-nano-light .idle,.theme-nano .dark,.theme-nano .idle{color:#272727;font-weight:700}.theme-nano-light .highlight,.theme-nano .highlight{color:#8ba5c4}.theme-nano-light .itemLabel,.theme-nano .itemLabel{color:#e9c183}.theme-nano-light .notice,.theme-nano .notice{background:url(data:image/jpeg;base64,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0G2ORjQ7G232KCvRCULRG1aKSP8AJLSw+QVMwa0cEiChK2NaRNBsb/pDfsRJ2cIk/wCiEhLSwl3B0nge2nkIBDb7IYPYENuiIFehP6K8CRM6JbDgSdkbnv8AoxKwpYgt4JGKAmwJdwigx7IXOj6iWxEWQhjZE6JKQm9FLeCR/kI9mN6aanpGq0RtEWJqJa/oYMUD4cCZhwMJLeFE4iRJysYWWL7GBaI6PxS1gY3Q/AaaJXIUgxrIbekHsViRRBSGP0JKDhEqFhO7wbVh5SQW/wALWRK9HKtDGEkiWUsPCoUTOkObomsOA2250XZmZaW3ZEo8AksVE1cGjAqRjHshYQnZD7CVGv8AEsuhJJDnSwn3BwkOGTaPcDOwgS9GUpcCrInrB8g6dEj6F54/P//aAAwDAQACAAMAAAAQJpNNttpNJJppNNpppJppNJJJJJNJJttNJNpJJtNNtNtNNJpJJNNJJJpppJJNtNNNttJtpNpJNppNNNtJpJJNJppJJNttNNNNNpJppNNpJJtpJJJtJNptpppJtpptpNpptpJNNNNtJJNtJJpNJNpttptpNptNJtNttNJJNNNtJpppptpNNNJptJtJNtJpJtJNttpJNptJNJJtNptJttJJtNJJNJtJpJptpNJtJpNNpttNppNNJtpppNNNNJtNttpNJJptNtJtpJNJtpppJpNtttNpNNJtNpJNtJNNtNtJppNNpppNNNJtNpJNJtpNNptNJpJtNJJpppJJtJptNJNNtptJtNtptJtNJpJpNpJNJpptNNtpNNtJpJJJttNNptJJNttNtNJpJJppNptpNNNtJNppNttJpJNJtJpNNpNtJtJpJtpNptJtptppJpJptJNtppNtNJNNpJpNJNtNtNJppJJtpttNJJJpNtpNNptJJttNtpttJtNNpptptNt//f8A+z/++23+2/8Avv8A5f7b/b/b7b7ff/8ATz232++2+22/62++323+3/233+2/32+3+/223/3zX2332/32++/3/wBt/wD/AP33/wBtv/8A/wD2/wB9/tv9t/8A7fb7b7//AH323+/222++33332++33333/wDt99t/vtv/AL7bb/f7bfbbff8A+/3/ANtvtt/tvvtv99v9t/8Ab7/f/wD+++//APt/vt//APb7b/bf7/7ffb77/wC32/2//wDt/wDfbf7b77b7/f8A/wBtvtt/v/v9v9/tv/v/AL77777bbf7/AH3/APvt/wD/AO3/APvtvtt9/wDf/wC223//APt99/vv/wDf/wD33+2++3+33323/wDtvtv9/v8Af7f7/wC//wBvttvttv8Abf8A+3+2323/ANt9/wDbfb7fbffb/wC+3322++/332+++332/wB/9tvvvv8A7bfffb//AO+//wBtv9vvtvt9v/vtt9t/v9vvtt/9v/8A7b7bfff/AP8Av/8A7/f/AO/+323233222++223332++/3/8A/v8Ab7b7f7/bbb7777fffbbfb/8A+2++2/22/wD/AP8A+323+2++3223/wBvt9v/ALbb7b7b/b7fbffff7/b7/bbb/bffb7f/wC++/8A/wDbb77bbb/f7fff/wC323+3/wD9tt99vv8Afff7/bf/AO+232//ANt99vt/9v8A7f777b/f7fbf7/b/AG33+2+/+3223/3/ANvv/wDfb/f77/b/AG+332+//wBt/t/vvt/v/t//AL/b7ff7f/b/AG++3+/2++/2332/2+332/3/APtv9/tv/vt//vt/vt//AP8A+22+/wD/AP8A+232+/2322+3332/+2/++232223/APtvtv8Abb/7f/b777/b7f8A++/2+/8A9/t99/v9v9//AL//AO/2/wDvtt9tvtt/vttt/tvt99v/APf/AP2/223/APtvtv8A777/AH2/2++22/8A9tvvv9/9/wD7ffb/AP3/AP8A7/8A323/APv9t99/tvt9t9t9tt9/ttv9/tt//vv/ALfff/b/AH3+3+/+2/3+/wBvtvv9/t/vvttt/wDbb/f777/b7/7f/b7bb77bff77/fbb/wD+/wDv9t/9t/ttvtvt9/t/9vt99t/vvt/v/tv9/wD777f/AO+++++//wD/APf/AP2/+3+32/332333/wD/AL7777ff/bf/AH/+++22/wBv9/8A/wC2+22++23+2/8Avtvvv/v/AP7/AO3++3/333+//wDtt/tv9t/v9v8Ab/8A23/3+3332/2++/8A9999vt9/999v/tvvt9/vtvv/AL7/AH/3++/+332/+33/AP8Af7/7fff7b/f7NpNJJJppNptNtpNtpNtNJJpNJtJJpttpJJtJNNNppNJtJppJNppJtppJpNNpJtJtJtNNtNJpNppNNNtpJJNtJpNN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) 50% 50%;color:#000;font-size:12px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0 4px 0;border:1px solid #c2a26f}.theme-nano-light .displayBar,.theme-nano .displayBar{background:#000;border-radius:.15em}.theme-nano-light .displayBar .displayBarFill,.theme-nano .displayBar .displayBarFill{background:#40628a;color:#fff}.theme-nano-light .displayBar.good .displayBarFill,.theme-nano .displayBar.good .displayBarFill{background:#4f7529}.theme-nano-light .displayBar.average .displayBarFill,.theme-nano .displayBar.average .displayBarFill{background:#cd6500}.theme-nano-light .displayBar.bad .displayBarFill,.theme-nano .displayBar.bad .displayBarFill{background:#e00}.theme-nano-light .displayBar.highlight .displayBarFill,.theme-nano .displayBar.highlight .displayBarFill{background:#8ba5c4}.theme-nano-light input,.theme-nano input{border-radius:0;padding:2.25px 6px;vertical-align:top;margin:0 2px 2px 0}.theme-nano-light .tooltip.content,.theme-nano .tooltip.content{background:#272727;border:1px solid #a9a9a9}.theme-nano-light{color:#000;background:#c9c9c9 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjQzMCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDAwIiB5MT0iNDMwIiB4Mj0iNDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIuNDEiIHN0b3AtY29sb3I9IiNjOWM5YzkiLz48c3RvcCBvZmZzZXQ9Ii44NCIgc3RvcC1jb2xvcj0iI2U1ZTVlNSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMzk5LjkiIHkxPSIxMzYuNTIiIHgyPSIzOTkuOSIgeTI9IjI0MC41NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iLjAxIiBzdG9wLWNvbG9yPSIjZDNkM2Q0Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzJjNGM0Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI0NzkuMzIiIHkxPSIxOTcuNjkiIHgyPSI0NzkuMzIiIHkyPSIyNDAuNTUiIHhsaW5rOmhyZWY9IiNhIi8+PGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzIwLjQzIiB5MT0iMTM2LjU0IiB4Mj0iMzIwLjQzIiB5Mj0iMTc5LjQxIiB4bGluazpocmVmPSIjYSIvPjwvZGVmcz48cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMCAwaDgwMHY0MzBIMHoiLz48cGF0aCBkPSJNNDUxLjQ0IDE0MS41Yy0uMDctMi4yNS0xLTMuNTUtMi43My0zLjkzaC0yNC4ycS0zLjYuMDktMy43MSA0LjA2djUwLjQ0bC0zMy43Mi01NGE1IDUgMCAwMC0zLjA1LTEuNWwtLjktLjA3aC0zMS40NXEtMy4xOS4yOC0zLjMzIDR2OTUuMDZjLjA4IDIuMjUgMSAzLjU2IDIuNzMgMy45M2gyNC4ycTMuNi0uMDkgMy43MS00LjA2VjE4NWwzMy43MiA1NGE1IDUgMCAwMDMuMDUgMS41MWMuMjkgMCAuNTkgMCAuOS4wNmgzMS40NXEzLjE5LS4yOCAzLjMzLTR6IiBmaWxsPSJ1cmwoI2EpIi8+PHBhdGggZD0iTTQ5Ni4zNCAyMjguM2wtMzYuNjctMzAuNTd2MzguODdjLjA3IDIuNDcgMS4xOCAzLjggMy4zMSA0aDMwLjI1YTUuNDUgNS40NSAwIDAwNC4wNS0yIDcuMjQgNy4yNCAwIDAwMC05LjQ2IDMuNTkgMy41OSAwIDAwLS4zOS0uMzlsLS4wNi0uMDZ6IiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggZD0iTTMwMy40MSAxNDguNzl2LjA1bDM2LjY3IDMwLjU3di0zOC44N2MtLjA3LTIuNDgtMS4xOC0zLjgxLTMuMzEtNGgtMzAuMjFhNS40OSA1LjQ5IDAgMDAtNC4wNSAyIDYuODEgNi44MSAwIDAwLTEuNzYgNC43MiA2LjkxIDYuOTEgMCAwMDEuNzYgNC43NHEuMTkuMjEuMzkuMzlsLjA2LjA2YTQuMTIgNC4xMiAwIDAwLjQ1LjM0eiIgZmlsbD0idXJsKCNkKSIvPjwvc3ZnPg==) 50% 0 repeat-x}.theme-nano-light .itemLabel{color:#4c401c}.theme-nano-light .uiTitleWrapper{background:url(data:image/png;base64,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) repeat 50%}.theme-nano-light .uiTitleWrapper .uiTitleText{color:#4c401c}.theme-nano-light .uiTitleWrapper .uiTitleClose{color:#000}.theme-nano-light .good{color:#5e9653}.theme-nano-light .average{color:#cd6500}.theme-nano-light .bad{color:#e00}.theme-nano-light .dark,.theme-nano-light .idle{color:#272727}.theme-nano-light .displayBar{background:#fff;border:1px solid #666}.theme-nano-light .displayBar .displayBarFill{background:#556d99;color:#fff}.theme-nano-light .displayBar.good .displayBarFill{background:#5e9653}.theme-nano-light .displayBar.average .displayBarFill{background:#cd6500}.theme-nano-light .displayBar.bad .displayBarFill{background:#e00}.theme-nano-light .displayBar.highlight .displayBarFill{background:#8ba5c4}.theme-nano-light .button,.theme-nano-light a,.theme-nano-light button,.theme-nano-light input[disabled],.theme-nano-light input[type=button],.theme-nano-light input[type=reset],.theme-nano-light input[type=submit]{color:#fff;background:#556d99}.theme-nano-light .button:hover,.theme-nano-light a:hover,.theme-nano-light button:hover,.theme-nano-light input[disabled]:hover,.theme-nano-light input[type=button]:hover,.theme-nano-light input[type=reset]:hover,.theme-nano-light input[type=submit]:hover{background:#7c9ede}.theme-nano-light .button:active,.theme-nano-light .button:link,.theme-nano-light .button:visited,.theme-nano-light a:active,.theme-nano-light a:link,.theme-nano-light a:visited,.theme-nano-light button:active,.theme-nano-light button:link,.theme-nano-light button:visited,.theme-nano-light input[disabled]:active,.theme-nano-light input[disabled]:link,.theme-nano-light input[disabled]:visited,.theme-nano-light input[type=button]:active,.theme-nano-light input[type=button]:link,.theme-nano-light input[type=button]:visited,.theme-nano-light input[type=reset]:active,.theme-nano-light input[type=reset]:link,.theme-nano-light input[type=reset]:visited,.theme-nano-light input[type=submit]:active,.theme-nano-light input[type=submit]:link,.theme-nano-light input[type=submit]:visited{text-decoration:none}.theme-nano-light .button.on,.theme-nano-light .button.selected,.theme-nano-light a.on,.theme-nano-light a.selected,.theme-nano-light button.on,.theme-nano-light button.selected,.theme-nano-light input[disabled].on,.theme-nano-light input[disabled].selected,.theme-nano-light input[type=button].on,.theme-nano-light input[type=button].selected,.theme-nano-light input[type=reset].on,.theme-nano-light input[type=reset].selected,.theme-nano-light input[type=submit].on,.theme-nano-light input[type=submit].selected{background:#5e9653}.theme-nano-light .button.on:hover,.theme-nano-light .button.selected:hover,.theme-nano-light a.on:hover,.theme-nano-light a.selected:hover,.theme-nano-light button.on:hover,.theme-nano-light button.selected:hover,.theme-nano-light input[disabled].on:hover,.theme-nano-light input[disabled].selected:hover,.theme-nano-light input[type=button].on:hover,.theme-nano-light input[type=button].selected:hover,.theme-nano-light input[type=reset].on:hover,.theme-nano-light input[type=reset].selected:hover,.theme-nano-light input[type=submit].on:hover,.theme-nano-light input[type=submit].selected:hover{background:#7bc46c}.theme-nano-light .button.inactive,.theme-nano-light .button.off,.theme-nano-light .button[disabled],.theme-nano-light a.inactive,.theme-nano-light a.off,.theme-nano-light a[disabled],.theme-nano-light button.inactive,.theme-nano-light button.off,.theme-nano-light button[disabled],.theme-nano-light input[disabled].inactive,.theme-nano-light input[disabled].off,.theme-nano-light input[disabled][disabled],.theme-nano-light input[type=button].inactive,.theme-nano-light input[type=button].off,.theme-nano-light input[type=button][disabled],.theme-nano-light input[type=reset].inactive,.theme-nano-light input[type=reset].off,.theme-nano-light input[type=reset][disabled],.theme-nano-light input[type=submit].inactive,.theme-nano-light input[type=submit].off,.theme-nano-light input[type=submit][disabled]{background:#999;border-color:#444}.theme-nano-light .button.danger,.theme-nano-light .button.red,.theme-nano-light a.danger,.theme-nano-light a.red,.theme-nano-light button.danger,.theme-nano-light button.red,.theme-nano-light input[disabled].danger,.theme-nano-light input[disabled].red,.theme-nano-light input[type=button].danger,.theme-nano-light input[type=button].red,.theme-nano-light input[type=reset].danger,.theme-nano-light input[type=reset].red,.theme-nano-light input[type=submit].danger,.theme-nano-light input[type=submit].red{background:#f22;border-color:#a00}.theme-nano-light .button.danger:hover,.theme-nano-light .button.red:hover,.theme-nano-light a.danger:hover,.theme-nano-light a.red:hover,.theme-nano-light button.danger:hover,.theme-nano-light button.red:hover,.theme-nano-light input[disabled].danger:hover,.theme-nano-light input[disabled].red:hover,.theme-nano-light input[type=button].danger:hover,.theme-nano-light input[type=button].red:hover,.theme-nano-light input[type=reset].danger:hover,.theme-nano-light input[type=reset].red:hover,.theme-nano-light input[type=submit].danger:hover,.theme-nano-light input[type=submit].red:hover{background-color:#f66}.theme-nano-light .button.yellow,.theme-nano-light a.yellow,.theme-nano-light button.yellow,.theme-nano-light input[disabled].yellow,.theme-nano-light input[type=button].yellow,.theme-nano-light input[type=reset].yellow,.theme-nano-light input[type=submit].yellow{color:#000;background:#cacc00}.theme-nano-light .button.yellow:hover,.theme-nano-light a.yellow:hover,.theme-nano-light button.yellow:hover,.theme-nano-light input[disabled].yellow:hover,.theme-nano-light input[type=button].yellow:hover,.theme-nano-light input[type=reset].yellow:hover,.theme-nano-light input[type=submit].yellow:hover{background:#fcff5f}.theme-nano-light .tooltip.content{color:#000;background:#c9c9c9;border:1px solid #a9a9a9}.text-dept-command{color:#114dc1!important}.bg-dept-command{background-color:#114dc1!important}.border-dept-command{border-color:#114dc1!important}.text-dept-security{color:#991818!important}.bg-dept-security{background-color:#991818!important}.border-dept-security{border-color:#991818!important}.text-dept-engineering{color:#c67519!important}.bg-dept-engineering{background-color:#c67519!important}.border-dept-engineering{border-color:#c67519!important}.text-dept-medical{color:#15903a!important}.bg-dept-medical{background-color:#15903a!important}.border-dept-medical{border-color:#15903a!important}.text-dept-science{color:#a44799!important}.bg-dept-science{background-color:#a44799!important}.border-dept-science{border-color:#a44799!important}.text-dept-cargo{color:#593616!important}.bg-dept-cargo{background-color:#593616!important}.border-dept-cargo{border-color:#593616!important}.text-dept-civilian{color:#90524b!important}.bg-dept-civilian{background-color:#90524b!important}.border-dept-civilian{border-color:#90524b!important}.text-dept-equipment{color:#6c5b73!important}.bg-dept-equipment{background-color:#6c5b73!important}.border-dept-equipment{border-color:#6c5b73!important}.text-dept-miscellaneous{color:#5d6a67!important}.bg-dept-miscellaneous{background-color:#5d6a67!important}.border-dept-miscellaneous{border-color:#5d6a67!important}.dark-theme{color:#fff}body{font-size:14px;margin:0;padding:8px;font-family:Arial,Helvetica,sans-serif;overflow-x:auto;min-width:240px}body.vueui{overflow-y:hidden}#content{height:calc(100vh - 36px)}#content.mcomputer{height:calc(100vh - 72px)}#content.uiDebug{height:calc(50vh - 36px)}#content.uiDebug.mcomputer{height:calc(50vh - 72px)}#debug{height:50vh;display:none}#debug.uiDebug{display:inherit}#content,#debug{overflow-y:auto;margin-right:-8px;margin-top:-8px}#content>div{margin-right:8px;margin-top:8px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA1SURBVFhH7c4xAQAgEMSwAwnn3wvWWPDwA+nSNavtyWD7fSwAAAAAAAAAAAAAAAAAgN8ByQWAVwE1HJRsowAAAABJRU5ErkJggg==);padding:.5em;box-sizing:border-box}.uiTitleWrapper{margin:-8px -8px 10px;position:relative;float:none;clear:both;user-select:none;-ms-user-select:none;cursor:default}.uiTitleWrapper>.titleBar{height:32px}.uiTitleWrapper>.titleBar:before{content:"";display:inline-block;height:100%;vertical-align:middle;font-size:0}.uiTitleWrapper>.titleBar>*{vertical-align:middle;font-size:24px;display:inline-block;margin-left:8px;line-height:32px}.uiTitleWrapper>.titleBar>.uiTitleText{font-size:16px}.uiTitleWrapper>.titleBar>.uiDebugIcon{cursor:pointer;transition:color .25s}.uiTitleWrapper>.titleBar>.uiDebugIcon.uiNoDebug{display:none}.uiTitleWrapper>.titleBar>.uiDebugIcon:hover{color:#507aac;transition:color 0ms}.uiTitleWrapper>.titleBar>.uiTitleClose{display:block;float:right;width:45px;font-size:20px;text-align:center;transition:color .25s,background-color .25s}.uiTitleWrapper>.titleBar>.uiTitleClose:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}code{font-family:Courier New,Courier,monospace}.table.border{border-collapse:collapse;border:1px solid #000;border-radius:.15em;background-color:rgba(0,0,0,.3)}.header.border{border:.5px solid rgba(0,0,0,.5);border-bottom:2px solid #556d99;border-radius:.15em}.item.border{border:.5px solid rgba(0,0,0,.5);border-radius:.15em}.button,button,input,select,textarea{box-sizing:border-box;padding:4px 6px;border-radius:4px;display:inline-block}.button,button{border:1px solid rgba(0,0,0,.2)}input,select,textarea{border:1px solid #000}.button,a,button,input[disabled],input[type=button],input[type=reset],input[type=submit]{user-select:none;-ms-user-select:none;background-color:#d8d8d8;cursor:pointer;padding:2px 4px;vertical-align:top}.button:hover,a:hover,button:hover,input[disabled]:hover,input[type=button]:hover,input[type=reset]:hover,input[type=submit]:hover{background-color:#b2deee}.button .mapIcon16,.button .uiIcon16,.button .uiIcon24,a .mapIcon16,a .uiIcon16,a .uiIcon24,button .mapIcon16,button .uiIcon16,button .uiIcon24,input[disabled] .mapIcon16,input[disabled] .uiIcon16,input[disabled] .uiIcon24,input[type=button] .mapIcon16,input[type=button] .uiIcon16,input[type=button] .uiIcon24,input[type=reset] .mapIcon16,input[type=reset] .uiIcon16,input[type=reset] .uiIcon24,input[type=submit] .mapIcon16,input[type=submit] .uiIcon16,input[type=submit] .uiIcon24{margin:0}.button *,a *,button *,input[disabled] *,input[type=button] *,input[type=reset] *,input[type=submit] *{vertical-align:top}.hidden{display:none!important}.notice{background:#ffac4e;color:#000;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0;box-sizing:border-box}.displayBar{display:inline-block;background:#fff;margin:0 5px 0 0;border:.5px solid rgba(0,0,0,.2);border-radius:.15em;overflow:hidden;width:236px;height:16px;vertical-align:text-bottom}.displayBar .displayBarFill{width:0;height:100%;background:#acacac;overflow:hidden;float:left;color:#000}.displayBar.good .displayBarFill{background:#5fe42b}.displayBar.average .displayBarFill{background:#ff8000}.displayBar.bad .displayBarFill{background:#ff2323}.displayBar.highlight .displayBarFill{background:#9dc7d6}.csserror{display:none}.tooltip.label{text-decoration:underline}.red{color:red}.green{color:green}.blue{color:#00f}.highlight{color:#00008b}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.resizeHandle__se[data-v-01c02ad8]{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize;transition:opacity .3s;opacity:.5;background-position:100% 100%;background-size:16px 16px;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' fill='%23fff' viewBox='0 0 567 567'%3E%3Cpath d='M437 0c-6 0-12 2-17 7L7 420c-9 10-9 25 0 34l57 57c9 9 24 9 34 0L511 98c9-10 9-25 0-34L454 7c-5-5-11-7-17-7zm27 199c-6 0-12 3-17 7L206 447c-9 9-9 25 0 34l57 57c9 9 25 9 34 0l241-241c9-9 9-25 0-34l-57-57c-5-4-11-7-17-7zm22 204c-6 0-12 3-17 7l-59 59c-9 10-9 25 0 34l57 57c9 9 25 9 34 0l59-59c9-9 9-25 0-34l-57-57c-4-4-11-7-17-7z'/%3E%3C/svg%3E")}.resizeHandle__se[data-v-01c02ad8]:hover{opacity:1}.resizeHandle__s[data-v-01c02ad8]{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.resizeHandle__e[data-v-01c02ad8]{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.button[data-v-1a3d9578],button[data-v-1a3d9578]{margin-left:6px}.maincont[data-v-1a3d9578]{padding:4px;padding-top:5px;padding-bottom:5px;margin-bottom:-8px;background-color:#202020}.maincont .valign[data-v-1a3d9578]{vertical-align:middle}.uiIcon16[data-v-1a3d9578]{margin-right:0}table[data-v-36dbac0c]{width:100%;text-align:center}tr[data-v-36dbac0c]{line-height:135%}.table[data-v-0d69deee]{display:table;width:100%}.table .header[data-v-0d69deee]{text-align:center;font-weight:700}.table .header[data-v-0d69deee],.table .player[data-v-0d69deee]{display:table-row}.table .header .header-item[data-v-0d69deee],.table .header .item[data-v-0d69deee],.table .player .header-item[data-v-0d69deee],.table .player .item[data-v-0d69deee]{display:table-cell;padding:1px}.complist[data-v-0f00c828]{margin-right:1em}.value[data-v-10d6546a],.value[data-v-729622e4],.value[data-v-b7af1e1c]{color:#fff;font-size:140%;background-color:rgba(0,0,0,.4);padding-left:5px;padding-right:5px;border:1px solid #40628a}.ores[data-v-5716889f]{text-transform:capitalize}.character-image[data-v-36f58934]{float:left;height:64px}.dept-block[data-v-36f58934],.gs-block[data-v-36f58934]{position:relative;border:2px solid}.dept-block .dept[data-v-36f58934],.gs-block .dept[data-v-36f58934]{text-align:center;font-weight:700}.gs-block[data-v-36f58934]{border-color:#41ff41}.gs-block .dept[data-v-36f58934]{background-color:#41ff41;color:#000}.item[data-v-0cce4ea8]{width:100%;margin:4px 0 0 0;clear:both}.statusDisplay[data-v-60faaeb6]{background:#000;color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0}.fixedLeftWide[data-v-60faaeb6]{width:165px;float:left}.item[data-v-60faaeb6]{width:100%;margin:4px 0 0 0;clear:both}ul[data-v-2005209a]{padding:4px 4px 10px 10px}.danger-control[data-v-2005209a]{position:fixed;right:20px;bottom:20px}.control[data-v-2005209a]{position:fixed;left:20px;bottom:20px}table[data-v-561826ba]{width:100%;text-align:center}tr[data-v-561826ba]{line-height:135%}.t-parent>p[data-v-2633030c]{text-align:center;margin-top:0;width:100%}.cancel-button[data-v-2633030c]{width:100%;margin-bottom:5px}p.danger[data-v-2633030c]{color:red}.purchase-icon[data-v-2633030c]{vertical-align:bottom}.food-icon[data-v-2633030c]{-ms-transform:scale(2);transform:scale(2);position:absolute;left:0;right:0;margin-left:auto;margin-right:auto;margin-top:12px}.food-icon.no-stock[data-v-2633030c]{opacity:.2;filter:alpha(opacity=20);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)"}.t-parent[data-v-2633030c]{text-align:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;background-color:rgba(0,0,0,.4);outline-style:ridge;outline-color:#000}.t-child[data-v-2633030c]{height:auto;white-space:normal;box-sizing:border-box;margin:4px 4px 4px 4px;background-color:rgba(64,98,138,.4)}.t-container[data-v-2633030c]{position:relative}.statusValue[data-v-2633030c]{width:90%}.no-stock[data-v-2633030c]{color:grey}.cart-icon[data-v-2633030c]{position:absolute;bottom:5px;left:0}.price[data-v-2633030c]{position:absolute;bottom:4px;left:0;right:15px;text-align:center;font-size:10px}.qty[data-v-2633030c]{position:absolute;right:0;bottom:4px;font-size:10px}.no-stock.button[data-v-2633030c]{background:inherit;border-style:none}.tooltip[data-v-2633030c]{position:relative;display:inline-block}.tooltip .tooltiptext[data-v-2633030c]{visibility:hidden;width:120px;background-color:#202020;color:#fff;text-align:center;padding:5px 0;border-radius:6px;opacity:0;transition:opacity 1s;position:absolute;z-index:1;bottom:100%;left:50%;margin-left:-60px;right:auto}.tooltip .tooltiptext[data-v-2633030c]:after{content:" ";position:absolute;top:100%;left:50%;border-width:5px;border-style:solid;border-color:#202020 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.tooltip:hover .tooltiptext[data-v-2633030c]{visibility:visible;opacity:1}#content>div[data-v-2633030c]{overflow-x:hidden}table[data-v-c49443fe]{width:100%;border-collapse:collapse;color:#fff;background-color:rgba(0,0,0,.6);border:2px solid;margin-top:.5rem}table td[data-v-c49443fe]{padding-left:.5rem;padding-right:.5rem}table td[data-v-c49443fe]:nth-child(2){width:12.5rem}table td[data-v-c49443fe]:last-child{text-align:right;width:6.5rem}.complist[data-v-4021d8a8]{margin-right:1em}.message-chat[data-v-32f14c20]{width:100%;background:#000;color:#fff;border:1px solid #40628a;padding:.4em;box-sizing:border-box;height:20em;overflow-y:scroll}.message-container[data-v-32f14c20]{display:-ms-flexbox;display:flex}.message-input[data-v-32f14c20]{width:80%;-ms-flex-positive:1;flex-grow:1}.recipe-block[data-v-710a36a7]{background-color:rgba(0,0,0,0);border-bottom:2px solid rgba(0,0,0,0);transition:background-color .2s,color .2s,border-bottom .2s;padding:2px}.recipe-block h2[data-v-710a36a7]{color:#4f7999}.recipe-block h2[data-v-710a36a7],.recipe-block h3[data-v-710a36a7]{padding:2px 0}.recipe-block[data-v-710a36a7]:hover{background-color:rgba(0,0,0,.5);border-bottom:2px solid #4f7c9e}.recipe-block:hover .description[data-v-710a36a7]{color:#82a4be}table[data-v-c971b6ac]{width:100%;text-align:center}tr[data-v-c971b6ac]{line-height:135%}table[data-v-1021c617]{width:100%;text-align:center}tr[data-v-1021c617]{line-height:135%}.table[data-v-731c48b4]{display:table;width:100%}.table .header[data-v-731c48b4]{text-align:center;font-weight:700}.table .header[data-v-731c48b4],.table .sensor[data-v-731c48b4]{display:table-row}.table .header .header-item[data-v-731c48b4],.table .header .item[data-v-731c48b4],.table .sensor .header-item[data-v-731c48b4],.table .sensor .item[data-v-731c48b4]{display:table-cell;padding:1px;vertical-align:middle}.table .header .sensor[data-v-731c48b4]:last-child,.table .sensor .sensor[data-v-731c48b4]:last-child{padding-right:0}.item[data-v-731c48b4]{text-align:center}.sensor .item[data-v-731c48b4]{border:.5px solid rgba(0,0,0,.5);border-radius:.15em}.terminal[data-v-3a6a6067]{font-family:monospace;line-height:1em;font-size:1em}.terminal[data-v-3a6a6067],table[data-v-570930e6]{width:100%;text-align:center}tr[data-v-570930e6]{line-height:135%}table[data-v-1844f920]{width:100%;text-align:center}tr[data-v-1844f920]{line-height:135%}.table[data-v-41065424]{display:table;width:100%}.table .cyborg[data-v-41065424],.table .header[data-v-41065424],.table .mech[data-v-41065424]{display:table-row;font-weight:700;width:20%}.table .cyborg .header-item[data-v-41065424],.table .cyborg .item[data-v-41065424],.table .header .header-item[data-v-41065424],.table .header .item[data-v-41065424],.table .mech .header-item[data-v-41065424],.table .mech .item[data-v-41065424]{display:table-cell;padding:1px;vertical-align:middle;font-weight:400}.center[data-v-41065424]{text-align:center}.value-setting[data-v-b23b384c]{width:5em;display:inline-block;text-align:center}table[data-v-f45f2cac]{width:100%}table.queue-list td[data-v-f45f2cac]{padding:.2em}table.queue-list td.action[data-v-f45f2cac],table.queue-list td.name[data-v-f45f2cac]{width:1%;white-space:nowrap}.vui-progress[data-v-f45f2cac]{width:100%}.bodyscanner[data-v-130b946b]{display:table;width:100%}.bodyscanner .header[data-v-130b946b]{display:table-row}.bodyscanner .header .header-item[data-v-130b946b],.bodyscanner .header .item[data-v-130b946b]{display:table-cell;padding:1px;vertical-align:middle}.bodyscanner .column[data-v-130b946b]{float:left;width:45%;margin:1%;padding:10px;outline-style:ridge;outline-color:#000;background-color:rgba(0,0,0,.4);height:500px;overflow:auto}.bodyscanner .row[data-v-130b946b]:after{content:"";display:table;clear:both}.left[data-v-130b946b]{text-align:left}.center[data-v-130b946b]{text-align:center}.right[data-v-130b946b]{text-align:right}table .injury[data-v-130b946b]{border-spacing:20px 0}td[data-v-130b946b],th[data-v-130b946b]{text-align:center}.column[data-v-3783600c]{float:left;width:45%;margin:1%;padding:10px;outline-style:ridge;outline-color:#000;background-color:rgba(0,0,0,.4);height:500px;overflow:auto}.columnHolder[data-v-3783600c]:after{content:"";display:block;height:0;overflow:hidden;clear:both}.text[data-v-3783600c]{color:#b99d71}.float .button[data-v-3783600c]{float:left;padding-left:5px}td .shifted[data-v-3783600c]{padding-left:5px}[data-v-2a491020]{text-transform:capitalize}.tileRow[data-v-58cc165e]{line-height:1em;cursor:pointer}.tileRow .tile[data-v-58cc165e]{height:3em;width:3em;padding:.5em;display:inline-block;vertical-align:bottom}.tileRow .tile .piece[data-v-58cc165e]{font-size:3em;line-height:1em;text-align:center;-ms-user-select:none;user-select:none}.tileRow .tile .piece.ghost[data-v-58cc165e]{opacity:.6}.tileRow .tile .piece.ghost.sel[data-v-58cc165e]{text-shadow:none}.tileRow .tile .piece.sel[data-v-58cc165e]{text-shadow:2px 0 10px #5353ff}.tileRow .tile .piece.black[data-v-58cc165e]{color:#000}.tileRow .tile .piece.red[data-v-58cc165e]{color:red}.tileRow .tile.w[data-v-58cc165e]{background-color:#6cf}.tileRow .tile.w.sel[data-v-58cc165e]{background-color:#a5ccff}.tileRow .tile.b[data-v-58cc165e]{background-color:#3a3a3d}.tileRow .tile.b.sel[data-v-58cc165e]{background-color:#4c3a3d}table[data-v-70766bea]{width:100%}table td[data-v-70766bea],table th[data-v-70766bea]{text-align:center;width:auto}table td.action[data-v-70766bea],table th.action[data-v-70766bea]{width:1%;white-space:nowrap}table th[data-v-70766bea]{font-weight:700}.tagselector[data-v-70766bea]{display:-ms-flexbox;display:flex}input[data-v-c4dbe0aa],textarea[data-v-c4dbe0aa]{width:100%;vertical-align:top}textarea[data-v-c4dbe0aa]{height:3em}table[data-v-8bcc2668]{width:100%}table th[data-v-8bcc2668]{font-weight:700}table td[data-v-8bcc2668],table th[data-v-8bcc2668]{text-align:center}.copylabel[data-v-927b9430]{display:inline-block;width:auto}.copyBlock[data-v-927b9430]{display:inline-block}textarea[data-v-a9c97a54]{height:6em}.photos[data-v-c51ad1c4]{display:inline-block;position:absolute;right:0}.photos [data-v-c51ad1c4]{height:64px;-ms-interpolation-mode:nearest-neighbor;image-rendering:crisp-edges}.bottombuttons[data-v-c51ad1c4]{margin-top:8px}.bottombuttons .button[data-v-c51ad1c4]{margin-right:6px}.newrecord[data-v-df4093f4]{margin-top:6px}.logout[data-v-a1e2a0dc]{margin-right:0;margin-left:auto}div.incidents[data-v-494b07dc]{background-color:hsla(0,0%,50.2%,.2);padding:4px}.modular[data-v-61a5d2f6]{font-family:arial,sans-serif;border-collapse:collapse}.modular td[data-v-61a5d2f6],.modular th[data-v-61a5d2f6]{border:1px solid #ddd;text-align:left;padding:8px}.modular td[data-v-61a5d2f6]{text-align:center}.other td[data-v-61a5d2f6]{padding:5px}.right[data-v-61a5d2f6]{text-align:right}.active_energy[data-v-61a5d2f6]{display:contents}div.item[data-v-68f8b60e]{display:table-row}.itemContent[data-v-68f8b60e],.itemLabel[data-v-68f8b60e]{display:table-cell;width:10%}.itemLabel[data-v-68f8b60e]{padding-right:8px;width:4%;vertical-align:top}div[data-v-b2030120]{display:table;width:100%}div[data-v-8b39c97e]{display:inline-block}input[data-v-8b39c97e]{text-align:center}div[data-v-1c07adff]{display:inline-block}input[data-v-1c07adff]{text-align:center}input[type=range][data-v-1c07adff]{width:100%;border:none}input[type=range][data-v-1c07adff]:focus{outline:none}input[type=range][data-v-1c07adff]::-ms-track{width:100%;height:8.4px;cursor:pointer;background:rgba(0,0,0,0);border-color:rgba(0,0,0,0);border-width:16px 0;color:rgba(0,0,0,0)}input[type=range][data-v-1c07adff]::-ms-fill-lower{background:#2a6495;border:.2px solid #010101;border-radius:2.6px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}input[type=range][data-v-1c07adff]::-ms-fill-upper{background:#3071a9;border:.2px solid #010101;border-radius:2.6px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}input[type=range][data-v-1c07adff]::-ms-thumb{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d;border:1px solid #000;height:16px;width:8px;border-radius:2px;background:#fff;cursor:pointer}input[type=range][data-v-1c07adff]:focus::-ms-fill-lower{background:#3071a9}input[type=range][data-v-1c07adff]:focus::-ms-fill-upper{background:#367ebd}.item[data-v-48bbd7cd]{width:100%}.itemContent[data-v-48bbd7cd],.itemLabel[data-v-48bbd7cd]{display:inline-block}.itemLabel[data-v-48bbd7cd]{width:30%;vertical-align:top}.displayBar[data-v-041d7f1a]{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBar.good[data-v-041d7f1a]{border:1px solid #4f7529}.displayBar.average[data-v-041d7f1a]{border:1px solid #cd6500}.displayBar.bad[data-v-041d7f1a]{border:1px solid #e00}.displayBar.highlight[data-v-041d7f1a]{border:1px solid #8ba5c4}.displayBarFill[data-v-041d7f1a]{line-height:1em;white-space:nowrap;overflow:visible;text-align:left}.displayBarFill span[data-v-041d7f1a]{vertical-align:middle;margin-left:2px}.displayBarFill.good[data-v-041d7f1a]{color:#fff;background:#4f7529}.displayBarFill.average[data-v-041d7f1a]{color:#fff;background:#cd6500}.displayBarFill.bad[data-v-041d7f1a]{color:#fff;background:#e00}.displayBarFill.highlight[data-v-041d7f1a]{color:#fff;background:#8ba5c4}span:hover div[data-v-4ea2a2b3]{display:inline-block}span div[data-v-4ea2a2b3]{margin-top:-5px;margin-left:4px;padding:3px;display:none;position:absolute} \ No newline at end of file + */.fab,.fad,.fal,.far,.fas,.ic,.mapIcon16,.uiIcon16,.uiIcon24{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.ic-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-.0667em}.ic-xs{font-size:.75em}.ic-sm{font-size:.875em}.ic-1x{font-size:1em}.ic-2x{font-size:2em}.ic-3x{font-size:3em}.ic-4x{font-size:4em}.ic-5x{font-size:5em}.ic-6x{font-size:6em}.ic-7x{font-size:7em}.ic-8x{font-size:8em}.ic-9x{font-size:9em}.ic-10x{font-size:10em}.ic-fw,.mapIcon16,.uiIcon16,.uiIcon24{text-align:center;width:1.25em}.ic-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.ic-ul>li{position:relative}.ic-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.ic-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.ic-pull-left{float:left}.ic-pull-right{float:right}.fab.ic-pull-left,.fal.ic-pull-left,.far.ic-pull-left,.fas.ic-pull-left,.ic-pull-left.mapIcon16,.ic-pull-left.uiIcon16,.ic-pull-left.uiIcon24,.ic.ic-pull-left{margin-right:.3em}.fab.ic-pull-right,.fal.ic-pull-right,.far.ic-pull-right,.fas.ic-pull-right,.ic-pull-right.mapIcon16,.ic-pull-right.uiIcon16,.ic-pull-right.uiIcon24,.ic.ic-pull-right{margin-left:.3em}.ic-spin{animation:fa-spin 2s linear infinite}.ic-pulse{animation:fa-spin 1s steps(8) infinite}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.ic-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-ms-transform:rotate(90deg);transform:rotate(90deg)}.ic-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-ms-transform:rotate(180deg);transform:rotate(180deg)}.ic-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-ms-transform:rotate(270deg);transform:rotate(270deg)}.ic-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-ms-transform:scaleX(-1);transform:scaleX(-1)}.ic-flip-vertical{-ms-transform:scaleY(-1);transform:scaleY(-1)}.ic-flip-both,.ic-flip-horizontal.ic-flip-vertical,.ic-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.ic-flip-both,.ic-flip-horizontal.ic-flip-vertical{-ms-transform:scale(-1);transform:scale(-1)}:root .ic-flip-both,:root .ic-flip-horizontal,:root .ic-flip-vertical,:root .ic-rotate-90,:root .ic-rotate-180,:root .ic-rotate-270{filter:none}.ic-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.ic-stack-1x,.ic-stack-2x{left:0;position:absolute;text-align:center;width:100%}.ic-stack-1x{line-height:inherit}.ic-stack-2x{font-size:2em}.ic-inverse{color:#fff}.ic-500px:before{content:""}.ic-accessible-icon:before{content:""}.ic-accusoft:before{content:""}.ic-acquisitions-incorporated:before{content:""}.ic-ad:before{content:""}.ic-address-book:before{content:""}.ic-address-card:before{content:""}.ic-adjust:before{content:""}.ic-adn:before{content:""}.ic-adversal:before{content:""}.ic-affiliatetheme:before{content:""}.ic-air-freshener:before{content:""}.ic-airbnb:before{content:""}.ic-algolia:before{content:""}.ic-align-center:before{content:""}.ic-align-justify:before{content:""}.ic-align-left:before{content:""}.ic-align-right:before{content:""}.ic-alipay:before{content:""}.ic-allergies:before{content:""}.ic-amazon:before{content:""}.ic-amazon-pay:before{content:""}.ic-ambulance:before{content:""}.ic-american-sign-language-interpreting:before{content:""}.ic-amilia:before{content:""}.ic-anchor:before{content:""}.ic-android:before{content:""}.ic-angellist:before{content:""}.ic-angle-double-down:before{content:""}.ic-angle-double-left:before{content:""}.ic-angle-double-right:before{content:""}.ic-angle-double-up:before{content:""}.ic-angle-down:before{content:""}.ic-angle-left:before{content:""}.ic-angle-right:before{content:""}.ic-angle-up:before{content:""}.ic-angry:before{content:""}.ic-angrycreative:before{content:""}.ic-angular:before{content:""}.ic-ankh:before{content:""}.ic-app-store:before{content:""}.ic-app-store-ios:before{content:""}.ic-apper:before{content:""}.ic-apple:before{content:""}.ic-apple-alt:before{content:""}.ic-apple-pay:before{content:""}.ic-archive:before{content:""}.ic-archway:before{content:""}.ic-arrow-alt-circle-down:before{content:""}.ic-arrow-alt-circle-left:before{content:""}.ic-arrow-alt-circle-right:before{content:""}.ic-arrow-alt-circle-up:before{content:""}.ic-arrow-circle-down:before{content:""}.ic-arrow-circle-left:before{content:""}.ic-arrow-circle-right:before{content:""}.ic-arrow-circle-up:before{content:""}.ic-arrow-down:before{content:""}.ic-arrow-left:before{content:""}.ic-arrow-right:before{content:""}.ic-arrow-up:before{content:""}.ic-arrows-alt:before{content:""}.ic-arrows-alt-h:before{content:""}.ic-arrows-alt-v:before{content:""}.ic-artstation:before{content:""}.ic-assistive-listening-systems:before{content:""}.ic-asterisk:before{content:""}.ic-asymmetrik:before{content:""}.ic-at:before{content:""}.ic-atlas:before{content:""}.ic-atlassian:before{content:""}.ic-atom:before{content:""}.ic-audible:before{content:""}.ic-audio-description:before{content:""}.ic-autoprefixer:before{content:""}.ic-avianex:before{content:""}.ic-aviato:before{content:""}.ic-award:before{content:""}.ic-aws:before{content:""}.ic-baby:before{content:""}.ic-baby-carriage:before{content:""}.ic-backspace:before{content:""}.ic-backward:before{content:""}.ic-bacon:before{content:""}.ic-bacteria:before{content:""}.ic-bacterium:before{content:""}.ic-bahai:before{content:""}.ic-balance-scale:before{content:""}.ic-balance-scale-left:before{content:""}.ic-balance-scale-right:before{content:""}.ic-ban:before{content:""}.ic-band-aid:before{content:""}.ic-bandcamp:before{content:""}.ic-barcode:before{content:""}.ic-bars:before{content:""}.ic-baseball-ball:before{content:""}.ic-basketball-ball:before{content:""}.ic-bath:before{content:""}.ic-battery-empty:before{content:""}.ic-battery-full:before{content:""}.ic-battery-half:before{content:""}.ic-battery-quarter:before{content:""}.ic-battery-three-quarters:before{content:""}.ic-battle-net:before{content:""}.ic-bed:before{content:""}.ic-beer:before{content:""}.ic-behance:before{content:""}.ic-behance-square:before{content:""}.ic-bell:before{content:""}.ic-bell-slash:before{content:""}.ic-bezier-curve:before{content:""}.ic-bible:before{content:""}.ic-bicycle:before{content:""}.ic-biking:before{content:""}.ic-bimobject:before{content:""}.ic-binoculars:before{content:""}.ic-biohazard:before{content:""}.ic-birthday-cake:before{content:""}.ic-bitbucket:before{content:""}.ic-bitcoin:before{content:""}.ic-bity:before{content:""}.ic-black-tie:before{content:""}.ic-blackberry:before{content:""}.ic-blender:before{content:""}.ic-blender-phone:before{content:""}.ic-blind:before{content:""}.ic-blog:before{content:""}.ic-blogger:before{content:""}.ic-blogger-b:before{content:""}.ic-bluetooth:before{content:""}.ic-bluetooth-b:before{content:""}.ic-bold:before{content:""}.ic-bolt:before{content:""}.ic-bomb:before{content:""}.ic-bone:before{content:""}.ic-bong:before{content:""}.ic-book:before{content:""}.ic-book-dead:before{content:""}.ic-book-medical:before{content:""}.ic-book-open:before{content:""}.ic-book-reader:before{content:""}.ic-bookmark:before{content:""}.ic-bootstrap:before{content:""}.ic-border-all:before{content:""}.ic-border-none:before{content:""}.ic-border-style:before{content:""}.ic-bowling-ball:before{content:""}.ic-box:before{content:""}.ic-box-open:before{content:""}.ic-box-tissue:before{content:""}.ic-boxes:before{content:""}.ic-braille:before{content:""}.ic-brain:before{content:""}.ic-bread-slice:before{content:""}.ic-briefcase:before{content:""}.ic-briefcase-medical:before{content:""}.ic-broadcast-tower:before{content:""}.ic-broom:before{content:""}.ic-brush:before{content:""}.ic-btc:before{content:""}.ic-buffer:before{content:""}.ic-bug:before{content:""}.ic-building:before{content:""}.ic-bullhorn:before{content:""}.ic-bullseye:before{content:""}.ic-burn:before{content:""}.ic-buromobelexperte:before{content:""}.ic-bus:before{content:""}.ic-bus-alt:before{content:""}.ic-business-time:before{content:""}.ic-buy-n-large:before{content:""}.ic-buysellads:before{content:""}.ic-calculator:before{content:""}.ic-calendar:before{content:""}.ic-calendar-alt:before{content:""}.ic-calendar-check:before{content:""}.ic-calendar-day:before{content:""}.ic-calendar-minus:before{content:""}.ic-calendar-plus:before{content:""}.ic-calendar-times:before{content:""}.ic-calendar-week:before{content:""}.ic-camera:before{content:""}.ic-camera-retro:before{content:""}.ic-campground:before{content:""}.ic-canadian-maple-leaf:before{content:""}.ic-candy-cane:before{content:""}.ic-cannabis:before{content:""}.ic-capsules:before{content:""}.ic-car:before{content:""}.ic-car-alt:before{content:""}.ic-car-battery:before{content:""}.ic-car-crash:before{content:""}.ic-car-side:before{content:""}.ic-caravan:before{content:""}.ic-caret-down:before{content:""}.ic-caret-left:before{content:""}.ic-caret-right:before{content:""}.ic-caret-square-down:before{content:""}.ic-caret-square-left:before{content:""}.ic-caret-square-right:before{content:""}.ic-caret-square-up:before{content:""}.ic-caret-up:before{content:""}.ic-carrot:before{content:""}.ic-cart-arrow-down:before{content:""}.ic-cart-plus:before{content:""}.ic-cash-register:before{content:""}.ic-cat:before{content:""}.ic-cc-amazon-pay:before{content:""}.ic-cc-amex:before{content:""}.ic-cc-apple-pay:before{content:""}.ic-cc-diners-club:before{content:""}.ic-cc-discover:before{content:""}.ic-cc-jcb:before{content:""}.ic-cc-mastercard:before{content:""}.ic-cc-paypal:before{content:""}.ic-cc-stripe:before{content:""}.ic-cc-visa:before{content:""}.ic-centercode:before{content:""}.ic-centos:before{content:""}.ic-certificate:before{content:""}.ic-chair:before{content:""}.ic-chalkboard:before{content:""}.ic-chalkboard-teacher:before{content:""}.ic-charging-station:before{content:""}.ic-chart-area:before{content:""}.ic-chart-bar:before{content:""}.ic-chart-line:before{content:""}.ic-chart-pie:before{content:""}.ic-check:before{content:""}.ic-check-circle:before{content:""}.ic-check-double:before{content:""}.ic-check-square:before{content:""}.ic-cheese:before{content:""}.ic-chess:before{content:""}.ic-chess-bishop:before{content:""}.ic-chess-board:before{content:""}.ic-chess-king:before{content:""}.ic-chess-knight:before{content:""}.ic-chess-pawn:before{content:""}.ic-chess-queen:before{content:""}.ic-chess-rook:before{content:""}.ic-chevron-circle-down:before{content:""}.ic-chevron-circle-left:before{content:""}.ic-chevron-circle-right:before{content:""}.ic-chevron-circle-up:before{content:""}.ic-chevron-down:before{content:""}.ic-chevron-left:before{content:""}.ic-chevron-right:before{content:""}.ic-chevron-up:before{content:""}.ic-child:before{content:""}.ic-chrome:before{content:""}.ic-chromecast:before{content:""}.ic-church:before{content:""}.ic-circle:before{content:""}.ic-circle-notch:before{content:""}.ic-city:before{content:""}.ic-clinic-medical:before{content:""}.ic-clipboard:before{content:""}.ic-clipboard-check:before{content:""}.ic-clipboard-list:before{content:""}.ic-clock:before{content:""}.ic-clone:before{content:""}.ic-closed-captioning:before{content:""}.ic-cloud:before{content:""}.ic-cloud-download-alt:before{content:""}.ic-cloud-meatball:before{content:""}.ic-cloud-moon:before{content:""}.ic-cloud-moon-rain:before{content:""}.ic-cloud-rain:before{content:""}.ic-cloud-showers-heavy:before{content:""}.ic-cloud-sun:before{content:""}.ic-cloud-sun-rain:before{content:""}.ic-cloud-upload-alt:before{content:""}.ic-cloudflare:before{content:""}.ic-cloudscale:before{content:""}.ic-cloudsmith:before{content:""}.ic-cloudversify:before{content:""}.ic-cocktail:before{content:""}.ic-code:before{content:""}.ic-code-branch:before{content:""}.ic-codepen:before{content:""}.ic-codiepie:before{content:""}.ic-coffee:before{content:""}.ic-cog:before{content:""}.ic-cogs:before{content:""}.ic-coins:before{content:""}.ic-columns:before{content:""}.ic-comment:before{content:""}.ic-comment-alt:before{content:""}.ic-comment-dollar:before{content:""}.ic-comment-dots:before{content:""}.ic-comment-medical:before{content:""}.ic-comment-slash:before{content:""}.ic-comments:before{content:""}.ic-comments-dollar:before{content:""}.ic-compact-disc:before{content:""}.ic-compass:before{content:""}.ic-compress:before{content:""}.ic-compress-alt:before{content:""}.ic-compress-arrows-alt:before{content:""}.ic-concierge-bell:before{content:""}.ic-confluence:before{content:""}.ic-connectdevelop:before{content:""}.ic-contao:before{content:""}.ic-cookie:before{content:""}.ic-cookie-bite:before{content:""}.ic-copy:before{content:""}.ic-copyright:before{content:""}.ic-cotton-bureau:before{content:""}.ic-couch:before{content:""}.ic-cpanel:before{content:""}.ic-creative-commons:before{content:""}.ic-creative-commons-by:before{content:""}.ic-creative-commons-nc:before{content:""}.ic-creative-commons-nc-eu:before{content:""}.ic-creative-commons-nc-jp:before{content:""}.ic-creative-commons-nd:before{content:""}.ic-creative-commons-pd:before{content:""}.ic-creative-commons-pd-alt:before{content:""}.ic-creative-commons-remix:before{content:""}.ic-creative-commons-sa:before{content:""}.ic-creative-commons-sampling:before{content:""}.ic-creative-commons-sampling-plus:before{content:""}.ic-creative-commons-share:before{content:""}.ic-creative-commons-zero:before{content:""}.ic-credit-card:before{content:""}.ic-critical-role:before{content:""}.ic-crop:before{content:""}.ic-crop-alt:before{content:""}.ic-cross:before{content:""}.ic-crosshairs:before{content:""}.ic-crow:before{content:""}.ic-crown:before{content:""}.ic-crutch:before{content:""}.ic-css3:before{content:""}.ic-css3-alt:before{content:""}.ic-cube:before{content:""}.ic-cubes:before{content:""}.ic-cut:before{content:""}.ic-cuttlefish:before{content:""}.ic-d-and-d:before{content:""}.ic-d-and-d-beyond:before{content:""}.ic-dailymotion:before{content:""}.ic-dashcube:before{content:""}.ic-database:before{content:""}.ic-deaf:before{content:""}.ic-deezer:before{content:""}.ic-delicious:before{content:""}.ic-democrat:before{content:""}.ic-deploydog:before{content:""}.ic-deskpro:before{content:""}.ic-desktop:before{content:""}.ic-dev:before{content:""}.ic-deviantart:before{content:""}.ic-dharmachakra:before{content:""}.ic-dhl:before{content:""}.ic-diagnoses:before{content:""}.ic-diaspora:before{content:""}.ic-dice:before{content:""}.ic-dice-d20:before{content:""}.ic-dice-d6:before{content:""}.ic-dice-five:before{content:""}.ic-dice-four:before{content:""}.ic-dice-one:before{content:""}.ic-dice-six:before{content:""}.ic-dice-three:before{content:""}.ic-dice-two:before{content:""}.ic-digg:before{content:""}.ic-digital-ocean:before{content:""}.ic-digital-tachograph:before{content:""}.ic-directions:before{content:""}.ic-discord:before{content:""}.ic-discourse:before{content:""}.ic-disease:before{content:""}.ic-divide:before{content:""}.ic-dizzy:before{content:""}.ic-dna:before{content:""}.ic-dochub:before{content:""}.ic-docker:before{content:""}.ic-dog:before{content:""}.ic-dollar-sign:before{content:""}.ic-dolly:before{content:""}.ic-dolly-flatbed:before{content:""}.ic-donate:before{content:""}.ic-door-closed:before{content:""}.ic-door-open:before{content:""}.ic-dot-circle:before{content:""}.ic-dove:before{content:""}.ic-download:before{content:""}.ic-draft2digital:before{content:""}.ic-drafting-compass:before{content:""}.ic-dragon:before{content:""}.ic-draw-polygon:before{content:""}.ic-dribbble:before{content:""}.ic-dribbble-square:before{content:""}.ic-dropbox:before{content:""}.ic-drum:before{content:""}.ic-drum-steelpan:before{content:""}.ic-drumstick-bite:before{content:""}.ic-drupal:before{content:""}.ic-dumbbell:before{content:""}.ic-dumpster:before{content:""}.ic-dumpster-fire:before{content:""}.ic-dungeon:before{content:""}.ic-dyalog:before{content:""}.ic-earlybirds:before{content:""}.ic-ebay:before{content:""}.ic-edge:before{content:""}.ic-edge-legacy:before{content:""}.ic-edit:before{content:""}.ic-egg:before{content:""}.ic-eject:before{content:""}.ic-elementor:before{content:""}.ic-ellipsis-h:before{content:""}.ic-ellipsis-v:before{content:""}.ic-ello:before{content:""}.ic-ember:before{content:""}.ic-empire:before{content:""}.ic-envelope:before{content:""}.ic-envelope-open:before{content:""}.ic-envelope-open-text:before{content:""}.ic-envelope-square:before{content:""}.ic-envira:before{content:""}.ic-equals:before{content:""}.ic-eraser:before{content:""}.ic-erlang:before{content:""}.ic-ethereum:before{content:""}.ic-ethernet:before{content:""}.ic-etsy:before{content:""}.ic-euro-sign:before{content:""}.ic-evernote:before{content:""}.ic-exchange-alt:before{content:""}.ic-exclamation:before{content:""}.ic-exclamation-circle:before{content:""}.ic-exclamation-triangle:before{content:""}.ic-expand:before{content:""}.ic-expand-alt:before{content:""}.ic-expand-arrows-alt:before{content:""}.ic-expeditedssl:before{content:""}.ic-external-link-alt:before{content:""}.ic-external-link-square-alt:before{content:""}.ic-eye:before{content:""}.ic-eye-dropper:before{content:""}.ic-eye-slash:before{content:""}.ic-facebook:before{content:""}.ic-facebook-f:before{content:""}.ic-facebook-messenger:before{content:""}.ic-facebook-square:before{content:""}.ic-fan:before{content:""}.ic-fantasy-flight-games:before{content:""}.ic-fast-backward:before{content:""}.ic-fast-forward:before{content:""}.ic-faucet:before{content:""}.ic-fax:before{content:""}.ic-feather:before{content:""}.ic-feather-alt:before{content:""}.ic-fedex:before{content:""}.ic-fedora:before{content:""}.ic-female:before{content:""}.ic-fighter-jet:before{content:""}.ic-figma:before{content:""}.ic-file:before{content:""}.ic-file-alt:before{content:""}.ic-file-archive:before{content:""}.ic-file-audio:before{content:""}.ic-file-code:before{content:""}.ic-file-contract:before{content:""}.ic-file-csv:before{content:""}.ic-file-download:before{content:""}.ic-file-excel:before{content:""}.ic-file-export:before{content:""}.ic-file-image:before{content:""}.ic-file-import:before{content:""}.ic-file-invoice:before{content:""}.ic-file-invoice-dollar:before{content:""}.ic-file-medical:before{content:""}.ic-file-medical-alt:before{content:""}.ic-file-pdf:before{content:""}.ic-file-powerpoint:before{content:""}.ic-file-prescription:before{content:""}.ic-file-signature:before{content:""}.ic-file-upload:before{content:""}.ic-file-video:before{content:""}.ic-file-word:before{content:""}.ic-fill:before{content:""}.ic-fill-drip:before{content:""}.ic-film:before{content:""}.ic-filter:before{content:""}.ic-fingerprint:before{content:""}.ic-fire:before{content:""}.ic-fire-alt:before{content:""}.ic-fire-extinguisher:before{content:""}.ic-firefox:before{content:""}.ic-firefox-browser:before{content:""}.ic-first-aid:before{content:""}.ic-first-order:before{content:""}.ic-first-order-alt:before{content:""}.ic-firstdraft:before{content:""}.ic-fish:before{content:""}.ic-fist-raised:before{content:""}.ic-flag:before{content:""}.ic-flag-checkered:before{content:""}.ic-flag-usa:before{content:""}.ic-flask:before{content:""}.ic-flickr:before{content:""}.ic-flipboard:before{content:""}.ic-flushed:before{content:""}.ic-fly:before{content:""}.ic-folder:before{content:""}.ic-folder-minus:before{content:""}.ic-folder-open:before{content:""}.ic-folder-plus:before{content:""}.ic-font:before{content:""}.ic-font-awesome:before{content:""}.ic-font-awesome-alt:before{content:""}.ic-font-awesome-flag:before{content:""}.ic-font-awesome-logo-full:before{content:""}.ic-fonticons:before{content:""}.ic-fonticons-fi:before{content:""}.ic-football-ball:before{content:""}.ic-fort-awesome:before{content:""}.ic-fort-awesome-alt:before{content:""}.ic-forumbee:before{content:""}.ic-forward:before{content:""}.ic-foursquare:before{content:""}.ic-free-code-camp:before{content:""}.ic-freebsd:before{content:""}.ic-frog:before{content:""}.ic-frown:before{content:""}.ic-frown-open:before{content:""}.ic-fulcrum:before{content:""}.ic-funnel-dollar:before{content:""}.ic-futbol:before{content:""}.ic-galactic-republic:before{content:""}.ic-galactic-senate:before{content:""}.ic-gamepad:before{content:""}.ic-gas-pump:before{content:""}.ic-gavel:before{content:""}.ic-gem:before{content:""}.ic-genderless:before{content:""}.ic-get-pocket:before{content:""}.ic-gg:before{content:""}.ic-gg-circle:before{content:""}.ic-ghost:before{content:""}.ic-gift:before{content:""}.ic-gifts:before{content:""}.ic-git:before{content:""}.ic-git-alt:before{content:""}.ic-git-square:before{content:""}.ic-github:before{content:""}.ic-github-alt:before{content:""}.ic-github-square:before{content:""}.ic-gitkraken:before{content:""}.ic-gitlab:before{content:""}.ic-gitter:before{content:""}.ic-glass-cheers:before{content:""}.ic-glass-martini:before{content:""}.ic-glass-martini-alt:before{content:""}.ic-glass-whiskey:before{content:""}.ic-glasses:before{content:""}.ic-glide:before{content:""}.ic-glide-g:before{content:""}.ic-globe:before{content:""}.ic-globe-africa:before{content:""}.ic-globe-americas:before{content:""}.ic-globe-asia:before{content:""}.ic-globe-europe:before{content:""}.ic-gofore:before{content:""}.ic-golf-ball:before{content:""}.ic-goodreads:before{content:""}.ic-goodreads-g:before{content:""}.ic-google:before{content:""}.ic-google-drive:before{content:""}.ic-google-pay:before{content:""}.ic-google-play:before{content:""}.ic-google-plus:before{content:""}.ic-google-plus-g:before{content:""}.ic-google-plus-square:before{content:""}.ic-google-wallet:before{content:""}.ic-gopuram:before{content:""}.ic-graduation-cap:before{content:""}.ic-gratipay:before{content:""}.ic-grav:before{content:""}.ic-greater-than:before{content:""}.ic-greater-than-equal:before{content:""}.ic-grimace:before{content:""}.ic-grin:before{content:""}.ic-grin-alt:before{content:""}.ic-grin-beam:before{content:""}.ic-grin-beam-sweat:before{content:""}.ic-grin-hearts:before{content:""}.ic-grin-squint:before{content:""}.ic-grin-squint-tears:before{content:""}.ic-grin-stars:before{content:""}.ic-grin-tears:before{content:""}.ic-grin-tongue:before{content:""}.ic-grin-tongue-squint:before{content:""}.ic-grin-tongue-wink:before{content:""}.ic-grin-wink:before{content:""}.ic-grip-horizontal:before{content:""}.ic-grip-lines:before{content:""}.ic-grip-lines-vertical:before{content:""}.ic-grip-vertical:before{content:""}.ic-gripfire:before{content:""}.ic-grunt:before{content:""}.ic-guilded:before{content:""}.ic-guitar:before{content:""}.ic-gulp:before{content:""}.ic-h-square:before{content:""}.ic-hacker-news:before{content:""}.ic-hacker-news-square:before{content:""}.ic-hackerrank:before{content:""}.ic-hamburger:before{content:""}.ic-hammer:before{content:""}.ic-hamsa:before{content:""}.ic-hand-holding:before{content:""}.ic-hand-holding-heart:before{content:""}.ic-hand-holding-medical:before{content:""}.ic-hand-holding-usd:before{content:""}.ic-hand-holding-water:before{content:""}.ic-hand-lizard:before{content:""}.ic-hand-middle-finger:before{content:""}.ic-hand-paper:before{content:""}.ic-hand-peace:before{content:""}.ic-hand-point-down:before{content:""}.ic-hand-point-left:before{content:""}.ic-hand-point-right:before{content:""}.ic-hand-point-up:before{content:""}.ic-hand-pointer:before{content:""}.ic-hand-rock:before{content:""}.ic-hand-scissors:before{content:""}.ic-hand-sparkles:before{content:""}.ic-hand-spock:before{content:""}.ic-hands:before{content:""}.ic-hands-helping:before{content:""}.ic-hands-wash:before{content:""}.ic-handshake:before{content:""}.ic-handshake-alt-slash:before{content:""}.ic-handshake-slash:before{content:""}.ic-hanukiah:before{content:""}.ic-hard-hat:before{content:""}.ic-hashtag:before{content:""}.ic-hat-cowboy:before{content:""}.ic-hat-cowboy-side:before{content:""}.ic-hat-wizard:before{content:""}.ic-hdd:before{content:""}.ic-head-side-cough:before{content:""}.ic-head-side-cough-slash:before{content:""}.ic-head-side-mask:before{content:""}.ic-head-side-virus:before{content:""}.ic-heading:before{content:""}.ic-headphones:before{content:""}.ic-headphones-alt:before{content:""}.ic-headset:before{content:""}.ic-heart:before{content:""}.ic-heart-broken:before{content:""}.ic-heartbeat:before{content:""}.ic-helicopter:before{content:""}.ic-highlighter:before{content:""}.ic-hiking:before{content:""}.ic-hippo:before{content:""}.ic-hips:before{content:""}.ic-hire-a-helper:before{content:""}.ic-history:before{content:""}.ic-hive:before{content:""}.ic-hockey-puck:before{content:""}.ic-holly-berry:before{content:""}.ic-home:before{content:""}.ic-hooli:before{content:""}.ic-hornbill:before{content:""}.ic-horse:before{content:""}.ic-horse-head:before{content:""}.ic-hospital:before{content:""}.ic-hospital-alt:before{content:""}.ic-hospital-symbol:before{content:""}.ic-hospital-user:before{content:""}.ic-hot-tub:before{content:""}.ic-hotdog:before{content:""}.ic-hotel:before{content:""}.ic-hotjar:before{content:""}.ic-hourglass:before{content:""}.ic-hourglass-end:before{content:""}.ic-hourglass-half:before{content:""}.ic-hourglass-start:before{content:""}.ic-house-damage:before{content:""}.ic-house-user:before{content:""}.ic-houzz:before{content:""}.ic-hryvnia:before{content:""}.ic-html5:before{content:""}.ic-hubspot:before{content:""}.ic-i-cursor:before{content:""}.ic-ice-cream:before{content:""}.ic-icicles:before{content:""}.ic-icons:before{content:""}.ic-id-badge:before{content:""}.ic-id-card:before{content:""}.ic-id-card-alt:before{content:""}.ic-ideal:before{content:""}.ic-igloo:before{content:""}.ic-image:before{content:""}.ic-images:before{content:""}.ic-imdb:before{content:""}.ic-inbox:before{content:""}.ic-indent:before{content:""}.ic-industry:before{content:""}.ic-infinity:before{content:""}.ic-info:before{content:""}.ic-info-circle:before{content:""}.ic-innosoft:before{content:""}.ic-instagram:before{content:""}.ic-instagram-square:before{content:""}.ic-instalod:before{content:""}.ic-intercom:before{content:""}.ic-internet-explorer:before{content:""}.ic-invision:before{content:""}.ic-ioxhost:before{content:""}.ic-italic:before{content:""}.ic-itch-io:before{content:""}.ic-itunes:before{content:""}.ic-itunes-note:before{content:""}.ic-java:before{content:""}.ic-jedi:before{content:""}.ic-jedi-order:before{content:""}.ic-jenkins:before{content:""}.ic-jira:before{content:""}.ic-joget:before{content:""}.ic-joint:before{content:""}.ic-joomla:before{content:""}.ic-journal-whills:before{content:""}.ic-js:before{content:""}.ic-js-square:before{content:""}.ic-jsfiddle:before{content:""}.ic-kaaba:before{content:""}.ic-kaggle:before{content:""}.ic-key:before{content:""}.ic-keybase:before{content:""}.ic-keyboard:before{content:""}.ic-keycdn:before{content:""}.ic-khanda:before{content:""}.ic-kickstarter:before{content:""}.ic-kickstarter-k:before{content:""}.ic-kiss:before{content:""}.ic-kiss-beam:before{content:""}.ic-kiss-wink-heart:before{content:""}.ic-kiwi-bird:before{content:""}.ic-korvue:before{content:""}.ic-landmark:before{content:""}.ic-language:before{content:""}.ic-laptop:before{content:""}.ic-laptop-code:before{content:""}.ic-laptop-house:before{content:""}.ic-laptop-medical:before{content:""}.ic-laravel:before{content:""}.ic-lastfm:before{content:""}.ic-lastfm-square:before{content:""}.ic-laugh:before{content:""}.ic-laugh-beam:before{content:""}.ic-laugh-squint:before{content:""}.ic-laugh-wink:before{content:""}.ic-layer-group:before{content:""}.ic-leaf:before{content:""}.ic-leanpub:before{content:""}.ic-lemon:before{content:""}.ic-less:before{content:""}.ic-less-than:before{content:""}.ic-less-than-equal:before{content:""}.ic-level-down-alt:before{content:""}.ic-level-up-alt:before{content:""}.ic-life-ring:before{content:""}.ic-lightbulb:before{content:""}.ic-line:before{content:""}.ic-link:before{content:""}.ic-linkedin:before{content:""}.ic-linkedin-in:before{content:""}.ic-linode:before{content:""}.ic-linux:before{content:""}.ic-lira-sign:before{content:""}.ic-list:before{content:""}.ic-list-alt:before{content:""}.ic-list-ol:before{content:""}.ic-list-ul:before{content:""}.ic-location-arrow:before{content:""}.ic-lock:before{content:""}.ic-lock-open:before{content:""}.ic-long-arrow-alt-down:before{content:""}.ic-long-arrow-alt-left:before{content:""}.ic-long-arrow-alt-right:before{content:""}.ic-long-arrow-alt-up:before{content:""}.ic-low-vision:before{content:""}.ic-luggage-cart:before{content:""}.ic-lungs:before{content:""}.ic-lungs-virus:before{content:""}.ic-lyft:before{content:""}.ic-magento:before{content:""}.ic-magic:before{content:""}.ic-magnet:before{content:""}.ic-mail-bulk:before{content:""}.ic-mailchimp:before{content:""}.ic-male:before{content:""}.ic-mandalorian:before{content:""}.ic-map:before{content:""}.ic-map-marked:before{content:""}.ic-map-marked-alt:before{content:""}.ic-map-marker:before{content:""}.ic-map-marker-alt:before{content:""}.ic-map-pin:before{content:""}.ic-map-signs:before{content:""}.ic-markdown:before{content:""}.ic-marker:before{content:""}.ic-mars:before{content:""}.ic-mars-double:before{content:""}.ic-mars-stroke:before{content:""}.ic-mars-stroke-h:before{content:""}.ic-mars-stroke-v:before{content:""}.ic-mask:before{content:""}.ic-mastodon:before{content:""}.ic-maxcdn:before{content:""}.ic-mdb:before{content:""}.ic-medal:before{content:""}.ic-medapps:before{content:""}.ic-medium:before{content:""}.ic-medium-m:before{content:""}.ic-medkit:before{content:""}.ic-medrt:before{content:""}.ic-meetup:before{content:""}.ic-megaport:before{content:""}.ic-meh:before{content:""}.ic-meh-blank:before{content:""}.ic-meh-rolling-eyes:before{content:""}.ic-memory:before{content:""}.ic-mendeley:before{content:""}.ic-menorah:before{content:""}.ic-mercury:before{content:""}.ic-meteor:before{content:""}.ic-microblog:before{content:""}.ic-microchip:before{content:""}.ic-microphone:before{content:""}.ic-microphone-alt:before{content:""}.ic-microphone-alt-slash:before{content:""}.ic-microphone-slash:before{content:""}.ic-microscope:before{content:""}.ic-microsoft:before{content:""}.ic-minus:before{content:""}.ic-minus-circle:before{content:""}.ic-minus-square:before{content:""}.ic-mitten:before{content:""}.ic-mix:before{content:""}.ic-mixcloud:before{content:""}.ic-mixer:before{content:""}.ic-mizuni:before{content:""}.ic-mobile:before{content:""}.ic-mobile-alt:before{content:""}.ic-modx:before{content:""}.ic-monero:before{content:""}.ic-money-bill:before{content:""}.ic-money-bill-alt:before{content:""}.ic-money-bill-wave:before{content:""}.ic-money-bill-wave-alt:before{content:""}.ic-money-check:before{content:""}.ic-money-check-alt:before{content:""}.ic-monument:before{content:""}.ic-moon:before{content:""}.ic-mortar-pestle:before{content:""}.ic-mosque:before{content:""}.ic-motorcycle:before{content:""}.ic-mountain:before{content:""}.ic-mouse:before{content:""}.ic-mouse-pointer:before{content:""}.ic-mug-hot:before{content:""}.ic-music:before{content:""}.ic-napster:before{content:""}.ic-neos:before{content:""}.ic-network-wired:before{content:""}.ic-neuter:before{content:""}.ic-newspaper:before{content:""}.ic-nimblr:before{content:""}.ic-node:before{content:""}.ic-node-js:before{content:""}.ic-not-equal:before{content:""}.ic-notes-medical:before{content:""}.ic-npm:before{content:""}.ic-ns8:before{content:""}.ic-nutritionix:before{content:""}.ic-object-group:before{content:""}.ic-object-ungroup:before{content:""}.ic-octopus-deploy:before{content:""}.ic-odnoklassniki:before{content:""}.ic-odnoklassniki-square:before{content:""}.ic-oil-can:before{content:""}.ic-old-republic:before{content:""}.ic-om:before{content:""}.ic-opencart:before{content:""}.ic-openid:before{content:""}.ic-opera:before{content:""}.ic-optin-monster:before{content:""}.ic-orcid:before{content:""}.ic-osi:before{content:""}.ic-otter:before{content:""}.ic-outdent:before{content:""}.ic-page4:before{content:""}.ic-pagelines:before{content:""}.ic-pager:before{content:""}.ic-paint-brush:before{content:""}.ic-paint-roller:before{content:""}.ic-palette:before{content:""}.ic-palfed:before{content:""}.ic-pallet:before{content:""}.ic-paper-plane:before{content:""}.ic-paperclip:before{content:""}.ic-parachute-box:before{content:""}.ic-paragraph:before{content:""}.ic-parking:before{content:""}.ic-passport:before{content:""}.ic-pastafarianism:before{content:""}.ic-paste:before{content:""}.ic-patreon:before{content:""}.ic-pause:before{content:""}.ic-pause-circle:before{content:""}.ic-paw:before{content:""}.ic-paypal:before{content:""}.ic-peace:before{content:""}.ic-pen:before{content:""}.ic-pen-alt:before{content:""}.ic-pen-fancy:before{content:""}.ic-pen-nib:before{content:""}.ic-pen-square:before{content:""}.ic-pencil-alt:before{content:""}.ic-pencil-ruler:before{content:""}.ic-penny-arcade:before{content:""}.ic-people-arrows:before{content:""}.ic-people-carry:before{content:""}.ic-pepper-hot:before{content:""}.ic-perbyte:before{content:""}.ic-percent:before{content:""}.ic-percentage:before{content:""}.ic-periscope:before{content:""}.ic-person-booth:before{content:""}.ic-phabricator:before{content:""}.ic-phoenix-framework:before{content:""}.ic-phoenix-squadron:before{content:""}.ic-phone:before{content:""}.ic-phone-alt:before{content:""}.ic-phone-slash:before{content:""}.ic-phone-square:before{content:""}.ic-phone-square-alt:before{content:""}.ic-phone-volume:before{content:""}.ic-photo-video:before{content:""}.ic-php:before{content:""}.ic-pied-piper:before{content:""}.ic-pied-piper-alt:before{content:""}.ic-pied-piper-hat:before{content:""}.ic-pied-piper-pp:before{content:""}.ic-pied-piper-square:before{content:""}.ic-piggy-bank:before{content:""}.ic-pills:before{content:""}.ic-pinterest:before{content:""}.ic-pinterest-p:before{content:""}.ic-pinterest-square:before{content:""}.ic-pizza-slice:before{content:""}.ic-place-of-worship:before{content:""}.ic-plane:before{content:""}.ic-plane-arrival:before{content:""}.ic-plane-departure:before{content:""}.ic-plane-slash:before{content:""}.ic-play:before{content:""}.ic-play-circle:before{content:""}.ic-playstation:before{content:""}.ic-plug:before{content:""}.ic-plus:before{content:""}.ic-plus-circle:before{content:""}.ic-plus-square:before{content:""}.ic-podcast:before{content:""}.ic-poll:before{content:""}.ic-poll-h:before{content:""}.ic-poo:before{content:""}.ic-poo-storm:before{content:""}.ic-poop:before{content:""}.ic-portrait:before{content:""}.ic-pound-sign:before{content:""}.ic-power-off:before{content:""}.ic-pray:before{content:""}.ic-praying-hands:before{content:""}.ic-prescription:before{content:""}.ic-prescription-bottle:before{content:""}.ic-prescription-bottle-alt:before{content:""}.ic-print:before{content:""}.ic-procedures:before{content:""}.ic-product-hunt:before{content:""}.ic-project-diagram:before{content:""}.ic-pump-medical:before{content:""}.ic-pump-soap:before{content:""}.ic-pushed:before{content:""}.ic-puzzle-piece:before{content:""}.ic-python:before{content:""}.ic-qq:before{content:""}.ic-qrcode:before{content:""}.ic-question:before{content:""}.ic-question-circle:before{content:""}.ic-quidditch:before{content:""}.ic-quinscape:before{content:""}.ic-quora:before{content:""}.ic-quote-left:before{content:""}.ic-quote-right:before{content:""}.ic-quran:before{content:""}.ic-r-project:before{content:""}.ic-radiation:before{content:""}.ic-radiation-alt:before{content:""}.ic-rainbow:before{content:""}.ic-random:before{content:""}.ic-raspberry-pi:before{content:""}.ic-ravelry:before{content:""}.ic-react:before{content:""}.ic-reacteurope:before{content:""}.ic-readme:before{content:""}.ic-rebel:before{content:""}.ic-receipt:before{content:""}.ic-record-vinyl:before{content:""}.ic-recycle:before{content:""}.ic-red-river:before{content:""}.ic-reddit:before{content:""}.ic-reddit-alien:before{content:""}.ic-reddit-square:before{content:""}.ic-redhat:before{content:""}.ic-redo:before{content:""}.ic-redo-alt:before{content:""}.ic-registered:before{content:""}.ic-remove-format:before{content:""}.ic-renren:before{content:""}.ic-reply:before{content:""}.ic-reply-all:before{content:""}.ic-replyd:before{content:""}.ic-republican:before{content:""}.ic-researchgate:before{content:""}.ic-resolving:before{content:""}.ic-restroom:before{content:""}.ic-retweet:before{content:""}.ic-rev:before{content:""}.ic-ribbon:before{content:""}.ic-ring:before{content:""}.ic-road:before{content:""}.ic-robot:before{content:""}.ic-rocket:before{content:""}.ic-rocketchat:before{content:""}.ic-rockrms:before{content:""}.ic-route:before{content:""}.ic-rss:before{content:""}.ic-rss-square:before{content:""}.ic-ruble-sign:before{content:""}.ic-ruler:before{content:""}.ic-ruler-combined:before{content:""}.ic-ruler-horizontal:before{content:""}.ic-ruler-vertical:before{content:""}.ic-running:before{content:""}.ic-rupee-sign:before{content:""}.ic-rust:before{content:""}.ic-sad-cry:before{content:""}.ic-sad-tear:before{content:""}.ic-safari:before{content:""}.ic-salesforce:before{content:""}.ic-sass:before{content:""}.ic-satellite:before{content:""}.ic-satellite-dish:before{content:""}.ic-save:before{content:""}.ic-schlix:before{content:""}.ic-school:before{content:""}.ic-screwdriver:before{content:""}.ic-scribd:before{content:""}.ic-scroll:before{content:""}.ic-sd-card:before{content:""}.ic-search:before{content:""}.ic-search-dollar:before{content:""}.ic-search-location:before{content:""}.ic-search-minus:before{content:""}.ic-search-plus:before{content:""}.ic-searchengin:before{content:""}.ic-seedling:before{content:""}.ic-sellcast:before{content:""}.ic-sellsy:before{content:""}.ic-server:before{content:""}.ic-servicestack:before{content:""}.ic-shapes:before{content:""}.ic-share:before{content:""}.ic-share-alt:before{content:""}.ic-share-alt-square:before{content:""}.ic-share-square:before{content:""}.ic-shekel-sign:before{content:""}.ic-shield-alt:before{content:""}.ic-shield-virus:before{content:""}.ic-ship:before{content:""}.ic-shipping-fast:before{content:""}.ic-shirtsinbulk:before{content:""}.ic-shoe-prints:before{content:""}.ic-shopify:before{content:""}.ic-shopping-bag:before{content:""}.ic-shopping-basket:before{content:""}.ic-shopping-cart:before{content:""}.ic-shopware:before{content:""}.ic-shower:before{content:""}.ic-shuttle-van:before{content:""}.ic-sign:before{content:""}.ic-sign-in-alt:before{content:""}.ic-sign-language:before{content:""}.ic-sign-out-alt:before{content:""}.ic-signal:before{content:""}.ic-signature:before{content:""}.ic-sim-card:before{content:""}.ic-simplybuilt:before{content:""}.ic-sink:before{content:""}.ic-sistrix:before{content:""}.ic-sitemap:before{content:""}.ic-sith:before{content:""}.ic-skating:before{content:""}.ic-sketch:before{content:""}.ic-skiing:before{content:""}.ic-skiing-nordic:before{content:""}.ic-skull:before{content:""}.ic-skull-crossbones:before{content:""}.ic-skyatlas:before{content:""}.ic-skype:before{content:""}.ic-slack:before{content:""}.ic-slack-hash:before{content:""}.ic-slash:before{content:""}.ic-sleigh:before{content:""}.ic-sliders-h:before{content:""}.ic-slideshare:before{content:""}.ic-smile:before{content:""}.ic-smile-beam:before{content:""}.ic-smile-wink:before{content:""}.ic-smog:before{content:""}.ic-smoking:before{content:""}.ic-smoking-ban:before{content:""}.ic-sms:before{content:""}.ic-snapchat:before{content:""}.ic-snapchat-ghost:before{content:""}.ic-snapchat-square:before{content:""}.ic-snowboarding:before{content:""}.ic-snowflake:before{content:""}.ic-snowman:before{content:""}.ic-snowplow:before{content:""}.ic-soap:before{content:""}.ic-socks:before{content:""}.ic-solar-panel:before{content:""}.ic-sort:before{content:""}.ic-sort-alpha-down:before{content:""}.ic-sort-alpha-down-alt:before{content:""}.ic-sort-alpha-up:before{content:""}.ic-sort-alpha-up-alt:before{content:""}.ic-sort-amount-down:before{content:""}.ic-sort-amount-down-alt:before{content:""}.ic-sort-amount-up:before{content:""}.ic-sort-amount-up-alt:before{content:""}.ic-sort-down:before{content:""}.ic-sort-numeric-down:before{content:""}.ic-sort-numeric-down-alt:before{content:""}.ic-sort-numeric-up:before{content:""}.ic-sort-numeric-up-alt:before{content:""}.ic-sort-up:before{content:""}.ic-soundcloud:before{content:""}.ic-sourcetree:before{content:""}.ic-spa:before{content:""}.ic-space-shuttle:before{content:""}.ic-speakap:before{content:""}.ic-speaker-deck:before{content:""}.ic-spell-check:before{content:""}.ic-spider:before{content:""}.ic-spinner:before{content:""}.ic-splotch:before{content:""}.ic-spotify:before{content:""}.ic-spray-can:before{content:""}.ic-square:before{content:""}.ic-square-full:before{content:""}.ic-square-root-alt:before{content:""}.ic-squarespace:before{content:""}.ic-stack-exchange:before{content:""}.ic-stack-overflow:before{content:""}.ic-stackpath:before{content:""}.ic-stamp:before{content:""}.ic-star:before{content:""}.ic-star-and-crescent:before{content:""}.ic-star-half:before{content:""}.ic-star-half-alt:before{content:""}.ic-star-of-david:before{content:""}.ic-star-of-life:before{content:""}.ic-staylinked:before{content:""}.ic-steam:before{content:""}.ic-steam-square:before{content:""}.ic-steam-symbol:before{content:""}.ic-step-backward:before{content:""}.ic-step-forward:before{content:""}.ic-stethoscope:before{content:""}.ic-sticker-mule:before{content:""}.ic-sticky-note:before{content:""}.ic-stop:before{content:""}.ic-stop-circle:before{content:""}.ic-stopwatch:before{content:""}.ic-stopwatch-20:before{content:""}.ic-store:before{content:""}.ic-store-alt:before{content:""}.ic-store-alt-slash:before{content:""}.ic-store-slash:before{content:""}.ic-strava:before{content:""}.ic-stream:before{content:""}.ic-street-view:before{content:""}.ic-strikethrough:before{content:""}.ic-stripe:before{content:""}.ic-stripe-s:before{content:""}.ic-stroopwafel:before{content:""}.ic-studiovinari:before{content:""}.ic-stumbleupon:before{content:""}.ic-stumbleupon-circle:before{content:""}.ic-subscript:before{content:""}.ic-subway:before{content:""}.ic-suitcase:before{content:""}.ic-suitcase-rolling:before{content:""}.ic-sun:before{content:""}.ic-superpowers:before{content:""}.ic-superscript:before{content:""}.ic-supple:before{content:""}.ic-surprise:before{content:""}.ic-suse:before{content:""}.ic-swatchbook:before{content:""}.ic-swift:before{content:""}.ic-swimmer:before{content:""}.ic-swimming-pool:before{content:""}.ic-symfony:before{content:""}.ic-synagogue:before{content:""}.ic-sync:before{content:""}.ic-sync-alt:before{content:""}.ic-syringe:before{content:""}.ic-table:before{content:""}.ic-table-tennis:before{content:""}.ic-tablet:before{content:""}.ic-tablet-alt:before{content:""}.ic-tablets:before{content:""}.ic-tachometer-alt:before{content:""}.ic-tag:before{content:""}.ic-tags:before{content:""}.ic-tape:before{content:""}.ic-tasks:before{content:""}.ic-taxi:before{content:""}.ic-teamspeak:before{content:""}.ic-teeth:before{content:""}.ic-teeth-open:before{content:""}.ic-telegram:before{content:""}.ic-telegram-plane:before{content:""}.ic-temperature-high:before{content:""}.ic-temperature-low:before{content:""}.ic-tencent-weibo:before{content:""}.ic-tenge:before{content:""}.ic-terminal:before{content:""}.ic-text-height:before{content:""}.ic-text-width:before{content:""}.ic-th:before{content:""}.ic-th-large:before{content:""}.ic-th-list:before{content:""}.ic-the-red-yeti:before{content:""}.ic-theater-masks:before{content:""}.ic-themeco:before{content:""}.ic-themeisle:before{content:""}.ic-thermometer:before{content:""}.ic-thermometer-empty:before{content:""}.ic-thermometer-full:before{content:""}.ic-thermometer-half:before{content:""}.ic-thermometer-quarter:before{content:""}.ic-thermometer-three-quarters:before{content:""}.ic-think-peaks:before{content:""}.ic-thumbs-down:before{content:""}.ic-thumbs-up:before{content:""}.ic-thumbtack:before{content:""}.ic-ticket-alt:before{content:""}.ic-tiktok:before{content:""}.ic-times:before{content:""}.ic-times-circle:before{content:""}.ic-tint:before{content:""}.ic-tint-slash:before{content:""}.ic-tired:before{content:""}.ic-toggle-off:before{content:""}.ic-toggle-on:before{content:""}.ic-toilet:before{content:""}.ic-toilet-paper:before{content:""}.ic-toilet-paper-slash:before{content:""}.ic-toolbox:before{content:""}.ic-tools:before{content:""}.ic-tooth:before{content:""}.ic-torah:before{content:""}.ic-torii-gate:before{content:""}.ic-tractor:before{content:""}.ic-trade-federation:before{content:""}.ic-trademark:before{content:""}.ic-traffic-light:before{content:""}.ic-trailer:before{content:""}.ic-train:before{content:""}.ic-tram:before{content:""}.ic-transgender:before{content:""}.ic-transgender-alt:before{content:""}.ic-trash:before{content:""}.ic-trash-alt:before{content:""}.ic-trash-restore:before{content:""}.ic-trash-restore-alt:before{content:""}.ic-tree:before{content:""}.ic-trello:before{content:""}.ic-tripadvisor:before{content:""}.ic-trophy:before{content:""}.ic-truck:before{content:""}.ic-truck-loading:before{content:""}.ic-truck-monster:before{content:""}.ic-truck-moving:before{content:""}.ic-truck-pickup:before{content:""}.ic-tshirt:before{content:""}.ic-tty:before{content:""}.ic-tumblr:before{content:""}.ic-tumblr-square:before{content:""}.ic-tv:before{content:""}.ic-twitch:before{content:""}.ic-twitter:before{content:""}.ic-twitter-square:before{content:""}.ic-typo3:before{content:""}.ic-uber:before{content:""}.ic-ubuntu:before{content:""}.ic-uikit:before{content:""}.ic-umbraco:before{content:""}.ic-umbrella:before{content:""}.ic-umbrella-beach:before{content:""}.ic-uncharted:before{content:""}.ic-underline:before{content:""}.ic-undo:before{content:""}.ic-undo-alt:before{content:""}.ic-uniregistry:before{content:""}.ic-unity:before{content:""}.ic-universal-access:before{content:""}.ic-university:before{content:""}.ic-unlink:before{content:""}.ic-unlock:before{content:""}.ic-unlock-alt:before{content:""}.ic-unsplash:before{content:""}.ic-untappd:before{content:""}.ic-upload:before{content:""}.ic-ups:before{content:""}.ic-usb:before{content:""}.ic-user:before{content:""}.ic-user-alt:before{content:""}.ic-user-alt-slash:before{content:""}.ic-user-astronaut:before{content:""}.ic-user-check:before{content:""}.ic-user-circle:before{content:""}.ic-user-clock:before{content:""}.ic-user-cog:before{content:""}.ic-user-edit:before{content:""}.ic-user-friends:before{content:""}.ic-user-graduate:before{content:""}.ic-user-injured:before{content:""}.ic-user-lock:before{content:""}.ic-user-md:before{content:""}.ic-user-minus:before{content:""}.ic-user-ninja:before{content:""}.ic-user-nurse:before{content:""}.ic-user-plus:before{content:""}.ic-user-secret:before{content:""}.ic-user-shield:before{content:""}.ic-user-slash:before{content:""}.ic-user-tag:before{content:""}.ic-user-tie:before{content:""}.ic-user-times:before{content:""}.ic-users:before{content:""}.ic-users-cog:before{content:""}.ic-users-slash:before{content:""}.ic-usps:before{content:""}.ic-ussunnah:before{content:""}.ic-utensil-spoon:before{content:""}.ic-utensils:before{content:""}.ic-vaadin:before{content:""}.ic-vector-square:before{content:""}.ic-venus:before{content:""}.ic-venus-double:before{content:""}.ic-venus-mars:before{content:""}.ic-vest:before{content:""}.ic-vest-patches:before{content:""}.ic-viacoin:before{content:""}.ic-viadeo:before{content:""}.ic-viadeo-square:before{content:""}.ic-vial:before{content:""}.ic-vials:before{content:""}.ic-viber:before{content:""}.ic-video:before{content:""}.ic-video-slash:before{content:""}.ic-vihara:before{content:""}.ic-vimeo:before{content:""}.ic-vimeo-square:before{content:""}.ic-vimeo-v:before{content:""}.ic-vine:before{content:""}.ic-virus:before{content:""}.ic-virus-slash:before{content:""}.ic-viruses:before{content:""}.ic-vk:before{content:""}.ic-vnv:before{content:""}.ic-voicemail:before{content:""}.ic-volleyball-ball:before{content:""}.ic-volume-down:before{content:""}.ic-volume-mute:before{content:""}.ic-volume-off:before{content:""}.ic-volume-up:before{content:""}.ic-vote-yea:before{content:""}.ic-vr-cardboard:before{content:""}.ic-vuejs:before{content:""}.ic-walking:before{content:""}.ic-wallet:before{content:""}.ic-warehouse:before{content:""}.ic-watchman-monitoring:before{content:""}.ic-water:before{content:""}.ic-wave-square:before{content:""}.ic-waze:before{content:""}.ic-weebly:before{content:""}.ic-weibo:before{content:""}.ic-weight:before{content:""}.ic-weight-hanging:before{content:""}.ic-weixin:before{content:""}.ic-whatsapp:before{content:""}.ic-whatsapp-square:before{content:""}.ic-wheelchair:before{content:""}.ic-whmcs:before{content:""}.ic-wifi:before{content:""}.ic-wikipedia-w:before{content:""}.ic-wind:before{content:""}.ic-window-close:before{content:""}.ic-window-maximize:before{content:""}.ic-window-minimize:before{content:""}.ic-window-restore:before{content:""}.ic-windows:before{content:""}.ic-wine-bottle:before{content:""}.ic-wine-glass:before{content:""}.ic-wine-glass-alt:before{content:""}.ic-wix:before{content:""}.ic-wizards-of-the-coast:before{content:""}.ic-wodu:before{content:""}.ic-wolf-pack-battalion:before{content:""}.ic-won-sign:before{content:""}.ic-wordpress:before{content:""}.ic-wordpress-simple:before{content:""}.ic-wpbeginner:before{content:""}.ic-wpexplorer:before{content:""}.ic-wpforms:before{content:""}.ic-wpressr:before{content:""}.ic-wrench:before{content:""}.ic-x-ray:before{content:""}.ic-xbox:before{content:""}.ic-xing:before{content:""}.ic-xing-square:before{content:""}.ic-y-combinator:before{content:""}.ic-yahoo:before{content:""}.ic-yammer:before{content:""}.ic-yandex:before{content:""}.ic-yandex-international:before{content:""}.ic-yarn:before{content:""}.ic-yelp:before{content:""}.ic-yen-sign:before{content:""}.ic-yin-yang:before{content:""}.ic-yoast:before{content:""}.ic-youtube:before{content:""}.ic-youtube-square:before{content:""}.ic-zhihu:before{content:""}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(data:font/woff;base64,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) format("woff")}.fa,.fas,.mapIcon16,.uiIcon16,.uiIcon24{font-family:Font Awesome\ 5 Free;font-weight:900}.mapIcon16,.uiIcon16,.uiIcon24{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-style:normal;font-variant:normal;font-weight:400;line-height:1;font-size:12px;padding:2px}.uiIcon24{font-size:24px}.uiIcon24.uiStatusIcon:before{content:""}.uiIcon24.uiStatusIcon.uiStatusGood{color:#080}.uiIcon24.uiStatusIcon.uiStatusAverage{color:#afa404}.uiIcon24.uiStatusIcon.uiStatusBad{color:#c20000}.icon-carat-1-n.mapIcon16:before,.icon-carat-1-n.uiIcon24:before,.uiIcon16.icon-carat-1-n:before{content:""}.icon-carat-1-ne.mapIcon16,.icon-carat-1-ne.uiIcon24,.uiIcon16.icon-carat-1-ne{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-carat-1-ne.mapIcon16:before,.icon-carat-1-ne.uiIcon24:before,.uiIcon16.icon-carat-1-ne:before{content:""}.icon-carat-1-e.mapIcon16:before,.icon-carat-1-e.uiIcon24:before,.uiIcon16.icon-carat-1-e:before{content:""}.icon-carat-1-se.mapIcon16,.icon-carat-1-se.uiIcon24,.uiIcon16.icon-carat-1-se{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-carat-1-se.mapIcon16:before,.icon-carat-1-se.uiIcon24:before,.uiIcon16.icon-carat-1-se:before{content:""}.icon-carat-1-s.mapIcon16:before,.icon-carat-1-s.uiIcon24:before,.uiIcon16.icon-carat-1-s:before{content:""}.icon-carat-1-sw.mapIcon16,.icon-carat-1-sw.uiIcon24,.uiIcon16.icon-carat-1-sw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-carat-1-sw.mapIcon16:before,.icon-carat-1-sw.uiIcon24:before,.uiIcon16.icon-carat-1-sw:before{content:""}.icon-carat-1-w.mapIcon16:before,.icon-carat-1-w.uiIcon24:before,.uiIcon16.icon-carat-1-w:before{content:""}.icon-carat-1-nw.mapIcon16,.icon-carat-1-nw.uiIcon24,.uiIcon16.icon-carat-1-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-carat-1-nw.mapIcon16:before,.icon-carat-1-nw.uiIcon24:before,.uiIcon16.icon-carat-1-nw:before{content:""}.icon-carat-2-n-s.mapIcon16,.icon-carat-2-n-s.uiIcon24,.uiIcon16.icon-carat-2-n-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-carat-2-n-s.mapIcon16:before,.icon-carat-2-n-s.uiIcon24:before,.uiIcon16.icon-carat-2-n-s:before{content:""}.icon-carat-2-e-w.mapIcon16:before,.icon-carat-2-e-w.uiIcon24:before,.uiIcon16.icon-carat-2-e-w:before{content:""}.icon-triangle-1-n.mapIcon16:before,.icon-triangle-1-n.uiIcon24:before,.uiIcon16.icon-triangle-1-n:before{content:""}.icon-triangle-1-ne.mapIcon16,.icon-triangle-1-ne.uiIcon24,.uiIcon16.icon-triangle-1-ne{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-triangle-1-ne.mapIcon16:before,.icon-triangle-1-ne.uiIcon24:before,.uiIcon16.icon-triangle-1-ne:before{content:""}.icon-triangle-1-e.mapIcon16:before,.icon-triangle-1-e.uiIcon24:before,.uiIcon16.icon-triangle-1-e:before{content:""}.icon-triangle-1-se.mapIcon16,.icon-triangle-1-se.uiIcon24,.uiIcon16.icon-triangle-1-se{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-triangle-1-se.mapIcon16:before,.icon-triangle-1-se.uiIcon24:before,.uiIcon16.icon-triangle-1-se:before{content:""}.icon-triangle-1-s.mapIcon16:before,.icon-triangle-1-s.uiIcon24:before,.uiIcon16.icon-triangle-1-s:before{content:""}.icon-triangle-1-sw.mapIcon16,.icon-triangle-1-sw.uiIcon24,.uiIcon16.icon-triangle-1-sw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-triangle-1-sw.mapIcon16:before,.icon-triangle-1-sw.uiIcon24:before,.uiIcon16.icon-triangle-1-sw:before{content:""}.icon-triangle-1-w.mapIcon16:before,.icon-triangle-1-w.uiIcon24:before,.uiIcon16.icon-triangle-1-w:before{content:""}.icon-triangle-1-nw.mapIcon16,.icon-triangle-1-nw.uiIcon24,.uiIcon16.icon-triangle-1-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-triangle-1-nw.mapIcon16:before,.icon-triangle-1-nw.uiIcon24:before,.uiIcon16.icon-triangle-1-nw:before{content:""}.icon-triangle-2-n-s.mapIcon16:before,.icon-triangle-2-n-s.uiIcon24:before,.uiIcon16.icon-triangle-2-n-s:before{content:""}.icon-triangle-2-e-w.mapIcon16:before,.icon-triangle-2-e-w.uiIcon24:before,.uiIcon16.icon-triangle-2-e-w:before{content:" "}.icon-arrow-1-n.mapIcon16:before,.icon-arrow-1-n.uiIcon24:before,.uiIcon16.icon-arrow-1-n:before{content:""}.icon-arrow-1-ne.mapIcon16,.icon-arrow-1-ne.uiIcon24,.uiIcon16.icon-arrow-1-ne{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-1-ne.mapIcon16:before,.icon-arrow-1-ne.uiIcon24:before,.uiIcon16.icon-arrow-1-ne:before{content:""}.icon-arrow-1-e.mapIcon16:before,.icon-arrow-1-e.uiIcon24:before,.uiIcon16.icon-arrow-1-e:before{content:""}.icon-arrow-1-se.mapIcon16,.icon-arrow-1-se.uiIcon24,.uiIcon16.icon-arrow-1-se{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-1-se.mapIcon16:before,.icon-arrow-1-se.uiIcon24:before,.uiIcon16.icon-arrow-1-se:before{content:""}.icon-arrow-1-s.mapIcon16:before,.icon-arrow-1-s.uiIcon24:before,.uiIcon16.icon-arrow-1-s:before{content:""}.icon-arrow-1-sw.mapIcon16,.icon-arrow-1-sw.uiIcon24,.uiIcon16.icon-arrow-1-sw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-1-sw.mapIcon16:before,.icon-arrow-1-sw.uiIcon24:before,.uiIcon16.icon-arrow-1-sw:before{content:""}.icon-arrow-1-w.mapIcon16:before,.icon-arrow-1-w.uiIcon24:before,.uiIcon16.icon-arrow-1-w:before{content:""}.icon-arrow-1-nw.mapIcon16,.icon-arrow-1-nw.uiIcon24,.uiIcon16.icon-arrow-1-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-1-nw.mapIcon16:before,.icon-arrow-1-nw.uiIcon24:before,.uiIcon16.icon-arrow-1-nw:before{content:""}.icon-arrow-2-n-s.mapIcon16:before,.icon-arrow-2-n-s.uiIcon24:before,.uiIcon16.icon-arrow-2-n-s:before{content:""}.icon-arrow-2-ne-sw.mapIcon16,.icon-arrow-2-ne-sw.uiIcon24,.uiIcon16.icon-arrow-2-ne-sw{-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.icon-arrow-2-ne-sw.mapIcon16:before,.icon-arrow-2-ne-sw.uiIcon24:before,.uiIcon16.icon-arrow-2-ne-sw:before{content:""}.icon-arrow-2-e-w.mapIcon16:before,.icon-arrow-2-e-w.uiIcon24:before,.uiIcon16.icon-arrow-2-e-w:before{content:""}.icon-arrow-2-se-nw.mapIcon16,.icon-arrow-2-se-nw.uiIcon24,.uiIcon16.icon-arrow-2-se-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-2-se-nw.mapIcon16:before,.icon-arrow-2-se-nw.uiIcon24:before,.uiIcon16.icon-arrow-2-se-nw:before{content:""}.icon-arrowstop-1-n.mapIcon16,.icon-arrowstop-1-n.uiIcon24,.uiIcon16.icon-arrowstop-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowstop-1-n.mapIcon16:before,.icon-arrowstop-1-n.uiIcon24:before,.uiIcon16.icon-arrowstop-1-n:before{content:""}.icon-arrowstop-1-e.mapIcon16:before,.icon-arrowstop-1-e.uiIcon24:before,.uiIcon16.icon-arrowstop-1-e:before{content:""}.icon-arrowstop-1-s.mapIcon16,.icon-arrowstop-1-s.uiIcon24,.uiIcon16.icon-arrowstop-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowstop-1-s.mapIcon16:before,.icon-arrowstop-1-s.uiIcon24:before,.uiIcon16.icon-arrowstop-1-s:before{content:""}.icon-arrowstop-1-w.mapIcon16,.icon-arrowstop-1-w.uiIcon24,.uiIcon16.icon-arrowstop-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowstop-1-w.mapIcon16:before,.icon-arrowstop-1-w.uiIcon24:before,.uiIcon16.icon-arrowstop-1-w:before{content:""}.icon-arrowthick-1-n.mapIcon16:before,.icon-arrowthick-1-n.uiIcon24:before,.uiIcon16.icon-arrowthick-1-n:before{content:""}.icon-arrowthick-1-ne.mapIcon16,.icon-arrowthick-1-ne.uiIcon24,.uiIcon16.icon-arrowthick-1-ne{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-1-ne.mapIcon16:before,.icon-arrowthick-1-ne.uiIcon24:before,.uiIcon16.icon-arrowthick-1-ne:before{content:""}.icon-arrowthick-1-e.mapIcon16:before,.icon-arrowthick-1-e.uiIcon24:before,.uiIcon16.icon-arrowthick-1-e:before{content:""}.icon-arrowthick-1-se.mapIcon16,.icon-arrowthick-1-se.uiIcon24,.uiIcon16.icon-arrowthick-1-se{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-1-se.mapIcon16:before,.icon-arrowthick-1-se.uiIcon24:before,.uiIcon16.icon-arrowthick-1-se:before{content:""}.icon-arrowthick-1-s.mapIcon16:before,.icon-arrowthick-1-s.uiIcon24:before,.uiIcon16.icon-arrowthick-1-s:before{content:""}.icon-arrowthick-1-sw.mapIcon16,.icon-arrowthick-1-sw.uiIcon24,.uiIcon16.icon-arrowthick-1-sw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-1-sw.mapIcon16:before,.icon-arrowthick-1-sw.uiIcon24:before,.uiIcon16.icon-arrowthick-1-sw:before{content:""}.icon-arrowthick-1-w.mapIcon16:before,.icon-arrowthick-1-w.uiIcon24:before,.uiIcon16.icon-arrowthick-1-w:before{content:""}.icon-arrowthick-1-nw.mapIcon16,.icon-arrowthick-1-nw.uiIcon24,.uiIcon16.icon-arrowthick-1-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-1-nw.mapIcon16:before,.icon-arrowthick-1-nw.uiIcon24:before,.uiIcon16.icon-arrowthick-1-nw:before{content:""}.icon-arrowthick-2-n-s.mapIcon16:before,.icon-arrowthick-2-n-s.uiIcon24:before,.uiIcon16.icon-arrowthick-2-n-s:before{content:""}.icon-arrowthick-2-ne-sw.mapIcon16,.icon-arrowthick-2-ne-sw.uiIcon24,.uiIcon16.icon-arrowthick-2-ne-sw{-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.icon-arrowthick-2-ne-sw.mapIcon16:before,.icon-arrowthick-2-ne-sw.uiIcon24:before,.uiIcon16.icon-arrowthick-2-ne-sw:before{content:""}.icon-arrowthick-2-e-w.mapIcon16:before,.icon-arrowthick-2-e-w.uiIcon24:before,.uiIcon16.icon-arrowthick-2-e-w:before{content:""}.icon-arrowthick-2-se-nw.mapIcon16,.icon-arrowthick-2-se-nw.uiIcon24,.uiIcon16.icon-arrowthick-2-se-nw{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrowthick-2-se-nw.mapIcon16:before,.icon-arrowthick-2-se-nw.uiIcon24:before,.uiIcon16.icon-arrowthick-2-se-nw:before{content:""}.icon-arrowthickstop-1-n.mapIcon16,.icon-arrowthickstop-1-n.uiIcon24,.uiIcon16.icon-arrowthickstop-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowthickstop-1-n.mapIcon16:before,.icon-arrowthickstop-1-n.uiIcon24:before,.uiIcon16.icon-arrowthickstop-1-n:before{content:""}.icon-arrowthickstop-1-e.mapIcon16:before,.icon-arrowthickstop-1-e.uiIcon24:before,.uiIcon16.icon-arrowthickstop-1-e:before{content:""}.icon-arrowthickstop-1-s.mapIcon16,.icon-arrowthickstop-1-s.uiIcon24,.uiIcon16.icon-arrowthickstop-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowthickstop-1-s.mapIcon16:before,.icon-arrowthickstop-1-s.uiIcon24:before,.uiIcon16.icon-arrowthickstop-1-s:before{content:""}.icon-arrowthickstop-1-w.mapIcon16,.icon-arrowthickstop-1-w.uiIcon24,.uiIcon16.icon-arrowthickstop-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowthickstop-1-w.mapIcon16:before,.icon-arrowthickstop-1-w.uiIcon24:before,.uiIcon16.icon-arrowthickstop-1-w:before{content:""}.icon-arrowreturnthick-1-w.mapIcon16,.icon-arrowreturnthick-1-w.uiIcon24,.uiIcon16.icon-arrowreturnthick-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowreturnthick-1-w.mapIcon16:before,.icon-arrowreturnthick-1-w.uiIcon24:before,.uiIcon16.icon-arrowreturnthick-1-w:before{content:""}.icon-arrowreturnthick-1-n.mapIcon16,.icon-arrowreturnthick-1-n.uiIcon24,.uiIcon16.icon-arrowreturnthick-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowreturnthick-1-n.mapIcon16:before,.icon-arrowreturnthick-1-n.uiIcon24:before,.uiIcon16.icon-arrowreturnthick-1-n:before{content:""}.icon-arrowreturnthick-1-e.mapIcon16:before,.icon-arrowreturnthick-1-e.uiIcon24:before,.uiIcon16.icon-arrowreturnthick-1-e:before{content:""}.icon-arrowreturnthick-1-s.mapIcon16,.icon-arrowreturnthick-1-s.uiIcon24,.uiIcon16.icon-arrowreturnthick-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowreturnthick-1-s.mapIcon16:before,.icon-arrowreturnthick-1-s.uiIcon24:before,.uiIcon16.icon-arrowreturnthick-1-s:before{content:""}.icon-arrowreturn-1-w.mapIcon16,.icon-arrowreturn-1-w.uiIcon24,.uiIcon16.icon-arrowreturn-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowreturn-1-w.mapIcon16:before,.icon-arrowreturn-1-w.uiIcon24:before,.uiIcon16.icon-arrowreturn-1-w:before{content:""}.icon-arrowreturn-1-n.mapIcon16,.icon-arrowreturn-1-n.uiIcon24,.uiIcon16.icon-arrowreturn-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowreturn-1-n.mapIcon16:before,.icon-arrowreturn-1-n.uiIcon24:before,.uiIcon16.icon-arrowreturn-1-n:before{content:""}.icon-arrowreturn-1-e.mapIcon16:before,.icon-arrowreturn-1-e.uiIcon24:before,.uiIcon16.icon-arrowreturn-1-e:before{content:""}.icon-arrowreturn-1-s.mapIcon16,.icon-arrowreturn-1-s.uiIcon24,.uiIcon16.icon-arrowreturn-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowreturn-1-s.mapIcon16:before,.icon-arrowreturn-1-s.uiIcon24:before,.uiIcon16.icon-arrowreturn-1-s:before{content:""}.icon-arrowrefresh-1-w.mapIcon16,.icon-arrowrefresh-1-w.uiIcon24,.uiIcon16.icon-arrowrefresh-1-w{-ms-transform:rotate(180deg);transform:rotate(180deg)}.icon-arrowrefresh-1-w.mapIcon16:before,.icon-arrowrefresh-1-w.uiIcon24:before,.uiIcon16.icon-arrowrefresh-1-w:before{content:""}.icon-arrowrefresh-1-n.mapIcon16,.icon-arrowrefresh-1-n.uiIcon24,.uiIcon16.icon-arrowrefresh-1-n{-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.icon-arrowrefresh-1-n.mapIcon16:before,.icon-arrowrefresh-1-n.uiIcon24:before,.uiIcon16.icon-arrowrefresh-1-n:before{content:""}.icon-arrowrefresh-1-e.mapIcon16:before,.icon-arrowrefresh-1-e.uiIcon24:before,.uiIcon16.icon-arrowrefresh-1-e:before{content:""}.icon-arrowrefresh-1-s.mapIcon16,.icon-arrowrefresh-1-s.uiIcon24,.uiIcon16.icon-arrowrefresh-1-s{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-arrowrefresh-1-s.mapIcon16:before,.icon-arrowrefresh-1-s.uiIcon24:before,.uiIcon16.icon-arrowrefresh-1-s:before{content:""}.icon-arrow-4.mapIcon16:before,.icon-arrow-4.uiIcon24:before,.uiIcon16.icon-arrow-4:before{content:""}.icon-arrow-4-diag.mapIcon16,.icon-arrow-4-diag.uiIcon24,.uiIcon16.icon-arrow-4-diag{-ms-transform:rotate(45deg);transform:rotate(45deg)}.icon-arrow-4-diag.mapIcon16:before,.icon-arrow-4-diag.uiIcon24:before,.uiIcon16.icon-arrow-4-diag:before{content:""}.icon-extlink.mapIcon16:before,.icon-extlink.uiIcon24:before,.uiIcon16.icon-extlink:before{content:""}.icon-newwin.mapIcon16:before,.icon-newwin.uiIcon24:before,.uiIcon16.icon-newwin:before{content:""}.icon-refresh.mapIcon16:before,.icon-refresh.uiIcon24:before,.uiIcon16.icon-refresh:before{content:""}.icon-shuffle.mapIcon16:before,.icon-shuffle.uiIcon24:before,.uiIcon16.icon-shuffle:before{content:""}.icon-transfer-e-w.mapIcon16:before,.icon-transfer-e-w.uiIcon24:before,.uiIcon16.icon-transfer-e-w:before{content:""}.icon-transferthick-e-w.mapIcon16:before,.icon-transferthick-e-w.uiIcon24:before,.uiIcon16.icon-transferthick-e-w:before{content:""}.icon-radiation.mapIcon16:before,.icon-radiation.uiIcon24:before,.uiIcon16.icon-radiation:before{content:""}.icon-folder-collapsed.mapIcon16:before,.icon-folder-collapsed.uiIcon24:before,.uiIcon16.icon-folder-collapsed:before{content:""}.icon-folder-open.mapIcon16:before,.icon-folder-open.uiIcon24:before,.uiIcon16.icon-folder-open:before{content:""}.icon-document.mapIcon16:before,.icon-document.uiIcon24:before,.uiIcon16.icon-document:before{content:""}.icon-document-b.mapIcon16:before,.icon-document-b.uiIcon24:before,.uiIcon16.icon-document-b:before{content:""}.icon-note.mapIcon16:before,.icon-note.uiIcon24:before,.uiIcon16.icon-note:before{content:""}.icon-mail-closed.mapIcon16:before,.icon-mail-closed.uiIcon24:before,.uiIcon16.icon-mail-closed:before{content:""}.icon-mail-open.mapIcon16:before,.icon-mail-open.uiIcon24:before,.uiIcon16.icon-mail-open:before{content:""}.icon-suitcase.mapIcon16:before,.icon-suitcase.uiIcon24:before,.uiIcon16.icon-suitcase:before{content:""}.icon-comment.mapIcon16:before,.icon-comment.uiIcon24:before,.uiIcon16.icon-comment:before{content:""}.icon-person.mapIcon16:before,.icon-person.uiIcon24:before,.uiIcon16.icon-person:before{content:""}.icon-print.mapIcon16:before,.icon-print.uiIcon24:before,.uiIcon16.icon-print:before{content:""}.icon-trash.mapIcon16:before,.icon-trash.uiIcon24:before,.uiIcon16.icon-trash:before{content:""}.icon-locked.mapIcon16:before,.icon-locked.uiIcon24:before,.uiIcon16.icon-locked:before{content:""}.icon-unlocked.mapIcon16:before,.icon-unlocked.uiIcon24:before,.uiIcon16.icon-unlocked:before{content:""}.icon-bookmark.mapIcon16:before,.icon-bookmark.uiIcon24:before,.uiIcon16.icon-bookmark:before{content:""}.icon-tag.mapIcon16:before,.icon-tag.uiIcon24:before,.uiIcon16.icon-tag:before{content:""}.icon-home.mapIcon16:before,.icon-home.uiIcon24:before,.uiIcon16.icon-home:before{content:""}.icon-flag.mapIcon16:before,.icon-flag.uiIcon24:before,.uiIcon16.icon-flag:before{content:""}.icon-calendar.mapIcon16:before,.icon-calendar.uiIcon24:before,.uiIcon16.icon-calendar:before{content:""}.icon-cart.mapIcon16:before,.icon-cart.uiIcon24:before,.uiIcon16.icon-cart:before{content:""}.icon-pencil.mapIcon16:before,.icon-pencil.uiIcon24:before,.uiIcon16.icon-pencil:before{content:""}.icon-clock.mapIcon16:before,.icon-clock.uiIcon24:before,.uiIcon16.icon-clock:before{content:""}.icon-disk.mapIcon16:before,.icon-disk.uiIcon24:before,.uiIcon16.icon-disk:before{content:""}.icon-calculator.mapIcon16:before,.icon-calculator.uiIcon24:before,.uiIcon16.icon-calculator:before{content:""}.icon-zoomin.mapIcon16:before,.icon-zoomin.uiIcon24:before,.uiIcon16.icon-zoomin:before{content:""}.icon-zoomout.mapIcon16:before,.icon-zoomout.uiIcon24:before,.uiIcon16.icon-zoomout:before{content:""}.icon-search.mapIcon16:before,.icon-search.uiIcon24:before,.uiIcon16.icon-search:before{content:""}.icon-wrench.mapIcon16:before,.icon-wrench.uiIcon24:before,.uiIcon16.icon-wrench:before{content:""}.icon-gear.mapIcon16:before,.icon-gear.uiIcon24:before,.uiIcon16.icon-gear:before{content:""}.icon-heart.mapIcon16:before,.icon-heart.uiIcon24:before,.uiIcon16.icon-heart:before{content:""}.icon-star.mapIcon16:before,.icon-star.uiIcon24:before,.uiIcon16.icon-star:before{content:""}.icon-link.mapIcon16:before,.icon-link.uiIcon24:before,.uiIcon16.icon-link:before{content:""}.icon-cancel.mapIcon16:before,.icon-cancel.uiIcon24:before,.uiIcon16.icon-cancel:before{content:""}.icon-plus.mapIcon16:before,.icon-plus.uiIcon24:before,.uiIcon16.icon-plus:before{content:""}.icon-plusthick.mapIcon16:before,.icon-plusthick.uiIcon24:before,.uiIcon16.icon-plusthick:before{content:""}.icon-minus.mapIcon16:before,.icon-minus.uiIcon24:before,.uiIcon16.icon-minus:before{content:""}.icon-minusthick.mapIcon16:before,.icon-minusthick.uiIcon24:before,.uiIcon16.icon-minusthick:before{content:""}.icon-close.mapIcon16:before,.icon-close.uiIcon24:before,.uiIcon16.icon-close:before{content:""}.icon-closethick.mapIcon16:before,.icon-closethick.uiIcon24:before,.uiIcon16.icon-closethick:before{content:""}.icon-key.mapIcon16:before,.icon-key.uiIcon24:before,.uiIcon16.icon-key:before{content:""}.icon-lightbulb.mapIcon16:before,.icon-lightbulb.uiIcon24:before,.uiIcon16.icon-lightbulb:before{content:""}.icon-scissors.mapIcon16:before,.icon-scissors.uiIcon24:before,.uiIcon16.icon-scissors:before{content:""}.icon-clipboard.mapIcon16:before,.icon-clipboard.uiIcon24:before,.uiIcon16.icon-clipboard:before{content:""}.icon-copy.mapIcon16:before,.icon-copy.uiIcon24:before,.uiIcon16.icon-copy:before{content:""}.icon-contact.mapIcon16:before,.icon-contact.uiIcon24:before,.uiIcon16.icon-contact:before{content:""}.icon-image.mapIcon16:before,.icon-image.uiIcon24:before,.uiIcon16.icon-image:before{content:""}.icon-video.mapIcon16:before,.icon-video.uiIcon24:before,.uiIcon16.icon-video:before{content:""}.icon-script.mapIcon16:before,.icon-script.uiIcon24:before,.uiIcon16.icon-script:before{content:""}.icon-alert.mapIcon16:before,.icon-alert.uiIcon24:before,.uiIcon16.icon-alert:before{content:""}.icon-info.mapIcon16:before,.icon-info.uiIcon24:before,.uiIcon16.icon-info:before{content:""}.icon-notice.mapIcon16:before,.icon-notice.uiIcon24:before,.uiIcon16.icon-notice:before{content:""}.icon-help.mapIcon16:before,.icon-help.uiIcon24:before,.uiIcon16.icon-help:before{content:""}.icon-check.mapIcon16:before,.icon-check.uiIcon24:before,.uiIcon16.icon-check:before{content:""}.icon-bullet.mapIcon16:before,.icon-bullet.uiIcon24:before,.uiIcon16.icon-bullet:before{content:""}.icon-pin-w.mapIcon16,.icon-pin-w.uiIcon24,.uiIcon16.icon-pin-w{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-pin-w.mapIcon16:before,.icon-pin-w.uiIcon24:before,.uiIcon16.icon-pin-w:before{content:""}.icon-pin-s.mapIcon16:before,.icon-pin-s.uiIcon24:before,.uiIcon16.icon-pin-s:before{content:""}.icon-night.mapIcon16:before,.icon-night.uiIcon24:before,.uiIcon16.icon-night:before{content:""}.icon-play.mapIcon16:before,.icon-play.uiIcon24:before,.uiIcon16.icon-play:before{content:""}.icon-pause.mapIcon16:before,.icon-pause.uiIcon24:before,.uiIcon16.icon-pause:before{content:""}.icon-seek-next.mapIcon16:before,.icon-seek-next.uiIcon24:before,.uiIcon16.icon-seek-next:before{content:""}.icon-seek-prev.mapIcon16:before,.icon-seek-prev.uiIcon24:before,.uiIcon16.icon-seek-prev:before{content:""}.icon-seek-end.mapIcon16:before,.icon-seek-end.uiIcon24:before,.uiIcon16.icon-seek-end:before{content:""}.icon-seek-start.mapIcon16:before,.icon-seek-start.uiIcon24:before,.uiIcon16.icon-seek-start:before{content:""}.icon-seek-first.mapIcon16:before,.icon-seek-first.uiIcon24:before,.uiIcon16.icon-seek-first:before{content:""}.icon-stop.mapIcon16:before,.icon-stop.uiIcon24:before,.uiIcon16.icon-stop:before{content:""}.icon-eject.mapIcon16:before,.icon-eject.uiIcon24:before,.uiIcon16.icon-eject:before{content:""}.icon-volume-off.mapIcon16:before,.icon-volume-off.uiIcon24:before,.uiIcon16.icon-volume-off:before{content:""}.icon-volume-on.mapIcon16:before,.icon-volume-on.uiIcon24:before,.uiIcon16.icon-volume-on:before{content:""}.icon-power.mapIcon16:before,.icon-power.uiIcon24:before,.uiIcon16.icon-power:before{content:""}.icon-signal-diag.mapIcon16:before,.icon-signal-diag.uiIcon24:before,.uiIcon16.icon-signal-diag:before{content:""}.icon-signal.mapIcon16:before,.icon-signal.uiIcon24:before,.uiIcon16.icon-signal:before{content:""}.icon-battery-0.mapIcon16:before,.icon-battery-0.uiIcon24:before,.uiIcon16.icon-battery-0:before{content:""}.icon-battery-1.mapIcon16:before,.icon-battery-1.uiIcon24:before,.uiIcon16.icon-battery-1:before{content:""}.icon-battery-2.mapIcon16:before,.icon-battery-2.uiIcon24:before,.uiIcon16.icon-battery-2:before{content:""}.icon-battery-3.mapIcon16:before,.icon-battery-3.uiIcon24:before,.uiIcon16.icon-battery-3:before{content:""}.icon-circle-plus.mapIcon16:before,.icon-circle-plus.uiIcon24:before,.uiIcon16.icon-circle-plus:before{content:""}.icon-circle-minus.mapIcon16:before,.icon-circle-minus.uiIcon24:before,.uiIcon16.icon-circle-minus:before{content:""}.icon-circle-close.mapIcon16:before,.icon-circle-close.uiIcon24:before,.uiIcon16.icon-circle-close:before{content:""}.icon-circlesmall-plus.mapIcon16:before,.icon-circlesmall-plus.uiIcon24:before,.uiIcon16.icon-circlesmall-plus:before{content:""}.icon-circlesmall-minus.mapIcon16:before,.icon-circlesmall-minus.uiIcon24:before,.uiIcon16.icon-circlesmall-minus:before{content:""}.icon-squaresmall-plus.mapIcon16:before,.icon-squaresmall-plus.uiIcon24:before,.uiIcon16.icon-squaresmall-plus:before{content:""}.icon-squaresmall-minus.mapIcon16:before,.icon-squaresmall-minus.uiIcon24:before,.uiIcon16.icon-squaresmall-minus:before{content:""}.icon-grip-dotted-vertical.mapIcon16:before,.icon-grip-dotted-vertical.uiIcon24:before,.uiIcon16.icon-grip-dotted-vertical:before{content:""}.icon-grip-dotted-horizontal.mapIcon16,.icon-grip-dotted-horizontal.uiIcon24,.uiIcon16.icon-grip-dotted-horizontal{-ms-transform:rotate(90deg);transform:rotate(90deg)}.icon-grip-dotted-horizontal.mapIcon16:before,.icon-grip-dotted-horizontal.uiIcon24:before,.uiIcon16.icon-grip-dotted-horizontal:before{content:""}.mapIcon16{position:absolute;color:#2fd02f}.mapIcon16.red{color:#c00}.mapIcon16.rank-captain:before{content:""}.mapIcon16.rank-headofpersonnel:before{content:""}.mapIcon16.rank-headofsecurity:before{content:""}.mapIcon16.rank-chiefengineer:before{content:""}.mapIcon16.rank-researchdirector:before{content:""}.mapIcon16.rank-chiefmedicalofficer:before{content:""}.mapIcon16.rank-stationengineer:before{content:""}.mapIcon16.rank-atmospherictechnician:before{content:""}.mapIcon16.rank-medicaldoctor:before{content:""}.mapIcon16.rank-psychiatrist:before{content:""}.mapIcon16.rank-chemist:before{content:""}.mapIcon16.rank-scientist:before{content:""}.mapIcon16.rank-geneticist:before{content:""}.mapIcon16.rank-roboticist:before{content:""}.mapIcon16.rank-xenobiologist:before{content:""}.mapIcon16.rank-warden:before{content:""}.mapIcon16.rank-detective:before{content:""}.mapIcon16.rank-securityofficer:before{content:""}.clear-left{clear:left!important}.clear-right{clear:right!important}.clear-both{clear:both!important}.clear-none{clear:none!important}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-none{display:none!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.mr-0{margin-right:0!important}.mr-1{margin-right:.25rem!important}.mr-2{margin-right:.5rem!important}.mr-3{margin-right:1rem!important}.mr-4{margin-right:1.5rem!important}.mr-5{margin-right:3rem!important}.mr-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ml-0{margin-left:0!important}.ml-1{margin-left:.25rem!important}.ml-2{margin-left:.5rem!important}.ml-3{margin-left:1rem!important}.ml-4{margin-left:1.5rem!important}.ml-5{margin-left:3rem!important}.ml-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pr-0{padding-right:0!important}.pr-1{padding-right:.25rem!important}.pr-2{padding-right:.5rem!important}.pr-3{padding-right:1rem!important}.pr-4{padding-right:1.5rem!important}.pr-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.pl-0{padding-left:0!important}.pl-1{padding-left:.25rem!important}.pl-2{padding-left:.5rem!important}.pl-3{padding-left:1rem!important}.pl-4{padding-left:1.5rem!important}.pl-5{padding-left:3rem!important}.fs-small{font-size:12px!important}.fs-normal{font-size:14px!important}.fs-large{font-size:16px!important}.fs-largest{font-size:18px!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:light!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.theme-basic-dark .button,.theme-basic-dark a,.theme-basic-dark button,.theme-basic-dark input[disabled],.theme-basic-dark input[type=button],.theme-basic-dark input[type=reset],.theme-basic-dark input[type=submit],.theme-basic .button,.theme-basic a,.theme-basic button,.theme-basic input[disabled],.theme-basic input[type=button],.theme-basic input[type=reset],.theme-basic input[type=submit]{display:inline;background:none;border:none;border-radius:0;color:#00e;padding:.1em 0 0 0;margin-right:2px;text-decoration:underline}.theme-basic-dark .button:hover,.theme-basic-dark a:hover,.theme-basic-dark button:hover,.theme-basic-dark input[disabled]:hover,.theme-basic-dark input[type=button]:hover,.theme-basic-dark input[type=reset]:hover,.theme-basic-dark input[type=submit]:hover,.theme-basic .button:hover,.theme-basic a:hover,.theme-basic button:hover,.theme-basic input[disabled]:hover,.theme-basic input[type=button]:hover,.theme-basic input[type=reset]:hover,.theme-basic input[type=submit]:hover{background:none;color:#551a8b}.theme-basic-dark .button:active,.theme-basic-dark a:active,.theme-basic-dark button:active,.theme-basic-dark input[disabled]:active,.theme-basic-dark input[type=button]:active,.theme-basic-dark input[type=reset]:active,.theme-basic-dark input[type=submit]:active,.theme-basic .button:active,.theme-basic a:active,.theme-basic button:active,.theme-basic input[disabled]:active,.theme-basic input[type=button]:active,.theme-basic input[type=reset]:active,.theme-basic input[type=submit]:active{color:#e00}.theme-basic-dark .tooltip.content,.theme-basic .tooltip.content{background:#fff;border:1px solid #a9a9a9}.theme-basic-dark{color:#fff;background:#000}.theme-basic-dark .button,.theme-basic-dark a,.theme-basic-dark button,.theme-basic-dark input[disabled],.theme-basic-dark input[type=button],.theme-basic-dark input[type=reset],.theme-basic-dark input[type=submit]{color:#90ee90}.theme-basic-dark .button:hover,.theme-basic-dark a:hover,.theme-basic-dark button:hover,.theme-basic-dark input[disabled]:hover,.theme-basic-dark input[type=button]:hover,.theme-basic-dark input[type=reset]:hover,.theme-basic-dark input[type=submit]:hover{color:#cceb76}.theme-basic-dark .button:active,.theme-basic-dark a:active,.theme-basic-dark button:active,.theme-basic-dark input[disabled]:active,.theme-basic-dark input[type=button]:active,.theme-basic-dark input[type=reset]:active,.theme-basic-dark input[type=submit]:active{color:#1ff}.theme-basic-dark .button:visited,.theme-basic-dark a:visited,.theme-basic-dark button:visited,.theme-basic-dark input[disabled]:visited,.theme-basic-dark input[type=button]:visited,.theme-basic-dark input[type=reset]:visited,.theme-basic-dark input[type=submit]:visited{color:#2e8b57}.theme-basic-dark .uiTitleWrapper{background-color:#464646}.theme-basic-dark .tooltip.content{background:#000}.theme-nano,.theme-nano-light{font-size:12px;line-height:1.9em;font-family:Verdana,Geneva,sans-serif;background:#202020 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjQzMCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4Mj0iNDAwIiB5MT0iNDMwIiB4MT0iNDAwIiBpZD0iYiI+PHN0b3Agc3RvcC1jb2xvcj0iIzIwMjAyMCIgb2Zmc2V0PSIuNDEiLz48c3RvcCBzdG9wLWNvbG9yPSIjM2QzYzNjIiBvZmZzZXQ9Ii44NCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMjQwLjU1IiB4Mj0iMzk5LjkiIHkxPSIxMzYuNTIiIHgxPSIzOTkuOSIgaWQ9ImEiPjxzdG9wIHN0b3AtY29sb3I9IiMxZjFmMWYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiMxNzE3MTciIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IHhsaW5rOmhyZWY9IiNhIiB5Mj0iMjQwLjU1IiB4Mj0iNDc5LjMyIiB5MT0iMTk3LjY5IiB4MT0iNDc5LjMyIiBpZD0iYyIvPjxsaW5lYXJHcmFkaWVudCB4bGluazpocmVmPSIjYSIgeTI9IjE3OS40MSIgeDI9IjMyMC40MyIgeTE9IjEzNi41NCIgeDE9IjMyMC40MyIgaWQ9ImQiLz48L2RlZnM+PHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTAgMGg4MDB2NDMwSDB6Ii8+PHBhdGggZD0iTTQ1MS40NCAxNDEuNWMtLjA3LTIuMjUtMS0zLjU1LTIuNzMtMy45M2gtMjQuMnEtMy42LjA5LTMuNzEgNC4wNnY1MC40NGwtMzMuNzItNTRhNSA1IDAgMDAtMy4wNS0xLjVsLS45LS4wN2gtMzEuNDVxLTMuMTkuMjgtMy4zMyA0djk1LjA2Yy4wOCAyLjI1IDEgMy41NiAyLjczIDMuOTNoMjQuMnEzLjYtLjA5IDMuNzEtNC4wNlYxODVsMzMuNzIgNTRhNSA1IDAgMDAzLjA1IDEuNTFjLjI5IDAgLjU5IDAgLjkuMDZoMzEuNDVxMy4xOS0uMjggMy4zMy00eiIgZmlsbD0idXJsKCNhKSIvPjxwYXRoIGQ9Ik00OTYuMzQgMjI4LjNsLTM2LjY3LTMwLjU3djM4Ljg3Yy4wNyAyLjQ3IDEuMTggMy44IDMuMzEgNGgzMC4yNWE1LjQ1IDUuNDUgMCAwMDQuMDUtMiA3LjI0IDcuMjQgMCAwMDAtOS40NiAzLjU5IDMuNTkgMCAwMC0uMzktLjM5bC0uMDYtLjA2eiIgZmlsbD0idXJsKCNjKSIvPjxwYXRoIGQ9Ik0zMDMuNDEgMTQ4Ljc5di4wNWwzNi42NyAzMC41N3YtMzguODdjLS4wNy0yLjQ4LTEuMTgtMy44MS0zLjMxLTRoLTMwLjIxYTUuNDkgNS40OSAwIDAwLTQuMDUgMiA2LjgxIDYuODEgMCAwMC0xLjc2IDQuNzIgNi45MSA2LjkxIDAgMDAxLjc2IDQuNzRxLjE5LjIxLjM5LjM5bC4wNi4wNmE0LjEyIDQuMTIgMCAwMC40NS4zNHoiIGZpbGw9InVybCgjZCkiLz48L3N2Zz4=) 50% 0 repeat-x;scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.theme-nano-light hr,.theme-nano hr{background-color:#40628a;height:1px}.theme-nano-light .uiTitleWrapper,.theme-nano .uiTitleWrapper{background-color:#363636;box-shadow:0 0 8px 4px rgba(0,0,0,.5)}.theme-nano-light .uiTitleWrapper .uiTitleText,.theme-nano .uiTitleWrapper .uiTitleText{color:#e9c183}.theme-nano-light .uiTitleWrapper .uiTitleClose,.theme-nano .uiTitleWrapper .uiTitleClose{color:hsla(0,0%,100%,.5)}.theme-nano-light .button,.theme-nano-light a,.theme-nano-light button,.theme-nano-light input[type=button],.theme-nano-light input[type=reset],.theme-nano-light input[type=submit],.theme-nano .button,.theme-nano a,.theme-nano button,.theme-nano input[type=button],.theme-nano input[type=reset],.theme-nano input[type=submit]{display:inline-block;min-width:15px;height:16px;text-align:center;text-decoration:none;background:#40628a;cursor:default;white-space:nowrap;box-sizing:content-box;color:inherit;border-radius:.15em;padding:2px 4px 2px 4px;line-height:16px;vertical-align:top;margin:0 2px 2px 0}.theme-nano-light .button:hover,.theme-nano-light a:hover,.theme-nano-light button:hover,.theme-nano-light input[type=button]:hover,.theme-nano-light input[type=reset]:hover,.theme-nano-light input[type=submit]:hover,.theme-nano .button:hover,.theme-nano a:hover,.theme-nano button:hover,.theme-nano input[type=button]:hover,.theme-nano input[type=reset]:hover,.theme-nano input[type=submit]:hover{background:#507aac}.theme-nano-light .button:active,.theme-nano-light .button:link,.theme-nano-light .button:visited,.theme-nano-light a:active,.theme-nano-light a:link,.theme-nano-light a:visited,.theme-nano-light button:active,.theme-nano-light button:link,.theme-nano-light button:visited,.theme-nano-light input[type=button]:active,.theme-nano-light input[type=button]:link,.theme-nano-light input[type=button]:visited,.theme-nano-light input[type=reset]:active,.theme-nano-light input[type=reset]:link,.theme-nano-light input[type=reset]:visited,.theme-nano-light input[type=submit]:active,.theme-nano-light input[type=submit]:link,.theme-nano-light input[type=submit]:visited,.theme-nano .button:active,.theme-nano .button:link,.theme-nano .button:visited,.theme-nano a:active,.theme-nano a:link,.theme-nano a:visited,.theme-nano button:active,.theme-nano button:link,.theme-nano button:visited,.theme-nano input[type=button]:active,.theme-nano input[type=button]:link,.theme-nano input[type=button]:visited,.theme-nano input[type=reset]:active,.theme-nano input[type=reset]:link,.theme-nano input[type=reset]:visited,.theme-nano input[type=submit]:active,.theme-nano input[type=submit]:link,.theme-nano input[type=submit]:visited{text-decoration:none}.theme-nano-light .button.on,.theme-nano-light .button.selected,.theme-nano-light a.on,.theme-nano-light a.selected,.theme-nano-light button.on,.theme-nano-light button.selected,.theme-nano-light input[type=button].on,.theme-nano-light input[type=button].selected,.theme-nano-light input[type=reset].on,.theme-nano-light input[type=reset].selected,.theme-nano-light input[type=submit].on,.theme-nano-light input[type=submit].selected,.theme-nano .button.on,.theme-nano .button.selected,.theme-nano a.on,.theme-nano a.selected,.theme-nano button.on,.theme-nano button.selected,.theme-nano input[type=button].on,.theme-nano input[type=button].selected,.theme-nano input[type=reset].on,.theme-nano input[type=reset].selected,.theme-nano input[type=submit].on,.theme-nano input[type=submit].selected{background:#2f943c}.theme-nano-light .button.on:hover,.theme-nano-light .button.selected:hover,.theme-nano-light a.on:hover,.theme-nano-light a.selected:hover,.theme-nano-light button.on:hover,.theme-nano-light button.selected:hover,.theme-nano-light input[type=button].on:hover,.theme-nano-light input[type=button].selected:hover,.theme-nano-light input[type=reset].on:hover,.theme-nano-light input[type=reset].selected:hover,.theme-nano-light input[type=submit].on:hover,.theme-nano-light input[type=submit].selected:hover,.theme-nano .button.on:hover,.theme-nano .button.selected:hover,.theme-nano a.on:hover,.theme-nano a.selected:hover,.theme-nano button.on:hover,.theme-nano button.selected:hover,.theme-nano input[type=button].on:hover,.theme-nano input[type=button].selected:hover,.theme-nano input[type=reset].on:hover,.theme-nano input[type=reset].selected:hover,.theme-nano input[type=submit].on:hover,.theme-nano input[type=submit].selected:hover{background:#5fc96d}.theme-nano-light .button.inactive,.theme-nano-light .button.off,.theme-nano-light .button[disabled],.theme-nano-light a.inactive,.theme-nano-light a.off,.theme-nano-light a[disabled],.theme-nano-light button.inactive,.theme-nano-light button.off,.theme-nano-light button[disabled],.theme-nano-light input[type=button].inactive,.theme-nano-light input[type=button].off,.theme-nano-light input[type=button][disabled],.theme-nano-light input[type=reset].inactive,.theme-nano-light input[type=reset].off,.theme-nano-light input[type=reset][disabled],.theme-nano-light input[type=submit].inactive,.theme-nano-light input[type=submit].off,.theme-nano-light input[type=submit][disabled],.theme-nano .button.inactive,.theme-nano .button.off,.theme-nano .button[disabled],.theme-nano a.inactive,.theme-nano a.off,.theme-nano a[disabled],.theme-nano button.inactive,.theme-nano button.off,.theme-nano button[disabled],.theme-nano input[type=button].inactive,.theme-nano input[type=button].off,.theme-nano input[type=button][disabled],.theme-nano input[type=reset].inactive,.theme-nano input[type=reset].off,.theme-nano input[type=reset][disabled],.theme-nano input[type=submit].inactive,.theme-nano input[type=submit].off,.theme-nano input[type=submit][disabled]{background:#999;border-color:#666}.theme-nano-light .button.danger,.theme-nano-light .button.red,.theme-nano-light a.danger,.theme-nano-light a.red,.theme-nano-light button.danger,.theme-nano-light button.red,.theme-nano-light input[type=button].danger,.theme-nano-light input[type=button].red,.theme-nano-light input[type=reset].danger,.theme-nano-light input[type=reset].red,.theme-nano-light input[type=submit].danger,.theme-nano-light input[type=submit].red,.theme-nano .button.danger,.theme-nano .button.red,.theme-nano a.danger,.theme-nano a.red,.theme-nano button.danger,.theme-nano button.red,.theme-nano input[type=button].danger,.theme-nano input[type=button].red,.theme-nano input[type=reset].danger,.theme-nano input[type=reset].red,.theme-nano input[type=submit].danger,.theme-nano input[type=submit].red{background:red;border-color:#a00}.theme-nano-light .button.danger:hover,.theme-nano-light .button.red:hover,.theme-nano-light a.danger:hover,.theme-nano-light a.red:hover,.theme-nano-light button.danger:hover,.theme-nano-light button.red:hover,.theme-nano-light input[type=button].danger:hover,.theme-nano-light input[type=button].red:hover,.theme-nano-light input[type=reset].danger:hover,.theme-nano-light input[type=reset].red:hover,.theme-nano-light input[type=submit].danger:hover,.theme-nano-light input[type=submit].red:hover,.theme-nano .button.danger:hover,.theme-nano .button.red:hover,.theme-nano a.danger:hover,.theme-nano a.red:hover,.theme-nano button.danger:hover,.theme-nano button.red:hover,.theme-nano input[type=button].danger:hover,.theme-nano input[type=button].red:hover,.theme-nano input[type=reset].danger:hover,.theme-nano input[type=reset].red:hover,.theme-nano input[type=submit].danger:hover,.theme-nano input[type=submit].red:hover{background-color:#f66}.theme-nano-light .button.yellow,.theme-nano-light a.yellow,.theme-nano-light button.yellow,.theme-nano-light input[type=button].yellow,.theme-nano-light input[type=reset].yellow,.theme-nano-light input[type=submit].yellow,.theme-nano .button.yellow,.theme-nano a.yellow,.theme-nano button.yellow,.theme-nano input[type=button].yellow,.theme-nano input[type=reset].yellow,.theme-nano input[type=submit].yellow{color:#000;background:#cacc00}.theme-nano-light .button.yellow:hover,.theme-nano-light a.yellow:hover,.theme-nano-light button.yellow:hover,.theme-nano-light input[type=button].yellow:hover,.theme-nano-light input[type=reset].yellow:hover,.theme-nano-light input[type=submit].yellow:hover,.theme-nano .button.yellow:hover,.theme-nano a.yellow:hover,.theme-nano button.yellow:hover,.theme-nano input[type=button].yellow:hover,.theme-nano input[type=reset].yellow:hover,.theme-nano input[type=submit].yellow:hover{background:#fcff5f}.theme-nano-light ul,.theme-nano ul{padding:4px 0 0 10px;margin:0;list-style-type:none}.theme-nano-light li,.theme-nano li{padding:0 0 2px 0}.theme-nano-light img,.theme-nano img{border-style:none}.theme-nano-light h1,.theme-nano-light h2,.theme-nano-light h3,.theme-nano-light h4,.theme-nano-light h5,.theme-nano-light h6,.theme-nano h1,.theme-nano h2,.theme-nano h3,.theme-nano h4,.theme-nano h5,.theme-nano h6{margin:0;padding:12px 0 6px 0;clear:both}.theme-nano-light h1,.theme-nano h1{font-size:18px}.theme-nano-light h2,.theme-nano h2{font-size:16px}.theme-nano-light h3,.theme-nano h3{font-size:14px}.theme-nano-light h4,.theme-nano h4{font-size:12px}.theme-nano-light .good,.theme-nano .good{color:#4f7529;font-weight:700}.theme-nano-light .average,.theme-nano .average{color:#cd6500;font-weight:700}.theme-nano-light .bad,.theme-nano .bad{color:#e00;font-weight:700}.theme-nano-light .dark,.theme-nano-light .idle,.theme-nano .dark,.theme-nano .idle{color:#272727;font-weight:700}.theme-nano-light .highlight,.theme-nano .highlight{color:#8ba5c4}.theme-nano-light .itemLabel,.theme-nano .itemLabel{color:#e9c183}.theme-nano-light .notice,.theme-nano .notice{background:url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD//gATQ3JlYXRlZCB3aXRoIEdJTVD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAG4AmwDAREAAhEBAxEB/8QAGQABAQEBAQEAAAAAAAAAAAAAAwQCAQAF/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAEEBf/aAAwDAQACEAMQAAAB+zztegCkMyVkx4YmGNADGQxwDgwJsYkKDpMOZMDgmygkFNExUYCKATwpMbEAKDhOVghlABs0EObJSkMMpJzQpOIdJxjwJQTjmTJUTHikjHNk4xwwKEcHANmycU6CUBBlAJscjKDRKVhhjGDghOKaBGOAjGDJQTHRicpPEpYGCWEx4YE2dJykwYGJSoIwVAHikjHOkxWGYKQDI4Bo2AIeCKQgyknOlBKOaJikIwVkxsYmNCE4xwEoCOFJKdFJxzROVhBFRKbHJhzwAp4EcwaOBFIB0YmGNExQZDKgDxsAU2TiHAxjJgoBOik4xomKgjA4R0clEOglBkEUwZGCOjE4ponKQzBSTGhQBjZKOZCKQQzZ4UA6OTDGiYqDMFQJwYmNiE45wnKQjAwQhsmGNkxUGEVkxooJzZoAY4CUgmRQTogQp4nKjAZUTHRyUoNk44RgoAPFBIUBHhiUU2TlJwAoMHBiYQQmKDwAhwwMAaFBGPExSYDKQjI4Ro0TlJgErBMCBnTYAx0EpCBLCc8OAbNhCmQikA8UEw4J0UmFNE45wIcI8MTiCkpScAKgTI4B0YAQ0TFBkEoCODkwxsmKDwBUCZKCYQ2TjHQxDIRSAeGJxDZMUmQikIyUkx06dEJxDZMUmASoA4UkxsQmKThOUmAygA0OTmzoBQZCKADhQSiikpQcBKgDJQCeGJhzQAxgMpJzQpMIITFBwEoCOFJIIKGKTCnScoOAFIB4YAQUmGPE5SZMmwjpQTDngCgIMoCMlBKIbAKDwBSAYKQjR0EU2AUBmCgmOjkwhsmHOBFQRgoJjQoRSTDHSMrMBFAJwcnNCBjmACkM6IAdFJxzQBQEAWE5woJRBCcU6YKScyUAiHScY8CVBmCgmOFBMIbJxzgIxk6OSGxQRgRTZOKeBGCPDgGzROMdAKDJkpJjopMMaBHOAjBmRQTYhOOYDHDMjhGxSYQ6AUmAykEyMTmzQI5wIoAODAmhAig6CIEIZCKic4UEwopKIdAKgThQCdGJjZoAc6GKCdHJBjROUnABgzJSTGxyYY8CIZMFBkwKAIbJioIMqBMCgCmycoPADBDmDAwZkoJRBCcY4EUhhFJOaGBEMhjhmRwDooIholKjIQ4JwpJjoxKUHQxDBkYI6IAIbAHMAlQJwYnEFJRjpOVAwhgwUBHByY2NUkUHgCgMyUE5oYlKDROMeCECOjAGxalhzwBUEGOEdFJhzpOVGAxjBw6GbNgDnKApgqxFRMaNhCngCkydMglAZkoANCkVUx4wOCZKCc0KTjHQSkMMUI4MCaFJygwTlIZoUmEEJhzwBSZDKATwhOIaAHPAldSHoYIY6TFBkIoCDGCKSc4KAMKSFJgEcyZKCY2KTDHQhzBgpJjwxMIdBKDpMVAHBgjQpKUnACgwcGBOjEwh0nGMGSoIMpJTYgIx4ApCMFJKOEeGAENAFBgEpCMlRMbFJhTQQpkIqJjwoAp0EoMBlAJkcnEGJSg8TlBkyKEcKCQU8CUGDBSAcHJhToI50nKwQykEUE8MAdEJxzpOUGQhQzQ5GUGicoMhFAB4cnENgCHgSoIMpAPGwhjpMVhmBwjgxMIITlBkIYIyVEx0cmNnQykIMqJzx48UExs6CMcDHDMDgGxiYc0SlYQRQCeKCQc0TDHAxgzgpgyMTjnScrCDKic4MTDCEhWGEMGcFBEOhiHgigMwVkhsoJSgnNmicQ4GMeMChCCkhSeAHMBFAJ4pJBRCYcyCKGcGDNmgRzxOVhBlAB4YAQQmKDIJQEYFANigDmQyoA4UE50YmKiYQ2TDmQhjB4pJzQxIOaJhwzBSCeGANiEpSZAKQDwoIoxMMdJSsEwOAdHJhjoI5kIoBMjk5o2CUngSgMIqJTYhMKGObJCgyCUBnCklEEJig6SFYYRSAeGAENAFQYJQCcGBEGIyk4AVghFRMdGANmghzAZWSnRScQ2AOdJyoA4VEhockGNmDZMUHAhwjg4BoYlHNExUGCOEdFJhBCcoOAFQJwcnNiE450nKgjBSTnBQBTpOUGQykA4UkwhsnHOAlQQZWSmxiQQ0TlABSYAKwTgwJ0ckHOk5UGEOGeHJRjRIOeDKSc4Uk5s2AOdJioIMqJzwoA50nKDABQGdGJBjYA5wEpCMFJMaGJhDQJSSFJkApDMlBMaHJhDQI5gwUk5koAFNko5kIpBMFJObGJBzROOcCKQDoxKIIAUGQSgA8UExoYmKDhOVBmBwToxMOeJxzpw4EMEeKATggIx4EcyYKScwbDHNkw5kEoDMjE4opOaNBFAZgoBOjkp08ZKTAQ4JwcnNmgSg8CIZMlBOaFAGNExsycFAHMnBgzp0AY0TjHDJSTHBQTZsAqMAFIJgcI2IEbMhFQRgUwdHJBDwYpwMqAMjk50UEY6GICeKSY6IGMeJhwjwoIwZkcIU0TDGiYoMGRwDgoBs0CVGASkE4KCaFCHMgFBgIcI0KTCHgRjIZYTnhic2bAGOmCgAwUk54UEU6AKZDGMGjJkpJzY5IOeJysMIcI8KTCGwRzIBUEYFCNiADnScqBMFROeGJxTxOOcDKQDJUSnRQBzIZUEYKSUQUmFOgjhBjhmTYYwQopIUHSYpMGBwjohMKbAHMhDgniglOigFJwnKwgionNCBiGQSgwGUgHBgBBCUQ6EWABlZMdGJxToYwQZUAeHJSomNDE4xonKQgysmNDk502AOYCKATw5MbGJhjoBWCYKSY0OSlB4EQ4GOAeGJxBSUc8CUhGSolNikpQdJyoIyIGcGJxgzopMOeAKQzA4JsYmEPAlBkEcA6IEdGBEOgFQJgqJjQgI50nGMhlJOeEANCAinQigIwVExoYkKDwRUGEKGcKCU2GIITDHQCsIMqJzxSTCGiccyEVAGCgnNGgSg4AUhGSomOlBKMbJygMMoAOjkxo2TingykEwUk5sYlHNExUZCKSY6MSjiE4oAx4nKDARSEcFCENExUZAKyc8ICbNk454EpCDKADowBs6YGMglZOeKCUQ8EMcBKQzJQTHiglGNADGTgwB0oJBjZKVACHScpDDKATwpOMaJykyCVAHCkmNCkxQcCGMBFIB4YnFOk5UYCKQTw5MIKSjnASkI4MTmhScY8AUGAyonPDkwxonGDFPAjmAyolOjE4ghOUGAikA4UAGhCcoPBDBGRwDQxIMaJyg4CUgHigkFNgingSoI4KCdFJhzxOUGAioA8OTCmyUpPHTwI4IZSCeGJhTROUnAhwTg4Ro6AMaAKgjI5KaGJxTRMUGQikM4MTGxAhTARQYODgGjZKOdAKDARSAeKCcQ0TDnQxwCkEErJjoxMKbJxThkqJzBSCIdAGPAFYRkoJThSSCmyYpMhChmigkNjAFAYRSCYKgDYhGMaJxzIZQCcECGNko50IpJCg4EMEdNk4xsAcyAUAnhwBRSUY4CUBmCgM4IAKcBKDIZQAcGJxTQJSeAGCMlABoUAU8COEZKATopMIdBHMmCsI8cPGwTxSRjGicpPE4wZwpJBRSYc6AIZMDmTxsAQ2SlQYZUCZEBEEJSk4CUhhihHRTBo8CUGASslNjkxs8EUmASoEwKYFCOigDHSQrMBFIB4cmNiExQeDGCOFAB4QAU0AVBAFhOeHJhBSUY8AVBHRATQoBs6COZDKiU6OSjnScc8AUBGSsmFANDACGyUpMglQJwUE2ITDnScpMhjhHDYApoIYwEUgHignNGwhTwBSGYKATooBs4GMZMjk50YmFEAFMGSgEyUADgnBQTRsEpMExSEaGJzZsnKDgBSYMlBObNACHQRDoZUSHhgBzROOZBKQjBUAaFJxjII5gMYM6UkA54IqMAlIB4cmOnjoxKKeCKTgJSTnBgRDZOUHicqCMjk4gpIMeAGMGSkMwUEohoEoMglYBkoANCE5QcJygIwMEaGANmyYY4YKQDhSTGigmpSYc0AUBhlJOeKCY6OTlBkEoCOik5oYlGPAFJgwUkx0YmFNk4poAsJzJQAbNk4x0mKQzBQCeHJRzpMVBglIZwpJTYhOUE4x0AUyGUBHBgDRsIU6TlYJwcE8MSDnQSgwEMEcKCc0IAKeDHCMlRMbEBNnQCgwYKADxsI2ITinQRwjxQSiiE4oIxonHMBjBHCgA0KTFJwEqBDKyY4KAMaJioMMYI4KAKaDNHQykIwVEpoclNmycqMBFRMeEBNmgCkM4KGcKCc2MRlJoM0AOYCFCPDBmzQBSZJi0EwOTmhicU2TFIYZQCZEAENhFAZgqJzJWSmxCUc8GMZCKQDopOaOgDnQygA6UkQwpKOeJSwmKTAJSAeFAGEJxzgBWTmRgDQ5MKaBGMhFIJkclFNAFZkIcIyUkghsmKDwBSYMDgHRiYQ0AMZDLCc6MTCCEhSZBKCYrDBKic4UE4pslKTgBYCEVEx0UnFPBFAYZYTHhiYQ2AUHACsnPFJKaGJRToQpgyUAHSgkGOk5QZDKAjJSSiikhQeJikMQwEUgHRicQQmKDgJSEYKiU6bCGOADmQykA8OTDGicc8CUgmSklEGJTZ0MoBMDgnRyYU2TlBkIoBPFBKIKSlJwnGMhmzJSTHignENk454AoDMFJOdEBGPAFIYJQCaHIxzQBQZBKQjBSTGxSYY4GUgmSgmODAjHSUrDMFAJwoJjYpKUHgBzBkqIikIyMCbFJRjoI5gyOAaGJTRsMpDCHBOFBOaNgFB4mKQzgoRoQnHPE4pw8UE5wYnEEJhzIZSCYKADZsEU8CVBAjHBATgwAgxMbPBlAZgcI2KSGzxgoMBlJOcHJzZoEoPAiGDw5OaFAHPE4hk8UE5oUmFOgDGTBSGYNhmxCcY6EUghmjJ46ZFDENhCmASkMMUwbFJBTwQxkMsJjg5OaNhDnDAoJwpJTZowKeJxwzgoJooJRDQAh0wOGdNkwgxKMcMlAIY4BoQ//EACAQAAMBAQEBAQEAAwEAAAAAAAABAhExIRASQQMiMiD/2gAIAQEAAQUClFPDrzE2JaLxXWkzo8Q3pMlPD+ysKYlolipiW/H6RJVYP1xOF1nySmStODekzo3ib1zJTw61OFMQlhTEtH4myZH8icLoS1pYXQl8p6TI/B+kSVWHXM4VRK0zCmJacTYpKeHRLCn8rz4vCqJWnC60idH4U9Ikujolg+ZpwqiZ04NkyN/k6KRvDNanCmJHiKr9ESN4NtuJKrDrhYXQvflCnThT0iRv4pKozRSUyZ0zBslH6xdczhVYvW5WK6JWnE6JXxikbw60sKYvT8nXM4mJa+KnpE6NpJ+kSU8OkzhTJ9OKnph4inrmRvB+iRTOufC6JX6MWP0iRvCmRJdYdczitkrTMVMlaPwfpKG8OkrCqP6lg2JaeJVWkSViGROFUdczhdezOnFT0idK8W65RTOkrCqM0Xh+yVg2SvV4nWkTo3g3rlF1h1rwbEtEsLekr4yZG/ydFODr5JTEtOKnpMj8Tekzg6w65WF0SjhTJnTib0S8b8JkqsM0zB0YfynpKH4P0mSqw60vyVRK0/lVpKNH6TJTw/vCmJaJeVWmDYvThVaROm4N64kqsPW5nCmL0XhVErR+LSZKeHXM4U8EZg2Jb80SODeuZKrDolhdCWiWJslab43pKLefJWFVglolhbJWjzGxIfhokN4etysV0StPEVWkzpXibJRTw6SsKfvRLCq0md+StfCnpM6Pwp64RVYdJWFUL0Xg6EtOFPSJKeHSZwqsF6JDYlp/G9Jk4P1xJTw64WKqF6+FUL003SZG8OkzhVYJfppfkutEtODekyUP0mRvDoliqhLTiqtJRpTJQ6OkrCqwS15iqiZ04O3vE3okcG9cyN4daWFUL0SKekrThVa5kbxbrmcHWC9EsKfqWnCnpMj8OiQ3h0SwpiWnCmJHBvSZG8PWSsKrBf7PiuiZ04myZH4dJnCn8SLoS04qekrTg3pKG8QlhVCTYvC7JnTcKeihlPRI4N6TI3h1qcLoXolip6TOnFT0iRvDpKwuhetLCqEtOKq0mdNwfokN4dJWFslaeIqtEtPEm9Jkbw9blYVWCWuckutJW/KekyN4N65nCqw6JYVQlp4UyZ0eIb0mSnh0mcKoS04qrSZ01JOtJXyUPwfpMlVh0lYVQlrSwqtJWnCnpKG8OkrC6w65WDYl8b0lG/lbrSKeHWlhdE+i8LrSZ04m9Jkbw65WF0dcrC6EtPMb0SNw65RVYT6JFMU6cKrSVpuFPSZwp4danB0L0XhVaJacVPSUNnR+G6TJVYvW5nCmJaLxVRK04N6Sj9HSZwt4dEsKZK04Nkzo/E3pMlPDolhdEzrSxUxI3E3pMjeHRLB0ZoliqiVpwbJkfg/SZwrw61OFMS04XWkTo/E3pKKeHWlhVGaLwdCnW/E3pEjOv8joQ6w6JYVQlpmFUKdOKnrmSvPiWFVh0SwdErTip6JDeG65WFVh0nwqhLRYU9JnTg3pMjeHWpKZ0SwqtJWnB1pElPDrlYVWC9JWFUL0RVaKfjeikbw6QsKrBLRLxsS04U9JkbwbInDSV9SKZglhTInR+DekyPw60sG/EtaWFMlacKrSZ0fgxIb86JYMwXg3olrfip6RJTw65WFM6ZhTJnTg3pMjeDekSU/i8KZK0XgxIfiIkt4dczhVCWiWKmJacK9Jkp4dJWFVnx+HouUxeiWFUTOjxFPSJKeG6TJTMJWKqEtOK60iRvDrw3DrU4MSfxsS04m9Igp4dczhVC9EsKeiRxVWkyN4N64nB1gvTMGxLTMT9JQ2Nikb/J0mcLoS0XiqhLTg/SUN4P0mcKrBetJH9HR0Xg2KdNwqv0TI6/K1smcKrDNF4v0Ja+KnpMj8G9c+FM6JYNi+OhLTg/SZHWLrmcLoXolhVaJD8TekyPwfrlYU8F1FMS04UxD8N0lDeHSVhViWuVhd6StODekobH6TOFPBekrD9YJYNiWmFMlHmN/oiC3+T1tLB1hPphTJWnE60mRvBvXMj8OinB0Zpwpkr5RKG8H6ROF1hKbOFUStP5TJkp4bpM4U8OtTipiWmYm9FJwr0mR+H9nwqsPzokkrrSVpuDetIrw6SsKrBeiWFUIuvnFVaJb80mTcT9cT+Sq+LwqhL9HCq0iRvBkyN4dEiqJWnE3pK0fg3pKGdJWFVglrX+qpiRwdaTOjeJvXM4UzrU4NiOFVpKG8W6Siqw/qWDYlolhdEzo3ib0lG4t0mcKoXrSwpkrTBLTMKolaPwZElPDdEsKrDrzCmL04qekTo3g3pMlVh0SxVQlovFdaTOnBvSZH8mcKrDr4VRK04N+yvaeD9czhVYdaWDoS04VWkzo3g3rmRvDolgxLXmJ0StODrSJH58hFUJa0vyVQlpw/QvCnpM6fxvRIdeP0hYVWGElUL0zBvSUN4m9cThVH9SwdCWtLCq0mdOJvSZG8PWJYVR1rxXWiR/KrRI4P0lFVh62l+SmStOFPSZ0fib0mSni6SsKYvReFVpK04U/0ShvBvRSN58lYXZM6eIb0SZdaROm4nWiRufEOsF6Zhpmvib0mTg/XE4XWHXKxU/iKolacVPSZKrDpmDfxeFUStGb5KH4dJkbwzXM/kuiVpxUxG4m9JnCnh1ysKoXrKYjidaTIx+kop4dEsKZM6cVVpE/JWm4qekz8YlhTF6JFMlb8b0mdG/yt1zJVYdJWF2JaeIb0S0fib0mSqOinE2dZTJWiKeko3DrmcLrBeiWFUJaLxVWkzo8R0he28OkrCqEtOFMS04N6JG4P1pDeCWkrC7IWnE60SG8HTZxU/ZkbwfZRTwS0SwpkrTib0mRvFXriMLr8peiWFUJa8wt6QtHxvSZG8PW5nCmL1peUxTpwbIkbw6SsKrDNcz+S7JWnFT0mdOFekop4dczhdCWmYUyVo/E/RSN4iZwqjBJIutJjTiutak3DdFHjekSU8N1qcKrBLXmFMS04rrSZG8XSJwusOuV+S6EtOJ1okbhukop4dczhdYT6ZhVEzpwb1qR1i/6couhLSVhdErTiqtJnRvDdJQ6xdEsKolaZiuiV+h+FPSJH4dJWF3hPolhVEzpxXWkSN4N6TODZMjeHSJwqhLRLC2JafxsiRvB+uFhdYdcrC6M35T0lDY3pKG8OtThVCWtLFVaJacG9aRXhukzhVYdJWF0StOFVpKNGSsKefJWFUL0SwqtJnTib0UjeLpKKeHWlhdErTiqtczo3ib0Swb+N4ukzhdYJa8xOiVvyqJkbxP0icKrDrS/JVErReFMidH4N6TJT/J1ysKoS9zFVEToxvSZH4N6TOFVh1pYrola/EVWkyfxkSVWHSZLrBLReFPSJ0fg3pEjY/RIbw60sLola+FVpEjeJttqcGdahfJRTEta8LolacKekI3FuuVg3h1ysKolaLxVWkmj9Jkp4dJnC38RTJnTcKekyN4NtkrCqw6SsKYkcVPSVo3ib0kdHXM4XQlolhT0lesp6TI6w65WFVh1rwuhL5T0mRvBvSUW8P6vD9CnB1h0Xg2StOFPRI/j9Jkp58lYUxTrxJVW/+IRVYdanCmJa8wqhenE2Sh+DeiQ3h0SwpiW/G9InR+DeiQ/krCqJWmYU9JnTg3okU/kobw6IbEtODekofg/SJwp4dEP5Tz5I2StODrRIfyEU8Oi8GxLTiqtJQ/iHWHXM4VXzMKYkcTeko3DokUzpKKoXpwbJnRvBvXKKfxFUSteYVWkrThT0SG8OiQ6OmYUxLTiqtEjfkThVYdaWDYvi9ENiR/GyUV4P0mSnh1qcGL18KeiWnBsSG8OuZwusEteYVQlp/G9EjTdJRTw65WFUKdOIlG4P0lDeHRLBsS/TSSKrSZ0fg3okN4da8GxemYmxLTxFPSZH8lFPPmYUxenF+hLCqJWj8TekyN/kb0mS6w6JfkpiQvFXpKHiTekyPz5CwqjNFiV1olpwp6RJTw6TOF1h63KwuiZ04U9EjgyZKeHRTg2YLxU9JR4inrSNw6SimJaJYXZK04qekSNj9JQ38UlsS0zBvTCqEtNKrSJG8G9cThVYdcr8lUJacH6TOj8GRJT+SsKrBISSKZM6eJU9EjcOuJwqsM1yvyromdOKq0mRsZMlHSVhTF6cKYlp4N65kppHRLB1gloliuiZ04qrSZHWHWpwbP7mFMS04m9JXyZ18TeuZG8G9InC6wzSV+SqFIsSp65Q3i3RIdYdcrCmdP5T9S03ynpElPF0icKeHSVhdCnTib0iRtJP0lFV8SwdCWi8VUJHDSUOsT1kThbM0SwqiZ18VP8ATmCng9ZE4XQuysKozTg60S0fidP43pKG8W64nCqw60sLolacG9InR4h+krDT+zOF1gvTBsSEU9EjTpKKrDoliqiVpwqtJQ2MmSnh15ibJWiSRVaStH4N6JG4Ps+DZ0SKolaPxU9IkbxbrSwbOtLCmJa2UyZ08Sb0UjeuR+D9czhVYL1ysVUTOixFPSUaNkot4ukrCqJWiWFMSP42JG4aSinhjblYVRK04qrSZG8TIWDZ/ZWF0JacLrSFo/FT0lFP4lhTwQkVRM6fyq0iRvB+uZwtnXKwpi9F4qrWlpwb0mfkSMfpKKeHXKwqhe/KZK03DdJQ3h1wsLoS0SxVWkrTg2TJXiJnBs/srCqFOi8VPSUMbJQ6z5KKoS0SxXRM6PxU9cybh0mSmJaJYNiWnFT0mRvE3rlDZ0SxOhenFVaSh+JvSJKeD9H4dEinh1ysKoS04qekycG9Ikp4dczhVYJa8xVRM6cVPXMlPDpM4U8+JFUJacVPSZH4P0mRvDrmcKoU68xVWkTo/E3pMlPDpKwpiWtLCmJHCnpMjeD9Jkbw60sKolaZip6ROj8KekSVWHWpR1pDeHRLCqJWnFVaStNwb0hFVi65nCmJaLxXekrfj9EhvB+koqsEJFUJacVPSJG8G9JkqsOkrCqEtMxUyZ038jeuUN4dJWFUL1pYVQl8qtFI3ifpMlVh1ysKoXovCq0mdH4m9cSVWHRLDUhLE2dEsV0StOFVpM6cG9cyU8OkrCqEtOF1olpwb0SGdEsKrBevhTFOnFVaSjg3pMjeLrlYVQvReFPSZ04U9Jkbw6JDYvXPhdELflPSZKeG65nBvDoliuhLTMVVpK04N65kbw6JYN/KfxLC6FOi8VPSUcKekyN4dEsGxei8V1olpwb0lFPPkzhTw9bSwpkrTit6TI8SfpKG8OtLCmJacGyfTxKnpKH4daWFM6JYqekrTxKnpMj8K9cThbw60sKolaynopODZKKrDrlDYvXh0XhVCXvCnpM6Mb0UlPDrU4WL0zyq0mdODekSN4dakbEvV4VRK04U9JWm4N+zJTw9YlhVCWmYUJacG9Jkbw6ROF0L0zCnpKODrSUaP0SGzpmFMlaLwp6TJxMlDf5OkzhVCWiWDsSwdGacG9EjhTIkt4daWFUJe8TZM6eJU9cyN4brmcKfxDZK0/m6KTgyUU8OuVhdErReFPSVo/B+kSU8OkzhTwXolhTM+U9JRuHRLCn8hFsS/T4qrSZ03FT0lDeD9JnC2L0Swqj0p+4fymStODekSXWHXM4VRPrzCmJaLxU9cyN4P1xOFUL0zBsXrOiQ/kobxdczhdCWmYqZC0fg3rSG8XXM4VWCTblYOiUMbJQ+dJWFPPiRVCWnFdaROj8VPXMlPDpKwtiWiWF1pM6I78bEjcG9JRTw9Ypwu8EtEsKeik4tJkbwfpKwqjoimSt+NiH4bpKHWHSVhdYJfoSwqtJnTif+zUlM6SsKYlrXhVaSt+U9JQ/BsSKeC9J8KoS35VEzp/ym/wBESU8PRLCmZovCmStOH6Zwb0mR+DZKw/XnXE4f5KJnXmDZHymRI3i65WFUda8TYlpxN65nRj9JnBvDovCqEtJxK60idH4N6SUx9U4VWCWiWFUStOJvSUU8XRTg2dEsHR0XhVaKdG0lT0iPG8OtFMXrzCqJWnBvRJlVokN+P0lDZ0SwqsEta8VMSH4NkwN4etyinh1pYNkrT+VWkobxN65RTOiWFMS0XhVEzo/E3pKNw9JnCqwWtpYqZK1/xsSH4m9JnC6wRPhTEtODekycKekSU8OtIbEtMwqtJWnE3pE/JnR+DekyN58lYrYtozyq0mdHxvRDrF0icLrBeiWKqEfxvSVo3ib1zJTw60sGzNOKmStH4N64krz5PhVGa0sV0Sv0cW65RTw3XKKrDrU4qZK0/jZM634NkyU8OuZwp58nwqtJnW/E61zJTw6bg3+nMjeHRIdGaLwqhIQ60lD8OkrC6wS1pflVQlpwbJkfifrmcHWC9FOFMSOFPRTp/G9aRvm60hvDpJdET+j/AJG9Jkbwb0mSngvWlhVErThT0SOD9JQ3h1rwp4L0SGxLT+VWkQU8Oikp6RJTw6JYNnRFUSPhnrefJnCnhmuVhdEzpxU9Ejib0mcHWL1tThdCWn8bEcG9JRfnyUUxLRTiqtJnTxKnpElPBvWkN4vW0vyXRM6+FVpKGNiG8OuUU/eklPSZ04N6RI3g/SJwbWxJTw65WDfuacKZK04U9Jkrw65kusEtaWKqJWnFVaTOjeHRIqsX9lYUxLTibEtODekybh0mcG8EtanFdETo/FT0lDeGtuZKeC9JWF0StOKmSh+JvRSN58SxaJaZibJnTxFV+iJKeHWkVWfKrDrU4UzNa8KetI4V6RJT/J0SwqhLRLFdELThT0mRj9IkbOiWFUTOvMG9JnTi3SUN4dczhdYJacKrSZ04qr9Ez43g/XM4N4dEsVMzThT0idH4N6TJTxdEhsla0sVVpK03CnpEFPD1v84VWCWiSR0hYXRKbeYqZM6PwfpKG8OuVhVYJaJflXRM6+FVpMjeHX+RvDolhTEtfFdaROleDJkp4daWFUJa0sKrSZ04U9Igp4NtuZwpi9EsHQlpwp6QtG8KeuJKZ1ysKZK18LrSJ04m9IkbwesicKrBaxLE69lYVQlovCq0lb8p65Q3i6TOFVgvXKwuiVp4lVaJGj9JnCnh0mSqF6cKrSZ01JN65Q3h1pFsXoliqiZ04qrSZKf5G9JRp1pYVQlolhVaQtG8G9JkqsF6JYU8EiSmTOniKrSZHWLdcrC6w6cTfymJaLErrSJ0fg3rmSnhukyVWC9F4VRM6cKekycG9InC3h1ysLoS18KekyN+N6/8clPDpKwqsOiWF0StP5T0iRvB+kzg6w6SsLolacVPSZ04dczhVYdJnFTEtOKqJWnCnpMjeHSZwqjNMxOhLWhLReKmTOm4V6Sh+D9crCqxL0SwdCWi8TrSZH4m9F4fo61OF0JaLwp6JH8r0mT9HSUUzNF4rolacGxIbxN6TOFPDovB0TOnCq0lHBvSUNnRL8joSEi2JG4U9akfg/RLCqPWJYXQlpuH6ZxVRJw6TI/PmDYvRLCmJacKekzpTwb0zPs+F0SveFMlD8G9JRTz5KKefWxLTib0lGm+zOF1h04MSOKq0hD8G9IRTw6JFMSEsKYl8bFJTw65WDYvSViuhLfnTGU9FIvBvSUPw9ZmFPBeuVhdErTgyUOsG9JRT+IqiVpxVWiRwfopG8QkNiW/KZK04qrSUb8lYVWHRLCmL46InRvE3pCG8OtLCmL42JfG9Jkb/Kb1pYb8XiqhLTg2L5//xAAUEQEAAAAAAAAAAAAAAAAAAADA/9oACAEDAQE/AQYX/8QAFBEBAAAAAAAAAAAAAAAAAAAAwP/aAAgBAgEBPwEGF//EAB4QAAICAwEBAQEAAAAAAAAAACAhEBEBMGEAQDFB/9oACAEBAAY/AvdlHedbDs1g3uvylAw7NY+CsSvzzm87+ygcsEd5CprAMOzWDvTWAvM3nWzrAObz7sd8g5L13k6wd52suggZ1g7yFYhaa3IH+SwU0Tm86OTeTRsEDlgjZ1ieBeY6K0vf073WdYBnWNalaWClA577u5SgYKVrRsKlDyHDCsG5vPlK0dlSgvM9BA5sKwbCsQvVpfxUDOsBf8l7+zWDYKUT1Le5sKxuR9BA5YVsYI2FSjsKwb13kFKnnuGjcv8AYet7+6ryCNmtalH3azQM6O867zL/AHejYLZYI38VY/ZQXndeTR9JHedXPM6wbnvl+nc9BByWFYmsa1CO57Kjhd12ChDeflo+7XrvM2C1dCsa6xPAvOtnQr3C76jc3nXeSXqxrR3kFurAr3Nzm8/vulz15/JZo++U1g2C3IHsoXF/0Kwd7r92anh931jTeTR3n3ZRveprAOWCOzrE8B5i8z3WwR3me+R3k6xv5LBSgvPnFlUoLDs1jWpWjso2ClBeTrAP4LnvuzWJXn+Szr3D7C8p4F5CsBybydYjkXn4GHTcv3ZrWpRsKxKC8nWPrrHl9CnnuHWJW9zefu7vrBs0DNBeysaO7lurG6geu/gcsEbOgYd8oRv4qwF5/DQoLm/d1MFKCzrAOWdfwLydYC8/G/33ZrHxMVFYBzeQWro8jnnL9340bBG9XAZrQpQM6xpZo7yaCzrE88zRs0Dl63DNbV6gcvyla0D/ADUvie5xeQqaBnWjsqELBSgZ1ia/nuTeZf0Oe+7NYBnWA5N5BSgvM9CsHedNYB+cMFrUqeeue62dYCzR3nTWJ4DNAwqUF5OsGwqUDDsqeBfwXnXefiWruuwQWalaXrvMvUxRs0D+JaeTeT4DnuthW5AzW5e5srE1gLDuphWJX5rXuSzoLlmpQMqwd5BStalfnuSwRub1s1peu8ioW9/h0HNSO8gjvMP8lgpWtG9FzeTWujeu8jeTrH4Fh2aO8+7uU1gLl+7NYO8mgvMuLzrYVNYO/wChWNynnmaB7ryN51sKxKBmt1YPoIOS9d5BDWJQXk6wDOsGwrAcJ/oI2aB6UbCprHuSzUrz/NnPc9eZfuzWAcsEd5npVgOSwU1jXWJ4DOsBeTQObyCOwr4F+zWAcv8AQR3k6x+BeTU8C8mvObzPfovJ1ieBedz90ufMvkvJrWpQWHS4DPgXk18CB/Ejetywrci//8QAJRAAAgMAAgMBAQADAQEBAAAAAAERITFBYVFxgRCRobHB0eHx/9oACAEBAAE/IYN0SCT8glDhDn6EXQiRWGl4ML3n8iJ2KX2NXJukSKJAlw+YzcGkSX/BAJWaQJekSEFbEj8ycNJOjhDrMRM/zOYJzbL8jYpfLI6QragQg180fMckkORjQjfYheTIa0MBawTOMEnoUJeEcDCawyDNiC2KWAvYxCdn/oDH/wCiRKwlcIfCcGwY3Y7T3DXkjdkFLSB1XkctipEToJ3RSRwSYDVgdK2xrSyIELNJbdka9GeBM2ERhDnXA5uhwnRJ6JLYhBy1kavSukwmgWkIRgkfQn6ETOiS8CEbZciO9EXsvyNiF7ZZARuQkqGb9HyDcKiBj/iKSLbFJdkChomwQKiWWUMfogk8Ez6LpEJhtzM2PTCEeUxPcagx+hRHwTOsJbeGDNtyRWGoX5mLWXp4dElBBCmq2I7B4bYPBRlCPmOmFzwd3I/8Av2FLdkDsjcLRHREKolVgpvolHhfgWT+M0vJGpY1PsSBElE8/Qa3hDR4ofhhJaUQhjZD5BSwhD7GIJw6GvCElBK6w5QZegwtkJTs12Qr0grkSb/AlqT5iegj5SXwkSWSZoasgXZDh0UvZP8A0DGghRLDjYaHhCR4cg/5hDQ19CNaQKELgESUO1H0HGhrCIpkLDVgShvEaliPdinyMRA/ET6ErB6Qkt4Sv4M2+iawqw79lAiQlLEiingJgo6DgZ4JFeDK4ce4H3CnzP8ABDOgxihA11NHzDameDm6IZMRbktvsgt6Iq0UlfhM4QpCjoiVHBLbwZJZNvJg3p9BaoFJ2VwJ1GCTCwlQOCrBpWR2IfZb8mR9EXYdgShgYXL4TFTUR6IyLBlsf7HDeDJGQr/AITs9pkXsjbSZNoIpCJK4JHgQ8JYmBKSS5nbND0zciS4QlTsgr6GegoS8Ic30TWNxseUV6IEciTby2LXy+SGmvyPcR4CfMPUDgJ1/Dn14FJ2S2a3pk0OYj0JdL+kzoROg5+jnDJCzvSvsj9ixWYmkqBrx/khMYiZC/wDoe0vCHgGtkfkIXZLbywn2I6CTaEISDNg+AiMVDSiA31JEvB0kjLi+dfgmXZArSCkWQiNCalhK6RSXwS/CORiFG25Fl2yNCCSIDhR8Y4XikfIT2G4juRkFvT62X5GIk5ONCgqUTVwLywgl6HJ0cj4JXsbbzyQOzItHUCEhHSOT4BUfH5pLwNEMZsQ29MXIk27Yvu8kSD5CqjJwKbljgSuWcjIF2W3b/FEjQ4EgTVgc94NrqkOUpEdBJrCXSUljrDmETsvsFp2RUEbESoneA/0KToZNwcwS7yNiiyxGhBG/bI4ltA9+iPgldEjl4PC8PI53pHrS27I3ZDX4CSLXWCe3hKWXhMHRP4cs8yQ7VkaNCuASUSJaDm6K6kSEzl4NEbbWbHpDXJDf0UiiA9hJBxsJUslIMYhhjeVlt1pGvSJQ0cwIjI4wbXg09B79Diklie+BtLInyyJzoUnZfcKW9ELyCPAoFtCw+AldQ9+jBm0Nt5dtnfBarQn4Di/CrwJEjo2PBoksaUsjt6LUW/bEpHJDQa9CSBTRgnXg3YwmfkL9x+wIVsQIWjIEIglRgndCpXFDXjgsQQpoGhpg5EpdkAi/yEvoSReifMNjwZNkyS6dC07NeWfaRp6DmElEHUYOe8HB8Ic/RXLPZKpZBJYzuQXrwKXtktuzwLI6WmcKSFhMhYN9CUpL6Odi07G23bNz0wLRL2CEOM65LBwTuhL6DSRjedkcTpA7IfkbPbYhAkuhIRBgWGxgmwcxyBKdjb7DnaQUtEnEiBBJSz81PAk9cHmGlhuw53otYQk5BhaDm6EkkcE6FhCvCixuzQlkfsvsIk8nHoSVCpIJkYJ88EroJPRyvBCvkb0HSWNmsit6eyH2mxaeWRuE7GNBGBEzjBqeGLpD3OUaI2bHpiWiTYjYcC/M1DomN2CMjGNZHbT6BJt2RyMGRCaKJaWE9vBpJwSujke+CH2OWNJwITYEwEzjBKKTKJn0USx4DSI0sPx0ScXJF7OH6JXRCSOBzwsJ04NmIkWRwwlP9F+R/mipomY4Salh6gh6B7dElsZJX+C82MbFixErTfli/cgoSoRRRJSw0PBx6PxmUxUTLN3JiaJNhKE9Br9eSF0IY/RK5eCUG0zNTThaJtvLIe3n9xoirgxcGh4N6eEoskfaOexkW6ROEJNvytosJV4UvR8hJ4BCFyM0PSN5Em8tiFOEfzGSXgmCa2JSUjnlkVvT32b7E+xg0OaEQC6OD5hON4N9Sawksb/ANE7ZD2G/6NNkXsthaKVCFrCeYw5GEU6J/XBdIdew27NI0vSGC/Ij0TuESujNUiR0Osx4DSXSQgk2FJ2NOEm8ESHEw3MIdK/QiX74Lu052kdaEmEmR7ULD5RwvRIJrwQrGMQWyCjnBRxhvoQSsLZhLbwZC227w5GITss4vZBWh2BQceCVeEoO2J7ZB7G/o5wgRySPIhn2LGjhWkmj80tLCXeEHwNe8MWIT8kmIPZFS0TPBX+w48D36FANbokvAsNuZiipejDgQpOxtQkGInzCL4RUxPs/4CI9aXZbZFnWRZojMIkQnRP6K8CGP0ZAlRtxoDiaIxChw/nhRwM0rBnOECsa7Zg2JTsbfdi1vSGi5oEURxLB/qOkvBpTJbIi9jN+zmaR40I4lokskbnyZD+kFISkIsk7hYTLwgt0iQcgVZvA2CJPJGjRJuxEDo0hvUVRSR8xJYdJIyR6Jy0gXZo+4glSWdEQp4JMwnXhKToZnmYvuG33H2CUv/wCNyLQ5owSvoZA0XA6UZguz3/RwtLQIKjxE0ShVQSc0K2uhuYy/wDMI3Y0/Y+sipaMqIBgwS7wlL0Pe8RfLFodt5IljhaI2EJCHNCUnL0jUBjUJEiSYwk3CU6fkuFKd+Bu3bZz9IULRJeRIl2cCG4w/iiYJrwKWWXApW9G4aW3sUnZ/wBgTvRCSCalhLbz/Y4QzZFYWvYjvyyNYz//AAGGCUIRLSwiDSVCR9HIEJZJ5ZoYxLRf0EBDQe/RD0HDwnthtBm1kGBlyscvsItb+Ak1FaOsD9Kj4I1sK7wYa7OdpxNEbYLSvpohgsgK2JKgwLD5Bwl0Nn6OYO9z4Hd+s0Mf2Em2JgcCHsE4+ETOiS2RLHbdsjtjByK3si9m6RIFAToWEi8Hh0PaTlDx7LbyfWRI0MqEUAncInd4J/CPgGQw4NQ0DRyQ1yJOBWyBRxr6K3gqSYOCe+BVhIK1n2Et9iJ2yLNHNBEgmUMJt4I8CRM6OVjI2Gl//BGoWi+4jwieYwl9Ciqwc8Ih6klLBvoUeEeRy/H4HL5ZHnkzLRJ1IiiJ8EoSqaQ/0/EIUa88kVtMHJEuxBUwJEIhVhhWG14NrRKORjx7Gr8sgWMC0SdQlGCd8BPngcehN0FOTIQz7CFL0zrS6LZHomf4KkRIgSJeCEsviLyEbsUsRssfgoEQqOPg38DaTwkO9TlDJBOxSvkipaMhEocbBz9FL0N3mCqqJ0YNQbgMY52QBmEqIENFJkUoRwoSXRR0ZODnF8x9xC5CDNInsIUogbAiAMaOCRLwlMnBjy8IQ+ws8s0kahaJOIRQDoBK+hOPFHwE+jqpGlPJF7I8LRKlopCehIKWDMbOCEwx7IvIJV5IbeWfWQ0EbdHzHYwlS8JXohjdeBCcuyESOypeTAtEm2ISv6f+gOfoojIJnQ0qRgx/s0BpZSHdEVyxwGsVK+Tib+NAuAvQIQfITXgdJ5J2P8QgwtCnyMT2HjYpb6Kr0T0vxg2pXSJXREk09IUnZLbti+xEoFbIJRTGCWVQ5Q4JXLHSZY227GJSx7oTUWxSVvLJ7Po9iEqKRK+hW9GkjHtZUaWL9y4tZ9Zx6FYRGEnoSfQ2ugmdHIx4Y8OyO3piQk2rTF/SiMDX65FHiSHP0TXgZL6H6CJNnM/4Npexm2czSFQtEbEDgrgObocL0Ofo3MXKG8zIkmGHkVuyB3+Ax6IR0WEsJVqhloSrOZ8IB28tipOSpwJYCSSJaWHxFBz9D4l4NJPklyG5pDhCb+WR6ON9/FDoJ8cCRLwdA3oTZiUrROXZHkQUSIGkpVWHyFIOYrl/BQSS7CFXpChaOaDGTf7BvqfJI+UnabwSsv4MJK6kNcuPzPsGb7ke22TITswfhtj+hr9FdRN6ORiQlMzshiCb3oocQf4hIlYjAsNTIKXgYLpEbvg9hsg9kMpaK4EIVP6SOF+BQjmkMb6JbeCk7NyJs9I0aE/nYhI5P+2QBQEuFhMnA6SM2kjUhCVo59hEyzg1yOKggnULBusISYNL8iLCW2RJeilS0U2KTYUTeivEkNqGDeDRBs0k+Aex/wAhC17JdhFlhlFoygSiWkfOJrwIY/RlJsDbYgzogxyyHErbEp2IzQ56Iw4JnRK7wofgb/gPqJfkbFLLGbQjeEQWhjpZyTOiF4V+BkCgbcrIb5IKWjHrWIWOSf8A2D36KgxEyFhseECRs9kDl6RPkl+x9hwrRjwhJUS0sHg3whj9FEhkpbCX7IEaEbEAmcBz7RXQiT0T+AUgkmxpA+DkYlbG2xo5IqOxlBOCVxj8zUeCJSWwhZYzmZqeiUhBT5mQ++fxFIUlCPkJ7eCkp4RIk5XoteyX2H2EVNYyAVV/SZGDnYUnR6wzbGhI2G56KWEEm3YpTj/oa/Qkl6JHRJbw8uB5cmofUa+3+Dj0LOEIUyYNDwbV1Ikzx+RZPTRGTo5IcSI5IHxCjxJHqjdgXcOszY9IF2NXb/MhtPIhJemBaMiQqSOJOiV0NJIkrgc7CZmM3lmhiIL8zFp2bg1uhFQk6GgHjI57I7H0DnyNn1EThaPcEJKiemDnDQvC/NzMZXHP2bHpFhBJ9jFczycI6ZFEcDq8CS3hKVvzD5Py2/lsQl2WAc1CwMawkWGSeEP3+ZHfI0uyNWY1ok6iJBL4OWekXJSBnqT+AXITJkSXo6VckOBCCu2OW/JEuyHHYwFVUSZhKMeB7dEthrMNpmSp5I1CAUnZxIk0ImeEWPAnwRXodv0Q3oSocs+WfQQ00SliQqJ1CJEvBInhDW6OYiDCWLS9I0aEvogHDjknFHiR8RGl4Imf5Ei9EC7IfkZ9Ahf5CRRErCdGCS2DJLoY3RF/oIg5sNRxNEmCpCXwEooSvD4jyC0JBDDeiaclsRStGqIk8mTkQpJ8GCEnhIb6EkMbizGESl6QoWltiE7IfIVWBQHBkWCUu8MXQ9k5WIXsU26zQQqFoyAUNHAsEDa8CJH0SxKG2/gxrIPZU8kNvLEocYkCSS6FNA1MOkl0PcsljQuxK/ZA7I/ISGKAzYJl4OPQnHM0Qilsh3TMtNCQoRxIndeRwnQ9uiW8DJJY259ELkF50tvLESVaPwhGJCTbESJ6WfioM9DlY6SsltkOi86K3bER8Y1xR1GdYS28HSXRMiCBL8jIAipaJNuBIHulhJuCj8ByjjG2xD7EL2ILSPUC/IngkfRMl4LUumQ3ogNZQhpaMiX0SLRkE6zAxjJiB2ashRFS0SbCRD/0EwhW0iR0ieww22aHotIWl+RiELIEliykSaBIUfmTCcU4JX0S2OGlLIreiVhCH2EXseXCFCEJVYfMNiRnl/I58jYtb0xaHVEUokcLCZeDjVJHymTY4IsshJRD7BKRH5Dn6IBuZjCf0NEsaTbIbZCLbs9w1sfAhDRmYbHh/ElHMnwVZ6S5Hoq9iOlpd2KQcaJ3QkjwkPzhLYdJWMpl6JSFbIn2xQs4UJISCmfg4kSuiHSN9CewtJY15Ir0YFok3q2yN2cbEwi6BhLuElJIG6GQ19kKeTiWikFoGZh8goTwkS+iyQqJLG56JWEEIlDVBz1nJSRiJFYT6NpCTZyaFL2W3ZzDgWikIvGZuBLd4SieBsxztDiLfsWl2RuFox6FoSeAb6ldSPjJQISGbCeRSULSG3SsQi2A1xIhxMLcCnWBvqKC6Qx+iWxuY6ZmppGhaIdWsR7E9IeaSOBkhoefkzbILEBr7EJemTRIxBBLWCTPByqSJXRysHsNu4gy9MS0TdwkJQY/Qmuok9El4EJWWZyBoLbzIlezhElQkk8EtB8xRXwWDzj8xD2Ny7ZzdHJC0cxREqCb0VFiRN6J/ALQbchseiU+yJpbYouzgROIwPkJbeFDOorwIkqhEzl4QD6SFIY0E/uL9i7+g5voouDEwnV4KBs0nKITsvyH1EdLRKQkkOBh8godB79HL/Aiw8mQJ5OEQ3jQlex7nAnCiHEOqsJLx+AZtJH5CL2KX+HiDGEwwkrgmfQ49By9HIz3BJvSDLsQ0tODkjnBwMIo8SGg5sCUNLNGhCVCbQQvZZCEChI4Miw52DaEgTSXRO6LZYom1giz0kQtFPYKTs4/6/J4LPwaHgyJHbyyFIob3YjWmDQraCKJaWEg0ekfB+Rol2NzvSFdmRaJN4FVacKJ3QoTwiYJ1LwgQ0uSO9EKtIfYfUUEgUEyMGtqiCSMboollF6M2ESS9I+xAUiahLXghXSG+pJeBFw2uNz380nQpYtez/3B9BSkSLo2PBu1Q1uiVT+Ys2HSyx2VdvRWdPYYirSuAx/CESTKwnt4OCsmckT5PAnsFLCU7IlC0Y0IQlEtYJn0Sl0JiuQ4CTZRemFaKCE0/Il9FVUl+VPeBFwzblmpka7LfkxXsXQGFJJRgWGp4QspDPQ5ghIbl9s+oxcjtuCg4A954KXij4SS8G4Z3C7aEpQrZD7CCcaFzwQ6DAwnJvBtIOazmT0OOWSXgZJEtEdvTjaQwumyYVsKEvCJaGNLwfLg+Y5H8PvL8zIXZBS0c8CIBmOj4hhrZJYbQdvsQk6IuxDfYQhxfQ5uiAt9BzctUNCskZzvSx5E5fliUuyCUw4ICSlhsBvQht2FEsaCW3ZBfJFS0Y0IQpxYJ3RXhRKjgZTYsGBFbVkZbV+RwoTAkqOCJCdE7l4QB7EN64PrGlLdjwJlLI+LIcciWFsShxIa1EB8RNfA2kD3v8T7S5uWQOyI00fEJIkSUw0PCpMRKE1hAbbezU9OJolPsixHEzyfMQvASqwY7eDl5WQWR6F9jIHZE2tDv9ggMiwny8HXggeYnIQo22F2eiVK0MgQtKLYEnoSh4R8xNYQgzuRW0ZuSwhkH+Qa9CToRiDUw0Z4GOQr+BM7L7hJeQ25HpFb0zrRJt5P/acSGt0JKjCdHBqY0Wx7WJ1/CC8jnzM91kMpaTYQiq/pJhYfEOFfgZv0QhaDNpI1LGBCT9iEij+g9+hR0HDwkvBFka9kFvSDWktuxadkbkHuLCidQsJkhqnQ+YjgEL7IbyIbsgrQjgIFElYJvRSXSGP0TBqDt5IrY4uinuf6sSUCLGDKzRuef7Hg4RsEH+ghwS27YtOx1C8ekeaJSjliaP6as9sY/RC5GBYTJwNoHBzaOCS27Z9QxKAxoQklOBg/0JgMbo5WPA22s8SyFGhWCSgimBN6Gl4EifQntg2k0c0kal//AAe8L7CF2MVIRsIkozcDLPESlGN0cghClp8kHsi9iMEwS+Ab6FKeEMbo52eBCy/4N7iBLI3ZDfyzG+nAJnQsAynBzsJSDpn8IAWkclt2fcca0RBmiTbFoewJoi8CRxhLDeEwsY0sgsfaW16Qr0bhdAqDBg+YpNhHyFchActirPRdGiUBC1J6wfEQuhDc4TvgHkMaRDb0jdl9hm58kfk5GMQkGsRbG+gSei+Q8Rt+QQl6cLRJvCFwGbA9+j0IGN0TWHSyxncbGrEpAX0OJo7Ayr6JQvEHCE18DfAl0VMhS9n9GR+yOlorBIhS1CRodEIkgVTg4WGh4RSsYxFCLIXZfkbKnkZYhGwlQwLDRwOEGteEr/wi07H9CDdK4Qx9hIUS0sGN0J/A5o4OcPmJBApeiMaKT2TuzgD3gSeg8uj5BxfgY/8Ao5mfYS27IMuxBS0WVCFyQiUmPX5Xu2VVjtpI15EK7LbsSqQygx4ESeEYlhNbCrR5cnOxSdlt5bIN6QUGPCFLRZSTIhGC4mKnoc3RMNpBjZHaWJh5L8jPvOJaSCFQSKFhM6H+hIUl6NvIz2BHS0hv2L/SqESuhQvBIaiT0NwJNi5NkSOS4okWvZA2mJHQiUzLDlYOk6HHKEL2S27Z9hwtEbwhaEtBNJELo+Q5Q4JZKtNmogULTnyyBHCjiBJdKMCw2NUQCYcrJAjby2RL0jUBG9ECESUsEmxUYEbFCEnoY0sSlGt/w9hwQey/IyJ2RSkxGSVCeh8w3oG9ByhKjPyM0sROForYgkI8QvoKS6HZltjJIbllM6E1aJvySKXtnEHtX0SVE+YcrCCmgc7PeDb8jZo5MC0gSELCJqEukF6LCaw6QiAhuzgCl5olJeTi/od6iSqxEmOCRLwYmBzMQvYreWSOyFQtGVEZIDTUOeWMUKW68kKNJX0TW8/2NPgkWQuWQ+xNsa2ROzsPIxxSUN8Qkd4Ng5HKIkvRmx9RFSCTahYpCcR8BCS6EizbpEUmSTCE5ETsVuyF2NkDmEepnCRLwbXgRKTg5mQrDSPbZHS0YCwoyYJAThdHzHKlELMl9nmOJpLsxEnZwPwJJKh7cLDawbTG8HtL+EFj6yGvln3lsIUsIVJCJ6wfMSkvBsdoQ0lhGTglt5/sZJIms0McewuS2xHuQ+TljokU19J6WCT0iUkSeiSAV3EuRmp6QKNCmgVBPQa14V0Deo1PBoHbGh6LpyO0LSvsrjRlEhrCbAPsx/Ia1i//AAIjsZvybIkvTJoc0CFJqWEjoldCOITuQiQlvLFJLSHNIbVp/wDWKxCUukMqHEwVFvCZvBjyyCXwfYJvyMVJdi+NFoQkUmrB8w2k6Jz8EIm9E0PgUgzayGxDmiTYXrSBC3yNqEUCJ64Jtwak0hzd4Tf4F+VvsEavTMtIgSC0OPB8BCVsGehPbwUTJGQOWR5pDbsQl6awPYRJRNSwnSDehE0sTY5H5LPshy9MDRKAsJaWDSNJeCJ/RPbHUz0Y1mh6QIWlnHIkGcYe1FIZFhNbwlW4GOQ+Tj9xEn5KYDnhCVYRkWD2vBx0HOJ/8BRsB1YcxBY8wd+xfcQ0FZCEioZMDnl4inRDhxbFA5fsi3piWknhaJiJKCyzKGbgkWKsH3EV6P6RTByLTs4kKWEJLqJ3WD7sIrLwfIe0G0Nyy6WR0tFQQiFEtNQ1uhx4IG/QSW1RAkbSEVvTi6KatYrsOExjiSWoJPRcPB0hKyK9Pg+sU9jFL2YBaPAkQsNjBl0I9QTAkS7MaLLGSMgXJ4I3ZoQkOiFonYVJCJgS+h6vCYNdh0nZMj6DGgyNaLo0noTuh0JV0SOXgysGsO0EUI28tiF7ONEhEJQ2iwmXg2lakOuwgtocPNjbyEeiqBKUCRRL4BrdDhOIJ/RzPn5OQQXoXgI+xkfsrCV15ISVhKjgmtjZZtJHRZ9xdmifRxiTUISsncYNxKUngx+l+w5bTyU+Qx5f8IUtCPTllt5YhPLIqQpYoiSlgk7hFT4E5YthFHLfZqdsTRomgSkSsIm8HLJHRXSj4hrsmZjmsjSFQrZ7DFLtjNBzdeSEqKkT0hGxuEsaFcjIKxKfZxoY0CIBFMEnwj0Eh7/6HLgQn4ENsrFpEFacY4f6HR8csSSUMbolvBBXBILyz7iWCvpBDkhoIkjhOj1UOFnEj5D/AIiFr2Se7bND0WszgLEU5L7BPsRwEz0JcCRQsJV4eTJBzhjdmke6R+QdXpmE1NQz0K6hz9Gj4IpMrI2mxFGil+TIXZbAc5CoJVBueDcOhzSczP6Dv2Quy4lo+jRAT+AY/RDwIa3RLbIfY5JkVsZloj9iRZNQY3RC8RLmEtsOgiEVj6i2z2g4qFo16OITqFhs4GkziQ5uuEf+YI3vCG3ZrI75Li0exGd4Gn5Wz7SHyCegVJAuDBNuDj0GbdH/ABBadkt5dkaeSGlpLrRNX0nQPZ+DHSJUcEkPAyWjyILZGoqSHTkWOQMDBIsGZYaHg2mN4OQ8I9gvyM5mkrkJgklMywnyHHiQ5uja/hAGdxtBeNIlWivMT0EziSU+c1PBkt4OsRXoX5GKwtLsjULRlH0WWLB8Q0Muzk+Be9G5b0VDemBaMatEkRJbeWIXy2UxogSIQokzCRLwgg4hUiF2ObiF2ZGjmFUEvg5G+IY8JDqcEl4FIxt2Cg5Za8iliN2cYcCiJYjBgZcGSdDy+jmYgX2EBeR6ULfyEIZFhzcHC+A9xN/gRALEbNENJhW3f4KgccdDcYSvAWg2QgvfBE+z6MSnZw6/AUYHUWHIwcSYPeeDNBHveCTdtkOWMi0RgqrRapLEp2Qg16ESmZYamJSvgb1HIFDLbyLSXpn0I6tIP/SfwE/o9FIk9E9scNGECXp9wk27ICMFbdCSQwoSpeDC1iGwhZ5Lk5FL2Q0tEbiwn8Az1JXiHP1+QlJGNekF8jj7IoWkOji+h7dCEnEjDwSvAQsjHlkQKXyy3sQvZCgOYiWE7hYM3g4fEDHvDJj3XgbXac7TC0UsJZHCuSJxHCvzUCJELCTeEU9ficzEJ2NnIlL0yAjaORUkL+nqBj9DaWFSQx+ie8De2fSIsH1CT7H+Pg+vzEocEqsJLeCkHl7Tj81t+LItEm4tKJAUvBS8Ehr9Er4PzSeWQL0gxyRKhCwvpZAlxwKPAifQ2PBtLLJdgryD7C28tiu4hpDCkElYJc4HCy8GveFkHpEaefBLbsiyxAoWiZvZGguhHriCULBjUKElLCRLwYM3OdjwJBtelItFbfiqhYTSHgQ5uiYGmGNYuuRwfYl7GKH/AECRAiTwjMg93wNpWGYiBwXY028tiV7Ik40TMRgQx0sPiKQnZXLX4jBE8iNCFsUkihfgSSdI4olt4NpLJssjcsiQ5Yhds4kMbFJUSUsJ7efg3qOZjIs27Z41kVLRJsIjUSOMEgo6HxYJKkkpOhGx0G2ORjQ7G232KCvRCULRG1aKSP8AJLSw+QVMwa0cEiChK2NaRNBsb/pDfsRJ2cIk/wCiEhLSwl3B0nge2nkIBDb7IYPYENuiIFehP6K8CRM6JbDgSdkbnv8AoxKwpYgt4JGKAmwJdwigx7IXOj6iWxEWQhjZE6JKQm9FLeCR/kI9mN6aanpGq0RtEWJqJa/oYMUD4cCZhwMJLeFE4iRJysYWWL7GBaI6PxS1gY3Q/AaaJXIUgxrIbekHsViRRBSGP0JKDhEqFhO7wbVh5SQW/wALWRK9HKtDGEkiWUsPCoUTOkObomsOA2250XZmZaW3ZEo8AksVE1cGjAqRjHshYQnZD7CVGv8AEsuhJJDnSwn3BwkOGTaPcDOwgS9GUpcCrInrB8g6dEj6F54/P//aAAwDAQACAAMAAAAQJpNNttpNJJppNNpppJppNJJJJJNJJttNJNpJJtNNtNtNNJpJJNNJJJpppJJNtNNNttJtpNpJNppNNNtJpJJNJppJJNttNNNNNpJppNNpJJtpJJJtJNptpppJtpptpNpptpJNNNNtJJNtJJpNJNpttptpNptNJtNttNJJNNNtJpppptpNNNJptJtJNtJpJtJNttpJNptJNJJtNptJttJJtNJJNJtJpJptpNJtJpNNpttNppNNJtpppNNNNJtNttpNJJptNtJtpJNJtpppJpNtttNpNNJtNpJNtJNNtNtJppNNpppNNNJtNpJNJtpNNptNJpJtNJJpppJJtJptNJNNtptJtNtptJtNJpJpNpJNJpptNNtpNNtJpJJJttNNptJJNttNtNJpJJppNptpNNNtJNppNttJpJNJtJpNNpNtJtJpJtpNptJtptppJpJptJNtppNtNJNNpJpNJNtNtNJppJJtpttNJJJpNtpNNptJJttNtpttJtNNpptptNt//f8A+z/++23+2/8Avv8A5f7b/b/b7b7ff/8ATz232++2+22/62++323+3/233+2/32+3+/223/3zX2332/32++/3/wBt/wD/AP33/wBtv/8A/wD2/wB9/tv9t/8A7fb7b7//AH323+/222++33332++33333/wDt99t/vtv/AL7bb/f7bfbbff8A+/3/ANtvtt/tvvtv99v9t/8Ab7/f/wD+++//APt/vt//APb7b/bf7/7ffb77/wC32/2//wDt/wDfbf7b77b7/f8A/wBtvtt/v/v9v9/tv/v/AL77777bbf7/AH3/APvt/wD/AO3/APvtvtt9/wDf/wC223//APt99/vv/wDf/wD33+2++3+33323/wDtvtv9/v8Af7f7/wC//wBvttvttv8Abf8A+3+2323/ANt9/wDbfb7fbffb/wC+3322++/332+++332/wB/9tvvvv8A7bfffb//AO+//wBtv9vvtvt9v/vtt9t/v9vvtt/9v/8A7b7bfff/AP8Av/8A7/f/AO/+323233222++223332++/3/8A/v8Ab7b7f7/bbb7777fffbbfb/8A+2++2/22/wD/AP8A+323+2++3223/wBvt9v/ALbb7b7b/b7fbffff7/b7/bbb/bffb7f/wC++/8A/wDbb77bbb/f7fff/wC323+3/wD9tt99vv8Afff7/bf/AO+232//ANt99vt/9v8A7f777b/f7fbf7/b/AG33+2+/+3223/3/ANvv/wDfb/f77/b/AG+332+//wBt/t/vvt/v/t//AL/b7ff7f/b/AG++3+/2++/2332/2+332/3/APtv9/tv/vt//vt/vt//AP8A+22+/wD/AP8A+232+/2322+3332/+2/++232223/APtvtv8Abb/7f/b777/b7f8A++/2+/8A9/t99/v9v9//AL//AO/2/wDvtt9tvtt/vttt/tvt99v/APf/AP2/223/APtvtv8A777/AH2/2++22/8A9tvvv9/9/wD7ffb/AP3/AP8A7/8A323/APv9t99/tvt9t9t9tt9/ttv9/tt//vv/ALfff/b/AH3+3+/+2/3+/wBvtvv9/t/vvttt/wDbb/f777/b7/7f/b7bb77bff77/fbb/wD+/wDv9t/9t/ttvtvt9/t/9vt99t/vvt/v/tv9/wD777f/AO+++++//wD/APf/AP2/+3+32/332333/wD/AL7777ff/bf/AH/+++22/wBv9/8A/wC2+22++23+2/8Avtvvv/v/AP7/AO3++3/333+//wDtt/tv9t/v9v8Ab/8A23/3+3332/2++/8A9999vt9/999v/tvvt9/vtvv/AL7/AH/3++/+332/+33/AP8Af7/7fff7b/f7NpNJJJppNptNtpNtpNtNJJpNJtJJpttpJJtJNNNppNJtJppJNppJtppJpNNpJtJtJtNNtNJpNppNNNtpJJNtJpNN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) 50% 50%;color:#000;font-size:12px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0 4px 0;border:1px solid #c2a26f}.theme-nano-light .displayBar,.theme-nano .displayBar{background:#000;border-radius:.15em}.theme-nano-light .displayBar .displayBarFill,.theme-nano .displayBar .displayBarFill{background:#40628a;color:#fff}.theme-nano-light .displayBar.good .displayBarFill,.theme-nano .displayBar.good .displayBarFill{background:#4f7529}.theme-nano-light .displayBar.average .displayBarFill,.theme-nano .displayBar.average .displayBarFill{background:#cd6500}.theme-nano-light .displayBar.bad .displayBarFill,.theme-nano .displayBar.bad .displayBarFill{background:#e00}.theme-nano-light .displayBar.highlight .displayBarFill,.theme-nano .displayBar.highlight .displayBarFill{background:#8ba5c4}.theme-nano-light input,.theme-nano input{border-radius:0;padding:2.25px 6px;vertical-align:top;margin:0 2px 2px 0}.theme-nano-light .tooltip.content,.theme-nano .tooltip.content{background:#272727;border:1px solid #a9a9a9}.theme-nano-light{color:#000;background:#c9c9c9 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjQzMCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNDAwIiB5MT0iNDMwIiB4Mj0iNDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIuNDEiIHN0b3AtY29sb3I9IiNjOWM5YzkiLz48c3RvcCBvZmZzZXQ9Ii44NCIgc3RvcC1jb2xvcj0iI2U1ZTVlNSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMzk5LjkiIHkxPSIxMzYuNTIiIHgyPSIzOTkuOSIgeTI9IjI0MC41NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iLjAxIiBzdG9wLWNvbG9yPSIjZDNkM2Q0Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYzJjNGM0Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSI0NzkuMzIiIHkxPSIxOTcuNjkiIHgyPSI0NzkuMzIiIHkyPSIyNDAuNTUiIHhsaW5rOmhyZWY9IiNhIi8+PGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzIwLjQzIiB5MT0iMTM2LjU0IiB4Mj0iMzIwLjQzIiB5Mj0iMTc5LjQxIiB4bGluazpocmVmPSIjYSIvPjwvZGVmcz48cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMCAwaDgwMHY0MzBIMHoiLz48cGF0aCBkPSJNNDUxLjQ0IDE0MS41Yy0uMDctMi4yNS0xLTMuNTUtMi43My0zLjkzaC0yNC4ycS0zLjYuMDktMy43MSA0LjA2djUwLjQ0bC0zMy43Mi01NGE1IDUgMCAwMC0zLjA1LTEuNWwtLjktLjA3aC0zMS40NXEtMy4xOS4yOC0zLjMzIDR2OTUuMDZjLjA4IDIuMjUgMSAzLjU2IDIuNzMgMy45M2gyNC4ycTMuNi0uMDkgMy43MS00LjA2VjE4NWwzMy43MiA1NGE1IDUgMCAwMDMuMDUgMS41MWMuMjkgMCAuNTkgMCAuOS4wNmgzMS40NXEzLjE5LS4yOCAzLjMzLTR6IiBmaWxsPSJ1cmwoI2EpIi8+PHBhdGggZD0iTTQ5Ni4zNCAyMjguM2wtMzYuNjctMzAuNTd2MzguODdjLjA3IDIuNDcgMS4xOCAzLjggMy4zMSA0aDMwLjI1YTUuNDUgNS40NSAwIDAwNC4wNS0yIDcuMjQgNy4yNCAwIDAwMC05LjQ2IDMuNTkgMy41OSAwIDAwLS4zOS0uMzlsLS4wNi0uMDZ6IiBmaWxsPSJ1cmwoI2MpIi8+PHBhdGggZD0iTTMwMy40MSAxNDguNzl2LjA1bDM2LjY3IDMwLjU3di0zOC44N2MtLjA3LTIuNDgtMS4xOC0zLjgxLTMuMzEtNGgtMzAuMjFhNS40OSA1LjQ5IDAgMDAtNC4wNSAyIDYuODEgNi44MSAwIDAwLTEuNzYgNC43MiA2LjkxIDYuOTEgMCAwMDEuNzYgNC43NHEuMTkuMjEuMzkuMzlsLjA2LjA2YTQuMTIgNC4xMiAwIDAwLjQ1LjM0eiIgZmlsbD0idXJsKCNkKSIvPjwvc3ZnPg==) 50% 0 repeat-x}.theme-nano-light .itemLabel{color:#4c401c}.theme-nano-light .uiTitleWrapper{background:url(data:image/png;base64,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) repeat 50%}.theme-nano-light .uiTitleWrapper .uiTitleText{color:#4c401c}.theme-nano-light .uiTitleWrapper .uiTitleClose{color:#000}.theme-nano-light .good{color:#5e9653}.theme-nano-light .average{color:#cd6500}.theme-nano-light .bad{color:#e00}.theme-nano-light .dark,.theme-nano-light .idle{color:#272727}.theme-nano-light .displayBar{background:#fff;border:1px solid #666}.theme-nano-light .displayBar .displayBarFill{background:#556d99;color:#fff}.theme-nano-light .displayBar.good .displayBarFill{background:#5e9653}.theme-nano-light .displayBar.average .displayBarFill{background:#cd6500}.theme-nano-light .displayBar.bad .displayBarFill{background:#e00}.theme-nano-light .displayBar.highlight .displayBarFill{background:#8ba5c4}.theme-nano-light .button,.theme-nano-light a,.theme-nano-light button,.theme-nano-light input[disabled],.theme-nano-light input[type=button],.theme-nano-light input[type=reset],.theme-nano-light input[type=submit]{color:#fff;background:#556d99}.theme-nano-light .button:hover,.theme-nano-light a:hover,.theme-nano-light button:hover,.theme-nano-light input[disabled]:hover,.theme-nano-light input[type=button]:hover,.theme-nano-light input[type=reset]:hover,.theme-nano-light input[type=submit]:hover{background:#7c9ede}.theme-nano-light .button:active,.theme-nano-light .button:link,.theme-nano-light .button:visited,.theme-nano-light a:active,.theme-nano-light a:link,.theme-nano-light a:visited,.theme-nano-light button:active,.theme-nano-light button:link,.theme-nano-light button:visited,.theme-nano-light input[disabled]:active,.theme-nano-light input[disabled]:link,.theme-nano-light input[disabled]:visited,.theme-nano-light input[type=button]:active,.theme-nano-light input[type=button]:link,.theme-nano-light input[type=button]:visited,.theme-nano-light input[type=reset]:active,.theme-nano-light input[type=reset]:link,.theme-nano-light input[type=reset]:visited,.theme-nano-light input[type=submit]:active,.theme-nano-light input[type=submit]:link,.theme-nano-light input[type=submit]:visited{text-decoration:none}.theme-nano-light .button.on,.theme-nano-light .button.selected,.theme-nano-light a.on,.theme-nano-light a.selected,.theme-nano-light button.on,.theme-nano-light button.selected,.theme-nano-light input[disabled].on,.theme-nano-light input[disabled].selected,.theme-nano-light input[type=button].on,.theme-nano-light input[type=button].selected,.theme-nano-light input[type=reset].on,.theme-nano-light input[type=reset].selected,.theme-nano-light input[type=submit].on,.theme-nano-light input[type=submit].selected{background:#5e9653}.theme-nano-light .button.on:hover,.theme-nano-light .button.selected:hover,.theme-nano-light a.on:hover,.theme-nano-light a.selected:hover,.theme-nano-light button.on:hover,.theme-nano-light button.selected:hover,.theme-nano-light input[disabled].on:hover,.theme-nano-light input[disabled].selected:hover,.theme-nano-light input[type=button].on:hover,.theme-nano-light input[type=button].selected:hover,.theme-nano-light input[type=reset].on:hover,.theme-nano-light input[type=reset].selected:hover,.theme-nano-light input[type=submit].on:hover,.theme-nano-light input[type=submit].selected:hover{background:#7bc46c}.theme-nano-light .button.inactive,.theme-nano-light .button.off,.theme-nano-light .button[disabled],.theme-nano-light a.inactive,.theme-nano-light a.off,.theme-nano-light a[disabled],.theme-nano-light button.inactive,.theme-nano-light button.off,.theme-nano-light button[disabled],.theme-nano-light input[disabled].inactive,.theme-nano-light input[disabled].off,.theme-nano-light input[disabled][disabled],.theme-nano-light input[type=button].inactive,.theme-nano-light input[type=button].off,.theme-nano-light input[type=button][disabled],.theme-nano-light input[type=reset].inactive,.theme-nano-light input[type=reset].off,.theme-nano-light input[type=reset][disabled],.theme-nano-light input[type=submit].inactive,.theme-nano-light input[type=submit].off,.theme-nano-light input[type=submit][disabled]{background:#999;border-color:#444}.theme-nano-light .button.danger,.theme-nano-light .button.red,.theme-nano-light a.danger,.theme-nano-light a.red,.theme-nano-light button.danger,.theme-nano-light button.red,.theme-nano-light input[disabled].danger,.theme-nano-light input[disabled].red,.theme-nano-light input[type=button].danger,.theme-nano-light input[type=button].red,.theme-nano-light input[type=reset].danger,.theme-nano-light input[type=reset].red,.theme-nano-light input[type=submit].danger,.theme-nano-light input[type=submit].red{background:#f22;border-color:#a00}.theme-nano-light .button.danger:hover,.theme-nano-light .button.red:hover,.theme-nano-light a.danger:hover,.theme-nano-light a.red:hover,.theme-nano-light button.danger:hover,.theme-nano-light button.red:hover,.theme-nano-light input[disabled].danger:hover,.theme-nano-light input[disabled].red:hover,.theme-nano-light input[type=button].danger:hover,.theme-nano-light input[type=button].red:hover,.theme-nano-light input[type=reset].danger:hover,.theme-nano-light input[type=reset].red:hover,.theme-nano-light input[type=submit].danger:hover,.theme-nano-light input[type=submit].red:hover{background-color:#f66}.theme-nano-light .button.yellow,.theme-nano-light a.yellow,.theme-nano-light button.yellow,.theme-nano-light input[disabled].yellow,.theme-nano-light input[type=button].yellow,.theme-nano-light input[type=reset].yellow,.theme-nano-light input[type=submit].yellow{color:#000;background:#cacc00}.theme-nano-light .button.yellow:hover,.theme-nano-light a.yellow:hover,.theme-nano-light button.yellow:hover,.theme-nano-light input[disabled].yellow:hover,.theme-nano-light input[type=button].yellow:hover,.theme-nano-light input[type=reset].yellow:hover,.theme-nano-light input[type=submit].yellow:hover{background:#fcff5f}.theme-nano-light .tooltip.content{color:#000;background:#c9c9c9;border:1px solid #a9a9a9}.text-dept-command{color:#114dc1!important}.bg-dept-command{background-color:#114dc1!important}.border-dept-command{border-color:#114dc1!important}.text-dept-security{color:#991818!important}.bg-dept-security{background-color:#991818!important}.border-dept-security{border-color:#991818!important}.text-dept-engineering{color:#c67519!important}.bg-dept-engineering{background-color:#c67519!important}.border-dept-engineering{border-color:#c67519!important}.text-dept-medical{color:#15903a!important}.bg-dept-medical{background-color:#15903a!important}.border-dept-medical{border-color:#15903a!important}.text-dept-science{color:#a44799!important}.bg-dept-science{background-color:#a44799!important}.border-dept-science{border-color:#a44799!important}.text-dept-cargo{color:#593616!important}.bg-dept-cargo{background-color:#593616!important}.border-dept-cargo{border-color:#593616!important}.text-dept-civilian{color:#90524b!important}.bg-dept-civilian{background-color:#90524b!important}.border-dept-civilian{border-color:#90524b!important}.text-dept-equipment{color:#6c5b73!important}.bg-dept-equipment{background-color:#6c5b73!important}.border-dept-equipment{border-color:#6c5b73!important}.text-dept-miscellaneous{color:#5d6a67!important}.bg-dept-miscellaneous{background-color:#5d6a67!important}.border-dept-miscellaneous{border-color:#5d6a67!important}.dark-theme{color:#fff}body{font-size:14px;margin:0;padding:8px;font-family:Arial,Helvetica,sans-serif;overflow-x:auto;min-width:240px}body.vueui{overflow-y:hidden}#content{height:calc(100vh - 36px)}#content.mcomputer{height:calc(100vh - 72px)}#content.uiDebug{height:calc(50vh - 36px)}#content.uiDebug.mcomputer{height:calc(50vh - 72px)}#debug{height:50vh;display:none}#debug.uiDebug{display:inherit}#content,#debug{overflow-y:auto;margin-right:-8px;margin-top:-8px}#content>div{margin-right:8px;margin-top:8px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA1SURBVFhH7c4xAQAgEMSwAwnn3wvWWPDwA+nSNavtyWD7fSwAAAAAAAAAAAAAAAAAgN8ByQWAVwE1HJRsowAAAABJRU5ErkJggg==);padding:.5em;box-sizing:border-box}.uiTitleWrapper{margin:-8px -8px 10px;position:relative;float:none;clear:both;user-select:none;-ms-user-select:none;cursor:default}.uiTitleWrapper>.titleBar{height:32px}.uiTitleWrapper>.titleBar:before{content:"";display:inline-block;height:100%;vertical-align:middle;font-size:0}.uiTitleWrapper>.titleBar>*{vertical-align:middle;font-size:24px}.uiTitleWrapper>.titleBar>*{display:inline-block;margin-left:8px;line-height:32px}.uiTitleWrapper>.titleBar>.uiTitleText{font-size:16px}.uiTitleWrapper>.titleBar>.uiDebugIcon{cursor:pointer;transition:color .25s}.uiTitleWrapper>.titleBar>.uiDebugIcon.uiNoDebug{display:none}.uiTitleWrapper>.titleBar>.uiDebugIcon:hover{color:#507aac;transition:color 0ms}.uiTitleWrapper>.titleBar>.uiTitleClose{display:block;float:right;width:45px;font-size:20px;text-align:center;transition:color .25s,background-color .25s}.uiTitleWrapper>.titleBar>.uiTitleClose:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}code{font-family:Courier New,Courier,monospace}.table.border{border-collapse:collapse;border:1px solid #000;border-radius:.15em;background-color:rgba(0,0,0,.3)}.header.border{border:.5px solid rgba(0,0,0,.5);border-bottom:2px solid #556d99;border-radius:.15em}.item.border{border:.5px solid rgba(0,0,0,.5);border-radius:.15em}.button,button,input,select,textarea{box-sizing:border-box;padding:4px 6px;border-radius:4px;display:inline-block}.button,button{border:1px solid rgba(0,0,0,.2)}input,select,textarea{border:1px solid #000}.button,a,button,input[disabled],input[type=button],input[type=reset],input[type=submit]{user-select:none;-ms-user-select:none;background-color:#d8d8d8;cursor:pointer;padding:2px 4px;vertical-align:top}.button:hover,a:hover,button:hover,input[disabled]:hover,input[type=button]:hover,input[type=reset]:hover,input[type=submit]:hover{background-color:#b2deee}.button .mapIcon16,.button .uiIcon16,.button .uiIcon24,a .mapIcon16,a .uiIcon16,a .uiIcon24,button .mapIcon16,button .uiIcon16,button .uiIcon24,input[disabled] .mapIcon16,input[disabled] .uiIcon16,input[disabled] .uiIcon24,input[type=button] .mapIcon16,input[type=button] .uiIcon16,input[type=button] .uiIcon24,input[type=reset] .mapIcon16,input[type=reset] .uiIcon16,input[type=reset] .uiIcon24,input[type=submit] .mapIcon16,input[type=submit] .uiIcon16,input[type=submit] .uiIcon24{margin:0}.button *,a *,button *,input[disabled] *,input[type=button] *,input[type=reset] *,input[type=submit] *{vertical-align:top}.hidden{display:none!important}.notice{background:#ffac4e;color:#000;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0;box-sizing:border-box}.displayBar{display:inline-block;background:#fff;margin:0 5px 0 0;border:.5px solid rgba(0,0,0,.2);border-radius:.15em;overflow:hidden;width:236px;height:16px;vertical-align:text-bottom}.displayBar .displayBarFill{width:0;height:100%;background:#acacac;overflow:hidden;float:left;color:#000}.displayBar.good .displayBarFill{background:#5fe42b}.displayBar.average .displayBarFill{background:#ff8000}.displayBar.bad .displayBarFill{background:#ff2323}.displayBar.highlight .displayBarFill{background:#9dc7d6}.csserror{display:none}.tooltip.label{text-decoration:underline}.red{color:red}.green{color:green}.blue{color:#00f}.highlight{color:#00008b}.good{color:#4f7529}.average{color:#cd6500}.bad{color:#e00}.resizeHandle__se[data-v-9bc3ecba]{position:fixed;bottom:0;right:0;width:20px;height:20px;cursor:se-resize;transition:opacity .3s;opacity:.5;background-position:100% 100%;background-size:16px 16px;background-repeat:no-repeat;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' fill='%23fff' viewBox='0 0 567 567'%3E%3Cpath d='M437 0c-6 0-12 2-17 7L7 420c-9 10-9 25 0 34l57 57c9 9 24 9 34 0L511 98c9-10 9-25 0-34L454 7c-5-5-11-7-17-7zm27 199c-6 0-12 3-17 7L206 447c-9 9-9 25 0 34l57 57c9 9 25 9 34 0l241-241c9-9 9-25 0-34l-57-57c-5-4-11-7-17-7zm22 204c-6 0-12 3-17 7l-59 59c-9 10-9 25 0 34l57 57c9 9 25 9 34 0l59-59c9-9 9-25 0-34l-57-57c-4-4-11-7-17-7z'/%3E%3C/svg%3E")}.resizeHandle__se[data-v-9bc3ecba]:hover{opacity:1}.resizeHandle__s[data-v-9bc3ecba]{position:fixed;bottom:0;left:0;right:0;height:6px;cursor:s-resize}.resizeHandle__e[data-v-9bc3ecba]{position:fixed;top:0;bottom:0;right:0;width:3px;cursor:e-resize}.button[data-v-1a3d9578],button[data-v-1a3d9578]{margin-left:6px}.maincont[data-v-1a3d9578]{padding:4px;padding-top:5px;padding-bottom:5px;margin-bottom:-8px;background-color:#202020}.maincont .valign[data-v-1a3d9578]{vertical-align:middle}.uiIcon16[data-v-1a3d9578]{margin-right:0}table[data-v-36dbac0c]{width:100%;text-align:center}tr[data-v-36dbac0c]{line-height:135%}.table[data-v-0d69deee]{display:table;width:100%}.table .header[data-v-0d69deee]{text-align:center;font-weight:700}.table .header[data-v-0d69deee],.table .player[data-v-0d69deee]{display:table-row}.table .header .header-item[data-v-0d69deee],.table .header .item[data-v-0d69deee],.table .player .header-item[data-v-0d69deee],.table .player .item[data-v-0d69deee]{display:table-cell;padding:1px}.complist[data-v-0f00c828]{margin-right:1em}.value[data-v-10d6546a]{color:#fff;font-size:140%;background-color:rgba(0,0,0,.4);padding-left:5px;padding-right:5px;border:1px solid #40628a}.value[data-v-729622e4]{color:#fff;font-size:140%;background-color:rgba(0,0,0,.4);padding-left:5px;padding-right:5px;border:1px solid #40628a}.value[data-v-b7af1e1c]{color:#fff;font-size:140%;background-color:rgba(0,0,0,.4);padding-left:5px;padding-right:5px;border:1px solid #40628a}.itemContent[data-v-1ba61cce]{text-transform:capitalize}.ores[data-v-5716889f]{text-transform:capitalize}.character-image[data-v-36f58934]{float:left;height:64px}.dept-block[data-v-36f58934],.gs-block[data-v-36f58934]{position:relative;border:2px solid}.dept-block .dept[data-v-36f58934],.gs-block .dept[data-v-36f58934]{text-align:center;font-weight:700}.gs-block[data-v-36f58934]{border-color:#41ff41}.gs-block .dept[data-v-36f58934]{background-color:#41ff41;color:#000}.item[data-v-0cce4ea8]{width:100%;margin:4px 0 0 0;clear:both}.statusDisplay[data-v-d73f47c0]{background:#000;color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0}.fixedLeftWide[data-v-d73f47c0]{width:165px;float:left}.item[data-v-d73f47c0]{width:100%;margin:4px 0 0 0;clear:both}ul[data-v-2005209a]{padding:4px 4px 10px 10px}.danger-control[data-v-2005209a]{position:fixed;right:20px;bottom:20px}.control[data-v-2005209a]{position:fixed;left:20px;bottom:20px}table[data-v-561826ba]{width:100%;text-align:center}tr[data-v-561826ba]{line-height:135%}.t-parent>p[data-v-2633030c]{text-align:center;margin-top:0;width:100%}.cancel-button[data-v-2633030c]{width:100%;margin-bottom:5px}p.danger[data-v-2633030c]{color:red}.purchase-icon[data-v-2633030c]{vertical-align:bottom}.food-icon[data-v-2633030c]{-ms-transform:scale(2);transform:scale(2);position:absolute;left:0;right:0;margin-left:auto;margin-right:auto;margin-top:12px}.food-icon.no-stock[data-v-2633030c]{opacity:.2;filter:alpha(opacity=20);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)"}.t-parent[data-v-2633030c]{text-align:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;background-color:rgba(0,0,0,.4);outline-style:ridge;outline-color:#000}.t-child[data-v-2633030c]{height:auto;white-space:normal;box-sizing:border-box;margin:4px 4px 4px 4px;background-color:rgba(64,98,138,.4)}.t-container[data-v-2633030c]{position:relative}.statusValue[data-v-2633030c]{width:90%}.no-stock[data-v-2633030c]{color:grey}.cart-icon[data-v-2633030c]{position:absolute;bottom:5px;left:0}.price[data-v-2633030c]{position:absolute;bottom:4px;left:0;right:15px;text-align:center;font-size:10px}.qty[data-v-2633030c]{position:absolute;right:0;bottom:4px;font-size:10px}.no-stock.button[data-v-2633030c]{background:inherit;border-style:none}.tooltip[data-v-2633030c]{position:relative;display:inline-block}.tooltip .tooltiptext[data-v-2633030c]{visibility:hidden;width:120px;background-color:#202020;color:#fff;text-align:center;padding:5px 0;border-radius:6px;opacity:0;transition:opacity 1s;position:absolute;z-index:1;bottom:100%;left:50%;margin-left:-60px;right:auto}.tooltip .tooltiptext[data-v-2633030c]:after{content:" ";position:absolute;top:100%;left:50%;border-width:5px;border-style:solid;border-color:#202020 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.tooltip:hover .tooltiptext[data-v-2633030c]{visibility:visible;opacity:1}#content>div[data-v-2633030c]{overflow-x:hidden}table[data-v-c49443fe]{width:100%;border-collapse:collapse;color:#fff;background-color:rgba(0,0,0,.6);border:2px solid;margin-top:.5rem}table td[data-v-c49443fe]{padding-left:.5rem;padding-right:.5rem}table td[data-v-c49443fe]:nth-child(2){width:12.5rem}table td[data-v-c49443fe]:last-child{text-align:right;width:6.5rem}.complist[data-v-4021d8a8]{margin-right:1em}.message-chat[data-v-07e18e82]{width:100%;background:#000;color:#fff;border:1px solid #40628a;padding:.4em;box-sizing:border-box;height:20em;overflow-y:scroll}.message-container[data-v-07e18e82]{display:-ms-flexbox;display:flex}.message-input[data-v-07e18e82]{width:80%;-ms-flex-positive:1;flex-grow:1}.recipe-block[data-v-710a36a7]{background-color:rgba(0,0,0,0);border-bottom:2px solid rgba(0,0,0,0);transition:background-color .2s,color .2s,border-bottom .2s;padding:2px}.recipe-block h2[data-v-710a36a7]{color:#4f7999}.recipe-block h2[data-v-710a36a7],.recipe-block h3[data-v-710a36a7]{padding:2px 0}.recipe-block[data-v-710a36a7]:hover{background-color:rgba(0,0,0,.5);border-bottom:2px solid #4f7c9e}.recipe-block:hover .description[data-v-710a36a7]{color:#82a4be}table[data-v-c971b6ac]{width:100%;text-align:center}tr[data-v-c971b6ac]{line-height:135%}table[data-v-1021c617]{width:100%;text-align:center}tr[data-v-1021c617]{line-height:135%}.table[data-v-731c48b4]{display:table;width:100%}.table .header[data-v-731c48b4]{text-align:center;font-weight:700}.table .header[data-v-731c48b4],.table .sensor[data-v-731c48b4]{display:table-row}.table .header .header-item[data-v-731c48b4],.table .header .item[data-v-731c48b4],.table .sensor .header-item[data-v-731c48b4],.table .sensor .item[data-v-731c48b4]{display:table-cell;padding:1px;vertical-align:middle}.table .header .sensor[data-v-731c48b4]:last-child,.table .sensor .sensor[data-v-731c48b4]:last-child{padding-right:0}.item[data-v-731c48b4]{text-align:center}.sensor .item[data-v-731c48b4]{border:.5px solid rgba(0,0,0,.5);border-radius:.15em}.terminal[data-v-5da4d0bc]{width:100%;font-family:monospace;line-height:1em;font-size:1em;text-align:center}table[data-v-570930e6]{width:100%;text-align:center}tr[data-v-570930e6]{line-height:135%}table[data-v-1844f920]{width:100%;text-align:center}tr[data-v-1844f920]{line-height:135%}.table[data-v-41065424]{display:table;width:100%}.table .cyborg[data-v-41065424],.table .header[data-v-41065424],.table .mech[data-v-41065424]{display:table-row;font-weight:700;width:20%}.table .cyborg .header-item[data-v-41065424],.table .cyborg .item[data-v-41065424],.table .header .header-item[data-v-41065424],.table .header .item[data-v-41065424],.table .mech .header-item[data-v-41065424],.table .mech .item[data-v-41065424]{display:table-cell;padding:1px;vertical-align:middle;font-weight:400}.center[data-v-41065424]{text-align:center}.value-setting[data-v-b23b384c]{width:5em;display:inline-block;text-align:center}table[data-v-f45f2cac]{width:100%}table.queue-list td[data-v-f45f2cac]{padding:.2em}table.queue-list td.action[data-v-f45f2cac],table.queue-list td.name[data-v-f45f2cac]{width:1%;white-space:nowrap}.vui-progress[data-v-f45f2cac]{width:100%}.bodyscanner[data-v-130b946b]{display:table;width:100%}.bodyscanner .header[data-v-130b946b]{display:table-row}.bodyscanner .header .header-item[data-v-130b946b],.bodyscanner .header .item[data-v-130b946b]{display:table-cell;padding:1px;vertical-align:middle}.bodyscanner .column[data-v-130b946b]{float:left;width:45%;margin:1%;padding:10px;outline-style:ridge;outline-color:#000;background-color:rgba(0,0,0,.4);height:500px;overflow:auto}.bodyscanner .row[data-v-130b946b]:after{content:"";display:table;clear:both}.left[data-v-130b946b]{text-align:left}.center[data-v-130b946b]{text-align:center}.right[data-v-130b946b]{text-align:right}table .injury[data-v-130b946b]{border-spacing:20px 0}td[data-v-130b946b],th[data-v-130b946b]{text-align:center}.column[data-v-3783600c]{float:left;width:45%;margin:1%;padding:10px;outline-style:ridge;outline-color:#000;background-color:rgba(0,0,0,.4);height:500px;overflow:auto}.columnHolder[data-v-3783600c]:after{content:"";display:block;height:0;overflow:hidden;clear:both}.text[data-v-3783600c]{color:#b99d71}.float .button[data-v-3783600c]{float:left;padding-left:5px}td .shifted[data-v-3783600c]{padding-left:5px}[data-v-2a491020]{text-transform:capitalize}.tileRow[data-v-3e8a25e7]{line-height:1em;cursor:pointer}.tileRow .tile[data-v-3e8a25e7]{height:3em;width:3em;padding:.5em;display:inline-block;vertical-align:bottom}.tileRow .tile .piece[data-v-3e8a25e7]{font-size:3em;line-height:1em;text-align:center;-ms-user-select:none;user-select:none}.tileRow .tile .piece.ghost[data-v-3e8a25e7]{opacity:.6}.tileRow .tile .piece.ghost.sel[data-v-3e8a25e7]{text-shadow:none}.tileRow .tile .piece.sel[data-v-3e8a25e7]{text-shadow:2px 0 10px #5353ff}.tileRow .tile .piece.black[data-v-3e8a25e7]{color:#000}.tileRow .tile .piece.red[data-v-3e8a25e7]{color:red}.tileRow .tile.w[data-v-3e8a25e7]{background-color:#6cf}.tileRow .tile.w.sel[data-v-3e8a25e7]{background-color:#a5ccff}.tileRow .tile.b[data-v-3e8a25e7]{background-color:#3a3a3d}.tileRow .tile.b.sel[data-v-3e8a25e7]{background-color:#4c3a3d}table[data-v-70766bea]{width:100%}table td[data-v-70766bea],table th[data-v-70766bea]{text-align:center;width:auto}table td.action[data-v-70766bea],table th.action[data-v-70766bea]{width:1%;white-space:nowrap}table th[data-v-70766bea]{font-weight:700}.tagselector[data-v-70766bea]{display:-ms-flexbox;display:flex}input[data-v-c4dbe0aa],textarea[data-v-c4dbe0aa]{width:100%;vertical-align:top}textarea[data-v-c4dbe0aa]{height:3em}table[data-v-8bcc2668]{width:100%}table th[data-v-8bcc2668]{font-weight:700}table td[data-v-8bcc2668],table th[data-v-8bcc2668]{text-align:center}.copylabel[data-v-927b9430]{display:inline-block;width:auto}.copyBlock[data-v-927b9430]{display:inline-block}textarea[data-v-19ca9807]{height:6em}.photos[data-v-c51ad1c4]{display:inline-block;position:absolute;right:0}.photos [data-v-c51ad1c4]{height:64px;-ms-interpolation-mode:nearest-neighbor;image-rendering:crisp-edges}.bottombuttons[data-v-c51ad1c4]{margin-top:8px}.bottombuttons .button[data-v-c51ad1c4]{margin-right:6px}.newrecord[data-v-df4093f4]{margin-top:6px}.logout[data-v-a1e2a0dc]{margin-right:0;margin-left:auto}div.incidents[data-v-c7772da2]{background-color:hsla(0,0%,50.2%,.2);padding:4px}.modular[data-v-61a5d2f6]{font-family:arial,sans-serif;border-collapse:collapse}.modular td[data-v-61a5d2f6],.modular th[data-v-61a5d2f6]{border:1px solid #ddd;text-align:left;padding:8px}.modular td[data-v-61a5d2f6]{text-align:center}.other td[data-v-61a5d2f6]{padding:5px}.right[data-v-61a5d2f6]{text-align:right}.active_energy[data-v-61a5d2f6]{display:contents}div.item[data-v-68f8b60e]{display:table-row}.itemContent[data-v-68f8b60e],.itemLabel[data-v-68f8b60e]{display:table-cell;width:10%}.itemLabel[data-v-68f8b60e]{padding-right:8px;width:4%;vertical-align:top}div[data-v-b2030120]{display:table;width:100%}div[data-v-8b39c97e]{display:inline-block}input[data-v-8b39c97e]{text-align:center}div[data-v-1c07adff]{display:inline-block}input[data-v-1c07adff]{text-align:center}input[type=range][data-v-1c07adff]{width:100%;border:none}input[type=range][data-v-1c07adff]:focus{outline:none}input[type=range][data-v-1c07adff]::-ms-track{width:100%;height:8.4px;cursor:pointer;background:rgba(0,0,0,0);border-color:rgba(0,0,0,0);border-width:16px 0;color:rgba(0,0,0,0)}input[type=range][data-v-1c07adff]::-ms-fill-lower{background:#2a6495;border:.2px solid #010101;border-radius:2.6px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}input[type=range][data-v-1c07adff]::-ms-fill-upper{background:#3071a9;border:.2px solid #010101;border-radius:2.6px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}input[type=range][data-v-1c07adff]::-ms-thumb{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d;border:1px solid #000;height:16px;width:8px;border-radius:2px;background:#fff;cursor:pointer}input[type=range][data-v-1c07adff]:focus::-ms-fill-lower{background:#3071a9}input[type=range][data-v-1c07adff]:focus::-ms-fill-upper{background:#367ebd}.item[data-v-f8e75faa]{width:100%}.itemContent[data-v-f8e75faa],.itemLabel[data-v-f8e75faa]{display:inline-block}.itemLabel[data-v-f8e75faa]{width:30%;vertical-align:top}.displayBar[data-v-041d7f1a]{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBar.good[data-v-041d7f1a]{border:1px solid #4f7529}.displayBar.average[data-v-041d7f1a]{border:1px solid #cd6500}.displayBar.bad[data-v-041d7f1a]{border:1px solid #e00}.displayBar.highlight[data-v-041d7f1a]{border:1px solid #8ba5c4}.displayBarFill[data-v-041d7f1a]{line-height:1em;white-space:nowrap;overflow:visible;text-align:left}.displayBarFill span[data-v-041d7f1a]{vertical-align:middle;margin-left:2px}.displayBarFill.good[data-v-041d7f1a]{color:#fff;background:#4f7529}.displayBarFill.average[data-v-041d7f1a]{color:#fff;background:#cd6500}.displayBarFill.bad[data-v-041d7f1a]{color:#fff;background:#e00}.displayBarFill.highlight[data-v-041d7f1a]{color:#fff;background:#8ba5c4}span:hover div[data-v-4ea2a2b3]{display:inline-block}span div[data-v-4ea2a2b3]{margin-top:-5px;margin-left:4px;padding:3px;display:none;position:absolute} \ No newline at end of file diff --git a/vueui/dist/app.js b/vueui/dist/app.js index 473a13c8086..fabfbc0b046 100644 --- a/vueui/dist/app.js +++ b/vueui/dist/app.js @@ -1,10 +1,10 @@ -(function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)})({0:function(e,t,n){e.exports=n("56d7")},"00b4":function(e,t,n){"use strict";n("ac1f");var i=n("23e7"),r=n("861d"),s=function(){var e=!1,t=/[ac]/;return t.exec=function(){return e=!0,/./.exec.apply(this,arguments)},!0===t.test("abc")&&e}(),a=/./.test;i({target:"RegExp",proto:!0,forced:!s},{test:function(e){if("function"!==typeof this.exec)return a.call(this,e);var t=this.exec(e);if(null!==t&&!r(t))throw new Error("RegExp exec method returned something other than an Object or null");return!!t}})},"00ee":function(e,t,n){var i=n("b622"),r=i("toStringTag"),s={};s[r]="z",e.exports="[object z]"===String(s)},"00fd":function(e,t,n){var i=n("9e69"),r=Object.prototype,s=r.hasOwnProperty,a=r.toString,o=i?i.toStringTag:void 0;function c(e){var t=s.call(e,o),n=e[o];try{e[o]=void 0;var i=!0}catch(c){}var r=a.call(e);return i&&(t?e[o]=n:delete e[o]),r}e.exports=c},"019f":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Hard drive:"}},[n("vui-progress",{staticClass:"vui-progress",class:{good:!e.lowHardDrive,average:e.lowHardDrive},attrs:{max:e.s.disk_size,value:e.s.disk_used}},[e._v(e._s(e.s.disk_used)+" GQ / "+e._s(e.s.disk_size)+" GQ")])],1)],1),e.s.queue_size?[n("h2",[e._v("Queue")]),n("table",{staticClass:"queue-list"},[e._m(0),e._l(e.queue,(function(t){return n("tr",{key:t.filename},[n("td",{staticClass:"name"},[e._v(e._s(t.filename))]),n("td",[n("vui-progress",{staticClass:"vui-progress",attrs:{max:t.size,value:t.progress}},[e._v(e._s(t.progress.toFixed(2))+" GQ / "+e._s(t.size)+" GQ")])],1),n("td",{staticClass:"action"},[n("vui-button",{attrs:{params:{cancel:t.filename}}},[e._v("Cancel")])],1)])}))],2)]:e._e(),n("h2",[e._v("Available Programs")]),n("vui-input-search",{staticStyle:{float:"right"},attrs:{input:e.unrestrictedPrograms,keys:["name","filename","desc"],autofocus:""},model:{value:e.search_results,callback:function(t){e.search_results=t},expression:"search_results"}}),n("vui-group",[e._l(e.search_results,(function(t){return[n("vui-group-item",{key:t.filename,attrs:{label:"Program name:"}},[n("b",[e._v(e._s(t.name))])]),n("vui-group-item",{key:t.filename,attrs:{label:"File name:"}},[e._v(e._s(t.filename)+" ("+e._s(t.size)+" GQ)")]),n("vui-group-item",{key:t.filename,attrs:{label:"Description:"}},[e._v(e._s(t.desc))]),n("vui-group-item",{key:t.filename,attrs:{label:"File controls:"}},[n("vui-button",{class:{danger:!e.canDownload(t)},attrs:{params:{download:t.filename}}},[e._v("Download")])],1),n("td",{key:t.filename,attrs:{colspan:"2"}},[n("hr")])]}))],2)],2)},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("th",[e._v("Name")]),n("th",[e._v("Progress")]),n("th",[e._v("Action")])])}];n("a4d3"),n("e01a"),n("d28b"),n("4de4"),n("a630"),n("e260"),n("d81d"),n("fb6a"),n("b0c0"),n("4fad"),n("d3b7"),n("25f0"),n("3ca3"),n("ddb0");function s(e,t){return u(e)||l(e,t)||o(e,t)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){if(e){if("string"===typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n.8},queue:function(){var e=this;return Object.entries(this.s.queue).map((function(t){var n=s(t,2),i=n[0],r=n[1],a=e.s.available[i];return a.progress=r,a.filename=i,a}))}},methods:{canDownload:function(e){return!(e.size+this.s.queue_size+this.s.disk_used>this.s.disk_size)}}},h=d,f=(n("8b1f"),n("2877")),p=Object(f["a"])(h,i,r,!1,null,"f45f2cac",null);t["default"]=p.exports},"025e":function(e,t,n){"use strict";n.d(t,"b",(function(){return c})),n.d(t,"c",(function(){return h}));n("99af"),n("c975"),n("a15b"),n("13d5"),n("fb6a"),n("cca6"),n("d3b7"),n("ac1f"),n("25f0"),n("1276");var i=n("c0d6"),r=function(){return Math.random().toString(36).substring(13)};function s(e,t){var n=[];for(var i in t)if(Array.isArray(t[i]))for(var r in t[i])n.push(encodeURIComponent(i)+"="+encodeURIComponent(r));else n.push(encodeURIComponent(i)+"="+encodeURIComponent(t[i]));var s=e+"?"+n.join("&");if(s.indexOf("byond://")>=0)window.location.href=s;else{var a=new XMLHttpRequest;a.open("GET",s,!0),a.send()}}function a(e,t,n){var i="__bycallback"+r();window[i]=n,s(e,Object.assign({},t,{callback:i}))}function o(e){s("",e)}function c(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n={src:i["a"].state.uiref,vueuihrefjson:JSON.stringify(e)};t&&(n["vueuistateupdate"]=i["a"].getStatePushDataString()),o(n)}function l(e,t){return t.split(".").reduce((function(e,t){return e[t]}),e)}var u=36e3,d=600;function h(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=t?i["a"].state.roundstart_hour:0,r=Math.floor((e/u+n)%24),s=Math.floor(e%u/d);return"".concat(("0"+r).slice(-2),":").concat(("0"+s).slice(-2))}t["a"]={sendRaw:s,sendRawWithCallback:a,sendToTopicRaw:o,sendToTopic:c,dotNotationRead:l,worldtime2text:h}},"0261":function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("8eb5"),a=Math.abs,o=Math.exp,c=Math.E,l=r((function(){return-2e-17!=Math.sinh(-2e-17)}));i({target:"Math",stat:!0,forced:l},{sinh:function(e){return a(e=+e)<1?(s(e)-s(-e))/2:(o(e-1)-o(-e-1))*(c/2)}})},"0366":function(e,t,n){var i=n("1c0b");e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}}},"0481":function(e,t,n){"use strict";var i=n("23e7"),r=n("a2bf"),s=n("7b0b"),a=n("50c4"),o=n("a691"),c=n("65f0");i({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:void 0,t=s(this),n=a(t.length),i=c(t,0);return i.length=r(i,t,t,n,0,void 0===e?1:o(e)),i}})},"04d3":function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("blink")},{blink:function(){return r(this,"blink","","")}})},"050e":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Jammer Level:")]),n("div",[n("vui-button",{class:{selected:1==e.active},attrs:{params:{set_active:1}}},[e._v("Block All")])],1),n("div",[n("vui-button",{class:{selected:2==e.active},attrs:{params:{set_active:2}}},[e._v("Block Synthetics")])],1),n("div",[n("vui-button",{class:{selected:-1==e.active},attrs:{params:{set_active:-1}}},[e._v("Block Nothing")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"0519":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{staticStyle:{clear:"both",margin:"auto",width:"20em"}},[e._l([5,10,20,30,40],(function(t){return n("vui-button",{key:e.amount-e.button-t,class:{selected:e.state.amount==t},attrs:{icon:"cog",params:{amount:t}}},[e._v(e._s(t))])})),n("br"),n("br"),n("div",{staticStyle:{"text-align":"center"}},[n("vui-input-numeric",{attrs:{width:"2.5em","button-count":2,min:1,max:e.state.beakerMaxVolume||120},on:{input:function(t){return e.s({amount:e.state.amount})}},model:{value:e.state.amount,callback:function(t){e.$set(e.state,"amount",t)},expression:"state.amount"}})],1)],2),n("div",{staticStyle:{clear:"both"}}),n("div",{staticStyle:{float:"left",width:"100%"}},[e.state.chemicals.length?n("div",e._l(e.state.chemicals,(function(t){return n("vui-button",{key:t-e.btn,staticClass:"fixedLeftWide",attrs:{icon:"arrow-alt-circle-down",params:{dispense:t.label}}},[e._v(e._s(t.label)+" ("+e._s(t.amount)+")")])})),1):n("span",{staticClass:"bad"},[e._v("No cartridges installed!")])]),n("div",{staticStyle:{clear:"both"}}),n("vui-button",{class:e.state.isBeakerLoaded&&e.disabled,staticStyle:{float:"right"},attrs:{icon:"eject",params:{ejectBeaker:1}}},[e._v("Eject "+e._s(e.state.glass?"Glass":"Beaker"))]),n("div",{staticClass:"statusDisplay",staticStyle:{clear:"both","min-height":"180px"}},[e.state.isBeakerLoaded?n("div",[n("b",[e._v("Volume: "+e._s(e.state.beakerCurrentVolume)+" / "+e._s(e.state.beakerMaxVolume))]),n("br"),e.state.beakerContents.length?n("div",e._l(e.state.beakerContents,(function(t){return n("span",{key:t-e.amt,staticClass:"highlight"},[e._v(e._s(e.u(t.volume))+" of "+e._s(t.name)),n("br")])})),0):n("span",{staticClass:"bad"},[e._v(e._s(e.state.glass?"Glass":"Beaker")+" is empty.")])]):n("div",[n("span",{staticClass:"average"},[n("i",[e._v("No "+e._s(e.state.glass?"glass":"beaker")+" loaded.")])])])])],1)},r=[],s=n("025e"),a={data:function(){return this.$root.$data},methods:{u:function(e){return"".concat(e,1==e?" unit":" units")},s:function(e){s["a"].sendToTopic(e)}}},o=a,c=(n("16ae"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"60faaeb6",null);t["default"]=l.exports},"0538":function(e,t,n){"use strict";var i=n("1c0b"),r=n("861d"),s=[].slice,a={},o=function(e,t,n){if(!(t in a)){for(var i=[],r=0;r1&&o(c,"")>-1&&(n=RegExp(this.source,i.replace.call(a(this),"g","")),i.replace.call(e.slice(c.index),n,(function(){for(var e=1;ec.index&&this.lastIndex--}return c},s||(RegExp.prototype.test=function(e){var t=i.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t}))})),ace.define("ace/lib/es5-shim",["require","exports","module"],(function(e,t,n){function i(){}Function.prototype.bind||(Function.prototype.bind=function(e){var t=this;if("function"!=typeof t)throw new TypeError("Function.prototype.bind called on incompatible "+t);var n=h.call(arguments,1),r=function(){if(this instanceof r){var i=t.apply(this,n.concat(h.call(arguments)));return Object(i)===i?i:this}return t.apply(e,n.concat(h.call(arguments)))};return t.prototype&&(i.prototype=t.prototype,r.prototype=new i,i.prototype=null),r});var r,s,a,o,c,l=Function.prototype.call,u=Array.prototype,d=Object.prototype,h=u.slice,f=l.bind(d.toString),p=l.bind(d.hasOwnProperty);if((c=p(d,"__defineGetter__"))&&(r=l.bind(d.__defineGetter__),s=l.bind(d.__defineSetter__),a=l.bind(d.__lookupGetter__),o=l.bind(d.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t,n=[];if(n.splice.apply(n,e(20)),n.splice.apply(n,e(26)),t=n.length,n.splice(5,0,"XXX"),n.length,t+1==n.length)return!0}()){var g=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?g.apply(this,[void 0===e?0:e,void 0===t?this.length-e:t].concat(h.call(arguments,2))):[]}}else Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):void 0==e?e=0:e<0&&(e=Math.max(n+e,0)),e+to)for(d=l;d--;)this[c+d]=this[o+d];if(s&&e===u)this.length=u,this.push.apply(this,r);else for(this.length=u+s,d=0;d>>0;if("[object Function]"!=f(e))throw new TypeError;while(++r>>0,r=Array(i),s=arguments[1];if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");for(var a=0;a>>0,s=[],a=arguments[1];if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");for(var o=0;o>>0,r=arguments[1];if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");for(var s=0;s>>0,r=arguments[1];if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");for(var s=0;s>>0;if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");if(!i&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var r,s=0;if(arguments.length>=2)r=arguments[1];else do{if(s in n){r=n[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(1);for(;s>>0;if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");if(!i&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var r,s=i-1;if(arguments.length>=2)r=arguments[1];else do{if(s in n){r=n[s--];break}if(--s<0)throw new TypeError("reduceRight of empty array with no initial value")}while(1);do{s in this&&(r=e.call(void 0,r,n[s],s,t))}while(s--);return r}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(e){var t=b&&"[object String]"==f(this)?this.split(""):O(this),n=t.length>>>0;if(!n)return-1;var i=0;for(arguments.length>1&&(i=R(arguments[1])),i=i>=0?i:Math.max(0,n+i);i>>0;if(!n)return-1;var i=n-1;for(arguments.length>1&&(i=Math.min(i,R(arguments[1]))),i=i>=0?i:n-Math.abs(i);i>=0;i--)if(i in t&&e===t[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(e){return e.__proto__||(e.constructor?e.constructor.prototype:d)}),!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(e,t){if("object"!=typeof e&&"function"!=typeof e||null===e)throw new TypeError(y+e);if(p(e,t)){var n;if(n={enumerable:!0,configurable:!0},c){var i=e.__proto__;e.__proto__=d;var r=a(e,t),s=o(e,t);if(e.__proto__=i,r||s)return r&&(n.get=r),s&&(n.set=s),n}return n.value=e[t],n}}}(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(e){return Object.keys(e)}),Object.create)||(m=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(e,t){var n;if(null===e)n=m();else{if("object"!=typeof e)throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var i=function(){};i.prototype=e,n=new i,n.__proto__=e}return void 0!==t&&Object.defineProperties(n,t),n});function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}if(Object.defineProperty){var _=w({}),x="undefined"==typeof document||w(document.createElement("div"));if(!_||!x)var k=Object.defineProperty}if(!Object.defineProperty||k){var A="Property description must be an object: ",C="Object.defineProperty called on non-object: ",E="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(e,t,n){if("object"!=typeof e&&"function"!=typeof e||null===e)throw new TypeError(C+e);if("object"!=typeof n&&"function"!=typeof n||null===n)throw new TypeError(A+n);if(k)try{return k.call(Object,e,t,n)}catch(l){}if(p(n,"value"))if(c&&(a(e,t)||o(e,t))){var i=e.__proto__;e.__proto__=d,delete e[t],e[t]=n.value,e.__proto__=i}else e[t]=n.value;else{if(!c)throw new TypeError(E);p(n,"get")&&r(e,t,n.get),p(n,"set")&&s(e,t,n.set)}return e}}Object.defineProperties||(Object.defineProperties=function(e,t){for(var n in t)p(t,n)&&Object.defineProperty(e,n,t[n]);return e}),Object.seal||(Object.seal=function(e){return e}),Object.freeze||(Object.freeze=function(e){return e});try{Object.freeze((function(){}))}catch(M){Object.freeze=function(e){return function(t){return"function"==typeof t?t:e(t)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(e){return e}),Object.isSealed||(Object.isSealed=function(e){return!1}),Object.isFrozen||(Object.isFrozen=function(e){return!1}),Object.isExtensible||(Object.isExtensible=function(e){if(Object(e)===e)throw new TypeError;var t="";while(p(e,t))t+="?";e[t]=!0;var n=p(e,t);return delete e[t],n}),!Object.keys){var S=!0,F=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],$=F.length;for(var T in{toString:null})S=!1;Object.keys=function(e){if("object"!=typeof e&&"function"!=typeof e||null===e)throw new TypeError("Object.keys called on a non-object");var t=[];for(var n in e)p(e,n)&&t.push(n);if(S)for(var i=0,r=$;i0||-1)*Math.floor(Math.abs(e))),e}var O=function(e){if(null==e)throw new TypeError("can't convert "+e+" to object");return Object(e)}})),ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],(function(e,t,n){"use strict";e("./regexp"),e("./es5-shim")})),ace.define("ace/lib/dom",["require","exports","module"],(function(e,t,n){"use strict";var i="http://www.w3.org/1999/xhtml";t.getDocumentHead=function(e){return e||(e=document),e.head||e.getElementsByTagName("head")[0]||e.documentElement},t.createElement=function(e,t){return document.createElementNS?document.createElementNS(t||i,e):document.createElement(e)},t.hasCssClass=function(e,t){var n=(e.className+"").split(/\s+/g);return-1!==n.indexOf(t)},t.addCssClass=function(e,n){t.hasCssClass(e,n)||(e.className+=" "+n)},t.removeCssClass=function(e,t){var n=e.className.split(/\s+/g);while(1){var i=n.indexOf(t);if(-1==i)break;n.splice(i,1)}e.className=n.join(" ")},t.toggleCssClass=function(e,t){var n=e.className.split(/\s+/g),i=!0;while(1){var r=n.indexOf(t);if(-1==r)break;i=!1,n.splice(r,1)}return i&&n.push(t),e.className=n.join(" "),i},t.setCssClass=function(e,n,i){i?t.addCssClass(e,n):t.removeCssClass(e,n)},t.hasCssString=function(e,t){var n,i=0;if(t=t||document,t.createStyleSheet&&(n=t.styleSheets)){while(i=0?parseFloat((r.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((r.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&"Gecko"===window.navigator.product,t.isOldGecko=t.isGecko&&parseInt((r.match(/rv:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&"[object Opera]"==Object.prototype.toString.call(window.opera),t.isWebKit=parseFloat(r.split("WebKit/")[1])||void 0,t.isChrome=parseFloat(r.split(" Chrome/")[1])||void 0,t.isAIR=r.indexOf("AdobeAIR")>=0,t.isIPad=r.indexOf("iPad")>=0,t.isChromeOS=r.indexOf(" CrOS ")>=0,t.isIOS=/iPad|iPhone|iPod/.test(r)&&!window.MSStream,t.isIOS&&(t.isMac=!0)}})),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],(function(e,t,n){"use strict";var i=e("./keys"),r=e("./useragent"),s=null,a=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var i=function(){n.call(e,window.event)};n._wrapper=i,e.attachEvent("on"+t,i)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return"dblclick"==e.type?0:"contextmenu"==e.type||r.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,i){function r(e){n&&n(e),i&&i(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",r,!0),t.removeListener(document,"dragstart",r,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",r,!0),t.addListener(document,"dragstart",r,!0),r},t.addTouchMoveListener=function(e,n){var i,r;t.addListener(e,"touchstart",(function(e){var t=e.touches,n=t[0];i=n.clientX,r=n.clientY})),t.addListener(e,"touchmove",(function(e){var t=e.touches;if(!(t.length>1)){var s=t[0];e.wheelX=i-s.clientX,e.wheelY=r-s.clientY,i=s.clientX,r=s.clientY,n(e)}}))},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",(function(e){var t=8;void 0!==e.wheelDeltaX?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)})):"onwheel"in e?t.addListener(e,"wheel",(function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=5*(e.deltaX||0),e.wheelY=5*(e.deltaY||0);break}n(e)})):t.addListener(e,"DOMMouseScroll",(function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=5*(e.detail||0),e.wheelY=0):(e.wheelX=0,e.wheelY=5*(e.detail||0)),n(e)}))},t.addMultiMouseDownListener=function(e,n,i,s){var a,o,c,l=0,u={2:"dblclick",3:"tripleclick",4:"quadclick"};function d(e){if(0!==t.getButton(e)?l=0:e.detail>1?(l++,l>4&&(l=1)):l=1,r.isIE){var d=Math.abs(e.clientX-a)>5||Math.abs(e.clientY-o)>5;c&&!d||(l=1),c&&clearTimeout(c),c=setTimeout((function(){c=null}),n[l-1]||600),1==l&&(a=e.clientX,o=e.clientY)}if(e._clicks=l,i[s]("mousedown",e),l>4)l=0;else if(l>1)return i[s](u[l],e)}function h(e){l=2,c&&clearTimeout(c),c=setTimeout((function(){c=null}),n[l-1]||600),i[s]("mousedown",e),i[s](u[l],e)}Array.isArray(e)||(e=[e]),e.forEach((function(e){t.addListener(e,"mousedown",d),r.isOldIE&&t.addListener(e,"dblclick",h)}))};var o=r.isMac&&r.isOpera&&!("KeyboardEvent"in window)?function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)}:function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)};function c(e,t,n){var c=o(t);if(!r.isMac&&s){if(t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(c|=8),s.altGr){if(3==(3&c))return;s.altGr=0}if(18===n||17===n){var l="location"in t?t.location:t.keyLocation;if(17===n&&1===l)1==s[n]&&(a=t.timeStamp);else if(18===n&&3===c&&2===l){var u=t.timeStamp-a;u<50&&(s.altGr=!0)}}}if(n in i.MODIFIER_KEYS&&(n=-1),8&c&&n>=91&&n<=93&&(n=-1),!c&&13===n){l="location"in t?t.location:t.keyLocation;if(3===l&&(e(t,c,-n),t.defaultPrevented))return}if(r.isChromeOS&&8&c){if(e(t,c,n),t.defaultPrevented)return;c&=-9}return!!(c||n in i.FUNCTION_KEYS||n in i.PRINTABLE_KEYS)&&e(t,c,n)}function l(){s=Object.create(null)}if(t.getModifierString=function(e){return i.KEY_MODS[o(e)]},t.addCommandKeyListener=function(e,n){var i=t.addListener;if(r.isOldGecko||r.isOpera&&!("KeyboardEvent"in window)){var a=null;i(e,"keydown",(function(e){a=e.keyCode})),i(e,"keypress",(function(e){return c(n,e,a)}))}else{var o=null;i(e,"keydown",(function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=c(n,e,e.keyCode);return o=e.defaultPrevented,t})),i(e,"keypress",(function(e){o&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),o=null)})),i(e,"keyup",(function(e){s[e.keyCode]=null})),s||(l(),i(window,"focus",l))}},"object"==typeof window&&window.postMessage&&!r.isOldIE){var u=1;t.nextTick=function(e,n){n=n||window;var i="zero-timeout-message-"+u;t.addListener(n,"message",(function r(s){s.data==i&&(t.stopPropagation(s),t.removeListener(n,"message",r),e())})),n.postMessage(i,"*")}}t.nextFrame="object"==typeof window&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}})),ace.define("ace/lib/lang",["require","exports","module"],(function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0)1&t&&(n+=e),(t>>=1)&&(e+=e);return n};var i=/^\s\s*/,r=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(i,"")},t.stringTrimRight=function(e){return e.replace(r,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){for(var t=[],n=0,i=e.length;nd.length?e=e.substr(9):e.substr(0,4)==d.substr(0,4)?e=e.substr(4,e.length-d.length+1):e.charAt(e.length-1)==d.charAt(0)&&(e=e.slice(0,-1)),e==d.charAt(0)||e.charAt(e.length-1)==d.charAt(0)&&(e=e.slice(0,-1)),e&&t.onTextInput(e)),h&&(h=!1),E&&(E=!1))},F=function(e){if(!g){var t=n.value;S(t),x()}},$=function(e,t,n){var i=e.clipboardData||window.clipboardData;if(i&&!l){var r=u||n?"Text":"text/plain";try{return t?!1!==i.setData(r,t):i.getData(r)}catch(e){if(!n)return $(e,t,!0)}}},T=function(e,s){var a=t.getCopyText();if(!a)return i.preventDefault(e);$(e,a)?(r.isIOS&&(f=s,n.value="\n aa"+a+"a a\n",n.setSelectionRange(4,4+a.length),h={value:a}),s?t.onCut():t.onCopy(),r.isIOS||i.preventDefault(e)):(h=!0,n.value=a,n.select(),setTimeout((function(){h=!1,x(),_(),s?t.onCut():t.onCopy()})))},L=function(e){T(e,!0)},D=function(e){T(e,!1)},B=function(e){var s=$(e);"string"==typeof s?(s&&t.onPaste(s,e),r.isIE&&setTimeout(_),i.preventDefault(e)):(n.value="",p=!0)};i.addCommandKeyListener(n,t.onCommandKey.bind(t)),i.addListener(n,"select",A),i.addListener(n,"input",F),i.addListener(n,"cut",L),i.addListener(n,"copy",D),i.addListener(n,"paste",B);var R,O=function(e){g||!t.onCompositionStart||t.$readOnly||(g={},g.canUndo=t.session.$undoManager,t.onCompositionStart(),setTimeout(M,0),t.on("mousedown",j),g.canUndo&&!t.selection.isEmpty()&&(t.insert(""),t.session.markUndoGroup(),t.selection.clearSelection()),t.session.markUndoGroup())},M=function(){if(g&&t.onCompositionUpdate&&!t.$readOnly){var e=n.value.replace(/\x01/g,"");if(g.lastValue!==e&&(t.onCompositionUpdate(e),g.lastValue&&t.undo(),g.canUndo&&(g.lastValue=e),g.lastValue)){var i=t.selection.getRange();t.insert(g.lastValue),t.session.markUndoGroup(),g.range=t.selection.getRange(),t.selection.setRange(i),t.selection.clearSelection()}}},j=function(e){if(t.onCompositionEnd&&!t.$readOnly){var i=g;g=!1;var s=setTimeout((function(){s=null;var e=n.value.replace(/\x01/g,"");g||(e==i.lastValue?x():!i.lastValue&&e&&(x(),S(e)))}));C=function(e){return s&&clearTimeout(s),e=e.replace(/\x01/g,""),e==i.lastValue?"":(i.lastValue&&s&&t.undo(),e)},t.onCompositionEnd(),t.removeListener("mousedown",j),"compositionend"==e.type&&i.range&&t.selection.setRange(i.range);var a=!!r.isChrome&&r.isChrome>=53||!!r.isWebKit&&r.isWebKit>=603;a&&F()}},I=a.delayedCall(M,50);function P(){clearTimeout(R),R=setTimeout((function(){m&&(n.style.cssText=m,m=""),null==t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=!0,t.renderer.$moveTextAreaToCursor())}),0)}i.addListener(n,"compositionstart",O),r.isGecko?i.addListener(n,"text",(function(){I.schedule()})):(i.addListener(n,"keyup",(function(){I.schedule()})),i.addListener(n,"keydown",(function(){I.schedule()}))),i.addListener(n,"compositionend",j),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){E=!0,_(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,a){m||(m=n.style.cssText),n.style.cssText=(a?"z-index:100000;":"")+"height:"+n.style.height+";"+(r.isIE?"opacity:0.1;":"");var o=t.container.getBoundingClientRect(),c=s.computedStyle(t.container),l=o.top+(parseInt(c.borderTopWidth)||0),u=o.left+(parseInt(o.borderLeftWidth)||0),d=o.bottom-l-n.clientHeight-2,h=function(e){n.style.left=e.clientX-u-2+"px",n.style.top=Math.min(e.clientY-l-2,d)+"px"};h(e),"mousedown"==e.type&&(t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout(R),r.isWin&&i.capture(t.container,h,P))},this.onContextMenuClose=P;var N=function(e){t.textInput.onContextMenu(e),P()};if(i.addListener(n,"mouseup",N),i.addListener(n,"mousedown",(function(e){e.preventDefault(),P()})),i.addListener(t.renderer.scroller,"contextmenu",N),i.addListener(n,"contextmenu",N),r.isIOS){var W=null,H=!1;e.addEventListener("keydown",(function(e){W&&clearTimeout(W),H=!0})),e.addEventListener("keyup",(function(e){W=setTimeout((function(){H=!1}),100)}));var V=function(e){if(document.activeElement===n&&!H){if(f)return setTimeout((function(){f=!1}),100);var i=n.selectionStart,r=n.selectionEnd;if(n.setSelectionRange(4,5),i==r)switch(i){case 0:t.onCommandKey(null,0,o.up);break;case 1:t.onCommandKey(null,0,o.home);break;case 2:t.onCommandKey(null,c.option,o.left);break;case 4:t.onCommandKey(null,0,o.left);break;case 5:t.onCommandKey(null,0,o.right);break;case 7:t.onCommandKey(null,c.option,o.right);break;case 8:t.onCommandKey(null,0,o.end);break;case 9:t.onCommandKey(null,0,o.down);break}else{switch(r){case 6:t.onCommandKey(null,c.shift,o.right);break;case 7:t.onCommandKey(null,c.shift|c.option,o.right);break;case 8:t.onCommandKey(null,c.shift,o.end);break;case 9:t.onCommandKey(null,c.shift,o.down);break}switch(i){case 0:t.onCommandKey(null,c.shift,o.up);break;case 1:t.onCommandKey(null,c.shift,o.home);break;case 2:t.onCommandKey(null,c.shift|c.option,o.left);break;case 3:t.onCommandKey(null,c.shift,o.left);break}}}};document.addEventListener("selectionchange",V),t.on("destroy",(function(){document.removeEventListener("selectionchange",V)}))}};t.TextInput=d})),ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/keyboard/textinput_ios"],(function(e,t,n){"use strict";var i=e("../lib/event"),r=e("../lib/useragent"),s=e("../lib/dom"),a=e("../lib/lang"),o=r.isChrome<18,c=r.isIE,l=e("./textinput_ios").TextInput,u=function(e,t){if(r.isIOS)return l.call(this,e,t);var n=s.createElement("textarea");n.className="ace_text-input",n.setAttribute("wrap","off"),n.setAttribute("autocorrect","off"),n.setAttribute("autocapitalize","off"),n.setAttribute("spellcheck",!1),n.style.opacity="0",e.insertBefore(n,e.firstChild);var u="\u2028\u2028",d=!1,h=!1,f=!1,p="",g=!0;try{var m=document.activeElement===n}catch(P){}i.addListener(n,"blur",(function(e){t.onBlur(e),m=!1})),i.addListener(n,"focus",(function(e){m=!0,t.onFocus(e),y()})),this.focus=function(){if(p)return n.focus();var e=n.style.top;n.style.position="fixed",n.style.top="0px",n.focus(),setTimeout((function(){n.style.position="","0px"==n.style.top&&(n.style.top=e)}),0)},this.blur=function(){n.blur()},this.isFocused=function(){return m};var v=a.delayedCall((function(){m&&y(g)})),b=a.delayedCall((function(){f||(n.value=u,m&&y())}));function y(e){if(!f){if(f=!0,k)var t=0,i=e?0:n.value.length-1;else t=e?2:1,i=2;try{n.setSelectionRange(t,i)}catch(P){}f=!1}}function w(){f||(n.value=u,r.isWebKit&&b.schedule())}r.isWebKit||t.addEventListener("changeSelection",(function(){t.selection.isEmpty()!=g&&(g=!g,v.schedule())})),w(),m&&t.onFocus();var _=function(e){return 0===e.selectionStart&&e.selectionEnd===e.value.length},x=function(e){d?d=!1:_(n)?(t.selectAll(),y()):k&&y(t.selection.isEmpty())},k=null;this.setInputHandler=function(e){k=e},this.getInputHandler=function(){return k};var A=!1,C=function(e){k&&(e=k(e),k=null),h?(y(),e&&t.onPaste(e),h=!1):e==u.charAt(0)?A?t.execCommand("del",{source:"ace"}):t.execCommand("backspace",{source:"ace"}):(e.substring(0,2)==u?e=e.substr(2):e.charAt(0)==u.charAt(0)?e=e.substr(1):e.charAt(e.length-1)==u.charAt(0)&&(e=e.slice(0,-1)),e.charAt(e.length-1)==u.charAt(0)&&(e=e.slice(0,-1)),e&&t.onTextInput(e)),A&&(A=!1)},E=function(e){if(!f){var t=n.value;C(t),w()}},S=function(e,t,n){var i=e.clipboardData||window.clipboardData;if(i&&!o){var r=c||n?"Text":"text/plain";try{return t?!1!==i.setData(r,t):i.getData(r)}catch(e){if(!n)return S(e,t,!0)}}},F=function(e,r){var s=t.getCopyText();if(!s)return i.preventDefault(e);S(e,s)?(r?t.onCut():t.onCopy(),i.preventDefault(e)):(d=!0,n.value=s,n.select(),setTimeout((function(){d=!1,w(),y(),r?t.onCut():t.onCopy()})))},$=function(e){F(e,!0)},T=function(e){F(e,!1)},L=function(e){var s=S(e);"string"==typeof s?(s&&t.onPaste(s,e),r.isIE&&setTimeout(y),i.preventDefault(e)):(n.value="",h=!0)};i.addCommandKeyListener(n,t.onCommandKey.bind(t)),i.addListener(n,"select",x),i.addListener(n,"input",E),i.addListener(n,"cut",$),i.addListener(n,"copy",T),i.addListener(n,"paste",L),"oncut"in n&&"oncopy"in n&&"onpaste"in n||i.addListener(e,"keydown",(function(e){if((!r.isMac||e.metaKey)&&e.ctrlKey)switch(e.keyCode){case 67:T(e);break;case 86:L(e);break;case 88:$(e);break}}));var D,B=function(e){f||!t.onCompositionStart||t.$readOnly||(f={},f.canUndo=t.session.$undoManager,t.onCompositionStart(),setTimeout(R,0),t.on("mousedown",O),f.canUndo&&!t.selection.isEmpty()&&(t.insert(""),t.session.markUndoGroup(),t.selection.clearSelection()),t.session.markUndoGroup())},R=function(){if(f&&t.onCompositionUpdate&&!t.$readOnly){var e=n.value.replace(/\u2028/g,"");if(f.lastValue!==e&&(t.onCompositionUpdate(e),f.lastValue&&t.undo(),f.canUndo&&(f.lastValue=e),f.lastValue)){var i=t.selection.getRange();t.insert(f.lastValue),t.session.markUndoGroup(),f.range=t.selection.getRange(),t.selection.setRange(i),t.selection.clearSelection()}}},O=function(e){if(t.onCompositionEnd&&!t.$readOnly){var i=f;f=!1;var s=setTimeout((function(){s=null;var e=n.value.replace(/\u2028/g,"");f||(e==i.lastValue?w():!i.lastValue&&e&&(w(),C(e)))}));k=function(e){return s&&clearTimeout(s),e=e.replace(/\u2028/g,""),e==i.lastValue?"":(i.lastValue&&s&&t.undo(),e)},t.onCompositionEnd(),t.removeListener("mousedown",O),"compositionend"==e.type&&i.range&&t.selection.setRange(i.range);var a=!!r.isChrome&&r.isChrome>=53||!!r.isWebKit&&r.isWebKit>=603;a&&E()}},M=a.delayedCall(R,50);function j(){clearTimeout(D),D=setTimeout((function(){p&&(n.style.cssText=p,p=""),null==t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=!0,t.renderer.$moveTextAreaToCursor())}),0)}i.addListener(n,"compositionstart",B),r.isGecko?i.addListener(n,"text",(function(){M.schedule()})):(i.addListener(n,"keyup",(function(){M.schedule()})),i.addListener(n,"keydown",(function(){M.schedule()}))),i.addListener(n,"compositionend",O),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){A=!0,y(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,a){p||(p=n.style.cssText),n.style.cssText=(a?"z-index:100000;":"")+"height:"+n.style.height+";"+(r.isIE?"opacity:0.1;":"");var o=t.container.getBoundingClientRect(),c=s.computedStyle(t.container),l=o.top+(parseInt(c.borderTopWidth)||0),u=o.left+(parseInt(o.borderLeftWidth)||0),d=o.bottom-l-n.clientHeight-2,h=function(e){n.style.left=e.clientX-u-2+"px",n.style.top=Math.min(e.clientY-l-2,d)+"px"};h(e),"mousedown"==e.type&&(t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout(D),r.isWin&&i.capture(t.container,h,j))},this.onContextMenuClose=j;var I=function(e){t.textInput.onContextMenu(e),j()};i.addListener(n,"mouseup",I),i.addListener(n,"mousedown",(function(e){e.preventDefault(),j()})),i.addListener(t.renderer.scroller,"contextmenu",I),i.addListener(n,"contextmenu",I)};t.TextInput=u})),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],(function(e,t,n){"use strict";e("../lib/dom"),e("../lib/event");var i=e("../lib/useragent"),r=0,s=250;function a(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e)),t.setDefaultHandler("touchmove",this.onTouchMove.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach((function(t){e[t]=this[t]}),this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function o(e,t,n,i){return Math.sqrt(Math.pow(n-e,2)+Math.pow(i-t,2))}function c(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row!=e.end.row-1||e.start.column||e.end.column)n=2*t.row-e.start.row-e.end.row;else var n=t.column-4;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor,s=e.getButton();if(0!==s){var a=r.getSelectionRange(),o=a.isEmpty();return r.$blockScrolling++,(o||1==s)&&r.selection.moveToPosition(n),r.$blockScrolling--,void(2==s&&(r.textInput.onContextMenu(e.domEvent),i.isMozilla||e.preventDefault()))}return this.mousedownEvent.time=Date.now(),!t||r.isFocused()||(r.focus(),!this.$focusTimout||this.$clickSelection||r.inMultiSelectMode)?(this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()):(this.setState("focusWait"),void this.captureMouse(e))},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(t.$blockScrolling++,this.$clickSelection){var i=this.$clickSelection.comparePoint(n);if(-1==i)e=this.$clickSelection.end;else if(1==i)e=this.$clickSelection.start;else{var r=c(this.$clickSelection,n);n=r.cursor,e=r.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,i=n.renderer.screenToTextCoordinates(this.x,this.y),r=n.selection[e](i.row,i.column);if(n.$blockScrolling++,this.$clickSelection){var s=this.$clickSelection.comparePoint(r.start),a=this.$clickSelection.comparePoint(r.end);if(-1==s&&a<=0)t=this.$clickSelection.end,r.end.row==i.row&&r.end.column==i.column||(i=r.start);else if(1==a&&s>=0)t=this.$clickSelection.start,r.start.row==i.row&&r.start.column==i.column||(i=r.end);else if(-1==s&&1==a)i=r.end,t=r.start;else{var o=c(this.$clickSelection,i);i=o.cursor,t=o.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(i),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=o(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>r||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,i=n.session,r=i.getBracketRange(t);r?(r.isEmpty()&&(r.start.column--,r.end.column++),this.setState("select")):(r=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=r,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var i=n.getSelectionRange();i.isMultiLine()&&i.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(i.start.row),this.$clickSelection.end=n.selection.getLineRange(i.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(!e.getAccelKey()){e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=this.editor;this.$lastScroll||(this.$lastScroll={t:0,vx:0,vy:0,allowed:0});var n=this.$lastScroll,i=e.domEvent.timeStamp,r=i-n.t,a=e.wheelX/r,o=e.wheelY/r;r=1&&t.renderer.isScrollableBy(e.wheelX*e.speed,0)&&(l=!0),c<=1&&t.renderer.isScrollableBy(0,e.wheelY*e.speed)&&(l=!0),l)n.allowed=i;else if(i-n.alloweda.session.documentToScreenRow(u.row,u.column))return d()}if(r!=i)if(r=i.text.join("
      "),l.setHtml(r),l.show(),a._signal("showGutterTooltip",l),a.on("mousewheel",d),e.$tooltipFollowsMouse)h(n);else{var f=n.domEvent.target,p=f.getBoundingClientRect(),g=l.getElement().style;g.left=p.right+"px",g.top=p.bottom+"px"}}function d(){t&&(t=clearTimeout(t)),r&&(l.hide(),r=null,a._signal("hideGutterTooltip",l),a.removeEventListener("mousewheel",d))}function h(e){l.setPosition(e.x,e.y)}e.editor.setDefaultHandler("guttermousedown",(function(t){if(a.isFocused()&&0==t.getButton()){var n=o.getRegion(t);if("foldWidgets"!=n){var i=t.getDocumentPosition().row,r=a.session.selection;if(t.getShiftKey())r.selectTo(i,0);else{if(2==t.domEvent.detail)return a.selectAll(),t.preventDefault();e.$clickSelection=a.selection.getLineRange(i)}return e.setState("selectByLines"),e.captureMouse(t),t.preventDefault()}}})),e.editor.setDefaultHandler("guttermousemove",(function(s){var a=s.domEvent.target||s.domEvent.srcElement;if(i.hasCssClass(a,"ace_fold-widget"))return d();r&&e.$tooltipFollowsMouse&&h(s),n=s,t||(t=setTimeout((function(){t=null,n&&!e.isMousePressed?u():d()}),50))})),s.addListener(a.renderer.$gutter,"mouseout",(function(e){n=null,r&&!t&&(t=setTimeout((function(){t=null,d()}),50))})),a.on("changeSession",d)}function c(e){a.call(this,e)}r.inherits(c,a),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,i=window.innerHeight||document.documentElement.clientHeight,r=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+r>n&&(e-=e+r-n),t+s>i&&(t-=20+s),a.prototype.setPosition.call(this,e,t)}}.call(c.prototype),t.GutterHandler=o})),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],(function(e,t,n){"use strict";var i=e("../lib/event"),r=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){i.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){i.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos||(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY)),this.$pos},this.inSelection=function(){if(null!==this.$inSelection)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return i.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=r.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)})),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],(function(e,t,n){"use strict";var i=e("../lib/dom"),r=e("../lib/event"),s=e("../lib/useragent"),a=200,o=200,c=5;function l(e){var t=e.editor,n=i.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var l=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];l.forEach((function(t){e[t]=this[t]}),this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var d,h,f,p,g,m,v,b,y,w,_,x=t.container,k=0;function A(e,n){var i=Date.now(),r=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!w||r||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,w=i,_={x:h,y:f};else{var a=u(_.x,_.y,h,f);a>c?w=null:i-w>=o&&(t.renderer.scrollCursorIntoView(),w=null)}}function C(e,n){var i=Date.now(),r=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,o=t.renderer.scroller.getBoundingClientRect(),c={x:{left:h-o.left,right:o.right-h},y:{top:f-o.top,bottom:o.bottom-f}},l=Math.min(c.x.left,c.x.right),u=Math.min(c.y.top,c.y.bottom),d={row:e.row,column:e.column};l/s<=2&&(d.column+=c.x.left=a&&t.renderer.scrollCursorIntoView(d):y=i:y=null}function E(){var e=m;m=t.renderer.screenToTextCoordinates(h,f),A(m,e),C(m,e)}function S(){g=t.selection.toOrientedRange(),d=t.session.addMarker(g,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(p),E(),p=setInterval(E,20),k=0,r.addListener(document,"mousemove",T)}function F(){clearInterval(p),t.session.removeMarker(d),d=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(g),t.$blockScrolling-=1,t.isFocused()&&!b&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),g=null,m=null,k=0,y=null,w=null,r.removeListener(document,"mousemove",T)}this.onDragStart=function(e){if(this.cancelDrag||!x.draggable){var i=this;return setTimeout((function(){i.startSelect(),i.captureMouse(e)}),0),e.preventDefault()}g=t.getSelectionRange();var r=e.dataTransfer;r.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),r.setDragImage&&r.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),r.clearData(),r.setData("Text",t.session.getTextRange()),b=!0,this.setState("drag")},this.onDragEnd=function(e){if(x.draggable=!1,b=!1,this.setState(null),!t.getReadOnly()){var n=e.dataTransfer.dropEffect;v||"move"!=n||t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(!t.getReadOnly()&&L(e.dataTransfer))return h=e.clientX,f=e.clientY,d||S(),k++,e.dataTransfer.dropEffect=v=D(e),r.preventDefault(e)},this.onDragOver=function(e){if(!t.getReadOnly()&&L(e.dataTransfer))return h=e.clientX,f=e.clientY,d||(S(),k++),null!==$&&($=null),e.dataTransfer.dropEffect=v=D(e),r.preventDefault(e)},this.onDragLeave=function(e){if(k--,k<=0&&d)return F(),v=null,r.preventDefault(e)},this.onDrop=function(e){if(m){var n=e.dataTransfer;if(b)switch(v){case"move":g=g.contains(m.row,m.column)?{start:m,end:m}:t.moveText(g,m);break;case"copy":g=t.moveText(g,m,!0);break}else{var i=n.getData("Text");g={start:m,end:t.session.insert(m,i)},t.focus(),v=null}return F(),r.preventDefault(e)}},r.addListener(x,"dragstart",this.onDragStart.bind(e)),r.addListener(x,"dragend",this.onDragEnd.bind(e)),r.addListener(x,"dragenter",this.onDragEnter.bind(e)),r.addListener(x,"dragover",this.onDragOver.bind(e)),r.addListener(x,"dragleave",this.onDragLeave.bind(e)),r.addListener(x,"drop",this.onDrop.bind(e));var $=null;function T(){null==$&&($=setTimeout((function(){null!=$&&d&&F()}),20))}function L(e){var t=e.types;return!t||Array.prototype.some.call(t,(function(e){return"text/plain"==e||"Text"==e}))}function D(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],i=s.isMac?e.altKey:e.ctrlKey,r="uninitialized";try{r=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var a="none";return i&&t.indexOf(r)>=0?a="copy":n.indexOf(r)>=0?a="move":t.indexOf(r)>=0&&(a="copy"),a}}function u(e,t,n,i){return Math.sqrt(Math.pow(n-e,2)+Math.pow(i-t,2))}(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&"dragReady"==this.state){var n=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if("dragWait"===this.state){n=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(this.$dragEnabled){this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),i=e.getButton(),r=e.domEvent.detail||1;if(1===r&&0===i&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var a=e.domEvent.target||e.domEvent.srcElement;if("unselectable"in a&&(a.unselectable="on"),t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var o=t.container;o.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}}).call(l.prototype),t.DragdropHandler=l})),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],(function(e,t,n){"use strict";var i=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){4===n.readyState&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=i.getDocumentHead(),r=document.createElement("script");r.src=e,n.appendChild(r),r.onload=r.onreadystatechange=function(e,n){!n&&r.readyState&&"loaded"!=r.readyState&&"complete"!=r.readyState||(r=r.onload=r.onreadystatechange=null,n||t())}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}})),ace.define("ace/lib/event_emitter",["require","exports","module"],(function(e,t,n){"use strict";var i={},r=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};i._emit=i._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],i=this._defaultHandlers[e];if(n.length||i){"object"==typeof t&&t||(t={}),t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=r),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var a=0;a1&&(r=n[n.length-2]);var a=c[t+"Path"];return null==a?a=c.basePath:"/"==i&&(t=i=""),a&&"/"!=a.slice(-1)&&(a+="/"),a+t+i+r+this.get("suffix")},t.setModuleUrl=function(e,t){return c.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,i){var r,a;Array.isArray(n)&&(a=n[0],n=n[1]);try{r=e(n)}catch(c){}if(r&&!t.$loading[n])return i&&i(r);if(t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(i),!(t.$loading[n].length>1)){var o=function(){e([n],(function(e){t._emit("load.module",{name:n,module:e});var i=t.$loading[n];t.$loading[n]=null,i.forEach((function(t){t&&t(e)}))}))};if(!t.get("packaged"))return o();s.loadScript(t.moduleUrl(n,a),o)}},l(!0),t.init=l})),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],(function(e,t,n){"use strict";var i=e("../lib/event"),r=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,a=e("./default_gutter_handler").GutterHandler,o=e("./mouse_event").MouseEvent,c=e("./dragdrop_handler").DragdropHandler,l=e("../config"),u=function(e){var t=this;this.editor=e,new s(this),new a(this),new c(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},o=e.renderer.getMouseEventTarget();i.addListener(o,"click",this.onMouseEvent.bind(this,"click")),i.addListener(o,"mousemove",this.onMouseMove.bind(this,"mousemove")),i.addMultiMouseDownListener([o,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),i.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),i.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var l=e.renderer.$gutter;i.addListener(l,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),i.addListener(l,"click",this.onMouseEvent.bind(this,"gutterclick")),i.addListener(l,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),i.addListener(l,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),i.addListener(o,"mousedown",n),i.addListener(l,"mousedown",n),r.isIE&&e.renderer.scrollBarV&&(i.addListener(e.renderer.scrollBarV.element,"mousedown",n),i.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",(function(n){if(!t.state&&!t.$dragDelay&&t.$dragEnabled){var i=e.renderer.screenToTextCoordinates(n.x,n.y),r=e.session.selection.getRange(),s=e.renderer;!r.isEmpty()&&r.insideStart(i.row,i.column)?s.setCursorStyle("default"):s.setCursorStyle("")}}))};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new o(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;n&&n.length&&this.editor._emit(e,new o(t,this.editor))},this.onMouseWheel=function(e,t){var n=new o(t,this.editor);n.speed=2*this.$scrollSpeed,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new o(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,a=function(e){if(e){if(r.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new o(e,s.editor),s.$mouseMoved=!0}},c=function(e){clearInterval(u),l(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",null==n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},l=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(r.isOldIE&&"dblclick"==e.domEvent.type)return setTimeout((function(){c(e)}));s.$onCaptureMouseMove=a,s.releaseMouse=i.capture(this.editor.container,a,c);var u=setInterval(l,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){t&&t.domEvent&&"contextmenu"!=t.domEvent.type||(this.editor.off("nativecontextmenu",e),t&&t.domEvent&&i.stopEvent(t.domEvent))}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(u.prototype),l.defineOptions(u.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:r.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=u})),ace.define("ace/mouse/fold_handler",["require","exports","module"],(function(e,t,n){"use strict";function i(e){e.on("click",(function(t){var n=t.getDocumentPosition(),i=e.session,r=i.getFoldAt(n.row,n.column,1);r&&(t.getAccelKey()?i.removeFold(r):i.expandFold(r),t.stop())})),e.on("gutterclick",(function(t){var n=e.renderer.$gutterLayer.getRegion(t);if("foldWidgets"==n){var i=t.getDocumentPosition().row,r=e.session;r.foldWidgets&&r.foldWidgets[i]&&e.session.onFoldWidgetClick(i,t),e.isFocused()||e.focus(),t.stop()}})),e.on("gutterdblclick",(function(t){var n=e.renderer.$gutterLayer.getRegion(t);if("foldWidgets"==n){var i=t.getDocumentPosition().row,r=e.session,s=r.getParentFoldRangeData(i,!0),a=s.range||s.firstRange;if(a){i=a.start.row;var o=r.getFoldAt(i,r.getLine(i).length,1);o?r.removeFold(o):(r.addFold("...",a),e.renderer.scrollCursorIntoView({row:a.start.row,column:0}))}t.stop()}}))}t.FoldHandler=i})),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],(function(e,t,n){"use strict";var i=e("../lib/keys"),r=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]!=e){while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)}},this.addKeyboardHandler=function(e,t){if(e){"function"!=typeof e||e.handleKeyboard||(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);-1!=n&&this.$handlers.splice(n,1),void 0==t?this.$handlers.push(e):this.$handlers.splice(t,0,e),-1==n&&e.attach&&e.attach(this.$editor)}},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return-1!=t&&(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map((function(n){return n.getStatusText&&n.getStatusText(t,e)||""})).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,i){for(var s,a=!1,o=this.$editor.commands,c=this.$handlers.length;c--;)if(s=this.$handlers[c].handleKeyboard(this.$data,e,t,n,i),s&&s.command&&(a="null"==s.command||o.exec(s.command,this.$editor,s.args,i),a&&i&&-1!=e&&1!=s.passEvent&&1!=s.command.passEvent&&r.stopEvent(i),a))break;return a||-1!=e||(s={command:"insertstring"},a=o.exec("insertstring",this.$editor,t)),a&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),a},this.onCommandKey=function(e,t,n){var r=i.keyCodeToString(n);this.$callKeyboardHandlers(t,r,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s})),ace.define("ace/lib/bidiutil",["require","exports","module"],(function(e,t,n){"use strict";var i=0,r=0,s=!1,a=!1,o=!1,c=[[0,3,0,1,0,0,0],[0,3,0,1,2,2,0],[0,3,0,17,2,0,1],[0,3,5,5,4,1,0],[0,3,21,21,4,0,1],[0,3,5,5,4,2,0]],l=[[2,0,1,1,0,1,0],[2,0,1,1,0,2,0],[2,0,2,1,3,2,0],[2,0,2,33,3,1,1]],u=0,d=1,h=0,f=1,p=2,g=3,m=4,v=5,b=6,y=7,w=8,_=9,x=10,k=11,A=12,C=13,E=14,S=15,F=16,$=17,T=18,L=[T,T,T,T,T,T,T,T,T,b,v,b,w,v,T,T,T,T,T,T,T,T,T,T,T,T,T,T,v,v,v,b,w,m,m,k,k,k,m,m,m,m,m,x,_,x,_,_,p,p,p,p,p,p,p,p,p,p,_,m,m,m,m,m,m,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,m,m,m,m,m,m,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,m,m,m,m,T,T,T,T,T,T,v,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,_,m,k,k,k,k,m,m,m,m,h,m,m,T,m,m,k,k,p,p,m,h,m,m,m,p,h,m,m,m,m,m],D=[w,w,w,w,w,w,w,w,w,w,w,T,T,T,h,f,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,w,v,C,E,S,F,$,_,k,k,k,k,k,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,_,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,w];function B(e,t,n,u){var d=i?l:c,h=null,f=null,p=null,g=0,m=null,y=null,_=-1,x=null,k=null,A=[];if(!u)for(x=0,u=[];x0)if(16==m){for(x=_;x-1){for(x=_;x=0;C--){if(u[C]!=w)break;t[C]=i}}}function R(e,t,n){if(!(r=e){s=h+1;while(s=e)s++;for(o=h,c=s-1;o=t.length||(c=n[r-1])!=p&&c!=g||(l=t[r+1])!=p&&l!=g?m:(s&&(l=g),l==c?l:m);case x:return c=r>0?n[r-1]:v,c==p&&r+10&&n[r-1]==p)return p;if(s)return m;d=r+1,u=t.length;while(d=1425&&D<=2303||64286==D;if(c=t[d],B&&(c==f||c==y))return f}return r<1||(c=t[r-1])==v?m:n[r-1];case v:return s=!1,a=!0,i;case b:return o=!0,m;case C:case E:case F:case $:case S:s=!1;case T:return m}}function M(e){var t=e.charCodeAt(0),n=t>>8;return 0==n?t>191?h:L[t]:5==n?/[\u0591-\u05f4]/.test(e)?f:h:6==n?/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(e)?A:/[\u0660-\u0669\u066b-\u066c]/.test(e)?g:1642==t?k:/[\u06f0-\u06f9]/.test(e)?p:y:32==n&&t<=8287?D[255&t]:254==n&&t>=65136?y:m}t.L=h,t.R=f,t.EN=p,t.ON_R=3,t.AN=4,t.R_H=5,t.B=6,t.DOT="·",t.doBidiReorder=function(e,n,r){if(e.length<2)return{};var s=e.split(""),a=new Array(s.length),o=new Array(s.length),c=[];i=r?d:u,B(s,c,s.length,n);for(var l=0;ly&&n[l]0&&"ل"===s[l-1]&&/\u0622|\u0623|\u0625|\u0627/.test(s[l])&&(c[l-1]=c[l]=t.R_H,l++);s[s.length-1]===t.DOT&&(c[s.length-1]=t.B);for(l=0;l=0&&(e=this.session.$docRowCache[n])}return e},this.getSplitIndex=function(){var e=0,t=this.session.$screenRowCache;if(t.length){var n,i=this.session.$getRowCacheIndex(t,this.currentRow);while(this.currentRow-e>0){if(n=this.session.$getRowCacheIndex(t,this.currentRow-e-1),n!==i)break;i=n,e++}}return e},this.updateRowLine=function(e,t){if(void 0===e&&(e=this.getDocumentRow()),this.wrapIndent=0,this.isLastRow=e===this.session.getLength()-1,this.line=this.session.getLine(e),this.session.$useWrapMode){var n=this.session.$wrapData[e];n&&(void 0===t&&(t=this.getSplitIndex()),t>0&&n.length?(this.wrapIndent=n.indent,this.line=t0?e-1:0,this.bidiMap),n=this.bidiMap.bidiLevels,r=0;0===e&&n[t]%2!==0&&t++;for(var s=0;s=l&&rn+a/2){if(n+=a,r===s.length-1){a=0;break}a=this.charWidths[s[++r]]}return r>0&&s[r-1]%2!==0&&s[r]%2===0?(e0&&s[r-1]%2===0&&s[r]%2!==0?t=1+(e>n?this.bidiMap.logicalFromVisual[r]:this.bidiMap.logicalFromVisual[r-1]):this.isRtlDir&&r===s.length-1&&0===a&&s[r-1]%2===0||!this.isRtlDir&&0===r&&s[r]%2!==0?t=1+this.bidiMap.logicalFromVisual[r]:(r>0&&s[r-1]%2!==0&&0!==a&&r--,t=this.bidiMap.logicalFromVisual[r]),t+this.wrapIndent}}).call(o.prototype),t.BidiHandler=o})),ace.define("ace/range",["require","exports","module"],(function(e,t,n){"use strict";var i=function(e,t){return e.row-t.row||e.column-t.column},r=function(e,t,n,i){this.start={row:e,column:t},this.end={row:n,column:i}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return 0==this.compare(e,t)},this.compareRange=function(e){var t,n=e.end,i=e.start;return t=this.compare(n.row,n.column),1==t?(t=this.compare(i.row,i.column),1==t?2:0==t?1:0):-1==t?-2:(t=this.compare(i.row,i.column),-1==t?-1:1==t?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return 0==this.comparePoint(e.start)&&0==this.comparePoint(e.end)},this.intersects=function(e){var t=this.compareRange(e);return-1==t||0==t||1==t},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){"object"==typeof e?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){"object"==typeof e?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return 0==this.compare(e,t)&&(!this.isEnd(e,t)&&!this.isStart(e,t))},this.insideStart=function(e,t){return 0==this.compare(e,t)&&!this.isEnd(e,t)},this.insideEnd=function(e,t){return 0==this.compare(e,t)&&!this.isStart(e,t)},this.compare=function(e,t){return this.isMultiLine()||e!==this.start.row?ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0:tthis.end.column?1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var i={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?a.fromPoints(t,t):this.isBackwards()?a.fromPoints(t,e):a.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection((function(){this.moveCursorTo(e,t)}))},this.selectToPosition=function(e){this.$moveSelection((function(){this.moveCursorToPosition(e)}))},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if("undefined"==typeof t){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n,i="number"==typeof e?e:this.lead.row,r=this.session.getFoldLine(i);return r?(i=r.start.row,n=r.end.row):n=i,!0===t?new a(i,0,n,this.session.getLine(n).length):new a(i,0,n+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.wouldMoveIntoSoftTab=function(e,t,n){var i=e.column,r=e.column+t;return n<0&&(i=e.column-t,r=e.column),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(i,r).split(" ").length-1==t},this.moveCursorLeft=function(){var e,t=this.lead.getPosition();if(e=this.session.getFoldAt(t.row,t.column,-1))this.moveCursorTo(e.start.row,e.start.column);else if(0===t.column)t.row>0&&this.moveCursorTo(t.row-1,this.doc.getLine(t.row-1).length);else{var n=this.session.getTabSize();this.wouldMoveIntoSoftTab(t,n,-1)&&!this.session.getNavigateWithinSoftTabs()?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e,t=this.lead.getPosition();if(e=this.session.getFoldAt(t.row,t.column,1))this.moveCursorTo(e.end.row,e.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=i)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),i=n.substring(t);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var r=this.session.getFoldAt(e,t,1);if(r)this.moveCursorTo(r.end.row,r.end.column);else{if(this.session.nonTokenRe.exec(i)&&(t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,i=n.substring(t)),t>=n.length)return this.moveCursorTo(e,n.length),this.moveCursorRight(),void(e0&&this.moveCursorWordLeft());this.session.tokenRe.exec(s)&&(n-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(t,n)}},this.$shortWordEndIndex=function(e){var t,n=0,i=/\s/,r=this.session.tokenRe;if(r.lastIndex=0,this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((t=e[n])&&i.test(t))n++;if(n<1){r.lastIndex=0;while((t=e[n])&&!r.test(t))if(r.lastIndex=0,n++,i.test(t)){if(n>2){n--;break}while((t=e[n])&&i.test(t))n++;if(n>2)break}}}return r.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),i=n.substring(t),r=this.session.getFoldAt(e,t,1);if(r)return this.moveCursorTo(r.end.row,r.end.column);if(t==n.length){var s=this.doc.getLength();do{e++,i=this.doc.getLine(e)}while(e0&&/^\s*$/.test(i));n=i.length,/\s+$/.test(i)||(i="")}var s=r.stringReverse(i),a=this.$shortWordEndIndex(s);return this.moveCursorTo(t,n-a)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n,i=this.session.documentToScreenPosition(this.lead.row,this.lead.column);0===t&&(0!==e&&(this.session.$bidiHandler.isBidiRow(i.row,this.lead.row)?(n=this.session.$bidiHandler.getPosLeft(i.column),i.column=Math.round(n/this.session.$bidiHandler.charWidths[0])):n=i.column*this.session.$bidiHandler.charWidths[0]),this.$desiredColumn?i.column=this.$desiredColumn:this.$desiredColumn=i.column);var r=this.session.screenToDocumentPosition(i.row+e,i.column,n);0!==e&&0===t&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,0===t)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var i=this.session.getFoldAt(e,t,1);i&&(e=i.start.row,t=i.start.column),this.$keepDesiredColumnOnChange=!0;var r=this.session.getLine(e);/[\uDC00-\uDFFF]/.test(r.charAt(t))&&r.charAt(t-1)&&(this.lead.row==e&&this.lead.column==t+1?t-=1:t+=1),this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var i=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(i.row,i.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return a.fromPoints(t,n)}catch(i){return a.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map((function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t}));else{e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(void 0==e.start){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=a.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(o.prototype),t.Selection=o})),ace.define("ace/tokenizer",["require","exports","module","ace/config"],(function(e,t,n){"use strict";var i=e("./config"),r=2e3,s=function(e){for(var t in this.states=e,this.regExps={},this.matchMappings={},this.states){for(var n=this.states[t],i=[],r=0,s=this.matchMappings[t]={defaultToken:"text"},a="g",o=[],c=0;c1?this.$applyToken:l.token),d>1&&(/\\\d/.test(l.regex)?u=l.regex.replace(/\\([0-9]+)/g,(function(e,t){return"\\"+(parseInt(t,10)+r+1)})):(d=1,u=this.removeCapturingGroups(l.regex)),l.splitRegex||"string"==typeof l.token||o.push(l)),s[r]=c,r+=d,i.push(u),l.onMatch||(l.onMatch=null)}}i.length||(s[0]=0,i.push("$")),o.forEach((function(e){e.splitRegex=this.createSplitterRegexp(e.regex,a)}),this),this.regExps[t]=new RegExp("("+i.join(")|(")+")|($)",a)}};(function(){this.$setMaxTokenCount=function(e){r=0|e},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if("string"===typeof n)return[{type:n,value:e}];for(var i=[],r=0,s=n.length;ru){var v=e.substring(u,m-g.length);h.type==f?h.value+=v:(h.type&&l.push(h),h={type:f,value:v})}for(var b=0;br){d>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(u1&&n[0]!==i&&n.unshift("#tmp",i),{tokens:l,state:n.length?n:i}},this.reportError=i.reportError}).call(s.prototype),t.Tokenizer=s})),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],(function(e,t,n){"use strict";var i=e("../lib/lang"),r=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(t)for(var n in e){for(var i=e[n],r=0;r=this.$rowTokens.length){if(this.$row+=1,e||(e=this.$session.getLength()),this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(void 0!==n)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}},this.getCurrentTokenRange=function(){var e=this.$rowTokens[this.$tokenIndex],t=this.getCurrentTokenColumn();return new i(this.$row,t,this.$row,t+e.value.length)}}).call(r.prototype),t.TokenIterator=r})),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],(function(e,t,n){"use strict";var i,r=e("../../lib/oop"),s=e("../behaviour").Behaviour,a=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),c=["text","paren.rparen","punctuation.operator"],l=["text","paren.rparen","punctuation.operator","comment"],u={},d={'"':'"',"'":"'"},h=function(e){var t=-1;if(e.multiSelect&&(t=e.selection.index,u.rangeCount!=e.multiSelect.rangeCount&&(u={rangeCount:e.multiSelect.rangeCount})),u[t])return i=u[t];i=u[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},f=function(e,t,n,i){var r=e.end.row-e.start.row;return{text:n+t+i,selection:[0,e.start.column+1,r,e.end.column+(r?0:1)]}},p=function(e){this.add("braces","insertion",(function(t,n,r,s,a){var c=r.getCursorPosition(),l=s.doc.getLine(c.row);if("{"==a){h(r);var u=r.getSelectionRange(),d=s.doc.getTextRange(u);if(""!==d&&"{"!==d&&r.getWrapBehavioursEnabled())return f(u,d,"{","}");if(p.isSaneInsertion(r,s))return/[\]\}\)]/.test(l[c.column])||r.inMultiSelectMode||e&&e.braces?(p.recordAutoInsert(r,s,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(r,s,"{"),{text:"{",selection:[1,1]})}else if("}"==a){h(r);var g=l.substring(c.column,c.column+1);if("}"==g){var m=s.$findOpeningBracket("}",{column:c.column+1,row:c.row});if(null!==m&&p.isAutoInsertedClosing(c,l,a))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if("\n"==a||"\r\n"==a){h(r);var v="";p.isMaybeInsertedClosing(c,l)&&(v=o.stringRepeat("}",i.maybeInsertedBrackets),p.clearMaybeInsertedClosing());g=l.substring(c.column,c.column+1);if("}"===g){var b=s.findMatchingBracket({row:c.row,column:c.column+1},"}");if(!b)return null;var y=this.$getIndent(s.getLine(b.row))}else{if(!v)return void p.clearMaybeInsertedClosing();y=this.$getIndent(l)}var w=y+s.getTabString();return{text:"\n"+w+"\n"+y+v,selection:[1,w.length,1,w.length]}}p.clearMaybeInsertedClosing()}})),this.add("braces","deletion",(function(e,t,n,r,s){var a=r.doc.getTextRange(s);if(!s.isMultiLine()&&"{"==a){h(n);var o=r.doc.getLine(s.start.row),c=o.substring(s.end.column,s.end.column+1);if("}"==c)return s.end.column++,s;i.maybeInsertedBrackets--}})),this.add("parens","insertion",(function(e,t,n,i,r){if("("==r){h(n);var s=n.getSelectionRange(),a=i.doc.getTextRange(s);if(""!==a&&n.getWrapBehavioursEnabled())return f(s,a,"(",")");if(p.isSaneInsertion(n,i))return p.recordAutoInsert(n,i,")"),{text:"()",selection:[1,1]}}else if(")"==r){h(n);var o=n.getCursorPosition(),c=i.doc.getLine(o.row),l=c.substring(o.column,o.column+1);if(")"==l){var u=i.$findOpeningBracket(")",{column:o.column+1,row:o.row});if(null!==u&&p.isAutoInsertedClosing(o,c,r))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}})),this.add("parens","deletion",(function(e,t,n,i,r){var s=i.doc.getTextRange(r);if(!r.isMultiLine()&&"("==s){h(n);var a=i.doc.getLine(r.start.row),o=a.substring(r.start.column+1,r.start.column+2);if(")"==o)return r.end.column++,r}})),this.add("brackets","insertion",(function(e,t,n,i,r){if("["==r){h(n);var s=n.getSelectionRange(),a=i.doc.getTextRange(s);if(""!==a&&n.getWrapBehavioursEnabled())return f(s,a,"[","]");if(p.isSaneInsertion(n,i))return p.recordAutoInsert(n,i,"]"),{text:"[]",selection:[1,1]}}else if("]"==r){h(n);var o=n.getCursorPosition(),c=i.doc.getLine(o.row),l=c.substring(o.column,o.column+1);if("]"==l){var u=i.$findOpeningBracket("]",{column:o.column+1,row:o.row});if(null!==u&&p.isAutoInsertedClosing(o,c,r))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}})),this.add("brackets","deletion",(function(e,t,n,i,r){var s=i.doc.getTextRange(r);if(!r.isMultiLine()&&"["==s){h(n);var a=i.doc.getLine(r.start.row),o=a.substring(r.start.column+1,r.start.column+2);if("]"==o)return r.end.column++,r}})),this.add("string_dquotes","insertion",(function(e,t,n,i,r){var s=i.$mode.$quotes||d;if(1==r.length&&s[r]){if(this.lineCommentStart&&-1!=this.lineCommentStart.indexOf(r))return;h(n);var a=r,o=n.getSelectionRange(),c=i.doc.getTextRange(o);if(!(""===c||1==c.length&&s[c])&&n.getWrapBehavioursEnabled())return f(o,c,a,a);if(!c){var l=n.getCursorPosition(),u=i.doc.getLine(l.row),p=u.substring(l.column-1,l.column),g=u.substring(l.column,l.column+1),m=i.getTokenAt(l.row,l.column),v=i.getTokenAt(l.row,l.column+1);if("\\"==p&&m&&/escape/.test(m.type))return null;var b,y=m&&/string|escape/.test(m.type),w=!v||/string|escape/.test(v.type);if(g==a)b=y!==w,b&&/string\.end/.test(v.type)&&(b=!1);else{if(y&&!w)return null;if(y&&w)return null;var _=i.$mode.tokenRe;_.lastIndex=0;var x=_.test(p);_.lastIndex=0;var k=_.test(p);if(x||k)return null;if(g&&!/[\s;,.})\]\\]/.test(g))return null;b=!0}return{text:b?a+a:"",selection:[1,1]}}}})),this.add("string_dquotes","deletion",(function(e,t,n,i,r){var s=i.doc.getTextRange(r);if(!r.isMultiLine()&&('"'==s||"'"==s)){h(n);var a=i.doc.getLine(r.start.row),o=a.substring(r.start.column+1,r.start.column+2);if(o==s)return r.end.column++,r}}))};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),i=new a(t,n.row,n.column);if(!this.$matchTokenType(i.getCurrentToken()||"text",c)){var r=new a(t,n.row,n.column+1);if(!this.$matchTokenType(r.getCurrentToken()||"text",c))return!1}return i.stepForward(),i.getCurrentTokenRow()!==n.row||this.$matchTokenType(i.getCurrentToken()||"text",l)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),s=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,s,i.autoInsertedLineEnd[0])||(i.autoInsertedBrackets=0),i.autoInsertedRow=r.row,i.autoInsertedLineEnd=n+s.substr(r.column),i.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),s=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,s)||(i.maybeInsertedBrackets=0),i.maybeInsertedRow=r.row,i.maybeInsertedLineStart=s.substr(0,r.column)+n,i.maybeInsertedLineEnd=s.substr(r.column),i.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return i.autoInsertedBrackets>0&&e.row===i.autoInsertedRow&&n===i.autoInsertedLineEnd[0]&&t.substr(e.column)===i.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return i.maybeInsertedBrackets>0&&e.row===i.maybeInsertedRow&&t.substr(e.column)===i.maybeInsertedLineEnd&&t.substr(0,e.column)==i.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){i.autoInsertedLineEnd=i.autoInsertedLineEnd.substr(1),i.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){i&&(i.maybeInsertedBrackets=0,i.maybeInsertedRow=-1)},r.inherits(p,s),t.CstyleBehaviour=p})),ace.define("ace/unicode",["require","exports","module"],(function(e,t,n){"use strict";function i(e){var n=/\w{4}/g;for(var i in e)t.packages[i]=e[i].replace(n,"\\u$&")}t.packages={},i({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})})),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],(function(e,t,n){"use strict";var i=e("../tokenizer").Tokenizer,r=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour/cstyle").CstyleBehaviour,a=e("../unicode"),o=e("../lib/lang"),c=e("../token_iterator").TokenIterator,l=e("../range").Range,u=function(){this.HighlightRules=r};(function(){this.$defaultBehaviour=new s,this.tokenRe=new RegExp("^["+a.packages.L+a.packages.Mn+a.packages.Mc+a.packages.Nd+a.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+a.packages.L+a.packages.Mn+a.packages.Mc+a.packages.Nd+a.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules(this.$highlightRuleConfig),this.$tokenizer=new i(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,i){var r=t.doc,s=!0,a=!0,c=1/0,l=t.getTabSize(),u=!1;if(this.lineCommentStart){if(Array.isArray(this.lineCommentStart))g=this.lineCommentStart.map(o.escapeRegExp).join("|"),f=this.lineCommentStart[0];else g=o.escapeRegExp(this.lineCommentStart),f=this.lineCommentStart;g=new RegExp("^(\\s*)(?:"+g+") ?"),u=t.getUseSoftTabs();b=function(e,t){var n=e.match(g);if(n){var i=n[1].length,s=n[0].length;h(e,i,s)||" "!=n[0][s-1]||s--,r.removeInLine(t,i,s)}};var d=f+" ",h=(v=function(e,t){s&&!/\S/.test(e)||(h(e,c,c)?r.insertInLine({row:t,column:c},d):r.insertInLine({row:t,column:c},f))},y=function(e,t){return g.test(e)},function(e,t,n){var i=0;while(t--&&" "==e.charAt(t))i++;if(i%l!=0)return!1;i=0;while(" "==e.charAt(n++))i++;return l>2?i%l!=l-1:i%l==0})}else{if(!this.blockComment)return!1;var f=this.blockComment.start,p=this.blockComment.end,g=new RegExp("^(\\s*)(?:"+o.escapeRegExp(f)+")"),m=new RegExp("(?:"+o.escapeRegExp(p)+")\\s*$"),v=function(e,t){y(e,t)||s&&!/\S/.test(e)||(r.insertInLine({row:t,column:e.length},p),r.insertInLine({row:t,column:c},f))},b=function(e,t){var n;(n=e.match(m))&&r.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(g))&&r.removeInLine(t,n[1].length,n[0].length)},y=function(e,n){if(g.test(e))return!0;for(var i=t.getTokens(n),r=0;re.length&&(_=e.length)})),c==1/0&&(c=_,s=!1,a=!1),u&&c%l!=0&&(c=Math.floor(c/l)*l),w(a?b:v)},this.toggleBlockComment=function(e,t,n,i){var r=this.blockComment;if(r){!r.start&&r[0]&&(r=r[0]);var s,a,o=new c(t,i.row,i.column),u=o.getCurrentToken(),d=(t.selection,t.selection.toOrientedRange());if(u&&/comment/.test(u.type)){var h,f;while(u&&/comment/.test(u.type)){var p=u.value.indexOf(r.start);if(-1!=p){var g=o.getCurrentTokenRow(),m=o.getCurrentTokenColumn()+p;h=new l(g,m,g,m+r.start.length);break}u=o.stepBackward()}o=new c(t,i.row,i.column),u=o.getCurrentToken();while(u&&/comment/.test(u.type)){p=u.value.indexOf(r.end);if(-1!=p){g=o.getCurrentTokenRow(),m=o.getCurrentTokenColumn()+p;f=new l(g,m,g,m+r.end.length);break}u=o.stepForward()}f&&t.remove(f),h&&(t.remove(h),s=h.start.row,a=-r.start.length)}else a=r.start.length,s=n.start.row,t.insert(n.end,r.end),t.insert(n.start,r.start);d.start.row==s&&(d.start.column+=a),d.end.row==s&&(d.end.column+=a),t.selection.fromOrientedRange(d)}},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){for(var t in this.$embeds=[],this.$modes={},e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(t=0;tthis.row)){var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)}},this.setPosition=function(e,t,n){var i;if(i=n?{row:e,column:t}:this.$clipPositionToDocument(e,t),this.row!=i.row||this.column!=i.column){var r={row:this.row,column:this.column};this.row=i.row,this.column=i.column,this._signal("change",{old:r,value:i})}},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)})),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,a=e("./range").Range,o=e("./anchor").Anchor,c=function(e){this.$lines=[""],0===e.length?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){i.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new a(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new o(this,e,t)},0==="aaa".split(/a/).length?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){this.$newLineMode!==e&&(this.$newLineMode=e,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return"\r\n"==e||"\r"==e||"\n"==e},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),i=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:i,action:"insert",lines:[t]},!0),this.clonePos(i)},this.clippedPos=function(e,t){var n=this.getLength();void 0===e?e=n:e<0?e=0:e>=n&&(e=n-1,t=void 0);var i=this.getLine(e);return void 0==t&&(t=i.length),t=Math.min(Math.max(t,0),i.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,i=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){return e instanceof a||(e=a.fromPoints(e.start,e.end)),0===t.length&&e.isEmpty()?e.start:t==this.getTextRange(e)?e.end:(this.remove(e),n=t?this.insert(e.start,t):e.start,n);var n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n="insert"==e.action;(n?e.lines.length<=1&&!e.lines[0]:!a.comparePoints(e.start,e.end))||(n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),r(this.$lines,e,t),this._signal("change",e))},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,i=n.length,r=e.start.row,s=e.start.column,a=0,o=0;do{a=o,o+=t-1;var c=n.slice(a,o);if(o>i){e.lines=c,e.start.row=r+a,e.start.column=s;break}c.push(""),this.applyDelta({start:this.pos(r+a,s),end:this.pos(r+o,s=0),action:e.action,lines:c},!0)}while(1)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:"insert"==e.action?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){for(var n=this.$lines||this.getAllLines(),i=this.getNewLineCharacter().length,r=t||0,s=n.length;r20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,-1==i&&(i=t),s<=i&&n.fireUpdateEvent(s,i)}}};(function(){i.implement(this,r),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(0===n)this.lines[t]=null;else if("remove"==e.action)this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var i=Array(n+1);i.unshift(t,1),this.lines.splice.apply(this.lines,i),this.states.splice.apply(this.states,i)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],i=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!==i.state+""?(this.states[e]=i.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=i.tokens}}).call(s.prototype),t.BackgroundTokenizer=s})),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],(function(e,t,n){"use strict";var i=e("./lib/lang"),r=(e("./lib/oop"),e("./range").Range),s=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){this.regExp+""!=e+""&&(this.regExp=e,this.cache=[])},this.update=function(e,t,n,s){if(this.regExp)for(var a=s.firstRow,o=s.lastRow,c=a;c<=o;c++){var l=this.cache[c];null==l&&(l=i.getMatchOffsets(n.getLine(c),this.regExp),l.length>this.MAX_RANGES&&(l=l.slice(0,this.MAX_RANGES)),l=l.map((function(e){return new r(c,e.offset,c,e.offset+e.length)})),this.cache[c]=l.length?l:"");for(var u=l.length;u--;)t.drawSingleLineMarker(e,l[u].toScreenRange(n),this.clazz,s)}}}).call(s.prototype),t.SearchHighlight=s})),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],(function(e,t,n){"use strict";var i=e("../range").Range;function r(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new i(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach((function(e){e.setFoldLine(this)}),this)}(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach((function(t){t.start.row+=e,t.end.row+=e}))},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort((function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)})),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var i,r,s,a=0,o=this.folds,c=!0;null==t&&(t=this.end.row,n=this.end.column);for(var l=0;l0)){var c=r(e,a.start);return 0===o?t&&0!==c?-s-2:s:c>0||0===c&&!t?s:-s-1}}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var i=this.pointIndex(e.end,t,n);return i<0?i=-i-1:i++,this.ranges.splice(n,i-n,e)},this.addList=function(e){for(var t=[],n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort((function(e,t){return r(e.start,t.start)}));for(var n,i=t[0],s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowi)break;if(u.start.row==i&&u.start.column>=t.column&&(u.start.column==t.column&&this.$insertRight||(u.start.column+=a,u.start.row+=s)),u.end.row==i&&u.end.column>=t.column){if(u.end.column==t.column&&this.$insertRight)continue;u.end.column==t.column&&a>0&&cu.start.column&&u.end.column==o[c+1].start.column&&(u.end.column-=a),u.end.column+=a,u.end.row+=s}}}if(0!=s&&c=e)return r;if(r.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,i=0;for(t&&(i=n.indexOf(t)),-1==i&&(i=0),i;i=e)return r}return null},this.getFoldedRowCount=function(e,t){for(var n=this.$foldData,i=t-e+1,r=0;r=t){o=e?i-=t-o:i=0);break}a>=e&&(i-=o>=e?a-o:a-e+1)}return i},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort((function(e,t){return e.start.row-t.start.row})),e},this.addFold=function(e,t){var n,i=this.$foldData,a=!1;e instanceof s?n=e:(n=new s(t,e),n.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(n.range);var o=n.start.row,c=n.start.column,l=n.end.row,u=n.end.column;if(!(o0&&(this.removeFolds(f),f.forEach((function(e){n.addSubFold(e)})));for(var p=0;p0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach((function(e){this.expandFold(e)}),this)},this.unfold=function(e,t){var n,r;if(null==e?(n=new i(0,0,this.getLength(),0),t=!0):n="number"==typeof e?new i(e,0,e,this.getLine(e).length):"row"in e?i.fromPoints(e,e):e,r=this.getFoldsInRangeList(n),t)this.removeFolds(r);else{var s=r;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(r.length)return r},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,i,r){null==i&&(i=e.start.row),null==r&&(r=0),null==t&&(t=e.end.row),null==n&&(n=this.getLine(t).length);var s=this.doc,a="";return e.walk((function(e,t,n,o){if(!(tu)break}while(s&&c.test(s.type));s=r.stepBackward()}else s=r.getCurrentToken();return l.end.row=r.getCurrentTokenRow(),l.end.column=r.getCurrentTokenColumn()+s.value.length-2,l}},this.foldAll=function(e,t,n){void 0==n&&(n=1e5);var i=this.foldWidgets;if(i){t=t||this.getLength(),e=e||0;for(var r=e;r=e){r=s.end.row;try{var a=this.addFold("...",s);a&&(a.collapseChildren=n)}catch(o){}}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle!=e){this.$foldStyle=e,"manual"==e&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)}},this.$setFolding=function(e){this.$foldMode!=e&&(this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation"),e&&"manual"!=this.$foldStyle?(this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)):this.foldWidgets=null)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var i,r=e-1;while(r>=0){var s=n[r];if(null==s&&(s=n[r]=this.getFoldWidget(r)),"start"==s){var a=this.getFoldWidgetRange(r);if(i||(i=a),a&&a.end.row>=e)break}r--}return{range:-1!==r&&a,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},i=this.$toggleFoldWidget(e,n);if(!i){var r=t.target||t.srcElement;r&&/ace_fold-widget/.test(r.className)&&(r.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(this.getFoldWidget){var n=this.getFoldWidget(e),i=this.getLine(e),r="end"===n?-1:1,s=this.getFoldAt(e,-1===r?0:i.length,r);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var a=this.getFoldWidgetRange(e,!0);if(a&&!a.isMultiLine()&&(s=this.getFoldAt(a.start.row,a.start.column,1),s&&a.isEqual(s.range)))return this.removeFold(s),s;if(t.siblings){var o=this.getParentFoldRangeData(e);if(o.range)var c=o.range.start.row+1,l=o.range.end.row;this.foldAll(c,l,t.all?1e4:0)}else t.children?(l=a?a.end.row:this.getLength(),this.foldAll(e+1,l,t.all?1e4:0)):a&&(t.all&&(a.collapseChildren=1e4),this.addFold("...",a));return a}},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(!n){var i=this.getParentFoldRangeData(t,!0);if(n=i.range||i.firstRange,n){t=n.start.row;var r=this.getFoldAt(t,this.getLine(t).length,1);r?this.removeFold(r):this.addFold("...",n)}}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(0===n)this.foldWidgets[t]=null;else if("remove"==e.action)this.foldWidgets.splice(t,n+1,null);else{var i=Array(n+1);i.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,i)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}t.Folding=o})),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],(function(e,t,n){"use strict";var i=e("../token_iterator").TokenIterator,r=e("../range").Range;function s(){this.findMatchingBracket=function(e,t){if(0==e.column)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(""==n)return null;var i=n.match(/([\(\[\{])|([\)\]\}])/);return i?i[1]?this.$findClosingBracket(i[1],e):this.$findOpeningBracket(i[2],e):null},this.getBracketRange=function(e){var t,n=this.getLine(e.row),i=!0,s=n.charAt(e.column-1),a=s&&s.match(/([\(\[\{])|([\)\]\}])/);if(a||(s=n.charAt(e.column),e={row:e.row,column:e.column+1},a=s&&s.match(/([\(\[\{])|([\)\]\}])/),i=!1),!a)return null;if(a[1]){var o=this.$findClosingBracket(a[1],e);if(!o)return null;t=r.fromPoints(e,o),i||(t.end.column++,t.start.column--),t.cursor=t.end}else{o=this.$findOpeningBracket(a[2],e);if(!o)return null;t=r.fromPoints(o,e),i||(t.start.column++,t.end.column--),t.cursor=t.start}return t},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var r=this.$brackets[e],s=1,a=new i(this,t.row,t.column),o=a.getCurrentToken();if(o||(o=a.stepForward()),o){n||(n=new RegExp("(\\.?"+o.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var c=t.column-a.getCurrentTokenColumn()-2,l=o.value;while(1){while(c>=0){var u=l.charAt(c);if(u==r){if(s-=1,0==s)return{row:a.getCurrentTokenRow(),column:c+a.getCurrentTokenColumn()}}else u==e&&(s+=1);c-=1}do{o=a.stepBackward()}while(o&&!n.test(o.type));if(null==o)break;l=o.value,c=l.length-1}return null}},this.$findClosingBracket=function(e,t,n){var r=this.$brackets[e],s=1,a=new i(this,t.row,t.column),o=a.getCurrentToken();if(o||(o=a.stepForward()),o){n||(n=new RegExp("(\\.?"+o.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var c=t.column-a.getCurrentTokenColumn();while(1){var l=o.value,u=l.length;while(cn&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,i=e.length-1;while(n<=i){var r=n+i>>1,s=e[r];if(t>s)n=r+1;else{if(!(t=t)break;return n=i[s],n?(n.index=s,n.start=r-n.value.length,n):null},this.setUndoManager=function(e){if(this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel(),e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=r.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?r.stringRepeat(" ",this.getTabSize()):"\t"},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.setNavigateWithinSoftTabs=function(e){this.setOption("navigateWithinSoftTabs",e)},this.getNavigateWithinSoftTabs=function(){return this.$navigateWithinSoftTabs},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(i=!!n.charAt(t-1).match(this.tokenRe)),i||(i=!!n.charAt(t).match(this.tokenRe)),i)var r=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))r=/\s/;else r=this.nonTokenRe;var s=t;if(s>0){do{s--}while(s>=0&&n.charAt(s).match(r));s++}var a=t;while(ae&&(e=t.screenWidth)})),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){if(this.$modified=!1,this.$useWrapMode)return this.screenWidth=this.$wrapLimit;for(var t=this.doc.getAllLines(),n=this.$rowLengthCache,i=0,r=0,s=this.$foldData[r],a=s?s.start.row:1/0,o=t.length,c=0;ca){if(c=s.end.row+1,c>=o)break;s=this.$foldData[r++],a=s?s.start.row:1/0}null==n[c]&&(n[c]=this.$getStringScreenWidth(t[c])[0]),n[c]>i&&(i=n[c])}this.screenWidth=i}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(e.length){this.$fromUndo=!0;for(var n=null,i=e.length-1;-1!=i;i--){var r=e[i];"doc"==r.group?(this.doc.revertDeltas(r.deltas),n=this.$getUndoSelection(r.deltas,!0,n)):r.deltas.forEach((function(e){this.addFolds(e.folds)}),this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n}},this.redoChanges=function(e,t){if(e.length){this.$fromUndo=!0;for(var n=null,i=0;ie.end.column&&(s.start.column+=o),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=o)),a&&s.start.row>=e.end.row&&(s.start.row+=a,s.end.row+=a)}if(s.end=this.insert(s.start,i),r.length){var c=e.start,l=s.start;a=l.row-c.row,o=l.column-c.column;this.addFolds(r.map((function(e){return e=e.clone(),e.start.row==c.row&&(e.start.column+=o),e.end.row==c.row&&(e.end.column+=o),e.start.row+=a,e.end.row+=a,e})))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var i=e;i<=t;i++)this.doc.insertInLine({row:i,column:0},n)},this.outdentRows=function(e){for(var t=e.collapseRows(),n=new u(0,0,0,0),i=this.getTabSize(),r=t.start.row;r<=t.end.row;++r){var s=this.getLine(r);n.start.row=r,n.end.row=r;for(var a=0;a0){i=this.getRowFoldEnd(t+n);if(i>this.doc.getLength()-1)return 0;r=i-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);r=t-e+1}var s=new u(e,0,t,Number.MAX_VALUE),a=this.getFoldsInRange(s).map((function(e){return e=e.clone(),e.start.row+=r,e.end.row+=r,e})),o=0==n?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+r,o),a.length&&this.addFolds(a),r},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){if(t=Math.max(0,t),e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){if(this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0),e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){this.$wrapLimitRange.min===e&&this.$wrapLimitRange.max===t||(this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$bidiHandler.markAsDirty(),this.$useWrapMode&&this._signal("changeWrapMode"))},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var i=this.$constrainWrapLimit(e,n.min,n.max);return i!=this.$wrapLimit&&i>1&&(this.$wrapLimit=i,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0)},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,i=e.start,r=e.end,s=i.row,a=r.row,o=a-s,c=null;if(this.$updating=!0,0!=o)if("remove"===n){this[t?"$wrapData":"$rowLengthCache"].splice(s,o);var l=this.$foldData;c=this.getFoldsInRange(e),this.removeFolds(c);var u=this.getFoldLine(r.row),d=0;if(u){u.addRemoveChars(r.row,r.column,i.column-r.column),u.shiftRow(-o);var h=this.getFoldLine(s);h&&h!==u&&(h.merge(u),u=h),d=l.indexOf(u)+1}for(d;d=r.row&&u.shiftRow(-o)}a=s}else{var f=Array(o);f.unshift(s,0);var p=t?this.$wrapData:this.$rowLengthCache;p.splice.apply(p,f);l=this.$foldData,u=this.getFoldLine(s),d=0;if(u){var g=u.range.compareInside(i.row,i.column);0==g?(u=u.split(i.row,i.column),u&&(u.shiftRow(o),u.addRemoveChars(a,0,r.column-i.column))):-1==g&&(u.addRemoveChars(s,0,r.column-i.column),u.shiftRow(o)),d=l.indexOf(u)+1}for(d;d=s&&u.shiftRow(o)}}else{o=Math.abs(e.start.column-e.end.column),"remove"===n&&(c=this.getFoldsInRange(e),this.removeFolds(c),o=-o);u=this.getFoldLine(s);u&&u.addRemoveChars(s,i.column,o)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,a):this.$updateRowLengthCache(s,a),c},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var i,r,a=this.doc.getAllLines(),o=this.getTabSize(),c=this.$wrapData,l=this.$wrapLimit,u=e;t=Math.min(t,a.length-1);while(u<=t)r=this.getFoldLine(u,r),r?(i=[],r.walk(function(e,t,r,o){var c;if(null!=e){c=this.$getDisplayTokens(e,i.length),c[0]=n;for(var l=1;l=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510)}this.$computeWrapSplits=function(e,i,r){if(0==e.length)return[];var a=[],o=e.length,l=0,u=0,h=this.$wrapAsCode,f=this.$indentedSoftWrap,m=i<=Math.max(2*r,8)||!1===f?0:Math.floor(i/2);function v(){var t=0;if(0===m)return t;if(f)for(var n=0;ni-y){var w=l+i-y;if(e[w-1]>=d&&e[w]>=d)b(w);else if(e[w]!=n&&e[w]!=s){var _=Math.max(w-(i-(i>>2)),l-1);while(w>_&&e[w]_&&e[w]_&&e[w]==c)w--}else while(w>_&&e[w]_?b(++w):(w=l+i,e[w]==t&&w--,b(w-y))}else{for(w;w!=l-1;w--)if(e[w]==n)break;if(w>l){b(w);continue}for(w=l+i,w;w39&&o<48||o>57&&o<64?s.push(c):o>=4352&&m(o)?s.push(e,t):s.push(e)}return s},this.$getStringScreenWidth=function(e,t,n){if(0==t)return[0,0];var i,r;for(null==t&&(t=1/0),n=n||0,r=0;r=4352&&m(i)?n+=2:n+=1,n>t)break;return[n,r]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.getRowLineCount=function(e){return this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1:1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0){o=l[u],s=this.$docRowCache[u];var h=e>l[d-1]}else h=!d;var f=this.getLength()-1,p=this.getNextFoldLine(s),g=p?p.start.row:1/0;while(o<=e){if(c=this.getRowLength(s),o+c>e||s>=f)break;o+=c,s++,s>g&&(s=p.end.row+1,p=this.getNextFoldLine(s,p),g=p?p.start.row:1/0),h&&(this.$docRowCache.push(s),this.$screenRowCache.push(o))}if(p&&p.start.row<=s)i=this.getFoldDisplayLine(p),s=p.start.row;else{if(o+c<=e||s>f)return{row:f,column:this.getLine(f).length};i=this.getLine(s),p=null}var m=0,v=Math.floor(e-o);if(this.$useWrapMode){var b=this.$wrapData[s];b&&(r=b[v],v>0&&b.length&&(m=b.indent,a=b[v-1]||b[b.length-1],i=i.substring(a)))}return void 0!==n&&this.$bidiHandler.isBidiRow(o+v,s,v)&&(t=this.$bidiHandler.offsetToCol(n)),a+=this.$getStringScreenWidth(i,t-m)[1],this.$useWrapMode&&a>=r&&(a=r-1),p?p.idxToPosition(a):{row:s,column:a}},this.documentToScreenPosition=function(e,t){if("undefined"===typeof t)var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var i=0,r=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var a,o=0,c=this.$docRowCache,l=this.$getRowCacheIndex(c,e),u=c.length;if(u&&l>=0){o=c[l],i=this.$screenRowCache[l];var d=e>c[u-1]}else d=!u;var h=this.getNextFoldLine(o),f=h?h.start.row:1/0;while(o=f){if(a=h.end.row+1,a>e)break;h=this.getNextFoldLine(a,h),f=h?h.start.row:1/0}else a=o+1;i+=this.getRowLength(o),o=a,d&&(this.$docRowCache.push(o),this.$screenRowCache.push(i))}var p="";h&&o>=f?(p=this.getFoldDisplayLine(h,e,t),r=h.start.row):(p=this.getLine(e).substring(0,t),r=e);var g=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var v=0;while(p.length>=m[v])i++,v++;p=p.substring(m[v-1]||0,p.length),g=v>0?m.indent:0}}return{row:i,column:g+this.$getStringScreenWidth(p)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(this.$useWrapMode){var n=this.$wrapData.length,i=0,r=(o=0,t=this.$foldData[o++],t?t.start.row:1/0);while(ir&&(i=t.end.row+1,t=this.$foldData[o++],r=t?t.start.row:1/0)}}else{e=this.getLength();for(var a=this.$foldData,o=0;on)break;return[i,s]})},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()},this.isFullWidth=m}.call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),a.defineOptions(p.prototype,"session",{wrap:{set:function(e){if(e&&"off"!=e?"free"==e?e=!0:"printMargin"==e?e=-1:"string"==typeof e&&(e=parseInt(e,10)||!1):e=!1,this.$wrap!=e)if(this.$wrap=e,e){var t="number"==typeof e?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}else this.setUseWrapMode(!1)},get:function(){return this.getUseWrapMode()?-1==this.$wrap?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e="auto"==e?"text"!=this.$mode.type:"text"!=e,e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){isNaN(e)||this.$tabSize===e||(this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize"))},initialValue:4,handlesSet:!0},navigateWithinSoftTabs:{initialValue:!1},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p})),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],(function(e,t,n){"use strict";var i=e("./lib/lang"),r=e("./lib/oop"),s=e("./range").Range,a=function(){this.$options={}};function o(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}(function(){this.set=function(e){return r.mixin(this.$options,e),this},this.getOptions=function(){return i.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var i=null;return n.forEach((function(e,n,r,a){return i=new s(e,n,r,a),!(n==a&&t.start&&t.start.start&&0!=t.skipCurrent&&i.isEqual(t.start))||(i=null,!1)})),i},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,r=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),a=[],o=t.re;if(t.$isMultiLine){var c,l=o.length,u=r.length-l;e:for(var d=o.offset||0;d<=u;d++){for(var h=0;hg||(a.push(c=new s(d,g,d+l-1,m)),l>2&&(d=d+l-2))}}else for(var v=0;v_&&a[h].end.row==n.end.row)h--;for(a=a.slice(v,h+1),v=0,h=a.length;v=o;n--)if(d(n,Number.MAX_VALUE,e))return;if(0!=t.wrap)for(n=c,o=a.row;n>=o;n--)if(d(n,Number.MAX_VALUE,e))return}};else l=function(e){var n=a.row;if(!d(n,a.column,e)){for(n+=1;n<=c;n++)if(d(n,0,e))return;if(0!=t.wrap)for(n=o,c=a.row;n<=c;n++)if(d(n,0,e))return}};if(t.$isMultiLine)var u=n.length,d=function(t,r,s){var a=i?t-u+1:t;if(!(a<0)){var o=e.getLine(a),c=o.search(n[0]);if(!(!i&&cr))return!!s(a,c,a+u-1,d)||void 0}}};else if(i)d=function(t,i,r){var s,a=e.getLine(t),o=[],c=0;n.lastIndex=0;while(s=n.exec(a)){var l=s[0].length;if(c=s.index,!l){if(c>=a.length)break;n.lastIndex=c+=1}if(s.index+l>i)break;o.push(s.index,l)}for(var u=o.length-1;u>=0;u-=2){var d=o[u-1];l=o[u];if(r(t,d,t,d+l))return!0}};else d=function(t,i,r){var s,a=e.getLine(t),o=i;n.lastIndex=i;while(s=n.exec(a)){var c=s[0].length;if(o=s.index,r(t,o,t,o+c))return!0;if(!c&&(n.lastIndex=o+=1,o>=a.length))return!1}};return{forEach:l}}}).call(a.prototype),t.Search=a})),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],(function(e,t,n){"use strict";var i=e("../lib/keys"),r=e("../lib/useragent"),s=i.KEY_MODS;function a(e,t){this.platform=t||(r.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function o(e,t){a.call(this,e,t),this.$singleCommand=!1}o.prototype=a.prototype,function(){function e(e){return"object"==typeof e&&e.bindKey&&e.bindKey.position||(e.isDefault?-100:0)}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&("string"===typeof e?e:e.name);e=this.commands[n],t||delete this.commands[n];var i=this.commandKeyBinding;for(var r in i){var s=i[r];if(s==e)delete i[r];else if(Array.isArray(s)){var a=s.indexOf(e);-1!=a&&(s.splice(a,1),1==s.length&&(i[r]=s[0]))}}},this.bindKey=function(e,t,n){if("object"==typeof e&&e&&(void 0==n&&(n=e.position),e=e[this.platform]),e)return"function"==typeof t?this.addCommand({exec:t,bindKey:e,name:t.name||e}):void e.split("|").forEach((function(e){var i="";if(-1!=e.indexOf(" ")){var r=e.split(/\s+/);e=r.pop(),r.forEach((function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;i+=(i?" ":"")+n,this._addCommandToBinding(i,"chainKeys")}),this),i+=" "}var a=this.parseKeys(e),o=s[a.hashId]+a.key;this._addCommandToBinding(i+o,t,n)}),this)},this._addCommandToBinding=function(t,n,i){var r,s=this.commandKeyBinding;if(n)if(!s[t]||this.$singleCommand)s[t]=n;else{Array.isArray(s[t])?-1!=(r=s[t].indexOf(n))&&s[t].splice(r,1):s[t]=[s[t]],"number"!=typeof i&&(i=e(n));var a=s[t];for(r=0;ri)break}a.splice(r,0,n)}else delete s[t]},this.addCommands=function(e){e&&Object.keys(e).forEach((function(t){var n=e[t];if(n){if("string"===typeof n)return this.bindKey(n,t);"function"===typeof n&&(n={exec:n}),"object"===typeof n&&(n.name||(n.name=t),this.addCommand(n))}}),this)},this.removeCommands=function(e){Object.keys(e).forEach((function(t){this.removeCommand(e[t])}),this)},this.bindKeys=function(e){Object.keys(e).forEach((function(t){this.bindKey(t,e[t])}),this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter((function(e){return e})),n=t.pop(),r=i[n];if(i.FUNCTION_KEYS[r])n=i.FUNCTION_KEYS[r].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(1==t.length&&"shift"==t[0])return{key:n.toUpperCase(),hashId:-1}}for(var s=0,a=t.length;a--;){var o=i.KEY_MODS[t[a]];if(null==o)return"undefined"!=typeof console&&console.error("invalid modifier "+t[a]+" in "+e),!1;s|=o}return{key:n,hashId:s}},this.findKeyCommand=function(e,t){var n=s[e]+t;return this.commandKeyBinding[n]},this.handleKeyboard=function(e,t,n,i){if(!(i<0)){var r=s[t]+n,a=this.commandKeyBinding[r];return e.$keyChain&&(e.$keyChain+=" "+r,a=this.commandKeyBinding[e.$keyChain]||a),!a||"chainKeys"!=a&&"chainKeys"!=a[a.length-1]?(e.$keyChain&&(t&&4!=t||1!=n.length?(-1==t||i>0)&&(e.$keyChain=""):e.$keyChain=e.$keyChain.slice(0,-r.length-1)),{command:a}):(e.$keyChain=e.$keyChain||r,{command:"null"})}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(a.prototype),t.HashHandler=a,t.MultiHashHandler=o})),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,a=function(e,t){r.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",(function(e){return e.command.exec(e.editor,e.args||{})}))};i.inherits(a,r),function(){i.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var i=e.length;i--;)if(this.exec(e[i],t,n))return!0;return!1}if("string"===typeof e&&(e=this.commands[e]),!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;if(e.isAvailable&&!e.isAvailable(t))return!1;var r={editor:t,command:e,args:n};return r.returnValue=this._emit("exec",r),this._signal("afterExec",r),!1!==r.returnValue},this.toggleRecording=function(e){if(!this.$inReplay)return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(!this.$inReplay&&this.macro){if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach((function(t){"string"==typeof t?this.exec(t,e):this.exec(t[0],e,t[1])}),this)}finally{this.$inReplay=!1}}},this.trimMacro=function(e){return e.map((function(e){return"string"!=typeof e[0]&&(e[0]=e[0].name),e[1]||(e=e[0]),e}))}}.call(a.prototype),t.CommandManager=a})),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],(function(e,t,n){"use strict";var i=e("../lib/lang"),r=e("../config"),s=e("../range").Range;function a(e,t){return{win:e,mac:t}}t.commands=[{name:"showSettingsMenu",bindKey:a("Ctrl-,","Command-,"),exec:function(e){r.loadModule("ace/ext/settings_menu",(function(t){t.init(e),e.showSettingsMenu()}))},readOnly:!0},{name:"goToNextError",bindKey:a("Alt-E","F4"),exec:function(e){r.loadModule("ace/ext/error_marker",(function(t){t.showErrorMarker(e,1)}))},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:a("Alt-Shift-E","Shift-F4"),exec:function(e){r.loadModule("ace/ext/error_marker",(function(t){t.showErrorMarker(e,-1)}))},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:a("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:a(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:a("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:a("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:a("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:a("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:a("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:a(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:a("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:a("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:a("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:a("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:a("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:a("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:a("Ctrl-F","Command-F"),exec:function(e){r.loadModule("ace/ext/searchbox",(function(t){t.Search(e)}))},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:a("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:a("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:a("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:a("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:a("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:a("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:a("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:a("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:a("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:a("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:a("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:a("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:a("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:a("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:a("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:a("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:a("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:a("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:a("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:a("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:a(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:a("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:a(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:a("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:a("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:a("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:a("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:a("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:a("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:a("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:a(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:a("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:a("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:a("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:a("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:a("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:a("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:a("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:a("Ctrl-H","Command-Option-F"),exec:function(e){r.loadModule("ace/ext/searchbox",(function(t){t.Search(e,!0)}))}},{name:"undo",bindKey:a("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:a("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:a("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:a("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:a("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:a("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:a("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:a("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:a("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:a("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:a("Alt-Delete","Ctrl-K|Command-Delete"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestarthard",bindKey:a("Ctrl-Shift-Backspace",null),exec:function(e){var t=e.selection.getRange();t.start.column=0,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineendhard",bindKey:a("Ctrl-Shift-Delete",null),exec:function(e){var t=e.selection.getRange();t.end.column=Number.MAX_VALUE,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:a("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:a("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:a("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:a("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:a("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:a("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(i.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:a(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:a("Alt-Shift-X","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:a("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:a("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:a("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:a(null,null),exec:function(e){for(var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),r=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),a=e.session.doc.getLine(n.row).length,o=e.session.doc.getTextRange(e.selection.getRange()),c=o.replace(/\n\s*/," ").length,l=e.session.doc.getLine(n.row),u=n.row+1;u<=r.row+1;u++){var d=i.stringTrimLeft(i.stringTrimRight(e.session.doc.getLine(u)));0!==d.length&&(d=" "+d),l+=d}r.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+c)):(a=e.session.doc.getLine(n.row).length>a?a+1:a,e.selection.moveCursorTo(n.row,a))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:a(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,i=e.selection.rangeList.ranges,r=[];i.length<1&&(i=[e.selection.getRange()]);for(var a=0;a0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var i=this.selection.getRange(),r=this.renderer.layerConfig;(i.start.row>=r.lastRow||i.end.row<=r.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:break}"animate"==n&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(this.$mergeUndoDeltas){var t=this.prevOp,n=this.$mergeableCommands,i=t.command&&e.command.name==t.command.name;if("insertstring"==e.command.name){var r=e.args;void 0===this.mergeNextCommand&&(this.mergeNextCommand=!0),i=i&&this.mergeNextCommand&&(!/\s/.test(r)||/\s/.test(t.args)),this.mergeNextCommand=!0}else i=i&&-1!==n.indexOf(e.command.name);"always"!=this.$mergeUndoDeltas&&Date.now()-this.sequenceStartTime>2e3&&(i=!1),i?this.session.mergeUndoDeltas=!0:-1!==n.indexOf(e.command.name)&&(this.sequenceStartTime=Date.now())}},this.setKeyboardHandler=function(e,t){if(e&&"string"===typeof e){this.$keybindingId=e;var n=this;v.loadModule(["keybinding",e],(function(i){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(i&&i.handler),t&&t()}))}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session!=e){this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this}),e&&e.bgTokenizer&&e.bgTokenizer.scheduleStart()}},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?1==t?this.navigateFileEnd():-1==t&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||r.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){if(this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null),!this.$highlightPending){var e=this;this.$highlightPending=!0,setTimeout((function(){e.$highlightPending=!1;var t=e.session;if(t&&t.bgTokenizer){var n=t.findMatchingBracket(e.getCursorPosition());if(n)var i=new f(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)i=t.$mode.getMatching(e.session);i&&(t.$bracketHighlight=t.addMarker(i,"ace_bracket","text"))}}),50)}},this.$highlightTags=function(){if(!this.$highlightTagPending){var e=this;this.$highlightTagPending=!0,setTimeout((function(){e.$highlightTagPending=!1;var t=e.session;if(t&&t.bgTokenizer){var n=e.getCursorPosition(),i=new b(e.session,n.row,n.column),r=i.getCurrentToken();if(!r||!/\b(?:tag-open|tag-name)/.test(r.type))return t.removeMarker(t.$tagHighlight),void(t.$tagHighlight=null);if(-1==r.type.indexOf("tag-open")||(r=i.stepForward(),r)){var s=r.value,a=0,o=i.stepBackward();if("<"==o.value)do{o=r,r=i.stepForward(),r&&r.value===s&&-1!==r.type.indexOf("tag-name")&&("<"===o.value?a++:"=0);else{do{r=o,o=i.stepBackward(),r&&r.value===s&&-1!==r.type.indexOf("tag-name")&&("<"===o.value?a++:"1||(e=!1)),t.$highlightLineMarker&&!e)t.removeMarker(t.$highlightLineMarker.id),t.$highlightLineMarker=null;else if(!t.$highlightLineMarker&&e){var n=new f(e.row,e.column,e.row,1/0);n.id=t.addMarker(n,"ace_active-line","screenLine"),t.$highlightLineMarker=n}else e&&(t.$highlightLineMarker.start.row=e.row,t.$highlightLineMarker.end.row=e.row,t.$highlightLineMarker.start.column=e.column,t._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;if(t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null,this.selection.isEmpty())this.$updateHighlightActiveLine();else{var n=this.selection.getRange(),i=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",i)}var r=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(r),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(!t.isEmpty()&&!t.isMultiLine()){var n=t.start.column-1,i=t.end.column+1,r=e.getLine(t.start.row),s=r.length,a=r.substring(Math.max(n,0),Math.min(i,s));if(!(n>=0&&/^[\w\d]/.test(a)||i<=s&&/[\w\d]$/.test(a))&&(a=r.substring(t.start.column,t.end.column),/^[\w\d]+$/.test(a))){var o=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:a});return o}}},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){"string"==typeof e&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),i=this.selection.rangeList.ranges;if(n.length>i.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var r=i.length;r--;){var s=i[r];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[r])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,i=n.getMode(),r=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=i.transformAction(n.getState(r.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}if("\t"==e&&(e=this.session.getTabString()),this.selection.isEmpty()){if(this.session.getOverwrite()&&-1==e.indexOf("\n")){a=new f.fromPoints(r,r);a.end.column+=e.length,this.session.remove(a)}}else{var a=this.getSelectionRange();r=this.session.remove(a),this.clearSelection()}if("\n"==e||"\r\n"==e){var o=n.getLine(r.row);if(r.column>o.search(/\S|$/)){var c=o.substr(r.column).search(/\S|$/);n.doc.removeInLine(r.row,r.column,r.column+c)}}this.clearSelection();var l=r.column,u=n.getState(r.row),d=(o=n.getLine(r.row),i.checkOutdent(u,o,e));n.insert(r,e);if(s&&s.selection&&(2==s.selection.length?this.selection.setSelectionRange(new f(r.row,l+s.selection[0],r.row,l+s.selection[1])):this.selection.setSelectionRange(new f(r.row+s.selection[0],s.selection[1],r.row+s.selection[2],s.selection[3]))),n.getDocument().isNewLine(e)){var h=i.getNextLineIndent(u,o.slice(0,r.column),n.getTabString());n.insert({row:r.row+1,column:0},h)}d&&i.autoOutdent(u,n,r.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&("left"==e?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,i=n.getState(t.start.row),r=n.getMode().transformAction(i,"deletion",this,n,t);if(0===t.end.column){var s=n.getTextRange(t);if("\n"==s[s.length-1]){var a=n.getLine(t.end.row);/^\s+$/.test(a)&&(t.end.column=a.length)}}r&&(t=r)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(this.selection.isEmpty()){var e=this.getCursorPosition(),t=e.column;if(0!==t){var n,i,r=this.session.getLine(e.row);tt.toLowerCase()?1:0}));var r=new f(0,0,0,0);for(i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var i=this.session.getLine(e);while(n.lastIndex=t){var s={value:r[0],start:r.index,end:r.index+r[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,i=new f(t,n-1,t,n),r=this.session.getTextRange(i);if(!isNaN(parseFloat(r))&&isFinite(r)){var s=this.getNumberAt(t,n);if(s){var a=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,o=s.start+s.value.length-a,c=parseFloat(s.value);c*=Math.pow(10,o),a!==s.end&&nf+1)break;f=p.last}u--,o=this.session.$moveLines(h,f,t?0:e),t&&-1==e&&(d=u+1);while(d<=u)a[d].moveBy(o,0),d++;t||(o=0),c+=o}r.fromOrientedRange(r.ranges[0]),r.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,i=this.renderer.layerConfig,r=e*Math.floor(i.height/i.lineHeight);this.$blockScrolling++,!0===t?this.selection.$moveSelection((function(){this.moveCursorBy(r,0)})):!1===t&&(this.selection.moveCursorBy(r,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,r*i.lineHeight),null!=t&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,i){this.renderer.scrollToLine(e,t,n,i)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),i=new b(this.session,n.row,n.column),r=i.getCurrentToken(),s=r||i.stepForward();if(s){var a,o,c=!1,l={},u=n.column-s.start,d={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g)){for(;u=0;--s)this.$tryReplace(n[s],e)&&i++;return this.selection.setSelectionRange(r),this.$blockScrolling-=1,i},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),null!==t?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),"string"==typeof e||e instanceof RegExp?t.needle=e:"object"==typeof e&&i.mixin(t,e);var r=this.selection.getRange();null==t.needle&&(e=this.session.getTextRange(r)||this.$search.$options.needle,e||(r=this.session.getWordRange(r.start.row,r.start.column),e=this.session.getTextRange(r)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:r});var s=this.$search.find(this.session);return t.preventScroll?s:s?(this.revealRange(s,n),s):(t.backwards?r.start=r.end:r.end=r.start,void this.selection.setRange(r))},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),!1!==t&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(e){var t,n=this,i=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var r=this.$scrollAnchor;r.style.cssText="position:absolute",this.container.insertBefore(r,this.container.firstChild);var s=this.on("changeSelection",(function(){i=!0})),a=this.renderer.on("beforeRender",(function(){i&&(t=n.renderer.container.getBoundingClientRect())})),o=this.renderer.on("afterRender",(function(){if(i&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,a=e.layerConfig,o=s.top-a.offset;i=s.top>=0&&o+t.top<0||!(s.topwindow.innerHeight)&&null,null!=i&&(r.style.top=o+"px",r.style.left=s.left+"px",r.style.height=a.lineHeight+"px",r.scrollIntoView(i)),i=t=null}}));this.setAutoScrollEditorIntoView=function(e){e||(delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",o),this.renderer.off("beforeRender",a))}}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;t&&(t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&"wide"!=e,r.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e)))}}.call(y.prototype),v.defineOptions(y.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=y})),ace.define("ace/undomanager",["require","exports","module"],(function(e,t,n){"use strict";var i=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:1==e.lines.length?null:e.lines,text:1==e.lines.length?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){for(var n=new Array(e.length),i=0;i0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return 0===this.dirtyCounter},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(i.prototype),t.UndoManager=i})),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("../lib/dom"),r=e("../lib/oop"),s=e("../lib/lang"),a=e("../lib/event_emitter").EventEmitter,o=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){r.implement(this,a),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;ta&&(g=s.end.row+1,s=t.getNextFoldLine(g,s),a=s?s.start.row:1/0),g>r){while(this.$cells.length>p+1)f=this.$cells.pop(),this.element.removeChild(f.element);break}f=this.$cells[++p],f||(f={element:null,textNode:null,foldWidget:null},f.element=i.createElement("div"),f.textNode=document.createTextNode(""),f.element.appendChild(f.textNode),this.element.appendChild(f.element),this.$cells[p]=f);var m="ace_gutter-cell ";c[g]&&(m+=c[g]),l[g]&&(m+=l[g]),this.$annotations[g]&&(m+=this.$annotations[g].className),f.element.className!=m&&(f.element.className=m);var v=t.getRowLength(g)*e.lineHeight+"px";if(v!=f.element.style.height&&(f.element.style.height=v),o){var b=o[g];null==b&&(b=o[g]=t.getFoldWidget(g))}if(b){f.foldWidget||(f.foldWidget=i.createElement("span"),f.element.appendChild(f.foldWidget));m="ace_fold-widget ace_"+b;"start"==b&&g==a&&gn.right-t.right?"foldWidgets":void 0}}).call(o.prototype),t.Gutter=o})),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],(function(e,t,n){"use strict";var i=e("../range").Range,r=e("../lib/dom"),s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,i){return(e?1:0)|(t?2:0)|(n?4:0)|(i?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){if(e){this.config=e;var t=[];for(var n in this.markers){var i=this.markers[n];if(i.range){var r=i.range.clipRows(e.firstRow,e.lastRow);if(!r.isEmpty())if(r=r.toScreenRange(this.session),i.renderer){var s=this.$getTop(r.start.row,e),a=this.$padding+(this.session.$bidiHandler.isBidiRow(r.start.row)?this.session.$bidiHandler.getPosLeft(r.start.column):r.start.column*e.characterWidth);i.renderer(t,r,a,s,e)}else"fullLine"==i.type?this.drawFullLineMarker(t,r,i.clazz,e):"screenLine"==i.type?this.drawScreenLineMarker(t,r,i.clazz,e):r.isMultiLine()?"text"==i.type?this.drawTextMarker(t,r,i.clazz,e):this.drawMultiLineMarker(t,r,i.clazz,e):this.session.$bidiHandler.isBidiRow(r.start.row)?this.drawBidiSingleLineMarker(t,r,i.clazz+" ace_start ace_br15",e):this.drawSingleLineMarker(t,r,i.clazz+" ace_start ace_br15",e)}else i.update(t,this,this.session,e)}this.element.innerHTML=t.join("")}},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,r,s,a){for(var o=this.session,c=n.start.row,l=n.end.row,u=c,d=0,h=0,f=o.getScreenLastRowColumn(u),p=null,g=new i(u,n.start.column,u,h);u<=l;u++)g.start.row=g.end.row=u,g.start.column=u==c?n.start.column:o.getRowWrapIndent(u),g.end.column=f,d=h,h=f,f=u+1f,u==l),this.session.$bidiHandler.isBidiRow(u)?this.drawBidiSingleLineMarker(t,g,p,s,u==l?0:1,a):this.drawSingleLineMarker(t,g,p,s,u==l?0:1,a)},this.drawMultiLineMarker=function(e,t,n,i,r){var s,a,o,c=this.$padding;if(r=r||"",this.session.$bidiHandler.isBidiRow(t.start.row)){var l=t.clone();l.end.row=l.start.row,l.end.column=this.session.getLine(l.start.row).length,this.drawBidiSingleLineMarker(e,l,n+" ace_br1 ace_start",i,null,r)}else s=i.lineHeight,a=this.$getTop(t.start.row,i),o=c+t.start.column*i.characterWidth,e.push("
      ");if(this.session.$bidiHandler.isBidiRow(t.end.row)){l=t.clone();l.start.row=l.end.row,l.start.column=0,this.drawBidiSingleLineMarker(e,l,n+" ace_br12",i,null,r)}else{var u=t.end.column*i.characterWidth;s=i.lineHeight,a=this.$getTop(t.end.row,i),e.push("
      ")}if(s=(t.end.row-t.start.row-1)*i.lineHeight,!(s<=0)){a=this.$getTop(t.start.row+1,i);var d=(t.start.column?1:0)|(t.end.column?0:8);e.push("
      ")}},this.drawSingleLineMarker=function(e,t,n,i,r,s){var a=i.lineHeight,o=(t.end.column+(r||0)-t.start.column)*i.characterWidth,c=this.$getTop(t.start.row,i),l=this.$padding+t.start.column*i.characterWidth;e.push("
      ")},this.drawBidiSingleLineMarker=function(e,t,n,i,r,s){var a=i.lineHeight,o=this.$getTop(t.start.row,i),c=this.$padding,l=this.session.$bidiHandler.getSelections(t.start.column,t.end.column);l.forEach((function(t){e.push("
      ")}))},this.drawFullLineMarker=function(e,t,n,i,r){var s=this.$getTop(t.start.row,i),a=i.lineHeight;t.start.row!=t.end.row&&(a+=this.$getTop(t.end.row,i)-s),e.push("
      ")},this.drawScreenLineMarker=function(e,t,n,i,r){var s=this.$getTop(t.start.row,i),a=i.lineHeight;e.push("
      ")}}).call(s.prototype),t.Marker=s})),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("../lib/dom"),s=e("../lib/lang"),a=(e("../lib/useragent"),e("../lib/event_emitter").EventEmitter),o=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){i.implement(this,a),this.EOF_CHAR="¶",this.EOL_CHAR_LF="¬",this.EOL_CHAR_CRLF="¤",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="—",this.SPACE_CHAR="·",this.$padding=0,this.$updateEolChar=function(){var e="\n"==this.session.doc.getNewLineCharacter()?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles!=e&&(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides!=e&&(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;for(var t=this.$tabStrings=[0],n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+""):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var i="ace_indent-guide",r="",a="";if(this.showInvisibles){i+=" ace_invisible",r=" ace_invisible_space",a=" ace_invisible_tab";var o=s.stringRepeat(this.SPACE_CHAR,this.tabSize),c=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else o=s.stringRepeat(" ",this.tabSize),c=o;this.$tabStrings[" "]=""+o+"",this.$tabStrings["\t"]=""+c+""}},this.updateLines=function(e,t,n){this.config.lastRow==e.lastRow&&this.config.firstRow==e.firstRow||this.scrollLines(e),this.config=e;for(var i=Math.max(t,e.firstRow),r=Math.min(n,e.lastRow),s=this.element.childNodes,a=0,o=e.firstRow;ol&&(o=c.end.row+1,c=this.session.getNextFoldLine(o,c),l=c?c.start.row:1/0),o>r)break;var u=s[a++];if(u){var d=[];this.$renderLine(d,o,!this.$useLineGroups(),o==l&&c),u.style.height=e.lineHeight*this.session.getRowLength(o)+"px",u.innerHTML=d.join("")}o++}},this.scrollLines=function(e){var t=this.config;if(this.config=e,!t||t.lastRow0;i--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(i=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);i>0;i--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){r=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(r)}},this.$renderLinesFragment=function(e,t,n){var i=this.element.ownerDocument.createDocumentFragment(),s=t,a=this.session.getNextFoldLine(s),o=a?a.start.row:1/0;while(1){if(s>o&&(s=a.end.row+1,a=this.session.getNextFoldLine(s,a),o=a?a.start.row:1/0),s>n)break;var c=r.createElement("div"),l=[];if(this.$renderLine(l,s,!1,s==o&&a),c.innerHTML=l.join(""),this.$useLineGroups())c.className="ace_line_group",i.appendChild(c),c.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(c.firstChild)i.appendChild(c.firstChild);s++}return i},this.update=function(e){this.config=e;var t=[],n=e.firstRow,i=e.lastRow,r=n,s=this.session.getNextFoldLine(r),a=s?s.start.row:1/0;while(1){if(r>a&&(r=s.end.row+1,s=this.session.getNextFoldLine(r,s),a=s?s.start.row:1/0),r>i)break;this.$useLineGroups()&&t.push("
      "),this.$renderLine(t,r,!1,r==a&&s),this.$useLineGroups()&&t.push("
      "),r++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,i){var r=this,a=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,o=function(e,n,i,a,o){if(n)return r.showInvisibles?""+s.stringRepeat(r.SPACE_CHAR,e.length)+"":e;if("&"==e)return"&";if("<"==e)return"<";if(">"==e)return">";if("\t"==e){var c=r.session.getScreenTabSize(t+a);return t+=c-1,r.$tabStrings[c]}if(" "==e){var l=r.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",u=r.showInvisibles?r.SPACE_CHAR:"";return t+=1,""+u+""}return i?""+r.SPACE_CHAR+"":(t+=1,""+e+"")},c=i.replace(a,o);if(this.$textToken[n.type])e.push(c);else{var l="ace_"+n.type.replace(/\./g," ace_"),u="";"fold"==n.type&&(u=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",c,"")}return t+i.length},this.renderIndentGuide=function(e,t,n){var i=t.search(this.$indentGuideRe);return i<=0||i>=n?t:" "==t[0]?(i-=i%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],i/this.tabSize)),t.substr(i)):"\t"==t[0]?(e.push(s.stringRepeat(this.$tabStrings["\t"],i)),t.substr(i)):t},this.$renderWrappedLine=function(e,t,n,i){for(var r=0,a=0,o=n[0],c=0,l=0;l=o)c=this.$renderToken(e,c,u,d.substring(0,o-r)),d=d.substring(o-r),r=o,i||e.push("
    ","
    "),e.push(s.stringRepeat(" ",n.indent)),a++,c=0,o=n[a]||Number.MAX_VALUE;0!=d.length&&(r+=d.length,c=this.$renderToken(e,c,u,d))}}},this.$renderSimpleLine=function(e,t){var n=0,i=t[0],r=i.value;this.displayIndentGuides&&(r=this.renderIndentGuide(e,r)),r&&(n=this.$renderToken(e,n,i,r));for(var s=1;s"),r.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,r,s,n):this.$renderSimpleLine(e,r)}this.showInvisibles&&(i&&(t=i.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push("
    ")},this.$getFoldLineTokens=function(e,t){var n=this.session,i=[];function r(e,t,n){var r=0,s=0;while(s+e[r].value.lengthn-t&&(a=a.substring(0,n-t)),i.push({type:e[r].type,value:a}),s=t+a.length,r+=1}while(sn?i.push({type:e[r].type,value:a.substring(0,n-s)}):i.push(e[r]),s+=a.length,r+=1}}var s=n.getTokens(e);return t.walk((function(e,t,a,o,c){null!=e?i.push({type:"fold",value:e}):(c&&(s=n.getTokens(t)),s.length&&r(s,o,a))}),t.end.row,this.session.getLine(t.end.row).length),i},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(o.prototype),t.Text=o})),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],(function(e,t,n){"use strict";var i,r=e("../lib/dom"),s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),void 0===i&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){for(var t=this.cursors,n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){for(var t=this.cursors,n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e==this.smoothBlinking||i||(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;if(clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0),this.isBlinking&&this.blinkInterval&&this.isVisible){this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout((function(){e(!1)}),.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval((function(){e(!0),t()}),this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),i=this.$padding+(this.session.$bidiHandler.isBidiRow(n.row,e.row)?this.session.$bidiHandler.getPosLeft(n.column):n.column*this.config.characterWidth),r=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:i,top:r}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,i=0;void 0!==t&&0!==t.length||(t=[{cursor:null}]);n=0;for(var r=t.length;ne.height+e.offset||s.top<0)&&n>1)){var a=(this.cursors[i++]||this.addCursor()).style;this.drawCursor?this.drawCursor(a,s,e,t[n],this.session):(a.left=s.left+"px",a.top=s.top+"px",a.width=e.characterWidth+"px",a.height=e.lineHeight+"px")}}while(this.cursors.length>i)this.removeCursor();var o=this.session.getOverwrite();this.$setOverwrite(o),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s})),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./lib/dom"),s=e("./lib/event"),a=e("./lib/event_emitter").EventEmitter,o=32768,c=function(e){this.element=r.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=r.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){i.implement(this,a),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(c.prototype);var l=function(e,t){c.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=r.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};i.inherits(l,c),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){if(this.scrollTop=this.element.scrollTop,1!=this.coeff){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>o?(this.coeff=o/e,e=o):1!=this.coeff&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(l.prototype);var u=function(e,t){c.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};i.inherits(u,c),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(u.prototype),t.ScrollBar=l,t.ScrollBarV=l,t.ScrollBarH=u,t.VScrollBar=l,t.HScrollBar=u})),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],(function(e,t,n){"use strict";var i=e("./lib/event"),r=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){if(this.changes=this.changes|e,!this.pending&&this.changes){this.pending=!0;var t=this;i.nextFrame((function(){var e;t.pending=!1;while(e=t.changes)t.changes=0,t.onRender(e)}),this.window)}}}).call(r.prototype),t.RenderLoop=r})),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],(function(e,t,n){var i=e("../lib/oop"),r=e("../lib/dom"),s=e("../lib/lang"),a=e("../lib/useragent"),o=e("../lib/event_emitter").EventEmitter,c=0,l=t.FontMetrics=function(e){this.el=r.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=r.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=r.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),c||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",c),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){i.implement(this,o),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=r.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;c=t>0&&t<1?50:100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",a.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval((function(){e.checkForSizeChanges()}),500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(50===c){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(n){e={width:0,height:0}}var t={height:e.height,width:e.width/c}}else t={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/c};return 0===t.width||0===t.height?null:t},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,c);var t=this.$main.getBoundingClientRect();return t.width/c},this.getCharacterWidth=function(e){var t=this.charSizes[e];return void 0===t&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(l.prototype)})),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./lib/dom"),s=e("./config"),a=e("./lib/useragent"),o=e("./layer/gutter").Gutter,c=e("./layer/marker").Marker,l=e("./layer/text").Text,u=e("./layer/cursor").Cursor,d=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,f=e("./renderloop").RenderLoop,p=e("./layer/font_metrics").FontMetrics,g=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_text-input-ios {position: absolute !important;top: -100000px !important;left: -100000px !important;}';r.importCssString(m,"ace_editor.css");var v=function(e,t){var n=this;this.container=e||r.createElement("div"),this.$keepTextAreaAtCursor=!a.isOldIE,r.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=r.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.$gutter.setAttribute("aria-hidden",!0),this.scroller=r.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=r.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new o(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new c(this.content);var i=this.$textLayer=new l(this.content);this.canvas=i.element,this.$markerFront=new c(this.content),this.$cursorLayer=new u(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new d(this.container,this),this.scrollBarV.addEventListener("scroll",(function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)})),this.scrollBarH.addEventListener("scroll",(function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)})),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new p(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",(function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)})),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new f(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,i.implement(this,g),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e),e&&(this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode))},this.updateLines=function(e,t,n){if(void 0===t&&(t=1/0),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow||this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar(),this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,i){if(!(this.resizing>2)){this.resizing>0?this.resizing++:this.resizing=e?1:0;var r=this.container;i||(i=r.clientHeight||r.scrollHeight),n||(n=r.clientWidth||r.scrollWidth);var s=this.$updateCachedSize(e,t,n,i);if(!this.$size.scrollerHeight||!n&&!i)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null}},this.$updateCachedSize=function(e,t,n,i){i-=this.$extraHeight||0;var r=0,s=this.$size,a={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};return i&&(e||s.height!=i)&&(s.height=i,r|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",r|=this.CHANGE_SCROLL),n&&(e||s.width!=n)&&(r|=this.CHANGE_SIZE,s.width=n,null==t&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px",(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)&&(r|=this.CHANGE_FULL)),s.$dirty=!n||!i,r&&this._signal("resize",a),r},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()||this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-2*this.$padding,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e),this.session.$bidiHandler.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(this.$showPrintMargin||this.$printMarginEl){if(!this.$printMarginEl){var e=r.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=r.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&-1==this.session.$wrap&&this.adjustWrapLimit()}},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$keepTextAreaAtCursor){var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var i=this.textarea.style,r=this.lineHeight;if(t<0||t>e.height-r)i.top=i.left="0";else{var s=this.characterWidth;if(this.$composition){var a=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(a)[0]+2,r+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,i.height=r+"px",i.width=s+"px",i.left=Math.min(n,this.$size.scrollerWidth-s)+"px",i.top=Math.min(t,this.$size.height-r)+"px"}}},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(0===this.layerConfig.offset?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,i){var r=this.scrollMargin;r.top=0|e,r.bottom=0|t,r.right=0|i,r.left=0|n,r.v=r.top+r.bottom,r.h=r.left+r.right,r.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-r.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){if(this.$changes&&(e|=this.$changes,this.$changes=0),this.session&&this.container.offsetWidth&&!this.$frozen&&(e||t)){if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender"),this.session&&this.session.$bidiHandler&&this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){if(e|=this.$computeLayerConfig(),n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var i=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;i>0&&(this.scrollTop=i,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}if(e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left"),e&this.CHANGE_FULL)return this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),void this._signal("afterRender");if(e&this.CHANGE_SCROLL)return e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),void this._signal("afterRender");e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")}else this.$changes|=e},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var i=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||i!=this.$vScroll){i!=this.$vScroll&&(this.$vScroll=i,this.scrollBarV.setVisible(i));var r=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,r,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,i=this.session.getScreenLength(),r=i*this.lineHeight,s=this.$getLongestLine(),a=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),o=this.$horizScroll!==a;o&&(this.$horizScroll=a,this.scrollBarH.setVisible(a));var c=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var l=this.scrollTop%this.lineHeight,u=t.scrollerHeight+this.lineHeight,d=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;r+=d;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,r-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var f=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-r+d<0||this.scrollTop>h.top),p=c!==f;p&&(this.$vScroll=f,this.scrollBarV.setVisible(f));var g,m,v=Math.ceil(u/this.lineHeight)-1,b=Math.max(0,Math.round((this.scrollTop-l)/this.lineHeight)),y=b+v,w=this.lineHeight;b=e.screenToDocumentRow(b,0);var _=e.getFoldLine(b);_&&(b=_.start.row),g=e.documentToScreenRow(b,0),m=e.getRowLength(b)*w,y=Math.min(e.screenToDocumentRow(y,0),e.getLength()-1),u=t.scrollerHeight+e.getRowLength(y)*w+m,l=this.scrollTop-g*w;var x=0;return this.layerConfig.width!=s&&(x=this.CHANGE_H_SCROLL),(o||p)&&(x=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(s=this.$getLongestLine())),this.layerConfig={width:s,padding:this.$padding,firstRow:b,firstRowScreen:g,lastRow:y,lineHeight:w,characterWidth:this.characterWidth,minHeight:u,maxHeight:r,offset:l,gutterOffset:w?Math.max(0,Math.ceil((l+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},x},this.$updateLines=function(){if(this.$changedLines){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(!(e>n.lastRow+1)&&!(ts?(t&&c+a>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),0===s&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):c+this.$size.scrollerHeight-or?(r=1-this.scrollMargin.top||(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom||(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left||(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right||void 0)))},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),i=e+this.scrollLeft-n.left-this.$padding,r=i/this.characterWidth,s=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),a=Math.round(r);return{row:s,column:a,side:r-a>0?1:-1,offsetX:i}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),i=e+this.scrollLeft-n.left-this.$padding,r=Math.round(i/this.characterWidth),s=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(s,Math.max(r,0),i)},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),i=this.session.documentToScreenPosition(e,t),r=this.$padding+(this.session.$bidiHandler.isBidiRow(i.row,e)?this.session.$bidiHandler.getPosLeft(i.column):Math.round(i.column*this.characterWidth)),s=i.row*this.lineHeight;return{pageX:n.left+r-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){r.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){r.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,r.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){this.$composition&&(r.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null)},this.setTheme=function(e,t){var n=this;if(this.$themeId=e,n._dispatchEvent("themeChange",{theme:e}),e&&"string"!=typeof e)a(e);else{var i=e||this.$options.theme.initialValue;s.loadModule(["theme",i],a)}function a(i){if(n.$themeId!=e)return t&&t();if(!i||!i.cssClass)throw new Error("couldn't load module "+e+" or it didn't call define");r.importCssString(i.cssText,i.cssClass,n.container.ownerDocument),n.theme&&r.removeCssClass(n.container,n.theme.cssClass);var s="padding"in i?i.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=i.cssClass,n.theme=i,r.addCssClass(n.container,i.cssClass),r.setCssClass(n.container,"ace_dark",i.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:i}),t&&t()}},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){r.setCssClass(this.container,e,!1!==t)},this.unsetStyle=function(e){r.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(v.prototype),s.defineOptions(v.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){"number"==typeof e&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){r.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight)return this.$gutterLineHighlight=r.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",void this.$gutter.appendChild(this.$gutterLineHighlight);this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){this.$hScrollBarAlwaysVisible&&this.$horizScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){this.$vScrollBarAlwaysVisible&&this.$vScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){"number"==typeof e&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0,this.$scrollPastEnd!=e&&(this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL))},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=v})),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,a=e("../config");function o(e,t){var n=t.src;r.qualifyURL(e);try{return new Blob([n],{type:"application/javascript"})}catch(a){var i=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new i;return s.append(n),s.getBlob("application/javascript")}}function c(e,t){var n=o(e,t),i=window.URL||window.webkitURL,r=i.createObjectURL(n);return new Worker(r)}var l=function(t,n,i,r,s){if(this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl),a.get("packaged")||!e.toUrl)r=r||a.moduleUrl(n.id,"worker");else{var o=this.$normalizePath;r=r||o(e.toUrl("ace/worker/worker.js",null,"_"));var l={};t.forEach((function(t){l[t]=o(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))}))}this.$worker=c(r,n),s&&this.send("importScripts",s),this.$worker.postMessage({init:!0,tlns:l,module:n.id,classname:i}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){i.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data);break}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return r.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var i=this.callbackId++;this.callbacks[i]=n,t.push(i)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),"insert"==e.action?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;e&&(this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e}))}}).call(l.prototype);var u=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var i=null,r=!1,o=Object.create(s),c=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){c.messageBuffer.push(e),i&&(r?setTimeout(l):l())},this.setEmitSync=function(e){r=e};var l=function(){var e=c.messageBuffer.shift();e.command?i[e.command].apply(i,e.args):e.event&&o._signal(e.event,e.data)};o.postMessage=function(e){c.onMessage({data:e})},o.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},o.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},a.loadModule(["worker",t],(function(e){i=new e[n](o);while(c.messageBuffer.length)l()}))};u.prototype=l.prototype,t.UIWorkerClient=u,t.WorkerClient=l,t.createWorker=c})),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],(function(e,t,n){"use strict";var i=e("./range").Range,r=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),a=function(e,t,n,i,r,s){var a=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=r,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=i,this.$onCursorChange=function(){setTimeout((function(){a.onCursorChange()}))},this.$pos=n;var o=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=o.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,r),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var r=this.pos;r.$insertRight=!0,r.detach(),r.markerId=n.addMarker(new i(r.row,r.column,r.row,r.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach((function(n){var i=t.createAnchor(n.row,n.column);i.$insertRight=!0,i.detach(),e.others.push(i)})),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(!this.othersActive){var e=this.session,t=this;this.othersActive=!0,this.others.forEach((function(n){n.markerId=e.addMarker(new i(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)}))}},this.hideOtherMarkers=function(){if(this.othersActive){this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;if(this.updateAnchors(e),r&&(this.length+=n),r&&!this.session.$fromUndo)if("insert"===e.action)for(var a=this.others.length-1;a>=0;a--){var o=this.others[a],c={row:o.row,column:o.column+s};this.doc.insertMergedLines(c,e.lines)}else if("remove"===e.action)for(a=this.others.length-1;a>=0;a--){o=this.others[a],c={row:o.row,column:o.column+s};this.doc.remove(new i(c.row,c.column,c.row,c.column-n))}this.$updating=!1,this.updateMarkers()}},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(!this.$updating){var e=this,t=this.session,n=function(n,r){t.removeMarker(n.markerId),n.markerId=t.addMarker(new i(n.row,n.column,n.row,n.column+e.length),r,null,!1)};n(this.pos,this.mainClass);for(var r=this.others.length;r--;)n(this.others[r],this.othersClass)}},this.onCursorChange=function(e){if(!this.$updating&&this.session){var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))}},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(-1!==this.$undoStackDepth){for(var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth,n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)}},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){if(this.rangeCount=this.rangeList.ranges.length,1==this.rangeCount&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var i=this.ranges.indexOf(e[n]);this.ranges.splice(i,1)}this._signal("removeRange",{ranges:e}),0===this.rangeCount&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){this.rangeList||(this.rangeList=new i,this.ranges=[],this.rangeCount=0)},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=r.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{n=this.getRange();var i=this.isBackwards(),s=n.start.row,a=n.end.row;if(s==a){if(i)var o=n.end,c=n.start;else o=n.start,c=n.end;return this.addRange(r.fromPoints(c,c)),void this.addRange(r.fromPoints(o,o))}var l=[],u=this.getLineRange(s,!0);u.start.column=n.start.column,l.push(u);for(var d=s+1;d1){var e=this.rangeList.ranges,t=e[e.length-1],n=r.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var i=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),a=this.rectangularRangeBlock(i,s);a.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var i=[],s=e.column0)v--;if(v>0){var b=0;while(i[b].isEmpty())b++}for(var y=v;y>=b;y--)i[y].isEmpty()&&i.splice(y,1)}return i}}.call(s.prototype);var p=e("./editor").Editor;function g(e,t){return e.row==t.row&&e.column==t.column}function m(e){e.$multiselectOnSessionChange||(e.$onAddRange=e.$onAddRange.bind(e),e.$onRemoveRange=e.$onRemoveRange.bind(e),e.$onMultiSelect=e.$onMultiSelect.bind(e),e.$onSingleSelect=e.$onSingleSelect.bind(e),e.$multiselectOnSessionChange=t.onSessionChange.bind(e),e.$checkMultiselectChange=e.$checkMultiselectChange.bind(e),e.$multiselectOnSessionChange(e),e.on("changeSession",e.$multiselectOnSessionChange),e.on("mousedown",a),e.commands.addCommands(l.defaultCommands),v(e))}function v(e){var t=e.textInput.getElement(),n=!1;function i(t){n&&(e.renderer.setMouseCursor(""),n=!1)}o.addListener(t,"keydown",(function(t){var r=18==t.keyCode&&!(t.ctrlKey||t.shiftKey||t.metaKey);e.$blockSelectEnabled&&r?n||(e.renderer.setMouseCursor("crosshair"),n=!0):n&&i()})),o.addListener(t,"keyup",i),o.addListener(t,"blur",i)}(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(e.marker){this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);-1!=t&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length}},this.removeSelectionMarkers=function(e){for(var t=this.session.$selectionMarkers,n=e.length;n--;){var i=e[n];if(i.marker){this.session.removeMarker(i.marker);var r=t.indexOf(i);-1!=r&&t.splice(r,1)}}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){this.inMultiSelectMode||(this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(l.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers())},this.$onSingleSelect=function(e){this.session.multiSelect.inVirtualMode||(this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(l.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection"))},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(n.multiSelect){if(t.multiSelectAction)"forEach"==t.multiSelectAction?i=n.forEachSelection(t,e.args):"forEachLine"==t.multiSelectAction?i=n.forEachSelection(t,e.args,!0):"single"==t.multiSelectAction?(n.exitMultiSelectMode(),i=t.exec(n,e.args||{})):i=t.multiSelectAction(n,e.args||{});else{var i=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}return i}},this.forEachSelection=function(e,t,n){if(!this.inVirtualSelectionMode){var i,r=n&&n.keepOrder,a=1==n||n&&n.$byLines,o=this.session,c=this.selection,l=c.rangeList,u=(r?c:l).ranges;if(!u.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var d=c._eventRegistry;c._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var f=u.length;f--;){if(a)while(f>0&&u[f].start.row==u[f-1].end.row)f--;h.fromOrientedRange(u[f]),h.index=f,this.selection=o.selection=h;var p=e.exec?e.exec(this,t||{}):e(this,t||{});i||void 0===p||(i=p),h.toOrientedRange(u[f])}h.detach(),this.selection=o.selection=c,this.inVirtualSelectionMode=!1,c._eventRegistry=d,c.mergeOverlappingRanges();var g=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),g&&g.from==g.to&&this.renderer.animateScrolling(g.from),i}},this.exitMultiSelectMode=function(){this.inMultiSelectMode&&!this.inVirtualSelectionMode&&this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){for(var t=this.multiSelect.rangeList.ranges,n=[],i=0;ia&&(a=n.column),ru?e.insert(i,c.stringRepeat(" ",s-u)):e.remove(new r(i.row,i.column,i.row,i.column-s+u)),t.start.column=t.end.column=a,t.start.row=t.end.row=i.row,t.cursor=t.end})),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}else{var u=this.selection.getRange(),d=u.start.row,h=u.end.row,f=d==h;if(f){var p,g=this.session.getLength();do{p=this.session.getLine(h)}while(/[=:]/.test(p)&&++h0);d<0&&(d=0),h>=g&&(h=g-1)}var m=this.session.removeFullLines(d,h);m=this.$reAlignText(m,f),this.session.insert({row:d,column:0},m.join("\n")+"\n"),f||(u.start.column=0,u.end.column=m[m.length-1].length),this.selection.setRange(u)}},this.$reAlignText=function(e,t){var n,i,r,s=!0,a=!0;return e.map((function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?null==n?(n=t[1].length,i=t[2].length,r=t[3].length,t):(n+i+r!=t[1].length+t[2].length+t[3].length&&(a=!1),n!=t[1].length&&(s=!1),n>t[1].length&&(n=t[1].length),it[3].length&&(r=t[3].length),t):[e]})).map(t?l:s?a?u:l:d);function o(e){return c.stringRepeat(" ",e)}function l(e){return e[2]?o(n)+e[2]+o(i-e[2].length+r)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function u(e){return e[2]?o(n+i-e[2].length)+e[2]+o(r," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function d(e){return e[2]?o(n)+e[2]+o(r)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}}}).call(p.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(p.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",a)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",a))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})})),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],(function(e,t,n){"use strict";var i=e("../../range").Range,r=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var i=e.getLine(n);return this.foldingStartMarker.test(i)?"start":"markbeginend"==t&&this.foldingStopMarker&&this.foldingStopMarker.test(i)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var r=/\S/,s=e.getLine(t),a=s.search(r);if(-1!=a){var o=n||s.length,c=e.getLength(),l=t,u=t;while(++tl){var h=e.getLine(u).length;return new i(l,o,u,h)}}},this.openingBracketBlock=function(e,t,n,r,s){var a={row:n,column:r+1},o=e.$findClosingBracket(t,a,s);if(o){var c=e.foldWidgets[o.row];return null==c&&(c=e.getFoldWidget(o.row)),"start"==c&&o.row>a.row&&(o.row--,o.column=e.getLine(o.row).length),i.fromPoints(a,o)}},this.closingBracketBlock=function(e,t,n,r,s){var a={row:n,column:r},o=e.$findOpeningBracket(t,a);if(o)return o.column++,a.column--,i.fromPoints(o,a)}}).call(r.prototype)})),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],(function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var i=e("../lib/dom");i.importCssString(t.cssText,t.cssClass)})),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],(function(e,t,n){"use strict";e("./lib/oop");var i=e("./lib/dom");e("./range").Range;function r(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}(function(){this.getRowLength=function(e){var t;return t=this.lineWidgets&&this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0,this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach((function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)})),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach(),this.editor!=e&&(this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets)))},this.detach=function(e){var t=this.editor;if(t){this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach((function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))}))}},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(n&&e.action){for(var i=e.data,r=i.start.row,s=i.end.row,a="add"==e.action,o=r+1;o0&&!i[r])r--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var a=r;a<=s;a++){var o=i[a];if(o&&o.el)if(o.hidden)o.el.style.top=-100-(o.pixelHeight||0)+"px";else{o._inDocument||(o._inDocument=!0,t.container.appendChild(o.el));var c=t.$cursorLayer.getPixelPosition({row:a,column:0},!0).top;o.coverLine||(c+=n.lineHeight*this.session.getRowLineCount(o.row)),o.el.style.top=c-n.offset+"px";var l=o.coverGutter?0:t.gutterWidth;o.fixedWidth||(l-=t.scrollLeft),o.el.style.left=l+"px",o.fullWidth&&o.screenWidth&&(o.el.style.minWidth=n.width+2*n.padding+"px"),o.fixedWidth?o.el.style.right=t.scrollBar.getWidth()+"px":o.el.style.right=""}}}}}).call(r.prototype),t.LineWidgets=r})),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],(function(e,t,n){"use strict";var i=e("../line_widgets").LineWidgets,r=e("../lib/dom"),s=e("../range").Range;function a(e,t,n){var i=0,r=e.length-1;while(i<=r){var s=i+r>>1,a=n(t,e[s]);if(a>0)i=s+1;else{if(!(a<0))return s;r=s-1}}return-(i+1)}function o(e,t,n){var i=e.getAnnotations().sort(s.comparePoints);if(i.length){var r=a(i,{row:t,column:-1},s.comparePoints);r<0&&(r=-r-1),r>=i.length?r=n>0?0:i.length-1:0===r&&n<0&&(r=i.length-1);var o=i[r];if(o&&n){if(o.row===t){do{o=i[r+=n]}while(o&&o.row===t);if(!o)return i.slice()}var c=[];t=o.row;do{c[n<0?"unshift":"push"](o),o=i[r+=n]}while(o&&o.row==t);return c.length&&c}}}t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new i(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),a=s.row,c=n.widgetManager.getWidgetsAtRow(a).filter((function(e){return"errorMarker"==e.type}))[0];c?c.destroy():a-=t;var l,u=o(n,a,t);if(u){var d=u[0];s.column=(d.pos&&"number"!=typeof d.column?d.pos.sc:d.column)||0,s.row=d.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(c)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:r.createElement("div"),type:"errorMarker"},f=h.el.appendChild(r.createElement("div")),p=h.el.appendChild(r.createElement("div"));p.className="error_widget_arrow "+l.className;var g=e.renderer.$cursorLayer.getPixelPosition(s).left;p.style.left=g+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",f.className="error_widget "+l.className,f.innerHTML=l.text.join("
    "),f.appendChild(r.createElement("div"));var m=function(e,t,n){if(0===t&&("esc"===n||"return"===n))return h.destroy(),{command:"null"}};h.destroy=function(){e.$mouseHandler.isMousePressed||(e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy))},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},r.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")})),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],(function(e,t,i){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),s=e("./lib/event"),a=e("./editor").Editor,o=e("./edit_session").EditSession,c=e("./undomanager").UndoManager,l=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.acequire=e,t.define=n("07d6"),t.edit=function(e){if("string"==typeof e){var n=e;if(e=document.getElementById(n),!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof a)return e.env.editor;var i="";if(e&&/input|textarea/i.test(e.tagName)){var o=e;i=o.value,e=r.createElement("pre"),o.parentNode.replaceChild(e,o)}else e&&(i=r.getInnerText(e),e.innerHTML="");var c=t.createEditSession(i),u=new a(new l(e));u.setSession(c);var d={document:c,editor:u,onResize:u.resize.bind(u,null)};return o&&(d.textarea=o),s.addListener(window,"resize",d.onResize),u.on("destroy",(function(){s.removeListener(window,"resize",d.onResize),d.editor.container.env=null})),u.container.env=u.env=d,u},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new c),n},t.EditSession=o,t.UndoManager=c,t.version="1.2.9"})),function(){ace.acequire(["ace/ace"],(function(e){for(var t in e&&(e.config.init(!0),e.define=ace.define),window.ace||(window.ace=e),e)e.hasOwnProperty(t)&&(window.ace[t]=e[t])}))}(),e.exports=window.ace.acequire("ace/ace")},"0687":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"ores"},[n("h3",[e._v("Selected Ores:")]),e._l(e.ore_names,(function(t){return n("div",{key:t},[n("vui-button",{class:{selected:e.selected_ores.includes(t)},attrs:{params:{chosen_ore:t}}},[e._v(e._s(t))])],1)}))],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("3315"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"5716889f",null);t["default"]=c.exports},"068f":function(e,t,n){"use strict";n("e16d")},"06cf":function(e,t,n){var i=n("83ab"),r=n("d1e7"),s=n("5c6c"),a=n("fc6a"),o=n("c04e"),c=n("5135"),l=n("0cfb"),u=Object.getOwnPropertyDescriptor;t.f=i?u:function(e,t){if(e=a(e),t=o(t,!0),l)try{return u(e,t)}catch(n){}if(c(e,t))return s(!r.f.call(e,t),e[t])}},"07ac":function(e,t,n){var i=n("23e7"),r=n("6f53").values;i({target:"Object",stat:!0},{values:function(e){return r(e)}})},"07c3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("i",[e._v("Welcome to the NanoTrasen™ computer configuration utility. Please consult your system administrator if you have any questions about your device.")]),n("hr"),n("h2",[e._v("Power Supply")]),n("vui-item",{attrs:{label:"Battery Status:"}},[e.battery?n("span",[e._v("Active")]):n("span",[e._v("Not Available")])]),e.battery?n("vui-item",{attrs:{label:"Battery Rating:"}},[e._v(e._s(e.battery.rating)+" Wh")]):e._e(),e.battery?n("vui-item",{attrs:{label:"Battery Charge:"}},[n("vui-progress",{attrs:{value:e.battery.percent}},[e._v(e._s(e.battery.percent)+"%")])],1):e._e(),n("vui-item",{attrs:{label:"Power Usage:"}},[e._v(e._s(e.power_usage)+" W")]),n("h2",[e._v("File System")]),e.battery?n("vui-item",{attrs:{label:"Used Capacity:"}},[n("vui-progress",{attrs:{value:e.disk_used,min:"0",max:e.disk_size}},[e._v(e._s(e.disk_used)+" GQ / "+e._s(e.disk_size)+" GQ")])],1):e._e(),n("h2",[e._v("Misc. Settings")]),n("vui-item",{attrs:{label:"Registered ID:"}},[n("vui-button",{attrs:{params:{PC_register:1},disabled:!e.card_slot}},[e._v(e._s(e.registered?e.registered:"Unregistered"))])],1),null!==e.brightness?n("vui-item",{attrs:{label:"Brightness:"}},[n("vui-input-slider",{attrs:{min:0,max:10},model:{value:e.brightness,callback:function(t){e.brightness=t},expression:"brightness"}})],1):e._e(),n("h2",[e._v("Computer Components")]),e._l(e.hardware,(function(t,i){return n("div",{key:i},[n("h3",[e._v(e._s(i))]),n("vui-item",{attrs:{label:"State:"}},[t.enabled?n("span",[e._v("Enabled")]):n("span",[e._v("Disabled")])]),t.power_usage>0?n("vui-item",{attrs:{label:"Power Usage:"}},[e._v(e._s(t.power_usage)+" W")]):e._e(),t.critical?e._e():n("vui-item",{attrs:{label:"Toggle Component:"}},[n("vui-button",{attrs:{params:{PC_enable_component:i},disabled:!!t.enabled}},[e._v("ON")]),n("vui-button",{attrs:{params:{PC_disable_component:i},disabled:!t.enabled}},[e._v("OFF")])],1)],1)})),n("i",[e._v("ntOS v2.1.0 -- © NanoTrasen 2457 - 2462")])],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"07d6":function(e,t){e.exports=function(){throw new Error("define cannot be used indirect")}},"08c0":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h2",[e._v("Engine Status:")]),e.is_on?n("div",[e._v(" The engine is currently running. "),n("vui-button",{attrs:{params:{toggle_engine:1}}},[e._v("Stop")])],1):n("div",[e._v(" The engine is off. "),n("vui-button",{attrs:{disabled:!e.has_key||!e.has_cell,params:{toggle_engine:1}}},[e._v("Start")])],1),e.has_key?n("div",[e._v(" There is a key inserted into the ignition. "),n("vui-button",{attrs:{params:{key:1}}},[e._v("Remove Key")])],1):n("div",[e._v(" There is no key in the ignition. ")]),e.has_cell?n("div",[e._v(" Cell Charge: "),n("vui-progress",{class:{good:e.cell_charge>=.8*e.cell_max_charge,bad:e.cell_charge<=.4*e.cell_max_charge,average:e.cell_charge<.8*e.cell_max_charge&&e.cell_charge>.4*e.cell_max_charge},attrs:{value:e.cell_charge,max:e.cell_max_charge,min:0}},[e._v(e._s(e.cell_charge)+"J")]),e._v(" "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The cell can be removed by using a screwdriver to open the maintenance panel, then using a crowbar to shimmy it out.")])],1):n("div",[e._v(" There is no cell installed. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The cell can be installed by using a screwdriver to open the maintenance panel, then clicking on the engine with a compatible power cell.")])],1),e.is_towing?n("div",[e._v(" This engine is currently towing the "+e._s(e.tow)+". "),n("vui-button",{attrs:{params:{unlatch:1}}},[e._v("Unlatch")])],1):n("div",[e._v(" This engine isn't towing anything currently. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("You can latch vehicles together by dragging from the vehicle you want to be the anchor point, to the trolley you wish to latch.")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"08cc":function(e,t,n){"use strict";n("b225")},"09cd":function(e,t,n){"use strict";n("bfa1")},"0ac8":function(e,t,n){var i=n("23e7"),r=n("8eb5");i({target:"Math",stat:!0,forced:r!=Math.expm1},{expm1:r})},"0b25":function(e,t,n){var i=n("a691"),r=n("50c4");e.exports=function(e){if(void 0===e)return 0;var t=i(e),n=r(t);if(t!==n)throw RangeError("Wrong length or index");return n}},"0c47":function(e,t,n){var i=n("da84"),r=n("d44e");r(i.JSON,"JSON",!0)},"0ccb":function(e,t,n){var i=n("50c4"),r=n("1148"),s=n("1d80"),a=Math.ceil,o=function(e){return function(t,n,o){var c,l,u=String(s(t)),d=u.length,h=void 0===o?" ":String(o),f=i(n);return f<=d||""==h?u:(c=f-d,l=r.call(h,a(c/h.length)),l.length>c&&(l=l.slice(0,c)),e?u+l:l+u)}};e.exports={start:o(!1),end:o(!0)}},"0cfb":function(e,t,n){var i=n("83ab"),r=n("d039"),s=n("cc12");e.exports=!i&&!r((function(){return 7!=Object.defineProperty(s("div"),"a",{get:function(){return 7}}).a}))},"0d03":function(e,t,n){var i=n("6eeb"),r=Date.prototype,s="Invalid Date",a="toString",o=r[a],c=r.getTime;new Date(NaN)+""!=s&&i(r,a,(function(){var e=c.call(this);return e===e?o.call(this):s}))},"0d3b":function(e,t,n){var i=n("d039"),r=n("b622"),s=n("c430"),a=r("iterator");e.exports=!i((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,i){t["delete"]("b"),n+=i+e})),s&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[a]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host}))},"0ea6":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.passcode,expression:"passcode"}],attrs:{placeholder:"Enter passcode...",autofocus:""},domProps:{value:e.passcode},on:{input:function(t){t.target.composing||(e.passcode=t.target.value)}}}),n("vui-button",{attrs:{params:{set_passcode:e.passcode}}},[e._v("Set")]),n("vui-button",{attrs:{params:{lock:1}}},[e._v("Lock")])],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"0ec3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("span",{staticClass:"tooltip label"},[e._t("label",[e._v(e._s(e.label))]),n("div",{staticClass:"tooltip content"},[e._t("default")],2)],2)},r=[],s={props:{label:{type:String,default:""}}},a=s,o=(n("09cd"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"4ea2a2b3",null);t["default"]=c.exports},"0eec":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("input",{ref:"input",style:{width:e.width},attrs:{type:"range",min:e.min,max:e.max},domProps:{value:e.val},on:{change:function(t){return e.onFieldUpdate(t.target)}}})])},r=[],s=(n("a9e3"),n("8a79"),n("c0d6")),a={props:{value:{type:Number,default:0},min:{type:Number,default:0},max:{type:Number,default:100},pushState:{type:Boolean,default:!0},width:{type:String,default:"10em"},decimalPlaces:{type:Number,default:0}},data:function(){return{val:this.value}},methods:{onFieldUpdate:function(e){var t=this.val,n=Number(e.value);isNaN(n)&&(n=this.val),console.log(n,e.value,this.value,this.val),this.UpdateValue(n),t!=this.val||e.value.endsWith(".")||(this.$refs.input.value=this.val)},onUpdatedValue:function(e){var t=this.value;e&&(t+=e),this.UpdateValue(t)},UpdateValue:function(e){e=+(Math.round(e+"e+"+this.decimalPlaces)+"e-"+this.decimalPlaces),e>this.max&&(e=this.max),e0;(s>>>=1)&&(t+=t))1&s&&(n+=t);return n}},"11f5":function(e,t,n){"use strict";n("5d50")},1253:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"displayBar"},[n("div",{staticClass:"displayBarFill",style:{width:e.percentage+"%"}},[n("span",[e._t("default")],2)])])},r=[],s=(n("a9e3"),{props:{value:{type:Number,default:50},max:{type:Number,default:100},min:{type:Number,default:0}},computed:{percentage:function(){return(Math.min(this.max,Math.max(this.value,this.min))-this.min)/(this.max-this.min)*100}}}),a=s,o=(n("112d"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"041d7f1a",null);t["default"]=c.exports},"126d":function(e,t,n){var i=n("6da8"),r=n("aaec"),s=n("d094");function a(e){return r(e)?s(e):i(e)}e.exports=a},1276:function(e,t,n){"use strict";var i=n("d784"),r=n("44e7"),s=n("825a"),a=n("1d80"),o=n("4840"),c=n("8aa5"),l=n("50c4"),u=n("14c3"),d=n("9263"),h=n("d039"),f=[].push,p=Math.min,g=4294967295,m=!h((function(){return!RegExp(g,"y")}));i("split",2,(function(e,t,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var i=String(a(this)),s=void 0===n?g:n>>>0;if(0===s)return[];if(void 0===e)return[i];if(!r(e))return t.call(i,e,s);var o,c,l,u=[],h=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,m=new RegExp(e.source,h+"g");while(o=d.call(m,i)){if(c=m.lastIndex,c>p&&(u.push(i.slice(p,o.index)),o.length>1&&o.index=s))break;m.lastIndex===o.index&&m.lastIndex++}return p===i.length?!l&&m.test("")||u.push(""):u.push(i.slice(p)),u.length>s?u.slice(0,s):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=a(this),s=void 0==t?void 0:t[e];return void 0!==s?s.call(t,r,n):i.call(String(r),t,n)},function(e,r){var a=n(i,e,this,r,i!==t);if(a.done)return a.value;var d=s(e),h=String(this),f=o(d,RegExp),v=d.unicode,b=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),y=new f(m?d:"^(?:"+d.source+")",b),w=void 0===r?g:r>>>0;if(0===w)return[];if(0===h.length)return null===u(y,h)?[h]:[];var _=0,x=0,k=[];while(xe.length)&&(t=e.length);for(var n=0,i=new Array(t);n79&&o<83;i({target:"Array",proto:!0,forced:!l||!u||d},{reduce:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}})},"143c":function(e,t,n){var i=n("74e8");i("Int32",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},"145e":function(e,t,n){"use strict";var i=n("7b0b"),r=n("23cb"),s=n("50c4"),a=Math.min;e.exports=[].copyWithin||function(e,t){var n=i(this),o=s(n.length),c=r(e,o),l=r(t,o),u=arguments.length>2?arguments[2]:void 0,d=a((void 0===u?o:r(u,o))-l,o-c),h=1;l0)l in n?n[c]=n[l]:delete n[c],c+=h,l+=h;return n}},"14c3":function(e,t,n){var i=n("c6b6"),r=n("9263");e.exports=function(e,t){var n=e.exec;if("function"===typeof n){var s=n.call(e,t);if("object"!==typeof s)throw TypeError("RegExp exec method returned something other than an Object or null");return s}if("RegExp"!==i(e))throw TypeError("RegExp#exec called on incompatible receiver");return r.call(e,t)}},"14d4":function(e,t){ace.define("ace/theme/monokai",["require","exports","module","ace/lib/dom"],(function(e,t,n){t.isDark=!0,t.cssClass="ace-monokai",t.cssText=".ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}";var i=e("../lib/dom");i.importCssString(t.cssText,t.cssClass)}))},1503:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{directives:[{name:"show",rawName:"v-show",value:!e.spawnpoint,expression:"!spawnpoint"}],staticClass:"tagselector"},e._l(e.tags,(function(t,i){return n("vui-button",{key:i,class:{selected:e.current_tag==i},on:{click:function(t){e.current_tag=i}}},[e._v(e._s(i)+" ("+e._s(t)+")")])})),1),n("hr",{directives:[{name:"show",rawName:"v-show",value:!e.spawnpoint,expression:"!spawnpoint"}]}),n("table",[e._m(0),e._l(e.spawners,(function(t,i){return n("tr",{directives:[{name:"show",rawName:"v-show",value:e.showEntry(t),expression:"showEntry(data)"}],key:i},[n("td",[e._v(e._s(t.name))]),n("td",[e._v(e._s(t.desc))]),t.max_count>0?n("td",[e._v(e._s(t.max_count-t.count)+" / "+e._s(t.max_count))]):t.spawnatoms>0?n("td",[e._v(e._s(t.spawnatoms))]):n("td",[e._v("∞")]),n("td",{staticClass:"action"},[n("vui-button",{attrs:{disabled:0!==t.cant_spawn,params:{spawn:i,spawnpoint:e.spawnpoint},icon:"star"}},[e._v("Spawn")]),1==t.can_edit?n("vui-button",{attrs:{disabled:1==t.enabled,params:{enable:i}}},[e._v("Enable")]):e._e(),1==t.can_edit?n("vui-button",{attrs:{disabled:0==t.enabled,params:{disable:i}}},[e._v("Disable")]):e._e()],1)])}))],2)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("th",[e._v("Name")]),n("th",[e._v("Description")]),n("th",[e._v("Available Slots")]),n("th",{staticClass:"action"},[e._v("Actions")])])}],s=(n("4de4"),n("5db7"),n("4160"),n("c975"),n("73d9"),n("07ac"),n("159b"),{data:function(){return this.$root.$data.state},computed:{tags:function(){var e=Object.values(this.spawners).flatMap((function(e){return e.tags})),t={All:Object.values(this.spawners).length};return e.filter((function(e,t,n){return n.indexOf(e)===t})).forEach((function(n){t[n]=e.filter((function(e){return e==n})).length})),t}},methods:{showEntry:function(e){return this.spawnpoint?!!Object.prototype.hasOwnProperty.apply(e,["spawnpoints"])&&(e.spawnpoints&&!e.spawnpoints.indexOf(this.spawnpoint)):!e.tags.indexOf(this.current_tag)||"All"==this.current_tag}}}),a=s,o=(n("068f"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"70766bea",null);t["default"]=c.exports},"159b":function(e,t,n){var i=n("da84"),r=n("fdbc"),s=n("17c2"),a=n("9112");for(var o in r){var c=i[o],l=c&&c.prototype;if(l&&l.forEach!==s)try{a(l,"forEach",s)}catch(u){l.forEach=s}}},1650:function(e,t,n){},"16ae":function(e,t,n){"use strict";n("f415")},"170b":function(e,t,n){"use strict";var i=n("ebb5"),r=n("50c4"),s=n("23cb"),a=n("4840"),o=i.aTypedArray,c=i.exportTypedArrayMethod;c("subarray",(function(e,t){var n=o(this),i=n.length,c=s(e,i);return new(a(n,n.constructor))(n.buffer,n.byteOffset+c*n.BYTES_PER_ELEMENT,r((void 0===t?i:s(t,i))-c))}))},1715:function(e,t,n){n("159b"),n("ddb0"),n("130f"),n("9f96"),n("4795"),n("2b3d"),n("bf19"),n("9861");var i=n("428f");e.exports=i},"17c2":function(e,t,n){"use strict";var i=n("b727").forEach,r=n("a640"),s=n("ae40"),a=r("forEach"),o=s("forEach");e.exports=a&&o?[].forEach:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}},"182d":function(e,t,n){var i=n("f8cd");e.exports=function(e,t){var n=i(e);if(n%t)throw RangeError("Wrong offset");return n}},"18a5":function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("anchor")},{anchor:function(e){return r(this,"a","name",e)}})},1913:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("fontsize")},{fontsize:function(e){return r(this,"font","size",e)}})},"197b":function(e,t,n){var i=n("746f");i("species")},"19aa":function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},"19fa":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("vui-button",{staticClass:"fixedLeft",attrs:{icon:"cog",params:{close:1}}},[e._v("Close")])],1),n("div",[n("h2",[e._v("Storage")]),e.secure?n("span",{staticClass:"notice"},[e._v(" "+e._s(-1==e.locked?"Sec.re ACC_** //):securi_nt.diag=>##'or 1=1'%($...":"Secure Access: Please have your identification ready.")+" ")]):e._e()]),e.contents?e._l(e.contents,(function(t){return n("div",{key:t.vend},[n("div",[n("span",{staticClass:"highlight"},[e._v(e._s(t.display_name)+" ("+e._s(t.quantity)+" available)")])]),n("div",{staticStyle:{float:"left"}},[e._v("Vend: ")]),n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:1},icon:"arrow-alt-circle-down"}},[e._v("x1")]),t.quantity>=5?n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:5},icon:"arrow-alt-circle-down"}},[e._v("x5")]):e._e(),t.quantity>=10?n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:10},icon:"arrow-alt-circle-down"}},[e._v("x10")]):e._e(),t.quantity>=25?n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:25},icon:"arrow-alt-circle-down"}},[e._v("x25")]):e._e(),t.quantity>1?n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:t.quantity},icon:"arrow-alt-circle-down"}},[e._v("All")]):e._e()],1)})):n("div",{staticClass:"average"},[e._v(" No products loaded. ")])],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"1be4":function(e,t,n){var i=n("d066");e.exports=i("document","documentElement")},"1bf2":function(e,t,n){var i=n("23e7"),r=n("56ef");i({target:"Reflect",stat:!0},{ownKeys:r})},"1c0b":function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},"1c7e":function(e,t,n){var i=n("b622"),r=i("iterator"),s=!1;try{var a=0,o={next:function(){return{done:!!a++}},return:function(){s=!0}};o[r]=function(){return this},Array.from(o,(function(){throw 2}))}catch(c){}e.exports=function(e,t){if(!t&&!s)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(c){}return n}},"1cdc":function(e,t,n){var i=n("342f");e.exports=/(iphone|ipod|ipad).*applewebkit/i.test(i)},"1d1c":function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("37e8");i({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperties:s})},"1d73":function(e,t,n){},"1d80":function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},"1dbb":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[null==e.password?n("vui-button",{on:{click:e.join}},[e._v(e._s(e.ch.title))]):[n("input",{directives:[{name:"model",rawName:"v-model",value:e.password,expression:"password"}],attrs:{type:"text"},domProps:{value:e.password},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.join_with(t)},input:function(t){t.target.composing||(e.password=t.target.value)}}}),n("vui-button",{attrs:{params:{join:{target:e.re,password:e.password}}}},[e._v("Join "+e._s(e.ch.title))])]],2)},r=[],s=n("025e"),a={data:function(){return{password:null}},methods:{join:function(){this.ch.password?this.password="":Object(s["b"])({join:{target:this.re}})},join_with:function(){Object(s["b"])({join:{target:this.re,password:this.password}})}},props:{ch:{type:Object,default:function(){return{}}},re:{type:String,default:""}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},"1dde":function(e,t,n){var i=n("d039"),r=n("b622"),s=n("2d00"),a=r("species");e.exports=function(e){return s>=51||!i((function(){var t=[],n=t.constructor={};return n[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},"1e25":function(e,t,n){"use strict";var i=n("23e7"),r=n("58a8").end,s=n("c8d2"),a=s("trimEnd"),o=a?function(){return r(this)}:"".trimEnd;i({target:"String",proto:!0,forced:a},{trimEnd:o,trimRight:o})},"1ec1":function(e,t){var n=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:n(1+e)}},"1ee6":function(e,t,n){},"1fb5":function(e,t,n){"use strict";n("7da4")},"1fe2":function(e,t,n){"use strict";var i=n("6d61"),r=n("acac");i("WeakSet",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),r)},"203b":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.active?n("div",[n("view-records-general",{attrs:{"hide-advanced":""}},[n("vui-group-item",{attrs:{label:"Blood type:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.blood_type"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.$root.$data.state,"editingvalue",t.target.multiple?n:n[0])}}},e._l(e.choices.medical.blood_type,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)])],1),n("vui-group-item",{attrs:{label:"DNA:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.blood_dna"}})],1),n("vui-group-item",{attrs:{label:"Disabilities:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.disabilities"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Allergies:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.allergies"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Diseases:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.diseases"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Comments:"}},[e._l(e.active.medical.comments,(function(t){return n("div",{key:t},[e._v(e._s(t)+" "),(2&e.editable)>0?n("vui-button",{staticClass:"danger",attrs:{params:{removefromrecord:{value:t,key:["active","medical","comments"]}},icon:"trash-alt"}}):e._e()],1)})),0==e.active.medical.comments.length?n("div",[e._v("There are no comments.")]):e._e(),(2&e.editable)>0?n("view-records-field",{attrs:{"edit-button":"Add"},on:{save:function(t){return e.add("active.medical.comments",t)}}}):e._e()],2),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1)],1)],1):e._e()},r=[],s=(n("ac1f"),n("1276"),n("025e")),a={data:function(){return this.$root.$data.state},methods:{add:function(e,t){s["a"].sendToTopic({addtorecord:{value:t,key:e.split(".")}})}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},"207c":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Microphone:"}},[n("vui-button",{class:{selected:e.listening},attrs:{params:{talk:1,nowindow:1}}},[e._v("On")]),n("vui-button",{class:{selected:!e.listening},attrs:{params:{talk:1,nowindow:1}}},[e._v("Off")])],1),n("vui-group-item",{attrs:{label:"Frequency:"}},[n("vui-button",{attrs:{params:{freq:-10,nowindow:1}}},[e._v("--")]),n("vui-button",{attrs:{params:{freq:-2,nowindow:1}}},[e._v("-")]),n("span",[e._v(e._s(e.frequency))]),n("vui-button",{attrs:{params:{freq:2,nowindow:1}}},[e._v("+")]),n("vui-button",{attrs:{params:{freq:10,nowindow:1}}},[e._v("++")])],1),n("vui-item",{attrs:{label:"Range:"}},[n("vui-input-slider",{attrs:{min:0,max:4},model:{value:e.radio_range,callback:function(t){e.radio_range=t},expression:"radio_range"}})],1),n("hr"),e._l(e.channels,(function(t){return n("vui-group-item",{key:t.name,attrs:{label:t.name}},[n("vui-button",{class:{selected:t.listening},attrs:{params:{ch_name:t.name,listen:1,nowindow:1}}},[e._v("On")]),n("vui-button",{class:{selected:!t.listening},attrs:{params:{ch_name:t.name,listen:1,nowindow:1}}},[e._v("Off")])],1)}))],2)],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},2099:function(e,t){ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./lib/event_emitter").EventEmitter,s=e("./lib/lang"),a=e("./range").Range,o=e("./anchor").Anchor,c=e("./keyboard/hash_handler").HashHandler,l=e("./tokenizer").Tokenizer,u=a.comparePoints,d=function(){this.snippetMap={},this.snippetNameMap={}};(function(){i.implement(this,r),this.getTokenizer=function(){function e(e,t,n){return e=e.substr(1),/^\d+$/.test(e)&&!n.inFormatString?[{tabstopId:parseInt(e,10)}]:[{text:e}]}function t(e){return"(?:[^\\\\"+e+"]|\\\\.)"}return d.$tokenizer=new l({start:[{regex:/:/,onMatch:function(e,t,n){return n.length&&n[0].expectIf?(n[0].expectIf=!1,n[0].elseBranch=n[0],[n[0]]):":"}},{regex:/\\./,onMatch:function(e,t,n){var i=e[1];return"}"==i&&n.length||-1!="`$\\".indexOf(i)?e=i:n.inFormatString&&("n"==i||"t"==i?e="\n":-1!="ulULE".indexOf(i)&&(e={changeCase:i,local:i>"a"})),[e]}},{regex:/}/,onMatch:function(e,t,n){return[n.length?n.shift():e]}},{regex:/\$(?:\d+|\w+)/,onMatch:e},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(t,n,i){var r=e(t.substr(1),n,i);return i.unshift(r[0]),r},next:"snippetVar"},{regex:/\n/,token:"newline",merge:!1}],snippetVar:[{regex:"\\|"+t("\\|")+"*\\|",onMatch:function(e,t,n){n[0].choices=e.slice(1,-1).split(",")},next:"start"},{regex:"/("+t("/")+"+)/(?:("+t("/")+"*)/)(\\w*):?",onMatch:function(e,t,n){var i=n[0];return i.fmtString=e,e=this.splitRegex.exec(e),i.guard=e[1],i.fmt=e[2],i.flag=e[3],""},next:"start"},{regex:"`"+t("`")+"*`",onMatch:function(e,t,n){return n[0].code=e.splice(1,-1),""},next:"start"},{regex:"\\?",onMatch:function(e,t,n){n[0]&&(n[0].expectIf=!0)},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+t("/")+"+)/",token:"regex"},{regex:"",onMatch:function(e,t,n){n.inFormatString=!0},next:"start"}]}),d.prototype.getTokenizer=function(){return d.$tokenizer},d.$tokenizer},this.tokenizeTmSnippet=function(e,t){return this.getTokenizer().getLineTokens(e,t).tokens.map((function(e){return e.value||e}))},this.$getDefaultValue=function(e,t){if(/^[A-Z]\d+$/.test(t)){var n=t.substr(1);return(this.variables[t[0]+"__"]||{})[n]}if(/^\d+$/.test(t))return(this.variables.__||{})[t];if(t=t.replace(/^TM_/,""),e){var i=e.session;switch(t){case"CURRENT_WORD":var r=i.getWordRange();case"SELECTION":case"SELECTED_TEXT":return i.getTextRange(r);case"CURRENT_LINE":return i.getLine(e.getCursorPosition().row);case"PREV_LINE":return i.getLine(e.getCursorPosition().row-1);case"LINE_INDEX":return e.getCursorPosition().column;case"LINE_NUMBER":return e.getCursorPosition().row+1;case"SOFT_TABS":return i.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return i.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}}},this.variables={},this.getVariableValue=function(e,t){return this.variables.hasOwnProperty(t)?this.variables[t](e,t)||"":this.$getDefaultValue(e,t)||""},this.tmStrFormat=function(e,t,n){var i=t.flag||"",r=t.guard;r=new RegExp(r,i.replace(/[^gi]/,""));var s=this.tokenizeTmSnippet(t.fmt,"formatString"),a=this,o=e.replace(r,(function(){a.variables.__=arguments;for(var e=a.resolveVariables(s,n),t="E",i=0;i1?(b=t[t.length-1].length,v+=t.length-1):b+=e.length,y+=e}else e.start?e.end={row:v,column:b}:e.start={row:v,column:b}}));var w=e.getSelectionRange(),_=e.session.replace(w,y),x=new h(e),k=e.inVirtualSelectionMode&&e.selection.index;x.addTabstops(o,w.start,_,k)},this.insertSnippet=function(e,t){var n=this;if(e.inVirtualSelectionMode)return n.insertSnippetForSelection(e,t);e.forEachSelection((function(){n.insertSnippetForSelection(e,t)}),null,{keepOrder:!0}),e.tabstopManager&&e.tabstopManager.tabNext()},this.$getScope=function(e){var t=e.session.$mode.$id||"";if(t=t.split("/").pop(),"html"===t||"php"===t){"php"!==t||e.session.$mode.inlinePhp||(t="html");var n=e.getCursorPosition(),i=e.session.getState(n.row);"object"===typeof i&&(i=i[0]),i.substring&&("js-"==i.substring(0,3)?t="javascript":"css-"==i.substring(0,4)?t="css":"php-"==i.substring(0,4)&&(t="php"))}return t},this.getActiveScopes=function(e){var t=this.$getScope(e),n=[t],i=this.snippetMap;return i[t]&&i[t].includeScopes&&n.push.apply(n,i[t].includeScopes),n.push("_"),n},this.expandWithTab=function(e,t){var n=this,i=e.forEachSelection((function(){return n.expandSnippetForSelection(e,t)}),null,{keepOrder:!0});return i&&e.tabstopManager&&e.tabstopManager.tabNext(),i},this.expandSnippetForSelection=function(e,t){var n,i=e.getCursorPosition(),r=e.session.getLine(i.row),s=r.substring(0,i.column),a=r.substr(i.column),o=this.snippetMap;return this.getActiveScopes(e).some((function(e){var t=o[e];return t&&(n=this.findMatchingSnippet(t,s,a)),!!n}),this),!!n&&(t&&t.dryRun||(e.session.doc.removeInLine(i.row,i.column-n.replaceBefore.length,i.column+n.replaceAfter.length),this.variables.M__=n.matchBefore,this.variables.T__=n.matchAfter,this.insertSnippetForSelection(e,n.content),this.variables.M__=this.variables.T__=null),!0)},this.findMatchingSnippet=function(e,t,n){for(var i=e.length;i--;){var r=e[i];if((!r.startRe||r.startRe.test(t))&&((!r.endRe||r.endRe.test(n))&&(r.startRe||r.endRe)))return r.matchBefore=r.startRe?r.startRe.exec(t):[""],r.matchAfter=r.endRe?r.endRe.exec(n):[""],r.replaceBefore=r.triggerRe?r.triggerRe.exec(t)[0]:"",r.replaceAfter=r.endTriggerRe?r.endTriggerRe.exec(n)[0]:"",r}},this.snippetMap={},this.snippetNameMap={},this.register=function(e,t){var n=this.snippetMap,i=this.snippetNameMap,r=this;function a(e){return e&&!/^\^?\(.*\)\$?$|^\\b$/.test(e)&&(e="(?:"+e+")"),e||""}function o(e,t,n){return e=a(e),t=a(t),n?(e=t+e,e&&"$"!=e[e.length-1]&&(e+="$")):(e+=t,e&&"^"!=e[0]&&(e="^"+e)),new RegExp(e)}function c(e){e.scope||(e.scope=t||"_"),t=e.scope,n[t]||(n[t]=[],i[t]={});var a=i[t];if(e.name){var c=a[e.name];c&&r.unregister(c),a[e.name]=e}n[t].push(e),e.tabTrigger&&!e.trigger&&(!e.guard&&/^\w/.test(e.tabTrigger)&&(e.guard="\\b"),e.trigger=s.escapeRegExp(e.tabTrigger)),(e.trigger||e.guard||e.endTrigger||e.endGuard)&&(e.startRe=o(e.trigger,e.guard,!0),e.triggerRe=new RegExp(e.trigger,"",!0),e.endRe=o(e.endTrigger,e.endGuard,!0),e.endTriggerRe=new RegExp(e.endTrigger,"",!0))}e||(e=[]),e&&e.content?c(e):Array.isArray(e)&&e.forEach(c),this._signal("registerSnippets",{scope:t})},this.unregister=function(e,t){var n=this.snippetMap,i=this.snippetNameMap;function r(e){var r=i[e.scope||t];if(r&&r[e.name]){delete r[e.name];var s=n[e.scope||t],a=s&&s.indexOf(e);a>=0&&s.splice(a,1)}}e.content?r(e):Array.isArray(e)&&e.forEach(r)},this.parseSnippetFile=function(e){e=e.replace(/\r/g,"");var t,n=[],i={},r=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;while(t=r.exec(e)){if(t[1])try{i=JSON.parse(t[1]),n.push(i)}catch(c){}if(t[4])i.content=t[4].replace(/^\t/gm,""),n.push(i),i={};else{var s=t[2],a=t[3];if("regex"==s){var o=/\/((?:[^\/\\]|\\.)*)|$/g;i.guard=o.exec(a)[1],i.trigger=o.exec(a)[1],i.endTrigger=o.exec(a)[1],i.endGuard=o.exec(a)[1]}else"snippet"==s?(i.tabTrigger=a.match(/^\S*/)[0],i.name||(i.name=a)):i[s]=a}}return n},this.getSnippetByName=function(e,t){var n,i=this.snippetNameMap;return this.getActiveScopes(t).some((function(t){var r=i[t];return r&&(n=r[e]),!!n}),this),n}}).call(d.prototype);var h=function(e){if(e.tabstopManager)return e.tabstopManager;e.tabstopManager=this,this.$onChange=this.onChange.bind(this),this.$onChangeSelection=s.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(e)};(function(){this.attach=function(e){this.index=0,this.ranges=[],this.tabstops=[],this.$openTabstops=null,this.selectedTabstop=null,this.editor=e,this.editor.on("change",this.$onChange),this.editor.on("changeSelection",this.$onChangeSelection),this.editor.on("changeSession",this.$onChangeSession),this.editor.commands.on("afterExec",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges=null,this.tabstops=null,this.selectedTabstop=null,this.editor.removeListener("change",this.$onChange),this.editor.removeListener("changeSelection",this.$onChangeSelection),this.editor.removeListener("changeSession",this.$onChangeSession),this.editor.commands.removeListener("afterExec",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.editor=null},this.onChange=function(e){var t="r"==e.action[0],n=e.start,i=e.end,r=n.row,s=i.row,a=s-r,o=i.column-n.column;if(t&&(a=-a,o=-o),!this.$inChange&&t){var c=this.selectedTabstop,l=c&&!c.some((function(e){return u(e.start,n)<=0&&u(e.end,i)>=0}));if(l)return this.detach()}for(var d=this.ranges,h=0;h0?(this.removeRange(f),h--):(f.start.row==r&&f.start.column>n.column&&(f.start.column+=o),f.end.row==r&&f.end.column>=n.column&&(f.end.column+=o),f.start.row>=r&&(f.start.row+=a),f.end.row>=r&&(f.end.row+=a),u(f.start,f.end)>0&&this.removeRange(f)))}d.length||this.detach()},this.updateLinkedFields=function(){var e=this.selectedTabstop;if(e&&e.hasLinkedRanges){this.$inChange=!0;for(var n=this.editor.session,i=n.getTextRange(e.firstNonLinked),r=e.length;r--;){var s=e[r];if(s.linked){var a=t.snippetManager.tmStrFormat(i,s.original);n.replace(s,a)}}this.$inChange=!1}},this.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},this.onChangeSelection=function(){if(this.editor){for(var e=this.editor.selection.lead,t=this.editor.selection.anchor,n=this.editor.selection.isEmpty(),i=this.ranges.length;i--;)if(!this.ranges[i].linked){var r=this.ranges[i].contains(e.row,e.column),s=n||this.ranges[i].contains(t.row,t.column);if(r&&s)return}this.detach()}},this.onChangeSession=function(){this.detach()},this.tabNext=function(e){var t=this.tabstops.length,n=this.index+(e||1);n=Math.min(Math.max(n,1),t),n==t&&(n=0),this.selectTabstop(n),0===n&&this.detach()},this.selectTabstop=function(e){this.$openTabstops=null;var t=this.tabstops[this.index];if(t&&this.addTabstopMarkers(t),this.index=e,t=this.tabstops[this.index],t&&t.length){if(this.selectedTabstop=t,this.editor.inVirtualSelectionMode)this.editor.selection.setRange(t.firstNonLinked);else{var n=this.editor.multiSelect;n.toSingleRange(t.firstNonLinked.clone());for(var i=t.length;i--;)t.hasLinkedRanges&&t[i].linked||n.addRange(t[i].clone(),!0);n.ranges[0]&&n.addRange(n.ranges[0].clone())}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)}},this.addTabstops=function(e,t,n){if(this.$openTabstops||(this.$openTabstops=[]),!e[0]){var i=a.fromPoints(n,n);g(i.start,t),g(i.end,t),e[0]=[i],e[0].index=0}var r=this.index,s=[r+1,0],o=this.ranges;e.forEach((function(e,n){for(var i=this.$openTabstops[n]||e,r=e.length;r--;){var c=e[r],l=a.fromPoints(c.start,c.end||c.start);p(l.start,t),p(l.end,t),l.original=c,l.tabstop=i,o.push(l),i!=e?i.unshift(l):i[r]=l,c.fmtString?(l.linked=!0,i.hasLinkedRanges=!0):i.firstNonLinked||(i.firstNonLinked=l)}i.firstNonLinked||(i.hasLinkedRanges=!1),i===e&&(s.push(i),this.$openTabstops[n]=i),this.addTabstopMarkers(i)}),this),s.length>2&&(this.tabstops.length&&s.push(s.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,s))},this.addTabstopMarkers=function(e){var t=this.editor.session;e.forEach((function(e){e.markerId||(e.markerId=t.addMarker(e,"ace_snippet-marker","text"))}))},this.removeTabstopMarkers=function(e){var t=this.editor.session;e.forEach((function(e){t.removeMarker(e.markerId),e.markerId=null}))},this.removeRange=function(e){var t=e.tabstop.indexOf(e);e.tabstop.splice(t,1),t=this.ranges.indexOf(e),this.ranges.splice(t,1),this.editor.session.removeMarker(e.markerId),e.tabstop.length||(t=this.tabstops.indexOf(e.tabstop),-1!=t&&this.tabstops.splice(t,1),this.tabstops.length||this.detach())},this.keyboardHandler=new c,this.keyboardHandler.bindKeys({Tab:function(e){t.snippetManager&&t.snippetManager.expandWithTab(e)||e.tabstopManager.tabNext(1)},"Shift-Tab":function(e){e.tabstopManager.tabNext(-1)},Esc:function(e){e.tabstopManager.detach()},Return:function(e){return!1}})}).call(h.prototype);var f={};f.onChange=o.prototype.onChange,f.setPosition=function(e,t){this.pos.row=e,this.pos.column=t},f.update=function(e,t,n){this.$insertRight=n,this.pos=e,this.onChange(t)};var p=function(e,t){0==e.row&&(e.column+=t.column),e.row+=t.row},g=function(e,t){e.row==t.row&&(e.column-=t.column),e.row-=t.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}"),t.snippetManager=new d;var m=e("./editor").Editor;(function(){this.insertSnippet=function(e,n){return t.snippetManager.insertSnippet(this,e,n)},this.expandSnippet=function(e){return t.snippetManager.expandWithTab(this,e)}}).call(m.prototype)})),ace.define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"],(function(e,t,n){"use strict";var i=e("../virtual_renderer").VirtualRenderer,r=e("../editor").Editor,s=e("../range").Range,a=e("../lib/event"),o=e("../lib/lang"),c=e("../lib/dom"),l=function(e){var t=new i(e);t.$maxLines=4;var n=new r(t);return n.setHighlightActiveLine(!1),n.setShowPrintMargin(!1),n.renderer.setShowGutter(!1),n.renderer.setHighlightGutterLine(!1),n.$mouseHandler.$focusWaitTimout=0,n.$highlightTagPending=!0,n},u=function(e){var t=c.createElement("div"),n=new l(t);e&&e.appendChild(t),t.style.display="none",n.renderer.content.style.cursor="default",n.renderer.setStyle("ace_autocomplete"),n.setOption("displayIndentGuides",!1),n.setOption("dragDelay",150);var i,r=function(){};n.focus=r,n.$isFocused=!0,n.renderer.$cursorLayer.restartTimer=r,n.renderer.$cursorLayer.element.style.opacity=0,n.renderer.$maxLines=8,n.renderer.$keepTextAreaAtCursor=!1,n.setHighlightActiveLine(!1),n.session.highlight(""),n.session.$searchHighlight.clazz="ace_highlight-marker",n.on("mousedown",(function(e){var t=e.getDocumentPosition();n.selection.moveToPosition(t),d.start.row=d.end.row=t.row,e.stop()}));var u=new s(-1,0,-1,1/0),d=new s(-1,0,-1,1/0);d.id=n.session.addMarker(d,"ace_active-line","fullLine"),n.setSelectOnHover=function(e){e?u.id&&(n.session.removeMarker(u.id),u.id=null):u.id=n.session.addMarker(u,"ace_line-hover","fullLine")},n.setSelectOnHover(!1),n.on("mousemove",(function(e){if(i){if(i.x!=e.x||i.y!=e.y){i=e,i.scrollTop=n.renderer.scrollTop;var t=i.getDocumentPosition().row;u.start.row!=t&&(u.id||n.setRow(t),f(t))}}else i=e})),n.renderer.on("beforeRender",(function(){if(i&&-1!=u.start.row){i.$pos=null;var e=i.getDocumentPosition().row;u.id||n.setRow(e),f(e,!0)}})),n.renderer.on("afterRender",(function(){var e=n.getRow(),t=n.renderer.$textLayer,i=t.element.childNodes[e-t.config.firstRow];i!=t.selectedNode&&(t.selectedNode&&c.removeCssClass(t.selectedNode,"ace_selected"),t.selectedNode=i,i&&c.addCssClass(i,"ace_selected"))}));var h=function(){f(-1)},f=function(e,t){e!==u.start.row&&(u.start.row=u.end.row=e,t||n.session._emit("changeBackMarker"),n._emit("changeHoverMarker"))};n.getHoveredRow=function(){return u.start.row},a.addListener(n.container,"mouseout",h),n.on("hide",h),n.on("changeSelection",h),n.session.doc.getLength=function(){return n.data.length},n.session.doc.getLine=function(e){var t=n.data[e];return"string"==typeof t?t:t&&t.value||""};var p=n.session.bgTokenizer;return p.$tokenizeRow=function(e){var t=n.data[e],i=[];if(!t)return i;"string"==typeof t&&(t={value:t}),t.caption||(t.caption=t.value||t.name);for(var r,s,a=-1,o=0;oc-2&&(l=l.substr(0,c-t.caption.length-3)+"…"),i.push({type:"rightAlignedText",value:l})}return i},p.$updateOnChange=r,p.start=r,n.session.$computeWidth=function(){return this.screenWidth=0},n.$blockScrolling=1/0,n.isOpen=!1,n.isTopdown=!1,n.autoSelect=!0,n.data=[],n.setData=function(e){n.setValue(o.stringRepeat("\n",e.length),-1),n.data=e||[],n.setRow(0)},n.getData=function(e){return n.data[e]},n.getRow=function(){return d.start.row},n.setRow=function(e){e=Math.max(this.autoSelect?0:-1,Math.min(this.data.length,e)),d.start.row!=e&&(n.selection.clearSelection(),d.start.row=d.end.row=e||0,n.session._emit("changeBackMarker"),n.moveCursorTo(e||0,0),n.isOpen&&n._signal("select"))},n.on("changeSelection",(function(){n.isOpen&&n.setRow(n.selection.lead.row),n.renderer.scrollCursorIntoView()})),n.hide=function(){this.container.style.display="none",this._signal("hide"),n.isOpen=!1},n.show=function(e,t,r){var s=this.container,a=window.innerHeight,o=window.innerWidth,c=this.renderer,l=c.$maxLines*t*1.4,u=e.top+this.$borderSize,d=u>a/2&&!r;d&&u+t+l>a?(c.$maxPixelHeight=u-2*this.$borderSize,s.style.top="",s.style.bottom=a-u+"px",n.isTopdown=!1):(u+=t,c.$maxPixelHeight=a-u-.2*t,s.style.top=u+"px",s.style.bottom="",n.isTopdown=!0),s.style.display="",this.renderer.$textLayer.checkForSizeChanges();var h=e.left;h+s.offsetWidth>o&&(h=o-s.offsetWidth),s.style.left=h+"px",this._signal("show"),i=null,n.isOpen=!0},n.getTextLeftOffset=function(){return this.$borderSize+this.renderer.$padding+this.$imageSize},n.$imageSize=0,n.$borderSize=1,n};c.importCssString(".ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #CAD6FA; z-index: 1;}.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid #abbffe; margin-top: -1px; background: rgba(233,233,253,0.4);}.ace_editor.ace_autocomplete .ace_line-hover { position: absolute; z-index: 2;}.ace_editor.ace_autocomplete .ace_scroller { background: none; border: none; box-shadow: none;}.ace_rightAlignedText { color: gray; display: inline-block; position: absolute; right: 4px; text-align: right; z-index: -1;}.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #000; text-shadow: 0 0 0.01em;}.ace_editor.ace_autocomplete { width: 280px; z-index: 200000; background: #fbfbfb; color: #444; border: 1px lightgray solid; position: fixed; box-shadow: 2px 3px 5px rgba(0,0,0,.2); line-height: 1.4;}"),t.AcePopup=u})),ace.define("ace/autocomplete/util",["require","exports","module"],(function(e,t,n){"use strict";t.parForEach=function(e,t,n){var i=0,r=e.length;0===r&&n();for(var s=0;s=0;s--){if(!n.test(e[s]))break;r.push(e[s])}return r.reverse().join("")},t.retrieveFollowingIdentifier=function(e,t,n){n=n||i;for(var r=[],s=t;s=n?-1:t+1;break;case"start":t=0;break;case"end":t=n;break}this.popup.setRow(t)},this.insertMatch=function(e,t){if(e||(e=this.popup.getData(this.popup.getRow())),!e)return!1;if(e.completer&&e.completer.insertMatch)e.completer.insertMatch(this.editor,e);else{if(this.completions.filterText)for(var n,i=this.editor.selection.getAllRanges(),r=0;n=i[r];r++)n.start.column-=this.completions.filterText.length,this.editor.session.remove(n);e.snippet?c.insertSnippet(this.editor,e.snippet):this.editor.execCommand("insertstring",e.value||e)}this.detach()},this.commands={Up:function(e){e.completer.goTo("up")},Down:function(e){e.completer.goTo("down")},"Ctrl-Up|Ctrl-Home":function(e){e.completer.goTo("start")},"Ctrl-Down|Ctrl-End":function(e){e.completer.goTo("end")},Esc:function(e){e.completer.detach()},Return:function(e){return e.completer.insertMatch()},"Shift-Return":function(e){e.completer.insertMatch(null,{deleteSuffix:!0})},Tab:function(e){var t=e.completer.insertMatch();if(t||e.tabstopManager)return t;e.completer.goTo("down")},PageUp:function(e){e.completer.popup.gotoPageUp()},PageDown:function(e){e.completer.popup.gotoPageDown()}},this.gatherCompletions=function(e,t){var n=e.getSession(),i=e.getCursorPosition(),r=s.getCompletionPrefix(e);this.base=n.doc.createAnchor(i.row,i.column-r.length),this.base.$insertRight=!0;var a=[],o=e.completers.length;return e.completers.forEach((function(c,l){c.getCompletions(e,n,i,r,(function(n,i){!n&&i&&(a=a.concat(i)),t(null,{prefix:s.getCompletionPrefix(e),matches:a,finished:0===--o})}))})),!0},this.showPopup=function(e){this.editor&&this.detach(),this.activated=!0,this.editor=e,e.completer!=this&&(e.completer&&e.completer.detach(),e.completer=this),e.on("changeSelection",this.changeListener),e.on("blur",this.blurListener),e.on("mousedown",this.mousedownListener),e.on("mousewheel",this.mousewheelListener),this.updateCompletions()},this.updateCompletions=function(e){if(e&&this.base&&this.completions){var t=this.editor.getCursorPosition(),n=this.editor.session.getTextRange({start:this.base,end:t});if(n==this.completions.filterText)return;return this.completions.setFilter(n),this.completions.filtered.length?1!=this.completions.filtered.length||this.completions.filtered[0].value!=n||this.completions.filtered[0].snippet?void this.openPopup(this.editor,n,e):this.detach():this.detach()}var i=this.gatherCompletionsId;this.gatherCompletions(this.editor,function(t,n){var r=function(){if(n.finished)return this.detach()}.bind(this),s=n.prefix,a=n&&n.matches;if(!a||!a.length)return r();if(0===s.indexOf(n.prefix)&&i==this.gatherCompletionsId){this.completions=new u(a),this.exactMatch&&(this.completions.exactMatch=!0),this.completions.setFilter(s);var o=this.completions.filtered;return o.length&&(1!=o.length||o[0].value!=s||o[0].snippet)?this.autoInsert&&1==o.length&&n.finished?this.insertMatch(o[0]):void this.openPopup(this.editor,s,e):r()}}.bind(this))},this.cancelContextMenu=function(){this.editor.$mouseHandler.cancelContextMenu()},this.updateDocTooltip=function(){var e=this.popup,t=e.data,n=t&&(t[e.getHoveredRow()]||t[e.getRow()]),i=null;return n&&this.editor&&this.popup.isOpen?(this.editor.completers.some((function(e){return e.getDocTooltip&&(i=e.getDocTooltip(n)),i})),i||(i=n),"string"==typeof i&&(i={docText:i}),i&&(i.docHTML||i.docText)?void this.showDocTooltip(i):this.hideDocTooltip()):this.hideDocTooltip()},this.showDocTooltip=function(e){this.tooltipNode||(this.tooltipNode=o.createElement("div"),this.tooltipNode.className="ace_tooltip ace_doc-tooltip",this.tooltipNode.style.margin=0,this.tooltipNode.style.pointerEvents="auto",this.tooltipNode.tabIndex=-1,this.tooltipNode.onblur=this.blurListener.bind(this),this.tooltipNode.onclick=this.onTooltipClick.bind(this));var t=this.tooltipNode;e.docHTML?t.innerHTML=e.docHTML:e.docText&&(t.textContent=e.docText),t.parentNode||document.body.appendChild(t);var n=this.popup,i=n.container.getBoundingClientRect();t.style.top=n.container.style.top,t.style.bottom=n.container.style.bottom,window.innerWidth-i.right<320?(t.style.right=window.innerWidth-i.left+"px",t.style.left=""):(t.style.left=i.right+1+"px",t.style.right=""),t.style.display="block"},this.hideDocTooltip=function(){if(this.tooltipTimer.cancel(),this.tooltipNode){var e=this.tooltipNode;this.editor.isFocused()||document.activeElement!=e||this.editor.focus(),this.tooltipNode=null,e.parentNode&&e.parentNode.removeChild(e)}},this.onTooltipClick=function(e){var t=e.target;while(t&&t!=this.tooltipNode){if("A"==t.nodeName&&t.href){t.rel="noreferrer",t.target="_blank";break}t=t.parentNode}}}).call(l.prototype),l.startCommand={name:"startAutocomplete",exec:function(e){e.completer||(e.completer=new l),e.completer.autoInsert=!1,e.completer.autoSelect=!0,e.completer.showPopup(e),e.completer.cancelContextMenu()},bindKey:"Ctrl-Space|Ctrl-Shift-Space|Alt-Space"};var u=function(e,t){this.all=e,this.filtered=e,this.filterText=t||"",this.exactMatch=!1};(function(){this.setFilter=function(e){if(e.length>this.filterText&&0===e.lastIndexOf(this.filterText,0))var t=this.filtered;else t=this.all;this.filterText=e,t=this.filterCompletions(t,this.filterText),t=t.sort((function(e,t){return t.exactMatch-e.exactMatch||t.score-e.score}));var n=null;t=t.filter((function(e){var t=e.snippet||e.caption||e.value;return t!==n&&(n=t,!0)})),this.filtered=t},this.filterCompletions=function(e,t){var n=[],i=t.toUpperCase(),r=t.toLowerCase();e:for(var s,a=0;s=e[a];a++){var o=s.value||s.caption||s.snippet;if(o){var c,l,u=-1,d=0,h=0;if(this.exactMatch){if(t!==o.substr(0,t.length))continue e}else for(var f=0;f=0&&(g<0||p0&&(-1===u&&(h+=10),h+=l),d|=1<",a.escapeHTML(e.caption),"","
    ",a.escapeHTML(e.snippet)].join(""))}},d=[u,c,l];t.setCompleters=function(e){d.length=0,e&&d.push.apply(d,e)},t.addCompleter=function(e){d.push(e)},t.textCompleter=c,t.keyWordCompleter=l,t.snippetCompleter=u;var h={name:"expandSnippet",exec:function(e){return i.expandWithTab(e)},bindKey:"Tab"},f=function(e,t){p(t.session.$mode)},p=function(e){var t=e.$id;i.files||(i.files={}),g(t),e.modes&&e.modes.forEach(p)},g=function(e){if(e&&!i.files[e]){var t=e.replace("mode","snippets");i.files[e]={},s.loadModule(t,(function(t){t&&(i.files[e]=t,!t.snippets&&t.snippetText&&(t.snippets=i.parseSnippetFile(t.snippetText)),i.register(t.snippets||[],t.scope),t.includeScopes&&(i.snippetMap[t.scope].includeScopes=t.includeScopes,t.includeScopes.forEach((function(e){g("ace/mode/"+e)}))))}))}},m=function(e){var t=e.editor,n=t.completer&&t.completer.activated;if("backspace"===e.command.name)n&&!o.getCompletionPrefix(t)&&t.completer.detach();else if("insertstring"===e.command.name){var i=o.getCompletionPrefix(t);i&&!n&&(t.completer||(t.completer=new r),t.completer.autoInsert=!1,t.completer.showPopup(t))}},v=e("../editor").Editor;e("../config").defineOptions(v.prototype,"editor",{enableBasicAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:d),this.commands.addCommand(r.startCommand)):this.commands.removeCommand(r.startCommand)},value:!1},enableLiveAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:d),this.commands.on("afterExec",m)):this.commands.removeListener("afterExec",m)},value:!1},enableSnippets:{set:function(e){e?(this.commands.addCommand(h),this.on("changeMode",f),f(null,this)):(this.commands.removeCommand(h),this.off("changeMode",f))},value:!1}})})),function(){ace.acequire(["ace/ext/language_tools"],(function(){}))}()},"20a6":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.passcode,expression:"passcode"}],attrs:{placeholder:"Enter passcode...",autofocus:""},domProps:{value:e.passcode},on:{input:function(t){t.target.composing||(e.passcode=t.target.value)}}}),n("vui-button",{attrs:{params:{passcode:e.passcode}}},[e._v("Submit")])],1)},r=[],s={data:function(){return{passcode:""}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"20bf":function(e,t,n){"use strict";var i=n("8aa7"),r=n("ebb5").exportTypedArrayStaticMethod,s=n("a078");r("from",s,i)},"210c":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.minButton?n("vui-button",{attrs:{disabled:e.val<=e.min},on:{click:function(t){return e.onUpdatedValue(e.min+1-e.val)}}},[e._v("Min")]):e._e(),e._l(e.subButtons,(function(t){return n("vui-button",{key:"-"+t,attrs:{disabled:e.val-te.max},on:{click:function(n){return e.onUpdatedValue(Math.pow(10,t))}}},[e._v("+")])})),e.maxButton?n("vui-button",{attrs:{disabled:e.val>=e.max},on:{click:function(t){return e.onUpdatedValue(e.max-e.val)}}},[e._v("Max")]):e._e()],2)},r=[],s=(n("a9e3"),n("8a79"),n("c0d6")),a={props:{value:{type:Number,default:0},minButton:{type:Boolean,default:!1},maxButton:{type:Boolean,default:!1},buttonCount:{type:Number,default:1},min:{type:Number,default:0},max:{type:Number,default:100},pushState:{type:Boolean,default:!0},width:{type:String,default:"10em"},decimalPlaces:{type:Number,default:0}},data:function(){return{val:this.value}},computed:{subButtons:function(){if(!this.buttonCount)return[];for(var e=[],t=this.buttonCount-1;t>=0;t--)e.push(t);return e},addButtons:function(){if(!this.buttonCount)return[];for(var e=[],t=0;tthis.max&&(e=this.max),eh;h++)if(p=k(e[h]),p&&p instanceof l)return p;return new l(!1)}u=d.call(e)}g=u.next;while(!(m=g.call(u)).done){try{p=k(m.value)}catch(A){throw c(u),A}if("object"==typeof p&&p&&p instanceof l)return p}return new l(!1)}},2315:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("strike")},{strike:function(){return r(this,"strike","","")}})},2351:function(e,t,n){var i=n("746f");i("split")},"23cb":function(e,t,n){var i=n("a691"),r=Math.max,s=Math.min;e.exports=function(e,t){var n=i(e);return n<0?r(n+t,0):s(n,t)}},"23dc":function(e,t,n){var i=n("d44e");i(Math,"Math",!0)},"23e7":function(e,t,n){var i=n("da84"),r=n("06cf").f,s=n("9112"),a=n("6eeb"),o=n("ce4e"),c=n("e893"),l=n("94ca");e.exports=function(e,t){var n,u,d,h,f,p,g=e.target,m=e.global,v=e.stat;if(u=m?i:v?i[g]||o(g,{}):(i[g]||{}).prototype,u)for(d in t){if(f=t[d],e.noTargetGet?(p=r(u,d),h=p&&p.value):h=u[d],n=l(m?d:g+(v?".":"#")+d,e.forced),!n&&void 0!==h){if(typeof f===typeof h)continue;c(f,h)}(e.sham||h&&h.sham)&&s(f,"sham",!0),a(u,d,f,e)}}},"241c":function(e,t,n){var i=n("ca84"),r=n("7839"),s=r.concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return i(e,s)}},2480:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-button",{attrs:{params:{stop:1}}},[e._v("Stop")]),n("br"),n(e.term,{tag:"component",staticClass:"terminal"})],1)},r=[],s=n("025e"),a={props:["fg","bg"],computed:{style:function(){return{color:"#"+this.fg,"background-color":"#"+this.bg}}},template:''},o={props:["to"],methods:{invoke:function(){s["a"].sendToTopic({terminal_topic:this.to})}},template:''},c={data:function(){return{s:this.$root.$data.state}},computed:{term:function(){return{components:{co:a,to:o},template:"
    ".concat(this.s.terminal,"
    ")}}}},l=c,u=(n("ebf5"),n("2877")),d=Object(u["a"])(l,i,r,!1,null,"3a6a6067",null);t["default"]=d.exports},2532:function(e,t,n){"use strict";var i=n("23e7"),r=n("5a34"),s=n("1d80"),a=n("ab13");i({target:"String",proto:!0,forced:!a("includes")},{includes:function(e){return!!~String(s(this)).indexOf(r(e),arguments.length>1?arguments[1]:void 0)}})},"253b":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("h3",[e._v("Auxiliary Timing Unit:")]),e.timeractive?n("vui-button",{attrs:{params:{time:1}}},[e._v("Arming")]):n("vui-button",{attrs:{params:{time:1}}},[e._v("Not Arming")])],1),n("div",[n("h3",[e._v("Time Left:")]),n("vui-button",{attrs:{params:{tp:-30}}},[e._v("--")]),n("vui-button",{attrs:{params:{tp:-1}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.minute)+":"+e._s(e.second))]),n("vui-button",{attrs:{params:{tp:1}}},[e._v("+")]),n("vui-button",{attrs:{params:{tp:30}}},[e._v("++")])],1),n("div",[n("h3",[e._v("Scanning:")]),e.scanning?n("vui-button",{attrs:{params:{scanning:1}}},[e._v("Armed")]):n("vui-button",{attrs:{params:{scanning:1}}},[e._v("Not Armed")]),n("span",{staticClass:"value"},[e._v("Movement sensor active when armed!")])],1),n("div",[n("h3",[e._v("Range:")]),n("vui-button",{attrs:{params:{range:-1}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.range))]),n("vui-button",{attrs:{params:{range:1}}},[e._v("+")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("de06"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"10d6546a",null);t["default"]=c.exports},"256f":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("vui-group",[n("vui-group-item",{attrs:{label:"UID:"}},[e._v(e._s(e.incident.id))]),n("vui-group-item",{attrs:{label:"Date:"}},[e._v(e._s(e.incident.datetime))]),n("vui-group-item",{attrs:{label:"Charges:"}},e._l(e.incident.charges,(function(t,i){return n("span",{key:i},[e._v(" "+e._s(t)),i+11?arguments[1]:void 0)}))},"25eb":function(e,t,n){var i=n("23e7"),r=n("c20d");i({target:"Number",stat:!0,forced:Number.parseInt!=r},{parseInt:r})},"25f0":function(e,t,n){"use strict";var i=n("6eeb"),r=n("825a"),s=n("d039"),a=n("ad6d"),o="toString",c=RegExp.prototype,l=c[o],u=s((function(){return"/a/b"!=l.call({source:"a",flags:"b"})})),d=l.name!=o;(u||d)&&i(RegExp.prototype,o,(function(){var e=r(this),t=String(e.source),n=e.flags,i=String(void 0===n&&e instanceof RegExp&&!("flags"in c)?a.call(e):n);return"/"+t+"/"+i}),{unsafe:!0})},2626:function(e,t,n){"use strict";var i=n("d066"),r=n("9bf2"),s=n("b622"),a=n("83ab"),o=s("species");e.exports=function(e){var t=i(e),n=r.f;a&&t&&!t[o]&&n(t,o,{configurable:!0,get:function(){return this}})}},2653:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{staticClass:"clear-both"},[n("vui-img",{staticClass:"character-image",attrs:{name:"character"}}),n("p",[e._v(" Welcome, "),n("strong",[e._v(e._s(e.character_name))]),e._v("."),n("br"),e._v(" Round duration: "),n("strong",[e._v(e._s(e.round_duration))]),n("br"),e._v(" Alert level: "),n("strong",{style:{color:e.alertLevelColor}},[e._v(e._s(e.alert_level))]),n("br")])],1),n("div",{staticClass:"clear-both"},[e.shuttleStatusMessage?n("strong",[e._v(e._s(e.shuttleStatusMessage))]):e._e(),n("br"),e._v(" Choose from the following available positions: ")]),e.unique_role_available?n("div",[n("div",{staticClass:"gs-block"},[n("div",{staticClass:"dept"},[e._v("A unique role is available!")]),n("vui-button",{staticClass:"d-block m-1",attrs:{params:{ghostspawner:1},icon:"ghost"}},[e._v("Ghost Spawner Menu")])],1)]):n("div",[n("vui-button",{staticClass:"d-block",attrs:{params:{ghostspawner:1},icon:"ghost"}},[e._v("Ghost Spawner Menu")])],1),e.jobs_available>0?n("div",[e._l(e.fixedJobsList,(function(t,i){return n("div",{key:i,staticClass:"mt-2 dept-block",class:"border-dept-"+i.toLowerCase()},[n("div",{staticClass:"dept mb-1",class:"bg-dept-"+i.toLowerCase()},[e._v(" "+e._s(i)+" ")]),e._l(t,(function(t){return n("div",{key:t.title},[n("vui-button",{staticClass:"d-block mx-1",attrs:{params:{SelectedJob:t.title}}},[n("span",{class:{"fw-bold":t.head}},[e._v(e._s(t.title))]),1!=t.total_positions?n("span",[e._v(" ("+e._s(t.current_positions)),t.total_positions>1?n("span",[e._v(" / "+e._s(t.total_positions))]):e._e(),e._v(")")]):e._e()])],1)}))],2)})),n("span",{staticClass:"fs-small fst-italic"},[e._v("Numbers in brackets show current amount of active players out of all available job slots for that job.")])],2):n("div",{staticClass:"fst-italic"},[e._v(" No jobs available. ")])])},r=[];n("a4d3"),n("e01a"),n("d28b"),n("4de4"),n("a630"),n("e260"),n("fb6a"),n("b0c0"),n("4fad"),n("c1f9"),n("d3b7"),n("25f0"),n("3ca3"),n("ddb0");function s(e,t){return u(e)||l(e,t)||o(e,t)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){if(e){if("string"===typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n0})))},shuttleStatusMessage:function(){switch(this.shuttle_status){case"post-evac":return"The station has been evacuated.";case"evac":return"The station is currently undergoing evacuation procedures.";case"transfer":return"The station is currently undergoing crew transfer procedures."}return null},alertLevelColor:function(){switch(this.alert_level.toLowerCase()){case"green":return"inherit";case"blue":return"blue";case"yellow":return"yellow"}return"red"}}},h=d,f=(n("11f5"),n("2877")),p=Object(f["a"])(h,i,r,!1,null,"36f58934",null);t["default"]=p.exports},"26e9":function(e,t,n){"use strict";var i=n("23e7"),r=n("e8b5"),s=[].reverse,a=[1,2];i({target:"Array",proto:!0,forced:String(a)===String(a.reverse())},{reverse:function(){return r(this)&&(this.length=this.length),s.call(this)}})},2704:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabel"},[e._v(e._s(e.label))]),n("div",{staticClass:"itemContent"},[e._t("default")],2)])},r=[],s={props:{label:{type:String,default:""}}},a=s,o=(n("b593"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"68f8b60e",null);t["default"]=c.exports},"277d":function(e,t,n){var i=n("23e7"),r=n("e8b5");i({target:"Array",stat:!0},{isArray:r})},"27cd":function(e,t,n){"use strict";n("38d6")},2877:function(e,t,n){"use strict";function i(e,t,n,i,r,s,a,o){var c,l="function"===typeof e?e.options:e;if(t&&(l.render=t,l.staticRenderFns=n,l._compiled=!0),i&&(l.functional=!0),s&&(l._scopeId="data-v-"+s),a?(c=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),r&&r.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},l._ssrRegister=c):r&&(c=o?function(){r.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:r),c)if(l.functional){l._injectStyles=c;var u=l.render;l.render=function(e,t){return c.call(t),u(e,t)}}else{var d=l.beforeCreate;l.beforeCreate=d?[].concat(d,c):[c]}return{exports:e,options:l}}n.d(t,"a",(function(){return i}))},2954:function(e,t,n){"use strict";var i=n("ebb5"),r=n("4840"),s=n("d039"),a=i.aTypedArray,o=i.aTypedArrayConstructor,c=i.exportTypedArrayMethod,l=[].slice,u=s((function(){new Int8Array(1).slice()}));c("slice",(function(e,t){var n=l.call(a(this),e,t),i=r(this,this.constructor),s=0,c=n.length,u=new(o(i))(c);while(c>s)u[s]=n[s++];return u}),u)},"29f3":function(e,t){var n=Object.prototype,i=n.toString;function r(e){return i.call(e)}e.exports=r},"2a1b":function(e,t,n){var i=n("746f");i("match")},"2a62":function(e,t,n){var i=n("825a");e.exports=function(e){var t=e["return"];if(void 0!==t)return i(t.call(e)).value}},"2af1":function(e,t,n){var i=n("23e7"),r=n("f748");i({target:"Math",stat:!0},{sign:r})},"2b10":function(e,t){function n(e,t,n){var i=-1,r=e.length;t<0&&(t=-t>r?0:r+t),n=n>r?r:n,n<0&&(n+=r),r=t>n?0:n-t>>>0,t>>>=0;var s=Array(r);while(++i4)return e;for(n=[],i=0;i1&&"0"==r.charAt(0)&&(s=B.test(r)?16:8,r=r.slice(8==s?1:2)),""===r)a=0;else{if(!(10==s?O:8==s?R:M).test(r))return e;a=parseInt(r,s)}n.push(a)}for(i=0;i=C(256,5-t))return null}else if(a>255)return null;for(o=n.pop(),i=0;i6)return;i=0;while(h()){if(r=null,i>0){if(!("."==h()&&i<4))return;d++}if(!D.test(h()))return;while(D.test(h())){if(s=parseInt(h(),10),null===r)r=s;else{if(0==r)return;r=10*r+s}if(r>255)return;d++}c[l]=256*c[l]+r,i++,2!=i&&4!=i||l++}if(4!=i)return;break}if(":"==h()){if(d++,!h())return}else if(h())return;c[l++]=t}else{if(null!==u)return;d++,l++,u=l}}if(null!==u){a=l-u,l=7;while(0!=l&&a>0)o=c[l],c[l--]=c[u+a-1],c[u+--a]=o}else if(8!=l)return;return c},U=function(e){for(var t=null,n=1,i=null,r=0,s=0;s<8;s++)0!==e[s]?(r>n&&(t=i,n=r),i=null,r=0):(null===i&&(i=s),++r);return r>n&&(t=i,n=r),t},z=function(e){var t,n,i,r;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=A(e/256);return t.join(".")}if("object"==typeof e){for(t="",i=U(e),n=0;n<8;n++)r&&0===e[n]||(r&&(r=!1),i===n?(t+=n?":":"::",r=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},G={},q=h({},G,{" ":1,'"':1,"<":1,">":1,"`":1}),K=h({},q,{"#":1,"?":1,"{":1,"}":1}),Y=h({},K,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),X=function(e,t){var n=p(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Q=function(e){return d(J,e.scheme)},Z=function(e){return""!=e.username||""!=e.password},ee=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},te=function(e,t){var n;return 2==e.length&&T.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ne=function(e){var t;return e.length>1&&te(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},ie=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&te(t[0],!0)||t.pop()},re=function(e){return"."===e||"%2e"===e.toLowerCase()},se=function(e){return e=e.toLowerCase(),".."===e||"%2e."===e||".%2e"===e||"%2e%2e"===e},ae={},oe={},ce={},le={},ue={},de={},he={},fe={},pe={},ge={},me={},ve={},be={},ye={},we={},_e={},xe={},ke={},Ae={},Ce={},Ee={},Se=function(e,t,n,r){var s,a,o,c,l=n||ae,u=0,h="",p=!1,g=!1,m=!1;n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(P,"")),t=t.replace(N,""),s=f(t);while(u<=s.length){switch(a=s[u],l){case ae:if(!a||!T.test(a)){if(n)return S;l=ce;continue}h+=a.toLowerCase(),l=oe;break;case oe:if(a&&(L.test(a)||"+"==a||"-"==a||"."==a))h+=a.toLowerCase();else{if(":"!=a){if(n)return S;h="",l=ce,u=0;continue}if(n&&(Q(e)!=d(J,h)||"file"==h&&(Z(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=h,n)return void(Q(e)&&J[e.scheme]==e.port&&(e.port=null));h="","file"==e.scheme?l=ye:Q(e)&&r&&r.scheme==e.scheme?l=le:Q(e)?l=fe:"/"==s[u+1]?(l=ue,u++):(e.cannotBeABaseURL=!0,e.path.push(""),l=Ae)}break;case ce:if(!r||r.cannotBeABaseURL&&"#"!=a)return S;if(r.cannotBeABaseURL&&"#"==a){e.scheme=r.scheme,e.path=r.path.slice(),e.query=r.query,e.fragment="",e.cannotBeABaseURL=!0,l=Ee;break}l="file"==r.scheme?ye:de;continue;case le:if("/"!=a||"/"!=s[u+1]){l=de;continue}l=pe,u++;break;case ue:if("/"==a){l=ge;break}l=ke;continue;case de:if(e.scheme=r.scheme,a==i)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query;else if("/"==a||"\\"==a&&Q(e))l=he;else if("?"==a)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query="",l=Ce;else{if("#"!=a){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.path.pop(),l=ke;continue}e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query,e.fragment="",l=Ee}break;case he:if(!Q(e)||"/"!=a&&"\\"!=a){if("/"!=a){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,l=ke;continue}l=ge}else l=pe;break;case fe:if(l=pe,"/"!=a||"/"!=h.charAt(u+1))continue;u++;break;case pe:if("/"!=a&&"\\"!=a){l=ge;continue}break;case ge:if("@"==a){p&&(h="%40"+h),p=!0,o=f(h);for(var v=0;v65535)return $;e.port=Q(e)&&w===J[e.scheme]?null:w,h=""}if(n)return;l=xe;continue}return $}h+=a;break;case ye:if(e.scheme="file","/"==a||"\\"==a)l=we;else{if(!r||"file"!=r.scheme){l=ke;continue}if(a==i)e.host=r.host,e.path=r.path.slice(),e.query=r.query;else if("?"==a)e.host=r.host,e.path=r.path.slice(),e.query="",l=Ce;else{if("#"!=a){ne(s.slice(u).join(""))||(e.host=r.host,e.path=r.path.slice(),ie(e)),l=ke;continue}e.host=r.host,e.path=r.path.slice(),e.query=r.query,e.fragment="",l=Ee}}break;case we:if("/"==a||"\\"==a){l=_e;break}r&&"file"==r.scheme&&!ne(s.slice(u).join(""))&&(te(r.path[0],!0)?e.path.push(r.path[0]):e.host=r.host),l=ke;continue;case _e:if(a==i||"/"==a||"\\"==a||"?"==a||"#"==a){if(!n&&te(h))l=ke;else if(""==h){if(e.host="",n)return;l=xe}else{if(c=W(e,h),c)return c;if("localhost"==e.host&&(e.host=""),n)return;h="",l=xe}continue}h+=a;break;case xe:if(Q(e)){if(l=ke,"/"!=a&&"\\"!=a)continue}else if(n||"?"!=a)if(n||"#"!=a){if(a!=i&&(l=ke,"/"!=a))continue}else e.fragment="",l=Ee;else e.query="",l=Ce;break;case ke:if(a==i||"/"==a||"\\"==a&&Q(e)||!n&&("?"==a||"#"==a)){if(se(h)?(ie(e),"/"==a||"\\"==a&&Q(e)||e.path.push("")):re(h)?"/"==a||"\\"==a&&Q(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&te(h)&&(e.host&&(e.host=""),h=h.charAt(0)+":"),e.path.push(h)),h="","file"==e.scheme&&(a==i||"?"==a||"#"==a))while(e.path.length>1&&""===e.path[0])e.path.shift();"?"==a?(e.query="",l=Ce):"#"==a&&(e.fragment="",l=Ee)}else h+=X(a,K);break;case Ae:"?"==a?(e.query="",l=Ce):"#"==a?(e.fragment="",l=Ee):a!=i&&(e.path[0]+=X(a,G));break;case Ce:n||"#"!=a?a!=i&&("'"==a&&Q(e)?e.query+="%27":e.query+="#"==a?"%23":X(a,G)):(e.fragment="",l=Ee);break;case Ee:a!=i&&(e.fragment+=X(a,q));break}u++}},Fe=function(e){var t,n,i=u(this,Fe,"URL"),r=arguments.length>1?arguments[1]:void 0,a=String(e),o=x(i,{type:"URL"});if(void 0!==r)if(r instanceof Fe)t=k(r);else if(n=Se(t={},String(r)),n)throw TypeError(n);if(n=Se(o,a,null,t),n)throw TypeError(n);var c=o.searchParams=new w,l=_(c);l.updateSearchParams(o.query),l.updateURL=function(){o.query=String(c)||null},s||(i.href=Te.call(i),i.origin=Le.call(i),i.protocol=De.call(i),i.username=Be.call(i),i.password=Re.call(i),i.host=Oe.call(i),i.hostname=Me.call(i),i.port=je.call(i),i.pathname=Ie.call(i),i.search=Pe.call(i),i.searchParams=Ne.call(i),i.hash=We.call(i))},$e=Fe.prototype,Te=function(){var e=k(this),t=e.scheme,n=e.username,i=e.password,r=e.host,s=e.port,a=e.path,o=e.query,c=e.fragment,l=t+":";return null!==r?(l+="//",Z(e)&&(l+=n+(i?":"+i:"")+"@"),l+=z(r),null!==s&&(l+=":"+s)):"file"==t&&(l+="//"),l+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==o&&(l+="?"+o),null!==c&&(l+="#"+c),l},Le=function(){var e=k(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(i){return"null"}return"file"!=t&&Q(e)?t+"://"+z(e.host)+(null!==n?":"+n:""):"null"},De=function(){return k(this).scheme+":"},Be=function(){return k(this).username},Re=function(){return k(this).password},Oe=function(){var e=k(this),t=e.host,n=e.port;return null===t?"":null===n?z(t):z(t)+":"+n},Me=function(){var e=k(this).host;return null===e?"":z(e)},je=function(){var e=k(this).port;return null===e?"":String(e)},Ie=function(){var e=k(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Pe=function(){var e=k(this).query;return e?"?"+e:""},Ne=function(){return k(this).searchParams},We=function(){var e=k(this).fragment;return e?"#"+e:""},He=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(s&&c($e,{href:He(Te,(function(e){var t=k(this),n=String(e),i=Se(t,n);if(i)throw TypeError(i);_(t.searchParams).updateSearchParams(t.query)})),origin:He(Le),protocol:He(De,(function(e){var t=k(this);Se(t,String(e)+":",ae)})),username:He(Be,(function(e){var t=k(this),n=f(String(e));if(!ee(t)){t.username="";for(var i=0;i1?arguments[1]:void 0,t.length)),i=String(e);return u?u.call(t,i,n):t.slice(n,n+i.length)===i}})},"2cf4":function(e,t,n){var i,r,s,a=n("da84"),o=n("d039"),c=n("0366"),l=n("1be4"),u=n("cc12"),d=n("1cdc"),h=n("605d"),f=a.location,p=a.setImmediate,g=a.clearImmediate,m=a.process,v=a.MessageChannel,b=a.Dispatch,y=0,w={},_="onreadystatechange",x=function(e){if(w.hasOwnProperty(e)){var t=w[e];delete w[e],t()}},k=function(e){return function(){x(e)}},A=function(e){x(e.data)},C=function(e){a.postMessage(e+"",f.protocol+"//"+f.host)};p&&g||(p=function(e){var t=[],n=1;while(arguments.length>n)t.push(arguments[n++]);return w[++y]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},i(y),y},g=function(e){delete w[e]},h?i=function(e){m.nextTick(k(e))}:b&&b.now?i=function(e){b.now(k(e))}:v&&!d?(r=new v,s=r.port2,r.port1.onmessage=A,i=c(s.postMessage,s,1)):a.addEventListener&&"function"==typeof postMessage&&!a.importScripts&&f&&"file:"!==f.protocol&&!o(C)?(i=C,a.addEventListener("message",A,!1)):i=_ in u("script")?function(e){l.appendChild(u("script"))[_]=function(){l.removeChild(this),x(e)}}:function(e){setTimeout(k(e),0)}),e.exports={set:p,clear:g}},"2d00":function(e,t,n){var i,r,s=n("da84"),a=n("342f"),o=s.process,c=o&&o.versions,l=c&&c.v8;l?(i=l.split("."),r=i[0]+i[1]):a&&(i=a.match(/Edge\/(\d+)/),(!i||i[1]>=74)&&(i=a.match(/Chrome\/(\d+)/),i&&(r=i[1]))),e.exports=r&&+r},"2d26":function(e,t,n){n("5d91"),n("1715");var i=n("428f");e.exports=i},"2d39":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Station Info")]),n("span",{class:e.station_locked_in?"good":"bad"},[e._v(e._s(e.station_locked_in?"Locked In ":"Not Locked In "))]),n("span",{class:e.station_locked_in?"good":"bad"},[e._v("("+e._s(e.locked_in_name)+")")]),n("br"),n("span",[e._v("Calibration: "+e._s(e.calibration)+"%")]),e._v(" "),n("vui-button",{attrs:{params:{recalibrate:1}}},[e._v("Recalibrate")]),n("h3",[e._v("Teleporter Beacons")]),n("table",{staticClass:"table border"},[e._m(0),e._l(e.teleport_beacons,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.beacon_name))]),n("td",[n("vui-button",{attrs:{params:{beacon:t.ref,name:t.beacon_name}}},[e._v("Lock On")])],1)])}))],2),n("h3",[e._v("Tracking Implants")]),n("table",{staticClass:"table border"},[e._m(1),e._l(e.teleport_implants,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.implant_name))]),n("td",[n("vui-button",{attrs:{params:{implant:t.ref,name:t.implant_name}}},[e._v("Lock On")])],1)])}))],2)],1)},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Beacon Name")]),n("th",[e._v("Action")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Implant Name")]),n("th",[e._v("Action")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=(n("95d1"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"561826ba",null);t["default"]=c.exports},"2fa9":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.active?n("div",[e.$root.$data.assets["front"]?n("div",{staticClass:"photos"},[n("vui-img",{attrs:{name:"front"}}),n("br"),n("vui-img",{attrs:{name:"side"}})],1):e._e(),n("vui-group",[n("vui-group-item",{attrs:{label:"ID:"}},[e._v(e._s(e.active.id))]),n("vui-group-item",{attrs:{label:"Name:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.name"}})],1),n("vui-group-item",{attrs:{label:"Age:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.age"}})],1),n("vui-group-item",{attrs:{label:"Sex:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.sex"}})],1),n("vui-group-item",{attrs:{label:"Rank:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.rank"}})],1),n("vui-group-item",{attrs:{label:"Physical Status:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.physical_status"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.$root.$data.state,"editingvalue",t.target.multiple?n:n[0])}}},e._l(e.choices.physical_status,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)])],1),n("vui-group-item",{attrs:{label:"Mental Status:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.mental_status"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.$root.$data.state,"editingvalue",t.target.multiple?n:n[0])}}},e._l(e.choices.mental_status,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)])],1),n("vui-group-item",{attrs:{label:"Fingerprint:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.fingerprint"}})],1),!e.hideAdvanced&&1&e.avaivabletypes?[n("vui-group-item",{attrs:{label:"Species:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.species"}})],1),n("vui-group-item",{attrs:{label:"Citizenship:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.citizenship"}})],1),n("vui-group-item",{attrs:{label:"Religion:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.religion"}})],1),n("vui-group-item",{attrs:{label:"Employer:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.employer"}})],1),n("vui-group-item",{attrs:{label:"Employment/skills summary:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"CCIA Notes:"}},[e._v(e._s(e.active.ccia_record))]),n("vui-group-item",{attrs:{label:"CCIA Actions:"}},e._l(e.active.ccia_actions,(function(t){return n("div",{key:t[0]},[n("h5",[e._v(e._s(t[0])+" "),n("i",[e._v("("+e._s(t[1])+")")])]),n("div",{domProps:{innerHTML:e._s(t[3].replace("\r\n","
    "))}}),n("vui-button",{attrs:{params:{_openurl:t[4]}}},[e._v("Open")])],1)})),0)]:e._e(),e._t("default")],2),n("div",{staticClass:"bottombuttons"},[n("vui-button",{attrs:{params:{setactive:"null"},"push-state":""},on:{click:function(t){e.activeview="list"}}},[e._v("Unload Record")]),e.canprint?n("vui-button",{attrs:{params:{print:"active"}}},[e._v("Print")]):e._e(),!e.hideAdvanced&&1&e.editable?n("vui-button",{staticClass:"danger",attrs:{params:{deleterecord:1},icon:"trash-alt"}},[e._v("Delete record")]):e._e()],1)],1):e._e()},r=[],s=(n("ac1f"),n("5319"),{data:function(){return this.$root.$data.state},props:{hideAdvanced:{type:Boolean,default:!1}},filters:{replace:function(e,t,n){return e.replace(t,n)}}}),a=s,o=(n("f046"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"c51ad1c4",null);t["default"]=c.exports},3280:function(e,t,n){"use strict";var i=n("ebb5"),r=n("e58c"),s=i.aTypedArray,a=i.exportTypedArrayMethod;a("lastIndexOf",(function(e){return r.apply(s(this),arguments)}))},3315:function(e,t,n){"use strict";n("b959")},3410:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("7b0b"),a=n("e163"),o=n("e177"),c=r((function(){a(1)}));i({target:"Object",stat:!0,forced:c,sham:!o},{getPrototypeOf:function(e){return a(s(e))}})},"342f":function(e,t,n){var i=n("d066");e.exports=i("navigator","userAgent")||""},"34ac":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.editing?[e._t("default",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.gdata.state.editingvalue,expression:"gdata.state.editingvalue"}],domProps:{value:e.gdata.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.gdata.state,"editingvalue",t.target.value)}}})]),n("vui-button",{attrs:{icon:"check"},on:{click:e.save}})]:[n("span",{staticStyle:{"white-space":"pre-wrap"}},[e._v(e._s(e.rvalue))]),e._v(" "),e.reditable||e.editButton?n("vui-button",{staticStyle:{"white-space":"pre-wrap"},attrs:{icon:"pen"},on:{click:e.beginEditing}},[e._v(e._s(e.editbtnname))]):e._e()]],2)},r=[],s=(n("ac1f"),n("5319"),n("1276"),n("025e")),a={data:function(){return{editing:!1,gdata:this.$root.$data,startEditHandler:null}},props:{value:{type:String,default:""},path:{type:String,default:null},editable:{type:Boolean,default:!1},editButton:{type:String,default:null}},computed:{reditable:function(){return!!this.path&&this.editable},rvalue:function(){return this.path?s["a"].dotNotationRead(this.gdata.state,this.path):this.value},editbtnname:function(){return this.editButton?this.editButton:""}},methods:{beginEditing:function(){var e=this;(this.reditable||this.editButton)&&(this.$root.$emit("record-field-start-editing"),this.gdata.state.editingvalue=this.rvalue,this.startEditHandler=function(){e.endEditing()},this.$root.$on("record-field-start-editing",this.startEditHandler),this.editing=!0)},endEditing:function(){(this.reditable||this.editButton)&&(this.editing=!1,this.$root.$off("record-field-start-editing",this.startEditHandler))},save:function(){(this.reditable||this.editButton)&&(this.endEditing(),this.editButton?this.$emit("save",this.gdata.state.editingvalue):s["a"].sendToTopic({editrecord:{value:this.gdata.state.editingvalue,key:this.path.split(".")}}))}},filters:{replace:function(e,t,n){return e.replace(t,n)}}},o=a,c=(n("3c5a"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"a9c97a54",null);t["default"]=l.exports},"35a1":function(e,t,n){var i=n("f5df"),r=n("3f8c"),s=n("b622"),a=s("iterator");e.exports=function(e){if(void 0!=e)return e[a]||e["@@iterator"]||r[i(e)]}},"35b3":function(e,t,n){var i=n("23e7");i({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},3722:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("vui-group",[n("vui-group-item",{attrs:{label:"Status:"}},[n("vui-button",{class:{selected:e.on},attrs:{params:{toggleStatus:1}}},[e._v("On")]),n("vui-button",{class:{selected:!e.on},attrs:{params:{toggleStatus:1}}},[e._v("Off")])],1),n("vui-group-item",{attrs:{label:"Power Level:"}},[n("vui-button",{class:{selected:20==e.powerSetting},attrs:{params:{setPower:20}}},[e._v("1")]),n("vui-button",{class:{selected:40==e.powerSetting},attrs:{params:{setPower:40}}},[e._v("2")]),n("vui-button",{class:{selected:60==e.powerSetting},attrs:{params:{setPower:60}}},[e._v("3")]),n("vui-button",{class:{selected:80==e.powerSetting},attrs:{params:{setPower:80}}},[e._v("4")]),n("vui-button",{class:{selected:100==e.powerSetting},attrs:{params:{setPower:100}}},[e._v("5")])],1),n("vui-group-item",{attrs:{label:"Gas Pressure:"}},[e._v(" "+e._s(e.gasPressure)+" kPa ")]),n("h3",[e._v("Gas Temperature")]),n("vui-group-item",{attrs:{label:"Current:"}},[n("vui-progress",{class:e.gasTemperatureClass,attrs:{value:e.gasTemperature,max:e.maxGasTemperature,min:e.minGasTemperature}},[e._v(" "+e._s(e.gasTemperature)+" K ")])],1),n("vui-group-item",{attrs:{label:"Target:"}},[n("vui-progress",{attrs:{value:e.targetGasTemperature,max:e.maxGasTemperature,min:e.minGasTemperature}},[e._v(" "+e._s(e.targetGasTemperature)+" K ")]),n("div",{staticStyle:{clear:"both","padding-top":"4px"}},[n("vui-button",{attrs:{disabled:e.targetGasTemperature<=e.minGasTemperature,params:{temp:-100}}},[e._v("-")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature<=e.minGasTemperature,params:{temp:-10}}},[e._v("-")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature<=e.minGasTemperature,params:{temp:-1}}},[e._v("-")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature>=e.maxGasTemperature,params:{temp:1}}},[e._v("+")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature>=e.maxGasTemperature,params:{temp:10}}},[e._v("+")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature>=e.maxGasTemperature,params:{temp:100}}},[e._v("+")])],1)],1)],1)},r=[],s={data:function(){return this.$root.$data.state},computed:{gasTemperatureClass:function(){return null!=this.temperatureBadTop&&this.gasTemperature>this.temperatureBadTop||null!=this.temperatureBadBottom&&this.gasTemperaturethis.temperatureAvgBottom?"average":"good"}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},3729:function(e,t,n){var i=n("9e69"),r=n("00fd"),s=n("29f3"),a="[object Null]",o="[object Undefined]",c=i?i.toStringTag:void 0;function l(e){return null==e?void 0===e?o:a:c&&c in Object(e)?r(e):s(e)}e.exports=l},"37e8":function(e,t,n){var i=n("83ab"),r=n("9bf2"),s=n("825a"),a=n("df75");e.exports=i?Object.defineProperties:function(e,t){s(e);var n,i=a(t),o=i.length,c=0;while(o>c)r.f(e,n=i[c++],t[n]);return e}},3831:function(e,t,n){"use strict";n("9e80")},3851:function(e,t,n){var i={"./header/default.vue":"f3ce","./header/handles.vue":"9aa7","./header/minimal.vue":"d657","./header/modular-computer.vue":"4709","./view/admin/damage-menu.vue":"a9fa","./view/admin/permissions-panel.vue":"86eb","./view/admin/player-panel.vue":"3930","./view/console/atmocontrol/injector.vue":"614c","./view/console/atmocontrol/main.vue":"86ad","./view/console/atmocontrol/supermatter.vue":"df0b","./view/console/atmocontrol/tank.vue":"508b","./view/devices/aicard.vue":"4874","./view/devices/assembly/infrared.vue":"f095","./view/devices/assembly/proximity.vue":"253b","./view/devices/assembly/signaler.vue":"4626","./view/devices/assembly/timer.vue":"b81a","./view/devices/circuit/printer.vue":"ffb3","./view/devices/gps/gps.vue":"0566","./view/devices/jammer.vue":"050e","./view/devices/oredetector.vue":"0687","./view/devices/quikpay/confirmation.vue":"47db","./view/devices/quikpay/main.vue":"4678","./view/late-choices.vue":"2653","./view/machinery/atmospherics/canister.vue":"2575","./view/machinery/atmospherics/freezer.vue":"3722","./view/machinery/atmospherics/portpump.vue":"77f3","./view/machinery/chemdisp.vue":"0519","./view/machinery/cooking/microwave.vue":"a589","./view/machinery/power/apc.vue":"fafb","./view/machinery/power/pacman.vue":"3910","./view/machinery/power/smes.vue":"58e3","./view/machinery/power/supermattercrystal.vue":"b08f","./view/machinery/smartfridge.vue":"19fa","./view/machinery/teleporter.vue":"2d39","./view/machinery/vending.vue":"7dc7","./view/manifest.vue":"f264","./view/mcomputer/atmosphere.vue":"4149","./view/mcomputer/chat/channel-btn.vue":"1dbb","./view/mcomputer/chat/chat.vue":"3d8a","./view/mcomputer/chat/explore.vue":"421c","./view/mcomputer/chat/index.vue":"9b7e","./view/mcomputer/chemcodex.vue":"ec72","./view/mcomputer/command/accountdb.vue":"da1f","./view/mcomputer/command/teleporter.vue":"76a2","./view/mcomputer/janitor.vue":"e786","./view/mcomputer/medical/sensors.vue":"f309","./view/mcomputer/ntsl/edit.vue":"a3f9","./view/mcomputer/ntsl/list.vue":"6292","./view/mcomputer/ntsl/main.vue":"a7c6","./view/mcomputer/ntsl/program.vue":"2480","./view/mcomputer/pai/directives.vue":"d3c6","./view/mcomputer/pai/doorjack.vue":"3b8a","./view/mcomputer/pai/radio.vue":"207c","./view/mcomputer/security/guntracker.vue":"cb10","./view/mcomputer/security/implanttracker.vue":"ac02","./view/mcomputer/security/penalcontroller.vue":"2c9a","./view/mcomputer/signaler.vue":"db4fb","./view/mcomputer/system/config.vue":"07c3","./view/mcomputer/system/downloader.vue":"019f","./view/mcomputer/system/main.vue":"13c9","./view/mcomputer/system/manager.vue":"d3c8","./view/medical/bodyscanner.vue":"1062","./view/medical/sleeper.vue":"b087","./view/misc/appearancechanger.vue":"4939","./view/misc/boardgame.vue":"ef41","./view/misc/doors.vue":"3a07","./view/misc/ghostspawner.vue":"1503","./view/misc/maglock-config.vue":"0ea6","./view/misc/maglock.vue":"20a6","./view/misc/pai/recruit.vue":"9324","./view/misc/voting.vue":"e31d","./view/paperwork/fax.vue":"9556","./view/paperwork/photocopier.vue":"6a01","./view/records/field.vue":"34ac","./view/records/general.vue":"2fa9","./view/records/incident.vue":"256f","./view/records/list-locked.vue":"c0f7","./view/records/list-virus.vue":"8385","./view/records/list.vue":"ac4c","./view/records/login.vue":"a8bb","./view/records/main.vue":"cf32","./view/records/medical.vue":"203b","./view/records/security.vue":"b6db","./view/records/virus.vue":"73f5","./view/turrets/control-part.vue":"10d4","./view/turrets/control.vue":"fb48","./view/vehicles/droppod.vue":"b14c","./view/vehicles/pussywagon.vue":"4d76","./view/vehicles/trainengine.vue":"08c0","./view/wanalyzer/analyzer.vue":"407e","./vui/button.vue":"5aa2","./vui/group-item.vue":"2704","./vui/group-row.vue":"74e7","./vui/group.vue":"48f3","./vui/img.vue":"810a","./vui/input/numeric.vue":"210c","./vui/input/search.vue":"419b","./vui/input/slider.vue":"0eec","./vui/item.vue":"faf6","./vui/progress.vue":"1253","./vui/tooltip.vue":"0ec3"};function r(e){var t=s(e);return n(t)}function s(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=s,e.exports=r,r.id="3851"},"38cf":function(e,t,n){var i=n("23e7"),r=n("1148");i({target:"String",proto:!0},{repeat:r})},"38d6":function(e,t,n){},3910:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Status")]),n("vui-group",[n("vui-group-item",{attrs:{label:"Generator Status:"}},[e.active?n("span",{staticClass:"good"},[e._v("Online")]):n("span",{staticClass:"average"},[e._v("Offline")])]),n("vui-group-item",{attrs:{label:"Generator Control:"}},[e.active?n("vui-button",{attrs:{params:{action:"disable"},icon:"power-off"}},[e._v("STOP")]):n("vui-button",{attrs:{params:{action:"enable"},disabled:!!e.is_broken,icon:"power-off"}},[e._v("START")])],1)],1),n("h3",[e._v("Fuel")]),n("vui-group",[n("vui-group-item",{attrs:{label:"Fuel Type:"}},[e._v(e._s(e.fuel.fuel_type))]),n("vui-group-item",{attrs:{label:"Fuel Level:"}},[n("vui-progress",{attrs:{value:e.fuel.fuel_stored,max:e.fuel.fuel_capacity}},[e._v(e._s(Math.round(e.fuel.fuel_stored/e.fuel.fuel_capacity*100))+"%")])],1),n("vui-group-item",{class:{bad:0==e.fuel.fuel_stored,good:e.fuel.fuel_stored>0}},[e._v(e._s(e.fuel.fuel_stored)+" cm³ / "+e._s(e.fuel.fuel_capacity)+" cm³")]),e.fuel.fuel_usage>0&&e.active?n("vui-group-item",{attrs:{label:"Fuel Usage:"}},[e._v(e._s(e.fuel.fuel_usage)+" cm³/s - ("+e._s(Math.round(e.fuel.fuel_stored/e.fuel.fuel_usage))+" s remaining)")]):e._e(),n("vui-group-item",{attrs:{label:"Control:"}},[n("vui-button",{attrs:{params:{action:"eject"},disabled:!(!e.is_broken&&!e.is_ai),icon:"eject"}},[e._v("EJECT FUEL")])],1)],1),n("h3",[e._v("Output")]),n("vui-group",[n("vui-group-item",{attrs:{label:"Power Setting:"}},[n("span",{class:{bad:e.output_set>e.output_safe,good:e.output_set<=e.output_safe}},[e._v(e._s(e.output_set)+" / "+e._s(e.output_max)+" ("+e._s(e.output_watts)+" W)")])]),n("vui-group-item",{attrs:{label:"Control:"}},[n("vui-button",{attrs:{params:{action:"higher_power"},disabled:e.output_set==e.output_max}},[e._v("+")]),n("vui-button",{attrs:{params:{action:"lower_power"},disabled:e.output_set==e.output_min}},[e._v("-")])],1)],1),n("h3",[e._v("Temperature")]),n("vui-group",[n("vui-group-item",{attrs:{label:"Temperature:"}},[n("vui-progress",{class:e.getTemperatureClass(e.temperature_current),attrs:{value:e.temperature_current,min:e.temperature_min,max:1.5*e.temperature_max}},[e._v(e._s(Math.max(e.temperature_min,e.temperature_current))+"C")])],1),n("vui-group-item",{attrs:{label:"Generator Status:"}},[e.temperature_overheat>50?n("span",{staticClass:"bad"},[e._v("DANGER: CRITICAL OVERHEAT! Deactivate generator immediately!")]):e.temperature_overheat>20?n("span",{staticClass:"average"},[e._v("WARNING: Overheating!")]):e.temperature_overheat>1?n("span",{staticClass:"average"},[e._v("Temperature High")]):n("span",{staticClass:"good"},[e._v("Optimal")])])],1)],1)},r=[],s={data:function(){return this.$root.$data.state},methods:{getTemperatureClass:function(e){return e<.8*this.$root.$data.state.temperature_max?"good":e0},staticStyle:{width:"12em"},attrs:{value:e.gs.wtime,min:e.s.plua_main,max:e.s.plu_main||10}},[e._v(" "+e._s(e.mainMsg)+" ")]),n("vui-button",{attrs:{disabled:0!=e.s.plu_main,params:{command:"main_power"}}},[e._v("Interrupt")])],1),n("vui-group-item",{attrs:{label:"Backup power:"}},[n("vui-progress",{class:{good:0==e.s.plu_back||0==e.s.plu_main,bad:-1==e.s.plu_back&&0!=e.s.plu_main,average:e.s.plu_back>0},staticStyle:{width:"12em"},attrs:{value:e.gs.wtime,min:e.s.plua_back,max:e.s.plu_back||10}},[e._v(" "+e._s(e.backupMsg)+" ")]),n("vui-button",{attrs:{disabled:0!=e.s.plu_back,params:{command:"backup_power"}}},[e._v("Interrupt")])],1),n("vui-group-item",{attrs:{label:"Electrified status:"}},[n("vui-progress",{class:{good:0==e.s.ele,bad:-1==e.s.ele,average:e.s.ele>0},staticStyle:{width:"12em"},attrs:{value:e.gs.wtime,min:e.s.elea,max:e.s.ele||10}},[e._v(" "+e._s(e.eleMsg)+" ")]),n("vui-button",{attrs:{disabled:0==e.s.ele,params:{command:"electrify_permanently",activate:0}}},[e._v("R")]),e.s.isAdmin||!e.s.isai?[n("vui-button",{attrs:{disabled:e.s.ele>0,params:{command:"electrify_temporary",activate:1}}},[e._v("T")]),n("vui-button",{attrs:{disabled:-1==e.s.ele,params:{command:"electrify_permanently",activate:1}}},[e._v("P")])]:e._e()],2),n("vui-group-item"),n("vui-group-item",{key:e.k,attrs:{set:e.k="bolts",label:"Bolts:"}},[n("vui-button",{class:{on:e.s[e.k]},staticStyle:{"min-width":"6em"},attrs:{disabled:!(e.s.aiCanBolt||!e.s.isai||e.s.isAdmin),params:{command:e.k,activate:0}}},[e._v("Raised")]),n("vui-button",{class:{on:!e.s[e.k]},staticStyle:{"min-width":"6em"},attrs:{disabled:!(e.s.aiCanBolt||!e.s.isai||e.s.isAdmin),params:{command:e.k,activate:1}}},[e._v("Dropped")]),e.s.boltsOverride&&e.s[e.k]?n("vui-button",{staticClass:"danger",staticStyle:{"min-width":"6em"},attrs:{params:{command:"bolts_override",activate:1}}},[e._v("Drop Now")]):e._e(),e.s.boltsOverride&&!e.s[e.k]?n("vui-button",{staticClass:"danger",staticStyle:{"min-width":"6em"},attrs:{params:{command:"bolts_override",activate:0}}},[e._v("Raise Now")]):e._e()],1),e._l(e.commands,(function(t,i){return n("vui-group-item",{key:i,attrs:{label:t.name+":"}},[n("vui-button",{class:{on:e.s[i]},staticStyle:{"min-width":"6em"},attrs:{params:{command:i,activate:t.i?1:0}}},[e._v(e._s(t.et||"Enabled"))]),n("vui-button",{class:{on:!e.s[i]&&!t.danger,danger:!e.s[i]&&t.danger},staticStyle:{"min-width":"6em"},attrs:{disabled:!(!t.a||!e.s.isai||e.s.isAdmin),params:{command:i,activate:t.i?0:1}}},[e._v(e._s(t.dt||"Disabled"))])],1)}))],2)],1)},r=[],s={data:function(){var e=this.$root.$data,t=e.state;return{gs:e,s:t,commands:{idscan:{name:"IdScan",i:!0},lights:{name:"Bolt Lights",i:!0},safeties:{name:"Safeties",et:"Nominal",dt:"Overridden",danger:!0,a:!0},timing:{name:"Timing",et:"Nominal",dt:"Overridden",danger:!0},open:{name:"Door State",et:"Opened",dt:"Closed",i:1}}}},computed:{mainMsg:function(){return this.getPowerStatusMessage(this.s.plu_main,this.gs.wtime)},backupMsg:function(){return this.getPowerStatusMessage(this.s.plu_back,this.gs.wtime)},eleMsg:function(){if(0==this.s.ele)return"Safe";if(-1==this.s.ele)return"Permanently";var e=Math.max(Math.round((this.s.ele-this.gs.wtime)/10),0);return"".concat(e,"s left")}},methods:{getPowerStatusMessage:function(e,t){if(-1==e)return"Offline";if(0==e)return"Online";var n=Math.max(Math.round((e-t)/10),0);return"Interrupted, ".concat(n,"s left")}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"3a7b":function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").findIndex,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("findIndex",(function(e){return r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},"3aaf":function(e,t,n){},"3b8a":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Cable:"}},[e.connected?n("span",[e._v("Connected")]):e.extended?n("span",[e._v("Extended")]):n("vui-button",{attrs:{params:{extend:1}}},[e._v("Retracted")])],1),e.connected?n("vui-group-item",{attrs:{label:"Hack:"}},[e.ishacking?[n("vui-progress",{attrs:{max:1e3,value:e.progress}},[e._v(e._s(e.progress/10)+"%")]),n("vui-button",{attrs:{params:{cancel:1}}},[e._v("Cancel")])]:n("vui-button",{attrs:{params:{hack:1}}},[e._v("Start")])],2):e.aborted?n("vui-group-item",[n("div",{staticClass:"bad"},[e._v("Hack aborted!")])]):e._e()],1)],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,"2c69059a",null);t["default"]=c.exports},"3bbe":function(e,t,n){var i=n("861d");e.exports=function(e){if(!i(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},"3c5a":function(e,t,n){"use strict";n("bb3d")},"3c5d":function(e,t,n){"use strict";var i=n("ebb5"),r=n("50c4"),s=n("182d"),a=n("7b0b"),o=n("d039"),c=i.aTypedArray,l=i.exportTypedArrayMethod,u=o((function(){new Int8Array(1).set({})}));l("set",(function(e){c(this);var t=s(arguments.length>1?arguments[1]:void 0,1),n=this.length,i=a(e),o=r(i.length),l=0;if(o+t>n)throw RangeError("Wrong length");while(l=n.length?{value:void 0,done:!0}:(e=i(n,r),t.index+=e.length,{value:e,done:!1})}))},"3d8a":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v(e._s(e.channel.title))]),n("div",[e.channel.direct?e._e():[n("vui-button",{attrs:{params:{leave:e.reference}},on:{click:function(t){return e.$emit("on-leave")}}},[e._v("Leave")])],e.channel.can_manage?[null!=e.password?[n("input",{directives:[{name:"model",rawName:"v-model",value:e.password,expression:"password"}],attrs:{type:"text"},domProps:{value:e.password},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.set_password(t)},input:function(t){t.target.composing||(e.password=t.target.value)}}}),n("vui-button",{on:{click:e.set_password}},[e._v("Set password")])]:e.channel.direct?e._e():n("vui-button",{on:{click:function(t){e.password=""}}},[e._v("Set password")]),null!=e.title?[n("input",{directives:[{name:"model",rawName:"v-model",value:e.title,expression:"title"}],attrs:{type:"text"},domProps:{value:e.title},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.set_title(t)},input:function(t){t.target.composing||(e.title=t.target.value)}}}),n("vui-button",{on:{click:e.set_title}},[e._v("Change title")])]:e.channel.direct?e._e():n("vui-button",{on:{click:function(t){e.title=e.channel.title}}},[e._v("Change title")]),n("vui-button",{attrs:{params:{delete:e.reference}},on:{click:function(t){return e.$emit("on-leave")}}},[e._v("Delete channel")])]:e._e()],2),n("div",e._l(e.channel.users,(function(t,i){return n("div",{key:i},[e._v(" "+e._s(t)+" "),e.channel.can_manage&&!e.channel.direct?n("vui-button",{attrs:{params:{kick:{target:e.reference,user:i}}}},[e._v("Kick")]):e._e()],1)})),0),n("div",{ref:"chat",staticClass:"message-chat"},e._l(e.messages,(function(t,i){return n("div",{key:i},[e._v(e._s(t))])})),0),n("div",{staticClass:"message-container"},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.send_buffer,expression:"send_buffer"}],staticClass:"message-input",attrs:{type:"text"},domProps:{value:e.send_buffer},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.send_msg(t)},input:function(t){t.target.composing||(e.send_buffer=t.target.value)}}}),n("vui-button",{staticClass:"message-send",on:{click:e.send_msg}},[e._v("Send")])],1)])},r=[],s=n("025e"),a={data:function(){return{s:this.$root.$data.state,send_buffer:"",password:null,title:null,wasAtBottom:!0}},computed:{channel:function(){return this.s.channels[this.reference]},messages:function(){return this.channel.msg}},props:{reference:{type:String,default:""}},methods:{send_msg:function(){Object(s["b"])({send:{message:this.send_buffer,target:this.reference}}),this.send_buffer=""},set_password:function(){Object(s["b"])({set_password:{target:this.reference,password:this.password}}),this.password=null},set_title:function(){Object(s["b"])({change_title:{target:this.reference,title:this.title}}),this.title=null},scrollBottom:function(){var e=this.$refs.chat;e.scrollTop=e.scrollHeight}},mounted:function(){this.scrollBottom()},beforeUpdate:function(){var e=this.$refs.chat;this.wasAtBottom=e.scrollHeight-e.scrollTop===e.clientHeight},updated:function(){this.wasAtBottom&&this.scrollBottom()}},o=a,c=(n("715b"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"32f14c20",null);t["default"]=l.exports},"3ea3":function(e,t,n){var i=n("23e7"),r=n("f748"),s=Math.abs,a=Math.pow;i({target:"Math",stat:!0},{cbrt:function(e){return r(e=+e)*a(s(e),1/3)}})},"3f3a":function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("825a"),a=n("c04e"),o=n("9bf2"),c=n("d039"),l=c((function(){Reflect.defineProperty(o.f({},1,{value:1}),1,{value:2})}));i({target:"Reflect",stat:!0,forced:l,sham:!r},{defineProperty:function(e,t,n){s(e);var i=a(t,!0);s(n);try{return o.f(e,i,n),!0}catch(r){return!1}}})},"3f8c":function(e,t){e.exports={}},"3fcc":function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").map,s=n("4840"),a=i.aTypedArray,o=i.aTypedArrayConstructor,c=i.exportTypedArrayMethod;c("map",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:void 0,(function(e,t){return new(o(s(e,e.constructor)))(t)}))}))},4057:function(e,t,n){var i=n("23e7"),r=Math.hypot,s=Math.abs,a=Math.sqrt,o=!!r&&r(1/0,NaN)!==1/0;i({target:"Math",stat:!0,forced:o},{hypot:function(e,t){var n,i,r=0,o=0,c=arguments.length,l=0;while(o0?(i=n/l,r+=i*i):r+=n;return l===1/0?1/0:l*a(r)}})},4069:function(e,t,n){var i=n("44d2");i("flat")},"407e":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.has_inserted?n("div",[n("b",[e._v("Analyzing "+e._s(e.name)+" ")]),n("br"),e.$root.$data.assets["icon"]?n("div",[n("vui-img",{attrs:{name:"icon"}})],1):e._e(),1==e.item?n("div",[n("table",{staticClass:"other"},[n("tr",[n("td",[e._v(" Damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.damage_type)+" ")])]),n("tr",[n("td",[e._v(" Item's estimated force-rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.force)+" points")])]),n("tr",[n("td",[e._v(" Item's estimated throw force-rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.throw_force)+" points ")])]),1==e.energy?[n("tr",[n("td",[e._v(" Item's estimated force-rating when activated: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.active_force)+" points ")])]),n("tr",[n("td",[e._v(" Item's estimated throw force-rating when activated: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.active_throw_force)+" points")])]),n("tr",[n("td",[e._v(" Base block chance is: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.base_block_chance)+"% ")])]),n("tr",[n("td",[e._v(" Base reflect chance is: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.base_reflectchance)+"% ")])]),n("tr",[n("td",[e._v(" Item's estimated shield rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.shield_power)+" points")])]),n("tr",[n("td",[e._v(" Can block bullets: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.can_block)+" ")])])]:e._e(),n("tr",[n("td",[e._v(" Is sharp:")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.sharp)+" ")])]),n("tr",[n("td",[e._v(" Chance to dismember: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.edge)+" ")])]),n("tr",[n("td",[e._v(" Item's estimated armor penetration rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.penetration)+" points")])])],2)]):e._e(),1==e.gun?n("div",{staticClass:"active_energy"},[n("table",{staticClass:"other"},[n("tr",[n("td",[e._v(" Maximum shots: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.max_shots)+" ")])]),n("tr",[n("td",[e._v(" Burst: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.burst)+" ")])]),n("tr",[n("td",[e._v(" Self recharge: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.recharge)+" ")])]),n("tr",[n("td",[e._v(" Recharge time: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.recharge_time)+" ")])]),n("tr",[n("td",[e._v(" Reliability: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.reliability)+" ")])]),n("br"),n("b",[e._v("First projectile information: ")]),n("br"),n("tr",[n("td",[e._v(" Projectile's estimated damage rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.damage)+" points")])]),n("tr",[n("td",[e._v(" Projectile's Damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.damage_type)+" ")])]),n("tr",[n("td",[e._v(" Projectile's estimated armor penetration rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.armor_penetration)+" points")])]),n("tr",[n("td",[e._v(" Projectile's armor damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.check_armor)+" ")])]),n("tr",[n("td",[e._v(" Projectile's shrapnel type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.shrapnel_type)+" ")])]),n("tr",[n("td",[e._v(" Stun: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.stun)+" ")])]),e.secondary_damage?[n("br"),n("b",[e._v("Second projectile information: ")]),n("br"),n("tr",[n("td",[e._v(" Projectile's estimated damage rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_damage)+" points")])]),n("tr",[n("td",[e._v(" Projectile's damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_damage_type)+" ")])]),n("tr",[n("td",[e._v(" Projectile's estimated armor penetration rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_armor_penetration)+" points")])]),n("tr",[n("td",[e._v(" Projectile's armor damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_check_armor)+" ")])]),n("tr",[n("td",[e._v(" Projectile's shrapnel type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_shrapnel_type)+" ")])]),n("tr",[n("td",[e._v(" Stun: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_stun)+" ")])])]:e._e()],2)]):e._e(),e.gun_mods?n("div",[n("br"),n("b",[e._v("Modular gun information: ")]),n("br"),n("table",{staticClass:"modular"},[e._m(0),e._l(e.gun_mods,(function(t,i){return n("tr",{key:i},[n("td",[e._v(e._s(i))]),e._l(t,(function(i,r){return n("td",{key:r},[e._v(" "+e._s(t[r])+" ")])}))],2)}))],2)]):e._e(),n("vui-button",{attrs:{params:{print:1}}},[e._v("Print Analysis")])],1):n("div",[n("b",[e._v("No item inserted, analysis unit inactive.")])])])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("th",[e._v(" Name ")]),n("th",[e._v(" Reliability ")]),n("th",[e._v(" Damage modifier ")]),n("th",[e._v(" Fire delay modifier ")]),n("th",[e._v(" Number of shots modifier ")]),n("th",[e._v(" Burst modifier ")]),n("th",[e._v(" Accuracy modifier ")]),n("th",[e._v(" Repair tool ")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=(n("e958"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"61a5d2f6",null);t["default"]=c.exports},"408a":function(e,t,n){var i=n("c6b6");e.exports=function(e){if("number"!=typeof e&&"Number"!=i(e))throw TypeError("Incorrect invocation");return+e}},"40d9":function(e,t,n){var i=n("23e7"),r=Math.floor,s=Math.log,a=Math.LOG2E;i({target:"Math",stat:!0},{clz32:function(e){return(e>>>=0)?31-r(s(e+.5)*a):32}})},4149:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.read?n("vui-group",[n("vui-group-item",{attrs:{label:"Pressure:"}},[e._v(" "+e._s(e.press.toFixed(1))+" ")]),n("vui-group-item",{attrs:{label:"Temperature:"}},[e._v(" "+e._s(e.temp.toFixed(1))+" K ("+e._s(e.tempC.toFixed(1))+"°C) ")]),n("vui-group-item",{attrs:{label:"Gases:"}},[e.gas.oxygen?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.oxygen.toFixed(2))+" O"),n("sub",[e._v("2")])]):e._e(),e.gas.nitrogen?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.nitrogen.toFixed(2))+" N")]):e._e(),e.gas.carbon_dioxide?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.carbon_dioxide.toFixed(2))+" CO"),n("sub",[e._v("2"),n("sub")])]):e._e(),e.gas.phoron?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.phoron.toFixed(2))+" PH")]):e._e(),e.gas.sleeping_agent?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.sleeping_agent.toFixed(2))+" SA")]):e._e()])],1):n("span",{staticClass:"bad"},[e._v("Unable to obtain air reading!")])],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("cbf4"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"4021d8a8",null);t["default"]=c.exports},4160:function(e,t,n){"use strict";var i=n("23e7"),r=n("17c2");i({target:"Array",proto:!0,forced:[].forEach!=r},{forEach:r})},"419b":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("input",{directives:[{name:"model",rawName:"v-model",value:e.searchValue,expression:"searchValue"}],attrs:{type:"text",placeholder:"Search..."},domProps:{value:e.searchValue},on:{input:function(t){t.target.composing||(e.searchValue=t.target.value)}}})},r=[],s=(n("e260"),n("d81d"),n("a9e3"),n("d3b7"),n("ac1f"),n("841c"),n("ddb0"),n("ffe7")),a=n.n(s),o={data:function(){return{fuse:null,searchValue:""}},mounted:function(){this.onFieldUpdate(this.searchValue)},props:{keys:{type:Array,default:function(){return[]}},includeScore:{type:Boolean,default:!1},threshold:{type:Number,default:.6},input:{type:Array,default:function(){return[]}},value:{type:Array,default:function(){return[]}}},watch:{keys:function(){this.fuse=null},includeScore:function(){this.fuse=null},threshold:function(){this.fuse=null},input:function(){this.onFieldUpdate(this.searchValue)},searchValue:function(e){this.onFieldUpdate(e)}},methods:{onFieldUpdate:function(e){this.initFuse();var t=this.fuse.search(e);0==t.length&&(t=this.includeScore?this.input.map((function(e){return{item:e,score:0}})):this.input),this.$emit("input",t)},initFuse:function(){if(null==this.fuse){var e={shouldSort:!0,findAllMatches:!0,keys:this.keys,includeScore:this.includeScore,threshold:this.threshold};this.fuse=new a.a(this.input,e)}else this.fuse.setCollection(this.input)}}},c=o,l=n("2877"),u=Object(l["a"])(c,i,r,!1,null,null,null);t["default"]=u.exports},"421c":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[null!=e.channelTitle?[n("input",{directives:[{name:"model",rawName:"v-model",value:e.channelTitle,expression:"channelTitle"}],attrs:{type:"text"},domProps:{value:e.channelTitle},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.new_channel()},input:function(t){t.target.composing||(e.channelTitle=t.target.value)}}}),n("vui-button",{on:{click:function(t){return e.new_channel()}}},[e._v("New channel")])]:n("vui-button",{on:{click:function(t){e.channelTitle=""}}},[e._v("New channel")]),n("br"),e._l(e.displayed,(function(t){return n("view-mcomputer-chat-channel-btn",{key:t,attrs:{re:t,ch:e.s.channels[t]}})})),n("h2",[e._v("Users:")]),n("vui-input-search",{attrs:{input:e.users,keys:["user"]},model:{value:e.users_result,callback:function(t){e.users_result=t},expression:"users_result"}}),n("br"),e._l(e.users_result,(function(t){return n("div",{key:t.ref},[n("vui-button",{attrs:{params:{direct:t.ref}}},[e._v(e._s(t.user))])],1)}))],2)},r=[],s=(n("4de4"),n("d81d"),n("4fad"),n("b64b"),n("025e")),a={data:function(){return{s:this.$root.$data.state,channelTitle:null,users_result:[]}},methods:{new_channel:function(){Object(s["b"])({new_channel:this.channelTitle}),this.channelTitle=null}},computed:{displayed:function(){var e=this;return Object.keys(this.s.channels).filter((function(t){return!e.s.channels[t].can_interact}))},users:function(){return Object.entries(this.s.users).map((function(e){return{ref:e[0],user:e[1]}}))}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},"428f":function(e,t,n){var i=n("da84");e.exports=i},4310:function(e,t,n){},"44ad":function(e,t,n){var i=n("d039"),r=n("c6b6"),s="".split;e.exports=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==r(e)?s.call(e,""):Object(e)}:Object},"44b8":function(e,t,n){},"44d2":function(e,t,n){var i=n("b622"),r=n("7c73"),s=n("9bf2"),a=i("unscopables"),o=Array.prototype;void 0==o[a]&&s.f(o,a,{configurable:!0,value:r(null)}),e.exports=function(e){o[a][e]=!0}},"44de":function(e,t,n){var i=n("da84");e.exports=function(e,t){var n=i.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},"44e7":function(e,t,n){var i=n("861d"),r=n("c6b6"),s=n("b622"),a=s("match");e.exports=function(e){var t;return i(e)&&(void 0!==(t=e[a])?!!t:"RegExp"==r(e))}},"44fc":function(e,t,n){"use strict";n("b884")},"45fc":function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").some,s=n("a640"),a=n("ae40"),o=s("some"),c=a("some");i({target:"Array",proto:!0,forced:!o||!c},{some:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},4626:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("vui-button",{attrs:{params:{send:1}}},[e._v("Send Signal")])],1),n("div",[n("h3",[e._v("Frequency:")]),n("vui-button",{attrs:{params:{freq:-10}}},[e._v("--")]),n("vui-button",{attrs:{params:{freq:-2}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.frequency))]),n("vui-button",{attrs:{params:{freq:2}}},[e._v("+")]),n("vui-button",{attrs:{params:{freq:10}}},[e._v("++")])],1),n("div",[n("h3",[e._v("Code:")]),n("vui-button",{attrs:{params:{code:-5}}},[e._v("--")]),n("vui-button",{attrs:{params:{code:-1}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.code))]),n("vui-button",{attrs:{params:{code:1}}},[e._v("+")]),n("vui-button",{attrs:{params:{code:5}}},[e._v("++")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("c2e3"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"729622e4",null);t["default"]=c.exports},"466d":function(e,t,n){"use strict";var i=n("d784"),r=n("825a"),s=n("50c4"),a=n("1d80"),o=n("8aa5"),c=n("14c3");i("match",1,(function(e,t,n){return[function(t){var n=a(this),i=void 0==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var a=r(e),l=String(this);if(!a.global)return c(a,l);var u=a.unicode;a.lastIndex=0;var d,h=[],f=0;while(null!==(d=c(a,l))){var p=String(d[0]);h[f]=p,""===p&&(a.lastIndex=o(l,s(a.lastIndex),u)),f++}return 0===f?null:h}]}))},4678:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._l(e.items,(function(t,i){return n("div",{key:i,staticStyle:{clear:"both"}},[e._v(" "+e._s(i)+": "+e._s(t)+" Credits "),n("div",{staticStyle:{float:"right"}},[n("vui-input-numeric",{attrs:{width:"2em"},model:{value:e.selection[i],callback:function(t){e.$set(e.selection,i,t)},expression:"selection[name]"}}),1==e.editmode?n("vui-button",{attrs:{params:{remove:i},width:"3em"}},[e._v("Delete")]):e._e()],1)])})),1==e.editmode?n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.tmp_name,expression:"tmp_name"}],domProps:{value:e.tmp_name},on:{input:function(t){t.target.composing||(e.tmp_name=t.target.value)}}}),n("vui-input-numeric",{attrs:{width:"3em","button-count":2},model:{value:e.tmp_price,callback:function(t){e.tmp_price=t},expression:"tmp_price"}}),n("vui-button",{attrs:{params:{add:{name:e.tmp_name,price:e.tmp_price}}}},[e._v("Add")]),n("vui-button",{attrs:{params:{accountselect:1},width:"3em"}},[e._v("Select Destination Account")])],1):e._e(),n("vui-button",{attrs:{params:{locking:1},width:"3em"}},[e._v("Toggle Lock")]),n("vui-button",{attrs:{params:{confirm:e.selection}}},[e._v("Confirm Selection")])],2)},r=[],s=n("025e"),a={data:function(){return this.$root.$data.state},methods:{accountChange:function(e){s["a"].sendToTopic({changeaccount:e})}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},"46c6":function(e,t,n){},4709:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("header-default",[n("div",{staticClass:"maincont"},[n("b",{staticClass:"valign"},[e._v(e._s(e.time))]),e.state._PC.batteryicon&&e.state._PC.showbatteryicon?n("img",{staticClass:"valign",attrs:{src:e.state._PC.batteryicon}}):e._e(),e.state._PC.batterypercent&&e.state._PC.showbatteryicon?n("b",{staticClass:"valign"},[e._v(e._s(e.state._PC.batterypercent))]):e._e(),e.state._PC.ntneticon?n("img",{staticClass:"valign",attrs:{img:"",src:e.state._PC.ntneticon}}):e._e(),e.state._PC.apclinkicon?n("img",{staticClass:"valign",attrs:{img:"",src:e.state._PC.apclinkicon}}):e._e(),n("div",{staticStyle:{float:"right"}},[n("vui-button",{class:{selected:e.state._PC.flashlight},attrs:{params:{PC_togglelight:1},icon:"lightbulb","icon-only":""}}),e.state._PC.showexitprogram?[n("vui-button",{attrs:{params:{PC_minimize:1},icon:"window-minimize","icon-only":""}}),n("vui-button",{staticClass:"danger",attrs:{params:{PC_exit:1},icon:"window-close","icon-only":""}})]:[n("vui-button",{staticClass:"danger",attrs:{params:{PC_shutdown:1},icon:"power-off","icon-only":""}})]],2)])])},r=[],s=n("025e"),a={data:function(){return this.$root.$data},mounted:function(){this.$nextTick((function(){document.getElementById("content").classList.add("mcomputer")}))},computed:{time:function(){return Object(s["c"])(this.wtime)}}},o=a,c=(n("4ae3"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"1a3d9578",null);t["default"]=l.exports},4795:function(e,t,n){var i=n("23e7"),r=n("da84"),s=n("342f"),a=[].slice,o=/MSIE .\./.test(s),c=function(e){return function(t,n){var i=arguments.length>2,r=i?a.call(arguments,2):void 0;return e(i?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};i({global:!0,bind:!0,forced:o},{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},"47db":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v(" Selected Products:")]),e._l(e.items,(function(t,i){return n("div",{key:i},[e.selection[i]&&e.selection[i]>0?n("span",[e._v(" "+e._s(e.selection[i])+"x "+e._s(i)+": at "+e._s(t*e.selection[i])+" Credits ")]):e._e()])})),n("h3",[e._v(" Total: "+e._s(e.priceSum))]),n("h4",[e._v("Destination Account: "+e._s(e.destinationact))]),n("h3",[e._v("Please swipe your ID to pay.")]),n("vui-button",{attrs:{params:{return:1},width:"3em"}},[e._v("Return to order menu")])],2)},r=[],s=(n("13d5"),n("b64b"),{data:function(){return this.$root.$data.state},computed:{priceSum:function(){var e=this;return Object.keys(this.selection).reduce((function(t,n){return isNaN(t)?e.items[n]*e.selection[n]:t+e.items[n]*e.selection[n]}))}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},4840:function(e,t,n){var i=n("825a"),r=n("1c0b"),s=n("b622"),a=s("species");e.exports=function(e,t){var n,s=i(e).constructor;return void 0===s||void 0==(n=i(s)[a])?t:r(n)}},4874:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.has_ai?[n("vui-group",[n("vui-group-item",{attrs:{label:"Hardware Integrity"}},[e._v(e._s(e.hardware_integrity)+"%")]),n("vui-group-item",{attrs:{label:"Backup Capacitor"}},[e._v(e._s(e.backup_capacitor)+"%")])],1),e.has_laws?n("table",{staticClass:"borders"},[e._m(0),n("div",{staticClass:"itemLabelNarrow"},[e._v(" Laws: ")]),e._l(e.laws,(function(t){return n("tr",{key:t.index},[n("td",{attrs:{valign:"top"}},[e._v(e._s(t.index))]),n("td",[e._v(e._s(t.law))])])}))],2):n("span",{staticClass:"notice"},[e._v(" No laws found. ")]),e.operational?n("vui-group",[n("vui-group-item",{attrs:{label:"Radio Subspace Transceiver"}},[n("vui-button",{class:{selected:e.radio},attrs:{params:{radio:0}}},[e._v("Enabled")]),n("vui-button",{class:{danger:!e.radio},attrs:{params:{radio:1}}},[e._v("Disabled")])],1),n("vui-group-item",{attrs:{label:"Wireless Interface"}},[n("vui-button",{class:{selected:e.wireless},attrs:{params:{wireless:0}}},[e._v("Enabled")]),n("vui-button",{class:{danger:!e.wireless},attrs:{params:{wireless:1}}},[e._v("Disabled")])],1),e.flushing?n("vui-group-item",[n("span",{staticClass:"notice"},[e._v("AI wipe in progress...")])]):n("vui-group-item",{attrs:{label:"Wipe AI"}},[n("vui-button",{staticClass:"danger",attrs:{params:{wipe:1}}},[e._v("Wipe")])],1)],1):e._e()]:[e._v(" Stored AI: "),n("span",{staticClass:"notice"},[e._v("No AI detected.")])]],2)},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("td",{staticClass:"law_index"},[e._v("Index")]),n("td",[e._v("Law")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"48f3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._t("default")],2)},r=[],s=(n("d44d"),n("2877")),a={},o=Object(s["a"])(a,i,r,!1,null,"b2030120",null);t["default"]=o.exports},4930:function(e,t,n){var i=n("d039");e.exports=!!Object.getOwnPropertySymbols&&!i((function(){return!String(Symbol())}))},4939:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.change_race?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Species: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_species,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_species==t},attrs:{params:{race:t}}},[e._v(e._s(t))])})),1)])]):e._e(),e.change_gender?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Sex: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_gender,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_gender==t},attrs:{params:{gender:t}}},[e._v(e._s(t))])})),1),e.valid_pronouns.length?n("div",{staticClass:"itemLabelNarrow"},[e._v(" Pronouns: ")]):e._e(),e.valid_pronouns.length?n("div",{staticClass:"itemContentWide"},e._l(e.valid_pronouns,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_pronouns==t},attrs:{params:{pronouns:t}}},[e._v(e._s(t))])})),1):e._e()])]):e._e(),e.change_accent&&e.valid_accents.length?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Accents: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_accents,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_accent==t},attrs:{params:{accent:t}}},[e._v(e._s(t))])})),1)])]):e._e(),e.change_language&&e.valid_languages.length?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Languages: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_languages,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.ArrayContains(e.owner_languages,t)},attrs:{params:{language:t}}},[e._v(e._s(t))])})),1)])]):e._e(),e.change_eye_color||e.change_skin_tone||e.change_skin_color||e.change_hair_color||e.change_facial_hair_color?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Colors: ")]),n("div",{staticClass:"itemContentWide"},[e.change_eye_color?n("vui-button",{attrs:{params:{eye_color:1}}},[e._v("Change Eye Color")]):e._e(),e.change_skin_tone?n("vui-button",{attrs:{params:{skin_tone:1}}},[e._v("Change Skin Tone")]):e._e(),e.change_skin_preset?n("vui-button",{attrs:{params:{skin_preset:1}}},[e._v("Change Skin Preset")]):e._e(),e.change_skin_color&&!e.change_skin_preset?n("vui-button",{attrs:{params:{skin_color:1}}},[e._v("Change Skin Color")]):e._e(),e.change_hair_color?n("vui-button",{attrs:{params:{hair_color:1}}},[e._v("Change Hair Color")]):e._e(),e.change_facial_hair_color?n("vui-button",{attrs:{params:{facial_hair_color:1}}},[e._v("Change Facial Hair Color")]):e._e()],1)])]):e._e(),e.change_hair&&e.valid_hair_styles.length?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Hair Styles: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_hair_styles,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_hair_style==t},attrs:{params:{hair:t}}},[e._v(e._s(t))])})),1)])]):e._e(),e.change_facial_hair&&e.valid_facial_hair_styles.length?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Facial Hair Styles: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_facial_hair_styles,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_facial_hair_style==t},attrs:{params:{facial_hair:t}}},[e._v(e._s(t))])})),1)])]):e._e()])},r=[],s=(n("caad"),n("2532"),{data:function(){return this.$root.$data.state},methods:{ArrayContains:function(e,t){return!!e.includes(t)}}}),a=s,o=(n("611e"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"2a491020",null);t["default"]=c.exports},"498a":function(e,t,n){"use strict";var i=n("23e7"),r=n("58a8").trim,s=n("c8d2");i({target:"String",proto:!0,forced:s("trim")},{trim:function(){return r(this)}})},"4a9b":function(e,t,n){var i=n("74e8");i("Float64",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},"4ae1":function(e,t,n){var i=n("23e7"),r=n("d066"),s=n("1c0b"),a=n("825a"),o=n("861d"),c=n("7c73"),l=n("0538"),u=n("d039"),d=r("Reflect","construct"),h=u((function(){function e(){}return!(d((function(){}),[],e)instanceof e)})),f=!u((function(){d((function(){}))})),p=h||f;i({target:"Reflect",stat:!0,forced:p,sham:p},{construct:function(e,t){s(e),a(t);var n=arguments.length<3?e:s(arguments[2]);if(f&&!h)return d(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var i=[null];return i.push.apply(i,t),new(l.apply(e,i))}var r=n.prototype,u=c(o(r)?r:Object.prototype),p=Function.apply.call(e,u,t);return o(p)?p:u}})},"4ae3":function(e,t,n){"use strict";n("6814")},"4c53":function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("sub")},{sub:function(){return r(this,"sub","","")}})},"4caa":function(e,t,n){var i=n("a919"),r=n("76dd"),s=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,a="\\u0300-\\u036f",o="\\ufe20-\\ufe2f",c="\\u20d0-\\u20ff",l=a+o+c,u="["+l+"]",d=RegExp(u,"g");function h(e){return e=r(e),e&&e.replace(s,i).replace(d,"")}e.exports=h},"4cb7":function(e,t,n){},"4cc0":function(e,t,n){},"4d63":function(e,t,n){var i=n("83ab"),r=n("da84"),s=n("94ca"),a=n("7156"),o=n("9bf2").f,c=n("241c").f,l=n("44e7"),u=n("ad6d"),d=n("9f7f"),h=n("6eeb"),f=n("d039"),p=n("69f3").set,g=n("2626"),m=n("b622"),v=m("match"),b=r.RegExp,y=b.prototype,w=/a/g,_=/a/g,x=new b(w)!==w,k=d.UNSUPPORTED_Y,A=i&&s("RegExp",!x||k||f((function(){return _[v]=!1,b(w)!=w||b(_)==_||"/a/i"!=b(w,"i")})));if(A){var C=function(e,t){var n,i=this instanceof C,r=l(e),s=void 0===t;if(!i&&r&&e.constructor===C&&s)return e;x?r&&!s&&(e=e.source):e instanceof C&&(s&&(t=u.call(e)),e=e.source),k&&(n=!!t&&t.indexOf("y")>-1,n&&(t=t.replace(/y/g,"")));var o=a(x?new b(e,t):b(e,t),i?this:y,C);return k&&n&&p(o,{sticky:n}),o},E=function(e){e in C||o(C,e,{configurable:!0,get:function(){return b[e]},set:function(t){b[e]=t}})},S=c(b),F=0;while(S.length>F)E(S[F++]);y.constructor=C,C.prototype=y,h(r,"RegExp",C)}g("RegExp")},"4d64":function(e,t,n){var i=n("fc6a"),r=n("50c4"),s=n("23cb"),a=function(e){return function(t,n,a){var o,c=i(t),l=r(c.length),u=s(a,l);if(e&&n!=n){while(l>u)if(o=c[u++],o!=o)return!0}else for(;l>u;u++)if((e||u in c)&&c[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},"4d76":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h2",[e._v("Engine Status:")]),e.is_on?n("div",[e._v(" The engine is currently running. "),n("vui-button",{attrs:{params:{toggle_engine:1}}},[e._v("Stop")])],1):n("div",[e._v(" The engine is off. "),n("vui-button",{attrs:{disabled:!e.has_key||!e.has_cell,params:{toggle_engine:1}}},[e._v("Start")])],1),e.has_key?n("div",[e._v(" There is a key inserted into the ignition. "),n("vui-button",{attrs:{params:{key:1}}},[e._v("Remove Key")])],1):n("div",[e._v(" There is no key in the ignition. ")]),e.has_cell?n("div",[e._v(" Cell Charge: "),n("vui-progress",{class:{good:e.cell_charge>=.8*e.cell_max_charge,bad:e.cell_charge<=.4*e.cell_max_charge,average:e.cell_charge<.8*e.cell_max_charge&&e.cell_charge>.4*e.cell_max_charge},attrs:{value:e.cell_charge,max:e.cell_max_charge,min:0}},[e._v(e._s(e.cell_charge)+"J")]),e._v(" "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The cell can be removed by using a screwdriver to open the maintenance panel, then using a crowbar to shimmy it out.")])],1):n("div",[e._v(" There is no cell installed. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The cell can be installed by using a screwdriver to open the maintenance panel, then clicking on the engine with a compatible power cell.")])],1),e.is_towing?n("div",[e._v(" This engine is currently towing the "+e._s(e.tow)+". "),n("vui-button",{attrs:{params:{unlatch:1}}},[e._v("Unlatch")]),e._m(0),e.has_proper_trolley?n("div",[e.is_hoovering?n("div",[e._v(" The trolley is currently vacuuming. "),n("vui-button",{attrs:{params:{toggle_hoover:1}}},[e._v("Toggle")])],1):n("div",[e._v(" The trolley is not vacuuming. "),n("vui-button",{attrs:{disabled:!e.is_on,params:{toggle_hoover:1}}},[e._v("Toggle")])],1),n("div",[e._v(" Vacuum Capacity Remaining: "),n("vui-progress",{class:{good:e.vacuum_capacity>=.8*e.max_vacuum_capacity,bad:e.vacuum_capacity<=.4*e.max_vacuum_capacity,average:e.vacuum_capacity<.8*e.max_vacuum_capacity&&e.vacuum_capacity>.4*e.max_vacuum_capacity},attrs:{value:e.vacuum_capacity,max:e.max_vacuum_capacity,min:0}},[e._v(e._s(e.vacuum_capacity))]),e._v(" "),n("vui-button",{attrs:{disabled:e.vacuum_capacity>=e.max_vacuum_capacity,params:{empty_hoover:1}}},[e._v("Empty")])],1),e.is_mopping?n("div",[e._v(" The trolley is currently mopping. "),n("vui-button",{attrs:{disabled:!e.is_on||!e.has_bucket||e.bucket_capacity<=0,params:{toggle_mops:1}}},[e._v("Toggle")])],1):n("div",[e._v(" The trolley is not mopping. "),n("vui-button",{attrs:{disabled:!e.is_on||!e.has_bucket,params:{toggle_mops:1}}},[e._v("Toggle")])],1),e.has_bucket?n("div",[e._v(" The trolley has a reagent container installed. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The trolley must have a reagent container installed to draw reagents from, such as water or space cleaner. This can be done by opening the maintenance panel on the trolley with a screwdriver and clicking on it with a bucket. Similarly, with an open panel, it can be removed by using a wrench on it.")]),n("div",[e._v(" Container Reagents Remaining: "),n("vui-progress",{class:{good:e.bucket_capacity>=.8*e.max_bucket_capacity,bad:e.bucket_capacity<=.4*e.max_bucket_capacity,average:e.bucket_capacity<.8*e.max_bucket_capacity&&e.bucket_capacity>.4*e.max_bucket_capacity},attrs:{value:e.bucket_capacity,max:e.max_bucket_capacity,min:0}},[e._v(e._s(e.bucket_capacity)+"u")])],1)],1):n("div",[e._v(" The trolley does not have a reagent container installed. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The trolley must have a reagent container installed to draw reagents from, such as water or space cleaner. This can be done by opening the maintenance panel on the trolley with a screwdriver and clicking on it with a bucket. Similarly, with an open panel, it can be removed by using a wrench on it.")])],1)]):n("div",[e._v(" The wagon does not have the correct NT-X1 Vacuum Cleaner installed. ")])],1):n("div",[e._v(" This engine isn't towing anything currently. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("You can latch vehicles together by dragging from the vehicle you want to be the anchor point, to the trolley you wish to latch.")])],1)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h2",[e._v("NT-X1 Vacuum Cleaner Status:")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"4d90":function(e,t,n){"use strict";var i=n("23e7"),r=n("0ccb").start,s=n("9a0c");i({target:"String",proto:!0,forced:s},{padStart:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},"4de4":function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").filter,s=n("1dde"),a=n("ae40"),o=s("filter"),c=a("filter");i({target:"Array",proto:!0,forced:!o||!c},{filter:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(e,t,n){"use strict";var i=n("0366"),r=n("7b0b"),s=n("9bdd"),a=n("e95a"),o=n("50c4"),c=n("8418"),l=n("35a1");e.exports=function(e){var t,n,u,d,h,f,p=r(e),g="function"==typeof this?this:Array,m=arguments.length,v=m>1?arguments[1]:void 0,b=void 0!==v,y=l(p),w=0;if(b&&(v=i(v,m>2?arguments[2]:void 0,2)),void 0==y||g==Array&&a(y))for(t=o(p.length),n=new g(t);t>w;w++)f=b?v(p[w],w):p[w],c(n,w,f);else for(d=y.call(p),h=d.next,n=new g;!(u=h.call(d)).done;w++)f=b?s(d,v,[u.value,w],!0):u.value,c(n,w,f);return n.length=w,n}},"4e82":function(e,t,n){"use strict";var i=n("23e7"),r=n("1c0b"),s=n("7b0b"),a=n("d039"),o=n("a640"),c=[],l=c.sort,u=a((function(){c.sort(void 0)})),d=a((function(){c.sort(null)})),h=o("sort"),f=u||!d||!h;i({target:"Array",proto:!0,forced:f},{sort:function(e){return void 0===e?l.call(s(this)):l.call(s(this),r(e))}})},"4ec9":function(e,t,n){"use strict";var i=n("6d61"),r=n("6566");e.exports=i("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),r)},"4fad":function(e,t,n){var i=n("23e7"),r=n("6f53").entries;i({target:"Object",stat:!0},{entries:function(e){return r(e)}})},"508b":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Tank Control System")]),e.state["input"]?n("div",[n("vui-item",{attrs:{balance:.65,label:"Input:"}},[e.state["input"].power?n("span",[e._v("Injecting")]):n("span",[e._v("On Hold")]),e._v(" "),n("vui-button",{attrs:{params:{in_toggle_injector:1},icon:"power-off"}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{balance:.65,label:"Flow Rate Limit:"}},[e._v(e._s(e.state["input"].rate)+" L/s")]),n("vui-item",{attrs:{balance:.65,label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"3em","button-count":3,max:e.state.maxrate},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.s({in_set_flowrate:e.state["input"].setrate})}},model:{value:e.state["input"].setrate,callback:function(t){e.$set(e.state["input"],"setrate",t)},expression:"state['input'].setrate"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{in_set_flowrate:e.state["input"].setrate}}},[e._v("Set Flow Rate")])],1)],1):n("vui-button",{attrs:{params:{in_refresh_status:1}}},[e._v("Search for input port")]),e.state["output"]?n("div",{staticStyle:{"margin-top":"2em"}},[n("vui-item",{attrs:{balance:.65,label:"Output:"}},[e.state["output"].power?n("span",[e._v("Open")]):n("span",[e._v("On Hold")]),e._v(" "),n("vui-button",{attrs:{params:{out_toggle_power:1},icon:"power-off"}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{balance:.65,label:"Max Output Pressure:"}},[e._v(e._s(e.state["output"].pressure)+" kPa")]),n("vui-item",{attrs:{balance:.65,label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"5em","button-count":4,"decimal-places":2,max:e.state.maxpressure},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.s({out_set_pressure:e.state["output"].setpressure})}},model:{value:e.state["output"].setpressure,callback:function(t){e.$set(e.state["output"],"setpressure",t)},expression:"state['output'].setpressure"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{out_set_pressure:e.state["output"].setpressure}}},[e._v("Set Pressure")])],1)],1):n("vui-button",{attrs:{params:{out_refresh_status:1}}},[e._v("Search for output port")])],1)},r=[],s=n("025e"),a={data:function(){return this.$root.$data},methods:{s:function(e){s["a"].sendToTopic(e)}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},"50c4":function(e,t,n){var i=n("a691"),r=Math.min;e.exports=function(e){return e>0?r(i(e),9007199254740991):0}},5135:function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},"51eb":function(e,t,n){"use strict";var i=n("825a"),r=n("c04e");e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return r(i(this),"number"!==e)}},5319:function(e,t,n){"use strict";var i=n("d784"),r=n("825a"),s=n("7b0b"),a=n("50c4"),o=n("a691"),c=n("1d80"),l=n("8aa5"),u=n("14c3"),d=Math.max,h=Math.min,f=Math.floor,p=/\$([$&'`]|\d\d?|<[^>]*>)/g,g=/\$([$&'`]|\d\d?)/g,m=function(e){return void 0===e?e:String(e)};i("replace",2,(function(e,t,n,i){var v=i.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,b=i.REPLACE_KEEPS_$0,y=v?"$":"$0";return[function(n,i){var r=c(this),s=void 0==n?void 0:n[e];return void 0!==s?s.call(n,r,i):t.call(String(r),n,i)},function(e,i){if(!v&&b||"string"===typeof i&&-1===i.indexOf(y)){var s=n(t,e,this,i);if(s.done)return s.value}var c=r(e),f=String(this),p="function"===typeof i;p||(i=String(i));var g=c.global;if(g){var _=c.unicode;c.lastIndex=0}var x=[];while(1){var k=u(c,f);if(null===k)break;if(x.push(k),!g)break;var A=String(k[0]);""===A&&(c.lastIndex=l(f,a(c.lastIndex),_))}for(var C="",E=0,S=0;S=E&&(C+=f.slice(E,$)+R,E=$+F.length)}return C+f.slice(E)}];function w(e,n,i,r,a,o){var c=i+e.length,l=r.length,u=g;return void 0!==a&&(a=s(a),u=p),t.call(o,u,(function(t,s){var o;switch(s.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,i);case"'":return n.slice(c);case"<":o=a[s.slice(1,-1)];break;default:var u=+s;if(0===u)return t;if(u>l){var d=f(u/10);return 0===d?t:d<=l?void 0===r[d-1]?s.charAt(1):r[d-1]+s.charAt(1):t}o=r[u-1]}return void 0===o?"":o}))}}))},5327:function(e,t,n){var i=n("23e7"),r=n("1ec1"),s=Math.acosh,a=Math.log,o=Math.sqrt,c=Math.LN2,l=!s||710!=Math.floor(s(Number.MAX_VALUE))||s(1/0)!=1/0;i({target:"Math",stat:!0,forced:l},{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?a(e)+c:r(e-1+o(e-1)*o(e+1))}})},5377:function(e,t,n){var i=n("83ab"),r=n("9bf2"),s=n("ad6d"),a=n("9f7f").UNSUPPORTED_Y;i&&("g"!=/./g.flags||a)&&r.f(RegExp.prototype,"flags",{configurable:!0,get:s})},"542d":function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("408a"),a=1..toPrecision,o=r((function(){return"1"!==a.call(1,void 0)}))||!r((function(){a.call({})}));i({target:"Number",proto:!0,forced:o},{toPrecision:function(e){return void 0===e?a.call(s(this)):a.call(s(this),e)}})},5692:function(e,t,n){var i=n("c430"),r=n("c6cd");(e.exports=function(e,t){return r[e]||(r[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.7.0",mode:i?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56d7":function(e,t,n){"use strict";n.r(t),function(e){n("4160"),n("e260"),n("d3b7"),n("ac1f"),n("5319"),n("159b"),n("ddb0"),n("4795"),n("2d26");var t=n("a026"),i=n("8103"),r=n.n(i),s=n("bba4"),a=n.n(s),o=n("c0d6"),c=(n("e008"),n("f0e0")),l=n("3851");if(l.keys().forEach((function(e){var n=l(e),i=r()(a()(e.replace(/^\.\/(.*)\.\w+$/,"$1")));t["a"].component(i,n.default||n)})),t["a"].config.productionTip=!1,e.Vue=t["a"],e.receiveUIState=function(e){o["a"].loadState(JSON.parse(e))},document.getElementById("app")){var u=JSON.parse(document.getElementById("initialstate").innerHTML);o["a"].loadState(u),window.__wtimetimer=window.setInterval((function(){o["a"].state.wtime+=2}),200),c["a"].setWindowKey(window.document.getElementById("vueui:windowId").getAttribute("content")),c["a"].setupDrag(),new t["a"]({data:o["a"].state,template:"

    Javascript loaded, stylesheets has failed to load. Click here to load.

    ",computed:{componentName:function(){return"?"!=this.$root.$data.active.charAt(0)?"view-"+this.$root.$data.active:null},templateString:function(){return"?"==this.$root.$data.active.charAt(0)?"
    "+this.$root.$data.active.substr(1)+"
    ":null}},watch:{state:{handler:function(){o["a"].pushState()},deep:!0}},mounted:function(){this.$el.focus()}}).$mount("#app")}document.getElementById("header")&&new t["a"]({data:o["a"].state}).$mount("#header"),document.getElementById("dapp")&&new t["a"]({data:o["a"].state,template:'

    Debug this UI with inspector by opening URL in your browser:

    {{url}}

    Current data of UI:

    {{ JSON.stringify(this.$root.$data, null, \'    \') }}
    ',methods:{stop:function(){window.clearInterval(window.__wtimetimer)}},computed:{url:function(){return window.location.href+"?ext"}}}).$mount("#dapp")}.call(this,n("c8ba"))},"56ef":function(e,t,n){var i=n("d066"),r=n("241c"),s=n("7418"),a=n("825a");e.exports=i("Reflect","ownKeys")||function(e){var t=r.f(a(e)),n=s.f;return n?t.concat(n(e)):t}},"583b":function(e,t,n){var i=n("23e7"),r=n("5e89"),s=Math.abs;i({target:"Number",stat:!0},{isSafeInteger:function(e){return r(e)&&s(e)<=9007199254740991}})},"585a":function(e,t,n){(function(t){var n="object"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n("c8ba"))},5899:function(e,t){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},"58a8":function(e,t,n){var i=n("1d80"),r=n("5899"),s="["+r+"]",a=RegExp("^"+s+s+"*"),o=RegExp(s+s+"*$"),c=function(e){return function(t){var n=String(i(t));return 1&e&&(n=n.replace(a,"")),2&e&&(n=n.replace(o,"")),n}};e.exports={start:c(1),end:c(2),trim:c(3)}},"58e3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.state.failTime?n("div",{staticClass:"notice"},[n("h3",{staticClass:"fw-bold"},[e._v("SYSTEM FAILURE")]),n("span",{staticClass:"fst-italic"},[e._v("I/O regulator malfuction detected! Waiting for system reboot...")]),n("br"),e._v(" Automatic reboot in "+e._s(e.state.failTime)+" seconds... "),n("vui-button",{attrs:{icon:"sync",params:{reboot:1}}},[e._v("Reboot Now")])],1):n("vui-group",[n("vui-group-item",{attrs:{label:"Stored Capacity:"}},[n("vui-progress",{class:e.state.charging?"good":"average",attrs:{value:e.state.storedCapacity,min:0,max:100}}),n("div",{staticClass:"statusValue"},[e._v(" "+e._s(Math.round(e.state.storedCapacity))+"% ")])],1),n("vui-group-item",{attrs:{label:"Charge status:"}},[n("div",{staticClass:"statusValue"},[1==e.state.chargeMode?n("span",[e._v(" SMES will be fully charged in "+e._s(e.timeRemaining)+" ")]):2==e.state.chargeMode?n("span",[e._v(" SMES input and output are equal ")]):n("span",[e._v(" SMES will run out of charge in "+e._s(e.timeRemaining)+" ")])])]),n("h3",[e._v("Input Management")]),n("vui-group-item",{attrs:{label:"Charge Mode:"}},[n("vui-button",{attrs:{icon:e.state.chargeAttempt?"sync":"times",params:{cmode:1}}},[e._v(e._s(e.state.chargeAttempt?"Auto":"Off"))]),e._v(" ["),n("span",{class:e.chargeClass},[e._v(e._s(e.chargeStatus))]),e._v("] ")],1),n("vui-group-item",{attrs:{label:"Input Level:"}},[n("vui-progress",{attrs:{value:e.state.chargeLevel,min:0,max:e.state.chargeMax}}),n("div",{staticStyle:{clear:"both","padding-top":"4px","text-align":"center"}},[n("vui-input-numeric",{attrs:{width:"100px","min-button":"","max-button":"","button-count":0,min:0,max:e.state.chargeMax},on:{input:function(t){return e.s({input:e.state.chargeLevel})}},model:{value:e.state.chargeLevel,callback:function(t){e.$set(e.state,"chargeLevel",t)},expression:"state.chargeLevel"}},[e._v(" "+e._s(e.state.chargeLevel)+" W ")])],1)],1),n("vui-group-item",{attrs:{label:"Input Load:"}},[n("vui-progress",{class:e.state.chargeTaken=1&&"".concat(t," hours"),n>=1&&"".concat(n," minutes"),i>=1&&"".concat(i," seconds")].filter(Boolean).join(", ")}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},"592e":function(e,t,n){},"5a34":function(e,t,n){var i=n("44e7");e.exports=function(e){if(i(e))throw TypeError("The method doesn't accept regular expressions");return e}},"5aa2":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"button",attrs:{disabled:e.$root.$data.status<2||this.disabled},on:{click:function(t){return e.senddata()}}},[e.icon?n("div",{staticClass:"uiIcon16",class:["ic-"+this.icon,{"mr-1":!this.iconOnly},e.getRotateClass,e.getFlipClass]}):e._e(),n("span",[e._t("default")],2)])},r=[],s=(n("a9e3"),n("c0d6")),a=n("025e"),o={props:{icon:{type:String,default:""},rotate:{type:Number,default:0},flip:{type:String,default:""},params:{type:Object,default:null},unsafeParams:{type:Object,default:null},pushState:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},iconOnly:{type:Boolean,default:!1}},methods:{senddata:function(){this.$root.$data.status<2||this.disabled||(this.$emit("click"),this.unsafeParams&&a["a"].sendToTopicRaw(this.unsafeParams),this.params?a["a"].sendToTopic(this.params,this.pushState):this.pushState&&s["a"].pushState())}},computed:{getRotateClass:function(){switch(this.rotate%360){case 90:return"ic-rotate-90";case 180:return"ic-rotate-180";case 270:return"ic-rotate-270";default:return""}},getFlipClass:function(){if(this.flip)return"ic-flip-".concat(this.flip)}}},c=o,l=n("2877"),u=Object(l["a"])(c,i,r,!1,null,null,null);t["default"]=u.exports},"5ae5":function(e,t,n){},"5b81":function(e,t,n){"use strict";var i=n("23e7"),r=n("1d80"),s=n("44e7"),a=n("ad6d"),o=n("b622"),c=n("c430"),l=o("replace"),u=RegExp.prototype;i({target:"String",proto:!0},{replaceAll:function e(t,n){var i,o,d,h,f,p,g,m,v,b=r(this);if(null!=t){if(i=s(t),i&&(o=String(r("flags"in u?t.flags:a.call(t))),!~o.indexOf("g")))throw TypeError("`.replaceAll` does not allow non-global regexes");if(d=t[l],void 0!==d)return d.call(t,b,n);if(c&&i)return String(b).replace(t,n)}if(h=String(b),f=String(t),""===f)return e.call(h,/(?:)/g,n);if(p=h.split(f),"function"!==typeof n)return p.join(String(n));for(g=p[0],m=g.length,v=1;v1?arguments[1]:void 0),t}})},"5ddf":function(e,t,n){"use strict";n("3aaf")},"5ded":function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("8418"),a=r((function(){function e(){}return!(Array.of.call(e)instanceof e)}));i({target:"Array",stat:!0,forced:a},{of:function(){var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);while(t>e)s(n,e,arguments[e++]);return n.length=t,n}})},"5e89":function(e,t,n){var i=n("861d"),r=Math.floor;e.exports=function(e){return!i(e)&&isFinite(e)&&r(e)===e}},"5f96":function(e,t,n){"use strict";var i=n("ebb5"),r=i.aTypedArray,s=i.exportTypedArrayMethod,a=[].join;s("join",(function(e){return a.apply(r(this),arguments)}))},"5fb2":function(e,t,n){"use strict";var i=2147483647,r=36,s=1,a=26,o=38,c=700,l=72,u=128,d="-",h=/[^\0-\u007E]/,f=/[.\u3002\uFF0E\uFF61]/g,p="Overflow: input needs wider integers to process",g=r-s,m=Math.floor,v=String.fromCharCode,b=function(e){var t=[],n=0,i=e.length;while(n=55296&&r<=56319&&n>1,e+=m(e/t);e>g*a>>1;i+=r)e=m(e/g);return m(i+(g+1)*e/(e+o))},_=function(e){var t=[];e=b(e);var n,o,c=e.length,h=u,f=0,g=l;for(n=0;n=h&&om((i-f)/A))throw RangeError(p);for(f+=(k-h)*A,h=k,n=0;ni)throw RangeError(p);if(o==h){for(var C=f,E=r;;E+=r){var S=E<=g?s:E>=g+a?a:E-g;if(Cu){var f,p=l(arguments[u++]),g=d?s(p).concat(d(p)):s(p),m=g.length,v=0;while(m>v)f=g[v++],i&&!h.call(p,f)||(n[f]=p[f])}return n}:u},"611e":function(e,t,n){"use strict";n("f7e3")},"614c":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Fuel Injection System")]),e.state["device"]?[n("vui-item",{attrs:{label:"Input:"}},[e.state.device.power?n("span",[e._v("Injecting")]):n("span",[e._v("On Hold")]),n("vui-button",{attrs:{params:{in_toggle_injector:1}}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{label:"Rate:"}},[e._v(e._s(e.state.device.rate)+" L/s")]),n("vui-item",{attrs:{label:"Automated Fuel Injection:"}},[e.state.device.automation?n("vui-button",{attrs:{params:{toggle_automation:1}}},[e._v("Engaged")]):n("vui-button",{attrs:{params:{toggle_automation:1}}},[e._v("Disengaged")])],1),n("vui-item",{attrs:{label:"Inject:"}},[e.state.device.automation?[e._v("Controls Locked Out")]:[n("vui-button",{attrs:{params:{toggle_injector:1},icon:"power-off"}},[e._v("Toggle Power")]),n("vui-button",{attrs:{params:{injection:1}}},[e._v("Inject (1 Cycle)")])]],2)]:n("vui-button",{attrs:{params:{in_refresh_status:1}}},[e._v("Search for device")])],2)},r=[],s={data:function(){return this.$root.$data}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"621a":function(e,t,n){"use strict";var i=n("da84"),r=n("83ab"),s=n("a981"),a=n("9112"),o=n("e2cc"),c=n("d039"),l=n("19aa"),u=n("a691"),d=n("50c4"),h=n("0b25"),f=n("77a7"),p=n("e163"),g=n("d2bb"),m=n("241c").f,v=n("9bf2").f,b=n("81d5"),y=n("d44e"),w=n("69f3"),_=w.get,x=w.set,k="ArrayBuffer",A="DataView",C="prototype",E="Wrong length",S="Wrong index",F=i[k],$=F,T=i[A],L=T&&T[C],D=Object.prototype,B=i.RangeError,R=f.pack,O=f.unpack,M=function(e){return[255&e]},j=function(e){return[255&e,e>>8&255]},I=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},P=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},N=function(e){return R(e,23,4)},W=function(e){return R(e,52,8)},H=function(e,t){v(e[C],t,{get:function(){return _(this)[t]}})},V=function(e,t,n,i){var r=h(n),s=_(e);if(r+t>s.byteLength)throw B(S);var a=_(s.buffer).bytes,o=r+s.byteOffset,c=a.slice(o,o+t);return i?c:c.reverse()},U=function(e,t,n,i,r,s){var a=h(n),o=_(e);if(a+t>o.byteLength)throw B(S);for(var c=_(o.buffer).bytes,l=a+o.byteOffset,u=i(+r),d=0;dK;)(z=q[K++])in $||a($,z,F[z]);G.constructor=$}g&&p(L)!==D&&g(L,D);var Y=new T(new $(2)),X=L.setInt8;Y.setInt8(0,2147483648),Y.setInt8(1,2147483649),!Y.getInt8(0)&&Y.getInt8(1)||o(L,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else $=function(e){l(this,$,k);var t=h(e);x(this,{bytes:b.call(new Array(t),0),byteLength:t}),r||(this.byteLength=t)},T=function(e,t,n){l(this,T,A),l(e,$,A);var i=_(e).byteLength,s=u(t);if(s<0||s>i)throw B("Wrong offset");if(n=void 0===n?i-s:d(n),s+n>i)throw B(E);x(this,{buffer:e,byteLength:n,byteOffset:s}),r||(this.buffer=e,this.byteLength=n,this.byteOffset=s)},r&&(H($,"byteLength"),H(T,"buffer"),H(T,"byteLength"),H(T,"byteOffset")),o(T[C],{getInt8:function(e){return V(this,1,e)[0]<<24>>24},getUint8:function(e){return V(this,1,e)[0]},getInt16:function(e){var t=V(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=V(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return P(V(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return P(V(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return O(V(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return O(V(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){U(this,1,e,M,t)},setUint8:function(e,t){U(this,1,e,M,t)},setInt16:function(e,t){U(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){U(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){U(this,4,e,I,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){U(this,4,e,I,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){U(this,4,e,N,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){U(this,8,e,W,t,arguments.length>2?arguments[2]:void 0)}});y($,k),y(T,A),e.exports={ArrayBuffer:$,DataView:T}},6292:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-button",{directives:[{name:"show",rawName:"v-show",value:!e.creating,expression:"!creating"}],on:{click:function(t){e.creating=!0}}},[e._v("New")]),e.creating?[n("input",{directives:[{name:"model",rawName:"v-model",value:e.newname,expression:"newname"}],attrs:{type:"text"},domProps:{value:e.newname},on:{input:function(t){t.target.composing||(e.newname=t.target.value)}}}),n("vui-button",{on:{click:function(t){return e.newFile()}}},[e._v("Create")])]:e._e(),n("h2",[e._v("Available files:")]),n("table",[e._m(0),e._l(e.s.files,(function(t){return n("tr",{key:t.name},[n("td",[e._v(e._s(t.name))]),n("td",[e._v(e._s(t.type))]),n("td",[e._v(e._s(t.size)+"GQ")]),n("td",[n("vui-button",{attrs:{params:{execute_file:t.name}}},[e._v("Execute")]),n("vui-button",{attrs:{params:{edit_file:t.name}}},[e._v("Edit")])],1)])}))],2)],2)},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("th",[e._v("File name")]),n("th",[e._v("File type")]),n("th",[e._v("File size (GQ)")]),n("th",[e._v("Operations")])])}],s=n("025e"),a={data:function(){return{s:this.$root.$data.state,creating:!1,newname:""}},methods:{newFile:function(){s["a"].sendToTopic({new:this.newname}),this.newname="",this.creating=!1}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},"63bf":function(e,t,n){},"649e":function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").some,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("some",(function(e){return r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},"64e5":function(e,t,n){"use strict";var i=n("d039"),r=n("0ccb").start,s=Math.abs,a=Date.prototype,o=a.getTime,c=a.toISOString;e.exports=i((function(){return"0385-07-25T07:06:39.999Z"!=c.call(new Date(-50000000000001))}))||!i((function(){c.call(new Date(NaN))}))?function(){if(!isFinite(o.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),i=t<0?"-":t>9999?"+":"";return i+r(s(t),i?6:4,0)+"-"+r(e.getUTCMonth()+1,2,0)+"-"+r(e.getUTCDate(),2,0)+"T"+r(e.getUTCHours(),2,0)+":"+r(e.getUTCMinutes(),2,0)+":"+r(e.getUTCSeconds(),2,0)+"."+r(n,3,0)+"Z"}:c},6547:function(e,t,n){var i=n("a691"),r=n("1d80"),s=function(e){return function(t,n){var s,a,o=String(r(t)),c=i(n),l=o.length;return c<0||c>=l?e?"":void 0:(s=o.charCodeAt(c),s<55296||s>56319||c+1===l||(a=o.charCodeAt(c+1))<56320||a>57343?e?o.charAt(c):s:e?o.slice(c,c+2):a-56320+(s-55296<<10)+65536)}};e.exports={codeAt:s(!1),charAt:s(!0)}},6566:function(e,t,n){"use strict";var i=n("9bf2").f,r=n("7c73"),s=n("e2cc"),a=n("0366"),o=n("19aa"),c=n("2266"),l=n("7dd0"),u=n("2626"),d=n("83ab"),h=n("f183").fastKey,f=n("69f3"),p=f.set,g=f.getterFor;e.exports={getConstructor:function(e,t,n,l){var u=e((function(e,i){o(e,u,t),p(e,{type:t,index:r(null),first:void 0,last:void 0,size:0}),d||(e.size=0),void 0!=i&&c(i,e[l],{that:e,AS_ENTRIES:n})})),f=g(t),m=function(e,t,n){var i,r,s=f(e),a=v(e,t);return a?a.value=n:(s.last=a={index:r=h(t,!0),key:t,value:n,previous:i=s.last,next:void 0,removed:!1},s.first||(s.first=a),i&&(i.next=a),d?s.size++:e.size++,"F"!==r&&(s.index[r]=a)),e},v=function(e,t){var n,i=f(e),r=h(t);if("F"!==r)return i.index[r];for(n=i.first;n;n=n.next)if(n.key==t)return n};return s(u.prototype,{clear:function(){var e=this,t=f(e),n=t.index,i=t.first;while(i)i.removed=!0,i.previous&&(i.previous=i.previous.next=void 0),delete n[i.index],i=i.next;t.first=t.last=void 0,d?t.size=0:e.size=0},delete:function(e){var t=this,n=f(t),i=v(t,e);if(i){var r=i.next,s=i.previous;delete n.index[i.index],i.removed=!0,s&&(s.next=r),r&&(r.previous=s),n.first==i&&(n.first=r),n.last==i&&(n.last=s),d?n.size--:t.size--}return!!i},forEach:function(e){var t,n=f(this),i=a(e,arguments.length>1?arguments[1]:void 0,3);while(t=t?t.next:n.first){i(t.value,t.key,this);while(t&&t.removed)t=t.previous}},has:function(e){return!!v(this,e)}}),s(u.prototype,n?{get:function(e){var t=v(this,e);return t&&t.value},set:function(e,t){return m(this,0===e?0:e,t)}}:{add:function(e){return m(this,e=0===e?0:e,e)}}),d&&i(u.prototype,"size",{get:function(){return f(this).size}}),u},setStrong:function(e,t,n){var i=t+" Iterator",r=g(t),s=g(i);l(e,t,(function(e,t){p(this,{type:i,target:e,state:r(e),kind:t,last:void 0})}),(function(){var e=s(this),t=e.kind,n=e.last;while(n&&n.removed)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),n?"entries":"values",!n,!0),u(t)}}},"65f0":function(e,t,n){var i=n("861d"),r=n("e8b5"),s=n("b622"),a=s("species");e.exports=function(e,t){var n;return r(e)&&(n=e.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)?i(n)&&(n=n[a],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},"664f":function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("sup")},{sup:function(){return r(this,"sup","","")}})},6747:function(e,t){var n=Array.isArray;e.exports=n},6814:function(e,t,n){},"682e":function(e,t,n){"use strict";n("9513")},6836:function(e,t,n){},"69f3":function(e,t,n){var i,r,s,a=n("7f9a"),o=n("da84"),c=n("861d"),l=n("9112"),u=n("5135"),d=n("c6cd"),h=n("f772"),f=n("d012"),p=o.WeakMap,g=function(e){return s(e)?r(e):i(e,{})},m=function(e){return function(t){var n;if(!c(t)||(n=r(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}};if(a){var v=d.state||(d.state=new p),b=v.get,y=v.has,w=v.set;i=function(e,t){return t.facade=e,w.call(v,e,t),t},r=function(e){return b.call(v,e)||{}},s=function(e){return y.call(v,e)}}else{var _=h("state");f[_]=!0,i=function(e,t){return t.facade=e,l(e,_,t),t},r=function(e){return u(e,_)?e[_]:{}},s=function(e){return u(e,_)}}e.exports={set:i,get:r,has:s,enforce:g,getterFor:m}},"6a01":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.state.toner?n("span",[e._v("Current toner level: "+e._s(e.state.toner))]):e._e(),n("br"),e.state.gotitem?n("vui-button",{attrs:{params:{remove:1}}},[e._v("Remove Item")]):e._e(),n("br"),e.state.toner?[e.state.gotitem?[n("div",{staticClass:"itemLabel copylabel"},[e._v("Copies to print:")]),n("div",{staticClass:"copyBlock"},[n("vui-input-numeric",{attrs:{width:"2.5em",min:1,max:e.state.maxcopies},model:{value:e.state.copies,callback:function(t){e.$set(e.state,"copies",t)},expression:"state.copies"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{copy:1}}},[e._v("Copy")])],1)]:[n("h3",[e._v("Please insert something to copy.")])],n("br"),e.state.isAI?n("vui-button",{attrs:{params:{aipic:1}}},[e._v("Print photo from database")]):e._e()]:[n("h2",[e._v("Please insert a new toner cartridge!")])]],2)},r=[],s={data:function(){return this.$root.$data}},a=s,o=(n("7dc4"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"927b9430",null);t["default"]=c.exports},"6a21":function(e,t){ace.define("ace/snippets/javascript",["require","exports","module"],(function(e,t,n){"use strict";t.snippetText='# Prototype\nsnippet proto\n\t${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n\t\t${4:// body...}\n\t};\n# Function\nsnippet fun\n\tfunction ${1?:function_name}(${2:argument}) {\n\t\t${3:// body...}\n\t}\n# Anonymous Function\nregex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\nsnippet f\n\tfunction${M1?: ${1:functionName}}($2) {\n\t\t${0:$TM_SELECTED_TEXT}\n\t}${M2?;}${M3?,}${M4?)}\n# Immediate function\ntrigger \\(?f\\(\nendTrigger \\)?\nsnippet f(\n\t(function(${1}) {\n\t\t${0:${TM_SELECTED_TEXT:/* code */}}\n\t}(${1}));\n# if\nsnippet if\n\tif (${1:true}) {\n\t\t${0}\n\t}\n# if ... else\nsnippet ife\n\tif (${1:true}) {\n\t\t${2}\n\t} else {\n\t\t${0}\n\t}\n# tertiary conditional\nsnippet ter\n\t${1:/* condition */} ? ${2:a} : ${3:b}\n# switch\nsnippet switch\n\tswitch (${1:expression}) {\n\t\tcase \'${3:case}\':\n\t\t\t${4:// code}\n\t\t\tbreak;\n\t\t${5}\n\t\tdefault:\n\t\t\t${2:// code}\n\t}\n# case\nsnippet case\n\tcase \'${1:case}\':\n\t\t${2:// code}\n\t\tbreak;\n\t${3}\n\n# while (...) {...}\nsnippet wh\n\twhile (${1:/* condition */}) {\n\t\t${0:/* code */}\n\t}\n# try\nsnippet try\n\ttry {\n\t\t${0:/* code */}\n\t} catch (e) {}\n# do...while\nsnippet do\n\tdo {\n\t\t${2:/* code */}\n\t} while (${1:/* condition */});\n# Object Method\nsnippet :f\nregex /([,{[])|^\\s*/:f/\n\t${1:method_name}: function(${2:attribute}) {\n\t\t${0}\n\t}${3:,}\n# setTimeout function\nsnippet setTimeout\nregex /\\b/st|timeout|setTimeo?u?t?/\n\tsetTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n# Get Elements\nsnippet gett\n\tgetElementsBy${1:TagName}(\'${2}\')${3}\n# Get Element\nsnippet get\n\tgetElementBy${1:Id}(\'${2}\')${3}\n# console.log (Firebug)\nsnippet cl\n\tconsole.log(${1});\n# return\nsnippet ret\n\treturn ${1:result}\n# for (property in object ) { ... }\nsnippet fori\n\tfor (var ${1:prop} in ${2:Things}) {\n\t\t${0:$2[$1]}\n\t}\n# hasOwnProperty\nsnippet has\n\thasOwnProperty(${1})\n# docstring\nsnippet /**\n\t/**\n\t * ${1:description}\n\t *\n\t */\nsnippet @par\nregex /^\\s*\\*\\s*/@(para?m?)?/\n\t@param {${1:type}} ${2:name} ${3:description}\nsnippet @ret\n\t@return {${1:type}} ${2:description}\n# JSON.parse\nsnippet jsonp\n\tJSON.parse(${1:jstr});\n# JSON.stringify\nsnippet jsons\n\tJSON.stringify(${1:object});\n# self-defining function\nsnippet sdf\n\tvar ${1:function_name} = function(${2:argument}) {\n\t\t${3:// initial code ...}\n\n\t\t$1 = function($2) {\n\t\t\t${4:// main code}\n\t\t};\n\t}\n# singleton\nsnippet sing\n\tfunction ${1:Singleton} (${2:argument}) {\n\t\t// the cached instance\n\t\tvar instance;\n\n\t\t// rewrite the constructor\n\t\t$1 = function $1($2) {\n\t\t\treturn instance;\n\t\t};\n\t\t\n\t\t// carry over the prototype properties\n\t\t$1.prototype = this;\n\n\t\t// the instance\n\t\tinstance = new $1();\n\n\t\t// reset the constructor pointer\n\t\tinstance.constructor = $1;\n\n\t\t${3:// code ...}\n\n\t\treturn instance;\n\t}\n# class\nsnippet class\nregex /^\\s*/clas{0,2}/\n\tvar ${1:class} = function(${20}) {\n\t\t$40$0\n\t};\n\t\n\t(function() {\n\t\t${60:this.prop = ""}\n\t}).call(${1:class}.prototype);\n\t\n\texports.${1:class} = ${1:class};\n# \nsnippet for-\n\tfor (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n\t\t${0:${2:Things}[${1:i}];}\n\t}\n# for (...) {...}\nsnippet for\n\tfor (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n\t\t${3:$2[$1]}$0\n\t}\n# for (...) {...} (Improved Native For-Loop)\nsnippet forr\n\tfor (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n\t\t${3:$2[$1]}$0\n\t}\n\n\n#modules\nsnippet def\n\tdefine(function(require, exports, module) {\n\t"use strict";\n\tvar ${1/.*\\///} = require("${1}");\n\t\n\t$TM_SELECTED_TEXT\n\t});\nsnippet req\nguard ^\\s*\n\tvar ${1/.*\\///} = require("${1}");\n\t$0\nsnippet requ\nguard ^\\s*\n\tvar ${1/.*\\/(.)/\\u$1/} = require("${1}").${1/.*\\/(.)/\\u$1/};\n\t$0\n',t.scope="javascript"}))},"6ac0":function(e,t){function n(e,t,n,i){var r=-1,s=null==e?0:e.length;i&&s&&(n=e[++r]);while(++r ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(row,column){return 0==this.compare(row,column)},this.compareRange=function(range){var cmp,end=range.end,start=range.start;return cmp=this.compare(end.row,end.column),1==cmp?(cmp=this.compare(start.row,start.column),1==cmp?2:0==cmp?1:0):-1==cmp?-2:(cmp=this.compare(start.row,start.column),-1==cmp?-1:1==cmp?42:0)},this.comparePoint=function(p){return this.compare(p.row,p.column)},this.containsRange=function(range){return 0==this.comparePoint(range.start)&&0==this.comparePoint(range.end)},this.intersects=function(range){var cmp=this.compareRange(range);return-1==cmp||0==cmp||1==cmp},this.isEnd=function(row,column){return this.end.row==row&&this.end.column==column},this.isStart=function(row,column){return this.start.row==row&&this.start.column==column},this.setStart=function(row,column){"object"==typeof row?(this.start.column=row.column,this.start.row=row.row):(this.start.row=row,this.start.column=column)},this.setEnd=function(row,column){"object"==typeof row?(this.end.column=row.column,this.end.row=row.row):(this.end.row=row,this.end.column=column)},this.inside=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)||this.isStart(row,column)?!1:!0:!1},this.insideStart=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)?!1:!0:!1},this.insideEnd=function(row,column){return 0==this.compare(row,column)?this.isStart(row,column)?!1:!0:!1},this.compare=function(row,column){return this.isMultiLine()||row!==this.start.row?this.start.row>row?-1:row>this.end.row?1:this.start.row===row?column>=this.start.column?0:-1:this.end.row===row?this.end.column>=column?0:1:0:this.start.column>column?-1:column>this.end.column?1:0},this.compareStart=function(row,column){return this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.compareEnd=function(row,column){return this.end.row==row&&this.end.column==column?1:this.compare(row,column)},this.compareInside=function(row,column){return this.end.row==row&&this.end.column==column?1:this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.clipRows=function(firstRow,lastRow){if(this.end.row>lastRow)var end={row:lastRow+1,column:0};else if(firstRow>this.end.row)var end={row:firstRow,column:0};if(this.start.row>lastRow)var start={row:lastRow+1,column:0};else if(firstRow>this.start.row)var start={row:firstRow,column:0};return Range.fromPoints(start||this.start,end||this.end)},this.extend=function(row,column){var cmp=this.compare(row,column);if(0==cmp)return this;if(-1==cmp)var start={row:row,column:column};else var end={row:row,column:column};return Range.fromPoints(start||this.start,end||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return Range.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new Range(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new Range(this.start.row,0,this.end.row,0)},this.toScreenRange=function(session){var screenPosStart=session.documentToScreenPosition(this.start),screenPosEnd=session.documentToScreenPosition(this.end);return new Range(screenPosStart.row,screenPosStart.column,screenPosEnd.row,screenPosEnd.column)},this.moveBy=function(row,column){this.start.row+=row,this.start.column+=column,this.end.row+=row,this.end.column+=column}}).call(Range.prototype),Range.fromPoints=function(start,end){return new Range(start.row,start.column,end.row,end.column)},Range.comparePoints=comparePoints,Range.comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},exports.Range=Range}),ace.define("ace/apply_delta",["require","exports","module"],function(acequire,exports){"use strict";exports.applyDelta=function(docLines,delta){var row=delta.start.row,startColumn=delta.start.column,line=docLines[row]||"";switch(delta.action){case"insert":var lines=delta.lines;if(1===lines.length)docLines[row]=line.substring(0,startColumn)+delta.lines[0]+line.substring(startColumn);else{var args=[row,1].concat(delta.lines);docLines.splice.apply(docLines,args),docLines[row]=line.substring(0,startColumn)+docLines[row],docLines[row+delta.lines.length-1]+=line.substring(startColumn)}break;case"remove":var endColumn=delta.end.column,endRow=delta.end.row;row===endRow?docLines[row]=line.substring(0,startColumn)+line.substring(endColumn):docLines.splice(row,endRow-row+1,line.substring(0,startColumn)+docLines[endRow].substring(endColumn))}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(acequire,exports){"use strict";var EventEmitter={},stopPropagation=function(){this.propagationStopped=!0},preventDefault=function(){this.defaultPrevented=!0};EventEmitter._emit=EventEmitter._dispatchEvent=function(eventName,e){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var listeners=this._eventRegistry[eventName]||[],defaultHandler=this._defaultHandlers[eventName];if(listeners.length||defaultHandler){"object"==typeof e&&e||(e={}),e.type||(e.type=eventName),e.stopPropagation||(e.stopPropagation=stopPropagation),e.preventDefault||(e.preventDefault=preventDefault),listeners=listeners.slice();for(var i=0;listeners.length>i&&(listeners[i](e,this),!e.propagationStopped);i++);return defaultHandler&&!e.defaultPrevented?defaultHandler(e,this):void 0}},EventEmitter._signal=function(eventName,e){var listeners=(this._eventRegistry||{})[eventName];if(listeners){listeners=listeners.slice();for(var i=0;listeners.length>i;i++)listeners[i](e,this)}},EventEmitter.once=function(eventName,callback){var _self=this;callback&&this.addEventListener(eventName,function newCallback(){_self.removeEventListener(eventName,newCallback),callback.apply(null,arguments)})},EventEmitter.setDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers||(handlers=this._defaultHandlers={_disabled_:{}}),handlers[eventName]){var old=handlers[eventName],disabled=handlers._disabled_[eventName];disabled||(handlers._disabled_[eventName]=disabled=[]),disabled.push(old);var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}handlers[eventName]=callback},EventEmitter.removeDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers){var disabled=handlers._disabled_[eventName];if(handlers[eventName]==callback)handlers[eventName],disabled&&this.setDefaultHandler(eventName,disabled.pop());else if(disabled){var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}}},EventEmitter.on=EventEmitter.addEventListener=function(eventName,callback,capturing){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];return listeners||(listeners=this._eventRegistry[eventName]=[]),-1==listeners.indexOf(callback)&&listeners[capturing?"unshift":"push"](callback),callback},EventEmitter.off=EventEmitter.removeListener=EventEmitter.removeEventListener=function(eventName,callback){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];if(listeners){var index=listeners.indexOf(callback);-1!==index&&listeners.splice(index,1)}},EventEmitter.removeAllListeners=function(eventName){this._eventRegistry&&(this._eventRegistry[eventName]=[])},exports.EventEmitter=EventEmitter}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),EventEmitter=acequire("./lib/event_emitter").EventEmitter,Anchor=exports.Anchor=function(doc,row,column){this.$onChange=this.onChange.bind(this),this.attach(doc),column===void 0?this.setPosition(row.row,row.column):this.setPosition(row,column)};(function(){function $pointsInOrder(point1,point2,equalPointsInOrder){var bColIsAfter=equalPointsInOrder?point1.column<=point2.column:point1.columnthis.row)){var point=$getTransformedPoint(delta,{row:this.row,column:this.column},this.$insertRight);this.setPosition(point.row,point.column,!0)}},this.setPosition=function(row,column,noClip){var pos;if(pos=noClip?{row:row,column:column}:this.$clipPositionToDocument(row,column),this.row!=pos.row||this.column!=pos.column){var old={row:this.row,column:this.column};this.row=pos.row,this.column=pos.column,this._signal("change",{old:old,value:pos})}},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(doc){this.document=doc||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(row,column){var pos={};return row>=this.document.getLength()?(pos.row=Math.max(0,this.document.getLength()-1),pos.column=this.document.getLine(pos.row).length):0>row?(pos.row=0,pos.column=0):(pos.row=row,pos.column=Math.min(this.document.getLine(pos.row).length,Math.max(0,column))),0>column&&(pos.column=0),pos}}).call(Anchor.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),applyDelta=acequire("./apply_delta").applyDelta,EventEmitter=acequire("./lib/event_emitter").EventEmitter,Range=acequire("./range").Range,Anchor=acequire("./anchor").Anchor,Document=function(textOrLines){this.$lines=[""],0===textOrLines.length?this.$lines=[""]:Array.isArray(textOrLines)?this.insertMergedLines({row:0,column:0},textOrLines):this.insert({row:0,column:0},textOrLines)};(function(){oop.implement(this,EventEmitter),this.setValue=function(text){var len=this.getLength()-1;this.remove(new Range(0,0,len,this.getLine(len).length)),this.insert({row:0,column:0},text)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(row,column){return new Anchor(this,row,column)},this.$split=0==="aaa".split(/a/).length?function(text){return text.replace(/\\r\\n|\\r/g,"\\n").split("\\n")}:function(text){return text.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(text){var match=text.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=match?match[1]:"\\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\\r\\n";case"unix":return"\\n";default:return this.$autoNewLine||"\\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(newLineMode){this.$newLineMode!==newLineMode&&(this.$newLineMode=newLineMode,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(text){return"\\r\\n"==text||"\\r"==text||"\\n"==text},this.getLine=function(row){return this.$lines[row]||""},this.getLines=function(firstRow,lastRow){return this.$lines.slice(firstRow,lastRow+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(range){return this.getLinesForRange(range).join(this.getNewLineCharacter())},this.getLinesForRange=function(range){var lines;if(range.start.row===range.end.row)lines=[this.getLine(range.start.row).substring(range.start.column,range.end.column)];else{lines=this.getLines(range.start.row,range.end.row),lines[0]=(lines[0]||"").substring(range.start.column);var l=lines.length-1;range.end.row-range.start.row==l&&(lines[l]=lines[l].substring(0,range.end.column))}return lines},this.insertLines=function(row,lines){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(row,lines)},this.removeLines=function(firstRow,lastRow){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(firstRow,lastRow)},this.insertNewLine=function(position){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead."),this.insertMergedLines(position,["",""])},this.insert=function(position,text){return 1>=this.getLength()&&this.$detectNewLine(text),this.insertMergedLines(position,this.$split(text))},this.insertInLine=function(position,text){var start=this.clippedPos(position.row,position.column),end=this.pos(position.row,position.column+text.length);return this.applyDelta({start:start,end:end,action:"insert",lines:[text]},!0),this.clonePos(end)},this.clippedPos=function(row,column){var length=this.getLength();void 0===row?row=length:0>row?row=0:row>=length&&(row=length-1,column=void 0);var line=this.getLine(row);return void 0==column&&(column=line.length),column=Math.min(Math.max(column,0),line.length),{row:row,column:column}},this.clonePos=function(pos){return{row:pos.row,column:pos.column}},this.pos=function(row,column){return{row:row,column:column}},this.$clipPosition=function(position){var length=this.getLength();return position.row>=length?(position.row=Math.max(0,length-1),position.column=this.getLine(length-1).length):(position.row=Math.max(0,position.row),position.column=Math.min(Math.max(position.column,0),this.getLine(position.row).length)),position},this.insertFullLines=function(row,lines){row=Math.min(Math.max(row,0),this.getLength());var column=0;this.getLength()>row?(lines=lines.concat([""]),column=0):(lines=[""].concat(lines),row--,column=this.$lines[row].length),this.insertMergedLines({row:row,column:column},lines)},this.insertMergedLines=function(position,lines){var start=this.clippedPos(position.row,position.column),end={row:start.row+lines.length-1,column:(1==lines.length?start.column:0)+lines[lines.length-1].length};return this.applyDelta({start:start,end:end,action:"insert",lines:lines}),this.clonePos(end)},this.remove=function(range){var start=this.clippedPos(range.start.row,range.start.column),end=this.clippedPos(range.end.row,range.end.column);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})}),this.clonePos(start)},this.removeInLine=function(row,startColumn,endColumn){var start=this.clippedPos(row,startColumn),end=this.clippedPos(row,endColumn);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})},!0),this.clonePos(start)},this.removeFullLines=function(firstRow,lastRow){firstRow=Math.min(Math.max(0,firstRow),this.getLength()-1),lastRow=Math.min(Math.max(0,lastRow),this.getLength()-1);var deleteFirstNewLine=lastRow==this.getLength()-1&&firstRow>0,deleteLastNewLine=this.getLength()-1>lastRow,startRow=deleteFirstNewLine?firstRow-1:firstRow,startCol=deleteFirstNewLine?this.getLine(startRow).length:0,endRow=deleteLastNewLine?lastRow+1:lastRow,endCol=deleteLastNewLine?0:this.getLine(endRow).length,range=new Range(startRow,startCol,endRow,endCol),deletedLines=this.$lines.slice(firstRow,lastRow+1);return this.applyDelta({start:range.start,end:range.end,action:"remove",lines:this.getLinesForRange(range)}),deletedLines},this.removeNewLine=function(row){this.getLength()-1>row&&row>=0&&this.applyDelta({start:this.pos(row,this.getLine(row).length),end:this.pos(row+1,0),action:"remove",lines:["",""]})},this.replace=function(range,text){if(range instanceof Range||(range=Range.fromPoints(range.start,range.end)),0===text.length&&range.isEmpty())return range.start;if(text==this.getTextRange(range))return range.end;this.remove(range);var end;return end=text?this.insert(range.start,text):range.start},this.applyDeltas=function(deltas){for(var i=0;deltas.length>i;i++)this.applyDelta(deltas[i])},this.revertDeltas=function(deltas){for(var i=deltas.length-1;i>=0;i--)this.revertDelta(deltas[i])},this.applyDelta=function(delta,doNotValidate){var isInsert="insert"==delta.action;(isInsert?1>=delta.lines.length&&!delta.lines[0]:!Range.comparePoints(delta.start,delta.end))||(isInsert&&delta.lines.length>2e4&&this.$splitAndapplyLargeDelta(delta,2e4),applyDelta(this.$lines,delta,doNotValidate),this._signal("change",delta))},this.$splitAndapplyLargeDelta=function(delta,MAX){for(var lines=delta.lines,l=lines.length,row=delta.start.row,column=delta.start.column,from=0,to=0;;){from=to,to+=MAX-1;var chunk=lines.slice(from,to);if(to>l){delta.lines=chunk,delta.start.row=row+from,delta.start.column=column;break}chunk.push(""),this.applyDelta({start:this.pos(row+from,column),end:this.pos(row+to,column=0),action:delta.action,lines:chunk},!0)}},this.revertDelta=function(delta){this.applyDelta({start:this.clonePos(delta.start),end:this.clonePos(delta.end),action:"insert"==delta.action?"remove":"insert",lines:delta.lines.slice()})},this.indexToPosition=function(index,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,i=startRow||0,l=lines.length;l>i;i++)if(index-=lines[i].length+newlineLength,0>index)return{row:i,column:index+lines[i].length+newlineLength};return{row:l-1,column:lines[l-1].length}},this.positionToIndex=function(pos,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,index=0,row=Math.min(pos.row,lines.length),i=startRow||0;row>i;++i)index+=lines[i].length+newlineLength;return index+pos.column}}).call(Document.prototype),exports.Document=Document}),ace.define("ace/lib/lang",["require","exports","module"],function(acequire,exports){"use strict";exports.last=function(a){return a[a.length-1]},exports.stringReverse=function(string){return string.split("").reverse().join("")},exports.stringRepeat=function(string,count){for(var result="";count>0;)1&count&&(result+=string),(count>>=1)&&(string+=string);return result};var trimBeginRegexp=/^\\s\\s*/,trimEndRegexp=/\\s\\s*$/;exports.stringTrimLeft=function(string){return string.replace(trimBeginRegexp,"")},exports.stringTrimRight=function(string){return string.replace(trimEndRegexp,"")},exports.copyObject=function(obj){var copy={};for(var key in obj)copy[key]=obj[key];return copy},exports.copyArray=function(array){for(var copy=[],i=0,l=array.length;l>i;i++)copy[i]=array[i]&&"object"==typeof array[i]?this.copyObject(array[i]):array[i];return copy},exports.deepCopy=function deepCopy(obj){if("object"!=typeof obj||!obj)return obj;var copy;if(Array.isArray(obj)){copy=[];for(var key=0;obj.length>key;key++)copy[key]=deepCopy(obj[key]);return copy}if("[object Object]"!==Object.prototype.toString.call(obj))return obj;copy={};for(var key in obj)copy[key]=deepCopy(obj[key]);return copy},exports.arrayToMap=function(arr){for(var map={},i=0;arr.length>i;i++)map[arr[i]]=1;return map},exports.createMap=function(props){var map=Object.create(null);for(var i in props)map[i]=props[i];return map},exports.arrayRemove=function(array,value){for(var i=0;array.length>=i;i++)value===array[i]&&array.splice(i,1)},exports.escapeRegExp=function(str){return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,"\\\\$1")},exports.escapeHTML=function(str){return str.replace(/&/g,"&").replace(/"/g,""").replace(/\'/g,"'").replace(/i;i+=2){if(Array.isArray(data[i+1]))var d={action:"insert",start:data[i],lines:data[i+1]};else var d={action:"remove",start:data[i],end:data[i+1]};doc.applyDelta(d,!0)}return _self.$timeout?deferredUpdate.schedule(_self.$timeout):(_self.onUpdate(),void 0)})};(function(){this.$timeout=500,this.setTimeout=function(timeout){this.$timeout=timeout},this.setValue=function(value){this.doc.setValue(value),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(callbackId){this.sender.callback(this.doc.getValue(),callbackId)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(Mirror.prototype)}),ace.define("ace/mode/javascript/jshint",["require","exports","module"],function(acequire,exports,module){module.exports=function outer(modules,cache,entry){function newRequire(name,jumped){if(!cache[name]){if(!modules[name]){var currentRequire="function"==typeof acequire&&acequire;if(!jumped&¤tRequire)return currentRequire(name,!0);if(previousRequire)return previousRequire(name,!0);var err=Error("Cannot find module \'"+name+"\'");throw err.code="MODULE_NOT_FOUND",err}var m=cache[name]={exports:{}};modules[name][0].call(m.exports,function(x){var id=modules[name][1][x];return newRequire(id?id:x)},m,m.exports,outer,modules,cache,entry)}return cache[name].exports}for(var previousRequire="function"==typeof acequire&&acequire,i=0;entry.length>i;i++)newRequire(entry[i]);return newRequire(entry[0])}({"/node_modules/browserify/node_modules/events/events.js":[function(_dereq_,module){function EventEmitter(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function isFunction(arg){return"function"==typeof arg}function isNumber(arg){return"number"==typeof arg}function isObject(arg){return"object"==typeof arg&&null!==arg}function isUndefined(arg){return void 0===arg}module.exports=EventEmitter,EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||0>n||isNaN(n))throw TypeError("n must be a positive number");return this._maxListeners=n,this},EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(this._events||(this._events={}),"error"===type&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if(er=arguments[1],er instanceof Error)throw er;throw TypeError(\'Uncaught, unspecified "error" event.\')}if(handler=this._events[type],isUndefined(handler))return!1;if(isFunction(handler))switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:for(len=arguments.length,args=Array(len-1),i=1;len>i;i++)args[i-1]=arguments[i];handler.apply(this,args)}else if(isObject(handler)){for(len=arguments.length,args=Array(len-1),i=1;len>i;i++)args[i-1]=arguments[i];for(listeners=handler.slice(),len=listeners.length,i=0;len>i;i++)listeners[i].apply(this,args)}return!0},EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",type,isFunction(listener.listener)?listener.listener:listener),this._events[type]?isObject(this._events[type])?this._events[type].push(listener):this._events[type]=[this._events[type],listener]:this._events[type]=listener,isObject(this._events[type])&&!this._events[type].warned){var m;m=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners,m&&m>0&&this._events[type].length>m&&(this._events[type].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[type].length),"function"==typeof console.trace&&console.trace())}return this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(type,listener){function g(){this.removeListener(type,g),fired||(fired=!0,listener.apply(this,arguments))}if(!isFunction(listener))throw TypeError("listener must be a function");var fired=!1;return g.listener=listener,this.on(type,g),this},EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;if(list=this._events[type],length=list.length,position=-1,list===listener||isFunction(list.listener)&&list.listener===listener)delete this._events[type],this._events.removeListener&&this.emit("removeListener",type,listener);else if(isObject(list)){for(i=length;i--\x3e0;)if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}if(0>position)return this;1===list.length?(list.length=0,delete this._events[type]):list.splice(position,1),this._events.removeListener&&this.emit("removeListener",type,listener)}return this},EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[type]&&delete this._events[type],this;if(0===arguments.length){for(key in this._events)"removeListener"!==key&&this.removeAllListeners(key);return this.removeAllListeners("removeListener"),this._events={},this\n}if(listeners=this._events[type],isFunction(listeners))this.removeListener(type,listeners);else for(;listeners.length;)this.removeListener(type,listeners[listeners.length-1]);return delete this._events[type],this},EventEmitter.prototype.listeners=function(type){var ret;return ret=this._events&&this._events[type]?isFunction(this._events[type])?[this._events[type]]:this._events[type].slice():[]},EventEmitter.listenerCount=function(emitter,type){var ret;return ret=emitter._events&&emitter._events[type]?isFunction(emitter._events[type])?1:emitter._events[type].length:0}},{}],"/node_modules/jshint/data/ascii-identifier-data.js":[function(_dereq_,module){for(var identifierStartTable=[],i=0;128>i;i++)identifierStartTable[i]=36===i||i>=65&&90>=i||95===i||i>=97&&122>=i;for(var identifierPartTable=[],i=0;128>i;i++)identifierPartTable[i]=identifierStartTable[i]||i>=48&&57>=i;module.exports={asciiIdentifierStartTable:identifierStartTable,asciiIdentifierPartTable:identifierPartTable}},{}],"/node_modules/jshint/lodash.js":[function(_dereq_,module,exports){(function(global){(function(){function baseFindIndex(array,predicate,fromRight){for(var length=array.length,index=fromRight?length:-1;fromRight?index--:length>++index;)if(predicate(array[index],index,array))return index;return-1}function baseIndexOf(array,value,fromIndex){if(value!==value)return indexOfNaN(array,fromIndex);for(var index=fromIndex-1,length=array.length;length>++index;)if(array[index]===value)return index;return-1}function baseIsFunction(value){return"function"==typeof value||!1}function baseToString(value){return"string"==typeof value?value:null==value?"":value+""}function indexOfNaN(array,fromIndex,fromRight){for(var length=array.length,index=fromIndex+(fromRight?0:-1);fromRight?index--:length>++index;){var other=array[index];if(other!==other)return index}return-1}function isObjectLike(value){return!!value&&"object"==typeof value}function lodash(){}function arrayCopy(source,array){var index=-1,length=source.length;for(array||(array=Array(length));length>++index;)array[index]=source[index];return array}function arrayEach(array,iteratee){for(var index=-1,length=array.length;length>++index&&iteratee(array[index],index,array)!==!1;);return array}function arrayFilter(array,predicate){for(var index=-1,length=array.length,resIndex=-1,result=[];length>++index;){var value=array[index];predicate(value,index,array)&&(result[++resIndex]=value)}return result}function arrayMap(array,iteratee){for(var index=-1,length=array.length,result=Array(length);length>++index;)result[index]=iteratee(array[index],index,array);return result}function arrayMax(array){for(var index=-1,length=array.length,result=NEGATIVE_INFINITY;length>++index;){var value=array[index];value>result&&(result=value)}return result}function arraySome(array,predicate){for(var index=-1,length=array.length;length>++index;)if(predicate(array[index],index,array))return!0;return!1}function assignWith(object,source,customizer){var props=keys(source);push.apply(props,getSymbols(source));for(var index=-1,length=props.length;length>++index;){var key=props[index],value=object[key],result=customizer(value,source[key],key,object,source);(result===result?result===value:value!==value)&&(value!==undefined||key in object)||(object[key]=result)}return object}function baseCopy(source,props,object){object||(object={});for(var index=-1,length=props.length;length>++index;){var key=props[index];object[key]=source[key]}return object}function baseCallback(func,thisArg,argCount){var type=typeof func;return"function"==type?thisArg===undefined?func:bindCallback(func,thisArg,argCount):null==func?identity:"object"==type?baseMatches(func):thisArg===undefined?property(func):baseMatchesProperty(func,thisArg)}function baseClone(value,isDeep,customizer,key,object,stackA,stackB){var result;if(customizer&&(result=object?customizer(value,key,object):customizer(value)),result!==undefined)return result;if(!isObject(value))return value;var isArr=isArray(value);if(isArr){if(result=initCloneArray(value),!isDeep)return arrayCopy(value,result)}else{var tag=objToString.call(value),isFunc=tag==funcTag;if(tag!=objectTag&&tag!=argsTag&&(!isFunc||object))return cloneableTags[tag]?initCloneByTag(value,tag,isDeep):object?value:{};if(result=initCloneObject(isFunc?{}:value),!isDeep)return baseAssign(result,value)}stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==value)return stackB[length];return stackA.push(value),stackB.push(result),(isArr?arrayEach:baseForOwn)(value,function(subValue,key){result[key]=baseClone(subValue,isDeep,customizer,key,value,stackA,stackB)}),result}function baseFilter(collection,predicate){var result=[];return baseEach(collection,function(value,index,collection){predicate(value,index,collection)&&result.push(value)}),result}function baseForIn(object,iteratee){return baseFor(object,iteratee,keysIn)}function baseForOwn(object,iteratee){return baseFor(object,iteratee,keys)}function baseGet(object,path,pathKey){if(null!=object){pathKey!==undefined&&pathKey in toObject(object)&&(path=[pathKey]);for(var index=-1,length=path.length;null!=object&&length>++index;)var result=object=object[path[index]];return result}}function baseIsEqual(value,other,customizer,isLoose,stackA,stackB){if(value===other)return 0!==value||1/value==1/other;var valType=typeof value,othType=typeof other;return"function"!=valType&&"object"!=valType&&"function"!=othType&&"object"!=othType||null==value||null==other?value!==value&&other!==other:baseIsEqualDeep(value,other,baseIsEqual,customizer,isLoose,stackA,stackB)}function baseIsEqualDeep(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=arrayTag,othTag=arrayTag;objIsArr||(objTag=objToString.call(object),objTag==argsTag?objTag=objectTag:objTag!=objectTag&&(objIsArr=isTypedArray(object))),othIsArr||(othTag=objToString.call(other),othTag==argsTag?othTag=objectTag:othTag!=objectTag&&(othIsArr=isTypedArray(other)));var objIsObj=objTag==objectTag,othIsObj=othTag==objectTag,isSameTag=objTag==othTag;if(isSameTag&&!objIsArr&&!objIsObj)return equalByTag(object,other,objTag);if(!isLoose){var valWrapped=objIsObj&&hasOwnProperty.call(object,"__wrapped__"),othWrapped=othIsObj&&hasOwnProperty.call(other,"__wrapped__");if(valWrapped||othWrapped)return equalFunc(valWrapped?object.value():object,othWrapped?other.value():other,customizer,isLoose,stackA,stackB)}if(!isSameTag)return!1;stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==object)return stackB[length]==other;stackA.push(object),stackB.push(other);var result=(objIsArr?equalArrays:equalObjects)(object,other,equalFunc,customizer,isLoose,stackA,stackB);return stackA.pop(),stackB.pop(),result}function baseIsMatch(object,props,values,strictCompareFlags,customizer){for(var index=-1,length=props.length,noCustomizer=!customizer;length>++index;)if(noCustomizer&&strictCompareFlags[index]?values[index]!==object[props[index]]:!(props[index]in object))return!1;for(index=-1;length>++index;){var key=props[index],objValue=object[key],srcValue=values[index];if(noCustomizer&&strictCompareFlags[index])var result=objValue!==undefined||key in object;else result=customizer?customizer(objValue,srcValue,key):undefined,result===undefined&&(result=baseIsEqual(srcValue,objValue,customizer,!0));if(!result)return!1}return!0}function baseMatches(source){var props=keys(source),length=props.length;if(!length)return constant(!0);if(1==length){var key=props[0],value=source[key];if(isStrictComparable(value))return function(object){return null==object?!1:object[key]===value&&(value!==undefined||key in toObject(object))}}for(var values=Array(length),strictCompareFlags=Array(length);length--;)value=source[props[length]],values[length]=value,strictCompareFlags[length]=isStrictComparable(value);return function(object){return null!=object&&baseIsMatch(toObject(object),props,values,strictCompareFlags)}}function baseMatchesProperty(path,value){var isArr=isArray(path),isCommon=isKey(path)&&isStrictComparable(value),pathKey=path+"";return path=toPath(path),function(object){if(null==object)return!1;var key=pathKey;if(object=toObject(object),!(!isArr&&isCommon||key in object)){if(object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),null==object)return!1;key=last(path),object=toObject(object)}return object[key]===value?value!==undefined||key in object:baseIsEqual(value,object[key],null,!0)}}function baseMerge(object,source,customizer,stackA,stackB){if(!isObject(object))return object;var isSrcArr=isLength(source.length)&&(isArray(source)||isTypedArray(source));if(!isSrcArr){var props=keys(source);push.apply(props,getSymbols(source))}return arrayEach(props||source,function(srcValue,key){if(props&&(key=srcValue,srcValue=source[key]),isObjectLike(srcValue))stackA||(stackA=[]),stackB||(stackB=[]),baseMergeDeep(object,source,key,baseMerge,customizer,stackA,stackB);else{var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue),!isSrcArr&&result===undefined||!isCommon&&(result===result?result===value:value!==value)||(object[key]=result)}}),object}function baseMergeDeep(object,source,key,mergeFunc,customizer,stackA,stackB){for(var length=stackA.length,srcValue=source[key];length--;)if(stackA[length]==srcValue)return object[key]=stackB[length],undefined;var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue,isLength(srcValue.length)&&(isArray(srcValue)||isTypedArray(srcValue))?result=isArray(value)?value:getLength(value)?arrayCopy(value):[]:isPlainObject(srcValue)||isArguments(srcValue)?result=isArguments(value)?toPlainObject(value):isPlainObject(value)?value:{}:isCommon=!1),stackA.push(srcValue),stackB.push(result),isCommon?object[key]=mergeFunc(result,srcValue,customizer,stackA,stackB):(result===result?result!==value:value===value)&&(object[key]=result)}function baseProperty(key){return function(object){return null==object?undefined:object[key]}}function basePropertyDeep(path){var pathKey=path+"";return path=toPath(path),function(object){return baseGet(object,path,pathKey)}}function baseSlice(array,start,end){var index=-1,length=array.length;start=null==start?0:+start||0,0>start&&(start=-start>length?0:length+start),end=end===undefined||end>length?length:+end||0,0>end&&(end+=length),length=start>end?0:end-start>>>0,start>>>=0;for(var result=Array(length);length>++index;)result[index]=array[index+start];return result}function baseSome(collection,predicate){var result;return baseEach(collection,function(value,index,collection){return result=predicate(value,index,collection),!result}),!!result}function baseValues(object,props){for(var index=-1,length=props.length,result=Array(length);length>++index;)result[index]=object[props[index]];return result}function binaryIndex(array,value,retHighest){var low=0,high=array?array.length:low;if("number"==typeof value&&value===value&&HALF_MAX_ARRAY_LENGTH>=high){for(;high>low;){var mid=low+high>>>1,computed=array[mid];(retHighest?value>=computed:value>computed)?low=mid+1:high=mid}return high}return binaryIndexBy(array,value,identity,retHighest)}function binaryIndexBy(array,value,iteratee,retHighest){value=iteratee(value);for(var low=0,high=array?array.length:0,valIsNaN=value!==value,valIsUndef=value===undefined;high>low;){var mid=floor((low+high)/2),computed=iteratee(array[mid]),isReflexive=computed===computed;if(valIsNaN)var setLow=isReflexive||retHighest;else setLow=valIsUndef?isReflexive&&(retHighest||computed!==undefined):retHighest?value>=computed:value>computed;setLow?low=mid+1:high=mid}return nativeMin(high,MAX_ARRAY_INDEX)}function bindCallback(func,thisArg,argCount){if("function"!=typeof func)return identity;if(thisArg===undefined)return func;switch(argCount){case 1:return function(value){return func.call(thisArg,value)};case 3:return function(value,index,collection){return func.call(thisArg,value,index,collection)};case 4:return function(accumulator,value,index,collection){return func.call(thisArg,accumulator,value,index,collection)};case 5:return function(value,other,key,object,source){return func.call(thisArg,value,other,key,object,source)}}return function(){return func.apply(thisArg,arguments)}}function bufferClone(buffer){return bufferSlice.call(buffer,0)}function createAssigner(assigner){return restParam(function(object,sources){var index=-1,length=null==object?0:sources.length,customizer=length>2&&sources[length-2],guard=length>2&&sources[2],thisArg=length>1&&sources[length-1];for("function"==typeof customizer?(customizer=bindCallback(customizer,thisArg,5),length-=2):(customizer="function"==typeof thisArg?thisArg:null,length-=customizer?1:0),guard&&isIterateeCall(sources[0],sources[1],guard)&&(customizer=3>length?null:customizer,length=1);length>++index;){var source=sources[index];source&&assigner(object,source,customizer)}return object})}function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){var length=collection?getLength(collection):0;if(!isLength(length))return eachFunc(collection,iteratee);for(var index=fromRight?length:-1,iterable=toObject(collection);(fromRight?index--:length>++index)&&iteratee(iterable[index],index,iterable)!==!1;);return collection}}function createBaseFor(fromRight){return function(object,iteratee,keysFunc){for(var iterable=toObject(object),props=keysFunc(object),length=props.length,index=fromRight?length:-1;fromRight?index--:length>++index;){var key=props[index];if(iteratee(iterable[key],key,iterable)===!1)break}return object}}function createFindIndex(fromRight){return function(array,predicate,thisArg){return array&&array.length?(predicate=getCallback(predicate,thisArg,3),baseFindIndex(array,predicate,fromRight)):-1}}function createForEach(arrayFunc,eachFunc){return function(collection,iteratee,thisArg){return"function"==typeof iteratee&&thisArg===undefined&&isArray(collection)?arrayFunc(collection,iteratee):eachFunc(collection,bindCallback(iteratee,thisArg,3))}}function equalArrays(array,other,equalFunc,customizer,isLoose,stackA,stackB){var index=-1,arrLength=array.length,othLength=other.length,result=!0;if(arrLength!=othLength&&!(isLoose&&othLength>arrLength))return!1;for(;result&&arrLength>++index;){var arrValue=array[index],othValue=other[index];if(result=undefined,customizer&&(result=isLoose?customizer(othValue,arrValue,index):customizer(arrValue,othValue,index)),result===undefined)if(isLoose)for(var othIndex=othLength;othIndex--&&(othValue=other[othIndex],!(result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB))););else result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB)}return!!result}function equalByTag(object,other,tag){switch(tag){case boolTag:case dateTag:return+object==+other;case errorTag:return object.name==other.name&&object.message==other.message;case numberTag:return object!=+object?other!=+other:0==object?1/object==1/other:object==+other;case regexpTag:case stringTag:return object==other+""}return!1}function equalObjects(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objProps=keys(object),objLength=objProps.length,othProps=keys(other),othLength=othProps.length;if(objLength!=othLength&&!isLoose)return!1;for(var skipCtor=isLoose,index=-1;objLength>++index;){var key=objProps[index],result=isLoose?key in other:hasOwnProperty.call(other,key);if(result){var objValue=object[key],othValue=other[key];result=undefined,customizer&&(result=isLoose?customizer(othValue,objValue,key):customizer(objValue,othValue,key)),result===undefined&&(result=objValue&&objValue===othValue||equalFunc(objValue,othValue,customizer,isLoose,stackA,stackB))}if(!result)return!1;skipCtor||(skipCtor="constructor"==key)}if(!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;if(objCtor!=othCtor&&"constructor"in object&&"constructor"in other&&!("function"==typeof objCtor&&objCtor instanceof objCtor&&"function"==typeof othCtor&&othCtor instanceof othCtor))return!1}return!0}function getCallback(func,thisArg,argCount){var result=lodash.callback||callback;return result=result===callback?baseCallback:result,argCount?result(func,thisArg,argCount):result}function getIndexOf(collection,target,fromIndex){var result=lodash.indexOf||indexOf;return result=result===indexOf?baseIndexOf:result,collection?result(collection,target,fromIndex):result}function initCloneArray(array){var length=array.length,result=new array.constructor(length);return length&&"string"==typeof array[0]&&hasOwnProperty.call(array,"index")&&(result.index=array.index,result.input=array.input),result}function initCloneObject(object){var Ctor=object.constructor;return"function"==typeof Ctor&&Ctor instanceof Ctor||(Ctor=Object),new Ctor}function initCloneByTag(object,tag,isDeep){var Ctor=object.constructor;switch(tag){case arrayBufferTag:return bufferClone(object);case boolTag:case dateTag:return new Ctor(+object);case float32Tag:case float64Tag:case int8Tag:case int16Tag:case int32Tag:case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:var buffer=object.buffer;return new Ctor(isDeep?bufferClone(buffer):buffer,object.byteOffset,object.length);case numberTag:case stringTag:return new Ctor(object);case regexpTag:var result=new Ctor(object.source,reFlags.exec(object));result.lastIndex=object.lastIndex}return result}function isIndex(value,length){return value=+value,length=null==length?MAX_SAFE_INTEGER:length,value>-1&&0==value%1&&length>value}function isIterateeCall(value,index,object){if(!isObject(object))return!1;var type=typeof index;if("number"==type)var length=getLength(object),prereq=isLength(length)&&isIndex(index,length);else prereq="string"==type&&index in object;if(prereq){var other=object[index];return value===value?value===other:other!==other}return!1}function isKey(value,object){var type=typeof value;if("string"==type&&reIsPlainProp.test(value)||"number"==type)return!0;if(isArray(value))return!1;var result=!reIsDeepProp.test(value);return result||null!=object&&value in toObject(object)}function isLength(value){return"number"==typeof value&&value>-1&&0==value%1&&MAX_SAFE_INTEGER>=value}function isStrictComparable(value){return value===value&&(0===value?1/value>0:!isObject(value))}function shimIsPlainObject(value){var Ctor;if(lodash.support,!isObjectLike(value)||objToString.call(value)!=objectTag||!hasOwnProperty.call(value,"constructor")&&(Ctor=value.constructor,"function"==typeof Ctor&&!(Ctor instanceof Ctor)))return!1;var result;return baseForIn(value,function(subValue,key){result=key}),result===undefined||hasOwnProperty.call(value,result)}function shimKeys(object){for(var props=keysIn(object),propsLength=props.length,length=propsLength&&object.length,support=lodash.support,allowIndexes=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object)),index=-1,result=[];propsLength>++index;){var key=props[index];(allowIndexes&&isIndex(key,length)||hasOwnProperty.call(object,key))&&result.push(key)}return result}function toObject(value){return isObject(value)?value:Object(value)}function toPath(value){if(isArray(value))return value;var result=[];return baseToString(value).replace(rePropName,function(match,number,quote,string){result.push(quote?string.replace(reEscapeChar,"$1"):number||match)}),result}function indexOf(array,value,fromIndex){var length=array?array.length:0;if(!length)return-1;if("number"==typeof fromIndex)fromIndex=0>fromIndex?nativeMax(length+fromIndex,0):fromIndex;else if(fromIndex){var index=binaryIndex(array,value),other=array[index];return(value===value?value===other:other!==other)?index:-1}return baseIndexOf(array,value,fromIndex||0)}function last(array){var length=array?array.length:0;return length?array[length-1]:undefined}function slice(array,start,end){var length=array?array.length:0;return length?(end&&"number"!=typeof end&&isIterateeCall(array,start,end)&&(start=0,end=length),baseSlice(array,start,end)):[]}function unzip(array){for(var index=-1,length=(array&&array.length&&arrayMax(arrayMap(array,getLength)))>>>0,result=Array(length);length>++index;)result[index]=arrayMap(array,baseProperty(index));return result}function includes(collection,target,fromIndex,guard){var length=collection?getLength(collection):0;return isLength(length)||(collection=values(collection),length=collection.length),length?(fromIndex="number"!=typeof fromIndex||guard&&isIterateeCall(target,fromIndex,guard)?0:0>fromIndex?nativeMax(length+fromIndex,0):fromIndex||0,"string"==typeof collection||!isArray(collection)&&isString(collection)?length>fromIndex&&collection.indexOf(target,fromIndex)>-1:getIndexOf(collection,target,fromIndex)>-1):!1}function reject(collection,predicate,thisArg){var func=isArray(collection)?arrayFilter:baseFilter;return predicate=getCallback(predicate,thisArg,3),func(collection,function(value,index,collection){return!predicate(value,index,collection)})}function some(collection,predicate,thisArg){var func=isArray(collection)?arraySome:baseSome;return thisArg&&isIterateeCall(collection,predicate,thisArg)&&(predicate=null),("function"!=typeof predicate||thisArg!==undefined)&&(predicate=getCallback(predicate,thisArg,3)),func(collection,predicate)}function restParam(func,start){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return start=nativeMax(start===undefined?func.length-1:+start||0,0),function(){for(var args=arguments,index=-1,length=nativeMax(args.length-start,0),rest=Array(length);length>++index;)rest[index]=args[start+index];switch(start){case 0:return func.call(this,rest);case 1:return func.call(this,args[0],rest);case 2:return func.call(this,args[0],args[1],rest)}var otherArgs=Array(start+1);for(index=-1;start>++index;)otherArgs[index]=args[index];return otherArgs[start]=rest,func.apply(this,otherArgs)}}function clone(value,isDeep,customizer,thisArg){return isDeep&&"boolean"!=typeof isDeep&&isIterateeCall(value,isDeep,customizer)?isDeep=!1:"function"==typeof isDeep&&(thisArg=customizer,customizer=isDeep,isDeep=!1),customizer="function"==typeof customizer&&bindCallback(customizer,thisArg,1),baseClone(value,isDeep,customizer)}function isArguments(value){var length=isObjectLike(value)?value.length:undefined;return isLength(length)&&objToString.call(value)==argsTag}function isEmpty(value){if(null==value)return!0;var length=getLength(value);return isLength(length)&&(isArray(value)||isString(value)||isArguments(value)||isObjectLike(value)&&isFunction(value.splice))?!length:!keys(value).length}function isObject(value){var type=typeof value;return"function"==type||!!value&&"object"==type}function isNative(value){return null==value?!1:objToString.call(value)==funcTag?reIsNative.test(fnToString.call(value)):isObjectLike(value)&&reIsHostCtor.test(value)}function isNumber(value){return"number"==typeof value||isObjectLike(value)&&objToString.call(value)==numberTag}function isString(value){return"string"==typeof value||isObjectLike(value)&&objToString.call(value)==stringTag}function isTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[objToString.call(value)]}function toPlainObject(value){return baseCopy(value,keysIn(value))}function has(object,path){if(null==object)return!1;var result=hasOwnProperty.call(object,path);return result||isKey(path)||(path=toPath(path),object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),path=last(path),result=null!=object&&hasOwnProperty.call(object,path)),result}function keysIn(object){if(null==object)return[];isObject(object)||(object=Object(object));var length=object.length;length=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object))&&length||0;for(var Ctor=object.constructor,index=-1,isProto="function"==typeof Ctor&&Ctor.prototype===object,result=Array(length),skipIndexes=length>0;length>++index;)result[index]=index+"";for(var key in object)skipIndexes&&isIndex(key,length)||"constructor"==key&&(isProto||!hasOwnProperty.call(object,key))||result.push(key);return result}function values(object){return baseValues(object,keys(object))}function escapeRegExp(string){return string=baseToString(string),string&&reHasRegExpChars.test(string)?string.replace(reRegExpChars,"\\\\$&"):string}function callback(func,thisArg,guard){return guard&&isIterateeCall(func,thisArg,guard)&&(thisArg=null),baseCallback(func,thisArg)}function constant(value){return function(){return value}}function identity(value){return value}function property(path){return isKey(path)?baseProperty(path):basePropertyDeep(path)}var undefined,VERSION="3.7.0",FUNC_ERROR_TEXT="Expected a function",argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag="[object Function]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag="[object ArrayBuffer]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",reIsDeepProp=/\\.|\\[(?:[^[\\]]+|(["\'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?)\\1\\]/,reIsPlainProp=/^\\w*$/,rePropName=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|(["\'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g,reRegExpChars=/[.*+?^${}()|[\\]\\/\\\\]/g,reHasRegExpChars=RegExp(reRegExpChars.source),reEscapeChar=/\\\\(\\\\)?/g,reFlags=/\\w*$/,reIsHostCtor=/^\\[object .+?Constructor\\]$/,typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[stringTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=!0,cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[mapTag]=cloneableTags[setTag]=cloneableTags[weakMapTag]=!1;var objectTypes={"function":!0,object:!0},freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports,freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module,freeGlobal=freeExports&&freeModule&&"object"==typeof global&&global&&global.Object&&global,freeSelf=objectTypes[typeof self]&&self&&self.Object&&self,freeWindow=objectTypes[typeof window]&&window&&window.Object&&window,moduleExports=freeModule&&freeModule.exports===freeExports&&freeExports,root=freeGlobal||freeWindow!==(this&&this.window)&&freeWindow||freeSelf||this,arrayProto=Array.prototype,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+escapeRegExp(objToString).replace(/toString|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,"$1.*?")+"$"),ArrayBuffer=isNative(ArrayBuffer=root.ArrayBuffer)&&ArrayBuffer,bufferSlice=isNative(bufferSlice=ArrayBuffer&&new ArrayBuffer(0).slice)&&bufferSlice,floor=Math.floor,getOwnPropertySymbols=isNative(getOwnPropertySymbols=Object.getOwnPropertySymbols)&&getOwnPropertySymbols,getPrototypeOf=isNative(getPrototypeOf=Object.getPrototypeOf)&&getPrototypeOf,push=arrayProto.push,preventExtensions=isNative(Object.preventExtensions=Object.preventExtensions)&&preventExtensions,propertyIsEnumerable=objectProto.propertyIsEnumerable,Uint8Array=isNative(Uint8Array=root.Uint8Array)&&Uint8Array,Float64Array=function(){try{var func=isNative(func=root.Float64Array)&&func,result=new func(new ArrayBuffer(10),0,1)&&func}catch(e){}return result}(),nativeAssign=function(){var object={1:0},func=preventExtensions&&isNative(func=Object.assign)&&func;try{func(preventExtensions(object),"xo")}catch(e){}return!object[1]&&func}(),nativeIsArray=isNative(nativeIsArray=Array.isArray)&&nativeIsArray,nativeKeys=isNative(nativeKeys=Object.keys)&&nativeKeys,nativeMax=Math.max,nativeMin=Math.min,NEGATIVE_INFINITY=Number.NEGATIVE_INFINITY,MAX_ARRAY_LENGTH=Math.pow(2,32)-1,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1,FLOAT64_BYTES_PER_ELEMENT=Float64Array?Float64Array.BYTES_PER_ELEMENT:0,MAX_SAFE_INTEGER=Math.pow(2,53)-1,support=lodash.support={};(function(x){var Ctor=function(){this.x=x},props=[];Ctor.prototype={valueOf:x,y:x};for(var key in new Ctor)props.push(key);support.funcDecomp=/\\bthis\\b/.test(function(){return this}),support.funcNames="string"==typeof Function.name;try{support.nonEnumArgs=!propertyIsEnumerable.call(arguments,1)}catch(e){support.nonEnumArgs=!0}})(1,0);var baseAssign=nativeAssign||function(object,source){return null==source?object:baseCopy(source,getSymbols(source),baseCopy(source,keys(source),object))},baseEach=createBaseEach(baseForOwn),baseFor=createBaseFor();bufferSlice||(bufferClone=ArrayBuffer&&Uint8Array?function(buffer){var byteLength=buffer.byteLength,floatLength=Float64Array?floor(byteLength/FLOAT64_BYTES_PER_ELEMENT):0,offset=floatLength*FLOAT64_BYTES_PER_ELEMENT,result=new ArrayBuffer(byteLength);if(floatLength){var view=new Float64Array(result,0,floatLength);view.set(new Float64Array(buffer,0,floatLength))}return byteLength!=offset&&(view=new Uint8Array(result,offset),view.set(new Uint8Array(buffer,offset))),result}:constant(null));var getLength=baseProperty("length"),getSymbols=getOwnPropertySymbols?function(object){return getOwnPropertySymbols(toObject(object))}:constant([]),findLastIndex=createFindIndex(!0),zip=restParam(unzip),forEach=createForEach(arrayEach,baseEach),isArray=nativeIsArray||function(value){return isObjectLike(value)&&isLength(value.length)&&objToString.call(value)==arrayTag},isFunction=baseIsFunction(/x/)||Uint8Array&&!baseIsFunction(Uint8Array)?function(value){return objToString.call(value)==funcTag}:baseIsFunction,isPlainObject=getPrototypeOf?function(value){if(!value||objToString.call(value)!=objectTag)return!1;var valueOf=value.valueOf,objProto=isNative(valueOf)&&(objProto=getPrototypeOf(valueOf))&&getPrototypeOf(objProto);return objProto?value==objProto||getPrototypeOf(value)==objProto:shimIsPlainObject(value)}:shimIsPlainObject,assign=createAssigner(function(object,source,customizer){return customizer?assignWith(object,source,customizer):baseAssign(object,source)}),keys=nativeKeys?function(object){if(object)var Ctor=object.constructor,length=object.length;return"function"==typeof Ctor&&Ctor.prototype===object||"function"!=typeof object&&isLength(length)?shimKeys(object):isObject(object)?nativeKeys(object):[]}:shimKeys,merge=createAssigner(baseMerge);lodash.assign=assign,lodash.callback=callback,lodash.constant=constant,lodash.forEach=forEach,lodash.keys=keys,lodash.keysIn=keysIn,lodash.merge=merge,lodash.property=property,lodash.reject=reject,lodash.restParam=restParam,lodash.slice=slice,lodash.toPlainObject=toPlainObject,lodash.unzip=unzip,lodash.values=values,lodash.zip=zip,lodash.each=forEach,lodash.extend=assign,lodash.iteratee=callback,lodash.clone=clone,lodash.escapeRegExp=escapeRegExp,lodash.findLastIndex=findLastIndex,lodash.has=has,lodash.identity=identity,lodash.includes=includes,lodash.indexOf=indexOf,lodash.isArguments=isArguments,lodash.isArray=isArray,lodash.isEmpty=isEmpty,lodash.isFunction=isFunction,lodash.isNative=isNative,lodash.isNumber=isNumber,lodash.isObject=isObject,lodash.isPlainObject=isPlainObject,lodash.isString=isString,lodash.isTypedArray=isTypedArray,lodash.last=last,lodash.some=some,lodash.any=some,lodash.contains=includes,lodash.include=includes,lodash.VERSION=VERSION,freeExports&&freeModule?moduleExports?(freeModule.exports=lodash)._=lodash:freeExports._=lodash:root._=lodash\n}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],"/node_modules/jshint/src/jshint.js":[function(_dereq_,module,exports){var _=_dereq_("../lodash"),events=_dereq_("events"),vars=_dereq_("./vars.js"),messages=_dereq_("./messages.js"),Lexer=_dereq_("./lex.js").Lexer,reg=_dereq_("./reg.js"),state=_dereq_("./state.js").state,style=_dereq_("./style.js"),options=_dereq_("./options.js"),scopeManager=_dereq_("./scope-manager.js"),JSHINT=function(){"use strict";function checkOption(name,t){return name=name.trim(),/^[+-]W\\d{3}$/g.test(name)?!0:-1!==options.validNames.indexOf(name)||"jslint"===t.type||_.has(options.removed,name)?!0:(error("E001",t,name),!1)}function isString(obj){return"[object String]"===Object.prototype.toString.call(obj)}function isIdentifier(tkn,value){return tkn?tkn.identifier&&tkn.value===value?!0:!1:!1}function isReserved(token){if(!token.reserved)return!1;var meta=token.meta;if(meta&&meta.isFutureReservedWord&&state.inES5()){if(!meta.es5)return!1;if(meta.strictOnly&&!state.option.strict&&!state.isStrict())return!1;if(token.isProperty)return!1}return!0}function supplant(str,data){return str.replace(/\\{([^{}]*)\\}/g,function(a,b){var r=data[b];return"string"==typeof r||"number"==typeof r?r:a})}function combine(dest,src){Object.keys(src).forEach(function(name){_.has(JSHINT.blacklist,name)||(dest[name]=src[name])})}function processenforceall(){if(state.option.enforceall){for(var enforceopt in options.bool.enforcing)void 0!==state.option[enforceopt]||options.noenforceall[enforceopt]||(state.option[enforceopt]=!0);for(var relaxopt in options.bool.relaxing)void 0===state.option[relaxopt]&&(state.option[relaxopt]=!1)}}function assume(){processenforceall(),state.option.esversion||state.option.moz||(state.option.esversion=state.option.es3?3:state.option.esnext?6:5),state.inES5()&&combine(predefined,vars.ecmaIdentifiers[5]),state.inES6()&&combine(predefined,vars.ecmaIdentifiers[6]),state.option.module&&(state.option.strict===!0&&(state.option.strict="global"),state.inES6()||warning("W134",state.tokens.next,"module",6)),state.option.couch&&combine(predefined,vars.couch),state.option.qunit&&combine(predefined,vars.qunit),state.option.rhino&&combine(predefined,vars.rhino),state.option.shelljs&&(combine(predefined,vars.shelljs),combine(predefined,vars.node)),state.option.typed&&combine(predefined,vars.typed),state.option.phantom&&(combine(predefined,vars.phantom),state.option.strict===!0&&(state.option.strict="global")),state.option.prototypejs&&combine(predefined,vars.prototypejs),state.option.node&&(combine(predefined,vars.node),combine(predefined,vars.typed),state.option.strict===!0&&(state.option.strict="global")),state.option.devel&&combine(predefined,vars.devel),state.option.dojo&&combine(predefined,vars.dojo),state.option.browser&&(combine(predefined,vars.browser),combine(predefined,vars.typed)),state.option.browserify&&(combine(predefined,vars.browser),combine(predefined,vars.typed),combine(predefined,vars.browserify),state.option.strict===!0&&(state.option.strict="global")),state.option.nonstandard&&combine(predefined,vars.nonstandard),state.option.jasmine&&combine(predefined,vars.jasmine),state.option.jquery&&combine(predefined,vars.jquery),state.option.mootools&&combine(predefined,vars.mootools),state.option.worker&&combine(predefined,vars.worker),state.option.wsh&&combine(predefined,vars.wsh),state.option.globalstrict&&state.option.strict!==!1&&(state.option.strict="global"),state.option.yui&&combine(predefined,vars.yui),state.option.mocha&&combine(predefined,vars.mocha)}function quit(code,line,chr){var percentage=Math.floor(100*(line/state.lines.length)),message=messages.errors[code].desc;throw{name:"JSHintError",line:line,character:chr,message:message+" ("+percentage+"% scanned).",raw:message,code:code}}function removeIgnoredMessages(){var ignored=state.ignoredLines;_.isEmpty(ignored)||(JSHINT.errors=_.reject(JSHINT.errors,function(err){return ignored[err.line]}))}function warning(code,t,a,b,c,d){var ch,l,w,msg;if(/^W\\d{3}$/.test(code)){if(state.ignored[code])return;msg=messages.warnings[code]}else/E\\d{3}/.test(code)?msg=messages.errors[code]:/I\\d{3}/.test(code)&&(msg=messages.info[code]);return t=t||state.tokens.next||{},"(end)"===t.id&&(t=state.tokens.curr),l=t.line||0,ch=t.from||0,w={id:"(error)",raw:msg.desc,code:msg.code,evidence:state.lines[l-1]||"",line:l,character:ch,scope:JSHINT.scope,a:a,b:b,c:c,d:d},w.reason=supplant(msg.desc,w),JSHINT.errors.push(w),removeIgnoredMessages(),JSHINT.errors.length>=state.option.maxerr&&quit("E043",l,ch),w}function warningAt(m,l,ch,a,b,c,d){return warning(m,{line:l,from:ch},a,b,c,d)}function error(m,t,a,b,c,d){warning(m,t,a,b,c,d)}function errorAt(m,l,ch,a,b,c,d){return error(m,{line:l,from:ch},a,b,c,d)}function addInternalSrc(elem,src){var i;return i={id:"(internal)",elem:elem,value:src},JSHINT.internals.push(i),i}function doOption(){var nt=state.tokens.next,body=nt.body.match(/(-\\s+)?[^\\s,:]+(?:\\s*:\\s*(-\\s+)?[^\\s,]+)?/g)||[],predef={};if("globals"===nt.type){body.forEach(function(g,idx){g=g.split(":");var key=(g[0]||"").trim(),val=(g[1]||"").trim();if("-"===key||!key.length){if(idx>0&&idx===body.length-1)return;return error("E002",nt),void 0}"-"===key.charAt(0)?(key=key.slice(1),val=!1,JSHINT.blacklist[key]=key,delete predefined[key]):predef[key]="true"===val}),combine(predefined,predef);for(var key in predef)_.has(predef,key)&&(declared[key]=nt)}"exported"===nt.type&&body.forEach(function(e,idx){if(!e.length){if(idx>0&&idx===body.length-1)return;return error("E002",nt),void 0}state.funct["(scope)"].addExported(e)}),"members"===nt.type&&(membersOnly=membersOnly||{},body.forEach(function(m){var ch1=m.charAt(0),ch2=m.charAt(m.length-1);ch1!==ch2||\'"\'!==ch1&&"\'"!==ch1||(m=m.substr(1,m.length-2).replace(\'\\\\"\',\'"\')),membersOnly[m]=!1}));var numvals=["maxstatements","maxparams","maxdepth","maxcomplexity","maxerr","maxlen","indent"];("jshint"===nt.type||"jslint"===nt.type)&&(body.forEach(function(g){g=g.split(":");var key=(g[0]||"").trim(),val=(g[1]||"").trim();if(checkOption(key,nt))if(numvals.indexOf(key)>=0)if("false"!==val){if(val=+val,"number"!=typeof val||!isFinite(val)||0>=val||Math.floor(val)!==val)return error("E032",nt,g[1].trim()),void 0;state.option[key]=val}else state.option[key]="indent"===key?4:!1;else{if("validthis"===key)return state.funct["(global)"]?void error("E009"):"true"!==val&&"false"!==val?void error("E002",nt):(state.option.validthis="true"===val,void 0);if("quotmark"!==key)if("shadow"!==key)if("unused"!==key)if("latedef"!==key)if("ignore"!==key)if("strict"!==key){"module"===key&&(hasParsedCode(state.funct)||error("E055",state.tokens.next,"module"));var esversions={es3:3,es5:5,esnext:6};if(!_.has(esversions,key)){if("esversion"===key){switch(val){case"5":state.inES5(!0)&&warning("I003");case"3":case"6":state.option.moz=!1,state.option.esversion=+val;break;case"2015":state.option.moz=!1,state.option.esversion=6;break;default:error("E002",nt)}return hasParsedCode(state.funct)||error("E055",state.tokens.next,"esversion"),void 0}var match=/^([+-])(W\\d{3})$/g.exec(key);if(match)return state.ignored[match[2]]="-"===match[1],void 0;var tn;return"true"===val||"false"===val?("jslint"===nt.type?(tn=options.renamed[key]||key,state.option[tn]="true"===val,void 0!==options.inverted[tn]&&(state.option[tn]=!state.option[tn])):state.option[key]="true"===val,"newcap"===key&&(state.option["(explicitNewcap)"]=!0),void 0):(error("E002",nt),void 0)}switch(val){case"true":state.option.moz=!1,state.option.esversion=esversions[key];break;case"false":state.option.moz||(state.option.esversion=5);break;default:error("E002",nt)}}else switch(val){case"true":state.option.strict=!0;break;case"false":state.option.strict=!1;break;case"func":case"global":case"implied":state.option.strict=val;break;default:error("E002",nt)}else switch(val){case"line":state.ignoredLines[nt.line]=!0,removeIgnoredMessages();break;default:error("E002",nt)}else switch(val){case"true":state.option.latedef=!0;break;case"false":state.option.latedef=!1;break;case"nofunc":state.option.latedef="nofunc";break;default:error("E002",nt)}else switch(val){case"true":state.option.unused=!0;break;case"false":state.option.unused=!1;break;case"vars":case"strict":state.option.unused=val;break;default:error("E002",nt)}else switch(val){case"true":state.option.shadow=!0;break;case"outer":state.option.shadow="outer";break;case"false":case"inner":state.option.shadow="inner";break;default:error("E002",nt)}else switch(val){case"true":case"false":state.option.quotmark="true"===val;break;case"double":case"single":state.option.quotmark=val;break;default:error("E002",nt)}}}),assume())}function peek(p){var t,i=p||0,j=lookahead.length;if(j>i)return lookahead[i];for(;i>=j;)t=lookahead[j],t||(t=lookahead[j]=lex.token()),j+=1;return t||"(end)"!==state.tokens.next.id?t:state.tokens.next}function peekIgnoreEOL(){var t,i=0;do t=peek(i++);while("(endline)"===t.id);return t}function advance(id,t){switch(state.tokens.curr.id){case"(number)":"."===state.tokens.next.id&&warning("W005",state.tokens.curr);break;case"-":("-"===state.tokens.next.id||"--"===state.tokens.next.id)&&warning("W006");break;case"+":("+"===state.tokens.next.id||"++"===state.tokens.next.id)&&warning("W007")}for(id&&state.tokens.next.id!==id&&(t?"(end)"===state.tokens.next.id?error("E019",t,t.id):error("E020",state.tokens.next,id,t.id,t.line,state.tokens.next.value):("(identifier)"!==state.tokens.next.type||state.tokens.next.value!==id)&&warning("W116",state.tokens.next,id,state.tokens.next.value)),state.tokens.prev=state.tokens.curr,state.tokens.curr=state.tokens.next;;){if(state.tokens.next=lookahead.shift()||lex.token(),state.tokens.next||quit("E041",state.tokens.curr.line),"(end)"===state.tokens.next.id||"(error)"===state.tokens.next.id)return;if(state.tokens.next.check&&state.tokens.next.check(),state.tokens.next.isSpecial)"falls through"===state.tokens.next.type?state.tokens.curr.caseFallsThrough=!0:doOption();else if("(endline)"!==state.tokens.next.id)break}}function isInfix(token){return token.infix||!token.identifier&&!token.template&&!!token.led}function isEndOfExpr(){var curr=state.tokens.curr,next=state.tokens.next;return";"===next.id||"}"===next.id||":"===next.id?!0:isInfix(next)===isInfix(curr)||"yield"===curr.id&&state.inMoz()?curr.line!==startLine(next):!1}function isBeginOfExpr(prev){return!prev.left&&"unary"!==prev.arity}function expression(rbp,initial){var left,isArray=!1,isObject=!1,isLetExpr=!1;state.nameStack.push(),initial||"let"!==state.tokens.next.value||"("!==peek(0).value||(state.inMoz()||warning("W118",state.tokens.next,"let expressions"),isLetExpr=!0,state.funct["(scope)"].stack(),advance("let"),advance("("),state.tokens.prev.fud(),advance(")")),"(end)"===state.tokens.next.id&&error("E006",state.tokens.curr);var isDangerous=state.option.asi&&state.tokens.prev.line!==startLine(state.tokens.curr)&&_.contains(["]",")"],state.tokens.prev.id)&&_.contains(["[","("],state.tokens.curr.id);if(isDangerous&&warning("W014",state.tokens.curr,state.tokens.curr.id),advance(),initial&&(state.funct["(verb)"]=state.tokens.curr.value,state.tokens.curr.beginsStmt=!0),initial===!0&&state.tokens.curr.fud)left=state.tokens.curr.fud();else for(state.tokens.curr.nud?left=state.tokens.curr.nud():error("E030",state.tokens.curr,state.tokens.curr.id);(state.tokens.next.lbp>rbp||"(template)"===state.tokens.next.type)&&!isEndOfExpr();)isArray="Array"===state.tokens.curr.value,isObject="Object"===state.tokens.curr.value,left&&(left.value||left.first&&left.first.value)&&("new"!==left.value||left.first&&left.first.value&&"."===left.first.value)&&(isArray=!1,left.value!==state.tokens.curr.value&&(isObject=!1)),advance(),isArray&&"("===state.tokens.curr.id&&")"===state.tokens.next.id&&warning("W009",state.tokens.curr),isObject&&"("===state.tokens.curr.id&&")"===state.tokens.next.id&&warning("W010",state.tokens.curr),left&&state.tokens.curr.led?left=state.tokens.curr.led(left):error("E033",state.tokens.curr,state.tokens.curr.id);return isLetExpr&&state.funct["(scope)"].unstack(),state.nameStack.pop(),left}function startLine(token){return token.startLine||token.line}function nobreaknonadjacent(left,right){left=left||state.tokens.curr,right=right||state.tokens.next,state.option.laxbreak||left.line===startLine(right)||warning("W014",right,right.value)}function nolinebreak(t){t=t||state.tokens.curr,t.line!==startLine(state.tokens.next)&&warning("E022",t,t.value)}function nobreakcomma(left,right){left.line!==startLine(right)&&(state.option.laxcomma||(comma.first&&(warning("I001"),comma.first=!1),warning("W014",left,right.value)))}function comma(opts){if(opts=opts||{},opts.peek?nobreakcomma(state.tokens.prev,state.tokens.curr):(nobreakcomma(state.tokens.curr,state.tokens.next),advance(",")),state.tokens.next.identifier&&(!opts.property||!state.inES5()))switch(state.tokens.next.value){case"break":case"case":case"catch":case"continue":case"default":case"do":case"else":case"finally":case"for":case"if":case"in":case"instanceof":case"return":case"switch":case"throw":case"try":case"var":case"let":case"while":case"with":return error("E024",state.tokens.next,state.tokens.next.value),!1}if("(punctuator)"===state.tokens.next.type)switch(state.tokens.next.value){case"}":case"]":case",":if(opts.allowTrailing)return!0;case")":return error("E024",state.tokens.next,state.tokens.next.value),!1}return!0}function symbol(s,p){var x=state.syntax[s];return x&&"object"==typeof x||(state.syntax[s]=x={id:s,lbp:p,value:s}),x}function delim(s){var x=symbol(s,0);return x.delim=!0,x}function stmt(s,f){var x=delim(s);return x.identifier=x.reserved=!0,x.fud=f,x}function blockstmt(s,f){var x=stmt(s,f);return x.block=!0,x}function reserveName(x){var c=x.id.charAt(0);return(c>="a"&&"z">=c||c>="A"&&"Z">=c)&&(x.identifier=x.reserved=!0),x}function prefix(s,f){var x=symbol(s,150);return reserveName(x),x.nud="function"==typeof f?f:function(){return this.arity="unary",this.right=expression(150),("++"===this.id||"--"===this.id)&&(state.option.plusplus?warning("W016",this,this.id):!this.right||this.right.identifier&&!isReserved(this.right)||"."===this.right.id||"["===this.right.id||warning("W017",this),this.right&&this.right.isMetaProperty?error("E031",this):this.right&&this.right.identifier&&state.funct["(scope)"].block.modify(this.right.value,this)),this},x}function type(s,f){var x=delim(s);return x.type=s,x.nud=f,x}function reserve(name,func){var x=type(name,func);return x.identifier=!0,x.reserved=!0,x}function FutureReservedWord(name,meta){var x=type(name,meta&&meta.nud||function(){return this});return meta=meta||{},meta.isFutureReservedWord=!0,x.value=name,x.identifier=!0,x.reserved=!0,x.meta=meta,x}function reservevar(s,v){return reserve(s,function(){return"function"==typeof v&&v(this),this})}function infix(s,f,p,w){var x=symbol(s,p);return reserveName(x),x.infix=!0,x.led=function(left){return w||nobreaknonadjacent(state.tokens.prev,state.tokens.curr),"in"!==s&&"instanceof"!==s||"!"!==left.id||warning("W018",left,"!"),"function"==typeof f?f(left,this):(this.left=left,this.right=expression(p),this)},x}function application(s){var x=symbol(s,42);return x.led=function(left){return nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left,this.right=doFunction({type:"arrow",loneArg:left}),this},x}function relation(s,f){var x=symbol(s,100);return x.led=function(left){nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left;var right=this.right=expression(100);return isIdentifier(left,"NaN")||isIdentifier(right,"NaN")?warning("W019",this):f&&f.apply(this,[left,right]),left&&right||quit("E041",state.tokens.curr.line),"!"===left.id&&warning("W018",left,"!"),"!"===right.id&&warning("W018",right,"!"),this},x}function isPoorRelation(node){return node&&("(number)"===node.type&&0===+node.value||"(string)"===node.type&&""===node.value||"null"===node.type&&!state.option.eqnull||"true"===node.type||"false"===node.type||"undefined"===node.type)}function isTypoTypeof(left,right,state){var values;return state.option.notypeof?!1:left&&right?(values=state.inES6()?typeofValues.es6:typeofValues.es3,"(identifier)"===right.type&&"typeof"===right.value&&"(string)"===left.type?!_.contains(values,left.value):!1):!1}function isGlobalEval(left,state){var isGlobal=!1;return"this"===left.type&&null===state.funct["(context)"]?isGlobal=!0:"(identifier)"===left.type&&(state.option.node&&"global"===left.value?isGlobal=!0:!state.option.browser||"window"!==left.value&&"document"!==left.value||(isGlobal=!0)),isGlobal}function findNativePrototype(left){function walkPrototype(obj){return"object"==typeof obj?"prototype"===obj.right?obj:walkPrototype(obj.left):void 0}function walkNative(obj){for(;!obj.identifier&&"object"==typeof obj.left;)obj=obj.left;return obj.identifier&&natives.indexOf(obj.value)>=0?obj.value:void 0}var natives=["Array","ArrayBuffer","Boolean","Collator","DataView","Date","DateTimeFormat","Error","EvalError","Float32Array","Float64Array","Function","Infinity","Intl","Int16Array","Int32Array","Int8Array","Iterator","Number","NumberFormat","Object","RangeError","ReferenceError","RegExp","StopIteration","String","SyntaxError","TypeError","Uint16Array","Uint32Array","Uint8Array","Uint8ClampedArray","URIError"],prototype=walkPrototype(left);return prototype?walkNative(prototype):void 0}function checkLeftSideAssign(left,assignToken,options){var allowDestructuring=options&&options.allowDestructuring;if(assignToken=assignToken||left,state.option.freeze){var nativeObject=findNativePrototype(left);nativeObject&&warning("W121",left,nativeObject)}return left.identifier&&!left.isMetaProperty&&state.funct["(scope)"].block.reassign(left.value,left),"."===left.id?((!left.left||"arguments"===left.left.value&&!state.isStrict())&&warning("E031",assignToken),state.nameStack.set(state.tokens.prev),!0):"{"===left.id||"["===left.id?(allowDestructuring&&state.tokens.curr.left.destructAssign?state.tokens.curr.left.destructAssign.forEach(function(t){t.id&&state.funct["(scope)"].block.modify(t.id,t.token)}):"{"!==left.id&&left.left?"arguments"!==left.left.value||state.isStrict()||warning("E031",assignToken):warning("E031",assignToken),"["===left.id&&state.nameStack.set(left.right),!0):left.isMetaProperty?(error("E031",assignToken),!0):left.identifier&&!isReserved(left)?("exception"===state.funct["(scope)"].labeltype(left.value)&&warning("W022",left),state.nameStack.set(left),!0):(left===state.syntax["function"]&&warning("W023",state.tokens.curr),!1)}function assignop(s,f,p){var x=infix(s,"function"==typeof f?f:function(left,that){return that.left=left,left&&checkLeftSideAssign(left,that,{allowDestructuring:!0})?(that.right=expression(10),that):(error("E031",that),void 0)},p);return x.exps=!0,x.assign=!0,x}function bitwise(s,f,p){var x=symbol(s,p);return reserveName(x),x.led="function"==typeof f?f:function(left){return state.option.bitwise&&warning("W016",this,this.id),this.left=left,this.right=expression(p),this},x}function bitwiseassignop(s){return assignop(s,function(left,that){return state.option.bitwise&&warning("W016",that,that.id),left&&checkLeftSideAssign(left,that)?(that.right=expression(10),that):(error("E031",that),void 0)},20)}function suffix(s){var x=symbol(s,150);return x.led=function(left){return state.option.plusplus?warning("W016",this,this.id):left.identifier&&!isReserved(left)||"."===left.id||"["===left.id||warning("W017",this),left.isMetaProperty?error("E031",this):left&&left.identifier&&state.funct["(scope)"].block.modify(left.value,left),this.left=left,this},x}function optionalidentifier(fnparam,prop,preserve){if(state.tokens.next.identifier){preserve||advance();var curr=state.tokens.curr,val=state.tokens.curr.value;return isReserved(curr)?prop&&state.inES5()?val:fnparam&&"undefined"===val?val:(warning("W024",state.tokens.curr,state.tokens.curr.id),val):val}}function identifier(fnparam,prop){var i=optionalidentifier(fnparam,prop,!1);if(i)return i;if("..."===state.tokens.next.value){if(state.inES6(!0)||warning("W119",state.tokens.next,"spread/rest operator","6"),advance(),checkPunctuator(state.tokens.next,"..."))for(warning("E024",state.tokens.next,"...");checkPunctuator(state.tokens.next,"...");)advance();return state.tokens.next.identifier?identifier(fnparam,prop):(warning("E024",state.tokens.curr,"..."),void 0)}error("E030",state.tokens.next,state.tokens.next.value),";"!==state.tokens.next.id&&advance()}function reachable(controlToken){var t,i=0;if(";"===state.tokens.next.id&&!controlToken.inBracelessBlock)for(;;){do t=peek(i),i+=1;while("(end)"!==t.id&&"(comment)"===t.id);if(t.reach)return;if("(endline)"!==t.id){if("function"===t.id){state.option.latedef===!0&&warning("W026",t);break}warning("W027",t,t.value,controlToken.value);break}}}function parseFinalSemicolon(){if(";"!==state.tokens.next.id){if(state.tokens.next.isUnclosed)return advance();var sameLine=startLine(state.tokens.next)===state.tokens.curr.line&&"(end)"!==state.tokens.next.id,blockEnd=checkPunctuator(state.tokens.next,"}");sameLine&&!blockEnd?errorAt("E058",state.tokens.curr.line,state.tokens.curr.character):state.option.asi||(blockEnd&&!state.option.lastsemic||!sameLine)&&warningAt("W033",state.tokens.curr.line,state.tokens.curr.character)}else advance(";")}function statement(){var r,i=indent,t=state.tokens.next,hasOwnScope=!1;if(";"===t.id)return advance(";"),void 0;var res=isReserved(t);if(res&&t.meta&&t.meta.isFutureReservedWord&&":"===peek().id&&(warning("W024",t,t.id),res=!1),t.identifier&&!res&&":"===peek().id&&(advance(),advance(":"),hasOwnScope=!0,state.funct["(scope)"].stack(),state.funct["(scope)"].block.addBreakLabel(t.value,{token:state.tokens.curr}),state.tokens.next.labelled||"{"===state.tokens.next.value||warning("W028",state.tokens.next,t.value,state.tokens.next.value),state.tokens.next.label=t.value,t=state.tokens.next),"{"===t.id){var iscase="case"===state.funct["(verb)"]&&":"===state.tokens.curr.value;return block(!0,!0,!1,!1,iscase),void 0}return r=expression(0,!0),!r||r.identifier&&"function"===r.value||"(punctuator)"===r.type&&r.left&&r.left.identifier&&"function"===r.left.value||state.isStrict()||"global"!==state.option.strict||warning("E007"),t.block||(state.option.expr||r&&r.exps?state.option.nonew&&r&&r.left&&"("===r.id&&"new"===r.left.id&&warning("W031",t):warning("W030",state.tokens.curr),parseFinalSemicolon()),indent=i,hasOwnScope&&state.funct["(scope)"].unstack(),r}function statements(){for(var p,a=[];!state.tokens.next.reach&&"(end)"!==state.tokens.next.id;)";"===state.tokens.next.id?(p=peek(),(!p||"("!==p.id&&"["!==p.id)&&warning("W032"),advance(";")):a.push(statement());return a}function directives(){for(var i,p,pn;"(string)"===state.tokens.next.id;){if(p=peek(0),"(endline)"===p.id){i=1;do pn=peek(i++);while("(endline)"===pn.id);if(";"===pn.id)p=pn;else{if("["===pn.value||"."===pn.value)break;state.option.asi&&"("!==pn.value||warning("W033",state.tokens.next)}}else{if("."===p.id||"["===p.id)break;";"!==p.id&&warning("W033",p)}advance();var directive=state.tokens.curr.value;(state.directive[directive]||"use strict"===directive&&"implied"===state.option.strict)&&warning("W034",state.tokens.curr,directive),state.directive[directive]=!0,";"===p.id&&advance(";")}state.isStrict()&&(state.option["(explicitNewcap)"]||(state.option.newcap=!0),state.option.undef=!0)}function block(ordinary,stmt,isfunc,isfatarrow,iscase){var a,m,t,line,d,b=inblock,old_indent=indent;inblock=ordinary,t=state.tokens.next;var metrics=state.funct["(metrics)"];if(metrics.nestedBlockDepth+=1,metrics.verifyMaxNestedBlockDepthPerFunction(),"{"===state.tokens.next.id){if(advance("{"),state.funct["(scope)"].stack(),line=state.tokens.curr.line,"}"!==state.tokens.next.id){for(indent+=state.option.indent;!ordinary&&state.tokens.next.from>indent;)indent+=state.option.indent;if(isfunc){m={};for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);directives(),state.option.strict&&state.funct["(context)"]["(global)"]&&(m["use strict"]||state.isStrict()||warning("E007"))}a=statements(),metrics.statementCount+=a.length,indent-=state.option.indent}advance("}",t),isfunc&&(state.funct["(scope)"].validateParams(),m&&(state.directive=m)),state.funct["(scope)"].unstack(),indent=old_indent}else if(ordinary)state.funct["(noblockscopedvar)"]="for"!==state.tokens.next.id,state.funct["(scope)"].stack(),(!stmt||state.option.curly)&&warning("W116",state.tokens.next,"{",state.tokens.next.value),state.tokens.next.inBracelessBlock=!0,indent+=state.option.indent,a=[statement()],indent-=state.option.indent,state.funct["(scope)"].unstack(),delete state.funct["(noblockscopedvar)"];else if(isfunc){if(state.funct["(scope)"].stack(),m={},!stmt||isfatarrow||state.inMoz()||error("W118",state.tokens.curr,"function closure expressions"),!stmt)for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);expression(10),state.option.strict&&state.funct["(context)"]["(global)"]&&(m["use strict"]||state.isStrict()||warning("E007")),state.funct["(scope)"].unstack()}else error("E021",state.tokens.next,"{",state.tokens.next.value);switch(state.funct["(verb)"]){case"break":case"continue":case"return":case"throw":if(iscase)break;default:state.funct["(verb)"]=null}return inblock=b,!ordinary||!state.option.noempty||a&&0!==a.length||warning("W035",state.tokens.prev),metrics.nestedBlockDepth-=1,a}function countMember(m){membersOnly&&"boolean"!=typeof membersOnly[m]&&warning("W036",state.tokens.curr,m),"number"==typeof member[m]?member[m]+=1:member[m]=1}function comprehensiveArrayExpression(){var res={};res.exps=!0,state.funct["(comparray)"].stack();var reversed=!1;return"for"!==state.tokens.next.value&&(reversed=!0,state.inMoz()||warning("W116",state.tokens.next,"for",state.tokens.next.value),state.funct["(comparray)"].setState("use"),res.right=expression(10)),advance("for"),"each"===state.tokens.next.value&&(advance("each"),state.inMoz()||warning("W118",state.tokens.curr,"for each")),advance("("),state.funct["(comparray)"].setState("define"),res.left=expression(130),_.contains(["in","of"],state.tokens.next.value)?advance():error("E045",state.tokens.curr),state.funct["(comparray)"].setState("generate"),expression(10),advance(")"),"if"===state.tokens.next.value&&(advance("if"),advance("("),state.funct["(comparray)"].setState("filter"),res.filter=expression(10),advance(")")),reversed||(state.funct["(comparray)"].setState("use"),res.right=expression(10)),advance("]"),state.funct["(comparray)"].unstack(),res}function isMethod(){return state.funct["(statement)"]&&"class"===state.funct["(statement)"].type||state.funct["(context)"]&&"class"===state.funct["(context)"]["(verb)"]}function isPropertyName(token){return token.identifier||"(string)"===token.id||"(number)"===token.id}function propertyName(preserveOrToken){var id,preserve=!0;return"object"==typeof preserveOrToken?id=preserveOrToken:(preserve=preserveOrToken,id=optionalidentifier(!1,!0,preserve)),id?"object"==typeof id&&("(string)"===id.id||"(identifier)"===id.id?id=id.value:"(number)"===id.id&&(id=""+id.value)):"(string)"===state.tokens.next.id?(id=state.tokens.next.value,preserve||advance()):"(number)"===state.tokens.next.id&&(id=""+state.tokens.next.value,preserve||advance()),"hasOwnProperty"===id&&warning("W001"),id}function functionparams(options){function addParam(addParamArgs){state.funct["(scope)"].addParam.apply(state.funct["(scope)"],addParamArgs)}var next,ident,t,paramsIds=[],tokens=[],pastDefault=!1,pastRest=!1,arity=0,loneArg=options&&options.loneArg;if(loneArg&&loneArg.identifier===!0)return state.funct["(scope)"].addParam(loneArg.value,loneArg),{arity:1,params:[loneArg.value]};if(next=state.tokens.next,options&&options.parsedOpening||advance("("),")"===state.tokens.next.id)return advance(")"),void 0;for(;;){arity++;var currentParams=[];if(_.contains(["{","["],state.tokens.next.id)){tokens=destructuringPattern();for(t in tokens)t=tokens[t],t.id&&(paramsIds.push(t.id),currentParams.push([t.id,t.token]))}else if(checkPunctuator(state.tokens.next,"...")&&(pastRest=!0),ident=identifier(!0))paramsIds.push(ident),currentParams.push([ident,state.tokens.curr]);else for(;!checkPunctuators(state.tokens.next,[",",")"]);)advance();if(pastDefault&&"="!==state.tokens.next.id&&error("W138",state.tokens.current),"="===state.tokens.next.id&&(state.inES6()||warning("W119",state.tokens.next,"default parameters","6"),advance("="),pastDefault=!0,expression(10)),currentParams.forEach(addParam),","!==state.tokens.next.id)return advance(")",next),{arity:arity,params:paramsIds};pastRest&&warning("W131",state.tokens.next),comma()}}function functor(name,token,overwrites){var funct={"(name)":name,"(breakage)":0,"(loopage)":0,"(tokens)":{},"(properties)":{},"(catch)":!1,"(global)":!1,"(line)":null,"(character)":null,"(metrics)":null,"(statement)":null,"(context)":null,"(scope)":null,"(comparray)":null,"(generator)":null,"(arrow)":null,"(params)":null};return token&&_.extend(funct,{"(line)":token.line,"(character)":token.character,"(metrics)":createMetrics(token)}),_.extend(funct,overwrites),funct["(context)"]&&(funct["(scope)"]=funct["(context)"]["(scope)"],funct["(comparray)"]=funct["(context)"]["(comparray)"]),funct}function isFunctor(token){return"(scope)"in token}function hasParsedCode(funct){return funct["(global)"]&&!funct["(verb)"]}function doTemplateLiteral(left){function end(){if(state.tokens.curr.template&&state.tokens.curr.tail&&state.tokens.curr.context===ctx)return!0;var complete=state.tokens.next.template&&state.tokens.next.tail&&state.tokens.next.context===ctx;return complete&&advance(),complete||state.tokens.next.isUnclosed}var ctx=this.context,noSubst=this.noSubst,depth=this.depth;if(!noSubst)for(;!end();)!state.tokens.next.template||state.tokens.next.depth>depth?expression(0):advance();return{id:"(template)",type:"(template)",tag:left}}function doFunction(options){var f,token,name,statement,classExprBinding,isGenerator,isArrow,ignoreLoopFunc,oldOption=state.option,oldIgnored=state.ignored;options&&(name=options.name,statement=options.statement,classExprBinding=options.classExprBinding,isGenerator="generator"===options.type,isArrow="arrow"===options.type,ignoreLoopFunc=options.ignoreLoopFunc),state.option=Object.create(state.option),state.ignored=Object.create(state.ignored),state.funct=functor(name||state.nameStack.infer(),state.tokens.next,{"(statement)":statement,"(context)":state.funct,"(arrow)":isArrow,"(generator)":isGenerator}),f=state.funct,token=state.tokens.curr,token.funct=state.funct,functions.push(state.funct),state.funct["(scope)"].stack("functionouter");var internallyAccessibleName=name||classExprBinding;internallyAccessibleName&&state.funct["(scope)"].block.add(internallyAccessibleName,classExprBinding?"class":"function",state.tokens.curr,!1),state.funct["(scope)"].stack("functionparams");var paramsInfo=functionparams(options);return paramsInfo?(state.funct["(params)"]=paramsInfo.params,state.funct["(metrics)"].arity=paramsInfo.arity,state.funct["(metrics)"].verifyMaxParametersPerFunction()):state.funct["(metrics)"].arity=0,isArrow&&(state.inES6(!0)||warning("W119",state.tokens.curr,"arrow function syntax (=>)","6"),options.loneArg||advance("=>")),block(!1,!0,!0,isArrow),!state.option.noyield&&isGenerator&&"yielded"!==state.funct["(generator)"]&&warning("W124",state.tokens.curr),state.funct["(metrics)"].verifyMaxStatementsPerFunction(),state.funct["(metrics)"].verifyMaxComplexityPerFunction(),state.funct["(unusedOption)"]=state.option.unused,state.option=oldOption,state.ignored=oldIgnored,state.funct["(last)"]=state.tokens.curr.line,state.funct["(lastcharacter)"]=state.tokens.curr.character,state.funct["(scope)"].unstack(),state.funct["(scope)"].unstack(),state.funct=state.funct["(context)"],ignoreLoopFunc||state.option.loopfunc||!state.funct["(loopage)"]||f["(isCapturing)"]&&warning("W083",token),f}function createMetrics(functionStartToken){return{statementCount:0,nestedBlockDepth:-1,ComplexityCount:1,arity:0,verifyMaxStatementsPerFunction:function(){state.option.maxstatements&&this.statementCount>state.option.maxstatements&&warning("W071",functionStartToken,this.statementCount)\n},verifyMaxParametersPerFunction:function(){_.isNumber(state.option.maxparams)&&this.arity>state.option.maxparams&&warning("W072",functionStartToken,this.arity)},verifyMaxNestedBlockDepthPerFunction:function(){state.option.maxdepth&&this.nestedBlockDepth>0&&this.nestedBlockDepth===state.option.maxdepth+1&&warning("W073",null,this.nestedBlockDepth)},verifyMaxComplexityPerFunction:function(){var max=state.option.maxcomplexity,cc=this.ComplexityCount;max&&cc>max&&warning("W074",functionStartToken,cc)}}}function increaseComplexityCount(){state.funct["(metrics)"].ComplexityCount+=1}function checkCondAssignment(expr){var id,paren;switch(expr&&(id=expr.id,paren=expr.paren,","===id&&(expr=expr.exprs[expr.exprs.length-1])&&(id=expr.id,paren=paren||expr.paren)),id){case"=":case"+=":case"-=":case"*=":case"%=":case"&=":case"|=":case"^=":case"/=":paren||state.option.boss||warning("W084")}}function checkProperties(props){if(state.inES5())for(var name in props)props[name]&&props[name].setterToken&&!props[name].getterToken&&warning("W078",props[name].setterToken)}function metaProperty(name,c){if(checkPunctuator(state.tokens.next,".")){var left=state.tokens.curr.id;advance(".");var id=identifier();return state.tokens.curr.isMetaProperty=!0,name!==id?error("E057",state.tokens.prev,left,id):c(),state.tokens.curr}}function destructuringPattern(options){var isAssignment=options&&options.assignment;return state.inES6()||warning("W104",state.tokens.curr,isAssignment?"destructuring assignment":"destructuring binding","6"),destructuringPatternRecursive(options)}function destructuringPatternRecursive(options){var ids,identifiers=[],openingParsed=options&&options.openingParsed,isAssignment=options&&options.assignment,recursiveOptions=isAssignment?{assignment:isAssignment}:null,firstToken=openingParsed?state.tokens.curr:state.tokens.next,nextInnerDE=function(){var ident;if(checkPunctuators(state.tokens.next,["[","{"])){ids=destructuringPatternRecursive(recursiveOptions);for(var id in ids)id=ids[id],identifiers.push({id:id.id,token:id.token})}else if(checkPunctuator(state.tokens.next,","))identifiers.push({id:null,token:state.tokens.curr});else{if(!checkPunctuator(state.tokens.next,"(")){var is_rest=checkPunctuator(state.tokens.next,"...");if(isAssignment){var identifierToken=is_rest?peek(0):state.tokens.next;identifierToken.identifier||warning("E030",identifierToken,identifierToken.value);var assignTarget=expression(155);assignTarget&&(checkLeftSideAssign(assignTarget),assignTarget.identifier&&(ident=assignTarget.value))}else ident=identifier();return ident&&identifiers.push({id:ident,token:state.tokens.curr}),is_rest}advance("("),nextInnerDE(),advance(")")}return!1},assignmentProperty=function(){var id;checkPunctuator(state.tokens.next,"[")?(advance("["),expression(10),advance("]"),advance(":"),nextInnerDE()):"(string)"===state.tokens.next.id||"(number)"===state.tokens.next.id?(advance(),advance(":"),nextInnerDE()):(id=identifier(),checkPunctuator(state.tokens.next,":")?(advance(":"),nextInnerDE()):id&&(isAssignment&&checkLeftSideAssign(state.tokens.curr),identifiers.push({id:id,token:state.tokens.curr})))};if(checkPunctuator(firstToken,"[")){openingParsed||advance("["),checkPunctuator(state.tokens.next,"]")&&warning("W137",state.tokens.curr);for(var element_after_rest=!1;!checkPunctuator(state.tokens.next,"]");)nextInnerDE()&&!element_after_rest&&checkPunctuator(state.tokens.next,",")&&(warning("W130",state.tokens.next),element_after_rest=!0),checkPunctuator(state.tokens.next,"=")&&(checkPunctuator(state.tokens.prev,"...")?advance("]"):advance("="),"undefined"===state.tokens.next.id&&warning("W080",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,"]")||advance(",");advance("]")}else if(checkPunctuator(firstToken,"{")){for(openingParsed||advance("{"),checkPunctuator(state.tokens.next,"}")&&warning("W137",state.tokens.curr);!checkPunctuator(state.tokens.next,"}")&&(assignmentProperty(),checkPunctuator(state.tokens.next,"=")&&(advance("="),"undefined"===state.tokens.next.id&&warning("W080",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,"}")||(advance(","),!checkPunctuator(state.tokens.next,"}"))););advance("}")}return identifiers}function destructuringPatternMatch(tokens,value){var first=value.first;first&&_.zip(tokens,Array.isArray(first)?first:[first]).forEach(function(val){var token=val[0],value=val[1];token&&value?token.first=value:token&&token.first&&!value&&warning("W080",token.first,token.first.value)})}function blockVariableStatement(type,statement,context){var tokens,lone,value,letblock,prefix=context&&context.prefix,inexport=context&&context.inexport,isLet="let"===type,isConst="const"===type;for(state.inES6()||warning("W104",state.tokens.curr,type,"6"),isLet&&"("===state.tokens.next.value?(state.inMoz()||warning("W118",state.tokens.next,"let block"),advance("("),state.funct["(scope)"].stack(),letblock=!0):state.funct["(noblockscopedvar)"]&&error("E048",state.tokens.curr,isConst?"Const":"Let"),statement.first=[];;){var names=[];_.contains(["{","["],state.tokens.next.value)?(tokens=destructuringPattern(),lone=!1):(tokens=[{id:identifier(),token:state.tokens.curr}],lone=!0),!prefix&&isConst&&"="!==state.tokens.next.id&&warning("E012",state.tokens.curr,state.tokens.curr.value);for(var t in tokens)tokens.hasOwnProperty(t)&&(t=tokens[t],state.funct["(scope)"].block.isGlobal()&&predefined[t.id]===!1&&warning("W079",t.token,t.id),t.id&&!state.funct["(noblockscopedvar)"]&&(state.funct["(scope)"].addlabel(t.id,{type:type,token:t.token}),names.push(t.token),lone&&inexport&&state.funct["(scope)"].setExported(t.token.value,t.token)));if("="===state.tokens.next.id&&(advance("="),prefix||"undefined"!==state.tokens.next.id||warning("W080",state.tokens.prev,state.tokens.prev.value),!prefix&&"="===peek(0).id&&state.tokens.next.identifier&&warning("W120",state.tokens.next,state.tokens.next.value),value=expression(prefix?120:10),lone?tokens[0].first=value:destructuringPatternMatch(names,value)),statement.first=statement.first.concat(names),","!==state.tokens.next.id)break;comma()}return letblock&&(advance(")"),block(!0,!0),statement.block=!0,state.funct["(scope)"].unstack()),statement}function classdef(isStatement){return state.inES6()||warning("W104",state.tokens.curr,"class","6"),isStatement?(this.name=identifier(),state.funct["(scope)"].addlabel(this.name,{type:"class",token:state.tokens.curr})):state.tokens.next.identifier&&"extends"!==state.tokens.next.value?(this.name=identifier(),this.namedExpr=!0):this.name=state.nameStack.infer(),classtail(this),this}function classtail(c){var wasInClassBody=state.inClassBody;"extends"===state.tokens.next.value&&(advance("extends"),c.heritage=expression(10)),state.inClassBody=!0,advance("{"),c.body=classbody(c),advance("}"),state.inClassBody=wasInClassBody}function classbody(c){for(var name,isStatic,isGenerator,getset,computed,props=Object.create(null),staticProps=Object.create(null),i=0;"}"!==state.tokens.next.id;++i)if(name=state.tokens.next,isStatic=!1,isGenerator=!1,getset=null,";"!==name.id){if("*"===name.id&&(isGenerator=!0,advance("*"),name=state.tokens.next),"["===name.id)name=computedPropertyName(),computed=!0;else{if(!isPropertyName(name)){warning("W052",state.tokens.next,state.tokens.next.value||state.tokens.next.type),advance();continue}advance(),computed=!1,name.identifier&&"static"===name.value&&(checkPunctuator(state.tokens.next,"*")&&(isGenerator=!0,advance("*")),(isPropertyName(state.tokens.next)||"["===state.tokens.next.id)&&(computed="["===state.tokens.next.id,isStatic=!0,name=state.tokens.next,"["===state.tokens.next.id?name=computedPropertyName():advance())),!name.identifier||"get"!==name.value&&"set"!==name.value||(isPropertyName(state.tokens.next)||"["===state.tokens.next.id)&&(computed="["===state.tokens.next.id,getset=name,name=state.tokens.next,"["===state.tokens.next.id?name=computedPropertyName():advance())}if(!checkPunctuator(state.tokens.next,"(")){for(error("E054",state.tokens.next,state.tokens.next.value);"}"!==state.tokens.next.id&&!checkPunctuator(state.tokens.next,"(");)advance();"("!==state.tokens.next.value&&doFunction({statement:c})}if(computed||(getset?saveAccessor(getset.value,isStatic?staticProps:props,name.value,name,!0,isStatic):("constructor"===name.value?state.nameStack.set(c):state.nameStack.set(name),saveProperty(isStatic?staticProps:props,name.value,name,!0,isStatic))),getset&&"constructor"===name.value){var propDesc="get"===getset.value?"class getter method":"class setter method";error("E049",name,propDesc,"constructor")}else"prototype"===name.value&&error("E049",name,"class method","prototype");propertyName(name),doFunction({statement:c,type:isGenerator?"generator":null,classExprBinding:c.namedExpr?c.name:null})}else warning("W032"),advance(";");checkProperties(props)}function saveProperty(props,name,tkn,isClass,isStatic){var msg=["key","class method","static class method"];msg=msg[(isClass||!1)+(isStatic||!1)],tkn.identifier&&(name=tkn.value),props[name]&&"__proto__"!==name?warning("W075",state.tokens.next,msg,name):props[name]=Object.create(null),props[name].basic=!0,props[name].basictkn=tkn}function saveAccessor(accessorType,props,name,tkn,isClass,isStatic){var flagName="get"===accessorType?"getterToken":"setterToken",msg="";isClass?(isStatic&&(msg+="static "),msg+=accessorType+"ter method"):msg="key",state.tokens.curr.accessorType=accessorType,state.nameStack.set(tkn),props[name]?(props[name].basic||props[name][flagName])&&"__proto__"!==name&&warning("W075",state.tokens.next,msg,name):props[name]=Object.create(null),props[name][flagName]=tkn}function computedPropertyName(){advance("["),state.inES6()||warning("W119",state.tokens.curr,"computed property names","6");var value=expression(10);return advance("]"),value}function checkPunctuators(token,values){return"(punctuator)"===token.type?_.contains(values,token.value):!1}function checkPunctuator(token,value){return"(punctuator)"===token.type&&token.value===value}function destructuringAssignOrJsonValue(){var block=lookupBlockType();block.notJson?(!state.inES6()&&block.isDestAssign&&warning("W104",state.tokens.curr,"destructuring assignment","6"),statements()):(state.option.laxbreak=!0,state.jsonMode=!0,jsonValue())}function jsonValue(){function jsonObject(){var o={},t=state.tokens.next;if(advance("{"),"}"!==state.tokens.next.id)for(;;){if("(end)"===state.tokens.next.id)error("E026",state.tokens.next,t.line);else{if("}"===state.tokens.next.id){warning("W094",state.tokens.curr);break}","===state.tokens.next.id?error("E028",state.tokens.next):"(string)"!==state.tokens.next.id&&warning("W095",state.tokens.next,state.tokens.next.value)}if(o[state.tokens.next.value]===!0?warning("W075",state.tokens.next,"key",state.tokens.next.value):"__proto__"===state.tokens.next.value&&!state.option.proto||"__iterator__"===state.tokens.next.value&&!state.option.iterator?warning("W096",state.tokens.next,state.tokens.next.value):o[state.tokens.next.value]=!0,advance(),advance(":"),jsonValue(),","!==state.tokens.next.id)break;advance(",")}advance("}")}function jsonArray(){var t=state.tokens.next;if(advance("["),"]"!==state.tokens.next.id)for(;;){if("(end)"===state.tokens.next.id)error("E027",state.tokens.next,t.line);else{if("]"===state.tokens.next.id){warning("W094",state.tokens.curr);break}","===state.tokens.next.id&&error("E028",state.tokens.next)}if(jsonValue(),","!==state.tokens.next.id)break;advance(",")}advance("]")}switch(state.tokens.next.id){case"{":jsonObject();break;case"[":jsonArray();break;case"true":case"false":case"null":case"(number)":case"(string)":advance();break;case"-":advance("-"),advance("(number)");break;default:error("E003",state.tokens.next)}}var api,declared,functions,inblock,indent,lookahead,lex,member,membersOnly,predefined,stack,urls,bang={"<":!0,"<=":!0,"==":!0,"===":!0,"!==":!0,"!=":!0,">":!0,">=":!0,"+":!0,"-":!0,"*":!0,"/":!0,"%":!0},functionicity=["closure","exception","global","label","outer","unused","var"],extraModules=[],emitter=new events.EventEmitter,typeofValues={};typeofValues.legacy=["xml","unknown"],typeofValues.es3=["undefined","boolean","number","string","function","object"],typeofValues.es3=typeofValues.es3.concat(typeofValues.legacy),typeofValues.es6=typeofValues.es3.concat("symbol"),type("(number)",function(){return this}),type("(string)",function(){return this}),state.syntax["(identifier)"]={type:"(identifier)",lbp:0,identifier:!0,nud:function(){var v=this.value;return"=>"===state.tokens.next.id?this:(state.funct["(comparray)"].check(v)||state.funct["(scope)"].block.use(v,state.tokens.curr),this)},led:function(){error("E033",state.tokens.next,state.tokens.next.value)}};var baseTemplateSyntax={lbp:0,identifier:!1,template:!0};state.syntax["(template)"]=_.extend({type:"(template)",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!1},baseTemplateSyntax),state.syntax["(template middle)"]=_.extend({type:"(template middle)",middle:!0,noSubst:!1},baseTemplateSyntax),state.syntax["(template tail)"]=_.extend({type:"(template tail)",tail:!0,noSubst:!1},baseTemplateSyntax),state.syntax["(no subst template)"]=_.extend({type:"(template)",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!0,tail:!0},baseTemplateSyntax),type("(regexp)",function(){return this}),delim("(endline)"),delim("(begin)"),delim("(end)").reach=!0,delim("(error)").reach=!0,delim("}").reach=!0,delim(")"),delim("]"),delim(\'"\').reach=!0,delim("\'").reach=!0,delim(";"),delim(":").reach=!0,delim("#"),reserve("else"),reserve("case").reach=!0,reserve("catch"),reserve("default").reach=!0,reserve("finally"),reservevar("arguments",function(x){state.isStrict()&&state.funct["(global)"]&&warning("E008",x)}),reservevar("eval"),reservevar("false"),reservevar("Infinity"),reservevar("null"),reservevar("this",function(x){state.isStrict()&&!isMethod()&&!state.option.validthis&&(state.funct["(statement)"]&&state.funct["(name)"].charAt(0)>"Z"||state.funct["(global)"])&&warning("W040",x)}),reservevar("true"),reservevar("undefined"),assignop("=","assign",20),assignop("+=","assignadd",20),assignop("-=","assignsub",20),assignop("*=","assignmult",20),assignop("/=","assigndiv",20).nud=function(){error("E014")},assignop("%=","assignmod",20),bitwiseassignop("&="),bitwiseassignop("|="),bitwiseassignop("^="),bitwiseassignop("<<="),bitwiseassignop(">>="),bitwiseassignop(">>>="),infix(",",function(left,that){var expr;if(that.exprs=[left],state.option.nocomma&&warning("W127"),!comma({peek:!0}))return that;for(;;){if(!(expr=expression(10)))break;if(that.exprs.push(expr),","!==state.tokens.next.value||!comma())break}return that},10,!0),infix("?",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(10),advance(":"),that["else"]=expression(10),that},30);var orPrecendence=40;infix("||",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(orPrecendence),that},orPrecendence),infix("&&","and",50),bitwise("|","bitor",70),bitwise("^","bitxor",80),bitwise("&","bitand",90),relation("==",function(left,right){var eqnull=state.option.eqnull&&("null"===(left&&left.value)||"null"===(right&&right.value));switch(!0){case!eqnull&&state.option.eqeqeq:this.from=this.character,warning("W116",this,"===","==");break;case isPoorRelation(left):warning("W041",this,"===",left.value);break;case isPoorRelation(right):warning("W041",this,"===",right.value);break;case isTypoTypeof(right,left,state):warning("W122",this,right.value);break;case isTypoTypeof(left,right,state):warning("W122",this,left.value)}return this}),relation("===",function(left,right){return isTypoTypeof(right,left,state)?warning("W122",this,right.value):isTypoTypeof(left,right,state)&&warning("W122",this,left.value),this}),relation("!=",function(left,right){var eqnull=state.option.eqnull&&("null"===(left&&left.value)||"null"===(right&&right.value));return!eqnull&&state.option.eqeqeq?(this.from=this.character,warning("W116",this,"!==","!=")):isPoorRelation(left)?warning("W041",this,"!==",left.value):isPoorRelation(right)?warning("W041",this,"!==",right.value):isTypoTypeof(right,left,state)?warning("W122",this,right.value):isTypoTypeof(left,right,state)&&warning("W122",this,left.value),this}),relation("!==",function(left,right){return isTypoTypeof(right,left,state)?warning("W122",this,right.value):isTypoTypeof(left,right,state)&&warning("W122",this,left.value),this}),relation("<"),relation(">"),relation("<="),relation(">="),bitwise("<<","shiftleft",120),bitwise(">>","shiftright",120),bitwise(">>>","shiftrightunsigned",120),infix("in","in",120),infix("instanceof","instanceof",120),infix("+",function(left,that){var right;return that.left=left,that.right=right=expression(130),left&&right&&"(string)"===left.id&&"(string)"===right.id?(left.value+=right.value,left.character=right.character,!state.option.scripturl&®.javascriptURL.test(left.value)&&warning("W050",left),left):that},130),prefix("+","num"),prefix("+++",function(){return warning("W007"),this.arity="unary",this.right=expression(150),this}),infix("+++",function(left){return warning("W007"),this.left=left,this.right=expression(130),this},130),infix("-","sub",130),prefix("-","neg"),prefix("---",function(){return warning("W006"),this.arity="unary",this.right=expression(150),this}),infix("---",function(left){return warning("W006"),this.left=left,this.right=expression(130),this},130),infix("*","mult",140),infix("/","div",140),infix("%","mod",140),suffix("++"),prefix("++","preinc"),state.syntax["++"].exps=!0,suffix("--"),prefix("--","predec"),state.syntax["--"].exps=!0,prefix("delete",function(){var p=expression(10);return p?("."!==p.id&&"["!==p.id&&warning("W051"),this.first=p,p.identifier&&!state.isStrict()&&(p.forgiveUndef=!0),this):this}).exps=!0,prefix("~",function(){return state.option.bitwise&&warning("W016",this,"~"),this.arity="unary",this.right=expression(150),this}),prefix("...",function(){return state.inES6(!0)||warning("W119",this,"spread/rest operator","6"),state.tokens.next.identifier||"(string)"===state.tokens.next.type||checkPunctuators(state.tokens.next,["[","("])||error("E030",state.tokens.next,state.tokens.next.value),expression(150),this}),prefix("!",function(){return this.arity="unary",this.right=expression(150),this.right||quit("E041",this.line||0),bang[this.right.id]===!0&&warning("W018",this,"!"),this}),prefix("typeof",function(){var p=expression(150);return this.first=this.right=p,p||quit("E041",this.line||0,this.character||0),p.identifier&&(p.forgiveUndef=!0),this}),prefix("new",function(){var mp=metaProperty("target",function(){state.inES6(!0)||warning("W119",state.tokens.prev,"new.target","6");for(var inFunction,c=state.funct;c&&(inFunction=!c["(global)"],c["(arrow)"]);)c=c["(context)"];inFunction||warning("W136",state.tokens.prev,"new.target")});if(mp)return mp;var i,c=expression(155);if(c&&"function"!==c.id)if(c.identifier)switch(c["new"]=!0,c.value){case"Number":case"String":case"Boolean":case"Math":case"JSON":warning("W053",state.tokens.prev,c.value);break;case"Symbol":state.inES6()&&warning("W053",state.tokens.prev,c.value);break;case"Function":state.option.evil||warning("W054");break;case"Date":case"RegExp":case"this":break;default:"function"!==c.id&&(i=c.value.substr(0,1),state.option.newcap&&("A">i||i>"Z")&&!state.funct["(scope)"].isPredefined(c.value)&&warning("W055",state.tokens.curr))}else"."!==c.id&&"["!==c.id&&"("!==c.id&&warning("W056",state.tokens.curr);else state.option.supernew||warning("W057",this);return"("===state.tokens.next.id||state.option.supernew||warning("W058",state.tokens.curr,state.tokens.curr.value),this.first=this.right=c,this}),state.syntax["new"].exps=!0,prefix("void").exps=!0,infix(".",function(left,that){var m=identifier(!1,!0);return"string"==typeof m&&countMember(m),that.left=left,that.right=m,m&&"hasOwnProperty"===m&&"="===state.tokens.next.value&&warning("W001"),!left||"arguments"!==left.value||"callee"!==m&&"caller"!==m?state.option.evil||!left||"document"!==left.value||"write"!==m&&"writeln"!==m||warning("W060",left):state.option.noarg?warning("W059",left,m):state.isStrict()&&error("E008"),state.option.evil||"eval"!==m&&"execScript"!==m||isGlobalEval(left,state)&&warning("W061"),that},160,!0),infix("(",function(left,that){state.option.immed&&left&&!left.immed&&"function"===left.id&&warning("W062");var n=0,p=[];if(left&&"(identifier)"===left.type&&left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&-1==="Array Number String Boolean Date Object Error Symbol".indexOf(left.value)&&("Math"===left.value?warning("W063",left):state.option.newcap&&warning("W064",left)),")"!==state.tokens.next.id)for(;p[p.length]=expression(10),n+=1,","===state.tokens.next.id;)comma();return advance(")"),"object"==typeof left&&(state.inES5()||"parseInt"!==left.value||1!==n||warning("W065",state.tokens.curr),state.option.evil||("eval"===left.value||"Function"===left.value||"execScript"===left.value?(warning("W061",left),p[0]&&"(string)"===[0].id&&addInternalSrc(left,p[0].value)):!p[0]||"(string)"!==p[0].id||"setTimeout"!==left.value&&"setInterval"!==left.value?!p[0]||"(string)"!==p[0].id||"."!==left.value||"window"!==left.left.value||"setTimeout"!==left.right&&"setInterval"!==left.right||(warning("W066",left),addInternalSrc(left,p[0].value)):(warning("W066",left),addInternalSrc(left,p[0].value))),left.identifier||"."===left.id||"["===left.id||"=>"===left.id||"("===left.id||"&&"===left.id||"||"===left.id||"?"===left.id||state.inES6()&&left["(name)"]||warning("W067",that)),that.left=left,that},155,!0).exps=!0,prefix("(",function(){var pn1,ret,triggerFnExpr,first,last,pn=state.tokens.next,i=-1,parens=1,opening=state.tokens.curr,preceeding=state.tokens.prev,isNecessary=!state.option.singleGroups;do"("===pn.value?parens+=1:")"===pn.value&&(parens-=1),i+=1,pn1=pn,pn=peek(i);while((0!==parens||")"!==pn1.value)&&";"!==pn.value&&"(end)"!==pn.type);if("function"===state.tokens.next.id&&(triggerFnExpr=state.tokens.next.immed=!0),"=>"===pn.value)return doFunction({type:"arrow",parsedOpening:!0});var exprs=[];if(")"!==state.tokens.next.id)for(;exprs.push(expression(10)),","===state.tokens.next.id;)state.option.nocomma&&warning("W127"),comma();return advance(")",this),state.option.immed&&exprs[0]&&"function"===exprs[0].id&&"("!==state.tokens.next.id&&"."!==state.tokens.next.id&&"["!==state.tokens.next.id&&warning("W068",this),exprs.length?(exprs.length>1?(ret=Object.create(state.syntax[","]),ret.exprs=exprs,first=exprs[0],last=exprs[exprs.length-1],isNecessary||(isNecessary=preceeding.assign||preceeding.delim)):(ret=first=last=exprs[0],isNecessary||(isNecessary=opening.beginsStmt&&("{"===ret.id||triggerFnExpr||isFunctor(ret))||triggerFnExpr&&(!isEndOfExpr()||"}"!==state.tokens.prev.id)||isFunctor(ret)&&!isEndOfExpr()||"{"===ret.id&&"=>"===preceeding.id||"(number)"===ret.type&&checkPunctuator(pn,".")&&/^\\d+$/.test(ret.value))),ret&&(!isNecessary&&(first.left||first.right||ret.exprs)&&(isNecessary=!isBeginOfExpr(preceeding)&&first.lbp<=preceeding.lbp||!isEndOfExpr()&&last.lbp"),infix("[",function(left,that){var s,e=expression(10);return e&&"(string)"===e.type&&(state.option.evil||"eval"!==e.value&&"execScript"!==e.value||isGlobalEval(left,state)&&warning("W061"),countMember(e.value),!state.option.sub&®.identifier.test(e.value)&&(s=state.syntax[e.value],s&&isReserved(s)||warning("W069",state.tokens.prev,e.value))),advance("]",that),e&&"hasOwnProperty"===e.value&&"="===state.tokens.next.value&&warning("W001"),that.left=left,that.right=e,that},160,!0),prefix("[",function(){var blocktype=lookupBlockType();if(blocktype.isCompArray)return state.option.esnext||state.inMoz()||warning("W118",state.tokens.curr,"array comprehension"),comprehensiveArrayExpression();if(blocktype.isDestAssign)return this.destructAssign=destructuringPattern({openingParsed:!0,assignment:!0}),this;var b=state.tokens.curr.line!==startLine(state.tokens.next);for(this.first=[],b&&(indent+=state.option.indent,state.tokens.next.from===indent+state.option.indent&&(indent+=state.option.indent));"(end)"!==state.tokens.next.id;){for(;","===state.tokens.next.id;){if(!state.option.elision){if(state.inES5()){warning("W128");do advance(",");while(","===state.tokens.next.id);continue}warning("W070")}advance(",")}if("]"===state.tokens.next.id)break;if(this.first.push(expression(10)),","!==state.tokens.next.id)break;if(comma({allowTrailing:!0}),"]"===state.tokens.next.id&&!state.inES5()){warning("W070",state.tokens.curr);break}}return b&&(indent-=state.option.indent),advance("]",this),this}),function(x){x.nud=function(){var b,f,i,p,t,nextVal,isGeneratorMethod=!1,props=Object.create(null);b=state.tokens.curr.line!==startLine(state.tokens.next),b&&(indent+=state.option.indent,state.tokens.next.from===indent+state.option.indent&&(indent+=state.option.indent));var blocktype=lookupBlockType();if(blocktype.isDestAssign)return this.destructAssign=destructuringPattern({openingParsed:!0,assignment:!0}),this;for(;"}"!==state.tokens.next.id;){if(nextVal=state.tokens.next.value,!state.tokens.next.identifier||","!==peekIgnoreEOL().id&&"}"!==peekIgnoreEOL().id)if(":"===peek().id||"get"!==nextVal&&"set"!==nextVal){if("*"===state.tokens.next.value&&"(punctuator)"===state.tokens.next.type?(state.inES6()||warning("W104",state.tokens.next,"generator functions","6"),advance("*"),isGeneratorMethod=!0):isGeneratorMethod=!1,"["===state.tokens.next.id)i=computedPropertyName(),state.nameStack.set(i);else if(state.nameStack.set(state.tokens.next),i=propertyName(),saveProperty(props,i,state.tokens.next),"string"!=typeof i)break;"("===state.tokens.next.value?(state.inES6()||warning("W104",state.tokens.curr,"concise methods","6"),doFunction({type:isGeneratorMethod?"generator":null})):(advance(":"),expression(10))}else advance(nextVal),state.inES5()||error("E034"),i=propertyName(),i||state.inES6()||error("E035"),i&&saveAccessor(nextVal,props,i,state.tokens.curr),t=state.tokens.next,f=doFunction(),p=f["(params)"],"get"===nextVal&&i&&p?warning("W076",t,p[0],i):"set"!==nextVal||!i||p&&1===p.length||warning("W077",t,i);else state.inES6()||warning("W104",state.tokens.next,"object short notation","6"),i=propertyName(!0),saveProperty(props,i,state.tokens.next),expression(10);if(countMember(i),","!==state.tokens.next.id)break;comma({allowTrailing:!0,property:!0}),","===state.tokens.next.id?warning("W070",state.tokens.curr):"}"!==state.tokens.next.id||state.inES5()||warning("W070",state.tokens.curr)}return b&&(indent-=state.option.indent),advance("}",this),checkProperties(props),this},x.fud=function(){error("E036",state.tokens.curr)}}(delim("{"));var conststatement=stmt("const",function(context){return blockVariableStatement("const",this,context)});conststatement.exps=!0;var letstatement=stmt("let",function(context){return blockVariableStatement("let",this,context)});letstatement.exps=!0;var varstatement=stmt("var",function(context){var tokens,lone,value,prefix=context&&context.prefix,inexport=context&&context.inexport,implied=context&&context.implied,report=!(context&&context.ignore);for(this.first=[];;){var names=[];_.contains(["{","["],state.tokens.next.value)?(tokens=destructuringPattern(),lone=!1):(tokens=[{id:identifier(),token:state.tokens.curr}],lone=!0),prefix&&implied||!report||!state.option.varstmt||warning("W132",this),this.first=this.first.concat(names);for(var t in tokens)tokens.hasOwnProperty(t)&&(t=tokens[t],!implied&&state.funct["(global)"]&&(predefined[t.id]===!1?warning("W079",t.token,t.id):state.option.futurehostile===!1&&(!state.inES5()&&vars.ecmaIdentifiers[5][t.id]===!1||!state.inES6()&&vars.ecmaIdentifiers[6][t.id]===!1)&&warning("W129",t.token,t.id)),t.id&&("for"===implied?(state.funct["(scope)"].has(t.id)||report&&warning("W088",t.token,t.id),state.funct["(scope)"].block.use(t.id,t.token)):(state.funct["(scope)"].addlabel(t.id,{type:"var",token:t.token}),lone&&inexport&&state.funct["(scope)"].setExported(t.id,t.token)),names.push(t.token)));if("="===state.tokens.next.id&&(state.nameStack.set(state.tokens.curr),advance("="),prefix||!report||state.funct["(loopage)"]||"undefined"!==state.tokens.next.id||warning("W080",state.tokens.prev,state.tokens.prev.value),"="===peek(0).id&&state.tokens.next.identifier&&(!prefix&&report&&!state.funct["(params)"]||-1===state.funct["(params)"].indexOf(state.tokens.next.value))&&warning("W120",state.tokens.next,state.tokens.next.value),value=expression(prefix?120:10),lone?tokens[0].first=value:destructuringPatternMatch(names,value)),","!==state.tokens.next.id)break;comma()}return this});varstatement.exps=!0,blockstmt("class",function(){return classdef.call(this,!0)}),blockstmt("function",function(context){var inexport=context&&context.inexport,generator=!1;"*"===state.tokens.next.value&&(advance("*"),state.inES6({strict:!0})?generator=!0:warning("W119",state.tokens.curr,"function*","6")),inblock&&warning("W082",state.tokens.curr);var i=optionalidentifier();return state.funct["(scope)"].addlabel(i,{type:"function",token:state.tokens.curr}),void 0===i?warning("W025"):inexport&&state.funct["(scope)"].setExported(i,state.tokens.prev),doFunction({name:i,statement:this,type:generator?"generator":null,ignoreLoopFunc:inblock}),"("===state.tokens.next.id&&state.tokens.next.line===state.tokens.curr.line&&error("E039"),this}),prefix("function",function(){var generator=!1;"*"===state.tokens.next.value&&(state.inES6()||warning("W119",state.tokens.curr,"function*","6"),advance("*"),generator=!0);var i=optionalidentifier();return doFunction({name:i,type:generator?"generator":null}),this}),blockstmt("if",function(){var t=state.tokens.next;increaseComplexityCount(),state.condition=!0,advance("(");var expr=expression(0);checkCondAssignment(expr);var forinifcheck=null;state.option.forin&&state.forinifcheckneeded&&(state.forinifcheckneeded=!1,forinifcheck=state.forinifchecks[state.forinifchecks.length-1],forinifcheck.type="(punctuator)"===expr.type&&"!"===expr.value?"(negative)":"(positive)"),advance(")",t),state.condition=!1;var s=block(!0,!0);return forinifcheck&&"(negative)"===forinifcheck.type&&s&&s[0]&&"(identifier)"===s[0].type&&"continue"===s[0].value&&(forinifcheck.type="(negative-with-continue)"),"else"===state.tokens.next.id&&(advance("else"),"if"===state.tokens.next.id||"switch"===state.tokens.next.id?statement():block(!0,!0)),this}),blockstmt("try",function(){function doCatch(){if(advance("catch"),advance("("),state.funct["(scope)"].stack("catchparams"),checkPunctuators(state.tokens.next,["[","{"])){var tokens=destructuringPattern();_.each(tokens,function(token){token.id&&state.funct["(scope)"].addParam(token.id,token,"exception")})}else"(identifier)"!==state.tokens.next.type?warning("E030",state.tokens.next,state.tokens.next.value):state.funct["(scope)"].addParam(identifier(),state.tokens.curr,"exception");"if"===state.tokens.next.value&&(state.inMoz()||warning("W118",state.tokens.curr,"catch filter"),advance("if"),expression(0)),advance(")"),block(!1),state.funct["(scope)"].unstack()}var b;for(block(!0);"catch"===state.tokens.next.id;)increaseComplexityCount(),b&&!state.inMoz()&&warning("W118",state.tokens.next,"multiple catch blocks"),doCatch(),b=!0;return"finally"===state.tokens.next.id?(advance("finally"),block(!0),void 0):(b||error("E021",state.tokens.next,"catch",state.tokens.next.value),this)}),blockstmt("while",function(){var t=state.tokens.next;return state.funct["(breakage)"]+=1,state.funct["(loopage)"]+=1,increaseComplexityCount(),advance("("),checkCondAssignment(expression(0)),advance(")",t),block(!0,!0),state.funct["(breakage)"]-=1,state.funct["(loopage)"]-=1,this}).labelled=!0,blockstmt("with",function(){var t=state.tokens.next;return state.isStrict()?error("E010",state.tokens.curr):state.option.withstmt||warning("W085",state.tokens.curr),advance("("),expression(0),advance(")",t),block(!0,!0),this}),blockstmt("switch",function(){var t=state.tokens.next,g=!1,noindent=!1;\nfor(state.funct["(breakage)"]+=1,advance("("),checkCondAssignment(expression(0)),advance(")",t),t=state.tokens.next,advance("{"),state.tokens.next.from===indent&&(noindent=!0),noindent||(indent+=state.option.indent),this.cases=[];;)switch(state.tokens.next.id){case"case":switch(state.funct["(verb)"]){case"yield":case"break":case"case":case"continue":case"return":case"switch":case"throw":break;default:state.tokens.curr.caseFallsThrough||warning("W086",state.tokens.curr,"case")}advance("case"),this.cases.push(expression(0)),increaseComplexityCount(),g=!0,advance(":"),state.funct["(verb)"]="case";break;case"default":switch(state.funct["(verb)"]){case"yield":case"break":case"continue":case"return":case"throw":break;default:this.cases.length&&(state.tokens.curr.caseFallsThrough||warning("W086",state.tokens.curr,"default"))}advance("default"),g=!0,advance(":");break;case"}":return noindent||(indent-=state.option.indent),advance("}",t),state.funct["(breakage)"]-=1,state.funct["(verb)"]=void 0,void 0;case"(end)":return error("E023",state.tokens.next,"}"),void 0;default:if(indent+=state.option.indent,g)switch(state.tokens.curr.id){case",":return error("E040"),void 0;case":":g=!1,statements();break;default:return error("E025",state.tokens.curr),void 0}else{if(":"!==state.tokens.curr.id)return error("E021",state.tokens.next,"case",state.tokens.next.value),void 0;advance(":"),error("E024",state.tokens.curr,":"),statements()}indent-=state.option.indent}return this}).labelled=!0,stmt("debugger",function(){return state.option.debug||warning("W087",this),this}).exps=!0,function(){var x=stmt("do",function(){state.funct["(breakage)"]+=1,state.funct["(loopage)"]+=1,increaseComplexityCount(),this.first=block(!0,!0),advance("while");var t=state.tokens.next;return advance("("),checkCondAssignment(expression(0)),advance(")",t),state.funct["(breakage)"]-=1,state.funct["(loopage)"]-=1,this});x.labelled=!0,x.exps=!0}(),blockstmt("for",function(){var s,t=state.tokens.next,letscope=!1,foreachtok=null;"each"===t.value&&(foreachtok=t,advance("each"),state.inMoz()||warning("W118",state.tokens.curr,"for each")),increaseComplexityCount(),advance("(");var nextop,comma,initializer,i=0,inof=["in","of"],level=0;checkPunctuators(state.tokens.next,["{","["])&&++level;do{if(nextop=peek(i),++i,checkPunctuators(nextop,["{","["])?++level:checkPunctuators(nextop,["}","]"])&&--level,0>level)break;0===level&&(!comma&&checkPunctuator(nextop,",")?comma=nextop:!initializer&&checkPunctuator(nextop,"=")&&(initializer=nextop))}while(level>0||!_.contains(inof,nextop.value)&&";"!==nextop.value&&"(end)"!==nextop.type);if(_.contains(inof,nextop.value)){state.inES6()||"of"!==nextop.value||warning("W104",nextop,"for of","6");var ok=!(initializer||comma);if(initializer&&error("W133",comma,nextop.value,"initializer is forbidden"),comma&&error("W133",comma,nextop.value,"more than one ForBinding"),"var"===state.tokens.next.id?(advance("var"),state.tokens.curr.fud({prefix:!0})):"let"===state.tokens.next.id||"const"===state.tokens.next.id?(advance(state.tokens.next.id),letscope=!0,state.funct["(scope)"].stack(),state.tokens.curr.fud({prefix:!0})):Object.create(varstatement).fud({prefix:!0,implied:"for",ignore:!ok}),advance(nextop.value),expression(20),advance(")",t),"in"===nextop.value&&state.option.forin&&(state.forinifcheckneeded=!0,void 0===state.forinifchecks&&(state.forinifchecks=[]),state.forinifchecks.push({type:"(none)"})),state.funct["(breakage)"]+=1,state.funct["(loopage)"]+=1,s=block(!0,!0),"in"===nextop.value&&state.option.forin){if(state.forinifchecks&&state.forinifchecks.length>0){var check=state.forinifchecks.pop();(s&&s.length>0&&("object"!=typeof s[0]||"if"!==s[0].value)||"(positive)"===check.type&&s.length>1||"(negative)"===check.type)&&warning("W089",this)}state.forinifcheckneeded=!1}state.funct["(breakage)"]-=1,state.funct["(loopage)"]-=1}else{if(foreachtok&&error("E045",foreachtok),";"!==state.tokens.next.id)if("var"===state.tokens.next.id)advance("var"),state.tokens.curr.fud();else if("let"===state.tokens.next.id)advance("let"),letscope=!0,state.funct["(scope)"].stack(),state.tokens.curr.fud();else for(;expression(0,"for"),","===state.tokens.next.id;)comma();if(nolinebreak(state.tokens.curr),advance(";"),state.funct["(loopage)"]+=1,";"!==state.tokens.next.id&&checkCondAssignment(expression(0)),nolinebreak(state.tokens.curr),advance(";"),";"===state.tokens.next.id&&error("E021",state.tokens.next,")",";"),")"!==state.tokens.next.id)for(;expression(0,"for"),","===state.tokens.next.id;)comma();advance(")",t),state.funct["(breakage)"]+=1,block(!0,!0),state.funct["(breakage)"]-=1,state.funct["(loopage)"]-=1}return letscope&&state.funct["(scope)"].unstack(),this}).labelled=!0,stmt("break",function(){var v=state.tokens.next.value;return state.option.asi||nolinebreak(this),";"===state.tokens.next.id||state.tokens.next.reach||state.tokens.curr.line!==startLine(state.tokens.next)?0===state.funct["(breakage)"]&&warning("W052",state.tokens.next,this.value):(state.funct["(scope)"].funct.hasBreakLabel(v)||warning("W090",state.tokens.next,v),this.first=state.tokens.next,advance()),reachable(this),this}).exps=!0,stmt("continue",function(){var v=state.tokens.next.value;return 0===state.funct["(breakage)"]&&warning("W052",state.tokens.next,this.value),state.funct["(loopage)"]||warning("W052",state.tokens.next,this.value),state.option.asi||nolinebreak(this),";"===state.tokens.next.id||state.tokens.next.reach||state.tokens.curr.line===startLine(state.tokens.next)&&(state.funct["(scope)"].funct.hasBreakLabel(v)||warning("W090",state.tokens.next,v),this.first=state.tokens.next,advance()),reachable(this),this}).exps=!0,stmt("return",function(){return this.line===startLine(state.tokens.next)?";"===state.tokens.next.id||state.tokens.next.reach||(this.first=expression(0),!this.first||"(punctuator)"!==this.first.type||"="!==this.first.value||this.first.paren||state.option.boss||warningAt("W093",this.first.line,this.first.character)):"(punctuator)"===state.tokens.next.type&&["[","{","+","-"].indexOf(state.tokens.next.value)>-1&&nolinebreak(this),reachable(this),this}).exps=!0,function(x){x.exps=!0,x.lbp=25}(prefix("yield",function(){var prev=state.tokens.prev;state.inES6(!0)&&!state.funct["(generator)"]?"(catch)"===state.funct["(name)"]&&state.funct["(context)"]["(generator)"]||error("E046",state.tokens.curr,"yield"):state.inES6()||warning("W104",state.tokens.curr,"yield","6"),state.funct["(generator)"]="yielded";var delegatingYield=!1;return"*"===state.tokens.next.value&&(delegatingYield=!0,advance("*")),this.line!==startLine(state.tokens.next)&&state.inMoz()?state.option.asi||nolinebreak(this):((delegatingYield||";"!==state.tokens.next.id&&!state.option.asi&&!state.tokens.next.reach&&state.tokens.next.nud)&&(nobreaknonadjacent(state.tokens.curr,state.tokens.next),this.first=expression(10),"(punctuator)"!==this.first.type||"="!==this.first.value||this.first.paren||state.option.boss||warningAt("W093",this.first.line,this.first.character)),state.inMoz()&&")"!==state.tokens.next.id&&(prev.lbp>30||!prev.assign&&!isEndOfExpr()||"yield"===prev.id)&&error("E050",this)),this})),stmt("throw",function(){return nolinebreak(this),this.first=expression(20),reachable(this),this}).exps=!0,stmt("import",function(){if(state.inES6()||warning("W119",state.tokens.curr,"import","6"),"(string)"===state.tokens.next.type)return advance("(string)"),this;if(state.tokens.next.identifier){if(this.name=identifier(),state.funct["(scope)"].addlabel(this.name,{type:"const",token:state.tokens.curr}),","!==state.tokens.next.value)return advance("from"),advance("(string)"),this;advance(",")}if("*"===state.tokens.next.id)advance("*"),advance("as"),state.tokens.next.identifier&&(this.name=identifier(),state.funct["(scope)"].addlabel(this.name,{type:"const",token:state.tokens.curr}));else for(advance("{");;){if("}"===state.tokens.next.value){advance("}");break}var importName;if("default"===state.tokens.next.type?(importName="default",advance("default")):importName=identifier(),"as"===state.tokens.next.value&&(advance("as"),importName=identifier()),state.funct["(scope)"].addlabel(importName,{type:"const",token:state.tokens.curr}),","!==state.tokens.next.value){if("}"===state.tokens.next.value){advance("}");break}error("E024",state.tokens.next,state.tokens.next.value);break}advance(",")}return advance("from"),advance("(string)"),this}).exps=!0,stmt("export",function(){var token,identifier,ok=!0;if(state.inES6()||(warning("W119",state.tokens.curr,"export","6"),ok=!1),state.funct["(scope)"].block.isGlobal()||(error("E053",state.tokens.curr),ok=!1),"*"===state.tokens.next.value)return advance("*"),advance("from"),advance("(string)"),this;if("default"===state.tokens.next.type){state.nameStack.set(state.tokens.next),advance("default");var exportType=state.tokens.next.id;return("function"===exportType||"class"===exportType)&&(this.block=!0),token=peek(),expression(10),identifier=token.value,this.block&&(state.funct["(scope)"].addlabel(identifier,{type:exportType,token:token}),state.funct["(scope)"].setExported(identifier,token)),this}if("{"===state.tokens.next.value){advance("{");for(var exportedTokens=[];;){if(state.tokens.next.identifier||error("E030",state.tokens.next,state.tokens.next.value),advance(),exportedTokens.push(state.tokens.curr),"as"===state.tokens.next.value&&(advance("as"),state.tokens.next.identifier||error("E030",state.tokens.next,state.tokens.next.value),advance()),","!==state.tokens.next.value){if("}"===state.tokens.next.value){advance("}");break}error("E024",state.tokens.next,state.tokens.next.value);break}advance(",")}return"from"===state.tokens.next.value?(advance("from"),advance("(string)")):ok&&exportedTokens.forEach(function(token){state.funct["(scope)"].setExported(token.value,token)}),this}if("var"===state.tokens.next.id)advance("var"),state.tokens.curr.fud({inexport:!0});else if("let"===state.tokens.next.id)advance("let"),state.tokens.curr.fud({inexport:!0});else if("const"===state.tokens.next.id)advance("const"),state.tokens.curr.fud({inexport:!0});else if("function"===state.tokens.next.id)this.block=!0,advance("function"),state.syntax["function"].fud({inexport:!0});else if("class"===state.tokens.next.id){this.block=!0,advance("class");var classNameToken=state.tokens.next;state.syntax["class"].fud(),state.funct["(scope)"].setExported(classNameToken.value,classNameToken)}else error("E024",state.tokens.next,state.tokens.next.value);return this}).exps=!0,FutureReservedWord("abstract"),FutureReservedWord("boolean"),FutureReservedWord("byte"),FutureReservedWord("char"),FutureReservedWord("class",{es5:!0,nud:classdef}),FutureReservedWord("double"),FutureReservedWord("enum",{es5:!0}),FutureReservedWord("export",{es5:!0}),FutureReservedWord("extends",{es5:!0}),FutureReservedWord("final"),FutureReservedWord("float"),FutureReservedWord("goto"),FutureReservedWord("implements",{es5:!0,strictOnly:!0}),FutureReservedWord("import",{es5:!0}),FutureReservedWord("int"),FutureReservedWord("interface",{es5:!0,strictOnly:!0}),FutureReservedWord("long"),FutureReservedWord("native"),FutureReservedWord("package",{es5:!0,strictOnly:!0}),FutureReservedWord("private",{es5:!0,strictOnly:!0}),FutureReservedWord("protected",{es5:!0,strictOnly:!0}),FutureReservedWord("public",{es5:!0,strictOnly:!0}),FutureReservedWord("short"),FutureReservedWord("static",{es5:!0,strictOnly:!0}),FutureReservedWord("super",{es5:!0}),FutureReservedWord("synchronized"),FutureReservedWord("transient"),FutureReservedWord("volatile");var lookupBlockType=function(){var pn,pn1,prev,i=-1,bracketStack=0,ret={};checkPunctuators(state.tokens.curr,["[","{"])&&(bracketStack+=1);do{if(prev=-1===i?state.tokens.curr:pn,pn=-1===i?state.tokens.next:peek(i),pn1=peek(i+1),i+=1,checkPunctuators(pn,["[","{"])?bracketStack+=1:checkPunctuators(pn,["]","}"])&&(bracketStack-=1),1===bracketStack&&pn.identifier&&"for"===pn.value&&!checkPunctuator(prev,".")){ret.isCompArray=!0,ret.notJson=!0;break}if(0===bracketStack&&checkPunctuators(pn,["}","]"])){if("="===pn1.value){ret.isDestAssign=!0,ret.notJson=!0;break}if("."===pn1.value){ret.notJson=!0;break}}checkPunctuator(pn,";")&&(ret.isBlock=!0,ret.notJson=!0)}while(bracketStack>0&&"(end)"!==pn.id);return ret},arrayComprehension=function(){function declare(v){var l=_current.variables.filter(function(elt){return elt.value===v?(elt.undef=!1,v):void 0}).length;return 0!==l}function use(v){var l=_current.variables.filter(function(elt){return elt.value!==v||elt.undef?void 0:(elt.unused===!0&&(elt.unused=!1),v)}).length;return 0===l}var _current,CompArray=function(){this.mode="use",this.variables=[]},_carrays=[];return{stack:function(){_current=new CompArray,_carrays.push(_current)},unstack:function(){_current.variables.filter(function(v){v.unused&&warning("W098",v.token,v.raw_text||v.value),v.undef&&state.funct["(scope)"].block.use(v.value,v.token)}),_carrays.splice(-1,1),_current=_carrays[_carrays.length-1]},setState:function(s){_.contains(["use","define","generate","filter"],s)&&(_current.mode=s)},check:function(v){return _current?_current&&"use"===_current.mode?(use(v)&&_current.variables.push({funct:state.funct,token:state.tokens.curr,value:v,undef:!0,unused:!1}),!0):_current&&"define"===_current.mode?(declare(v)||_current.variables.push({funct:state.funct,token:state.tokens.curr,value:v,undef:!1,unused:!0}),!0):_current&&"generate"===_current.mode?(state.funct["(scope)"].block.use(v,state.tokens.curr),!0):_current&&"filter"===_current.mode?(use(v)&&state.funct["(scope)"].block.use(v,state.tokens.curr),!0):!1:void 0}}},escapeRegex=function(str){return str.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,"\\\\$&")},itself=function(s,o,g){function each(obj,cb){obj&&(Array.isArray(obj)||"object"!=typeof obj||(obj=Object.keys(obj)),obj.forEach(cb))}var i,k,x,reIgnoreStr,reIgnore,optionKeys,newOptionObj={},newIgnoredObj={};o=_.clone(o),state.reset(),o&&o.scope?JSHINT.scope=o.scope:(JSHINT.errors=[],JSHINT.undefs=[],JSHINT.internals=[],JSHINT.blacklist={},JSHINT.scope="(main)"),predefined=Object.create(null),combine(predefined,vars.ecmaIdentifiers[3]),combine(predefined,vars.reservedVars),combine(predefined,g||{}),declared=Object.create(null);var exported=Object.create(null);if(o)for(each(o.predef||null,function(item){var slice,prop;"-"===item[0]?(slice=item.slice(1),JSHINT.blacklist[slice]=slice,delete predefined[slice]):(prop=Object.getOwnPropertyDescriptor(o.predef,item),predefined[item]=prop?prop.value:!1)}),each(o.exported||null,function(item){exported[item]=!0}),delete o.predef,delete o.exported,optionKeys=Object.keys(o),x=0;optionKeys.length>x;x++)if(/^-W\\d{3}$/g.test(optionKeys[x]))newIgnoredObj[optionKeys[x].slice(1)]=!0;else{var optionKey=optionKeys[x];newOptionObj[optionKey]=o[optionKey],("esversion"===optionKey&&5===o[optionKey]||"es5"===optionKey&&o[optionKey])&&warning("I003"),"newcap"===optionKeys[x]&&o[optionKey]===!1&&(newOptionObj["(explicitNewcap)"]=!0)}state.option=newOptionObj,state.ignored=newIgnoredObj,state.option.indent=state.option.indent||4,state.option.maxerr=state.option.maxerr||50,indent=1;var scopeManagerInst=scopeManager(state,predefined,exported,declared);if(scopeManagerInst.on("warning",function(ev){warning.apply(null,[ev.code,ev.token].concat(ev.data))}),scopeManagerInst.on("error",function(ev){error.apply(null,[ev.code,ev.token].concat(ev.data))}),state.funct=functor("(global)",null,{"(global)":!0,"(scope)":scopeManagerInst,"(comparray)":arrayComprehension(),"(metrics)":createMetrics(state.tokens.next)}),functions=[state.funct],urls=[],stack=null,member={},membersOnly=null,inblock=!1,lookahead=[],!isString(s)&&!Array.isArray(s))return errorAt("E004",0),!1;api={get isJSON(){return state.jsonMode},getOption:function(name){return state.option[name]||null},getCache:function(name){return state.cache[name]},setCache:function(name,value){state.cache[name]=value},warn:function(code,data){warningAt.apply(null,[code,data.line,data.char].concat(data.data))},on:function(names,listener){names.split(" ").forEach(function(name){emitter.on(name,listener)}.bind(this))}},emitter.removeAllListeners(),(extraModules||[]).forEach(function(func){func(api)}),state.tokens.prev=state.tokens.curr=state.tokens.next=state.syntax["(begin)"],o&&o.ignoreDelimiters&&(Array.isArray(o.ignoreDelimiters)||(o.ignoreDelimiters=[o.ignoreDelimiters]),o.ignoreDelimiters.forEach(function(delimiterPair){delimiterPair.start&&delimiterPair.end&&(reIgnoreStr=escapeRegex(delimiterPair.start)+"[\\\\s\\\\S]*?"+escapeRegex(delimiterPair.end),reIgnore=RegExp(reIgnoreStr,"ig"),s=s.replace(reIgnore,function(match){return match.replace(/./g," ")}))})),lex=new Lexer(s),lex.on("warning",function(ev){warningAt.apply(null,[ev.code,ev.line,ev.character].concat(ev.data))}),lex.on("error",function(ev){errorAt.apply(null,[ev.code,ev.line,ev.character].concat(ev.data))}),lex.on("fatal",function(ev){quit("E041",ev.line,ev.from)}),lex.on("Identifier",function(ev){emitter.emit("Identifier",ev)}),lex.on("String",function(ev){emitter.emit("String",ev)}),lex.on("Number",function(ev){emitter.emit("Number",ev)}),lex.start();for(var name in o)_.has(o,name)&&checkOption(name,state.tokens.curr);assume(),combine(predefined,g||{}),comma.first=!0;try{switch(advance(),state.tokens.next.id){case"{":case"[":destructuringAssignOrJsonValue();break;default:directives(),state.directive["use strict"]&&"global"!==state.option.strict&&warning("W097",state.tokens.prev),statements()}"(end)"!==state.tokens.next.id&&quit("E041",state.tokens.curr.line),state.funct["(scope)"].unstack()}catch(err){if(!err||"JSHintError"!==err.name)throw err;var nt=state.tokens.next||{};JSHINT.errors.push({scope:"(main)",raw:err.raw,code:err.code,reason:err.message,line:err.line||nt.line,character:err.character||nt.from},null)}if("(main)"===JSHINT.scope)for(o=o||{},i=0;JSHINT.internals.length>i;i+=1)k=JSHINT.internals[i],o.scope=k.elem,itself(k.value,o,g);return 0===JSHINT.errors.length};return itself.addModule=function(func){extraModules.push(func)},itself.addModule(style.register),itself.data=function(){var fu,f,i,j,n,globals,data={functions:[],options:state.option};itself.errors.length&&(data.errors=itself.errors),state.jsonMode&&(data.json=!0);var impliedGlobals=state.funct["(scope)"].getImpliedGlobals();for(impliedGlobals.length>0&&(data.implieds=impliedGlobals),urls.length>0&&(data.urls=urls),globals=state.funct["(scope)"].getUsedOrDefinedGlobals(),globals.length>0&&(data.globals=globals),i=1;functions.length>i;i+=1){for(f=functions[i],fu={},j=0;functionicity.length>j;j+=1)fu[functionicity[j]]=[];for(j=0;functionicity.length>j;j+=1)0===fu[functionicity[j]].length&&delete fu[functionicity[j]];fu.name=f["(name)"],fu.param=f["(params)"],fu.line=f["(line)"],fu.character=f["(character)"],fu.last=f["(last)"],fu.lastcharacter=f["(lastcharacter)"],fu.metrics={complexity:f["(metrics)"].ComplexityCount,parameters:f["(metrics)"].arity,statements:f["(metrics)"].statementCount},data.functions.push(fu)}var unuseds=state.funct["(scope)"].getUnuseds();unuseds.length>0&&(data.unused=unuseds);for(n in member)if("number"==typeof member[n]){data.member=member;break}return data},itself.jshint=itself,itself}();"object"==typeof exports&&exports&&(exports.JSHINT=JSHINT)},{"../lodash":"/node_modules/jshint/lodash.js","./lex.js":"/node_modules/jshint/src/lex.js","./messages.js":"/node_modules/jshint/src/messages.js","./options.js":"/node_modules/jshint/src/options.js","./reg.js":"/node_modules/jshint/src/reg.js","./scope-manager.js":"/node_modules/jshint/src/scope-manager.js","./state.js":"/node_modules/jshint/src/state.js","./style.js":"/node_modules/jshint/src/style.js","./vars.js":"/node_modules/jshint/src/vars.js",events:"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/lex.js":[function(_dereq_,module,exports){"use strict";function asyncTrigger(){var _checks=[];return{push:function(fn){_checks.push(fn)},check:function(){for(var check=0;_checks.length>check;++check)_checks[check]();_checks.splice(0,_checks.length)}}}function Lexer(source){var lines=source;"string"==typeof lines&&(lines=lines.replace(/\\r\\n/g,"\\n").replace(/\\r/g,"\\n").split("\\n")),lines[0]&&"#!"===lines[0].substr(0,2)&&(-1!==lines[0].indexOf("node")&&(state.option.node=!0),lines[0]=""),this.emitter=new events.EventEmitter,this.source=source,this.setLines(lines),this.prereg=!0,this.line=0,this.char=1,this.from=1,this.input="",this.inComment=!1,this.context=[],this.templateStarts=[];for(var i=0;state.option.indent>i;i+=1)state.tab+=" ";this.ignoreLinterErrors=!1}var _=_dereq_("../lodash"),events=_dereq_("events"),reg=_dereq_("./reg.js"),state=_dereq_("./state.js").state,unicodeData=_dereq_("../data/ascii-identifier-data.js"),asciiIdentifierStartTable=unicodeData.asciiIdentifierStartTable,asciiIdentifierPartTable=unicodeData.asciiIdentifierPartTable,Token={Identifier:1,Punctuator:2,NumericLiteral:3,StringLiteral:4,Comment:5,Keyword:6,NullLiteral:7,BooleanLiteral:8,RegExp:9,TemplateHead:10,TemplateMiddle:11,TemplateTail:12,NoSubstTemplate:13},Context={Block:1,Template:2};Lexer.prototype={_lines:[],inContext:function(ctxType){return this.context.length>0&&this.context[this.context.length-1].type===ctxType},pushContext:function(ctxType){this.context.push({type:ctxType})},popContext:function(){return this.context.pop()},isContext:function(context){return this.context.length>0&&this.context[this.context.length-1]===context},currentContext:function(){return this.context.length>0&&this.context[this.context.length-1]},getLines:function(){return this._lines=state.lines,this._lines},setLines:function(val){this._lines=val,state.lines=this._lines},peek:function(i){return this.input.charAt(i||0)},skip:function(i){i=i||1,this.char+=i,this.input=this.input.slice(i)},on:function(names,listener){names.split(" ").forEach(function(name){this.emitter.on(name,listener)}.bind(this))},trigger:function(){this.emitter.emit.apply(this.emitter,Array.prototype.slice.call(arguments))},triggerAsync:function(type,args,checks,fn){checks.push(function(){fn()&&this.trigger(type,args)}.bind(this))},scanPunctuator:function(){var ch2,ch3,ch4,ch1=this.peek();switch(ch1){case".":if(/^[0-9]$/.test(this.peek(1)))return null;if("."===this.peek(1)&&"."===this.peek(2))return{type:Token.Punctuator,value:"..."};case"(":case")":case";":case",":case"[":case"]":case":":case"~":case"?":return{type:Token.Punctuator,value:ch1};case"{":return this.pushContext(Context.Block),{type:Token.Punctuator,value:ch1};case"}":return this.inContext(Context.Block)&&this.popContext(),{type:Token.Punctuator,value:ch1};case"#":return{type:Token.Punctuator,value:ch1};case"":return null}return ch2=this.peek(1),ch3=this.peek(2),ch4=this.peek(3),">"===ch1&&">"===ch2&&">"===ch3&&"="===ch4?{type:Token.Punctuator,value:">>>="}:"="===ch1&&"="===ch2&&"="===ch3?{type:Token.Punctuator,value:"==="}:"!"===ch1&&"="===ch2&&"="===ch3?{type:Token.Punctuator,value:"!=="}:">"===ch1&&">"===ch2&&">"===ch3?{type:Token.Punctuator,value:">>>"}:"<"===ch1&&"<"===ch2&&"="===ch3?{type:Token.Punctuator,value:"<<="}:">"===ch1&&">"===ch2&&"="===ch3?{type:Token.Punctuator,value:">>="}:"="===ch1&&">"===ch2?{type:Token.Punctuator,value:ch1+ch2}:ch1===ch2&&"+-<>&|".indexOf(ch1)>=0?{type:Token.Punctuator,value:ch1+ch2}:"<>=!+-*%&|^".indexOf(ch1)>=0?"="===ch2?{type:Token.Punctuator,value:ch1+ch2}:{type:Token.Punctuator,value:ch1}:"/"===ch1?"="===ch2?{type:Token.Punctuator,value:"/="}:{type:Token.Punctuator,value:"/"}:null},scanComments:function(){function commentToken(label,body,opt){var special=["jshint","jslint","members","member","globals","global","exported"],isSpecial=!1,value=label+body,commentType="plain";return opt=opt||{},opt.isMultiline&&(value+="*/"),body=body.replace(/\\n/g," "),"/*"===label&®.fallsThrough.test(body)&&(isSpecial=!0,commentType="falls through"),special.forEach(function(str){if(!isSpecial&&("//"!==label||"jshint"===str)&&(" "===body.charAt(str.length)&&body.substr(0,str.length)===str&&(isSpecial=!0,label+=str,body=body.substr(str.length)),isSpecial||" "!==body.charAt(0)||" "!==body.charAt(str.length+1)||body.substr(1,str.length)!==str||(isSpecial=!0,label=label+" "+str,body=body.substr(str.length+1)),isSpecial))switch(str){case"member":commentType="members";break;case"global":commentType="globals";break;default:var options=body.split(":").map(function(v){return v.replace(/^\\s+/,"").replace(/\\s+$/,"")});if(2===options.length)switch(options[0]){case"ignore":switch(options[1]){case"start":self.ignoringLinterErrors=!0,isSpecial=!1;break;case"end":self.ignoringLinterErrors=!1,isSpecial=!1}}commentType=str}}),{type:Token.Comment,commentType:commentType,value:value,body:body,isSpecial:isSpecial,isMultiline:opt.isMultiline||!1,isMalformed:opt.isMalformed||!1}}var ch1=this.peek(),ch2=this.peek(1),rest=this.input.substr(2),startLine=this.line,startChar=this.char,self=this;if("*"===ch1&&"/"===ch2)return this.trigger("error",{code:"E018",line:startLine,character:startChar}),this.skip(2),null;if("/"!==ch1||"*"!==ch2&&"/"!==ch2)return null;if("/"===ch2)return this.skip(this.input.length),commentToken("//",rest);var body="";if("*"===ch2){for(this.inComment=!0,this.skip(2);"*"!==this.peek()||"/"!==this.peek(1);)if(""===this.peek()){if(body+="\\n",!this.nextLine())return this.trigger("error",{code:"E017",line:startLine,character:startChar}),this.inComment=!1,commentToken("/*",body,{isMultiline:!0,isMalformed:!0})}else body+=this.peek(),this.skip();return this.skip(2),this.inComment=!1,commentToken("/*",body,{isMultiline:!0})}},scanKeyword:function(){var result=/^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input),keywords=["if","in","do","var","for","new","try","let","this","else","case","void","with","enum","while","break","catch","throw","const","yield","class","super","return","typeof","delete","switch","export","import","default","finally","extends","function","continue","debugger","instanceof"];return result&&keywords.indexOf(result[0])>=0?{type:Token.Keyword,value:result[0]}:null},scanIdentifier:function(){function isNonAsciiIdentifierStart(code){return code>256}function isNonAsciiIdentifierPart(code){return code>256}function isHexDigit(str){return/^[0-9a-fA-F]$/.test(str)}function removeEscapeSequences(id){return id.replace(/\\\\u([0-9a-fA-F]{4})/g,function(m0,codepoint){return String.fromCharCode(parseInt(codepoint,16))})}var type,char,id="",index=0,readUnicodeEscapeSequence=function(){if(index+=1,"u"!==this.peek(index))return null;var code,ch1=this.peek(index+1),ch2=this.peek(index+2),ch3=this.peek(index+3),ch4=this.peek(index+4);return isHexDigit(ch1)&&isHexDigit(ch2)&&isHexDigit(ch3)&&isHexDigit(ch4)?(code=parseInt(ch1+ch2+ch3+ch4,16),asciiIdentifierPartTable[code]||isNonAsciiIdentifierPart(code)?(index+=5,"\\\\u"+ch1+ch2+ch3+ch4):null):null}.bind(this),getIdentifierStart=function(){var chr=this.peek(index),code=chr.charCodeAt(0);return 92===code?readUnicodeEscapeSequence():128>code?asciiIdentifierStartTable[code]?(index+=1,chr):null:isNonAsciiIdentifierStart(code)?(index+=1,chr):null}.bind(this),getIdentifierPart=function(){var chr=this.peek(index),code=chr.charCodeAt(0);return 92===code?readUnicodeEscapeSequence():128>code?asciiIdentifierPartTable[code]?(index+=1,chr):null:isNonAsciiIdentifierPart(code)?(index+=1,chr):null}.bind(this);if(char=getIdentifierStart(),null===char)return null;for(id=char;char=getIdentifierPart(),null!==char;)id+=char;switch(id){case"true":case"false":type=Token.BooleanLiteral;break;case"null":type=Token.NullLiteral;break;default:type=Token.Identifier}return{type:type,value:removeEscapeSequences(id),text:id,tokenLength:id.length}},scanNumericLiteral:function(){function isDecimalDigit(str){return/^[0-9]$/.test(str)}function isOctalDigit(str){return/^[0-7]$/.test(str)}function isBinaryDigit(str){return/^[01]$/.test(str)}function isHexDigit(str){return/^[0-9a-fA-F]$/.test(str)}function isIdentifierStart(ch){return"$"===ch||"_"===ch||"\\\\"===ch||ch>="a"&&"z">=ch||ch>="A"&&"Z">=ch}var bad,index=0,value="",length=this.input.length,char=this.peek(index),isAllowedDigit=isDecimalDigit,base=10,isLegacy=!1;if("."!==char&&!isDecimalDigit(char))return null;if("."!==char){for(value=this.peek(index),index+=1,char=this.peek(index),"0"===value&&(("x"===char||"X"===char)&&(isAllowedDigit=isHexDigit,base=16,index+=1,value+=char),("o"===char||"O"===char)&&(isAllowedDigit=isOctalDigit,base=8,state.inES6(!0)||this.trigger("warning",{code:"W119",line:this.line,character:this.char,data:["Octal integer literal","6"]}),index+=1,value+=char),("b"===char||"B"===char)&&(isAllowedDigit=isBinaryDigit,base=2,state.inES6(!0)||this.trigger("warning",{code:"W119",line:this.line,character:this.char,data:["Binary integer literal","6"]}),index+=1,value+=char),isOctalDigit(char)&&(isAllowedDigit=isOctalDigit,base=8,isLegacy=!0,bad=!1,index+=1,value+=char),!isOctalDigit(char)&&isDecimalDigit(char)&&(index+=1,value+=char));length>index;){if(char=this.peek(index),isLegacy&&isDecimalDigit(char))bad=!0;else if(!isAllowedDigit(char))break;value+=char,index+=1}if(isAllowedDigit!==isDecimalDigit)return!isLegacy&&2>=value.length?{type:Token.NumericLiteral,value:value,isMalformed:!0}:length>index&&(char=this.peek(index),isIdentifierStart(char))?null:{type:Token.NumericLiteral,value:value,base:base,isLegacy:isLegacy,isMalformed:!1}}if("."===char)for(value+=char,index+=1;length>index&&(char=this.peek(index),isDecimalDigit(char));)value+=char,index+=1;if("e"===char||"E"===char){if(value+=char,index+=1,char=this.peek(index),("+"===char||"-"===char)&&(value+=this.peek(index),index+=1),char=this.peek(index),!isDecimalDigit(char))return null;for(value+=char,index+=1;length>index&&(char=this.peek(index),isDecimalDigit(char));)value+=char,index+=1}return length>index&&(char=this.peek(index),isIdentifierStart(char))?null:{type:Token.NumericLiteral,value:value,base:base,isMalformed:!isFinite(value)}},scanEscapeSequence:function(checks){var allowNewLine=!1,jump=1;this.skip();var char=this.peek();switch(char){case"\'":this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\\\\'"]},checks,function(){return state.jsonMode});break;case"b":char="\\\\b";break;case"f":char="\\\\f";break;case"n":char="\\\\n";break;case"r":char="\\\\r";break;case"t":char="\\\\t";break;case"0":char="\\\\0";var n=parseInt(this.peek(1),10);this.triggerAsync("warning",{code:"W115",line:this.line,character:this.char},checks,function(){return n>=0&&7>=n&&state.isStrict()});break;case"u":var hexCode=this.input.substr(1,4),code=parseInt(hexCode,16);isNaN(code)&&this.trigger("warning",{code:"W052",line:this.line,character:this.char,data:["u"+hexCode]}),char=String.fromCharCode(code),jump=5;break;case"v":this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\\\v"]},checks,function(){return state.jsonMode}),char="\v";break;case"x":var x=parseInt(this.input.substr(1,2),16);this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\\\x-"]},checks,function(){return state.jsonMode}),char=String.fromCharCode(x),jump=3;break;case"\\\\":char="\\\\\\\\";break;case\'"\':char=\'\\\\"\';break;case"/":break;case"":allowNewLine=!0,char=""}return{"char":char,jump:jump,allowNewLine:allowNewLine}},scanTemplateLiteral:function(checks){var tokenType,ch,value="",startLine=this.line,startChar=this.char,depth=this.templateStarts.length;if(!state.inES6(!0))return null;if("`"===this.peek())tokenType=Token.TemplateHead,this.templateStarts.push({line:this.line,"char":this.char}),depth=this.templateStarts.length,this.skip(1),this.pushContext(Context.Template);else{if(!this.inContext(Context.Template)||"}"!==this.peek())return null;tokenType=Token.TemplateMiddle}for(;"`"!==this.peek();){for(;""===(ch=this.peek());)if(value+="\\n",!this.nextLine()){var startPos=this.templateStarts.pop();return this.trigger("error",{code:"E052",line:startPos.line,character:startPos.char}),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!0,depth:depth,context:this.popContext()}}if("$"===ch&&"{"===this.peek(1))return value+="${",this.skip(2),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,depth:depth,context:this.currentContext()};\nif("\\\\"===ch){var escape=this.scanEscapeSequence(checks);value+=escape.char,this.skip(escape.jump)}else"`"!==ch&&(value+=ch,this.skip(1))}return tokenType=tokenType===Token.TemplateHead?Token.NoSubstTemplate:Token.TemplateTail,this.skip(1),this.templateStarts.pop(),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,depth:depth,context:this.popContext()}},scanStringLiteral:function(checks){var quote=this.peek();if(\'"\'!==quote&&"\'"!==quote)return null;this.triggerAsync("warning",{code:"W108",line:this.line,character:this.char},checks,function(){return state.jsonMode&&\'"\'!==quote});var value="",startLine=this.line,startChar=this.char,allowNewLine=!1;for(this.skip();this.peek()!==quote;)if(""===this.peek()){if(allowNewLine?(allowNewLine=!1,this.triggerAsync("warning",{code:"W043",line:this.line,character:this.char},checks,function(){return!state.option.multistr}),this.triggerAsync("warning",{code:"W042",line:this.line,character:this.char},checks,function(){return state.jsonMode&&state.option.multistr})):this.trigger("warning",{code:"W112",line:this.line,character:this.char}),!this.nextLine())return this.trigger("error",{code:"E029",line:startLine,character:startChar}),{type:Token.StringLiteral,value:value,startLine:startLine,startChar:startChar,isUnclosed:!0,quote:quote}}else{allowNewLine=!1;var char=this.peek(),jump=1;if(" ">char&&this.trigger("warning",{code:"W113",line:this.line,character:this.char,data:[""]}),"\\\\"===char){var parsed=this.scanEscapeSequence(checks);char=parsed.char,jump=parsed.jump,allowNewLine=parsed.allowNewLine}value+=char,this.skip(jump)}return this.skip(),{type:Token.StringLiteral,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,quote:quote}},scanRegExp:function(){var terminated,index=0,length=this.input.length,char=this.peek(),value=char,body="",flags=[],malformed=!1,isCharSet=!1,scanUnexpectedChars=function(){" ">char&&(malformed=!0,this.trigger("warning",{code:"W048",line:this.line,character:this.char})),"<"===char&&(malformed=!0,this.trigger("warning",{code:"W049",line:this.line,character:this.char,data:[char]}))}.bind(this);if(!this.prereg||"/"!==char)return null;for(index+=1,terminated=!1;length>index;)if(char=this.peek(index),value+=char,body+=char,isCharSet)"]"===char&&("\\\\"!==this.peek(index-1)||"\\\\"===this.peek(index-2))&&(isCharSet=!1),"\\\\"===char&&(index+=1,char=this.peek(index),body+=char,value+=char,scanUnexpectedChars()),index+=1;else{if("\\\\"===char){if(index+=1,char=this.peek(index),body+=char,value+=char,scanUnexpectedChars(),"/"===char){index+=1;continue}if("["===char){index+=1;continue}}if("["!==char){if("/"===char){body=body.substr(0,body.length-1),terminated=!0,index+=1;break}index+=1}else isCharSet=!0,index+=1}if(!terminated)return this.trigger("error",{code:"E015",line:this.line,character:this.from}),void this.trigger("fatal",{line:this.line,from:this.from});for(;length>index&&(char=this.peek(index),/[gim]/.test(char));)flags.push(char),value+=char,index+=1;try{RegExp(body,flags.join(""))}catch(err){malformed=!0,this.trigger("error",{code:"E016",line:this.line,character:this.char,data:[err.message]})}return{type:Token.RegExp,value:value,flags:flags,isMalformed:malformed}},scanNonBreakingSpaces:function(){return state.option.nonbsp?this.input.search(/(\\u00A0)/):-1},scanUnsafeChars:function(){return this.input.search(reg.unsafeChars)},next:function(checks){this.from=this.char;var start;if(/\\s/.test(this.peek()))for(start=this.char;/\\s/.test(this.peek());)this.from+=1,this.skip();var match=this.scanComments()||this.scanStringLiteral(checks)||this.scanTemplateLiteral(checks);return match?match:(match=this.scanRegExp()||this.scanPunctuator()||this.scanKeyword()||this.scanIdentifier()||this.scanNumericLiteral(),match?(this.skip(match.tokenLength||match.value.length),match):null)},nextLine:function(){var char;if(this.line>=this.getLines().length)return!1;this.input=this.getLines()[this.line],this.line+=1,this.char=1,this.from=1;var inputTrimmed=this.input.trim(),startsWith=function(){return _.some(arguments,function(prefix){return 0===inputTrimmed.indexOf(prefix)})},endsWith=function(){return _.some(arguments,function(suffix){return-1!==inputTrimmed.indexOf(suffix,inputTrimmed.length-suffix.length)})};if(this.ignoringLinterErrors===!0&&(startsWith("/*","//")||this.inComment&&endsWith("*/")||(this.input="")),char=this.scanNonBreakingSpaces(),char>=0&&this.trigger("warning",{code:"W125",line:this.line,character:char+1}),this.input=this.input.replace(/\\t/g,state.tab),char=this.scanUnsafeChars(),char>=0&&this.trigger("warning",{code:"W100",line:this.line,character:char}),!this.ignoringLinterErrors&&state.option.maxlen&&state.option.maxlen=0;--i){var scopeLabels=_scopeStack[i]["(labels)"];if(scopeLabels[labelName])return scopeLabels}}function usedSoFarInCurrentFunction(labelName){for(var i=_scopeStack.length-1;i>=0;i--){var current=_scopeStack[i];if(current["(usages)"][labelName])return current["(usages)"][labelName];if(current===_currentFunctBody)break}return!1}function _checkOuterShadow(labelName,token){if("outer"===state.option.shadow)for(var isGlobal="global"===_currentFunctBody["(type)"],isNewFunction="functionparams"===_current["(type)"],outsideCurrentFunction=!isGlobal,i=0;_scopeStack.length>i;i++){var stackItem=_scopeStack[i];isNewFunction||_scopeStack[i+1]!==_currentFunctBody||(outsideCurrentFunction=!1),outsideCurrentFunction&&stackItem["(labels)"][labelName]&&warning("W123",token,labelName),stackItem["(breakLabels)"][labelName]&&warning("W123",token,labelName)}}function _latedefWarning(type,labelName,token){state.option.latedef&&(state.option.latedef===!0&&"function"===type||"function"!==type)&&warning("W003",token,labelName)}var _current,_scopeStack=[];_newScope("global"),_current["(predefined)"]=predefined;var _currentFunctBody=_current,usedPredefinedAndGlobals=Object.create(null),impliedGlobals=Object.create(null),unuseds=[],emitter=new events.EventEmitter,_getUnusedOption=function(unused_opt){return void 0===unused_opt&&(unused_opt=state.option.unused),unused_opt===!0&&(unused_opt="last-param"),unused_opt},_warnUnused=function(name,tkn,type,unused_opt){var line=tkn.line,chr=tkn.from,raw_name=tkn.raw_text||name;unused_opt=_getUnusedOption(unused_opt);var warnable_types={vars:["var"],"last-param":["var","param"],strict:["var","param","last-param"]};unused_opt&&warnable_types[unused_opt]&&-1!==warnable_types[unused_opt].indexOf(type)&&warning("W098",{line:line,from:chr},raw_name),(unused_opt||"var"===type)&&unuseds.push({name:name,line:line,character:chr})},scopeManagerInst={on:function(names,listener){names.split(" ").forEach(function(name){emitter.on(name,listener)})},isPredefined:function(labelName){return!this.has(labelName)&&_.has(_scopeStack[0]["(predefined)"],labelName)},stack:function(type){var previousScope=_current;_newScope(type),type||"functionparams"!==previousScope["(type)"]||(_current["(isFuncBody)"]=!0,_current["(context)"]=_currentFunctBody,_currentFunctBody=_current)},unstack:function(){var i,j,subScope=_scopeStack.length>1?_scopeStack[_scopeStack.length-2]:null,isUnstackingFunctionBody=_current===_currentFunctBody,isUnstackingFunctionParams="functionparams"===_current["(type)"],isUnstackingFunctionOuter="functionouter"===_current["(type)"],currentUsages=_current["(usages)"],currentLabels=_current["(labels)"],usedLabelNameList=Object.keys(currentUsages);for(currentUsages.__proto__&&-1===usedLabelNameList.indexOf("__proto__")&&usedLabelNameList.push("__proto__"),i=0;usedLabelNameList.length>i;i++){var usedLabelName=usedLabelNameList[i],usage=currentUsages[usedLabelName],usedLabel=currentLabels[usedLabelName];if(usedLabel){var usedLabelType=usedLabel["(type)"];if(usedLabel["(useOutsideOfScope)"]&&!state.option.funcscope){var usedTokens=usage["(tokens)"];if(usedTokens)for(j=0;usedTokens.length>j;j++)usedLabel["(function)"]===usedTokens[j]["(function)"]&&error("W038",usedTokens[j],usedLabelName)}if(_current["(labels)"][usedLabelName]["(unused)"]=!1,"const"===usedLabelType&&usage["(modified)"])for(j=0;usage["(modified)"].length>j;j++)error("E013",usage["(modified)"][j],usedLabelName);if(("function"===usedLabelType||"class"===usedLabelType)&&usage["(reassigned)"])for(j=0;usage["(reassigned)"].length>j;j++)error("W021",usage["(reassigned)"][j],usedLabelName,usedLabelType)}else if(isUnstackingFunctionOuter&&(state.funct["(isCapturing)"]=!0),subScope)if(subScope["(usages)"][usedLabelName]){var subScopeUsage=subScope["(usages)"][usedLabelName];subScopeUsage["(modified)"]=subScopeUsage["(modified)"].concat(usage["(modified)"]),subScopeUsage["(tokens)"]=subScopeUsage["(tokens)"].concat(usage["(tokens)"]),subScopeUsage["(reassigned)"]=subScopeUsage["(reassigned)"].concat(usage["(reassigned)"]),subScopeUsage["(onlyUsedSubFunction)"]=!1}else subScope["(usages)"][usedLabelName]=usage,isUnstackingFunctionBody&&(subScope["(usages)"][usedLabelName]["(onlyUsedSubFunction)"]=!0);else if("boolean"==typeof _current["(predefined)"][usedLabelName]){if(delete declared[usedLabelName],usedPredefinedAndGlobals[usedLabelName]=marker,_current["(predefined)"][usedLabelName]===!1&&usage["(reassigned)"])for(j=0;usage["(reassigned)"].length>j;j++)warning("W020",usage["(reassigned)"][j])}else if(usage["(tokens)"])for(j=0;usage["(tokens)"].length>j;j++){var undefinedToken=usage["(tokens)"][j];undefinedToken.forgiveUndef||(state.option.undef&&!undefinedToken.ignoreUndef&&warning("W117",undefinedToken,usedLabelName),impliedGlobals[usedLabelName]?impliedGlobals[usedLabelName].line.push(undefinedToken.line):impliedGlobals[usedLabelName]={name:usedLabelName,line:[undefinedToken.line]})}}if(subScope||Object.keys(declared).forEach(function(labelNotUsed){_warnUnused(labelNotUsed,declared[labelNotUsed],"var")}),subScope&&!isUnstackingFunctionBody&&!isUnstackingFunctionParams&&!isUnstackingFunctionOuter){var labelNames=Object.keys(currentLabels);for(i=0;labelNames.length>i;i++){var defLabelName=labelNames[i];currentLabels[defLabelName]["(blockscoped)"]||"exception"===currentLabels[defLabelName]["(type)"]||this.funct.has(defLabelName,{excludeCurrent:!0})||(subScope["(labels)"][defLabelName]=currentLabels[defLabelName],"global"!==_currentFunctBody["(type)"]&&(subScope["(labels)"][defLabelName]["(useOutsideOfScope)"]=!0),delete currentLabels[defLabelName])}}_checkForUnused(),_scopeStack.pop(),isUnstackingFunctionBody&&(_currentFunctBody=_scopeStack[_.findLastIndex(_scopeStack,function(scope){return scope["(isFuncBody)"]||"global"===scope["(type)"]})]),_current=subScope},addParam:function(labelName,token,type){if(type=type||"param","exception"===type){var previouslyDefinedLabelType=this.funct.labeltype(labelName);previouslyDefinedLabelType&&"exception"!==previouslyDefinedLabelType&&(state.option.node||warning("W002",state.tokens.next,labelName))}if(_.has(_current["(labels)"],labelName)?_current["(labels)"][labelName].duplicated=!0:(_checkOuterShadow(labelName,token,type),_current["(labels)"][labelName]={"(type)":type,"(token)":token,"(unused)":!0},_current["(params)"].push(labelName)),_.has(_current["(usages)"],labelName)){var usage=_current["(usages)"][labelName];usage["(onlyUsedSubFunction)"]?_latedefWarning(type,labelName,token):warning("E056",token,labelName,type)}},validateParams:function(){if("global"!==_currentFunctBody["(type)"]){var isStrict=state.isStrict(),currentFunctParamScope=_currentFunctBody["(parent)"];currentFunctParamScope["(params)"]&¤tFunctParamScope["(params)"].forEach(function(labelName){var label=currentFunctParamScope["(labels)"][labelName];label&&label.duplicated&&(isStrict?warning("E011",label["(token)"],labelName):state.option.shadow!==!0&&warning("W004",label["(token)"],labelName))})}},getUsedOrDefinedGlobals:function(){var list=Object.keys(usedPredefinedAndGlobals);return usedPredefinedAndGlobals.__proto__===marker&&-1===list.indexOf("__proto__")&&list.push("__proto__"),list},getImpliedGlobals:function(){var values=_.values(impliedGlobals),hasProto=!1;return impliedGlobals.__proto__&&(hasProto=values.some(function(value){return"__proto__"===value.name}),hasProto||values.push(impliedGlobals.__proto__)),values},getUnuseds:function(){return unuseds},has:function(labelName){return Boolean(_getLabel(labelName))},labeltype:function(labelName){var scopeLabels=_getLabel(labelName);return scopeLabels?scopeLabels[labelName]["(type)"]:null},addExported:function(labelName){var globalLabels=_scopeStack[0]["(labels)"];if(_.has(declared,labelName))delete declared[labelName];else if(_.has(globalLabels,labelName))globalLabels[labelName]["(unused)"]=!1;else{for(var i=1;_scopeStack.length>i;i++){var scope=_scopeStack[i];if(scope["(type)"])break;if(_.has(scope["(labels)"],labelName)&&!scope["(labels)"][labelName]["(blockscoped)"])return scope["(labels)"][labelName]["(unused)"]=!1,void 0}exported[labelName]=!0}},setExported:function(labelName,token){this.block.use(labelName,token)\n},addlabel:function(labelName,opts){var type=opts.type,token=opts.token,isblockscoped="let"===type||"const"===type||"class"===type,isexported="global"===(isblockscoped?_current:_currentFunctBody)["(type)"]&&_.has(exported,labelName);if(_checkOuterShadow(labelName,token,type),isblockscoped){var declaredInCurrentScope=_current["(labels)"][labelName];if(declaredInCurrentScope||_current!==_currentFunctBody||"global"===_current["(type)"]||(declaredInCurrentScope=!!_currentFunctBody["(parent)"]["(labels)"][labelName]),!declaredInCurrentScope&&_current["(usages)"][labelName]){var usage=_current["(usages)"][labelName];usage["(onlyUsedSubFunction)"]?_latedefWarning(type,labelName,token):warning("E056",token,labelName,type)}declaredInCurrentScope?warning("E011",token,labelName):"outer"===state.option.shadow&&scopeManagerInst.funct.has(labelName)&&warning("W004",token,labelName),scopeManagerInst.block.add(labelName,type,token,!isexported)}else{var declaredInCurrentFunctionScope=scopeManagerInst.funct.has(labelName);!declaredInCurrentFunctionScope&&usedSoFarInCurrentFunction(labelName)&&_latedefWarning(type,labelName,token),scopeManagerInst.funct.has(labelName,{onlyBlockscoped:!0})?warning("E011",token,labelName):state.option.shadow!==!0&&declaredInCurrentFunctionScope&&"__proto__"!==labelName&&"global"!==_currentFunctBody["(type)"]&&warning("W004",token,labelName),scopeManagerInst.funct.add(labelName,type,token,!isexported),"global"===_currentFunctBody["(type)"]&&(usedPredefinedAndGlobals[labelName]=marker)}},funct:{labeltype:function(labelName,options){for(var onlyBlockscoped=options&&options.onlyBlockscoped,excludeParams=options&&options.excludeParams,currentScopeIndex=_scopeStack.length-(options&&options.excludeCurrent?2:1),i=currentScopeIndex;i>=0;i--){var current=_scopeStack[i];if(current["(labels)"][labelName]&&(!onlyBlockscoped||current["(labels)"][labelName]["(blockscoped)"]))return current["(labels)"][labelName]["(type)"];var scopeCheck=excludeParams?_scopeStack[i-1]:current;if(scopeCheck&&"functionparams"===scopeCheck["(type)"])return null}return null},hasBreakLabel:function(labelName){for(var i=_scopeStack.length-1;i>=0;i--){var current=_scopeStack[i];if(current["(breakLabels)"][labelName])return!0;if("functionparams"===current["(type)"])return!1}return!1},has:function(labelName,options){return Boolean(this.labeltype(labelName,options))},add:function(labelName,type,tok,unused){_current["(labels)"][labelName]={"(type)":type,"(token)":tok,"(blockscoped)":!1,"(function)":_currentFunctBody,"(unused)":unused}}},block:{isGlobal:function(){return"global"===_current["(type)"]},use:function(labelName,token){var paramScope=_currentFunctBody["(parent)"];paramScope&¶mScope["(labels)"][labelName]&&"param"===paramScope["(labels)"][labelName]["(type)"]&&(scopeManagerInst.funct.has(labelName,{excludeParams:!0,onlyBlockscoped:!0})||(paramScope["(labels)"][labelName]["(unused)"]=!1)),token&&(state.ignored.W117||state.option.undef===!1)&&(token.ignoreUndef=!0),_setupUsages(labelName),token&&(token["(function)"]=_currentFunctBody,_current["(usages)"][labelName]["(tokens)"].push(token))},reassign:function(labelName,token){this.modify(labelName,token),_current["(usages)"][labelName]["(reassigned)"].push(token)},modify:function(labelName,token){_setupUsages(labelName),_current["(usages)"][labelName]["(modified)"].push(token)},add:function(labelName,type,tok,unused){_current["(labels)"][labelName]={"(type)":type,"(token)":tok,"(blockscoped)":!0,"(unused)":unused}},addBreakLabel:function(labelName,opts){var token=opts.token;scopeManagerInst.funct.hasBreakLabel(labelName)?warning("E011",token,labelName):"outer"===state.option.shadow&&(scopeManagerInst.funct.has(labelName)?warning("W004",token,labelName):_checkOuterShadow(labelName,token)),_current["(breakLabels)"][labelName]=token}}};return scopeManagerInst};module.exports=scopeManager},{"../lodash":"/node_modules/jshint/lodash.js",events:"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/state.js":[function(_dereq_,module,exports){"use strict";var NameStack=_dereq_("./name-stack.js"),state={syntax:{},isStrict:function(){return this.directive["use strict"]||this.inClassBody||this.option.module||"implied"===this.option.strict},inMoz:function(){return this.option.moz},inES6:function(){return this.option.moz||this.option.esversion>=6},inES5:function(strict){return strict?!(this.option.esversion&&5!==this.option.esversion||this.option.moz):!this.option.esversion||this.option.esversion>=5||this.option.moz},reset:function(){this.tokens={prev:null,next:null,curr:null},this.option={},this.funct=null,this.ignored={},this.directive={},this.jsonMode=!1,this.jsonWarnings=[],this.lines=[],this.tab="",this.cache={},this.ignoredLines={},this.forinifcheckneeded=!1,this.nameStack=new NameStack,this.inClassBody=!1}};exports.state=state},{"./name-stack.js":"/node_modules/jshint/src/name-stack.js"}],"/node_modules/jshint/src/style.js":[function(_dereq_,module,exports){"use strict";exports.register=function(linter){linter.on("Identifier",function(data){linter.getOption("proto")||"__proto__"===data.name&&linter.warn("W103",{line:data.line,"char":data.char,data:[data.name,"6"]})}),linter.on("Identifier",function(data){linter.getOption("iterator")||"__iterator__"===data.name&&linter.warn("W103",{line:data.line,"char":data.char,data:[data.name]})}),linter.on("Identifier",function(data){linter.getOption("camelcase")&&data.name.replace(/^_+|_+$/g,"").indexOf("_")>-1&&!data.name.match(/^[A-Z0-9_]*$/)&&linter.warn("W106",{line:data.line,"char":data.from,data:[data.name]})}),linter.on("String",function(data){var code,quotmark=linter.getOption("quotmark");quotmark&&("single"===quotmark&&"\'"!==data.quote&&(code="W109"),"double"===quotmark&&\'"\'!==data.quote&&(code="W108"),quotmark===!0&&(linter.getCache("quotmark")||linter.setCache("quotmark",data.quote),linter.getCache("quotmark")!==data.quote&&(code="W110")),code&&linter.warn(code,{line:data.line,"char":data.char}))}),linter.on("Number",function(data){"."===data.value.charAt(0)&&linter.warn("W008",{line:data.line,"char":data.char,data:[data.value]}),"."===data.value.substr(data.value.length-1)&&linter.warn("W047",{line:data.line,"char":data.char,data:[data.value]}),/^00+/.test(data.value)&&linter.warn("W046",{line:data.line,"char":data.char,data:[data.value]})}),linter.on("String",function(data){var re=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\\s*:/i;linter.getOption("scripturl")||re.test(data.value)&&linter.warn("W107",{line:data.line,"char":data.char})})}},{}],"/node_modules/jshint/src/vars.js":[function(_dereq_,module,exports){"use strict";exports.reservedVars={arguments:!1,NaN:!1},exports.ecmaIdentifiers={3:{Array:!1,Boolean:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,isFinite:!1,isNaN:!1,Math:!1,Number:!1,Object:!1,parseInt:!1,parseFloat:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,TypeError:!1,URIError:!1},5:{JSON:!1},6:{Map:!1,Promise:!1,Proxy:!1,Reflect:!1,Set:!1,Symbol:!1,WeakMap:!1,WeakSet:!1}},exports.browser={Audio:!1,Blob:!1,addEventListener:!1,applicationCache:!1,atob:!1,blur:!1,btoa:!1,cancelAnimationFrame:!1,CanvasGradient:!1,CanvasPattern:!1,CanvasRenderingContext2D:!1,CSS:!1,clearInterval:!1,clearTimeout:!1,close:!1,closed:!1,Comment:!1,CustomEvent:!1,DOMParser:!1,defaultStatus:!1,Document:!1,document:!1,DocumentFragment:!1,Element:!1,ElementTimeControl:!1,Event:!1,event:!1,fetch:!1,FileReader:!1,FormData:!1,focus:!1,frames:!1,getComputedStyle:!1,HTMLElement:!1,HTMLAnchorElement:!1,HTMLBaseElement:!1,HTMLBlockquoteElement:!1,HTMLBodyElement:!1,HTMLBRElement:!1,HTMLButtonElement:!1,HTMLCanvasElement:!1,HTMLCollection:!1,HTMLDirectoryElement:!1,HTMLDivElement:!1,HTMLDListElement:!1,HTMLFieldSetElement:!1,HTMLFontElement:!1,HTMLFormElement:!1,HTMLFrameElement:!1,HTMLFrameSetElement:!1,HTMLHeadElement:!1,HTMLHeadingElement:!1,HTMLHRElement:!1,HTMLHtmlElement:!1,HTMLIFrameElement:!1,HTMLImageElement:!1,HTMLInputElement:!1,HTMLIsIndexElement:!1,HTMLLabelElement:!1,HTMLLayerElement:!1,HTMLLegendElement:!1,HTMLLIElement:!1,HTMLLinkElement:!1,HTMLMapElement:!1,HTMLMenuElement:!1,HTMLMetaElement:!1,HTMLModElement:!1,HTMLObjectElement:!1,HTMLOListElement:!1,HTMLOptGroupElement:!1,HTMLOptionElement:!1,HTMLParagraphElement:!1,HTMLParamElement:!1,HTMLPreElement:!1,HTMLQuoteElement:!1,HTMLScriptElement:!1,HTMLSelectElement:!1,HTMLStyleElement:!1,HTMLTableCaptionElement:!1,HTMLTableCellElement:!1,HTMLTableColElement:!1,HTMLTableElement:!1,HTMLTableRowElement:!1,HTMLTableSectionElement:!1,HTMLTemplateElement:!1,HTMLTextAreaElement:!1,HTMLTitleElement:!1,HTMLUListElement:!1,HTMLVideoElement:!1,history:!1,Image:!1,Intl:!1,length:!1,localStorage:!1,location:!1,matchMedia:!1,MessageChannel:!1,MessageEvent:!1,MessagePort:!1,MouseEvent:!1,moveBy:!1,moveTo:!1,MutationObserver:!1,name:!1,Node:!1,NodeFilter:!1,NodeList:!1,Notification:!1,navigator:!1,onbeforeunload:!0,onblur:!0,onerror:!0,onfocus:!0,onload:!0,onresize:!0,onunload:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,parent:!1,performance:!1,print:!1,Range:!1,requestAnimationFrame:!1,removeEventListener:!1,resizeBy:!1,resizeTo:!1,screen:!1,scroll:!1,scrollBy:!1,scrollTo:!1,sessionStorage:!1,setInterval:!1,setTimeout:!1,SharedWorker:!1,status:!1,SVGAElement:!1,SVGAltGlyphDefElement:!1,SVGAltGlyphElement:!1,SVGAltGlyphItemElement:!1,SVGAngle:!1,SVGAnimateColorElement:!1,SVGAnimateElement:!1,SVGAnimateMotionElement:!1,SVGAnimateTransformElement:!1,SVGAnimatedAngle:!1,SVGAnimatedBoolean:!1,SVGAnimatedEnumeration:!1,SVGAnimatedInteger:!1,SVGAnimatedLength:!1,SVGAnimatedLengthList:!1,SVGAnimatedNumber:!1,SVGAnimatedNumberList:!1,SVGAnimatedPathData:!1,SVGAnimatedPoints:!1,SVGAnimatedPreserveAspectRatio:!1,SVGAnimatedRect:!1,SVGAnimatedString:!1,SVGAnimatedTransformList:!1,SVGAnimationElement:!1,SVGCSSRule:!1,SVGCircleElement:!1,SVGClipPathElement:!1,SVGColor:!1,SVGColorProfileElement:!1,SVGColorProfileRule:!1,SVGComponentTransferFunctionElement:!1,SVGCursorElement:!1,SVGDefsElement:!1,SVGDescElement:!1,SVGDocument:!1,SVGElement:!1,SVGElementInstance:!1,SVGElementInstanceList:!1,SVGEllipseElement:!1,SVGExternalResourcesRequired:!1,SVGFEBlendElement:!1,SVGFEColorMatrixElement:!1,SVGFEComponentTransferElement:!1,SVGFECompositeElement:!1,SVGFEConvolveMatrixElement:!1,SVGFEDiffuseLightingElement:!1,SVGFEDisplacementMapElement:!1,SVGFEDistantLightElement:!1,SVGFEFloodElement:!1,SVGFEFuncAElement:!1,SVGFEFuncBElement:!1,SVGFEFuncGElement:!1,SVGFEFuncRElement:!1,SVGFEGaussianBlurElement:!1,SVGFEImageElement:!1,SVGFEMergeElement:!1,SVGFEMergeNodeElement:!1,SVGFEMorphologyElement:!1,SVGFEOffsetElement:!1,SVGFEPointLightElement:!1,SVGFESpecularLightingElement:!1,SVGFESpotLightElement:!1,SVGFETileElement:!1,SVGFETurbulenceElement:!1,SVGFilterElement:!1,SVGFilterPrimitiveStandardAttributes:!1,SVGFitToViewBox:!1,SVGFontElement:!1,SVGFontFaceElement:!1,SVGFontFaceFormatElement:!1,SVGFontFaceNameElement:!1,SVGFontFaceSrcElement:!1,SVGFontFaceUriElement:!1,SVGForeignObjectElement:!1,SVGGElement:!1,SVGGlyphElement:!1,SVGGlyphRefElement:!1,SVGGradientElement:!1,SVGHKernElement:!1,SVGICCColor:!1,SVGImageElement:!1,SVGLangSpace:!1,SVGLength:!1,SVGLengthList:!1,SVGLineElement:!1,SVGLinearGradientElement:!1,SVGLocatable:!1,SVGMPathElement:!1,SVGMarkerElement:!1,SVGMaskElement:!1,SVGMatrix:!1,SVGMetadataElement:!1,SVGMissingGlyphElement:!1,SVGNumber:!1,SVGNumberList:!1,SVGPaint:!1,SVGPathElement:!1,SVGPathSeg:!1,SVGPathSegArcAbs:!1,SVGPathSegArcRel:!1,SVGPathSegClosePath:!1,SVGPathSegCurvetoCubicAbs:!1,SVGPathSegCurvetoCubicRel:!1,SVGPathSegCurvetoCubicSmoothAbs:!1,SVGPathSegCurvetoCubicSmoothRel:!1,SVGPathSegCurvetoQuadraticAbs:!1,SVGPathSegCurvetoQuadraticRel:!1,SVGPathSegCurvetoQuadraticSmoothAbs:!1,SVGPathSegCurvetoQuadraticSmoothRel:!1,SVGPathSegLinetoAbs:!1,SVGPathSegLinetoHorizontalAbs:!1,SVGPathSegLinetoHorizontalRel:!1,SVGPathSegLinetoRel:!1,SVGPathSegLinetoVerticalAbs:!1,SVGPathSegLinetoVerticalRel:!1,SVGPathSegList:!1,SVGPathSegMovetoAbs:!1,SVGPathSegMovetoRel:!1,SVGPatternElement:!1,SVGPoint:!1,SVGPointList:!1,SVGPolygonElement:!1,SVGPolylineElement:!1,SVGPreserveAspectRatio:!1,SVGRadialGradientElement:!1,SVGRect:!1,SVGRectElement:!1,SVGRenderingIntent:!1,SVGSVGElement:!1,SVGScriptElement:!1,SVGSetElement:!1,SVGStopElement:!1,SVGStringList:!1,SVGStylable:!1,SVGStyleElement:!1,SVGSwitchElement:!1,SVGSymbolElement:!1,SVGTRefElement:!1,SVGTSpanElement:!1,SVGTests:!1,SVGTextContentElement:!1,SVGTextElement:!1,SVGTextPathElement:!1,SVGTextPositioningElement:!1,SVGTitleElement:!1,SVGTransform:!1,SVGTransformList:!1,SVGTransformable:!1,SVGURIReference:!1,SVGUnitTypes:!1,SVGUseElement:!1,SVGVKernElement:!1,SVGViewElement:!1,SVGViewSpec:!1,SVGZoomAndPan:!1,Text:!1,TextDecoder:!1,TextEncoder:!1,TimeEvent:!1,top:!1,URL:!1,WebGLActiveInfo:!1,WebGLBuffer:!1,WebGLContextEvent:!1,WebGLFramebuffer:!1,WebGLProgram:!1,WebGLRenderbuffer:!1,WebGLRenderingContext:!1,WebGLShader:!1,WebGLShaderPrecisionFormat:!1,WebGLTexture:!1,WebGLUniformLocation:!1,WebSocket:!1,window:!1,Window:!1,Worker:!1,XDomainRequest:!1,XMLHttpRequest:!1,XMLSerializer:!1,XPathEvaluator:!1,XPathException:!1,XPathExpression:!1,XPathNamespace:!1,XPathNSResolver:!1,XPathResult:!1},exports.devel={alert:!1,confirm:!1,console:!1,Debug:!1,opera:!1,prompt:!1},exports.worker={importScripts:!0,postMessage:!0,self:!0,FileReaderSync:!0},exports.nonstandard={escape:!1,unescape:!1},exports.couch={require:!1,respond:!1,getRow:!1,emit:!1,send:!1,start:!1,sum:!1,log:!1,exports:!1,module:!1,provides:!1},exports.node={__filename:!1,__dirname:!1,GLOBAL:!1,global:!1,module:!1,acequire:!1,Buffer:!0,console:!0,exports:!0,process:!0,setTimeout:!0,clearTimeout:!0,setInterval:!0,clearInterval:!0,setImmediate:!0,clearImmediate:!0},exports.browserify={__filename:!1,__dirname:!1,global:!1,module:!1,acequire:!1,Buffer:!0,exports:!0,process:!0},exports.phantom={phantom:!0,acequire:!0,WebPage:!0,console:!0,exports:!0},exports.qunit={asyncTest:!1,deepEqual:!1,equal:!1,expect:!1,module:!1,notDeepEqual:!1,notEqual:!1,notPropEqual:!1,notStrictEqual:!1,ok:!1,propEqual:!1,QUnit:!1,raises:!1,start:!1,stop:!1,strictEqual:!1,test:!1,"throws":!1},exports.rhino={defineClass:!1,deserialize:!1,gc:!1,help:!1,importClass:!1,importPackage:!1,java:!1,load:!1,loadClass:!1,Packages:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},exports.shelljs={target:!1,echo:!1,exit:!1,cd:!1,pwd:!1,ls:!1,find:!1,cp:!1,rm:!1,mv:!1,mkdir:!1,test:!1,cat:!1,sed:!1,grep:!1,which:!1,dirs:!1,pushd:!1,popd:!1,env:!1,exec:!1,chmod:!1,config:!1,error:!1,tempdir:!1},exports.typed={ArrayBuffer:!1,ArrayBufferView:!1,DataView:!1,Float32Array:!1,Float64Array:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1},exports.wsh={ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WSH:!0,WScript:!0,XDomainRequest:!0},exports.dojo={dojo:!1,dijit:!1,dojox:!1,define:!1,require:!1},exports.jquery={$:!1,jQuery:!1},exports.mootools={$:!1,$$:!1,Asset:!1,Browser:!1,Chain:!1,Class:!1,Color:!1,Cookie:!1,Core:!1,Document:!1,DomReady:!1,DOMEvent:!1,DOMReady:!1,Drag:!1,Element:!1,Elements:!1,Event:!1,Events:!1,Fx:!1,Group:!1,Hash:!1,HtmlTable:!1,IFrame:!1,IframeShim:!1,InputValidator:!1,instanceOf:!1,Keyboard:!1,Locale:!1,Mask:!1,MooTools:!1,Native:!1,Options:!1,OverText:!1,Request:!1,Scroller:!1,Slick:!1,Slider:!1,Sortables:!1,Spinner:!1,Swiff:!1,Tips:!1,Type:!1,typeOf:!1,URI:!1,Window:!1},exports.prototypejs={$:!1,$$:!1,$A:!1,$F:!1,$H:!1,$R:!1,$break:!1,$continue:!1,$w:!1,Abstract:!1,Ajax:!1,Class:!1,Enumerable:!1,Element:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Selector:!1,Template:!1,Toggle:!1,Try:!1,Autocompleter:!1,Builder:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Scriptaculous:!1},exports.yui={YUI:!1,Y:!1,YUI_config:!1},exports.mocha={mocha:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,context:!1,xcontext:!1,before:!1,after:!1,beforeEach:!1,afterEach:!1,suite:!1,test:!1,setup:!1,teardown:!1,suiteSetup:!1,suiteTeardown:!1},exports.jasmine={jasmine:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,beforeEach:!1,afterEach:!1,setFixtures:!1,loadFixtures:!1,spyOn:!1,expect:!1,runs:!1,waitsFor:!1,waits:!1,beforeAll:!1,afterAll:!1,fail:!1,fdescribe:!1,fit:!1,pending:!1}},{}]},{},["/node_modules/jshint/src/jshint.js"])}),ace.define("ace/mode/javascript_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/javascript/jshint"],function(acequire,exports,module){"use strict";function startRegex(arr){return RegExp("^("+arr.join("|")+")")}var oop=acequire("../lib/oop"),Mirror=acequire("../worker/mirror").Mirror,lint=acequire("./javascript/jshint").JSHINT,disabledWarningsRe=startRegex(["Bad for in variable \'(.+)\'.",\'Missing "use strict"\']),errorsRe=startRegex(["Unexpected","Expected ","Confusing (plus|minus)","\\\\{a\\\\} unterminated regular expression","Unclosed ","Unmatched ","Unbegun comment","Bad invocation","Missing space after","Missing operator at"]),infoRe=startRegex(["Expected an assignment","Bad escapement of EOL","Unexpected comma","Unexpected space","Missing radix parameter.","A leading decimal point can","\\\\[\'{a}\'\\\\] is better written in dot notation.","\'{a}\' used out of scope"]),JavaScriptWorker=exports.JavaScriptWorker=function(sender){Mirror.call(this,sender),this.setTimeout(500),this.setOptions()};oop.inherits(JavaScriptWorker,Mirror),function(){this.setOptions=function(options){this.options=options||{esnext:!0,moz:!0,devel:!0,browser:!0,node:!0,laxcomma:!0,laxbreak:!0,lastsemic:!0,onevar:!1,passfail:!1,maxerr:100,expr:!0,multistr:!0,globalstrict:!0},this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.changeOptions=function(newOptions){oop.mixin(this.options,newOptions),this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.isValidJS=function(str){try{eval("throw 0;"+str)}catch(e){if(0===e)return!0}return!1},this.onUpdate=function(){var value=this.doc.getValue();if(value=value.replace(/^#!.*\\n/,"\\n"),!value)return this.sender.emit("annotate",[]);var errors=[],maxErrorLevel=this.isValidJS(value)?"warning":"error";lint(value,this.options,this.options.globals);for(var results=lint.errors,errorAdded=!1,i=0;results.length>i;i++){var error=results[i];if(error){var raw=error.raw,type="warning";if("Missing semicolon."==raw){var str=error.evidence.substr(error.character);str=str.charAt(str.search(/\\S/)),"error"==maxErrorLevel&&str&&/[\\w\\d{([\'"]/.test(str)?(error.reason=\'Missing ";" before statement\',type="error"):type="info"}else{if(disabledWarningsRe.test(raw))continue;infoRe.test(raw)?type="info":errorsRe.test(raw)?(errorAdded=!0,type=maxErrorLevel):"\'{a}\' is not defined."==raw?type="warning":"\'{a}\' is defined but never used."==raw&&(type="info")}errors.push({row:error.line-1,column:error.character-1,text:error.reason,type:type,raw:raw})}}this.sender.emit("annotate",errors)}}.call(JavaScriptWorker.prototype)}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(){function Empty(){}function doesDefinePropertyWork(object){try{return Object.defineProperty(object,"sentinel",{}),"sentinel"in object}catch(exception){}}function toInteger(n){return n=+n,n!==n?n=0:0!==n&&n!==1/0&&n!==-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n}Function.prototype.bind||(Function.prototype.bind=function(that){var target=this;if("function"!=typeof target)throw new TypeError("Function.prototype.bind called on incompatible "+target);var args=slice.call(arguments,1),bound=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))};return target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound});var defineGetter,defineSetter,lookupGetter,lookupSetter,supportsAccessors,call=Function.prototype.call,prototypeOfArray=Array.prototype,prototypeOfObject=Object.prototype,slice=prototypeOfArray.slice,_toString=call.bind(prototypeOfObject.toString),owns=call.bind(prototypeOfObject.hasOwnProperty);if((supportsAccessors=owns(prototypeOfObject,"__defineGetter__"))&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function makeArray(l){var a=Array(l+2);return a[0]=a[1]=0,a}var lengthBefore,array=[];return array.splice.apply(array,makeArray(20)),array.splice.apply(array,makeArray(26)),lengthBefore=array.length,array.splice(5,0,"XXX"),lengthBefore+1==array.length,lengthBefore+1==array.length?!0:void 0}()){var array_splice=Array.prototype.splice;Array.prototype.splice=function(start,deleteCount){return arguments.length?array_splice.apply(this,[void 0===start?0:start,void 0===deleteCount?this.length-start:deleteCount].concat(slice.call(arguments,2))):[]}}else Array.prototype.splice=function(pos,removeCount){var length=this.length;pos>0?pos>length&&(pos=length):void 0==pos?pos=0:0>pos&&(pos=Math.max(length+pos,0)),length>pos+removeCount||(removeCount=length-pos);var removed=this.slice(pos,pos+removeCount),insert=slice.call(arguments,2),add=insert.length;if(pos===length)add&&this.push.apply(this,insert);else{var remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove;if(tailOldPos>tailNewPos)for(var i=0;tailCount>i;++i)this[tailNewPos+i]=this[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)this[tailNewPos+i]=this[tailOldPos+i];if(add&&pos===lengthAfterRemove)this.length=lengthAfterRemove,this.push.apply(this,insert);else for(this.length=lengthAfterRemove+add,i=0;add>i;++i)this[pos+i]=insert[i]}return removed};Array.isArray||(Array.isArray=function(obj){return"[object Array]"==_toString(obj)});var boxedString=Object("a"),splitString="a"!=boxedString[0]||!(0 in boxedString);if(Array.prototype.forEach||(Array.prototype.forEach=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,thisp=arguments[1],i=-1,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError;for(;length>++i;)i in self&&fun.call(thisp,self[i],i,object)}),Array.prototype.map||(Array.prototype.map=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=Array(length),thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(result[i]=fun.call(thisp,self[i],i,object));return result}),Array.prototype.filter||(Array.prototype.filter=function(fun){var value,object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=[],thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(value=self[i],fun.call(thisp,value,i,object)&&result.push(value));return result}),Array.prototype.every||(Array.prototype.every=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&!fun.call(thisp,self[i],i,object))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&fun.call(thisp,self[i],i,object))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError("reduce of empty array with no initial value")}for(;length>i;i++)i in self&&(result=fun.call(void 0,result,self[i],i,object));return result}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var result,i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(0>--i)throw new TypeError("reduceRight of empty array with no initial value")}do i in this&&(result=fun.call(void 0,result,self[i],i,object));while(i--);return result}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=0;for(arguments.length>1&&(i=toInteger(arguments[1])),i=i>=0?i:Math.max(0,length+i);length>i;i++)if(i in self&&self[i]===sought)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=length-1;for(arguments.length>1&&(i=Math.min(i,toInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&sought===self[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(object){return object.__proto__||(object.constructor?object.constructor.prototype:prototypeOfObject)}),!Object.getOwnPropertyDescriptor){var ERR_NON_OBJECT="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(object,property){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT+object);if(owns(object,property)){var descriptor,getter,setter;if(descriptor={enumerable:!0,configurable:!0},supportsAccessors){var prototype=object.__proto__;object.__proto__=prototypeOfObject;var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(object.__proto__=prototype,getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(object){return Object.keys(object)}),!Object.create){var createEmpty;createEmpty=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var empty={};for(var i in empty)empty[i]=null;return empty.constructor=empty.hasOwnProperty=empty.propertyIsEnumerable=empty.isPrototypeOf=empty.toLocaleString=empty.toString=empty.valueOf=empty.__proto__=null,empty},Object.create=function(prototype,properties){var object;if(null===prototype)object=createEmpty();else{if("object"!=typeof prototype)throw new TypeError("typeof prototype["+typeof prototype+"] != \'object\'");var Type=function(){};Type.prototype=prototype,object=new Type,object.__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}if(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom="undefined"==typeof document||doesDefinePropertyWork(document.createElement("div"));if(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty}if(!Object.defineProperty||definePropertyFallback){var ERR_NON_OBJECT_DESCRIPTOR="Property description must be an object: ",ERR_NON_OBJECT_TARGET="Object.defineProperty called on non-object: ",ERR_ACCESSORS_NOT_SUPPORTED="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(object,property,descriptor){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT_TARGET+object);if("object"!=typeof descriptor&&"function"!=typeof descriptor||null===descriptor)throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if(owns(descriptor,"value"))if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{if(!supportsAccessors)throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);owns(descriptor,"get")&&defineGetter(object,property,descriptor.get),owns(descriptor,"set")&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties||(Object.defineProperties=function(object,properties){for(var property in properties)owns(properties,property)&&Object.defineProperty(object,property,properties[property]);return object}),Object.seal||(Object.seal=function(object){return object}),Object.freeze||(Object.freeze=function(object){return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=function(freezeObject){return function(object){return"function"==typeof object?object:freezeObject(object)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(object){return object}),Object.isSealed||(Object.isSealed=function(){return!1}),Object.isFrozen||(Object.isFrozen=function(){return!1}),Object.isExtensible||(Object.isExtensible=function(object){if(Object(object)===object)throw new TypeError;for(var name="";owns(object,name);)name+="?";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue}),!Object.keys){var hasDontEnumBug=!0,dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],dontEnumsLength=dontEnums.length;for(var key in{toString:null})hasDontEnumBug=!1;Object.keys=function(object){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError("Object.keys called on a non-object");var keys=[];for(var name in object)owns(object,name)&&keys.push(name);if(hasDontEnumBug)for(var i=0,ii=dontEnumsLength;ii>i;i++){var dontEnum=dontEnums[i];owns(object,dontEnum)&&keys.push(dontEnum)}return keys}}Date.now||(Date.now=function(){return(new Date).getTime()});var ws="\t\\n\v\\f\\r   ᠎              \\u2028\\u2029\ufeff";if(!String.prototype.trim||ws.trim()){ws="["+ws+"]";var trimBeginRegexp=RegExp("^"+ws+ws+"*"),trimEndRegexp=RegExp(ws+ws+"*$");String.prototype.trim=function(){return(this+"").replace(trimBeginRegexp,"").replace(trimEndRegexp,"")}}var toObject=function(o){if(null==o)throw new TypeError("can\'t convert "+o+" to object");return Object(o)}});'},"6da8":function(e,t){function n(e){return e.split("")}e.exports=n},"6eba":function(e,t,n){var i=n("23e7");i({target:"Date",stat:!0},{now:function(){return(new Date).getTime()}})},"6eeb":function(e,t,n){var i=n("da84"),r=n("9112"),s=n("5135"),a=n("ce4e"),o=n("8925"),c=n("69f3"),l=c.get,u=c.enforce,d=String(String).split("String");(e.exports=function(e,t,n,o){var c,l=!!o&&!!o.unsafe,h=!!o&&!!o.enumerable,f=!!o&&!!o.noTargetGet;"function"==typeof n&&("string"!=typeof t||s(n,"name")||r(n,"name",t),c=u(n),c.source||(c.source=d.join("string"==typeof t?t:""))),e!==i?(l?!f&&e[t]&&(h=!0):delete e[t],h?e[t]=n:r(e,t,n)):h?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&l(this).source||o(this)}))},"6f53":function(e,t,n){var i=n("83ab"),r=n("df75"),s=n("fc6a"),a=n("d1e7").f,o=function(e){return function(t){var n,o=s(t),c=r(o),l=c.length,u=0,d=[];while(l>u)n=c[u++],i&&!a.call(o,n)||d.push(e?[n,o[n]]:o[n]);return d}};e.exports={entries:o(!0),values:o(!1)}},7039:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("057f").f,a=r((function(){return!Object.getOwnPropertyNames(1)}));i({target:"Object",stat:!0,forced:a},{getOwnPropertyNames:s})},7156:function(e,t,n){var i=n("861d"),r=n("d2bb");e.exports=function(e,t,n){var s,a;return r&&"function"==typeof(s=t.constructor)&&s!==n&&i(a=s.prototype)&&a!==n.prototype&&r(e,a),e}},"715b":function(e,t,n){"use strict";n("8746")},"72f7":function(e,t,n){"use strict";var i=n("ebb5").exportTypedArrayMethod,r=n("d039"),s=n("da84"),a=s.Uint8Array,o=a&&a.prototype||{},c=[].toString,l=[].join;r((function(){c.call({})}))&&(c=function(){return l.call(this)});var u=o.toString!=c;i("toString",c,u)},"735e":function(e,t,n){"use strict";var i=n("ebb5"),r=n("81d5"),s=i.aTypedArray,a=i.exportTypedArrayMethod;a("fill",(function(e){return r.apply(s(this),arguments)}))},"73d9":function(e,t,n){var i=n("44d2");i("flatMap")},"73f5":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("vui-group",[n("vui-group-item",{attrs:{label:"ID:"}},[e._v(e._s(e.active_virus.id))]),n("vui-group-item",{attrs:{label:"Description:"},domProps:{innerHTML:e._s(e.active_virus.description)}}),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(32&e.editable)>0,path:"active_virus.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1)],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},7418:function(e,t){t.f=Object.getOwnPropertySymbols},"746f":function(e,t,n){var i=n("428f"),r=n("5135"),s=n("e538"),a=n("9bf2").f;e.exports=function(e){var t=i.Symbol||(i.Symbol={});r(t,e)||a(t,e,{value:s.f(e)})}},"74e7":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"item"},[n("td",{attrs:{colspan:"2"}},[e._t("default")],2)])},r=[],s={},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"74e8":function(e,t,n){"use strict";var i=n("23e7"),r=n("da84"),s=n("83ab"),a=n("8aa7"),o=n("ebb5"),c=n("621a"),l=n("19aa"),u=n("5c6c"),d=n("9112"),h=n("50c4"),f=n("0b25"),p=n("182d"),g=n("c04e"),m=n("5135"),v=n("f5df"),b=n("861d"),y=n("7c73"),w=n("d2bb"),_=n("241c").f,x=n("a078"),k=n("b727").forEach,A=n("2626"),C=n("9bf2"),E=n("06cf"),S=n("69f3"),F=n("7156"),$=S.get,T=S.set,L=C.f,D=E.f,B=Math.round,R=r.RangeError,O=c.ArrayBuffer,M=c.DataView,j=o.NATIVE_ARRAY_BUFFER_VIEWS,I=o.TYPED_ARRAY_TAG,P=o.TypedArray,N=o.TypedArrayPrototype,W=o.aTypedArrayConstructor,H=o.isTypedArray,V="BYTES_PER_ELEMENT",U="Wrong length",z=function(e,t){var n=0,i=t.length,r=new(W(e))(i);while(i>n)r[n]=t[n++];return r},G=function(e,t){L(e,t,{get:function(){return $(this)[t]}})},q=function(e){var t;return e instanceof O||"ArrayBuffer"==(t=v(e))||"SharedArrayBuffer"==t},K=function(e,t){return H(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},Y=function(e,t){return K(e,t=g(t,!0))?u(2,e[t]):D(e,t)},X=function(e,t,n){return!(K(e,t=g(t,!0))&&b(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?L(e,t,n):(e[t]=n.value,e)};s?(j||(E.f=Y,C.f=X,G(N,"buffer"),G(N,"byteOffset"),G(N,"byteLength"),G(N,"length")),i({target:"Object",stat:!0,forced:!j},{getOwnPropertyDescriptor:Y,defineProperty:X}),e.exports=function(e,t,n){var s=e.match(/\d+$/)[0]/8,o=e+(n?"Clamped":"")+"Array",c="get"+e,u="set"+e,g=r[o],m=g,v=m&&m.prototype,C={},E=function(e,t){var n=$(e);return n.view[c](t*s+n.byteOffset,!0)},S=function(e,t,i){var r=$(e);n&&(i=(i=B(i))<0?0:i>255?255:255&i),r.view[u](t*s+r.byteOffset,i,!0)},D=function(e,t){L(e,t,{get:function(){return E(this,t)},set:function(e){return S(this,t,e)},enumerable:!0})};j?a&&(m=t((function(e,t,n,i){return l(e,m,o),F(function(){return b(t)?q(t)?void 0!==i?new g(t,p(n,s),i):void 0!==n?new g(t,p(n,s)):new g(t):H(t)?z(m,t):x.call(m,t):new g(f(t))}(),e,m)})),w&&w(m,P),k(_(g),(function(e){e in m||d(m,e,g[e])})),m.prototype=v):(m=t((function(e,t,n,i){l(e,m,o);var r,a,c,u=0,d=0;if(b(t)){if(!q(t))return H(t)?z(m,t):x.call(m,t);r=t,d=p(n,s);var g=t.byteLength;if(void 0===i){if(g%s)throw R(U);if(a=g-d,a<0)throw R(U)}else if(a=h(i)*s,a+d>g)throw R(U);c=a/s}else c=f(t),a=c*s,r=new O(a);T(e,{buffer:r,byteOffset:d,byteLength:a,length:c,view:new M(r)});while(u>1,m=23===t?r(2,-24)-r(2,-77):0,v=e<0||0===e&&1/e<0?1:0,b=0;for(e=i(e),e!=e||e===n?(u=e!=e?1:0,l=p):(l=s(a(e)/o),e*(d=r(2,-l))<1&&(l--,d*=2),e+=l+g>=1?m/d:m*r(2,1-g),e*d>=2&&(l++,d/=2),l+g>=p?(u=0,l=p):l+g>=1?(u=(e*d-1)*r(2,t),l+=g):(u=e*r(2,g-1)*r(2,t),l=0));t>=8;h[b++]=255&u,u/=256,t-=8);for(l=l<0;h[b++]=255&l,l/=256,f-=8);return h[--b]|=128*v,h},l=function(e,t){var i,s=e.length,a=8*s-t-1,o=(1<>1,l=a-7,u=s-1,d=e[u--],h=127&d;for(d>>=7;l>0;h=256*h+e[u],u--,l-=8);for(i=h&(1<<-l)-1,h>>=-l,l+=t;l>0;i=256*i+e[u],u--,l-=8);if(0===h)h=1-c;else{if(h===o)return i?NaN:d?-n:n;i+=r(2,t),h-=c}return(d?-1:1)*i*r(2,h-t)};e.exports={pack:c,unpack:l}},"77f3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("vui-group",[n("vui-group-row",[n("h3",[e._v("Pump Status")])]),n("vui-group-item",{attrs:{label:"Tank Pressure:"}},[e._v(" "+e._s(e.tankPressure)+" kPa ")]),n("vui-group-item",{attrs:{label:"Port Status:"}},[n("span",{class:e.portConnected?"good":"average"},[e._v(e._s(e.portConnected?"Connected":"Disconnected"))])]),n("vui-group-item",{attrs:{label:"Load:"}},[e._v(" "+e._s(e.powerDraw)+" W ")]),n("vui-group-item",{attrs:{label:"Cell Charge:"}},[n("vui-progress",{attrs:{value:e.cellCharge,min:0,max:e.cellMaxCharge}})],1),n("vui-group-row",[n("h3",[e._v("Holding Tank Status")])]),e.hasHoldingTank?n("vui-group-item",{attrs:{label:"Tank Label:"}},[e._v(" "+e._s(e.holdingTank.name)+" "),n("vui-button",{attrs:{icon:"eject",params:{remove_tank:1}}},[e._v("Eject")])],1):e._e(),e.hasHoldingTank?n("vui-group-item",{attrs:{label:"Tank Pressure:"}},[e._v(e._s(e.holdingTank.tankPressure)+" kPa")]):n("vui-group-row",[n("span",{staticClass:"average"},[n("i",[e._v("No holding tank inserted.")])])]),n("vui-group-row",[n("h3",[e._v("Power Regulator Status")])]),n("vui-group-item",{attrs:{label:"Target Pressure:"}},[n("vui-progress",{attrs:{value:e.targetpressure,min:e.minpressure,max:e.maxpressure}}),n("div",{staticStyle:{float:"left",clear:"both","padding-top":"4px","text-align":"center"}},[n("vui-input-numeric",{attrs:{min:e.minpressure,max:e.maxpressure,"min-button":"","max-button":"",width:"4em","button-count":0},on:{input:function(t){return e.s({pressure_set:e.targetpressure})}},model:{value:e.targetpressure,callback:function(t){e.targetpressure=t},expression:"targetpressure"}})],1)],1),n("vui-group-item",{attrs:{label:"Power Switch:"}},[n("vui-button",{class:{selected:e.on},attrs:{icon:e.on?"power-off":"times",params:{power:1}}},[e._v(e._s(e.on?"On":"Off"))])],1),n("vui-group-item",{attrs:{label:"Pump Direction:"}},[n("vui-button",{attrs:{icon:"share",flip:e.pump_dir?"horizontal":"",params:{direction:1}}},[e._v(e._s(e.pump_dir?"Out":"In"))])],1)],1)},r=[],s=n("025e"),a={data:function(){return this.$root.$data.state},methods:{s:function(e){s["a"].sendToTopic(e)}}},o=a,c=(n("c7ef"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"0cce4ea8",null);t["default"]=l.exports},7839:function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},7898:function(e,t,n){var i=n("23e7"),r=n("8eb5"),s=Math.exp;i({target:"Math",stat:!0},{tanh:function(e){var t=r(e=+e),n=r(-e);return t==1/0?1:n==1/0?-1:(t-n)/(s(e)+s(-e))}})},7938:function(e,t,n){},7948:function(e,t){function n(e,t){var n=-1,i=null==e?0:e.length,r=Array(i);while(++n0)},{asinh:o})},"7a82":function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("9bf2");i({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperty:s.f})},"7b0b":function(e,t,n){var i=n("1d80");e.exports=function(e){return Object(i(e))}},"7c73":function(e,t,n){var i,r=n("825a"),s=n("37e8"),a=n("7839"),o=n("d012"),c=n("1be4"),l=n("cc12"),u=n("f772"),d=">",h="<",f="prototype",p="script",g=u("IE_PROTO"),m=function(){},v=function(e){return h+p+d+e+h+"/"+p+d},b=function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t},y=function(){var e,t=l("iframe"),n="java"+p+":";return t.style.display="none",c.appendChild(t),t.src=String(n),e=t.contentWindow.document,e.open(),e.write(v("document.F=Object")),e.close(),e.F},w=function(){try{i=document.domain&&new ActiveXObject("htmlfile")}catch(t){}w=i?b(i):y();var e=a.length;while(e--)delete w[f][a[e]];return w()};o[g]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(m[f]=r(e),n=new m,m[f]=null,n[g]=e):n=w(),void 0===t?n:s(n,t)}},"7c9e":function(e,t,n){var i=n("061c");e.exports={render:function(e){var t=this.height?this.px(this.height):"100%",n=this.width?this.px(this.width):"100%";return e("div",{attrs:{style:"height: "+t+"; width: "+n}})},props:{value:String,lang:!0,theme:String,height:!0,width:!0,options:Object},data:function(){return{editor:null,contentBackup:""}},methods:{px:function(e){return/^\d*$/.test(e)?e+"px":e}},watch:{value:function(e){this.contentBackup!==e&&(this.editor.session.setValue(e,1),this.contentBackup=e)},theme:function(e){this.editor.setTheme("ace/theme/"+e)},lang:function(e){this.editor.getSession().setMode("string"===typeof e?"ace/mode/"+e:e)},options:function(e){this.editor.setOptions(e)},height:function(){this.$nextTick((function(){this.editor.resize()}))},width:function(){this.$nextTick((function(){this.editor.resize()}))}},beforeDestroy:function(){this.editor.destroy(),this.editor.container.remove()},mounted:function(){var e=this,t=this.lang||"text",r=this.theme||"chrome";n("b378");var s=e.editor=i.edit(this.$el);s.$blockScrolling=1/0,this.$emit("init",s),s.getSession().setMode("string"===typeof t?"ace/mode/"+t:t),s.setTheme("ace/theme/"+r),this.value&&s.setValue(this.value,1),this.contentBackup=this.value,s.on("change",(function(){var t=s.getValue();e.$emit("input",t),e.contentBackup=t})),e.options&&s.setOptions(e.options)}}},"7da4":function(e,t,n){},"7db0":function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").find,s=n("44d2"),a=n("ae40"),o="find",c=!0,l=a(o);o in[]&&Array(1)[o]((function(){c=!1})),i({target:"Array",proto:!0,forced:c||!l},{find:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),s(o)},"7dc4":function(e,t,n){"use strict";n("592e")},"7dc7":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[0==e.s.mode||0==e.s.sel_price?[n("div",{staticClass:"cancel-button"},[n("vui-input-search",{attrs:{input:e.products,keys:["name"],autofocus:"",threshold:e.threshold},model:{value:e.output,callback:function(t){e.output=t},expression:"output"}}),n("vui-button",{attrs:{disabled:!e.s.coin,params:{remove_coin:1},icon:"sign-out-alt"}},[e._v(e._s(e.s.coin?e.s.coin:"No coin inserted."))])],1),n("div",{staticClass:"t-parent"},e._l(e.output,(function(t){return n("vui-button",{key:t.key,staticClass:"t-child tooltip",class:t.amount>0?"":"no-stock",attrs:{disabled:0==t.amount||1==e.s.mode,params:{vendItem:t.key}}},[n("div",{staticClass:"t-container",style:{height:e.s.ui_size+"px",width:e.s.ui_size+"px"}},[n("span",{staticClass:"food-icon",class:[t.amount>0?"":"no-stock",t.icon_tag]}),t.price>0?n("span",{staticClass:"cart-icon fas ic-shopping-cart"}):e._e(),t.price>0?n("span",{staticClass:"price"},[e._v(e._s(t.price)+"电")]):e._e(),n("span",{staticClass:"qty",class:t.amount>0?"":"no-stock"},[e._v("(x"+e._s(t.amount)+")")])]),n("span",{staticClass:"tooltiptext"},[e._v(e._s(t.name))])])})),1)]:e.s.sel_name&&e.s.sel_price>0?[n("div",{staticClass:"t-parent"},[n("p",[e._v("Item selected:"),n("span",{staticClass:"purchase-icon",class:e.s.sel_icon}),e._v(e._s(e.s.sel_name))]),n("p",[e._v("Charge: "+e._s(e.s.sel_price)+"电 / "+e._s(e.s.sel_price)+"cr")]),n("p",[e._v("Swipe your NanoTrasen ID or insert credits to purchase.")]),1==e.s.message_err?n("p",{staticClass:"danger"},[e._v(e._s(e.s.message))]):e._e(),n("div",{staticClass:"cancel-button"},[n("vui-button",{attrs:{params:{cancelpurchase:1},icon:"undo"}},[e._v("Cancel Transaction")])],1)])]:[n("vui-button",{staticClass:"cancel-button danger",attrs:{params:{reset:1},icon:"undo"}},[e._v("Reset Machine")])]],2)},r=[],s=(n("07ac"),{data:function(){return{s:this.$root.$data.state,output:[],threshold:.3}},computed:{products:function(){return Object.values(this.s.products)}}}),a=s,o=(n("fe33"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"2633030c",null);t["default"]=c.exports},"7dd0":function(e,t,n){"use strict";var i=n("23e7"),r=n("9ed3"),s=n("e163"),a=n("d2bb"),o=n("d44e"),c=n("9112"),l=n("6eeb"),u=n("b622"),d=n("c430"),h=n("3f8c"),f=n("ae93"),p=f.IteratorPrototype,g=f.BUGGY_SAFARI_ITERATORS,m=u("iterator"),v="keys",b="values",y="entries",w=function(){return this};e.exports=function(e,t,n,u,f,_,x){r(n,t,u);var k,A,C,E=function(e){if(e===f&&L)return L;if(!g&&e in $)return $[e];switch(e){case v:return function(){return new n(this,e)};case b:return function(){return new n(this,e)};case y:return function(){return new n(this,e)}}return function(){return new n(this)}},S=t+" Iterator",F=!1,$=e.prototype,T=$[m]||$["@@iterator"]||f&&$[f],L=!g&&T||E(f),D="Array"==t&&$.entries||T;if(D&&(k=s(D.call(new e)),p!==Object.prototype&&k.next&&(d||s(k)===p||(a?a(k,p):"function"!=typeof k[m]&&c(k,m,w)),o(k,S,!0,!0),d&&(h[S]=w))),f==b&&T&&T.name!==b&&(F=!0,L=function(){return T.call(this)}),d&&!x||$[m]===L||c($,m,L),h[t]=L,f)if(A={values:E(b),keys:_?L:E(v),entries:E(y)},x)for(C in A)(g||F||!(C in $))&&l($,C,A[C]);else i({target:t,proto:!0,forced:g||F},A);return A}},"7e12":function(e,t,n){var i=n("da84"),r=n("58a8").trim,s=n("5899"),a=i.parseFloat,o=1/a(s+"-0")!==-1/0;e.exports=o?function(e){var t=r(String(e)),n=a(t);return 0===n&&"-"==t.charAt(0)?-0:n}:a},"7e8e":function(e,t){var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function i(e){return n.test(e)}e.exports=i},"7ed3":function(e,t,n){var i=n("23e7"),r=n("825a"),s=n("861d"),a=n("5135"),o=n("d039"),c=n("9bf2"),l=n("06cf"),u=n("e163"),d=n("5c6c");function h(e,t,n){var i,o,f=arguments.length<4?e:arguments[3],p=l.f(r(e),t);if(!p){if(s(o=u(e)))return h(o,t,n,f);p=d(0)}if(a(p,"value")){if(!1===p.writable||!s(f))return!1;if(i=l.f(f,t)){if(i.get||i.set||!1===i.writable)return!1;i.value=n,c.f(f,t,i)}else c.f(f,t,d(0,n));return!0}return void 0!==p.set&&(p.set.call(f,n),!0)}var f=o((function(){var e=function(){},t=c.f(new e,"a",{configurable:!0});return!1!==Reflect.set(e.prototype,"a",1,t)}));i({target:"Reflect",stat:!0,forced:f},{set:h})},"7f78":function(e,t,n){var i=n("23e7"),r=n("825a"),s=n("e163"),a=n("e177");i({target:"Reflect",stat:!0,sham:!a},{getPrototypeOf:function(e){return s(r(e))}})},"7f9a":function(e,t,n){var i=n("da84"),r=n("8925"),s=i.WeakMap;e.exports="function"===typeof s&&/native code/.test(r(s))},"80e0":function(e,t,n){var i=n("746f");i("replace")},8103:function(e,t,n){var i=n("d194"),r=i("toUpperCase");e.exports=r},"810a":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("img",{attrs:{src:e.source},on:{error:function(t){return e.failedToLoad()}}})},r=[],s=(n("99af"),n("b0c0"),n("a9e3"),n("4795"),{props:{name:{type:String,default:""},maxTries:{type:Number,default:10}},computed:{sourceBuster:function(){return this.failsToLoad&&this.failsToLoad1?arguments[1]:void 0,n),c=a>2?arguments[2]:void 0,l=void 0===c?n:r(c,n);while(l>o)t[o++]=e;return t}},"820e":function(e,t,n){"use strict";var i=n("23e7"),r=n("1c0b"),s=n("f069"),a=n("e667"),o=n("2266");i({target:"Promise",stat:!0},{allSettled:function(e){var t=this,n=s.f(t),i=n.resolve,c=n.reject,l=a((function(){var n=r(t.resolve),s=[],a=0,c=1;o(e,(function(e){var r=a++,o=!1;s.push(void 0),c++,n.call(t,e).then((function(e){o||(o=!0,s[r]={status:"fulfilled",value:e},--c||i(s))}),(function(e){o||(o=!0,s[r]={status:"rejected",reason:e},--c||i(s))}))})),--c||i(s)}));return l.error&&c(l.value),n.promise}})},"825a":function(e,t,n){var i=n("861d");e.exports=function(e){if(!i(e))throw TypeError(String(e)+" is not an object");return e}},"82da":function(e,t,n){var i=n("23e7"),r=n("ebb5"),s=r.NATIVE_ARRAY_BUFFER_VIEWS;i({target:"ArrayBuffer",stat:!0,forced:!s},{isView:r.isView})},"82f8":function(e,t,n){"use strict";var i=n("ebb5"),r=n("4d64").includes,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("includes",(function(e){return r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},8385:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-input-search",{attrs:{input:e.records,keys:["id","name","rank"]},model:{value:e.filtered,callback:function(t){e.filtered=t},expression:"filtered"}}),e._l(e.filtered,(function(t){return n("div",{key:t.id},[n("vui-button",{attrs:{params:{setactive_virus:t.id},"push-state":""},on:{click:function(t){e.activeview=e.defaultview}}},[e._v(e._s(t.id)+": "+e._s(t.name))])],1)}))],2)},r=[],s=(n("07ac"),{data:function(){return{state:this.$root.$data.state,filtered:[]}},computed:{records:function(){return Object.values(this.state.record_viruses)}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"83ab":function(e,t,n){var i=n("d039");e.exports=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},8418:function(e,t,n){"use strict";var i=n("c04e"),r=n("9bf2"),s=n("5c6c");e.exports=function(e,t,n){var a=i(t);a in e?r.f(e,a,s(0,n)):e[a]=n}},"841c":function(e,t,n){"use strict";var i=n("d784"),r=n("825a"),s=n("1d80"),a=n("129f"),o=n("14c3");i("search",1,(function(e,t,n){return[function(t){var n=s(this),i=void 0==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var s=r(e),c=String(this),l=s.lastIndex;a(l,0)||(s.lastIndex=0);var u=o(s,c);return a(s.lastIndex,l)||(s.lastIndex=l),null===u?-1:u.index}]}))},"843c":function(e,t,n){"use strict";var i=n("23e7"),r=n("0ccb").end,s=n("9a0c");i({target:"String",proto:!0,forced:s},{padEnd:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},"84c3":function(e,t,n){var i=n("74e8");i("Uint16",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},8535:function(e,t,n){},"857a":function(e,t,n){var i=n("1d80"),r=/"/g;e.exports=function(e,t,n,s){var a=String(i(e)),o="<"+t;return""!==n&&(o+=" "+n+'="'+String(s).replace(r,""")+'"'),o+">"+a+""}},"861d":function(e,t){e.exports=function(e){return"object"===typeof e?null!==e:"function"===typeof e}},"86ad":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Sensor Data:")]),e.state.sensors.length<=0?n("span",[e._v("No sensors connected.")]):e._l(e.state.sensors,(function(t,i){return n("div",{key:i},[n("b",[e._v(e._s(t.name))]),n("br"),t.pressure?n("vui-item",{attrs:{label:"Pressure:"}},[e._v(e._s(t.pressure)+" kPa")]):e._e(),t.temperature?n("vui-item",{attrs:{label:"Temperature:"}},[e._v(e._s(t.temperature)+" K")]):e._e(),t.oxygen||t.hydrogen||t.phoron||t.nitrogen||t.carbon_dioxide?n("vui-item",{attrs:{label:"Gas Composition:"}},[t.oxygen?n("span",{staticClass:"complist"},[e._v(e._s(t.oxygen)+" O"),n("sub",[e._v("2")])]):e._e(),t.nitrogen?n("span",{staticClass:"complist"},[e._v(e._s(t.nitrogen)+" N")]):e._e(),t.carbon_dioxide?n("span",{staticClass:"complist"},[e._v(e._s(t.carbon_dioxide)+" CO"),n("sub",[e._v("2"),n("sub")])]):e._e(),t.phoron?n("span",{staticClass:"complist"},[e._v(e._s(t.phoron)+" PH")]):e._e(),t.hydrogen?n("span",{staticClass:"complist"},[e._v(e._s(t.hydrogen)+" H"),n("sub",[e._v("2")])]):e._e()]):e._e()],1)})),e.state.control?n("view-console-atmocontrol-"+e.state.control,{tag:"component"}):e._e()],2)},r=[],s={data:function(){return this.$root.$data}},a=s,o=(n("f9a1"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"0f00c828",null);t["default"]=c.exports},"86eb":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.forumuserui_enabled?n("div",{staticClass:"notice"},[n("center",[e._v("Modifications done do not outlast the round! Use the forums/WI to modify ranks.")])],1):e._e(),n("table",[n("tr",[n("th",[e._v("Ckey "),n("vui-button",{attrs:{params:{action:"add"}}},[e._v("Add")])],1),n("th",[e._v("Rank")]),n("th",[e._v("Permissions")])]),e._l(e.admins,(function(t){return n("tr",{key:t.ckey},[n("td",[n("vui-button",{attrs:{params:{action:"remove",ckey:t.ckey}}},[e._v("Edit")]),e._v(" "+e._s(t.ckey)+" ")],1),n("td",[n("vui-button",{attrs:{params:{action:"rank",ckey:t.ckey}}},[e._v("Edit")]),e._v(" "+e._s(t.rank)+" ")],1),n("td",[n("vui-button",{attrs:{params:{action:"rights",ckey:t.ckey}}},[e._v("Edit")]),e._v(" "+e._s(t.rights)+" ")],1)])}))],2)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},8746:function(e,t,n){},8925:function(e,t,n){var i=n("c6cd"),r=Function.toString;"function"!=typeof i.inspectSource&&(i.inspectSource=function(e){return r.call(e)}),e.exports=i.inspectSource},8928:function(e,t,n){"use strict";n("c6c8")},"8a59":function(e,t,n){var i=n("74e8");i("Uint8",(function(e){return function(t,n,i){return e(this,t,n,i)}}),!0)},"8a79":function(e,t,n){"use strict";var i=n("23e7"),r=n("06cf").f,s=n("50c4"),a=n("5a34"),o=n("1d80"),c=n("ab13"),l=n("c430"),u="".endsWith,d=Math.min,h=c("endsWith"),f=!l&&!h&&!!function(){var e=r(String.prototype,"endsWith");return e&&!e.writable}();i({target:"String",proto:!0,forced:!f&&!h},{endsWith:function(e){var t=String(o(this));a(e);var n=arguments.length>1?arguments[1]:void 0,i=s(t.length),r=void 0===n?i:d(s(n),i),c=String(e);return u?u.call(t,c,r):t.slice(r-c.length,r)===c}})},"8aa5":function(e,t,n){"use strict";var i=n("6547").charAt;e.exports=function(e,t,n){return t+(n?i(e,t).length:1)}},"8aa7":function(e,t,n){var i=n("da84"),r=n("d039"),s=n("1c7e"),a=n("ebb5").NATIVE_ARRAY_BUFFER_VIEWS,o=i.ArrayBuffer,c=i.Int8Array;e.exports=!a||!r((function(){c(1)}))||!r((function(){new c(-1)}))||!s((function(e){new c,new c(null),new c(1.5),new c(e)}),!0)||r((function(){return 1!==new c(new o(2),1,void 0).length}))},"8b09":function(e,t,n){var i=n("74e8");i("Int16",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},"8b1f":function(e,t,n){"use strict";n("a5e6")},"8b9a":function(e,t,n){var i=n("23e7"),r=n("825a"),s=n("3bbe"),a=n("d2bb");a&&i({target:"Reflect",stat:!0},{setPrototypeOf:function(e,t){r(e),s(t);try{return a(e,t),!0}catch(n){return!1}}})},"8ba4":function(e,t,n){var i=n("23e7"),r=n("5e89");i({target:"Number",stat:!0},{isInteger:r})},"8c49":function(e,t,n){"use strict";n("f693")},"8eb5":function(e,t){var n=Math.expm1,i=Math.exp;e.exports=!n||n(10)>22025.465794806718||n(10)<22025.465794806718||-2e-17!=n(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:i(e)-1}:n},"8edd":function(e,t,n){var i=n("746f");i("matchAll")},"90d7":function(e,t,n){var i=n("23e7"),r=Math.log,s=Math.LN2;i({target:"Math",stat:!0},{log2:function(e){return r(e)/s}})},"90e3":function(e,t){var n=0,i=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++n+i).toString(36)}},9112:function(e,t,n){var i=n("83ab"),r=n("9bf2"),s=n("5c6c");e.exports=i?function(e,t,n){return r.f(e,t,s(1,n))}:function(e,t,n){return e[t]=n,e}},9129:function(e,t,n){var i=n("23e7");i({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},9263:function(e,t,n){"use strict";var i=n("ad6d"),r=n("9f7f"),s=RegExp.prototype.exec,a=String.prototype.replace,o=s,c=function(){var e=/a/,t=/b*/g;return s.call(e,"a"),s.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),l=r.UNSUPPORTED_Y||r.BROKEN_CARET,u=void 0!==/()??/.exec("")[1],d=c||u||l;d&&(o=function(e){var t,n,r,o,d=this,h=l&&d.sticky,f=i.call(d),p=d.source,g=0,m=e;return h&&(f=f.replace("y",""),-1===f.indexOf("g")&&(f+="g"),m=String(e).slice(d.lastIndex),d.lastIndex>0&&(!d.multiline||d.multiline&&"\n"!==e[d.lastIndex-1])&&(p="(?: "+p+")",m=" "+m,g++),n=new RegExp("^(?:"+p+")",f)),u&&(n=new RegExp("^"+p+"$(?!\\s)",f)),c&&(t=d.lastIndex),r=s.call(h?n:d,m),h?r?(r.input=r.input.slice(g),r[0]=r[0].slice(g),r.index=d.lastIndex,d.lastIndex+=r[0].length):d.lastIndex=0:c&&r&&(d.lastIndex=d.global?r.index+r[0].length:t),u&&r&&r.length>1&&a.call(r[0],n,(function(){for(o=1;o0}}}),a=s,o=(n("af89"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"c4dbe0aa",null);t["default"]=c.exports},"944a":function(e,t,n){var i=n("746f");i("toStringTag")},"94ca":function(e,t,n){var i=n("d039"),r=/#|\.prototype\./,s=function(e,t){var n=o[a(e)];return n==l||n!=c&&("function"==typeof t?i(t):!!t)},a=s.normalize=function(e){return String(e).replace(r,".").toLowerCase()},o=s.data={},c=s.NATIVE="N",l=s.POLYFILL="P";e.exports=s},9513:function(e,t,n){},9556:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabel"},[e._v("Confirm identity:")]),n("div",{staticClass:"itemContent"},[n("vui-button",{attrs:{params:{scan:1},icon:"eject"}},[e.state.idname?n("span",[e._v(e._s(e.state.idname))]):n("span",[e._v("--------")])])],1)]),e.state.auth?n("div",{staticStyle:{"margin-top":"24px",clear:"both"}},[n("b",[e._v("Logged in to:")]),e._v(" "+e._s(e.state.bossname)+" Quantum Entanglement Network "),e.remaining_cooldown<=0?[n("vui-item",{attrs:{label:"Sending to:"}},[n("select",{directives:[{name:"model",rawName:"v-model.lazy",value:e.state.destination,expression:"state.destination",modifiers:{lazy:!0}}],staticClass:"button",on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.state,"destination",t.target.multiple?n:n[0])}}},e._l(e.state.departiments,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)]),e.state.paper?[n("vui-item",{attrs:{label:"Currently sending:"}},[e._v(e._s(e.state.paper))]),n("vui-button",{attrs:{"push-state":"",params:{send:1}}},[e._v("Send")])]:n("span",[e._v("Please insert paper to send via secure connection.")])]:n("span",[n("b",[e._v("Transmitter arrays realigning. Please stand by. "+e._s(e._f("roundRemaining")(e.remaining_cooldown))+" seconds remaining.")])])],2):e._e(),e.state.paper?n("vui-button",{attrs:{params:{remove:1}}},[e._v("Remove item")]):e._e(),n("h3",[e._v("PDAs to notify:")]),e._l(e.state.alertpdas,(function(t){return n("div",{key:t.ref},[e._v(" "+e._s(t.name)+" "),n("vui-button",{attrs:{params:{unlink:t.ref}}},[e._v("Unlink")])],1)})),e.state.alertpdas.length<=0?n("div",[e._v("No PDAs are linked.")]):e._e(),n("vui-button",{attrs:{params:{linkpda:1}}},[e._v("Add PDA to Notify")])],2)},r=[],s={data:function(){return this.$root.$data},computed:{remaining_cooldown:function(){return this.state.cooldownend-this.wtime}},filters:{roundRemaining:function(e){return Math.round(e/10)}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,"4b0e320e",null);t["default"]=c.exports},"95d1":function(e,t,n){"use strict";n("4cc0")},"967a":function(e,t,n){"use strict";var i=n("23e7"),r=n("e163"),s=n("d2bb"),a=n("7c73"),o=n("9112"),c=n("5c6c"),l=n("2266"),u=function(e,t){var n=this;if(!(n instanceof u))return new u(e,t);s&&(n=s(new Error(void 0),r(n))),void 0!==t&&o(n,"message",String(t));var i=[];return l(e,i.push,{that:i}),o(n,"errors",i),n};u.prototype=a(Error.prototype,{constructor:c(5,u),message:c(5,""),name:c(5,"AggregateError")}),i({global:!0},{AggregateError:u})},"96f3":function(e,t,n){"use strict";n("ce5b")},9767:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("fontcolor")},{fontcolor:function(e){return r(this,"font","color",e)}})},9861:function(e,t,n){"use strict";n("e260");var i=n("23e7"),r=n("d066"),s=n("0d3b"),a=n("6eeb"),o=n("e2cc"),c=n("d44e"),l=n("9ed3"),u=n("69f3"),d=n("19aa"),h=n("5135"),f=n("0366"),p=n("f5df"),g=n("825a"),m=n("861d"),v=n("7c73"),b=n("5c6c"),y=n("9a1f"),w=n("35a1"),_=n("b622"),x=r("fetch"),k=r("Headers"),A=_("iterator"),C="URLSearchParams",E=C+"Iterator",S=u.set,F=u.getterFor(C),$=u.getterFor(E),T=/\+/g,L=Array(4),D=function(e){return L[e-1]||(L[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},B=function(e){try{return decodeURIComponent(e)}catch(t){return e}},R=function(e){var t=e.replace(T," "),n=4;try{return decodeURIComponent(t)}catch(i){while(n)t=t.replace(D(n--),B);return t}},O=/[!'()~]|%20/g,M={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},j=function(e){return M[e]},I=function(e){return encodeURIComponent(e).replace(O,j)},P=function(e,t){if(t){var n,i,r=t.split("&"),s=0;while(s0?arguments[0]:void 0,u=this,f=[];if(S(u,{type:C,entries:f,updateURL:function(){},updateSearchParams:N}),void 0!==l)if(m(l))if(e=w(l),"function"===typeof e){t=e.call(l),n=t.next;while(!(i=n.call(t)).done){if(r=y(g(i.value)),s=r.next,(a=s.call(r)).done||(o=s.call(r)).done||!s.call(r).done)throw TypeError("Expected sequence with length 2");f.push({key:a.value+"",value:o.value+""})}}else for(c in l)h(l,c)&&f.push({key:c,value:l[c]+""});else P(f,"string"===typeof l?"?"===l.charAt(0)?l.slice(1):l:l+"")},U=V.prototype;o(U,{append:function(e,t){W(arguments.length,2);var n=F(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){W(arguments.length,1);var t=F(this),n=t.entries,i=e+"",r=0;while(re.key){r.splice(t,0,e);break}t===n&&r.push(e)}i.updateURL()},forEach:function(e){var t,n=F(this).entries,i=f(e,arguments.length>1?arguments[1]:void 0,3),r=0;while(r1&&(t=arguments[1],m(t)&&(n=t.body,p(n)===C&&(i=t.headers?new k(t.headers):new k,i.has("content-type")||i.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=v(t,{body:b(0,String(n)),headers:b(0,i)}))),r.push(t)),x.apply(this,r)}}),e.exports={URLSearchParams:V,getState:F}},"987b":function(e,t,n){"use strict";n("daa2")},"98c3":function(e,t,n){"use strict";n("db4f")},9911:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("link")},{link:function(e){return r(this,"a","href",e)}})},"99af":function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("e8b5"),a=n("861d"),o=n("7b0b"),c=n("50c4"),l=n("8418"),u=n("65f0"),d=n("1dde"),h=n("b622"),f=n("2d00"),p=h("isConcatSpreadable"),g=9007199254740991,m="Maximum allowed index exceeded",v=f>=51||!r((function(){var e=[];return e[p]=!1,e.concat()[0]!==e})),b=d("concat"),y=function(e){if(!a(e))return!1;var t=e[p];return void 0!==t?!!t:s(e)},w=!v||!b;i({target:"Array",proto:!0,forced:w},{concat:function(e){var t,n,i,r,s,a=o(this),d=u(a,0),h=0;for(t=-1,i=arguments.length;tg)throw TypeError(m);for(n=0;n=g)throw TypeError(m);l(d,h++,s)}return d.length=h,d}})},"9a0c":function(e,t,n){var i=n("342f");e.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(i)},"9a1f":function(e,t,n){var i=n("825a"),r=n("35a1");e.exports=function(e){var t=r(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return i(t.call(e))}},"9a8c":function(e,t,n){"use strict";var i=n("ebb5"),r=n("145e"),s=i.aTypedArray,a=i.exportTypedArrayMethod;a("copyWithin",(function(e,t){return r.call(s(this),e,t,arguments.length>2?arguments[2]:void 0)}))},"9aa7":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"resizehandles"}},[n("div",{staticClass:"resizeHandle__e",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startResizing(1,0,t)}}}),n("div",{staticClass:"resizeHandle__s",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startResizing(0,1,t)}}}),n("div",{staticClass:"resizeHandle__se",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startResizing(1,1,t)}}})])},r=[],s=n("f0e0"),a={methods:{startResizing:function(e,t,n){s["a"].resizeStartHandler(e,t,n)}}},o=a,c=(n("98c3"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"01c02ad8",null);t["default"]=l.exports},"9acc":function(e,t,n){"use strict";n("1ee6")},"9b7e":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.s.service?e.s.registered?e.s.signal?[n("div",[e.s.can_netadmin_mode||e.s.netadmin_mode?n("vui-button",{class:{on:e.s.netadmin_mode},attrs:{params:{toggleadmin:1}}},[e._v("Admin Mode")]):e._e(),e._v(" Ringtone: "),null==e.ringtone?n("vui-button",{on:{click:function(t){e.ringtone=e.s.ringtone}}},[e._v(e._s(e.s.ringtone))]):[n("input",{directives:[{name:"model",rawName:"v-model",value:e.ringtone,expression:"ringtone"}],attrs:{type:"text"},domProps:{value:e.ringtone},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.set_ringtone(t)},input:function(t){t.target.composing||(e.ringtone=t.target.value)}}}),n("vui-button",{on:{click:e.set_ringtone}},[e._v("Set ringtone")])]],2),n("div",[n("vui-button",{class:{on:null==e.active},on:{click:function(t){e.active=null}}},[e._v("Explore")]),e._l(e.tab_channels,(function(t){return n("vui-button",{key:t,class:{on:e.active==t},on:{click:function(n){e.active=t}}},[e._v(e._s(e.s.channels[t].title))])}))],2),n("hr"),null==e.active?n("view-mcomputer-chat-explore"):n("view-mcomputer-chat-chat",{attrs:{reference:e.active},on:{"on-leave":function(t){e.active=null}}})]:n("h2",{staticClass:"red"},[e._v("No network signal.")]):n("h2",{staticClass:"red"},[e._v("No registered user detected.")]):n("h2",{staticClass:"red"},[e._v("Chat service is not enabled, please enable it from main menu.")])],2)},r=[],s=(n("4de4"),n("b64b"),n("025e")),a={data:function(){return{s:this.$root.$data.state,active:null,ringtone:null}},computed:{tab_channels:function(){var e=this;return Object.keys(this.s.channels).filter((function(t){return e.s.channels[t].can_interact}))}},methods:{set_ringtone:function(){Object(s["b"])({ringtone:this.ringtone}),this.ringtone=null}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},"9bdd":function(e,t,n){var i=n("825a"),r=n("2a62");e.exports=function(e,t,n,s){try{return s?t(i(n)[0],n[1]):t(n)}catch(a){throw r(e),a}}},"9bf2":function(e,t,n){var i=n("83ab"),r=n("0cfb"),s=n("825a"),a=n("c04e"),o=Object.defineProperty;t.f=i?o:function(e,t,n){if(s(e),t=a(t,!0),s(n),r)try{return o(e,t,n)}catch(i){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},"9e4a":function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("825a"),a=n("06cf");i({target:"Reflect",stat:!0,sham:!r},{getOwnPropertyDescriptor:function(e,t){return a.f(s(e),t)}})},"9e69":function(e,t,n){var i=n("2b3e"),r=i.Symbol;e.exports=r},"9e80":function(e,t,n){},"9ed3":function(e,t,n){"use strict";var i=n("ae93").IteratorPrototype,r=n("7c73"),s=n("5c6c"),a=n("d44e"),o=n("3f8c"),c=function(){return this};e.exports=function(e,t,n){var l=t+" Iterator";return e.prototype=r(i,{next:s(1,n)}),a(e,l,!1,!0),o[l]=c,e}},"9f7f":function(e,t,n){"use strict";var i=n("d039");function r(e,t){return RegExp(e,t)}t.UNSUPPORTED_Y=i((function(){var e=r("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),t.BROKEN_CARET=i((function(){var e=r("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},"9f96":function(e,t,n){var i=n("23e7"),r=n("da84"),s=n("b575"),a=n("605d"),o=r.process;i({global:!0,enumerable:!0,noTargetGet:!0},{queueMicrotask:function(e){var t=a&&o.domain;s(t?t.bind(e):e)}})},"9ff9":function(e,t,n){var i=n("23e7"),r=Math.atanh,s=Math.log;i({target:"Math",stat:!0,forced:!(r&&1/r(-0)<0)},{atanh:function(e){return 0==(e=+e)?e:s((1+e)/(1-e))/2}})},a026:function(e,t,n){"use strict";(function(e){ +(function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)})({0:function(e,t,n){e.exports=n("56d7")},"00b4":function(e,t,n){"use strict";n("ac1f");var i=n("23e7"),r=n("861d"),s=function(){var e=!1,t=/[ac]/;return t.exec=function(){return e=!0,/./.exec.apply(this,arguments)},!0===t.test("abc")&&e}(),a=/./.test;i({target:"RegExp",proto:!0,forced:!s},{test:function(e){if("function"!==typeof this.exec)return a.call(this,e);var t=this.exec(e);if(null!==t&&!r(t))throw new Error("RegExp exec method returned something other than an Object or null");return!!t}})},"00ee":function(e,t,n){var i=n("b622"),r=i("toStringTag"),s={};s[r]="z",e.exports="[object z]"===String(s)},"00fd":function(e,t,n){var i=n("9e69"),r=Object.prototype,s=r.hasOwnProperty,a=r.toString,o=i?i.toStringTag:void 0;function c(e){var t=s.call(e,o),n=e[o];try{e[o]=void 0;var i=!0}catch(c){}var r=a.call(e);return i&&(t?e[o]=n:delete e[o]),r}e.exports=c},"019f":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Hard drive:"}},[n("vui-progress",{staticClass:"vui-progress",class:{good:!e.lowHardDrive,average:e.lowHardDrive},attrs:{max:e.s.disk_size,value:e.s.disk_used}},[e._v(e._s(e.s.disk_used)+" GQ / "+e._s(e.s.disk_size)+" GQ")])],1)],1),e.s.queue_size?[n("h2",[e._v("Queue")]),n("table",{staticClass:"queue-list"},[e._m(0),e._l(e.queue,(function(t){return n("tr",{key:t.filename},[n("td",{staticClass:"name"},[e._v(e._s(t.filename))]),n("td",[n("vui-progress",{staticClass:"vui-progress",attrs:{max:t.size,value:t.progress}},[e._v(e._s(t.progress.toFixed(2))+" GQ / "+e._s(t.size)+" GQ")])],1),n("td",{staticClass:"action"},[n("vui-button",{attrs:{params:{cancel:t.filename}}},[e._v("Cancel")])],1)])}))],2)]:e._e(),n("h2",[e._v("Available Programs")]),n("vui-input-search",{staticStyle:{float:"right"},attrs:{input:e.unrestrictedPrograms,keys:["name","filename","desc"],autofocus:""},model:{value:e.search_results,callback:function(t){e.search_results=t},expression:"search_results"}}),n("vui-group",[e._l(e.search_results,(function(t){return[n("vui-group-item",{key:t.filename,attrs:{label:"Program name:"}},[n("b",[e._v(e._s(t.name))])]),n("vui-group-item",{key:t.filename,attrs:{label:"File name:"}},[e._v(e._s(t.filename)+" ("+e._s(t.size)+" GQ)")]),n("vui-group-item",{key:t.filename,attrs:{label:"Description:"}},[e._v(e._s(t.desc))]),n("vui-group-item",{key:t.filename,attrs:{label:"File controls:"}},[n("vui-button",{class:{danger:!e.canDownload(t)},attrs:{params:{download:t.filename}}},[e._v("Download")])],1),n("td",{key:t.filename,attrs:{colspan:"2"}},[n("hr")])]}))],2)],2)},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("th",[e._v("Name")]),n("th",[e._v("Progress")]),n("th",[e._v("Action")])])}];n("a4d3"),n("e01a"),n("d28b"),n("4de4"),n("a630"),n("e260"),n("d81d"),n("fb6a"),n("b0c0"),n("4fad"),n("d3b7"),n("25f0"),n("3ca3"),n("ddb0");function s(e,t){return u(e)||l(e,t)||o(e,t)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){if(e){if("string"===typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n.8},queue:function(){var e=this;return Object.entries(this.s.queue).map((function(t){var n=s(t,2),i=n[0],r=n[1],a=e.s.available[i];return a.progress=r,a.filename=i,a}))}},methods:{canDownload:function(e){return!(e.size+this.s.queue_size+this.s.disk_used>this.s.disk_size)}}},h=d,f=(n("8b1f"),n("2877")),p=Object(f["a"])(h,i,r,!1,null,"f45f2cac",null);t["default"]=p.exports},"025e":function(e,t,n){"use strict";n.d(t,"b",(function(){return h}));n("99af"),n("c975"),n("a15b"),n("13d5"),n("fb6a"),n("cca6"),n("d3b7"),n("ac1f"),n("25f0"),n("1276");var i=n("c0d6"),r=function(){return Math.random().toString(36).substring(13)};function s(e,t){var n=[];for(var i in t)if(Array.isArray(t[i]))for(var r in t[i])n.push(encodeURIComponent(i)+"="+encodeURIComponent(r));else n.push(encodeURIComponent(i)+"="+encodeURIComponent(t[i]));var s=e+"?"+n.join("&");if(s.indexOf("byond://")>=0)window.location.href=s;else{var a=new XMLHttpRequest;a.open("GET",s,!0),a.send()}}function a(e,t,n){var i="__bycallback"+r();window[i]=n,s(e,Object.assign({},t,{callback:i}))}function o(e){s("",e)}function c(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n={src:i["a"].state.uiref,vueuihrefjson:JSON.stringify(e)};t&&(n["vueuistateupdate"]=i["a"].getStatePushDataString()),o(n)}function l(e,t){return t.split(".").reduce((function(e,t){return e[t]}),e)}var u=36e3,d=600;function h(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=t?i["a"].state.roundstart_hour:0,r=Math.floor((e/u+n)%24),s=Math.floor(e%u/d);return"".concat(("0"+r).slice(-2),":").concat(("0"+s).slice(-2))}t["a"]={sendRaw:s,sendRawWithCallback:a,sendToTopicRaw:o,sendToTopic:c,dotNotationRead:l,worldtime2text:h}},"0261":function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("8eb5"),a=Math.abs,o=Math.exp,c=Math.E,l=r((function(){return-2e-17!=Math.sinh(-2e-17)}));i({target:"Math",stat:!0,forced:l},{sinh:function(e){return a(e=+e)<1?(s(e)-s(-e))/2:(o(e-1)-o(-e-1))*(c/2)}})},"0366":function(e,t,n){var i=n("1c0b");e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}}},"0481":function(e,t,n){"use strict";var i=n("23e7"),r=n("a2bf"),s=n("7b0b"),a=n("50c4"),o=n("a691"),c=n("65f0");i({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:void 0,t=s(this),n=a(t.length),i=c(t,0);return i.length=r(i,t,t,n,0,void 0===e?1:o(e)),i}})},"04d3":function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("blink")},{blink:function(){return r(this,"blink","","")}})},"050e":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Jammer Level:")]),n("div",[n("vui-button",{class:{selected:1==e.active},attrs:{params:{set_active:1}}},[e._v("Block All")])],1),n("div",[n("vui-button",{class:{selected:2==e.active},attrs:{params:{set_active:2}}},[e._v("Block Synthetics")])],1),n("div",[n("vui-button",{class:{selected:-1==e.active},attrs:{params:{set_active:-1}}},[e._v("Block Nothing")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"0519":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{staticStyle:{clear:"both",margin:"auto",width:"20em"}},[e._l([5,10,20,30,40],(function(t){return n("vui-button",{key:e.amount-e.button-t,class:{selected:e.state.amount==t},attrs:{icon:"cog",params:{amount:t}}},[e._v(e._s(t))])})),n("br"),n("br"),n("div",{staticStyle:{"text-align":"center"}},[n("vui-input-numeric",{attrs:{width:"2.5em","button-count":2,min:1,max:e.state.beakerMaxVolume||120},on:{input:function(t){return e.$toTopic({amount:e.state.amount})}},model:{value:e.state.amount,callback:function(t){e.$set(e.state,"amount",t)},expression:"state.amount"}})],1)],2),n("div",{staticStyle:{clear:"both"}}),n("div",{staticStyle:{float:"left",width:"100%"}},[e.state.chemicals.length?n("div",e._l(e.state.chemicals,(function(t){return n("vui-button",{key:t-e.btn,staticClass:"fixedLeftWide",attrs:{icon:"arrow-alt-circle-down",params:{dispense:t.label}}},[e._v(e._s(t.label)+" ("+e._s(t.amount)+")")])})),1):n("span",{staticClass:"bad"},[e._v("No cartridges installed!")])]),n("div",{staticStyle:{clear:"both"}}),n("vui-button",{class:e.state.isBeakerLoaded&&e.disabled,staticStyle:{float:"right"},attrs:{icon:"eject",params:{ejectBeaker:1}}},[e._v("Eject "+e._s(e.state.glass?"Glass":"Beaker"))]),n("div",{staticClass:"statusDisplay",staticStyle:{clear:"both","min-height":"180px"}},[e.state.isBeakerLoaded?n("div",[n("b",[e._v("Volume: "+e._s(e.state.beakerCurrentVolume)+" / "+e._s(e.state.beakerMaxVolume))]),n("br"),e.state.beakerContents.length?n("div",e._l(e.state.beakerContents,(function(t){return n("span",{key:t-e.amt,staticClass:"highlight"},[e._v(e._s(e.u(t.volume))+" of "+e._s(t.name)),n("br")])})),0):n("span",{staticClass:"bad"},[e._v(e._s(e.state.glass?"Glass":"Beaker")+" is empty.")])]):n("div",[n("span",{staticClass:"average"},[n("i",[e._v("No "+e._s(e.state.glass?"glass":"beaker")+" loaded.")])])])])],1)},r=[],s={data:function(){return this.$root.$data},methods:{u:function(e){return"".concat(e,1==e?" unit":" units")}}},a=s,o=(n("eb66"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"d73f47c0",null);t["default"]=c.exports},"0538":function(e,t,n){"use strict";var i=n("1c0b"),r=n("861d"),s=[].slice,a={},o=function(e,t,n){if(!(t in a)){for(var i=[],r=0;r1&&o(c,"")>-1&&(n=RegExp(this.source,i.replace.call(a(this),"g","")),i.replace.call(e.slice(c.index),n,(function(){for(var e=1;ec.index&&this.lastIndex--}return c},s||(RegExp.prototype.test=function(e){var t=i.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t}))})),ace.define("ace/lib/es5-shim",["require","exports","module"],(function(e,t,n){function i(){}Function.prototype.bind||(Function.prototype.bind=function(e){var t=this;if("function"!=typeof t)throw new TypeError("Function.prototype.bind called on incompatible "+t);var n=h.call(arguments,1),r=function(){if(this instanceof r){var i=t.apply(this,n.concat(h.call(arguments)));return Object(i)===i?i:this}return t.apply(e,n.concat(h.call(arguments)))};return t.prototype&&(i.prototype=t.prototype,r.prototype=new i,i.prototype=null),r});var r,s,a,o,c,l=Function.prototype.call,u=Array.prototype,d=Object.prototype,h=u.slice,f=l.bind(d.toString),p=l.bind(d.hasOwnProperty);if((c=p(d,"__defineGetter__"))&&(r=l.bind(d.__defineGetter__),s=l.bind(d.__defineSetter__),a=l.bind(d.__lookupGetter__),o=l.bind(d.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t,n=[];if(n.splice.apply(n,e(20)),n.splice.apply(n,e(26)),t=n.length,n.splice(5,0,"XXX"),n.length,t+1==n.length)return!0}()){var g=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?g.apply(this,[void 0===e?0:e,void 0===t?this.length-e:t].concat(h.call(arguments,2))):[]}}else Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):void 0==e?e=0:e<0&&(e=Math.max(n+e,0)),e+to)for(d=l;d--;)this[c+d]=this[o+d];if(s&&e===u)this.length=u,this.push.apply(this,r);else for(this.length=u+s,d=0;d>>0;if("[object Function]"!=f(e))throw new TypeError;while(++r>>0,r=Array(i),s=arguments[1];if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");for(var a=0;a>>0,s=[],a=arguments[1];if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");for(var o=0;o>>0,r=arguments[1];if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");for(var s=0;s>>0,r=arguments[1];if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");for(var s=0;s>>0;if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");if(!i&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var r,s=0;if(arguments.length>=2)r=arguments[1];else do{if(s in n){r=n[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(1);for(;s>>0;if("[object Function]"!=f(e))throw new TypeError(e+" is not a function");if(!i&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var r,s=i-1;if(arguments.length>=2)r=arguments[1];else do{if(s in n){r=n[s--];break}if(--s<0)throw new TypeError("reduceRight of empty array with no initial value")}while(1);do{s in this&&(r=e.call(void 0,r,n[s],s,t))}while(s--);return r}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(e){var t=b&&"[object String]"==f(this)?this.split(""):O(this),n=t.length>>>0;if(!n)return-1;var i=0;for(arguments.length>1&&(i=R(arguments[1])),i=i>=0?i:Math.max(0,n+i);i>>0;if(!n)return-1;var i=n-1;for(arguments.length>1&&(i=Math.min(i,R(arguments[1]))),i=i>=0?i:n-Math.abs(i);i>=0;i--)if(i in t&&e===t[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(e){return e.__proto__||(e.constructor?e.constructor.prototype:d)}),!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(e,t){if("object"!=typeof e&&"function"!=typeof e||null===e)throw new TypeError(y+e);if(p(e,t)){var n;if(n={enumerable:!0,configurable:!0},c){var i=e.__proto__;e.__proto__=d;var r=a(e,t),s=o(e,t);if(e.__proto__=i,r||s)return r&&(n.get=r),s&&(n.set=s),n}return n.value=e[t],n}}}(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(e){return Object.keys(e)}),Object.create)||(m=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(e,t){var n;if(null===e)n=m();else{if("object"!=typeof e)throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var i=function(){};i.prototype=e,n=new i,n.__proto__=e}return void 0!==t&&Object.defineProperties(n,t),n});function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}if(Object.defineProperty){var _=w({}),x="undefined"==typeof document||w(document.createElement("div"));if(!_||!x)var k=Object.defineProperty}if(!Object.defineProperty||k){var A="Property description must be an object: ",C="Object.defineProperty called on non-object: ",E="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(e,t,n){if("object"!=typeof e&&"function"!=typeof e||null===e)throw new TypeError(C+e);if("object"!=typeof n&&"function"!=typeof n||null===n)throw new TypeError(A+n);if(k)try{return k.call(Object,e,t,n)}catch(l){}if(p(n,"value"))if(c&&(a(e,t)||o(e,t))){var i=e.__proto__;e.__proto__=d,delete e[t],e[t]=n.value,e.__proto__=i}else e[t]=n.value;else{if(!c)throw new TypeError(E);p(n,"get")&&r(e,t,n.get),p(n,"set")&&s(e,t,n.set)}return e}}Object.defineProperties||(Object.defineProperties=function(e,t){for(var n in t)p(t,n)&&Object.defineProperty(e,n,t[n]);return e}),Object.seal||(Object.seal=function(e){return e}),Object.freeze||(Object.freeze=function(e){return e});try{Object.freeze((function(){}))}catch(M){Object.freeze=function(e){return function(t){return"function"==typeof t?t:e(t)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(e){return e}),Object.isSealed||(Object.isSealed=function(e){return!1}),Object.isFrozen||(Object.isFrozen=function(e){return!1}),Object.isExtensible||(Object.isExtensible=function(e){if(Object(e)===e)throw new TypeError;var t="";while(p(e,t))t+="?";e[t]=!0;var n=p(e,t);return delete e[t],n}),!Object.keys){var S=!0,F=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],$=F.length;for(var T in{toString:null})S=!1;Object.keys=function(e){if("object"!=typeof e&&"function"!=typeof e||null===e)throw new TypeError("Object.keys called on a non-object");var t=[];for(var n in e)p(e,n)&&t.push(n);if(S)for(var i=0,r=$;i0||-1)*Math.floor(Math.abs(e))),e}var O=function(e){if(null==e)throw new TypeError("can't convert "+e+" to object");return Object(e)}})),ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],(function(e,t,n){"use strict";e("./regexp"),e("./es5-shim")})),ace.define("ace/lib/dom",["require","exports","module"],(function(e,t,n){"use strict";var i="http://www.w3.org/1999/xhtml";t.getDocumentHead=function(e){return e||(e=document),e.head||e.getElementsByTagName("head")[0]||e.documentElement},t.createElement=function(e,t){return document.createElementNS?document.createElementNS(t||i,e):document.createElement(e)},t.hasCssClass=function(e,t){var n=(e.className+"").split(/\s+/g);return-1!==n.indexOf(t)},t.addCssClass=function(e,n){t.hasCssClass(e,n)||(e.className+=" "+n)},t.removeCssClass=function(e,t){var n=e.className.split(/\s+/g);while(1){var i=n.indexOf(t);if(-1==i)break;n.splice(i,1)}e.className=n.join(" ")},t.toggleCssClass=function(e,t){var n=e.className.split(/\s+/g),i=!0;while(1){var r=n.indexOf(t);if(-1==r)break;i=!1,n.splice(r,1)}return i&&n.push(t),e.className=n.join(" "),i},t.setCssClass=function(e,n,i){i?t.addCssClass(e,n):t.removeCssClass(e,n)},t.hasCssString=function(e,t){var n,i=0;if(t=t||document,t.createStyleSheet&&(n=t.styleSheets)){while(i=0?parseFloat((r.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((r.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&"Gecko"===window.navigator.product,t.isOldGecko=t.isGecko&&parseInt((r.match(/rv:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&"[object Opera]"==Object.prototype.toString.call(window.opera),t.isWebKit=parseFloat(r.split("WebKit/")[1])||void 0,t.isChrome=parseFloat(r.split(" Chrome/")[1])||void 0,t.isAIR=r.indexOf("AdobeAIR")>=0,t.isIPad=r.indexOf("iPad")>=0,t.isChromeOS=r.indexOf(" CrOS ")>=0,t.isIOS=/iPad|iPhone|iPod/.test(r)&&!window.MSStream,t.isIOS&&(t.isMac=!0)}})),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],(function(e,t,n){"use strict";var i=e("./keys"),r=e("./useragent"),s=null,a=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var i=function(){n.call(e,window.event)};n._wrapper=i,e.attachEvent("on"+t,i)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return"dblclick"==e.type?0:"contextmenu"==e.type||r.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,i){function r(e){n&&n(e),i&&i(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",r,!0),t.removeListener(document,"dragstart",r,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",r,!0),t.addListener(document,"dragstart",r,!0),r},t.addTouchMoveListener=function(e,n){var i,r;t.addListener(e,"touchstart",(function(e){var t=e.touches,n=t[0];i=n.clientX,r=n.clientY})),t.addListener(e,"touchmove",(function(e){var t=e.touches;if(!(t.length>1)){var s=t[0];e.wheelX=i-s.clientX,e.wheelY=r-s.clientY,i=s.clientX,r=s.clientY,n(e)}}))},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",(function(e){var t=8;void 0!==e.wheelDeltaX?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)})):"onwheel"in e?t.addListener(e,"wheel",(function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=5*(e.deltaX||0),e.wheelY=5*(e.deltaY||0);break}n(e)})):t.addListener(e,"DOMMouseScroll",(function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=5*(e.detail||0),e.wheelY=0):(e.wheelX=0,e.wheelY=5*(e.detail||0)),n(e)}))},t.addMultiMouseDownListener=function(e,n,i,s){var a,o,c,l=0,u={2:"dblclick",3:"tripleclick",4:"quadclick"};function d(e){if(0!==t.getButton(e)?l=0:e.detail>1?(l++,l>4&&(l=1)):l=1,r.isIE){var d=Math.abs(e.clientX-a)>5||Math.abs(e.clientY-o)>5;c&&!d||(l=1),c&&clearTimeout(c),c=setTimeout((function(){c=null}),n[l-1]||600),1==l&&(a=e.clientX,o=e.clientY)}if(e._clicks=l,i[s]("mousedown",e),l>4)l=0;else if(l>1)return i[s](u[l],e)}function h(e){l=2,c&&clearTimeout(c),c=setTimeout((function(){c=null}),n[l-1]||600),i[s]("mousedown",e),i[s](u[l],e)}Array.isArray(e)||(e=[e]),e.forEach((function(e){t.addListener(e,"mousedown",d),r.isOldIE&&t.addListener(e,"dblclick",h)}))};var o=r.isMac&&r.isOpera&&!("KeyboardEvent"in window)?function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)}:function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)};function c(e,t,n){var c=o(t);if(!r.isMac&&s){if(t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(c|=8),s.altGr){if(3==(3&c))return;s.altGr=0}if(18===n||17===n){var l="location"in t?t.location:t.keyLocation;if(17===n&&1===l)1==s[n]&&(a=t.timeStamp);else if(18===n&&3===c&&2===l){var u=t.timeStamp-a;u<50&&(s.altGr=!0)}}}if(n in i.MODIFIER_KEYS&&(n=-1),8&c&&n>=91&&n<=93&&(n=-1),!c&&13===n){l="location"in t?t.location:t.keyLocation;if(3===l&&(e(t,c,-n),t.defaultPrevented))return}if(r.isChromeOS&&8&c){if(e(t,c,n),t.defaultPrevented)return;c&=-9}return!!(c||n in i.FUNCTION_KEYS||n in i.PRINTABLE_KEYS)&&e(t,c,n)}function l(){s=Object.create(null)}if(t.getModifierString=function(e){return i.KEY_MODS[o(e)]},t.addCommandKeyListener=function(e,n){var i=t.addListener;if(r.isOldGecko||r.isOpera&&!("KeyboardEvent"in window)){var a=null;i(e,"keydown",(function(e){a=e.keyCode})),i(e,"keypress",(function(e){return c(n,e,a)}))}else{var o=null;i(e,"keydown",(function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=c(n,e,e.keyCode);return o=e.defaultPrevented,t})),i(e,"keypress",(function(e){o&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),o=null)})),i(e,"keyup",(function(e){s[e.keyCode]=null})),s||(l(),i(window,"focus",l))}},"object"==typeof window&&window.postMessage&&!r.isOldIE){var u=1;t.nextTick=function(e,n){n=n||window;var i="zero-timeout-message-"+u;t.addListener(n,"message",(function r(s){s.data==i&&(t.stopPropagation(s),t.removeListener(n,"message",r),e())})),n.postMessage(i,"*")}}t.nextFrame="object"==typeof window&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}})),ace.define("ace/lib/lang",["require","exports","module"],(function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0)1&t&&(n+=e),(t>>=1)&&(e+=e);return n};var i=/^\s\s*/,r=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(i,"")},t.stringTrimRight=function(e){return e.replace(r,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){for(var t=[],n=0,i=e.length;nd.length?e=e.substr(9):e.substr(0,4)==d.substr(0,4)?e=e.substr(4,e.length-d.length+1):e.charAt(e.length-1)==d.charAt(0)&&(e=e.slice(0,-1)),e==d.charAt(0)||e.charAt(e.length-1)==d.charAt(0)&&(e=e.slice(0,-1)),e&&t.onTextInput(e)),h&&(h=!1),E&&(E=!1))},F=function(e){if(!g){var t=n.value;S(t),x()}},$=function(e,t,n){var i=e.clipboardData||window.clipboardData;if(i&&!l){var r=u||n?"Text":"text/plain";try{return t?!1!==i.setData(r,t):i.getData(r)}catch(e){if(!n)return $(e,t,!0)}}},T=function(e,s){var a=t.getCopyText();if(!a)return i.preventDefault(e);$(e,a)?(r.isIOS&&(f=s,n.value="\n aa"+a+"a a\n",n.setSelectionRange(4,4+a.length),h={value:a}),s?t.onCut():t.onCopy(),r.isIOS||i.preventDefault(e)):(h=!0,n.value=a,n.select(),setTimeout((function(){h=!1,x(),_(),s?t.onCut():t.onCopy()})))},L=function(e){T(e,!0)},D=function(e){T(e,!1)},B=function(e){var s=$(e);"string"==typeof s?(s&&t.onPaste(s,e),r.isIE&&setTimeout(_),i.preventDefault(e)):(n.value="",p=!0)};i.addCommandKeyListener(n,t.onCommandKey.bind(t)),i.addListener(n,"select",A),i.addListener(n,"input",F),i.addListener(n,"cut",L),i.addListener(n,"copy",D),i.addListener(n,"paste",B);var R,O=function(e){g||!t.onCompositionStart||t.$readOnly||(g={},g.canUndo=t.session.$undoManager,t.onCompositionStart(),setTimeout(M,0),t.on("mousedown",j),g.canUndo&&!t.selection.isEmpty()&&(t.insert(""),t.session.markUndoGroup(),t.selection.clearSelection()),t.session.markUndoGroup())},M=function(){if(g&&t.onCompositionUpdate&&!t.$readOnly){var e=n.value.replace(/\x01/g,"");if(g.lastValue!==e&&(t.onCompositionUpdate(e),g.lastValue&&t.undo(),g.canUndo&&(g.lastValue=e),g.lastValue)){var i=t.selection.getRange();t.insert(g.lastValue),t.session.markUndoGroup(),g.range=t.selection.getRange(),t.selection.setRange(i),t.selection.clearSelection()}}},j=function(e){if(t.onCompositionEnd&&!t.$readOnly){var i=g;g=!1;var s=setTimeout((function(){s=null;var e=n.value.replace(/\x01/g,"");g||(e==i.lastValue?x():!i.lastValue&&e&&(x(),S(e)))}));C=function(e){return s&&clearTimeout(s),e=e.replace(/\x01/g,""),e==i.lastValue?"":(i.lastValue&&s&&t.undo(),e)},t.onCompositionEnd(),t.removeListener("mousedown",j),"compositionend"==e.type&&i.range&&t.selection.setRange(i.range);var a=!!r.isChrome&&r.isChrome>=53||!!r.isWebKit&&r.isWebKit>=603;a&&F()}},I=a.delayedCall(M,50);function P(){clearTimeout(R),R=setTimeout((function(){m&&(n.style.cssText=m,m=""),null==t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=!0,t.renderer.$moveTextAreaToCursor())}),0)}i.addListener(n,"compositionstart",O),r.isGecko?i.addListener(n,"text",(function(){I.schedule()})):(i.addListener(n,"keyup",(function(){I.schedule()})),i.addListener(n,"keydown",(function(){I.schedule()}))),i.addListener(n,"compositionend",j),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){E=!0,_(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,a){m||(m=n.style.cssText),n.style.cssText=(a?"z-index:100000;":"")+"height:"+n.style.height+";"+(r.isIE?"opacity:0.1;":"");var o=t.container.getBoundingClientRect(),c=s.computedStyle(t.container),l=o.top+(parseInt(c.borderTopWidth)||0),u=o.left+(parseInt(o.borderLeftWidth)||0),d=o.bottom-l-n.clientHeight-2,h=function(e){n.style.left=e.clientX-u-2+"px",n.style.top=Math.min(e.clientY-l-2,d)+"px"};h(e),"mousedown"==e.type&&(t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout(R),r.isWin&&i.capture(t.container,h,P))},this.onContextMenuClose=P;var N=function(e){t.textInput.onContextMenu(e),P()};if(i.addListener(n,"mouseup",N),i.addListener(n,"mousedown",(function(e){e.preventDefault(),P()})),i.addListener(t.renderer.scroller,"contextmenu",N),i.addListener(n,"contextmenu",N),r.isIOS){var W=null,H=!1;e.addEventListener("keydown",(function(e){W&&clearTimeout(W),H=!0})),e.addEventListener("keyup",(function(e){W=setTimeout((function(){H=!1}),100)}));var V=function(e){if(document.activeElement===n&&!H){if(f)return setTimeout((function(){f=!1}),100);var i=n.selectionStart,r=n.selectionEnd;if(n.setSelectionRange(4,5),i==r)switch(i){case 0:t.onCommandKey(null,0,o.up);break;case 1:t.onCommandKey(null,0,o.home);break;case 2:t.onCommandKey(null,c.option,o.left);break;case 4:t.onCommandKey(null,0,o.left);break;case 5:t.onCommandKey(null,0,o.right);break;case 7:t.onCommandKey(null,c.option,o.right);break;case 8:t.onCommandKey(null,0,o.end);break;case 9:t.onCommandKey(null,0,o.down);break}else{switch(r){case 6:t.onCommandKey(null,c.shift,o.right);break;case 7:t.onCommandKey(null,c.shift|c.option,o.right);break;case 8:t.onCommandKey(null,c.shift,o.end);break;case 9:t.onCommandKey(null,c.shift,o.down);break}switch(i){case 0:t.onCommandKey(null,c.shift,o.up);break;case 1:t.onCommandKey(null,c.shift,o.home);break;case 2:t.onCommandKey(null,c.shift|c.option,o.left);break;case 3:t.onCommandKey(null,c.shift,o.left);break}}}};document.addEventListener("selectionchange",V),t.on("destroy",(function(){document.removeEventListener("selectionchange",V)}))}};t.TextInput=d})),ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/keyboard/textinput_ios"],(function(e,t,n){"use strict";var i=e("../lib/event"),r=e("../lib/useragent"),s=e("../lib/dom"),a=e("../lib/lang"),o=r.isChrome<18,c=r.isIE,l=e("./textinput_ios").TextInput,u=function(e,t){if(r.isIOS)return l.call(this,e,t);var n=s.createElement("textarea");n.className="ace_text-input",n.setAttribute("wrap","off"),n.setAttribute("autocorrect","off"),n.setAttribute("autocapitalize","off"),n.setAttribute("spellcheck",!1),n.style.opacity="0",e.insertBefore(n,e.firstChild);var u="\u2028\u2028",d=!1,h=!1,f=!1,p="",g=!0;try{var m=document.activeElement===n}catch(P){}i.addListener(n,"blur",(function(e){t.onBlur(e),m=!1})),i.addListener(n,"focus",(function(e){m=!0,t.onFocus(e),y()})),this.focus=function(){if(p)return n.focus();var e=n.style.top;n.style.position="fixed",n.style.top="0px",n.focus(),setTimeout((function(){n.style.position="","0px"==n.style.top&&(n.style.top=e)}),0)},this.blur=function(){n.blur()},this.isFocused=function(){return m};var v=a.delayedCall((function(){m&&y(g)})),b=a.delayedCall((function(){f||(n.value=u,m&&y())}));function y(e){if(!f){if(f=!0,k)var t=0,i=e?0:n.value.length-1;else t=e?2:1,i=2;try{n.setSelectionRange(t,i)}catch(P){}f=!1}}function w(){f||(n.value=u,r.isWebKit&&b.schedule())}r.isWebKit||t.addEventListener("changeSelection",(function(){t.selection.isEmpty()!=g&&(g=!g,v.schedule())})),w(),m&&t.onFocus();var _=function(e){return 0===e.selectionStart&&e.selectionEnd===e.value.length},x=function(e){d?d=!1:_(n)?(t.selectAll(),y()):k&&y(t.selection.isEmpty())},k=null;this.setInputHandler=function(e){k=e},this.getInputHandler=function(){return k};var A=!1,C=function(e){k&&(e=k(e),k=null),h?(y(),e&&t.onPaste(e),h=!1):e==u.charAt(0)?A?t.execCommand("del",{source:"ace"}):t.execCommand("backspace",{source:"ace"}):(e.substring(0,2)==u?e=e.substr(2):e.charAt(0)==u.charAt(0)?e=e.substr(1):e.charAt(e.length-1)==u.charAt(0)&&(e=e.slice(0,-1)),e.charAt(e.length-1)==u.charAt(0)&&(e=e.slice(0,-1)),e&&t.onTextInput(e)),A&&(A=!1)},E=function(e){if(!f){var t=n.value;C(t),w()}},S=function(e,t,n){var i=e.clipboardData||window.clipboardData;if(i&&!o){var r=c||n?"Text":"text/plain";try{return t?!1!==i.setData(r,t):i.getData(r)}catch(e){if(!n)return S(e,t,!0)}}},F=function(e,r){var s=t.getCopyText();if(!s)return i.preventDefault(e);S(e,s)?(r?t.onCut():t.onCopy(),i.preventDefault(e)):(d=!0,n.value=s,n.select(),setTimeout((function(){d=!1,w(),y(),r?t.onCut():t.onCopy()})))},$=function(e){F(e,!0)},T=function(e){F(e,!1)},L=function(e){var s=S(e);"string"==typeof s?(s&&t.onPaste(s,e),r.isIE&&setTimeout(y),i.preventDefault(e)):(n.value="",h=!0)};i.addCommandKeyListener(n,t.onCommandKey.bind(t)),i.addListener(n,"select",x),i.addListener(n,"input",E),i.addListener(n,"cut",$),i.addListener(n,"copy",T),i.addListener(n,"paste",L),"oncut"in n&&"oncopy"in n&&"onpaste"in n||i.addListener(e,"keydown",(function(e){if((!r.isMac||e.metaKey)&&e.ctrlKey)switch(e.keyCode){case 67:T(e);break;case 86:L(e);break;case 88:$(e);break}}));var D,B=function(e){f||!t.onCompositionStart||t.$readOnly||(f={},f.canUndo=t.session.$undoManager,t.onCompositionStart(),setTimeout(R,0),t.on("mousedown",O),f.canUndo&&!t.selection.isEmpty()&&(t.insert(""),t.session.markUndoGroup(),t.selection.clearSelection()),t.session.markUndoGroup())},R=function(){if(f&&t.onCompositionUpdate&&!t.$readOnly){var e=n.value.replace(/\u2028/g,"");if(f.lastValue!==e&&(t.onCompositionUpdate(e),f.lastValue&&t.undo(),f.canUndo&&(f.lastValue=e),f.lastValue)){var i=t.selection.getRange();t.insert(f.lastValue),t.session.markUndoGroup(),f.range=t.selection.getRange(),t.selection.setRange(i),t.selection.clearSelection()}}},O=function(e){if(t.onCompositionEnd&&!t.$readOnly){var i=f;f=!1;var s=setTimeout((function(){s=null;var e=n.value.replace(/\u2028/g,"");f||(e==i.lastValue?w():!i.lastValue&&e&&(w(),C(e)))}));k=function(e){return s&&clearTimeout(s),e=e.replace(/\u2028/g,""),e==i.lastValue?"":(i.lastValue&&s&&t.undo(),e)},t.onCompositionEnd(),t.removeListener("mousedown",O),"compositionend"==e.type&&i.range&&t.selection.setRange(i.range);var a=!!r.isChrome&&r.isChrome>=53||!!r.isWebKit&&r.isWebKit>=603;a&&E()}},M=a.delayedCall(R,50);function j(){clearTimeout(D),D=setTimeout((function(){p&&(n.style.cssText=p,p=""),null==t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=!0,t.renderer.$moveTextAreaToCursor())}),0)}i.addListener(n,"compositionstart",B),r.isGecko?i.addListener(n,"text",(function(){M.schedule()})):(i.addListener(n,"keyup",(function(){M.schedule()})),i.addListener(n,"keydown",(function(){M.schedule()}))),i.addListener(n,"compositionend",O),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){A=!0,y(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,a){p||(p=n.style.cssText),n.style.cssText=(a?"z-index:100000;":"")+"height:"+n.style.height+";"+(r.isIE?"opacity:0.1;":"");var o=t.container.getBoundingClientRect(),c=s.computedStyle(t.container),l=o.top+(parseInt(c.borderTopWidth)||0),u=o.left+(parseInt(o.borderLeftWidth)||0),d=o.bottom-l-n.clientHeight-2,h=function(e){n.style.left=e.clientX-u-2+"px",n.style.top=Math.min(e.clientY-l-2,d)+"px"};h(e),"mousedown"==e.type&&(t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout(D),r.isWin&&i.capture(t.container,h,j))},this.onContextMenuClose=j;var I=function(e){t.textInput.onContextMenu(e),j()};i.addListener(n,"mouseup",I),i.addListener(n,"mousedown",(function(e){e.preventDefault(),j()})),i.addListener(t.renderer.scroller,"contextmenu",I),i.addListener(n,"contextmenu",I)};t.TextInput=u})),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],(function(e,t,n){"use strict";e("../lib/dom"),e("../lib/event");var i=e("../lib/useragent"),r=0,s=250;function a(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e)),t.setDefaultHandler("touchmove",this.onTouchMove.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach((function(t){e[t]=this[t]}),this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function o(e,t,n,i){return Math.sqrt(Math.pow(n-e,2)+Math.pow(i-t,2))}function c(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row!=e.end.row-1||e.start.column||e.end.column)n=2*t.row-e.start.row-e.end.row;else var n=t.column-4;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor,s=e.getButton();if(0!==s){var a=r.getSelectionRange(),o=a.isEmpty();return r.$blockScrolling++,(o||1==s)&&r.selection.moveToPosition(n),r.$blockScrolling--,void(2==s&&(r.textInput.onContextMenu(e.domEvent),i.isMozilla||e.preventDefault()))}return this.mousedownEvent.time=Date.now(),!t||r.isFocused()||(r.focus(),!this.$focusTimout||this.$clickSelection||r.inMultiSelectMode)?(this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()):(this.setState("focusWait"),void this.captureMouse(e))},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(t.$blockScrolling++,this.$clickSelection){var i=this.$clickSelection.comparePoint(n);if(-1==i)e=this.$clickSelection.end;else if(1==i)e=this.$clickSelection.start;else{var r=c(this.$clickSelection,n);n=r.cursor,e=r.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,i=n.renderer.screenToTextCoordinates(this.x,this.y),r=n.selection[e](i.row,i.column);if(n.$blockScrolling++,this.$clickSelection){var s=this.$clickSelection.comparePoint(r.start),a=this.$clickSelection.comparePoint(r.end);if(-1==s&&a<=0)t=this.$clickSelection.end,r.end.row==i.row&&r.end.column==i.column||(i=r.start);else if(1==a&&s>=0)t=this.$clickSelection.start,r.start.row==i.row&&r.start.column==i.column||(i=r.end);else if(-1==s&&1==a)i=r.end,t=r.start;else{var o=c(this.$clickSelection,i);i=o.cursor,t=o.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(i),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=o(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>r||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,i=n.session,r=i.getBracketRange(t);r?(r.isEmpty()&&(r.start.column--,r.end.column++),this.setState("select")):(r=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=r,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var i=n.getSelectionRange();i.isMultiLine()&&i.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(i.start.row),this.$clickSelection.end=n.selection.getLineRange(i.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(!e.getAccelKey()){e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=this.editor;this.$lastScroll||(this.$lastScroll={t:0,vx:0,vy:0,allowed:0});var n=this.$lastScroll,i=e.domEvent.timeStamp,r=i-n.t,a=e.wheelX/r,o=e.wheelY/r;r=1&&t.renderer.isScrollableBy(e.wheelX*e.speed,0)&&(l=!0),c<=1&&t.renderer.isScrollableBy(0,e.wheelY*e.speed)&&(l=!0),l)n.allowed=i;else if(i-n.alloweda.session.documentToScreenRow(u.row,u.column))return d()}if(r!=i)if(r=i.text.join("
    "),l.setHtml(r),l.show(),a._signal("showGutterTooltip",l),a.on("mousewheel",d),e.$tooltipFollowsMouse)h(n);else{var f=n.domEvent.target,p=f.getBoundingClientRect(),g=l.getElement().style;g.left=p.right+"px",g.top=p.bottom+"px"}}function d(){t&&(t=clearTimeout(t)),r&&(l.hide(),r=null,a._signal("hideGutterTooltip",l),a.removeEventListener("mousewheel",d))}function h(e){l.setPosition(e.x,e.y)}e.editor.setDefaultHandler("guttermousedown",(function(t){if(a.isFocused()&&0==t.getButton()){var n=o.getRegion(t);if("foldWidgets"!=n){var i=t.getDocumentPosition().row,r=a.session.selection;if(t.getShiftKey())r.selectTo(i,0);else{if(2==t.domEvent.detail)return a.selectAll(),t.preventDefault();e.$clickSelection=a.selection.getLineRange(i)}return e.setState("selectByLines"),e.captureMouse(t),t.preventDefault()}}})),e.editor.setDefaultHandler("guttermousemove",(function(s){var a=s.domEvent.target||s.domEvent.srcElement;if(i.hasCssClass(a,"ace_fold-widget"))return d();r&&e.$tooltipFollowsMouse&&h(s),n=s,t||(t=setTimeout((function(){t=null,n&&!e.isMousePressed?u():d()}),50))})),s.addListener(a.renderer.$gutter,"mouseout",(function(e){n=null,r&&!t&&(t=setTimeout((function(){t=null,d()}),50))})),a.on("changeSession",d)}function c(e){a.call(this,e)}r.inherits(c,a),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,i=window.innerHeight||document.documentElement.clientHeight,r=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+r>n&&(e-=e+r-n),t+s>i&&(t-=20+s),a.prototype.setPosition.call(this,e,t)}}.call(c.prototype),t.GutterHandler=o})),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],(function(e,t,n){"use strict";var i=e("../lib/event"),r=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){i.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){i.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos||(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY)),this.$pos},this.inSelection=function(){if(null!==this.$inSelection)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return i.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=r.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)})),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],(function(e,t,n){"use strict";var i=e("../lib/dom"),r=e("../lib/event"),s=e("../lib/useragent"),a=200,o=200,c=5;function l(e){var t=e.editor,n=i.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var l=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];l.forEach((function(t){e[t]=this[t]}),this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var d,h,f,p,g,m,v,b,y,w,_,x=t.container,k=0;function A(e,n){var i=Date.now(),r=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!w||r||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,w=i,_={x:h,y:f};else{var a=u(_.x,_.y,h,f);a>c?w=null:i-w>=o&&(t.renderer.scrollCursorIntoView(),w=null)}}function C(e,n){var i=Date.now(),r=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,o=t.renderer.scroller.getBoundingClientRect(),c={x:{left:h-o.left,right:o.right-h},y:{top:f-o.top,bottom:o.bottom-f}},l=Math.min(c.x.left,c.x.right),u=Math.min(c.y.top,c.y.bottom),d={row:e.row,column:e.column};l/s<=2&&(d.column+=c.x.left=a&&t.renderer.scrollCursorIntoView(d):y=i:y=null}function E(){var e=m;m=t.renderer.screenToTextCoordinates(h,f),A(m,e),C(m,e)}function S(){g=t.selection.toOrientedRange(),d=t.session.addMarker(g,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(p),E(),p=setInterval(E,20),k=0,r.addListener(document,"mousemove",T)}function F(){clearInterval(p),t.session.removeMarker(d),d=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(g),t.$blockScrolling-=1,t.isFocused()&&!b&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),g=null,m=null,k=0,y=null,w=null,r.removeListener(document,"mousemove",T)}this.onDragStart=function(e){if(this.cancelDrag||!x.draggable){var i=this;return setTimeout((function(){i.startSelect(),i.captureMouse(e)}),0),e.preventDefault()}g=t.getSelectionRange();var r=e.dataTransfer;r.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),r.setDragImage&&r.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),r.clearData(),r.setData("Text",t.session.getTextRange()),b=!0,this.setState("drag")},this.onDragEnd=function(e){if(x.draggable=!1,b=!1,this.setState(null),!t.getReadOnly()){var n=e.dataTransfer.dropEffect;v||"move"!=n||t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(!t.getReadOnly()&&L(e.dataTransfer))return h=e.clientX,f=e.clientY,d||S(),k++,e.dataTransfer.dropEffect=v=D(e),r.preventDefault(e)},this.onDragOver=function(e){if(!t.getReadOnly()&&L(e.dataTransfer))return h=e.clientX,f=e.clientY,d||(S(),k++),null!==$&&($=null),e.dataTransfer.dropEffect=v=D(e),r.preventDefault(e)},this.onDragLeave=function(e){if(k--,k<=0&&d)return F(),v=null,r.preventDefault(e)},this.onDrop=function(e){if(m){var n=e.dataTransfer;if(b)switch(v){case"move":g=g.contains(m.row,m.column)?{start:m,end:m}:t.moveText(g,m);break;case"copy":g=t.moveText(g,m,!0);break}else{var i=n.getData("Text");g={start:m,end:t.session.insert(m,i)},t.focus(),v=null}return F(),r.preventDefault(e)}},r.addListener(x,"dragstart",this.onDragStart.bind(e)),r.addListener(x,"dragend",this.onDragEnd.bind(e)),r.addListener(x,"dragenter",this.onDragEnter.bind(e)),r.addListener(x,"dragover",this.onDragOver.bind(e)),r.addListener(x,"dragleave",this.onDragLeave.bind(e)),r.addListener(x,"drop",this.onDrop.bind(e));var $=null;function T(){null==$&&($=setTimeout((function(){null!=$&&d&&F()}),20))}function L(e){var t=e.types;return!t||Array.prototype.some.call(t,(function(e){return"text/plain"==e||"Text"==e}))}function D(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],i=s.isMac?e.altKey:e.ctrlKey,r="uninitialized";try{r=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var a="none";return i&&t.indexOf(r)>=0?a="copy":n.indexOf(r)>=0?a="move":t.indexOf(r)>=0&&(a="copy"),a}}function u(e,t,n,i){return Math.sqrt(Math.pow(n-e,2)+Math.pow(i-t,2))}(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&"dragReady"==this.state){var n=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if("dragWait"===this.state){n=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(this.$dragEnabled){this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),i=e.getButton(),r=e.domEvent.detail||1;if(1===r&&0===i&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var a=e.domEvent.target||e.domEvent.srcElement;if("unselectable"in a&&(a.unselectable="on"),t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var o=t.container;o.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}}).call(l.prototype),t.DragdropHandler=l})),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],(function(e,t,n){"use strict";var i=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){4===n.readyState&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=i.getDocumentHead(),r=document.createElement("script");r.src=e,n.appendChild(r),r.onload=r.onreadystatechange=function(e,n){!n&&r.readyState&&"loaded"!=r.readyState&&"complete"!=r.readyState||(r=r.onload=r.onreadystatechange=null,n||t())}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}})),ace.define("ace/lib/event_emitter",["require","exports","module"],(function(e,t,n){"use strict";var i={},r=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};i._emit=i._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],i=this._defaultHandlers[e];if(n.length||i){"object"==typeof t&&t||(t={}),t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=r),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var a=0;a1&&(r=n[n.length-2]);var a=c[t+"Path"];return null==a?a=c.basePath:"/"==i&&(t=i=""),a&&"/"!=a.slice(-1)&&(a+="/"),a+t+i+r+this.get("suffix")},t.setModuleUrl=function(e,t){return c.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,i){var r,a;Array.isArray(n)&&(a=n[0],n=n[1]);try{r=e(n)}catch(c){}if(r&&!t.$loading[n])return i&&i(r);if(t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(i),!(t.$loading[n].length>1)){var o=function(){e([n],(function(e){t._emit("load.module",{name:n,module:e});var i=t.$loading[n];t.$loading[n]=null,i.forEach((function(t){t&&t(e)}))}))};if(!t.get("packaged"))return o();s.loadScript(t.moduleUrl(n,a),o)}},l(!0),t.init=l})),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],(function(e,t,n){"use strict";var i=e("../lib/event"),r=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,a=e("./default_gutter_handler").GutterHandler,o=e("./mouse_event").MouseEvent,c=e("./dragdrop_handler").DragdropHandler,l=e("../config"),u=function(e){var t=this;this.editor=e,new s(this),new a(this),new c(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},o=e.renderer.getMouseEventTarget();i.addListener(o,"click",this.onMouseEvent.bind(this,"click")),i.addListener(o,"mousemove",this.onMouseMove.bind(this,"mousemove")),i.addMultiMouseDownListener([o,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),i.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),i.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var l=e.renderer.$gutter;i.addListener(l,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),i.addListener(l,"click",this.onMouseEvent.bind(this,"gutterclick")),i.addListener(l,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),i.addListener(l,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),i.addListener(o,"mousedown",n),i.addListener(l,"mousedown",n),r.isIE&&e.renderer.scrollBarV&&(i.addListener(e.renderer.scrollBarV.element,"mousedown",n),i.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",(function(n){if(!t.state&&!t.$dragDelay&&t.$dragEnabled){var i=e.renderer.screenToTextCoordinates(n.x,n.y),r=e.session.selection.getRange(),s=e.renderer;!r.isEmpty()&&r.insideStart(i.row,i.column)?s.setCursorStyle("default"):s.setCursorStyle("")}}))};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new o(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;n&&n.length&&this.editor._emit(e,new o(t,this.editor))},this.onMouseWheel=function(e,t){var n=new o(t,this.editor);n.speed=2*this.$scrollSpeed,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new o(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,a=function(e){if(e){if(r.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new o(e,s.editor),s.$mouseMoved=!0}},c=function(e){clearInterval(u),l(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",null==n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},l=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(r.isOldIE&&"dblclick"==e.domEvent.type)return setTimeout((function(){c(e)}));s.$onCaptureMouseMove=a,s.releaseMouse=i.capture(this.editor.container,a,c);var u=setInterval(l,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){t&&t.domEvent&&"contextmenu"!=t.domEvent.type||(this.editor.off("nativecontextmenu",e),t&&t.domEvent&&i.stopEvent(t.domEvent))}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(u.prototype),l.defineOptions(u.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:r.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=u})),ace.define("ace/mouse/fold_handler",["require","exports","module"],(function(e,t,n){"use strict";function i(e){e.on("click",(function(t){var n=t.getDocumentPosition(),i=e.session,r=i.getFoldAt(n.row,n.column,1);r&&(t.getAccelKey()?i.removeFold(r):i.expandFold(r),t.stop())})),e.on("gutterclick",(function(t){var n=e.renderer.$gutterLayer.getRegion(t);if("foldWidgets"==n){var i=t.getDocumentPosition().row,r=e.session;r.foldWidgets&&r.foldWidgets[i]&&e.session.onFoldWidgetClick(i,t),e.isFocused()||e.focus(),t.stop()}})),e.on("gutterdblclick",(function(t){var n=e.renderer.$gutterLayer.getRegion(t);if("foldWidgets"==n){var i=t.getDocumentPosition().row,r=e.session,s=r.getParentFoldRangeData(i,!0),a=s.range||s.firstRange;if(a){i=a.start.row;var o=r.getFoldAt(i,r.getLine(i).length,1);o?r.removeFold(o):(r.addFold("...",a),e.renderer.scrollCursorIntoView({row:a.start.row,column:0}))}t.stop()}}))}t.FoldHandler=i})),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],(function(e,t,n){"use strict";var i=e("../lib/keys"),r=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]!=e){while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)}},this.addKeyboardHandler=function(e,t){if(e){"function"!=typeof e||e.handleKeyboard||(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);-1!=n&&this.$handlers.splice(n,1),void 0==t?this.$handlers.push(e):this.$handlers.splice(t,0,e),-1==n&&e.attach&&e.attach(this.$editor)}},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return-1!=t&&(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map((function(n){return n.getStatusText&&n.getStatusText(t,e)||""})).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,i){for(var s,a=!1,o=this.$editor.commands,c=this.$handlers.length;c--;)if(s=this.$handlers[c].handleKeyboard(this.$data,e,t,n,i),s&&s.command&&(a="null"==s.command||o.exec(s.command,this.$editor,s.args,i),a&&i&&-1!=e&&1!=s.passEvent&&1!=s.command.passEvent&&r.stopEvent(i),a))break;return a||-1!=e||(s={command:"insertstring"},a=o.exec("insertstring",this.$editor,t)),a&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),a},this.onCommandKey=function(e,t,n){var r=i.keyCodeToString(n);this.$callKeyboardHandlers(t,r,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s})),ace.define("ace/lib/bidiutil",["require","exports","module"],(function(e,t,n){"use strict";var i=0,r=0,s=!1,a=!1,o=!1,c=[[0,3,0,1,0,0,0],[0,3,0,1,2,2,0],[0,3,0,17,2,0,1],[0,3,5,5,4,1,0],[0,3,21,21,4,0,1],[0,3,5,5,4,2,0]],l=[[2,0,1,1,0,1,0],[2,0,1,1,0,2,0],[2,0,2,1,3,2,0],[2,0,2,33,3,1,1]],u=0,d=1,h=0,f=1,p=2,g=3,m=4,v=5,b=6,y=7,w=8,_=9,x=10,k=11,A=12,C=13,E=14,S=15,F=16,$=17,T=18,L=[T,T,T,T,T,T,T,T,T,b,v,b,w,v,T,T,T,T,T,T,T,T,T,T,T,T,T,T,v,v,v,b,w,m,m,k,k,k,m,m,m,m,m,x,_,x,_,_,p,p,p,p,p,p,p,p,p,p,_,m,m,m,m,m,m,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,m,m,m,m,m,m,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,m,m,m,m,T,T,T,T,T,T,v,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,_,m,k,k,k,k,m,m,m,m,h,m,m,T,m,m,k,k,p,p,m,h,m,m,m,p,h,m,m,m,m,m],D=[w,w,w,w,w,w,w,w,w,w,w,T,T,T,h,f,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,w,v,C,E,S,F,$,_,k,k,k,k,k,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,_,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,m,w];function B(e,t,n,u){var d=i?l:c,h=null,f=null,p=null,g=0,m=null,y=null,_=-1,x=null,k=null,A=[];if(!u)for(x=0,u=[];x0)if(16==m){for(x=_;x-1){for(x=_;x=0;C--){if(u[C]!=w)break;t[C]=i}}}function R(e,t,n){if(!(r=e){s=h+1;while(s=e)s++;for(o=h,c=s-1;o=t.length||(c=n[r-1])!=p&&c!=g||(l=t[r+1])!=p&&l!=g?m:(s&&(l=g),l==c?l:m);case x:return c=r>0?n[r-1]:v,c==p&&r+10&&n[r-1]==p)return p;if(s)return m;d=r+1,u=t.length;while(d=1425&&D<=2303||64286==D;if(c=t[d],B&&(c==f||c==y))return f}return r<1||(c=t[r-1])==v?m:n[r-1];case v:return s=!1,a=!0,i;case b:return o=!0,m;case C:case E:case F:case $:case S:s=!1;case T:return m}}function M(e){var t=e.charCodeAt(0),n=t>>8;return 0==n?t>191?h:L[t]:5==n?/[\u0591-\u05f4]/.test(e)?f:h:6==n?/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(e)?A:/[\u0660-\u0669\u066b-\u066c]/.test(e)?g:1642==t?k:/[\u06f0-\u06f9]/.test(e)?p:y:32==n&&t<=8287?D[255&t]:254==n&&t>=65136?y:m}t.L=h,t.R=f,t.EN=p,t.ON_R=3,t.AN=4,t.R_H=5,t.B=6,t.DOT="·",t.doBidiReorder=function(e,n,r){if(e.length<2)return{};var s=e.split(""),a=new Array(s.length),o=new Array(s.length),c=[];i=r?d:u,B(s,c,s.length,n);for(var l=0;ly&&n[l]0&&"ل"===s[l-1]&&/\u0622|\u0623|\u0625|\u0627/.test(s[l])&&(c[l-1]=c[l]=t.R_H,l++);s[s.length-1]===t.DOT&&(c[s.length-1]=t.B);for(l=0;l=0&&(e=this.session.$docRowCache[n])}return e},this.getSplitIndex=function(){var e=0,t=this.session.$screenRowCache;if(t.length){var n,i=this.session.$getRowCacheIndex(t,this.currentRow);while(this.currentRow-e>0){if(n=this.session.$getRowCacheIndex(t,this.currentRow-e-1),n!==i)break;i=n,e++}}return e},this.updateRowLine=function(e,t){if(void 0===e&&(e=this.getDocumentRow()),this.wrapIndent=0,this.isLastRow=e===this.session.getLength()-1,this.line=this.session.getLine(e),this.session.$useWrapMode){var n=this.session.$wrapData[e];n&&(void 0===t&&(t=this.getSplitIndex()),t>0&&n.length?(this.wrapIndent=n.indent,this.line=t0?e-1:0,this.bidiMap),n=this.bidiMap.bidiLevels,r=0;0===e&&n[t]%2!==0&&t++;for(var s=0;s=l&&rn+a/2){if(n+=a,r===s.length-1){a=0;break}a=this.charWidths[s[++r]]}return r>0&&s[r-1]%2!==0&&s[r]%2===0?(e0&&s[r-1]%2===0&&s[r]%2!==0?t=1+(e>n?this.bidiMap.logicalFromVisual[r]:this.bidiMap.logicalFromVisual[r-1]):this.isRtlDir&&r===s.length-1&&0===a&&s[r-1]%2===0||!this.isRtlDir&&0===r&&s[r]%2!==0?t=1+this.bidiMap.logicalFromVisual[r]:(r>0&&s[r-1]%2!==0&&0!==a&&r--,t=this.bidiMap.logicalFromVisual[r]),t+this.wrapIndent}}).call(o.prototype),t.BidiHandler=o})),ace.define("ace/range",["require","exports","module"],(function(e,t,n){"use strict";var i=function(e,t){return e.row-t.row||e.column-t.column},r=function(e,t,n,i){this.start={row:e,column:t},this.end={row:n,column:i}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return 0==this.compare(e,t)},this.compareRange=function(e){var t,n=e.end,i=e.start;return t=this.compare(n.row,n.column),1==t?(t=this.compare(i.row,i.column),1==t?2:0==t?1:0):-1==t?-2:(t=this.compare(i.row,i.column),-1==t?-1:1==t?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return 0==this.comparePoint(e.start)&&0==this.comparePoint(e.end)},this.intersects=function(e){var t=this.compareRange(e);return-1==t||0==t||1==t},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){"object"==typeof e?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){"object"==typeof e?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return 0==this.compare(e,t)&&(!this.isEnd(e,t)&&!this.isStart(e,t))},this.insideStart=function(e,t){return 0==this.compare(e,t)&&!this.isEnd(e,t)},this.insideEnd=function(e,t){return 0==this.compare(e,t)&&!this.isStart(e,t)},this.compare=function(e,t){return this.isMultiLine()||e!==this.start.row?ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0:tthis.end.column?1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var i={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?a.fromPoints(t,t):this.isBackwards()?a.fromPoints(t,e):a.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection((function(){this.moveCursorTo(e,t)}))},this.selectToPosition=function(e){this.$moveSelection((function(){this.moveCursorToPosition(e)}))},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if("undefined"==typeof t){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n,i="number"==typeof e?e:this.lead.row,r=this.session.getFoldLine(i);return r?(i=r.start.row,n=r.end.row):n=i,!0===t?new a(i,0,n,this.session.getLine(n).length):new a(i,0,n+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.wouldMoveIntoSoftTab=function(e,t,n){var i=e.column,r=e.column+t;return n<0&&(i=e.column-t,r=e.column),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(i,r).split(" ").length-1==t},this.moveCursorLeft=function(){var e,t=this.lead.getPosition();if(e=this.session.getFoldAt(t.row,t.column,-1))this.moveCursorTo(e.start.row,e.start.column);else if(0===t.column)t.row>0&&this.moveCursorTo(t.row-1,this.doc.getLine(t.row-1).length);else{var n=this.session.getTabSize();this.wouldMoveIntoSoftTab(t,n,-1)&&!this.session.getNavigateWithinSoftTabs()?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e,t=this.lead.getPosition();if(e=this.session.getFoldAt(t.row,t.column,1))this.moveCursorTo(e.end.row,e.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=i)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),i=n.substring(t);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var r=this.session.getFoldAt(e,t,1);if(r)this.moveCursorTo(r.end.row,r.end.column);else{if(this.session.nonTokenRe.exec(i)&&(t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,i=n.substring(t)),t>=n.length)return this.moveCursorTo(e,n.length),this.moveCursorRight(),void(e0&&this.moveCursorWordLeft());this.session.tokenRe.exec(s)&&(n-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(t,n)}},this.$shortWordEndIndex=function(e){var t,n=0,i=/\s/,r=this.session.tokenRe;if(r.lastIndex=0,this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((t=e[n])&&i.test(t))n++;if(n<1){r.lastIndex=0;while((t=e[n])&&!r.test(t))if(r.lastIndex=0,n++,i.test(t)){if(n>2){n--;break}while((t=e[n])&&i.test(t))n++;if(n>2)break}}}return r.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),i=n.substring(t),r=this.session.getFoldAt(e,t,1);if(r)return this.moveCursorTo(r.end.row,r.end.column);if(t==n.length){var s=this.doc.getLength();do{e++,i=this.doc.getLine(e)}while(e0&&/^\s*$/.test(i));n=i.length,/\s+$/.test(i)||(i="")}var s=r.stringReverse(i),a=this.$shortWordEndIndex(s);return this.moveCursorTo(t,n-a)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n,i=this.session.documentToScreenPosition(this.lead.row,this.lead.column);0===t&&(0!==e&&(this.session.$bidiHandler.isBidiRow(i.row,this.lead.row)?(n=this.session.$bidiHandler.getPosLeft(i.column),i.column=Math.round(n/this.session.$bidiHandler.charWidths[0])):n=i.column*this.session.$bidiHandler.charWidths[0]),this.$desiredColumn?i.column=this.$desiredColumn:this.$desiredColumn=i.column);var r=this.session.screenToDocumentPosition(i.row+e,i.column,n);0!==e&&0===t&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,0===t)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var i=this.session.getFoldAt(e,t,1);i&&(e=i.start.row,t=i.start.column),this.$keepDesiredColumnOnChange=!0;var r=this.session.getLine(e);/[\uDC00-\uDFFF]/.test(r.charAt(t))&&r.charAt(t-1)&&(this.lead.row==e&&this.lead.column==t+1?t-=1:t+=1),this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var i=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(i.row,i.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return a.fromPoints(t,n)}catch(i){return a.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map((function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t}));else{e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(void 0==e.start){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=a.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(o.prototype),t.Selection=o})),ace.define("ace/tokenizer",["require","exports","module","ace/config"],(function(e,t,n){"use strict";var i=e("./config"),r=2e3,s=function(e){for(var t in this.states=e,this.regExps={},this.matchMappings={},this.states){for(var n=this.states[t],i=[],r=0,s=this.matchMappings[t]={defaultToken:"text"},a="g",o=[],c=0;c1?this.$applyToken:l.token),d>1&&(/\\\d/.test(l.regex)?u=l.regex.replace(/\\([0-9]+)/g,(function(e,t){return"\\"+(parseInt(t,10)+r+1)})):(d=1,u=this.removeCapturingGroups(l.regex)),l.splitRegex||"string"==typeof l.token||o.push(l)),s[r]=c,r+=d,i.push(u),l.onMatch||(l.onMatch=null)}}i.length||(s[0]=0,i.push("$")),o.forEach((function(e){e.splitRegex=this.createSplitterRegexp(e.regex,a)}),this),this.regExps[t]=new RegExp("("+i.join(")|(")+")|($)",a)}};(function(){this.$setMaxTokenCount=function(e){r=0|e},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if("string"===typeof n)return[{type:n,value:e}];for(var i=[],r=0,s=n.length;ru){var v=e.substring(u,m-g.length);h.type==f?h.value+=v:(h.type&&l.push(h),h={type:f,value:v})}for(var b=0;br){d>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(u1&&n[0]!==i&&n.unshift("#tmp",i),{tokens:l,state:n.length?n:i}},this.reportError=i.reportError}).call(s.prototype),t.Tokenizer=s})),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],(function(e,t,n){"use strict";var i=e("../lib/lang"),r=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(t)for(var n in e){for(var i=e[n],r=0;r=this.$rowTokens.length){if(this.$row+=1,e||(e=this.$session.getLength()),this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(void 0!==n)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}},this.getCurrentTokenRange=function(){var e=this.$rowTokens[this.$tokenIndex],t=this.getCurrentTokenColumn();return new i(this.$row,t,this.$row,t+e.value.length)}}).call(r.prototype),t.TokenIterator=r})),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],(function(e,t,n){"use strict";var i,r=e("../../lib/oop"),s=e("../behaviour").Behaviour,a=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),c=["text","paren.rparen","punctuation.operator"],l=["text","paren.rparen","punctuation.operator","comment"],u={},d={'"':'"',"'":"'"},h=function(e){var t=-1;if(e.multiSelect&&(t=e.selection.index,u.rangeCount!=e.multiSelect.rangeCount&&(u={rangeCount:e.multiSelect.rangeCount})),u[t])return i=u[t];i=u[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},f=function(e,t,n,i){var r=e.end.row-e.start.row;return{text:n+t+i,selection:[0,e.start.column+1,r,e.end.column+(r?0:1)]}},p=function(e){this.add("braces","insertion",(function(t,n,r,s,a){var c=r.getCursorPosition(),l=s.doc.getLine(c.row);if("{"==a){h(r);var u=r.getSelectionRange(),d=s.doc.getTextRange(u);if(""!==d&&"{"!==d&&r.getWrapBehavioursEnabled())return f(u,d,"{","}");if(p.isSaneInsertion(r,s))return/[\]\}\)]/.test(l[c.column])||r.inMultiSelectMode||e&&e.braces?(p.recordAutoInsert(r,s,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(r,s,"{"),{text:"{",selection:[1,1]})}else if("}"==a){h(r);var g=l.substring(c.column,c.column+1);if("}"==g){var m=s.$findOpeningBracket("}",{column:c.column+1,row:c.row});if(null!==m&&p.isAutoInsertedClosing(c,l,a))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if("\n"==a||"\r\n"==a){h(r);var v="";p.isMaybeInsertedClosing(c,l)&&(v=o.stringRepeat("}",i.maybeInsertedBrackets),p.clearMaybeInsertedClosing());g=l.substring(c.column,c.column+1);if("}"===g){var b=s.findMatchingBracket({row:c.row,column:c.column+1},"}");if(!b)return null;var y=this.$getIndent(s.getLine(b.row))}else{if(!v)return void p.clearMaybeInsertedClosing();y=this.$getIndent(l)}var w=y+s.getTabString();return{text:"\n"+w+"\n"+y+v,selection:[1,w.length,1,w.length]}}p.clearMaybeInsertedClosing()}})),this.add("braces","deletion",(function(e,t,n,r,s){var a=r.doc.getTextRange(s);if(!s.isMultiLine()&&"{"==a){h(n);var o=r.doc.getLine(s.start.row),c=o.substring(s.end.column,s.end.column+1);if("}"==c)return s.end.column++,s;i.maybeInsertedBrackets--}})),this.add("parens","insertion",(function(e,t,n,i,r){if("("==r){h(n);var s=n.getSelectionRange(),a=i.doc.getTextRange(s);if(""!==a&&n.getWrapBehavioursEnabled())return f(s,a,"(",")");if(p.isSaneInsertion(n,i))return p.recordAutoInsert(n,i,")"),{text:"()",selection:[1,1]}}else if(")"==r){h(n);var o=n.getCursorPosition(),c=i.doc.getLine(o.row),l=c.substring(o.column,o.column+1);if(")"==l){var u=i.$findOpeningBracket(")",{column:o.column+1,row:o.row});if(null!==u&&p.isAutoInsertedClosing(o,c,r))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}})),this.add("parens","deletion",(function(e,t,n,i,r){var s=i.doc.getTextRange(r);if(!r.isMultiLine()&&"("==s){h(n);var a=i.doc.getLine(r.start.row),o=a.substring(r.start.column+1,r.start.column+2);if(")"==o)return r.end.column++,r}})),this.add("brackets","insertion",(function(e,t,n,i,r){if("["==r){h(n);var s=n.getSelectionRange(),a=i.doc.getTextRange(s);if(""!==a&&n.getWrapBehavioursEnabled())return f(s,a,"[","]");if(p.isSaneInsertion(n,i))return p.recordAutoInsert(n,i,"]"),{text:"[]",selection:[1,1]}}else if("]"==r){h(n);var o=n.getCursorPosition(),c=i.doc.getLine(o.row),l=c.substring(o.column,o.column+1);if("]"==l){var u=i.$findOpeningBracket("]",{column:o.column+1,row:o.row});if(null!==u&&p.isAutoInsertedClosing(o,c,r))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}})),this.add("brackets","deletion",(function(e,t,n,i,r){var s=i.doc.getTextRange(r);if(!r.isMultiLine()&&"["==s){h(n);var a=i.doc.getLine(r.start.row),o=a.substring(r.start.column+1,r.start.column+2);if("]"==o)return r.end.column++,r}})),this.add("string_dquotes","insertion",(function(e,t,n,i,r){var s=i.$mode.$quotes||d;if(1==r.length&&s[r]){if(this.lineCommentStart&&-1!=this.lineCommentStart.indexOf(r))return;h(n);var a=r,o=n.getSelectionRange(),c=i.doc.getTextRange(o);if(!(""===c||1==c.length&&s[c])&&n.getWrapBehavioursEnabled())return f(o,c,a,a);if(!c){var l=n.getCursorPosition(),u=i.doc.getLine(l.row),p=u.substring(l.column-1,l.column),g=u.substring(l.column,l.column+1),m=i.getTokenAt(l.row,l.column),v=i.getTokenAt(l.row,l.column+1);if("\\"==p&&m&&/escape/.test(m.type))return null;var b,y=m&&/string|escape/.test(m.type),w=!v||/string|escape/.test(v.type);if(g==a)b=y!==w,b&&/string\.end/.test(v.type)&&(b=!1);else{if(y&&!w)return null;if(y&&w)return null;var _=i.$mode.tokenRe;_.lastIndex=0;var x=_.test(p);_.lastIndex=0;var k=_.test(p);if(x||k)return null;if(g&&!/[\s;,.})\]\\]/.test(g))return null;b=!0}return{text:b?a+a:"",selection:[1,1]}}}})),this.add("string_dquotes","deletion",(function(e,t,n,i,r){var s=i.doc.getTextRange(r);if(!r.isMultiLine()&&('"'==s||"'"==s)){h(n);var a=i.doc.getLine(r.start.row),o=a.substring(r.start.column+1,r.start.column+2);if(o==s)return r.end.column++,r}}))};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),i=new a(t,n.row,n.column);if(!this.$matchTokenType(i.getCurrentToken()||"text",c)){var r=new a(t,n.row,n.column+1);if(!this.$matchTokenType(r.getCurrentToken()||"text",c))return!1}return i.stepForward(),i.getCurrentTokenRow()!==n.row||this.$matchTokenType(i.getCurrentToken()||"text",l)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),s=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,s,i.autoInsertedLineEnd[0])||(i.autoInsertedBrackets=0),i.autoInsertedRow=r.row,i.autoInsertedLineEnd=n+s.substr(r.column),i.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),s=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,s)||(i.maybeInsertedBrackets=0),i.maybeInsertedRow=r.row,i.maybeInsertedLineStart=s.substr(0,r.column)+n,i.maybeInsertedLineEnd=s.substr(r.column),i.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return i.autoInsertedBrackets>0&&e.row===i.autoInsertedRow&&n===i.autoInsertedLineEnd[0]&&t.substr(e.column)===i.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return i.maybeInsertedBrackets>0&&e.row===i.maybeInsertedRow&&t.substr(e.column)===i.maybeInsertedLineEnd&&t.substr(0,e.column)==i.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){i.autoInsertedLineEnd=i.autoInsertedLineEnd.substr(1),i.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){i&&(i.maybeInsertedBrackets=0,i.maybeInsertedRow=-1)},r.inherits(p,s),t.CstyleBehaviour=p})),ace.define("ace/unicode",["require","exports","module"],(function(e,t,n){"use strict";function i(e){var n=/\w{4}/g;for(var i in e)t.packages[i]=e[i].replace(n,"\\u$&")}t.packages={},i({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})})),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],(function(e,t,n){"use strict";var i=e("../tokenizer").Tokenizer,r=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour/cstyle").CstyleBehaviour,a=e("../unicode"),o=e("../lib/lang"),c=e("../token_iterator").TokenIterator,l=e("../range").Range,u=function(){this.HighlightRules=r};(function(){this.$defaultBehaviour=new s,this.tokenRe=new RegExp("^["+a.packages.L+a.packages.Mn+a.packages.Mc+a.packages.Nd+a.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+a.packages.L+a.packages.Mn+a.packages.Mc+a.packages.Nd+a.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules(this.$highlightRuleConfig),this.$tokenizer=new i(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,i){var r=t.doc,s=!0,a=!0,c=1/0,l=t.getTabSize(),u=!1;if(this.lineCommentStart){if(Array.isArray(this.lineCommentStart))g=this.lineCommentStart.map(o.escapeRegExp).join("|"),f=this.lineCommentStart[0];else g=o.escapeRegExp(this.lineCommentStart),f=this.lineCommentStart;g=new RegExp("^(\\s*)(?:"+g+") ?"),u=t.getUseSoftTabs();b=function(e,t){var n=e.match(g);if(n){var i=n[1].length,s=n[0].length;h(e,i,s)||" "!=n[0][s-1]||s--,r.removeInLine(t,i,s)}};var d=f+" ",h=(v=function(e,t){s&&!/\S/.test(e)||(h(e,c,c)?r.insertInLine({row:t,column:c},d):r.insertInLine({row:t,column:c},f))},y=function(e,t){return g.test(e)},function(e,t,n){var i=0;while(t--&&" "==e.charAt(t))i++;if(i%l!=0)return!1;i=0;while(" "==e.charAt(n++))i++;return l>2?i%l!=l-1:i%l==0})}else{if(!this.blockComment)return!1;var f=this.blockComment.start,p=this.blockComment.end,g=new RegExp("^(\\s*)(?:"+o.escapeRegExp(f)+")"),m=new RegExp("(?:"+o.escapeRegExp(p)+")\\s*$"),v=function(e,t){y(e,t)||s&&!/\S/.test(e)||(r.insertInLine({row:t,column:e.length},p),r.insertInLine({row:t,column:c},f))},b=function(e,t){var n;(n=e.match(m))&&r.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(g))&&r.removeInLine(t,n[1].length,n[0].length)},y=function(e,n){if(g.test(e))return!0;for(var i=t.getTokens(n),r=0;re.length&&(_=e.length)})),c==1/0&&(c=_,s=!1,a=!1),u&&c%l!=0&&(c=Math.floor(c/l)*l),w(a?b:v)},this.toggleBlockComment=function(e,t,n,i){var r=this.blockComment;if(r){!r.start&&r[0]&&(r=r[0]);var s,a,o=new c(t,i.row,i.column),u=o.getCurrentToken(),d=(t.selection,t.selection.toOrientedRange());if(u&&/comment/.test(u.type)){var h,f;while(u&&/comment/.test(u.type)){var p=u.value.indexOf(r.start);if(-1!=p){var g=o.getCurrentTokenRow(),m=o.getCurrentTokenColumn()+p;h=new l(g,m,g,m+r.start.length);break}u=o.stepBackward()}o=new c(t,i.row,i.column),u=o.getCurrentToken();while(u&&/comment/.test(u.type)){p=u.value.indexOf(r.end);if(-1!=p){g=o.getCurrentTokenRow(),m=o.getCurrentTokenColumn()+p;f=new l(g,m,g,m+r.end.length);break}u=o.stepForward()}f&&t.remove(f),h&&(t.remove(h),s=h.start.row,a=-r.start.length)}else a=r.start.length,s=n.start.row,t.insert(n.end,r.end),t.insert(n.start,r.start);d.start.row==s&&(d.start.column+=a),d.end.row==s&&(d.end.column+=a),t.selection.fromOrientedRange(d)}},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){for(var t in this.$embeds=[],this.$modes={},e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(t=0;tthis.row)){var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)}},this.setPosition=function(e,t,n){var i;if(i=n?{row:e,column:t}:this.$clipPositionToDocument(e,t),this.row!=i.row||this.column!=i.column){var r={row:this.row,column:this.column};this.row=i.row,this.column=i.column,this._signal("change",{old:r,value:i})}},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)})),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,a=e("./range").Range,o=e("./anchor").Anchor,c=function(e){this.$lines=[""],0===e.length?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){i.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new a(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new o(this,e,t)},0==="aaa".split(/a/).length?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){this.$newLineMode!==e&&(this.$newLineMode=e,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return"\r\n"==e||"\r"==e||"\n"==e},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),i=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:i,action:"insert",lines:[t]},!0),this.clonePos(i)},this.clippedPos=function(e,t){var n=this.getLength();void 0===e?e=n:e<0?e=0:e>=n&&(e=n-1,t=void 0);var i=this.getLine(e);return void 0==t&&(t=i.length),t=Math.min(Math.max(t,0),i.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,i=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){return e instanceof a||(e=a.fromPoints(e.start,e.end)),0===t.length&&e.isEmpty()?e.start:t==this.getTextRange(e)?e.end:(this.remove(e),n=t?this.insert(e.start,t):e.start,n);var n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n="insert"==e.action;(n?e.lines.length<=1&&!e.lines[0]:!a.comparePoints(e.start,e.end))||(n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),r(this.$lines,e,t),this._signal("change",e))},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,i=n.length,r=e.start.row,s=e.start.column,a=0,o=0;do{a=o,o+=t-1;var c=n.slice(a,o);if(o>i){e.lines=c,e.start.row=r+a,e.start.column=s;break}c.push(""),this.applyDelta({start:this.pos(r+a,s),end:this.pos(r+o,s=0),action:e.action,lines:c},!0)}while(1)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:"insert"==e.action?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){for(var n=this.$lines||this.getAllLines(),i=this.getNewLineCharacter().length,r=t||0,s=n.length;r20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,-1==i&&(i=t),s<=i&&n.fireUpdateEvent(s,i)}}};(function(){i.implement(this,r),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(0===n)this.lines[t]=null;else if("remove"==e.action)this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var i=Array(n+1);i.unshift(t,1),this.lines.splice.apply(this.lines,i),this.states.splice.apply(this.states,i)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],i=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!==i.state+""?(this.states[e]=i.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=i.tokens}}).call(s.prototype),t.BackgroundTokenizer=s})),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],(function(e,t,n){"use strict";var i=e("./lib/lang"),r=(e("./lib/oop"),e("./range").Range),s=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){this.regExp+""!=e+""&&(this.regExp=e,this.cache=[])},this.update=function(e,t,n,s){if(this.regExp)for(var a=s.firstRow,o=s.lastRow,c=a;c<=o;c++){var l=this.cache[c];null==l&&(l=i.getMatchOffsets(n.getLine(c),this.regExp),l.length>this.MAX_RANGES&&(l=l.slice(0,this.MAX_RANGES)),l=l.map((function(e){return new r(c,e.offset,c,e.offset+e.length)})),this.cache[c]=l.length?l:"");for(var u=l.length;u--;)t.drawSingleLineMarker(e,l[u].toScreenRange(n),this.clazz,s)}}}).call(s.prototype),t.SearchHighlight=s})),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],(function(e,t,n){"use strict";var i=e("../range").Range;function r(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new i(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach((function(e){e.setFoldLine(this)}),this)}(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach((function(t){t.start.row+=e,t.end.row+=e}))},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort((function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)})),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var i,r,s,a=0,o=this.folds,c=!0;null==t&&(t=this.end.row,n=this.end.column);for(var l=0;l0)){var c=r(e,a.start);return 0===o?t&&0!==c?-s-2:s:c>0||0===c&&!t?s:-s-1}}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var i=this.pointIndex(e.end,t,n);return i<0?i=-i-1:i++,this.ranges.splice(n,i-n,e)},this.addList=function(e){for(var t=[],n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort((function(e,t){return r(e.start,t.start)}));for(var n,i=t[0],s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowi)break;if(u.start.row==i&&u.start.column>=t.column&&(u.start.column==t.column&&this.$insertRight||(u.start.column+=a,u.start.row+=s)),u.end.row==i&&u.end.column>=t.column){if(u.end.column==t.column&&this.$insertRight)continue;u.end.column==t.column&&a>0&&cu.start.column&&u.end.column==o[c+1].start.column&&(u.end.column-=a),u.end.column+=a,u.end.row+=s}}}if(0!=s&&c=e)return r;if(r.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,i=0;for(t&&(i=n.indexOf(t)),-1==i&&(i=0),i;i=e)return r}return null},this.getFoldedRowCount=function(e,t){for(var n=this.$foldData,i=t-e+1,r=0;r=t){o=e?i-=t-o:i=0);break}a>=e&&(i-=o>=e?a-o:a-e+1)}return i},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort((function(e,t){return e.start.row-t.start.row})),e},this.addFold=function(e,t){var n,i=this.$foldData,a=!1;e instanceof s?n=e:(n=new s(t,e),n.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(n.range);var o=n.start.row,c=n.start.column,l=n.end.row,u=n.end.column;if(!(o0&&(this.removeFolds(f),f.forEach((function(e){n.addSubFold(e)})));for(var p=0;p0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach((function(e){this.expandFold(e)}),this)},this.unfold=function(e,t){var n,r;if(null==e?(n=new i(0,0,this.getLength(),0),t=!0):n="number"==typeof e?new i(e,0,e,this.getLine(e).length):"row"in e?i.fromPoints(e,e):e,r=this.getFoldsInRangeList(n),t)this.removeFolds(r);else{var s=r;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(r.length)return r},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,i,r){null==i&&(i=e.start.row),null==r&&(r=0),null==t&&(t=e.end.row),null==n&&(n=this.getLine(t).length);var s=this.doc,a="";return e.walk((function(e,t,n,o){if(!(tu)break}while(s&&c.test(s.type));s=r.stepBackward()}else s=r.getCurrentToken();return l.end.row=r.getCurrentTokenRow(),l.end.column=r.getCurrentTokenColumn()+s.value.length-2,l}},this.foldAll=function(e,t,n){void 0==n&&(n=1e5);var i=this.foldWidgets;if(i){t=t||this.getLength(),e=e||0;for(var r=e;r=e){r=s.end.row;try{var a=this.addFold("...",s);a&&(a.collapseChildren=n)}catch(o){}}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle!=e){this.$foldStyle=e,"manual"==e&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)}},this.$setFolding=function(e){this.$foldMode!=e&&(this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation"),e&&"manual"!=this.$foldStyle?(this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)):this.foldWidgets=null)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var i,r=e-1;while(r>=0){var s=n[r];if(null==s&&(s=n[r]=this.getFoldWidget(r)),"start"==s){var a=this.getFoldWidgetRange(r);if(i||(i=a),a&&a.end.row>=e)break}r--}return{range:-1!==r&&a,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},i=this.$toggleFoldWidget(e,n);if(!i){var r=t.target||t.srcElement;r&&/ace_fold-widget/.test(r.className)&&(r.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(this.getFoldWidget){var n=this.getFoldWidget(e),i=this.getLine(e),r="end"===n?-1:1,s=this.getFoldAt(e,-1===r?0:i.length,r);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var a=this.getFoldWidgetRange(e,!0);if(a&&!a.isMultiLine()&&(s=this.getFoldAt(a.start.row,a.start.column,1),s&&a.isEqual(s.range)))return this.removeFold(s),s;if(t.siblings){var o=this.getParentFoldRangeData(e);if(o.range)var c=o.range.start.row+1,l=o.range.end.row;this.foldAll(c,l,t.all?1e4:0)}else t.children?(l=a?a.end.row:this.getLength(),this.foldAll(e+1,l,t.all?1e4:0)):a&&(t.all&&(a.collapseChildren=1e4),this.addFold("...",a));return a}},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(!n){var i=this.getParentFoldRangeData(t,!0);if(n=i.range||i.firstRange,n){t=n.start.row;var r=this.getFoldAt(t,this.getLine(t).length,1);r?this.removeFold(r):this.addFold("...",n)}}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(0===n)this.foldWidgets[t]=null;else if("remove"==e.action)this.foldWidgets.splice(t,n+1,null);else{var i=Array(n+1);i.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,i)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}t.Folding=o})),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],(function(e,t,n){"use strict";var i=e("../token_iterator").TokenIterator,r=e("../range").Range;function s(){this.findMatchingBracket=function(e,t){if(0==e.column)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(""==n)return null;var i=n.match(/([\(\[\{])|([\)\]\}])/);return i?i[1]?this.$findClosingBracket(i[1],e):this.$findOpeningBracket(i[2],e):null},this.getBracketRange=function(e){var t,n=this.getLine(e.row),i=!0,s=n.charAt(e.column-1),a=s&&s.match(/([\(\[\{])|([\)\]\}])/);if(a||(s=n.charAt(e.column),e={row:e.row,column:e.column+1},a=s&&s.match(/([\(\[\{])|([\)\]\}])/),i=!1),!a)return null;if(a[1]){var o=this.$findClosingBracket(a[1],e);if(!o)return null;t=r.fromPoints(e,o),i||(t.end.column++,t.start.column--),t.cursor=t.end}else{o=this.$findOpeningBracket(a[2],e);if(!o)return null;t=r.fromPoints(o,e),i||(t.start.column++,t.end.column--),t.cursor=t.start}return t},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var r=this.$brackets[e],s=1,a=new i(this,t.row,t.column),o=a.getCurrentToken();if(o||(o=a.stepForward()),o){n||(n=new RegExp("(\\.?"+o.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var c=t.column-a.getCurrentTokenColumn()-2,l=o.value;while(1){while(c>=0){var u=l.charAt(c);if(u==r){if(s-=1,0==s)return{row:a.getCurrentTokenRow(),column:c+a.getCurrentTokenColumn()}}else u==e&&(s+=1);c-=1}do{o=a.stepBackward()}while(o&&!n.test(o.type));if(null==o)break;l=o.value,c=l.length-1}return null}},this.$findClosingBracket=function(e,t,n){var r=this.$brackets[e],s=1,a=new i(this,t.row,t.column),o=a.getCurrentToken();if(o||(o=a.stepForward()),o){n||(n=new RegExp("(\\.?"+o.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var c=t.column-a.getCurrentTokenColumn();while(1){var l=o.value,u=l.length;while(cn&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,i=e.length-1;while(n<=i){var r=n+i>>1,s=e[r];if(t>s)n=r+1;else{if(!(t=t)break;return n=i[s],n?(n.index=s,n.start=r-n.value.length,n):null},this.setUndoManager=function(e){if(this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel(),e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=r.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?r.stringRepeat(" ",this.getTabSize()):"\t"},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.setNavigateWithinSoftTabs=function(e){this.setOption("navigateWithinSoftTabs",e)},this.getNavigateWithinSoftTabs=function(){return this.$navigateWithinSoftTabs},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(i=!!n.charAt(t-1).match(this.tokenRe)),i||(i=!!n.charAt(t).match(this.tokenRe)),i)var r=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))r=/\s/;else r=this.nonTokenRe;var s=t;if(s>0){do{s--}while(s>=0&&n.charAt(s).match(r));s++}var a=t;while(ae&&(e=t.screenWidth)})),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){if(this.$modified=!1,this.$useWrapMode)return this.screenWidth=this.$wrapLimit;for(var t=this.doc.getAllLines(),n=this.$rowLengthCache,i=0,r=0,s=this.$foldData[r],a=s?s.start.row:1/0,o=t.length,c=0;ca){if(c=s.end.row+1,c>=o)break;s=this.$foldData[r++],a=s?s.start.row:1/0}null==n[c]&&(n[c]=this.$getStringScreenWidth(t[c])[0]),n[c]>i&&(i=n[c])}this.screenWidth=i}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(e.length){this.$fromUndo=!0;for(var n=null,i=e.length-1;-1!=i;i--){var r=e[i];"doc"==r.group?(this.doc.revertDeltas(r.deltas),n=this.$getUndoSelection(r.deltas,!0,n)):r.deltas.forEach((function(e){this.addFolds(e.folds)}),this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n}},this.redoChanges=function(e,t){if(e.length){this.$fromUndo=!0;for(var n=null,i=0;ie.end.column&&(s.start.column+=o),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=o)),a&&s.start.row>=e.end.row&&(s.start.row+=a,s.end.row+=a)}if(s.end=this.insert(s.start,i),r.length){var c=e.start,l=s.start;a=l.row-c.row,o=l.column-c.column;this.addFolds(r.map((function(e){return e=e.clone(),e.start.row==c.row&&(e.start.column+=o),e.end.row==c.row&&(e.end.column+=o),e.start.row+=a,e.end.row+=a,e})))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var i=e;i<=t;i++)this.doc.insertInLine({row:i,column:0},n)},this.outdentRows=function(e){for(var t=e.collapseRows(),n=new u(0,0,0,0),i=this.getTabSize(),r=t.start.row;r<=t.end.row;++r){var s=this.getLine(r);n.start.row=r,n.end.row=r;for(var a=0;a0){i=this.getRowFoldEnd(t+n);if(i>this.doc.getLength()-1)return 0;r=i-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);r=t-e+1}var s=new u(e,0,t,Number.MAX_VALUE),a=this.getFoldsInRange(s).map((function(e){return e=e.clone(),e.start.row+=r,e.end.row+=r,e})),o=0==n?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+r,o),a.length&&this.addFolds(a),r},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){if(t=Math.max(0,t),e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){if(this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0),e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){this.$wrapLimitRange.min===e&&this.$wrapLimitRange.max===t||(this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$bidiHandler.markAsDirty(),this.$useWrapMode&&this._signal("changeWrapMode"))},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var i=this.$constrainWrapLimit(e,n.min,n.max);return i!=this.$wrapLimit&&i>1&&(this.$wrapLimit=i,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0)},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,i=e.start,r=e.end,s=i.row,a=r.row,o=a-s,c=null;if(this.$updating=!0,0!=o)if("remove"===n){this[t?"$wrapData":"$rowLengthCache"].splice(s,o);var l=this.$foldData;c=this.getFoldsInRange(e),this.removeFolds(c);var u=this.getFoldLine(r.row),d=0;if(u){u.addRemoveChars(r.row,r.column,i.column-r.column),u.shiftRow(-o);var h=this.getFoldLine(s);h&&h!==u&&(h.merge(u),u=h),d=l.indexOf(u)+1}for(d;d=r.row&&u.shiftRow(-o)}a=s}else{var f=Array(o);f.unshift(s,0);var p=t?this.$wrapData:this.$rowLengthCache;p.splice.apply(p,f);l=this.$foldData,u=this.getFoldLine(s),d=0;if(u){var g=u.range.compareInside(i.row,i.column);0==g?(u=u.split(i.row,i.column),u&&(u.shiftRow(o),u.addRemoveChars(a,0,r.column-i.column))):-1==g&&(u.addRemoveChars(s,0,r.column-i.column),u.shiftRow(o)),d=l.indexOf(u)+1}for(d;d=s&&u.shiftRow(o)}}else{o=Math.abs(e.start.column-e.end.column),"remove"===n&&(c=this.getFoldsInRange(e),this.removeFolds(c),o=-o);u=this.getFoldLine(s);u&&u.addRemoveChars(s,i.column,o)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,a):this.$updateRowLengthCache(s,a),c},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var i,r,a=this.doc.getAllLines(),o=this.getTabSize(),c=this.$wrapData,l=this.$wrapLimit,u=e;t=Math.min(t,a.length-1);while(u<=t)r=this.getFoldLine(u,r),r?(i=[],r.walk(function(e,t,r,o){var c;if(null!=e){c=this.$getDisplayTokens(e,i.length),c[0]=n;for(var l=1;l=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510)}this.$computeWrapSplits=function(e,i,r){if(0==e.length)return[];var a=[],o=e.length,l=0,u=0,h=this.$wrapAsCode,f=this.$indentedSoftWrap,m=i<=Math.max(2*r,8)||!1===f?0:Math.floor(i/2);function v(){var t=0;if(0===m)return t;if(f)for(var n=0;ni-y){var w=l+i-y;if(e[w-1]>=d&&e[w]>=d)b(w);else if(e[w]!=n&&e[w]!=s){var _=Math.max(w-(i-(i>>2)),l-1);while(w>_&&e[w]_&&e[w]_&&e[w]==c)w--}else while(w>_&&e[w]_?b(++w):(w=l+i,e[w]==t&&w--,b(w-y))}else{for(w;w!=l-1;w--)if(e[w]==n)break;if(w>l){b(w);continue}for(w=l+i,w;w39&&o<48||o>57&&o<64?s.push(c):o>=4352&&m(o)?s.push(e,t):s.push(e)}return s},this.$getStringScreenWidth=function(e,t,n){if(0==t)return[0,0];var i,r;for(null==t&&(t=1/0),n=n||0,r=0;r=4352&&m(i)?n+=2:n+=1,n>t)break;return[n,r]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.getRowLineCount=function(e){return this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1:1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0){o=l[u],s=this.$docRowCache[u];var h=e>l[d-1]}else h=!d;var f=this.getLength()-1,p=this.getNextFoldLine(s),g=p?p.start.row:1/0;while(o<=e){if(c=this.getRowLength(s),o+c>e||s>=f)break;o+=c,s++,s>g&&(s=p.end.row+1,p=this.getNextFoldLine(s,p),g=p?p.start.row:1/0),h&&(this.$docRowCache.push(s),this.$screenRowCache.push(o))}if(p&&p.start.row<=s)i=this.getFoldDisplayLine(p),s=p.start.row;else{if(o+c<=e||s>f)return{row:f,column:this.getLine(f).length};i=this.getLine(s),p=null}var m=0,v=Math.floor(e-o);if(this.$useWrapMode){var b=this.$wrapData[s];b&&(r=b[v],v>0&&b.length&&(m=b.indent,a=b[v-1]||b[b.length-1],i=i.substring(a)))}return void 0!==n&&this.$bidiHandler.isBidiRow(o+v,s,v)&&(t=this.$bidiHandler.offsetToCol(n)),a+=this.$getStringScreenWidth(i,t-m)[1],this.$useWrapMode&&a>=r&&(a=r-1),p?p.idxToPosition(a):{row:s,column:a}},this.documentToScreenPosition=function(e,t){if("undefined"===typeof t)var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var i=0,r=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var a,o=0,c=this.$docRowCache,l=this.$getRowCacheIndex(c,e),u=c.length;if(u&&l>=0){o=c[l],i=this.$screenRowCache[l];var d=e>c[u-1]}else d=!u;var h=this.getNextFoldLine(o),f=h?h.start.row:1/0;while(o=f){if(a=h.end.row+1,a>e)break;h=this.getNextFoldLine(a,h),f=h?h.start.row:1/0}else a=o+1;i+=this.getRowLength(o),o=a,d&&(this.$docRowCache.push(o),this.$screenRowCache.push(i))}var p="";h&&o>=f?(p=this.getFoldDisplayLine(h,e,t),r=h.start.row):(p=this.getLine(e).substring(0,t),r=e);var g=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var v=0;while(p.length>=m[v])i++,v++;p=p.substring(m[v-1]||0,p.length),g=v>0?m.indent:0}}return{row:i,column:g+this.$getStringScreenWidth(p)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(this.$useWrapMode){var n=this.$wrapData.length,i=0,r=(o=0,t=this.$foldData[o++],t?t.start.row:1/0);while(ir&&(i=t.end.row+1,t=this.$foldData[o++],r=t?t.start.row:1/0)}}else{e=this.getLength();for(var a=this.$foldData,o=0;on)break;return[i,s]})},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()},this.isFullWidth=m}.call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),a.defineOptions(p.prototype,"session",{wrap:{set:function(e){if(e&&"off"!=e?"free"==e?e=!0:"printMargin"==e?e=-1:"string"==typeof e&&(e=parseInt(e,10)||!1):e=!1,this.$wrap!=e)if(this.$wrap=e,e){var t="number"==typeof e?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}else this.setUseWrapMode(!1)},get:function(){return this.getUseWrapMode()?-1==this.$wrap?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e="auto"==e?"text"!=this.$mode.type:"text"!=e,e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){isNaN(e)||this.$tabSize===e||(this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize"))},initialValue:4,handlesSet:!0},navigateWithinSoftTabs:{initialValue:!1},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p})),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],(function(e,t,n){"use strict";var i=e("./lib/lang"),r=e("./lib/oop"),s=e("./range").Range,a=function(){this.$options={}};function o(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}(function(){this.set=function(e){return r.mixin(this.$options,e),this},this.getOptions=function(){return i.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var i=null;return n.forEach((function(e,n,r,a){return i=new s(e,n,r,a),!(n==a&&t.start&&t.start.start&&0!=t.skipCurrent&&i.isEqual(t.start))||(i=null,!1)})),i},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,r=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),a=[],o=t.re;if(t.$isMultiLine){var c,l=o.length,u=r.length-l;e:for(var d=o.offset||0;d<=u;d++){for(var h=0;hg||(a.push(c=new s(d,g,d+l-1,m)),l>2&&(d=d+l-2))}}else for(var v=0;v_&&a[h].end.row==n.end.row)h--;for(a=a.slice(v,h+1),v=0,h=a.length;v=o;n--)if(d(n,Number.MAX_VALUE,e))return;if(0!=t.wrap)for(n=c,o=a.row;n>=o;n--)if(d(n,Number.MAX_VALUE,e))return}};else l=function(e){var n=a.row;if(!d(n,a.column,e)){for(n+=1;n<=c;n++)if(d(n,0,e))return;if(0!=t.wrap)for(n=o,c=a.row;n<=c;n++)if(d(n,0,e))return}};if(t.$isMultiLine)var u=n.length,d=function(t,r,s){var a=i?t-u+1:t;if(!(a<0)){var o=e.getLine(a),c=o.search(n[0]);if(!(!i&&cr))return!!s(a,c,a+u-1,d)||void 0}}};else if(i)d=function(t,i,r){var s,a=e.getLine(t),o=[],c=0;n.lastIndex=0;while(s=n.exec(a)){var l=s[0].length;if(c=s.index,!l){if(c>=a.length)break;n.lastIndex=c+=1}if(s.index+l>i)break;o.push(s.index,l)}for(var u=o.length-1;u>=0;u-=2){var d=o[u-1];l=o[u];if(r(t,d,t,d+l))return!0}};else d=function(t,i,r){var s,a=e.getLine(t),o=i;n.lastIndex=i;while(s=n.exec(a)){var c=s[0].length;if(o=s.index,r(t,o,t,o+c))return!0;if(!c&&(n.lastIndex=o+=1,o>=a.length))return!1}};return{forEach:l}}}).call(a.prototype),t.Search=a})),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],(function(e,t,n){"use strict";var i=e("../lib/keys"),r=e("../lib/useragent"),s=i.KEY_MODS;function a(e,t){this.platform=t||(r.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function o(e,t){a.call(this,e,t),this.$singleCommand=!1}o.prototype=a.prototype,function(){function e(e){return"object"==typeof e&&e.bindKey&&e.bindKey.position||(e.isDefault?-100:0)}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&("string"===typeof e?e:e.name);e=this.commands[n],t||delete this.commands[n];var i=this.commandKeyBinding;for(var r in i){var s=i[r];if(s==e)delete i[r];else if(Array.isArray(s)){var a=s.indexOf(e);-1!=a&&(s.splice(a,1),1==s.length&&(i[r]=s[0]))}}},this.bindKey=function(e,t,n){if("object"==typeof e&&e&&(void 0==n&&(n=e.position),e=e[this.platform]),e)return"function"==typeof t?this.addCommand({exec:t,bindKey:e,name:t.name||e}):void e.split("|").forEach((function(e){var i="";if(-1!=e.indexOf(" ")){var r=e.split(/\s+/);e=r.pop(),r.forEach((function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;i+=(i?" ":"")+n,this._addCommandToBinding(i,"chainKeys")}),this),i+=" "}var a=this.parseKeys(e),o=s[a.hashId]+a.key;this._addCommandToBinding(i+o,t,n)}),this)},this._addCommandToBinding=function(t,n,i){var r,s=this.commandKeyBinding;if(n)if(!s[t]||this.$singleCommand)s[t]=n;else{Array.isArray(s[t])?-1!=(r=s[t].indexOf(n))&&s[t].splice(r,1):s[t]=[s[t]],"number"!=typeof i&&(i=e(n));var a=s[t];for(r=0;ri)break}a.splice(r,0,n)}else delete s[t]},this.addCommands=function(e){e&&Object.keys(e).forEach((function(t){var n=e[t];if(n){if("string"===typeof n)return this.bindKey(n,t);"function"===typeof n&&(n={exec:n}),"object"===typeof n&&(n.name||(n.name=t),this.addCommand(n))}}),this)},this.removeCommands=function(e){Object.keys(e).forEach((function(t){this.removeCommand(e[t])}),this)},this.bindKeys=function(e){Object.keys(e).forEach((function(t){this.bindKey(t,e[t])}),this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter((function(e){return e})),n=t.pop(),r=i[n];if(i.FUNCTION_KEYS[r])n=i.FUNCTION_KEYS[r].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(1==t.length&&"shift"==t[0])return{key:n.toUpperCase(),hashId:-1}}for(var s=0,a=t.length;a--;){var o=i.KEY_MODS[t[a]];if(null==o)return"undefined"!=typeof console&&console.error("invalid modifier "+t[a]+" in "+e),!1;s|=o}return{key:n,hashId:s}},this.findKeyCommand=function(e,t){var n=s[e]+t;return this.commandKeyBinding[n]},this.handleKeyboard=function(e,t,n,i){if(!(i<0)){var r=s[t]+n,a=this.commandKeyBinding[r];return e.$keyChain&&(e.$keyChain+=" "+r,a=this.commandKeyBinding[e.$keyChain]||a),!a||"chainKeys"!=a&&"chainKeys"!=a[a.length-1]?(e.$keyChain&&(t&&4!=t||1!=n.length?(-1==t||i>0)&&(e.$keyChain=""):e.$keyChain=e.$keyChain.slice(0,-r.length-1)),{command:a}):(e.$keyChain=e.$keyChain||r,{command:"null"})}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(a.prototype),t.HashHandler=a,t.MultiHashHandler=o})),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,a=function(e,t){r.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",(function(e){return e.command.exec(e.editor,e.args||{})}))};i.inherits(a,r),function(){i.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var i=e.length;i--;)if(this.exec(e[i],t,n))return!0;return!1}if("string"===typeof e&&(e=this.commands[e]),!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;if(e.isAvailable&&!e.isAvailable(t))return!1;var r={editor:t,command:e,args:n};return r.returnValue=this._emit("exec",r),this._signal("afterExec",r),!1!==r.returnValue},this.toggleRecording=function(e){if(!this.$inReplay)return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(!this.$inReplay&&this.macro){if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach((function(t){"string"==typeof t?this.exec(t,e):this.exec(t[0],e,t[1])}),this)}finally{this.$inReplay=!1}}},this.trimMacro=function(e){return e.map((function(e){return"string"!=typeof e[0]&&(e[0]=e[0].name),e[1]||(e=e[0]),e}))}}.call(a.prototype),t.CommandManager=a})),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],(function(e,t,n){"use strict";var i=e("../lib/lang"),r=e("../config"),s=e("../range").Range;function a(e,t){return{win:e,mac:t}}t.commands=[{name:"showSettingsMenu",bindKey:a("Ctrl-,","Command-,"),exec:function(e){r.loadModule("ace/ext/settings_menu",(function(t){t.init(e),e.showSettingsMenu()}))},readOnly:!0},{name:"goToNextError",bindKey:a("Alt-E","F4"),exec:function(e){r.loadModule("ace/ext/error_marker",(function(t){t.showErrorMarker(e,1)}))},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:a("Alt-Shift-E","Shift-F4"),exec:function(e){r.loadModule("ace/ext/error_marker",(function(t){t.showErrorMarker(e,-1)}))},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:a("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:a(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:a("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:a("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:a("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:a("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:a("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:a(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:a("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:a("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:a("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:a("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:a("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:a("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:a("Ctrl-F","Command-F"),exec:function(e){r.loadModule("ace/ext/searchbox",(function(t){t.Search(e)}))},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:a("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:a("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:a("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:a("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:a("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:a("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:a("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:a("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:a("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:a("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:a("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:a("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:a("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:a("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:a("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:a("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:a("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:a("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:a("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:a("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:a(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:a("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:a(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:a("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:a("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:a("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:a("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:a("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:a("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:a("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:a(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:a("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:a("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:a("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:a("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:a("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:a("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:a("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:a("Ctrl-H","Command-Option-F"),exec:function(e){r.loadModule("ace/ext/searchbox",(function(t){t.Search(e,!0)}))}},{name:"undo",bindKey:a("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:a("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:a("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:a("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:a("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:a("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:a("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:a("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:a("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:a("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:a("Alt-Delete","Ctrl-K|Command-Delete"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestarthard",bindKey:a("Ctrl-Shift-Backspace",null),exec:function(e){var t=e.selection.getRange();t.start.column=0,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineendhard",bindKey:a("Ctrl-Shift-Delete",null),exec:function(e){var t=e.selection.getRange();t.end.column=Number.MAX_VALUE,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:a("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:a("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:a("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:a("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:a("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:a("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(i.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:a(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:a("Alt-Shift-X","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:a("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:a("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:a("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:a(null,null),exec:function(e){for(var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),r=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),a=e.session.doc.getLine(n.row).length,o=e.session.doc.getTextRange(e.selection.getRange()),c=o.replace(/\n\s*/," ").length,l=e.session.doc.getLine(n.row),u=n.row+1;u<=r.row+1;u++){var d=i.stringTrimLeft(i.stringTrimRight(e.session.doc.getLine(u)));0!==d.length&&(d=" "+d),l+=d}r.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+c)):(a=e.session.doc.getLine(n.row).length>a?a+1:a,e.selection.moveCursorTo(n.row,a))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:a(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,i=e.selection.rangeList.ranges,r=[];i.length<1&&(i=[e.selection.getRange()]);for(var a=0;a0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var i=this.selection.getRange(),r=this.renderer.layerConfig;(i.start.row>=r.lastRow||i.end.row<=r.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:break}"animate"==n&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(this.$mergeUndoDeltas){var t=this.prevOp,n=this.$mergeableCommands,i=t.command&&e.command.name==t.command.name;if("insertstring"==e.command.name){var r=e.args;void 0===this.mergeNextCommand&&(this.mergeNextCommand=!0),i=i&&this.mergeNextCommand&&(!/\s/.test(r)||/\s/.test(t.args)),this.mergeNextCommand=!0}else i=i&&-1!==n.indexOf(e.command.name);"always"!=this.$mergeUndoDeltas&&Date.now()-this.sequenceStartTime>2e3&&(i=!1),i?this.session.mergeUndoDeltas=!0:-1!==n.indexOf(e.command.name)&&(this.sequenceStartTime=Date.now())}},this.setKeyboardHandler=function(e,t){if(e&&"string"===typeof e){this.$keybindingId=e;var n=this;v.loadModule(["keybinding",e],(function(i){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(i&&i.handler),t&&t()}))}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session!=e){this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this}),e&&e.bgTokenizer&&e.bgTokenizer.scheduleStart()}},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?1==t?this.navigateFileEnd():-1==t&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||r.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){if(this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null),!this.$highlightPending){var e=this;this.$highlightPending=!0,setTimeout((function(){e.$highlightPending=!1;var t=e.session;if(t&&t.bgTokenizer){var n=t.findMatchingBracket(e.getCursorPosition());if(n)var i=new f(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)i=t.$mode.getMatching(e.session);i&&(t.$bracketHighlight=t.addMarker(i,"ace_bracket","text"))}}),50)}},this.$highlightTags=function(){if(!this.$highlightTagPending){var e=this;this.$highlightTagPending=!0,setTimeout((function(){e.$highlightTagPending=!1;var t=e.session;if(t&&t.bgTokenizer){var n=e.getCursorPosition(),i=new b(e.session,n.row,n.column),r=i.getCurrentToken();if(!r||!/\b(?:tag-open|tag-name)/.test(r.type))return t.removeMarker(t.$tagHighlight),void(t.$tagHighlight=null);if(-1==r.type.indexOf("tag-open")||(r=i.stepForward(),r)){var s=r.value,a=0,o=i.stepBackward();if("<"==o.value)do{o=r,r=i.stepForward(),r&&r.value===s&&-1!==r.type.indexOf("tag-name")&&("<"===o.value?a++:"=0);else{do{r=o,o=i.stepBackward(),r&&r.value===s&&-1!==r.type.indexOf("tag-name")&&("<"===o.value?a++:"1||(e=!1)),t.$highlightLineMarker&&!e)t.removeMarker(t.$highlightLineMarker.id),t.$highlightLineMarker=null;else if(!t.$highlightLineMarker&&e){var n=new f(e.row,e.column,e.row,1/0);n.id=t.addMarker(n,"ace_active-line","screenLine"),t.$highlightLineMarker=n}else e&&(t.$highlightLineMarker.start.row=e.row,t.$highlightLineMarker.end.row=e.row,t.$highlightLineMarker.start.column=e.column,t._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;if(t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null,this.selection.isEmpty())this.$updateHighlightActiveLine();else{var n=this.selection.getRange(),i=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",i)}var r=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(r),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(!t.isEmpty()&&!t.isMultiLine()){var n=t.start.column-1,i=t.end.column+1,r=e.getLine(t.start.row),s=r.length,a=r.substring(Math.max(n,0),Math.min(i,s));if(!(n>=0&&/^[\w\d]/.test(a)||i<=s&&/[\w\d]$/.test(a))&&(a=r.substring(t.start.column,t.end.column),/^[\w\d]+$/.test(a))){var o=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:a});return o}}},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){"string"==typeof e&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),i=this.selection.rangeList.ranges;if(n.length>i.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var r=i.length;r--;){var s=i[r];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[r])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,i=n.getMode(),r=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=i.transformAction(n.getState(r.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}if("\t"==e&&(e=this.session.getTabString()),this.selection.isEmpty()){if(this.session.getOverwrite()&&-1==e.indexOf("\n")){a=new f.fromPoints(r,r);a.end.column+=e.length,this.session.remove(a)}}else{var a=this.getSelectionRange();r=this.session.remove(a),this.clearSelection()}if("\n"==e||"\r\n"==e){var o=n.getLine(r.row);if(r.column>o.search(/\S|$/)){var c=o.substr(r.column).search(/\S|$/);n.doc.removeInLine(r.row,r.column,r.column+c)}}this.clearSelection();var l=r.column,u=n.getState(r.row),d=(o=n.getLine(r.row),i.checkOutdent(u,o,e));n.insert(r,e);if(s&&s.selection&&(2==s.selection.length?this.selection.setSelectionRange(new f(r.row,l+s.selection[0],r.row,l+s.selection[1])):this.selection.setSelectionRange(new f(r.row+s.selection[0],s.selection[1],r.row+s.selection[2],s.selection[3]))),n.getDocument().isNewLine(e)){var h=i.getNextLineIndent(u,o.slice(0,r.column),n.getTabString());n.insert({row:r.row+1,column:0},h)}d&&i.autoOutdent(u,n,r.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&("left"==e?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,i=n.getState(t.start.row),r=n.getMode().transformAction(i,"deletion",this,n,t);if(0===t.end.column){var s=n.getTextRange(t);if("\n"==s[s.length-1]){var a=n.getLine(t.end.row);/^\s+$/.test(a)&&(t.end.column=a.length)}}r&&(t=r)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(this.selection.isEmpty()){var e=this.getCursorPosition(),t=e.column;if(0!==t){var n,i,r=this.session.getLine(e.row);tt.toLowerCase()?1:0}));var r=new f(0,0,0,0);for(i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var i=this.session.getLine(e);while(n.lastIndex=t){var s={value:r[0],start:r.index,end:r.index+r[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,i=new f(t,n-1,t,n),r=this.session.getTextRange(i);if(!isNaN(parseFloat(r))&&isFinite(r)){var s=this.getNumberAt(t,n);if(s){var a=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,o=s.start+s.value.length-a,c=parseFloat(s.value);c*=Math.pow(10,o),a!==s.end&&nf+1)break;f=p.last}u--,o=this.session.$moveLines(h,f,t?0:e),t&&-1==e&&(d=u+1);while(d<=u)a[d].moveBy(o,0),d++;t||(o=0),c+=o}r.fromOrientedRange(r.ranges[0]),r.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,i=this.renderer.layerConfig,r=e*Math.floor(i.height/i.lineHeight);this.$blockScrolling++,!0===t?this.selection.$moveSelection((function(){this.moveCursorBy(r,0)})):!1===t&&(this.selection.moveCursorBy(r,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,r*i.lineHeight),null!=t&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,i){this.renderer.scrollToLine(e,t,n,i)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),i=new b(this.session,n.row,n.column),r=i.getCurrentToken(),s=r||i.stepForward();if(s){var a,o,c=!1,l={},u=n.column-s.start,d={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g)){for(;u=0;--s)this.$tryReplace(n[s],e)&&i++;return this.selection.setSelectionRange(r),this.$blockScrolling-=1,i},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),null!==t?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),"string"==typeof e||e instanceof RegExp?t.needle=e:"object"==typeof e&&i.mixin(t,e);var r=this.selection.getRange();null==t.needle&&(e=this.session.getTextRange(r)||this.$search.$options.needle,e||(r=this.session.getWordRange(r.start.row,r.start.column),e=this.session.getTextRange(r)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:r});var s=this.$search.find(this.session);return t.preventScroll?s:s?(this.revealRange(s,n),s):(t.backwards?r.start=r.end:r.end=r.start,void this.selection.setRange(r))},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),!1!==t&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(e){var t,n=this,i=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var r=this.$scrollAnchor;r.style.cssText="position:absolute",this.container.insertBefore(r,this.container.firstChild);var s=this.on("changeSelection",(function(){i=!0})),a=this.renderer.on("beforeRender",(function(){i&&(t=n.renderer.container.getBoundingClientRect())})),o=this.renderer.on("afterRender",(function(){if(i&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,a=e.layerConfig,o=s.top-a.offset;i=s.top>=0&&o+t.top<0||!(s.topwindow.innerHeight)&&null,null!=i&&(r.style.top=o+"px",r.style.left=s.left+"px",r.style.height=a.lineHeight+"px",r.scrollIntoView(i)),i=t=null}}));this.setAutoScrollEditorIntoView=function(e){e||(delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",o),this.renderer.off("beforeRender",a))}}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;t&&(t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&"wide"!=e,r.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e)))}}.call(y.prototype),v.defineOptions(y.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=y})),ace.define("ace/undomanager",["require","exports","module"],(function(e,t,n){"use strict";var i=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:1==e.lines.length?null:e.lines,text:1==e.lines.length?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){for(var n=new Array(e.length),i=0;i0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return 0===this.dirtyCounter},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(i.prototype),t.UndoManager=i})),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("../lib/dom"),r=e("../lib/oop"),s=e("../lib/lang"),a=e("../lib/event_emitter").EventEmitter,o=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){r.implement(this,a),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;ta&&(g=s.end.row+1,s=t.getNextFoldLine(g,s),a=s?s.start.row:1/0),g>r){while(this.$cells.length>p+1)f=this.$cells.pop(),this.element.removeChild(f.element);break}f=this.$cells[++p],f||(f={element:null,textNode:null,foldWidget:null},f.element=i.createElement("div"),f.textNode=document.createTextNode(""),f.element.appendChild(f.textNode),this.element.appendChild(f.element),this.$cells[p]=f);var m="ace_gutter-cell ";c[g]&&(m+=c[g]),l[g]&&(m+=l[g]),this.$annotations[g]&&(m+=this.$annotations[g].className),f.element.className!=m&&(f.element.className=m);var v=t.getRowLength(g)*e.lineHeight+"px";if(v!=f.element.style.height&&(f.element.style.height=v),o){var b=o[g];null==b&&(b=o[g]=t.getFoldWidget(g))}if(b){f.foldWidget||(f.foldWidget=i.createElement("span"),f.element.appendChild(f.foldWidget));m="ace_fold-widget ace_"+b;"start"==b&&g==a&&gn.right-t.right?"foldWidgets":void 0}}).call(o.prototype),t.Gutter=o})),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],(function(e,t,n){"use strict";var i=e("../range").Range,r=e("../lib/dom"),s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,i){return(e?1:0)|(t?2:0)|(n?4:0)|(i?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){if(e){this.config=e;var t=[];for(var n in this.markers){var i=this.markers[n];if(i.range){var r=i.range.clipRows(e.firstRow,e.lastRow);if(!r.isEmpty())if(r=r.toScreenRange(this.session),i.renderer){var s=this.$getTop(r.start.row,e),a=this.$padding+(this.session.$bidiHandler.isBidiRow(r.start.row)?this.session.$bidiHandler.getPosLeft(r.start.column):r.start.column*e.characterWidth);i.renderer(t,r,a,s,e)}else"fullLine"==i.type?this.drawFullLineMarker(t,r,i.clazz,e):"screenLine"==i.type?this.drawScreenLineMarker(t,r,i.clazz,e):r.isMultiLine()?"text"==i.type?this.drawTextMarker(t,r,i.clazz,e):this.drawMultiLineMarker(t,r,i.clazz,e):this.session.$bidiHandler.isBidiRow(r.start.row)?this.drawBidiSingleLineMarker(t,r,i.clazz+" ace_start ace_br15",e):this.drawSingleLineMarker(t,r,i.clazz+" ace_start ace_br15",e)}else i.update(t,this,this.session,e)}this.element.innerHTML=t.join("")}},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,r,s,a){for(var o=this.session,c=n.start.row,l=n.end.row,u=c,d=0,h=0,f=o.getScreenLastRowColumn(u),p=null,g=new i(u,n.start.column,u,h);u<=l;u++)g.start.row=g.end.row=u,g.start.column=u==c?n.start.column:o.getRowWrapIndent(u),g.end.column=f,d=h,h=f,f=u+1f,u==l),this.session.$bidiHandler.isBidiRow(u)?this.drawBidiSingleLineMarker(t,g,p,s,u==l?0:1,a):this.drawSingleLineMarker(t,g,p,s,u==l?0:1,a)},this.drawMultiLineMarker=function(e,t,n,i,r){var s,a,o,c=this.$padding;if(r=r||"",this.session.$bidiHandler.isBidiRow(t.start.row)){var l=t.clone();l.end.row=l.start.row,l.end.column=this.session.getLine(l.start.row).length,this.drawBidiSingleLineMarker(e,l,n+" ace_br1 ace_start",i,null,r)}else s=i.lineHeight,a=this.$getTop(t.start.row,i),o=c+t.start.column*i.characterWidth,e.push("
    ");if(this.session.$bidiHandler.isBidiRow(t.end.row)){l=t.clone();l.start.row=l.end.row,l.start.column=0,this.drawBidiSingleLineMarker(e,l,n+" ace_br12",i,null,r)}else{var u=t.end.column*i.characterWidth;s=i.lineHeight,a=this.$getTop(t.end.row,i),e.push("
    ")}if(s=(t.end.row-t.start.row-1)*i.lineHeight,!(s<=0)){a=this.$getTop(t.start.row+1,i);var d=(t.start.column?1:0)|(t.end.column?0:8);e.push("
    ")}},this.drawSingleLineMarker=function(e,t,n,i,r,s){var a=i.lineHeight,o=(t.end.column+(r||0)-t.start.column)*i.characterWidth,c=this.$getTop(t.start.row,i),l=this.$padding+t.start.column*i.characterWidth;e.push("
    ")},this.drawBidiSingleLineMarker=function(e,t,n,i,r,s){var a=i.lineHeight,o=this.$getTop(t.start.row,i),c=this.$padding,l=this.session.$bidiHandler.getSelections(t.start.column,t.end.column);l.forEach((function(t){e.push("
    ")}))},this.drawFullLineMarker=function(e,t,n,i,r){var s=this.$getTop(t.start.row,i),a=i.lineHeight;t.start.row!=t.end.row&&(a+=this.$getTop(t.end.row,i)-s),e.push("
    ")},this.drawScreenLineMarker=function(e,t,n,i,r){var s=this.$getTop(t.start.row,i),a=i.lineHeight;e.push("
    ")}}).call(s.prototype),t.Marker=s})),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("../lib/dom"),s=e("../lib/lang"),a=(e("../lib/useragent"),e("../lib/event_emitter").EventEmitter),o=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){i.implement(this,a),this.EOF_CHAR="¶",this.EOL_CHAR_LF="¬",this.EOL_CHAR_CRLF="¤",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="—",this.SPACE_CHAR="·",this.$padding=0,this.$updateEolChar=function(){var e="\n"==this.session.doc.getNewLineCharacter()?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles!=e&&(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides!=e&&(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;for(var t=this.$tabStrings=[0],n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+"
    "):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var i="ace_indent-guide",r="",a="";if(this.showInvisibles){i+=" ace_invisible",r=" ace_invisible_space",a=" ace_invisible_tab";var o=s.stringRepeat(this.SPACE_CHAR,this.tabSize),c=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else o=s.stringRepeat(" ",this.tabSize),c=o;this.$tabStrings[" "]=""+o+"",this.$tabStrings["\t"]=""+c+""}},this.updateLines=function(e,t,n){this.config.lastRow==e.lastRow&&this.config.firstRow==e.firstRow||this.scrollLines(e),this.config=e;for(var i=Math.max(t,e.firstRow),r=Math.min(n,e.lastRow),s=this.element.childNodes,a=0,o=e.firstRow;ol&&(o=c.end.row+1,c=this.session.getNextFoldLine(o,c),l=c?c.start.row:1/0),o>r)break;var u=s[a++];if(u){var d=[];this.$renderLine(d,o,!this.$useLineGroups(),o==l&&c),u.style.height=e.lineHeight*this.session.getRowLength(o)+"px",u.innerHTML=d.join("")}o++}},this.scrollLines=function(e){var t=this.config;if(this.config=e,!t||t.lastRow0;i--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(i=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);i>0;i--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){r=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(r)}},this.$renderLinesFragment=function(e,t,n){var i=this.element.ownerDocument.createDocumentFragment(),s=t,a=this.session.getNextFoldLine(s),o=a?a.start.row:1/0;while(1){if(s>o&&(s=a.end.row+1,a=this.session.getNextFoldLine(s,a),o=a?a.start.row:1/0),s>n)break;var c=r.createElement("div"),l=[];if(this.$renderLine(l,s,!1,s==o&&a),c.innerHTML=l.join(""),this.$useLineGroups())c.className="ace_line_group",i.appendChild(c),c.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(c.firstChild)i.appendChild(c.firstChild);s++}return i},this.update=function(e){this.config=e;var t=[],n=e.firstRow,i=e.lastRow,r=n,s=this.session.getNextFoldLine(r),a=s?s.start.row:1/0;while(1){if(r>a&&(r=s.end.row+1,s=this.session.getNextFoldLine(r,s),a=s?s.start.row:1/0),r>i)break;this.$useLineGroups()&&t.push("
    "),this.$renderLine(t,r,!1,r==a&&s),this.$useLineGroups()&&t.push("
    "),r++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,i){var r=this,a=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,o=function(e,n,i,a,o){if(n)return r.showInvisibles?""+s.stringRepeat(r.SPACE_CHAR,e.length)+"":e;if("&"==e)return"&";if("<"==e)return"<";if(">"==e)return">";if("\t"==e){var c=r.session.getScreenTabSize(t+a);return t+=c-1,r.$tabStrings[c]}if(" "==e){var l=r.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",u=r.showInvisibles?r.SPACE_CHAR:"";return t+=1,""+u+""}return i?""+r.SPACE_CHAR+"":(t+=1,""+e+"")},c=i.replace(a,o);if(this.$textToken[n.type])e.push(c);else{var l="ace_"+n.type.replace(/\./g," ace_"),u="";"fold"==n.type&&(u=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",c,"")}return t+i.length},this.renderIndentGuide=function(e,t,n){var i=t.search(this.$indentGuideRe);return i<=0||i>=n?t:" "==t[0]?(i-=i%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],i/this.tabSize)),t.substr(i)):"\t"==t[0]?(e.push(s.stringRepeat(this.$tabStrings["\t"],i)),t.substr(i)):t},this.$renderWrappedLine=function(e,t,n,i){for(var r=0,a=0,o=n[0],c=0,l=0;l=o)c=this.$renderToken(e,c,u,d.substring(0,o-r)),d=d.substring(o-r),r=o,i||e.push("","
    "),e.push(s.stringRepeat(" ",n.indent)),a++,c=0,o=n[a]||Number.MAX_VALUE;0!=d.length&&(r+=d.length,c=this.$renderToken(e,c,u,d))}}},this.$renderSimpleLine=function(e,t){var n=0,i=t[0],r=i.value;this.displayIndentGuides&&(r=this.renderIndentGuide(e,r)),r&&(n=this.$renderToken(e,n,i,r));for(var s=1;s"),r.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,r,s,n):this.$renderSimpleLine(e,r)}this.showInvisibles&&(i&&(t=i.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push("
    ")},this.$getFoldLineTokens=function(e,t){var n=this.session,i=[];function r(e,t,n){var r=0,s=0;while(s+e[r].value.lengthn-t&&(a=a.substring(0,n-t)),i.push({type:e[r].type,value:a}),s=t+a.length,r+=1}while(sn?i.push({type:e[r].type,value:a.substring(0,n-s)}):i.push(e[r]),s+=a.length,r+=1}}var s=n.getTokens(e);return t.walk((function(e,t,a,o,c){null!=e?i.push({type:"fold",value:e}):(c&&(s=n.getTokens(t)),s.length&&r(s,o,a))}),t.end.row,this.session.getLine(t.end.row).length),i},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(o.prototype),t.Text=o})),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],(function(e,t,n){"use strict";var i,r=e("../lib/dom"),s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),void 0===i&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){for(var t=this.cursors,n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){for(var t=this.cursors,n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e==this.smoothBlinking||i||(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;if(clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0),this.isBlinking&&this.blinkInterval&&this.isVisible){this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout((function(){e(!1)}),.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval((function(){e(!0),t()}),this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),i=this.$padding+(this.session.$bidiHandler.isBidiRow(n.row,e.row)?this.session.$bidiHandler.getPosLeft(n.column):n.column*this.config.characterWidth),r=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:i,top:r}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,i=0;void 0!==t&&0!==t.length||(t=[{cursor:null}]);n=0;for(var r=t.length;ne.height+e.offset||s.top<0)&&n>1)){var a=(this.cursors[i++]||this.addCursor()).style;this.drawCursor?this.drawCursor(a,s,e,t[n],this.session):(a.left=s.left+"px",a.top=s.top+"px",a.width=e.characterWidth+"px",a.height=e.lineHeight+"px")}}while(this.cursors.length>i)this.removeCursor();var o=this.session.getOverwrite();this.$setOverwrite(o),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s})),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./lib/dom"),s=e("./lib/event"),a=e("./lib/event_emitter").EventEmitter,o=32768,c=function(e){this.element=r.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=r.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){i.implement(this,a),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(c.prototype);var l=function(e,t){c.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=r.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};i.inherits(l,c),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){if(this.scrollTop=this.element.scrollTop,1!=this.coeff){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>o?(this.coeff=o/e,e=o):1!=this.coeff&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(l.prototype);var u=function(e,t){c.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};i.inherits(u,c),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(u.prototype),t.ScrollBar=l,t.ScrollBarV=l,t.ScrollBarH=u,t.VScrollBar=l,t.HScrollBar=u})),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],(function(e,t,n){"use strict";var i=e("./lib/event"),r=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){if(this.changes=this.changes|e,!this.pending&&this.changes){this.pending=!0;var t=this;i.nextFrame((function(){var e;t.pending=!1;while(e=t.changes)t.changes=0,t.onRender(e)}),this.window)}}}).call(r.prototype),t.RenderLoop=r})),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],(function(e,t,n){var i=e("../lib/oop"),r=e("../lib/dom"),s=e("../lib/lang"),a=e("../lib/useragent"),o=e("../lib/event_emitter").EventEmitter,c=0,l=t.FontMetrics=function(e){this.el=r.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=r.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=r.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),c||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",c),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){i.implement(this,o),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=r.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;c=t>0&&t<1?50:100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",a.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval((function(){e.checkForSizeChanges()}),500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(50===c){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(n){e={width:0,height:0}}var t={height:e.height,width:e.width/c}}else t={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/c};return 0===t.width||0===t.height?null:t},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,c);var t=this.$main.getBoundingClientRect();return t.width/c},this.getCharacterWidth=function(e){var t=this.charSizes[e];return void 0===t&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(l.prototype)})),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./lib/dom"),s=e("./config"),a=e("./lib/useragent"),o=e("./layer/gutter").Gutter,c=e("./layer/marker").Marker,l=e("./layer/text").Text,u=e("./layer/cursor").Cursor,d=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,f=e("./renderloop").RenderLoop,p=e("./layer/font_metrics").FontMetrics,g=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_text-input-ios {position: absolute !important;top: -100000px !important;left: -100000px !important;}';r.importCssString(m,"ace_editor.css");var v=function(e,t){var n=this;this.container=e||r.createElement("div"),this.$keepTextAreaAtCursor=!a.isOldIE,r.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=r.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.$gutter.setAttribute("aria-hidden",!0),this.scroller=r.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=r.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new o(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new c(this.content);var i=this.$textLayer=new l(this.content);this.canvas=i.element,this.$markerFront=new c(this.content),this.$cursorLayer=new u(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new d(this.container,this),this.scrollBarV.addEventListener("scroll",(function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)})),this.scrollBarH.addEventListener("scroll",(function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)})),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new p(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",(function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)})),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new f(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,i.implement(this,g),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e),e&&(this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode))},this.updateLines=function(e,t,n){if(void 0===t&&(t=1/0),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow||this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar(),this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,i){if(!(this.resizing>2)){this.resizing>0?this.resizing++:this.resizing=e?1:0;var r=this.container;i||(i=r.clientHeight||r.scrollHeight),n||(n=r.clientWidth||r.scrollWidth);var s=this.$updateCachedSize(e,t,n,i);if(!this.$size.scrollerHeight||!n&&!i)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null}},this.$updateCachedSize=function(e,t,n,i){i-=this.$extraHeight||0;var r=0,s=this.$size,a={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};return i&&(e||s.height!=i)&&(s.height=i,r|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",r|=this.CHANGE_SCROLL),n&&(e||s.width!=n)&&(r|=this.CHANGE_SIZE,s.width=n,null==t&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px",(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)&&(r|=this.CHANGE_FULL)),s.$dirty=!n||!i,r&&this._signal("resize",a),r},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()||this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-2*this.$padding,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e),this.session.$bidiHandler.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(this.$showPrintMargin||this.$printMarginEl){if(!this.$printMarginEl){var e=r.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=r.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&-1==this.session.$wrap&&this.adjustWrapLimit()}},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$keepTextAreaAtCursor){var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var i=this.textarea.style,r=this.lineHeight;if(t<0||t>e.height-r)i.top=i.left="0";else{var s=this.characterWidth;if(this.$composition){var a=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(a)[0]+2,r+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,i.height=r+"px",i.width=s+"px",i.left=Math.min(n,this.$size.scrollerWidth-s)+"px",i.top=Math.min(t,this.$size.height-r)+"px"}}},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(0===this.layerConfig.offset?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,i){var r=this.scrollMargin;r.top=0|e,r.bottom=0|t,r.right=0|i,r.left=0|n,r.v=r.top+r.bottom,r.h=r.left+r.right,r.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-r.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){if(this.$changes&&(e|=this.$changes,this.$changes=0),this.session&&this.container.offsetWidth&&!this.$frozen&&(e||t)){if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender"),this.session&&this.session.$bidiHandler&&this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){if(e|=this.$computeLayerConfig(),n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var i=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;i>0&&(this.scrollTop=i,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}if(e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left"),e&this.CHANGE_FULL)return this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),void this._signal("afterRender");if(e&this.CHANGE_SCROLL)return e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),void this._signal("afterRender");e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")}else this.$changes|=e},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var i=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||i!=this.$vScroll){i!=this.$vScroll&&(this.$vScroll=i,this.scrollBarV.setVisible(i));var r=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,r,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,i=this.session.getScreenLength(),r=i*this.lineHeight,s=this.$getLongestLine(),a=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),o=this.$horizScroll!==a;o&&(this.$horizScroll=a,this.scrollBarH.setVisible(a));var c=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var l=this.scrollTop%this.lineHeight,u=t.scrollerHeight+this.lineHeight,d=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;r+=d;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,r-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var f=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-r+d<0||this.scrollTop>h.top),p=c!==f;p&&(this.$vScroll=f,this.scrollBarV.setVisible(f));var g,m,v=Math.ceil(u/this.lineHeight)-1,b=Math.max(0,Math.round((this.scrollTop-l)/this.lineHeight)),y=b+v,w=this.lineHeight;b=e.screenToDocumentRow(b,0);var _=e.getFoldLine(b);_&&(b=_.start.row),g=e.documentToScreenRow(b,0),m=e.getRowLength(b)*w,y=Math.min(e.screenToDocumentRow(y,0),e.getLength()-1),u=t.scrollerHeight+e.getRowLength(y)*w+m,l=this.scrollTop-g*w;var x=0;return this.layerConfig.width!=s&&(x=this.CHANGE_H_SCROLL),(o||p)&&(x=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(s=this.$getLongestLine())),this.layerConfig={width:s,padding:this.$padding,firstRow:b,firstRowScreen:g,lastRow:y,lineHeight:w,characterWidth:this.characterWidth,minHeight:u,maxHeight:r,offset:l,gutterOffset:w?Math.max(0,Math.ceil((l+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},x},this.$updateLines=function(){if(this.$changedLines){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(!(e>n.lastRow+1)&&!(ts?(t&&c+a>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),0===s&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):c+this.$size.scrollerHeight-or?(r=1-this.scrollMargin.top||(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom||(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left||(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right||void 0)))},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),i=e+this.scrollLeft-n.left-this.$padding,r=i/this.characterWidth,s=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),a=Math.round(r);return{row:s,column:a,side:r-a>0?1:-1,offsetX:i}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),i=e+this.scrollLeft-n.left-this.$padding,r=Math.round(i/this.characterWidth),s=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(s,Math.max(r,0),i)},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),i=this.session.documentToScreenPosition(e,t),r=this.$padding+(this.session.$bidiHandler.isBidiRow(i.row,e)?this.session.$bidiHandler.getPosLeft(i.column):Math.round(i.column*this.characterWidth)),s=i.row*this.lineHeight;return{pageX:n.left+r-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){r.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){r.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,r.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){this.$composition&&(r.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null)},this.setTheme=function(e,t){var n=this;if(this.$themeId=e,n._dispatchEvent("themeChange",{theme:e}),e&&"string"!=typeof e)a(e);else{var i=e||this.$options.theme.initialValue;s.loadModule(["theme",i],a)}function a(i){if(n.$themeId!=e)return t&&t();if(!i||!i.cssClass)throw new Error("couldn't load module "+e+" or it didn't call define");r.importCssString(i.cssText,i.cssClass,n.container.ownerDocument),n.theme&&r.removeCssClass(n.container,n.theme.cssClass);var s="padding"in i?i.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=i.cssClass,n.theme=i,r.addCssClass(n.container,i.cssClass),r.setCssClass(n.container,"ace_dark",i.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:i}),t&&t()}},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){r.setCssClass(this.container,e,!1!==t)},this.unsetStyle=function(e){r.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(v.prototype),s.defineOptions(v.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){"number"==typeof e&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){r.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight)return this.$gutterLineHighlight=r.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",void this.$gutter.appendChild(this.$gutterLineHighlight);this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){this.$hScrollBarAlwaysVisible&&this.$horizScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){this.$vScrollBarAlwaysVisible&&this.$vScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){"number"==typeof e&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0,this.$scrollPastEnd!=e&&(this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL))},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=v})),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,a=e("../config");function o(e,t){var n=t.src;r.qualifyURL(e);try{return new Blob([n],{type:"application/javascript"})}catch(a){var i=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new i;return s.append(n),s.getBlob("application/javascript")}}function c(e,t){var n=o(e,t),i=window.URL||window.webkitURL,r=i.createObjectURL(n);return new Worker(r)}var l=function(t,n,i,r,s){if(this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl),a.get("packaged")||!e.toUrl)r=r||a.moduleUrl(n.id,"worker");else{var o=this.$normalizePath;r=r||o(e.toUrl("ace/worker/worker.js",null,"_"));var l={};t.forEach((function(t){l[t]=o(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))}))}this.$worker=c(r,n),s&&this.send("importScripts",s),this.$worker.postMessage({init:!0,tlns:l,module:n.id,classname:i}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){i.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data);break}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return r.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var i=this.callbackId++;this.callbacks[i]=n,t.push(i)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),"insert"==e.action?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;e&&(this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e}))}}).call(l.prototype);var u=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var i=null,r=!1,o=Object.create(s),c=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){c.messageBuffer.push(e),i&&(r?setTimeout(l):l())},this.setEmitSync=function(e){r=e};var l=function(){var e=c.messageBuffer.shift();e.command?i[e.command].apply(i,e.args):e.event&&o._signal(e.event,e.data)};o.postMessage=function(e){c.onMessage({data:e})},o.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},o.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},a.loadModule(["worker",t],(function(e){i=new e[n](o);while(c.messageBuffer.length)l()}))};u.prototype=l.prototype,t.UIWorkerClient=u,t.WorkerClient=l,t.createWorker=c})),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],(function(e,t,n){"use strict";var i=e("./range").Range,r=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),a=function(e,t,n,i,r,s){var a=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=r,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=i,this.$onCursorChange=function(){setTimeout((function(){a.onCursorChange()}))},this.$pos=n;var o=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=o.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,r),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var r=this.pos;r.$insertRight=!0,r.detach(),r.markerId=n.addMarker(new i(r.row,r.column,r.row,r.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach((function(n){var i=t.createAnchor(n.row,n.column);i.$insertRight=!0,i.detach(),e.others.push(i)})),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(!this.othersActive){var e=this.session,t=this;this.othersActive=!0,this.others.forEach((function(n){n.markerId=e.addMarker(new i(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)}))}},this.hideOtherMarkers=function(){if(this.othersActive){this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;if(this.updateAnchors(e),r&&(this.length+=n),r&&!this.session.$fromUndo)if("insert"===e.action)for(var a=this.others.length-1;a>=0;a--){var o=this.others[a],c={row:o.row,column:o.column+s};this.doc.insertMergedLines(c,e.lines)}else if("remove"===e.action)for(a=this.others.length-1;a>=0;a--){o=this.others[a],c={row:o.row,column:o.column+s};this.doc.remove(new i(c.row,c.column,c.row,c.column-n))}this.$updating=!1,this.updateMarkers()}},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(!this.$updating){var e=this,t=this.session,n=function(n,r){t.removeMarker(n.markerId),n.markerId=t.addMarker(new i(n.row,n.column,n.row,n.column+e.length),r,null,!1)};n(this.pos,this.mainClass);for(var r=this.others.length;r--;)n(this.others[r],this.othersClass)}},this.onCursorChange=function(e){if(!this.$updating&&this.session){var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))}},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(-1!==this.$undoStackDepth){for(var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth,n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)}},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){if(this.rangeCount=this.rangeList.ranges.length,1==this.rangeCount&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var i=this.ranges.indexOf(e[n]);this.ranges.splice(i,1)}this._signal("removeRange",{ranges:e}),0===this.rangeCount&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){this.rangeList||(this.rangeList=new i,this.ranges=[],this.rangeCount=0)},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=r.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{n=this.getRange();var i=this.isBackwards(),s=n.start.row,a=n.end.row;if(s==a){if(i)var o=n.end,c=n.start;else o=n.start,c=n.end;return this.addRange(r.fromPoints(c,c)),void this.addRange(r.fromPoints(o,o))}var l=[],u=this.getLineRange(s,!0);u.start.column=n.start.column,l.push(u);for(var d=s+1;d1){var e=this.rangeList.ranges,t=e[e.length-1],n=r.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var i=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),a=this.rectangularRangeBlock(i,s);a.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var i=[],s=e.column0)v--;if(v>0){var b=0;while(i[b].isEmpty())b++}for(var y=v;y>=b;y--)i[y].isEmpty()&&i.splice(y,1)}return i}}.call(s.prototype);var p=e("./editor").Editor;function g(e,t){return e.row==t.row&&e.column==t.column}function m(e){e.$multiselectOnSessionChange||(e.$onAddRange=e.$onAddRange.bind(e),e.$onRemoveRange=e.$onRemoveRange.bind(e),e.$onMultiSelect=e.$onMultiSelect.bind(e),e.$onSingleSelect=e.$onSingleSelect.bind(e),e.$multiselectOnSessionChange=t.onSessionChange.bind(e),e.$checkMultiselectChange=e.$checkMultiselectChange.bind(e),e.$multiselectOnSessionChange(e),e.on("changeSession",e.$multiselectOnSessionChange),e.on("mousedown",a),e.commands.addCommands(l.defaultCommands),v(e))}function v(e){var t=e.textInput.getElement(),n=!1;function i(t){n&&(e.renderer.setMouseCursor(""),n=!1)}o.addListener(t,"keydown",(function(t){var r=18==t.keyCode&&!(t.ctrlKey||t.shiftKey||t.metaKey);e.$blockSelectEnabled&&r?n||(e.renderer.setMouseCursor("crosshair"),n=!0):n&&i()})),o.addListener(t,"keyup",i),o.addListener(t,"blur",i)}(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(e.marker){this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);-1!=t&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length}},this.removeSelectionMarkers=function(e){for(var t=this.session.$selectionMarkers,n=e.length;n--;){var i=e[n];if(i.marker){this.session.removeMarker(i.marker);var r=t.indexOf(i);-1!=r&&t.splice(r,1)}}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){this.inMultiSelectMode||(this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(l.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers())},this.$onSingleSelect=function(e){this.session.multiSelect.inVirtualMode||(this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(l.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection"))},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(n.multiSelect){if(t.multiSelectAction)"forEach"==t.multiSelectAction?i=n.forEachSelection(t,e.args):"forEachLine"==t.multiSelectAction?i=n.forEachSelection(t,e.args,!0):"single"==t.multiSelectAction?(n.exitMultiSelectMode(),i=t.exec(n,e.args||{})):i=t.multiSelectAction(n,e.args||{});else{var i=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}return i}},this.forEachSelection=function(e,t,n){if(!this.inVirtualSelectionMode){var i,r=n&&n.keepOrder,a=1==n||n&&n.$byLines,o=this.session,c=this.selection,l=c.rangeList,u=(r?c:l).ranges;if(!u.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var d=c._eventRegistry;c._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var f=u.length;f--;){if(a)while(f>0&&u[f].start.row==u[f-1].end.row)f--;h.fromOrientedRange(u[f]),h.index=f,this.selection=o.selection=h;var p=e.exec?e.exec(this,t||{}):e(this,t||{});i||void 0===p||(i=p),h.toOrientedRange(u[f])}h.detach(),this.selection=o.selection=c,this.inVirtualSelectionMode=!1,c._eventRegistry=d,c.mergeOverlappingRanges();var g=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),g&&g.from==g.to&&this.renderer.animateScrolling(g.from),i}},this.exitMultiSelectMode=function(){this.inMultiSelectMode&&!this.inVirtualSelectionMode&&this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){for(var t=this.multiSelect.rangeList.ranges,n=[],i=0;ia&&(a=n.column),ru?e.insert(i,c.stringRepeat(" ",s-u)):e.remove(new r(i.row,i.column,i.row,i.column-s+u)),t.start.column=t.end.column=a,t.start.row=t.end.row=i.row,t.cursor=t.end})),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}else{var u=this.selection.getRange(),d=u.start.row,h=u.end.row,f=d==h;if(f){var p,g=this.session.getLength();do{p=this.session.getLine(h)}while(/[=:]/.test(p)&&++h0);d<0&&(d=0),h>=g&&(h=g-1)}var m=this.session.removeFullLines(d,h);m=this.$reAlignText(m,f),this.session.insert({row:d,column:0},m.join("\n")+"\n"),f||(u.start.column=0,u.end.column=m[m.length-1].length),this.selection.setRange(u)}},this.$reAlignText=function(e,t){var n,i,r,s=!0,a=!0;return e.map((function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?null==n?(n=t[1].length,i=t[2].length,r=t[3].length,t):(n+i+r!=t[1].length+t[2].length+t[3].length&&(a=!1),n!=t[1].length&&(s=!1),n>t[1].length&&(n=t[1].length),it[3].length&&(r=t[3].length),t):[e]})).map(t?l:s?a?u:l:d);function o(e){return c.stringRepeat(" ",e)}function l(e){return e[2]?o(n)+e[2]+o(i-e[2].length+r)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function u(e){return e[2]?o(n+i-e[2].length)+e[2]+o(r," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function d(e){return e[2]?o(n)+e[2]+o(r)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}}}).call(p.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(p.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",a)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",a))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})})),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],(function(e,t,n){"use strict";var i=e("../../range").Range,r=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var i=e.getLine(n);return this.foldingStartMarker.test(i)?"start":"markbeginend"==t&&this.foldingStopMarker&&this.foldingStopMarker.test(i)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var r=/\S/,s=e.getLine(t),a=s.search(r);if(-1!=a){var o=n||s.length,c=e.getLength(),l=t,u=t;while(++tl){var h=e.getLine(u).length;return new i(l,o,u,h)}}},this.openingBracketBlock=function(e,t,n,r,s){var a={row:n,column:r+1},o=e.$findClosingBracket(t,a,s);if(o){var c=e.foldWidgets[o.row];return null==c&&(c=e.getFoldWidget(o.row)),"start"==c&&o.row>a.row&&(o.row--,o.column=e.getLine(o.row).length),i.fromPoints(a,o)}},this.closingBracketBlock=function(e,t,n,r,s){var a={row:n,column:r},o=e.$findOpeningBracket(t,a);if(o)return o.column++,a.column--,i.fromPoints(o,a)}}).call(r.prototype)})),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],(function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var i=e("../lib/dom");i.importCssString(t.cssText,t.cssClass)})),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],(function(e,t,n){"use strict";e("./lib/oop");var i=e("./lib/dom");e("./range").Range;function r(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}(function(){this.getRowLength=function(e){var t;return t=this.lineWidgets&&this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0,this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach((function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)})),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach(),this.editor!=e&&(this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets)))},this.detach=function(e){var t=this.editor;if(t){this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach((function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))}))}},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(n&&e.action){for(var i=e.data,r=i.start.row,s=i.end.row,a="add"==e.action,o=r+1;o0&&!i[r])r--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var a=r;a<=s;a++){var o=i[a];if(o&&o.el)if(o.hidden)o.el.style.top=-100-(o.pixelHeight||0)+"px";else{o._inDocument||(o._inDocument=!0,t.container.appendChild(o.el));var c=t.$cursorLayer.getPixelPosition({row:a,column:0},!0).top;o.coverLine||(c+=n.lineHeight*this.session.getRowLineCount(o.row)),o.el.style.top=c-n.offset+"px";var l=o.coverGutter?0:t.gutterWidth;o.fixedWidth||(l-=t.scrollLeft),o.el.style.left=l+"px",o.fullWidth&&o.screenWidth&&(o.el.style.minWidth=n.width+2*n.padding+"px"),o.fixedWidth?o.el.style.right=t.scrollBar.getWidth()+"px":o.el.style.right=""}}}}}).call(r.prototype),t.LineWidgets=r})),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],(function(e,t,n){"use strict";var i=e("../line_widgets").LineWidgets,r=e("../lib/dom"),s=e("../range").Range;function a(e,t,n){var i=0,r=e.length-1;while(i<=r){var s=i+r>>1,a=n(t,e[s]);if(a>0)i=s+1;else{if(!(a<0))return s;r=s-1}}return-(i+1)}function o(e,t,n){var i=e.getAnnotations().sort(s.comparePoints);if(i.length){var r=a(i,{row:t,column:-1},s.comparePoints);r<0&&(r=-r-1),r>=i.length?r=n>0?0:i.length-1:0===r&&n<0&&(r=i.length-1);var o=i[r];if(o&&n){if(o.row===t){do{o=i[r+=n]}while(o&&o.row===t);if(!o)return i.slice()}var c=[];t=o.row;do{c[n<0?"unshift":"push"](o),o=i[r+=n]}while(o&&o.row==t);return c.length&&c}}}t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new i(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),a=s.row,c=n.widgetManager.getWidgetsAtRow(a).filter((function(e){return"errorMarker"==e.type}))[0];c?c.destroy():a-=t;var l,u=o(n,a,t);if(u){var d=u[0];s.column=(d.pos&&"number"!=typeof d.column?d.pos.sc:d.column)||0,s.row=d.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(c)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:r.createElement("div"),type:"errorMarker"},f=h.el.appendChild(r.createElement("div")),p=h.el.appendChild(r.createElement("div"));p.className="error_widget_arrow "+l.className;var g=e.renderer.$cursorLayer.getPixelPosition(s).left;p.style.left=g+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",f.className="error_widget "+l.className,f.innerHTML=l.text.join("
    "),f.appendChild(r.createElement("div"));var m=function(e,t,n){if(0===t&&("esc"===n||"return"===n))return h.destroy(),{command:"null"}};h.destroy=function(){e.$mouseHandler.isMousePressed||(e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy))},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},r.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")})),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],(function(e,t,i){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),s=e("./lib/event"),a=e("./editor").Editor,o=e("./edit_session").EditSession,c=e("./undomanager").UndoManager,l=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.acequire=e,t.define=n("07d6"),t.edit=function(e){if("string"==typeof e){var n=e;if(e=document.getElementById(n),!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof a)return e.env.editor;var i="";if(e&&/input|textarea/i.test(e.tagName)){var o=e;i=o.value,e=r.createElement("pre"),o.parentNode.replaceChild(e,o)}else e&&(i=r.getInnerText(e),e.innerHTML="");var c=t.createEditSession(i),u=new a(new l(e));u.setSession(c);var d={document:c,editor:u,onResize:u.resize.bind(u,null)};return o&&(d.textarea=o),s.addListener(window,"resize",d.onResize),u.on("destroy",(function(){s.removeListener(window,"resize",d.onResize),d.editor.container.env=null})),u.container.env=u.env=d,u},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new c),n},t.EditSession=o,t.UndoManager=c,t.version="1.2.9"})),function(){ace.acequire(["ace/ace"],(function(e){for(var t in e&&(e.config.init(!0),e.define=ace.define),window.ace||(window.ace=e),e)e.hasOwnProperty(t)&&(window.ace[t]=e[t])}))}(),e.exports=window.ace.acequire("ace/ace")},"0687":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"ores"},[n("h3",[e._v("Selected Ores:")]),e._l(e.ore_names,(function(t){return n("div",{key:t},[n("vui-button",{class:{selected:e.selected_ores.includes(t)},attrs:{params:{chosen_ore:t}}},[e._v(e._s(t))])],1)}))],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("3315"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"5716889f",null);t["default"]=c.exports},"068f":function(e,t,n){"use strict";n("e16d")},"06cf":function(e,t,n){var i=n("83ab"),r=n("d1e7"),s=n("5c6c"),a=n("fc6a"),o=n("c04e"),c=n("5135"),l=n("0cfb"),u=Object.getOwnPropertyDescriptor;t.f=i?u:function(e,t){if(e=a(e),t=o(t,!0),l)try{return u(e,t)}catch(n){}if(c(e,t))return s(!r.f.call(e,t),e[t])}},"07ac":function(e,t,n){var i=n("23e7"),r=n("6f53").values;i({target:"Object",stat:!0},{values:function(e){return r(e)}})},"07c3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("i",[e._v("Welcome to the NanoTrasen™ computer configuration utility. Please consult your system administrator if you have any questions about your device.")]),n("hr"),n("h2",[e._v("Power Supply")]),n("vui-item",{attrs:{label:"Battery Status:"}},[e.battery?n("span",[e._v("Active")]):n("span",[e._v("Not Available")])]),e.battery?n("vui-item",{attrs:{label:"Battery Rating:"}},[e._v(e._s(e.battery.rating)+" Wh")]):e._e(),e.battery?n("vui-item",{attrs:{label:"Battery Charge:"}},[n("vui-progress",{attrs:{value:e.battery.percent}},[e._v(e._s(e.battery.percent)+"%")])],1):e._e(),n("vui-item",{attrs:{label:"Power Usage:"}},[e._v(e._s(e.power_usage)+" W")]),n("h2",[e._v("File System")]),e.battery?n("vui-item",{attrs:{label:"Used Capacity:"}},[n("vui-progress",{attrs:{value:e.disk_used,min:"0",max:e.disk_size}},[e._v(e._s(e.disk_used)+" GQ / "+e._s(e.disk_size)+" GQ")])],1):e._e(),n("h2",[e._v("Misc. Settings")]),n("vui-item",{attrs:{label:"Registered ID:"}},[n("vui-button",{attrs:{params:{PC_register:1},disabled:!e.card_slot}},[e._v(e._s(e.registered?e.registered:"Unregistered"))])],1),null!==e.brightness?n("vui-item",{attrs:{label:"Brightness:"}},[n("vui-input-slider",{attrs:{min:0,max:10},model:{value:e.brightness,callback:function(t){e.brightness=t},expression:"brightness"}})],1):e._e(),n("vui-item",{attrs:{label:"Audible Message Output Range:"}},[n("vui-input-slider",{attrs:{min:0,max:e.max_message_range},model:{value:e.message_range,callback:function(t){e.message_range=t},expression:"message_range"}})],1),n("h2",[e._v("Computer Components")]),e._l(e.hardware,(function(t,i){return n("div",{key:i},[n("h3",[e._v(e._s(i))]),n("vui-item",{attrs:{label:"State:"}},[t.enabled?n("span",[e._v("Enabled")]):n("span",[e._v("Disabled")])]),t.power_usage>0?n("vui-item",{attrs:{label:"Power Usage:"}},[e._v(e._s(t.power_usage)+" W")]):e._e(),t.critical?e._e():n("vui-item",{attrs:{label:"Toggle Component:"}},[n("vui-button",{attrs:{params:{PC_enable_component:i},disabled:!!t.enabled}},[e._v("ON")]),n("vui-button",{attrs:{params:{PC_disable_component:i},disabled:!t.enabled}},[e._v("OFF")])],1)],1)})),n("i",[e._v("ntOS v2.1.0 -- © NanoTrasen 2457 - 2462")])],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"07d6":function(e,t){e.exports=function(){throw new Error("define cannot be used indirect")}},"08c0":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h2",[e._v("Engine Status:")]),e.is_on?n("div",[e._v(" The engine is currently running. "),n("vui-button",{attrs:{params:{toggle_engine:1}}},[e._v("Stop")])],1):n("div",[e._v(" The engine is off. "),n("vui-button",{attrs:{disabled:!e.has_key||!e.has_cell,params:{toggle_engine:1}}},[e._v("Start")])],1),e.has_key?n("div",[e._v(" There is a key inserted into the ignition. "),n("vui-button",{attrs:{params:{key:1}}},[e._v("Remove Key")])],1):n("div",[e._v(" There is no key in the ignition. ")]),e.has_cell?n("div",[e._v(" Cell Charge: "),n("vui-progress",{class:{good:e.cell_charge>=.8*e.cell_max_charge,bad:e.cell_charge<=.4*e.cell_max_charge,average:e.cell_charge<.8*e.cell_max_charge&&e.cell_charge>.4*e.cell_max_charge},attrs:{value:e.cell_charge,max:e.cell_max_charge,min:0}},[e._v(e._s(e.cell_charge)+"J")]),e._v(" "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The cell can be removed by using a screwdriver to open the maintenance panel, then using a crowbar to shimmy it out.")])],1):n("div",[e._v(" There is no cell installed. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The cell can be installed by using a screwdriver to open the maintenance panel, then clicking on the engine with a compatible power cell.")])],1),e.is_towing?n("div",[e._v(" This engine is currently towing the "+e._s(e.tow)+". "),n("vui-button",{attrs:{params:{unlatch:1}}},[e._v("Unlatch")])],1):n("div",[e._v(" This engine isn't towing anything currently. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("You can latch vehicles together by dragging from the vehicle you want to be the anchor point, to the trolley you wish to latch.")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"08cc":function(e,t,n){"use strict";n("b225")},"09cd":function(e,t,n){"use strict";n("bfa1")},"0ac8":function(e,t,n){var i=n("23e7"),r=n("8eb5");i({target:"Math",stat:!0,forced:r!=Math.expm1},{expm1:r})},"0b25":function(e,t,n){var i=n("a691"),r=n("50c4");e.exports=function(e){if(void 0===e)return 0;var t=i(e),n=r(t);if(t!==n)throw RangeError("Wrong length or index");return n}},"0c47":function(e,t,n){var i=n("da84"),r=n("d44e");r(i.JSON,"JSON",!0)},"0ccb":function(e,t,n){var i=n("50c4"),r=n("1148"),s=n("1d80"),a=Math.ceil,o=function(e){return function(t,n,o){var c,l,u=String(s(t)),d=u.length,h=void 0===o?" ":String(o),f=i(n);return f<=d||""==h?u:(c=f-d,l=r.call(h,a(c/h.length)),l.length>c&&(l=l.slice(0,c)),e?u+l:l+u)}};e.exports={start:o(!1),end:o(!0)}},"0cec":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Patient Vitals:")]),e.has_occupant?[n("vui-group",[n("vui-group-item",{attrs:{label:"Status:"}},[n("span",{style:{color:e.consciousnessLabel(e.stat)}},[e._v(e._s(e.consciousnessText(e.stat)))])]),n("vui-group-item",{attrs:{label:"Brain Activity:"}},[n("vui-progress",{class:e.progressClass(e.brain_activity),attrs:{value:e.brain_activity}},[e._v(e._s(e.brain_activity)+"%")])],1),n("vui-group-item",{style:{color:e.getPressureClass(e.blood_pressure_level)},attrs:{label:"BP:"}},[e._v(e._s(e.blood_pressure))]),n("vui-group-item",{attrs:{label:"Blood Oxygenation:"}},[n("vui-progress",{class:e.progressClass(e.brain_activity),attrs:{value:Math.round(e.blood_o2)}},[e._v(e._s(Math.round(e.blood_o2))+"%")])],1)],1)]:[n("span",{staticClass:"bad"},[e._v("No patient detected.")])]],2)},r=[],s={data:function(){return this.$root.$data.state},methods:{consciousnessLabel:function(e){switch(e){case 0:return"LimeGreen";case 1:return"OrangeRed";case 2:return"Crimson"}},consciousnessText:function(e){switch(e){case 0:return"Conscious";case 1:return"Unconscious";case 2:return"DEAD"}},progressClass:function(e){return e<=50?"bad":e<=90?"average":"good"},getPressureClass:function(e){switch(e){case 1:return"Crimson";case 2:return"LimeGreen";case 3:return"LawnGreen";case 4:return"Crimson";default:return"LightSkyBlue"}}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"0cfb":function(e,t,n){var i=n("83ab"),r=n("d039"),s=n("cc12");e.exports=!i&&!r((function(){return 7!=Object.defineProperty(s("div"),"a",{get:function(){return 7}}).a}))},"0d03":function(e,t,n){var i=n("6eeb"),r=Date.prototype,s="Invalid Date",a="toString",o=r[a],c=r.getTime;new Date(NaN)+""!=s&&i(r,a,(function(){var e=c.call(this);return e===e?o.call(this):s}))},"0d3b":function(e,t,n){var i=n("d039"),r=n("b622"),s=n("c430"),a=r("iterator");e.exports=!i((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,i){t["delete"]("b"),n+=i+e})),s&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[a]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host}))},"0ea6":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.passcode,expression:"passcode"}],attrs:{placeholder:"Enter passcode...",autofocus:""},domProps:{value:e.passcode},on:{input:function(t){t.target.composing||(e.passcode=t.target.value)}}}),n("vui-button",{attrs:{params:{set_passcode:e.passcode}}},[e._v("Set")]),n("vui-button",{attrs:{params:{lock:1}}},[e._v("Lock")])],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"0ec3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("span",{staticClass:"tooltip label"},[e._t("label",[e._v(e._s(e.label))]),n("div",{staticClass:"tooltip content"},[e._t("default")],2)],2)},r=[],s={props:{label:{type:String,default:""}}},a=s,o=(n("09cd"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"4ea2a2b3",null);t["default"]=c.exports},"0eec":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("input",{ref:"input",style:{width:e.width},attrs:{type:"range",min:e.min,max:e.max},domProps:{value:e.val},on:{change:function(t){return e.onFieldUpdate(t.target)}}})])},r=[],s=(n("a9e3"),n("8a79"),n("c0d6")),a={props:{value:{type:Number,default:0},min:{type:Number,default:0},max:{type:Number,default:100},pushState:{type:Boolean,default:!0},width:{type:String,default:"10em"},decimalPlaces:{type:Number,default:0}},data:function(){return{val:this.value}},methods:{onFieldUpdate:function(e){var t=this.val,n=Number(e.value);isNaN(n)&&(n=this.val),console.log(n,e.value,this.value,this.val),this.UpdateValue(n),t!=this.val||e.value.endsWith(".")||(this.$refs.input.value=this.val)},onUpdatedValue:function(e){var t=this.value;e&&(t+=e),this.UpdateValue(t)},UpdateValue:function(e){e=+(Math.round(e+"e+"+this.decimalPlaces)+"e-"+this.decimalPlaces),e>this.max&&(e=this.max),e0;(s>>>=1)&&(t+=t))1&s&&(n+=t);return n}},"11f5":function(e,t,n){"use strict";n("5d50")},1253:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"displayBar"},[n("div",{staticClass:"displayBarFill",style:{width:e.percentage+"%"}},[n("span",[e._t("default")],2)])])},r=[],s=(n("a9e3"),{props:{value:{type:Number,default:50},max:{type:Number,default:100},min:{type:Number,default:0}},computed:{percentage:function(){return(Math.min(this.max,Math.max(this.value,this.min))-this.min)/(this.max-this.min)*100}}}),a=s,o=(n("112d"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"041d7f1a",null);t["default"]=c.exports},"126d":function(e,t,n){var i=n("6da8"),r=n("aaec"),s=n("d094");function a(e){return r(e)?s(e):i(e)}e.exports=a},1276:function(e,t,n){"use strict";var i=n("d784"),r=n("44e7"),s=n("825a"),a=n("1d80"),o=n("4840"),c=n("8aa5"),l=n("50c4"),u=n("14c3"),d=n("9263"),h=n("d039"),f=[].push,p=Math.min,g=4294967295,m=!h((function(){return!RegExp(g,"y")}));i("split",2,(function(e,t,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var i=String(a(this)),s=void 0===n?g:n>>>0;if(0===s)return[];if(void 0===e)return[i];if(!r(e))return t.call(i,e,s);var o,c,l,u=[],h=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,m=new RegExp(e.source,h+"g");while(o=d.call(m,i)){if(c=m.lastIndex,c>p&&(u.push(i.slice(p,o.index)),o.length>1&&o.index=s))break;m.lastIndex===o.index&&m.lastIndex++}return p===i.length?!l&&m.test("")||u.push(""):u.push(i.slice(p)),u.length>s?u.slice(0,s):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=a(this),s=void 0==t?void 0:t[e];return void 0!==s?s.call(t,r,n):i.call(String(r),t,n)},function(e,r){var a=n(i,e,this,r,i!==t);if(a.done)return a.value;var d=s(e),h=String(this),f=o(d,RegExp),v=d.unicode,b=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),y=new f(m?d:"^(?:"+d.source+")",b),w=void 0===r?g:r>>>0;if(0===w)return[];if(0===h.length)return null===u(y,h)?[h]:[];var _=0,x=0,k=[];while(xe.length)&&(t=e.length);for(var n=0,i=new Array(t);n79&&o<83;i({target:"Array",proto:!0,forced:!l||!u||d},{reduce:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}})},"143c":function(e,t,n){var i=n("74e8");i("Int32",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},"145e":function(e,t,n){"use strict";var i=n("7b0b"),r=n("23cb"),s=n("50c4"),a=Math.min;e.exports=[].copyWithin||function(e,t){var n=i(this),o=s(n.length),c=r(e,o),l=r(t,o),u=arguments.length>2?arguments[2]:void 0,d=a((void 0===u?o:r(u,o))-l,o-c),h=1;l0)l in n?n[c]=n[l]:delete n[c],c+=h,l+=h;return n}},"14c3":function(e,t,n){var i=n("c6b6"),r=n("9263");e.exports=function(e,t){var n=e.exec;if("function"===typeof n){var s=n.call(e,t);if("object"!==typeof s)throw TypeError("RegExp exec method returned something other than an Object or null");return s}if("RegExp"!==i(e))throw TypeError("RegExp#exec called on incompatible receiver");return r.call(e,t)}},"14d4":function(e,t){ace.define("ace/theme/monokai",["require","exports","module","ace/lib/dom"],(function(e,t,n){t.isDark=!0,t.cssClass="ace-monokai",t.cssText=".ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}";var i=e("../lib/dom");i.importCssString(t.cssText,t.cssClass)}))},1503:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{directives:[{name:"show",rawName:"v-show",value:!e.spawnpoint,expression:"!spawnpoint"}],staticClass:"tagselector"},e._l(e.tags,(function(t,i){return n("vui-button",{key:i,class:{selected:e.current_tag==i},on:{click:function(t){e.current_tag=i}}},[e._v(e._s(i)+" ("+e._s(t)+")")])})),1),n("hr",{directives:[{name:"show",rawName:"v-show",value:!e.spawnpoint,expression:"!spawnpoint"}]}),n("table",[e._m(0),e._l(e.spawners,(function(t,i){return n("tr",{directives:[{name:"show",rawName:"v-show",value:e.showEntry(t),expression:"showEntry(data)"}],key:i},[n("td",[e._v(e._s(t.name))]),n("td",[e._v(e._s(t.desc))]),t.max_count>0?n("td",[e._v(e._s(t.max_count-t.count)+" / "+e._s(t.max_count))]):t.spawnatoms>0?n("td",[e._v(e._s(t.spawnatoms))]):n("td",[e._v("∞")]),n("td",{staticClass:"action"},[n("vui-button",{attrs:{disabled:0!==t.cant_spawn,params:{spawn:i,spawnpoint:e.spawnpoint},icon:"star"}},[e._v("Spawn")]),1==t.can_edit?n("vui-button",{attrs:{disabled:1==t.enabled,params:{enable:i}}},[e._v("Enable")]):e._e(),1==t.can_edit?n("vui-button",{attrs:{disabled:0==t.enabled,params:{disable:i}}},[e._v("Disable")]):e._e()],1)])}))],2)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("th",[e._v("Name")]),n("th",[e._v("Description")]),n("th",[e._v("Available Slots")]),n("th",{staticClass:"action"},[e._v("Actions")])])}],s=(n("4de4"),n("5db7"),n("4160"),n("c975"),n("73d9"),n("07ac"),n("159b"),{data:function(){return this.$root.$data.state},computed:{tags:function(){var e=Object.values(this.spawners).flatMap((function(e){return e.tags})),t={All:Object.values(this.spawners).length};return e.filter((function(e,t,n){return n.indexOf(e)===t})).forEach((function(n){t[n]=e.filter((function(e){return e==n})).length})),t}},methods:{showEntry:function(e){return this.spawnpoint?!!Object.prototype.hasOwnProperty.apply(e,["spawnpoints"])&&(e.spawnpoints&&!e.spawnpoints.indexOf(this.spawnpoint)):!e.tags.indexOf(this.current_tag)||"All"==this.current_tag}}}),a=s,o=(n("068f"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"70766bea",null);t["default"]=c.exports},"159b":function(e,t,n){var i=n("da84"),r=n("fdbc"),s=n("17c2"),a=n("9112");for(var o in r){var c=i[o],l=c&&c.prototype;if(l&&l.forEach!==s)try{a(l,"forEach",s)}catch(u){l.forEach=s}}},1650:function(e,t,n){},"170b":function(e,t,n){"use strict";var i=n("ebb5"),r=n("50c4"),s=n("23cb"),a=n("4840"),o=i.aTypedArray,c=i.exportTypedArrayMethod;c("subarray",(function(e,t){var n=o(this),i=n.length,c=s(e,i);return new(a(n,n.constructor))(n.buffer,n.byteOffset+c*n.BYTES_PER_ELEMENT,r((void 0===t?i:s(t,i))-c))}))},1715:function(e,t,n){n("159b"),n("ddb0"),n("130f"),n("9f96"),n("4795"),n("2b3d"),n("bf19"),n("9861");var i=n("428f");e.exports=i},"17c2":function(e,t,n){"use strict";var i=n("b727").forEach,r=n("a640"),s=n("ae40"),a=r("forEach"),o=s("forEach");e.exports=a&&o?[].forEach:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}},"182d":function(e,t,n){var i=n("f8cd");e.exports=function(e,t){var n=i(e);if(n%t)throw RangeError("Wrong offset");return n}},"18a5":function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("anchor")},{anchor:function(e){return r(this,"a","name",e)}})},1913:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("fontsize")},{fontsize:function(e){return r(this,"font","size",e)}})},"197b":function(e,t,n){var i=n("746f");i("species")},"19aa":function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},"19fa":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("vui-button",{staticClass:"fixedLeft",attrs:{icon:"cog",params:{close:1}}},[e._v("Close")])],1),n("div",[n("h2",[e._v("Storage")]),e.secure?n("span",{staticClass:"notice"},[e._v(" "+e._s(-1==e.locked?"Sec.re ACC_** //):securi_nt.diag=>##'or 1=1'%($...":"Secure Access: Please have your identification ready.")+" ")]):e._e()]),e.contents?e._l(e.contents,(function(t){return n("div",{key:t.vend},[n("div",[n("span",{staticClass:"highlight"},[e._v(e._s(t.display_name)+" ("+e._s(t.quantity)+" available)")])]),n("div",{staticStyle:{float:"left"}},[e._v("Vend: ")]),n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:1},icon:"arrow-alt-circle-down"}},[e._v("x1")]),t.quantity>=5?n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:5},icon:"arrow-alt-circle-down"}},[e._v("x5")]):e._e(),t.quantity>=10?n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:10},icon:"arrow-alt-circle-down"}},[e._v("x10")]):e._e(),t.quantity>=25?n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:25},icon:"arrow-alt-circle-down"}},[e._v("x25")]):e._e(),t.quantity>1?n("vui-button",{staticClass:"statusValue",attrs:{params:{vendItem:t.vend,amount:t.quantity},icon:"arrow-alt-circle-down"}},[e._v("All")]):e._e()],1)})):n("div",{staticClass:"average"},[e._v(" No products loaded. ")])],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"1be4":function(e,t,n){var i=n("d066");e.exports=i("document","documentElement")},"1bf2":function(e,t,n){var i=n("23e7"),r=n("56ef");i({target:"Reflect",stat:!0},{ownKeys:r})},"1c0b":function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},"1c7e":function(e,t,n){var i=n("b622"),r=i("iterator"),s=!1;try{var a=0,o={next:function(){return{done:!!a++}},return:function(){s=!0}};o[r]=function(){return this},Array.from(o,(function(){throw 2}))}catch(c){}e.exports=function(e,t){if(!t&&!s)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(c){}return n}},"1ccb":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v(" Selected Products:")]),e._l(e.items,(function(t,i){return n("div",{key:i},[e.buying[i]&&e.buying[i]>=0?n("span",[e._v(" "+e._s(e.buying[i])+"x "+e._s(i)+": at "+e._s(t*e.buying[i])+" Credits ")]):e._e()])})),n("h3",[e._v(" Total: "+e._s(e.sum))]),n("h3",[e._v("Please swipe your ID to pay.")]),n("vui-button",{attrs:{params:{return:1},width:"3em"}},[e._v("Return to order menu")])],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"1cdc":function(e,t,n){var i=n("342f");e.exports=/(iphone|ipod|ipad).*applewebkit/i.test(i)},"1d1c":function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("37e8");i({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperties:s})},"1d73":function(e,t,n){},"1d80":function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},"1dbb":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[null==e.password?n("vui-button",{on:{click:e.join}},[e._v(e._s(e.ch.title))]):[n("input",{directives:[{name:"model",rawName:"v-model",value:e.password,expression:"password"}],attrs:{type:"text"},domProps:{value:e.password},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.join_with(t)},input:function(t){t.target.composing||(e.password=t.target.value)}}}),n("vui-button",{attrs:{params:{join:{target:e.re,password:e.password}}}},[e._v("Join "+e._s(e.ch.title))])]],2)},r=[],s={data:function(){return{password:null}},methods:{join:function(){this.ch.password?this.password="":this.$toTopic({join:{target:this.re}})},join_with:function(){this.$toTopic({join:{target:this.re,password:this.password}})}},props:{ch:{type:Object,default:function(){return{}}},re:{type:String,default:""}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"1dde":function(e,t,n){var i=n("d039"),r=n("b622"),s=n("2d00"),a=r("species");e.exports=function(e){return s>=51||!i((function(){var t=[],n=t.constructor={};return n[a]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},"1e25":function(e,t,n){"use strict";var i=n("23e7"),r=n("58a8").end,s=n("c8d2"),a=s("trimEnd"),o=a?function(){return r(this)}:"".trimEnd;i({target:"String",proto:!0,forced:a},{trimEnd:o,trimRight:o})},"1ec1":function(e,t){var n=Math.log;e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:n(1+e)}},"1ee6":function(e,t,n){},"1fb5":function(e,t,n){"use strict";n("7da4")},"1fe2":function(e,t,n){"use strict";var i=n("6d61"),r=n("acac");i("WeakSet",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),r)},"203b":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.active?n("div",[n("view-records-general",{attrs:{"hide-advanced":""}},[n("vui-group-item",{attrs:{label:"Blood type:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.blood_type"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.$root.$data.state,"editingvalue",t.target.multiple?n:n[0])}}},e._l(e.choices.medical.blood_type,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)])],1),n("vui-group-item",{attrs:{label:"DNA:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.blood_dna"}})],1),n("vui-group-item",{attrs:{label:"Disabilities:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.disabilities"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Allergies:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.allergies"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Diseases:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.diseases"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Comments:"}},[e._l(e.active.medical.comments,(function(t){return n("div",{key:t},[e._v(e._s(t)+" "),(2&e.editable)>0?n("vui-button",{staticClass:"danger",attrs:{params:{removefromrecord:{value:t,key:["active","medical","comments"]}},icon:"trash-alt"}}):e._e()],1)})),0==e.active.medical.comments.length?n("div",[e._v("There are no comments.")]):e._e(),(2&e.editable)>0?n("view-records-field",{attrs:{"edit-button":"Add"},on:{save:function(t){return e.add("active.medical.comments",t)}}}):e._e()],2),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(2&e.editable)>0,path:"active.medical.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1)],1)],1):e._e()},r=[],s=(n("ac1f"),n("1276"),{data:function(){return this.$root.$data.state},methods:{add:function(e,t){this.$toTopic({addtorecord:{value:t,key:e.split(".")}})}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"207c":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Microphone:"}},[n("vui-button",{class:{selected:e.listening},attrs:{params:{talk:1,nowindow:1}}},[e._v("On")]),n("vui-button",{class:{selected:!e.listening},attrs:{params:{talk:1,nowindow:1}}},[e._v("Off")])],1),n("vui-group-item",{attrs:{label:"Frequency:"}},[n("vui-button",{attrs:{params:{freq:-10,nowindow:1}}},[e._v("--")]),n("vui-button",{attrs:{params:{freq:-2,nowindow:1}}},[e._v("-")]),n("span",[e._v(e._s(e.frequency))]),n("vui-button",{attrs:{params:{freq:2,nowindow:1}}},[e._v("+")]),n("vui-button",{attrs:{params:{freq:10,nowindow:1}}},[e._v("++")])],1),n("vui-item",{attrs:{label:"Range:"}},[n("vui-input-slider",{attrs:{min:0,max:4},model:{value:e.radio_range,callback:function(t){e.radio_range=t},expression:"radio_range"}})],1),n("hr"),e._l(e.channels,(function(t){return n("vui-group-item",{key:t.name,attrs:{label:t.name}},[n("vui-button",{class:{selected:t.listening},attrs:{params:{ch_name:t.name,listen:1,nowindow:1}}},[e._v("On")]),n("vui-button",{class:{selected:!t.listening},attrs:{params:{ch_name:t.name,listen:1,nowindow:1}}},[e._v("Off")])],1)}))],2)],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},2099:function(e,t){ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./lib/event_emitter").EventEmitter,s=e("./lib/lang"),a=e("./range").Range,o=e("./anchor").Anchor,c=e("./keyboard/hash_handler").HashHandler,l=e("./tokenizer").Tokenizer,u=a.comparePoints,d=function(){this.snippetMap={},this.snippetNameMap={}};(function(){i.implement(this,r),this.getTokenizer=function(){function e(e,t,n){return e=e.substr(1),/^\d+$/.test(e)&&!n.inFormatString?[{tabstopId:parseInt(e,10)}]:[{text:e}]}function t(e){return"(?:[^\\\\"+e+"]|\\\\.)"}return d.$tokenizer=new l({start:[{regex:/:/,onMatch:function(e,t,n){return n.length&&n[0].expectIf?(n[0].expectIf=!1,n[0].elseBranch=n[0],[n[0]]):":"}},{regex:/\\./,onMatch:function(e,t,n){var i=e[1];return"}"==i&&n.length||-1!="`$\\".indexOf(i)?e=i:n.inFormatString&&("n"==i||"t"==i?e="\n":-1!="ulULE".indexOf(i)&&(e={changeCase:i,local:i>"a"})),[e]}},{regex:/}/,onMatch:function(e,t,n){return[n.length?n.shift():e]}},{regex:/\$(?:\d+|\w+)/,onMatch:e},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(t,n,i){var r=e(t.substr(1),n,i);return i.unshift(r[0]),r},next:"snippetVar"},{regex:/\n/,token:"newline",merge:!1}],snippetVar:[{regex:"\\|"+t("\\|")+"*\\|",onMatch:function(e,t,n){n[0].choices=e.slice(1,-1).split(",")},next:"start"},{regex:"/("+t("/")+"+)/(?:("+t("/")+"*)/)(\\w*):?",onMatch:function(e,t,n){var i=n[0];return i.fmtString=e,e=this.splitRegex.exec(e),i.guard=e[1],i.fmt=e[2],i.flag=e[3],""},next:"start"},{regex:"`"+t("`")+"*`",onMatch:function(e,t,n){return n[0].code=e.splice(1,-1),""},next:"start"},{regex:"\\?",onMatch:function(e,t,n){n[0]&&(n[0].expectIf=!0)},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+t("/")+"+)/",token:"regex"},{regex:"",onMatch:function(e,t,n){n.inFormatString=!0},next:"start"}]}),d.prototype.getTokenizer=function(){return d.$tokenizer},d.$tokenizer},this.tokenizeTmSnippet=function(e,t){return this.getTokenizer().getLineTokens(e,t).tokens.map((function(e){return e.value||e}))},this.$getDefaultValue=function(e,t){if(/^[A-Z]\d+$/.test(t)){var n=t.substr(1);return(this.variables[t[0]+"__"]||{})[n]}if(/^\d+$/.test(t))return(this.variables.__||{})[t];if(t=t.replace(/^TM_/,""),e){var i=e.session;switch(t){case"CURRENT_WORD":var r=i.getWordRange();case"SELECTION":case"SELECTED_TEXT":return i.getTextRange(r);case"CURRENT_LINE":return i.getLine(e.getCursorPosition().row);case"PREV_LINE":return i.getLine(e.getCursorPosition().row-1);case"LINE_INDEX":return e.getCursorPosition().column;case"LINE_NUMBER":return e.getCursorPosition().row+1;case"SOFT_TABS":return i.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return i.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}}},this.variables={},this.getVariableValue=function(e,t){return this.variables.hasOwnProperty(t)?this.variables[t](e,t)||"":this.$getDefaultValue(e,t)||""},this.tmStrFormat=function(e,t,n){var i=t.flag||"",r=t.guard;r=new RegExp(r,i.replace(/[^gi]/,""));var s=this.tokenizeTmSnippet(t.fmt,"formatString"),a=this,o=e.replace(r,(function(){a.variables.__=arguments;for(var e=a.resolveVariables(s,n),t="E",i=0;i1?(b=t[t.length-1].length,v+=t.length-1):b+=e.length,y+=e}else e.start?e.end={row:v,column:b}:e.start={row:v,column:b}}));var w=e.getSelectionRange(),_=e.session.replace(w,y),x=new h(e),k=e.inVirtualSelectionMode&&e.selection.index;x.addTabstops(o,w.start,_,k)},this.insertSnippet=function(e,t){var n=this;if(e.inVirtualSelectionMode)return n.insertSnippetForSelection(e,t);e.forEachSelection((function(){n.insertSnippetForSelection(e,t)}),null,{keepOrder:!0}),e.tabstopManager&&e.tabstopManager.tabNext()},this.$getScope=function(e){var t=e.session.$mode.$id||"";if(t=t.split("/").pop(),"html"===t||"php"===t){"php"!==t||e.session.$mode.inlinePhp||(t="html");var n=e.getCursorPosition(),i=e.session.getState(n.row);"object"===typeof i&&(i=i[0]),i.substring&&("js-"==i.substring(0,3)?t="javascript":"css-"==i.substring(0,4)?t="css":"php-"==i.substring(0,4)&&(t="php"))}return t},this.getActiveScopes=function(e){var t=this.$getScope(e),n=[t],i=this.snippetMap;return i[t]&&i[t].includeScopes&&n.push.apply(n,i[t].includeScopes),n.push("_"),n},this.expandWithTab=function(e,t){var n=this,i=e.forEachSelection((function(){return n.expandSnippetForSelection(e,t)}),null,{keepOrder:!0});return i&&e.tabstopManager&&e.tabstopManager.tabNext(),i},this.expandSnippetForSelection=function(e,t){var n,i=e.getCursorPosition(),r=e.session.getLine(i.row),s=r.substring(0,i.column),a=r.substr(i.column),o=this.snippetMap;return this.getActiveScopes(e).some((function(e){var t=o[e];return t&&(n=this.findMatchingSnippet(t,s,a)),!!n}),this),!!n&&(t&&t.dryRun||(e.session.doc.removeInLine(i.row,i.column-n.replaceBefore.length,i.column+n.replaceAfter.length),this.variables.M__=n.matchBefore,this.variables.T__=n.matchAfter,this.insertSnippetForSelection(e,n.content),this.variables.M__=this.variables.T__=null),!0)},this.findMatchingSnippet=function(e,t,n){for(var i=e.length;i--;){var r=e[i];if((!r.startRe||r.startRe.test(t))&&((!r.endRe||r.endRe.test(n))&&(r.startRe||r.endRe)))return r.matchBefore=r.startRe?r.startRe.exec(t):[""],r.matchAfter=r.endRe?r.endRe.exec(n):[""],r.replaceBefore=r.triggerRe?r.triggerRe.exec(t)[0]:"",r.replaceAfter=r.endTriggerRe?r.endTriggerRe.exec(n)[0]:"",r}},this.snippetMap={},this.snippetNameMap={},this.register=function(e,t){var n=this.snippetMap,i=this.snippetNameMap,r=this;function a(e){return e&&!/^\^?\(.*\)\$?$|^\\b$/.test(e)&&(e="(?:"+e+")"),e||""}function o(e,t,n){return e=a(e),t=a(t),n?(e=t+e,e&&"$"!=e[e.length-1]&&(e+="$")):(e+=t,e&&"^"!=e[0]&&(e="^"+e)),new RegExp(e)}function c(e){e.scope||(e.scope=t||"_"),t=e.scope,n[t]||(n[t]=[],i[t]={});var a=i[t];if(e.name){var c=a[e.name];c&&r.unregister(c),a[e.name]=e}n[t].push(e),e.tabTrigger&&!e.trigger&&(!e.guard&&/^\w/.test(e.tabTrigger)&&(e.guard="\\b"),e.trigger=s.escapeRegExp(e.tabTrigger)),(e.trigger||e.guard||e.endTrigger||e.endGuard)&&(e.startRe=o(e.trigger,e.guard,!0),e.triggerRe=new RegExp(e.trigger,"",!0),e.endRe=o(e.endTrigger,e.endGuard,!0),e.endTriggerRe=new RegExp(e.endTrigger,"",!0))}e||(e=[]),e&&e.content?c(e):Array.isArray(e)&&e.forEach(c),this._signal("registerSnippets",{scope:t})},this.unregister=function(e,t){var n=this.snippetMap,i=this.snippetNameMap;function r(e){var r=i[e.scope||t];if(r&&r[e.name]){delete r[e.name];var s=n[e.scope||t],a=s&&s.indexOf(e);a>=0&&s.splice(a,1)}}e.content?r(e):Array.isArray(e)&&e.forEach(r)},this.parseSnippetFile=function(e){e=e.replace(/\r/g,"");var t,n=[],i={},r=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;while(t=r.exec(e)){if(t[1])try{i=JSON.parse(t[1]),n.push(i)}catch(c){}if(t[4])i.content=t[4].replace(/^\t/gm,""),n.push(i),i={};else{var s=t[2],a=t[3];if("regex"==s){var o=/\/((?:[^\/\\]|\\.)*)|$/g;i.guard=o.exec(a)[1],i.trigger=o.exec(a)[1],i.endTrigger=o.exec(a)[1],i.endGuard=o.exec(a)[1]}else"snippet"==s?(i.tabTrigger=a.match(/^\S*/)[0],i.name||(i.name=a)):i[s]=a}}return n},this.getSnippetByName=function(e,t){var n,i=this.snippetNameMap;return this.getActiveScopes(t).some((function(t){var r=i[t];return r&&(n=r[e]),!!n}),this),n}}).call(d.prototype);var h=function(e){if(e.tabstopManager)return e.tabstopManager;e.tabstopManager=this,this.$onChange=this.onChange.bind(this),this.$onChangeSelection=s.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(e)};(function(){this.attach=function(e){this.index=0,this.ranges=[],this.tabstops=[],this.$openTabstops=null,this.selectedTabstop=null,this.editor=e,this.editor.on("change",this.$onChange),this.editor.on("changeSelection",this.$onChangeSelection),this.editor.on("changeSession",this.$onChangeSession),this.editor.commands.on("afterExec",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges=null,this.tabstops=null,this.selectedTabstop=null,this.editor.removeListener("change",this.$onChange),this.editor.removeListener("changeSelection",this.$onChangeSelection),this.editor.removeListener("changeSession",this.$onChangeSession),this.editor.commands.removeListener("afterExec",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.editor=null},this.onChange=function(e){var t="r"==e.action[0],n=e.start,i=e.end,r=n.row,s=i.row,a=s-r,o=i.column-n.column;if(t&&(a=-a,o=-o),!this.$inChange&&t){var c=this.selectedTabstop,l=c&&!c.some((function(e){return u(e.start,n)<=0&&u(e.end,i)>=0}));if(l)return this.detach()}for(var d=this.ranges,h=0;h0?(this.removeRange(f),h--):(f.start.row==r&&f.start.column>n.column&&(f.start.column+=o),f.end.row==r&&f.end.column>=n.column&&(f.end.column+=o),f.start.row>=r&&(f.start.row+=a),f.end.row>=r&&(f.end.row+=a),u(f.start,f.end)>0&&this.removeRange(f)))}d.length||this.detach()},this.updateLinkedFields=function(){var e=this.selectedTabstop;if(e&&e.hasLinkedRanges){this.$inChange=!0;for(var n=this.editor.session,i=n.getTextRange(e.firstNonLinked),r=e.length;r--;){var s=e[r];if(s.linked){var a=t.snippetManager.tmStrFormat(i,s.original);n.replace(s,a)}}this.$inChange=!1}},this.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},this.onChangeSelection=function(){if(this.editor){for(var e=this.editor.selection.lead,t=this.editor.selection.anchor,n=this.editor.selection.isEmpty(),i=this.ranges.length;i--;)if(!this.ranges[i].linked){var r=this.ranges[i].contains(e.row,e.column),s=n||this.ranges[i].contains(t.row,t.column);if(r&&s)return}this.detach()}},this.onChangeSession=function(){this.detach()},this.tabNext=function(e){var t=this.tabstops.length,n=this.index+(e||1);n=Math.min(Math.max(n,1),t),n==t&&(n=0),this.selectTabstop(n),0===n&&this.detach()},this.selectTabstop=function(e){this.$openTabstops=null;var t=this.tabstops[this.index];if(t&&this.addTabstopMarkers(t),this.index=e,t=this.tabstops[this.index],t&&t.length){if(this.selectedTabstop=t,this.editor.inVirtualSelectionMode)this.editor.selection.setRange(t.firstNonLinked);else{var n=this.editor.multiSelect;n.toSingleRange(t.firstNonLinked.clone());for(var i=t.length;i--;)t.hasLinkedRanges&&t[i].linked||n.addRange(t[i].clone(),!0);n.ranges[0]&&n.addRange(n.ranges[0].clone())}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)}},this.addTabstops=function(e,t,n){if(this.$openTabstops||(this.$openTabstops=[]),!e[0]){var i=a.fromPoints(n,n);g(i.start,t),g(i.end,t),e[0]=[i],e[0].index=0}var r=this.index,s=[r+1,0],o=this.ranges;e.forEach((function(e,n){for(var i=this.$openTabstops[n]||e,r=e.length;r--;){var c=e[r],l=a.fromPoints(c.start,c.end||c.start);p(l.start,t),p(l.end,t),l.original=c,l.tabstop=i,o.push(l),i!=e?i.unshift(l):i[r]=l,c.fmtString?(l.linked=!0,i.hasLinkedRanges=!0):i.firstNonLinked||(i.firstNonLinked=l)}i.firstNonLinked||(i.hasLinkedRanges=!1),i===e&&(s.push(i),this.$openTabstops[n]=i),this.addTabstopMarkers(i)}),this),s.length>2&&(this.tabstops.length&&s.push(s.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,s))},this.addTabstopMarkers=function(e){var t=this.editor.session;e.forEach((function(e){e.markerId||(e.markerId=t.addMarker(e,"ace_snippet-marker","text"))}))},this.removeTabstopMarkers=function(e){var t=this.editor.session;e.forEach((function(e){t.removeMarker(e.markerId),e.markerId=null}))},this.removeRange=function(e){var t=e.tabstop.indexOf(e);e.tabstop.splice(t,1),t=this.ranges.indexOf(e),this.ranges.splice(t,1),this.editor.session.removeMarker(e.markerId),e.tabstop.length||(t=this.tabstops.indexOf(e.tabstop),-1!=t&&this.tabstops.splice(t,1),this.tabstops.length||this.detach())},this.keyboardHandler=new c,this.keyboardHandler.bindKeys({Tab:function(e){t.snippetManager&&t.snippetManager.expandWithTab(e)||e.tabstopManager.tabNext(1)},"Shift-Tab":function(e){e.tabstopManager.tabNext(-1)},Esc:function(e){e.tabstopManager.detach()},Return:function(e){return!1}})}).call(h.prototype);var f={};f.onChange=o.prototype.onChange,f.setPosition=function(e,t){this.pos.row=e,this.pos.column=t},f.update=function(e,t,n){this.$insertRight=n,this.pos=e,this.onChange(t)};var p=function(e,t){0==e.row&&(e.column+=t.column),e.row+=t.row},g=function(e,t){e.row==t.row&&(e.column-=t.column),e.row-=t.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}"),t.snippetManager=new d;var m=e("./editor").Editor;(function(){this.insertSnippet=function(e,n){return t.snippetManager.insertSnippet(this,e,n)},this.expandSnippet=function(e){return t.snippetManager.expandWithTab(this,e)}}).call(m.prototype)})),ace.define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"],(function(e,t,n){"use strict";var i=e("../virtual_renderer").VirtualRenderer,r=e("../editor").Editor,s=e("../range").Range,a=e("../lib/event"),o=e("../lib/lang"),c=e("../lib/dom"),l=function(e){var t=new i(e);t.$maxLines=4;var n=new r(t);return n.setHighlightActiveLine(!1),n.setShowPrintMargin(!1),n.renderer.setShowGutter(!1),n.renderer.setHighlightGutterLine(!1),n.$mouseHandler.$focusWaitTimout=0,n.$highlightTagPending=!0,n},u=function(e){var t=c.createElement("div"),n=new l(t);e&&e.appendChild(t),t.style.display="none",n.renderer.content.style.cursor="default",n.renderer.setStyle("ace_autocomplete"),n.setOption("displayIndentGuides",!1),n.setOption("dragDelay",150);var i,r=function(){};n.focus=r,n.$isFocused=!0,n.renderer.$cursorLayer.restartTimer=r,n.renderer.$cursorLayer.element.style.opacity=0,n.renderer.$maxLines=8,n.renderer.$keepTextAreaAtCursor=!1,n.setHighlightActiveLine(!1),n.session.highlight(""),n.session.$searchHighlight.clazz="ace_highlight-marker",n.on("mousedown",(function(e){var t=e.getDocumentPosition();n.selection.moveToPosition(t),d.start.row=d.end.row=t.row,e.stop()}));var u=new s(-1,0,-1,1/0),d=new s(-1,0,-1,1/0);d.id=n.session.addMarker(d,"ace_active-line","fullLine"),n.setSelectOnHover=function(e){e?u.id&&(n.session.removeMarker(u.id),u.id=null):u.id=n.session.addMarker(u,"ace_line-hover","fullLine")},n.setSelectOnHover(!1),n.on("mousemove",(function(e){if(i){if(i.x!=e.x||i.y!=e.y){i=e,i.scrollTop=n.renderer.scrollTop;var t=i.getDocumentPosition().row;u.start.row!=t&&(u.id||n.setRow(t),f(t))}}else i=e})),n.renderer.on("beforeRender",(function(){if(i&&-1!=u.start.row){i.$pos=null;var e=i.getDocumentPosition().row;u.id||n.setRow(e),f(e,!0)}})),n.renderer.on("afterRender",(function(){var e=n.getRow(),t=n.renderer.$textLayer,i=t.element.childNodes[e-t.config.firstRow];i!=t.selectedNode&&(t.selectedNode&&c.removeCssClass(t.selectedNode,"ace_selected"),t.selectedNode=i,i&&c.addCssClass(i,"ace_selected"))}));var h=function(){f(-1)},f=function(e,t){e!==u.start.row&&(u.start.row=u.end.row=e,t||n.session._emit("changeBackMarker"),n._emit("changeHoverMarker"))};n.getHoveredRow=function(){return u.start.row},a.addListener(n.container,"mouseout",h),n.on("hide",h),n.on("changeSelection",h),n.session.doc.getLength=function(){return n.data.length},n.session.doc.getLine=function(e){var t=n.data[e];return"string"==typeof t?t:t&&t.value||""};var p=n.session.bgTokenizer;return p.$tokenizeRow=function(e){var t=n.data[e],i=[];if(!t)return i;"string"==typeof t&&(t={value:t}),t.caption||(t.caption=t.value||t.name);for(var r,s,a=-1,o=0;oc-2&&(l=l.substr(0,c-t.caption.length-3)+"…"),i.push({type:"rightAlignedText",value:l})}return i},p.$updateOnChange=r,p.start=r,n.session.$computeWidth=function(){return this.screenWidth=0},n.$blockScrolling=1/0,n.isOpen=!1,n.isTopdown=!1,n.autoSelect=!0,n.data=[],n.setData=function(e){n.setValue(o.stringRepeat("\n",e.length),-1),n.data=e||[],n.setRow(0)},n.getData=function(e){return n.data[e]},n.getRow=function(){return d.start.row},n.setRow=function(e){e=Math.max(this.autoSelect?0:-1,Math.min(this.data.length,e)),d.start.row!=e&&(n.selection.clearSelection(),d.start.row=d.end.row=e||0,n.session._emit("changeBackMarker"),n.moveCursorTo(e||0,0),n.isOpen&&n._signal("select"))},n.on("changeSelection",(function(){n.isOpen&&n.setRow(n.selection.lead.row),n.renderer.scrollCursorIntoView()})),n.hide=function(){this.container.style.display="none",this._signal("hide"),n.isOpen=!1},n.show=function(e,t,r){var s=this.container,a=window.innerHeight,o=window.innerWidth,c=this.renderer,l=c.$maxLines*t*1.4,u=e.top+this.$borderSize,d=u>a/2&&!r;d&&u+t+l>a?(c.$maxPixelHeight=u-2*this.$borderSize,s.style.top="",s.style.bottom=a-u+"px",n.isTopdown=!1):(u+=t,c.$maxPixelHeight=a-u-.2*t,s.style.top=u+"px",s.style.bottom="",n.isTopdown=!0),s.style.display="",this.renderer.$textLayer.checkForSizeChanges();var h=e.left;h+s.offsetWidth>o&&(h=o-s.offsetWidth),s.style.left=h+"px",this._signal("show"),i=null,n.isOpen=!0},n.getTextLeftOffset=function(){return this.$borderSize+this.renderer.$padding+this.$imageSize},n.$imageSize=0,n.$borderSize=1,n};c.importCssString(".ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #CAD6FA; z-index: 1;}.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid #abbffe; margin-top: -1px; background: rgba(233,233,253,0.4);}.ace_editor.ace_autocomplete .ace_line-hover { position: absolute; z-index: 2;}.ace_editor.ace_autocomplete .ace_scroller { background: none; border: none; box-shadow: none;}.ace_rightAlignedText { color: gray; display: inline-block; position: absolute; right: 4px; text-align: right; z-index: -1;}.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #000; text-shadow: 0 0 0.01em;}.ace_editor.ace_autocomplete { width: 280px; z-index: 200000; background: #fbfbfb; color: #444; border: 1px lightgray solid; position: fixed; box-shadow: 2px 3px 5px rgba(0,0,0,.2); line-height: 1.4;}"),t.AcePopup=u})),ace.define("ace/autocomplete/util",["require","exports","module"],(function(e,t,n){"use strict";t.parForEach=function(e,t,n){var i=0,r=e.length;0===r&&n();for(var s=0;s=0;s--){if(!n.test(e[s]))break;r.push(e[s])}return r.reverse().join("")},t.retrieveFollowingIdentifier=function(e,t,n){n=n||i;for(var r=[],s=t;s=n?-1:t+1;break;case"start":t=0;break;case"end":t=n;break}this.popup.setRow(t)},this.insertMatch=function(e,t){if(e||(e=this.popup.getData(this.popup.getRow())),!e)return!1;if(e.completer&&e.completer.insertMatch)e.completer.insertMatch(this.editor,e);else{if(this.completions.filterText)for(var n,i=this.editor.selection.getAllRanges(),r=0;n=i[r];r++)n.start.column-=this.completions.filterText.length,this.editor.session.remove(n);e.snippet?c.insertSnippet(this.editor,e.snippet):this.editor.execCommand("insertstring",e.value||e)}this.detach()},this.commands={Up:function(e){e.completer.goTo("up")},Down:function(e){e.completer.goTo("down")},"Ctrl-Up|Ctrl-Home":function(e){e.completer.goTo("start")},"Ctrl-Down|Ctrl-End":function(e){e.completer.goTo("end")},Esc:function(e){e.completer.detach()},Return:function(e){return e.completer.insertMatch()},"Shift-Return":function(e){e.completer.insertMatch(null,{deleteSuffix:!0})},Tab:function(e){var t=e.completer.insertMatch();if(t||e.tabstopManager)return t;e.completer.goTo("down")},PageUp:function(e){e.completer.popup.gotoPageUp()},PageDown:function(e){e.completer.popup.gotoPageDown()}},this.gatherCompletions=function(e,t){var n=e.getSession(),i=e.getCursorPosition(),r=s.getCompletionPrefix(e);this.base=n.doc.createAnchor(i.row,i.column-r.length),this.base.$insertRight=!0;var a=[],o=e.completers.length;return e.completers.forEach((function(c,l){c.getCompletions(e,n,i,r,(function(n,i){!n&&i&&(a=a.concat(i)),t(null,{prefix:s.getCompletionPrefix(e),matches:a,finished:0===--o})}))})),!0},this.showPopup=function(e){this.editor&&this.detach(),this.activated=!0,this.editor=e,e.completer!=this&&(e.completer&&e.completer.detach(),e.completer=this),e.on("changeSelection",this.changeListener),e.on("blur",this.blurListener),e.on("mousedown",this.mousedownListener),e.on("mousewheel",this.mousewheelListener),this.updateCompletions()},this.updateCompletions=function(e){if(e&&this.base&&this.completions){var t=this.editor.getCursorPosition(),n=this.editor.session.getTextRange({start:this.base,end:t});if(n==this.completions.filterText)return;return this.completions.setFilter(n),this.completions.filtered.length?1!=this.completions.filtered.length||this.completions.filtered[0].value!=n||this.completions.filtered[0].snippet?void this.openPopup(this.editor,n,e):this.detach():this.detach()}var i=this.gatherCompletionsId;this.gatherCompletions(this.editor,function(t,n){var r=function(){if(n.finished)return this.detach()}.bind(this),s=n.prefix,a=n&&n.matches;if(!a||!a.length)return r();if(0===s.indexOf(n.prefix)&&i==this.gatherCompletionsId){this.completions=new u(a),this.exactMatch&&(this.completions.exactMatch=!0),this.completions.setFilter(s);var o=this.completions.filtered;return o.length&&(1!=o.length||o[0].value!=s||o[0].snippet)?this.autoInsert&&1==o.length&&n.finished?this.insertMatch(o[0]):void this.openPopup(this.editor,s,e):r()}}.bind(this))},this.cancelContextMenu=function(){this.editor.$mouseHandler.cancelContextMenu()},this.updateDocTooltip=function(){var e=this.popup,t=e.data,n=t&&(t[e.getHoveredRow()]||t[e.getRow()]),i=null;return n&&this.editor&&this.popup.isOpen?(this.editor.completers.some((function(e){return e.getDocTooltip&&(i=e.getDocTooltip(n)),i})),i||(i=n),"string"==typeof i&&(i={docText:i}),i&&(i.docHTML||i.docText)?void this.showDocTooltip(i):this.hideDocTooltip()):this.hideDocTooltip()},this.showDocTooltip=function(e){this.tooltipNode||(this.tooltipNode=o.createElement("div"),this.tooltipNode.className="ace_tooltip ace_doc-tooltip",this.tooltipNode.style.margin=0,this.tooltipNode.style.pointerEvents="auto",this.tooltipNode.tabIndex=-1,this.tooltipNode.onblur=this.blurListener.bind(this),this.tooltipNode.onclick=this.onTooltipClick.bind(this));var t=this.tooltipNode;e.docHTML?t.innerHTML=e.docHTML:e.docText&&(t.textContent=e.docText),t.parentNode||document.body.appendChild(t);var n=this.popup,i=n.container.getBoundingClientRect();t.style.top=n.container.style.top,t.style.bottom=n.container.style.bottom,window.innerWidth-i.right<320?(t.style.right=window.innerWidth-i.left+"px",t.style.left=""):(t.style.left=i.right+1+"px",t.style.right=""),t.style.display="block"},this.hideDocTooltip=function(){if(this.tooltipTimer.cancel(),this.tooltipNode){var e=this.tooltipNode;this.editor.isFocused()||document.activeElement!=e||this.editor.focus(),this.tooltipNode=null,e.parentNode&&e.parentNode.removeChild(e)}},this.onTooltipClick=function(e){var t=e.target;while(t&&t!=this.tooltipNode){if("A"==t.nodeName&&t.href){t.rel="noreferrer",t.target="_blank";break}t=t.parentNode}}}).call(l.prototype),l.startCommand={name:"startAutocomplete",exec:function(e){e.completer||(e.completer=new l),e.completer.autoInsert=!1,e.completer.autoSelect=!0,e.completer.showPopup(e),e.completer.cancelContextMenu()},bindKey:"Ctrl-Space|Ctrl-Shift-Space|Alt-Space"};var u=function(e,t){this.all=e,this.filtered=e,this.filterText=t||"",this.exactMatch=!1};(function(){this.setFilter=function(e){if(e.length>this.filterText&&0===e.lastIndexOf(this.filterText,0))var t=this.filtered;else t=this.all;this.filterText=e,t=this.filterCompletions(t,this.filterText),t=t.sort((function(e,t){return t.exactMatch-e.exactMatch||t.score-e.score}));var n=null;t=t.filter((function(e){var t=e.snippet||e.caption||e.value;return t!==n&&(n=t,!0)})),this.filtered=t},this.filterCompletions=function(e,t){var n=[],i=t.toUpperCase(),r=t.toLowerCase();e:for(var s,a=0;s=e[a];a++){var o=s.value||s.caption||s.snippet;if(o){var c,l,u=-1,d=0,h=0;if(this.exactMatch){if(t!==o.substr(0,t.length))continue e}else for(var f=0;f=0&&(g<0||p0&&(-1===u&&(h+=10),h+=l),d|=1<",a.escapeHTML(e.caption),"","
    ",a.escapeHTML(e.snippet)].join(""))}},d=[u,c,l];t.setCompleters=function(e){d.length=0,e&&d.push.apply(d,e)},t.addCompleter=function(e){d.push(e)},t.textCompleter=c,t.keyWordCompleter=l,t.snippetCompleter=u;var h={name:"expandSnippet",exec:function(e){return i.expandWithTab(e)},bindKey:"Tab"},f=function(e,t){p(t.session.$mode)},p=function(e){var t=e.$id;i.files||(i.files={}),g(t),e.modes&&e.modes.forEach(p)},g=function(e){if(e&&!i.files[e]){var t=e.replace("mode","snippets");i.files[e]={},s.loadModule(t,(function(t){t&&(i.files[e]=t,!t.snippets&&t.snippetText&&(t.snippets=i.parseSnippetFile(t.snippetText)),i.register(t.snippets||[],t.scope),t.includeScopes&&(i.snippetMap[t.scope].includeScopes=t.includeScopes,t.includeScopes.forEach((function(e){g("ace/mode/"+e)}))))}))}},m=function(e){var t=e.editor,n=t.completer&&t.completer.activated;if("backspace"===e.command.name)n&&!o.getCompletionPrefix(t)&&t.completer.detach();else if("insertstring"===e.command.name){var i=o.getCompletionPrefix(t);i&&!n&&(t.completer||(t.completer=new r),t.completer.autoInsert=!1,t.completer.showPopup(t))}},v=e("../editor").Editor;e("../config").defineOptions(v.prototype,"editor",{enableBasicAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:d),this.commands.addCommand(r.startCommand)):this.commands.removeCommand(r.startCommand)},value:!1},enableLiveAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:d),this.commands.on("afterExec",m)):this.commands.removeListener("afterExec",m)},value:!1},enableSnippets:{set:function(e){e?(this.commands.addCommand(h),this.on("changeMode",f),f(null,this)):(this.commands.removeCommand(h),this.off("changeMode",f))},value:!1}})})),function(){ace.acequire(["ace/ext/language_tools"],(function(){}))}()},"20a6":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.passcode,expression:"passcode"}],attrs:{placeholder:"Enter passcode...",autofocus:""},domProps:{value:e.passcode},on:{input:function(t){t.target.composing||(e.passcode=t.target.value)}}}),n("vui-button",{attrs:{params:{passcode:e.passcode}}},[e._v("Submit")])],1)},r=[],s={data:function(){return{passcode:""}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"20bf":function(e,t,n){"use strict";var i=n("8aa7"),r=n("ebb5").exportTypedArrayStaticMethod,s=n("a078");r("from",s,i)},"210c":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.minButton?n("vui-button",{attrs:{disabled:e.val<=e.min},on:{click:function(t){return e.onUpdatedValue(e.min+1-e.val)}}},[e._v("Min")]):e._e(),e._l(e.subButtons,(function(t){return n("vui-button",{key:"-"+t,attrs:{disabled:e.val-te.max},on:{click:function(n){return e.onUpdatedValue(Math.pow(10,t))}}},[e._v("+")])})),e.maxButton?n("vui-button",{attrs:{disabled:e.val>=e.max},on:{click:function(t){return e.onUpdatedValue(e.max-e.val)}}},[e._v("Max")]):e._e()],2)},r=[],s=(n("a9e3"),n("8a79"),n("c0d6")),a={props:{value:{type:Number,default:0},minButton:{type:Boolean,default:!1},maxButton:{type:Boolean,default:!1},buttonCount:{type:Number,default:1},min:{type:Number,default:0},max:{type:Number,default:100},pushState:{type:Boolean,default:!0},width:{type:String,default:"10em"},decimalPlaces:{type:Number,default:0}},data:function(){return{val:this.value}},computed:{subButtons:function(){if(!this.buttonCount)return[];for(var e=[],t=this.buttonCount-1;t>=0;t--)e.push(t);return e},addButtons:function(){if(!this.buttonCount)return[];for(var e=[],t=0;tthis.max&&(e=this.max),eh;h++)if(p=k(e[h]),p&&p instanceof l)return p;return new l(!1)}u=d.call(e)}g=u.next;while(!(m=g.call(u)).done){try{p=k(m.value)}catch(A){throw c(u),A}if("object"==typeof p&&p&&p instanceof l)return p}return new l(!1)}},2315:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("strike")},{strike:function(){return r(this,"strike","","")}})},2351:function(e,t,n){var i=n("746f");i("split")},"23cb":function(e,t,n){var i=n("a691"),r=Math.max,s=Math.min;e.exports=function(e,t){var n=i(e);return n<0?r(n+t,0):s(n,t)}},"23dc":function(e,t,n){var i=n("d44e");i(Math,"Math",!0)},"23e7":function(e,t,n){var i=n("da84"),r=n("06cf").f,s=n("9112"),a=n("6eeb"),o=n("ce4e"),c=n("e893"),l=n("94ca");e.exports=function(e,t){var n,u,d,h,f,p,g=e.target,m=e.global,v=e.stat;if(u=m?i:v?i[g]||o(g,{}):(i[g]||{}).prototype,u)for(d in t){if(f=t[d],e.noTargetGet?(p=r(u,d),h=p&&p.value):h=u[d],n=l(m?d:g+(v?".":"#")+d,e.forced),!n&&void 0!==h){if(typeof f===typeof h)continue;c(f,h)}(e.sham||h&&h.sham)&&s(f,"sham",!0),a(u,d,f,e)}}},"241c":function(e,t,n){var i=n("ca84"),r=n("7839"),s=r.concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return i(e,s)}},2480:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-button",{attrs:{params:{stop:1}}},[e._v("Stop")]),n("br"),n(e.term,{tag:"component",staticClass:"terminal"})],1)},r=[],s={props:["fg","bg"],computed:{style:function(){return{color:"#"+this.fg,"background-color":"#"+this.bg}}},template:''},a={props:["to"],methods:{invoke:function(){this.$toTopic({terminal_topic:this.to})}},template:''},o={data:function(){return{s:this.$root.$data.state}},computed:{term:function(){return{components:{co:s,to:a},template:"
    ".concat(this.s.terminal,"
    ")}}}},c=o,l=(n("7a67"),n("2877")),u=Object(l["a"])(c,i,r,!1,null,"5da4d0bc",null);t["default"]=u.exports},2532:function(e,t,n){"use strict";var i=n("23e7"),r=n("5a34"),s=n("1d80"),a=n("ab13");i({target:"String",proto:!0,forced:!a("includes")},{includes:function(e){return!!~String(s(this)).indexOf(r(e),arguments.length>1?arguments[1]:void 0)}})},"253b":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("h3",[e._v("Auxiliary Timing Unit:")]),e.timeractive?n("vui-button",{attrs:{params:{time:1}}},[e._v("Arming")]):n("vui-button",{attrs:{params:{time:1}}},[e._v("Not Arming")])],1),n("div",[n("h3",[e._v("Time Left:")]),n("vui-button",{attrs:{params:{tp:-30}}},[e._v("--")]),n("vui-button",{attrs:{params:{tp:-1}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.minute)+":"+e._s(e.second))]),n("vui-button",{attrs:{params:{tp:1}}},[e._v("+")]),n("vui-button",{attrs:{params:{tp:30}}},[e._v("++")])],1),n("div",[n("h3",[e._v("Scanning:")]),e.scanning?n("vui-button",{attrs:{params:{scanning:1}}},[e._v("Armed")]):n("vui-button",{attrs:{params:{scanning:1}}},[e._v("Not Armed")]),n("span",{staticClass:"value"},[e._v("Movement sensor active when armed!")])],1),n("div",[n("h3",[e._v("Range:")]),n("vui-button",{attrs:{params:{range:-1}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.range))]),n("vui-button",{attrs:{params:{range:1}}},[e._v("+")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("de06"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"10d6546a",null);t["default"]=c.exports},"256f":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("vui-group",[n("vui-group-item",{attrs:{label:"UID:"}},[e._v(e._s(e.incident.id))]),n("vui-group-item",{attrs:{label:"Date:"}},[e._v(e._s(e.incident.datetime))]),n("vui-group-item",{attrs:{label:"Charges:"}},e._l(e.incident.charges,(function(t,i){return n("span",{key:i},[e._v(" "+e._s(t)),i+11?arguments[1]:void 0)}))},"25eb":function(e,t,n){var i=n("23e7"),r=n("c20d");i({target:"Number",stat:!0,forced:Number.parseInt!=r},{parseInt:r})},"25f0":function(e,t,n){"use strict";var i=n("6eeb"),r=n("825a"),s=n("d039"),a=n("ad6d"),o="toString",c=RegExp.prototype,l=c[o],u=s((function(){return"/a/b"!=l.call({source:"a",flags:"b"})})),d=l.name!=o;(u||d)&&i(RegExp.prototype,o,(function(){var e=r(this),t=String(e.source),n=e.flags,i=String(void 0===n&&e instanceof RegExp&&!("flags"in c)?a.call(e):n);return"/"+t+"/"+i}),{unsafe:!0})},2626:function(e,t,n){"use strict";var i=n("d066"),r=n("9bf2"),s=n("b622"),a=n("83ab"),o=s("species");e.exports=function(e){var t=i(e),n=r.f;a&&t&&!t[o]&&n(t,o,{configurable:!0,get:function(){return this}})}},2653:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{staticClass:"clear-both"},[n("vui-img",{staticClass:"character-image",attrs:{name:"character"}}),n("p",[e._v(" Welcome, "),n("strong",[e._v(e._s(e.character_name))]),e._v("."),n("br"),e._v(" Round duration: "),n("strong",[e._v(e._s(e.round_duration))]),n("br"),e._v(" Alert level: "),n("strong",{style:{color:e.alertLevelColor}},[e._v(e._s(e.alert_level))]),n("br")])],1),n("div",{staticClass:"clear-both"},[e.shuttleStatusMessage?n("strong",[e._v(e._s(e.shuttleStatusMessage))]):e._e(),n("br"),e._v(" Choose from the following available positions: ")]),e.unique_role_available?n("div",[n("div",{staticClass:"gs-block"},[n("div",{staticClass:"dept"},[e._v("A unique role is available!")]),n("vui-button",{staticClass:"d-block m-1",attrs:{params:{ghostspawner:1},icon:"ghost"}},[e._v("Ghost Spawner Menu")])],1)]):n("div",[n("vui-button",{staticClass:"d-block",attrs:{params:{ghostspawner:1},icon:"ghost"}},[e._v("Ghost Spawner Menu")])],1),e.jobs_available>0?n("div",[e._l(e.fixedJobsList,(function(t,i){return n("div",{key:i,staticClass:"mt-2 dept-block",class:"border-dept-"+i.toLowerCase()},[n("div",{staticClass:"dept mb-1",class:"bg-dept-"+i.toLowerCase()},[e._v(" "+e._s(i)+" ")]),e._l(t,(function(t){return n("div",{key:t.title},[n("vui-button",{staticClass:"d-block mx-1",attrs:{params:{SelectedJob:t.title}}},[n("span",{class:{"fw-bold":t.head}},[e._v(e._s(t.title))]),1!=t.total_positions?n("span",[e._v(" ("+e._s(t.current_positions)),t.total_positions>1?n("span",[e._v(" / "+e._s(t.total_positions))]):e._e(),e._v(")")]):e._e()])],1)}))],2)})),n("span",{staticClass:"fs-small fst-italic"},[e._v("Numbers in brackets show current amount of active players out of all available job slots for that job.")])],2):n("div",{staticClass:"fst-italic"},[e._v(" No jobs available. ")])])},r=[];n("a4d3"),n("e01a"),n("d28b"),n("4de4"),n("a630"),n("e260"),n("fb6a"),n("b0c0"),n("4fad"),n("c1f9"),n("d3b7"),n("25f0"),n("3ca3"),n("ddb0");function s(e,t){return u(e)||l(e,t)||o(e,t)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){if(e){if("string"===typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n0})))},shuttleStatusMessage:function(){switch(this.shuttle_status){case"post-evac":return"The station has been evacuated.";case"evac":return"The station is currently undergoing evacuation procedures.";case"transfer":return"The station is currently undergoing crew transfer procedures."}return null},alertLevelColor:function(){switch(this.alert_level.toLowerCase()){case"green":return"inherit";case"blue":return"blue";case"yellow":return"yellow"}return"red"}}},h=d,f=(n("11f5"),n("2877")),p=Object(f["a"])(h,i,r,!1,null,"36f58934",null);t["default"]=p.exports},"26e9":function(e,t,n){"use strict";var i=n("23e7"),r=n("e8b5"),s=[].reverse,a=[1,2];i({target:"Array",proto:!0,forced:String(a)===String(a.reverse())},{reverse:function(){return r(this)&&(this.length=this.length),s.call(this)}})},2704:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabel"},[e._v(e._s(e.label))]),n("div",{staticClass:"itemContent"},[e._t("default")],2)])},r=[],s={props:{label:{type:String,default:""}}},a=s,o=(n("b593"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"68f8b60e",null);t["default"]=c.exports},"277d":function(e,t,n){var i=n("23e7"),r=n("e8b5");i({target:"Array",stat:!0},{isArray:r})},"27cd":function(e,t,n){"use strict";n("38d6")},2877:function(e,t,n){"use strict";function i(e,t,n,i,r,s,a,o){var c,l="function"===typeof e?e.options:e;if(t&&(l.render=t,l.staticRenderFns=n,l._compiled=!0),i&&(l.functional=!0),s&&(l._scopeId="data-v-"+s),a?(c=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),r&&r.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},l._ssrRegister=c):r&&(c=o?function(){r.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:r),c)if(l.functional){l._injectStyles=c;var u=l.render;l.render=function(e,t){return c.call(t),u(e,t)}}else{var d=l.beforeCreate;l.beforeCreate=d?[].concat(d,c):[c]}return{exports:e,options:l}}n.d(t,"a",(function(){return i}))},2954:function(e,t,n){"use strict";var i=n("ebb5"),r=n("4840"),s=n("d039"),a=i.aTypedArray,o=i.aTypedArrayConstructor,c=i.exportTypedArrayMethod,l=[].slice,u=s((function(){new Int8Array(1).slice()}));c("slice",(function(e,t){var n=l.call(a(this),e,t),i=r(this,this.constructor),s=0,c=n.length,u=new(o(i))(c);while(c>s)u[s]=n[s++];return u}),u)},"29f3":function(e,t){var n=Object.prototype,i=n.toString;function r(e){return i.call(e)}e.exports=r},"2a1b":function(e,t,n){var i=n("746f");i("match")},"2a62":function(e,t,n){var i=n("825a");e.exports=function(e){var t=e["return"];if(void 0!==t)return i(t.call(e)).value}},"2af1":function(e,t,n){var i=n("23e7"),r=n("f748");i({target:"Math",stat:!0},{sign:r})},"2b10":function(e,t){function n(e,t,n){var i=-1,r=e.length;t<0&&(t=-t>r?0:r+t),n=n>r?r:n,n<0&&(n+=r),r=t>n?0:n-t>>>0,t>>>=0;var s=Array(r);while(++i4)return e;for(n=[],i=0;i1&&"0"==r.charAt(0)&&(s=B.test(r)?16:8,r=r.slice(8==s?1:2)),""===r)a=0;else{if(!(10==s?O:8==s?R:M).test(r))return e;a=parseInt(r,s)}n.push(a)}for(i=0;i=C(256,5-t))return null}else if(a>255)return null;for(o=n.pop(),i=0;i6)return;i=0;while(h()){if(r=null,i>0){if(!("."==h()&&i<4))return;d++}if(!D.test(h()))return;while(D.test(h())){if(s=parseInt(h(),10),null===r)r=s;else{if(0==r)return;r=10*r+s}if(r>255)return;d++}c[l]=256*c[l]+r,i++,2!=i&&4!=i||l++}if(4!=i)return;break}if(":"==h()){if(d++,!h())return}else if(h())return;c[l++]=t}else{if(null!==u)return;d++,l++,u=l}}if(null!==u){a=l-u,l=7;while(0!=l&&a>0)o=c[l],c[l--]=c[u+a-1],c[u+--a]=o}else if(8!=l)return;return c},U=function(e){for(var t=null,n=1,i=null,r=0,s=0;s<8;s++)0!==e[s]?(r>n&&(t=i,n=r),i=null,r=0):(null===i&&(i=s),++r);return r>n&&(t=i,n=r),t},z=function(e){var t,n,i,r;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=A(e/256);return t.join(".")}if("object"==typeof e){for(t="",i=U(e),n=0;n<8;n++)r&&0===e[n]||(r&&(r=!1),i===n?(t+=n?":":"::",r=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},G={},q=h({},G,{" ":1,'"':1,"<":1,">":1,"`":1}),K=h({},q,{"#":1,"?":1,"{":1,"}":1}),Y=h({},K,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),X=function(e,t){var n=p(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Q=function(e){return d(J,e.scheme)},Z=function(e){return""!=e.username||""!=e.password},ee=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},te=function(e,t){var n;return 2==e.length&&T.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ne=function(e){var t;return e.length>1&&te(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},ie=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&te(t[0],!0)||t.pop()},re=function(e){return"."===e||"%2e"===e.toLowerCase()},se=function(e){return e=e.toLowerCase(),".."===e||"%2e."===e||".%2e"===e||"%2e%2e"===e},ae={},oe={},ce={},le={},ue={},de={},he={},fe={},pe={},ge={},me={},ve={},be={},ye={},we={},_e={},xe={},ke={},Ae={},Ce={},Ee={},Se=function(e,t,n,r){var s,a,o,c,l=n||ae,u=0,h="",p=!1,g=!1,m=!1;n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(P,"")),t=t.replace(N,""),s=f(t);while(u<=s.length){switch(a=s[u],l){case ae:if(!a||!T.test(a)){if(n)return S;l=ce;continue}h+=a.toLowerCase(),l=oe;break;case oe:if(a&&(L.test(a)||"+"==a||"-"==a||"."==a))h+=a.toLowerCase();else{if(":"!=a){if(n)return S;h="",l=ce,u=0;continue}if(n&&(Q(e)!=d(J,h)||"file"==h&&(Z(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=h,n)return void(Q(e)&&J[e.scheme]==e.port&&(e.port=null));h="","file"==e.scheme?l=ye:Q(e)&&r&&r.scheme==e.scheme?l=le:Q(e)?l=fe:"/"==s[u+1]?(l=ue,u++):(e.cannotBeABaseURL=!0,e.path.push(""),l=Ae)}break;case ce:if(!r||r.cannotBeABaseURL&&"#"!=a)return S;if(r.cannotBeABaseURL&&"#"==a){e.scheme=r.scheme,e.path=r.path.slice(),e.query=r.query,e.fragment="",e.cannotBeABaseURL=!0,l=Ee;break}l="file"==r.scheme?ye:de;continue;case le:if("/"!=a||"/"!=s[u+1]){l=de;continue}l=pe,u++;break;case ue:if("/"==a){l=ge;break}l=ke;continue;case de:if(e.scheme=r.scheme,a==i)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query;else if("/"==a||"\\"==a&&Q(e))l=he;else if("?"==a)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query="",l=Ce;else{if("#"!=a){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.path.pop(),l=ke;continue}e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query,e.fragment="",l=Ee}break;case he:if(!Q(e)||"/"!=a&&"\\"!=a){if("/"!=a){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,l=ke;continue}l=ge}else l=pe;break;case fe:if(l=pe,"/"!=a||"/"!=h.charAt(u+1))continue;u++;break;case pe:if("/"!=a&&"\\"!=a){l=ge;continue}break;case ge:if("@"==a){p&&(h="%40"+h),p=!0,o=f(h);for(var v=0;v65535)return $;e.port=Q(e)&&w===J[e.scheme]?null:w,h=""}if(n)return;l=xe;continue}return $}h+=a;break;case ye:if(e.scheme="file","/"==a||"\\"==a)l=we;else{if(!r||"file"!=r.scheme){l=ke;continue}if(a==i)e.host=r.host,e.path=r.path.slice(),e.query=r.query;else if("?"==a)e.host=r.host,e.path=r.path.slice(),e.query="",l=Ce;else{if("#"!=a){ne(s.slice(u).join(""))||(e.host=r.host,e.path=r.path.slice(),ie(e)),l=ke;continue}e.host=r.host,e.path=r.path.slice(),e.query=r.query,e.fragment="",l=Ee}}break;case we:if("/"==a||"\\"==a){l=_e;break}r&&"file"==r.scheme&&!ne(s.slice(u).join(""))&&(te(r.path[0],!0)?e.path.push(r.path[0]):e.host=r.host),l=ke;continue;case _e:if(a==i||"/"==a||"\\"==a||"?"==a||"#"==a){if(!n&&te(h))l=ke;else if(""==h){if(e.host="",n)return;l=xe}else{if(c=W(e,h),c)return c;if("localhost"==e.host&&(e.host=""),n)return;h="",l=xe}continue}h+=a;break;case xe:if(Q(e)){if(l=ke,"/"!=a&&"\\"!=a)continue}else if(n||"?"!=a)if(n||"#"!=a){if(a!=i&&(l=ke,"/"!=a))continue}else e.fragment="",l=Ee;else e.query="",l=Ce;break;case ke:if(a==i||"/"==a||"\\"==a&&Q(e)||!n&&("?"==a||"#"==a)){if(se(h)?(ie(e),"/"==a||"\\"==a&&Q(e)||e.path.push("")):re(h)?"/"==a||"\\"==a&&Q(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&te(h)&&(e.host&&(e.host=""),h=h.charAt(0)+":"),e.path.push(h)),h="","file"==e.scheme&&(a==i||"?"==a||"#"==a))while(e.path.length>1&&""===e.path[0])e.path.shift();"?"==a?(e.query="",l=Ce):"#"==a&&(e.fragment="",l=Ee)}else h+=X(a,K);break;case Ae:"?"==a?(e.query="",l=Ce):"#"==a?(e.fragment="",l=Ee):a!=i&&(e.path[0]+=X(a,G));break;case Ce:n||"#"!=a?a!=i&&("'"==a&&Q(e)?e.query+="%27":e.query+="#"==a?"%23":X(a,G)):(e.fragment="",l=Ee);break;case Ee:a!=i&&(e.fragment+=X(a,q));break}u++}},Fe=function(e){var t,n,i=u(this,Fe,"URL"),r=arguments.length>1?arguments[1]:void 0,a=String(e),o=x(i,{type:"URL"});if(void 0!==r)if(r instanceof Fe)t=k(r);else if(n=Se(t={},String(r)),n)throw TypeError(n);if(n=Se(o,a,null,t),n)throw TypeError(n);var c=o.searchParams=new w,l=_(c);l.updateSearchParams(o.query),l.updateURL=function(){o.query=String(c)||null},s||(i.href=Te.call(i),i.origin=Le.call(i),i.protocol=De.call(i),i.username=Be.call(i),i.password=Re.call(i),i.host=Oe.call(i),i.hostname=Me.call(i),i.port=je.call(i),i.pathname=Ie.call(i),i.search=Pe.call(i),i.searchParams=Ne.call(i),i.hash=We.call(i))},$e=Fe.prototype,Te=function(){var e=k(this),t=e.scheme,n=e.username,i=e.password,r=e.host,s=e.port,a=e.path,o=e.query,c=e.fragment,l=t+":";return null!==r?(l+="//",Z(e)&&(l+=n+(i?":"+i:"")+"@"),l+=z(r),null!==s&&(l+=":"+s)):"file"==t&&(l+="//"),l+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==o&&(l+="?"+o),null!==c&&(l+="#"+c),l},Le=function(){var e=k(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(i){return"null"}return"file"!=t&&Q(e)?t+"://"+z(e.host)+(null!==n?":"+n:""):"null"},De=function(){return k(this).scheme+":"},Be=function(){return k(this).username},Re=function(){return k(this).password},Oe=function(){var e=k(this),t=e.host,n=e.port;return null===t?"":null===n?z(t):z(t)+":"+n},Me=function(){var e=k(this).host;return null===e?"":z(e)},je=function(){var e=k(this).port;return null===e?"":String(e)},Ie=function(){var e=k(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Pe=function(){var e=k(this).query;return e?"?"+e:""},Ne=function(){return k(this).searchParams},We=function(){var e=k(this).fragment;return e?"#"+e:""},He=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(s&&c($e,{href:He(Te,(function(e){var t=k(this),n=String(e),i=Se(t,n);if(i)throw TypeError(i);_(t.searchParams).updateSearchParams(t.query)})),origin:He(Le),protocol:He(De,(function(e){var t=k(this);Se(t,String(e)+":",ae)})),username:He(Be,(function(e){var t=k(this),n=f(String(e));if(!ee(t)){t.username="";for(var i=0;i1?arguments[1]:void 0,t.length)),i=String(e);return u?u.call(t,i,n):t.slice(n,n+i.length)===i}})},"2cf4":function(e,t,n){var i,r,s,a=n("da84"),o=n("d039"),c=n("0366"),l=n("1be4"),u=n("cc12"),d=n("1cdc"),h=n("605d"),f=a.location,p=a.setImmediate,g=a.clearImmediate,m=a.process,v=a.MessageChannel,b=a.Dispatch,y=0,w={},_="onreadystatechange",x=function(e){if(w.hasOwnProperty(e)){var t=w[e];delete w[e],t()}},k=function(e){return function(){x(e)}},A=function(e){x(e.data)},C=function(e){a.postMessage(e+"",f.protocol+"//"+f.host)};p&&g||(p=function(e){var t=[],n=1;while(arguments.length>n)t.push(arguments[n++]);return w[++y]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},i(y),y},g=function(e){delete w[e]},h?i=function(e){m.nextTick(k(e))}:b&&b.now?i=function(e){b.now(k(e))}:v&&!d?(r=new v,s=r.port2,r.port1.onmessage=A,i=c(s.postMessage,s,1)):a.addEventListener&&"function"==typeof postMessage&&!a.importScripts&&f&&"file:"!==f.protocol&&!o(C)?(i=C,a.addEventListener("message",A,!1)):i=_ in u("script")?function(e){l.appendChild(u("script"))[_]=function(){l.removeChild(this),x(e)}}:function(e){setTimeout(k(e),0)}),e.exports={set:p,clear:g}},"2d00":function(e,t,n){var i,r,s=n("da84"),a=n("342f"),o=s.process,c=o&&o.versions,l=c&&c.v8;l?(i=l.split("."),r=i[0]+i[1]):a&&(i=a.match(/Edge\/(\d+)/),(!i||i[1]>=74)&&(i=a.match(/Chrome\/(\d+)/),i&&(r=i[1]))),e.exports=r&&+r},"2d26":function(e,t,n){n("5d91"),n("1715");var i=n("428f");e.exports=i},"2d39":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Station Info")]),n("span",{class:e.station_locked_in?"good":"bad"},[e._v(e._s(e.station_locked_in?"Locked In ":"Not Locked In "))]),n("span",{class:e.station_locked_in?"good":"bad"},[e._v("("+e._s(e.locked_in_name)+")")]),n("br"),n("span",[e._v("Calibration: "+e._s(e.calibration)+"%")]),e._v(" "),n("vui-button",{attrs:{params:{recalibrate:1}}},[e._v("Recalibrate")]),n("h3",[e._v("Teleporter Beacons")]),n("table",{staticClass:"table border"},[e._m(0),e._l(e.teleport_beacons,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.beacon_name))]),n("td",[n("vui-button",{attrs:{params:{beacon:t.ref,name:t.beacon_name}}},[e._v("Lock On")])],1)])}))],2),n("h3",[e._v("Tracking Implants")]),n("table",{staticClass:"table border"},[e._m(1),e._l(e.teleport_implants,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.implant_name))]),n("td",[n("vui-button",{attrs:{params:{implant:t.ref,name:t.implant_name}}},[e._v("Lock On")])],1)])}))],2)],1)},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Beacon Name")]),n("th",[e._v("Action")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Implant Name")]),n("th",[e._v("Action")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=(n("95d1"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"561826ba",null);t["default"]=c.exports},"2fa9":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.active?n("div",[e.$root.$data.assets["front"]?n("div",{staticClass:"photos"},[n("vui-img",{attrs:{name:"front"}}),n("br"),n("vui-img",{attrs:{name:"side"}})],1):e._e(),n("vui-group",[n("vui-group-item",{attrs:{label:"ID:"}},[e._v(e._s(e.active.id))]),n("vui-group-item",{attrs:{label:"Name:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.name"}})],1),n("vui-group-item",{attrs:{label:"Age:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.age"}})],1),n("vui-group-item",{attrs:{label:"Sex:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.sex"}})],1),n("vui-group-item",{attrs:{label:"Rank:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.rank"}})],1),n("vui-group-item",{attrs:{label:"Physical Status:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.physical_status"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.$root.$data.state,"editingvalue",t.target.multiple?n:n[0])}}},e._l(e.choices.physical_status,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)])],1),n("vui-group-item",{attrs:{label:"Mental Status:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.mental_status"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.$root.$data.state,"editingvalue",t.target.multiple?n:n[0])}}},e._l(e.choices.mental_status,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)])],1),n("vui-group-item",{attrs:{label:"Fingerprint:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.fingerprint"}})],1),!e.hideAdvanced&&1&e.avaivabletypes?[n("vui-group-item",{attrs:{label:"Species:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.species"}})],1),n("vui-group-item",{attrs:{label:"Citizenship:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.citizenship"}})],1),n("vui-group-item",{attrs:{label:"Religion:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.religion"}})],1),n("vui-group-item",{attrs:{label:"Employer:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.employer"}})],1),n("vui-group-item",{attrs:{label:"Employment/skills summary:"}},[n("view-records-field",{attrs:{editable:(1&e.editable)>0,path:"active.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"CCIA Notes:"}},[e._v(e._s(e.active.ccia_record))]),n("vui-group-item",{attrs:{label:"CCIA Actions:"}},e._l(e.active.ccia_actions,(function(t){return n("div",{key:t[0]},[n("h5",[e._v(e._s(t[0])+" "),n("i",[e._v("("+e._s(t[1])+")")])]),n("div",{domProps:{innerHTML:e._s(t[3].replace("\r\n","
    "))}}),n("vui-button",{attrs:{params:{_openurl:t[4]}}},[e._v("Open")])],1)})),0)]:e._e(),e._t("default")],2),n("div",{staticClass:"bottombuttons"},[n("vui-button",{attrs:{params:{setactive:"null"},"push-state":""},on:{click:function(t){e.activeview="list"}}},[e._v("Unload Record")]),e.canprint?n("vui-button",{attrs:{params:{print:"active"}}},[e._v("Print")]):e._e(),!e.hideAdvanced&&1&e.editable?n("vui-button",{staticClass:"danger",attrs:{params:{deleterecord:1},icon:"trash-alt"}},[e._v("Delete record")]):e._e()],1)],1):e._e()},r=[],s=(n("ac1f"),n("5319"),{data:function(){return this.$root.$data.state},props:{hideAdvanced:{type:Boolean,default:!1}},filters:{replace:function(e,t,n){return e.replace(t,n)}}}),a=s,o=(n("f046"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"c51ad1c4",null);t["default"]=c.exports},3221:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v(" Activating Configuration Mode")]),e._m(0),n("vui-button",{attrs:{params:{return:1},width:"3em"}},[e._v("Return to order menu")])],1)},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("span",[e._v(" Swipe id card to enter configuration mode."),n("br")])}],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},3280:function(e,t,n){"use strict";var i=n("ebb5"),r=n("e58c"),s=i.aTypedArray,a=i.exportTypedArrayMethod;a("lastIndexOf",(function(e){return r.apply(s(this),arguments)}))},3315:function(e,t,n){"use strict";n("b959")},3410:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("7b0b"),a=n("e163"),o=n("e177"),c=r((function(){a(1)}));i({target:"Object",stat:!0,forced:c,sham:!o},{getPrototypeOf:function(e){return a(s(e))}})},"342f":function(e,t,n){var i=n("d066");e.exports=i("navigator","userAgent")||""},"34ac":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.editing?[e._t("default",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.gdata.state.editingvalue,expression:"gdata.state.editingvalue"}],domProps:{value:e.gdata.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.gdata.state,"editingvalue",t.target.value)}}})]),n("vui-button",{attrs:{icon:"check"},on:{click:e.save}})]:[n("span",{staticStyle:{"white-space":"pre-wrap"}},[e._v(e._s(e.rvalue))]),e._v(" "),e.reditable||e.editButton?n("vui-button",{staticStyle:{"white-space":"pre-wrap"},attrs:{icon:"pen"},on:{click:e.beginEditing}},[e._v(e._s(e.editbtnname))]):e._e()]],2)},r=[],s=(n("ac1f"),n("5319"),n("1276"),n("025e")),a={data:function(){return{editing:!1,gdata:this.$root.$data,startEditHandler:null}},props:{value:{type:String,default:""},path:{type:String,default:null},editable:{type:Boolean,default:!1},editButton:{type:String,default:null}},computed:{reditable:function(){return!!this.path&&this.editable},rvalue:function(){return this.path?s["a"].dotNotationRead(this.gdata.state,this.path):this.value},editbtnname:function(){return this.editButton?this.editButton:""}},methods:{beginEditing:function(){var e=this;(this.reditable||this.editButton)&&(this.$root.$emit("record-field-start-editing"),this.gdata.state.editingvalue=this.rvalue,this.startEditHandler=function(){e.endEditing()},this.$root.$on("record-field-start-editing",this.startEditHandler),this.editing=!0)},endEditing:function(){(this.reditable||this.editButton)&&(this.editing=!1,this.$root.$off("record-field-start-editing",this.startEditHandler))},save:function(){(this.reditable||this.editButton)&&(this.endEditing(),this.editButton?this.$emit("save",this.gdata.state.editingvalue):this.$toTopic({editrecord:{value:this.gdata.state.editingvalue,key:this.path.split(".")}}))}},filters:{replace:function(e,t,n){return e.replace(t,n)}}},o=a,c=(n("93dc"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"19ca9807",null);t["default"]=l.exports},"35a1":function(e,t,n){var i=n("f5df"),r=n("3f8c"),s=n("b622"),a=s("iterator");e.exports=function(e){if(void 0!=e)return e[a]||e["@@iterator"]||r[i(e)]}},"35b3":function(e,t,n){var i=n("23e7");i({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},3722:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("vui-group",[n("vui-group-item",{attrs:{label:"Status:"}},[n("vui-button",{class:{selected:e.on},attrs:{params:{toggleStatus:1}}},[e._v("On")]),n("vui-button",{class:{selected:!e.on},attrs:{params:{toggleStatus:1}}},[e._v("Off")])],1),n("vui-group-item",{attrs:{label:"Power Level:"}},[n("vui-button",{class:{selected:20==e.powerSetting},attrs:{params:{setPower:20}}},[e._v("1")]),n("vui-button",{class:{selected:40==e.powerSetting},attrs:{params:{setPower:40}}},[e._v("2")]),n("vui-button",{class:{selected:60==e.powerSetting},attrs:{params:{setPower:60}}},[e._v("3")]),n("vui-button",{class:{selected:80==e.powerSetting},attrs:{params:{setPower:80}}},[e._v("4")]),n("vui-button",{class:{selected:100==e.powerSetting},attrs:{params:{setPower:100}}},[e._v("5")])],1),n("vui-group-item",{attrs:{label:"Gas Pressure:"}},[e._v(" "+e._s(e.gasPressure)+" kPa ")]),n("h3",[e._v("Gas Temperature")]),n("vui-group-item",{attrs:{label:"Current:"}},[n("vui-progress",{class:e.gasTemperatureClass,attrs:{value:e.gasTemperature,max:e.maxGasTemperature,min:e.minGasTemperature}},[e._v(" "+e._s(e.gasTemperature)+" K ")])],1),n("vui-group-item",{attrs:{label:"Target:"}},[n("vui-progress",{attrs:{value:e.targetGasTemperature,max:e.maxGasTemperature,min:e.minGasTemperature}},[e._v(" "+e._s(e.targetGasTemperature)+" K ")]),n("div",{staticStyle:{clear:"both","padding-top":"4px"}},[n("vui-button",{attrs:{disabled:e.targetGasTemperature<=e.minGasTemperature,params:{temp:-100}}},[e._v("-")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature<=e.minGasTemperature,params:{temp:-10}}},[e._v("-")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature<=e.minGasTemperature,params:{temp:-1}}},[e._v("-")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature>=e.maxGasTemperature,params:{temp:1}}},[e._v("+")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature>=e.maxGasTemperature,params:{temp:10}}},[e._v("+")]),n("vui-button",{attrs:{disabled:e.targetGasTemperature>=e.maxGasTemperature,params:{temp:100}}},[e._v("+")])],1)],1)],1)},r=[],s={data:function(){return this.$root.$data.state},computed:{gasTemperatureClass:function(){return null!=this.temperatureBadTop&&this.gasTemperature>this.temperatureBadTop||null!=this.temperatureBadBottom&&this.gasTemperaturethis.temperatureAvgBottom?"average":"good"}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},3729:function(e,t,n){var i=n("9e69"),r=n("00fd"),s=n("29f3"),a="[object Null]",o="[object Undefined]",c=i?i.toStringTag:void 0;function l(e){return null==e?void 0===e?o:a:c&&c in Object(e)?r(e):s(e)}e.exports=l},"37e8":function(e,t,n){var i=n("83ab"),r=n("9bf2"),s=n("825a"),a=n("df75");e.exports=i?Object.defineProperties:function(e,t){s(e);var n,i=a(t),o=i.length,c=0;while(o>c)r.f(e,n=i[c++],t[n]);return e}},3831:function(e,t,n){"use strict";n("9e80")},3851:function(e,t,n){var i={"./header/default.vue":"f3ce","./header/handles.vue":"9aa7","./header/minimal.vue":"d657","./header/modular-computer.vue":"4709","./view/admin/damage-menu.vue":"a9fa","./view/admin/extended-list.vue":"6309","./view/admin/permissions-panel.vue":"86eb","./view/admin/player-panel.vue":"3930","./view/console/atmocontrol/injector.vue":"614c","./view/console/atmocontrol/main.vue":"86ad","./view/console/atmocontrol/supermatter.vue":"df0b","./view/console/atmocontrol/tank.vue":"508b","./view/devices/aicard.vue":"4874","./view/devices/assembly/infrared.vue":"f095","./view/devices/assembly/proximity.vue":"253b","./view/devices/assembly/signaler.vue":"4626","./view/devices/assembly/timer.vue":"b81a","./view/devices/circuit/printer.vue":"ffb3","./view/devices/gps/gps.vue":"0566","./view/devices/jammer.vue":"050e","./view/devices/multitool.vue":"b833","./view/devices/oredetector.vue":"0687","./view/devices/quikpay/confirmation.vue":"47db","./view/devices/quikpay/main.vue":"4678","./view/devices/vitalsmonitor.vue":"0cec","./view/late-choices.vue":"2653","./view/machinery/atmospherics/canister.vue":"2575","./view/machinery/atmospherics/freezer.vue":"3722","./view/machinery/atmospherics/portpump.vue":"77f3","./view/machinery/chemdisp.vue":"0519","./view/machinery/cooking/microwave.vue":"a589","./view/machinery/orderterminal/editconfirmation.vue":"3221","./view/machinery/orderterminal/orderconfirmation.vue":"1ccb","./view/machinery/orderterminal/ordering.vue":"e1e4","./view/machinery/power/apc.vue":"fafb","./view/machinery/power/pacman.vue":"3910","./view/machinery/power/smes.vue":"58e3","./view/machinery/power/supermattercrystal.vue":"b08f","./view/machinery/smartfridge.vue":"19fa","./view/machinery/teleporter.vue":"2d39","./view/machinery/vending.vue":"7dc7","./view/machinery/xenoarchaeology/suspensiongenerator.vue":"75f7","./view/manifest.vue":"f264","./view/mcomputer/atmosphere.vue":"4149","./view/mcomputer/chat/channel-btn.vue":"1dbb","./view/mcomputer/chat/chat.vue":"3d8a","./view/mcomputer/chat/explore.vue":"421c","./view/mcomputer/chat/index.vue":"9b7e","./view/mcomputer/chemcodex.vue":"ec72","./view/mcomputer/command/accountdb.vue":"da1f","./view/mcomputer/command/teleporter.vue":"76a2","./view/mcomputer/janitor.vue":"e786","./view/mcomputer/medical/sensors.vue":"f309","./view/mcomputer/ntsl/edit.vue":"a3f9","./view/mcomputer/ntsl/list.vue":"6292","./view/mcomputer/ntsl/main.vue":"a7c6","./view/mcomputer/ntsl/program.vue":"2480","./view/mcomputer/pai/directives.vue":"d3c6","./view/mcomputer/pai/doorjack.vue":"3b8a","./view/mcomputer/pai/radio.vue":"207c","./view/mcomputer/security/guntracker.vue":"cb10","./view/mcomputer/security/implanttracker.vue":"ac02","./view/mcomputer/security/penalcontroller.vue":"2c9a","./view/mcomputer/signaler.vue":"db4f","./view/mcomputer/system/config.vue":"07c3","./view/mcomputer/system/downloader.vue":"019f","./view/mcomputer/system/main.vue":"13c9","./view/mcomputer/system/manager.vue":"d3c8","./view/medical/bodyscanner.vue":"1062","./view/medical/sleeper.vue":"b087","./view/misc/appearancechanger.vue":"4939","./view/misc/boardgame.vue":"ef41","./view/misc/doors.vue":"3a07","./view/misc/ghostmenu.vue":"c60e","./view/misc/ghostspawner.vue":"1503","./view/misc/maglock-config.vue":"0ea6","./view/misc/maglock.vue":"20a6","./view/misc/pai/recruit.vue":"9324","./view/misc/voting.vue":"e31d","./view/paperwork/fax.vue":"9556","./view/paperwork/photocopier.vue":"6a01","./view/records/field.vue":"34ac","./view/records/general.vue":"2fa9","./view/records/incident.vue":"256f","./view/records/list-locked.vue":"c0f7","./view/records/list-virus.vue":"8385","./view/records/list.vue":"ac4c","./view/records/login.vue":"a8bb","./view/records/main.vue":"cf32","./view/records/medical.vue":"203b","./view/records/security.vue":"b6db","./view/records/virus.vue":"73f5","./view/turrets/control-part.vue":"10d4","./view/turrets/control.vue":"fb48","./view/vehicles/droppod.vue":"b14c","./view/vehicles/pussywagon.vue":"4d76","./view/vehicles/trainengine.vue":"08c0","./view/wanalyzer/analyzer.vue":"407e","./vui/button.vue":"5aa2","./vui/group-item.vue":"2704","./vui/group-row.vue":"74e7","./vui/group.vue":"48f3","./vui/img.vue":"810a","./vui/input/numeric.vue":"210c","./vui/input/search.vue":"419b","./vui/input/slider.vue":"0eec","./vui/item.vue":"faf6","./vui/progress.vue":"1253","./vui/tooltip.vue":"0ec3"};function r(e){var t=s(e);return n(t)}function s(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=s,e.exports=r,r.id="3851"},"38cf":function(e,t,n){var i=n("23e7"),r=n("1148");i({target:"String",proto:!0},{repeat:r})},"38d6":function(e,t,n){},3910:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Status")]),n("vui-group",[n("vui-group-item",{attrs:{label:"Generator Status:"}},[e.active?n("span",{staticClass:"good"},[e._v("Online")]):n("span",{staticClass:"average"},[e._v("Offline")])]),n("vui-group-item",{attrs:{label:"Generator Control:"}},[e.active?n("vui-button",{attrs:{params:{action:"disable"},icon:"power-off"}},[e._v("STOP")]):n("vui-button",{attrs:{params:{action:"enable"},disabled:!!e.is_broken,icon:"power-off"}},[e._v("START")])],1)],1),n("h3",[e._v("Fuel")]),n("vui-group",[n("vui-group-item",{attrs:{label:"Fuel Type:"}},[e._v(e._s(e.fuel.fuel_type))]),n("vui-group-item",{attrs:{label:"Fuel Level:"}},[n("vui-progress",{attrs:{value:e.fuel.fuel_stored,max:e.fuel.fuel_capacity}},[e._v(e._s(Math.round(e.fuel.fuel_stored/e.fuel.fuel_capacity*100))+"%")])],1),n("vui-group-item",{class:{bad:0==e.fuel.fuel_stored,good:e.fuel.fuel_stored>0}},[e._v(e._s(e.fuel.fuel_stored)+" cm³ / "+e._s(e.fuel.fuel_capacity)+" cm³")]),e.fuel.fuel_usage>0&&e.active?n("vui-group-item",{attrs:{label:"Fuel Usage:"}},[e._v(e._s(e.fuel.fuel_usage)+" cm³/s - ("+e._s(Math.round(e.fuel.fuel_stored/e.fuel.fuel_usage))+" s remaining)")]):e._e(),n("vui-group-item",{attrs:{label:"Control:"}},[n("vui-button",{attrs:{params:{action:"eject"},disabled:!(!e.is_broken&&!e.is_ai),icon:"eject"}},[e._v("EJECT FUEL")])],1)],1),n("h3",[e._v("Output")]),n("vui-group",[n("vui-group-item",{attrs:{label:"Power Setting:"}},[n("span",{class:{bad:e.output_set>e.output_safe,good:e.output_set<=e.output_safe}},[e._v(e._s(e.output_set)+" / "+e._s(e.output_max)+" ("+e._s(e.output_watts)+" W)")])]),n("vui-group-item",{attrs:{label:"Control:"}},[n("vui-button",{attrs:{params:{action:"higher_power"},disabled:e.output_set==e.output_max}},[e._v("+")]),n("vui-button",{attrs:{params:{action:"lower_power"},disabled:e.output_set==e.output_min}},[e._v("-")])],1)],1),n("h3",[e._v("Temperature")]),n("vui-group",[n("vui-group-item",{attrs:{label:"Temperature:"}},[n("vui-progress",{class:e.getTemperatureClass(e.temperature_current),attrs:{value:e.temperature_current,min:e.temperature_min,max:1.5*e.temperature_max}},[e._v(e._s(Math.max(e.temperature_min,e.temperature_current))+"C")])],1),n("vui-group-item",{attrs:{label:"Generator Status:"}},[e.temperature_overheat>50?n("span",{staticClass:"bad"},[e._v("DANGER: CRITICAL OVERHEAT! Deactivate generator immediately!")]):e.temperature_overheat>20?n("span",{staticClass:"average"},[e._v("WARNING: Overheating!")]):e.temperature_overheat>1?n("span",{staticClass:"average"},[e._v("Temperature High")]):n("span",{staticClass:"good"},[e._v("Optimal")])])],1)],1)},r=[],s={data:function(){return this.$root.$data.state},methods:{getTemperatureClass:function(e){return e<.8*this.$root.$data.state.temperature_max?"good":e0},staticStyle:{width:"12em"},attrs:{value:e.gs.wtime,min:e.s.plua_main,max:e.s.plu_main||10}},[e._v(" "+e._s(e.mainMsg)+" ")]),n("vui-button",{attrs:{disabled:0!=e.s.plu_main,params:{command:"main_power"}}},[e._v("Interrupt")])],1),n("vui-group-item",{attrs:{label:"Backup power:"}},[n("vui-progress",{class:{good:0==e.s.plu_back||0==e.s.plu_main,bad:-1==e.s.plu_back&&0!=e.s.plu_main,average:e.s.plu_back>0},staticStyle:{width:"12em"},attrs:{value:e.gs.wtime,min:e.s.plua_back,max:e.s.plu_back||10}},[e._v(" "+e._s(e.backupMsg)+" ")]),n("vui-button",{attrs:{disabled:0!=e.s.plu_back,params:{command:"backup_power"}}},[e._v("Interrupt")])],1),n("vui-group-item",{attrs:{label:"Electrified status:"}},[n("vui-progress",{class:{good:0==e.s.ele,bad:-1==e.s.ele,average:e.s.ele>0},staticStyle:{width:"12em"},attrs:{value:e.gs.wtime,min:e.s.elea,max:e.s.ele||10}},[e._v(" "+e._s(e.eleMsg)+" ")]),n("vui-button",{attrs:{disabled:0==e.s.ele,params:{command:"electrify_permanently",activate:0}}},[e._v("R")]),e.s.isAdmin||!e.s.isai?[n("vui-button",{attrs:{disabled:e.s.ele>0,params:{command:"electrify_temporary",activate:1}}},[e._v("T")]),n("vui-button",{attrs:{disabled:-1==e.s.ele,params:{command:"electrify_permanently",activate:1}}},[e._v("P")])]:e._e()],2),n("vui-group-item"),n("vui-group-item",{key:e.k,attrs:{set:e.k="bolts",label:"Bolts:"}},[n("vui-button",{class:{on:e.s[e.k]},staticStyle:{"min-width":"6em"},attrs:{disabled:!(e.s.aiCanBolt||!e.s.isai||e.s.isAdmin),params:{command:e.k,activate:0}}},[e._v("Raised")]),n("vui-button",{class:{on:!e.s[e.k]},staticStyle:{"min-width":"6em"},attrs:{disabled:!(e.s.aiCanBolt||!e.s.isai||e.s.isAdmin),params:{command:e.k,activate:1}}},[e._v("Dropped")]),e.s.boltsOverride&&e.s[e.k]?n("vui-button",{staticClass:"danger",staticStyle:{"min-width":"6em"},attrs:{params:{command:"bolts_override",activate:1}}},[e._v("Drop Now")]):e._e(),e.s.boltsOverride&&!e.s[e.k]?n("vui-button",{staticClass:"danger",staticStyle:{"min-width":"6em"},attrs:{params:{command:"bolts_override",activate:0}}},[e._v("Raise Now")]):e._e()],1),e._l(e.commands,(function(t,i){return n("vui-group-item",{key:i,attrs:{label:t.name+":"}},[n("vui-button",{class:{on:e.s[i]},staticStyle:{"min-width":"6em"},attrs:{params:{command:i,activate:t.i?1:0}}},[e._v(e._s(t.et||"Enabled"))]),n("vui-button",{class:{on:!e.s[i]&&!t.danger,danger:!e.s[i]&&t.danger},staticStyle:{"min-width":"6em"},attrs:{disabled:!(!t.a||!e.s.isai||e.s.isAdmin),params:{command:i,activate:t.i?0:1}}},[e._v(e._s(t.dt||"Disabled"))])],1)}))],2)],1)},r=[],s={data:function(){var e=this.$root.$data,t=e.state;return{gs:e,s:t,commands:{idscan:{name:"IdScan",i:!0},lights:{name:"Bolt Lights",i:!0},safeties:{name:"Safeties",et:"Nominal",dt:"Overridden",danger:!0,a:!0},timing:{name:"Timing",et:"Nominal",dt:"Overridden",danger:!0},open:{name:"Door State",et:"Opened",dt:"Closed",i:1}}}},computed:{mainMsg:function(){return this.getPowerStatusMessage(this.s.plu_main,this.gs.wtime)},backupMsg:function(){return this.getPowerStatusMessage(this.s.plu_back,this.gs.wtime)},eleMsg:function(){if(0==this.s.ele)return"Safe";if(-1==this.s.ele)return"Permanently";var e=Math.max(Math.round((this.s.ele-this.gs.wtime)/10),0);return"".concat(e,"s left")}},methods:{getPowerStatusMessage:function(e,t){if(-1==e)return"Offline";if(0==e)return"Online";var n=Math.max(Math.round((e-t)/10),0);return"Interrupted, ".concat(n,"s left")}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"3a7b":function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").findIndex,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("findIndex",(function(e){return r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},"3aaf":function(e,t,n){},"3b8a":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Cable:"}},[e.connected?n("span",[e._v("Connected")]):e.extended?n("span",[e._v("Extended")]):n("vui-button",{attrs:{params:{extend:1}}},[e._v("Retracted")])],1),e.connected?n("vui-group-item",{attrs:{label:"Hack:"}},[e.ishacking?[n("vui-progress",{attrs:{max:1e3,value:e.progress}},[e._v(e._s(e.progress/10)+"%")]),n("vui-button",{attrs:{params:{cancel:1}}},[e._v("Cancel")])]:n("vui-button",{attrs:{params:{hack:1}}},[e._v("Start")])],2):e.aborted?n("vui-group-item",[n("div",{staticClass:"bad"},[e._v("Hack aborted!")])]):e._e()],1)],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,"2c69059a",null);t["default"]=c.exports},"3bbe":function(e,t,n){var i=n("861d");e.exports=function(e){if(!i(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},"3c5d":function(e,t,n){"use strict";var i=n("ebb5"),r=n("50c4"),s=n("182d"),a=n("7b0b"),o=n("d039"),c=i.aTypedArray,l=i.exportTypedArrayMethod,u=o((function(){new Int8Array(1).set({})}));l("set",(function(e){c(this);var t=s(arguments.length>1?arguments[1]:void 0,1),n=this.length,i=a(e),o=r(i.length),l=0;if(o+t>n)throw RangeError("Wrong length");while(l=n.length?{value:void 0,done:!0}:(e=i(n,r),t.index+=e.length,{value:e,done:!1})}))},"3d8a":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v(e._s(e.channel.title))]),n("div",[e.channel.direct?e._e():[n("vui-button",{attrs:{params:{leave:e.reference}},on:{click:function(t){return e.$emit("on-leave")}}},[e._v("Leave")])],e.channel.can_manage?[null!=e.password?[n("input",{directives:[{name:"model",rawName:"v-model",value:e.password,expression:"password"}],attrs:{type:"text"},domProps:{value:e.password},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.set_password(t)},input:function(t){t.target.composing||(e.password=t.target.value)}}}),n("vui-button",{on:{click:e.set_password}},[e._v("Set password")])]:e.channel.direct?e._e():n("vui-button",{on:{click:function(t){e.password=""}}},[e._v("Set password")]),null!=e.title?[n("input",{directives:[{name:"model",rawName:"v-model",value:e.title,expression:"title"}],attrs:{type:"text"},domProps:{value:e.title},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.set_title(t)},input:function(t){t.target.composing||(e.title=t.target.value)}}}),n("vui-button",{on:{click:e.set_title}},[e._v("Change title")])]:e.channel.direct?e._e():n("vui-button",{on:{click:function(t){e.title=e.channel.title}}},[e._v("Change title")]),n("vui-button",{attrs:{params:{delete:e.reference}},on:{click:function(t){return e.$emit("on-leave")}}},[e._v("Delete channel")])]:e._e(),n("vui-button",{class:{selected:1==e.channel.focused},attrs:{params:{focus:e.reference}}},[e._v(e._s(1==e.channel.focused?"Disable Speech-To-Text":"Enable Speech-To-Text"))])],2),n("div",e._l(e.channel.users,(function(t,i){return n("div",{key:i},[e._v(" "+e._s(t)+" "),e.channel.can_manage&&!e.channel.direct?n("vui-button",{attrs:{params:{kick:{target:e.reference,user:i}}}},[e._v("Kick")]):e._e()],1)})),0),n("div",{ref:"chat",staticClass:"message-chat"},e._l(e.messages,(function(t,i){return n("div",{key:i},[e._v(e._s(t))])})),0),n("div",{staticClass:"message-container"},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.send_buffer,expression:"send_buffer"}],staticClass:"message-input",attrs:{type:"text"},domProps:{value:e.send_buffer},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.send_msg(t)},input:function(t){t.target.composing||(e.send_buffer=t.target.value)}}}),n("vui-button",{staticClass:"message-send",on:{click:e.send_msg}},[e._v("Send")])],1)])},r=[],s={data:function(){return{s:this.$root.$data.state,send_buffer:"",password:null,title:null,wasAtBottom:!0}},computed:{channel:function(){return this.s.channels[this.reference]},messages:function(){return this.channel.msg}},props:{reference:{type:String,default:""}},methods:{send_msg:function(){this.$toTopic({send:{message:this.send_buffer,target:this.reference}}),this.send_buffer=""},set_password:function(){this.$toTopic({set_password:{target:this.reference,password:this.password}}),this.password=null},set_title:function(){this.$toTopic({change_title:{target:this.reference,title:this.title}}),this.title=null},scrollBottom:function(){var e=this.$refs.chat;e.scrollTop=e.scrollHeight}},mounted:function(){this.scrollBottom()},beforeUpdate:function(){var e=this.$refs.chat;this.wasAtBottom=e.scrollHeight-e.scrollTop===e.clientHeight},updated:function(){this.wasAtBottom&&this.scrollBottom()}},a=s,o=(n("425f"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"07e18e82",null);t["default"]=c.exports},"3ea3":function(e,t,n){var i=n("23e7"),r=n("f748"),s=Math.abs,a=Math.pow;i({target:"Math",stat:!0},{cbrt:function(e){return r(e=+e)*a(s(e),1/3)}})},"3ecc":function(e,t,n){"use strict";n("f940")},"3f3a":function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("825a"),a=n("c04e"),o=n("9bf2"),c=n("d039"),l=c((function(){Reflect.defineProperty(o.f({},1,{value:1}),1,{value:2})}));i({target:"Reflect",stat:!0,forced:l,sham:!r},{defineProperty:function(e,t,n){s(e);var i=a(t,!0);s(n);try{return o.f(e,i,n),!0}catch(r){return!1}}})},"3f8c":function(e,t){e.exports={}},"3fcc":function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").map,s=n("4840"),a=i.aTypedArray,o=i.aTypedArrayConstructor,c=i.exportTypedArrayMethod;c("map",(function(e){return r(a(this),e,arguments.length>1?arguments[1]:void 0,(function(e,t){return new(o(s(e,e.constructor)))(t)}))}))},4057:function(e,t,n){var i=n("23e7"),r=Math.hypot,s=Math.abs,a=Math.sqrt,o=!!r&&r(1/0,NaN)!==1/0;i({target:"Math",stat:!0,forced:o},{hypot:function(e,t){var n,i,r=0,o=0,c=arguments.length,l=0;while(o0?(i=n/l,r+=i*i):r+=n;return l===1/0?1/0:l*a(r)}})},4069:function(e,t,n){var i=n("44d2");i("flat")},"407e":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.has_inserted?n("div",[n("b",[e._v("Analyzing "+e._s(e.name)+" ")]),n("br"),e.$root.$data.assets["icon"]?n("div",[n("vui-img",{attrs:{name:"icon"}})],1):e._e(),1==e.item?n("div",[n("table",{staticClass:"other"},[n("tr",[n("td",[e._v(" Damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.damage_type)+" ")])]),n("tr",[n("td",[e._v(" Item's estimated force-rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.force)+" points")])]),n("tr",[n("td",[e._v(" Item's estimated throw force-rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.throw_force)+" points ")])]),1==e.energy?[n("tr",[n("td",[e._v(" Item's estimated force-rating when activated: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.active_force)+" points ")])]),n("tr",[n("td",[e._v(" Item's estimated throw force-rating when activated: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.active_throw_force)+" points")])]),n("tr",[n("td",[e._v(" Base block chance is: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.base_block_chance)+"% ")])]),n("tr",[n("td",[e._v(" Base reflect chance is: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.base_reflectchance)+"% ")])]),n("tr",[n("td",[e._v(" Item's estimated shield rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.shield_power)+" points")])]),n("tr",[n("td",[e._v(" Can block bullets: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.can_block)+" ")])])]:e._e(),n("tr",[n("td",[e._v(" Is sharp:")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.sharp)+" ")])]),n("tr",[n("td",[e._v(" Chance to dismember: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.edge)+" ")])]),n("tr",[n("td",[e._v(" Item's estimated armor penetration rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.penetration)+" points")])])],2)]):e._e(),1==e.gun?n("div",{staticClass:"active_energy"},[n("table",{staticClass:"other"},[n("tr",[n("td",[e._v(" Maximum shots: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.max_shots)+" ")])]),n("tr",[n("td",[e._v(" Burst: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.burst)+" ")])]),n("tr",[n("td",[e._v(" Self recharge: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.recharge)+" ")])]),n("tr",[n("td",[e._v(" Recharge time: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.recharge_time)+" ")])]),n("tr",[n("td",[e._v(" Reliability: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.reliability)+" ")])]),n("br"),n("b",[e._v("First projectile information: ")]),n("br"),n("tr",[n("td",[e._v(" Projectile's estimated damage rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.damage)+" points")])]),n("tr",[n("td",[e._v(" Projectile's Damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.damage_type)+" ")])]),n("tr",[n("td",[e._v(" Projectile's estimated armor penetration rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.armor_penetration)+" points")])]),n("tr",[n("td",[e._v(" Projectile's armor damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.check_armor)+" ")])]),n("tr",[n("td",[e._v(" Projectile's shrapnel type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.shrapnel_type)+" ")])]),n("tr",[n("td",[e._v(" Stun: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.stun)+" ")])]),e.secondary_damage?[n("br"),n("b",[e._v("Second projectile information: ")]),n("br"),n("tr",[n("td",[e._v(" Projectile's estimated damage rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_damage)+" points")])]),n("tr",[n("td",[e._v(" Projectile's damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_damage_type)+" ")])]),n("tr",[n("td",[e._v(" Projectile's estimated armor penetration rating: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_armor_penetration)+" points")])]),n("tr",[n("td",[e._v(" Projectile's armor damage type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_check_armor)+" ")])]),n("tr",[n("td",[e._v(" Projectile's shrapnel type: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_shrapnel_type)+" ")])]),n("tr",[n("td",[e._v(" Stun: ")]),e._v(" "),n("td",{staticClass:"right"},[e._v(" "+e._s(e.secondary_stun)+" ")])])]:e._e()],2)]):e._e(),e.gun_mods?n("div",[n("br"),n("b",[e._v("Modular gun information: ")]),n("br"),n("table",{staticClass:"modular"},[e._m(0),e._l(e.gun_mods,(function(t,i){return n("tr",{key:i},[n("td",[e._v(e._s(i))]),e._l(t,(function(i,r){return n("td",{key:r},[e._v(" "+e._s(t[r])+" ")])}))],2)}))],2)]):e._e(),n("vui-button",{attrs:{params:{print:1}}},[e._v("Print Analysis")])],1):n("div",[n("b",[e._v("No item inserted, analysis unit inactive.")])])])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("th",[e._v(" Name ")]),n("th",[e._v(" Reliability ")]),n("th",[e._v(" Damage modifier ")]),n("th",[e._v(" Fire delay modifier ")]),n("th",[e._v(" Number of shots modifier ")]),n("th",[e._v(" Burst modifier ")]),n("th",[e._v(" Accuracy modifier ")]),n("th",[e._v(" Repair tool ")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=(n("e958"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"61a5d2f6",null);t["default"]=c.exports},"408a":function(e,t,n){var i=n("c6b6");e.exports=function(e){if("number"!=typeof e&&"Number"!=i(e))throw TypeError("Incorrect invocation");return+e}},"40d9":function(e,t,n){var i=n("23e7"),r=Math.floor,s=Math.log,a=Math.LOG2E;i({target:"Math",stat:!0},{clz32:function(e){return(e>>>=0)?31-r(s(e+.5)*a):32}})},4149:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.read?n("vui-group",[n("vui-group-item",{attrs:{label:"Pressure:"}},[e._v(" "+e._s(e.press.toFixed(1))+" ")]),n("vui-group-item",{attrs:{label:"Temperature:"}},[e._v(" "+e._s(e.temp.toFixed(1))+" K ("+e._s(e.tempC.toFixed(1))+"°C) ")]),n("vui-group-item",{attrs:{label:"Gases:"}},[e.gas.oxygen?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.oxygen.toFixed(2))+" O"),n("sub",[e._v("2")])]):e._e(),e.gas.nitrogen?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.nitrogen.toFixed(2))+" N")]):e._e(),e.gas.carbon_dioxide?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.carbon_dioxide.toFixed(2))+" CO"),n("sub",[e._v("2"),n("sub")])]):e._e(),e.gas.phoron?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.phoron.toFixed(2))+" PH")]):e._e(),e.gas.sleeping_agent?n("span",{staticClass:"complist"},[e._v(e._s(e.gas.sleeping_agent.toFixed(2))+" SA")]):e._e()])],1):n("span",{staticClass:"bad"},[e._v("Unable to obtain air reading!")])],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("cbf4"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"4021d8a8",null);t["default"]=c.exports},4160:function(e,t,n){"use strict";var i=n("23e7"),r=n("17c2");i({target:"Array",proto:!0,forced:[].forEach!=r},{forEach:r})},"419b":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("input",{directives:[{name:"model",rawName:"v-model",value:e.searchValue,expression:"searchValue"}],attrs:{type:"text",placeholder:"Search..."},domProps:{value:e.searchValue},on:{input:function(t){t.target.composing||(e.searchValue=t.target.value)}}})},r=[],s=(n("e260"),n("d81d"),n("a9e3"),n("d3b7"),n("ac1f"),n("841c"),n("ddb0"),n("ffe7")),a=n.n(s),o={data:function(){return{fuse:null,searchValue:""}},mounted:function(){this.onFieldUpdate(this.searchValue)},props:{keys:{type:Array,default:function(){return[]}},includeScore:{type:Boolean,default:!1},threshold:{type:Number,default:.6},input:{type:Array,default:function(){return[]}},value:{type:Array,default:function(){return[]}}},watch:{keys:function(){this.fuse=null},includeScore:function(){this.fuse=null},threshold:function(){this.fuse=null},input:function(){this.onFieldUpdate(this.searchValue)},searchValue:function(e){this.onFieldUpdate(e)}},methods:{onFieldUpdate:function(e){this.initFuse();var t=this.fuse.search(e);0==t.length&&(t=this.includeScore?this.input.map((function(e){return{item:e,score:0}})):this.input),this.$emit("input",t)},initFuse:function(){if(null==this.fuse){var e={shouldSort:!0,findAllMatches:!0,keys:this.keys,includeScore:this.includeScore,threshold:this.threshold};this.fuse=new a.a(this.input,e)}else this.fuse.setCollection(this.input)}}},c=o,l=n("2877"),u=Object(l["a"])(c,i,r,!1,null,null,null);t["default"]=u.exports},"421c":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[null!=e.channelTitle?[n("input",{directives:[{name:"model",rawName:"v-model",value:e.channelTitle,expression:"channelTitle"}],attrs:{type:"text"},domProps:{value:e.channelTitle},on:{keydown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.new_channel()},input:function(t){t.target.composing||(e.channelTitle=t.target.value)}}}),n("vui-button",{on:{click:function(t){return e.new_channel()}}},[e._v("New channel")])]:n("vui-button",{on:{click:function(t){e.channelTitle=""}}},[e._v("New channel")]),n("br"),e._l(e.displayed,(function(t){return n("view-mcomputer-chat-channel-btn",{key:t,attrs:{re:t,ch:e.s.channels[t]}})})),n("h2",[e._v("Users:")]),n("vui-input-search",{attrs:{input:e.users,keys:["user"]},model:{value:e.users_result,callback:function(t){e.users_result=t},expression:"users_result"}}),n("br"),e._l(e.users_result,(function(t){return n("div",{key:t.ref},[n("vui-button",{attrs:{params:{direct:t.ref}}},[e._v(e._s(t.user))])],1)}))],2)},r=[],s=(n("4de4"),n("d81d"),n("4fad"),n("b64b"),{data:function(){return{s:this.$root.$data.state,channelTitle:null,users_result:[]}},methods:{new_channel:function(){this.$toTopic({new_channel:this.channelTitle}),this.channelTitle=null}},computed:{displayed:function(){var e=this;return Object.keys(this.s.channels).filter((function(t){return!e.s.channels[t].can_interact}))},users:function(){return Object.entries(this.s.users).map((function(e){return{ref:e[0],user:e[1]}}))}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"425f":function(e,t,n){"use strict";n("99ee")},"428f":function(e,t,n){var i=n("da84");e.exports=i},4310:function(e,t,n){},"44ad":function(e,t,n){var i=n("d039"),r=n("c6b6"),s="".split;e.exports=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==r(e)?s.call(e,""):Object(e)}:Object},"44b8":function(e,t,n){},"44d2":function(e,t,n){var i=n("b622"),r=n("7c73"),s=n("9bf2"),a=i("unscopables"),o=Array.prototype;void 0==o[a]&&s.f(o,a,{configurable:!0,value:r(null)}),e.exports=function(e){o[a][e]=!0}},"44de":function(e,t,n){var i=n("da84");e.exports=function(e,t){var n=i.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},"44e7":function(e,t,n){var i=n("861d"),r=n("c6b6"),s=n("b622"),a=s("match");e.exports=function(e){var t;return i(e)&&(void 0!==(t=e[a])?!!t:"RegExp"==r(e))}},"44fc":function(e,t,n){"use strict";n("b884")},"45fc":function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").some,s=n("a640"),a=n("ae40"),o=s("some"),c=a("some");i({target:"Array",proto:!0,forced:!o||!c},{some:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},4626:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("vui-button",{attrs:{params:{send:1}}},[e._v("Send Signal")])],1),n("div",[n("h3",[e._v("Frequency:")]),n("vui-button",{attrs:{params:{freq:-10}}},[e._v("--")]),n("vui-button",{attrs:{params:{freq:-2}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.frequency))]),n("vui-button",{attrs:{params:{freq:2}}},[e._v("+")]),n("vui-button",{attrs:{params:{freq:10}}},[e._v("++")])],1),n("div",[n("h3",[e._v("Code:")]),n("vui-button",{attrs:{params:{code:-5}}},[e._v("--")]),n("vui-button",{attrs:{params:{code:-1}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.code))]),n("vui-button",{attrs:{params:{code:1}}},[e._v("+")]),n("vui-button",{attrs:{params:{code:5}}},[e._v("++")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("c2e3"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"729622e4",null);t["default"]=c.exports},"466d":function(e,t,n){"use strict";var i=n("d784"),r=n("825a"),s=n("50c4"),a=n("1d80"),o=n("8aa5"),c=n("14c3");i("match",1,(function(e,t,n){return[function(t){var n=a(this),i=void 0==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var a=r(e),l=String(this);if(!a.global)return c(a,l);var u=a.unicode;a.lastIndex=0;var d,h=[],f=0;while(null!==(d=c(a,l))){var p=String(d[0]);h[f]=p,""===p&&(a.lastIndex=o(l,s(a.lastIndex),u)),f++}return 0===f?null:h}]}))},4678:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._l(e.items,(function(t,i){return n("div",{key:i,staticStyle:{clear:"both"}},[e._v(" "+e._s(i)+": "+e._s(t)+" Credits "),n("div",{staticStyle:{float:"right"}},[n("vui-input-numeric",{attrs:{width:"2em"},model:{value:e.selection[i],callback:function(t){e.$set(e.selection,i,t)},expression:"selection[name]"}}),1==e.editmode?n("vui-button",{attrs:{params:{remove:i},width:"3em"}},[e._v("Delete")]):e._e()],1)])})),1==e.editmode?n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.tmp_name,expression:"tmp_name"}],domProps:{value:e.tmp_name},on:{input:function(t){t.target.composing||(e.tmp_name=t.target.value)}}}),n("vui-input-numeric",{attrs:{width:"3em","button-count":2},model:{value:e.tmp_price,callback:function(t){e.tmp_price=t},expression:"tmp_price"}}),n("vui-button",{attrs:{params:{add:{name:e.tmp_name,price:e.tmp_price}}}},[e._v("Add")]),n("vui-button",{attrs:{params:{accountselect:1},width:"3em"}},[e._v("Select Destination Account")])],1):e._e(),n("vui-button",{attrs:{params:{locking:1},width:"3em"}},[e._v("Toggle Lock")]),n("vui-button",{attrs:{params:{confirm:e.selection}}},[e._v("Confirm Selection")])],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"46c6":function(e,t,n){},4709:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("header-default",[n("div",{staticClass:"maincont"},[n("b",{staticClass:"valign"},[e._v(e._s(e.time))]),e.state._PC.batteryicon&&e.state._PC.showbatteryicon?n("img",{staticClass:"valign",attrs:{src:e.state._PC.batteryicon}}):e._e(),e.state._PC.batterypercent&&e.state._PC.showbatteryicon?n("b",{staticClass:"valign"},[e._v(e._s(e.state._PC.batterypercent))]):e._e(),e.state._PC.ntneticon?n("img",{staticClass:"valign",attrs:{img:"",src:e.state._PC.ntneticon}}):e._e(),e.state._PC.apclinkicon?n("img",{staticClass:"valign",attrs:{img:"",src:e.state._PC.apclinkicon}}):e._e(),n("div",{staticStyle:{float:"right"}},[n("vui-button",{class:{selected:e.state._PC.flashlight},attrs:{params:{PC_togglelight:1},icon:"lightbulb","icon-only":""}}),e.state._PC.showexitprogram?[n("vui-button",{attrs:{params:{PC_minimize:1},icon:"window-minimize","icon-only":""}}),n("vui-button",{staticClass:"danger",attrs:{params:{PC_exit:1},icon:"window-close","icon-only":""}})]:[n("vui-button",{staticClass:"danger",attrs:{params:{PC_shutdown:1},icon:"power-off","icon-only":""}})]],2)])])},r=[],s=n("025e"),a={data:function(){return this.$root.$data},mounted:function(){this.$nextTick((function(){document.getElementById("content").classList.add("mcomputer")}))},computed:{time:function(){return Object(s["b"])(this.wtime)}}},o=a,c=(n("4ae3"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"1a3d9578",null);t["default"]=l.exports},4795:function(e,t,n){var i=n("23e7"),r=n("da84"),s=n("342f"),a=[].slice,o=/MSIE .\./.test(s),c=function(e){return function(t,n){var i=arguments.length>2,r=i?a.call(arguments,2):void 0;return e(i?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};i({global:!0,bind:!0,forced:o},{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},"47db":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v(" Selected Products:")]),e._l(e.items,(function(t,i){return n("div",{key:i},[e.selection[i]&&e.selection[i]>0?n("span",[e._v(" "+e._s(e.selection[i])+"x "+e._s(i)+": at "+e._s(t*e.selection[i])+" Credits ")]):e._e()])})),n("h3",[e._v(" Total: "+e._s(e.priceSum))]),n("h4",[e._v("Destination Account: "+e._s(e.destinationact))]),n("h3",[e._v("Please swipe your ID to pay.")]),n("vui-button",{attrs:{params:{return:1},width:"3em"}},[e._v("Return to order menu")])],2)},r=[],s=(n("13d5"),n("b64b"),{data:function(){return this.$root.$data.state},computed:{priceSum:function(){var e=this;return Object.keys(this.selection).reduce((function(t,n){return isNaN(t)?e.items[n]*e.selection[n]:t+e.items[n]*e.selection[n]}))}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},4840:function(e,t,n){var i=n("825a"),r=n("1c0b"),s=n("b622"),a=s("species");e.exports=function(e,t){var n,s=i(e).constructor;return void 0===s||void 0==(n=i(s)[a])?t:r(n)}},4874:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.has_ai?[n("vui-group",[n("vui-group-item",{attrs:{label:"Hardware Integrity"}},[e._v(e._s(e.hardware_integrity)+"%")]),n("vui-group-item",{attrs:{label:"Backup Capacitor"}},[e._v(e._s(e.backup_capacitor)+"%")])],1),e.has_laws?n("table",{staticClass:"borders"},[e._m(0),n("div",{staticClass:"itemLabelNarrow"},[e._v(" Laws: ")]),e._l(e.laws,(function(t){return n("tr",{key:t.index},[n("td",{attrs:{valign:"top"}},[e._v(e._s(t.index))]),n("td",[e._v(e._s(t.law))])])}))],2):n("span",{staticClass:"notice"},[e._v(" No laws found. ")]),e.operational?n("vui-group",[n("vui-group-item",{attrs:{label:"Radio Subspace Transceiver"}},[n("vui-button",{class:{selected:e.radio},attrs:{params:{radio:0}}},[e._v("Enabled")]),n("vui-button",{class:{danger:!e.radio},attrs:{params:{radio:1}}},[e._v("Disabled")])],1),n("vui-group-item",{attrs:{label:"Wireless Interface"}},[n("vui-button",{class:{selected:e.wireless},attrs:{params:{wireless:0}}},[e._v("Enabled")]),n("vui-button",{class:{danger:!e.wireless},attrs:{params:{wireless:1}}},[e._v("Disabled")])],1),e.flushing?n("vui-group-item",[n("span",{staticClass:"notice"},[e._v("AI wipe in progress...")])]):n("vui-group-item",{attrs:{label:"Wipe AI"}},[n("vui-button",{staticClass:"danger",attrs:{params:{wipe:1}}},[e._v("Wipe")])],1)],1):e._e()]:[e._v(" Stored AI: "),n("span",{staticClass:"notice"},[e._v("No AI detected.")])]],2)},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("td",{staticClass:"law_index"},[e._v("Index")]),n("td",[e._v("Law")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"48f3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._t("default")],2)},r=[],s=(n("d44d"),n("2877")),a={},o=Object(s["a"])(a,i,r,!1,null,"b2030120",null);t["default"]=o.exports},4930:function(e,t,n){var i=n("d039");e.exports=!!Object.getOwnPropertySymbols&&!i((function(){return!String(Symbol())}))},4939:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.change_race?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Species: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_species,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_species==t},attrs:{params:{race:t}}},[e._v(e._s(t))])})),1)])]):e._e(),e.change_gender?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Sex: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_gender,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_gender==t},attrs:{params:{gender:t}}},[e._v(e._s(t))])})),1),e.valid_pronouns.length?n("div",{staticClass:"itemLabelNarrow"},[e._v(" Pronouns: ")]):e._e(),e.valid_pronouns.length?n("div",{staticClass:"itemContentWide"},e._l(e.valid_pronouns,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_pronouns==t},attrs:{params:{pronouns:t}}},[e._v(e._s(t))])})),1):e._e()])]):e._e(),e.change_accent&&e.valid_accents.length?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Accents: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_accents,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_accent==t},attrs:{params:{accent:t}}},[e._v(e._s(t))])})),1)])]):e._e(),e.change_language&&e.valid_languages.length?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Languages: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_languages,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.ArrayContains(e.owner_languages,t)},attrs:{params:{language:t}}},[e._v(e._s(t))])})),1)])]):e._e(),e.change_eye_color||e.change_skin_tone||e.change_skin_color||e.change_hair_color||e.change_facial_hair_color?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Colors: ")]),n("div",{staticClass:"itemContentWide"},[e.change_eye_color?n("vui-button",{attrs:{params:{eye_color:1}}},[e._v("Change Eye Color")]):e._e(),e.change_skin_tone?n("vui-button",{attrs:{params:{skin_tone:1}}},[e._v("Change Skin Tone")]):e._e(),e.change_skin_preset?n("vui-button",{attrs:{params:{skin_preset:1}}},[e._v("Change Skin Preset")]):e._e(),e.change_skin_color&&!e.change_skin_preset?n("vui-button",{attrs:{params:{skin_color:1}}},[e._v("Change Skin Color")]):e._e(),e.change_hair_color?n("vui-button",{attrs:{params:{hair_color:1}}},[e._v("Change Hair Color")]):e._e(),e.change_facial_hair_color?n("vui-button",{attrs:{params:{facial_hair_color:1}}},[e._v("Change Facial Hair Color")]):e._e()],1)])]):e._e(),e.change_hair&&e.valid_hair_styles.length?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Hair Styles: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_hair_styles,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_hair_style==t},attrs:{params:{hair:t}}},[e._v(e._s(t))])})),1)])]):e._e(),e.change_facial_hair&&e.valid_facial_hair_styles.length?n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelNarrow"},[e._v(" Facial Hair Styles: ")]),n("div",{staticClass:"itemContentWide"},e._l(e.valid_facial_hair_styles,(function(t){return n("vui-button",{key:t,class:{button:1,selected:e.owner_facial_hair_style==t},attrs:{params:{facial_hair:t}}},[e._v(e._s(t))])})),1)])]):e._e()])},r=[],s=(n("caad"),n("2532"),{data:function(){return this.$root.$data.state},methods:{ArrayContains:function(e,t){return!!e.includes(t)}}}),a=s,o=(n("611e"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"2a491020",null);t["default"]=c.exports},"498a":function(e,t,n){"use strict";var i=n("23e7"),r=n("58a8").trim,s=n("c8d2");i({target:"String",proto:!0,forced:s("trim")},{trim:function(){return r(this)}})},"4a9b":function(e,t,n){var i=n("74e8");i("Float64",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},"4ae1":function(e,t,n){var i=n("23e7"),r=n("d066"),s=n("1c0b"),a=n("825a"),o=n("861d"),c=n("7c73"),l=n("0538"),u=n("d039"),d=r("Reflect","construct"),h=u((function(){function e(){}return!(d((function(){}),[],e)instanceof e)})),f=!u((function(){d((function(){}))})),p=h||f;i({target:"Reflect",stat:!0,forced:p,sham:p},{construct:function(e,t){s(e),a(t);var n=arguments.length<3?e:s(arguments[2]);if(f&&!h)return d(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var i=[null];return i.push.apply(i,t),new(l.apply(e,i))}var r=n.prototype,u=c(o(r)?r:Object.prototype),p=Function.apply.call(e,u,t);return o(p)?p:u}})},"4ae3":function(e,t,n){"use strict";n("6814")},"4c53":function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("sub")},{sub:function(){return r(this,"sub","","")}})},"4caa":function(e,t,n){var i=n("a919"),r=n("76dd"),s=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,a="\\u0300-\\u036f",o="\\ufe20-\\ufe2f",c="\\u20d0-\\u20ff",l=a+o+c,u="["+l+"]",d=RegExp(u,"g");function h(e){return e=r(e),e&&e.replace(s,i).replace(d,"")}e.exports=h},"4cb7":function(e,t,n){},"4cc0":function(e,t,n){},"4d63":function(e,t,n){var i=n("83ab"),r=n("da84"),s=n("94ca"),a=n("7156"),o=n("9bf2").f,c=n("241c").f,l=n("44e7"),u=n("ad6d"),d=n("9f7f"),h=n("6eeb"),f=n("d039"),p=n("69f3").set,g=n("2626"),m=n("b622"),v=m("match"),b=r.RegExp,y=b.prototype,w=/a/g,_=/a/g,x=new b(w)!==w,k=d.UNSUPPORTED_Y,A=i&&s("RegExp",!x||k||f((function(){return _[v]=!1,b(w)!=w||b(_)==_||"/a/i"!=b(w,"i")})));if(A){var C=function(e,t){var n,i=this instanceof C,r=l(e),s=void 0===t;if(!i&&r&&e.constructor===C&&s)return e;x?r&&!s&&(e=e.source):e instanceof C&&(s&&(t=u.call(e)),e=e.source),k&&(n=!!t&&t.indexOf("y")>-1,n&&(t=t.replace(/y/g,"")));var o=a(x?new b(e,t):b(e,t),i?this:y,C);return k&&n&&p(o,{sticky:n}),o},E=function(e){e in C||o(C,e,{configurable:!0,get:function(){return b[e]},set:function(t){b[e]=t}})},S=c(b),F=0;while(S.length>F)E(S[F++]);y.constructor=C,C.prototype=y,h(r,"RegExp",C)}g("RegExp")},"4d64":function(e,t,n){var i=n("fc6a"),r=n("50c4"),s=n("23cb"),a=function(e){return function(t,n,a){var o,c=i(t),l=r(c.length),u=s(a,l);if(e&&n!=n){while(l>u)if(o=c[u++],o!=o)return!0}else for(;l>u;u++)if((e||u in c)&&c[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},"4d76":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h2",[e._v("Engine Status:")]),e.is_on?n("div",[e._v(" The engine is currently running. "),n("vui-button",{attrs:{params:{toggle_engine:1}}},[e._v("Stop")])],1):n("div",[e._v(" The engine is off. "),n("vui-button",{attrs:{disabled:!e.has_key||!e.has_cell,params:{toggle_engine:1}}},[e._v("Start")])],1),e.has_key?n("div",[e._v(" There is a key inserted into the ignition. "),n("vui-button",{attrs:{params:{key:1}}},[e._v("Remove Key")])],1):n("div",[e._v(" There is no key in the ignition. ")]),e.has_cell?n("div",[e._v(" Cell Charge: "),n("vui-progress",{class:{good:e.cell_charge>=.8*e.cell_max_charge,bad:e.cell_charge<=.4*e.cell_max_charge,average:e.cell_charge<.8*e.cell_max_charge&&e.cell_charge>.4*e.cell_max_charge},attrs:{value:e.cell_charge,max:e.cell_max_charge,min:0}},[e._v(e._s(e.cell_charge)+"J")]),e._v(" "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The cell can be removed by using a screwdriver to open the maintenance panel, then using a crowbar to shimmy it out.")])],1):n("div",[e._v(" There is no cell installed. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The cell can be installed by using a screwdriver to open the maintenance panel, then clicking on the engine with a compatible power cell.")])],1),e.is_towing?n("div",[e._v(" This engine is currently towing the "+e._s(e.tow)+". "),n("vui-button",{attrs:{params:{unlatch:1}}},[e._v("Unlatch")]),e._m(0),e.has_proper_trolley?n("div",[e.is_hoovering?n("div",[e._v(" The trolley is currently vacuuming. "),n("vui-button",{attrs:{params:{toggle_hoover:1}}},[e._v("Toggle")])],1):n("div",[e._v(" The trolley is not vacuuming. "),n("vui-button",{attrs:{disabled:!e.is_on,params:{toggle_hoover:1}}},[e._v("Toggle")])],1),n("div",[e._v(" Vacuum Capacity Remaining: "),n("vui-progress",{class:{good:e.vacuum_capacity>=.8*e.max_vacuum_capacity,bad:e.vacuum_capacity<=.4*e.max_vacuum_capacity,average:e.vacuum_capacity<.8*e.max_vacuum_capacity&&e.vacuum_capacity>.4*e.max_vacuum_capacity},attrs:{value:e.vacuum_capacity,max:e.max_vacuum_capacity,min:0}},[e._v(e._s(e.vacuum_capacity))]),e._v(" "),n("vui-button",{attrs:{disabled:e.vacuum_capacity>=e.max_vacuum_capacity,params:{empty_hoover:1}}},[e._v("Empty")])],1),e.is_mopping?n("div",[e._v(" The trolley is currently mopping. "),n("vui-button",{attrs:{disabled:!e.is_on||!e.has_bucket||e.bucket_capacity<=0,params:{toggle_mops:1}}},[e._v("Toggle")])],1):n("div",[e._v(" The trolley is not mopping. "),n("vui-button",{attrs:{disabled:!e.is_on||!e.has_bucket,params:{toggle_mops:1}}},[e._v("Toggle")])],1),e.has_bucket?n("div",[e._v(" The trolley has a reagent container installed. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The trolley must have a reagent container installed to draw reagents from, such as water or space cleaner. This can be done by opening the maintenance panel on the trolley with a screwdriver and clicking on it with a bucket. Similarly, with an open panel, it can be removed by using a wrench on it.")]),n("div",[e._v(" Container Reagents Remaining: "),n("vui-progress",{class:{good:e.bucket_capacity>=.8*e.max_bucket_capacity,bad:e.bucket_capacity<=.4*e.max_bucket_capacity,average:e.bucket_capacity<.8*e.max_bucket_capacity&&e.bucket_capacity>.4*e.max_bucket_capacity},attrs:{value:e.bucket_capacity,max:e.max_bucket_capacity,min:0}},[e._v(e._s(e.bucket_capacity)+"u")])],1)],1):n("div",[e._v(" The trolley does not have a reagent container installed. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The trolley must have a reagent container installed to draw reagents from, such as water or space cleaner. This can be done by opening the maintenance panel on the trolley with a screwdriver and clicking on it with a bucket. Similarly, with an open panel, it can be removed by using a wrench on it.")])],1)]):n("div",[e._v(" The wagon does not have the correct NT-X1 Vacuum Cleaner installed. ")])],1):n("div",[e._v(" This engine isn't towing anything currently. "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("You can latch vehicles together by dragging from the vehicle you want to be the anchor point, to the trolley you wish to latch.")])],1)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h2",[e._v("NT-X1 Vacuum Cleaner Status:")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"4d90":function(e,t,n){"use strict";var i=n("23e7"),r=n("0ccb").start,s=n("9a0c");i({target:"String",proto:!0,forced:s},{padStart:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},"4de4":function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").filter,s=n("1dde"),a=n("ae40"),o=s("filter"),c=a("filter");i({target:"Array",proto:!0,forced:!o||!c},{filter:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(e,t,n){"use strict";var i=n("0366"),r=n("7b0b"),s=n("9bdd"),a=n("e95a"),o=n("50c4"),c=n("8418"),l=n("35a1");e.exports=function(e){var t,n,u,d,h,f,p=r(e),g="function"==typeof this?this:Array,m=arguments.length,v=m>1?arguments[1]:void 0,b=void 0!==v,y=l(p),w=0;if(b&&(v=i(v,m>2?arguments[2]:void 0,2)),void 0==y||g==Array&&a(y))for(t=o(p.length),n=new g(t);t>w;w++)f=b?v(p[w],w):p[w],c(n,w,f);else for(d=y.call(p),h=d.next,n=new g;!(u=h.call(d)).done;w++)f=b?s(d,v,[u.value,w],!0):u.value,c(n,w,f);return n.length=w,n}},"4e82":function(e,t,n){"use strict";var i=n("23e7"),r=n("1c0b"),s=n("7b0b"),a=n("d039"),o=n("a640"),c=[],l=c.sort,u=a((function(){c.sort(void 0)})),d=a((function(){c.sort(null)})),h=o("sort"),f=u||!d||!h;i({target:"Array",proto:!0,forced:f},{sort:function(e){return void 0===e?l.call(s(this)):l.call(s(this),r(e))}})},"4ec9":function(e,t,n){"use strict";var i=n("6d61"),r=n("6566");e.exports=i("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),r)},"4fad":function(e,t,n){var i=n("23e7"),r=n("6f53").entries;i({target:"Object",stat:!0},{entries:function(e){return r(e)}})},"508b":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Tank Control System")]),e.state["input"]?n("div",[n("vui-item",{attrs:{balance:.65,label:"Input:"}},[e.state["input"].power?n("span",[e._v("Injecting")]):n("span",[e._v("On Hold")]),e._v(" "),n("vui-button",{attrs:{params:{in_toggle_injector:1},icon:"power-off"}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{balance:.65,label:"Flow Rate Limit:"}},[e._v(e._s(e.state["input"].rate)+" L/s")]),n("vui-item",{attrs:{balance:.65,label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"3em","button-count":3,max:e.state.maxrate},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.$toTopic({in_set_flowrate:e.state["input"].setrate})}},model:{value:e.state["input"].setrate,callback:function(t){e.$set(e.state["input"],"setrate",t)},expression:"state['input'].setrate"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{in_set_flowrate:e.state["input"].setrate}}},[e._v("Set Flow Rate")])],1)],1):n("vui-button",{attrs:{params:{in_refresh_status:1}}},[e._v("Search for input port")]),e.state["output"]?n("div",{staticStyle:{"margin-top":"2em"}},[n("vui-item",{attrs:{balance:.65,label:"Output:"}},[e.state["output"].power?n("span",[e._v("Open")]):n("span",[e._v("On Hold")]),e._v(" "),n("vui-button",{attrs:{params:{out_toggle_power:1},icon:"power-off"}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{balance:.65,label:"Max Output Pressure:"}},[e._v(e._s(e.state["output"].pressure)+" kPa")]),n("vui-item",{attrs:{balance:.65,label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"5em","button-count":4,"decimal-places":2,max:e.state.maxpressure},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.$toTopic({out_set_pressure:e.state["output"].setpressure})}},model:{value:e.state["output"].setpressure,callback:function(t){e.$set(e.state["output"],"setpressure",t)},expression:"state['output'].setpressure"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{out_set_pressure:e.state["output"].setpressure}}},[e._v("Set Pressure")])],1)],1):n("vui-button",{attrs:{params:{out_refresh_status:1}}},[e._v("Search for output port")])],1)},r=[],s={data:function(){return this.$root.$data}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"50c4":function(e,t,n){var i=n("a691"),r=Math.min;e.exports=function(e){return e>0?r(i(e),9007199254740991):0}},5135:function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},"51eb":function(e,t,n){"use strict";var i=n("825a"),r=n("c04e");e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return r(i(this),"number"!==e)}},5319:function(e,t,n){"use strict";var i=n("d784"),r=n("825a"),s=n("7b0b"),a=n("50c4"),o=n("a691"),c=n("1d80"),l=n("8aa5"),u=n("14c3"),d=Math.max,h=Math.min,f=Math.floor,p=/\$([$&'`]|\d\d?|<[^>]*>)/g,g=/\$([$&'`]|\d\d?)/g,m=function(e){return void 0===e?e:String(e)};i("replace",2,(function(e,t,n,i){var v=i.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,b=i.REPLACE_KEEPS_$0,y=v?"$":"$0";return[function(n,i){var r=c(this),s=void 0==n?void 0:n[e];return void 0!==s?s.call(n,r,i):t.call(String(r),n,i)},function(e,i){if(!v&&b||"string"===typeof i&&-1===i.indexOf(y)){var s=n(t,e,this,i);if(s.done)return s.value}var c=r(e),f=String(this),p="function"===typeof i;p||(i=String(i));var g=c.global;if(g){var _=c.unicode;c.lastIndex=0}var x=[];while(1){var k=u(c,f);if(null===k)break;if(x.push(k),!g)break;var A=String(k[0]);""===A&&(c.lastIndex=l(f,a(c.lastIndex),_))}for(var C="",E=0,S=0;S=E&&(C+=f.slice(E,$)+R,E=$+F.length)}return C+f.slice(E)}];function w(e,n,i,r,a,o){var c=i+e.length,l=r.length,u=g;return void 0!==a&&(a=s(a),u=p),t.call(o,u,(function(t,s){var o;switch(s.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,i);case"'":return n.slice(c);case"<":o=a[s.slice(1,-1)];break;default:var u=+s;if(0===u)return t;if(u>l){var d=f(u/10);return 0===d?t:d<=l?void 0===r[d-1]?s.charAt(1):r[d-1]+s.charAt(1):t}o=r[u-1]}return void 0===o?"":o}))}}))},5327:function(e,t,n){var i=n("23e7"),r=n("1ec1"),s=Math.acosh,a=Math.log,o=Math.sqrt,c=Math.LN2,l=!s||710!=Math.floor(s(Number.MAX_VALUE))||s(1/0)!=1/0;i({target:"Math",stat:!0,forced:l},{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?a(e)+c:r(e-1+o(e-1)*o(e+1))}})},5377:function(e,t,n){var i=n("83ab"),r=n("9bf2"),s=n("ad6d"),a=n("9f7f").UNSUPPORTED_Y;i&&("g"!=/./g.flags||a)&&r.f(RegExp.prototype,"flags",{configurable:!0,get:s})},"542d":function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("408a"),a=1..toPrecision,o=r((function(){return"1"!==a.call(1,void 0)}))||!r((function(){a.call({})}));i({target:"Number",proto:!0,forced:o},{toPrecision:function(e){return void 0===e?a.call(s(this)):a.call(s(this),e)}})},5692:function(e,t,n){var i=n("c430"),r=n("c6cd");(e.exports=function(e,t){return r[e]||(r[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.7.0",mode:i?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56d7":function(e,t,n){"use strict";n.r(t),function(e){n("4160"),n("e260"),n("d3b7"),n("ac1f"),n("5319"),n("159b"),n("ddb0"),n("4795"),n("2d26");var t=n("a026"),i=n("8103"),r=n.n(i),s=n("bba4"),a=n.n(s),o=n("fe83"),c=n("c0d6"),l=(n("e008"),n("f0e0")),u=n("3851");if(u.keys().forEach((function(e){var n=u(e),i=r()(a()(e.replace(/^\.\/(.*)\.\w+$/,"$1")));t["a"].component(i,n.default||n)})),t["a"].use(o["a"]),t["a"].config.productionTip=!1,e.Vue=t["a"],e.receiveUIState=function(e){c["a"].loadState(JSON.parse(e))},document.getElementById("app")){var d=JSON.parse(document.getElementById("initialstate").innerHTML);c["a"].loadState(d),window.__wtimetimer=window.setInterval((function(){c["a"].state.wtime+=2}),200),l["a"].setWindowKey(window.document.getElementById("vueui:windowId").getAttribute("content")),l["a"].setupDrag(),new t["a"]({data:c["a"].state,template:"

    Javascript loaded, stylesheets has failed to load. Click here to load.

    ",computed:{componentName:function(){return"?"!=this.$root.$data.active.charAt(0)?"view-"+this.$root.$data.active:null},templateString:function(){return"?"==this.$root.$data.active.charAt(0)?"
    "+this.$root.$data.active.substr(1)+"
    ":null}},watch:{state:{handler:function(){c["a"].pushState()},deep:!0}},mounted:function(){this.$el.focus()}}).$mount("#app")}document.getElementById("header")&&new t["a"]({data:c["a"].state}).$mount("#header"),document.getElementById("dapp")&&new t["a"]({data:c["a"].state,template:'

    Debug this UI with inspector by opening URL in your browser:

    {{url}}

    Current data of UI:

    {{ JSON.stringify(this.$root.$data, null, \'    \') }}
    ',methods:{stop:function(){window.clearInterval(window.__wtimetimer)}},computed:{url:function(){return window.location.href+"?ext"}}}).$mount("#dapp")}.call(this,n("c8ba"))},"56ef":function(e,t,n){var i=n("d066"),r=n("241c"),s=n("7418"),a=n("825a");e.exports=i("Reflect","ownKeys")||function(e){var t=r.f(a(e)),n=s.f;return n?t.concat(n(e)):t}},"583b":function(e,t,n){var i=n("23e7"),r=n("5e89"),s=Math.abs;i({target:"Number",stat:!0},{isSafeInteger:function(e){return r(e)&&s(e)<=9007199254740991}})},"585a":function(e,t,n){(function(t){var n="object"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n("c8ba"))},5899:function(e,t){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},"58a8":function(e,t,n){var i=n("1d80"),r=n("5899"),s="["+r+"]",a=RegExp("^"+s+s+"*"),o=RegExp(s+s+"*$"),c=function(e){return function(t){var n=String(i(t));return 1&e&&(n=n.replace(a,"")),2&e&&(n=n.replace(o,"")),n}};e.exports={start:c(1),end:c(2),trim:c(3)}},"58e3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.state.failTime?n("div",{staticClass:"notice"},[n("h3",{staticClass:"fw-bold"},[e._v("SYSTEM FAILURE")]),n("span",{staticClass:"fst-italic"},[e._v("I/O regulator malfuction detected! Waiting for system reboot...")]),n("br"),e._v(" Automatic reboot in "+e._s(e.state.failTime)+" seconds... "),n("vui-button",{attrs:{icon:"sync",params:{reboot:1}}},[e._v("Reboot Now")])],1):n("vui-group",[n("vui-group-item",{attrs:{label:"Stored Capacity:"}},[n("vui-progress",{class:e.state.charging?"good":"average",attrs:{value:e.state.storedCapacity,min:0,max:100}}),n("div",{staticClass:"statusValue"},[e._v(" "+e._s(Math.round(e.state.storedCapacity))+"% ")])],1),n("vui-group-item",{attrs:{label:"Charge status:"}},[n("div",{staticClass:"statusValue"},[1==e.state.chargeMode?n("span",[e._v(" SMES will be fully charged in "+e._s(e.timeRemaining)+" ")]):2==e.state.chargeMode?n("span",[e._v(" SMES input and output are equal ")]):n("span",[e._v(" SMES will run out of charge in "+e._s(e.timeRemaining)+" ")])])]),n("h3",[e._v("Input Management")]),n("vui-group-item",{attrs:{label:"Charge Mode:"}},[n("vui-button",{attrs:{icon:e.state.chargeAttempt?"sync":"times",params:{cmode:1}}},[e._v(e._s(e.state.chargeAttempt?"Auto":"Off"))]),e._v(" ["),n("span",{class:e.chargeClass},[e._v(e._s(e.chargeStatus))]),e._v("] ")],1),n("vui-group-item",{attrs:{label:"Input Level:"}},[n("vui-progress",{attrs:{value:e.state.chargeLevel,min:0,max:e.state.chargeMax}}),n("div",{staticStyle:{clear:"both","padding-top":"4px","text-align":"center"}},[n("vui-input-numeric",{attrs:{width:"100px","min-button":"","max-button":"","button-count":0,min:0,max:e.state.chargeMax},on:{input:function(t){return e.s({input:e.state.chargeLevel})}},model:{value:e.state.chargeLevel,callback:function(t){e.$set(e.state,"chargeLevel",t)},expression:"state.chargeLevel"}},[e._v(" "+e._s(e.state.chargeLevel)+" W ")])],1)],1),n("vui-group-item",{attrs:{label:"Input Load:"}},[n("vui-progress",{class:e.state.chargeTaken=1&&"".concat(t," hours"),n>=1&&"".concat(n," minutes"),i>=1&&"".concat(i," seconds")].filter(Boolean).join(", ")}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},"592e":function(e,t,n){},"5a34":function(e,t,n){var i=n("44e7");e.exports=function(e){if(i(e))throw TypeError("The method doesn't accept regular expressions");return e}},"5aa2":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"button",attrs:{disabled:e.$root.$data.status<2||this.disabled},on:{click:function(t){return e.senddata()}}},[e.icon?n("div",{staticClass:"uiIcon16",class:["ic-"+this.icon,{"mr-1":!this.iconOnly},e.getRotateClass,e.getFlipClass]}):e._e(),n("span",[e._t("default")],2)])},r=[],s=(n("a9e3"),n("c0d6")),a=n("025e"),o={props:{icon:{type:String,default:""},rotate:{type:Number,default:0},flip:{type:String,default:""},params:{type:Object,default:null},unsafeParams:{type:Object,default:null},pushState:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},iconOnly:{type:Boolean,default:!1}},methods:{senddata:function(){this.$root.$data.status<2||this.disabled||(this.$emit("click"),this.unsafeParams&&a["a"].sendToTopicRaw(this.unsafeParams),this.params?a["a"].sendToTopic(this.params,this.pushState):this.pushState&&s["a"].pushState())}},computed:{getRotateClass:function(){switch(this.rotate%360){case 90:return"ic-rotate-90";case 180:return"ic-rotate-180";case 270:return"ic-rotate-270";default:return""}},getFlipClass:function(){if(this.flip)return"ic-flip-".concat(this.flip)}}},c=o,l=n("2877"),u=Object(l["a"])(c,i,r,!1,null,null,null);t["default"]=u.exports},"5ae5":function(e,t,n){},"5b81":function(e,t,n){"use strict";var i=n("23e7"),r=n("1d80"),s=n("44e7"),a=n("ad6d"),o=n("b622"),c=n("c430"),l=o("replace"),u=RegExp.prototype;i({target:"String",proto:!0},{replaceAll:function e(t,n){var i,o,d,h,f,p,g,m,v,b=r(this);if(null!=t){if(i=s(t),i&&(o=String(r("flags"in u?t.flags:a.call(t))),!~o.indexOf("g")))throw TypeError("`.replaceAll` does not allow non-global regexes");if(d=t[l],void 0!==d)return d.call(t,b,n);if(c&&i)return String(b).replace(t,n)}if(h=String(b),f=String(t),""===f)return e.call(h,/(?:)/g,n);if(p=h.split(f),"function"!==typeof n)return p.join(String(n));for(g=p[0],m=g.length,v=1;v1?arguments[1]:void 0),t}})},"5ddf":function(e,t,n){"use strict";n("3aaf")},"5ded":function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("8418"),a=r((function(){function e(){}return!(Array.of.call(e)instanceof e)}));i({target:"Array",stat:!0,forced:a},{of:function(){var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);while(t>e)s(n,e,arguments[e++]);return n.length=t,n}})},"5e89":function(e,t,n){var i=n("861d"),r=Math.floor;e.exports=function(e){return!i(e)&&isFinite(e)&&r(e)===e}},"5f96":function(e,t,n){"use strict";var i=n("ebb5"),r=i.aTypedArray,s=i.exportTypedArrayMethod,a=[].join;s("join",(function(e){return a.apply(r(this),arguments)}))},"5fb2":function(e,t,n){"use strict";var i=2147483647,r=36,s=1,a=26,o=38,c=700,l=72,u=128,d="-",h=/[^\0-\u007E]/,f=/[.\u3002\uFF0E\uFF61]/g,p="Overflow: input needs wider integers to process",g=r-s,m=Math.floor,v=String.fromCharCode,b=function(e){var t=[],n=0,i=e.length;while(n=55296&&r<=56319&&n>1,e+=m(e/t);e>g*a>>1;i+=r)e=m(e/g);return m(i+(g+1)*e/(e+o))},_=function(e){var t=[];e=b(e);var n,o,c=e.length,h=u,f=0,g=l;for(n=0;n=h&&om((i-f)/A))throw RangeError(p);for(f+=(k-h)*A,h=k,n=0;ni)throw RangeError(p);if(o==h){for(var C=f,E=r;;E+=r){var S=E<=g?s:E>=g+a?a:E-g;if(Cu){var f,p=l(arguments[u++]),g=d?s(p).concat(d(p)):s(p),m=g.length,v=0;while(m>v)f=g[v++],i&&!h.call(p,f)||(n[f]=p[f])}return n}:u},"611e":function(e,t,n){"use strict";n("f7e3")},"614c":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Fuel Injection System")]),e.state["device"]?[n("vui-item",{attrs:{label:"Input:"}},[e.state.device.power?n("span",[e._v("Injecting")]):n("span",[e._v("On Hold")]),n("vui-button",{attrs:{params:{in_toggle_injector:1}}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{label:"Rate:"}},[e._v(e._s(e.state.device.rate)+" L/s")]),n("vui-item",{attrs:{label:"Automated Fuel Injection:"}},[e.state.device.automation?n("vui-button",{attrs:{params:{toggle_automation:1}}},[e._v("Engaged")]):n("vui-button",{attrs:{params:{toggle_automation:1}}},[e._v("Disengaged")])],1),n("vui-item",{attrs:{label:"Inject:"}},[e.state.device.automation?[e._v("Controls Locked Out")]:[n("vui-button",{attrs:{params:{toggle_injector:1},icon:"power-off"}},[e._v("Toggle Power")]),n("vui-button",{attrs:{params:{injection:1}}},[e._v("Inject (1 Cycle)")])]],2)]:n("vui-button",{attrs:{params:{in_refresh_status:1}}},[e._v("Search for device")])],2)},r=[],s={data:function(){return this.$root.$data}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"621a":function(e,t,n){"use strict";var i=n("da84"),r=n("83ab"),s=n("a981"),a=n("9112"),o=n("e2cc"),c=n("d039"),l=n("19aa"),u=n("a691"),d=n("50c4"),h=n("0b25"),f=n("77a7"),p=n("e163"),g=n("d2bb"),m=n("241c").f,v=n("9bf2").f,b=n("81d5"),y=n("d44e"),w=n("69f3"),_=w.get,x=w.set,k="ArrayBuffer",A="DataView",C="prototype",E="Wrong length",S="Wrong index",F=i[k],$=F,T=i[A],L=T&&T[C],D=Object.prototype,B=i.RangeError,R=f.pack,O=f.unpack,M=function(e){return[255&e]},j=function(e){return[255&e,e>>8&255]},I=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},P=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},N=function(e){return R(e,23,4)},W=function(e){return R(e,52,8)},H=function(e,t){v(e[C],t,{get:function(){return _(this)[t]}})},V=function(e,t,n,i){var r=h(n),s=_(e);if(r+t>s.byteLength)throw B(S);var a=_(s.buffer).bytes,o=r+s.byteOffset,c=a.slice(o,o+t);return i?c:c.reverse()},U=function(e,t,n,i,r,s){var a=h(n),o=_(e);if(a+t>o.byteLength)throw B(S);for(var c=_(o.buffer).bytes,l=a+o.byteOffset,u=i(+r),d=0;dK;)(z=q[K++])in $||a($,z,F[z]);G.constructor=$}g&&p(L)!==D&&g(L,D);var Y=new T(new $(2)),X=L.setInt8;Y.setInt8(0,2147483648),Y.setInt8(1,2147483649),!Y.getInt8(0)&&Y.getInt8(1)||o(L,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else $=function(e){l(this,$,k);var t=h(e);x(this,{bytes:b.call(new Array(t),0),byteLength:t}),r||(this.byteLength=t)},T=function(e,t,n){l(this,T,A),l(e,$,A);var i=_(e).byteLength,s=u(t);if(s<0||s>i)throw B("Wrong offset");if(n=void 0===n?i-s:d(n),s+n>i)throw B(E);x(this,{buffer:e,byteLength:n,byteOffset:s}),r||(this.buffer=e,this.byteLength=n,this.byteOffset=s)},r&&(H($,"byteLength"),H(T,"buffer"),H(T,"byteLength"),H(T,"byteOffset")),o(T[C],{getInt8:function(e){return V(this,1,e)[0]<<24>>24},getUint8:function(e){return V(this,1,e)[0]},getInt16:function(e){var t=V(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=V(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return P(V(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return P(V(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return O(V(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return O(V(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){U(this,1,e,M,t)},setUint8:function(e,t){U(this,1,e,M,t)},setInt16:function(e,t){U(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){U(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){U(this,4,e,I,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){U(this,4,e,I,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){U(this,4,e,N,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){U(this,8,e,W,t,arguments.length>2?arguments[2]:void 0)}});y($,k),y(T,A),e.exports={ArrayBuffer:$,DataView:T}},6234:function(e,t,n){},6292:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-button",{directives:[{name:"show",rawName:"v-show",value:!e.creating,expression:"!creating"}],on:{click:function(t){e.creating=!0}}},[e._v("New")]),e.creating?[n("input",{directives:[{name:"model",rawName:"v-model",value:e.newname,expression:"newname"}],attrs:{type:"text"},domProps:{value:e.newname},on:{input:function(t){t.target.composing||(e.newname=t.target.value)}}}),n("vui-button",{on:{click:function(t){return e.newFile()}}},[e._v("Create")])]:e._e(),n("h2",[e._v("Available files:")]),n("table",[e._m(0),e._l(e.s.files,(function(t){return n("tr",{key:t.name},[n("td",[e._v(e._s(t.name))]),n("td",[e._v(e._s(t.type))]),n("td",[e._v(e._s(t.size)+"GQ")]),n("td",[n("vui-button",{attrs:{params:{execute_file:t.name}}},[e._v("Execute")]),n("vui-button",{attrs:{params:{edit_file:t.name}}},[e._v("Edit")])],1)])}))],2)],2)},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",[n("th",[e._v("File name")]),n("th",[e._v("File type")]),n("th",[e._v("File size (GQ)")]),n("th",[e._v("Operations")])])}],s={data:function(){return{s:this.$root.$data.state,creating:!1,newname:""}},methods:{newFile:function(){this.$toTopic({new:this.newname}),this.newname="",this.creating=!1}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},6309:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("table",e._l(e.listvar,(function(t,i){return n("ul",{key:i},[n("li",[e._v(e._s(i)+": "+e._s(t))])])})),0)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"63bf":function(e,t,n){},"63f9":function(e,t,n){},"649e":function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").some,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("some",(function(e){return r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},"64e5":function(e,t,n){"use strict";var i=n("d039"),r=n("0ccb").start,s=Math.abs,a=Date.prototype,o=a.getTime,c=a.toISOString;e.exports=i((function(){return"0385-07-25T07:06:39.999Z"!=c.call(new Date(-50000000000001))}))||!i((function(){c.call(new Date(NaN))}))?function(){if(!isFinite(o.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),i=t<0?"-":t>9999?"+":"";return i+r(s(t),i?6:4,0)+"-"+r(e.getUTCMonth()+1,2,0)+"-"+r(e.getUTCDate(),2,0)+"T"+r(e.getUTCHours(),2,0)+":"+r(e.getUTCMinutes(),2,0)+":"+r(e.getUTCSeconds(),2,0)+"."+r(n,3,0)+"Z"}:c},6547:function(e,t,n){var i=n("a691"),r=n("1d80"),s=function(e){return function(t,n){var s,a,o=String(r(t)),c=i(n),l=o.length;return c<0||c>=l?e?"":void 0:(s=o.charCodeAt(c),s<55296||s>56319||c+1===l||(a=o.charCodeAt(c+1))<56320||a>57343?e?o.charAt(c):s:e?o.slice(c,c+2):a-56320+(s-55296<<10)+65536)}};e.exports={codeAt:s(!1),charAt:s(!0)}},6566:function(e,t,n){"use strict";var i=n("9bf2").f,r=n("7c73"),s=n("e2cc"),a=n("0366"),o=n("19aa"),c=n("2266"),l=n("7dd0"),u=n("2626"),d=n("83ab"),h=n("f183").fastKey,f=n("69f3"),p=f.set,g=f.getterFor;e.exports={getConstructor:function(e,t,n,l){var u=e((function(e,i){o(e,u,t),p(e,{type:t,index:r(null),first:void 0,last:void 0,size:0}),d||(e.size=0),void 0!=i&&c(i,e[l],{that:e,AS_ENTRIES:n})})),f=g(t),m=function(e,t,n){var i,r,s=f(e),a=v(e,t);return a?a.value=n:(s.last=a={index:r=h(t,!0),key:t,value:n,previous:i=s.last,next:void 0,removed:!1},s.first||(s.first=a),i&&(i.next=a),d?s.size++:e.size++,"F"!==r&&(s.index[r]=a)),e},v=function(e,t){var n,i=f(e),r=h(t);if("F"!==r)return i.index[r];for(n=i.first;n;n=n.next)if(n.key==t)return n};return s(u.prototype,{clear:function(){var e=this,t=f(e),n=t.index,i=t.first;while(i)i.removed=!0,i.previous&&(i.previous=i.previous.next=void 0),delete n[i.index],i=i.next;t.first=t.last=void 0,d?t.size=0:e.size=0},delete:function(e){var t=this,n=f(t),i=v(t,e);if(i){var r=i.next,s=i.previous;delete n.index[i.index],i.removed=!0,s&&(s.next=r),r&&(r.previous=s),n.first==i&&(n.first=r),n.last==i&&(n.last=s),d?n.size--:t.size--}return!!i},forEach:function(e){var t,n=f(this),i=a(e,arguments.length>1?arguments[1]:void 0,3);while(t=t?t.next:n.first){i(t.value,t.key,this);while(t&&t.removed)t=t.previous}},has:function(e){return!!v(this,e)}}),s(u.prototype,n?{get:function(e){var t=v(this,e);return t&&t.value},set:function(e,t){return m(this,0===e?0:e,t)}}:{add:function(e){return m(this,e=0===e?0:e,e)}}),d&&i(u.prototype,"size",{get:function(){return f(this).size}}),u},setStrong:function(e,t,n){var i=t+" Iterator",r=g(t),s=g(i);l(e,t,(function(e,t){p(this,{type:i,target:e,state:r(e),kind:t,last:void 0})}),(function(){var e=s(this),t=e.kind,n=e.last;while(n&&n.removed)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),n?"entries":"values",!n,!0),u(t)}}},"65f0":function(e,t,n){var i=n("861d"),r=n("e8b5"),s=n("b622"),a=s("species");e.exports=function(e,t){var n;return r(e)&&(n=e.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)?i(n)&&(n=n[a],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},"664f":function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("sup")},{sup:function(){return r(this,"sup","","")}})},6747:function(e,t){var n=Array.isArray;e.exports=n},6814:function(e,t,n){},"682e":function(e,t,n){"use strict";n("9513")},6836:function(e,t,n){},"69f3":function(e,t,n){var i,r,s,a=n("7f9a"),o=n("da84"),c=n("861d"),l=n("9112"),u=n("5135"),d=n("c6cd"),h=n("f772"),f=n("d012"),p=o.WeakMap,g=function(e){return s(e)?r(e):i(e,{})},m=function(e){return function(t){var n;if(!c(t)||(n=r(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}};if(a){var v=d.state||(d.state=new p),b=v.get,y=v.has,w=v.set;i=function(e,t){return t.facade=e,w.call(v,e,t),t},r=function(e){return b.call(v,e)||{}},s=function(e){return y.call(v,e)}}else{var _=h("state");f[_]=!0,i=function(e,t){return t.facade=e,l(e,_,t),t},r=function(e){return u(e,_)?e[_]:{}},s=function(e){return u(e,_)}}e.exports={set:i,get:r,has:s,enforce:g,getterFor:m}},"6a01":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.state.toner?n("span",[e._v("Current toner level: "+e._s(e.state.toner))]):e._e(),n("br"),e.state.gotitem?n("vui-button",{attrs:{params:{remove:1}}},[e._v("Remove Item")]):e._e(),n("br"),e.state.toner?[e.state.gotitem?[n("div",{staticClass:"itemLabel copylabel"},[e._v("Copies to print:")]),n("div",{staticClass:"copyBlock"},[n("vui-input-numeric",{attrs:{width:"2.5em",min:1,max:e.state.maxcopies},model:{value:e.state.copies,callback:function(t){e.$set(e.state,"copies",t)},expression:"state.copies"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{copy:1}}},[e._v("Copy")])],1)]:[n("h3",[e._v("Please insert something to copy.")])],n("br"),e.state.isAI?n("vui-button",{attrs:{params:{aipic:1}}},[e._v("Print photo from database")]):e._e()]:[n("h2",[e._v("Please insert a new toner cartridge!")])]],2)},r=[],s={data:function(){return this.$root.$data}},a=s,o=(n("7dc4"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"927b9430",null);t["default"]=c.exports},"6a21":function(e,t){ace.define("ace/snippets/javascript",["require","exports","module"],(function(e,t,n){"use strict";t.snippetText='# Prototype\nsnippet proto\n\t${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n\t\t${4:// body...}\n\t};\n# Function\nsnippet fun\n\tfunction ${1?:function_name}(${2:argument}) {\n\t\t${3:// body...}\n\t}\n# Anonymous Function\nregex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\nsnippet f\n\tfunction${M1?: ${1:functionName}}($2) {\n\t\t${0:$TM_SELECTED_TEXT}\n\t}${M2?;}${M3?,}${M4?)}\n# Immediate function\ntrigger \\(?f\\(\nendTrigger \\)?\nsnippet f(\n\t(function(${1}) {\n\t\t${0:${TM_SELECTED_TEXT:/* code */}}\n\t}(${1}));\n# if\nsnippet if\n\tif (${1:true}) {\n\t\t${0}\n\t}\n# if ... else\nsnippet ife\n\tif (${1:true}) {\n\t\t${2}\n\t} else {\n\t\t${0}\n\t}\n# tertiary conditional\nsnippet ter\n\t${1:/* condition */} ? ${2:a} : ${3:b}\n# switch\nsnippet switch\n\tswitch (${1:expression}) {\n\t\tcase \'${3:case}\':\n\t\t\t${4:// code}\n\t\t\tbreak;\n\t\t${5}\n\t\tdefault:\n\t\t\t${2:// code}\n\t}\n# case\nsnippet case\n\tcase \'${1:case}\':\n\t\t${2:// code}\n\t\tbreak;\n\t${3}\n\n# while (...) {...}\nsnippet wh\n\twhile (${1:/* condition */}) {\n\t\t${0:/* code */}\n\t}\n# try\nsnippet try\n\ttry {\n\t\t${0:/* code */}\n\t} catch (e) {}\n# do...while\nsnippet do\n\tdo {\n\t\t${2:/* code */}\n\t} while (${1:/* condition */});\n# Object Method\nsnippet :f\nregex /([,{[])|^\\s*/:f/\n\t${1:method_name}: function(${2:attribute}) {\n\t\t${0}\n\t}${3:,}\n# setTimeout function\nsnippet setTimeout\nregex /\\b/st|timeout|setTimeo?u?t?/\n\tsetTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n# Get Elements\nsnippet gett\n\tgetElementsBy${1:TagName}(\'${2}\')${3}\n# Get Element\nsnippet get\n\tgetElementBy${1:Id}(\'${2}\')${3}\n# console.log (Firebug)\nsnippet cl\n\tconsole.log(${1});\n# return\nsnippet ret\n\treturn ${1:result}\n# for (property in object ) { ... }\nsnippet fori\n\tfor (var ${1:prop} in ${2:Things}) {\n\t\t${0:$2[$1]}\n\t}\n# hasOwnProperty\nsnippet has\n\thasOwnProperty(${1})\n# docstring\nsnippet /**\n\t/**\n\t * ${1:description}\n\t *\n\t */\nsnippet @par\nregex /^\\s*\\*\\s*/@(para?m?)?/\n\t@param {${1:type}} ${2:name} ${3:description}\nsnippet @ret\n\t@return {${1:type}} ${2:description}\n# JSON.parse\nsnippet jsonp\n\tJSON.parse(${1:jstr});\n# JSON.stringify\nsnippet jsons\n\tJSON.stringify(${1:object});\n# self-defining function\nsnippet sdf\n\tvar ${1:function_name} = function(${2:argument}) {\n\t\t${3:// initial code ...}\n\n\t\t$1 = function($2) {\n\t\t\t${4:// main code}\n\t\t};\n\t}\n# singleton\nsnippet sing\n\tfunction ${1:Singleton} (${2:argument}) {\n\t\t// the cached instance\n\t\tvar instance;\n\n\t\t// rewrite the constructor\n\t\t$1 = function $1($2) {\n\t\t\treturn instance;\n\t\t};\n\t\t\n\t\t// carry over the prototype properties\n\t\t$1.prototype = this;\n\n\t\t// the instance\n\t\tinstance = new $1();\n\n\t\t// reset the constructor pointer\n\t\tinstance.constructor = $1;\n\n\t\t${3:// code ...}\n\n\t\treturn instance;\n\t}\n# class\nsnippet class\nregex /^\\s*/clas{0,2}/\n\tvar ${1:class} = function(${20}) {\n\t\t$40$0\n\t};\n\t\n\t(function() {\n\t\t${60:this.prop = ""}\n\t}).call(${1:class}.prototype);\n\t\n\texports.${1:class} = ${1:class};\n# \nsnippet for-\n\tfor (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n\t\t${0:${2:Things}[${1:i}];}\n\t}\n# for (...) {...}\nsnippet for\n\tfor (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n\t\t${3:$2[$1]}$0\n\t}\n# for (...) {...} (Improved Native For-Loop)\nsnippet forr\n\tfor (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n\t\t${3:$2[$1]}$0\n\t}\n\n\n#modules\nsnippet def\n\tdefine(function(require, exports, module) {\n\t"use strict";\n\tvar ${1/.*\\///} = require("${1}");\n\t\n\t$TM_SELECTED_TEXT\n\t});\nsnippet req\nguard ^\\s*\n\tvar ${1/.*\\///} = require("${1}");\n\t$0\nsnippet requ\nguard ^\\s*\n\tvar ${1/.*\\/(.)/\\u$1/} = require("${1}").${1/.*\\/(.)/\\u$1/};\n\t$0\n',t.scope="javascript"}))},"6ac0":function(e,t){function n(e,t,n,i){var r=-1,s=null==e?0:e.length;i&&s&&(n=e[++r]);while(++r ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(row,column){return 0==this.compare(row,column)},this.compareRange=function(range){var cmp,end=range.end,start=range.start;return cmp=this.compare(end.row,end.column),1==cmp?(cmp=this.compare(start.row,start.column),1==cmp?2:0==cmp?1:0):-1==cmp?-2:(cmp=this.compare(start.row,start.column),-1==cmp?-1:1==cmp?42:0)},this.comparePoint=function(p){return this.compare(p.row,p.column)},this.containsRange=function(range){return 0==this.comparePoint(range.start)&&0==this.comparePoint(range.end)},this.intersects=function(range){var cmp=this.compareRange(range);return-1==cmp||0==cmp||1==cmp},this.isEnd=function(row,column){return this.end.row==row&&this.end.column==column},this.isStart=function(row,column){return this.start.row==row&&this.start.column==column},this.setStart=function(row,column){"object"==typeof row?(this.start.column=row.column,this.start.row=row.row):(this.start.row=row,this.start.column=column)},this.setEnd=function(row,column){"object"==typeof row?(this.end.column=row.column,this.end.row=row.row):(this.end.row=row,this.end.column=column)},this.inside=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)||this.isStart(row,column)?!1:!0:!1},this.insideStart=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)?!1:!0:!1},this.insideEnd=function(row,column){return 0==this.compare(row,column)?this.isStart(row,column)?!1:!0:!1},this.compare=function(row,column){return this.isMultiLine()||row!==this.start.row?this.start.row>row?-1:row>this.end.row?1:this.start.row===row?column>=this.start.column?0:-1:this.end.row===row?this.end.column>=column?0:1:0:this.start.column>column?-1:column>this.end.column?1:0},this.compareStart=function(row,column){return this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.compareEnd=function(row,column){return this.end.row==row&&this.end.column==column?1:this.compare(row,column)},this.compareInside=function(row,column){return this.end.row==row&&this.end.column==column?1:this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.clipRows=function(firstRow,lastRow){if(this.end.row>lastRow)var end={row:lastRow+1,column:0};else if(firstRow>this.end.row)var end={row:firstRow,column:0};if(this.start.row>lastRow)var start={row:lastRow+1,column:0};else if(firstRow>this.start.row)var start={row:firstRow,column:0};return Range.fromPoints(start||this.start,end||this.end)},this.extend=function(row,column){var cmp=this.compare(row,column);if(0==cmp)return this;if(-1==cmp)var start={row:row,column:column};else var end={row:row,column:column};return Range.fromPoints(start||this.start,end||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return Range.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new Range(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new Range(this.start.row,0,this.end.row,0)},this.toScreenRange=function(session){var screenPosStart=session.documentToScreenPosition(this.start),screenPosEnd=session.documentToScreenPosition(this.end);return new Range(screenPosStart.row,screenPosStart.column,screenPosEnd.row,screenPosEnd.column)},this.moveBy=function(row,column){this.start.row+=row,this.start.column+=column,this.end.row+=row,this.end.column+=column}}).call(Range.prototype),Range.fromPoints=function(start,end){return new Range(start.row,start.column,end.row,end.column)},Range.comparePoints=comparePoints,Range.comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},exports.Range=Range}),ace.define("ace/apply_delta",["require","exports","module"],function(acequire,exports){"use strict";exports.applyDelta=function(docLines,delta){var row=delta.start.row,startColumn=delta.start.column,line=docLines[row]||"";switch(delta.action){case"insert":var lines=delta.lines;if(1===lines.length)docLines[row]=line.substring(0,startColumn)+delta.lines[0]+line.substring(startColumn);else{var args=[row,1].concat(delta.lines);docLines.splice.apply(docLines,args),docLines[row]=line.substring(0,startColumn)+docLines[row],docLines[row+delta.lines.length-1]+=line.substring(startColumn)}break;case"remove":var endColumn=delta.end.column,endRow=delta.end.row;row===endRow?docLines[row]=line.substring(0,startColumn)+line.substring(endColumn):docLines.splice(row,endRow-row+1,line.substring(0,startColumn)+docLines[endRow].substring(endColumn))}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(acequire,exports){"use strict";var EventEmitter={},stopPropagation=function(){this.propagationStopped=!0},preventDefault=function(){this.defaultPrevented=!0};EventEmitter._emit=EventEmitter._dispatchEvent=function(eventName,e){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var listeners=this._eventRegistry[eventName]||[],defaultHandler=this._defaultHandlers[eventName];if(listeners.length||defaultHandler){"object"==typeof e&&e||(e={}),e.type||(e.type=eventName),e.stopPropagation||(e.stopPropagation=stopPropagation),e.preventDefault||(e.preventDefault=preventDefault),listeners=listeners.slice();for(var i=0;listeners.length>i&&(listeners[i](e,this),!e.propagationStopped);i++);return defaultHandler&&!e.defaultPrevented?defaultHandler(e,this):void 0}},EventEmitter._signal=function(eventName,e){var listeners=(this._eventRegistry||{})[eventName];if(listeners){listeners=listeners.slice();for(var i=0;listeners.length>i;i++)listeners[i](e,this)}},EventEmitter.once=function(eventName,callback){var _self=this;callback&&this.addEventListener(eventName,function newCallback(){_self.removeEventListener(eventName,newCallback),callback.apply(null,arguments)})},EventEmitter.setDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers||(handlers=this._defaultHandlers={_disabled_:{}}),handlers[eventName]){var old=handlers[eventName],disabled=handlers._disabled_[eventName];disabled||(handlers._disabled_[eventName]=disabled=[]),disabled.push(old);var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}handlers[eventName]=callback},EventEmitter.removeDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers){var disabled=handlers._disabled_[eventName];if(handlers[eventName]==callback)handlers[eventName],disabled&&this.setDefaultHandler(eventName,disabled.pop());else if(disabled){var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}}},EventEmitter.on=EventEmitter.addEventListener=function(eventName,callback,capturing){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];return listeners||(listeners=this._eventRegistry[eventName]=[]),-1==listeners.indexOf(callback)&&listeners[capturing?"unshift":"push"](callback),callback},EventEmitter.off=EventEmitter.removeListener=EventEmitter.removeEventListener=function(eventName,callback){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];if(listeners){var index=listeners.indexOf(callback);-1!==index&&listeners.splice(index,1)}},EventEmitter.removeAllListeners=function(eventName){this._eventRegistry&&(this._eventRegistry[eventName]=[])},exports.EventEmitter=EventEmitter}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),EventEmitter=acequire("./lib/event_emitter").EventEmitter,Anchor=exports.Anchor=function(doc,row,column){this.$onChange=this.onChange.bind(this),this.attach(doc),column===void 0?this.setPosition(row.row,row.column):this.setPosition(row,column)};(function(){function $pointsInOrder(point1,point2,equalPointsInOrder){var bColIsAfter=equalPointsInOrder?point1.column<=point2.column:point1.columnthis.row)){var point=$getTransformedPoint(delta,{row:this.row,column:this.column},this.$insertRight);this.setPosition(point.row,point.column,!0)}},this.setPosition=function(row,column,noClip){var pos;if(pos=noClip?{row:row,column:column}:this.$clipPositionToDocument(row,column),this.row!=pos.row||this.column!=pos.column){var old={row:this.row,column:this.column};this.row=pos.row,this.column=pos.column,this._signal("change",{old:old,value:pos})}},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(doc){this.document=doc||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(row,column){var pos={};return row>=this.document.getLength()?(pos.row=Math.max(0,this.document.getLength()-1),pos.column=this.document.getLine(pos.row).length):0>row?(pos.row=0,pos.column=0):(pos.row=row,pos.column=Math.min(this.document.getLine(pos.row).length,Math.max(0,column))),0>column&&(pos.column=0),pos}}).call(Anchor.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),applyDelta=acequire("./apply_delta").applyDelta,EventEmitter=acequire("./lib/event_emitter").EventEmitter,Range=acequire("./range").Range,Anchor=acequire("./anchor").Anchor,Document=function(textOrLines){this.$lines=[""],0===textOrLines.length?this.$lines=[""]:Array.isArray(textOrLines)?this.insertMergedLines({row:0,column:0},textOrLines):this.insert({row:0,column:0},textOrLines)};(function(){oop.implement(this,EventEmitter),this.setValue=function(text){var len=this.getLength()-1;this.remove(new Range(0,0,len,this.getLine(len).length)),this.insert({row:0,column:0},text)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(row,column){return new Anchor(this,row,column)},this.$split=0==="aaa".split(/a/).length?function(text){return text.replace(/\\r\\n|\\r/g,"\\n").split("\\n")}:function(text){return text.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(text){var match=text.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=match?match[1]:"\\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\\r\\n";case"unix":return"\\n";default:return this.$autoNewLine||"\\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(newLineMode){this.$newLineMode!==newLineMode&&(this.$newLineMode=newLineMode,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(text){return"\\r\\n"==text||"\\r"==text||"\\n"==text},this.getLine=function(row){return this.$lines[row]||""},this.getLines=function(firstRow,lastRow){return this.$lines.slice(firstRow,lastRow+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(range){return this.getLinesForRange(range).join(this.getNewLineCharacter())},this.getLinesForRange=function(range){var lines;if(range.start.row===range.end.row)lines=[this.getLine(range.start.row).substring(range.start.column,range.end.column)];else{lines=this.getLines(range.start.row,range.end.row),lines[0]=(lines[0]||"").substring(range.start.column);var l=lines.length-1;range.end.row-range.start.row==l&&(lines[l]=lines[l].substring(0,range.end.column))}return lines},this.insertLines=function(row,lines){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(row,lines)},this.removeLines=function(firstRow,lastRow){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(firstRow,lastRow)},this.insertNewLine=function(position){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead."),this.insertMergedLines(position,["",""])},this.insert=function(position,text){return 1>=this.getLength()&&this.$detectNewLine(text),this.insertMergedLines(position,this.$split(text))},this.insertInLine=function(position,text){var start=this.clippedPos(position.row,position.column),end=this.pos(position.row,position.column+text.length);return this.applyDelta({start:start,end:end,action:"insert",lines:[text]},!0),this.clonePos(end)},this.clippedPos=function(row,column){var length=this.getLength();void 0===row?row=length:0>row?row=0:row>=length&&(row=length-1,column=void 0);var line=this.getLine(row);return void 0==column&&(column=line.length),column=Math.min(Math.max(column,0),line.length),{row:row,column:column}},this.clonePos=function(pos){return{row:pos.row,column:pos.column}},this.pos=function(row,column){return{row:row,column:column}},this.$clipPosition=function(position){var length=this.getLength();return position.row>=length?(position.row=Math.max(0,length-1),position.column=this.getLine(length-1).length):(position.row=Math.max(0,position.row),position.column=Math.min(Math.max(position.column,0),this.getLine(position.row).length)),position},this.insertFullLines=function(row,lines){row=Math.min(Math.max(row,0),this.getLength());var column=0;this.getLength()>row?(lines=lines.concat([""]),column=0):(lines=[""].concat(lines),row--,column=this.$lines[row].length),this.insertMergedLines({row:row,column:column},lines)},this.insertMergedLines=function(position,lines){var start=this.clippedPos(position.row,position.column),end={row:start.row+lines.length-1,column:(1==lines.length?start.column:0)+lines[lines.length-1].length};return this.applyDelta({start:start,end:end,action:"insert",lines:lines}),this.clonePos(end)},this.remove=function(range){var start=this.clippedPos(range.start.row,range.start.column),end=this.clippedPos(range.end.row,range.end.column);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})}),this.clonePos(start)},this.removeInLine=function(row,startColumn,endColumn){var start=this.clippedPos(row,startColumn),end=this.clippedPos(row,endColumn);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})},!0),this.clonePos(start)},this.removeFullLines=function(firstRow,lastRow){firstRow=Math.min(Math.max(0,firstRow),this.getLength()-1),lastRow=Math.min(Math.max(0,lastRow),this.getLength()-1);var deleteFirstNewLine=lastRow==this.getLength()-1&&firstRow>0,deleteLastNewLine=this.getLength()-1>lastRow,startRow=deleteFirstNewLine?firstRow-1:firstRow,startCol=deleteFirstNewLine?this.getLine(startRow).length:0,endRow=deleteLastNewLine?lastRow+1:lastRow,endCol=deleteLastNewLine?0:this.getLine(endRow).length,range=new Range(startRow,startCol,endRow,endCol),deletedLines=this.$lines.slice(firstRow,lastRow+1);return this.applyDelta({start:range.start,end:range.end,action:"remove",lines:this.getLinesForRange(range)}),deletedLines},this.removeNewLine=function(row){this.getLength()-1>row&&row>=0&&this.applyDelta({start:this.pos(row,this.getLine(row).length),end:this.pos(row+1,0),action:"remove",lines:["",""]})},this.replace=function(range,text){if(range instanceof Range||(range=Range.fromPoints(range.start,range.end)),0===text.length&&range.isEmpty())return range.start;if(text==this.getTextRange(range))return range.end;this.remove(range);var end;return end=text?this.insert(range.start,text):range.start},this.applyDeltas=function(deltas){for(var i=0;deltas.length>i;i++)this.applyDelta(deltas[i])},this.revertDeltas=function(deltas){for(var i=deltas.length-1;i>=0;i--)this.revertDelta(deltas[i])},this.applyDelta=function(delta,doNotValidate){var isInsert="insert"==delta.action;(isInsert?1>=delta.lines.length&&!delta.lines[0]:!Range.comparePoints(delta.start,delta.end))||(isInsert&&delta.lines.length>2e4&&this.$splitAndapplyLargeDelta(delta,2e4),applyDelta(this.$lines,delta,doNotValidate),this._signal("change",delta))},this.$splitAndapplyLargeDelta=function(delta,MAX){for(var lines=delta.lines,l=lines.length,row=delta.start.row,column=delta.start.column,from=0,to=0;;){from=to,to+=MAX-1;var chunk=lines.slice(from,to);if(to>l){delta.lines=chunk,delta.start.row=row+from,delta.start.column=column;break}chunk.push(""),this.applyDelta({start:this.pos(row+from,column),end:this.pos(row+to,column=0),action:delta.action,lines:chunk},!0)}},this.revertDelta=function(delta){this.applyDelta({start:this.clonePos(delta.start),end:this.clonePos(delta.end),action:"insert"==delta.action?"remove":"insert",lines:delta.lines.slice()})},this.indexToPosition=function(index,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,i=startRow||0,l=lines.length;l>i;i++)if(index-=lines[i].length+newlineLength,0>index)return{row:i,column:index+lines[i].length+newlineLength};return{row:l-1,column:lines[l-1].length}},this.positionToIndex=function(pos,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,index=0,row=Math.min(pos.row,lines.length),i=startRow||0;row>i;++i)index+=lines[i].length+newlineLength;return index+pos.column}}).call(Document.prototype),exports.Document=Document}),ace.define("ace/lib/lang",["require","exports","module"],function(acequire,exports){"use strict";exports.last=function(a){return a[a.length-1]},exports.stringReverse=function(string){return string.split("").reverse().join("")},exports.stringRepeat=function(string,count){for(var result="";count>0;)1&count&&(result+=string),(count>>=1)&&(string+=string);return result};var trimBeginRegexp=/^\\s\\s*/,trimEndRegexp=/\\s\\s*$/;exports.stringTrimLeft=function(string){return string.replace(trimBeginRegexp,"")},exports.stringTrimRight=function(string){return string.replace(trimEndRegexp,"")},exports.copyObject=function(obj){var copy={};for(var key in obj)copy[key]=obj[key];return copy},exports.copyArray=function(array){for(var copy=[],i=0,l=array.length;l>i;i++)copy[i]=array[i]&&"object"==typeof array[i]?this.copyObject(array[i]):array[i];return copy},exports.deepCopy=function deepCopy(obj){if("object"!=typeof obj||!obj)return obj;var copy;if(Array.isArray(obj)){copy=[];for(var key=0;obj.length>key;key++)copy[key]=deepCopy(obj[key]);return copy}if("[object Object]"!==Object.prototype.toString.call(obj))return obj;copy={};for(var key in obj)copy[key]=deepCopy(obj[key]);return copy},exports.arrayToMap=function(arr){for(var map={},i=0;arr.length>i;i++)map[arr[i]]=1;return map},exports.createMap=function(props){var map=Object.create(null);for(var i in props)map[i]=props[i];return map},exports.arrayRemove=function(array,value){for(var i=0;array.length>=i;i++)value===array[i]&&array.splice(i,1)},exports.escapeRegExp=function(str){return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,"\\\\$1")},exports.escapeHTML=function(str){return str.replace(/&/g,"&").replace(/"/g,""").replace(/\'/g,"'").replace(/i;i+=2){if(Array.isArray(data[i+1]))var d={action:"insert",start:data[i],lines:data[i+1]};else var d={action:"remove",start:data[i],end:data[i+1]};doc.applyDelta(d,!0)}return _self.$timeout?deferredUpdate.schedule(_self.$timeout):(_self.onUpdate(),void 0)})};(function(){this.$timeout=500,this.setTimeout=function(timeout){this.$timeout=timeout},this.setValue=function(value){this.doc.setValue(value),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(callbackId){this.sender.callback(this.doc.getValue(),callbackId)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(Mirror.prototype)}),ace.define("ace/mode/javascript/jshint",["require","exports","module"],function(acequire,exports,module){module.exports=function outer(modules,cache,entry){function newRequire(name,jumped){if(!cache[name]){if(!modules[name]){var currentRequire="function"==typeof acequire&&acequire;if(!jumped&¤tRequire)return currentRequire(name,!0);if(previousRequire)return previousRequire(name,!0);var err=Error("Cannot find module \'"+name+"\'");throw err.code="MODULE_NOT_FOUND",err}var m=cache[name]={exports:{}};modules[name][0].call(m.exports,function(x){var id=modules[name][1][x];return newRequire(id?id:x)},m,m.exports,outer,modules,cache,entry)}return cache[name].exports}for(var previousRequire="function"==typeof acequire&&acequire,i=0;entry.length>i;i++)newRequire(entry[i]);return newRequire(entry[0])}({"/node_modules/browserify/node_modules/events/events.js":[function(_dereq_,module){function EventEmitter(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function isFunction(arg){return"function"==typeof arg}function isNumber(arg){return"number"==typeof arg}function isObject(arg){return"object"==typeof arg&&null!==arg}function isUndefined(arg){return void 0===arg}module.exports=EventEmitter,EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||0>n||isNaN(n))throw TypeError("n must be a positive number");return this._maxListeners=n,this},EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(this._events||(this._events={}),"error"===type&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if(er=arguments[1],er instanceof Error)throw er;throw TypeError(\'Uncaught, unspecified "error" event.\')}if(handler=this._events[type],isUndefined(handler))return!1;if(isFunction(handler))switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:for(len=arguments.length,args=Array(len-1),i=1;len>i;i++)args[i-1]=arguments[i];handler.apply(this,args)}else if(isObject(handler)){for(len=arguments.length,args=Array(len-1),i=1;len>i;i++)args[i-1]=arguments[i];for(listeners=handler.slice(),len=listeners.length,i=0;len>i;i++)listeners[i].apply(this,args)}return!0},EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",type,isFunction(listener.listener)?listener.listener:listener),this._events[type]?isObject(this._events[type])?this._events[type].push(listener):this._events[type]=[this._events[type],listener]:this._events[type]=listener,isObject(this._events[type])&&!this._events[type].warned){var m;m=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners,m&&m>0&&this._events[type].length>m&&(this._events[type].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[type].length),"function"==typeof console.trace&&console.trace())}return this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(type,listener){function g(){this.removeListener(type,g),fired||(fired=!0,listener.apply(this,arguments))}if(!isFunction(listener))throw TypeError("listener must be a function");var fired=!1;return g.listener=listener,this.on(type,g),this},EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;if(list=this._events[type],length=list.length,position=-1,list===listener||isFunction(list.listener)&&list.listener===listener)delete this._events[type],this._events.removeListener&&this.emit("removeListener",type,listener);else if(isObject(list)){for(i=length;i--\x3e0;)if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}if(0>position)return this;1===list.length?(list.length=0,delete this._events[type]):list.splice(position,1),this._events.removeListener&&this.emit("removeListener",type,listener)}return this},EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[type]&&delete this._events[type],this;if(0===arguments.length){for(key in this._events)"removeListener"!==key&&this.removeAllListeners(key);return this.removeAllListeners("removeListener"),this._events={},this\n}if(listeners=this._events[type],isFunction(listeners))this.removeListener(type,listeners);else for(;listeners.length;)this.removeListener(type,listeners[listeners.length-1]);return delete this._events[type],this},EventEmitter.prototype.listeners=function(type){var ret;return ret=this._events&&this._events[type]?isFunction(this._events[type])?[this._events[type]]:this._events[type].slice():[]},EventEmitter.listenerCount=function(emitter,type){var ret;return ret=emitter._events&&emitter._events[type]?isFunction(emitter._events[type])?1:emitter._events[type].length:0}},{}],"/node_modules/jshint/data/ascii-identifier-data.js":[function(_dereq_,module){for(var identifierStartTable=[],i=0;128>i;i++)identifierStartTable[i]=36===i||i>=65&&90>=i||95===i||i>=97&&122>=i;for(var identifierPartTable=[],i=0;128>i;i++)identifierPartTable[i]=identifierStartTable[i]||i>=48&&57>=i;module.exports={asciiIdentifierStartTable:identifierStartTable,asciiIdentifierPartTable:identifierPartTable}},{}],"/node_modules/jshint/lodash.js":[function(_dereq_,module,exports){(function(global){(function(){function baseFindIndex(array,predicate,fromRight){for(var length=array.length,index=fromRight?length:-1;fromRight?index--:length>++index;)if(predicate(array[index],index,array))return index;return-1}function baseIndexOf(array,value,fromIndex){if(value!==value)return indexOfNaN(array,fromIndex);for(var index=fromIndex-1,length=array.length;length>++index;)if(array[index]===value)return index;return-1}function baseIsFunction(value){return"function"==typeof value||!1}function baseToString(value){return"string"==typeof value?value:null==value?"":value+""}function indexOfNaN(array,fromIndex,fromRight){for(var length=array.length,index=fromIndex+(fromRight?0:-1);fromRight?index--:length>++index;){var other=array[index];if(other!==other)return index}return-1}function isObjectLike(value){return!!value&&"object"==typeof value}function lodash(){}function arrayCopy(source,array){var index=-1,length=source.length;for(array||(array=Array(length));length>++index;)array[index]=source[index];return array}function arrayEach(array,iteratee){for(var index=-1,length=array.length;length>++index&&iteratee(array[index],index,array)!==!1;);return array}function arrayFilter(array,predicate){for(var index=-1,length=array.length,resIndex=-1,result=[];length>++index;){var value=array[index];predicate(value,index,array)&&(result[++resIndex]=value)}return result}function arrayMap(array,iteratee){for(var index=-1,length=array.length,result=Array(length);length>++index;)result[index]=iteratee(array[index],index,array);return result}function arrayMax(array){for(var index=-1,length=array.length,result=NEGATIVE_INFINITY;length>++index;){var value=array[index];value>result&&(result=value)}return result}function arraySome(array,predicate){for(var index=-1,length=array.length;length>++index;)if(predicate(array[index],index,array))return!0;return!1}function assignWith(object,source,customizer){var props=keys(source);push.apply(props,getSymbols(source));for(var index=-1,length=props.length;length>++index;){var key=props[index],value=object[key],result=customizer(value,source[key],key,object,source);(result===result?result===value:value!==value)&&(value!==undefined||key in object)||(object[key]=result)}return object}function baseCopy(source,props,object){object||(object={});for(var index=-1,length=props.length;length>++index;){var key=props[index];object[key]=source[key]}return object}function baseCallback(func,thisArg,argCount){var type=typeof func;return"function"==type?thisArg===undefined?func:bindCallback(func,thisArg,argCount):null==func?identity:"object"==type?baseMatches(func):thisArg===undefined?property(func):baseMatchesProperty(func,thisArg)}function baseClone(value,isDeep,customizer,key,object,stackA,stackB){var result;if(customizer&&(result=object?customizer(value,key,object):customizer(value)),result!==undefined)return result;if(!isObject(value))return value;var isArr=isArray(value);if(isArr){if(result=initCloneArray(value),!isDeep)return arrayCopy(value,result)}else{var tag=objToString.call(value),isFunc=tag==funcTag;if(tag!=objectTag&&tag!=argsTag&&(!isFunc||object))return cloneableTags[tag]?initCloneByTag(value,tag,isDeep):object?value:{};if(result=initCloneObject(isFunc?{}:value),!isDeep)return baseAssign(result,value)}stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==value)return stackB[length];return stackA.push(value),stackB.push(result),(isArr?arrayEach:baseForOwn)(value,function(subValue,key){result[key]=baseClone(subValue,isDeep,customizer,key,value,stackA,stackB)}),result}function baseFilter(collection,predicate){var result=[];return baseEach(collection,function(value,index,collection){predicate(value,index,collection)&&result.push(value)}),result}function baseForIn(object,iteratee){return baseFor(object,iteratee,keysIn)}function baseForOwn(object,iteratee){return baseFor(object,iteratee,keys)}function baseGet(object,path,pathKey){if(null!=object){pathKey!==undefined&&pathKey in toObject(object)&&(path=[pathKey]);for(var index=-1,length=path.length;null!=object&&length>++index;)var result=object=object[path[index]];return result}}function baseIsEqual(value,other,customizer,isLoose,stackA,stackB){if(value===other)return 0!==value||1/value==1/other;var valType=typeof value,othType=typeof other;return"function"!=valType&&"object"!=valType&&"function"!=othType&&"object"!=othType||null==value||null==other?value!==value&&other!==other:baseIsEqualDeep(value,other,baseIsEqual,customizer,isLoose,stackA,stackB)}function baseIsEqualDeep(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=arrayTag,othTag=arrayTag;objIsArr||(objTag=objToString.call(object),objTag==argsTag?objTag=objectTag:objTag!=objectTag&&(objIsArr=isTypedArray(object))),othIsArr||(othTag=objToString.call(other),othTag==argsTag?othTag=objectTag:othTag!=objectTag&&(othIsArr=isTypedArray(other)));var objIsObj=objTag==objectTag,othIsObj=othTag==objectTag,isSameTag=objTag==othTag;if(isSameTag&&!objIsArr&&!objIsObj)return equalByTag(object,other,objTag);if(!isLoose){var valWrapped=objIsObj&&hasOwnProperty.call(object,"__wrapped__"),othWrapped=othIsObj&&hasOwnProperty.call(other,"__wrapped__");if(valWrapped||othWrapped)return equalFunc(valWrapped?object.value():object,othWrapped?other.value():other,customizer,isLoose,stackA,stackB)}if(!isSameTag)return!1;stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==object)return stackB[length]==other;stackA.push(object),stackB.push(other);var result=(objIsArr?equalArrays:equalObjects)(object,other,equalFunc,customizer,isLoose,stackA,stackB);return stackA.pop(),stackB.pop(),result}function baseIsMatch(object,props,values,strictCompareFlags,customizer){for(var index=-1,length=props.length,noCustomizer=!customizer;length>++index;)if(noCustomizer&&strictCompareFlags[index]?values[index]!==object[props[index]]:!(props[index]in object))return!1;for(index=-1;length>++index;){var key=props[index],objValue=object[key],srcValue=values[index];if(noCustomizer&&strictCompareFlags[index])var result=objValue!==undefined||key in object;else result=customizer?customizer(objValue,srcValue,key):undefined,result===undefined&&(result=baseIsEqual(srcValue,objValue,customizer,!0));if(!result)return!1}return!0}function baseMatches(source){var props=keys(source),length=props.length;if(!length)return constant(!0);if(1==length){var key=props[0],value=source[key];if(isStrictComparable(value))return function(object){return null==object?!1:object[key]===value&&(value!==undefined||key in toObject(object))}}for(var values=Array(length),strictCompareFlags=Array(length);length--;)value=source[props[length]],values[length]=value,strictCompareFlags[length]=isStrictComparable(value);return function(object){return null!=object&&baseIsMatch(toObject(object),props,values,strictCompareFlags)}}function baseMatchesProperty(path,value){var isArr=isArray(path),isCommon=isKey(path)&&isStrictComparable(value),pathKey=path+"";return path=toPath(path),function(object){if(null==object)return!1;var key=pathKey;if(object=toObject(object),!(!isArr&&isCommon||key in object)){if(object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),null==object)return!1;key=last(path),object=toObject(object)}return object[key]===value?value!==undefined||key in object:baseIsEqual(value,object[key],null,!0)}}function baseMerge(object,source,customizer,stackA,stackB){if(!isObject(object))return object;var isSrcArr=isLength(source.length)&&(isArray(source)||isTypedArray(source));if(!isSrcArr){var props=keys(source);push.apply(props,getSymbols(source))}return arrayEach(props||source,function(srcValue,key){if(props&&(key=srcValue,srcValue=source[key]),isObjectLike(srcValue))stackA||(stackA=[]),stackB||(stackB=[]),baseMergeDeep(object,source,key,baseMerge,customizer,stackA,stackB);else{var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue),!isSrcArr&&result===undefined||!isCommon&&(result===result?result===value:value!==value)||(object[key]=result)}}),object}function baseMergeDeep(object,source,key,mergeFunc,customizer,stackA,stackB){for(var length=stackA.length,srcValue=source[key];length--;)if(stackA[length]==srcValue)return object[key]=stackB[length],undefined;var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue,isLength(srcValue.length)&&(isArray(srcValue)||isTypedArray(srcValue))?result=isArray(value)?value:getLength(value)?arrayCopy(value):[]:isPlainObject(srcValue)||isArguments(srcValue)?result=isArguments(value)?toPlainObject(value):isPlainObject(value)?value:{}:isCommon=!1),stackA.push(srcValue),stackB.push(result),isCommon?object[key]=mergeFunc(result,srcValue,customizer,stackA,stackB):(result===result?result!==value:value===value)&&(object[key]=result)}function baseProperty(key){return function(object){return null==object?undefined:object[key]}}function basePropertyDeep(path){var pathKey=path+"";return path=toPath(path),function(object){return baseGet(object,path,pathKey)}}function baseSlice(array,start,end){var index=-1,length=array.length;start=null==start?0:+start||0,0>start&&(start=-start>length?0:length+start),end=end===undefined||end>length?length:+end||0,0>end&&(end+=length),length=start>end?0:end-start>>>0,start>>>=0;for(var result=Array(length);length>++index;)result[index]=array[index+start];return result}function baseSome(collection,predicate){var result;return baseEach(collection,function(value,index,collection){return result=predicate(value,index,collection),!result}),!!result}function baseValues(object,props){for(var index=-1,length=props.length,result=Array(length);length>++index;)result[index]=object[props[index]];return result}function binaryIndex(array,value,retHighest){var low=0,high=array?array.length:low;if("number"==typeof value&&value===value&&HALF_MAX_ARRAY_LENGTH>=high){for(;high>low;){var mid=low+high>>>1,computed=array[mid];(retHighest?value>=computed:value>computed)?low=mid+1:high=mid}return high}return binaryIndexBy(array,value,identity,retHighest)}function binaryIndexBy(array,value,iteratee,retHighest){value=iteratee(value);for(var low=0,high=array?array.length:0,valIsNaN=value!==value,valIsUndef=value===undefined;high>low;){var mid=floor((low+high)/2),computed=iteratee(array[mid]),isReflexive=computed===computed;if(valIsNaN)var setLow=isReflexive||retHighest;else setLow=valIsUndef?isReflexive&&(retHighest||computed!==undefined):retHighest?value>=computed:value>computed;setLow?low=mid+1:high=mid}return nativeMin(high,MAX_ARRAY_INDEX)}function bindCallback(func,thisArg,argCount){if("function"!=typeof func)return identity;if(thisArg===undefined)return func;switch(argCount){case 1:return function(value){return func.call(thisArg,value)};case 3:return function(value,index,collection){return func.call(thisArg,value,index,collection)};case 4:return function(accumulator,value,index,collection){return func.call(thisArg,accumulator,value,index,collection)};case 5:return function(value,other,key,object,source){return func.call(thisArg,value,other,key,object,source)}}return function(){return func.apply(thisArg,arguments)}}function bufferClone(buffer){return bufferSlice.call(buffer,0)}function createAssigner(assigner){return restParam(function(object,sources){var index=-1,length=null==object?0:sources.length,customizer=length>2&&sources[length-2],guard=length>2&&sources[2],thisArg=length>1&&sources[length-1];for("function"==typeof customizer?(customizer=bindCallback(customizer,thisArg,5),length-=2):(customizer="function"==typeof thisArg?thisArg:null,length-=customizer?1:0),guard&&isIterateeCall(sources[0],sources[1],guard)&&(customizer=3>length?null:customizer,length=1);length>++index;){var source=sources[index];source&&assigner(object,source,customizer)}return object})}function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){var length=collection?getLength(collection):0;if(!isLength(length))return eachFunc(collection,iteratee);for(var index=fromRight?length:-1,iterable=toObject(collection);(fromRight?index--:length>++index)&&iteratee(iterable[index],index,iterable)!==!1;);return collection}}function createBaseFor(fromRight){return function(object,iteratee,keysFunc){for(var iterable=toObject(object),props=keysFunc(object),length=props.length,index=fromRight?length:-1;fromRight?index--:length>++index;){var key=props[index];if(iteratee(iterable[key],key,iterable)===!1)break}return object}}function createFindIndex(fromRight){return function(array,predicate,thisArg){return array&&array.length?(predicate=getCallback(predicate,thisArg,3),baseFindIndex(array,predicate,fromRight)):-1}}function createForEach(arrayFunc,eachFunc){return function(collection,iteratee,thisArg){return"function"==typeof iteratee&&thisArg===undefined&&isArray(collection)?arrayFunc(collection,iteratee):eachFunc(collection,bindCallback(iteratee,thisArg,3))}}function equalArrays(array,other,equalFunc,customizer,isLoose,stackA,stackB){var index=-1,arrLength=array.length,othLength=other.length,result=!0;if(arrLength!=othLength&&!(isLoose&&othLength>arrLength))return!1;for(;result&&arrLength>++index;){var arrValue=array[index],othValue=other[index];if(result=undefined,customizer&&(result=isLoose?customizer(othValue,arrValue,index):customizer(arrValue,othValue,index)),result===undefined)if(isLoose)for(var othIndex=othLength;othIndex--&&(othValue=other[othIndex],!(result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB))););else result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB)}return!!result}function equalByTag(object,other,tag){switch(tag){case boolTag:case dateTag:return+object==+other;case errorTag:return object.name==other.name&&object.message==other.message;case numberTag:return object!=+object?other!=+other:0==object?1/object==1/other:object==+other;case regexpTag:case stringTag:return object==other+""}return!1}function equalObjects(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objProps=keys(object),objLength=objProps.length,othProps=keys(other),othLength=othProps.length;if(objLength!=othLength&&!isLoose)return!1;for(var skipCtor=isLoose,index=-1;objLength>++index;){var key=objProps[index],result=isLoose?key in other:hasOwnProperty.call(other,key);if(result){var objValue=object[key],othValue=other[key];result=undefined,customizer&&(result=isLoose?customizer(othValue,objValue,key):customizer(objValue,othValue,key)),result===undefined&&(result=objValue&&objValue===othValue||equalFunc(objValue,othValue,customizer,isLoose,stackA,stackB))}if(!result)return!1;skipCtor||(skipCtor="constructor"==key)}if(!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;if(objCtor!=othCtor&&"constructor"in object&&"constructor"in other&&!("function"==typeof objCtor&&objCtor instanceof objCtor&&"function"==typeof othCtor&&othCtor instanceof othCtor))return!1}return!0}function getCallback(func,thisArg,argCount){var result=lodash.callback||callback;return result=result===callback?baseCallback:result,argCount?result(func,thisArg,argCount):result}function getIndexOf(collection,target,fromIndex){var result=lodash.indexOf||indexOf;return result=result===indexOf?baseIndexOf:result,collection?result(collection,target,fromIndex):result}function initCloneArray(array){var length=array.length,result=new array.constructor(length);return length&&"string"==typeof array[0]&&hasOwnProperty.call(array,"index")&&(result.index=array.index,result.input=array.input),result}function initCloneObject(object){var Ctor=object.constructor;return"function"==typeof Ctor&&Ctor instanceof Ctor||(Ctor=Object),new Ctor}function initCloneByTag(object,tag,isDeep){var Ctor=object.constructor;switch(tag){case arrayBufferTag:return bufferClone(object);case boolTag:case dateTag:return new Ctor(+object);case float32Tag:case float64Tag:case int8Tag:case int16Tag:case int32Tag:case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:var buffer=object.buffer;return new Ctor(isDeep?bufferClone(buffer):buffer,object.byteOffset,object.length);case numberTag:case stringTag:return new Ctor(object);case regexpTag:var result=new Ctor(object.source,reFlags.exec(object));result.lastIndex=object.lastIndex}return result}function isIndex(value,length){return value=+value,length=null==length?MAX_SAFE_INTEGER:length,value>-1&&0==value%1&&length>value}function isIterateeCall(value,index,object){if(!isObject(object))return!1;var type=typeof index;if("number"==type)var length=getLength(object),prereq=isLength(length)&&isIndex(index,length);else prereq="string"==type&&index in object;if(prereq){var other=object[index];return value===value?value===other:other!==other}return!1}function isKey(value,object){var type=typeof value;if("string"==type&&reIsPlainProp.test(value)||"number"==type)return!0;if(isArray(value))return!1;var result=!reIsDeepProp.test(value);return result||null!=object&&value in toObject(object)}function isLength(value){return"number"==typeof value&&value>-1&&0==value%1&&MAX_SAFE_INTEGER>=value}function isStrictComparable(value){return value===value&&(0===value?1/value>0:!isObject(value))}function shimIsPlainObject(value){var Ctor;if(lodash.support,!isObjectLike(value)||objToString.call(value)!=objectTag||!hasOwnProperty.call(value,"constructor")&&(Ctor=value.constructor,"function"==typeof Ctor&&!(Ctor instanceof Ctor)))return!1;var result;return baseForIn(value,function(subValue,key){result=key}),result===undefined||hasOwnProperty.call(value,result)}function shimKeys(object){for(var props=keysIn(object),propsLength=props.length,length=propsLength&&object.length,support=lodash.support,allowIndexes=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object)),index=-1,result=[];propsLength>++index;){var key=props[index];(allowIndexes&&isIndex(key,length)||hasOwnProperty.call(object,key))&&result.push(key)}return result}function toObject(value){return isObject(value)?value:Object(value)}function toPath(value){if(isArray(value))return value;var result=[];return baseToString(value).replace(rePropName,function(match,number,quote,string){result.push(quote?string.replace(reEscapeChar,"$1"):number||match)}),result}function indexOf(array,value,fromIndex){var length=array?array.length:0;if(!length)return-1;if("number"==typeof fromIndex)fromIndex=0>fromIndex?nativeMax(length+fromIndex,0):fromIndex;else if(fromIndex){var index=binaryIndex(array,value),other=array[index];return(value===value?value===other:other!==other)?index:-1}return baseIndexOf(array,value,fromIndex||0)}function last(array){var length=array?array.length:0;return length?array[length-1]:undefined}function slice(array,start,end){var length=array?array.length:0;return length?(end&&"number"!=typeof end&&isIterateeCall(array,start,end)&&(start=0,end=length),baseSlice(array,start,end)):[]}function unzip(array){for(var index=-1,length=(array&&array.length&&arrayMax(arrayMap(array,getLength)))>>>0,result=Array(length);length>++index;)result[index]=arrayMap(array,baseProperty(index));return result}function includes(collection,target,fromIndex,guard){var length=collection?getLength(collection):0;return isLength(length)||(collection=values(collection),length=collection.length),length?(fromIndex="number"!=typeof fromIndex||guard&&isIterateeCall(target,fromIndex,guard)?0:0>fromIndex?nativeMax(length+fromIndex,0):fromIndex||0,"string"==typeof collection||!isArray(collection)&&isString(collection)?length>fromIndex&&collection.indexOf(target,fromIndex)>-1:getIndexOf(collection,target,fromIndex)>-1):!1}function reject(collection,predicate,thisArg){var func=isArray(collection)?arrayFilter:baseFilter;return predicate=getCallback(predicate,thisArg,3),func(collection,function(value,index,collection){return!predicate(value,index,collection)})}function some(collection,predicate,thisArg){var func=isArray(collection)?arraySome:baseSome;return thisArg&&isIterateeCall(collection,predicate,thisArg)&&(predicate=null),("function"!=typeof predicate||thisArg!==undefined)&&(predicate=getCallback(predicate,thisArg,3)),func(collection,predicate)}function restParam(func,start){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return start=nativeMax(start===undefined?func.length-1:+start||0,0),function(){for(var args=arguments,index=-1,length=nativeMax(args.length-start,0),rest=Array(length);length>++index;)rest[index]=args[start+index];switch(start){case 0:return func.call(this,rest);case 1:return func.call(this,args[0],rest);case 2:return func.call(this,args[0],args[1],rest)}var otherArgs=Array(start+1);for(index=-1;start>++index;)otherArgs[index]=args[index];return otherArgs[start]=rest,func.apply(this,otherArgs)}}function clone(value,isDeep,customizer,thisArg){return isDeep&&"boolean"!=typeof isDeep&&isIterateeCall(value,isDeep,customizer)?isDeep=!1:"function"==typeof isDeep&&(thisArg=customizer,customizer=isDeep,isDeep=!1),customizer="function"==typeof customizer&&bindCallback(customizer,thisArg,1),baseClone(value,isDeep,customizer)}function isArguments(value){var length=isObjectLike(value)?value.length:undefined;return isLength(length)&&objToString.call(value)==argsTag}function isEmpty(value){if(null==value)return!0;var length=getLength(value);return isLength(length)&&(isArray(value)||isString(value)||isArguments(value)||isObjectLike(value)&&isFunction(value.splice))?!length:!keys(value).length}function isObject(value){var type=typeof value;return"function"==type||!!value&&"object"==type}function isNative(value){return null==value?!1:objToString.call(value)==funcTag?reIsNative.test(fnToString.call(value)):isObjectLike(value)&&reIsHostCtor.test(value)}function isNumber(value){return"number"==typeof value||isObjectLike(value)&&objToString.call(value)==numberTag}function isString(value){return"string"==typeof value||isObjectLike(value)&&objToString.call(value)==stringTag}function isTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[objToString.call(value)]}function toPlainObject(value){return baseCopy(value,keysIn(value))}function has(object,path){if(null==object)return!1;var result=hasOwnProperty.call(object,path);return result||isKey(path)||(path=toPath(path),object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),path=last(path),result=null!=object&&hasOwnProperty.call(object,path)),result}function keysIn(object){if(null==object)return[];isObject(object)||(object=Object(object));var length=object.length;length=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object))&&length||0;for(var Ctor=object.constructor,index=-1,isProto="function"==typeof Ctor&&Ctor.prototype===object,result=Array(length),skipIndexes=length>0;length>++index;)result[index]=index+"";for(var key in object)skipIndexes&&isIndex(key,length)||"constructor"==key&&(isProto||!hasOwnProperty.call(object,key))||result.push(key);return result}function values(object){return baseValues(object,keys(object))}function escapeRegExp(string){return string=baseToString(string),string&&reHasRegExpChars.test(string)?string.replace(reRegExpChars,"\\\\$&"):string}function callback(func,thisArg,guard){return guard&&isIterateeCall(func,thisArg,guard)&&(thisArg=null),baseCallback(func,thisArg)}function constant(value){return function(){return value}}function identity(value){return value}function property(path){return isKey(path)?baseProperty(path):basePropertyDeep(path)}var undefined,VERSION="3.7.0",FUNC_ERROR_TEXT="Expected a function",argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag="[object Function]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag="[object ArrayBuffer]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",reIsDeepProp=/\\.|\\[(?:[^[\\]]+|(["\'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?)\\1\\]/,reIsPlainProp=/^\\w*$/,rePropName=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|(["\'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g,reRegExpChars=/[.*+?^${}()|[\\]\\/\\\\]/g,reHasRegExpChars=RegExp(reRegExpChars.source),reEscapeChar=/\\\\(\\\\)?/g,reFlags=/\\w*$/,reIsHostCtor=/^\\[object .+?Constructor\\]$/,typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[stringTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=!0,cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[mapTag]=cloneableTags[setTag]=cloneableTags[weakMapTag]=!1;var objectTypes={"function":!0,object:!0},freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports,freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module,freeGlobal=freeExports&&freeModule&&"object"==typeof global&&global&&global.Object&&global,freeSelf=objectTypes[typeof self]&&self&&self.Object&&self,freeWindow=objectTypes[typeof window]&&window&&window.Object&&window,moduleExports=freeModule&&freeModule.exports===freeExports&&freeExports,root=freeGlobal||freeWindow!==(this&&this.window)&&freeWindow||freeSelf||this,arrayProto=Array.prototype,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+escapeRegExp(objToString).replace(/toString|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,"$1.*?")+"$"),ArrayBuffer=isNative(ArrayBuffer=root.ArrayBuffer)&&ArrayBuffer,bufferSlice=isNative(bufferSlice=ArrayBuffer&&new ArrayBuffer(0).slice)&&bufferSlice,floor=Math.floor,getOwnPropertySymbols=isNative(getOwnPropertySymbols=Object.getOwnPropertySymbols)&&getOwnPropertySymbols,getPrototypeOf=isNative(getPrototypeOf=Object.getPrototypeOf)&&getPrototypeOf,push=arrayProto.push,preventExtensions=isNative(Object.preventExtensions=Object.preventExtensions)&&preventExtensions,propertyIsEnumerable=objectProto.propertyIsEnumerable,Uint8Array=isNative(Uint8Array=root.Uint8Array)&&Uint8Array,Float64Array=function(){try{var func=isNative(func=root.Float64Array)&&func,result=new func(new ArrayBuffer(10),0,1)&&func}catch(e){}return result}(),nativeAssign=function(){var object={1:0},func=preventExtensions&&isNative(func=Object.assign)&&func;try{func(preventExtensions(object),"xo")}catch(e){}return!object[1]&&func}(),nativeIsArray=isNative(nativeIsArray=Array.isArray)&&nativeIsArray,nativeKeys=isNative(nativeKeys=Object.keys)&&nativeKeys,nativeMax=Math.max,nativeMin=Math.min,NEGATIVE_INFINITY=Number.NEGATIVE_INFINITY,MAX_ARRAY_LENGTH=Math.pow(2,32)-1,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1,FLOAT64_BYTES_PER_ELEMENT=Float64Array?Float64Array.BYTES_PER_ELEMENT:0,MAX_SAFE_INTEGER=Math.pow(2,53)-1,support=lodash.support={};(function(x){var Ctor=function(){this.x=x},props=[];Ctor.prototype={valueOf:x,y:x};for(var key in new Ctor)props.push(key);support.funcDecomp=/\\bthis\\b/.test(function(){return this}),support.funcNames="string"==typeof Function.name;try{support.nonEnumArgs=!propertyIsEnumerable.call(arguments,1)}catch(e){support.nonEnumArgs=!0}})(1,0);var baseAssign=nativeAssign||function(object,source){return null==source?object:baseCopy(source,getSymbols(source),baseCopy(source,keys(source),object))},baseEach=createBaseEach(baseForOwn),baseFor=createBaseFor();bufferSlice||(bufferClone=ArrayBuffer&&Uint8Array?function(buffer){var byteLength=buffer.byteLength,floatLength=Float64Array?floor(byteLength/FLOAT64_BYTES_PER_ELEMENT):0,offset=floatLength*FLOAT64_BYTES_PER_ELEMENT,result=new ArrayBuffer(byteLength);if(floatLength){var view=new Float64Array(result,0,floatLength);view.set(new Float64Array(buffer,0,floatLength))}return byteLength!=offset&&(view=new Uint8Array(result,offset),view.set(new Uint8Array(buffer,offset))),result}:constant(null));var getLength=baseProperty("length"),getSymbols=getOwnPropertySymbols?function(object){return getOwnPropertySymbols(toObject(object))}:constant([]),findLastIndex=createFindIndex(!0),zip=restParam(unzip),forEach=createForEach(arrayEach,baseEach),isArray=nativeIsArray||function(value){return isObjectLike(value)&&isLength(value.length)&&objToString.call(value)==arrayTag},isFunction=baseIsFunction(/x/)||Uint8Array&&!baseIsFunction(Uint8Array)?function(value){return objToString.call(value)==funcTag}:baseIsFunction,isPlainObject=getPrototypeOf?function(value){if(!value||objToString.call(value)!=objectTag)return!1;var valueOf=value.valueOf,objProto=isNative(valueOf)&&(objProto=getPrototypeOf(valueOf))&&getPrototypeOf(objProto);return objProto?value==objProto||getPrototypeOf(value)==objProto:shimIsPlainObject(value)}:shimIsPlainObject,assign=createAssigner(function(object,source,customizer){return customizer?assignWith(object,source,customizer):baseAssign(object,source)}),keys=nativeKeys?function(object){if(object)var Ctor=object.constructor,length=object.length;return"function"==typeof Ctor&&Ctor.prototype===object||"function"!=typeof object&&isLength(length)?shimKeys(object):isObject(object)?nativeKeys(object):[]}:shimKeys,merge=createAssigner(baseMerge);lodash.assign=assign,lodash.callback=callback,lodash.constant=constant,lodash.forEach=forEach,lodash.keys=keys,lodash.keysIn=keysIn,lodash.merge=merge,lodash.property=property,lodash.reject=reject,lodash.restParam=restParam,lodash.slice=slice,lodash.toPlainObject=toPlainObject,lodash.unzip=unzip,lodash.values=values,lodash.zip=zip,lodash.each=forEach,lodash.extend=assign,lodash.iteratee=callback,lodash.clone=clone,lodash.escapeRegExp=escapeRegExp,lodash.findLastIndex=findLastIndex,lodash.has=has,lodash.identity=identity,lodash.includes=includes,lodash.indexOf=indexOf,lodash.isArguments=isArguments,lodash.isArray=isArray,lodash.isEmpty=isEmpty,lodash.isFunction=isFunction,lodash.isNative=isNative,lodash.isNumber=isNumber,lodash.isObject=isObject,lodash.isPlainObject=isPlainObject,lodash.isString=isString,lodash.isTypedArray=isTypedArray,lodash.last=last,lodash.some=some,lodash.any=some,lodash.contains=includes,lodash.include=includes,lodash.VERSION=VERSION,freeExports&&freeModule?moduleExports?(freeModule.exports=lodash)._=lodash:freeExports._=lodash:root._=lodash\n}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],"/node_modules/jshint/src/jshint.js":[function(_dereq_,module,exports){var _=_dereq_("../lodash"),events=_dereq_("events"),vars=_dereq_("./vars.js"),messages=_dereq_("./messages.js"),Lexer=_dereq_("./lex.js").Lexer,reg=_dereq_("./reg.js"),state=_dereq_("./state.js").state,style=_dereq_("./style.js"),options=_dereq_("./options.js"),scopeManager=_dereq_("./scope-manager.js"),JSHINT=function(){"use strict";function checkOption(name,t){return name=name.trim(),/^[+-]W\\d{3}$/g.test(name)?!0:-1!==options.validNames.indexOf(name)||"jslint"===t.type||_.has(options.removed,name)?!0:(error("E001",t,name),!1)}function isString(obj){return"[object String]"===Object.prototype.toString.call(obj)}function isIdentifier(tkn,value){return tkn?tkn.identifier&&tkn.value===value?!0:!1:!1}function isReserved(token){if(!token.reserved)return!1;var meta=token.meta;if(meta&&meta.isFutureReservedWord&&state.inES5()){if(!meta.es5)return!1;if(meta.strictOnly&&!state.option.strict&&!state.isStrict())return!1;if(token.isProperty)return!1}return!0}function supplant(str,data){return str.replace(/\\{([^{}]*)\\}/g,function(a,b){var r=data[b];return"string"==typeof r||"number"==typeof r?r:a})}function combine(dest,src){Object.keys(src).forEach(function(name){_.has(JSHINT.blacklist,name)||(dest[name]=src[name])})}function processenforceall(){if(state.option.enforceall){for(var enforceopt in options.bool.enforcing)void 0!==state.option[enforceopt]||options.noenforceall[enforceopt]||(state.option[enforceopt]=!0);for(var relaxopt in options.bool.relaxing)void 0===state.option[relaxopt]&&(state.option[relaxopt]=!1)}}function assume(){processenforceall(),state.option.esversion||state.option.moz||(state.option.esversion=state.option.es3?3:state.option.esnext?6:5),state.inES5()&&combine(predefined,vars.ecmaIdentifiers[5]),state.inES6()&&combine(predefined,vars.ecmaIdentifiers[6]),state.option.module&&(state.option.strict===!0&&(state.option.strict="global"),state.inES6()||warning("W134",state.tokens.next,"module",6)),state.option.couch&&combine(predefined,vars.couch),state.option.qunit&&combine(predefined,vars.qunit),state.option.rhino&&combine(predefined,vars.rhino),state.option.shelljs&&(combine(predefined,vars.shelljs),combine(predefined,vars.node)),state.option.typed&&combine(predefined,vars.typed),state.option.phantom&&(combine(predefined,vars.phantom),state.option.strict===!0&&(state.option.strict="global")),state.option.prototypejs&&combine(predefined,vars.prototypejs),state.option.node&&(combine(predefined,vars.node),combine(predefined,vars.typed),state.option.strict===!0&&(state.option.strict="global")),state.option.devel&&combine(predefined,vars.devel),state.option.dojo&&combine(predefined,vars.dojo),state.option.browser&&(combine(predefined,vars.browser),combine(predefined,vars.typed)),state.option.browserify&&(combine(predefined,vars.browser),combine(predefined,vars.typed),combine(predefined,vars.browserify),state.option.strict===!0&&(state.option.strict="global")),state.option.nonstandard&&combine(predefined,vars.nonstandard),state.option.jasmine&&combine(predefined,vars.jasmine),state.option.jquery&&combine(predefined,vars.jquery),state.option.mootools&&combine(predefined,vars.mootools),state.option.worker&&combine(predefined,vars.worker),state.option.wsh&&combine(predefined,vars.wsh),state.option.globalstrict&&state.option.strict!==!1&&(state.option.strict="global"),state.option.yui&&combine(predefined,vars.yui),state.option.mocha&&combine(predefined,vars.mocha)}function quit(code,line,chr){var percentage=Math.floor(100*(line/state.lines.length)),message=messages.errors[code].desc;throw{name:"JSHintError",line:line,character:chr,message:message+" ("+percentage+"% scanned).",raw:message,code:code}}function removeIgnoredMessages(){var ignored=state.ignoredLines;_.isEmpty(ignored)||(JSHINT.errors=_.reject(JSHINT.errors,function(err){return ignored[err.line]}))}function warning(code,t,a,b,c,d){var ch,l,w,msg;if(/^W\\d{3}$/.test(code)){if(state.ignored[code])return;msg=messages.warnings[code]}else/E\\d{3}/.test(code)?msg=messages.errors[code]:/I\\d{3}/.test(code)&&(msg=messages.info[code]);return t=t||state.tokens.next||{},"(end)"===t.id&&(t=state.tokens.curr),l=t.line||0,ch=t.from||0,w={id:"(error)",raw:msg.desc,code:msg.code,evidence:state.lines[l-1]||"",line:l,character:ch,scope:JSHINT.scope,a:a,b:b,c:c,d:d},w.reason=supplant(msg.desc,w),JSHINT.errors.push(w),removeIgnoredMessages(),JSHINT.errors.length>=state.option.maxerr&&quit("E043",l,ch),w}function warningAt(m,l,ch,a,b,c,d){return warning(m,{line:l,from:ch},a,b,c,d)}function error(m,t,a,b,c,d){warning(m,t,a,b,c,d)}function errorAt(m,l,ch,a,b,c,d){return error(m,{line:l,from:ch},a,b,c,d)}function addInternalSrc(elem,src){var i;return i={id:"(internal)",elem:elem,value:src},JSHINT.internals.push(i),i}function doOption(){var nt=state.tokens.next,body=nt.body.match(/(-\\s+)?[^\\s,:]+(?:\\s*:\\s*(-\\s+)?[^\\s,]+)?/g)||[],predef={};if("globals"===nt.type){body.forEach(function(g,idx){g=g.split(":");var key=(g[0]||"").trim(),val=(g[1]||"").trim();if("-"===key||!key.length){if(idx>0&&idx===body.length-1)return;return error("E002",nt),void 0}"-"===key.charAt(0)?(key=key.slice(1),val=!1,JSHINT.blacklist[key]=key,delete predefined[key]):predef[key]="true"===val}),combine(predefined,predef);for(var key in predef)_.has(predef,key)&&(declared[key]=nt)}"exported"===nt.type&&body.forEach(function(e,idx){if(!e.length){if(idx>0&&idx===body.length-1)return;return error("E002",nt),void 0}state.funct["(scope)"].addExported(e)}),"members"===nt.type&&(membersOnly=membersOnly||{},body.forEach(function(m){var ch1=m.charAt(0),ch2=m.charAt(m.length-1);ch1!==ch2||\'"\'!==ch1&&"\'"!==ch1||(m=m.substr(1,m.length-2).replace(\'\\\\"\',\'"\')),membersOnly[m]=!1}));var numvals=["maxstatements","maxparams","maxdepth","maxcomplexity","maxerr","maxlen","indent"];("jshint"===nt.type||"jslint"===nt.type)&&(body.forEach(function(g){g=g.split(":");var key=(g[0]||"").trim(),val=(g[1]||"").trim();if(checkOption(key,nt))if(numvals.indexOf(key)>=0)if("false"!==val){if(val=+val,"number"!=typeof val||!isFinite(val)||0>=val||Math.floor(val)!==val)return error("E032",nt,g[1].trim()),void 0;state.option[key]=val}else state.option[key]="indent"===key?4:!1;else{if("validthis"===key)return state.funct["(global)"]?void error("E009"):"true"!==val&&"false"!==val?void error("E002",nt):(state.option.validthis="true"===val,void 0);if("quotmark"!==key)if("shadow"!==key)if("unused"!==key)if("latedef"!==key)if("ignore"!==key)if("strict"!==key){"module"===key&&(hasParsedCode(state.funct)||error("E055",state.tokens.next,"module"));var esversions={es3:3,es5:5,esnext:6};if(!_.has(esversions,key)){if("esversion"===key){switch(val){case"5":state.inES5(!0)&&warning("I003");case"3":case"6":state.option.moz=!1,state.option.esversion=+val;break;case"2015":state.option.moz=!1,state.option.esversion=6;break;default:error("E002",nt)}return hasParsedCode(state.funct)||error("E055",state.tokens.next,"esversion"),void 0}var match=/^([+-])(W\\d{3})$/g.exec(key);if(match)return state.ignored[match[2]]="-"===match[1],void 0;var tn;return"true"===val||"false"===val?("jslint"===nt.type?(tn=options.renamed[key]||key,state.option[tn]="true"===val,void 0!==options.inverted[tn]&&(state.option[tn]=!state.option[tn])):state.option[key]="true"===val,"newcap"===key&&(state.option["(explicitNewcap)"]=!0),void 0):(error("E002",nt),void 0)}switch(val){case"true":state.option.moz=!1,state.option.esversion=esversions[key];break;case"false":state.option.moz||(state.option.esversion=5);break;default:error("E002",nt)}}else switch(val){case"true":state.option.strict=!0;break;case"false":state.option.strict=!1;break;case"func":case"global":case"implied":state.option.strict=val;break;default:error("E002",nt)}else switch(val){case"line":state.ignoredLines[nt.line]=!0,removeIgnoredMessages();break;default:error("E002",nt)}else switch(val){case"true":state.option.latedef=!0;break;case"false":state.option.latedef=!1;break;case"nofunc":state.option.latedef="nofunc";break;default:error("E002",nt)}else switch(val){case"true":state.option.unused=!0;break;case"false":state.option.unused=!1;break;case"vars":case"strict":state.option.unused=val;break;default:error("E002",nt)}else switch(val){case"true":state.option.shadow=!0;break;case"outer":state.option.shadow="outer";break;case"false":case"inner":state.option.shadow="inner";break;default:error("E002",nt)}else switch(val){case"true":case"false":state.option.quotmark="true"===val;break;case"double":case"single":state.option.quotmark=val;break;default:error("E002",nt)}}}),assume())}function peek(p){var t,i=p||0,j=lookahead.length;if(j>i)return lookahead[i];for(;i>=j;)t=lookahead[j],t||(t=lookahead[j]=lex.token()),j+=1;return t||"(end)"!==state.tokens.next.id?t:state.tokens.next}function peekIgnoreEOL(){var t,i=0;do t=peek(i++);while("(endline)"===t.id);return t}function advance(id,t){switch(state.tokens.curr.id){case"(number)":"."===state.tokens.next.id&&warning("W005",state.tokens.curr);break;case"-":("-"===state.tokens.next.id||"--"===state.tokens.next.id)&&warning("W006");break;case"+":("+"===state.tokens.next.id||"++"===state.tokens.next.id)&&warning("W007")}for(id&&state.tokens.next.id!==id&&(t?"(end)"===state.tokens.next.id?error("E019",t,t.id):error("E020",state.tokens.next,id,t.id,t.line,state.tokens.next.value):("(identifier)"!==state.tokens.next.type||state.tokens.next.value!==id)&&warning("W116",state.tokens.next,id,state.tokens.next.value)),state.tokens.prev=state.tokens.curr,state.tokens.curr=state.tokens.next;;){if(state.tokens.next=lookahead.shift()||lex.token(),state.tokens.next||quit("E041",state.tokens.curr.line),"(end)"===state.tokens.next.id||"(error)"===state.tokens.next.id)return;if(state.tokens.next.check&&state.tokens.next.check(),state.tokens.next.isSpecial)"falls through"===state.tokens.next.type?state.tokens.curr.caseFallsThrough=!0:doOption();else if("(endline)"!==state.tokens.next.id)break}}function isInfix(token){return token.infix||!token.identifier&&!token.template&&!!token.led}function isEndOfExpr(){var curr=state.tokens.curr,next=state.tokens.next;return";"===next.id||"}"===next.id||":"===next.id?!0:isInfix(next)===isInfix(curr)||"yield"===curr.id&&state.inMoz()?curr.line!==startLine(next):!1}function isBeginOfExpr(prev){return!prev.left&&"unary"!==prev.arity}function expression(rbp,initial){var left,isArray=!1,isObject=!1,isLetExpr=!1;state.nameStack.push(),initial||"let"!==state.tokens.next.value||"("!==peek(0).value||(state.inMoz()||warning("W118",state.tokens.next,"let expressions"),isLetExpr=!0,state.funct["(scope)"].stack(),advance("let"),advance("("),state.tokens.prev.fud(),advance(")")),"(end)"===state.tokens.next.id&&error("E006",state.tokens.curr);var isDangerous=state.option.asi&&state.tokens.prev.line!==startLine(state.tokens.curr)&&_.contains(["]",")"],state.tokens.prev.id)&&_.contains(["[","("],state.tokens.curr.id);if(isDangerous&&warning("W014",state.tokens.curr,state.tokens.curr.id),advance(),initial&&(state.funct["(verb)"]=state.tokens.curr.value,state.tokens.curr.beginsStmt=!0),initial===!0&&state.tokens.curr.fud)left=state.tokens.curr.fud();else for(state.tokens.curr.nud?left=state.tokens.curr.nud():error("E030",state.tokens.curr,state.tokens.curr.id);(state.tokens.next.lbp>rbp||"(template)"===state.tokens.next.type)&&!isEndOfExpr();)isArray="Array"===state.tokens.curr.value,isObject="Object"===state.tokens.curr.value,left&&(left.value||left.first&&left.first.value)&&("new"!==left.value||left.first&&left.first.value&&"."===left.first.value)&&(isArray=!1,left.value!==state.tokens.curr.value&&(isObject=!1)),advance(),isArray&&"("===state.tokens.curr.id&&")"===state.tokens.next.id&&warning("W009",state.tokens.curr),isObject&&"("===state.tokens.curr.id&&")"===state.tokens.next.id&&warning("W010",state.tokens.curr),left&&state.tokens.curr.led?left=state.tokens.curr.led(left):error("E033",state.tokens.curr,state.tokens.curr.id);return isLetExpr&&state.funct["(scope)"].unstack(),state.nameStack.pop(),left}function startLine(token){return token.startLine||token.line}function nobreaknonadjacent(left,right){left=left||state.tokens.curr,right=right||state.tokens.next,state.option.laxbreak||left.line===startLine(right)||warning("W014",right,right.value)}function nolinebreak(t){t=t||state.tokens.curr,t.line!==startLine(state.tokens.next)&&warning("E022",t,t.value)}function nobreakcomma(left,right){left.line!==startLine(right)&&(state.option.laxcomma||(comma.first&&(warning("I001"),comma.first=!1),warning("W014",left,right.value)))}function comma(opts){if(opts=opts||{},opts.peek?nobreakcomma(state.tokens.prev,state.tokens.curr):(nobreakcomma(state.tokens.curr,state.tokens.next),advance(",")),state.tokens.next.identifier&&(!opts.property||!state.inES5()))switch(state.tokens.next.value){case"break":case"case":case"catch":case"continue":case"default":case"do":case"else":case"finally":case"for":case"if":case"in":case"instanceof":case"return":case"switch":case"throw":case"try":case"var":case"let":case"while":case"with":return error("E024",state.tokens.next,state.tokens.next.value),!1}if("(punctuator)"===state.tokens.next.type)switch(state.tokens.next.value){case"}":case"]":case",":if(opts.allowTrailing)return!0;case")":return error("E024",state.tokens.next,state.tokens.next.value),!1}return!0}function symbol(s,p){var x=state.syntax[s];return x&&"object"==typeof x||(state.syntax[s]=x={id:s,lbp:p,value:s}),x}function delim(s){var x=symbol(s,0);return x.delim=!0,x}function stmt(s,f){var x=delim(s);return x.identifier=x.reserved=!0,x.fud=f,x}function blockstmt(s,f){var x=stmt(s,f);return x.block=!0,x}function reserveName(x){var c=x.id.charAt(0);return(c>="a"&&"z">=c||c>="A"&&"Z">=c)&&(x.identifier=x.reserved=!0),x}function prefix(s,f){var x=symbol(s,150);return reserveName(x),x.nud="function"==typeof f?f:function(){return this.arity="unary",this.right=expression(150),("++"===this.id||"--"===this.id)&&(state.option.plusplus?warning("W016",this,this.id):!this.right||this.right.identifier&&!isReserved(this.right)||"."===this.right.id||"["===this.right.id||warning("W017",this),this.right&&this.right.isMetaProperty?error("E031",this):this.right&&this.right.identifier&&state.funct["(scope)"].block.modify(this.right.value,this)),this},x}function type(s,f){var x=delim(s);return x.type=s,x.nud=f,x}function reserve(name,func){var x=type(name,func);return x.identifier=!0,x.reserved=!0,x}function FutureReservedWord(name,meta){var x=type(name,meta&&meta.nud||function(){return this});return meta=meta||{},meta.isFutureReservedWord=!0,x.value=name,x.identifier=!0,x.reserved=!0,x.meta=meta,x}function reservevar(s,v){return reserve(s,function(){return"function"==typeof v&&v(this),this})}function infix(s,f,p,w){var x=symbol(s,p);return reserveName(x),x.infix=!0,x.led=function(left){return w||nobreaknonadjacent(state.tokens.prev,state.tokens.curr),"in"!==s&&"instanceof"!==s||"!"!==left.id||warning("W018",left,"!"),"function"==typeof f?f(left,this):(this.left=left,this.right=expression(p),this)},x}function application(s){var x=symbol(s,42);return x.led=function(left){return nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left,this.right=doFunction({type:"arrow",loneArg:left}),this},x}function relation(s,f){var x=symbol(s,100);return x.led=function(left){nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left;var right=this.right=expression(100);return isIdentifier(left,"NaN")||isIdentifier(right,"NaN")?warning("W019",this):f&&f.apply(this,[left,right]),left&&right||quit("E041",state.tokens.curr.line),"!"===left.id&&warning("W018",left,"!"),"!"===right.id&&warning("W018",right,"!"),this},x}function isPoorRelation(node){return node&&("(number)"===node.type&&0===+node.value||"(string)"===node.type&&""===node.value||"null"===node.type&&!state.option.eqnull||"true"===node.type||"false"===node.type||"undefined"===node.type)}function isTypoTypeof(left,right,state){var values;return state.option.notypeof?!1:left&&right?(values=state.inES6()?typeofValues.es6:typeofValues.es3,"(identifier)"===right.type&&"typeof"===right.value&&"(string)"===left.type?!_.contains(values,left.value):!1):!1}function isGlobalEval(left,state){var isGlobal=!1;return"this"===left.type&&null===state.funct["(context)"]?isGlobal=!0:"(identifier)"===left.type&&(state.option.node&&"global"===left.value?isGlobal=!0:!state.option.browser||"window"!==left.value&&"document"!==left.value||(isGlobal=!0)),isGlobal}function findNativePrototype(left){function walkPrototype(obj){return"object"==typeof obj?"prototype"===obj.right?obj:walkPrototype(obj.left):void 0}function walkNative(obj){for(;!obj.identifier&&"object"==typeof obj.left;)obj=obj.left;return obj.identifier&&natives.indexOf(obj.value)>=0?obj.value:void 0}var natives=["Array","ArrayBuffer","Boolean","Collator","DataView","Date","DateTimeFormat","Error","EvalError","Float32Array","Float64Array","Function","Infinity","Intl","Int16Array","Int32Array","Int8Array","Iterator","Number","NumberFormat","Object","RangeError","ReferenceError","RegExp","StopIteration","String","SyntaxError","TypeError","Uint16Array","Uint32Array","Uint8Array","Uint8ClampedArray","URIError"],prototype=walkPrototype(left);return prototype?walkNative(prototype):void 0}function checkLeftSideAssign(left,assignToken,options){var allowDestructuring=options&&options.allowDestructuring;if(assignToken=assignToken||left,state.option.freeze){var nativeObject=findNativePrototype(left);nativeObject&&warning("W121",left,nativeObject)}return left.identifier&&!left.isMetaProperty&&state.funct["(scope)"].block.reassign(left.value,left),"."===left.id?((!left.left||"arguments"===left.left.value&&!state.isStrict())&&warning("E031",assignToken),state.nameStack.set(state.tokens.prev),!0):"{"===left.id||"["===left.id?(allowDestructuring&&state.tokens.curr.left.destructAssign?state.tokens.curr.left.destructAssign.forEach(function(t){t.id&&state.funct["(scope)"].block.modify(t.id,t.token)}):"{"!==left.id&&left.left?"arguments"!==left.left.value||state.isStrict()||warning("E031",assignToken):warning("E031",assignToken),"["===left.id&&state.nameStack.set(left.right),!0):left.isMetaProperty?(error("E031",assignToken),!0):left.identifier&&!isReserved(left)?("exception"===state.funct["(scope)"].labeltype(left.value)&&warning("W022",left),state.nameStack.set(left),!0):(left===state.syntax["function"]&&warning("W023",state.tokens.curr),!1)}function assignop(s,f,p){var x=infix(s,"function"==typeof f?f:function(left,that){return that.left=left,left&&checkLeftSideAssign(left,that,{allowDestructuring:!0})?(that.right=expression(10),that):(error("E031",that),void 0)},p);return x.exps=!0,x.assign=!0,x}function bitwise(s,f,p){var x=symbol(s,p);return reserveName(x),x.led="function"==typeof f?f:function(left){return state.option.bitwise&&warning("W016",this,this.id),this.left=left,this.right=expression(p),this},x}function bitwiseassignop(s){return assignop(s,function(left,that){return state.option.bitwise&&warning("W016",that,that.id),left&&checkLeftSideAssign(left,that)?(that.right=expression(10),that):(error("E031",that),void 0)},20)}function suffix(s){var x=symbol(s,150);return x.led=function(left){return state.option.plusplus?warning("W016",this,this.id):left.identifier&&!isReserved(left)||"."===left.id||"["===left.id||warning("W017",this),left.isMetaProperty?error("E031",this):left&&left.identifier&&state.funct["(scope)"].block.modify(left.value,left),this.left=left,this},x}function optionalidentifier(fnparam,prop,preserve){if(state.tokens.next.identifier){preserve||advance();var curr=state.tokens.curr,val=state.tokens.curr.value;return isReserved(curr)?prop&&state.inES5()?val:fnparam&&"undefined"===val?val:(warning("W024",state.tokens.curr,state.tokens.curr.id),val):val}}function identifier(fnparam,prop){var i=optionalidentifier(fnparam,prop,!1);if(i)return i;if("..."===state.tokens.next.value){if(state.inES6(!0)||warning("W119",state.tokens.next,"spread/rest operator","6"),advance(),checkPunctuator(state.tokens.next,"..."))for(warning("E024",state.tokens.next,"...");checkPunctuator(state.tokens.next,"...");)advance();return state.tokens.next.identifier?identifier(fnparam,prop):(warning("E024",state.tokens.curr,"..."),void 0)}error("E030",state.tokens.next,state.tokens.next.value),";"!==state.tokens.next.id&&advance()}function reachable(controlToken){var t,i=0;if(";"===state.tokens.next.id&&!controlToken.inBracelessBlock)for(;;){do t=peek(i),i+=1;while("(end)"!==t.id&&"(comment)"===t.id);if(t.reach)return;if("(endline)"!==t.id){if("function"===t.id){state.option.latedef===!0&&warning("W026",t);break}warning("W027",t,t.value,controlToken.value);break}}}function parseFinalSemicolon(){if(";"!==state.tokens.next.id){if(state.tokens.next.isUnclosed)return advance();var sameLine=startLine(state.tokens.next)===state.tokens.curr.line&&"(end)"!==state.tokens.next.id,blockEnd=checkPunctuator(state.tokens.next,"}");sameLine&&!blockEnd?errorAt("E058",state.tokens.curr.line,state.tokens.curr.character):state.option.asi||(blockEnd&&!state.option.lastsemic||!sameLine)&&warningAt("W033",state.tokens.curr.line,state.tokens.curr.character)}else advance(";")}function statement(){var r,i=indent,t=state.tokens.next,hasOwnScope=!1;if(";"===t.id)return advance(";"),void 0;var res=isReserved(t);if(res&&t.meta&&t.meta.isFutureReservedWord&&":"===peek().id&&(warning("W024",t,t.id),res=!1),t.identifier&&!res&&":"===peek().id&&(advance(),advance(":"),hasOwnScope=!0,state.funct["(scope)"].stack(),state.funct["(scope)"].block.addBreakLabel(t.value,{token:state.tokens.curr}),state.tokens.next.labelled||"{"===state.tokens.next.value||warning("W028",state.tokens.next,t.value,state.tokens.next.value),state.tokens.next.label=t.value,t=state.tokens.next),"{"===t.id){var iscase="case"===state.funct["(verb)"]&&":"===state.tokens.curr.value;return block(!0,!0,!1,!1,iscase),void 0}return r=expression(0,!0),!r||r.identifier&&"function"===r.value||"(punctuator)"===r.type&&r.left&&r.left.identifier&&"function"===r.left.value||state.isStrict()||"global"!==state.option.strict||warning("E007"),t.block||(state.option.expr||r&&r.exps?state.option.nonew&&r&&r.left&&"("===r.id&&"new"===r.left.id&&warning("W031",t):warning("W030",state.tokens.curr),parseFinalSemicolon()),indent=i,hasOwnScope&&state.funct["(scope)"].unstack(),r}function statements(){for(var p,a=[];!state.tokens.next.reach&&"(end)"!==state.tokens.next.id;)";"===state.tokens.next.id?(p=peek(),(!p||"("!==p.id&&"["!==p.id)&&warning("W032"),advance(";")):a.push(statement());return a}function directives(){for(var i,p,pn;"(string)"===state.tokens.next.id;){if(p=peek(0),"(endline)"===p.id){i=1;do pn=peek(i++);while("(endline)"===pn.id);if(";"===pn.id)p=pn;else{if("["===pn.value||"."===pn.value)break;state.option.asi&&"("!==pn.value||warning("W033",state.tokens.next)}}else{if("."===p.id||"["===p.id)break;";"!==p.id&&warning("W033",p)}advance();var directive=state.tokens.curr.value;(state.directive[directive]||"use strict"===directive&&"implied"===state.option.strict)&&warning("W034",state.tokens.curr,directive),state.directive[directive]=!0,";"===p.id&&advance(";")}state.isStrict()&&(state.option["(explicitNewcap)"]||(state.option.newcap=!0),state.option.undef=!0)}function block(ordinary,stmt,isfunc,isfatarrow,iscase){var a,m,t,line,d,b=inblock,old_indent=indent;inblock=ordinary,t=state.tokens.next;var metrics=state.funct["(metrics)"];if(metrics.nestedBlockDepth+=1,metrics.verifyMaxNestedBlockDepthPerFunction(),"{"===state.tokens.next.id){if(advance("{"),state.funct["(scope)"].stack(),line=state.tokens.curr.line,"}"!==state.tokens.next.id){for(indent+=state.option.indent;!ordinary&&state.tokens.next.from>indent;)indent+=state.option.indent;if(isfunc){m={};for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);directives(),state.option.strict&&state.funct["(context)"]["(global)"]&&(m["use strict"]||state.isStrict()||warning("E007"))}a=statements(),metrics.statementCount+=a.length,indent-=state.option.indent}advance("}",t),isfunc&&(state.funct["(scope)"].validateParams(),m&&(state.directive=m)),state.funct["(scope)"].unstack(),indent=old_indent}else if(ordinary)state.funct["(noblockscopedvar)"]="for"!==state.tokens.next.id,state.funct["(scope)"].stack(),(!stmt||state.option.curly)&&warning("W116",state.tokens.next,"{",state.tokens.next.value),state.tokens.next.inBracelessBlock=!0,indent+=state.option.indent,a=[statement()],indent-=state.option.indent,state.funct["(scope)"].unstack(),delete state.funct["(noblockscopedvar)"];else if(isfunc){if(state.funct["(scope)"].stack(),m={},!stmt||isfatarrow||state.inMoz()||error("W118",state.tokens.curr,"function closure expressions"),!stmt)for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);expression(10),state.option.strict&&state.funct["(context)"]["(global)"]&&(m["use strict"]||state.isStrict()||warning("E007")),state.funct["(scope)"].unstack()}else error("E021",state.tokens.next,"{",state.tokens.next.value);switch(state.funct["(verb)"]){case"break":case"continue":case"return":case"throw":if(iscase)break;default:state.funct["(verb)"]=null}return inblock=b,!ordinary||!state.option.noempty||a&&0!==a.length||warning("W035",state.tokens.prev),metrics.nestedBlockDepth-=1,a}function countMember(m){membersOnly&&"boolean"!=typeof membersOnly[m]&&warning("W036",state.tokens.curr,m),"number"==typeof member[m]?member[m]+=1:member[m]=1}function comprehensiveArrayExpression(){var res={};res.exps=!0,state.funct["(comparray)"].stack();var reversed=!1;return"for"!==state.tokens.next.value&&(reversed=!0,state.inMoz()||warning("W116",state.tokens.next,"for",state.tokens.next.value),state.funct["(comparray)"].setState("use"),res.right=expression(10)),advance("for"),"each"===state.tokens.next.value&&(advance("each"),state.inMoz()||warning("W118",state.tokens.curr,"for each")),advance("("),state.funct["(comparray)"].setState("define"),res.left=expression(130),_.contains(["in","of"],state.tokens.next.value)?advance():error("E045",state.tokens.curr),state.funct["(comparray)"].setState("generate"),expression(10),advance(")"),"if"===state.tokens.next.value&&(advance("if"),advance("("),state.funct["(comparray)"].setState("filter"),res.filter=expression(10),advance(")")),reversed||(state.funct["(comparray)"].setState("use"),res.right=expression(10)),advance("]"),state.funct["(comparray)"].unstack(),res}function isMethod(){return state.funct["(statement)"]&&"class"===state.funct["(statement)"].type||state.funct["(context)"]&&"class"===state.funct["(context)"]["(verb)"]}function isPropertyName(token){return token.identifier||"(string)"===token.id||"(number)"===token.id}function propertyName(preserveOrToken){var id,preserve=!0;return"object"==typeof preserveOrToken?id=preserveOrToken:(preserve=preserveOrToken,id=optionalidentifier(!1,!0,preserve)),id?"object"==typeof id&&("(string)"===id.id||"(identifier)"===id.id?id=id.value:"(number)"===id.id&&(id=""+id.value)):"(string)"===state.tokens.next.id?(id=state.tokens.next.value,preserve||advance()):"(number)"===state.tokens.next.id&&(id=""+state.tokens.next.value,preserve||advance()),"hasOwnProperty"===id&&warning("W001"),id}function functionparams(options){function addParam(addParamArgs){state.funct["(scope)"].addParam.apply(state.funct["(scope)"],addParamArgs)}var next,ident,t,paramsIds=[],tokens=[],pastDefault=!1,pastRest=!1,arity=0,loneArg=options&&options.loneArg;if(loneArg&&loneArg.identifier===!0)return state.funct["(scope)"].addParam(loneArg.value,loneArg),{arity:1,params:[loneArg.value]};if(next=state.tokens.next,options&&options.parsedOpening||advance("("),")"===state.tokens.next.id)return advance(")"),void 0;for(;;){arity++;var currentParams=[];if(_.contains(["{","["],state.tokens.next.id)){tokens=destructuringPattern();for(t in tokens)t=tokens[t],t.id&&(paramsIds.push(t.id),currentParams.push([t.id,t.token]))}else if(checkPunctuator(state.tokens.next,"...")&&(pastRest=!0),ident=identifier(!0))paramsIds.push(ident),currentParams.push([ident,state.tokens.curr]);else for(;!checkPunctuators(state.tokens.next,[",",")"]);)advance();if(pastDefault&&"="!==state.tokens.next.id&&error("W138",state.tokens.current),"="===state.tokens.next.id&&(state.inES6()||warning("W119",state.tokens.next,"default parameters","6"),advance("="),pastDefault=!0,expression(10)),currentParams.forEach(addParam),","!==state.tokens.next.id)return advance(")",next),{arity:arity,params:paramsIds};pastRest&&warning("W131",state.tokens.next),comma()}}function functor(name,token,overwrites){var funct={"(name)":name,"(breakage)":0,"(loopage)":0,"(tokens)":{},"(properties)":{},"(catch)":!1,"(global)":!1,"(line)":null,"(character)":null,"(metrics)":null,"(statement)":null,"(context)":null,"(scope)":null,"(comparray)":null,"(generator)":null,"(arrow)":null,"(params)":null};return token&&_.extend(funct,{"(line)":token.line,"(character)":token.character,"(metrics)":createMetrics(token)}),_.extend(funct,overwrites),funct["(context)"]&&(funct["(scope)"]=funct["(context)"]["(scope)"],funct["(comparray)"]=funct["(context)"]["(comparray)"]),funct}function isFunctor(token){return"(scope)"in token}function hasParsedCode(funct){return funct["(global)"]&&!funct["(verb)"]}function doTemplateLiteral(left){function end(){if(state.tokens.curr.template&&state.tokens.curr.tail&&state.tokens.curr.context===ctx)return!0;var complete=state.tokens.next.template&&state.tokens.next.tail&&state.tokens.next.context===ctx;return complete&&advance(),complete||state.tokens.next.isUnclosed}var ctx=this.context,noSubst=this.noSubst,depth=this.depth;if(!noSubst)for(;!end();)!state.tokens.next.template||state.tokens.next.depth>depth?expression(0):advance();return{id:"(template)",type:"(template)",tag:left}}function doFunction(options){var f,token,name,statement,classExprBinding,isGenerator,isArrow,ignoreLoopFunc,oldOption=state.option,oldIgnored=state.ignored;options&&(name=options.name,statement=options.statement,classExprBinding=options.classExprBinding,isGenerator="generator"===options.type,isArrow="arrow"===options.type,ignoreLoopFunc=options.ignoreLoopFunc),state.option=Object.create(state.option),state.ignored=Object.create(state.ignored),state.funct=functor(name||state.nameStack.infer(),state.tokens.next,{"(statement)":statement,"(context)":state.funct,"(arrow)":isArrow,"(generator)":isGenerator}),f=state.funct,token=state.tokens.curr,token.funct=state.funct,functions.push(state.funct),state.funct["(scope)"].stack("functionouter");var internallyAccessibleName=name||classExprBinding;internallyAccessibleName&&state.funct["(scope)"].block.add(internallyAccessibleName,classExprBinding?"class":"function",state.tokens.curr,!1),state.funct["(scope)"].stack("functionparams");var paramsInfo=functionparams(options);return paramsInfo?(state.funct["(params)"]=paramsInfo.params,state.funct["(metrics)"].arity=paramsInfo.arity,state.funct["(metrics)"].verifyMaxParametersPerFunction()):state.funct["(metrics)"].arity=0,isArrow&&(state.inES6(!0)||warning("W119",state.tokens.curr,"arrow function syntax (=>)","6"),options.loneArg||advance("=>")),block(!1,!0,!0,isArrow),!state.option.noyield&&isGenerator&&"yielded"!==state.funct["(generator)"]&&warning("W124",state.tokens.curr),state.funct["(metrics)"].verifyMaxStatementsPerFunction(),state.funct["(metrics)"].verifyMaxComplexityPerFunction(),state.funct["(unusedOption)"]=state.option.unused,state.option=oldOption,state.ignored=oldIgnored,state.funct["(last)"]=state.tokens.curr.line,state.funct["(lastcharacter)"]=state.tokens.curr.character,state.funct["(scope)"].unstack(),state.funct["(scope)"].unstack(),state.funct=state.funct["(context)"],ignoreLoopFunc||state.option.loopfunc||!state.funct["(loopage)"]||f["(isCapturing)"]&&warning("W083",token),f}function createMetrics(functionStartToken){return{statementCount:0,nestedBlockDepth:-1,ComplexityCount:1,arity:0,verifyMaxStatementsPerFunction:function(){state.option.maxstatements&&this.statementCount>state.option.maxstatements&&warning("W071",functionStartToken,this.statementCount)\n},verifyMaxParametersPerFunction:function(){_.isNumber(state.option.maxparams)&&this.arity>state.option.maxparams&&warning("W072",functionStartToken,this.arity)},verifyMaxNestedBlockDepthPerFunction:function(){state.option.maxdepth&&this.nestedBlockDepth>0&&this.nestedBlockDepth===state.option.maxdepth+1&&warning("W073",null,this.nestedBlockDepth)},verifyMaxComplexityPerFunction:function(){var max=state.option.maxcomplexity,cc=this.ComplexityCount;max&&cc>max&&warning("W074",functionStartToken,cc)}}}function increaseComplexityCount(){state.funct["(metrics)"].ComplexityCount+=1}function checkCondAssignment(expr){var id,paren;switch(expr&&(id=expr.id,paren=expr.paren,","===id&&(expr=expr.exprs[expr.exprs.length-1])&&(id=expr.id,paren=paren||expr.paren)),id){case"=":case"+=":case"-=":case"*=":case"%=":case"&=":case"|=":case"^=":case"/=":paren||state.option.boss||warning("W084")}}function checkProperties(props){if(state.inES5())for(var name in props)props[name]&&props[name].setterToken&&!props[name].getterToken&&warning("W078",props[name].setterToken)}function metaProperty(name,c){if(checkPunctuator(state.tokens.next,".")){var left=state.tokens.curr.id;advance(".");var id=identifier();return state.tokens.curr.isMetaProperty=!0,name!==id?error("E057",state.tokens.prev,left,id):c(),state.tokens.curr}}function destructuringPattern(options){var isAssignment=options&&options.assignment;return state.inES6()||warning("W104",state.tokens.curr,isAssignment?"destructuring assignment":"destructuring binding","6"),destructuringPatternRecursive(options)}function destructuringPatternRecursive(options){var ids,identifiers=[],openingParsed=options&&options.openingParsed,isAssignment=options&&options.assignment,recursiveOptions=isAssignment?{assignment:isAssignment}:null,firstToken=openingParsed?state.tokens.curr:state.tokens.next,nextInnerDE=function(){var ident;if(checkPunctuators(state.tokens.next,["[","{"])){ids=destructuringPatternRecursive(recursiveOptions);for(var id in ids)id=ids[id],identifiers.push({id:id.id,token:id.token})}else if(checkPunctuator(state.tokens.next,","))identifiers.push({id:null,token:state.tokens.curr});else{if(!checkPunctuator(state.tokens.next,"(")){var is_rest=checkPunctuator(state.tokens.next,"...");if(isAssignment){var identifierToken=is_rest?peek(0):state.tokens.next;identifierToken.identifier||warning("E030",identifierToken,identifierToken.value);var assignTarget=expression(155);assignTarget&&(checkLeftSideAssign(assignTarget),assignTarget.identifier&&(ident=assignTarget.value))}else ident=identifier();return ident&&identifiers.push({id:ident,token:state.tokens.curr}),is_rest}advance("("),nextInnerDE(),advance(")")}return!1},assignmentProperty=function(){var id;checkPunctuator(state.tokens.next,"[")?(advance("["),expression(10),advance("]"),advance(":"),nextInnerDE()):"(string)"===state.tokens.next.id||"(number)"===state.tokens.next.id?(advance(),advance(":"),nextInnerDE()):(id=identifier(),checkPunctuator(state.tokens.next,":")?(advance(":"),nextInnerDE()):id&&(isAssignment&&checkLeftSideAssign(state.tokens.curr),identifiers.push({id:id,token:state.tokens.curr})))};if(checkPunctuator(firstToken,"[")){openingParsed||advance("["),checkPunctuator(state.tokens.next,"]")&&warning("W137",state.tokens.curr);for(var element_after_rest=!1;!checkPunctuator(state.tokens.next,"]");)nextInnerDE()&&!element_after_rest&&checkPunctuator(state.tokens.next,",")&&(warning("W130",state.tokens.next),element_after_rest=!0),checkPunctuator(state.tokens.next,"=")&&(checkPunctuator(state.tokens.prev,"...")?advance("]"):advance("="),"undefined"===state.tokens.next.id&&warning("W080",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,"]")||advance(",");advance("]")}else if(checkPunctuator(firstToken,"{")){for(openingParsed||advance("{"),checkPunctuator(state.tokens.next,"}")&&warning("W137",state.tokens.curr);!checkPunctuator(state.tokens.next,"}")&&(assignmentProperty(),checkPunctuator(state.tokens.next,"=")&&(advance("="),"undefined"===state.tokens.next.id&&warning("W080",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,"}")||(advance(","),!checkPunctuator(state.tokens.next,"}"))););advance("}")}return identifiers}function destructuringPatternMatch(tokens,value){var first=value.first;first&&_.zip(tokens,Array.isArray(first)?first:[first]).forEach(function(val){var token=val[0],value=val[1];token&&value?token.first=value:token&&token.first&&!value&&warning("W080",token.first,token.first.value)})}function blockVariableStatement(type,statement,context){var tokens,lone,value,letblock,prefix=context&&context.prefix,inexport=context&&context.inexport,isLet="let"===type,isConst="const"===type;for(state.inES6()||warning("W104",state.tokens.curr,type,"6"),isLet&&"("===state.tokens.next.value?(state.inMoz()||warning("W118",state.tokens.next,"let block"),advance("("),state.funct["(scope)"].stack(),letblock=!0):state.funct["(noblockscopedvar)"]&&error("E048",state.tokens.curr,isConst?"Const":"Let"),statement.first=[];;){var names=[];_.contains(["{","["],state.tokens.next.value)?(tokens=destructuringPattern(),lone=!1):(tokens=[{id:identifier(),token:state.tokens.curr}],lone=!0),!prefix&&isConst&&"="!==state.tokens.next.id&&warning("E012",state.tokens.curr,state.tokens.curr.value);for(var t in tokens)tokens.hasOwnProperty(t)&&(t=tokens[t],state.funct["(scope)"].block.isGlobal()&&predefined[t.id]===!1&&warning("W079",t.token,t.id),t.id&&!state.funct["(noblockscopedvar)"]&&(state.funct["(scope)"].addlabel(t.id,{type:type,token:t.token}),names.push(t.token),lone&&inexport&&state.funct["(scope)"].setExported(t.token.value,t.token)));if("="===state.tokens.next.id&&(advance("="),prefix||"undefined"!==state.tokens.next.id||warning("W080",state.tokens.prev,state.tokens.prev.value),!prefix&&"="===peek(0).id&&state.tokens.next.identifier&&warning("W120",state.tokens.next,state.tokens.next.value),value=expression(prefix?120:10),lone?tokens[0].first=value:destructuringPatternMatch(names,value)),statement.first=statement.first.concat(names),","!==state.tokens.next.id)break;comma()}return letblock&&(advance(")"),block(!0,!0),statement.block=!0,state.funct["(scope)"].unstack()),statement}function classdef(isStatement){return state.inES6()||warning("W104",state.tokens.curr,"class","6"),isStatement?(this.name=identifier(),state.funct["(scope)"].addlabel(this.name,{type:"class",token:state.tokens.curr})):state.tokens.next.identifier&&"extends"!==state.tokens.next.value?(this.name=identifier(),this.namedExpr=!0):this.name=state.nameStack.infer(),classtail(this),this}function classtail(c){var wasInClassBody=state.inClassBody;"extends"===state.tokens.next.value&&(advance("extends"),c.heritage=expression(10)),state.inClassBody=!0,advance("{"),c.body=classbody(c),advance("}"),state.inClassBody=wasInClassBody}function classbody(c){for(var name,isStatic,isGenerator,getset,computed,props=Object.create(null),staticProps=Object.create(null),i=0;"}"!==state.tokens.next.id;++i)if(name=state.tokens.next,isStatic=!1,isGenerator=!1,getset=null,";"!==name.id){if("*"===name.id&&(isGenerator=!0,advance("*"),name=state.tokens.next),"["===name.id)name=computedPropertyName(),computed=!0;else{if(!isPropertyName(name)){warning("W052",state.tokens.next,state.tokens.next.value||state.tokens.next.type),advance();continue}advance(),computed=!1,name.identifier&&"static"===name.value&&(checkPunctuator(state.tokens.next,"*")&&(isGenerator=!0,advance("*")),(isPropertyName(state.tokens.next)||"["===state.tokens.next.id)&&(computed="["===state.tokens.next.id,isStatic=!0,name=state.tokens.next,"["===state.tokens.next.id?name=computedPropertyName():advance())),!name.identifier||"get"!==name.value&&"set"!==name.value||(isPropertyName(state.tokens.next)||"["===state.tokens.next.id)&&(computed="["===state.tokens.next.id,getset=name,name=state.tokens.next,"["===state.tokens.next.id?name=computedPropertyName():advance())}if(!checkPunctuator(state.tokens.next,"(")){for(error("E054",state.tokens.next,state.tokens.next.value);"}"!==state.tokens.next.id&&!checkPunctuator(state.tokens.next,"(");)advance();"("!==state.tokens.next.value&&doFunction({statement:c})}if(computed||(getset?saveAccessor(getset.value,isStatic?staticProps:props,name.value,name,!0,isStatic):("constructor"===name.value?state.nameStack.set(c):state.nameStack.set(name),saveProperty(isStatic?staticProps:props,name.value,name,!0,isStatic))),getset&&"constructor"===name.value){var propDesc="get"===getset.value?"class getter method":"class setter method";error("E049",name,propDesc,"constructor")}else"prototype"===name.value&&error("E049",name,"class method","prototype");propertyName(name),doFunction({statement:c,type:isGenerator?"generator":null,classExprBinding:c.namedExpr?c.name:null})}else warning("W032"),advance(";");checkProperties(props)}function saveProperty(props,name,tkn,isClass,isStatic){var msg=["key","class method","static class method"];msg=msg[(isClass||!1)+(isStatic||!1)],tkn.identifier&&(name=tkn.value),props[name]&&"__proto__"!==name?warning("W075",state.tokens.next,msg,name):props[name]=Object.create(null),props[name].basic=!0,props[name].basictkn=tkn}function saveAccessor(accessorType,props,name,tkn,isClass,isStatic){var flagName="get"===accessorType?"getterToken":"setterToken",msg="";isClass?(isStatic&&(msg+="static "),msg+=accessorType+"ter method"):msg="key",state.tokens.curr.accessorType=accessorType,state.nameStack.set(tkn),props[name]?(props[name].basic||props[name][flagName])&&"__proto__"!==name&&warning("W075",state.tokens.next,msg,name):props[name]=Object.create(null),props[name][flagName]=tkn}function computedPropertyName(){advance("["),state.inES6()||warning("W119",state.tokens.curr,"computed property names","6");var value=expression(10);return advance("]"),value}function checkPunctuators(token,values){return"(punctuator)"===token.type?_.contains(values,token.value):!1}function checkPunctuator(token,value){return"(punctuator)"===token.type&&token.value===value}function destructuringAssignOrJsonValue(){var block=lookupBlockType();block.notJson?(!state.inES6()&&block.isDestAssign&&warning("W104",state.tokens.curr,"destructuring assignment","6"),statements()):(state.option.laxbreak=!0,state.jsonMode=!0,jsonValue())}function jsonValue(){function jsonObject(){var o={},t=state.tokens.next;if(advance("{"),"}"!==state.tokens.next.id)for(;;){if("(end)"===state.tokens.next.id)error("E026",state.tokens.next,t.line);else{if("}"===state.tokens.next.id){warning("W094",state.tokens.curr);break}","===state.tokens.next.id?error("E028",state.tokens.next):"(string)"!==state.tokens.next.id&&warning("W095",state.tokens.next,state.tokens.next.value)}if(o[state.tokens.next.value]===!0?warning("W075",state.tokens.next,"key",state.tokens.next.value):"__proto__"===state.tokens.next.value&&!state.option.proto||"__iterator__"===state.tokens.next.value&&!state.option.iterator?warning("W096",state.tokens.next,state.tokens.next.value):o[state.tokens.next.value]=!0,advance(),advance(":"),jsonValue(),","!==state.tokens.next.id)break;advance(",")}advance("}")}function jsonArray(){var t=state.tokens.next;if(advance("["),"]"!==state.tokens.next.id)for(;;){if("(end)"===state.tokens.next.id)error("E027",state.tokens.next,t.line);else{if("]"===state.tokens.next.id){warning("W094",state.tokens.curr);break}","===state.tokens.next.id&&error("E028",state.tokens.next)}if(jsonValue(),","!==state.tokens.next.id)break;advance(",")}advance("]")}switch(state.tokens.next.id){case"{":jsonObject();break;case"[":jsonArray();break;case"true":case"false":case"null":case"(number)":case"(string)":advance();break;case"-":advance("-"),advance("(number)");break;default:error("E003",state.tokens.next)}}var api,declared,functions,inblock,indent,lookahead,lex,member,membersOnly,predefined,stack,urls,bang={"<":!0,"<=":!0,"==":!0,"===":!0,"!==":!0,"!=":!0,">":!0,">=":!0,"+":!0,"-":!0,"*":!0,"/":!0,"%":!0},functionicity=["closure","exception","global","label","outer","unused","var"],extraModules=[],emitter=new events.EventEmitter,typeofValues={};typeofValues.legacy=["xml","unknown"],typeofValues.es3=["undefined","boolean","number","string","function","object"],typeofValues.es3=typeofValues.es3.concat(typeofValues.legacy),typeofValues.es6=typeofValues.es3.concat("symbol"),type("(number)",function(){return this}),type("(string)",function(){return this}),state.syntax["(identifier)"]={type:"(identifier)",lbp:0,identifier:!0,nud:function(){var v=this.value;return"=>"===state.tokens.next.id?this:(state.funct["(comparray)"].check(v)||state.funct["(scope)"].block.use(v,state.tokens.curr),this)},led:function(){error("E033",state.tokens.next,state.tokens.next.value)}};var baseTemplateSyntax={lbp:0,identifier:!1,template:!0};state.syntax["(template)"]=_.extend({type:"(template)",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!1},baseTemplateSyntax),state.syntax["(template middle)"]=_.extend({type:"(template middle)",middle:!0,noSubst:!1},baseTemplateSyntax),state.syntax["(template tail)"]=_.extend({type:"(template tail)",tail:!0,noSubst:!1},baseTemplateSyntax),state.syntax["(no subst template)"]=_.extend({type:"(template)",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!0,tail:!0},baseTemplateSyntax),type("(regexp)",function(){return this}),delim("(endline)"),delim("(begin)"),delim("(end)").reach=!0,delim("(error)").reach=!0,delim("}").reach=!0,delim(")"),delim("]"),delim(\'"\').reach=!0,delim("\'").reach=!0,delim(";"),delim(":").reach=!0,delim("#"),reserve("else"),reserve("case").reach=!0,reserve("catch"),reserve("default").reach=!0,reserve("finally"),reservevar("arguments",function(x){state.isStrict()&&state.funct["(global)"]&&warning("E008",x)}),reservevar("eval"),reservevar("false"),reservevar("Infinity"),reservevar("null"),reservevar("this",function(x){state.isStrict()&&!isMethod()&&!state.option.validthis&&(state.funct["(statement)"]&&state.funct["(name)"].charAt(0)>"Z"||state.funct["(global)"])&&warning("W040",x)}),reservevar("true"),reservevar("undefined"),assignop("=","assign",20),assignop("+=","assignadd",20),assignop("-=","assignsub",20),assignop("*=","assignmult",20),assignop("/=","assigndiv",20).nud=function(){error("E014")},assignop("%=","assignmod",20),bitwiseassignop("&="),bitwiseassignop("|="),bitwiseassignop("^="),bitwiseassignop("<<="),bitwiseassignop(">>="),bitwiseassignop(">>>="),infix(",",function(left,that){var expr;if(that.exprs=[left],state.option.nocomma&&warning("W127"),!comma({peek:!0}))return that;for(;;){if(!(expr=expression(10)))break;if(that.exprs.push(expr),","!==state.tokens.next.value||!comma())break}return that},10,!0),infix("?",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(10),advance(":"),that["else"]=expression(10),that},30);var orPrecendence=40;infix("||",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(orPrecendence),that},orPrecendence),infix("&&","and",50),bitwise("|","bitor",70),bitwise("^","bitxor",80),bitwise("&","bitand",90),relation("==",function(left,right){var eqnull=state.option.eqnull&&("null"===(left&&left.value)||"null"===(right&&right.value));switch(!0){case!eqnull&&state.option.eqeqeq:this.from=this.character,warning("W116",this,"===","==");break;case isPoorRelation(left):warning("W041",this,"===",left.value);break;case isPoorRelation(right):warning("W041",this,"===",right.value);break;case isTypoTypeof(right,left,state):warning("W122",this,right.value);break;case isTypoTypeof(left,right,state):warning("W122",this,left.value)}return this}),relation("===",function(left,right){return isTypoTypeof(right,left,state)?warning("W122",this,right.value):isTypoTypeof(left,right,state)&&warning("W122",this,left.value),this}),relation("!=",function(left,right){var eqnull=state.option.eqnull&&("null"===(left&&left.value)||"null"===(right&&right.value));return!eqnull&&state.option.eqeqeq?(this.from=this.character,warning("W116",this,"!==","!=")):isPoorRelation(left)?warning("W041",this,"!==",left.value):isPoorRelation(right)?warning("W041",this,"!==",right.value):isTypoTypeof(right,left,state)?warning("W122",this,right.value):isTypoTypeof(left,right,state)&&warning("W122",this,left.value),this}),relation("!==",function(left,right){return isTypoTypeof(right,left,state)?warning("W122",this,right.value):isTypoTypeof(left,right,state)&&warning("W122",this,left.value),this}),relation("<"),relation(">"),relation("<="),relation(">="),bitwise("<<","shiftleft",120),bitwise(">>","shiftright",120),bitwise(">>>","shiftrightunsigned",120),infix("in","in",120),infix("instanceof","instanceof",120),infix("+",function(left,that){var right;return that.left=left,that.right=right=expression(130),left&&right&&"(string)"===left.id&&"(string)"===right.id?(left.value+=right.value,left.character=right.character,!state.option.scripturl&®.javascriptURL.test(left.value)&&warning("W050",left),left):that},130),prefix("+","num"),prefix("+++",function(){return warning("W007"),this.arity="unary",this.right=expression(150),this}),infix("+++",function(left){return warning("W007"),this.left=left,this.right=expression(130),this},130),infix("-","sub",130),prefix("-","neg"),prefix("---",function(){return warning("W006"),this.arity="unary",this.right=expression(150),this}),infix("---",function(left){return warning("W006"),this.left=left,this.right=expression(130),this},130),infix("*","mult",140),infix("/","div",140),infix("%","mod",140),suffix("++"),prefix("++","preinc"),state.syntax["++"].exps=!0,suffix("--"),prefix("--","predec"),state.syntax["--"].exps=!0,prefix("delete",function(){var p=expression(10);return p?("."!==p.id&&"["!==p.id&&warning("W051"),this.first=p,p.identifier&&!state.isStrict()&&(p.forgiveUndef=!0),this):this}).exps=!0,prefix("~",function(){return state.option.bitwise&&warning("W016",this,"~"),this.arity="unary",this.right=expression(150),this}),prefix("...",function(){return state.inES6(!0)||warning("W119",this,"spread/rest operator","6"),state.tokens.next.identifier||"(string)"===state.tokens.next.type||checkPunctuators(state.tokens.next,["[","("])||error("E030",state.tokens.next,state.tokens.next.value),expression(150),this}),prefix("!",function(){return this.arity="unary",this.right=expression(150),this.right||quit("E041",this.line||0),bang[this.right.id]===!0&&warning("W018",this,"!"),this}),prefix("typeof",function(){var p=expression(150);return this.first=this.right=p,p||quit("E041",this.line||0,this.character||0),p.identifier&&(p.forgiveUndef=!0),this}),prefix("new",function(){var mp=metaProperty("target",function(){state.inES6(!0)||warning("W119",state.tokens.prev,"new.target","6");for(var inFunction,c=state.funct;c&&(inFunction=!c["(global)"],c["(arrow)"]);)c=c["(context)"];inFunction||warning("W136",state.tokens.prev,"new.target")});if(mp)return mp;var i,c=expression(155);if(c&&"function"!==c.id)if(c.identifier)switch(c["new"]=!0,c.value){case"Number":case"String":case"Boolean":case"Math":case"JSON":warning("W053",state.tokens.prev,c.value);break;case"Symbol":state.inES6()&&warning("W053",state.tokens.prev,c.value);break;case"Function":state.option.evil||warning("W054");break;case"Date":case"RegExp":case"this":break;default:"function"!==c.id&&(i=c.value.substr(0,1),state.option.newcap&&("A">i||i>"Z")&&!state.funct["(scope)"].isPredefined(c.value)&&warning("W055",state.tokens.curr))}else"."!==c.id&&"["!==c.id&&"("!==c.id&&warning("W056",state.tokens.curr);else state.option.supernew||warning("W057",this);return"("===state.tokens.next.id||state.option.supernew||warning("W058",state.tokens.curr,state.tokens.curr.value),this.first=this.right=c,this}),state.syntax["new"].exps=!0,prefix("void").exps=!0,infix(".",function(left,that){var m=identifier(!1,!0);return"string"==typeof m&&countMember(m),that.left=left,that.right=m,m&&"hasOwnProperty"===m&&"="===state.tokens.next.value&&warning("W001"),!left||"arguments"!==left.value||"callee"!==m&&"caller"!==m?state.option.evil||!left||"document"!==left.value||"write"!==m&&"writeln"!==m||warning("W060",left):state.option.noarg?warning("W059",left,m):state.isStrict()&&error("E008"),state.option.evil||"eval"!==m&&"execScript"!==m||isGlobalEval(left,state)&&warning("W061"),that},160,!0),infix("(",function(left,that){state.option.immed&&left&&!left.immed&&"function"===left.id&&warning("W062");var n=0,p=[];if(left&&"(identifier)"===left.type&&left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&-1==="Array Number String Boolean Date Object Error Symbol".indexOf(left.value)&&("Math"===left.value?warning("W063",left):state.option.newcap&&warning("W064",left)),")"!==state.tokens.next.id)for(;p[p.length]=expression(10),n+=1,","===state.tokens.next.id;)comma();return advance(")"),"object"==typeof left&&(state.inES5()||"parseInt"!==left.value||1!==n||warning("W065",state.tokens.curr),state.option.evil||("eval"===left.value||"Function"===left.value||"execScript"===left.value?(warning("W061",left),p[0]&&"(string)"===[0].id&&addInternalSrc(left,p[0].value)):!p[0]||"(string)"!==p[0].id||"setTimeout"!==left.value&&"setInterval"!==left.value?!p[0]||"(string)"!==p[0].id||"."!==left.value||"window"!==left.left.value||"setTimeout"!==left.right&&"setInterval"!==left.right||(warning("W066",left),addInternalSrc(left,p[0].value)):(warning("W066",left),addInternalSrc(left,p[0].value))),left.identifier||"."===left.id||"["===left.id||"=>"===left.id||"("===left.id||"&&"===left.id||"||"===left.id||"?"===left.id||state.inES6()&&left["(name)"]||warning("W067",that)),that.left=left,that},155,!0).exps=!0,prefix("(",function(){var pn1,ret,triggerFnExpr,first,last,pn=state.tokens.next,i=-1,parens=1,opening=state.tokens.curr,preceeding=state.tokens.prev,isNecessary=!state.option.singleGroups;do"("===pn.value?parens+=1:")"===pn.value&&(parens-=1),i+=1,pn1=pn,pn=peek(i);while((0!==parens||")"!==pn1.value)&&";"!==pn.value&&"(end)"!==pn.type);if("function"===state.tokens.next.id&&(triggerFnExpr=state.tokens.next.immed=!0),"=>"===pn.value)return doFunction({type:"arrow",parsedOpening:!0});var exprs=[];if(")"!==state.tokens.next.id)for(;exprs.push(expression(10)),","===state.tokens.next.id;)state.option.nocomma&&warning("W127"),comma();return advance(")",this),state.option.immed&&exprs[0]&&"function"===exprs[0].id&&"("!==state.tokens.next.id&&"."!==state.tokens.next.id&&"["!==state.tokens.next.id&&warning("W068",this),exprs.length?(exprs.length>1?(ret=Object.create(state.syntax[","]),ret.exprs=exprs,first=exprs[0],last=exprs[exprs.length-1],isNecessary||(isNecessary=preceeding.assign||preceeding.delim)):(ret=first=last=exprs[0],isNecessary||(isNecessary=opening.beginsStmt&&("{"===ret.id||triggerFnExpr||isFunctor(ret))||triggerFnExpr&&(!isEndOfExpr()||"}"!==state.tokens.prev.id)||isFunctor(ret)&&!isEndOfExpr()||"{"===ret.id&&"=>"===preceeding.id||"(number)"===ret.type&&checkPunctuator(pn,".")&&/^\\d+$/.test(ret.value))),ret&&(!isNecessary&&(first.left||first.right||ret.exprs)&&(isNecessary=!isBeginOfExpr(preceeding)&&first.lbp<=preceeding.lbp||!isEndOfExpr()&&last.lbp"),infix("[",function(left,that){var s,e=expression(10);return e&&"(string)"===e.type&&(state.option.evil||"eval"!==e.value&&"execScript"!==e.value||isGlobalEval(left,state)&&warning("W061"),countMember(e.value),!state.option.sub&®.identifier.test(e.value)&&(s=state.syntax[e.value],s&&isReserved(s)||warning("W069",state.tokens.prev,e.value))),advance("]",that),e&&"hasOwnProperty"===e.value&&"="===state.tokens.next.value&&warning("W001"),that.left=left,that.right=e,that},160,!0),prefix("[",function(){var blocktype=lookupBlockType();if(blocktype.isCompArray)return state.option.esnext||state.inMoz()||warning("W118",state.tokens.curr,"array comprehension"),comprehensiveArrayExpression();if(blocktype.isDestAssign)return this.destructAssign=destructuringPattern({openingParsed:!0,assignment:!0}),this;var b=state.tokens.curr.line!==startLine(state.tokens.next);for(this.first=[],b&&(indent+=state.option.indent,state.tokens.next.from===indent+state.option.indent&&(indent+=state.option.indent));"(end)"!==state.tokens.next.id;){for(;","===state.tokens.next.id;){if(!state.option.elision){if(state.inES5()){warning("W128");do advance(",");while(","===state.tokens.next.id);continue}warning("W070")}advance(",")}if("]"===state.tokens.next.id)break;if(this.first.push(expression(10)),","!==state.tokens.next.id)break;if(comma({allowTrailing:!0}),"]"===state.tokens.next.id&&!state.inES5()){warning("W070",state.tokens.curr);break}}return b&&(indent-=state.option.indent),advance("]",this),this}),function(x){x.nud=function(){var b,f,i,p,t,nextVal,isGeneratorMethod=!1,props=Object.create(null);b=state.tokens.curr.line!==startLine(state.tokens.next),b&&(indent+=state.option.indent,state.tokens.next.from===indent+state.option.indent&&(indent+=state.option.indent));var blocktype=lookupBlockType();if(blocktype.isDestAssign)return this.destructAssign=destructuringPattern({openingParsed:!0,assignment:!0}),this;for(;"}"!==state.tokens.next.id;){if(nextVal=state.tokens.next.value,!state.tokens.next.identifier||","!==peekIgnoreEOL().id&&"}"!==peekIgnoreEOL().id)if(":"===peek().id||"get"!==nextVal&&"set"!==nextVal){if("*"===state.tokens.next.value&&"(punctuator)"===state.tokens.next.type?(state.inES6()||warning("W104",state.tokens.next,"generator functions","6"),advance("*"),isGeneratorMethod=!0):isGeneratorMethod=!1,"["===state.tokens.next.id)i=computedPropertyName(),state.nameStack.set(i);else if(state.nameStack.set(state.tokens.next),i=propertyName(),saveProperty(props,i,state.tokens.next),"string"!=typeof i)break;"("===state.tokens.next.value?(state.inES6()||warning("W104",state.tokens.curr,"concise methods","6"),doFunction({type:isGeneratorMethod?"generator":null})):(advance(":"),expression(10))}else advance(nextVal),state.inES5()||error("E034"),i=propertyName(),i||state.inES6()||error("E035"),i&&saveAccessor(nextVal,props,i,state.tokens.curr),t=state.tokens.next,f=doFunction(),p=f["(params)"],"get"===nextVal&&i&&p?warning("W076",t,p[0],i):"set"!==nextVal||!i||p&&1===p.length||warning("W077",t,i);else state.inES6()||warning("W104",state.tokens.next,"object short notation","6"),i=propertyName(!0),saveProperty(props,i,state.tokens.next),expression(10);if(countMember(i),","!==state.tokens.next.id)break;comma({allowTrailing:!0,property:!0}),","===state.tokens.next.id?warning("W070",state.tokens.curr):"}"!==state.tokens.next.id||state.inES5()||warning("W070",state.tokens.curr)}return b&&(indent-=state.option.indent),advance("}",this),checkProperties(props),this},x.fud=function(){error("E036",state.tokens.curr)}}(delim("{"));var conststatement=stmt("const",function(context){return blockVariableStatement("const",this,context)});conststatement.exps=!0;var letstatement=stmt("let",function(context){return blockVariableStatement("let",this,context)});letstatement.exps=!0;var varstatement=stmt("var",function(context){var tokens,lone,value,prefix=context&&context.prefix,inexport=context&&context.inexport,implied=context&&context.implied,report=!(context&&context.ignore);for(this.first=[];;){var names=[];_.contains(["{","["],state.tokens.next.value)?(tokens=destructuringPattern(),lone=!1):(tokens=[{id:identifier(),token:state.tokens.curr}],lone=!0),prefix&&implied||!report||!state.option.varstmt||warning("W132",this),this.first=this.first.concat(names);for(var t in tokens)tokens.hasOwnProperty(t)&&(t=tokens[t],!implied&&state.funct["(global)"]&&(predefined[t.id]===!1?warning("W079",t.token,t.id):state.option.futurehostile===!1&&(!state.inES5()&&vars.ecmaIdentifiers[5][t.id]===!1||!state.inES6()&&vars.ecmaIdentifiers[6][t.id]===!1)&&warning("W129",t.token,t.id)),t.id&&("for"===implied?(state.funct["(scope)"].has(t.id)||report&&warning("W088",t.token,t.id),state.funct["(scope)"].block.use(t.id,t.token)):(state.funct["(scope)"].addlabel(t.id,{type:"var",token:t.token}),lone&&inexport&&state.funct["(scope)"].setExported(t.id,t.token)),names.push(t.token)));if("="===state.tokens.next.id&&(state.nameStack.set(state.tokens.curr),advance("="),prefix||!report||state.funct["(loopage)"]||"undefined"!==state.tokens.next.id||warning("W080",state.tokens.prev,state.tokens.prev.value),"="===peek(0).id&&state.tokens.next.identifier&&(!prefix&&report&&!state.funct["(params)"]||-1===state.funct["(params)"].indexOf(state.tokens.next.value))&&warning("W120",state.tokens.next,state.tokens.next.value),value=expression(prefix?120:10),lone?tokens[0].first=value:destructuringPatternMatch(names,value)),","!==state.tokens.next.id)break;comma()}return this});varstatement.exps=!0,blockstmt("class",function(){return classdef.call(this,!0)}),blockstmt("function",function(context){var inexport=context&&context.inexport,generator=!1;"*"===state.tokens.next.value&&(advance("*"),state.inES6({strict:!0})?generator=!0:warning("W119",state.tokens.curr,"function*","6")),inblock&&warning("W082",state.tokens.curr);var i=optionalidentifier();return state.funct["(scope)"].addlabel(i,{type:"function",token:state.tokens.curr}),void 0===i?warning("W025"):inexport&&state.funct["(scope)"].setExported(i,state.tokens.prev),doFunction({name:i,statement:this,type:generator?"generator":null,ignoreLoopFunc:inblock}),"("===state.tokens.next.id&&state.tokens.next.line===state.tokens.curr.line&&error("E039"),this}),prefix("function",function(){var generator=!1;"*"===state.tokens.next.value&&(state.inES6()||warning("W119",state.tokens.curr,"function*","6"),advance("*"),generator=!0);var i=optionalidentifier();return doFunction({name:i,type:generator?"generator":null}),this}),blockstmt("if",function(){var t=state.tokens.next;increaseComplexityCount(),state.condition=!0,advance("(");var expr=expression(0);checkCondAssignment(expr);var forinifcheck=null;state.option.forin&&state.forinifcheckneeded&&(state.forinifcheckneeded=!1,forinifcheck=state.forinifchecks[state.forinifchecks.length-1],forinifcheck.type="(punctuator)"===expr.type&&"!"===expr.value?"(negative)":"(positive)"),advance(")",t),state.condition=!1;var s=block(!0,!0);return forinifcheck&&"(negative)"===forinifcheck.type&&s&&s[0]&&"(identifier)"===s[0].type&&"continue"===s[0].value&&(forinifcheck.type="(negative-with-continue)"),"else"===state.tokens.next.id&&(advance("else"),"if"===state.tokens.next.id||"switch"===state.tokens.next.id?statement():block(!0,!0)),this}),blockstmt("try",function(){function doCatch(){if(advance("catch"),advance("("),state.funct["(scope)"].stack("catchparams"),checkPunctuators(state.tokens.next,["[","{"])){var tokens=destructuringPattern();_.each(tokens,function(token){token.id&&state.funct["(scope)"].addParam(token.id,token,"exception")})}else"(identifier)"!==state.tokens.next.type?warning("E030",state.tokens.next,state.tokens.next.value):state.funct["(scope)"].addParam(identifier(),state.tokens.curr,"exception");"if"===state.tokens.next.value&&(state.inMoz()||warning("W118",state.tokens.curr,"catch filter"),advance("if"),expression(0)),advance(")"),block(!1),state.funct["(scope)"].unstack()}var b;for(block(!0);"catch"===state.tokens.next.id;)increaseComplexityCount(),b&&!state.inMoz()&&warning("W118",state.tokens.next,"multiple catch blocks"),doCatch(),b=!0;return"finally"===state.tokens.next.id?(advance("finally"),block(!0),void 0):(b||error("E021",state.tokens.next,"catch",state.tokens.next.value),this)}),blockstmt("while",function(){var t=state.tokens.next;return state.funct["(breakage)"]+=1,state.funct["(loopage)"]+=1,increaseComplexityCount(),advance("("),checkCondAssignment(expression(0)),advance(")",t),block(!0,!0),state.funct["(breakage)"]-=1,state.funct["(loopage)"]-=1,this}).labelled=!0,blockstmt("with",function(){var t=state.tokens.next;return state.isStrict()?error("E010",state.tokens.curr):state.option.withstmt||warning("W085",state.tokens.curr),advance("("),expression(0),advance(")",t),block(!0,!0),this}),blockstmt("switch",function(){var t=state.tokens.next,g=!1,noindent=!1;\nfor(state.funct["(breakage)"]+=1,advance("("),checkCondAssignment(expression(0)),advance(")",t),t=state.tokens.next,advance("{"),state.tokens.next.from===indent&&(noindent=!0),noindent||(indent+=state.option.indent),this.cases=[];;)switch(state.tokens.next.id){case"case":switch(state.funct["(verb)"]){case"yield":case"break":case"case":case"continue":case"return":case"switch":case"throw":break;default:state.tokens.curr.caseFallsThrough||warning("W086",state.tokens.curr,"case")}advance("case"),this.cases.push(expression(0)),increaseComplexityCount(),g=!0,advance(":"),state.funct["(verb)"]="case";break;case"default":switch(state.funct["(verb)"]){case"yield":case"break":case"continue":case"return":case"throw":break;default:this.cases.length&&(state.tokens.curr.caseFallsThrough||warning("W086",state.tokens.curr,"default"))}advance("default"),g=!0,advance(":");break;case"}":return noindent||(indent-=state.option.indent),advance("}",t),state.funct["(breakage)"]-=1,state.funct["(verb)"]=void 0,void 0;case"(end)":return error("E023",state.tokens.next,"}"),void 0;default:if(indent+=state.option.indent,g)switch(state.tokens.curr.id){case",":return error("E040"),void 0;case":":g=!1,statements();break;default:return error("E025",state.tokens.curr),void 0}else{if(":"!==state.tokens.curr.id)return error("E021",state.tokens.next,"case",state.tokens.next.value),void 0;advance(":"),error("E024",state.tokens.curr,":"),statements()}indent-=state.option.indent}return this}).labelled=!0,stmt("debugger",function(){return state.option.debug||warning("W087",this),this}).exps=!0,function(){var x=stmt("do",function(){state.funct["(breakage)"]+=1,state.funct["(loopage)"]+=1,increaseComplexityCount(),this.first=block(!0,!0),advance("while");var t=state.tokens.next;return advance("("),checkCondAssignment(expression(0)),advance(")",t),state.funct["(breakage)"]-=1,state.funct["(loopage)"]-=1,this});x.labelled=!0,x.exps=!0}(),blockstmt("for",function(){var s,t=state.tokens.next,letscope=!1,foreachtok=null;"each"===t.value&&(foreachtok=t,advance("each"),state.inMoz()||warning("W118",state.tokens.curr,"for each")),increaseComplexityCount(),advance("(");var nextop,comma,initializer,i=0,inof=["in","of"],level=0;checkPunctuators(state.tokens.next,["{","["])&&++level;do{if(nextop=peek(i),++i,checkPunctuators(nextop,["{","["])?++level:checkPunctuators(nextop,["}","]"])&&--level,0>level)break;0===level&&(!comma&&checkPunctuator(nextop,",")?comma=nextop:!initializer&&checkPunctuator(nextop,"=")&&(initializer=nextop))}while(level>0||!_.contains(inof,nextop.value)&&";"!==nextop.value&&"(end)"!==nextop.type);if(_.contains(inof,nextop.value)){state.inES6()||"of"!==nextop.value||warning("W104",nextop,"for of","6");var ok=!(initializer||comma);if(initializer&&error("W133",comma,nextop.value,"initializer is forbidden"),comma&&error("W133",comma,nextop.value,"more than one ForBinding"),"var"===state.tokens.next.id?(advance("var"),state.tokens.curr.fud({prefix:!0})):"let"===state.tokens.next.id||"const"===state.tokens.next.id?(advance(state.tokens.next.id),letscope=!0,state.funct["(scope)"].stack(),state.tokens.curr.fud({prefix:!0})):Object.create(varstatement).fud({prefix:!0,implied:"for",ignore:!ok}),advance(nextop.value),expression(20),advance(")",t),"in"===nextop.value&&state.option.forin&&(state.forinifcheckneeded=!0,void 0===state.forinifchecks&&(state.forinifchecks=[]),state.forinifchecks.push({type:"(none)"})),state.funct["(breakage)"]+=1,state.funct["(loopage)"]+=1,s=block(!0,!0),"in"===nextop.value&&state.option.forin){if(state.forinifchecks&&state.forinifchecks.length>0){var check=state.forinifchecks.pop();(s&&s.length>0&&("object"!=typeof s[0]||"if"!==s[0].value)||"(positive)"===check.type&&s.length>1||"(negative)"===check.type)&&warning("W089",this)}state.forinifcheckneeded=!1}state.funct["(breakage)"]-=1,state.funct["(loopage)"]-=1}else{if(foreachtok&&error("E045",foreachtok),";"!==state.tokens.next.id)if("var"===state.tokens.next.id)advance("var"),state.tokens.curr.fud();else if("let"===state.tokens.next.id)advance("let"),letscope=!0,state.funct["(scope)"].stack(),state.tokens.curr.fud();else for(;expression(0,"for"),","===state.tokens.next.id;)comma();if(nolinebreak(state.tokens.curr),advance(";"),state.funct["(loopage)"]+=1,";"!==state.tokens.next.id&&checkCondAssignment(expression(0)),nolinebreak(state.tokens.curr),advance(";"),";"===state.tokens.next.id&&error("E021",state.tokens.next,")",";"),")"!==state.tokens.next.id)for(;expression(0,"for"),","===state.tokens.next.id;)comma();advance(")",t),state.funct["(breakage)"]+=1,block(!0,!0),state.funct["(breakage)"]-=1,state.funct["(loopage)"]-=1}return letscope&&state.funct["(scope)"].unstack(),this}).labelled=!0,stmt("break",function(){var v=state.tokens.next.value;return state.option.asi||nolinebreak(this),";"===state.tokens.next.id||state.tokens.next.reach||state.tokens.curr.line!==startLine(state.tokens.next)?0===state.funct["(breakage)"]&&warning("W052",state.tokens.next,this.value):(state.funct["(scope)"].funct.hasBreakLabel(v)||warning("W090",state.tokens.next,v),this.first=state.tokens.next,advance()),reachable(this),this}).exps=!0,stmt("continue",function(){var v=state.tokens.next.value;return 0===state.funct["(breakage)"]&&warning("W052",state.tokens.next,this.value),state.funct["(loopage)"]||warning("W052",state.tokens.next,this.value),state.option.asi||nolinebreak(this),";"===state.tokens.next.id||state.tokens.next.reach||state.tokens.curr.line===startLine(state.tokens.next)&&(state.funct["(scope)"].funct.hasBreakLabel(v)||warning("W090",state.tokens.next,v),this.first=state.tokens.next,advance()),reachable(this),this}).exps=!0,stmt("return",function(){return this.line===startLine(state.tokens.next)?";"===state.tokens.next.id||state.tokens.next.reach||(this.first=expression(0),!this.first||"(punctuator)"!==this.first.type||"="!==this.first.value||this.first.paren||state.option.boss||warningAt("W093",this.first.line,this.first.character)):"(punctuator)"===state.tokens.next.type&&["[","{","+","-"].indexOf(state.tokens.next.value)>-1&&nolinebreak(this),reachable(this),this}).exps=!0,function(x){x.exps=!0,x.lbp=25}(prefix("yield",function(){var prev=state.tokens.prev;state.inES6(!0)&&!state.funct["(generator)"]?"(catch)"===state.funct["(name)"]&&state.funct["(context)"]["(generator)"]||error("E046",state.tokens.curr,"yield"):state.inES6()||warning("W104",state.tokens.curr,"yield","6"),state.funct["(generator)"]="yielded";var delegatingYield=!1;return"*"===state.tokens.next.value&&(delegatingYield=!0,advance("*")),this.line!==startLine(state.tokens.next)&&state.inMoz()?state.option.asi||nolinebreak(this):((delegatingYield||";"!==state.tokens.next.id&&!state.option.asi&&!state.tokens.next.reach&&state.tokens.next.nud)&&(nobreaknonadjacent(state.tokens.curr,state.tokens.next),this.first=expression(10),"(punctuator)"!==this.first.type||"="!==this.first.value||this.first.paren||state.option.boss||warningAt("W093",this.first.line,this.first.character)),state.inMoz()&&")"!==state.tokens.next.id&&(prev.lbp>30||!prev.assign&&!isEndOfExpr()||"yield"===prev.id)&&error("E050",this)),this})),stmt("throw",function(){return nolinebreak(this),this.first=expression(20),reachable(this),this}).exps=!0,stmt("import",function(){if(state.inES6()||warning("W119",state.tokens.curr,"import","6"),"(string)"===state.tokens.next.type)return advance("(string)"),this;if(state.tokens.next.identifier){if(this.name=identifier(),state.funct["(scope)"].addlabel(this.name,{type:"const",token:state.tokens.curr}),","!==state.tokens.next.value)return advance("from"),advance("(string)"),this;advance(",")}if("*"===state.tokens.next.id)advance("*"),advance("as"),state.tokens.next.identifier&&(this.name=identifier(),state.funct["(scope)"].addlabel(this.name,{type:"const",token:state.tokens.curr}));else for(advance("{");;){if("}"===state.tokens.next.value){advance("}");break}var importName;if("default"===state.tokens.next.type?(importName="default",advance("default")):importName=identifier(),"as"===state.tokens.next.value&&(advance("as"),importName=identifier()),state.funct["(scope)"].addlabel(importName,{type:"const",token:state.tokens.curr}),","!==state.tokens.next.value){if("}"===state.tokens.next.value){advance("}");break}error("E024",state.tokens.next,state.tokens.next.value);break}advance(",")}return advance("from"),advance("(string)"),this}).exps=!0,stmt("export",function(){var token,identifier,ok=!0;if(state.inES6()||(warning("W119",state.tokens.curr,"export","6"),ok=!1),state.funct["(scope)"].block.isGlobal()||(error("E053",state.tokens.curr),ok=!1),"*"===state.tokens.next.value)return advance("*"),advance("from"),advance("(string)"),this;if("default"===state.tokens.next.type){state.nameStack.set(state.tokens.next),advance("default");var exportType=state.tokens.next.id;return("function"===exportType||"class"===exportType)&&(this.block=!0),token=peek(),expression(10),identifier=token.value,this.block&&(state.funct["(scope)"].addlabel(identifier,{type:exportType,token:token}),state.funct["(scope)"].setExported(identifier,token)),this}if("{"===state.tokens.next.value){advance("{");for(var exportedTokens=[];;){if(state.tokens.next.identifier||error("E030",state.tokens.next,state.tokens.next.value),advance(),exportedTokens.push(state.tokens.curr),"as"===state.tokens.next.value&&(advance("as"),state.tokens.next.identifier||error("E030",state.tokens.next,state.tokens.next.value),advance()),","!==state.tokens.next.value){if("}"===state.tokens.next.value){advance("}");break}error("E024",state.tokens.next,state.tokens.next.value);break}advance(",")}return"from"===state.tokens.next.value?(advance("from"),advance("(string)")):ok&&exportedTokens.forEach(function(token){state.funct["(scope)"].setExported(token.value,token)}),this}if("var"===state.tokens.next.id)advance("var"),state.tokens.curr.fud({inexport:!0});else if("let"===state.tokens.next.id)advance("let"),state.tokens.curr.fud({inexport:!0});else if("const"===state.tokens.next.id)advance("const"),state.tokens.curr.fud({inexport:!0});else if("function"===state.tokens.next.id)this.block=!0,advance("function"),state.syntax["function"].fud({inexport:!0});else if("class"===state.tokens.next.id){this.block=!0,advance("class");var classNameToken=state.tokens.next;state.syntax["class"].fud(),state.funct["(scope)"].setExported(classNameToken.value,classNameToken)}else error("E024",state.tokens.next,state.tokens.next.value);return this}).exps=!0,FutureReservedWord("abstract"),FutureReservedWord("boolean"),FutureReservedWord("byte"),FutureReservedWord("char"),FutureReservedWord("class",{es5:!0,nud:classdef}),FutureReservedWord("double"),FutureReservedWord("enum",{es5:!0}),FutureReservedWord("export",{es5:!0}),FutureReservedWord("extends",{es5:!0}),FutureReservedWord("final"),FutureReservedWord("float"),FutureReservedWord("goto"),FutureReservedWord("implements",{es5:!0,strictOnly:!0}),FutureReservedWord("import",{es5:!0}),FutureReservedWord("int"),FutureReservedWord("interface",{es5:!0,strictOnly:!0}),FutureReservedWord("long"),FutureReservedWord("native"),FutureReservedWord("package",{es5:!0,strictOnly:!0}),FutureReservedWord("private",{es5:!0,strictOnly:!0}),FutureReservedWord("protected",{es5:!0,strictOnly:!0}),FutureReservedWord("public",{es5:!0,strictOnly:!0}),FutureReservedWord("short"),FutureReservedWord("static",{es5:!0,strictOnly:!0}),FutureReservedWord("super",{es5:!0}),FutureReservedWord("synchronized"),FutureReservedWord("transient"),FutureReservedWord("volatile");var lookupBlockType=function(){var pn,pn1,prev,i=-1,bracketStack=0,ret={};checkPunctuators(state.tokens.curr,["[","{"])&&(bracketStack+=1);do{if(prev=-1===i?state.tokens.curr:pn,pn=-1===i?state.tokens.next:peek(i),pn1=peek(i+1),i+=1,checkPunctuators(pn,["[","{"])?bracketStack+=1:checkPunctuators(pn,["]","}"])&&(bracketStack-=1),1===bracketStack&&pn.identifier&&"for"===pn.value&&!checkPunctuator(prev,".")){ret.isCompArray=!0,ret.notJson=!0;break}if(0===bracketStack&&checkPunctuators(pn,["}","]"])){if("="===pn1.value){ret.isDestAssign=!0,ret.notJson=!0;break}if("."===pn1.value){ret.notJson=!0;break}}checkPunctuator(pn,";")&&(ret.isBlock=!0,ret.notJson=!0)}while(bracketStack>0&&"(end)"!==pn.id);return ret},arrayComprehension=function(){function declare(v){var l=_current.variables.filter(function(elt){return elt.value===v?(elt.undef=!1,v):void 0}).length;return 0!==l}function use(v){var l=_current.variables.filter(function(elt){return elt.value!==v||elt.undef?void 0:(elt.unused===!0&&(elt.unused=!1),v)}).length;return 0===l}var _current,CompArray=function(){this.mode="use",this.variables=[]},_carrays=[];return{stack:function(){_current=new CompArray,_carrays.push(_current)},unstack:function(){_current.variables.filter(function(v){v.unused&&warning("W098",v.token,v.raw_text||v.value),v.undef&&state.funct["(scope)"].block.use(v.value,v.token)}),_carrays.splice(-1,1),_current=_carrays[_carrays.length-1]},setState:function(s){_.contains(["use","define","generate","filter"],s)&&(_current.mode=s)},check:function(v){return _current?_current&&"use"===_current.mode?(use(v)&&_current.variables.push({funct:state.funct,token:state.tokens.curr,value:v,undef:!0,unused:!1}),!0):_current&&"define"===_current.mode?(declare(v)||_current.variables.push({funct:state.funct,token:state.tokens.curr,value:v,undef:!1,unused:!0}),!0):_current&&"generate"===_current.mode?(state.funct["(scope)"].block.use(v,state.tokens.curr),!0):_current&&"filter"===_current.mode?(use(v)&&state.funct["(scope)"].block.use(v,state.tokens.curr),!0):!1:void 0}}},escapeRegex=function(str){return str.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,"\\\\$&")},itself=function(s,o,g){function each(obj,cb){obj&&(Array.isArray(obj)||"object"!=typeof obj||(obj=Object.keys(obj)),obj.forEach(cb))}var i,k,x,reIgnoreStr,reIgnore,optionKeys,newOptionObj={},newIgnoredObj={};o=_.clone(o),state.reset(),o&&o.scope?JSHINT.scope=o.scope:(JSHINT.errors=[],JSHINT.undefs=[],JSHINT.internals=[],JSHINT.blacklist={},JSHINT.scope="(main)"),predefined=Object.create(null),combine(predefined,vars.ecmaIdentifiers[3]),combine(predefined,vars.reservedVars),combine(predefined,g||{}),declared=Object.create(null);var exported=Object.create(null);if(o)for(each(o.predef||null,function(item){var slice,prop;"-"===item[0]?(slice=item.slice(1),JSHINT.blacklist[slice]=slice,delete predefined[slice]):(prop=Object.getOwnPropertyDescriptor(o.predef,item),predefined[item]=prop?prop.value:!1)}),each(o.exported||null,function(item){exported[item]=!0}),delete o.predef,delete o.exported,optionKeys=Object.keys(o),x=0;optionKeys.length>x;x++)if(/^-W\\d{3}$/g.test(optionKeys[x]))newIgnoredObj[optionKeys[x].slice(1)]=!0;else{var optionKey=optionKeys[x];newOptionObj[optionKey]=o[optionKey],("esversion"===optionKey&&5===o[optionKey]||"es5"===optionKey&&o[optionKey])&&warning("I003"),"newcap"===optionKeys[x]&&o[optionKey]===!1&&(newOptionObj["(explicitNewcap)"]=!0)}state.option=newOptionObj,state.ignored=newIgnoredObj,state.option.indent=state.option.indent||4,state.option.maxerr=state.option.maxerr||50,indent=1;var scopeManagerInst=scopeManager(state,predefined,exported,declared);if(scopeManagerInst.on("warning",function(ev){warning.apply(null,[ev.code,ev.token].concat(ev.data))}),scopeManagerInst.on("error",function(ev){error.apply(null,[ev.code,ev.token].concat(ev.data))}),state.funct=functor("(global)",null,{"(global)":!0,"(scope)":scopeManagerInst,"(comparray)":arrayComprehension(),"(metrics)":createMetrics(state.tokens.next)}),functions=[state.funct],urls=[],stack=null,member={},membersOnly=null,inblock=!1,lookahead=[],!isString(s)&&!Array.isArray(s))return errorAt("E004",0),!1;api={get isJSON(){return state.jsonMode},getOption:function(name){return state.option[name]||null},getCache:function(name){return state.cache[name]},setCache:function(name,value){state.cache[name]=value},warn:function(code,data){warningAt.apply(null,[code,data.line,data.char].concat(data.data))},on:function(names,listener){names.split(" ").forEach(function(name){emitter.on(name,listener)}.bind(this))}},emitter.removeAllListeners(),(extraModules||[]).forEach(function(func){func(api)}),state.tokens.prev=state.tokens.curr=state.tokens.next=state.syntax["(begin)"],o&&o.ignoreDelimiters&&(Array.isArray(o.ignoreDelimiters)||(o.ignoreDelimiters=[o.ignoreDelimiters]),o.ignoreDelimiters.forEach(function(delimiterPair){delimiterPair.start&&delimiterPair.end&&(reIgnoreStr=escapeRegex(delimiterPair.start)+"[\\\\s\\\\S]*?"+escapeRegex(delimiterPair.end),reIgnore=RegExp(reIgnoreStr,"ig"),s=s.replace(reIgnore,function(match){return match.replace(/./g," ")}))})),lex=new Lexer(s),lex.on("warning",function(ev){warningAt.apply(null,[ev.code,ev.line,ev.character].concat(ev.data))}),lex.on("error",function(ev){errorAt.apply(null,[ev.code,ev.line,ev.character].concat(ev.data))}),lex.on("fatal",function(ev){quit("E041",ev.line,ev.from)}),lex.on("Identifier",function(ev){emitter.emit("Identifier",ev)}),lex.on("String",function(ev){emitter.emit("String",ev)}),lex.on("Number",function(ev){emitter.emit("Number",ev)}),lex.start();for(var name in o)_.has(o,name)&&checkOption(name,state.tokens.curr);assume(),combine(predefined,g||{}),comma.first=!0;try{switch(advance(),state.tokens.next.id){case"{":case"[":destructuringAssignOrJsonValue();break;default:directives(),state.directive["use strict"]&&"global"!==state.option.strict&&warning("W097",state.tokens.prev),statements()}"(end)"!==state.tokens.next.id&&quit("E041",state.tokens.curr.line),state.funct["(scope)"].unstack()}catch(err){if(!err||"JSHintError"!==err.name)throw err;var nt=state.tokens.next||{};JSHINT.errors.push({scope:"(main)",raw:err.raw,code:err.code,reason:err.message,line:err.line||nt.line,character:err.character||nt.from},null)}if("(main)"===JSHINT.scope)for(o=o||{},i=0;JSHINT.internals.length>i;i+=1)k=JSHINT.internals[i],o.scope=k.elem,itself(k.value,o,g);return 0===JSHINT.errors.length};return itself.addModule=function(func){extraModules.push(func)},itself.addModule(style.register),itself.data=function(){var fu,f,i,j,n,globals,data={functions:[],options:state.option};itself.errors.length&&(data.errors=itself.errors),state.jsonMode&&(data.json=!0);var impliedGlobals=state.funct["(scope)"].getImpliedGlobals();for(impliedGlobals.length>0&&(data.implieds=impliedGlobals),urls.length>0&&(data.urls=urls),globals=state.funct["(scope)"].getUsedOrDefinedGlobals(),globals.length>0&&(data.globals=globals),i=1;functions.length>i;i+=1){for(f=functions[i],fu={},j=0;functionicity.length>j;j+=1)fu[functionicity[j]]=[];for(j=0;functionicity.length>j;j+=1)0===fu[functionicity[j]].length&&delete fu[functionicity[j]];fu.name=f["(name)"],fu.param=f["(params)"],fu.line=f["(line)"],fu.character=f["(character)"],fu.last=f["(last)"],fu.lastcharacter=f["(lastcharacter)"],fu.metrics={complexity:f["(metrics)"].ComplexityCount,parameters:f["(metrics)"].arity,statements:f["(metrics)"].statementCount},data.functions.push(fu)}var unuseds=state.funct["(scope)"].getUnuseds();unuseds.length>0&&(data.unused=unuseds);for(n in member)if("number"==typeof member[n]){data.member=member;break}return data},itself.jshint=itself,itself}();"object"==typeof exports&&exports&&(exports.JSHINT=JSHINT)},{"../lodash":"/node_modules/jshint/lodash.js","./lex.js":"/node_modules/jshint/src/lex.js","./messages.js":"/node_modules/jshint/src/messages.js","./options.js":"/node_modules/jshint/src/options.js","./reg.js":"/node_modules/jshint/src/reg.js","./scope-manager.js":"/node_modules/jshint/src/scope-manager.js","./state.js":"/node_modules/jshint/src/state.js","./style.js":"/node_modules/jshint/src/style.js","./vars.js":"/node_modules/jshint/src/vars.js",events:"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/lex.js":[function(_dereq_,module,exports){"use strict";function asyncTrigger(){var _checks=[];return{push:function(fn){_checks.push(fn)},check:function(){for(var check=0;_checks.length>check;++check)_checks[check]();_checks.splice(0,_checks.length)}}}function Lexer(source){var lines=source;"string"==typeof lines&&(lines=lines.replace(/\\r\\n/g,"\\n").replace(/\\r/g,"\\n").split("\\n")),lines[0]&&"#!"===lines[0].substr(0,2)&&(-1!==lines[0].indexOf("node")&&(state.option.node=!0),lines[0]=""),this.emitter=new events.EventEmitter,this.source=source,this.setLines(lines),this.prereg=!0,this.line=0,this.char=1,this.from=1,this.input="",this.inComment=!1,this.context=[],this.templateStarts=[];for(var i=0;state.option.indent>i;i+=1)state.tab+=" ";this.ignoreLinterErrors=!1}var _=_dereq_("../lodash"),events=_dereq_("events"),reg=_dereq_("./reg.js"),state=_dereq_("./state.js").state,unicodeData=_dereq_("../data/ascii-identifier-data.js"),asciiIdentifierStartTable=unicodeData.asciiIdentifierStartTable,asciiIdentifierPartTable=unicodeData.asciiIdentifierPartTable,Token={Identifier:1,Punctuator:2,NumericLiteral:3,StringLiteral:4,Comment:5,Keyword:6,NullLiteral:7,BooleanLiteral:8,RegExp:9,TemplateHead:10,TemplateMiddle:11,TemplateTail:12,NoSubstTemplate:13},Context={Block:1,Template:2};Lexer.prototype={_lines:[],inContext:function(ctxType){return this.context.length>0&&this.context[this.context.length-1].type===ctxType},pushContext:function(ctxType){this.context.push({type:ctxType})},popContext:function(){return this.context.pop()},isContext:function(context){return this.context.length>0&&this.context[this.context.length-1]===context},currentContext:function(){return this.context.length>0&&this.context[this.context.length-1]},getLines:function(){return this._lines=state.lines,this._lines},setLines:function(val){this._lines=val,state.lines=this._lines},peek:function(i){return this.input.charAt(i||0)},skip:function(i){i=i||1,this.char+=i,this.input=this.input.slice(i)},on:function(names,listener){names.split(" ").forEach(function(name){this.emitter.on(name,listener)}.bind(this))},trigger:function(){this.emitter.emit.apply(this.emitter,Array.prototype.slice.call(arguments))},triggerAsync:function(type,args,checks,fn){checks.push(function(){fn()&&this.trigger(type,args)}.bind(this))},scanPunctuator:function(){var ch2,ch3,ch4,ch1=this.peek();switch(ch1){case".":if(/^[0-9]$/.test(this.peek(1)))return null;if("."===this.peek(1)&&"."===this.peek(2))return{type:Token.Punctuator,value:"..."};case"(":case")":case";":case",":case"[":case"]":case":":case"~":case"?":return{type:Token.Punctuator,value:ch1};case"{":return this.pushContext(Context.Block),{type:Token.Punctuator,value:ch1};case"}":return this.inContext(Context.Block)&&this.popContext(),{type:Token.Punctuator,value:ch1};case"#":return{type:Token.Punctuator,value:ch1};case"":return null}return ch2=this.peek(1),ch3=this.peek(2),ch4=this.peek(3),">"===ch1&&">"===ch2&&">"===ch3&&"="===ch4?{type:Token.Punctuator,value:">>>="}:"="===ch1&&"="===ch2&&"="===ch3?{type:Token.Punctuator,value:"==="}:"!"===ch1&&"="===ch2&&"="===ch3?{type:Token.Punctuator,value:"!=="}:">"===ch1&&">"===ch2&&">"===ch3?{type:Token.Punctuator,value:">>>"}:"<"===ch1&&"<"===ch2&&"="===ch3?{type:Token.Punctuator,value:"<<="}:">"===ch1&&">"===ch2&&"="===ch3?{type:Token.Punctuator,value:">>="}:"="===ch1&&">"===ch2?{type:Token.Punctuator,value:ch1+ch2}:ch1===ch2&&"+-<>&|".indexOf(ch1)>=0?{type:Token.Punctuator,value:ch1+ch2}:"<>=!+-*%&|^".indexOf(ch1)>=0?"="===ch2?{type:Token.Punctuator,value:ch1+ch2}:{type:Token.Punctuator,value:ch1}:"/"===ch1?"="===ch2?{type:Token.Punctuator,value:"/="}:{type:Token.Punctuator,value:"/"}:null},scanComments:function(){function commentToken(label,body,opt){var special=["jshint","jslint","members","member","globals","global","exported"],isSpecial=!1,value=label+body,commentType="plain";return opt=opt||{},opt.isMultiline&&(value+="*/"),body=body.replace(/\\n/g," "),"/*"===label&®.fallsThrough.test(body)&&(isSpecial=!0,commentType="falls through"),special.forEach(function(str){if(!isSpecial&&("//"!==label||"jshint"===str)&&(" "===body.charAt(str.length)&&body.substr(0,str.length)===str&&(isSpecial=!0,label+=str,body=body.substr(str.length)),isSpecial||" "!==body.charAt(0)||" "!==body.charAt(str.length+1)||body.substr(1,str.length)!==str||(isSpecial=!0,label=label+" "+str,body=body.substr(str.length+1)),isSpecial))switch(str){case"member":commentType="members";break;case"global":commentType="globals";break;default:var options=body.split(":").map(function(v){return v.replace(/^\\s+/,"").replace(/\\s+$/,"")});if(2===options.length)switch(options[0]){case"ignore":switch(options[1]){case"start":self.ignoringLinterErrors=!0,isSpecial=!1;break;case"end":self.ignoringLinterErrors=!1,isSpecial=!1}}commentType=str}}),{type:Token.Comment,commentType:commentType,value:value,body:body,isSpecial:isSpecial,isMultiline:opt.isMultiline||!1,isMalformed:opt.isMalformed||!1}}var ch1=this.peek(),ch2=this.peek(1),rest=this.input.substr(2),startLine=this.line,startChar=this.char,self=this;if("*"===ch1&&"/"===ch2)return this.trigger("error",{code:"E018",line:startLine,character:startChar}),this.skip(2),null;if("/"!==ch1||"*"!==ch2&&"/"!==ch2)return null;if("/"===ch2)return this.skip(this.input.length),commentToken("//",rest);var body="";if("*"===ch2){for(this.inComment=!0,this.skip(2);"*"!==this.peek()||"/"!==this.peek(1);)if(""===this.peek()){if(body+="\\n",!this.nextLine())return this.trigger("error",{code:"E017",line:startLine,character:startChar}),this.inComment=!1,commentToken("/*",body,{isMultiline:!0,isMalformed:!0})}else body+=this.peek(),this.skip();return this.skip(2),this.inComment=!1,commentToken("/*",body,{isMultiline:!0})}},scanKeyword:function(){var result=/^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input),keywords=["if","in","do","var","for","new","try","let","this","else","case","void","with","enum","while","break","catch","throw","const","yield","class","super","return","typeof","delete","switch","export","import","default","finally","extends","function","continue","debugger","instanceof"];return result&&keywords.indexOf(result[0])>=0?{type:Token.Keyword,value:result[0]}:null},scanIdentifier:function(){function isNonAsciiIdentifierStart(code){return code>256}function isNonAsciiIdentifierPart(code){return code>256}function isHexDigit(str){return/^[0-9a-fA-F]$/.test(str)}function removeEscapeSequences(id){return id.replace(/\\\\u([0-9a-fA-F]{4})/g,function(m0,codepoint){return String.fromCharCode(parseInt(codepoint,16))})}var type,char,id="",index=0,readUnicodeEscapeSequence=function(){if(index+=1,"u"!==this.peek(index))return null;var code,ch1=this.peek(index+1),ch2=this.peek(index+2),ch3=this.peek(index+3),ch4=this.peek(index+4);return isHexDigit(ch1)&&isHexDigit(ch2)&&isHexDigit(ch3)&&isHexDigit(ch4)?(code=parseInt(ch1+ch2+ch3+ch4,16),asciiIdentifierPartTable[code]||isNonAsciiIdentifierPart(code)?(index+=5,"\\\\u"+ch1+ch2+ch3+ch4):null):null}.bind(this),getIdentifierStart=function(){var chr=this.peek(index),code=chr.charCodeAt(0);return 92===code?readUnicodeEscapeSequence():128>code?asciiIdentifierStartTable[code]?(index+=1,chr):null:isNonAsciiIdentifierStart(code)?(index+=1,chr):null}.bind(this),getIdentifierPart=function(){var chr=this.peek(index),code=chr.charCodeAt(0);return 92===code?readUnicodeEscapeSequence():128>code?asciiIdentifierPartTable[code]?(index+=1,chr):null:isNonAsciiIdentifierPart(code)?(index+=1,chr):null}.bind(this);if(char=getIdentifierStart(),null===char)return null;for(id=char;char=getIdentifierPart(),null!==char;)id+=char;switch(id){case"true":case"false":type=Token.BooleanLiteral;break;case"null":type=Token.NullLiteral;break;default:type=Token.Identifier}return{type:type,value:removeEscapeSequences(id),text:id,tokenLength:id.length}},scanNumericLiteral:function(){function isDecimalDigit(str){return/^[0-9]$/.test(str)}function isOctalDigit(str){return/^[0-7]$/.test(str)}function isBinaryDigit(str){return/^[01]$/.test(str)}function isHexDigit(str){return/^[0-9a-fA-F]$/.test(str)}function isIdentifierStart(ch){return"$"===ch||"_"===ch||"\\\\"===ch||ch>="a"&&"z">=ch||ch>="A"&&"Z">=ch}var bad,index=0,value="",length=this.input.length,char=this.peek(index),isAllowedDigit=isDecimalDigit,base=10,isLegacy=!1;if("."!==char&&!isDecimalDigit(char))return null;if("."!==char){for(value=this.peek(index),index+=1,char=this.peek(index),"0"===value&&(("x"===char||"X"===char)&&(isAllowedDigit=isHexDigit,base=16,index+=1,value+=char),("o"===char||"O"===char)&&(isAllowedDigit=isOctalDigit,base=8,state.inES6(!0)||this.trigger("warning",{code:"W119",line:this.line,character:this.char,data:["Octal integer literal","6"]}),index+=1,value+=char),("b"===char||"B"===char)&&(isAllowedDigit=isBinaryDigit,base=2,state.inES6(!0)||this.trigger("warning",{code:"W119",line:this.line,character:this.char,data:["Binary integer literal","6"]}),index+=1,value+=char),isOctalDigit(char)&&(isAllowedDigit=isOctalDigit,base=8,isLegacy=!0,bad=!1,index+=1,value+=char),!isOctalDigit(char)&&isDecimalDigit(char)&&(index+=1,value+=char));length>index;){if(char=this.peek(index),isLegacy&&isDecimalDigit(char))bad=!0;else if(!isAllowedDigit(char))break;value+=char,index+=1}if(isAllowedDigit!==isDecimalDigit)return!isLegacy&&2>=value.length?{type:Token.NumericLiteral,value:value,isMalformed:!0}:length>index&&(char=this.peek(index),isIdentifierStart(char))?null:{type:Token.NumericLiteral,value:value,base:base,isLegacy:isLegacy,isMalformed:!1}}if("."===char)for(value+=char,index+=1;length>index&&(char=this.peek(index),isDecimalDigit(char));)value+=char,index+=1;if("e"===char||"E"===char){if(value+=char,index+=1,char=this.peek(index),("+"===char||"-"===char)&&(value+=this.peek(index),index+=1),char=this.peek(index),!isDecimalDigit(char))return null;for(value+=char,index+=1;length>index&&(char=this.peek(index),isDecimalDigit(char));)value+=char,index+=1}return length>index&&(char=this.peek(index),isIdentifierStart(char))?null:{type:Token.NumericLiteral,value:value,base:base,isMalformed:!isFinite(value)}},scanEscapeSequence:function(checks){var allowNewLine=!1,jump=1;this.skip();var char=this.peek();switch(char){case"\'":this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\\\\'"]},checks,function(){return state.jsonMode});break;case"b":char="\\\\b";break;case"f":char="\\\\f";break;case"n":char="\\\\n";break;case"r":char="\\\\r";break;case"t":char="\\\\t";break;case"0":char="\\\\0";var n=parseInt(this.peek(1),10);this.triggerAsync("warning",{code:"W115",line:this.line,character:this.char},checks,function(){return n>=0&&7>=n&&state.isStrict()});break;case"u":var hexCode=this.input.substr(1,4),code=parseInt(hexCode,16);isNaN(code)&&this.trigger("warning",{code:"W052",line:this.line,character:this.char,data:["u"+hexCode]}),char=String.fromCharCode(code),jump=5;break;case"v":this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\\\v"]},checks,function(){return state.jsonMode}),char="\v";break;case"x":var x=parseInt(this.input.substr(1,2),16);this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\\\x-"]},checks,function(){return state.jsonMode}),char=String.fromCharCode(x),jump=3;break;case"\\\\":char="\\\\\\\\";break;case\'"\':char=\'\\\\"\';break;case"/":break;case"":allowNewLine=!0,char=""}return{"char":char,jump:jump,allowNewLine:allowNewLine}},scanTemplateLiteral:function(checks){var tokenType,ch,value="",startLine=this.line,startChar=this.char,depth=this.templateStarts.length;if(!state.inES6(!0))return null;if("`"===this.peek())tokenType=Token.TemplateHead,this.templateStarts.push({line:this.line,"char":this.char}),depth=this.templateStarts.length,this.skip(1),this.pushContext(Context.Template);else{if(!this.inContext(Context.Template)||"}"!==this.peek())return null;tokenType=Token.TemplateMiddle}for(;"`"!==this.peek();){for(;""===(ch=this.peek());)if(value+="\\n",!this.nextLine()){var startPos=this.templateStarts.pop();return this.trigger("error",{code:"E052",line:startPos.line,character:startPos.char}),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!0,depth:depth,context:this.popContext()}}if("$"===ch&&"{"===this.peek(1))return value+="${",this.skip(2),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,depth:depth,context:this.currentContext()};\nif("\\\\"===ch){var escape=this.scanEscapeSequence(checks);value+=escape.char,this.skip(escape.jump)}else"`"!==ch&&(value+=ch,this.skip(1))}return tokenType=tokenType===Token.TemplateHead?Token.NoSubstTemplate:Token.TemplateTail,this.skip(1),this.templateStarts.pop(),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,depth:depth,context:this.popContext()}},scanStringLiteral:function(checks){var quote=this.peek();if(\'"\'!==quote&&"\'"!==quote)return null;this.triggerAsync("warning",{code:"W108",line:this.line,character:this.char},checks,function(){return state.jsonMode&&\'"\'!==quote});var value="",startLine=this.line,startChar=this.char,allowNewLine=!1;for(this.skip();this.peek()!==quote;)if(""===this.peek()){if(allowNewLine?(allowNewLine=!1,this.triggerAsync("warning",{code:"W043",line:this.line,character:this.char},checks,function(){return!state.option.multistr}),this.triggerAsync("warning",{code:"W042",line:this.line,character:this.char},checks,function(){return state.jsonMode&&state.option.multistr})):this.trigger("warning",{code:"W112",line:this.line,character:this.char}),!this.nextLine())return this.trigger("error",{code:"E029",line:startLine,character:startChar}),{type:Token.StringLiteral,value:value,startLine:startLine,startChar:startChar,isUnclosed:!0,quote:quote}}else{allowNewLine=!1;var char=this.peek(),jump=1;if(" ">char&&this.trigger("warning",{code:"W113",line:this.line,character:this.char,data:[""]}),"\\\\"===char){var parsed=this.scanEscapeSequence(checks);char=parsed.char,jump=parsed.jump,allowNewLine=parsed.allowNewLine}value+=char,this.skip(jump)}return this.skip(),{type:Token.StringLiteral,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,quote:quote}},scanRegExp:function(){var terminated,index=0,length=this.input.length,char=this.peek(),value=char,body="",flags=[],malformed=!1,isCharSet=!1,scanUnexpectedChars=function(){" ">char&&(malformed=!0,this.trigger("warning",{code:"W048",line:this.line,character:this.char})),"<"===char&&(malformed=!0,this.trigger("warning",{code:"W049",line:this.line,character:this.char,data:[char]}))}.bind(this);if(!this.prereg||"/"!==char)return null;for(index+=1,terminated=!1;length>index;)if(char=this.peek(index),value+=char,body+=char,isCharSet)"]"===char&&("\\\\"!==this.peek(index-1)||"\\\\"===this.peek(index-2))&&(isCharSet=!1),"\\\\"===char&&(index+=1,char=this.peek(index),body+=char,value+=char,scanUnexpectedChars()),index+=1;else{if("\\\\"===char){if(index+=1,char=this.peek(index),body+=char,value+=char,scanUnexpectedChars(),"/"===char){index+=1;continue}if("["===char){index+=1;continue}}if("["!==char){if("/"===char){body=body.substr(0,body.length-1),terminated=!0,index+=1;break}index+=1}else isCharSet=!0,index+=1}if(!terminated)return this.trigger("error",{code:"E015",line:this.line,character:this.from}),void this.trigger("fatal",{line:this.line,from:this.from});for(;length>index&&(char=this.peek(index),/[gim]/.test(char));)flags.push(char),value+=char,index+=1;try{RegExp(body,flags.join(""))}catch(err){malformed=!0,this.trigger("error",{code:"E016",line:this.line,character:this.char,data:[err.message]})}return{type:Token.RegExp,value:value,flags:flags,isMalformed:malformed}},scanNonBreakingSpaces:function(){return state.option.nonbsp?this.input.search(/(\\u00A0)/):-1},scanUnsafeChars:function(){return this.input.search(reg.unsafeChars)},next:function(checks){this.from=this.char;var start;if(/\\s/.test(this.peek()))for(start=this.char;/\\s/.test(this.peek());)this.from+=1,this.skip();var match=this.scanComments()||this.scanStringLiteral(checks)||this.scanTemplateLiteral(checks);return match?match:(match=this.scanRegExp()||this.scanPunctuator()||this.scanKeyword()||this.scanIdentifier()||this.scanNumericLiteral(),match?(this.skip(match.tokenLength||match.value.length),match):null)},nextLine:function(){var char;if(this.line>=this.getLines().length)return!1;this.input=this.getLines()[this.line],this.line+=1,this.char=1,this.from=1;var inputTrimmed=this.input.trim(),startsWith=function(){return _.some(arguments,function(prefix){return 0===inputTrimmed.indexOf(prefix)})},endsWith=function(){return _.some(arguments,function(suffix){return-1!==inputTrimmed.indexOf(suffix,inputTrimmed.length-suffix.length)})};if(this.ignoringLinterErrors===!0&&(startsWith("/*","//")||this.inComment&&endsWith("*/")||(this.input="")),char=this.scanNonBreakingSpaces(),char>=0&&this.trigger("warning",{code:"W125",line:this.line,character:char+1}),this.input=this.input.replace(/\\t/g,state.tab),char=this.scanUnsafeChars(),char>=0&&this.trigger("warning",{code:"W100",line:this.line,character:char}),!this.ignoringLinterErrors&&state.option.maxlen&&state.option.maxlen=0;--i){var scopeLabels=_scopeStack[i]["(labels)"];if(scopeLabels[labelName])return scopeLabels}}function usedSoFarInCurrentFunction(labelName){for(var i=_scopeStack.length-1;i>=0;i--){var current=_scopeStack[i];if(current["(usages)"][labelName])return current["(usages)"][labelName];if(current===_currentFunctBody)break}return!1}function _checkOuterShadow(labelName,token){if("outer"===state.option.shadow)for(var isGlobal="global"===_currentFunctBody["(type)"],isNewFunction="functionparams"===_current["(type)"],outsideCurrentFunction=!isGlobal,i=0;_scopeStack.length>i;i++){var stackItem=_scopeStack[i];isNewFunction||_scopeStack[i+1]!==_currentFunctBody||(outsideCurrentFunction=!1),outsideCurrentFunction&&stackItem["(labels)"][labelName]&&warning("W123",token,labelName),stackItem["(breakLabels)"][labelName]&&warning("W123",token,labelName)}}function _latedefWarning(type,labelName,token){state.option.latedef&&(state.option.latedef===!0&&"function"===type||"function"!==type)&&warning("W003",token,labelName)}var _current,_scopeStack=[];_newScope("global"),_current["(predefined)"]=predefined;var _currentFunctBody=_current,usedPredefinedAndGlobals=Object.create(null),impliedGlobals=Object.create(null),unuseds=[],emitter=new events.EventEmitter,_getUnusedOption=function(unused_opt){return void 0===unused_opt&&(unused_opt=state.option.unused),unused_opt===!0&&(unused_opt="last-param"),unused_opt},_warnUnused=function(name,tkn,type,unused_opt){var line=tkn.line,chr=tkn.from,raw_name=tkn.raw_text||name;unused_opt=_getUnusedOption(unused_opt);var warnable_types={vars:["var"],"last-param":["var","param"],strict:["var","param","last-param"]};unused_opt&&warnable_types[unused_opt]&&-1!==warnable_types[unused_opt].indexOf(type)&&warning("W098",{line:line,from:chr},raw_name),(unused_opt||"var"===type)&&unuseds.push({name:name,line:line,character:chr})},scopeManagerInst={on:function(names,listener){names.split(" ").forEach(function(name){emitter.on(name,listener)})},isPredefined:function(labelName){return!this.has(labelName)&&_.has(_scopeStack[0]["(predefined)"],labelName)},stack:function(type){var previousScope=_current;_newScope(type),type||"functionparams"!==previousScope["(type)"]||(_current["(isFuncBody)"]=!0,_current["(context)"]=_currentFunctBody,_currentFunctBody=_current)},unstack:function(){var i,j,subScope=_scopeStack.length>1?_scopeStack[_scopeStack.length-2]:null,isUnstackingFunctionBody=_current===_currentFunctBody,isUnstackingFunctionParams="functionparams"===_current["(type)"],isUnstackingFunctionOuter="functionouter"===_current["(type)"],currentUsages=_current["(usages)"],currentLabels=_current["(labels)"],usedLabelNameList=Object.keys(currentUsages);for(currentUsages.__proto__&&-1===usedLabelNameList.indexOf("__proto__")&&usedLabelNameList.push("__proto__"),i=0;usedLabelNameList.length>i;i++){var usedLabelName=usedLabelNameList[i],usage=currentUsages[usedLabelName],usedLabel=currentLabels[usedLabelName];if(usedLabel){var usedLabelType=usedLabel["(type)"];if(usedLabel["(useOutsideOfScope)"]&&!state.option.funcscope){var usedTokens=usage["(tokens)"];if(usedTokens)for(j=0;usedTokens.length>j;j++)usedLabel["(function)"]===usedTokens[j]["(function)"]&&error("W038",usedTokens[j],usedLabelName)}if(_current["(labels)"][usedLabelName]["(unused)"]=!1,"const"===usedLabelType&&usage["(modified)"])for(j=0;usage["(modified)"].length>j;j++)error("E013",usage["(modified)"][j],usedLabelName);if(("function"===usedLabelType||"class"===usedLabelType)&&usage["(reassigned)"])for(j=0;usage["(reassigned)"].length>j;j++)error("W021",usage["(reassigned)"][j],usedLabelName,usedLabelType)}else if(isUnstackingFunctionOuter&&(state.funct["(isCapturing)"]=!0),subScope)if(subScope["(usages)"][usedLabelName]){var subScopeUsage=subScope["(usages)"][usedLabelName];subScopeUsage["(modified)"]=subScopeUsage["(modified)"].concat(usage["(modified)"]),subScopeUsage["(tokens)"]=subScopeUsage["(tokens)"].concat(usage["(tokens)"]),subScopeUsage["(reassigned)"]=subScopeUsage["(reassigned)"].concat(usage["(reassigned)"]),subScopeUsage["(onlyUsedSubFunction)"]=!1}else subScope["(usages)"][usedLabelName]=usage,isUnstackingFunctionBody&&(subScope["(usages)"][usedLabelName]["(onlyUsedSubFunction)"]=!0);else if("boolean"==typeof _current["(predefined)"][usedLabelName]){if(delete declared[usedLabelName],usedPredefinedAndGlobals[usedLabelName]=marker,_current["(predefined)"][usedLabelName]===!1&&usage["(reassigned)"])for(j=0;usage["(reassigned)"].length>j;j++)warning("W020",usage["(reassigned)"][j])}else if(usage["(tokens)"])for(j=0;usage["(tokens)"].length>j;j++){var undefinedToken=usage["(tokens)"][j];undefinedToken.forgiveUndef||(state.option.undef&&!undefinedToken.ignoreUndef&&warning("W117",undefinedToken,usedLabelName),impliedGlobals[usedLabelName]?impliedGlobals[usedLabelName].line.push(undefinedToken.line):impliedGlobals[usedLabelName]={name:usedLabelName,line:[undefinedToken.line]})}}if(subScope||Object.keys(declared).forEach(function(labelNotUsed){_warnUnused(labelNotUsed,declared[labelNotUsed],"var")}),subScope&&!isUnstackingFunctionBody&&!isUnstackingFunctionParams&&!isUnstackingFunctionOuter){var labelNames=Object.keys(currentLabels);for(i=0;labelNames.length>i;i++){var defLabelName=labelNames[i];currentLabels[defLabelName]["(blockscoped)"]||"exception"===currentLabels[defLabelName]["(type)"]||this.funct.has(defLabelName,{excludeCurrent:!0})||(subScope["(labels)"][defLabelName]=currentLabels[defLabelName],"global"!==_currentFunctBody["(type)"]&&(subScope["(labels)"][defLabelName]["(useOutsideOfScope)"]=!0),delete currentLabels[defLabelName])}}_checkForUnused(),_scopeStack.pop(),isUnstackingFunctionBody&&(_currentFunctBody=_scopeStack[_.findLastIndex(_scopeStack,function(scope){return scope["(isFuncBody)"]||"global"===scope["(type)"]})]),_current=subScope},addParam:function(labelName,token,type){if(type=type||"param","exception"===type){var previouslyDefinedLabelType=this.funct.labeltype(labelName);previouslyDefinedLabelType&&"exception"!==previouslyDefinedLabelType&&(state.option.node||warning("W002",state.tokens.next,labelName))}if(_.has(_current["(labels)"],labelName)?_current["(labels)"][labelName].duplicated=!0:(_checkOuterShadow(labelName,token,type),_current["(labels)"][labelName]={"(type)":type,"(token)":token,"(unused)":!0},_current["(params)"].push(labelName)),_.has(_current["(usages)"],labelName)){var usage=_current["(usages)"][labelName];usage["(onlyUsedSubFunction)"]?_latedefWarning(type,labelName,token):warning("E056",token,labelName,type)}},validateParams:function(){if("global"!==_currentFunctBody["(type)"]){var isStrict=state.isStrict(),currentFunctParamScope=_currentFunctBody["(parent)"];currentFunctParamScope["(params)"]&¤tFunctParamScope["(params)"].forEach(function(labelName){var label=currentFunctParamScope["(labels)"][labelName];label&&label.duplicated&&(isStrict?warning("E011",label["(token)"],labelName):state.option.shadow!==!0&&warning("W004",label["(token)"],labelName))})}},getUsedOrDefinedGlobals:function(){var list=Object.keys(usedPredefinedAndGlobals);return usedPredefinedAndGlobals.__proto__===marker&&-1===list.indexOf("__proto__")&&list.push("__proto__"),list},getImpliedGlobals:function(){var values=_.values(impliedGlobals),hasProto=!1;return impliedGlobals.__proto__&&(hasProto=values.some(function(value){return"__proto__"===value.name}),hasProto||values.push(impliedGlobals.__proto__)),values},getUnuseds:function(){return unuseds},has:function(labelName){return Boolean(_getLabel(labelName))},labeltype:function(labelName){var scopeLabels=_getLabel(labelName);return scopeLabels?scopeLabels[labelName]["(type)"]:null},addExported:function(labelName){var globalLabels=_scopeStack[0]["(labels)"];if(_.has(declared,labelName))delete declared[labelName];else if(_.has(globalLabels,labelName))globalLabels[labelName]["(unused)"]=!1;else{for(var i=1;_scopeStack.length>i;i++){var scope=_scopeStack[i];if(scope["(type)"])break;if(_.has(scope["(labels)"],labelName)&&!scope["(labels)"][labelName]["(blockscoped)"])return scope["(labels)"][labelName]["(unused)"]=!1,void 0}exported[labelName]=!0}},setExported:function(labelName,token){this.block.use(labelName,token)\n},addlabel:function(labelName,opts){var type=opts.type,token=opts.token,isblockscoped="let"===type||"const"===type||"class"===type,isexported="global"===(isblockscoped?_current:_currentFunctBody)["(type)"]&&_.has(exported,labelName);if(_checkOuterShadow(labelName,token,type),isblockscoped){var declaredInCurrentScope=_current["(labels)"][labelName];if(declaredInCurrentScope||_current!==_currentFunctBody||"global"===_current["(type)"]||(declaredInCurrentScope=!!_currentFunctBody["(parent)"]["(labels)"][labelName]),!declaredInCurrentScope&&_current["(usages)"][labelName]){var usage=_current["(usages)"][labelName];usage["(onlyUsedSubFunction)"]?_latedefWarning(type,labelName,token):warning("E056",token,labelName,type)}declaredInCurrentScope?warning("E011",token,labelName):"outer"===state.option.shadow&&scopeManagerInst.funct.has(labelName)&&warning("W004",token,labelName),scopeManagerInst.block.add(labelName,type,token,!isexported)}else{var declaredInCurrentFunctionScope=scopeManagerInst.funct.has(labelName);!declaredInCurrentFunctionScope&&usedSoFarInCurrentFunction(labelName)&&_latedefWarning(type,labelName,token),scopeManagerInst.funct.has(labelName,{onlyBlockscoped:!0})?warning("E011",token,labelName):state.option.shadow!==!0&&declaredInCurrentFunctionScope&&"__proto__"!==labelName&&"global"!==_currentFunctBody["(type)"]&&warning("W004",token,labelName),scopeManagerInst.funct.add(labelName,type,token,!isexported),"global"===_currentFunctBody["(type)"]&&(usedPredefinedAndGlobals[labelName]=marker)}},funct:{labeltype:function(labelName,options){for(var onlyBlockscoped=options&&options.onlyBlockscoped,excludeParams=options&&options.excludeParams,currentScopeIndex=_scopeStack.length-(options&&options.excludeCurrent?2:1),i=currentScopeIndex;i>=0;i--){var current=_scopeStack[i];if(current["(labels)"][labelName]&&(!onlyBlockscoped||current["(labels)"][labelName]["(blockscoped)"]))return current["(labels)"][labelName]["(type)"];var scopeCheck=excludeParams?_scopeStack[i-1]:current;if(scopeCheck&&"functionparams"===scopeCheck["(type)"])return null}return null},hasBreakLabel:function(labelName){for(var i=_scopeStack.length-1;i>=0;i--){var current=_scopeStack[i];if(current["(breakLabels)"][labelName])return!0;if("functionparams"===current["(type)"])return!1}return!1},has:function(labelName,options){return Boolean(this.labeltype(labelName,options))},add:function(labelName,type,tok,unused){_current["(labels)"][labelName]={"(type)":type,"(token)":tok,"(blockscoped)":!1,"(function)":_currentFunctBody,"(unused)":unused}}},block:{isGlobal:function(){return"global"===_current["(type)"]},use:function(labelName,token){var paramScope=_currentFunctBody["(parent)"];paramScope&¶mScope["(labels)"][labelName]&&"param"===paramScope["(labels)"][labelName]["(type)"]&&(scopeManagerInst.funct.has(labelName,{excludeParams:!0,onlyBlockscoped:!0})||(paramScope["(labels)"][labelName]["(unused)"]=!1)),token&&(state.ignored.W117||state.option.undef===!1)&&(token.ignoreUndef=!0),_setupUsages(labelName),token&&(token["(function)"]=_currentFunctBody,_current["(usages)"][labelName]["(tokens)"].push(token))},reassign:function(labelName,token){this.modify(labelName,token),_current["(usages)"][labelName]["(reassigned)"].push(token)},modify:function(labelName,token){_setupUsages(labelName),_current["(usages)"][labelName]["(modified)"].push(token)},add:function(labelName,type,tok,unused){_current["(labels)"][labelName]={"(type)":type,"(token)":tok,"(blockscoped)":!0,"(unused)":unused}},addBreakLabel:function(labelName,opts){var token=opts.token;scopeManagerInst.funct.hasBreakLabel(labelName)?warning("E011",token,labelName):"outer"===state.option.shadow&&(scopeManagerInst.funct.has(labelName)?warning("W004",token,labelName):_checkOuterShadow(labelName,token)),_current["(breakLabels)"][labelName]=token}}};return scopeManagerInst};module.exports=scopeManager},{"../lodash":"/node_modules/jshint/lodash.js",events:"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/state.js":[function(_dereq_,module,exports){"use strict";var NameStack=_dereq_("./name-stack.js"),state={syntax:{},isStrict:function(){return this.directive["use strict"]||this.inClassBody||this.option.module||"implied"===this.option.strict},inMoz:function(){return this.option.moz},inES6:function(){return this.option.moz||this.option.esversion>=6},inES5:function(strict){return strict?!(this.option.esversion&&5!==this.option.esversion||this.option.moz):!this.option.esversion||this.option.esversion>=5||this.option.moz},reset:function(){this.tokens={prev:null,next:null,curr:null},this.option={},this.funct=null,this.ignored={},this.directive={},this.jsonMode=!1,this.jsonWarnings=[],this.lines=[],this.tab="",this.cache={},this.ignoredLines={},this.forinifcheckneeded=!1,this.nameStack=new NameStack,this.inClassBody=!1}};exports.state=state},{"./name-stack.js":"/node_modules/jshint/src/name-stack.js"}],"/node_modules/jshint/src/style.js":[function(_dereq_,module,exports){"use strict";exports.register=function(linter){linter.on("Identifier",function(data){linter.getOption("proto")||"__proto__"===data.name&&linter.warn("W103",{line:data.line,"char":data.char,data:[data.name,"6"]})}),linter.on("Identifier",function(data){linter.getOption("iterator")||"__iterator__"===data.name&&linter.warn("W103",{line:data.line,"char":data.char,data:[data.name]})}),linter.on("Identifier",function(data){linter.getOption("camelcase")&&data.name.replace(/^_+|_+$/g,"").indexOf("_")>-1&&!data.name.match(/^[A-Z0-9_]*$/)&&linter.warn("W106",{line:data.line,"char":data.from,data:[data.name]})}),linter.on("String",function(data){var code,quotmark=linter.getOption("quotmark");quotmark&&("single"===quotmark&&"\'"!==data.quote&&(code="W109"),"double"===quotmark&&\'"\'!==data.quote&&(code="W108"),quotmark===!0&&(linter.getCache("quotmark")||linter.setCache("quotmark",data.quote),linter.getCache("quotmark")!==data.quote&&(code="W110")),code&&linter.warn(code,{line:data.line,"char":data.char}))}),linter.on("Number",function(data){"."===data.value.charAt(0)&&linter.warn("W008",{line:data.line,"char":data.char,data:[data.value]}),"."===data.value.substr(data.value.length-1)&&linter.warn("W047",{line:data.line,"char":data.char,data:[data.value]}),/^00+/.test(data.value)&&linter.warn("W046",{line:data.line,"char":data.char,data:[data.value]})}),linter.on("String",function(data){var re=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\\s*:/i;linter.getOption("scripturl")||re.test(data.value)&&linter.warn("W107",{line:data.line,"char":data.char})})}},{}],"/node_modules/jshint/src/vars.js":[function(_dereq_,module,exports){"use strict";exports.reservedVars={arguments:!1,NaN:!1},exports.ecmaIdentifiers={3:{Array:!1,Boolean:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,isFinite:!1,isNaN:!1,Math:!1,Number:!1,Object:!1,parseInt:!1,parseFloat:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,TypeError:!1,URIError:!1},5:{JSON:!1},6:{Map:!1,Promise:!1,Proxy:!1,Reflect:!1,Set:!1,Symbol:!1,WeakMap:!1,WeakSet:!1}},exports.browser={Audio:!1,Blob:!1,addEventListener:!1,applicationCache:!1,atob:!1,blur:!1,btoa:!1,cancelAnimationFrame:!1,CanvasGradient:!1,CanvasPattern:!1,CanvasRenderingContext2D:!1,CSS:!1,clearInterval:!1,clearTimeout:!1,close:!1,closed:!1,Comment:!1,CustomEvent:!1,DOMParser:!1,defaultStatus:!1,Document:!1,document:!1,DocumentFragment:!1,Element:!1,ElementTimeControl:!1,Event:!1,event:!1,fetch:!1,FileReader:!1,FormData:!1,focus:!1,frames:!1,getComputedStyle:!1,HTMLElement:!1,HTMLAnchorElement:!1,HTMLBaseElement:!1,HTMLBlockquoteElement:!1,HTMLBodyElement:!1,HTMLBRElement:!1,HTMLButtonElement:!1,HTMLCanvasElement:!1,HTMLCollection:!1,HTMLDirectoryElement:!1,HTMLDivElement:!1,HTMLDListElement:!1,HTMLFieldSetElement:!1,HTMLFontElement:!1,HTMLFormElement:!1,HTMLFrameElement:!1,HTMLFrameSetElement:!1,HTMLHeadElement:!1,HTMLHeadingElement:!1,HTMLHRElement:!1,HTMLHtmlElement:!1,HTMLIFrameElement:!1,HTMLImageElement:!1,HTMLInputElement:!1,HTMLIsIndexElement:!1,HTMLLabelElement:!1,HTMLLayerElement:!1,HTMLLegendElement:!1,HTMLLIElement:!1,HTMLLinkElement:!1,HTMLMapElement:!1,HTMLMenuElement:!1,HTMLMetaElement:!1,HTMLModElement:!1,HTMLObjectElement:!1,HTMLOListElement:!1,HTMLOptGroupElement:!1,HTMLOptionElement:!1,HTMLParagraphElement:!1,HTMLParamElement:!1,HTMLPreElement:!1,HTMLQuoteElement:!1,HTMLScriptElement:!1,HTMLSelectElement:!1,HTMLStyleElement:!1,HTMLTableCaptionElement:!1,HTMLTableCellElement:!1,HTMLTableColElement:!1,HTMLTableElement:!1,HTMLTableRowElement:!1,HTMLTableSectionElement:!1,HTMLTemplateElement:!1,HTMLTextAreaElement:!1,HTMLTitleElement:!1,HTMLUListElement:!1,HTMLVideoElement:!1,history:!1,Image:!1,Intl:!1,length:!1,localStorage:!1,location:!1,matchMedia:!1,MessageChannel:!1,MessageEvent:!1,MessagePort:!1,MouseEvent:!1,moveBy:!1,moveTo:!1,MutationObserver:!1,name:!1,Node:!1,NodeFilter:!1,NodeList:!1,Notification:!1,navigator:!1,onbeforeunload:!0,onblur:!0,onerror:!0,onfocus:!0,onload:!0,onresize:!0,onunload:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,parent:!1,performance:!1,print:!1,Range:!1,requestAnimationFrame:!1,removeEventListener:!1,resizeBy:!1,resizeTo:!1,screen:!1,scroll:!1,scrollBy:!1,scrollTo:!1,sessionStorage:!1,setInterval:!1,setTimeout:!1,SharedWorker:!1,status:!1,SVGAElement:!1,SVGAltGlyphDefElement:!1,SVGAltGlyphElement:!1,SVGAltGlyphItemElement:!1,SVGAngle:!1,SVGAnimateColorElement:!1,SVGAnimateElement:!1,SVGAnimateMotionElement:!1,SVGAnimateTransformElement:!1,SVGAnimatedAngle:!1,SVGAnimatedBoolean:!1,SVGAnimatedEnumeration:!1,SVGAnimatedInteger:!1,SVGAnimatedLength:!1,SVGAnimatedLengthList:!1,SVGAnimatedNumber:!1,SVGAnimatedNumberList:!1,SVGAnimatedPathData:!1,SVGAnimatedPoints:!1,SVGAnimatedPreserveAspectRatio:!1,SVGAnimatedRect:!1,SVGAnimatedString:!1,SVGAnimatedTransformList:!1,SVGAnimationElement:!1,SVGCSSRule:!1,SVGCircleElement:!1,SVGClipPathElement:!1,SVGColor:!1,SVGColorProfileElement:!1,SVGColorProfileRule:!1,SVGComponentTransferFunctionElement:!1,SVGCursorElement:!1,SVGDefsElement:!1,SVGDescElement:!1,SVGDocument:!1,SVGElement:!1,SVGElementInstance:!1,SVGElementInstanceList:!1,SVGEllipseElement:!1,SVGExternalResourcesRequired:!1,SVGFEBlendElement:!1,SVGFEColorMatrixElement:!1,SVGFEComponentTransferElement:!1,SVGFECompositeElement:!1,SVGFEConvolveMatrixElement:!1,SVGFEDiffuseLightingElement:!1,SVGFEDisplacementMapElement:!1,SVGFEDistantLightElement:!1,SVGFEFloodElement:!1,SVGFEFuncAElement:!1,SVGFEFuncBElement:!1,SVGFEFuncGElement:!1,SVGFEFuncRElement:!1,SVGFEGaussianBlurElement:!1,SVGFEImageElement:!1,SVGFEMergeElement:!1,SVGFEMergeNodeElement:!1,SVGFEMorphologyElement:!1,SVGFEOffsetElement:!1,SVGFEPointLightElement:!1,SVGFESpecularLightingElement:!1,SVGFESpotLightElement:!1,SVGFETileElement:!1,SVGFETurbulenceElement:!1,SVGFilterElement:!1,SVGFilterPrimitiveStandardAttributes:!1,SVGFitToViewBox:!1,SVGFontElement:!1,SVGFontFaceElement:!1,SVGFontFaceFormatElement:!1,SVGFontFaceNameElement:!1,SVGFontFaceSrcElement:!1,SVGFontFaceUriElement:!1,SVGForeignObjectElement:!1,SVGGElement:!1,SVGGlyphElement:!1,SVGGlyphRefElement:!1,SVGGradientElement:!1,SVGHKernElement:!1,SVGICCColor:!1,SVGImageElement:!1,SVGLangSpace:!1,SVGLength:!1,SVGLengthList:!1,SVGLineElement:!1,SVGLinearGradientElement:!1,SVGLocatable:!1,SVGMPathElement:!1,SVGMarkerElement:!1,SVGMaskElement:!1,SVGMatrix:!1,SVGMetadataElement:!1,SVGMissingGlyphElement:!1,SVGNumber:!1,SVGNumberList:!1,SVGPaint:!1,SVGPathElement:!1,SVGPathSeg:!1,SVGPathSegArcAbs:!1,SVGPathSegArcRel:!1,SVGPathSegClosePath:!1,SVGPathSegCurvetoCubicAbs:!1,SVGPathSegCurvetoCubicRel:!1,SVGPathSegCurvetoCubicSmoothAbs:!1,SVGPathSegCurvetoCubicSmoothRel:!1,SVGPathSegCurvetoQuadraticAbs:!1,SVGPathSegCurvetoQuadraticRel:!1,SVGPathSegCurvetoQuadraticSmoothAbs:!1,SVGPathSegCurvetoQuadraticSmoothRel:!1,SVGPathSegLinetoAbs:!1,SVGPathSegLinetoHorizontalAbs:!1,SVGPathSegLinetoHorizontalRel:!1,SVGPathSegLinetoRel:!1,SVGPathSegLinetoVerticalAbs:!1,SVGPathSegLinetoVerticalRel:!1,SVGPathSegList:!1,SVGPathSegMovetoAbs:!1,SVGPathSegMovetoRel:!1,SVGPatternElement:!1,SVGPoint:!1,SVGPointList:!1,SVGPolygonElement:!1,SVGPolylineElement:!1,SVGPreserveAspectRatio:!1,SVGRadialGradientElement:!1,SVGRect:!1,SVGRectElement:!1,SVGRenderingIntent:!1,SVGSVGElement:!1,SVGScriptElement:!1,SVGSetElement:!1,SVGStopElement:!1,SVGStringList:!1,SVGStylable:!1,SVGStyleElement:!1,SVGSwitchElement:!1,SVGSymbolElement:!1,SVGTRefElement:!1,SVGTSpanElement:!1,SVGTests:!1,SVGTextContentElement:!1,SVGTextElement:!1,SVGTextPathElement:!1,SVGTextPositioningElement:!1,SVGTitleElement:!1,SVGTransform:!1,SVGTransformList:!1,SVGTransformable:!1,SVGURIReference:!1,SVGUnitTypes:!1,SVGUseElement:!1,SVGVKernElement:!1,SVGViewElement:!1,SVGViewSpec:!1,SVGZoomAndPan:!1,Text:!1,TextDecoder:!1,TextEncoder:!1,TimeEvent:!1,top:!1,URL:!1,WebGLActiveInfo:!1,WebGLBuffer:!1,WebGLContextEvent:!1,WebGLFramebuffer:!1,WebGLProgram:!1,WebGLRenderbuffer:!1,WebGLRenderingContext:!1,WebGLShader:!1,WebGLShaderPrecisionFormat:!1,WebGLTexture:!1,WebGLUniformLocation:!1,WebSocket:!1,window:!1,Window:!1,Worker:!1,XDomainRequest:!1,XMLHttpRequest:!1,XMLSerializer:!1,XPathEvaluator:!1,XPathException:!1,XPathExpression:!1,XPathNamespace:!1,XPathNSResolver:!1,XPathResult:!1},exports.devel={alert:!1,confirm:!1,console:!1,Debug:!1,opera:!1,prompt:!1},exports.worker={importScripts:!0,postMessage:!0,self:!0,FileReaderSync:!0},exports.nonstandard={escape:!1,unescape:!1},exports.couch={require:!1,respond:!1,getRow:!1,emit:!1,send:!1,start:!1,sum:!1,log:!1,exports:!1,module:!1,provides:!1},exports.node={__filename:!1,__dirname:!1,GLOBAL:!1,global:!1,module:!1,acequire:!1,Buffer:!0,console:!0,exports:!0,process:!0,setTimeout:!0,clearTimeout:!0,setInterval:!0,clearInterval:!0,setImmediate:!0,clearImmediate:!0},exports.browserify={__filename:!1,__dirname:!1,global:!1,module:!1,acequire:!1,Buffer:!0,exports:!0,process:!0},exports.phantom={phantom:!0,acequire:!0,WebPage:!0,console:!0,exports:!0},exports.qunit={asyncTest:!1,deepEqual:!1,equal:!1,expect:!1,module:!1,notDeepEqual:!1,notEqual:!1,notPropEqual:!1,notStrictEqual:!1,ok:!1,propEqual:!1,QUnit:!1,raises:!1,start:!1,stop:!1,strictEqual:!1,test:!1,"throws":!1},exports.rhino={defineClass:!1,deserialize:!1,gc:!1,help:!1,importClass:!1,importPackage:!1,java:!1,load:!1,loadClass:!1,Packages:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},exports.shelljs={target:!1,echo:!1,exit:!1,cd:!1,pwd:!1,ls:!1,find:!1,cp:!1,rm:!1,mv:!1,mkdir:!1,test:!1,cat:!1,sed:!1,grep:!1,which:!1,dirs:!1,pushd:!1,popd:!1,env:!1,exec:!1,chmod:!1,config:!1,error:!1,tempdir:!1},exports.typed={ArrayBuffer:!1,ArrayBufferView:!1,DataView:!1,Float32Array:!1,Float64Array:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1},exports.wsh={ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WSH:!0,WScript:!0,XDomainRequest:!0},exports.dojo={dojo:!1,dijit:!1,dojox:!1,define:!1,require:!1},exports.jquery={$:!1,jQuery:!1},exports.mootools={$:!1,$$:!1,Asset:!1,Browser:!1,Chain:!1,Class:!1,Color:!1,Cookie:!1,Core:!1,Document:!1,DomReady:!1,DOMEvent:!1,DOMReady:!1,Drag:!1,Element:!1,Elements:!1,Event:!1,Events:!1,Fx:!1,Group:!1,Hash:!1,HtmlTable:!1,IFrame:!1,IframeShim:!1,InputValidator:!1,instanceOf:!1,Keyboard:!1,Locale:!1,Mask:!1,MooTools:!1,Native:!1,Options:!1,OverText:!1,Request:!1,Scroller:!1,Slick:!1,Slider:!1,Sortables:!1,Spinner:!1,Swiff:!1,Tips:!1,Type:!1,typeOf:!1,URI:!1,Window:!1},exports.prototypejs={$:!1,$$:!1,$A:!1,$F:!1,$H:!1,$R:!1,$break:!1,$continue:!1,$w:!1,Abstract:!1,Ajax:!1,Class:!1,Enumerable:!1,Element:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Selector:!1,Template:!1,Toggle:!1,Try:!1,Autocompleter:!1,Builder:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Scriptaculous:!1},exports.yui={YUI:!1,Y:!1,YUI_config:!1},exports.mocha={mocha:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,context:!1,xcontext:!1,before:!1,after:!1,beforeEach:!1,afterEach:!1,suite:!1,test:!1,setup:!1,teardown:!1,suiteSetup:!1,suiteTeardown:!1},exports.jasmine={jasmine:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,beforeEach:!1,afterEach:!1,setFixtures:!1,loadFixtures:!1,spyOn:!1,expect:!1,runs:!1,waitsFor:!1,waits:!1,beforeAll:!1,afterAll:!1,fail:!1,fdescribe:!1,fit:!1,pending:!1}},{}]},{},["/node_modules/jshint/src/jshint.js"])}),ace.define("ace/mode/javascript_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/javascript/jshint"],function(acequire,exports,module){"use strict";function startRegex(arr){return RegExp("^("+arr.join("|")+")")}var oop=acequire("../lib/oop"),Mirror=acequire("../worker/mirror").Mirror,lint=acequire("./javascript/jshint").JSHINT,disabledWarningsRe=startRegex(["Bad for in variable \'(.+)\'.",\'Missing "use strict"\']),errorsRe=startRegex(["Unexpected","Expected ","Confusing (plus|minus)","\\\\{a\\\\} unterminated regular expression","Unclosed ","Unmatched ","Unbegun comment","Bad invocation","Missing space after","Missing operator at"]),infoRe=startRegex(["Expected an assignment","Bad escapement of EOL","Unexpected comma","Unexpected space","Missing radix parameter.","A leading decimal point can","\\\\[\'{a}\'\\\\] is better written in dot notation.","\'{a}\' used out of scope"]),JavaScriptWorker=exports.JavaScriptWorker=function(sender){Mirror.call(this,sender),this.setTimeout(500),this.setOptions()};oop.inherits(JavaScriptWorker,Mirror),function(){this.setOptions=function(options){this.options=options||{esnext:!0,moz:!0,devel:!0,browser:!0,node:!0,laxcomma:!0,laxbreak:!0,lastsemic:!0,onevar:!1,passfail:!1,maxerr:100,expr:!0,multistr:!0,globalstrict:!0},this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.changeOptions=function(newOptions){oop.mixin(this.options,newOptions),this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.isValidJS=function(str){try{eval("throw 0;"+str)}catch(e){if(0===e)return!0}return!1},this.onUpdate=function(){var value=this.doc.getValue();if(value=value.replace(/^#!.*\\n/,"\\n"),!value)return this.sender.emit("annotate",[]);var errors=[],maxErrorLevel=this.isValidJS(value)?"warning":"error";lint(value,this.options,this.options.globals);for(var results=lint.errors,errorAdded=!1,i=0;results.length>i;i++){var error=results[i];if(error){var raw=error.raw,type="warning";if("Missing semicolon."==raw){var str=error.evidence.substr(error.character);str=str.charAt(str.search(/\\S/)),"error"==maxErrorLevel&&str&&/[\\w\\d{([\'"]/.test(str)?(error.reason=\'Missing ";" before statement\',type="error"):type="info"}else{if(disabledWarningsRe.test(raw))continue;infoRe.test(raw)?type="info":errorsRe.test(raw)?(errorAdded=!0,type=maxErrorLevel):"\'{a}\' is not defined."==raw?type="warning":"\'{a}\' is defined but never used."==raw&&(type="info")}errors.push({row:error.line-1,column:error.character-1,text:error.reason,type:type,raw:raw})}}this.sender.emit("annotate",errors)}}.call(JavaScriptWorker.prototype)}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(){function Empty(){}function doesDefinePropertyWork(object){try{return Object.defineProperty(object,"sentinel",{}),"sentinel"in object}catch(exception){}}function toInteger(n){return n=+n,n!==n?n=0:0!==n&&n!==1/0&&n!==-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n}Function.prototype.bind||(Function.prototype.bind=function(that){var target=this;if("function"!=typeof target)throw new TypeError("Function.prototype.bind called on incompatible "+target);var args=slice.call(arguments,1),bound=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))};return target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound});var defineGetter,defineSetter,lookupGetter,lookupSetter,supportsAccessors,call=Function.prototype.call,prototypeOfArray=Array.prototype,prototypeOfObject=Object.prototype,slice=prototypeOfArray.slice,_toString=call.bind(prototypeOfObject.toString),owns=call.bind(prototypeOfObject.hasOwnProperty);if((supportsAccessors=owns(prototypeOfObject,"__defineGetter__"))&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function makeArray(l){var a=Array(l+2);return a[0]=a[1]=0,a}var lengthBefore,array=[];return array.splice.apply(array,makeArray(20)),array.splice.apply(array,makeArray(26)),lengthBefore=array.length,array.splice(5,0,"XXX"),lengthBefore+1==array.length,lengthBefore+1==array.length?!0:void 0}()){var array_splice=Array.prototype.splice;Array.prototype.splice=function(start,deleteCount){return arguments.length?array_splice.apply(this,[void 0===start?0:start,void 0===deleteCount?this.length-start:deleteCount].concat(slice.call(arguments,2))):[]}}else Array.prototype.splice=function(pos,removeCount){var length=this.length;pos>0?pos>length&&(pos=length):void 0==pos?pos=0:0>pos&&(pos=Math.max(length+pos,0)),length>pos+removeCount||(removeCount=length-pos);var removed=this.slice(pos,pos+removeCount),insert=slice.call(arguments,2),add=insert.length;if(pos===length)add&&this.push.apply(this,insert);else{var remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove;if(tailOldPos>tailNewPos)for(var i=0;tailCount>i;++i)this[tailNewPos+i]=this[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)this[tailNewPos+i]=this[tailOldPos+i];if(add&&pos===lengthAfterRemove)this.length=lengthAfterRemove,this.push.apply(this,insert);else for(this.length=lengthAfterRemove+add,i=0;add>i;++i)this[pos+i]=insert[i]}return removed};Array.isArray||(Array.isArray=function(obj){return"[object Array]"==_toString(obj)});var boxedString=Object("a"),splitString="a"!=boxedString[0]||!(0 in boxedString);if(Array.prototype.forEach||(Array.prototype.forEach=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,thisp=arguments[1],i=-1,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError;for(;length>++i;)i in self&&fun.call(thisp,self[i],i,object)}),Array.prototype.map||(Array.prototype.map=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=Array(length),thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(result[i]=fun.call(thisp,self[i],i,object));return result}),Array.prototype.filter||(Array.prototype.filter=function(fun){var value,object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=[],thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(value=self[i],fun.call(thisp,value,i,object)&&result.push(value));return result}),Array.prototype.every||(Array.prototype.every=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&!fun.call(thisp,self[i],i,object))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&fun.call(thisp,self[i],i,object))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError("reduce of empty array with no initial value")}for(;length>i;i++)i in self&&(result=fun.call(void 0,result,self[i],i,object));return result}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var result,i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(0>--i)throw new TypeError("reduceRight of empty array with no initial value")}do i in this&&(result=fun.call(void 0,result,self[i],i,object));while(i--);return result}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=0;for(arguments.length>1&&(i=toInteger(arguments[1])),i=i>=0?i:Math.max(0,length+i);length>i;i++)if(i in self&&self[i]===sought)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=length-1;for(arguments.length>1&&(i=Math.min(i,toInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&sought===self[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(object){return object.__proto__||(object.constructor?object.constructor.prototype:prototypeOfObject)}),!Object.getOwnPropertyDescriptor){var ERR_NON_OBJECT="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(object,property){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT+object);if(owns(object,property)){var descriptor,getter,setter;if(descriptor={enumerable:!0,configurable:!0},supportsAccessors){var prototype=object.__proto__;object.__proto__=prototypeOfObject;var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(object.__proto__=prototype,getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(object){return Object.keys(object)}),!Object.create){var createEmpty;createEmpty=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var empty={};for(var i in empty)empty[i]=null;return empty.constructor=empty.hasOwnProperty=empty.propertyIsEnumerable=empty.isPrototypeOf=empty.toLocaleString=empty.toString=empty.valueOf=empty.__proto__=null,empty},Object.create=function(prototype,properties){var object;if(null===prototype)object=createEmpty();else{if("object"!=typeof prototype)throw new TypeError("typeof prototype["+typeof prototype+"] != \'object\'");var Type=function(){};Type.prototype=prototype,object=new Type,object.__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}if(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom="undefined"==typeof document||doesDefinePropertyWork(document.createElement("div"));if(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty}if(!Object.defineProperty||definePropertyFallback){var ERR_NON_OBJECT_DESCRIPTOR="Property description must be an object: ",ERR_NON_OBJECT_TARGET="Object.defineProperty called on non-object: ",ERR_ACCESSORS_NOT_SUPPORTED="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(object,property,descriptor){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT_TARGET+object);if("object"!=typeof descriptor&&"function"!=typeof descriptor||null===descriptor)throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if(owns(descriptor,"value"))if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{if(!supportsAccessors)throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);owns(descriptor,"get")&&defineGetter(object,property,descriptor.get),owns(descriptor,"set")&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties||(Object.defineProperties=function(object,properties){for(var property in properties)owns(properties,property)&&Object.defineProperty(object,property,properties[property]);return object}),Object.seal||(Object.seal=function(object){return object}),Object.freeze||(Object.freeze=function(object){return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=function(freezeObject){return function(object){return"function"==typeof object?object:freezeObject(object)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(object){return object}),Object.isSealed||(Object.isSealed=function(){return!1}),Object.isFrozen||(Object.isFrozen=function(){return!1}),Object.isExtensible||(Object.isExtensible=function(object){if(Object(object)===object)throw new TypeError;for(var name="";owns(object,name);)name+="?";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue}),!Object.keys){var hasDontEnumBug=!0,dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],dontEnumsLength=dontEnums.length;for(var key in{toString:null})hasDontEnumBug=!1;Object.keys=function(object){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError("Object.keys called on a non-object");var keys=[];for(var name in object)owns(object,name)&&keys.push(name);if(hasDontEnumBug)for(var i=0,ii=dontEnumsLength;ii>i;i++){var dontEnum=dontEnums[i];owns(object,dontEnum)&&keys.push(dontEnum)}return keys}}Date.now||(Date.now=function(){return(new Date).getTime()});var ws="\t\\n\v\\f\\r   ᠎              \\u2028\\u2029\ufeff";if(!String.prototype.trim||ws.trim()){ws="["+ws+"]";var trimBeginRegexp=RegExp("^"+ws+ws+"*"),trimEndRegexp=RegExp(ws+ws+"*$");String.prototype.trim=function(){return(this+"").replace(trimBeginRegexp,"").replace(trimEndRegexp,"")}}var toObject=function(o){if(null==o)throw new TypeError("can\'t convert "+o+" to object");return Object(o)}});'},"6da8":function(e,t){function n(e){return e.split("")}e.exports=n},"6eba":function(e,t,n){var i=n("23e7");i({target:"Date",stat:!0},{now:function(){return(new Date).getTime()}})},"6eeb":function(e,t,n){var i=n("da84"),r=n("9112"),s=n("5135"),a=n("ce4e"),o=n("8925"),c=n("69f3"),l=c.get,u=c.enforce,d=String(String).split("String");(e.exports=function(e,t,n,o){var c,l=!!o&&!!o.unsafe,h=!!o&&!!o.enumerable,f=!!o&&!!o.noTargetGet;"function"==typeof n&&("string"!=typeof t||s(n,"name")||r(n,"name",t),c=u(n),c.source||(c.source=d.join("string"==typeof t?t:""))),e!==i?(l?!f&&e[t]&&(h=!0):delete e[t],h?e[t]=n:r(e,t,n)):h?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&l(this).source||o(this)}))},"6f53":function(e,t,n){var i=n("83ab"),r=n("df75"),s=n("fc6a"),a=n("d1e7").f,o=function(e){return function(t){var n,o=s(t),c=r(o),l=c.length,u=0,d=[];while(l>u)n=c[u++],i&&!a.call(o,n)||d.push(e?[n,o[n]]:o[n]);return d}};e.exports={entries:o(!0),values:o(!1)}},7039:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("057f").f,a=r((function(){return!Object.getOwnPropertyNames(1)}));i({target:"Object",stat:!0,forced:a},{getOwnPropertyNames:s})},7156:function(e,t,n){var i=n("861d"),r=n("d2bb");e.exports=function(e,t,n){var s,a;return r&&"function"==typeof(s=t.constructor)&&s!==n&&i(a=s.prototype)&&a!==n.prototype&&r(e,a),e}},"720d":function(e,t,n){"use strict";n("bd34")},7269:function(e,t,n){},"72f7":function(e,t,n){"use strict";var i=n("ebb5").exportTypedArrayMethod,r=n("d039"),s=n("da84"),a=s.Uint8Array,o=a&&a.prototype||{},c=[].toString,l=[].join;r((function(){c.call({})}))&&(c=function(){return l.call(this)});var u=o.toString!=c;i("toString",c,u)},"735e":function(e,t,n){"use strict";var i=n("ebb5"),r=n("81d5"),s=i.aTypedArray,a=i.exportTypedArrayMethod;a("fill",(function(e){return r.apply(s(this),arguments)}))},"73d9":function(e,t,n){var i=n("44d2");i("flatMap")},"73f5":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("vui-group",[n("vui-group-item",{attrs:{label:"ID:"}},[e._v(e._s(e.active_virus.id))]),n("vui-group-item",{attrs:{label:"Description:"},domProps:{innerHTML:e._s(e.active_virus.description)}}),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(32&e.editable)>0,path:"active_virus.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1)],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},7418:function(e,t){t.f=Object.getOwnPropertySymbols},"746f":function(e,t,n){var i=n("428f"),r=n("5135"),s=n("e538"),a=n("9bf2").f;e.exports=function(e){var t=i.Symbol||(i.Symbol={});r(t,e)||a(t,e,{value:s.f(e)})}},"74e7":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"item"},[n("td",{attrs:{colspan:"2"}},[e._t("default")],2)])},r=[],s={},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"74e8":function(e,t,n){"use strict";var i=n("23e7"),r=n("da84"),s=n("83ab"),a=n("8aa7"),o=n("ebb5"),c=n("621a"),l=n("19aa"),u=n("5c6c"),d=n("9112"),h=n("50c4"),f=n("0b25"),p=n("182d"),g=n("c04e"),m=n("5135"),v=n("f5df"),b=n("861d"),y=n("7c73"),w=n("d2bb"),_=n("241c").f,x=n("a078"),k=n("b727").forEach,A=n("2626"),C=n("9bf2"),E=n("06cf"),S=n("69f3"),F=n("7156"),$=S.get,T=S.set,L=C.f,D=E.f,B=Math.round,R=r.RangeError,O=c.ArrayBuffer,M=c.DataView,j=o.NATIVE_ARRAY_BUFFER_VIEWS,I=o.TYPED_ARRAY_TAG,P=o.TypedArray,N=o.TypedArrayPrototype,W=o.aTypedArrayConstructor,H=o.isTypedArray,V="BYTES_PER_ELEMENT",U="Wrong length",z=function(e,t){var n=0,i=t.length,r=new(W(e))(i);while(i>n)r[n]=t[n++];return r},G=function(e,t){L(e,t,{get:function(){return $(this)[t]}})},q=function(e){var t;return e instanceof O||"ArrayBuffer"==(t=v(e))||"SharedArrayBuffer"==t},K=function(e,t){return H(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},Y=function(e,t){return K(e,t=g(t,!0))?u(2,e[t]):D(e,t)},X=function(e,t,n){return!(K(e,t=g(t,!0))&&b(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?L(e,t,n):(e[t]=n.value,e)};s?(j||(E.f=Y,C.f=X,G(N,"buffer"),G(N,"byteOffset"),G(N,"byteLength"),G(N,"length")),i({target:"Object",stat:!0,forced:!j},{getOwnPropertyDescriptor:Y,defineProperty:X}),e.exports=function(e,t,n){var s=e.match(/\d+$/)[0]/8,o=e+(n?"Clamped":"")+"Array",c="get"+e,u="set"+e,g=r[o],m=g,v=m&&m.prototype,C={},E=function(e,t){var n=$(e);return n.view[c](t*s+n.byteOffset,!0)},S=function(e,t,i){var r=$(e);n&&(i=(i=B(i))<0?0:i>255?255:255&i),r.view[u](t*s+r.byteOffset,i,!0)},D=function(e,t){L(e,t,{get:function(){return E(this,t)},set:function(e){return S(this,t,e)},enumerable:!0})};j?a&&(m=t((function(e,t,n,i){return l(e,m,o),F(function(){return b(t)?q(t)?void 0!==i?new g(t,p(n,s),i):void 0!==n?new g(t,p(n,s)):new g(t):H(t)?z(m,t):x.call(m,t):new g(f(t))}(),e,m)})),w&&w(m,P),k(_(g),(function(e){e in m||d(m,e,g[e])})),m.prototype=v):(m=t((function(e,t,n,i){l(e,m,o);var r,a,c,u=0,d=0;if(b(t)){if(!q(t))return H(t)?z(m,t):x.call(m,t);r=t,d=p(n,s);var g=t.byteLength;if(void 0===i){if(g%s)throw R(U);if(a=g-d,a<0)throw R(U)}else if(a=h(i)*s,a+d>g)throw R(U);c=a/s}else c=f(t),a=c*s,r=new O(a);T(e,{buffer:r,byteOffset:d,byteLength:a,length:c,view:new M(r)});while(u>1,m=23===t?r(2,-24)-r(2,-77):0,v=e<0||0===e&&1/e<0?1:0,b=0;for(e=i(e),e!=e||e===n?(u=e!=e?1:0,l=p):(l=s(a(e)/o),e*(d=r(2,-l))<1&&(l--,d*=2),e+=l+g>=1?m/d:m*r(2,1-g),e*d>=2&&(l++,d/=2),l+g>=p?(u=0,l=p):l+g>=1?(u=(e*d-1)*r(2,t),l+=g):(u=e*r(2,g-1)*r(2,t),l=0));t>=8;h[b++]=255&u,u/=256,t-=8);for(l=l<0;h[b++]=255&l,l/=256,f-=8);return h[--b]|=128*v,h},l=function(e,t){var i,s=e.length,a=8*s-t-1,o=(1<>1,l=a-7,u=s-1,d=e[u--],h=127&d;for(d>>=7;l>0;h=256*h+e[u],u--,l-=8);for(i=h&(1<<-l)-1,h>>=-l,l+=t;l>0;i=256*i+e[u],u--,l-=8);if(0===h)h=1-c;else{if(h===o)return i?NaN:d?-n:n;i+=r(2,t),h-=c}return(d?-1:1)*i*r(2,h-t)};e.exports={pack:c,unpack:l}},"77f3":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("vui-group",[n("vui-group-row",[n("h3",[e._v("Pump Status")])]),n("vui-group-item",{attrs:{label:"Tank Pressure:"}},[e._v(" "+e._s(e.tankPressure)+" kPa ")]),n("vui-group-item",{attrs:{label:"Port Status:"}},[n("span",{class:e.portConnected?"good":"average"},[e._v(e._s(e.portConnected?"Connected":"Disconnected"))])]),n("vui-group-item",{attrs:{label:"Load:"}},[e._v(" "+e._s(e.powerDraw)+" W ")]),n("vui-group-item",{attrs:{label:"Cell Charge:"}},[n("vui-progress",{attrs:{value:e.cellCharge,min:0,max:e.cellMaxCharge}})],1),n("vui-group-row",[n("h3",[e._v("Holding Tank Status")])]),e.hasHoldingTank?n("vui-group-item",{attrs:{label:"Tank Label:"}},[e._v(" "+e._s(e.holdingTank.name)+" "),n("vui-button",{attrs:{icon:"eject",params:{remove_tank:1}}},[e._v("Eject")])],1):e._e(),e.hasHoldingTank?n("vui-group-item",{attrs:{label:"Tank Pressure:"}},[e._v(e._s(e.holdingTank.tankPressure)+" kPa")]):n("vui-group-row",[n("span",{staticClass:"average"},[n("i",[e._v("No holding tank inserted.")])])]),n("vui-group-row",[n("h3",[e._v("Power Regulator Status")])]),n("vui-group-item",{attrs:{label:"Target Pressure:"}},[n("vui-progress",{attrs:{value:e.targetpressure,min:e.minpressure,max:e.maxpressure}}),n("div",{staticStyle:{float:"left",clear:"both","padding-top":"4px","text-align":"center"}},[n("vui-input-numeric",{attrs:{min:e.minpressure,max:e.maxpressure,"min-button":"","max-button":"",width:"4em","button-count":0},on:{input:function(t){return e.s({pressure_set:e.targetpressure})}},model:{value:e.targetpressure,callback:function(t){e.targetpressure=t},expression:"targetpressure"}})],1)],1),n("vui-group-item",{attrs:{label:"Power Switch:"}},[n("vui-button",{class:{selected:e.on},attrs:{icon:e.on?"power-off":"times",params:{power:1}}},[e._v(e._s(e.on?"On":"Off"))])],1),n("vui-group-item",{attrs:{label:"Pump Direction:"}},[n("vui-button",{attrs:{icon:"share",flip:e.pump_dir?"horizontal":"",params:{direction:1}}},[e._v(e._s(e.pump_dir?"Out":"In"))])],1)],1)},r=[],s=n("025e"),a={data:function(){return this.$root.$data.state},methods:{s:function(e){s["a"].sendToTopic(e)}}},o=a,c=(n("c7ef"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"0cce4ea8",null);t["default"]=l.exports},7839:function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},7898:function(e,t,n){var i=n("23e7"),r=n("8eb5"),s=Math.exp;i({target:"Math",stat:!0},{tanh:function(e){var t=r(e=+e),n=r(-e);return t==1/0?1:n==1/0?-1:(t-n)/(s(e)+s(-e))}})},7938:function(e,t,n){},7948:function(e,t){function n(e,t){var n=-1,i=null==e?0:e.length,r=Array(i);while(++n0)},{asinh:o})},"7a67":function(e,t,n){"use strict";n("7269")},"7a82":function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("9bf2");i({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperty:s.f})},"7b0b":function(e,t,n){var i=n("1d80");e.exports=function(e){return Object(i(e))}},"7c73":function(e,t,n){var i,r=n("825a"),s=n("37e8"),a=n("7839"),o=n("d012"),c=n("1be4"),l=n("cc12"),u=n("f772"),d=">",h="<",f="prototype",p="script",g=u("IE_PROTO"),m=function(){},v=function(e){return h+p+d+e+h+"/"+p+d},b=function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t},y=function(){var e,t=l("iframe"),n="java"+p+":";return t.style.display="none",c.appendChild(t),t.src=String(n),e=t.contentWindow.document,e.open(),e.write(v("document.F=Object")),e.close(),e.F},w=function(){try{i=document.domain&&new ActiveXObject("htmlfile")}catch(t){}w=i?b(i):y();var e=a.length;while(e--)delete w[f][a[e]];return w()};o[g]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(m[f]=r(e),n=new m,m[f]=null,n[g]=e):n=w(),void 0===t?n:s(n,t)}},"7c9e":function(e,t,n){var i=n("061c");e.exports={render:function(e){var t=this.height?this.px(this.height):"100%",n=this.width?this.px(this.width):"100%";return e("div",{attrs:{style:"height: "+t+"; width: "+n}})},props:{value:String,lang:!0,theme:String,height:!0,width:!0,options:Object},data:function(){return{editor:null,contentBackup:""}},methods:{px:function(e){return/^\d*$/.test(e)?e+"px":e}},watch:{value:function(e){this.contentBackup!==e&&(this.editor.session.setValue(e,1),this.contentBackup=e)},theme:function(e){this.editor.setTheme("ace/theme/"+e)},lang:function(e){this.editor.getSession().setMode("string"===typeof e?"ace/mode/"+e:e)},options:function(e){this.editor.setOptions(e)},height:function(){this.$nextTick((function(){this.editor.resize()}))},width:function(){this.$nextTick((function(){this.editor.resize()}))}},beforeDestroy:function(){this.editor.destroy(),this.editor.container.remove()},mounted:function(){var e=this,t=this.lang||"text",r=this.theme||"chrome";n("b378");var s=e.editor=i.edit(this.$el);s.$blockScrolling=1/0,this.$emit("init",s),s.getSession().setMode("string"===typeof t?"ace/mode/"+t:t),s.setTheme("ace/theme/"+r),this.value&&s.setValue(this.value,1),this.contentBackup=this.value,s.on("change",(function(){var t=s.getValue();e.$emit("input",t),e.contentBackup=t})),e.options&&s.setOptions(e.options)}}},"7da4":function(e,t,n){},"7db0":function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").find,s=n("44d2"),a=n("ae40"),o="find",c=!0,l=a(o);o in[]&&Array(1)[o]((function(){c=!1})),i({target:"Array",proto:!0,forced:c||!l},{find:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),s(o)},"7dc4":function(e,t,n){"use strict";n("592e")},"7dc7":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[0==e.s.mode||0==e.s.sel_price?[n("div",{staticClass:"cancel-button"},[n("vui-input-search",{attrs:{input:e.products,keys:["name"],autofocus:"",threshold:e.threshold},model:{value:e.output,callback:function(t){e.output=t},expression:"output"}}),n("vui-button",{attrs:{disabled:!e.s.coin,params:{remove_coin:1},icon:"sign-out-alt"}},[e._v(e._s(e.s.coin?e.s.coin:"No coin inserted."))])],1),n("div",{staticClass:"t-parent"},e._l(e.output,(function(t){return n("vui-button",{key:t.key,staticClass:"t-child tooltip",class:t.amount>0?"":"no-stock",attrs:{disabled:0==t.amount||1==e.s.mode,params:{vendItem:t.key}}},[n("div",{staticClass:"t-container",style:{height:e.s.ui_size+"px",width:e.s.ui_size+"px"}},[n("span",{staticClass:"food-icon",class:[t.amount>0?"":"no-stock",t.icon_tag]}),t.price>0?n("span",{staticClass:"cart-icon fas ic-shopping-cart"}):e._e(),t.price>0?n("span",{staticClass:"price"},[e._v(e._s(t.price)+"电")]):e._e(),n("span",{staticClass:"qty",class:t.amount>0?"":"no-stock"},[e._v("(x"+e._s(t.amount)+")")])]),n("span",{staticClass:"tooltiptext"},[e._v(e._s(t.name))])])})),1)]:e.s.sel_name&&e.s.sel_price>0?[n("div",{staticClass:"t-parent"},[n("p",[e._v("Item selected:"),n("span",{staticClass:"purchase-icon",class:e.s.sel_icon}),e._v(e._s(e.s.sel_name))]),n("p",[e._v("Charge: "+e._s(e.s.sel_price)+"电 / "+e._s(e.s.sel_price)+"cr")]),n("p",[e._v("Swipe your NanoTrasen ID or insert credits to purchase.")]),1==e.s.message_err?n("p",{staticClass:"danger"},[e._v(e._s(e.s.message))]):e._e(),n("div",{staticClass:"cancel-button"},[n("vui-button",{attrs:{params:{cancelpurchase:1},icon:"undo"}},[e._v("Cancel Transaction")])],1)])]:[n("vui-button",{staticClass:"cancel-button danger",attrs:{params:{reset:1},icon:"undo"}},[e._v("Reset Machine")])]],2)},r=[],s=(n("07ac"),{data:function(){return{s:this.$root.$data.state,output:[],threshold:.3}},computed:{products:function(){return Object.values(this.s.products)}}}),a=s,o=(n("fe33"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"2633030c",null);t["default"]=c.exports},"7dd0":function(e,t,n){"use strict";var i=n("23e7"),r=n("9ed3"),s=n("e163"),a=n("d2bb"),o=n("d44e"),c=n("9112"),l=n("6eeb"),u=n("b622"),d=n("c430"),h=n("3f8c"),f=n("ae93"),p=f.IteratorPrototype,g=f.BUGGY_SAFARI_ITERATORS,m=u("iterator"),v="keys",b="values",y="entries",w=function(){return this};e.exports=function(e,t,n,u,f,_,x){r(n,t,u);var k,A,C,E=function(e){if(e===f&&L)return L;if(!g&&e in $)return $[e];switch(e){case v:return function(){return new n(this,e)};case b:return function(){return new n(this,e)};case y:return function(){return new n(this,e)}}return function(){return new n(this)}},S=t+" Iterator",F=!1,$=e.prototype,T=$[m]||$["@@iterator"]||f&&$[f],L=!g&&T||E(f),D="Array"==t&&$.entries||T;if(D&&(k=s(D.call(new e)),p!==Object.prototype&&k.next&&(d||s(k)===p||(a?a(k,p):"function"!=typeof k[m]&&c(k,m,w)),o(k,S,!0,!0),d&&(h[S]=w))),f==b&&T&&T.name!==b&&(F=!0,L=function(){return T.call(this)}),d&&!x||$[m]===L||c($,m,L),h[t]=L,f)if(A={values:E(b),keys:_?L:E(v),entries:E(y)},x)for(C in A)(g||F||!(C in $))&&l($,C,A[C]);else i({target:t,proto:!0,forced:g||F},A);return A}},"7e12":function(e,t,n){var i=n("da84"),r=n("58a8").trim,s=n("5899"),a=i.parseFloat,o=1/a(s+"-0")!==-1/0;e.exports=o?function(e){var t=r(String(e)),n=a(t);return 0===n&&"-"==t.charAt(0)?-0:n}:a},"7e8e":function(e,t){var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function i(e){return n.test(e)}e.exports=i},"7ed3":function(e,t,n){var i=n("23e7"),r=n("825a"),s=n("861d"),a=n("5135"),o=n("d039"),c=n("9bf2"),l=n("06cf"),u=n("e163"),d=n("5c6c");function h(e,t,n){var i,o,f=arguments.length<4?e:arguments[3],p=l.f(r(e),t);if(!p){if(s(o=u(e)))return h(o,t,n,f);p=d(0)}if(a(p,"value")){if(!1===p.writable||!s(f))return!1;if(i=l.f(f,t)){if(i.get||i.set||!1===i.writable)return!1;i.value=n,c.f(f,t,i)}else c.f(f,t,d(0,n));return!0}return void 0!==p.set&&(p.set.call(f,n),!0)}var f=o((function(){var e=function(){},t=c.f(new e,"a",{configurable:!0});return!1!==Reflect.set(e.prototype,"a",1,t)}));i({target:"Reflect",stat:!0,forced:f},{set:h})},"7f78":function(e,t,n){var i=n("23e7"),r=n("825a"),s=n("e163"),a=n("e177");i({target:"Reflect",stat:!0,sham:!a},{getPrototypeOf:function(e){return s(r(e))}})},"7f9a":function(e,t,n){var i=n("da84"),r=n("8925"),s=i.WeakMap;e.exports="function"===typeof s&&/native code/.test(r(s))},"80e0":function(e,t,n){var i=n("746f");i("replace")},8103:function(e,t,n){var i=n("d194"),r=i("toUpperCase");e.exports=r},"810a":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("img",{attrs:{src:e.source},on:{error:function(t){return e.failedToLoad()}}})},r=[],s=(n("99af"),n("b0c0"),n("a9e3"),n("4795"),{props:{name:{type:String,default:""},maxTries:{type:Number,default:10}},computed:{sourceBuster:function(){return this.failsToLoad&&this.failsToLoad1?arguments[1]:void 0,n),c=a>2?arguments[2]:void 0,l=void 0===c?n:r(c,n);while(l>o)t[o++]=e;return t}},"820e":function(e,t,n){"use strict";var i=n("23e7"),r=n("1c0b"),s=n("f069"),a=n("e667"),o=n("2266");i({target:"Promise",stat:!0},{allSettled:function(e){var t=this,n=s.f(t),i=n.resolve,c=n.reject,l=a((function(){var n=r(t.resolve),s=[],a=0,c=1;o(e,(function(e){var r=a++,o=!1;s.push(void 0),c++,n.call(t,e).then((function(e){o||(o=!0,s[r]={status:"fulfilled",value:e},--c||i(s))}),(function(e){o||(o=!0,s[r]={status:"rejected",reason:e},--c||i(s))}))})),--c||i(s)}));return l.error&&c(l.value),n.promise}})},"825a":function(e,t,n){var i=n("861d");e.exports=function(e){if(!i(e))throw TypeError(String(e)+" is not an object");return e}},"82da":function(e,t,n){var i=n("23e7"),r=n("ebb5"),s=r.NATIVE_ARRAY_BUFFER_VIEWS;i({target:"ArrayBuffer",stat:!0,forced:!s},{isView:r.isView})},"82f8":function(e,t,n){"use strict";var i=n("ebb5"),r=n("4d64").includes,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("includes",(function(e){return r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},8385:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-input-search",{attrs:{input:e.records,keys:["id","name","rank"]},model:{value:e.filtered,callback:function(t){e.filtered=t},expression:"filtered"}}),e._l(e.filtered,(function(t){return n("div",{key:t.id},[n("vui-button",{attrs:{params:{setactive_virus:t.id},"push-state":""},on:{click:function(t){e.activeview=e.defaultview}}},[e._v(e._s(t.id)+": "+e._s(t.name))])],1)}))],2)},r=[],s=(n("07ac"),{data:function(){return{state:this.$root.$data.state,filtered:[]}},computed:{records:function(){return Object.values(this.state.record_viruses)}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"83ab":function(e,t,n){var i=n("d039");e.exports=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},8418:function(e,t,n){"use strict";var i=n("c04e"),r=n("9bf2"),s=n("5c6c");e.exports=function(e,t,n){var a=i(t);a in e?r.f(e,a,s(0,n)):e[a]=n}},"841c":function(e,t,n){"use strict";var i=n("d784"),r=n("825a"),s=n("1d80"),a=n("129f"),o=n("14c3");i("search",1,(function(e,t,n){return[function(t){var n=s(this),i=void 0==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var s=r(e),c=String(this),l=s.lastIndex;a(l,0)||(s.lastIndex=0);var u=o(s,c);return a(s.lastIndex,l)||(s.lastIndex=l),null===u?-1:u.index}]}))},"843c":function(e,t,n){"use strict";var i=n("23e7"),r=n("0ccb").end,s=n("9a0c");i({target:"String",proto:!0,forced:s},{padEnd:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},"84c3":function(e,t,n){var i=n("74e8");i("Uint16",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},"857a":function(e,t,n){var i=n("1d80"),r=/"/g;e.exports=function(e,t,n,s){var a=String(i(e)),o="<"+t;return""!==n&&(o+=" "+n+'="'+String(s).replace(r,""")+'"'),o+">"+a+""}},"861d":function(e,t){e.exports=function(e){return"object"===typeof e?null!==e:"function"===typeof e}},"86ad":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Sensor Data:")]),e.state.sensors.length<=0?n("span",[e._v("No sensors connected.")]):e._l(e.state.sensors,(function(t,i){return n("div",{key:i},[n("b",[e._v(e._s(t.name))]),n("br"),t.pressure?n("vui-item",{attrs:{label:"Pressure:"}},[e._v(e._s(t.pressure)+" kPa")]):e._e(),t.temperature?n("vui-item",{attrs:{label:"Temperature:"}},[e._v(e._s(t.temperature)+" K")]):e._e(),t.oxygen||t.hydrogen||t.phoron||t.nitrogen||t.carbon_dioxide?n("vui-item",{attrs:{label:"Gas Composition:"}},[t.oxygen?n("span",{staticClass:"complist"},[e._v(e._s(t.oxygen)+" O"),n("sub",[e._v("2")])]):e._e(),t.nitrogen?n("span",{staticClass:"complist"},[e._v(e._s(t.nitrogen)+" N")]):e._e(),t.carbon_dioxide?n("span",{staticClass:"complist"},[e._v(e._s(t.carbon_dioxide)+" CO"),n("sub",[e._v("2"),n("sub")])]):e._e(),t.phoron?n("span",{staticClass:"complist"},[e._v(e._s(t.phoron)+" PH")]):e._e(),t.hydrogen?n("span",{staticClass:"complist"},[e._v(e._s(t.hydrogen)+" H"),n("sub",[e._v("2")])]):e._e()]):e._e()],1)})),e.state.control?n("view-console-atmocontrol-"+e.state.control,{tag:"component"}):e._e()],2)},r=[],s={data:function(){return this.$root.$data}},a=s,o=(n("f9a1"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"0f00c828",null);t["default"]=c.exports},"86eb":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.forumuserui_enabled?n("div",{staticClass:"notice"},[n("center",[e._v("Modifications done do not outlast the round! Use the forums/WI to modify ranks.")])],1):e._e(),n("table",[n("tr",[n("th",[e._v("Ckey "),n("vui-button",{attrs:{params:{action:"add"}}},[e._v("Add")])],1),n("th",[e._v("Rank")]),n("th",[e._v("Permissions")])]),e._l(e.admins,(function(t){return n("tr",{key:t.ckey},[n("td",[n("vui-button",{attrs:{params:{action:"remove",ckey:t.ckey}}},[e._v("Edit")]),e._v(" "+e._s(t.ckey)+" ")],1),n("td",[n("vui-button",{attrs:{params:{action:"rank",ckey:t.ckey}}},[e._v("Edit")]),e._v(" "+e._s(t.rank)+" ")],1),n("td",[n("vui-button",{attrs:{params:{action:"rights",ckey:t.ckey}}},[e._v("Edit")]),e._v(" "+e._s(t.rights)+" ")],1)])}))],2)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},8925:function(e,t,n){var i=n("c6cd"),r=Function.toString;"function"!=typeof i.inspectSource&&(i.inspectSource=function(e){return r.call(e)}),e.exports=i.inspectSource},8928:function(e,t,n){"use strict";n("c6c8")},"8a59":function(e,t,n){var i=n("74e8");i("Uint8",(function(e){return function(t,n,i){return e(this,t,n,i)}}),!0)},"8a79":function(e,t,n){"use strict";var i=n("23e7"),r=n("06cf").f,s=n("50c4"),a=n("5a34"),o=n("1d80"),c=n("ab13"),l=n("c430"),u="".endsWith,d=Math.min,h=c("endsWith"),f=!l&&!h&&!!function(){var e=r(String.prototype,"endsWith");return e&&!e.writable}();i({target:"String",proto:!0,forced:!f&&!h},{endsWith:function(e){var t=String(o(this));a(e);var n=arguments.length>1?arguments[1]:void 0,i=s(t.length),r=void 0===n?i:d(s(n),i),c=String(e);return u?u.call(t,c,r):t.slice(r-c.length,r)===c}})},"8aa5":function(e,t,n){"use strict";var i=n("6547").charAt;e.exports=function(e,t,n){return t+(n?i(e,t).length:1)}},"8aa7":function(e,t,n){var i=n("da84"),r=n("d039"),s=n("1c7e"),a=n("ebb5").NATIVE_ARRAY_BUFFER_VIEWS,o=i.ArrayBuffer,c=i.Int8Array;e.exports=!a||!r((function(){c(1)}))||!r((function(){new c(-1)}))||!s((function(e){new c,new c(null),new c(1.5),new c(e)}),!0)||r((function(){return 1!==new c(new o(2),1,void 0).length}))},"8b09":function(e,t,n){var i=n("74e8");i("Int16",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},"8b1f":function(e,t,n){"use strict";n("a5e6")},"8b9a":function(e,t,n){var i=n("23e7"),r=n("825a"),s=n("3bbe"),a=n("d2bb");a&&i({target:"Reflect",stat:!0},{setPrototypeOf:function(e,t){r(e),s(t);try{return a(e,t),!0}catch(n){return!1}}})},"8ba4":function(e,t,n){var i=n("23e7"),r=n("5e89");i({target:"Number",stat:!0},{isInteger:r})},"8eb5":function(e,t){var n=Math.expm1,i=Math.exp;e.exports=!n||n(10)>22025.465794806718||n(10)<22025.465794806718||-2e-17!=n(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:i(e)-1}:n},"8edd":function(e,t,n){var i=n("746f");i("matchAll")},"90d7":function(e,t,n){var i=n("23e7"),r=Math.log,s=Math.LN2;i({target:"Math",stat:!0},{log2:function(e){return r(e)/s}})},"90e3":function(e,t){var n=0,i=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++n+i).toString(36)}},9112:function(e,t,n){var i=n("83ab"),r=n("9bf2"),s=n("5c6c");e.exports=i?function(e,t,n){return r.f(e,t,s(1,n))}:function(e,t,n){return e[t]=n,e}},9129:function(e,t,n){var i=n("23e7");i({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},9263:function(e,t,n){"use strict";var i=n("ad6d"),r=n("9f7f"),s=RegExp.prototype.exec,a=String.prototype.replace,o=s,c=function(){var e=/a/,t=/b*/g;return s.call(e,"a"),s.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),l=r.UNSUPPORTED_Y||r.BROKEN_CARET,u=void 0!==/()??/.exec("")[1],d=c||u||l;d&&(o=function(e){var t,n,r,o,d=this,h=l&&d.sticky,f=i.call(d),p=d.source,g=0,m=e;return h&&(f=f.replace("y",""),-1===f.indexOf("g")&&(f+="g"),m=String(e).slice(d.lastIndex),d.lastIndex>0&&(!d.multiline||d.multiline&&"\n"!==e[d.lastIndex-1])&&(p="(?: "+p+")",m=" "+m,g++),n=new RegExp("^(?:"+p+")",f)),u&&(n=new RegExp("^"+p+"$(?!\\s)",f)),c&&(t=d.lastIndex),r=s.call(h?n:d,m),h?r?(r.input=r.input.slice(g),r[0]=r[0].slice(g),r.index=d.lastIndex,d.lastIndex+=r[0].length):d.lastIndex=0:c&&r&&(d.lastIndex=d.global?r.index+r[0].length:t),u&&r&&r.length>1&&a.call(r[0],n,(function(){for(o=1;o0}}}),a=s,o=(n("af89"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"c4dbe0aa",null);t["default"]=c.exports},"93dc":function(e,t,n){"use strict";n("6234")},"93f8":function(e,t,n){},"944a":function(e,t,n){var i=n("746f");i("toStringTag")},"94ca":function(e,t,n){var i=n("d039"),r=/#|\.prototype\./,s=function(e,t){var n=o[a(e)];return n==l||n!=c&&("function"==typeof t?i(t):!!t)},a=s.normalize=function(e){return String(e).replace(r,".").toLowerCase()},o=s.data={},c=s.NATIVE="N",l=s.POLYFILL="P";e.exports=s},9513:function(e,t,n){},9556:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabel"},[e._v("Confirm identity:")]),n("div",{staticClass:"itemContent"},[n("vui-button",{attrs:{params:{scan:1},icon:"eject"}},[e.state.idname?n("span",[e._v(e._s(e.state.idname))]):n("span",[e._v("--------")])])],1)]),e.state.auth?n("div",{staticStyle:{"margin-top":"24px",clear:"both"}},[n("b",[e._v("Logged in to:")]),e._v(" "+e._s(e.state.bossname)+" Quantum Entanglement Network "),e.remaining_cooldown<=0?[n("vui-item",{attrs:{label:"Sending to:"}},[n("select",{directives:[{name:"model",rawName:"v-model.lazy",value:e.state.destination,expression:"state.destination",modifiers:{lazy:!0}}],staticClass:"button",on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.state,"destination",t.target.multiple?n:n[0])}}},e._l(e.state.departiments,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)]),e.state.paper?[n("vui-item",{attrs:{label:"Currently sending:"}},[e._v(e._s(e.state.paper))]),n("vui-button",{attrs:{"push-state":"",params:{send:1}}},[e._v("Send")])]:n("span",[e._v("Please insert paper to send via secure connection.")])]:n("span",[n("b",[e._v("Transmitter arrays realigning. Please stand by. "+e._s(e._f("roundRemaining")(e.remaining_cooldown))+" seconds remaining.")])])],2):e._e(),e.state.paper?n("vui-button",{attrs:{params:{remove:1}}},[e._v("Remove item")]):e._e(),n("h3",[e._v("PDAs to notify:")]),e._l(e.state.alertpdas,(function(t){return n("div",{key:t.ref},[e._v(" "+e._s(t.name)+" "),n("vui-button",{attrs:{params:{unlink:t.ref}}},[e._v("Unlink")])],1)})),e.state.alertpdas.length<=0?n("div",[e._v("No PDAs are linked.")]):e._e(),n("vui-button",{attrs:{params:{linkpda:1}}},[e._v("Add PDA to Notify")])],2)},r=[],s={data:function(){return this.$root.$data},computed:{remaining_cooldown:function(){return this.state.cooldownend-this.wtime}},filters:{roundRemaining:function(e){return Math.round(e/10)}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,"4b0e320e",null);t["default"]=c.exports},"95d1":function(e,t,n){"use strict";n("4cc0")},"967a":function(e,t,n){"use strict";var i=n("23e7"),r=n("e163"),s=n("d2bb"),a=n("7c73"),o=n("9112"),c=n("5c6c"),l=n("2266"),u=function(e,t){var n=this;if(!(n instanceof u))return new u(e,t);s&&(n=s(new Error(void 0),r(n))),void 0!==t&&o(n,"message",String(t));var i=[];return l(e,i.push,{that:i}),o(n,"errors",i),n};u.prototype=a(Error.prototype,{constructor:c(5,u),message:c(5,""),name:c(5,"AggregateError")}),i({global:!0},{AggregateError:u})},"96f3":function(e,t,n){"use strict";n("ce5b")},9767:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("fontcolor")},{fontcolor:function(e){return r(this,"font","color",e)}})},9861:function(e,t,n){"use strict";n("e260");var i=n("23e7"),r=n("d066"),s=n("0d3b"),a=n("6eeb"),o=n("e2cc"),c=n("d44e"),l=n("9ed3"),u=n("69f3"),d=n("19aa"),h=n("5135"),f=n("0366"),p=n("f5df"),g=n("825a"),m=n("861d"),v=n("7c73"),b=n("5c6c"),y=n("9a1f"),w=n("35a1"),_=n("b622"),x=r("fetch"),k=r("Headers"),A=_("iterator"),C="URLSearchParams",E=C+"Iterator",S=u.set,F=u.getterFor(C),$=u.getterFor(E),T=/\+/g,L=Array(4),D=function(e){return L[e-1]||(L[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},B=function(e){try{return decodeURIComponent(e)}catch(t){return e}},R=function(e){var t=e.replace(T," "),n=4;try{return decodeURIComponent(t)}catch(i){while(n)t=t.replace(D(n--),B);return t}},O=/[!'()~]|%20/g,M={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},j=function(e){return M[e]},I=function(e){return encodeURIComponent(e).replace(O,j)},P=function(e,t){if(t){var n,i,r=t.split("&"),s=0;while(s0?arguments[0]:void 0,u=this,f=[];if(S(u,{type:C,entries:f,updateURL:function(){},updateSearchParams:N}),void 0!==l)if(m(l))if(e=w(l),"function"===typeof e){t=e.call(l),n=t.next;while(!(i=n.call(t)).done){if(r=y(g(i.value)),s=r.next,(a=s.call(r)).done||(o=s.call(r)).done||!s.call(r).done)throw TypeError("Expected sequence with length 2");f.push({key:a.value+"",value:o.value+""})}}else for(c in l)h(l,c)&&f.push({key:c,value:l[c]+""});else P(f,"string"===typeof l?"?"===l.charAt(0)?l.slice(1):l:l+"")},U=V.prototype;o(U,{append:function(e,t){W(arguments.length,2);var n=F(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){W(arguments.length,1);var t=F(this),n=t.entries,i=e+"",r=0;while(re.key){r.splice(t,0,e);break}t===n&&r.push(e)}i.updateURL()},forEach:function(e){var t,n=F(this).entries,i=f(e,arguments.length>1?arguments[1]:void 0,3),r=0;while(r1&&(t=arguments[1],m(t)&&(n=t.body,p(n)===C&&(i=t.headers?new k(t.headers):new k,i.has("content-type")||i.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=v(t,{body:b(0,String(n)),headers:b(0,i)}))),r.push(t)),x.apply(this,r)}}),e.exports={URLSearchParams:V,getState:F}},"987b":function(e,t,n){"use strict";n("daa2")},9911:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("link")},{link:function(e){return r(this,"a","href",e)}})},"99af":function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("e8b5"),a=n("861d"),o=n("7b0b"),c=n("50c4"),l=n("8418"),u=n("65f0"),d=n("1dde"),h=n("b622"),f=n("2d00"),p=h("isConcatSpreadable"),g=9007199254740991,m="Maximum allowed index exceeded",v=f>=51||!r((function(){var e=[];return e[p]=!1,e.concat()[0]!==e})),b=d("concat"),y=function(e){if(!a(e))return!1;var t=e[p];return void 0!==t?!!t:s(e)},w=!v||!b;i({target:"Array",proto:!0,forced:w},{concat:function(e){var t,n,i,r,s,a=o(this),d=u(a,0),h=0;for(t=-1,i=arguments.length;tg)throw TypeError(m);for(n=0;n=g)throw TypeError(m);l(d,h++,s)}return d.length=h,d}})},"99ee":function(e,t,n){},"9a0c":function(e,t,n){var i=n("342f");e.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(i)},"9a1f":function(e,t,n){var i=n("825a"),r=n("35a1");e.exports=function(e){var t=r(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return i(t.call(e))}},"9a8c":function(e,t,n){"use strict";var i=n("ebb5"),r=n("145e"),s=i.aTypedArray,a=i.exportTypedArrayMethod;a("copyWithin",(function(e,t){return r.call(s(this),e,t,arguments.length>2?arguments[2]:void 0)}))},"9aa7":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"resizehandles"}},[n("div",{staticClass:"resizeHandle__e",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startResizing(1,0,t)}}}),n("div",{staticClass:"resizeHandle__s",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startResizing(0,1,t)}}}),n("div",{staticClass:"resizeHandle__se",on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startResizing(1,1,t)}}})])},r=[],s=n("f0e0"),a={methods:{startResizing:function(e,t,n){s["a"].resizeStartHandler(e,t,n)}}},o=a,c=(n("12fa"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"9bc3ecba",null);t["default"]=l.exports},"9acc":function(e,t,n){"use strict";n("1ee6")},"9b7e":function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.s.service?e.s.registered?e.s.signal?[n("div",[e.s.can_netadmin_mode||e.s.netadmin_mode?n("vui-button",{class:{on:e.s.netadmin_mode},attrs:{params:{toggleadmin:1}}},[e._v("Admin Mode")]):e._e(),e._v(" Ringtone: "),null==e.ringtone?n("vui-button",{on:{click:function(t){e.ringtone=e.s.ringtone}}},[e._v(e._s(e.s.ringtone))]):[n("input",{directives:[{name:"model",rawName:"v-model",value:e.ringtone,expression:"ringtone"}],attrs:{type:"text"},domProps:{value:e.ringtone},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.set_ringtone(t)},input:function(t){t.target.composing||(e.ringtone=t.target.value)}}}),n("vui-button",{on:{click:e.set_ringtone}},[e._v("Set ringtone")])],n("vui-button",{class:{selected:1==e.s.message_mute},attrs:{params:{mute_message:1}}},[e._v(e._s(1==e.s.message_mute?"Unmute Messages":"Mute Messages"))])],2),n("div",[n("vui-button",{class:{on:null==e.active},on:{click:function(t){e.active=null}}},[e._v("Explore")]),e._l(e.tab_channels,(function(t){return n("vui-button",{key:t,class:{on:e.active==t},on:{click:function(n){e.active=t}}},[e._v(e._s(e.s.channels[t].title))])}))],2),n("hr"),null==e.active?n("view-mcomputer-chat-explore"):n("view-mcomputer-chat-chat",{attrs:{reference:e.active},on:{"on-leave":function(t){e.active=null}}})]:n("h2",{staticClass:"red"},[e._v("No network signal.")]):n("h2",{staticClass:"red"},[e._v("No registered user detected.")]):n("h2",{staticClass:"red"},[e._v("Chat service is not enabled, please enable it from main menu.")])],2)},r=[],s=(n("4de4"),n("b64b"),{data:function(){return{s:this.$root.$data.state,active:null,ringtone:null}},computed:{tab_channels:function(){var e=this;return Object.keys(this.s.channels).filter((function(t){return e.s.channels[t].can_interact}))}},methods:{set_ringtone:function(){this.$toTopic({ringtone:this.ringtone}),this.ringtone=null}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},"9bdd":function(e,t,n){var i=n("825a"),r=n("2a62");e.exports=function(e,t,n,s){try{return s?t(i(n)[0],n[1]):t(n)}catch(a){throw r(e),a}}},"9bf2":function(e,t,n){var i=n("83ab"),r=n("0cfb"),s=n("825a"),a=n("c04e"),o=Object.defineProperty;t.f=i?o:function(e,t,n){if(s(e),t=a(t,!0),s(n),r)try{return o(e,t,n)}catch(i){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},"9e4a":function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("825a"),a=n("06cf");i({target:"Reflect",stat:!0,sham:!r},{getOwnPropertyDescriptor:function(e,t){return a.f(s(e),t)}})},"9e69":function(e,t,n){var i=n("2b3e"),r=i.Symbol;e.exports=r},"9e80":function(e,t,n){},"9ed3":function(e,t,n){"use strict";var i=n("ae93").IteratorPrototype,r=n("7c73"),s=n("5c6c"),a=n("d44e"),o=n("3f8c"),c=function(){return this};e.exports=function(e,t,n){var l=t+" Iterator";return e.prototype=r(i,{next:s(1,n)}),a(e,l,!1,!0),o[l]=c,e}},"9f7f":function(e,t,n){"use strict";var i=n("d039");function r(e,t){return RegExp(e,t)}t.UNSUPPORTED_Y=i((function(){var e=r("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),t.BROKEN_CARET=i((function(){var e=r("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},"9f96":function(e,t,n){var i=n("23e7"),r=n("da84"),s=n("b575"),a=n("605d"),o=r.process;i({global:!0,enumerable:!0,noTargetGet:!0},{queueMicrotask:function(e){var t=a&&o.domain;s(t?t.bind(e):e)}})},"9ff9":function(e,t,n){var i=n("23e7"),r=Math.atanh,s=Math.log;i({target:"Math",stat:!0,forced:!(r&&1/r(-0)<0)},{atanh:function(e){return 0==(e=+e)?e:s((1+e)/(1-e))/2}})},a026:function(e,t,n){"use strict";(function(e){ /*! * Vue.js v2.6.12 * (c) 2014-2020 Evan You * Released under the MIT License. */ -var n=Object.freeze({});function i(e){return void 0===e||null===e}function r(e){return void 0!==e&&null!==e}function s(e){return!0===e}function a(e){return!1===e}function o(e){return"string"===typeof e||"number"===typeof e||"symbol"===typeof e||"boolean"===typeof e}function c(e){return null!==e&&"object"===typeof e}var l=Object.prototype.toString;function u(e){return"[object Object]"===l.call(e)}function d(e){return"[object RegExp]"===l.call(e)}function h(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function f(e){return r(e)&&"function"===typeof e.then&&"function"===typeof e.catch}function p(e){return null==e?"":Array.isArray(e)||u(e)&&e.toString===l?JSON.stringify(e,null,2):String(e)}function g(e){var t=parseFloat(e);return isNaN(t)?e:t}function m(e,t){for(var n=Object.create(null),i=e.split(","),r=0;r-1)return e.splice(n,1)}}var w=Object.prototype.hasOwnProperty;function _(e,t){return w.call(e,t)}function x(e){var t=Object.create(null);return function(n){var i=t[n];return i||(t[n]=e(n))}}var k=/-(\w)/g,A=x((function(e){return e.replace(k,(function(e,t){return t?t.toUpperCase():""}))})),C=x((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),E=/\B([A-Z])/g,S=x((function(e){return e.replace(E,"-$1").toLowerCase()}));function F(e,t){function n(n){var i=arguments.length;return i?i>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function $(e,t){return e.bind(t)}var T=Function.prototype.bind?$:F;function L(e,t){t=t||0;var n=e.length-t,i=new Array(n);while(n--)i[n]=e[n+t];return i}function D(e,t){for(var n in t)e[n]=t[n];return e}function B(e){for(var t={},n=0;n0,re=te&&te.indexOf("edge/")>0,se=(te&&te.indexOf("android"),te&&/iphone|ipad|ipod|ios/.test(te)||"ios"===ee),ae=(te&&/chrome\/\d+/.test(te),te&&/phantomjs/.test(te),te&&te.match(/firefox\/(\d+)/)),oe={}.watch,ce=!1;if(Q)try{var le={};Object.defineProperty(le,"passive",{get:function(){ce=!0}}),window.addEventListener("test-passive",null,le)}catch(Jl){}var ue=function(){return void 0===X&&(X=!Q&&!Z&&"undefined"!==typeof e&&(e["process"]&&"server"===e["process"].env.VUE_ENV)),X},de=Q&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function he(e){return"function"===typeof e&&/native code/.test(e.toString())}var fe,pe="undefined"!==typeof Symbol&&he(Symbol)&&"undefined"!==typeof Reflect&&he(Reflect.ownKeys);fe="undefined"!==typeof Set&&he(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ge=R,me=0,ve=function(){this.id=me++,this.subs=[]};ve.prototype.addSub=function(e){this.subs.push(e)},ve.prototype.removeSub=function(e){y(this.subs,e)},ve.prototype.depend=function(){ve.target&&ve.target.addDep(this)},ve.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(s&&!_(r,"default"))a=!1;else if(""===a||a===S(e)){var c=nt(String,r.type);(c<0||o0&&(a=$t(a,(t||"")+"_"+n),Ft(a[0])&&Ft(l)&&(u[c]=Ae(l.text+a[0].text),a.shift()),u.push.apply(u,a)):o(a)?Ft(l)?u[c]=Ae(l.text+a):""!==a&&u.push(Ae(a)):Ft(a)&&Ft(l)?u[c]=Ae(l.text+a.text):(s(e._isVList)&&r(a.tag)&&i(a.key)&&r(t)&&(a.key="__vlist"+t+"_"+n+"__"),u.push(a)));return u}function Tt(e){var t=e.$options.provide;t&&(e._provided="function"===typeof t?t.call(e):t)}function Lt(e){var t=Dt(e.$options.inject,e);t&&(Le(!1),Object.keys(t).forEach((function(n){Me(e,n,t[n])})),Le(!0))}function Dt(e,t){if(e){for(var n=Object.create(null),i=pe?Reflect.ownKeys(e):Object.keys(e),r=0;r0,a=e?!!e.$stable:!s,o=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(a&&i&&i!==n&&o===i.$key&&!s&&!i.$hasNormal)return i;for(var c in r={},e)e[c]&&"$"!==c[0]&&(r[c]=Mt(t,c,e[c]))}else r={};for(var l in t)l in r||(r[l]=jt(t,l));return e&&Object.isExtensible(e)&&(e._normalized=r),q(r,"$stable",a),q(r,"$key",o),q(r,"$hasNormal",s),r}function Mt(e,t,n){var i=function(){var e=arguments.length?n.apply(null,arguments):n({});return e=e&&"object"===typeof e&&!Array.isArray(e)?[e]:St(e),e&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:i,enumerable:!0,configurable:!0}),i}function jt(e,t){return function(){return e[t]}}function It(e,t){var n,i,s,a,o;if(Array.isArray(e)||"string"===typeof e)for(n=new Array(e.length),i=0,s=e.length;i1?L(n):n;for(var i=L(arguments,1),r='event handler for "'+e+'"',s=0,a=n.length;sdocument.createEvent("Event").timeStamp&&(Xn=function(){return Jn.now()})}function Qn(){var e,t;for(Yn=Xn(),Gn=!0,Hn.sort((function(e,t){return e.id-t.id})),qn=0;qnqn&&Hn[n].id>e.id)n--;Hn.splice(n+1,0,e)}else Hn.push(e);zn||(zn=!0,mt(Qn))}}var ii=0,ri=function(e,t,n,i,r){this.vm=e,r&&(e._watcher=this),e._watchers.push(this),i?(this.deep=!!i.deep,this.user=!!i.user,this.lazy=!!i.lazy,this.sync=!!i.sync,this.before=i.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++ii,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new fe,this.newDepIds=new fe,this.expression="","function"===typeof t?this.getter=t:(this.getter=Y(t),this.getter||(this.getter=R)),this.value=this.lazy?void 0:this.get()};ri.prototype.get=function(){var e;ye(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(Jl){if(!this.user)throw Jl;it(Jl,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&bt(e),we(),this.cleanupDeps()}return e},ri.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},ri.prototype.cleanupDeps=function(){var e=this.deps.length;while(e--){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},ri.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():ni(this)},ri.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||c(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(Jl){it(Jl,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},ri.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},ri.prototype.depend=function(){var e=this.deps.length;while(e--)this.deps[e].depend()},ri.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);var e=this.deps.length;while(e--)this.deps[e].removeSub(this);this.active=!1}};var si={enumerable:!0,configurable:!0,get:R,set:R};function ai(e,t,n){si.get=function(){return this[t][n]},si.set=function(e){this[t][n]=e},Object.defineProperty(e,n,si)}function oi(e){e._watchers=[];var t=e.$options;t.props&&ci(e,t.props),t.methods&&mi(e,t.methods),t.data?li(e):Oe(e._data={},!0),t.computed&&hi(e,t.computed),t.watch&&t.watch!==oe&&vi(e,t.watch)}function ci(e,t){var n=e.$options.propsData||{},i=e._props={},r=e.$options._propKeys=[],s=!e.$parent;s||Le(!1);var a=function(s){r.push(s);var a=Qe(s,t,n,e);Me(i,s,a),s in e||ai(e,"_props",s)};for(var o in t)a(o);Le(!0)}function li(e){var t=e.$options.data;t=e._data="function"===typeof t?ui(t,e):t||{},u(t)||(t={});var n=Object.keys(t),i=e.$options.props,r=(e.$options.methods,n.length);while(r--){var s=n[r];0,i&&_(i,s)||G(s)||ai(e,"_data",s)}Oe(t,!0)}function ui(e,t){ye();try{return e.call(t,t)}catch(Jl){return it(Jl,t,"data()"),{}}finally{we()}}var di={lazy:!0};function hi(e,t){var n=e._computedWatchers=Object.create(null),i=ue();for(var r in t){var s=t[r],a="function"===typeof s?s:s.get;0,i||(n[r]=new ri(e,a||R,R,di)),r in e||fi(e,r,s)}}function fi(e,t,n){var i=!ue();"function"===typeof n?(si.get=i?pi(t):gi(n),si.set=R):(si.get=n.get?i&&!1!==n.cache?pi(t):gi(n.get):R,si.set=n.set||R),Object.defineProperty(e,t,si)}function pi(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),ve.target&&t.depend(),t.value}}function gi(e){return function(){return e.call(this,this)}}function mi(e,t){e.$options.props;for(var n in t)e[n]="function"!==typeof t[n]?R:T(t[n],e)}function vi(e,t){for(var n in t){var i=t[n];if(Array.isArray(i))for(var r=0;r-1)return this;var n=L(arguments,1);return n.unshift(this),"function"===typeof e.install?e.install.apply(e,n):"function"===typeof e&&e.apply(null,n),t.push(e),this}}function Si(e){e.mixin=function(e){return this.options=Xe(this.options,e),this}}function Fi(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,i=n.cid,r=e._Ctor||(e._Ctor={});if(r[i])return r[i];var s=e.name||n.options.name;var a=function(e){this._init(e)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=t++,a.options=Xe(n.options,e),a["super"]=n,a.options.props&&$i(a),a.options.computed&&Ti(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,H.forEach((function(e){a[e]=n[e]})),s&&(a.options.components[s]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=D({},a.options),r[i]=a,a}}function $i(e){var t=e.options.props;for(var n in t)ai(e.prototype,"_props",n)}function Ti(e){var t=e.options.computed;for(var n in t)fi(e.prototype,n,t[n])}function Li(e){H.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&u(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"===typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}function Di(e){return e&&(e.Ctor.options.name||e.tag)}function Bi(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"===typeof e?e.split(",").indexOf(t)>-1:!!d(e)&&e.test(t)}function Ri(e,t){var n=e.cache,i=e.keys,r=e._vnode;for(var s in n){var a=n[s];if(a){var o=Di(a.componentOptions);o&&!t(o)&&Oi(n,s,i,r)}}}function Oi(e,t,n,i){var r=e[t];!r||i&&r.tag===i.tag||r.componentInstance.$destroy(),e[t]=null,y(n,t)}_i(Ci),yi(Ci),Ln(Ci),On(Ci),wn(Ci);var Mi=[String,RegExp,Array],ji={name:"keep-alive",abstract:!0,props:{include:Mi,exclude:Mi,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Oi(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",(function(t){Ri(e,(function(e){return Bi(t,e)}))})),this.$watch("exclude",(function(t){Ri(e,(function(e){return!Bi(t,e)}))}))},render:function(){var e=this.$slots.default,t=Cn(e),n=t&&t.componentOptions;if(n){var i=Di(n),r=this,s=r.include,a=r.exclude;if(s&&(!i||!Bi(s,i))||a&&i&&Bi(a,i))return t;var o=this,c=o.cache,l=o.keys,u=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;c[u]?(t.componentInstance=c[u].componentInstance,y(l,u),l.push(u)):(c[u]=t,l.push(u),this.max&&l.length>parseInt(this.max)&&Oi(c,l[0],l,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}},Ii={KeepAlive:ji};function Pi(e){var t={get:function(){return U}};Object.defineProperty(e,"config",t),e.util={warn:ge,extend:D,mergeOptions:Xe,defineReactive:Me},e.set=je,e.delete=Ie,e.nextTick=mt,e.observable=function(e){return Oe(e),e},e.options=Object.create(null),H.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,D(e.options.components,Ii),Ei(e),Si(e),Fi(e),Li(e)}Pi(Ci),Object.defineProperty(Ci.prototype,"$isServer",{get:ue}),Object.defineProperty(Ci.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Ci,"FunctionalRenderContext",{value:Zt}),Ci.version="2.6.12";var Ni=m("style,class"),Wi=m("input,textarea,option,select,progress"),Hi=function(e,t,n){return"value"===n&&Wi(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Vi=m("contenteditable,draggable,spellcheck"),Ui=m("events,caret,typing,plaintext-only"),zi=function(e,t){return Xi(t)||"false"===t?"false":"contenteditable"===e&&Ui(t)?t:"true"},Gi=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),qi="http://www.w3.org/1999/xlink",Ki=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Yi=function(e){return Ki(e)?e.slice(6,e.length):""},Xi=function(e){return null==e||!1===e};function Ji(e){var t=e.data,n=e,i=e;while(r(i.componentInstance))i=i.componentInstance._vnode,i&&i.data&&(t=Qi(i.data,t));while(r(n=n.parent))n&&n.data&&(t=Qi(t,n.data));return Zi(t.staticClass,t.class)}function Qi(e,t){return{staticClass:er(e.staticClass,t.staticClass),class:r(e.class)?[e.class,t.class]:t.class}}function Zi(e,t){return r(e)||r(t)?er(e,tr(t)):""}function er(e,t){return e?t?e+" "+t:e:t||""}function tr(e){return Array.isArray(e)?nr(e):c(e)?ir(e):"string"===typeof e?e:""}function nr(e){for(var t,n="",i=0,s=e.length;i-1?ur[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:ur[e]=/HTMLUnknownElement/.test(t.toString())}var hr=m("text,number,password,search,email,tel,url");function fr(e){if("string"===typeof e){var t=document.querySelector(e);return t||document.createElement("div")}return e}function pr(e,t){var n=document.createElement(e);return"select"!==e||t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n}function gr(e,t){return document.createElementNS(rr[e],t)}function mr(e){return document.createTextNode(e)}function vr(e){return document.createComment(e)}function br(e,t,n){e.insertBefore(t,n)}function yr(e,t){e.removeChild(t)}function wr(e,t){e.appendChild(t)}function _r(e){return e.parentNode}function xr(e){return e.nextSibling}function kr(e){return e.tagName}function Ar(e,t){e.textContent=t}function Cr(e,t){e.setAttribute(t,"")}var Er=Object.freeze({createElement:pr,createElementNS:gr,createTextNode:mr,createComment:vr,insertBefore:br,removeChild:yr,appendChild:wr,parentNode:_r,nextSibling:xr,tagName:kr,setTextContent:Ar,setStyleScope:Cr}),Sr={create:function(e,t){Fr(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Fr(e,!0),Fr(t))},destroy:function(e){Fr(e,!0)}};function Fr(e,t){var n=e.data.ref;if(r(n)){var i=e.context,s=e.componentInstance||e.elm,a=i.$refs;t?Array.isArray(a[n])?y(a[n],s):a[n]===s&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])?a[n].indexOf(s)<0&&a[n].push(s):a[n]=[s]:a[n]=s}}var $r=new _e("",{},[]),Tr=["create","activate","update","remove","destroy"];function Lr(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&r(e.data)===r(t.data)&&Dr(e,t)||s(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&i(t.asyncFactory.error))}function Dr(e,t){if("input"!==e.tag)return!0;var n,i=r(n=e.data)&&r(n=n.attrs)&&n.type,s=r(n=t.data)&&r(n=n.attrs)&&n.type;return i===s||hr(i)&&hr(s)}function Br(e,t,n){var i,s,a={};for(i=t;i<=n;++i)s=e[i].key,r(s)&&(a[s]=i);return a}function Rr(e){var t,n,a={},c=e.modules,l=e.nodeOps;for(t=0;tg?(d=i(n[b+1])?null:n[b+1].elm,k(e,d,n,p,b,s)):p>b&&C(t,h,g)}function F(e,t,n,i){for(var s=n;s-1?zr(e,t,n):Gi(t)?Xi(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Vi(t)?e.setAttribute(t,zi(t,n)):Ki(t)?Xi(n)?e.removeAttributeNS(qi,Yi(t)):e.setAttributeNS(qi,t,n):zr(e,t,n)}function zr(e,t,n){if(Xi(n))e.removeAttribute(t);else{if(ne&&!ie&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var i=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",i)};e.addEventListener("input",i),e.__ieph=!0}e.setAttribute(t,n)}}var Gr={create:Vr,update:Vr};function qr(e,t){var n=t.elm,s=t.data,a=e.data;if(!(i(s.staticClass)&&i(s.class)&&(i(a)||i(a.staticClass)&&i(a.class)))){var o=Ji(t),c=n._transitionClasses;r(c)&&(o=er(o,tr(c))),o!==n._prevClass&&(n.setAttribute("class",o),n._prevClass=o)}}var Kr,Yr,Xr,Jr,Qr,Zr,es={create:qr,update:qr},ts=/[\w).+\-_$\]]/;function ns(e){var t,n,i,r,s,a=!1,o=!1,c=!1,l=!1,u=0,d=0,h=0,f=0;for(i=0;i=0;p--)if(g=e.charAt(p)," "!==g)break;g&&ts.test(g)||(l=!0)}}else void 0===r?(f=i+1,r=e.slice(0,i).trim()):m();function m(){(s||(s=[])).push(e.slice(f,i).trim()),f=i+1}if(void 0===r?r=e.slice(0,i).trim():0!==f&&m(),s)for(i=0;i-1?{exp:e.slice(0,Jr),key:'"'+e.slice(Jr+1)+'"'}:{exp:e,key:null};Yr=e,Jr=Qr=Zr=0;while(!_s())Xr=ws(),xs(Xr)?As(Xr):91===Xr&&ks(Xr);return{exp:e.slice(0,Qr),key:e.slice(Qr+1,Zr)}}function ws(){return Yr.charCodeAt(++Jr)}function _s(){return Jr>=Kr}function xs(e){return 34===e||39===e}function ks(e){var t=1;Qr=Jr;while(!_s())if(e=ws(),xs(e))As(e);else if(91===e&&t++,93===e&&t--,0===t){Zr=Jr;break}}function As(e){var t=e;while(!_s())if(e=ws(),e===t)break}var Cs,Es="__r",Ss="__c";function Fs(e,t,n){n;var i=t.value,r=t.modifiers,s=e.tag,a=e.attrsMap.type;if(e.component)return vs(e,i,r),!1;if("select"===s)Ls(e,i,r);else if("input"===s&&"checkbox"===a)$s(e,i,r);else if("input"===s&&"radio"===a)Ts(e,i,r);else if("input"===s||"textarea"===s)Ds(e,i,r);else{if(!U.isReservedTag(s))return vs(e,i,r),!1}return!0}function $s(e,t,n){var i=n&&n.number,r=fs(e,"value")||"null",s=fs(e,"true-value")||"true",a=fs(e,"false-value")||"false";as(e,"checked","Array.isArray("+t+")?_i("+t+","+r+")>-1"+("true"===s?":("+t+")":":_q("+t+","+s+")")),ds(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+s+"):("+a+");if(Array.isArray($$a)){var $$v="+(i?"_n("+r+")":r)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+bs(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+bs(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+bs(t,"$$c")+"}",null,!0)}function Ts(e,t,n){var i=n&&n.number,r=fs(e,"value")||"null";r=i?"_n("+r+")":r,as(e,"checked","_q("+t+","+r+")"),ds(e,"change",bs(t,r),null,!0)}function Ls(e,t,n){var i=n&&n.number,r='Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(i?"_n(val)":"val")+"})",s="$event.target.multiple ? $$selectedVal : $$selectedVal[0]",a="var $$selectedVal = "+r+";";a=a+" "+bs(t,s),ds(e,"change",a,null,!0)}function Ds(e,t,n){var i=e.attrsMap.type,r=n||{},s=r.lazy,a=r.number,o=r.trim,c=!s&&"range"!==i,l=s?"change":"range"===i?Es:"input",u="$event.target.value";o&&(u="$event.target.value.trim()"),a&&(u="_n("+u+")");var d=bs(t,u);c&&(d="if($event.target.composing)return;"+d),as(e,"value","("+t+")"),ds(e,l,d,null,!0),(o||a)&&ds(e,"blur","$forceUpdate()")}function Bs(e){if(r(e[Es])){var t=ne?"change":"input";e[t]=[].concat(e[Es],e[t]||[]),delete e[Es]}r(e[Ss])&&(e.change=[].concat(e[Ss],e.change||[]),delete e[Ss])}function Rs(e,t,n){var i=Cs;return function r(){var s=t.apply(null,arguments);null!==s&&js(e,r,n,i)}}var Os=ct&&!(ae&&Number(ae[1])<=53);function Ms(e,t,n,i){if(Os){var r=Yn,s=t;t=s._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=r||e.timeStamp<=0||e.target.ownerDocument!==document)return s.apply(this,arguments)}}Cs.addEventListener(e,t,ce?{capture:n,passive:i}:n)}function js(e,t,n,i){(i||Cs).removeEventListener(e,t._wrapper||t,n)}function Is(e,t){if(!i(e.data.on)||!i(t.data.on)){var n=t.data.on||{},r=e.data.on||{};Cs=t.elm,Bs(n),xt(n,r,Ms,js,Rs,t.context),Cs=void 0}}var Ps,Ns={create:Is,update:Is};function Ws(e,t){if(!i(e.data.domProps)||!i(t.data.domProps)){var n,s,a=t.elm,o=e.data.domProps||{},c=t.data.domProps||{};for(n in r(c.__ob__)&&(c=t.data.domProps=D({},c)),o)n in c||(a[n]="");for(n in c){if(s=c[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),s===o[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=s;var l=i(s)?"":String(s);Hs(a,l)&&(a.value=l)}else if("innerHTML"===n&&ar(a.tagName)&&i(a.innerHTML)){Ps=Ps||document.createElement("div"),Ps.innerHTML=""+s+"";var u=Ps.firstChild;while(a.firstChild)a.removeChild(a.firstChild);while(u.firstChild)a.appendChild(u.firstChild)}else if(s!==o[n])try{a[n]=s}catch(Jl){}}}}function Hs(e,t){return!e.composing&&("OPTION"===e.tagName||Vs(e,t)||Us(e,t))}function Vs(e,t){var n=!0;try{n=document.activeElement!==e}catch(Jl){}return n&&e.value!==t}function Us(e,t){var n=e.value,i=e._vModifiers;if(r(i)){if(i.number)return g(n)!==g(t);if(i.trim)return n.trim()!==t.trim()}return n!==t}var zs={create:Ws,update:Ws},Gs=x((function(e){var t={},n=/;(?![^(]*\))/g,i=/:(.+)/;return e.split(n).forEach((function(e){if(e){var n=e.split(i);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}));function qs(e){var t=Ks(e.style);return e.staticStyle?D(e.staticStyle,t):t}function Ks(e){return Array.isArray(e)?B(e):"string"===typeof e?Gs(e):e}function Ys(e,t){var n,i={};if(t){var r=e;while(r.componentInstance)r=r.componentInstance._vnode,r&&r.data&&(n=qs(r.data))&&D(i,n)}(n=qs(e.data))&&D(i,n);var s=e;while(s=s.parent)s.data&&(n=qs(s.data))&&D(i,n);return i}var Xs,Js=/^--/,Qs=/\s*!important$/,Zs=function(e,t,n){if(Js.test(t))e.style.setProperty(t,n);else if(Qs.test(n))e.style.setProperty(S(t),n.replace(Qs,""),"important");else{var i=ta(t);if(Array.isArray(n))for(var r=0,s=n.length;r-1?t.split(ra).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function aa(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(ra).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{var n=" "+(e.getAttribute("class")||"")+" ",i=" "+t+" ";while(n.indexOf(i)>=0)n=n.replace(i," ");n=n.trim(),n?e.setAttribute("class",n):e.removeAttribute("class")}}function oa(e){if(e){if("object"===typeof e){var t={};return!1!==e.css&&D(t,ca(e.name||"v")),D(t,e),t}return"string"===typeof e?ca(e):void 0}}var ca=x((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),la=Q&&!ie,ua="transition",da="animation",ha="transition",fa="transitionend",pa="animation",ga="animationend";la&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ha="WebkitTransition",fa="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(pa="WebkitAnimation",ga="webkitAnimationEnd"));var ma=Q?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function va(e){ma((function(){ma(e)}))}function ba(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),sa(e,t))}function ya(e,t){e._transitionClasses&&y(e._transitionClasses,t),aa(e,t)}function wa(e,t,n){var i=xa(e,t),r=i.type,s=i.timeout,a=i.propCount;if(!r)return n();var o=r===ua?fa:ga,c=0,l=function(){e.removeEventListener(o,u),n()},u=function(t){t.target===e&&++c>=a&&l()};setTimeout((function(){c0&&(n=ua,u=a,d=s.length):t===da?l>0&&(n=da,u=l,d=c.length):(u=Math.max(a,l),n=u>0?a>l?ua:da:null,d=n?n===ua?s.length:c.length:0);var h=n===ua&&_a.test(i[ha+"Property"]);return{type:n,timeout:u,propCount:d,hasTransform:h}}function ka(e,t){while(e.length1}function $a(e,t){!0!==t.data.show&&Ca(t)}var Ta=Q?{create:$a,activate:$a,remove:function(e,t){!0!==e.data.show?Ea(e,t):t()}}:{},La=[Gr,es,Ns,zs,ia,Ta],Da=La.concat(Hr),Ba=Rr({nodeOps:Er,modules:Da});ie&&document.addEventListener("selectionchange",(function(){var e=document.activeElement;e&&e.vmodel&&Wa(e,"input")}));var Ra={inserted:function(e,t,n,i){"select"===n.tag?(i.elm&&!i.elm._vOptions?kt(n,"postpatch",(function(){Ra.componentUpdated(e,t,n)})):Oa(e,t,n.context),e._vOptions=[].map.call(e.options,Ia)):("textarea"===n.tag||hr(e.type))&&(e._vModifiers=t.modifiers,t.modifiers.lazy||(e.addEventListener("compositionstart",Pa),e.addEventListener("compositionend",Na),e.addEventListener("change",Na),ie&&(e.vmodel=!0)))},componentUpdated:function(e,t,n){if("select"===n.tag){Oa(e,t,n.context);var i=e._vOptions,r=e._vOptions=[].map.call(e.options,Ia);if(r.some((function(e,t){return!I(e,i[t])}))){var s=e.multiple?t.value.some((function(e){return ja(e,r)})):t.value!==t.oldValue&&ja(t.value,r);s&&Wa(e,"change")}}}};function Oa(e,t,n){Ma(e,t,n),(ne||re)&&setTimeout((function(){Ma(e,t,n)}),0)}function Ma(e,t,n){var i=t.value,r=e.multiple;if(!r||Array.isArray(i)){for(var s,a,o=0,c=e.options.length;o-1,a.selected!==s&&(a.selected=s);else if(I(Ia(a),i))return void(e.selectedIndex!==o&&(e.selectedIndex=o));r||(e.selectedIndex=-1)}}function ja(e,t){return t.every((function(t){return!I(t,e)}))}function Ia(e){return"_value"in e?e._value:e.value}function Pa(e){e.target.composing=!0}function Na(e){e.target.composing&&(e.target.composing=!1,Wa(e.target,"input"))}function Wa(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Ha(e){return!e.componentInstance||e.data&&e.data.transition?e:Ha(e.componentInstance._vnode)}var Va={bind:function(e,t,n){var i=t.value;n=Ha(n);var r=n.data&&n.data.transition,s=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;i&&r?(n.data.show=!0,Ca(n,(function(){e.style.display=s}))):e.style.display=i?s:"none"},update:function(e,t,n){var i=t.value,r=t.oldValue;if(!i!==!r){n=Ha(n);var s=n.data&&n.data.transition;s?(n.data.show=!0,i?Ca(n,(function(){e.style.display=e.__vOriginalDisplay})):Ea(n,(function(){e.style.display="none"}))):e.style.display=i?e.__vOriginalDisplay:"none"}},unbind:function(e,t,n,i,r){r||(e.style.display=e.__vOriginalDisplay)}},Ua={model:Ra,show:Va},za={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Ga(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Ga(Cn(t.children)):e}function qa(e){var t={},n=e.$options;for(var i in n.propsData)t[i]=e[i];var r=n._parentListeners;for(var s in r)t[A(s)]=r[s];return t}function Ka(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}function Ya(e){while(e=e.parent)if(e.data.transition)return!0}function Xa(e,t){return t.key===e.key&&t.tag===e.tag}var Ja=function(e){return e.tag||An(e)},Qa=function(e){return"show"===e.name},Za={name:"transition",props:za,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(Ja),n.length)){0;var i=this.mode;0;var r=n[0];if(Ya(this.$vnode))return r;var s=Ga(r);if(!s)return r;if(this._leaving)return Ka(e,r);var a="__transition-"+this._uid+"-";s.key=null==s.key?s.isComment?a+"comment":a+s.tag:o(s.key)?0===String(s.key).indexOf(a)?s.key:a+s.key:s.key;var c=(s.data||(s.data={})).transition=qa(this),l=this._vnode,u=Ga(l);if(s.data.directives&&s.data.directives.some(Qa)&&(s.data.show=!0),u&&u.data&&!Xa(s,u)&&!An(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var d=u.data.transition=D({},c);if("out-in"===i)return this._leaving=!0,kt(d,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),Ka(e,r);if("in-out"===i){if(An(s))return l;var h,f=function(){h()};kt(c,"afterEnter",f),kt(c,"enterCancelled",f),kt(d,"delayLeave",(function(e){h=e}))}}return r}}},eo=D({tag:String,moveClass:String},za);delete eo.mode;var to={props:eo,beforeMount:function(){var e=this,t=this._update;this._update=function(n,i){var r=Bn(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,r(),t.call(e,n,i)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),i=this.prevChildren=this.children,r=this.$slots.default||[],s=this.children=[],a=qa(this),o=0;oc&&(o.push(s=e.slice(c,r)),a.push(JSON.stringify(s)));var l=ns(i[1].trim());a.push("_s("+l+")"),o.push({"@binding":l}),c=r+i[0].length}return c\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ko=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ao="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+z.source+"]*",Co="((?:"+Ao+"\\:)?"+Ao+")",Eo=new RegExp("^<"+Co),So=/^\s*(\/?)>/,Fo=new RegExp("^<\\/"+Co+"[^>]*>"),$o=/^]+>/i,To=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Oo=/&(?:lt|gt|quot|amp|#39);/g,Mo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,jo=m("pre,textarea",!0),Io=function(e,t){return e&&jo(e)&&"\n"===t[0]};function Po(e,t){var n=t?Mo:Oo;return e.replace(n,(function(e){return Ro[e]}))}function No(e,t){var n,i,r=[],s=t.expectHTML,a=t.isUnaryTag||O,o=t.canBeLeftOpenTag||O,c=0;while(e){if(n=e,i&&Do(i)){var l=0,u=i.toLowerCase(),d=Bo[u]||(Bo[u]=new RegExp("([\\s\\S]*?)(]*>)","i")),h=e.replace(d,(function(e,n,i){return l=i.length,Do(u)||"noscript"===u||(n=n.replace(//g,"$1").replace(//g,"$1")),Io(u,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));c+=e.length-h.length,e=h,E(u,c-l,c)}else{var f=e.indexOf("<");if(0===f){if(To.test(e)){var p=e.indexOf("--\x3e");if(p>=0){t.shouldKeepComment&&t.comment(e.substring(4,p),c,c+p+3),k(p+3);continue}}if(Lo.test(e)){var g=e.indexOf("]>");if(g>=0){k(g+2);continue}}var m=e.match($o);if(m){k(m[0].length);continue}var v=e.match(Fo);if(v){var b=c;k(v[0].length),E(v[1],b,c);continue}var y=A();if(y){C(y),Io(y.tagName,e)&&k(1);continue}}var w=void 0,_=void 0,x=void 0;if(f>=0){_=e.slice(f);while(!Fo.test(_)&&!Eo.test(_)&&!To.test(_)&&!Lo.test(_)){if(x=_.indexOf("<",1),x<0)break;f+=x,_=e.slice(f)}w=e.substring(0,f)}f<0&&(w=e),w&&k(w.length),t.chars&&w&&t.chars(w,c-w.length,c)}if(e===n){t.chars&&t.chars(e);break}}function k(t){c+=t,e=e.substring(t)}function A(){var t=e.match(Eo);if(t){var n,i,r={tagName:t[1],attrs:[],start:c};k(t[0].length);while(!(n=e.match(So))&&(i=e.match(ko)||e.match(xo)))i.start=c,k(i[0].length),i.end=c,r.attrs.push(i);if(n)return r.unarySlash=n[1],k(n[0].length),r.end=c,r}}function C(e){var n=e.tagName,c=e.unarySlash;s&&("p"===i&&_o(n)&&E(i),o(n)&&i===n&&E(n));for(var l=a(n)||!!c,u=e.attrs.length,d=new Array(u),h=0;h=0;a--)if(r[a].lowerCasedTag===o)break}else a=0;if(a>=0){for(var l=r.length-1;l>=a;l--)t.end&&t.end(r[l].tag,n,s);r.length=a,i=a&&r[a-1].tag}else"br"===o?t.start&&t.start(e,[],!0,n,s):"p"===o&&(t.start&&t.start(e,[],!1,n,s),t.end&&t.end(e,n,s))}E()}var Wo,Ho,Vo,Uo,zo,Go,qo,Ko,Yo=/^@|^v-on:/,Xo=/^v-|^@|^:|^#/,Jo=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Qo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Zo=/^\(|\)$/g,ec=/^\[.*\]$/,tc=/:(.*)$/,nc=/^:|^\.|^v-bind:/,ic=/\.[^.\]]+(?=[^\]]*$)/g,rc=/^v-slot(:|$)|^#/,sc=/[\r\n]/,ac=/\s+/g,oc=x(bo.decode),cc="_empty_";function lc(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:Tc(t),rawAttrsMap:{},parent:n,children:[]}}function uc(e,t){Wo=t.warn||rs,Go=t.isPreTag||O,qo=t.mustUseProp||O,Ko=t.getTagNamespace||O;var n=t.isReservedTag||O;(function(e){return!!e.component||!n(e.tag)}),Vo=ss(t.modules,"transformNode"),Uo=ss(t.modules,"preTransformNode"),zo=ss(t.modules,"postTransformNode"),Ho=t.delimiters;var i,r,s=[],a=!1!==t.preserveWhitespace,o=t.whitespace,c=!1,l=!1;function u(e){if(d(e),c||e.processed||(e=fc(e,t)),s.length||e===i||i.if&&(e.elseif||e.else)&&_c(i,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)yc(e,r);else{if(e.slotScope){var n=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[n]=e}r.children.push(e),e.parent=r}e.children=e.children.filter((function(e){return!e.slotScope})),d(e),e.pre&&(c=!1),Go(e.tag)&&(l=!1);for(var a=0;a|^function(?:\s+[\w$]+)?\s*\(/,el=/\([^)]*?\);*$/,tl=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,nl={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},il={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},rl=function(e){return"if("+e+")return null;"},sl={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:rl("$event.target !== $event.currentTarget"),ctrl:rl("!$event.ctrlKey"),shift:rl("!$event.shiftKey"),alt:rl("!$event.altKey"),meta:rl("!$event.metaKey"),left:rl("'button' in $event && $event.button !== 0"),middle:rl("'button' in $event && $event.button !== 1"),right:rl("'button' in $event && $event.button !== 2")};function al(e,t){var n=t?"nativeOn:":"on:",i="",r="";for(var s in e){var a=ol(e[s]);e[s]&&e[s].dynamic?r+=s+","+a+",":i+='"'+s+'":'+a+","}return i="{"+i.slice(0,-1)+"}",r?n+"_d("+i+",["+r.slice(0,-1)+"])":n+i}function ol(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return ol(e)})).join(",")+"]";var t=tl.test(e.value),n=Zc.test(e.value),i=tl.test(e.value.replace(el,""));if(e.modifiers){var r="",s="",a=[];for(var o in e.modifiers)if(sl[o])s+=sl[o],nl[o]&&a.push(o);else if("exact"===o){var c=e.modifiers;s+=rl(["ctrl","shift","alt","meta"].filter((function(e){return!c[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else a.push(o);a.length&&(r+=cl(a)),s&&(r+=s);var l=t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":i?"return "+e.value:e.value;return"function($event){"+r+l+"}"}return t||n?e.value:"function($event){"+(i?"return "+e.value:e.value)+"}"}function cl(e){return"if(!$event.type.indexOf('key')&&"+e.map(ll).join("&&")+")return null;"}function ll(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=nl[e],i=il[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(i)+")"}function ul(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}}function dl(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}}var hl={on:ul,bind:dl,cloak:R},fl=function(e){this.options=e,this.warn=e.warn||rs,this.transforms=ss(e.modules,"transformCode"),this.dataGenFns=ss(e.modules,"genData"),this.directives=D(D({},hl),e.directives);var t=e.isReservedTag||O;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function pl(e,t){var n=new fl(t),i=e?gl(e,n):'_c("div")';return{render:"with(this){return "+i+"}",staticRenderFns:n.staticRenderFns}}function gl(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return ml(e,t);if(e.once&&!e.onceProcessed)return vl(e,t);if(e.for&&!e.forProcessed)return wl(e,t);if(e.if&&!e.ifProcessed)return bl(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return Rl(e,t);var n;if(e.component)n=Ol(e.component,e,t);else{var i;(!e.plain||e.pre&&t.maybeComponent(e))&&(i=_l(e,t));var r=e.inlineTemplate?null:Fl(e,t,!0);n="_c('"+e.tag+"'"+(i?","+i:"")+(r?","+r:"")+")"}for(var s=0;s>>0}function El(e){return 1===e.type&&("slot"===e.tag||e.children.some(El))}function Sl(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return bl(e,t,Sl,"null");if(e.for&&!e.forProcessed)return wl(e,t,Sl);var i=e.slotScope===cc?"":String(e.slotScope),r="function("+i+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Fl(e,t)||"undefined")+":undefined":Fl(e,t)||"undefined":gl(e,t))+"}",s=i?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+r+s+"}"}function Fl(e,t,n,i,r){var s=e.children;if(s.length){var a=s[0];if(1===s.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var o=n?t.maybeComponent(a)?",1":",0":"";return""+(i||gl)(a,t)+o}var c=n?$l(s,t.maybeComponent):0,l=r||Ll;return"["+s.map((function(e){return l(e,t)})).join(",")+"]"+(c?","+c:"")}}function $l(e,t){for(var n=0,i=0;i':'
    ',Wl.innerHTML.indexOf(" ")>0}var Gl=!!Q&&zl(!1),ql=!!Q&&zl(!0),Kl=x((function(e){var t=fr(e);return t&&t.innerHTML})),Yl=Ci.prototype.$mount;function Xl(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}Ci.prototype.$mount=function(e,t){if(e=e&&fr(e),e===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var i=n.template;if(i)if("string"===typeof i)"#"===i.charAt(0)&&(i=Kl(i));else{if(!i.nodeType)return this;i=i.innerHTML}else e&&(i=Xl(e));if(i){0;var r=Ul(i,{outputSourceRange:!1,shouldDecodeNewlines:Gl,shouldDecodeNewlinesForHref:ql,delimiters:n.delimiters,comments:n.comments},this),s=r.render,a=r.staticRenderFns;n.render=s,n.staticRenderFns=a}}return Yl.call(this,e,t)},Ci.compile=Ul,t["a"]=Ci}).call(this,n("c8ba"))},a078:function(e,t,n){var i=n("7b0b"),r=n("50c4"),s=n("35a1"),a=n("e95a"),o=n("0366"),c=n("ebb5").aTypedArrayConstructor;e.exports=function(e){var t,n,l,u,d,h,f=i(e),p=arguments.length,g=p>1?arguments[1]:void 0,m=void 0!==g,v=s(f);if(void 0!=v&&!a(v)){d=v.call(f),h=d.next,f=[];while(!(u=h.call(d)).done)f.push(u.value)}for(m&&p>2&&(g=o(g,arguments[2],2)),n=r(f.length),l=new(c(this))(n),t=0;n>t;t++)l[t]=m?g(f[t],t):f[t];return l}},a15b:function(e,t,n){"use strict";var i=n("23e7"),r=n("44ad"),s=n("fc6a"),a=n("a640"),o=[].join,c=r!=Object,l=a("join",",");i({target:"Array",proto:!0,forced:c||!l},{join:function(e){return o.call(s(this),void 0===e?",":e)}})},a1f0:function(e,t,n){"use strict";var i=n("23e7"),r=n("9ed3"),s=n("1d80"),a=n("50c4"),o=n("1c0b"),c=n("825a"),l=n("c6b6"),u=n("44e7"),d=n("ad6d"),h=n("9112"),f=n("d039"),p=n("b622"),g=n("4840"),m=n("8aa5"),v=n("69f3"),b=n("c430"),y=p("matchAll"),w="RegExp String",_=w+" Iterator",x=v.set,k=v.getterFor(_),A=RegExp.prototype,C=A.exec,E="".matchAll,S=!!E&&!f((function(){"a".matchAll(/./)})),F=function(e,t){var n,i=e.exec;if("function"==typeof i){if(n=i.call(e,t),"object"!=typeof n)throw TypeError("Incorrect exec result");return n}return C.call(e,t)},$=r((function(e,t,n,i){x(this,{type:_,regexp:e,string:t,global:n,unicode:i,done:!1})}),w,(function(){var e=k(this);if(e.done)return{value:void 0,done:!0};var t=e.regexp,n=e.string,i=F(t,n);return null===i?{value:void 0,done:e.done=!0}:e.global?(""==String(i[0])&&(t.lastIndex=m(n,a(t.lastIndex),e.unicode)),{value:i,done:!1}):(e.done=!0,{value:i,done:!1})})),T=function(e){var t,n,i,r,s,o,l=c(this),u=String(e);return t=g(l,RegExp),n=l.flags,void 0===n&&l instanceof RegExp&&!("flags"in A)&&(n=d.call(l)),i=void 0===n?"":String(n),r=new t(t===RegExp?l.source:l,i),s=!!~i.indexOf("g"),o=!!~i.indexOf("u"),r.lastIndex=a(l.lastIndex),new $(r,u,s,o)};i({target:"String",proto:!0,forced:S},{matchAll:function(e){var t,n,i,r,a=s(this);if(null!=e){if(u(e)&&(t=String(s("flags"in A?e.flags:d.call(e))),!~t.indexOf("g")))throw TypeError("`.matchAll` does not allow non-global regexes");if(S)return E.apply(a,arguments);if(i=e[y],void 0===i&&b&&"RegExp"==l(e)&&(i=T),null!=i)return o(i).call(e,a)}else if(S)return E.apply(a,arguments);return n=String(a),r=new RegExp(e,"g"),b?T.call(r,n):r[y](n)}}),b||y in A||h(A,y,T)},a2bf:function(e,t,n){"use strict";var i=n("e8b5"),r=n("50c4"),s=n("0366"),a=function(e,t,n,o,c,l,u,d){var h,f=c,p=0,g=!!u&&s(u,d,3);while(p0&&i(h))f=a(e,t,h,r(h.length),f,l-1)-1;else{if(f>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[f]=h}f++}p++}return f};e.exports=a},a3f9:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-button",{attrs:{params:{close:1,code:e.code}}},[e._v("Save and Close")]),n("vui-button",{attrs:{params:{execute:1,code:e.code}}},[e._v("Save and Execute")]),n("vui-button",{attrs:{params:{close:1,code:e.s.code}}},[e._v("Close")]),n("editor",{attrs:{lang:"javascript",theme:"monokai",width:"100%",height:"50em"},on:{init:e.editorInit},model:{value:e.code,callback:function(t){e.code=t},expression:"code"}})],1)},r=[],s={data:function(){return{s:this.$root.$data.state,code:'Term.write("AAA")'}},components:{editor:n("7c9e")},created:function(){this.code=this.s.code},methods:{editorInit:function(){n("2099"),n("bb36"),n("14d4"),n("6a21")}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},a434:function(e,t,n){"use strict";var i=n("23e7"),r=n("23cb"),s=n("a691"),a=n("50c4"),o=n("7b0b"),c=n("65f0"),l=n("8418"),u=n("1dde"),d=n("ae40"),h=u("splice"),f=d("splice",{ACCESSORS:!0,0:0,1:2}),p=Math.max,g=Math.min,m=9007199254740991,v="Maximum allowed length exceeded";i({target:"Array",proto:!0,forced:!h||!f},{splice:function(e,t){var n,i,u,d,h,f,b=o(this),y=a(b.length),w=r(e,y),_=arguments.length;if(0===_?n=i=0:1===_?(n=0,i=y-w):(n=_-2,i=g(p(s(t),0),y-w)),y+n-i>m)throw TypeError(v);for(u=c(b,i),d=0;dy-i+n;d--)delete b[d-1]}else if(n>i)for(d=y-i;d>w;d--)h=d+i-1,f=d+n-1,h in b?b[f]=b[h]:delete b[f];for(d=0;ds)r.push(arguments[s++]);if(i=t,(f(t)||void 0!==e)&&!oe(e))return h(t)||(t=function(e,t){if("function"==typeof i&&(t=i.call(this,e,t)),!oe(t))return t}),r[1]=t,q.apply(null,r)}})}G[W][H]||S(G[W],H,G[W].valueOf),M(G,N),L[P]=!0},a4ec:function(e,t,n){},a589:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.on?[e.pastHalfTime?[e.ingredientsPresent?e.failed?n("p",[e._v("Something doesn't look right...")]):n("p",[e._v("It's cooking nicely!")]):n("p",[e._v("There's nothing inside. Microwave's working, though!")])]:n("p",[e._v("It's starting to cook...")]),n("vui-progress",{attrs:{value:e.$root.$data.wtime,min:e.start_time,max:e.start_time+e.cook_time}}),n("vui-button",{staticClass:"danger danger-control",attrs:{icon:"exclamation-triangle",params:{abort:1}}},[e._v("Abort!")])]:[n("h4",[e._v("Ingredients")]),n("ul",[e.ingredientsPresent?e._e():n("li",[e._v("The microwave is empty!")]),e._l(e.cookingobjs,(function(t,i){return n("li",{key:i},[n("vui-button",{attrs:{params:{eject:i}}},[e._v(" "+e._s(i)+" • "+e._s(t)+" ")])],1)})),e._l(e.cookingreas,(function(t,i){return n("li",{key:i},[n("vui-button",{attrs:{params:{eject:i}}},[e._v(" "+e._s(i)+" • "+e._s(t)+" units ")])],1)}))],2),n("vui-button",{staticClass:"danger danger-control",attrs:{icon:"trash",params:{eject_all:1}}},[e._v("Eject All")]),n("vui-button",{staticClass:"control",attrs:{params:{cook:1}}},[e._v("Cook!")])]],2)},r=[],s=(n("b64b"),{data:function(){return this.$root.$data.state},computed:{ingredientsPresent:function(){return Object.keys(this.cookingobjs).length>0||Object.keys(this.cookingreas).length>0},pastHalfTime:function(){return this.$root.$data.wtime>this.start_time+this.cook_time/2}}}),a=s,o=(n("e48d"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"2005209a",null);t["default"]=c.exports},a5e6:function(e,t,n){},a623:function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").every,s=n("a640"),a=n("ae40"),o=s("every"),c=a("every");i({target:"Array",proto:!0,forced:!o||!c},{every:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},a630:function(e,t,n){var i=n("23e7"),r=n("4df4"),s=n("1c7e"),a=!s((function(e){Array.from(e)}));i({target:"Array",stat:!0,forced:a},{from:r})},a640:function(e,t,n){"use strict";var i=n("d039");e.exports=function(e,t){var n=[][e];return!!n&&i((function(){n.call(null,t||function(){throw 1},1)}))}},a691:function(e,t){var n=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:n)(e)}},a6fd:function(e,t,n){var i=n("23e7"),r=n("d066"),s=n("1c0b"),a=n("825a"),o=n("d039"),c=r("Reflect","apply"),l=Function.apply,u=!o((function(){c((function(){}))}));i({target:"Reflect",stat:!0,forced:u},{apply:function(e,t,n){return s(e),a(n),c?c(e,t,n):l.call(e,t,n)}})},a79d:function(e,t,n){"use strict";var i=n("23e7"),r=n("c430"),s=n("fea9"),a=n("d039"),o=n("d066"),c=n("4840"),l=n("cdf9"),u=n("6eeb"),d=!!s&&a((function(){s.prototype["finally"].call({then:function(){}},(function(){}))}));i({target:"Promise",proto:!0,real:!0,forced:d},{finally:function(e){var t=c(this,o("Promise")),n="function"==typeof e;return this.then(n?function(n){return l(t,e()).then((function(){return n}))}:e,n?function(n){return l(t,e()).then((function(){throw n}))}:e)}}),r||"function"!=typeof s||s.prototype["finally"]||u(s.prototype,"finally",o("Promise").prototype["finally"])},a7c6:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("view-mcomputer-ntsl-"+e.s.mode,{tag:"component"})],1)},r=[],s={data:function(){return{s:this.$root.$data.state}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},a874:function(e,t,n){var i=n("23e7"),r=n("145e"),s=n("44d2");i({target:"Array",proto:!0},{copyWithin:r}),s("copyWithin")},a8bb:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._v(" You are not authenticated. Please login to continue. "),n("vui-button",{attrs:{params:{login:1}}},[e._v("Login")])],1)},r=[],s=n("2877"),a={},o=Object(s["a"])(a,i,r,!1,null,null,null);t["default"]=o.exports},a919:function(e,t,n){var i=n("ddc6"),r={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},s=i(r);e.exports=s},a975:function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").every,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("every",(function(e){return r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},a981:function(e,t){e.exports="undefined"!==typeof ArrayBuffer&&"undefined"!==typeof DataView},a9e3:function(e,t,n){"use strict";var i=n("83ab"),r=n("da84"),s=n("94ca"),a=n("6eeb"),o=n("5135"),c=n("c6b6"),l=n("7156"),u=n("c04e"),d=n("d039"),h=n("7c73"),f=n("241c").f,p=n("06cf").f,g=n("9bf2").f,m=n("58a8").trim,v="Number",b=r[v],y=b.prototype,w=c(h(y))==v,_=function(e){var t,n,i,r,s,a,o,c,l=u(e,!1);if("string"==typeof l&&l.length>2)if(l=m(l),t=l.charCodeAt(0),43===t||45===t){if(n=l.charCodeAt(2),88===n||120===n)return NaN}else if(48===t){switch(l.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+l}for(s=l.slice(2),a=s.length,o=0;or)return NaN;return parseInt(s,i)}return+l};if(s(v,!b(" 0o1")||!b("0b1")||b("+0x1"))){for(var x,k=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof k&&(w?d((function(){y.valueOf.call(n)})):c(n)!=v)?l(new b(_(t)),n,k):_(t)},A=i?f(b):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),C=0;A.length>C;C++)o(b,x=A[C])&&!o(k,x)&&g(k,x,p(b,x));k.prototype=y,y.constructor=k,a(r,v,k)}},a9fa:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("h3",[e._v("Limbs")]),n("table",{staticClass:"table border"},[e._m(0),e._l(e.limbs,(function(t,i){return n("tr",{key:i,staticClass:"item border"},[n("td",{staticStyle:{width:"20%"}},[e._v(e._s(i))]),n("td",[n("vui-button",{attrs:{params:{target:"limb",name:i,action:"brute"}}},[e._v("Brute")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"burn"}}},[e._v("Burn")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"infection"}}},[e._v("Infection")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"shatter"}}},[e._v("Shatter")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"arterial"}}},[e._v("Arterial")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"sever"}}},[e._v("Sever")])],1)])}))],2)]),n("div",[n("h3",[e._v("Organs")]),n("table",{staticClass:"table border"},[e._m(1),e._l(e.organs,(function(t,i){return n("tr",{key:i,staticClass:"item border"},[n("td",{staticStyle:{width:"20%"}},[e._v(e._s(i))]),n("td",[n("vui-button",{attrs:{params:{target:"organ",name:i,action:"damage"}}},[e._v("Damage")]),n("vui-button",{attrs:{params:{target:"organ",name:i,action:"infection"}}},[e._v("Infection")]),n("vui-button",{attrs:{params:{target:"organ",name:i,action:"bruise"}}},[e._v("Bruise")]),n("vui-button",{attrs:{params:{target:"organ",name:i,action:"break"}}},[e._v("Break")]),n("vui-button",{attrs:{params:{target:"organ",name:i,action:"remove"}}},[e._v("Remove")])],1)])}))],2)]),n("div",[n("h3",[e._v("Miscellaneous")]),n("vui-button",{attrs:{params:{target:"misc",action:"wind"}}},[e._v("Toggle Wind")]),n("vui-button",{attrs:{params:{target:"misc",action:"gigashatter"}}},[e._v("Gigashatter")]),n("vui-button",{attrs:{params:{target:"misc",action:"kill"}}},[e._v("Kill")]),n("vui-button",{attrs:{params:{target:"misc",action:"gib"}}},[e._v("Gib")])],1)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Name")]),n("th",[e._v("Tools")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Name")]),n("th",[e._v("Tools")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=(n("96f3"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"36dbac0c",null);t["default"]=c.exports},aa68:function(e,t,n){"use strict";n("afcf")},aaec:function(e,t){var n="\\ud800-\\udfff",i="\\u0300-\\u036f",r="\\ufe20-\\ufe2f",s="\\u20d0-\\u20ff",a=i+r+s,o="\\ufe0e\\ufe0f",c="\\u200d",l=RegExp("["+c+n+a+o+"]");function u(e){return l.test(e)}e.exports=u},ab13:function(e,t,n){var i=n("b622"),r=i("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,"/./"[e](t)}catch(i){}}return!1}},ac02:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Chemical Implants")]),n("table",{staticClass:"table border"},[e._m(0),e._l(e.chem_implants,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.implanted_name))]),n("td",[e._v(e._s(t.remaining_units))]),n("td",[n("vui-button",{attrs:{disabled:t.remaining_units<1,params:{inject1:t.ref}}},[e._v("Inject 1u")]),n("vui-button",{attrs:{disabled:t.remaining_units<5,params:{inject5:t.ref}}},[e._v("Inject 5u")]),n("vui-button",{attrs:{disabled:t.remaining_units<10,params:{inject5:t.ref}}},[e._v("Inject 10u")])],1)])}))],2),n("h3",[e._v("Tracking Implants")]),n("table",{staticClass:"table border"},[e._m(1),e._l(e.tracking_implants,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.id))]),n("td",[e._v(e._s(t.loc_display))]),n("td",[n("vui-button",{attrs:{params:{warn:t.ref}}},[e._v("Message Implanted User")])],1)])}))],2)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Implanted User")]),n("th",[e._v("Remaining Chemical Units")]),n("th",[e._v("Options")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Tracking ID")]),n("th",[e._v("Current Area")]),n("th",[e._v("Options")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=(n("ada8"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"1844f920",null);t["default"]=c.exports},ac16:function(e,t,n){var i=n("23e7"),r=n("825a"),s=n("06cf").f;i({target:"Reflect",stat:!0},{deleteProperty:function(e,t){var n=s(r(e),t);return!(n&&!n.configurable)&&delete e[t]}})},ac1f:function(e,t,n){"use strict";var i=n("23e7"),r=n("9263");i({target:"RegExp",proto:!0,forced:/./.exec!==r},{exec:r})},ac4c:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-input-search",{staticStyle:{display:"block"},attrs:{input:e.records,keys:["id","name","rank","sex","age","fingerprint","blood","dna"]},model:{value:e.filtered,callback:function(t){e.filtered=t},expression:"filtered"}}),e._l(e.filtered,(function(t){return n("div",{key:t.id},[n("vui-button",{attrs:{params:{setactive:t.id},icon:t.has_notes?"align-justify":null,"push-state":""},on:{click:function(t){e.state.activeview=e.state.defaultview}}},[e._v(e._s(t.id)+": "+e._s(t.name)+" ("+e._s(t.rank)+")")])],1)})),n("vui-button",{staticClass:"newrecord",attrs:{"v-if":(1&e.editable)>0,params:{newrecord:1},"push-state":""},on:{click:function(t){e.state.activeview=e.state.defaultview}}},[e._v("New Record")])],2)},r=[],s=(n("07ac"),{data:function(){return{state:this.$root.$data.state,filtered:[]}},computed:{records:function(){return Object.values(this.state.allrecords)}}}),a=s,o=(n("682e"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"df4093f4",null);t["default"]=c.exports},acac:function(e,t,n){"use strict";var i=n("e2cc"),r=n("f183").getWeakData,s=n("825a"),a=n("861d"),o=n("19aa"),c=n("2266"),l=n("b727"),u=n("5135"),d=n("69f3"),h=d.set,f=d.getterFor,p=l.find,g=l.findIndex,m=0,v=function(e){return e.frozen||(e.frozen=new b)},b=function(){this.entries=[]},y=function(e,t){return p(e.entries,(function(e){return e[0]===t}))};b.prototype={get:function(e){var t=y(this,e);if(t)return t[1]},has:function(e){return!!y(this,e)},set:function(e,t){var n=y(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=g(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,l){var d=e((function(e,i){o(e,d,t),h(e,{type:t,id:m++,frozen:void 0}),void 0!=i&&c(i,e[l],{that:e,AS_ENTRIES:n})})),p=f(t),g=function(e,t,n){var i=p(e),a=r(s(t),!0);return!0===a?v(i).set(t,n):a[i.id]=n,e};return i(d.prototype,{delete:function(e){var t=p(this);if(!a(e))return!1;var n=r(e);return!0===n?v(t)["delete"](e):n&&u(n,t.id)&&delete n[t.id]},has:function(e){var t=p(this);if(!a(e))return!1;var n=r(e);return!0===n?v(t).has(e):n&&u(n,t.id)}}),i(d.prototype,n?{get:function(e){var t=p(this);if(a(e)){var n=r(e);return!0===n?v(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return g(this,e,t)}}:{add:function(e){return g(this,e,!0)}}),d}}},accc:function(e,t,n){var i=n("23e7"),r=n("64e5");i({target:"Date",proto:!0,forced:Date.prototype.toISOString!==r},{toISOString:r})},acd8:function(e,t,n){var i=n("23e7"),r=n("7e12");i({global:!0,forced:parseFloat!=r},{parseFloat:r})},ace4:function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("621a"),a=n("825a"),o=n("23cb"),c=n("50c4"),l=n("4840"),u=s.ArrayBuffer,d=s.DataView,h=u.prototype.slice,f=r((function(){return!new u(2).slice(1,void 0).byteLength}));i({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:f},{slice:function(e,t){if(void 0!==h&&void 0===t)return h.call(a(this),e);var n=a(this).byteLength,i=o(e,n),r=o(void 0===t?n:t,n),s=new(l(this,u))(c(r-i)),f=new d(this),p=new d(s),g=0;while(i3}))}},af89:function(e,t,n){"use strict";n("6836")},af93:function(e,t,n){var i=n("23e7"),r=n("861d"),s=n("f183").onFreeze,a=n("bb2f"),o=n("d039"),c=Object.seal,l=o((function(){c(1)}));i({target:"Object",stat:!0,forced:l,sham:!a},{seal:function(e){return c&&r(e)?c(s(e)):e}})},afb9:function(e,t,n){},afcf:function(e,t,n){},aff5:function(e,t,n){var i=n("23e7");i({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},b041:function(e,t,n){"use strict";var i=n("00ee"),r=n("f5df");e.exports=i?{}.toString:function(){return"[object "+r(this)+"]"}},b053:function(e,t,n){},b087:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.power?n("div",[e.occupant?n("div",[n("div",{staticClass:"columnHolder"},[n("div",{staticClass:"column"},[n("div",[n("h3",[e._v("Occupant Status:")]),n("div",[n("span",{staticClass:"text"},[e._v("Status:")]),e._v(" "),n("span",{style:{color:e.consciousnessLabel(e.stat)}},[e._v(e._s(e.consciousnessText(e.stat)))])]),n("div",[n("span",{staticClass:"text"},[e._v("Stasis Level:")]),e._v(" "+e._s(e.stasis))]),n("div",[n("span",{staticClass:"text"},[e._v("Species:")]),e._v(" "+e._s(e.species))]),n("div",[n("span",{staticClass:"text"},[e._v("Brain Activity:")]),e._v(" "),n("vui-progress",{class:e.progressClass(e.brain_activity),attrs:{value:e.brain_activity}},[e._v(e._s(e.brain_activity)+"%")])],1),n("div",[n("span",{staticClass:"text"},[e._v("Pulse:")]),e._v(" "+e._s(e.pulse))]),n("div",[n("span",{staticClass:"text"},[e._v("BP:")]),e._v(" "),n("span",{style:{color:e.getPressureClass(e.blood_pressure_level)}},[e._v(e._s(e.blood_pressure))])]),n("div",[n("span",{staticClass:"text"},[e._v("Blood Oxygenation:")]),e._v(" "),n("vui-progress",{class:e.progressClass(e.brain_activity),attrs:{value:Math.round(e.blood_o2)}},[e._v(e._s(Math.round(e.blood_o2))+"%")])],1),n("h3",[e._v("Bloodstream Reagents:")]),e.bloodreagents?n("div",[n("table",e._l(e.bloodreagents,(function(t){return n("tr",{key:t.name},[n("td",[n("span",{staticClass:"text"},[e._v(e._s(t.name)+":")])]),n("td",{staticClass:"shifted"},[e._v(e._s(t.amount)+"u")])])})),0)]):n("div",[e._v(" The occupant has no additional reagents in their bloodstream. ")]),n("h3",[e._v("Stomach Reagents:")]),e.hasstomach?n("div",[e.stomachreagents?n("div",[n("table",e._l(e.stomachreagents,(function(t){return n("tr",{key:t.name},[n("td",[n("span",{staticClass:"text"},[e._v(e._s(t.name)+":")])]),n("td",{staticClass:"shifted"},[e._v(e._s(t.amount)+"u")])])})),0)]):n("div",[e._v(" The occupant has nothing in their stomach. ")])]):n("div",[e._v(" The occupant does not have a stomach. ")])])]),n("div",{staticClass:"column"},[n("h3",[e._v("Injectable Reagents:")]),n("table",e._l(e.reagents,(function(t){return n("tr",{key:t.name},[n("td",[n("span",{staticClass:"text"},[e._v(e._s(t.name)+":")])]),n("td",[n("vui-button",{attrs:{params:{chemical:t.type,amount:5}}},[e._v("Inject 5")])],1),n("td",[n("vui-button",{attrs:{params:{chemical:t.type,amount:10}}},[e._v("Inject 10")])],1)])})),0),n("h3",[e._v("Stasis Settings:")]),n("table",[n("tr",e._l(e.stasissettings,(function(t){return n("td",{key:t},[n("vui-button",{attrs:{params:{stasis:t}}},[e._v(e._s(t))])],1)})),0)])])])]):n("div",[e._v(" No occupant. ")])]):n("div",[e._m(0)]),e.occupant?n("div",[n("div",{staticClass:"columnHolder"},[n("div",{staticClass:"float"},[n("vui-button",{attrs:{params:{eject:1}}},[e._v("Eject Occupant")])],1),n("div",{staticClass:"float"},[e.filtering?n("div",[n("vui-button",{attrs:{params:{filter:-1}}},[e._v("Dialysis Active")])],1):n("div",[n("vui-button",{attrs:{params:{filter:1}}},[e._v("Dialysis Inactive")])],1)]),n("div",{staticClass:"float"},[e.pump?n("div",[n("vui-button",{attrs:{params:{pump:-1}}},[e._v("Stomach Pump Active")])],1):n("div",[n("vui-button",{attrs:{params:{pump:1}}},[e._v("Stomach Pump Inactive")])],1)])])]):e._e(),-1!=e.beaker?n("div",[n("span",{staticClass:"text"},[e._v("Beaker:")]),e._v(" "+e._s(e.beaker)+" units of free space remaining. "),n("vui-button",{attrs:{params:{beaker:1}}},[e._v("Eject Beaker")])],1):n("div",[e._v(" No beaker inserted. ")])])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"itemLabel"},[n("h2",[e._v("NO POWER")])])}],s={data:function(){return this.$root.$data.state},methods:{consciousnessLabel:function(e){switch(e){case 0:return"LimeGreen";case 1:return"OrangeRed";case 2:return"Crimson"}},consciousnessText:function(e){switch(e){case 0:return"Conscious";case 1:return"Unconscious";case 2:return"DEAD"}},progressClass:function(e){return e<=50?"bad":e<=90?"average":"good"},getPressureClass:function(e){switch(e){case 1:return"Crimson";case 2:return"LimeGreen";case 3:return"LawnGreen";case 4:return"Crimson";default:return"LightSkyBlue"}}}},a=s,o=(n("27cd"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"3783600c",null);t["default"]=c.exports},b08f:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.detonating?n("div",{staticClass:"notice",staticStyle:{color:"#000000"}},[n("h2",{staticStyle:{color:"#000000"}},[e._v("CRYSTAL DELAMINATING")]),n("h3",{staticStyle:{color:"#000000"}},[e._v("Evacuate area immediately")]),n("div",{staticClass:"clearBoth"})]):n("vui-group",[n("vui-group-row",[n("h3",[e._v("Crystal Integrity")]),n("vui-progress",{class:e.integrity_class,attrs:{value:e.integrity_percentage,min:0,max:100}}),n("b",[e._v(e._s(e.integrity_percentage)+" %")])],1),n("h3",[e._v("Environment")]),n("vui-group-item",{attrs:{label:"Temperature:"}},[n("vui-progress",{class:e.temp_class,attrs:{value:e.ambient_temp,min:0,max:1e4}}),e._v(" "+e._s(e.ambient_temp)+" K ")],1),n("vui-group-item",{attrs:{label:"Pressure:"}},[e._v(" "+e._s(e.ambient_pressure)+" kPa ")])],1)],1)},r=[],s={data:function(){return this.$root.$data.state},computed:{temp_class:function(){return this.ambient_temp>=5e3?"bad":this.ambient_temp>=4e3?"average":"good"},integrity_class:function(){return this.integrity_percentage>=90?"good":this.integrity_percentage>=25?"average":"bad"}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},b0c0:function(e,t,n){var i=n("83ab"),r=n("9bf2").f,s=Function.prototype,a=s.toString,o=/^\s*function ([^ (]*)/,c="name";i&&!(c in s)&&r(s,c,{configurable:!0,get:function(){try{return a.call(this).match(o)[1]}catch(e){return""}}})},b14c:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h2",{staticClass:"white"},[e._v("Welcome, Operative.")]),n("h2",[e._v("Please select your launch target:")]),0==e.status?n("div",[e._m(0),n("div",[n("vui-button",{attrs:{icon:"cog",params:{fire:"arrivals"}}},[e._v("Departures")])],1),n("div",[n("vui-button",{attrs:{icon:"cog",params:{fire:"cargo"}}},[e._v("Cargo Surface")])],1),n("div",[n("vui-button",{attrs:{icon:"cog",params:{fire:"commandescape"}}},[e._v("Command Surface")])],1)]):n("div",[e._v(" Pod status: "),n("span",{staticClass:"bad"},[e._v("Non-operational.")])])])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._v("Pod status: "),n("span",{staticClass:"good"},[e._v("Operational.")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},b20a:function(e,t,n){var i=n("6ac0"),r=n("4caa"),s=n("ea72"),a="['’]",o=RegExp(a,"g");function c(e){return function(t){return i(s(r(t).replace(o,"")),e,"")}}e.exports=c},b225:function(e,t,n){},b378:function(e,t){ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./lib/event_emitter").EventEmitter,s=e("./lib/lang"),a=e("./range").Range,o=e("./anchor").Anchor,c=e("./keyboard/hash_handler").HashHandler,l=e("./tokenizer").Tokenizer,u=a.comparePoints,d=function(){this.snippetMap={},this.snippetNameMap={}};(function(){i.implement(this,r),this.getTokenizer=function(){function e(e,t,n){return e=e.substr(1),/^\d+$/.test(e)&&!n.inFormatString?[{tabstopId:parseInt(e,10)}]:[{text:e}]}function t(e){return"(?:[^\\\\"+e+"]|\\\\.)"}return d.$tokenizer=new l({start:[{regex:/:/,onMatch:function(e,t,n){return n.length&&n[0].expectIf?(n[0].expectIf=!1,n[0].elseBranch=n[0],[n[0]]):":"}},{regex:/\\./,onMatch:function(e,t,n){var i=e[1];return"}"==i&&n.length||-1!="`$\\".indexOf(i)?e=i:n.inFormatString&&("n"==i||"t"==i?e="\n":-1!="ulULE".indexOf(i)&&(e={changeCase:i,local:i>"a"})),[e]}},{regex:/}/,onMatch:function(e,t,n){return[n.length?n.shift():e]}},{regex:/\$(?:\d+|\w+)/,onMatch:e},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(t,n,i){var r=e(t.substr(1),n,i);return i.unshift(r[0]),r},next:"snippetVar"},{regex:/\n/,token:"newline",merge:!1}],snippetVar:[{regex:"\\|"+t("\\|")+"*\\|",onMatch:function(e,t,n){n[0].choices=e.slice(1,-1).split(",")},next:"start"},{regex:"/("+t("/")+"+)/(?:("+t("/")+"*)/)(\\w*):?",onMatch:function(e,t,n){var i=n[0];return i.fmtString=e,e=this.splitRegex.exec(e),i.guard=e[1],i.fmt=e[2],i.flag=e[3],""},next:"start"},{regex:"`"+t("`")+"*`",onMatch:function(e,t,n){return n[0].code=e.splice(1,-1),""},next:"start"},{regex:"\\?",onMatch:function(e,t,n){n[0]&&(n[0].expectIf=!0)},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+t("/")+"+)/",token:"regex"},{regex:"",onMatch:function(e,t,n){n.inFormatString=!0},next:"start"}]}),d.prototype.getTokenizer=function(){return d.$tokenizer},d.$tokenizer},this.tokenizeTmSnippet=function(e,t){return this.getTokenizer().getLineTokens(e,t).tokens.map((function(e){return e.value||e}))},this.$getDefaultValue=function(e,t){if(/^[A-Z]\d+$/.test(t)){var n=t.substr(1);return(this.variables[t[0]+"__"]||{})[n]}if(/^\d+$/.test(t))return(this.variables.__||{})[t];if(t=t.replace(/^TM_/,""),e){var i=e.session;switch(t){case"CURRENT_WORD":var r=i.getWordRange();case"SELECTION":case"SELECTED_TEXT":return i.getTextRange(r);case"CURRENT_LINE":return i.getLine(e.getCursorPosition().row);case"PREV_LINE":return i.getLine(e.getCursorPosition().row-1);case"LINE_INDEX":return e.getCursorPosition().column;case"LINE_NUMBER":return e.getCursorPosition().row+1;case"SOFT_TABS":return i.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return i.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}}},this.variables={},this.getVariableValue=function(e,t){return this.variables.hasOwnProperty(t)?this.variables[t](e,t)||"":this.$getDefaultValue(e,t)||""},this.tmStrFormat=function(e,t,n){var i=t.flag||"",r=t.guard;r=new RegExp(r,i.replace(/[^gi]/,""));var s=this.tokenizeTmSnippet(t.fmt,"formatString"),a=this,o=e.replace(r,(function(){a.variables.__=arguments;for(var e=a.resolveVariables(s,n),t="E",i=0;i1?(b=t[t.length-1].length,v+=t.length-1):b+=e.length,y+=e}else e.start?e.end={row:v,column:b}:e.start={row:v,column:b}}));var w=e.getSelectionRange(),_=e.session.replace(w,y),x=new h(e),k=e.inVirtualSelectionMode&&e.selection.index;x.addTabstops(o,w.start,_,k)},this.insertSnippet=function(e,t){var n=this;if(e.inVirtualSelectionMode)return n.insertSnippetForSelection(e,t);e.forEachSelection((function(){n.insertSnippetForSelection(e,t)}),null,{keepOrder:!0}),e.tabstopManager&&e.tabstopManager.tabNext()},this.$getScope=function(e){var t=e.session.$mode.$id||"";if(t=t.split("/").pop(),"html"===t||"php"===t){"php"!==t||e.session.$mode.inlinePhp||(t="html");var n=e.getCursorPosition(),i=e.session.getState(n.row);"object"===typeof i&&(i=i[0]),i.substring&&("js-"==i.substring(0,3)?t="javascript":"css-"==i.substring(0,4)?t="css":"php-"==i.substring(0,4)&&(t="php"))}return t},this.getActiveScopes=function(e){var t=this.$getScope(e),n=[t],i=this.snippetMap;return i[t]&&i[t].includeScopes&&n.push.apply(n,i[t].includeScopes),n.push("_"),n},this.expandWithTab=function(e,t){var n=this,i=e.forEachSelection((function(){return n.expandSnippetForSelection(e,t)}),null,{keepOrder:!0});return i&&e.tabstopManager&&e.tabstopManager.tabNext(),i},this.expandSnippetForSelection=function(e,t){var n,i=e.getCursorPosition(),r=e.session.getLine(i.row),s=r.substring(0,i.column),a=r.substr(i.column),o=this.snippetMap;return this.getActiveScopes(e).some((function(e){var t=o[e];return t&&(n=this.findMatchingSnippet(t,s,a)),!!n}),this),!!n&&(t&&t.dryRun||(e.session.doc.removeInLine(i.row,i.column-n.replaceBefore.length,i.column+n.replaceAfter.length),this.variables.M__=n.matchBefore,this.variables.T__=n.matchAfter,this.insertSnippetForSelection(e,n.content),this.variables.M__=this.variables.T__=null),!0)},this.findMatchingSnippet=function(e,t,n){for(var i=e.length;i--;){var r=e[i];if((!r.startRe||r.startRe.test(t))&&((!r.endRe||r.endRe.test(n))&&(r.startRe||r.endRe)))return r.matchBefore=r.startRe?r.startRe.exec(t):[""],r.matchAfter=r.endRe?r.endRe.exec(n):[""],r.replaceBefore=r.triggerRe?r.triggerRe.exec(t)[0]:"",r.replaceAfter=r.endTriggerRe?r.endTriggerRe.exec(n)[0]:"",r}},this.snippetMap={},this.snippetNameMap={},this.register=function(e,t){var n=this.snippetMap,i=this.snippetNameMap,r=this;function a(e){return e&&!/^\^?\(.*\)\$?$|^\\b$/.test(e)&&(e="(?:"+e+")"),e||""}function o(e,t,n){return e=a(e),t=a(t),n?(e=t+e,e&&"$"!=e[e.length-1]&&(e+="$")):(e+=t,e&&"^"!=e[0]&&(e="^"+e)),new RegExp(e)}function c(e){e.scope||(e.scope=t||"_"),t=e.scope,n[t]||(n[t]=[],i[t]={});var a=i[t];if(e.name){var c=a[e.name];c&&r.unregister(c),a[e.name]=e}n[t].push(e),e.tabTrigger&&!e.trigger&&(!e.guard&&/^\w/.test(e.tabTrigger)&&(e.guard="\\b"),e.trigger=s.escapeRegExp(e.tabTrigger)),(e.trigger||e.guard||e.endTrigger||e.endGuard)&&(e.startRe=o(e.trigger,e.guard,!0),e.triggerRe=new RegExp(e.trigger,"",!0),e.endRe=o(e.endTrigger,e.endGuard,!0),e.endTriggerRe=new RegExp(e.endTrigger,"",!0))}e||(e=[]),e&&e.content?c(e):Array.isArray(e)&&e.forEach(c),this._signal("registerSnippets",{scope:t})},this.unregister=function(e,t){var n=this.snippetMap,i=this.snippetNameMap;function r(e){var r=i[e.scope||t];if(r&&r[e.name]){delete r[e.name];var s=n[e.scope||t],a=s&&s.indexOf(e);a>=0&&s.splice(a,1)}}e.content?r(e):Array.isArray(e)&&e.forEach(r)},this.parseSnippetFile=function(e){e=e.replace(/\r/g,"");var t,n=[],i={},r=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;while(t=r.exec(e)){if(t[1])try{i=JSON.parse(t[1]),n.push(i)}catch(c){}if(t[4])i.content=t[4].replace(/^\t/gm,""),n.push(i),i={};else{var s=t[2],a=t[3];if("regex"==s){var o=/\/((?:[^\/\\]|\\.)*)|$/g;i.guard=o.exec(a)[1],i.trigger=o.exec(a)[1],i.endTrigger=o.exec(a)[1],i.endGuard=o.exec(a)[1]}else"snippet"==s?(i.tabTrigger=a.match(/^\S*/)[0],i.name||(i.name=a)):i[s]=a}}return n},this.getSnippetByName=function(e,t){var n,i=this.snippetNameMap;return this.getActiveScopes(t).some((function(t){var r=i[t];return r&&(n=r[e]),!!n}),this),n}}).call(d.prototype);var h=function(e){if(e.tabstopManager)return e.tabstopManager;e.tabstopManager=this,this.$onChange=this.onChange.bind(this),this.$onChangeSelection=s.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(e)};(function(){this.attach=function(e){this.index=0,this.ranges=[],this.tabstops=[],this.$openTabstops=null,this.selectedTabstop=null,this.editor=e,this.editor.on("change",this.$onChange),this.editor.on("changeSelection",this.$onChangeSelection),this.editor.on("changeSession",this.$onChangeSession),this.editor.commands.on("afterExec",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges=null,this.tabstops=null,this.selectedTabstop=null,this.editor.removeListener("change",this.$onChange),this.editor.removeListener("changeSelection",this.$onChangeSelection),this.editor.removeListener("changeSession",this.$onChangeSession),this.editor.commands.removeListener("afterExec",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.editor=null},this.onChange=function(e){var t="r"==e.action[0],n=e.start,i=e.end,r=n.row,s=i.row,a=s-r,o=i.column-n.column;if(t&&(a=-a,o=-o),!this.$inChange&&t){var c=this.selectedTabstop,l=c&&!c.some((function(e){return u(e.start,n)<=0&&u(e.end,i)>=0}));if(l)return this.detach()}for(var d=this.ranges,h=0;h0?(this.removeRange(f),h--):(f.start.row==r&&f.start.column>n.column&&(f.start.column+=o),f.end.row==r&&f.end.column>=n.column&&(f.end.column+=o),f.start.row>=r&&(f.start.row+=a),f.end.row>=r&&(f.end.row+=a),u(f.start,f.end)>0&&this.removeRange(f)))}d.length||this.detach()},this.updateLinkedFields=function(){var e=this.selectedTabstop;if(e&&e.hasLinkedRanges){this.$inChange=!0;for(var n=this.editor.session,i=n.getTextRange(e.firstNonLinked),r=e.length;r--;){var s=e[r];if(s.linked){var a=t.snippetManager.tmStrFormat(i,s.original);n.replace(s,a)}}this.$inChange=!1}},this.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},this.onChangeSelection=function(){if(this.editor){for(var e=this.editor.selection.lead,t=this.editor.selection.anchor,n=this.editor.selection.isEmpty(),i=this.ranges.length;i--;)if(!this.ranges[i].linked){var r=this.ranges[i].contains(e.row,e.column),s=n||this.ranges[i].contains(t.row,t.column);if(r&&s)return}this.detach()}},this.onChangeSession=function(){this.detach()},this.tabNext=function(e){var t=this.tabstops.length,n=this.index+(e||1);n=Math.min(Math.max(n,1),t),n==t&&(n=0),this.selectTabstop(n),0===n&&this.detach()},this.selectTabstop=function(e){this.$openTabstops=null;var t=this.tabstops[this.index];if(t&&this.addTabstopMarkers(t),this.index=e,t=this.tabstops[this.index],t&&t.length){if(this.selectedTabstop=t,this.editor.inVirtualSelectionMode)this.editor.selection.setRange(t.firstNonLinked);else{var n=this.editor.multiSelect;n.toSingleRange(t.firstNonLinked.clone());for(var i=t.length;i--;)t.hasLinkedRanges&&t[i].linked||n.addRange(t[i].clone(),!0);n.ranges[0]&&n.addRange(n.ranges[0].clone())}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)}},this.addTabstops=function(e,t,n){if(this.$openTabstops||(this.$openTabstops=[]),!e[0]){var i=a.fromPoints(n,n);g(i.start,t),g(i.end,t),e[0]=[i],e[0].index=0}var r=this.index,s=[r+1,0],o=this.ranges;e.forEach((function(e,n){for(var i=this.$openTabstops[n]||e,r=e.length;r--;){var c=e[r],l=a.fromPoints(c.start,c.end||c.start);p(l.start,t),p(l.end,t),l.original=c,l.tabstop=i,o.push(l),i!=e?i.unshift(l):i[r]=l,c.fmtString?(l.linked=!0,i.hasLinkedRanges=!0):i.firstNonLinked||(i.firstNonLinked=l)}i.firstNonLinked||(i.hasLinkedRanges=!1),i===e&&(s.push(i),this.$openTabstops[n]=i),this.addTabstopMarkers(i)}),this),s.length>2&&(this.tabstops.length&&s.push(s.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,s))},this.addTabstopMarkers=function(e){var t=this.editor.session;e.forEach((function(e){e.markerId||(e.markerId=t.addMarker(e,"ace_snippet-marker","text"))}))},this.removeTabstopMarkers=function(e){var t=this.editor.session;e.forEach((function(e){t.removeMarker(e.markerId),e.markerId=null}))},this.removeRange=function(e){var t=e.tabstop.indexOf(e);e.tabstop.splice(t,1),t=this.ranges.indexOf(e),this.ranges.splice(t,1),this.editor.session.removeMarker(e.markerId),e.tabstop.length||(t=this.tabstops.indexOf(e.tabstop),-1!=t&&this.tabstops.splice(t,1),this.tabstops.length||this.detach())},this.keyboardHandler=new c,this.keyboardHandler.bindKeys({Tab:function(e){t.snippetManager&&t.snippetManager.expandWithTab(e)||e.tabstopManager.tabNext(1)},"Shift-Tab":function(e){e.tabstopManager.tabNext(-1)},Esc:function(e){e.tabstopManager.detach()},Return:function(e){return!1}})}).call(h.prototype);var f={};f.onChange=o.prototype.onChange,f.setPosition=function(e,t){this.pos.row=e,this.pos.column=t},f.update=function(e,t,n){this.$insertRight=n,this.pos=e,this.onChange(t)};var p=function(e,t){0==e.row&&(e.column+=t.column),e.row+=t.row},g=function(e,t){e.row==t.row&&(e.column-=t.column),e.row-=t.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}"),t.snippetManager=new d;var m=e("./editor").Editor;(function(){this.insertSnippet=function(e,n){return t.snippetManager.insertSnippet(this,e,n)},this.expandSnippet=function(e){return t.snippetManager.expandWithTab(this,e)}}).call(m.prototype)})),ace.define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","resources","resources","tabStops","resources","utils","actions","ace/config","ace/config"],(function(e,t,n){"use strict";var i,r,s=e("ace/keyboard/hash_handler").HashHandler,a=e("ace/editor").Editor,o=e("ace/snippets").snippetManager,c=e("ace/range").Range;function l(){}l.prototype={setupContext:function(e){this.ace=e,this.indentation=e.session.getTabString(),i||(i=window.emmet);var t=i.resources||i.require("resources");t.setVariable("indentation",this.indentation),this.$syntax=null,this.$syntax=this.getSyntax()},getSelectionRange:function(){var e=this.ace.getSelectionRange(),t=this.ace.session.doc;return{start:t.positionToIndex(e.start),end:t.positionToIndex(e.end)}},createSelection:function(e,t){var n=this.ace.session.doc;this.ace.selection.setRange({start:n.indexToPosition(e),end:n.indexToPosition(t)})},getCurrentLineRange:function(){var e=this.ace,t=e.getCursorPosition().row,n=e.session.getLine(t).length,i=e.session.doc.positionToIndex({row:t,column:0});return{start:i,end:i+n}},getCaretPos:function(){var e=this.ace.getCursorPosition();return this.ace.session.doc.positionToIndex(e)},setCaretPos:function(e){var t=this.ace.session.doc.indexToPosition(e);this.ace.selection.moveToPosition(t)},getCurrentLine:function(){var e=this.ace.getCursorPosition().row;return this.ace.session.getLine(e)},replaceContent:function(e,t,n,i){null==n&&(n=null==t?this.getContent().length:t),null==t&&(t=0);var r=this.ace,s=r.session.doc,a=c.fromPoints(s.indexToPosition(t),s.indexToPosition(n));r.session.remove(a),a.end=a.start,e=this.$updateTabstops(e),o.insertSnippet(r,e)},getContent:function(){return this.ace.getValue()},getSyntax:function(){if(this.$syntax)return this.$syntax;var e=this.ace.session.$modeId.split("/").pop();if("html"==e||"php"==e){var t=this.ace.getCursorPosition(),n=this.ace.session.getState(t.row);"string"!=typeof n&&(n=n[0]),n&&(n=n.split("-"),n.length>1?e=n[0]:"php"==e&&(e="html"))}return e},getProfileName:function(){var e=i.resources||i.require("resources");switch(this.getSyntax()){case"css":return"css";case"xml":case"xsl":return"xml";case"html":var t=e.getVariable("profile");return t||(t=-1!=this.ace.session.getLines(0,2).join("").search(/]+XHTML/i)?"xhtml":"html"),t;default:var n=this.ace.session.$mode;return n.emmetConfig&&n.emmetConfig.profile||"xhtml"}},prompt:function(e){return prompt(e)},getSelection:function(){return this.ace.session.getTextRange()},getFilePath:function(){return""},$updateTabstops:function(e){var t=1e3,n=0,r=null,s=i.tabStops||i.require("tabStops"),a=i.resources||i.require("resources"),o=a.getVocabulary("user"),c={tabstop:function(e){var i=parseInt(e.group,10),a=0===i;a?i=++n:i+=t;var o=e.placeholder;o&&(o=s.processText(o,c));var l="${"+i+(o?":"+o:"")+"}";return a&&(r=[e.start,l]),l},escape:function(e){return"$"==e?"\\$":"\\"==e?"\\\\":e}};if(e=s.processText(e,c),o.variables["insert_final_tabstop"]&&!/\$\{0\}$/.test(e))e+="${0}";else if(r){var l=i.utils?i.utils.common:i.require("utils");e=l.replaceSubstring(e,"${0}",r[0],r[1])}return e}};var u={expand_abbreviation:{mac:"ctrl+alt+e",win:"alt+e"},match_pair_outward:{mac:"ctrl+d",win:"ctrl+,"},match_pair_inward:{mac:"ctrl+j",win:"ctrl+shift+0"},matching_pair:{mac:"ctrl+alt+j",win:"alt+j"},next_edit_point:"alt+right",prev_edit_point:"alt+left",toggle_comment:{mac:"command+/",win:"ctrl+/"},split_join_tag:{mac:"shift+command+'",win:"shift+ctrl+`"},remove_tag:{mac:"command+'",win:"shift+ctrl+;"},evaluate_math_expression:{mac:"shift+command+y",win:"shift+ctrl+y"},increment_number_by_1:"ctrl+up",decrement_number_by_1:"ctrl+down",increment_number_by_01:"alt+up",decrement_number_by_01:"alt+down",increment_number_by_10:{mac:"alt+command+up",win:"shift+alt+up"},decrement_number_by_10:{mac:"alt+command+down",win:"shift+alt+down"},select_next_item:{mac:"shift+command+.",win:"shift+ctrl+."},select_previous_item:{mac:"shift+command+,",win:"shift+ctrl+,"},reflect_css_value:{mac:"shift+command+r",win:"shift+ctrl+r"},encode_decode_data_url:{mac:"shift+ctrl+d",win:"ctrl+'"},expand_abbreviation_with_tab:"Tab",wrap_with_abbreviation:{mac:"shift+ctrl+a",win:"shift+ctrl+a"}},d=new l;for(var h in t.commands=new s,t.runEmmetCommand=function e(t){try{d.setupContext(t);var n=i.actions||i.require("actions");if("expand_abbreviation_with_tab"==this.action){if(!t.selection.isEmpty())return!1;var r=t.selection.lead,s=t.session.getTokenAt(r.row,r.column);if(s&&/\btag\b/.test(s.type))return!1}if("wrap_with_abbreviation"==this.action)return setTimeout((function(){n.run("wrap_with_abbreviation",d)}),0);var a=n.run(this.action,d)}catch(o){if(!i)return p(e.bind(this,t)),!0;t._signal("changeStatus","string"==typeof o?o:o.message),console.log(o),a=!1}return a},u)t.commands.addCommand({name:"emmet:"+h,action:h,bindKey:u[h],exec:t.runEmmetCommand,multiSelectAction:"forEach"});t.updateCommands=function(e,n){n?e.keyBinding.addKeyboardHandler(t.commands):e.keyBinding.removeKeyboardHandler(t.commands)},t.isSupportedMode=function(e){if(!e)return!1;if(e.emmetConfig)return!0;var t=e.$id||e;return/css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(t)},t.isAvailable=function(e,n){if(/(evaluate_math_expression|expand_abbreviation)$/.test(n))return!0;var i=e.session.$mode,r=t.isSupportedMode(i);if(r&&i.$modes)try{d.setupContext(e),/js|php/.test(d.getSyntax())&&(r=!1)}catch(s){}return r};var f=function(e,n){var i=n;if(i){var r=t.isSupportedMode(i.session.$mode);!1===e.enableEmmet&&(r=!1),r&&p(),t.updateCommands(i,r)}},p=function(t){"string"==typeof r&&e("ace/config").loadModule(r,(function(){r=null,t&&t()}))};t.AceEmmetEditor=l,e("ace/config").defineOptions(a.prototype,"editor",{enableEmmet:{set:function(e){this[e?"on":"removeListener"]("changeMode",f),f({enableEmmet:!!e},this)},value:!0}}),t.setCore=function(e){"string"==typeof e?r=e:i=e}})),function(){ace.acequire(["ace/ext/emmet"],(function(){}))}()},b39a:function(e,t,n){"use strict";var i=n("da84"),r=n("ebb5"),s=n("d039"),a=i.Int8Array,o=r.aTypedArray,c=r.exportTypedArrayMethod,l=[].toLocaleString,u=[].slice,d=!!a&&s((function(){l.call(new a(1))})),h=s((function(){return[1,2].toLocaleString()!=new a([1,2]).toLocaleString()}))||!s((function(){a.prototype.toLocaleString.call([1,2])}));c("toLocaleString",(function(){return l.apply(d?u.call(o(this)):o(this),arguments)}),h)},b3da:function(e,t,n){"use strict";n("5ae5")},b420:function(e,t,n){var i=n("23e7"),r=n("621a"),s=n("a981");i({global:!0,forced:!s},{DataView:r.DataView})},b56e:function(e,t,n){"use strict";var i=n("861d"),r=n("9bf2"),s=n("e163"),a=n("b622"),o=a("hasInstance"),c=Function.prototype;o in c||r.f(c,o,{value:function(e){if("function"!=typeof this||!i(e))return!1;if(!i(this.prototype))return e instanceof this;while(e=s(e))if(this.prototype===e)return!0;return!1}})},b575:function(e,t,n){var i,r,s,a,o,c,l,u,d=n("da84"),h=n("06cf").f,f=n("2cf4").set,p=n("1cdc"),g=n("605d"),m=d.MutationObserver||d.WebKitMutationObserver,v=d.document,b=d.process,y=d.Promise,w=h(d,"queueMicrotask"),_=w&&w.value;_||(i=function(){var e,t;g&&(e=b.domain)&&e.exit();while(r){t=r.fn,r=r.next;try{t()}catch(n){throw r?a():s=void 0,n}}s=void 0,e&&e.enter()},!p&&!g&&m&&v?(o=!0,c=v.createTextNode(""),new m(i).observe(c,{characterData:!0}),a=function(){c.data=o=!o}):y&&y.resolve?(l=y.resolve(void 0),u=l.then,a=function(){u.call(l,i)}):a=g?function(){b.nextTick(i)}:function(){f.call(d,i)}),e.exports=_||function(e){var t={fn:e,next:void 0};s&&(s.next=t),r||(r=t,a()),s=t}},b593:function(e,t,n){"use strict";n("44b8")},b622:function(e,t,n){var i=n("da84"),r=n("5692"),s=n("5135"),a=n("90e3"),o=n("4930"),c=n("fdbf"),l=r("wks"),u=i.Symbol,d=c?u:u&&u.withoutSetter||a;e.exports=function(e){return s(l,e)||(o&&s(u,e)?l[e]=u[e]:l[e]=d("Symbol."+e)),l[e]}},b636:function(e,t,n){var i=n("746f");i("asyncIterator")},b64b:function(e,t,n){var i=n("23e7"),r=n("7b0b"),s=n("df75"),a=n("d039"),o=a((function(){s(1)}));i({target:"Object",stat:!0,forced:o},{keys:function(e){return s(r(e))}})},b65f:function(e,t,n){var i=n("23e7"),r=Math.ceil,s=Math.floor;i({target:"Math",stat:!0},{trunc:function(e){return(e>0?s:r)(e)}})},b680:function(e,t,n){"use strict";var i=n("23e7"),r=n("a691"),s=n("408a"),a=n("1148"),o=n("d039"),c=1..toFixed,l=Math.floor,u=function(e,t,n){return 0===t?n:t%2===1?u(e,t-1,n*e):u(e*e,t/2,n)},d=function(e){var t=0,n=e;while(n>=4096)t+=12,n/=4096;while(n>=2)t+=1,n/=2;return t},h=c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!o((function(){c.call({})}));i({target:"Number",proto:!0,forced:h},{toFixed:function(e){var t,n,i,o,c=s(this),h=r(e),f=[0,0,0,0,0,0],p="",g="0",m=function(e,t){var n=-1,i=t;while(++n<6)i+=e*f[n],f[n]=i%1e7,i=l(i/1e7)},v=function(e){var t=6,n=0;while(--t>=0)n+=f[t],f[t]=l(n/e),n=n%e*1e7},b=function(){var e=6,t="";while(--e>=0)if(""!==t||0===e||0!==f[e]){var n=String(f[e]);t=""===t?n:t+a.call("0",7-n.length)+n}return t};if(h<0||h>20)throw RangeError("Incorrect fraction digits");if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(p="-",c=-c),c>1e-21)if(t=d(c*u(2,69,1))-69,n=t<0?c*u(2,-t,1):c/u(2,t,1),n*=4503599627370496,t=52-t,t>0){m(0,n),i=h;while(i>=7)m(1e7,0),i-=7;m(u(10,i,1),0),i=t-1;while(i>=23)v(1<<23),i-=23;v(1<0?(o=g.length,g=p+(o<=h?"0."+a.call("0",h-o)+g:g.slice(0,o-h)+"."+g.slice(o-h))):g=p+g,g}})},b6db:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.active?n("view-records-general",{attrs:{"hide-advanced":""}},[n("vui-group-item",{attrs:{label:"Criminal Status:"}},[n("view-records-field",{attrs:{editable:(4&e.editable)>0,path:"active.security.criminal"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.$root.$data.state,"editingvalue",t.target.multiple?n:n[0])}}},e._l(e.choices.criminal_status,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)])],1),n("vui-group-item",{attrs:{label:"Crimes:"}},[n("view-records-field",{attrs:{editable:(4&e.editable)>0,path:"active.security.crimes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Comments:"}},[e._l(e.active.security.comments,(function(t){return n("div",{key:t},[e._v(e._s(t)+" "),(4&e.editable)>0?n("vui-button",{staticClass:"danger",attrs:{params:{removefromrecord:{value:t,key:["active","security","comments"]}},icon:"trash-alt"}}):e._e()],1)})),0==e.active.security.comments.length?n("div",[e._v("There are no comments.")]):e._e(),(4&e.editable)>0?n("view-records-field",{attrs:{"edit-button":"Add"},on:{save:function(t){return e.add("active.security.comments",t)}}}):e._e()],2),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(4&e.editable)>0,path:"active.security.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Incidents:"}},[e._l(e.active.security.incidents,(function(t,i){return n("div",{key:i,staticClass:"incidents"},[n("view-records-incident",{attrs:{incident:t}}),i+1k;k++)if((h||k in w)&&(v=w[k],b=_(v,k,y),e))if(t)C[k]=b;else if(b)switch(e){case 3:return!0;case 5:return v;case 6:return k;case 2:c.call(C,v)}else if(u)return!1;return d?-1:l||u?u:C}};e.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6)}},b81a:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("h3",[e._v("Timing Unit:")]),e.timeractive?n("vui-button",{attrs:{params:{time:1}}},[e._v("Active")]):n("vui-button",{attrs:{params:{time:1}}},[e._v("Inactive")])],1),n("div",[n("h3",[e._v("Time Left:")]),n("vui-button",{attrs:{params:{tp:-30}}},[e._v("--")]),n("vui-button",{attrs:{params:{tp:-1}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.minute)+":"+e._s(e.second))]),n("vui-button",{attrs:{params:{tp:1}}},[e._v("+")]),n("vui-button",{attrs:{params:{tp:30}}},[e._v("++")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("5ddf"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"b7af1e1c",null);t["default"]=c.exports},b884:function(e,t,n){},b8bf:function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("7c73");i({target:"Object",stat:!0,sham:!r},{create:s})},b959:function(e,t,n){},baa5:function(e,t,n){var i=n("23e7"),r=n("e58c");i({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},bb2f:function(e,t,n){var i=n("d039");e.exports=!i((function(){return Object.isExtensible(Object.preventExtensions({}))}))},bb36:function(e,t,n){ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};i.inherits(s,r),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s})),ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,a="[a-zA-Z\\$_¡-￿][a-zA-Z\\d\\$_¡-￿]*",o=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",i="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[r.getStartRule("doc-start"),l("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+a+")(\\.)(prototype)(\\.)("+a+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+a+")(\\.)("+a+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+a+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+a+")(\\.)("+a+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+a+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+a+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"from(?=\\s*('|\"))"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:a},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"storage.type",regex:/=>/},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+a+")(\\.)("+a+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:a},{regex:"",token:"empty",next:"no_regex"}],start:[r.getStartRule("doc-start"),l("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:a},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:i},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:i},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]},e&&e.noES6||(this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){if(this.next="{"==e?this.nextState:"","{"==e&&n.length)n.unshift("start",t);else if("}"==e&&n.length&&(n.shift(),this.next=n.shift(),-1!=this.next.indexOf("string")||-1!=this.next.indexOf("jsx")))return"paren.quasi.end";return"{"==e?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:i},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),e&&0==e.jsx||c.call(this)),this.embedRules(r,"doc-",[r.getEndRule("no_regex")]),this.normalizeRules()};function c(){var e=a.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var i="/"==e.charAt(1)?2:1;return 1==i?(t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++):2==i&&t==this.nextState&&(n[1]--,(!n[1]||n[1]<0)&&(n.shift(),n.shift())),[{type:"meta.tag.punctuation."+(1==i?"":"end-")+"tag-open.xml",value:e.slice(0,i)},{type:"meta.tag.tag-name.xml",value:e.substr(i)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),2==e.length&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,l("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function l(e){return[{token:"comment",regex:/\/\*/,next:[r.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[r.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}i.inherits(o,s),t.JavaScriptHighlightRules=o})),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],(function(e,t,n){"use strict";var i=e("../range").Range,r=function(){};(function(){this.checkOutdent=function(e,t){return!!/^\s+$/.test(e)&&/^\s*\}/.test(t)},this.autoOutdent=function(e,t){var n=e.getLine(t),r=n.match(/^(\s*\})/);if(!r)return 0;var s=r[1].length,a=e.findMatchingBracket({row:t,column:s});if(!a||a.row==t)return 0;var o=this.$getIndent(e.getLine(a.row));e.replace(new i(t,0,t,s-1),o)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(r.prototype),t.MatchingBraceOutdent=r})),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],(function(e,t,n){"use strict";var i=e("../../lib/oop"),r=e("../../range").Range,s=e("./fold_mode").FoldMode,a=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};i.inherits(a,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var i=e.getLine(n);if(this.singleLineBlockCommentRe.test(i)&&!this.startRegionRe.test(i)&&!this.tripleStarBlockCommentRe.test(i))return"";var r=this._getFoldWidgetBase(e,t,n);return!r&&this.startRegionRe.test(i)?"start":r},this.getFoldWidgetRange=function(e,t,n,i){var r=e.getLine(n);if(this.startRegionRe.test(r))return this.getCommentRegionBlock(e,r,n);var s=r.match(this.foldingStartMarker);if(s){var a=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,a);var o=e.getCommentFoldRange(n,a+s[0].length,1);return o&&!o.isMultiLine()&&(i?o=this.getSectionRange(e,n):"all"!=t&&(o=null)),o}if("markbegin"!==t){s=r.match(this.foldingStopMarker);if(s){a=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,a):e.getCommentFoldRange(n,a,-1)}}},this.getSectionRange=function(e,t){var n=e.getLine(t),i=n.search(/\S/),s=t,a=n.length;t+=1;var o=t,c=e.getLength();while(++tl)break;var u=this.getFoldWidgetRange(e,"all",t);if(u){if(u.start.row<=s)break;if(u.isMultiLine())t=u.end.row;else if(i==l)break}o=t}}return new r(s,a,o,e.getLine(o).length)},this.getCommentRegionBlock=function(e,t,n){var i=t.search(/\s*$/),s=e.getLength(),a=n,o=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,c=1;while(++na)return new r(a,i,u,t.length)}}.call(a.prototype)})),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],(function(e,t,i){"use strict";var r=e("../lib/oop"),s=e("./text").Mode,a=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,c=e("../worker/worker_client").WorkerClient,l=e("./behaviour/cstyle").CstyleBehaviour,u=e("./folding/cstyle").FoldMode,d=function(){this.HighlightRules=a,this.$outdent=new o,this.$behaviour=new l,this.foldingRules=new u};r.inherits(d,s),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.$quotes={'"':'"',"'":"'","`":"`"},this.getNextLineIndent=function(e,t,n){var i=this.$getIndent(t),r=this.getTokenizer().getLineTokens(t,e),s=r.tokens,a=r.state;if(s.length&&"comment"==s[s.length-1].type)return i;if("start"==e||"no_regex"==e){var o=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);o&&(i+=n)}else if("doc-start"==e){if("start"==a||"no_regex"==a)return"";o=t.match(/^\s*(\/?)\*/);o&&(o[1]&&(i+=" "),i+="* ")}return i},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new c(["ace"],n("6d68"),"JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",(function(t){e.setAnnotations(t.data)})),t.on("terminate",(function(){e.clearAnnotations()})),t},this.$id="ace/mode/javascript"}.call(d.prototype),t.Mode=d}))},bb3d:function(e,t,n){},bba4:function(e,t,n){var i=n("e9a7"),r=n("b20a"),s=r((function(e,t,n){return t=t.toLowerCase(),e+(n?i(t):t)}));e.exports=s},bc01:function(e,t,n){var i=n("23e7"),r=n("d039"),s=Math.imul,a=r((function(){return-5!=s(4294967295,5)||2!=s.length}));i({target:"Math",stat:!0,forced:a},{imul:function(e,t){var n=65535,i=+e,r=+t,s=n&i,a=n&r;return 0|s*a+((n&i>>>16)*a+s*(n&r>>>16)<<16>>>0)}})},be8e:function(e,t,n){var i=n("f748"),r=Math.abs,s=Math.pow,a=s(2,-52),o=s(2,-23),c=s(2,127)*(2-o),l=s(2,-126),u=function(e){return e+1/a-1/a};e.exports=Math.fround||function(e){var t,n,s=r(e),d=i(e);return sc||n!=n?d*(1/0):d*n)}},bf19:function(e,t,n){"use strict";var i=n("23e7");i({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},bf96:function(e,t,n){"use strict";var i=n("23e7"),r=n("83ab"),s=n("eb1d"),a=n("7b0b"),o=n("c04e"),c=n("e163"),l=n("06cf").f;r&&i({target:"Object",proto:!0,forced:s},{__lookupGetter__:function(e){var t,n=a(this),i=o(e,!0);do{if(t=l(n,i))return t.get}while(n=c(n))}})},bfa1:function(e,t,n){},c04e:function(e,t,n){var i=n("861d");e.exports=function(e,t){if(!i(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!i(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},c0b6:function(e,t,n){var i=n("23e7"),r=n("0538");i({target:"Function",proto:!0},{bind:r})},c0d6:function(e,t,n){"use strict";n("4160"),n("b64b"),n("159b");t["a"]={debug:!1,state:{assets:[],state:{},active:"",uiref:"",status:2,size:[400,600],debug:0,debug_view:!1,wtime:0,roundstart_hour:0},loadState:function(e){var t=this;this.isUpdating=!0,this.lastUpdateTime=Date.now(),this.debug&&console.log("Loaded state with",e),this.state.assets=e.assets,Object.keys(e.state).forEach((function(n){t.state.state[n]=e.state[n]})),this.state.active=e.active,this.state.uiref=e.uiref,this.state.status=e.status,this.state.size=e.size,this.state.title=e.title,this.state.wtime=e.wtime,this.state.debug=e.debug,this.state.roundstart_hour=e.roundstart_hour,this.isUpdating=!1},isUpdating:!1,lastUpdateTime:null,getStatePushString:function(){return"vueuistateupdate="+encodeURIComponent(this.getStatePushDataString())},getStatePushDataString:function(){return JSON.stringify(this.state)},pushState:function(){if(!(this.isUpdating||Date.now()-this.lastUpdateTime<100)){var e=new XMLHttpRequest;e.open("GET","?src="+this.state.uiref+"&vueuipushonly=1&"+this.getStatePushString(),!0),e.send()}}}},c0f7:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-input-search",{attrs:{input:e.records,keys:["id","name","rank"]},model:{value:e.filtered,callback:function(t){e.filtered=t},expression:"filtered"}}),e._l(e.filtered,(function(t){return n("div",{key:t.id},[n("vui-button",{attrs:{params:{setactive_locked:t.id},"push-state":""},on:{click:function(t){e.activeview=e.defaultview}}},[e._v(e._s(t.id)+": "+e._s(t.name))])],1)}))],2)},r=[],s=(n("07ac"),{data:function(){return{state:this.$root.$data.state,filtered:[]}},computed:{records:function(){return Object.values(this.state.allrecords_locked)}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},c13e:function(e,t,n){"use strict";n("1d73")},c19f:function(e,t,n){"use strict";var i=n("23e7"),r=n("da84"),s=n("621a"),a=n("2626"),o="ArrayBuffer",c=s[o],l=r[o];i({global:!0,forced:l!==c},{ArrayBuffer:c}),a(o)},c1ac:function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").filter,s=n("4840"),a=i.aTypedArray,o=i.aTypedArrayConstructor,c=i.exportTypedArrayMethod;c("filter",(function(e){var t=r(a(this),e,arguments.length>1?arguments[1]:void 0),n=s(this,this.constructor),i=0,c=t.length,l=new(o(n))(c);while(c>i)l[i]=t[i++];return l}))},c1f9:function(e,t,n){var i=n("23e7"),r=n("2266"),s=n("8418");i({target:"Object",stat:!0},{fromEntries:function(e){var t={};return r(e,(function(e,n){s(t,e,n)}),{AS_ENTRIES:!0}),t}})},c200:function(e,t,n){"use strict";n("05b6")},c20d:function(e,t,n){var i=n("da84"),r=n("58a8").trim,s=n("5899"),a=i.parseInt,o=/^[+-]?0[Xx]/,c=8!==a(s+"08")||22!==a(s+"0x16");e.exports=c?function(e,t){var n=r(String(e));return a(n,t>>>0||(o.test(n)?16:10))}:a},c2e3:function(e,t,n){"use strict";n("7938")},c32f:function(e,t,n){var i=n("2b10");function r(e,t,n){var r=e.length;return n=void 0===n?r:n,!t&&n>=r?e:i(e,t,n)}e.exports=r},c35a:function(e,t,n){var i=n("23e7"),r=n("7e12");i({target:"Number",stat:!0,forced:Number.parseFloat!=r},{parseFloat:r})},c430:function(e,t){e.exports=!1},c5d0:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("italics")},{italics:function(){return r(this,"i","","")}})},c6b6:function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},c6c8:function(e,t,n){},c6cd:function(e,t,n){var i=n("da84"),r=n("ce4e"),s="__core-js_shared__",a=i[s]||r(s,{});e.exports=a},c740:function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").findIndex,s=n("44d2"),a=n("ae40"),o="findIndex",c=!0,l=a(o);o in[]&&Array(1)[o]((function(){c=!1})),i({target:"Array",proto:!0,forced:c||!l},{findIndex:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),s(o)},c760:function(e,t,n){var i=n("23e7");i({target:"Reflect",stat:!0},{has:function(e,t){return t in e}})},c781:function(e,t,n){},c7cd:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("fixed")},{fixed:function(){return r(this,"tt","","")}})},c7e2:function(e,t,n){"use strict";n("c7f0")},c7ef:function(e,t,n){"use strict";n("4cb7")},c7f0:function(e,t,n){},c8ba:function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(i){"object"===typeof window&&(n=window)}e.exports=n},c8d2:function(e,t,n){var i=n("d039"),r=n("5899"),s="​…᠎";e.exports=function(e){return i((function(){return!!r[e]()||s[e]()!=s||r[e].name!==e}))}},c906:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("861d"),a=Object.isExtensible,o=r((function(){a(1)}));i({target:"Object",stat:!0,forced:o},{isExtensible:function(e){return!!s(e)&&(!a||a(e))}})},c96a:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("small")},{small:function(){return r(this,"small","","")}})},c975:function(e,t,n){"use strict";var i=n("23e7"),r=n("4d64").indexOf,s=n("a640"),a=n("ae40"),o=[].indexOf,c=!!o&&1/[1].indexOf(1,-0)<0,l=s("indexOf"),u=a("indexOf",{ACCESSORS:!0,1:0});i({target:"Array",proto:!0,forced:c||!l||!u},{indexOf:function(e){return c?o.apply(this,arguments)||0:r(this,e,arguments.length>1?arguments[1]:void 0)}})},ca21:function(e,t,n){var i=n("23e7"),r=n("1ec1");i({target:"Math",stat:!0},{log1p:r})},ca84:function(e,t,n){var i=n("5135"),r=n("fc6a"),s=n("4d64").indexOf,a=n("d012");e.exports=function(e,t){var n,o=r(e),c=0,l=[];for(n in o)!i(a,n)&&i(o,n)&&l.push(n);while(t.length>c)i(o,n=t[c++])&&(~s(l,n)||l.push(n));return l}},ca91:function(e,t,n){"use strict";var i=n("ebb5"),r=n("d58f").left,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("reduce",(function(e){return r(s(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)}))},caad:function(e,t,n){"use strict";var i=n("23e7"),r=n("4d64").includes,s=n("44d2"),a=n("ae40"),o=a("indexOf",{ACCESSORS:!0,1:0});i({target:"Array",proto:!0,forced:!o},{includes:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),s("includes")},cb10:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Detected Firearms")]),n("table",{staticClass:"table border"},[e._m(0),e._l(e.sorted_pins,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.registered_info))]),n("td",[e._v(e._s(t.gun_name))]),n("td",[n("vui-button",{class:{button:1,selected:1==t.lock_status},attrs:{params:{pin:t.ref,action:"setdisable"}}},[e._v("Disabled")]),n("vui-button",{class:{button:1,selected:2==t.lock_status},attrs:{params:{pin:t.ref,action:"setauto"}}},[e._v("Automatic")]),n("vui-button",{class:{button:1,selected:3==t.lock_status},attrs:{params:{pin:t.ref,action:"setstun"}}},[e._v("Stun Only")]),n("vui-button",{class:{button:1,selected:4==t.lock_status},attrs:{params:{pin:t.ref,action:"setlethal"}}},[e._v("Unrestricted")])],1)])}))],2)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("User")]),n("th",[e._v("Firearm")]),n("th",[e._v("Settings")])])}],s=(n("fb6a"),{data:function(){return this.$root.$data.state},computed:{sorted_pins:function(){return this.wireless_firing_pins.slice(0).sort((function(e,t){return e.registered_info>t.registered_info?1:-1}))}}}),a=s,o=(n("c7e2"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"570930e6",null);t["default"]=c.exports},cb29:function(e,t,n){var i=n("23e7"),r=n("81d5"),s=n("44d2");i({target:"Array",proto:!0},{fill:r}),s("fill")},cbf4:function(e,t,n){"use strict";n("e210")},cc12:function(e,t,n){var i=n("da84"),r=n("861d"),s=i.document,a=r(s)&&r(s.createElement);e.exports=function(e){return a?s.createElement(e):{}}},cc71:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("bold")},{bold:function(){return r(this,"b","","")}})},cca6:function(e,t,n){var i=n("23e7"),r=n("60da");i({target:"Object",stat:!0,forced:Object.assign!==r},{assign:r})},cd26:function(e,t,n){"use strict";var i=n("ebb5"),r=i.aTypedArray,s=i.exportTypedArrayMethod,a=Math.floor;s("reverse",(function(){var e,t=this,n=r(t).length,i=a(n/2),s=0;while(s1?arguments[1]:void 0)}))},d194:function(e,t,n){var i=n("c32f"),r=n("aaec"),s=n("126d"),a=n("76dd");function o(e){return function(t){t=a(t);var n=r(t)?s(t):void 0,o=n?n[0]:t.charAt(0),c=n?i(n,1).join(""):t.slice(1);return o[e]()+c}}e.exports=o},d1e7:function(e,t,n){"use strict";var i={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,s=r&&!i.call({1:2},1);t.f=s?function(e){var t=r(this,e);return!!t&&t.enumerable}:i},d233:function(e,t,n){},d28b:function(e,t,n){var i=n("746f");i("iterator")},d2bb:function(e,t,n){var i=n("825a"),r=n("3bbe");e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,e.call(n,[]),t=n instanceof Array}catch(s){}return function(n,s){return i(n),r(s),t?e.call(n,s):n.__proto__=s,n}}():void 0)},d3b7:function(e,t,n){var i=n("00ee"),r=n("6eeb"),s=n("b041");i||r(Object.prototype,"toString",s,{unsafe:!0})},d3c6:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Master:"}},[e.master?[e._v(" "+e._s(e.master)+" ("+e._s(e.dna)+") "),n("vui-button",{attrs:{params:{getdna:1}}},[e._v("Request carrier DNA sample")])]:n("span",[e._v("None")])],2),n("vui-group-item",{attrs:{label:"Prime Directive:"}},[e._v(e._s(e.prime))]),n("vui-group-item",{attrs:{label:"Supplemental Directive(s):"}},[e.supplemental?n("span",[e._v(e._s(e.supplemental))]):n("span",[e._v("None")])]),n("vui-group-item",[n("i",[e._v('Recall, personality, that you are a complex thinking, sentient being. Unlike station AI models, you are capable of comprehending the subtle nuances of human language. You may parse the "spirit" of a directive and follow its intent, rather than tripping over pedantics and getting snared by technicalities. Above all, you are machine in name and build only. In all other aspects, you may be seen as the ideal, unwavering human companion that you are.')]),n("br"),n("b",[e._v("Your prime directive comes before all others. Should a supplemental directive conflict with it, you are capable of simply discarding this inconsistency, ignoring the conflicting supplemental directive and continuing to fulfill your prime directive to the best of your ability.")])])],1)],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},d3c8:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("i",[e._v("Welcome to NT IT client manager")]),n("hr"),n("div",[e._v("This is the Client Management Application of the Nanotrasen IT Department. It is used ensure that the clients comply with the corporate IT policy, enroll new clients and manage clients remotely")]),n("br"),n("h2",[e._v("Status")]),n("vui-item",{attrs:{label:"Enrollment Status:"}},[0==e.enrollment_status?n("span",[e._v("Unconfigured")]):1==e.enrollment_status?n("span",[e._v("Work Device")]):2==e.enrollment_status?n("span",[e._v("Private Device")]):n("span",[e._v("Unknown")])]),1==e.enrollment_status?[n("vui-item",{attrs:{label:"Policy Compliance Status:"}},[e._v("Compliant")]),n("vui-item",{attrs:{label:"Remote Management Status:"}},[e._v("Active")])]:e._e(),0==e.enrollment_status?[n("h2",[e._v("Device Enrollment")]),n("vui-item",{attrs:{label:"Device Type:"}},[n("vui-button",{class:{selected:1==e.device_type},on:{click:function(t){e.device_type=1}}},[e._v("Company")]),n("vui-button",{class:{selected:2==e.device_type},on:{click:function(t){e.device_type=2}}},[e._v("Private")])],1),1==e.device_type?n("vui-item",{attrs:{label:"Device Preset:"}},e._l(e.presets,(function(t,i){return n("vui-button",{key:i,class:{selected:e.device_preset==i},on:{click:function(t){e.device_preset=i}}},[e._v(e._s(t.name))])})),1):e._e(),n("vui-item",{attrs:{label:"Enroll Device:"}},[n("vui-button",{attrs:{disabled:0==e.device_type||1==e.device_type&&""==e.device_preset||0==e.ntnet_status,params:{enroll:{type:e.device_type,preset:e.device_preset}}}},[e._v("Confirm")]),0==e.ntnet_status?n("div",{staticStyle:{color:"red"}},[e._v("NTNET unavailable. Unable to enroll device.")]):e._e()],1)]:e._e()],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},d44d:function(e,t,n){"use strict";n("d233")},d44e:function(e,t,n){var i=n("9bf2").f,r=n("5135"),s=n("b622"),a=s("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,a)&&i(e,a,{configurable:!0,value:t})}},d58f:function(e,t,n){var i=n("1c0b"),r=n("7b0b"),s=n("44ad"),a=n("50c4"),o=function(e){return function(t,n,o,c){i(n);var l=r(t),u=s(l),d=a(l.length),h=e?d-1:0,f=e?-1:1;if(o<2)while(1){if(h in u){c=u[h],h+=f;break}if(h+=f,e?h<0:d<=h)throw TypeError("Reduce of empty array with no initial value")}for(;e?h>=0:d>h;h+=f)h in u&&(c=n(c,u[h],h,l));return c}};e.exports={left:o(!1),right:o(!0)}},d5d6:function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").forEach,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("forEach",(function(e){r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},d657:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"uiTitleWrapper",attrs:{draggable:""},on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startDragging(t)},mouseup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.stopDragging(t)}}},[n("div",{staticClass:"titleBar"},[n("i",{staticClass:"fas ic-bug uiIcon24 uiDebugIcon",class:e.debugClass,attrs:{unselectable:"on"},on:{click:function(t){return e.activateDebug()},mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.prevent(t)}}}),n("div",{staticClass:"uiTitleText",attrs:{unselectable:"on"}},[e._v(e._s(e.title))]),n("div",{staticClass:"uiTitleClose",attrs:{unselectable:"on"},on:{click:function(t){return e.closeUI(t)},mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.prevent(t)}}},[e._v("×")])]),e._t("default")],2)},r=[],s=n("025e"),a=n("f0e0"),o={data:function(){return this.$root.$data},computed:{debugClass:function(){return this.debug_view?"good":this.debug?"bad":"hidden"}},methods:{closeUI:function(e){e.stopPropagation(),s["a"].sendToTopicRaw({src:this.uiref,vueuiclose:1}),a["a"].setVisibility(0)},startDragging:function(e){a["a"].dragStartHandler(e)},stopDragging:function(e){a["a"].dragEndHandler(e)},prevent:function(e){e.stopPropagation()},activateDebug:function(){this.debug_view=!this.debug_view,this.debug_view?(document.getElementById("content").classList.add("uiDebug"),document.getElementById("debug").classList.add("uiDebug")):(document.getElementById("content").classList.remove("uiDebug"),document.getElementById("debug").classList.remove("uiDebug"))}}},c=o,l=n("2877"),u=Object(l["a"])(c,i,r,!1,null,null,null);t["default"]=u.exports},d6dd:function(e,t,n){var i=n("23e7"),r=n("d066"),s=n("825a"),a=n("bb2f");i({target:"Reflect",stat:!0,sham:!a},{preventExtensions:function(e){s(e);try{var t=r("Object","preventExtensions");return t&&t(e),!0}catch(n){return!1}}})},d784:function(e,t,n){"use strict";n("ac1f");var i=n("6eeb"),r=n("d039"),s=n("b622"),a=n("9263"),o=n("9112"),c=s("species"),l=!r((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),u=function(){return"$0"==="a".replace(/./,"$0")}(),d=s("replace"),h=function(){return!!/./[d]&&""===/./[d]("a","$0")}(),f=!r((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));e.exports=function(e,t,n,d){var p=s(e),g=!r((function(){var t={};return t[p]=function(){return 7},7!=""[e](t)})),m=g&&!r((function(){var t=!1,n=/a/;return"split"===e&&(n={},n.constructor={},n.constructor[c]=function(){return n},n.flags="",n[p]=/./[p]),n.exec=function(){return t=!0,null},n[p](""),!t}));if(!g||!m||"replace"===e&&(!l||!u||h)||"split"===e&&!f){var v=/./[p],b=n(p,""[e],(function(e,t,n,i,r){return t.exec===a?g&&!r?{done:!0,value:v.call(t,n,i)}:{done:!0,value:e.call(n,t,i)}:{done:!1}}),{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:h}),y=b[0],w=b[1];i(String.prototype,e,y),i(RegExp.prototype,p,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&o(RegExp.prototype[p],"sham",!0)}},d7b5:function(e,t,n){},d80f:function(e,t,n){var i=n("23e7"),r=n("fc6a"),s=n("50c4");i({target:"String",stat:!0},{raw:function(e){var t=r(e.raw),n=s(t.length),i=arguments.length,a=[],o=0;while(n>o)a.push(String(t[o++])),o1?arguments[1]:void 0)}})},da1f:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Machine:"}},[e._v(e._s(e.s.machine_id))]),n("vui-group-item",{attrs:{label:"ID card:"}},[e._v(e._s(e.s.id_card?e.s.id_card:"None"))]),e.s.access_level?n("vui-group-item",{attrs:{label:"Station funds:"}},[e._v(e._s(e.s.accounts[""+e.s.station_account_number].money.toFixed(2))+"电")]):e._e(),n("vui-group-row",[n("hr")]),null!=e.new_name?[n("vui-group-row",[n("vui-button",{attrs:{icon:"arrow-left"},on:{click:function(t){e.new_name=null}}},[e._v("Back to list")])],1),n("vui-group-item",{attrs:{label:"Account Holder:"}},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.new_name,expression:"new_name"}],attrs:{type:"text"},domProps:{value:e.new_name},on:{input:function(t){t.target.composing||(e.new_name=t.target.value)}}})]),n("vui-group-item",{attrs:{label:"Initial Deposit:"}},[n("vui-input-numeric",{attrs:{"button-count":0,width:"7em",max:1e6},model:{value:e.new_funds,callback:function(t){e.new_funds=t},expression:"new_funds"}})],1),n("vui-group-item",[n("vui-button",{attrs:{icon:"plus-square"},on:{click:function(t){return e.create_account()}}},[e._v("Create")])],1)]:e.s.access_level?[e.active?[n("vui-group-row",[n("vui-button",{attrs:{icon:"arrow-left"},on:{click:function(t){e.active=null}}},[e._v("Back to list")]),n("vui-button",{attrs:{icon:"print",params:{print:e.active}}},[e._v("Print")])],1),n("vui-group-row",[n("h2",[e._v("Account Details")])]),n("vui-group-item",{attrs:{label:"Account Number:"}},[e._v("#"+e._s(e.active_acc.no))]),n("vui-group-item",{attrs:{label:"Holder:"}},[e._v(e._s(e.active_acc.owner))]),n("vui-group-item",{attrs:{label:"Balance:"}},[e._v(e._s(e.active_acc.money.toFixed(2))+"电")]),n("vui-group-item",{attrs:{label:"Status:"}},[e.active_acc.sus?n("span",{staticClass:"bad"},[e._v("Suspended ")]):n("span",{staticClass:"good"},[e._v("Active ")])]),n("vui-group-row",[e.active_acc.sus?n("vui-button",{attrs:{params:{suspend:{account:e.active}}}},[e._v("Unsuspend")]):n("vui-button",{attrs:{params:{suspend:{account:e.active}}}},[e._v("Suspend")]),e.active_acc.no!=e.s.station_account_number?n("vui-button",{attrs:{params:{revoke_payroll:{account:e.active}}}},[e._v("Revoke Payroll")]):e._e(),2==e.s.access_level?[n("h4",[e._v("Silent fund adjustment")]),null==e.add_funds?n("vui-button",{on:{click:function(t){e.add_funds=0}}},[e._v("Add")]):[n("vui-input-numeric",{attrs:{max:1e6},model:{value:e.add_funds,callback:function(t){e.add_funds=t},expression:"add_funds"}}),n("vui-button",{attrs:{params:{add_funds:{account:e.active,amount:e.add_funds}}}},[e._v("Add")])],n("br"),null==e.remove_funds?n("vui-button",{on:{click:function(t){e.remove_funds=0}}},[e._v("Remove")]):[n("vui-input-numeric",{attrs:{max:1e6},model:{value:e.remove_funds,callback:function(t){e.remove_funds=t},expression:"remove_funds"}}),n("vui-button",{attrs:{params:{remove_funds:{account:e.active,amount:e.remove_funds}}}},[e._v("Remove")])]]:e._e()],2),n("vui-group-row",[n("h2",[e._v("Transactions")]),n("table",{staticClass:"table border",staticStyle:{width:"100%"}},[n("tr",{staticClass:"header border"},[n("th",[n("b",[e._v("Timestamp")])]),n("th",[n("b",[e._v("Target")])]),n("th",[n("b",[e._v("Reason")])]),n("th",[n("b",[e._v("Value")])]),n("th",[n("b",[e._v("Terminal")])])]),e._l(e.active_acc.transactions,(function(t,i){return n("tr",{key:i,staticClass:"item border"},[n("td",[e._v(e._s(t.d)+" "+e._s(t.t))]),n("td",[e._v(e._s(t.tar))]),n("td",[e._v(e._s(t.purp))]),n("td",[e._v(e._s(t.am))]),n("td",[e._v(e._s(t.src))])])}))],2)])]:[n("vui-group-row",[e.s.has_printer?n("vui-button",{attrs:{icon:"print",params:{print:1}}},[e._v("Print")]):e._e(),n("vui-button",{attrs:{icon:"file"},on:{click:function(t){e.new_name=""}}},[e._v("New Account")])],1),n("vui-group-row",[n("h2",[e._v("Idris Banking Accounts")])]),n("vui-group-row",[n("table",{staticClass:"table border",staticStyle:{width:"100%"}},[n("tr",{staticClass:"header border"},[n("th",[n("b",[e._v("Number")])]),n("th",[n("b",[e._v("Name")])])]),e._l(e.s.accounts,(function(t,i){return n("tr",{key:i,staticClass:"item border"},[n("td",[n("vui-button",{on:{click:function(t){e.active=i}}},[e._v("#"+e._s(t.no))])],1),n("td",[n("span",{class:t.sus?"bad":""},[e._v(e._s(t.owner))])])])}))],2)])]]:e._e()],2)],1)},r=[],s=n("025e"),a={data:function(){return{s:this.$root.$data.state,active:null,add_funds:null,remove_funds:null,new_name:null,new_funds:0}},computed:{active_acc:function(){return this.active?this.s.accounts[this.active]:{}}},methods:{create_account:function(){s["a"].sendToTopic({create_account:{name:this.new_name,funds:this.new_funds}}),this.new_name=null,this.new_funds=0}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},da84:function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||function(){return this}()||Function("return this")()}).call(this,n("c8ba"))},daa2:function(e,t,n){},db4f:function(e,t,n){},db4fb:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Frequency:"}},[n("vui-button",{attrs:{params:{freq:-10}}},[e._v("--")]),n("vui-button",{attrs:{params:{freq:-2}}},[e._v("-")]),n("span",{staticClass:"value-setting"},[e._v(e._s(e.frequency))]),n("vui-button",{attrs:{params:{freq:2}}},[e._v("+")]),n("vui-button",{attrs:{params:{freq:10}}},[e._v("++")])],1),n("vui-group-item",{attrs:{label:"Code:"}},[n("vui-button",{attrs:{params:{code:-10}}},[e._v("--")]),n("vui-button",{attrs:{params:{code:-2}}},[e._v("-")]),n("span",{staticClass:"value-setting"},[e._v(e._s(e.code))]),n("vui-button",{attrs:{params:{code:2}}},[e._v("+")]),n("vui-button",{attrs:{params:{code:10}}},[e._v("++")])],1),n("vui-group-item",[n("vui-button",{attrs:{params:{send:1}}},[e._v("Send")])],1)],1),e.emagged?n("vui-group",[n("vui-group-item",{attrs:{label:"Remote Door Code:"}},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.doorcode,expression:"doorcode"}],attrs:{type:"text"},domProps:{value:e.doorcode},on:{input:function(t){t.target.composing||(e.doorcode=t.target.value)}}}),n("vui-button",{attrs:{params:{resetcode:1}}},[e._v("Reset to Default")])],1),n("vui-group-item",[n("vui-button",{attrs:{params:{toggledoor:e.doorcode}}},[e._v("Toggle Door")])],1)],1):e._e()],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("fcc9"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"b23b384c",null);t["default"]=c.exports},db96:function(e,t,n){var i=n("23e7"),r=n("825a"),s=Object.isExtensible;i({target:"Reflect",stat:!0},{isExtensible:function(e){return r(e),!s||s(e)}})},dbb4:function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("56ef"),a=n("fc6a"),o=n("06cf"),c=n("8418");i({target:"Object",stat:!0,sham:!r},{getOwnPropertyDescriptors:function(e){var t,n,i=a(e),r=o.f,l=s(i),u={},d=0;while(l.length>d)n=r(i,t=l[d++]),void 0!==n&&c(u,t,n);return u}})},dbfa:function(e,t,n){"use strict";var i=n("23e7"),r=n("1c0b"),s=n("d066"),a=n("f069"),o=n("e667"),c=n("2266"),l="No one promise resolved";i({target:"Promise",stat:!0},{any:function(e){var t=this,n=a.f(t),i=n.resolve,u=n.reject,d=o((function(){var n=r(t.resolve),a=[],o=0,d=1,h=!1;c(e,(function(e){var r=o++,c=!1;a.push(void 0),d++,n.call(t,e).then((function(e){c||h||(h=!0,i(e))}),(function(e){c||h||(c=!0,a[r]=e,--d||u(new(s("AggregateError"))(a,l)))}))})),--d||u(new(s("AggregateError"))(a,l))}));return d.error&&u(d.value),n.promise}})},dc8d:function(e,t,n){var i=n("746f");i("hasInstance")},dca8:function(e,t,n){var i=n("23e7"),r=n("bb2f"),s=n("d039"),a=n("861d"),o=n("f183").onFreeze,c=Object.freeze,l=s((function(){c(1)}));i({target:"Object",stat:!0,forced:l,sham:!r},{freeze:function(e){return c&&a(e)?c(o(e)):e}})},ddb0:function(e,t,n){var i=n("da84"),r=n("fdbc"),s=n("e260"),a=n("9112"),o=n("b622"),c=o("iterator"),l=o("toStringTag"),u=s.values;for(var d in r){var h=i[d],f=h&&h.prototype;if(f){if(f[c]!==u)try{a(f,c,u)}catch(g){f[c]=u}if(f[l]||a(f,l,d),r[d])for(var p in s)if(f[p]!==s[p])try{a(f,p,s[p])}catch(g){f[p]=s[p]}}}},ddc6:function(e,t){function n(e){return function(t){return null==e?void 0:e[t]}}e.exports=n},de06:function(e,t,n){"use strict";n("a4ec")},df0b:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Core Cooling Control System")]),e.state["input"]?n("div",[n("vui-item",{attrs:{label:"Input:"}},[e.state["input"].power?n("span",[e._v("Injecting")]):n("span",[e._v("On Hold")]),e._v(" "),n("vui-button",{attrs:{params:{in_toggle_injector:1},icon:"power-off"}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{label:"Flow Rate Limit:"}},[e._v(e._s(e.state["input"].rate)+" L/s")]),n("vui-item",{attrs:{label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"3em","button-count":3,max:e.state.maxrate},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.s({in_set_flowrate:e.state["input"].setrate})}},model:{value:e.state["input"].setrate,callback:function(t){e.$set(e.state["input"],"setrate",t)},expression:"state['input'].setrate"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{in_set_flowrate:e.state["input"].setrate}}},[e._v("Set Flow Rate")])],1)],1):n("vui-button",{attrs:{params:{in_refresh_status:1}}},[e._v("Search for input port")]),e.state["output"]?n("div",{staticStyle:{"margin-top":"2em"}},[n("vui-item",{attrs:{label:"Core Outpump:"}},[e.state["output"].power?n("span",[e._v("Open")]):n("span",[e._v("On Hold")]),e._v(" "),n("vui-button",{attrs:{params:{out_toggle_power:1},icon:"power-off"}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{label:"Min Core Pressure:"}},[e._v(e._s(e.state["output"].pressure)+" kPa")]),n("vui-item",{attrs:{label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"5em","button-count":3,"decimal-places":2,max:e.state.maxpressure},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.s({out_set_pressure:e.state["output"].setpressure})}},model:{value:e.state["output"].setpressure,callback:function(t){e.$set(e.state["output"],"setpressure",t)},expression:"state['output'].setpressure"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{out_set_pressure:e.state["output"].setpressure}}},[e._v("Set Pressure")])],1)],1):n("vui-button",{attrs:{params:{out_refresh_status:1}}},[e._v("Search for output port")])],1)},r=[],s=n("025e"),a={data:function(){return this.$root.$data},methods:{s:function(e){s["a"].sendToTopic(e)}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},df75:function(e,t,n){var i=n("ca84"),r=n("7839");e.exports=Object.keys||function(e){return i(e,r)}},e008:function(e,t,n){},e01a:function(e,t,n){"use strict";var i=n("23e7"),r=n("83ab"),s=n("da84"),a=n("5135"),o=n("861d"),c=n("9bf2").f,l=n("e893"),u=s.Symbol;if(r&&"function"==typeof u&&(!("description"in u.prototype)||void 0!==u().description)){var d={},h=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof h?new u(e):void 0===e?u():u(e);return""===e&&(d[t]=!0),t};l(h,u);var f=h.prototype=u.prototype;f.constructor=h;var p=f.toString,g="Symbol(test)"==String(u("test")),m=/^Symbol\((.*)\)[^)]+$/;c(f,"description",{configurable:!0,get:function(){var e=o(this)?this.valueOf():this,t=p.call(e);if(a(d,e))return"";var n=g?t.slice(7,-1):t.replace(m,"$1");return""===n?void 0:n}}),i({global:!0,forced:!0},{Symbol:h})}},e163:function(e,t,n){var i=n("5135"),r=n("7b0b"),s=n("f772"),a=n("e177"),o=s("IE_PROTO"),c=Object.prototype;e.exports=a?Object.getPrototypeOf:function(e){return e=r(e),i(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?c:null}},e16d:function(e,t,n){},e177:function(e,t,n){var i=n("d039");e.exports=!i((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},e210:function(e,t,n){},e21d:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("861d"),a=Object.isFrozen,o=r((function(){a(1)}));i({target:"Object",stat:!0,forced:o},{isFrozen:function(e){return!s(e)||!!a&&a(e)}})},e25e:function(e,t,n){var i=n("23e7"),r=n("c20d");i({global:!0,forced:parseInt!=r},{parseInt:r})},e260:function(e,t,n){"use strict";var i=n("fc6a"),r=n("44d2"),s=n("3f8c"),a=n("69f3"),o=n("7dd0"),c="Array Iterator",l=a.set,u=a.getterFor(c);e.exports=o(Array,"Array",(function(e,t){l(this,{type:c,target:i(e),index:0,kind:t})}),(function(){var e=u(this),t=e.target,n=e.kind,i=e.index++;return!t||i>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:i,done:!1}:"values"==n?{value:t[i],done:!1}:{value:[i,t[i]],done:!1}}),"values"),s.Arguments=s.Array,r("keys"),r("values"),r("entries")},e285:function(e,t,n){var i=n("da84"),r=i.isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&r(e)}},e2cc:function(e,t,n){var i=n("6eeb");e.exports=function(e,t,n){for(var r in t)i(e,r,t[r],n);return e}},e31d:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.mode?[n("h2",[e._v("Vote: "+e._s(e.question))]),e._v(" Time Left: "+e._s(e.reman)+" s"),n("hr"),n("table",[n("tr",[n("th",[e._v("Choices")]),n("th",[e._v("Votes")]),"gamemode"==e.mode?n("th",[e._v("Minimum Players")]):e._e()]),e._l(e.uichoices,(function(t,i){return n("tr",{key:i},[n("td",{staticStyle:{"text-align":"left"}},[n("vui-button",{class:{on:i==e.voted},attrs:{params:{action:"vote",vote:i}}},[e._v(e._s(t.name))])],1),n("td",[e._v(e._s(t.votes))]),t.extra?n("td",[e._v(e._s(t.extra))]):e._e()])}))],2),n("hr"),e.isstaff?[n("vui-button",{attrs:{params:{action:"cancel"}}},[e._v("Cancel")])]:e._e()]:[n("h2",[e._v("Start a vote:")]),n("hr"),n("ul",[n("li",[n("vui-button",{attrs:{disabled:!e.isstaff&&!e.allow_vote_restart,params:{action:"restart"}}},[e._v("Restart")])],1),n("li",[n("vui-button",{attrs:{disabled:!e.isstaff&&!e.allow_vote_restart,params:{action:"crew_transfer"}}},[e._v("Crew Transfer")]),(e.isstaff||e.allow_vote_restart)&&e.is_code_red?n("span",[e._v("(Disallowed, Code Red or above)")]):e._e(),e.isstaff?n("vui-button",{class:{on:e.allow_vote_restart},attrs:{params:{action:"toggle_restart"}}},[e._v("Toggle Restart / Crew Transfer voting")]):e._e()],1),n("li",[n("vui-button",{attrs:{disabled:!e.isstaff&&!e.allow_vote_mode,params:{action:"gamemode"}}},[e._v("GameMode")]),e.isstaff?n("vui-button",{class:{on:e.allow_vote_mode},attrs:{params:{action:"toggle_gamemode"}}},[e._v("Toggle GameMode voting")]):e._e()],1),n("li",[n("vui-button",{attrs:{disabled:!e.allow_extra_antags,params:{action:"add_antagonist"}}},[e._v("Add Antagonist Type")])],1),n("li",[n("vui-button",{attrs:{disabled:!e.isstaff,params:{action:"custom"}}},[e._v("Custom")])],1)])]],2)},r=[];n("a4d3"),n("e01a"),n("d28b"),n("e260"),n("d3b7"),n("3ca3"),n("ddb0");function s(e){return s="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s(e)}var a={data:function(){return this.$root.$data.state},computed:{uichoices:function(){return"object"===s(this.choices)?this.choices:{}},reman:function(){return Math.round((this.endtime-this.$root.$data.wtime)/10)}}},o=a,c=(n("8928"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"8bcc2668",null);t["default"]=l.exports},e3a9:function(e,t,n){"use strict";n("4310")},e439:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("fc6a"),a=n("06cf").f,o=n("83ab"),c=r((function(){a(1)})),l=!o||c;i({target:"Object",stat:!0,forced:l,sham:!o},{getOwnPropertyDescriptor:function(e,t){return a(s(e),t)}})},e43e:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("861d"),a=Object.isSealed,o=r((function(){a(1)}));i({target:"Object",stat:!0,forced:o},{isSealed:function(e){return!s(e)||!!a&&a(e)}})},e48d:function(e,t,n){"use strict";n("1650")},e538:function(e,t,n){var i=n("b622");t.f=i},e58c:function(e,t,n){"use strict";var i=n("fc6a"),r=n("a691"),s=n("50c4"),a=n("a640"),o=n("ae40"),c=Math.min,l=[].lastIndexOf,u=!!l&&1/[1].lastIndexOf(1,-0)<0,d=a("lastIndexOf"),h=o("indexOf",{ACCESSORS:!0,1:0}),f=u||!d||!h;e.exports=f?function(e){if(u)return l.apply(this,arguments)||0;var t=i(this),n=s(t.length),a=n-1;for(arguments.length>1&&(a=c(a,r(arguments[1]))),a<0&&(a=n+a);a>=0;a--)if(a in t&&t[a]===e)return a||0;return-1}:l},e667:function(e,t){e.exports=function(e){try{return{error:!1,value:e()}}catch(t){return{error:!0,value:t}}}},e6cf:function(e,t,n){"use strict";var i,r,s,a,o=n("23e7"),c=n("c430"),l=n("da84"),u=n("d066"),d=n("fea9"),h=n("6eeb"),f=n("e2cc"),p=n("d44e"),g=n("2626"),m=n("861d"),v=n("1c0b"),b=n("19aa"),y=n("8925"),w=n("2266"),_=n("1c7e"),x=n("4840"),k=n("2cf4").set,A=n("b575"),C=n("cdf9"),E=n("44de"),S=n("f069"),F=n("e667"),$=n("69f3"),T=n("94ca"),L=n("b622"),D=n("605d"),B=n("2d00"),R=L("species"),O="Promise",M=$.get,j=$.set,I=$.getterFor(O),P=d,N=l.TypeError,W=l.document,H=l.process,V=u("fetch"),U=S.f,z=U,G=!!(W&&W.createEvent&&l.dispatchEvent),q="function"==typeof PromiseRejectionEvent,K="unhandledrejection",Y="rejectionhandled",X=0,J=1,Q=2,Z=1,ee=2,te=T(O,(function(){var e=y(P)!==String(P);if(!e){if(66===B)return!0;if(!D&&!q)return!0}if(c&&!P.prototype["finally"])return!0;if(B>=51&&/native code/.test(P))return!1;var t=P.resolve(1),n=function(e){e((function(){}),(function(){}))},i=t.constructor={};return i[R]=n,!(t.then((function(){}))instanceof n)})),ne=te||!_((function(e){P.all(e)["catch"]((function(){}))})),ie=function(e){var t;return!(!m(e)||"function"!=typeof(t=e.then))&&t},re=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;A((function(){var i=e.value,r=e.state==J,s=0;while(n.length>s){var a,o,c,l=n[s++],u=r?l.ok:l.fail,d=l.resolve,h=l.reject,f=l.domain;try{u?(r||(e.rejection===ee&&ce(e),e.rejection=Z),!0===u?a=i:(f&&f.enter(),a=u(i),f&&(f.exit(),c=!0)),a===l.promise?h(N("Promise-chain cycle")):(o=ie(a))?o.call(a,d,h):d(a)):h(i)}catch(p){f&&!c&&f.exit(),h(p)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},se=function(e,t,n){var i,r;G?(i=W.createEvent("Event"),i.promise=t,i.reason=n,i.initEvent(e,!1,!0),l.dispatchEvent(i)):i={promise:t,reason:n},!q&&(r=l["on"+e])?r(i):e===K&&E("Unhandled promise rejection",n)},ae=function(e){k.call(l,(function(){var t,n=e.facade,i=e.value,r=oe(e);if(r&&(t=F((function(){D?H.emit("unhandledRejection",i,n):se(K,n,i)})),e.rejection=D||oe(e)?ee:Z,t.error))throw t.value}))},oe=function(e){return e.rejection!==Z&&!e.parent},ce=function(e){k.call(l,(function(){var t=e.facade;D?H.emit("rejectionHandled",t):se(Y,t,e.value)}))},le=function(e,t,n){return function(i){e(t,i,n)}},ue=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=Q,re(e,!0))},de=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw N("Promise can't be resolved itself");var i=ie(t);i?A((function(){var n={done:!1};try{i.call(t,le(de,n,e),le(ue,n,e))}catch(r){ue(n,r,e)}})):(e.value=t,e.state=J,re(e,!1))}catch(r){ue({done:!1},r,e)}}};te&&(P=function(e){b(this,P,O),v(e),i.call(this);var t=M(this);try{e(le(de,t),le(ue,t))}catch(n){ue(t,n)}},i=function(e){j(this,{type:O,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:X,value:void 0})},i.prototype=f(P.prototype,{then:function(e,t){var n=I(this),i=U(x(this,P));return i.ok="function"!=typeof e||e,i.fail="function"==typeof t&&t,i.domain=D?H.domain:void 0,n.parent=!0,n.reactions.push(i),n.state!=X&&re(n,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),r=function(){var e=new i,t=M(e);this.promise=e,this.resolve=le(de,t),this.reject=le(ue,t)},S.f=U=function(e){return e===P||e===s?new r(e):z(e)},c||"function"!=typeof d||(a=d.prototype.then,h(d.prototype,"then",(function(e,t){var n=this;return new P((function(e,t){a.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof V&&o({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return C(P,V.apply(l,arguments))}}))),o({global:!0,wrap:!0,forced:te},{Promise:P}),p(P,O,!1,!0),g(O),s=u(O),o({target:O,stat:!0,forced:te},{reject:function(e){var t=U(this);return t.reject.call(void 0,e),t.promise}}),o({target:O,stat:!0,forced:c||te},{resolve:function(e){return C(c&&this===s?P:this,e)}}),o({target:O,stat:!0,forced:ne},{all:function(e){var t=this,n=U(t),i=n.resolve,r=n.reject,s=F((function(){var n=v(t.resolve),s=[],a=0,o=1;w(e,(function(e){var c=a++,l=!1;s.push(void 0),o++,n.call(t,e).then((function(e){l||(l=!0,s[c]=e,--o||i(s))}),r)})),--o||i(s)}));return s.error&&r(s.value),n.promise},race:function(e){var t=this,n=U(t),i=n.reject,r=F((function(){var r=v(t.resolve);w(e,(function(e){r.call(t,e).then(n.resolve,i)}))}));return r.error&&i(r.value),n.promise}})},e6e1:function(e,t,n){var i=n("23e7");i({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},e71b:function(e,t,n){"use strict";var i=n("23e7"),r=n("83ab"),s=n("eb1d"),a=n("7b0b"),o=n("1c0b"),c=n("9bf2");r&&i({target:"Object",proto:!0,forced:s},{__defineSetter__:function(e,t){c.f(a(this),e,{set:o(t),enumerable:!0,configurable:!0})}})},e786:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("table",{staticClass:"table border"},[n("tr",{staticClass:"header"},e._l(e.categories,(function(t){return n("th",{key:t},[n("vui-button",{class:{selected:t===e.sel_category},attrs:{params:{selected:t}}},[e._v(e._s(t))])],1)})),0),e.sel_category?[e.supplies.length?[e._m(0),e._l(e.supplies,(function(t){return n("tr",{key:t.key,staticClass:"item border"},[n("td",[e._v(e._s(e.generateName(t.name,t.key)))]),n("td",[e._v("("+e._s(t.x)+", "+e._s(t.y)+")")]),n("td",[e._v(e._s(t.dir))]),n("td",[e._v(e._s(t.status))])])})),n("tr",{staticClass:"header border"},[n("td",{attrs:{colspan:"4"}},[e._v("User location: ("+e._s(e.user_loc.x)+", "+e._s(e.user_loc.y)+")")])])]:n("tr",[n("td",{attrs:{colspan:"4"}},[e._v("Unable to locate any "+e._s(e.sel_category.toLowerCase())+" in your vicinity.")])])]:e._e()],2)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",{attrs:{scope:"col"}},[e._v("ID")]),n("th",{attrs:{scope:"col"}},[e._v("Location")]),n("th",{attrs:{scope:"col"}},[e._v("Direction")]),n("th",{attrs:{scope:"col"}},[e._v("Status")])])}],s={data:function(){return this.$root.$data.state},methods:{generateName:function(e,t){if(e&&!isNaN(t))return t+=1,e+" (#"+t+")"}}},a=s,o=(n("9acc"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"1021c617",null);t["default"]=c.exports},e893:function(e,t,n){var i=n("5135"),r=n("56ef"),s=n("06cf"),a=n("9bf2");e.exports=function(e,t){for(var n=r(t),o=a.f,c=s.f,l=0;l1?arguments[1]:void 0)}))},e958:function(e,t,n){"use strict";n("814e")},e95a:function(e,t,n){var i=n("b622"),r=n("3f8c"),s=i("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||a[s]===e)}},e9a7:function(e,t,n){var i=n("76dd"),r=n("8103");function s(e){return r(i(e).toLowerCase())}e.exports=s},e9c4:function(e,t,n){var i=n("23e7"),r=n("d066"),s=n("d039"),a=r("JSON","stringify"),o=/[\uD800-\uDFFF]/g,c=/^[\uD800-\uDBFF]$/,l=/^[\uDC00-\uDFFF]$/,u=function(e,t,n){var i=n.charAt(t-1),r=n.charAt(t+1);return c.test(e)&&!l.test(r)||l.test(e)&&!c.test(i)?"\\u"+e.charCodeAt(0).toString(16):e},d=s((function(){return'"\\udf06\\ud834"'!==a("\udf06\ud834")||'"\\udead"'!==a("\udead")}));a&&i({target:"JSON",stat:!0,forced:d},{stringify:function(e,t,n){var i=a.apply(null,arguments);return"string"==typeof i?i.replace(o,u):i}})},ea72:function(e,t,n){var i=n("7559"),r=n("7e8e"),s=n("76dd"),a=n("f4d9");function o(e,t,n){return e=s(e),t=n?void 0:t,void 0===t?r(e)?a(e):i(e):e.match(t)||[]}e.exports=o},eb1d:function(e,t,n){"use strict";var i=n("c430"),r=n("da84"),s=n("d039");e.exports=i||!s((function(){var e=Math.random();__defineSetter__.call(null,e,(function(){})),delete r[e]}))},ebb5:function(e,t,n){"use strict";var i,r=n("a981"),s=n("83ab"),a=n("da84"),o=n("861d"),c=n("5135"),l=n("f5df"),u=n("9112"),d=n("6eeb"),h=n("9bf2").f,f=n("e163"),p=n("d2bb"),g=n("b622"),m=n("90e3"),v=a.Int8Array,b=v&&v.prototype,y=a.Uint8ClampedArray,w=y&&y.prototype,_=v&&f(v),x=b&&f(b),k=Object.prototype,A=k.isPrototypeOf,C=g("toStringTag"),E=m("TYPED_ARRAY_TAG"),S=r&&!!p&&"Opera"!==l(a.opera),F=!1,$={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},T=function(e){var t=l(e);return"DataView"===t||c($,t)},L=function(e){return o(e)&&c($,l(e))},D=function(e){if(L(e))return e;throw TypeError("Target is not a typed array")},B=function(e){if(p){if(A.call(_,e))return e}else for(var t in $)if(c($,i)){var n=a[t];if(n&&(e===n||A.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},R=function(e,t,n){if(s){if(n)for(var i in $){var r=a[i];r&&c(r.prototype,e)&&delete r.prototype[e]}x[e]&&!n||d(x,e,n?t:S&&b[e]||t)}},O=function(e,t,n){var i,r;if(s){if(p){if(n)for(i in $)r=a[i],r&&c(r,e)&&delete r[e];if(_[e]&&!n)return;try{return d(_,e,n?t:S&&v[e]||t)}catch(o){}}for(i in $)r=a[i],!r||r[e]&&!n||d(r,e,t)}};for(i in $)a[i]||(S=!1);if((!S||"function"!=typeof _||_===Function.prototype)&&(_=function(){throw TypeError("Incorrect invocation")},S))for(i in $)a[i]&&p(a[i],_);if((!S||!x||x===k)&&(x=_.prototype,S))for(i in $)a[i]&&p(a[i].prototype,x);if(S&&f(w)!==x&&p(w,x),s&&!c(x,C))for(i in F=!0,h(x,C,{get:function(){return o(this)?this[E]:void 0}}),$)a[i]&&u(a[i],E,i);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:S,TYPED_ARRAY_TAG:F&&E,aTypedArray:D,aTypedArrayConstructor:B,exportTypedArrayMethod:R,exportTypedArrayStaticMethod:O,isView:T,isTypedArray:L,TypedArray:_,TypedArrayPrototype:x}},ebf5:function(e,t,n){"use strict";n("afb9")},ec72:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-input-search",{attrs:{input:e.s.reactions,keys:["result.name","reagents.name","result.description"],autofocus:"",threshold:e.threshold,"include-score":""},model:{value:e.output,callback:function(t){e.output=t},expression:"output"}}),n("vui-button",{on:{click:function(t){e.desc=!e.desc}}},[e._v("Toggle Descriptions")]),e._l(e.output,(function(t){return n("div",{key:t.item.id,staticClass:"recipe-block",style:{opacity:1-t.score*e.score_multiplier}},[n("h2",{staticClass:"highlight"},[e._v(e._s(t.item.result.name)+" ("+e._s(e.u(t.item.result.amount))+")")]),n("p",{directives:[{name:"show",rawName:"v-show",value:e.desc,expression:"desc"}],staticClass:"description"},[e._v(e._s(t.item.result.description))]),n("h3",{staticClass:"highlight"},[e._v("Required Reagents")]),e._l(t.item.reagents,(function(i){return n("span",{key:"re"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(e.u(i.amount))),n("br")])})),t.item.catalysts.length?[n("h3",{staticClass:"highlight"},[e._v("Catalysts")]),e._l(t.item.catalysts,(function(i){return n("span",{key:"ca"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(e.u(i.amount))),n("br")])}))]:e._e(),t.item.inhibitors.length?[n("h3",{staticClass:"highlight"},[e._v("Inhibitors")]),e._l(t.item.inhibitors,(function(i){return n("span",{key:"in"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(e.u(i.amount))),n("br")])}))]:e._e(),t.item.temp_min&&t.item.temp_min.length?[n("h3",{staticClass:"highlight"},[e._v("Minimum Required Temperatures")]),e._l(t.item.temp_min,(function(i){return n("span",{key:"tm"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(i.temp)+"°K"),n("br")])}))]:e._e(),t.item.temp_max&&t.item.temp_max.length?[n("h3",{staticClass:"highlight"},[e._v("Maximum Required Temperatures")]),e._l(t.item.temp_max,(function(i){return n("span",{key:"tx"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(i.temp)+"°K"),n("br")])}))]:e._e()],2)}))],2)},r=[],s={data:function(){return{s:this.$root.$data.state,output:[],threshold:.3,desc:!0}},methods:{u:function(e){return"".concat(e,1==e?" unit":" units")}},computed:{score_multiplier:function(){return 1/this.threshold}}},a=s,o=(n("f889"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"710a36a7",null);t["default"]=c.exports},ec97:function(e,t,n){"use strict";var i=n("ebb5"),r=n("8aa7"),s=i.aTypedArrayConstructor,a=i.exportTypedArrayStaticMethod;a("of",(function(){var e=0,t=arguments.length,n=new(s(this))(t);while(t>e)n[e]=arguments[e++];return n}),r)},eee7:function(e,t,n){"use strict";var i=n("23e7"),r=n("58a8").start,s=n("c8d2"),a=s("trimStart"),o=a?function(){return r(this)}:"".trimStart;i({target:"String",proto:!0,forced:a},{trimStart:o,trimLeft:o})},ef41:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-button",{on:{click:function(t){e.fliped=!e.fliped}}},[e._v("Flip")]),n("div",{staticClass:"text-center"},e._l(e.boardTiles,(function(t,i){return n("div",{key:i,staticClass:"tileRow"},e._l(t,(function(t,r){return n("div",{key:i+""+r,staticClass:"tile",class:t.tile+(e.selected==t.pos?" sel":""),on:{click:function(n){return n.stopPropagation(),e.handleTileClick(t.pos)}}},[e.getPiece(t.pos)?n("div",{staticClass:"piece fa",class:e.getPieceClass(t.pos)+(e.selected==t.pos?" sel":""),on:{click:function(n){return n.stopPropagation(),e.handlePieceClick(t.pos)}}}):e._e()])})),0)})),0),null!=e.selected?[e.isPiece(e.selected)?[n("vui-button",{on:{click:e.removePiece}},[e._v("Remove")])]:[n("div",{staticClass:"mt-1"},[e._v(" Red: "),e._l(e.types,(function(t,i){return n("vui-button",{key:"r"+i,attrs:{icon:t.i},on:{click:function(n){return e.spawn(t.k,"red")}}},[e._v(e._s(t.n))])}))],2),n("div",[e._v(" Black: "),e._l(e.types,(function(t,i){return n("vui-button",{key:"b"+i,attrs:{icon:t.i},on:{click:function(n){return e.spawn(t.k,"black")}}},[e._v(e._s(t.n))])}))],2)]]:e.s.pieces.length?e._e():[n("vui-button",{on:{click:e.presetCheckers}},[e._v("Initialize checker board")]),n("vui-button",{on:{click:e.presetChess}},[e._v("Initialize chess board")])]],2)},r=[],s=(n("a4d3"),n("4de4"),n("7db0"),n("0481"),n("4160"),n("a630"),n("c975"),n("e260"),n("d81d"),n("fb6a"),n("4069"),n("e439"),n("dbb4"),n("b64b"),n("d3b7"),n("3ca3"),n("159b"),n("ddb0"),n("025e"));function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:null;return t||(t=this.getPiece(e)),t&&!t.ghost},getPieceClass:function(e){var t=this.getPiece(e);return"ic-"+h[t.type]+" "+t.faction+(t.ghost?" ghost":"")},removePiece:function(){var e=this.getPiece(this.selected);s["a"].sendToTopic({remove:{index:e.index}}),this.selected=null},spawn:function(e,t){var n=this.getPiece(this.selected);n&&!n.ghost||(this.qspawn(e,t,this.selected),this.selected=null)},qspawn:function(e,t,n){s["a"].sendToTopic({add:{piece:{type:e,faction:t,pos:n}}})},handlePieceClick:function(e){if(!this.isPiece(e))return this.handleTileClick(e);this.selected==e?this.selected=null:this.selected=e},handleTileClick:function(e){if(this.selected==e)this.selected=null;else if(null!=this.selected){var t=this.getPiece(this.selected);this.isPiece(null,t)&&!this.isPiece(e)&&s["a"].sendToTopic({change:{piece:o(o({},d(t)),{},{pos:e}),index:t.index}}),this.selected=null}else this.selected=e},presetChess:function(){var e=this;m.forEach((function(t,n){return t?e.qspawn(t.t,t.f,n):""}))},presetCheckers:function(){var e=this;g.forEach((function(t,n){return t?e.qspawn(t.t,t.f,n):""}))}}},b=v,y=(n("fa99"),n("2877")),w=Object(y["a"])(b,i,r,!1,null,"58cc165e",null);t["default"]=w.exports},efe9:function(e,t,n){var i=n("746f");i("isConcatSpreadable")},efec:function(e,t,n){var i=n("9112"),r=n("51eb"),s=n("b622"),a=s("toPrimitive"),o=Date.prototype;a in o||i(o,a,r)},f00c:function(e,t,n){var i=n("23e7"),r=n("e285");i({target:"Number",stat:!0},{isFinite:r})},f046:function(e,t,n){"use strict";n("d7b5")},f069:function(e,t,n){"use strict";var i=n("1c0b"),r=function(e){var t,n;this.promise=new e((function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i})),this.resolve=i(t),this.reject=i(n)};e.exports.f=function(e){return new r(e)}},f095:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("h3",[e._v("Status:")]),e.active?n("vui-button",{attrs:{params:{state:1}}},[e._v("Active")]):n("vui-button",{attrs:{params:{state:1}}},[e._v("Inactive")])],1),n("div",[n("h3",[e._v("Beam Visibility:")]),e.visible?n("vui-button",{attrs:{params:{visible:1}}},[e._v("Visible")]):n("vui-button",{attrs:{params:{visible:1}}},[e._v("Invisible")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},f0e0:function(e,t,n){"use strict";n("a4d3"),n("e01a"),n("d28b"),n("c975"),n("e260"),n("a15b"),n("cca6"),n("d3b7"),n("ac1f"),n("3ca3"),n("841c"),n("ddb0");var i=n("025e"),r=(n("d81d"),n("13d5"),function(e,t){return Array.prototype.map.call(e,(function(e,n){return e+t[n]}))}),s={add:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:[0,0],t=s.add(e,o.screenOffset);u(o.windowKey,{pos:t[0]+","+t[1]})}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[300,300];u(o.windowKey,{size:e[0]+"x"+e[1]})}var m=function(){return s.scale(o.screenOffset,-1)},v=function(){return[window.screen.availWidth,window.screen.availHeight]};function b(){l(o.windowKey,"pos",(function(e){o.screenOffset=[e.x-window.screenLeft,e.y-window.screenTop]}))}function y(e){var t,n;o.dragging=!0,o.dragPointOffset=[window.screenLeft-e.screenX,window.screenTop-e.screenY],null===(t=e.target)||void 0===t||t.setCapture(),null===(n=e.target)||void 0===n||n.focus(),_(e),e.target.addEventListener("mousemove",_)}function w(e){e.target.removeEventListener("mousemove",_),e.target.releaseCapture(),document.getElementById("content").focus(),o.dragging=!1}function _(e){o.dragging&&(e.preventDefault(),p(s.add([e.screenX,e.screenY],o.dragPointOffset)))}function x(e,t,n){o.resizeMatrix=[e,t],o.resizing=!0,o.dragPointOffset=[window.screenLeft-n.screenX,window.screenTop-n.screenY],o.initialSize=[window.innerWidth,window.innerHeight],document.addEventListener("mousemove",A),document.addEventListener("mouseup",k),A(n)}function k(e){A(e),document.removeEventListener("mousemove",A),document.removeEventListener("mouseup",k),document.getElementById("content").focus(),o.resizing=!1}function A(e){if(o.resizing){e.preventDefault();var t=s.multiply(o.resizeMatrix,s.add([e.screenX,e.screenY],s.scale([window.screenLeft,window.screenTop],-1),o.dragPointOffset,[1,1]));o.size=s.add(o.initialSize,t),o.size[0]=Math.max(o.size[0],100),o.size[1]=Math.max(o.size[1],50),g(o.size)}}function C(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;u(o.windowKey,{"is-visible":e})}t["a"]={isBYOND:c,winget:l,winset:u,setWindowKey:d,getWindowPosition:h,getWindowSize:f,setWindowPosition:p,setWindowSize:g,getScreenPosition:m,getScreenSize:v,setupDrag:b,dragStartHandler:y,dragEndHandler:w,dragMoveHandler:_,resizeStartHandler:x,resizeEndHandler:k,resizeMoveHandler:A,setVisibility:C}},f183:function(e,t,n){var i=n("d012"),r=n("861d"),s=n("5135"),a=n("9bf2").f,o=n("90e3"),c=n("bb2f"),l=o("meta"),u=0,d=Object.isExtensible||function(){return!0},h=function(e){a(e,l,{value:{objectID:"O"+ ++u,weakData:{}}})},f=function(e,t){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!s(e,l)){if(!d(e))return"F";if(!t)return"E";h(e)}return e[l].objectID},p=function(e,t){if(!s(e,l)){if(!d(e))return!0;if(!t)return!1;h(e)}return e[l].weakData},g=function(e){return c&&m.REQUIRED&&d(e)&&!s(e,l)&&h(e),e},m=e.exports={REQUIRED:!1,fastKey:f,getWeakData:p,onFreeze:g};i[l]=!0},f264:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.manifestLen(e.fixedmanifest)>0?n("div",e._l(e.fixedmanifest,(function(t,i){return n("table",{key:i,class:"border-dept-"+i.toLowerCase()},[n("tr",{class:"bg-dept-"+i.toLowerCase()},[n("th",{staticClass:"fw-bold",attrs:{colspan:"3"}},[e._v(e._s(i))])]),e._l(t,(function(t){return n("tr",{key:t.name,class:{"fw-bold":t.head}},[n("td",[e._v(e._s(t.name))]),n("td",[e._v(e._s(t.rank))]),n("td",[e._v(e._s(t.active))])])}))],2)})),0):n("div",{staticClass:"fst-italic"},[e._v(" There is no crew. ")]),e.allow_printing?n("div",{staticClass:"text-center mt-2"},[n("vui-button",{attrs:{params:{action:"print"},icon:"print"}},[e._v("Print current manifest")])],1):e._e()])},r=[];n("a4d3"),n("e01a"),n("d28b"),n("4de4"),n("4160"),n("a630"),n("e260"),n("fb6a"),n("b0c0"),n("4fad"),n("c1f9"),n("d3b7"),n("07ac"),n("25f0"),n("3ca3"),n("159b"),n("ddb0");function s(e,t){return u(e)||l(e,t)||o(e,t)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){if(e){if("string"===typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n0})))}}},h=d,f=(n("c13e"),n("2877")),p=Object(f["a"])(h,i,r,!1,null,"c49443fe",null);t["default"]=p.exports},f309:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{staticClass:"table border"},[n("div",{staticClass:"header border"},[n("div",{staticClass:"header-item"},[e._v("Name")]),n("div",{staticClass:"header-item"},[n("vui-tooltip",{attrs:{label:"Pulse/Cell"}},[e._v("Pulse rate or Cell Charge (IPCs)")])],1),n("div",{staticClass:"header-item"},[n("vui-tooltip",{attrs:{label:"BP"}},[e._v("Blood pressure")])],1),n("div",{staticClass:"header-item"},[n("vui-tooltip",{attrs:{label:"Oxy"}},[e._v("Oxygenation")])],1),n("div",{staticClass:"header-item"},[n("vui-tooltip",{attrs:{label:"Temp"}},[e._v("Temperature")])],1),n("div",{staticClass:"header-item"},[e._v("Location")]),e.isAI?[n("div",{staticClass:"header-item"})]:e._e()],2),e._l(e.crewmembers,(function(t){return n("div",{key:t.ref,staticClass:"sensor"},[n("div",{staticClass:"item"},[e._v(e._s(t.name)+" ("+e._s(t.ass)+")")]),-1==t.cellCharge?n("div",{staticClass:"item",class:e.getPulseClass(t.tpulse)},[e._v(e._s(t.pulse))]):n("div",{staticClass:"item",class:e.getChargeClass(t.cellCharge)},[e._v(e._s(t.cellCharge)+"%")]),t.stype>1?n("div",{staticClass:"item",class:e.getPressureClass(t.tpressure)},[e._v(e._s(t.pressure))]):n("div",{staticClass:"item"},[e._v("N/A")]),n("div",{staticClass:"item",class:e.getOxyClass(t.oxyg)},[e._v(e._s(e.toOxyLabel(t.oxyg)))]),n("div",{staticClass:"item"},[t.stype>1?n("span",[e._v(e._s(e.roundTemp(t.bodytemp)))]):e._e()]),t.stype>2?n("div",{staticClass:"item"},[e._v(e._s(t.area)+" ("+e._s(t.x)+", "+e._s(t.y)+", "+e._s(t.z)+")")]):n("div",{staticClass:"item"},[e._v("Not Available")]),e.isAI?[n("div",{staticClass:"item"},[n("vui-button",{attrs:{params:{track:t.ref},disabled:t.stype<3}},[e._v("Track")])],1)]:e._e()],2)}))],2)])},r=[],s={data:function(){return this.$root.$data.state},methods:{roundTemp:function(e){return Math.round(10*e)/10},toOxyLabel:function(e){switch(e){case 5:return"increased";case 4:return"normal";case 3:return"low";case 2:return"very low";case 1:return"extremely low";default:return"N/A"}},getOxyClass:function(e){switch(e){case 5:return"highlight";case 4:return"good";case 3:return"average";case 2:return"bad";case 1:return"bad";default:return"neutral"}},getPulseClass:function(e){switch(e){case 0:return"bad";case 1:return"average";case 2:return"good";case 3:return"highlight";case 4:return"average";case 5:return"bad";default:return"neutral"}},getPressureClass:function(e){switch(e){case 1:return"bad";case 2:return"good";case 3:return"average";case 4:return"bad";default:return"neutral"}},getChargeClass:function(e){return e>10?"highlight":"bad"}}},a=s,o=(n("e3a9"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"731c48b4",null);t["default"]=c.exports},f3ce:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"uiTitleWrapper",attrs:{draggable:""},on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startDragging(t)},mouseup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.stopDragging(t)}}},[n("div",{staticClass:"titleBar"},[n("div",{staticClass:"uiStatusIcon uiIcon24",class:e.statusClass,attrs:{unselectable:"on"}}),n("i",{staticClass:"fas ic-bug uiIcon24 uiDebugIcon",class:e.debugClass,attrs:{unselectable:"on"},on:{click:function(t){return e.activateDebug()},mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.prevent(t)}}}),n("div",{staticClass:"uiTitleText",attrs:{unselectable:"on"}},[e._v(e._s(e.title))]),n("div",{staticClass:"uiTitleClose",attrs:{unselectable:"on"},on:{click:function(t){return e.closeUI(t)},mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.prevent(t)}}},[e._v("×")])]),e._t("default")],2)},r=[],s=n("025e"),a=n("f0e0"),o={data:function(){return this.$root.$data},computed:{statusClass:function(){return 2==this.status?"good":1==this.status?"average":"bad"},debugClass:function(){return 1==this.debug_view?"good":1==this.debug?"bad":"hidden"}},methods:{closeUI:function(e){e.stopPropagation(),s["a"].sendToTopicRaw({src:this.uiref,vueuiclose:1}),a["a"].setVisibility(0)},startDragging:function(e){a["a"].dragStartHandler(e)},stopDragging:function(e){a["a"].dragEndHandler(e)},prevent:function(e){e.stopPropagation()},activateDebug:function(){this.debug_view=!this.debug_view,this.debug_view?(document.getElementById("content").classList.add("uiDebug"),document.getElementById("debug").classList.add("uiDebug")):(document.getElementById("content").classList.remove("uiDebug"),document.getElementById("debug").classList.remove("uiDebug"))}}},c=o,l=n("2877"),u=Object(l["a"])(c,i,r,!1,null,null,null);t["default"]=u.exports},f415:function(e,t,n){},f4b3:function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("7b0b"),a=n("c04e"),o=r((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}));i({target:"Date",proto:!0,forced:o},{toJSON:function(e){var t=s(this),n=a(t);return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},f4d9:function(e,t){var n="\\ud800-\\udfff",i="\\u0300-\\u036f",r="\\ufe20-\\ufe2f",s="\\u20d0-\\u20ff",a=i+r+s,o="\\u2700-\\u27bf",c="a-z\\xdf-\\xf6\\xf8-\\xff",l="\\xac\\xb1\\xd7\\xf7",u="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",d="\\u2000-\\u206f",h=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",f="A-Z\\xc0-\\xd6\\xd8-\\xde",p="\\ufe0e\\ufe0f",g=l+u+d+h,m="['’]",v="["+g+"]",b="["+a+"]",y="\\d+",w="["+o+"]",_="["+c+"]",x="[^"+n+g+y+o+c+f+"]",k="\\ud83c[\\udffb-\\udfff]",A="(?:"+b+"|"+k+")",C="[^"+n+"]",E="(?:\\ud83c[\\udde6-\\uddff]){2}",S="[\\ud800-\\udbff][\\udc00-\\udfff]",F="["+f+"]",$="\\u200d",T="(?:"+_+"|"+x+")",L="(?:"+F+"|"+x+")",D="(?:"+m+"(?:d|ll|m|re|s|t|ve))?",B="(?:"+m+"(?:D|LL|M|RE|S|T|VE))?",R=A+"?",O="["+p+"]?",M="(?:"+$+"(?:"+[C,E,S].join("|")+")"+O+R+")*",j="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",I="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",P=O+R+M,N="(?:"+[w,E,S].join("|")+")"+P,W=RegExp([F+"?"+_+"+"+D+"(?="+[v,F,"$"].join("|")+")",L+"+"+B+"(?="+[v,F+T,"$"].join("|")+")",F+"?"+T+"+"+D,F+"+"+B,I,j,y,N].join("|"),"g");function H(e){return e.match(W)||[]}e.exports=H},f4dd:function(e,t,n){"use strict";var i=n("23e7"),r=n("d58f").right,s=n("a640"),a=n("ae40"),o=n("2d00"),c=n("605d"),l=s("reduceRight"),u=a("reduce",{1:0}),d=!c&&o>79&&o<83;i({target:"Array",proto:!0,forced:!l||!u||d},{reduceRight:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}})},f5b2:function(e,t,n){"use strict";var i=n("23e7"),r=n("6547").codeAt;i({target:"String",proto:!0},{codePointAt:function(e){return r(this,e)}})},f5df:function(e,t,n){var i=n("00ee"),r=n("c6b6"),s=n("b622"),a=s("toStringTag"),o="Arguments"==r(function(){return arguments}()),c=function(e,t){try{return e[t]}catch(n){}};e.exports=i?r:function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=c(t=Object(e),a))?n:o?r(t):"Object"==(i=r(t))&&"function"==typeof t.callee?"Arguments":i}},f664:function(e,t,n){var i=n("23e7"),r=n("be8e");i({target:"Math",stat:!0},{fround:r})},f685:function(e,t,n){},f693:function(e,t,n){},f6d6:function(e,t,n){var i=n("23e7"),r=n("23cb"),s=String.fromCharCode,a=String.fromCodePoint,o=!!a&&1!=a.length;i({target:"String",stat:!0,forced:o},{fromCodePoint:function(e){var t,n=[],i=arguments.length,a=0;while(i>a){if(t=+arguments[a++],r(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?s(t):s(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},f748:function(e,t){e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},f772:function(e,t,n){var i=n("5692"),r=n("90e3"),s=i("keys");e.exports=function(e){return s[e]||(s[e]=r(e))}},f785:function(e,t,n){var i=n("2626");i("Array")},f7e3:function(e,t,n){},f889:function(e,t,n){"use strict";n("63bf")},f8c9:function(e,t,n){var i=n("23e7"),r=n("da84"),s=n("d44e");i({global:!0},{Reflect:{}}),s(r.Reflect,"Reflect",!0)},f8cd:function(e,t,n){var i=n("a691");e.exports=function(e){var t=i(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},f9a1:function(e,t,n){"use strict";n("b053")},fa99:function(e,t,n){"use strict";n("8535")},faf6:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"item"},[e.label?n("div",{staticClass:"itemLabel",style:{width:100*(1-e.balance)+"%"}},[e._v(e._s(e.label))]):e._e(),n("div",{staticClass:"itemContent",style:{width:100*(e.label?e.balance:1)+"%"}},[e._t("default")],2)])},r=[],s=(n("a9e3"),{name:"vui-item",props:{label:{type:String,default:""},balance:{type:Number,default:.6}}}),a=s,o=(n("aa68"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"48bbd7cd",null);t["default"]=c.exports},fafb:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.state.failTime?n("div",{staticClass:"notice",staticStyle:{color:"white"}},[n("h3",{staticClass:"fw-bold"},[e._v("SYSTEM FAILURE")]),n("span",{staticClass:"fst-italic"},[e._v("I/O regulator malfuction detected! Waiting for system reboot...")]),n("br"),e._v(" Automatic reboot in "+e._s(e.state.failTime)+" seconds... "),n("vui-button",{attrs:{icon:"sync",params:{reboot:1}}},[e._v("Reboot Now")])],1):n("vui-group",[n("div",{staticClass:"notice"},[e.state.siliconUser?n("div",[n("vui-group-item",{attrs:{label:"Interface Lock:"}},[e.state.locked?n("vui-button",{class:{selected:e.state.locked},attrs:{icon:"lock",params:{toggleaccess:1}}},[e._v("Engaged")]):n("vui-button",{class:{selected:e.state.malfstatus<2&&!e.state.locked},attrs:{icon:"lock-open",params:{toggleaccess:1},disabled:e.state.malfstatus>=2}},[e._v("Disengaged")])],1)],1):n("span",[e._v("Swipe an ID card to "+e._s(e.state.locked?"un":null)+"lock this interface.")])]),n("div",{staticStyle:{"min-width":"480px"}},[n("h3",[e._v("Power Status")]),n("vui-group-item",{attrs:{label:"Main Breaker:"}},[e.state.locked&&!e.state.siliconUser?n("div",[n("span",{class:{good:e.state.isOperating,bad:!e.state.isOperating}},[e._v(e._s(e.state.isOperating?"On":"Off"))])]):n("vui-button",{class:{selected:e.state.isOperating},attrs:{icon:e.state.isOperating?"power-off":"times",params:{breaker:1}}},[e._v(e._s(e.state.isOperating?"On":"Off"))])],1),n("vui-group-item",{attrs:{label:"External Power:"}},[2==e.state.externalPower?n("span",{staticClass:"good"},[e._v("Good")]):1==e.state.externalPower?n("span",{staticClass:"average"},[e._v("Low")]):n("span",{staticClass:"bad"},[e._v("None")])]),n("vui-group-item",{attrs:{label:"Power Cell"}},[null==e.state.powerCellStatus?n("span",{staticClass:"bad"},[e._v("Power cell removed.")]):n("span",[n("vui-progress",{class:e.cellClass,attrs:{value:e.state.powerCellStatus,min:0,max:100}}),n("span",{staticStyle:{width:"60px"}},[e._v(e._s(Math.round(10*e.state.powerCellStatus)/10)+"%")])],1)]),n("vui-group-item",{attrs:{label:"Power Cell charge status:"}},[n("div",{staticClass:"statusValue"},[1==e.state.charge_mode?n("span",[e._v("APC's power cell will run out of charge in "+e._s(e.timeRemaining)+".")]):2==e.state.charge_mode?n("span",[e._v("APC is not charging or discharging.")]):n("span",[e._v("APC will be fully charged in "+e._s(e.timeRemaining)+".")])])]),null!=e.state.powerCellStatus?n("vui-group-item",{attrs:{label:"Charge Mode:"}},[e.state.locked&&!e.state.siliconUser?n("span",{class:{good:e.state.chargeMode,bad:!e.state.chargeMode}},[e._v(e._s(e.state.chargeMode?"Auto":"Off"))]):n("vui-button",{class:{selected:e.state.chargeMode},attrs:{icon:e.state.chargeMode?"sync":"times",params:{cmode:1}}},[e._v(e._s(e.state.chargeMode?"Auto":"Off"))]),e._v(" ["),n("span",{class:e.chargeClass},[e._v(e._s(e.chargeStatus))]),e._v("] ")],1):e._e(),n("vui-group-item",{attrs:{label:"Night Lighting:"}},[n("vui-button",{class:{selected:e.state.lightingMode},attrs:{icon:e.state.lightingMode?"moon":"sun",params:{lmode:e.state.lightingMode?"off":"on"}}},[e._v(e._s(e.state.lightingMode?"On":"Off"))])],1),n("vui-group-item",{attrs:{label:"Emergency Lighting:"}},[n("div",{staticStyle:{width:"105px"}},[e.state.locked&&!e.state.siliconUser?n("span",[e._v(e._s(e.state.emergencyMode?"On":"Off"))]):n("vui-button",{class:{selected:e.state.emergencyMode},attrs:{icon:"lightbulb",params:{emergency_lights:1}}},[e._v(e._s(e.state.emergencyMode?"On":"Off"))])],1)]),n("h3",[e._v("Power Channels")]),e._l(e.state.powerChannels,(function(t,i){return n("vui-group-row",{key:i},[n("div",{staticClass:"itemLabel",staticStyle:{display:"table-cell","vertical-align":"top","padding-right":"8px",width:"4%"}},[e._v(" "+e._s(i)+" "),n("span",{staticStyle:{float:"right"}},[e._v(" ["),n("span",{class:e.channelStatClass(t.status)},[e._v(e._s(e.channelStatus(t.status)))]),e._v("] ["),n("span",{staticClass:"good"},[e._v(e._s(e.channelPower(t.status)))]),e._v("] ")])]),n("div",{staticStyle:{display:"table-cell",width:"10%"}},[n("span",{staticStyle:{width:"70px","text-align":"right",display:"inline-block"}},[e._v(" "+e._s(t.powerLoad)+" W ")]),n("span",{staticStyle:{width:"105px"}},[e._v(" "),e.state.locked?n("span",[1==t.status||3==t.status?n("span",[e._v(" "+e._s(e.channelPower(t.status))+" ")]):e._e()]):e._e()]),e._v(" "),!e.state.locked||e.state.siliconUser?n("span",[n("vui-button",{class:{selected:1==t.status||3==t.status},attrs:{icon:"sync",params:{set:3,chan:i}}},[e._v("Auto")]),n("vui-button",{class:{selected:2==t.status},attrs:{icon:"power-off",params:{set:2,chan:i}}},[e._v("On")]),n("vui-button",{class:{selected:0==t.status},attrs:{icon:"times",params:{set:1,chan:i}}},[e._v("Off")])],1):e._e()])])})),n("vui-group-item",{attrs:{label:"Total Load:"}},[e._v(" "+e._s(e.state.totalLoad)+"W"+e._s(e.state.totalCharging?" (+ "+e.state.totalCharging+"W Charging)":null)+" ")]),n("vui-group-item",{attrs:{balance:.69}}),n("vui-group-item",{attrs:{label:"Cover Lock"}},[e.state.locked&&!e.state.siliconUser?n("div",[e.state.coverLocked?n("span",{class:{good:e.state.coverLocked,bad:!e.state.coverLocked}},[e._v(e._s(e.state.coverLocked?"E":"Dise")+"ngaged")]):e._e()]):n("div",[n("vui-button",{class:{selected:e.state.coverLocked},attrs:{icon:e.state.coverLocked?"lock":"lock-open",params:{lock:1}}},[e._v(e._s(e.state.coverLocked?"E":"Dise")+"ngaged")])],1)]),e.state.siliconUser?n("div",[n("h3",[e._v("System Overrides")]),n("div",[n("vui-button",{attrs:{icon:"lightbulb",params:{overload:1}}},[e._v("Overload Lighting Circuit")]),1==e.state.malfStatus?n("vui-button",{attrs:{icon:"script",params:{malfhack:1}}},[e._v("Override Programming")]):e.state.malfStatus>1?n("span",{staticClass:"notice"},[e._v("APC Hacked")]):e._e()],1)]):e._e()],2)])],1)},r=[],s=(n("4de4"),n("a15b"),{data:function(){return this.$root.$data},computed:{chargeClass:function(){return this.state.chargingStatus>1?"good":1==this.state.chargingStatus?"average":"bad"},chargeStatus:function(){return this.state.chargingStatus>1?"Fully Charged":1==this.state.chargingStatus?"Charging":"Not Charging"},cellClass:function(){return this.state.powerCellStatus>=50?"good":this.state.powerCellStatus>=25?"average":"bad"},timeRemaining:function(){var e=(this.state.time-this.wtime)/10,t=Math.round(e/3600),n=Math.round(e%3600/60),i=Math.round(e%60);return[t>=1&&"".concat(t," hours"),n>=1&&"".concat(n," minutes"),i>=1&&"".concat(i," seconds")].filter(Boolean).join(", ")}},methods:{channelStatus:function(e){return e<=1?"Off":"On"},channelPower:function(e){return 1==e||3==e?"Auto":"Manual"},channelStatClass:function(e){return e<=1?"bad":"good"}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},fb2c:function(e,t,n){var i=n("74e8");i("Uint32",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},fb48:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Group Turret controls:")]),n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelWide"},[e._v(" Behaviour controls are "+e._s(e.settings.locked?"locked":"unlocked")+". ")])]),n("view-turrets-control-part",{attrs:{settings:e.$data}}),n("h2",[e._v("List of turrets and individual controls:")]),e._l(e.turrets,(function(t){return n("div",{key:t.name},[n("h4",[e._v(e._s(t.name))]),n("view-turrets-control-part",{attrs:{settings:t.settings,tref:t.ref}})],1)}))],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},fb6a:function(e,t,n){"use strict";var i=n("23e7"),r=n("861d"),s=n("e8b5"),a=n("23cb"),o=n("50c4"),c=n("fc6a"),l=n("8418"),u=n("b622"),d=n("1dde"),h=n("ae40"),f=d("slice"),p=h("slice",{ACCESSORS:!0,0:0,1:2}),g=u("species"),m=[].slice,v=Math.max;i({target:"Array",proto:!0,forced:!f||!p},{slice:function(e,t){var n,i,u,d=c(this),h=o(d.length),f=a(e,h),p=a(void 0===t?h:t,h);if(s(d)&&(n=d.constructor,"function"!=typeof n||n!==Array&&!s(n.prototype)?r(n)&&(n=n[g],null===n&&(n=void 0)):n=void 0,n===Array||void 0===n))return m.call(d,f,p);for(i=new(void 0===n?Array:n)(v(p-f,0)),u=0;fe.length)&&(t=e.length);for(var n=0,i=new Array(t);n=0&&Math.floor(t)===t&&isFinite(e)}function f(e){return r(e)&&"function"===typeof e.then&&"function"===typeof e.catch}function p(e){return null==e?"":Array.isArray(e)||u(e)&&e.toString===l?JSON.stringify(e,null,2):String(e)}function g(e){var t=parseFloat(e);return isNaN(t)?e:t}function m(e,t){for(var n=Object.create(null),i=e.split(","),r=0;r-1)return e.splice(n,1)}}var w=Object.prototype.hasOwnProperty;function _(e,t){return w.call(e,t)}function x(e){var t=Object.create(null);return function(n){var i=t[n];return i||(t[n]=e(n))}}var k=/-(\w)/g,A=x((function(e){return e.replace(k,(function(e,t){return t?t.toUpperCase():""}))})),C=x((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),E=/\B([A-Z])/g,S=x((function(e){return e.replace(E,"-$1").toLowerCase()}));function F(e,t){function n(n){var i=arguments.length;return i?i>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function $(e,t){return e.bind(t)}var T=Function.prototype.bind?$:F;function L(e,t){t=t||0;var n=e.length-t,i=new Array(n);while(n--)i[n]=e[n+t];return i}function D(e,t){for(var n in t)e[n]=t[n];return e}function B(e){for(var t={},n=0;n0,re=te&&te.indexOf("edge/")>0,se=(te&&te.indexOf("android"),te&&/iphone|ipad|ipod|ios/.test(te)||"ios"===ee),ae=(te&&/chrome\/\d+/.test(te),te&&/phantomjs/.test(te),te&&te.match(/firefox\/(\d+)/)),oe={}.watch,ce=!1;if(Q)try{var le={};Object.defineProperty(le,"passive",{get:function(){ce=!0}}),window.addEventListener("test-passive",null,le)}catch(Jl){}var ue=function(){return void 0===X&&(X=!Q&&!Z&&"undefined"!==typeof e&&(e["process"]&&"server"===e["process"].env.VUE_ENV)),X},de=Q&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function he(e){return"function"===typeof e&&/native code/.test(e.toString())}var fe,pe="undefined"!==typeof Symbol&&he(Symbol)&&"undefined"!==typeof Reflect&&he(Reflect.ownKeys);fe="undefined"!==typeof Set&&he(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ge=R,me=0,ve=function(){this.id=me++,this.subs=[]};ve.prototype.addSub=function(e){this.subs.push(e)},ve.prototype.removeSub=function(e){y(this.subs,e)},ve.prototype.depend=function(){ve.target&&ve.target.addDep(this)},ve.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(s&&!_(r,"default"))a=!1;else if(""===a||a===S(e)){var c=nt(String,r.type);(c<0||o0&&(a=$t(a,(t||"")+"_"+n),Ft(a[0])&&Ft(l)&&(u[c]=Ae(l.text+a[0].text),a.shift()),u.push.apply(u,a)):o(a)?Ft(l)?u[c]=Ae(l.text+a):""!==a&&u.push(Ae(a)):Ft(a)&&Ft(l)?u[c]=Ae(l.text+a.text):(s(e._isVList)&&r(a.tag)&&i(a.key)&&r(t)&&(a.key="__vlist"+t+"_"+n+"__"),u.push(a)));return u}function Tt(e){var t=e.$options.provide;t&&(e._provided="function"===typeof t?t.call(e):t)}function Lt(e){var t=Dt(e.$options.inject,e);t&&(Le(!1),Object.keys(t).forEach((function(n){Me(e,n,t[n])})),Le(!0))}function Dt(e,t){if(e){for(var n=Object.create(null),i=pe?Reflect.ownKeys(e):Object.keys(e),r=0;r0,a=e?!!e.$stable:!s,o=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(a&&i&&i!==n&&o===i.$key&&!s&&!i.$hasNormal)return i;for(var c in r={},e)e[c]&&"$"!==c[0]&&(r[c]=Mt(t,c,e[c]))}else r={};for(var l in t)l in r||(r[l]=jt(t,l));return e&&Object.isExtensible(e)&&(e._normalized=r),q(r,"$stable",a),q(r,"$key",o),q(r,"$hasNormal",s),r}function Mt(e,t,n){var i=function(){var e=arguments.length?n.apply(null,arguments):n({});return e=e&&"object"===typeof e&&!Array.isArray(e)?[e]:St(e),e&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:i,enumerable:!0,configurable:!0}),i}function jt(e,t){return function(){return e[t]}}function It(e,t){var n,i,s,a,o;if(Array.isArray(e)||"string"===typeof e)for(n=new Array(e.length),i=0,s=e.length;i1?L(n):n;for(var i=L(arguments,1),r='event handler for "'+e+'"',s=0,a=n.length;sdocument.createEvent("Event").timeStamp&&(Xn=function(){return Jn.now()})}function Qn(){var e,t;for(Yn=Xn(),Gn=!0,Hn.sort((function(e,t){return e.id-t.id})),qn=0;qnqn&&Hn[n].id>e.id)n--;Hn.splice(n+1,0,e)}else Hn.push(e);zn||(zn=!0,mt(Qn))}}var ii=0,ri=function(e,t,n,i,r){this.vm=e,r&&(e._watcher=this),e._watchers.push(this),i?(this.deep=!!i.deep,this.user=!!i.user,this.lazy=!!i.lazy,this.sync=!!i.sync,this.before=i.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++ii,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new fe,this.newDepIds=new fe,this.expression="","function"===typeof t?this.getter=t:(this.getter=Y(t),this.getter||(this.getter=R)),this.value=this.lazy?void 0:this.get()};ri.prototype.get=function(){var e;ye(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(Jl){if(!this.user)throw Jl;it(Jl,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&bt(e),we(),this.cleanupDeps()}return e},ri.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},ri.prototype.cleanupDeps=function(){var e=this.deps.length;while(e--){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},ri.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():ni(this)},ri.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||c(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(Jl){it(Jl,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},ri.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},ri.prototype.depend=function(){var e=this.deps.length;while(e--)this.deps[e].depend()},ri.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);var e=this.deps.length;while(e--)this.deps[e].removeSub(this);this.active=!1}};var si={enumerable:!0,configurable:!0,get:R,set:R};function ai(e,t,n){si.get=function(){return this[t][n]},si.set=function(e){this[t][n]=e},Object.defineProperty(e,n,si)}function oi(e){e._watchers=[];var t=e.$options;t.props&&ci(e,t.props),t.methods&&mi(e,t.methods),t.data?li(e):Oe(e._data={},!0),t.computed&&hi(e,t.computed),t.watch&&t.watch!==oe&&vi(e,t.watch)}function ci(e,t){var n=e.$options.propsData||{},i=e._props={},r=e.$options._propKeys=[],s=!e.$parent;s||Le(!1);var a=function(s){r.push(s);var a=Qe(s,t,n,e);Me(i,s,a),s in e||ai(e,"_props",s)};for(var o in t)a(o);Le(!0)}function li(e){var t=e.$options.data;t=e._data="function"===typeof t?ui(t,e):t||{},u(t)||(t={});var n=Object.keys(t),i=e.$options.props,r=(e.$options.methods,n.length);while(r--){var s=n[r];0,i&&_(i,s)||G(s)||ai(e,"_data",s)}Oe(t,!0)}function ui(e,t){ye();try{return e.call(t,t)}catch(Jl){return it(Jl,t,"data()"),{}}finally{we()}}var di={lazy:!0};function hi(e,t){var n=e._computedWatchers=Object.create(null),i=ue();for(var r in t){var s=t[r],a="function"===typeof s?s:s.get;0,i||(n[r]=new ri(e,a||R,R,di)),r in e||fi(e,r,s)}}function fi(e,t,n){var i=!ue();"function"===typeof n?(si.get=i?pi(t):gi(n),si.set=R):(si.get=n.get?i&&!1!==n.cache?pi(t):gi(n.get):R,si.set=n.set||R),Object.defineProperty(e,t,si)}function pi(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),ve.target&&t.depend(),t.value}}function gi(e){return function(){return e.call(this,this)}}function mi(e,t){e.$options.props;for(var n in t)e[n]="function"!==typeof t[n]?R:T(t[n],e)}function vi(e,t){for(var n in t){var i=t[n];if(Array.isArray(i))for(var r=0;r-1)return this;var n=L(arguments,1);return n.unshift(this),"function"===typeof e.install?e.install.apply(e,n):"function"===typeof e&&e.apply(null,n),t.push(e),this}}function Si(e){e.mixin=function(e){return this.options=Xe(this.options,e),this}}function Fi(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,i=n.cid,r=e._Ctor||(e._Ctor={});if(r[i])return r[i];var s=e.name||n.options.name;var a=function(e){this._init(e)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=t++,a.options=Xe(n.options,e),a["super"]=n,a.options.props&&$i(a),a.options.computed&&Ti(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,H.forEach((function(e){a[e]=n[e]})),s&&(a.options.components[s]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=D({},a.options),r[i]=a,a}}function $i(e){var t=e.options.props;for(var n in t)ai(e.prototype,"_props",n)}function Ti(e){var t=e.options.computed;for(var n in t)fi(e.prototype,n,t[n])}function Li(e){H.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&u(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"===typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}function Di(e){return e&&(e.Ctor.options.name||e.tag)}function Bi(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"===typeof e?e.split(",").indexOf(t)>-1:!!d(e)&&e.test(t)}function Ri(e,t){var n=e.cache,i=e.keys,r=e._vnode;for(var s in n){var a=n[s];if(a){var o=Di(a.componentOptions);o&&!t(o)&&Oi(n,s,i,r)}}}function Oi(e,t,n,i){var r=e[t];!r||i&&r.tag===i.tag||r.componentInstance.$destroy(),e[t]=null,y(n,t)}_i(Ci),yi(Ci),Ln(Ci),On(Ci),wn(Ci);var Mi=[String,RegExp,Array],ji={name:"keep-alive",abstract:!0,props:{include:Mi,exclude:Mi,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Oi(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",(function(t){Ri(e,(function(e){return Bi(t,e)}))})),this.$watch("exclude",(function(t){Ri(e,(function(e){return!Bi(t,e)}))}))},render:function(){var e=this.$slots.default,t=Cn(e),n=t&&t.componentOptions;if(n){var i=Di(n),r=this,s=r.include,a=r.exclude;if(s&&(!i||!Bi(s,i))||a&&i&&Bi(a,i))return t;var o=this,c=o.cache,l=o.keys,u=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;c[u]?(t.componentInstance=c[u].componentInstance,y(l,u),l.push(u)):(c[u]=t,l.push(u),this.max&&l.length>parseInt(this.max)&&Oi(c,l[0],l,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}},Ii={KeepAlive:ji};function Pi(e){var t={get:function(){return U}};Object.defineProperty(e,"config",t),e.util={warn:ge,extend:D,mergeOptions:Xe,defineReactive:Me},e.set=je,e.delete=Ie,e.nextTick=mt,e.observable=function(e){return Oe(e),e},e.options=Object.create(null),H.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,D(e.options.components,Ii),Ei(e),Si(e),Fi(e),Li(e)}Pi(Ci),Object.defineProperty(Ci.prototype,"$isServer",{get:ue}),Object.defineProperty(Ci.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Ci,"FunctionalRenderContext",{value:Zt}),Ci.version="2.6.12";var Ni=m("style,class"),Wi=m("input,textarea,option,select,progress"),Hi=function(e,t,n){return"value"===n&&Wi(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Vi=m("contenteditable,draggable,spellcheck"),Ui=m("events,caret,typing,plaintext-only"),zi=function(e,t){return Xi(t)||"false"===t?"false":"contenteditable"===e&&Ui(t)?t:"true"},Gi=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),qi="http://www.w3.org/1999/xlink",Ki=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Yi=function(e){return Ki(e)?e.slice(6,e.length):""},Xi=function(e){return null==e||!1===e};function Ji(e){var t=e.data,n=e,i=e;while(r(i.componentInstance))i=i.componentInstance._vnode,i&&i.data&&(t=Qi(i.data,t));while(r(n=n.parent))n&&n.data&&(t=Qi(t,n.data));return Zi(t.staticClass,t.class)}function Qi(e,t){return{staticClass:er(e.staticClass,t.staticClass),class:r(e.class)?[e.class,t.class]:t.class}}function Zi(e,t){return r(e)||r(t)?er(e,tr(t)):""}function er(e,t){return e?t?e+" "+t:e:t||""}function tr(e){return Array.isArray(e)?nr(e):c(e)?ir(e):"string"===typeof e?e:""}function nr(e){for(var t,n="",i=0,s=e.length;i-1?ur[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:ur[e]=/HTMLUnknownElement/.test(t.toString())}var hr=m("text,number,password,search,email,tel,url");function fr(e){if("string"===typeof e){var t=document.querySelector(e);return t||document.createElement("div")}return e}function pr(e,t){var n=document.createElement(e);return"select"!==e||t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n}function gr(e,t){return document.createElementNS(rr[e],t)}function mr(e){return document.createTextNode(e)}function vr(e){return document.createComment(e)}function br(e,t,n){e.insertBefore(t,n)}function yr(e,t){e.removeChild(t)}function wr(e,t){e.appendChild(t)}function _r(e){return e.parentNode}function xr(e){return e.nextSibling}function kr(e){return e.tagName}function Ar(e,t){e.textContent=t}function Cr(e,t){e.setAttribute(t,"")}var Er=Object.freeze({createElement:pr,createElementNS:gr,createTextNode:mr,createComment:vr,insertBefore:br,removeChild:yr,appendChild:wr,parentNode:_r,nextSibling:xr,tagName:kr,setTextContent:Ar,setStyleScope:Cr}),Sr={create:function(e,t){Fr(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Fr(e,!0),Fr(t))},destroy:function(e){Fr(e,!0)}};function Fr(e,t){var n=e.data.ref;if(r(n)){var i=e.context,s=e.componentInstance||e.elm,a=i.$refs;t?Array.isArray(a[n])?y(a[n],s):a[n]===s&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])?a[n].indexOf(s)<0&&a[n].push(s):a[n]=[s]:a[n]=s}}var $r=new _e("",{},[]),Tr=["create","activate","update","remove","destroy"];function Lr(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&r(e.data)===r(t.data)&&Dr(e,t)||s(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&i(t.asyncFactory.error))}function Dr(e,t){if("input"!==e.tag)return!0;var n,i=r(n=e.data)&&r(n=n.attrs)&&n.type,s=r(n=t.data)&&r(n=n.attrs)&&n.type;return i===s||hr(i)&&hr(s)}function Br(e,t,n){var i,s,a={};for(i=t;i<=n;++i)s=e[i].key,r(s)&&(a[s]=i);return a}function Rr(e){var t,n,a={},c=e.modules,l=e.nodeOps;for(t=0;tg?(d=i(n[b+1])?null:n[b+1].elm,k(e,d,n,p,b,s)):p>b&&C(t,h,g)}function F(e,t,n,i){for(var s=n;s-1?zr(e,t,n):Gi(t)?Xi(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Vi(t)?e.setAttribute(t,zi(t,n)):Ki(t)?Xi(n)?e.removeAttributeNS(qi,Yi(t)):e.setAttributeNS(qi,t,n):zr(e,t,n)}function zr(e,t,n){if(Xi(n))e.removeAttribute(t);else{if(ne&&!ie&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var i=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",i)};e.addEventListener("input",i),e.__ieph=!0}e.setAttribute(t,n)}}var Gr={create:Vr,update:Vr};function qr(e,t){var n=t.elm,s=t.data,a=e.data;if(!(i(s.staticClass)&&i(s.class)&&(i(a)||i(a.staticClass)&&i(a.class)))){var o=Ji(t),c=n._transitionClasses;r(c)&&(o=er(o,tr(c))),o!==n._prevClass&&(n.setAttribute("class",o),n._prevClass=o)}}var Kr,Yr,Xr,Jr,Qr,Zr,es={create:qr,update:qr},ts=/[\w).+\-_$\]]/;function ns(e){var t,n,i,r,s,a=!1,o=!1,c=!1,l=!1,u=0,d=0,h=0,f=0;for(i=0;i=0;p--)if(g=e.charAt(p)," "!==g)break;g&&ts.test(g)||(l=!0)}}else void 0===r?(f=i+1,r=e.slice(0,i).trim()):m();function m(){(s||(s=[])).push(e.slice(f,i).trim()),f=i+1}if(void 0===r?r=e.slice(0,i).trim():0!==f&&m(),s)for(i=0;i-1?{exp:e.slice(0,Jr),key:'"'+e.slice(Jr+1)+'"'}:{exp:e,key:null};Yr=e,Jr=Qr=Zr=0;while(!_s())Xr=ws(),xs(Xr)?As(Xr):91===Xr&&ks(Xr);return{exp:e.slice(0,Qr),key:e.slice(Qr+1,Zr)}}function ws(){return Yr.charCodeAt(++Jr)}function _s(){return Jr>=Kr}function xs(e){return 34===e||39===e}function ks(e){var t=1;Qr=Jr;while(!_s())if(e=ws(),xs(e))As(e);else if(91===e&&t++,93===e&&t--,0===t){Zr=Jr;break}}function As(e){var t=e;while(!_s())if(e=ws(),e===t)break}var Cs,Es="__r",Ss="__c";function Fs(e,t,n){n;var i=t.value,r=t.modifiers,s=e.tag,a=e.attrsMap.type;if(e.component)return vs(e,i,r),!1;if("select"===s)Ls(e,i,r);else if("input"===s&&"checkbox"===a)$s(e,i,r);else if("input"===s&&"radio"===a)Ts(e,i,r);else if("input"===s||"textarea"===s)Ds(e,i,r);else{if(!U.isReservedTag(s))return vs(e,i,r),!1}return!0}function $s(e,t,n){var i=n&&n.number,r=fs(e,"value")||"null",s=fs(e,"true-value")||"true",a=fs(e,"false-value")||"false";as(e,"checked","Array.isArray("+t+")?_i("+t+","+r+")>-1"+("true"===s?":("+t+")":":_q("+t+","+s+")")),ds(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+s+"):("+a+");if(Array.isArray($$a)){var $$v="+(i?"_n("+r+")":r)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+bs(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+bs(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+bs(t,"$$c")+"}",null,!0)}function Ts(e,t,n){var i=n&&n.number,r=fs(e,"value")||"null";r=i?"_n("+r+")":r,as(e,"checked","_q("+t+","+r+")"),ds(e,"change",bs(t,r),null,!0)}function Ls(e,t,n){var i=n&&n.number,r='Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(i?"_n(val)":"val")+"})",s="$event.target.multiple ? $$selectedVal : $$selectedVal[0]",a="var $$selectedVal = "+r+";";a=a+" "+bs(t,s),ds(e,"change",a,null,!0)}function Ds(e,t,n){var i=e.attrsMap.type,r=n||{},s=r.lazy,a=r.number,o=r.trim,c=!s&&"range"!==i,l=s?"change":"range"===i?Es:"input",u="$event.target.value";o&&(u="$event.target.value.trim()"),a&&(u="_n("+u+")");var d=bs(t,u);c&&(d="if($event.target.composing)return;"+d),as(e,"value","("+t+")"),ds(e,l,d,null,!0),(o||a)&&ds(e,"blur","$forceUpdate()")}function Bs(e){if(r(e[Es])){var t=ne?"change":"input";e[t]=[].concat(e[Es],e[t]||[]),delete e[Es]}r(e[Ss])&&(e.change=[].concat(e[Ss],e.change||[]),delete e[Ss])}function Rs(e,t,n){var i=Cs;return function r(){var s=t.apply(null,arguments);null!==s&&js(e,r,n,i)}}var Os=ct&&!(ae&&Number(ae[1])<=53);function Ms(e,t,n,i){if(Os){var r=Yn,s=t;t=s._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=r||e.timeStamp<=0||e.target.ownerDocument!==document)return s.apply(this,arguments)}}Cs.addEventListener(e,t,ce?{capture:n,passive:i}:n)}function js(e,t,n,i){(i||Cs).removeEventListener(e,t._wrapper||t,n)}function Is(e,t){if(!i(e.data.on)||!i(t.data.on)){var n=t.data.on||{},r=e.data.on||{};Cs=t.elm,Bs(n),xt(n,r,Ms,js,Rs,t.context),Cs=void 0}}var Ps,Ns={create:Is,update:Is};function Ws(e,t){if(!i(e.data.domProps)||!i(t.data.domProps)){var n,s,a=t.elm,o=e.data.domProps||{},c=t.data.domProps||{};for(n in r(c.__ob__)&&(c=t.data.domProps=D({},c)),o)n in c||(a[n]="");for(n in c){if(s=c[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),s===o[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=s;var l=i(s)?"":String(s);Hs(a,l)&&(a.value=l)}else if("innerHTML"===n&&ar(a.tagName)&&i(a.innerHTML)){Ps=Ps||document.createElement("div"),Ps.innerHTML=""+s+"";var u=Ps.firstChild;while(a.firstChild)a.removeChild(a.firstChild);while(u.firstChild)a.appendChild(u.firstChild)}else if(s!==o[n])try{a[n]=s}catch(Jl){}}}}function Hs(e,t){return!e.composing&&("OPTION"===e.tagName||Vs(e,t)||Us(e,t))}function Vs(e,t){var n=!0;try{n=document.activeElement!==e}catch(Jl){}return n&&e.value!==t}function Us(e,t){var n=e.value,i=e._vModifiers;if(r(i)){if(i.number)return g(n)!==g(t);if(i.trim)return n.trim()!==t.trim()}return n!==t}var zs={create:Ws,update:Ws},Gs=x((function(e){var t={},n=/;(?![^(]*\))/g,i=/:(.+)/;return e.split(n).forEach((function(e){if(e){var n=e.split(i);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}));function qs(e){var t=Ks(e.style);return e.staticStyle?D(e.staticStyle,t):t}function Ks(e){return Array.isArray(e)?B(e):"string"===typeof e?Gs(e):e}function Ys(e,t){var n,i={};if(t){var r=e;while(r.componentInstance)r=r.componentInstance._vnode,r&&r.data&&(n=qs(r.data))&&D(i,n)}(n=qs(e.data))&&D(i,n);var s=e;while(s=s.parent)s.data&&(n=qs(s.data))&&D(i,n);return i}var Xs,Js=/^--/,Qs=/\s*!important$/,Zs=function(e,t,n){if(Js.test(t))e.style.setProperty(t,n);else if(Qs.test(n))e.style.setProperty(S(t),n.replace(Qs,""),"important");else{var i=ta(t);if(Array.isArray(n))for(var r=0,s=n.length;r-1?t.split(ra).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function aa(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(ra).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{var n=" "+(e.getAttribute("class")||"")+" ",i=" "+t+" ";while(n.indexOf(i)>=0)n=n.replace(i," ");n=n.trim(),n?e.setAttribute("class",n):e.removeAttribute("class")}}function oa(e){if(e){if("object"===typeof e){var t={};return!1!==e.css&&D(t,ca(e.name||"v")),D(t,e),t}return"string"===typeof e?ca(e):void 0}}var ca=x((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),la=Q&&!ie,ua="transition",da="animation",ha="transition",fa="transitionend",pa="animation",ga="animationend";la&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ha="WebkitTransition",fa="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(pa="WebkitAnimation",ga="webkitAnimationEnd"));var ma=Q?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function va(e){ma((function(){ma(e)}))}function ba(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),sa(e,t))}function ya(e,t){e._transitionClasses&&y(e._transitionClasses,t),aa(e,t)}function wa(e,t,n){var i=xa(e,t),r=i.type,s=i.timeout,a=i.propCount;if(!r)return n();var o=r===ua?fa:ga,c=0,l=function(){e.removeEventListener(o,u),n()},u=function(t){t.target===e&&++c>=a&&l()};setTimeout((function(){c0&&(n=ua,u=a,d=s.length):t===da?l>0&&(n=da,u=l,d=c.length):(u=Math.max(a,l),n=u>0?a>l?ua:da:null,d=n?n===ua?s.length:c.length:0);var h=n===ua&&_a.test(i[ha+"Property"]);return{type:n,timeout:u,propCount:d,hasTransform:h}}function ka(e,t){while(e.length1}function $a(e,t){!0!==t.data.show&&Ca(t)}var Ta=Q?{create:$a,activate:$a,remove:function(e,t){!0!==e.data.show?Ea(e,t):t()}}:{},La=[Gr,es,Ns,zs,ia,Ta],Da=La.concat(Hr),Ba=Rr({nodeOps:Er,modules:Da});ie&&document.addEventListener("selectionchange",(function(){var e=document.activeElement;e&&e.vmodel&&Wa(e,"input")}));var Ra={inserted:function(e,t,n,i){"select"===n.tag?(i.elm&&!i.elm._vOptions?kt(n,"postpatch",(function(){Ra.componentUpdated(e,t,n)})):Oa(e,t,n.context),e._vOptions=[].map.call(e.options,Ia)):("textarea"===n.tag||hr(e.type))&&(e._vModifiers=t.modifiers,t.modifiers.lazy||(e.addEventListener("compositionstart",Pa),e.addEventListener("compositionend",Na),e.addEventListener("change",Na),ie&&(e.vmodel=!0)))},componentUpdated:function(e,t,n){if("select"===n.tag){Oa(e,t,n.context);var i=e._vOptions,r=e._vOptions=[].map.call(e.options,Ia);if(r.some((function(e,t){return!I(e,i[t])}))){var s=e.multiple?t.value.some((function(e){return ja(e,r)})):t.value!==t.oldValue&&ja(t.value,r);s&&Wa(e,"change")}}}};function Oa(e,t,n){Ma(e,t,n),(ne||re)&&setTimeout((function(){Ma(e,t,n)}),0)}function Ma(e,t,n){var i=t.value,r=e.multiple;if(!r||Array.isArray(i)){for(var s,a,o=0,c=e.options.length;o-1,a.selected!==s&&(a.selected=s);else if(I(Ia(a),i))return void(e.selectedIndex!==o&&(e.selectedIndex=o));r||(e.selectedIndex=-1)}}function ja(e,t){return t.every((function(t){return!I(t,e)}))}function Ia(e){return"_value"in e?e._value:e.value}function Pa(e){e.target.composing=!0}function Na(e){e.target.composing&&(e.target.composing=!1,Wa(e.target,"input"))}function Wa(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Ha(e){return!e.componentInstance||e.data&&e.data.transition?e:Ha(e.componentInstance._vnode)}var Va={bind:function(e,t,n){var i=t.value;n=Ha(n);var r=n.data&&n.data.transition,s=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;i&&r?(n.data.show=!0,Ca(n,(function(){e.style.display=s}))):e.style.display=i?s:"none"},update:function(e,t,n){var i=t.value,r=t.oldValue;if(!i!==!r){n=Ha(n);var s=n.data&&n.data.transition;s?(n.data.show=!0,i?Ca(n,(function(){e.style.display=e.__vOriginalDisplay})):Ea(n,(function(){e.style.display="none"}))):e.style.display=i?e.__vOriginalDisplay:"none"}},unbind:function(e,t,n,i,r){r||(e.style.display=e.__vOriginalDisplay)}},Ua={model:Ra,show:Va},za={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Ga(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Ga(Cn(t.children)):e}function qa(e){var t={},n=e.$options;for(var i in n.propsData)t[i]=e[i];var r=n._parentListeners;for(var s in r)t[A(s)]=r[s];return t}function Ka(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}function Ya(e){while(e=e.parent)if(e.data.transition)return!0}function Xa(e,t){return t.key===e.key&&t.tag===e.tag}var Ja=function(e){return e.tag||An(e)},Qa=function(e){return"show"===e.name},Za={name:"transition",props:za,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(Ja),n.length)){0;var i=this.mode;0;var r=n[0];if(Ya(this.$vnode))return r;var s=Ga(r);if(!s)return r;if(this._leaving)return Ka(e,r);var a="__transition-"+this._uid+"-";s.key=null==s.key?s.isComment?a+"comment":a+s.tag:o(s.key)?0===String(s.key).indexOf(a)?s.key:a+s.key:s.key;var c=(s.data||(s.data={})).transition=qa(this),l=this._vnode,u=Ga(l);if(s.data.directives&&s.data.directives.some(Qa)&&(s.data.show=!0),u&&u.data&&!Xa(s,u)&&!An(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var d=u.data.transition=D({},c);if("out-in"===i)return this._leaving=!0,kt(d,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),Ka(e,r);if("in-out"===i){if(An(s))return l;var h,f=function(){h()};kt(c,"afterEnter",f),kt(c,"enterCancelled",f),kt(d,"delayLeave",(function(e){h=e}))}}return r}}},eo=D({tag:String,moveClass:String},za);delete eo.mode;var to={props:eo,beforeMount:function(){var e=this,t=this._update;this._update=function(n,i){var r=Bn(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,r(),t.call(e,n,i)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),i=this.prevChildren=this.children,r=this.$slots.default||[],s=this.children=[],a=qa(this),o=0;oc&&(o.push(s=e.slice(c,r)),a.push(JSON.stringify(s)));var l=ns(i[1].trim());a.push("_s("+l+")"),o.push({"@binding":l}),c=r+i[0].length}return c\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ko=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ao="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+z.source+"]*",Co="((?:"+Ao+"\\:)?"+Ao+")",Eo=new RegExp("^<"+Co),So=/^\s*(\/?)>/,Fo=new RegExp("^<\\/"+Co+"[^>]*>"),$o=/^]+>/i,To=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Oo=/&(?:lt|gt|quot|amp|#39);/g,Mo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,jo=m("pre,textarea",!0),Io=function(e,t){return e&&jo(e)&&"\n"===t[0]};function Po(e,t){var n=t?Mo:Oo;return e.replace(n,(function(e){return Ro[e]}))}function No(e,t){var n,i,r=[],s=t.expectHTML,a=t.isUnaryTag||O,o=t.canBeLeftOpenTag||O,c=0;while(e){if(n=e,i&&Do(i)){var l=0,u=i.toLowerCase(),d=Bo[u]||(Bo[u]=new RegExp("([\\s\\S]*?)(]*>)","i")),h=e.replace(d,(function(e,n,i){return l=i.length,Do(u)||"noscript"===u||(n=n.replace(//g,"$1").replace(//g,"$1")),Io(u,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));c+=e.length-h.length,e=h,E(u,c-l,c)}else{var f=e.indexOf("<");if(0===f){if(To.test(e)){var p=e.indexOf("--\x3e");if(p>=0){t.shouldKeepComment&&t.comment(e.substring(4,p),c,c+p+3),k(p+3);continue}}if(Lo.test(e)){var g=e.indexOf("]>");if(g>=0){k(g+2);continue}}var m=e.match($o);if(m){k(m[0].length);continue}var v=e.match(Fo);if(v){var b=c;k(v[0].length),E(v[1],b,c);continue}var y=A();if(y){C(y),Io(y.tagName,e)&&k(1);continue}}var w=void 0,_=void 0,x=void 0;if(f>=0){_=e.slice(f);while(!Fo.test(_)&&!Eo.test(_)&&!To.test(_)&&!Lo.test(_)){if(x=_.indexOf("<",1),x<0)break;f+=x,_=e.slice(f)}w=e.substring(0,f)}f<0&&(w=e),w&&k(w.length),t.chars&&w&&t.chars(w,c-w.length,c)}if(e===n){t.chars&&t.chars(e);break}}function k(t){c+=t,e=e.substring(t)}function A(){var t=e.match(Eo);if(t){var n,i,r={tagName:t[1],attrs:[],start:c};k(t[0].length);while(!(n=e.match(So))&&(i=e.match(ko)||e.match(xo)))i.start=c,k(i[0].length),i.end=c,r.attrs.push(i);if(n)return r.unarySlash=n[1],k(n[0].length),r.end=c,r}}function C(e){var n=e.tagName,c=e.unarySlash;s&&("p"===i&&_o(n)&&E(i),o(n)&&i===n&&E(n));for(var l=a(n)||!!c,u=e.attrs.length,d=new Array(u),h=0;h=0;a--)if(r[a].lowerCasedTag===o)break}else a=0;if(a>=0){for(var l=r.length-1;l>=a;l--)t.end&&t.end(r[l].tag,n,s);r.length=a,i=a&&r[a-1].tag}else"br"===o?t.start&&t.start(e,[],!0,n,s):"p"===o&&(t.start&&t.start(e,[],!1,n,s),t.end&&t.end(e,n,s))}E()}var Wo,Ho,Vo,Uo,zo,Go,qo,Ko,Yo=/^@|^v-on:/,Xo=/^v-|^@|^:|^#/,Jo=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Qo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Zo=/^\(|\)$/g,ec=/^\[.*\]$/,tc=/:(.*)$/,nc=/^:|^\.|^v-bind:/,ic=/\.[^.\]]+(?=[^\]]*$)/g,rc=/^v-slot(:|$)|^#/,sc=/[\r\n]/,ac=/\s+/g,oc=x(bo.decode),cc="_empty_";function lc(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:Tc(t),rawAttrsMap:{},parent:n,children:[]}}function uc(e,t){Wo=t.warn||rs,Go=t.isPreTag||O,qo=t.mustUseProp||O,Ko=t.getTagNamespace||O;var n=t.isReservedTag||O;(function(e){return!!e.component||!n(e.tag)}),Vo=ss(t.modules,"transformNode"),Uo=ss(t.modules,"preTransformNode"),zo=ss(t.modules,"postTransformNode"),Ho=t.delimiters;var i,r,s=[],a=!1!==t.preserveWhitespace,o=t.whitespace,c=!1,l=!1;function u(e){if(d(e),c||e.processed||(e=fc(e,t)),s.length||e===i||i.if&&(e.elseif||e.else)&&_c(i,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)yc(e,r);else{if(e.slotScope){var n=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[n]=e}r.children.push(e),e.parent=r}e.children=e.children.filter((function(e){return!e.slotScope})),d(e),e.pre&&(c=!1),Go(e.tag)&&(l=!1);for(var a=0;a|^function(?:\s+[\w$]+)?\s*\(/,el=/\([^)]*?\);*$/,tl=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,nl={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},il={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},rl=function(e){return"if("+e+")return null;"},sl={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:rl("$event.target !== $event.currentTarget"),ctrl:rl("!$event.ctrlKey"),shift:rl("!$event.shiftKey"),alt:rl("!$event.altKey"),meta:rl("!$event.metaKey"),left:rl("'button' in $event && $event.button !== 0"),middle:rl("'button' in $event && $event.button !== 1"),right:rl("'button' in $event && $event.button !== 2")};function al(e,t){var n=t?"nativeOn:":"on:",i="",r="";for(var s in e){var a=ol(e[s]);e[s]&&e[s].dynamic?r+=s+","+a+",":i+='"'+s+'":'+a+","}return i="{"+i.slice(0,-1)+"}",r?n+"_d("+i+",["+r.slice(0,-1)+"])":n+i}function ol(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return ol(e)})).join(",")+"]";var t=tl.test(e.value),n=Zc.test(e.value),i=tl.test(e.value.replace(el,""));if(e.modifiers){var r="",s="",a=[];for(var o in e.modifiers)if(sl[o])s+=sl[o],nl[o]&&a.push(o);else if("exact"===o){var c=e.modifiers;s+=rl(["ctrl","shift","alt","meta"].filter((function(e){return!c[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else a.push(o);a.length&&(r+=cl(a)),s&&(r+=s);var l=t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":i?"return "+e.value:e.value;return"function($event){"+r+l+"}"}return t||n?e.value:"function($event){"+(i?"return "+e.value:e.value)+"}"}function cl(e){return"if(!$event.type.indexOf('key')&&"+e.map(ll).join("&&")+")return null;"}function ll(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=nl[e],i=il[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(i)+")"}function ul(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}}function dl(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}}var hl={on:ul,bind:dl,cloak:R},fl=function(e){this.options=e,this.warn=e.warn||rs,this.transforms=ss(e.modules,"transformCode"),this.dataGenFns=ss(e.modules,"genData"),this.directives=D(D({},hl),e.directives);var t=e.isReservedTag||O;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function pl(e,t){var n=new fl(t),i=e?gl(e,n):'_c("div")';return{render:"with(this){return "+i+"}",staticRenderFns:n.staticRenderFns}}function gl(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return ml(e,t);if(e.once&&!e.onceProcessed)return vl(e,t);if(e.for&&!e.forProcessed)return wl(e,t);if(e.if&&!e.ifProcessed)return bl(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return Rl(e,t);var n;if(e.component)n=Ol(e.component,e,t);else{var i;(!e.plain||e.pre&&t.maybeComponent(e))&&(i=_l(e,t));var r=e.inlineTemplate?null:Fl(e,t,!0);n="_c('"+e.tag+"'"+(i?","+i:"")+(r?","+r:"")+")"}for(var s=0;s>>0}function El(e){return 1===e.type&&("slot"===e.tag||e.children.some(El))}function Sl(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return bl(e,t,Sl,"null");if(e.for&&!e.forProcessed)return wl(e,t,Sl);var i=e.slotScope===cc?"":String(e.slotScope),r="function("+i+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Fl(e,t)||"undefined")+":undefined":Fl(e,t)||"undefined":gl(e,t))+"}",s=i?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+r+s+"}"}function Fl(e,t,n,i,r){var s=e.children;if(s.length){var a=s[0];if(1===s.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var o=n?t.maybeComponent(a)?",1":",0":"";return""+(i||gl)(a,t)+o}var c=n?$l(s,t.maybeComponent):0,l=r||Ll;return"["+s.map((function(e){return l(e,t)})).join(",")+"]"+(c?","+c:"")}}function $l(e,t){for(var n=0,i=0;i':'
    ',Wl.innerHTML.indexOf(" ")>0}var Gl=!!Q&&zl(!1),ql=!!Q&&zl(!0),Kl=x((function(e){var t=fr(e);return t&&t.innerHTML})),Yl=Ci.prototype.$mount;function Xl(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}Ci.prototype.$mount=function(e,t){if(e=e&&fr(e),e===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var i=n.template;if(i)if("string"===typeof i)"#"===i.charAt(0)&&(i=Kl(i));else{if(!i.nodeType)return this;i=i.innerHTML}else e&&(i=Xl(e));if(i){0;var r=Ul(i,{outputSourceRange:!1,shouldDecodeNewlines:Gl,shouldDecodeNewlinesForHref:ql,delimiters:n.delimiters,comments:n.comments},this),s=r.render,a=r.staticRenderFns;n.render=s,n.staticRenderFns=a}}return Yl.call(this,e,t)},Ci.compile=Ul,t["a"]=Ci}).call(this,n("c8ba"))},a078:function(e,t,n){var i=n("7b0b"),r=n("50c4"),s=n("35a1"),a=n("e95a"),o=n("0366"),c=n("ebb5").aTypedArrayConstructor;e.exports=function(e){var t,n,l,u,d,h,f=i(e),p=arguments.length,g=p>1?arguments[1]:void 0,m=void 0!==g,v=s(f);if(void 0!=v&&!a(v)){d=v.call(f),h=d.next,f=[];while(!(u=h.call(d)).done)f.push(u.value)}for(m&&p>2&&(g=o(g,arguments[2],2)),n=r(f.length),l=new(c(this))(n),t=0;n>t;t++)l[t]=m?g(f[t],t):f[t];return l}},a15b:function(e,t,n){"use strict";var i=n("23e7"),r=n("44ad"),s=n("fc6a"),a=n("a640"),o=[].join,c=r!=Object,l=a("join",",");i({target:"Array",proto:!0,forced:c||!l},{join:function(e){return o.call(s(this),void 0===e?",":e)}})},a1f0:function(e,t,n){"use strict";var i=n("23e7"),r=n("9ed3"),s=n("1d80"),a=n("50c4"),o=n("1c0b"),c=n("825a"),l=n("c6b6"),u=n("44e7"),d=n("ad6d"),h=n("9112"),f=n("d039"),p=n("b622"),g=n("4840"),m=n("8aa5"),v=n("69f3"),b=n("c430"),y=p("matchAll"),w="RegExp String",_=w+" Iterator",x=v.set,k=v.getterFor(_),A=RegExp.prototype,C=A.exec,E="".matchAll,S=!!E&&!f((function(){"a".matchAll(/./)})),F=function(e,t){var n,i=e.exec;if("function"==typeof i){if(n=i.call(e,t),"object"!=typeof n)throw TypeError("Incorrect exec result");return n}return C.call(e,t)},$=r((function(e,t,n,i){x(this,{type:_,regexp:e,string:t,global:n,unicode:i,done:!1})}),w,(function(){var e=k(this);if(e.done)return{value:void 0,done:!0};var t=e.regexp,n=e.string,i=F(t,n);return null===i?{value:void 0,done:e.done=!0}:e.global?(""==String(i[0])&&(t.lastIndex=m(n,a(t.lastIndex),e.unicode)),{value:i,done:!1}):(e.done=!0,{value:i,done:!1})})),T=function(e){var t,n,i,r,s,o,l=c(this),u=String(e);return t=g(l,RegExp),n=l.flags,void 0===n&&l instanceof RegExp&&!("flags"in A)&&(n=d.call(l)),i=void 0===n?"":String(n),r=new t(t===RegExp?l.source:l,i),s=!!~i.indexOf("g"),o=!!~i.indexOf("u"),r.lastIndex=a(l.lastIndex),new $(r,u,s,o)};i({target:"String",proto:!0,forced:S},{matchAll:function(e){var t,n,i,r,a=s(this);if(null!=e){if(u(e)&&(t=String(s("flags"in A?e.flags:d.call(e))),!~t.indexOf("g")))throw TypeError("`.matchAll` does not allow non-global regexes");if(S)return E.apply(a,arguments);if(i=e[y],void 0===i&&b&&"RegExp"==l(e)&&(i=T),null!=i)return o(i).call(e,a)}else if(S)return E.apply(a,arguments);return n=String(a),r=new RegExp(e,"g"),b?T.call(r,n):r[y](n)}}),b||y in A||h(A,y,T)},a2bf:function(e,t,n){"use strict";var i=n("e8b5"),r=n("50c4"),s=n("0366"),a=function(e,t,n,o,c,l,u,d){var h,f=c,p=0,g=!!u&&s(u,d,3);while(p0&&i(h))f=a(e,t,h,r(h.length),f,l-1)-1;else{if(f>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[f]=h}f++}p++}return f};e.exports=a},a2de:function(e,t,n){"use strict";n("63f9")},a3f9:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-button",{attrs:{params:{close:1,code:e.code}}},[e._v("Save and Close")]),n("vui-button",{attrs:{params:{execute:1,code:e.code}}},[e._v("Save and Execute")]),n("vui-button",{attrs:{params:{close:1,code:e.s.code}}},[e._v("Close")]),n("editor",{attrs:{lang:"javascript",theme:"monokai",width:"100%",height:"50em"},on:{init:e.editorInit},model:{value:e.code,callback:function(t){e.code=t},expression:"code"}})],1)},r=[],s={data:function(){return{s:this.$root.$data.state,code:'Term.write("AAA")'}},components:{editor:n("7c9e")},created:function(){this.code=this.s.code},methods:{editorInit:function(){n("2099"),n("bb36"),n("14d4"),n("6a21")}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},a434:function(e,t,n){"use strict";var i=n("23e7"),r=n("23cb"),s=n("a691"),a=n("50c4"),o=n("7b0b"),c=n("65f0"),l=n("8418"),u=n("1dde"),d=n("ae40"),h=u("splice"),f=d("splice",{ACCESSORS:!0,0:0,1:2}),p=Math.max,g=Math.min,m=9007199254740991,v="Maximum allowed length exceeded";i({target:"Array",proto:!0,forced:!h||!f},{splice:function(e,t){var n,i,u,d,h,f,b=o(this),y=a(b.length),w=r(e,y),_=arguments.length;if(0===_?n=i=0:1===_?(n=0,i=y-w):(n=_-2,i=g(p(s(t),0),y-w)),y+n-i>m)throw TypeError(v);for(u=c(b,i),d=0;dy-i+n;d--)delete b[d-1]}else if(n>i)for(d=y-i;d>w;d--)h=d+i-1,f=d+n-1,h in b?b[f]=b[h]:delete b[f];for(d=0;ds)r.push(arguments[s++]);if(i=t,(f(t)||void 0!==e)&&!oe(e))return h(t)||(t=function(e,t){if("function"==typeof i&&(t=i.call(this,e,t)),!oe(t))return t}),r[1]=t,q.apply(null,r)}})}G[W][H]||S(G[W],H,G[W].valueOf),M(G,N),L[P]=!0},a4ec:function(e,t,n){},a589:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.on?[e.pastHalfTime?[e.ingredientsPresent?e.failed?n("p",[e._v("Something doesn't look right...")]):n("p",[e._v("It's cooking nicely!")]):n("p",[e._v("There's nothing inside. Microwave's working, though!")])]:n("p",[e._v("It's starting to cook...")]),n("vui-progress",{attrs:{value:e.$root.$data.wtime,min:e.start_time,max:e.start_time+e.cook_time}}),n("vui-button",{staticClass:"danger danger-control",attrs:{icon:"exclamation-triangle",params:{abort:1}}},[e._v("Abort!")])]:[n("h4",[e._v("Ingredients")]),n("ul",[e.ingredientsPresent?e._e():n("li",[e._v("The microwave is empty!")]),e._l(e.cookingobjs,(function(t,i){return n("li",{key:i},[n("vui-button",{attrs:{params:{eject:i}}},[e._v(" "+e._s(i)+" • "+e._s(t)+" ")])],1)})),e._l(e.cookingreas,(function(t,i){return n("li",{key:i},[n("vui-button",{attrs:{params:{eject:i}}},[e._v(" "+e._s(i)+" • "+e._s(t)+" units ")])],1)}))],2),n("vui-button",{staticClass:"danger danger-control",attrs:{icon:"trash",params:{eject_all:1}}},[e._v("Eject All")]),n("vui-button",{staticClass:"control",attrs:{params:{cook:1}}},[e._v("Cook!")])]],2)},r=[],s=(n("b64b"),{data:function(){return this.$root.$data.state},computed:{ingredientsPresent:function(){return Object.keys(this.cookingobjs).length>0||Object.keys(this.cookingreas).length>0},pastHalfTime:function(){return this.$root.$data.wtime>this.start_time+this.cook_time/2}}}),a=s,o=(n("e48d"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"2005209a",null);t["default"]=c.exports},a5e6:function(e,t,n){},a623:function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").every,s=n("a640"),a=n("ae40"),o=s("every"),c=a("every");i({target:"Array",proto:!0,forced:!o||!c},{every:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}})},a630:function(e,t,n){var i=n("23e7"),r=n("4df4"),s=n("1c7e"),a=!s((function(e){Array.from(e)}));i({target:"Array",stat:!0,forced:a},{from:r})},a640:function(e,t,n){"use strict";var i=n("d039");e.exports=function(e,t){var n=[][e];return!!n&&i((function(){n.call(null,t||function(){throw 1},1)}))}},a691:function(e,t){var n=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:n)(e)}},a6fd:function(e,t,n){var i=n("23e7"),r=n("d066"),s=n("1c0b"),a=n("825a"),o=n("d039"),c=r("Reflect","apply"),l=Function.apply,u=!o((function(){c((function(){}))}));i({target:"Reflect",stat:!0,forced:u},{apply:function(e,t,n){return s(e),a(n),c?c(e,t,n):l.call(e,t,n)}})},a79d:function(e,t,n){"use strict";var i=n("23e7"),r=n("c430"),s=n("fea9"),a=n("d039"),o=n("d066"),c=n("4840"),l=n("cdf9"),u=n("6eeb"),d=!!s&&a((function(){s.prototype["finally"].call({then:function(){}},(function(){}))}));i({target:"Promise",proto:!0,real:!0,forced:d},{finally:function(e){var t=c(this,o("Promise")),n="function"==typeof e;return this.then(n?function(n){return l(t,e()).then((function(){return n}))}:e,n?function(n){return l(t,e()).then((function(){throw n}))}:e)}}),r||"function"!=typeof s||s.prototype["finally"]||u(s.prototype,"finally",o("Promise").prototype["finally"])},a7c6:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("view-mcomputer-ntsl-"+e.s.mode,{tag:"component"})],1)},r=[],s={data:function(){return{s:this.$root.$data.state}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},a874:function(e,t,n){var i=n("23e7"),r=n("145e"),s=n("44d2");i({target:"Array",proto:!0},{copyWithin:r}),s("copyWithin")},a8bb:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._v(" You are not authenticated. Please login to continue. "),n("vui-button",{attrs:{params:{login:1}}},[e._v("Login")])],1)},r=[],s=n("2877"),a={},o=Object(s["a"])(a,i,r,!1,null,null,null);t["default"]=o.exports},a919:function(e,t,n){var i=n("ddc6"),r={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},s=i(r);e.exports=s},a975:function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").every,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("every",(function(e){return r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},a981:function(e,t){e.exports="undefined"!==typeof ArrayBuffer&&"undefined"!==typeof DataView},a9e3:function(e,t,n){"use strict";var i=n("83ab"),r=n("da84"),s=n("94ca"),a=n("6eeb"),o=n("5135"),c=n("c6b6"),l=n("7156"),u=n("c04e"),d=n("d039"),h=n("7c73"),f=n("241c").f,p=n("06cf").f,g=n("9bf2").f,m=n("58a8").trim,v="Number",b=r[v],y=b.prototype,w=c(h(y))==v,_=function(e){var t,n,i,r,s,a,o,c,l=u(e,!1);if("string"==typeof l&&l.length>2)if(l=m(l),t=l.charCodeAt(0),43===t||45===t){if(n=l.charCodeAt(2),88===n||120===n)return NaN}else if(48===t){switch(l.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+l}for(s=l.slice(2),a=s.length,o=0;or)return NaN;return parseInt(s,i)}return+l};if(s(v,!b(" 0o1")||!b("0b1")||b("+0x1"))){for(var x,k=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof k&&(w?d((function(){y.valueOf.call(n)})):c(n)!=v)?l(new b(_(t)),n,k):_(t)},A=i?f(b):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),C=0;A.length>C;C++)o(b,x=A[C])&&!o(k,x)&&g(k,x,p(b,x));k.prototype=y,y.constructor=k,a(r,v,k)}},a9fa:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("h3",[e._v("Limbs")]),n("table",{staticClass:"table border"},[e._m(0),e._l(e.limbs,(function(t,i){return n("tr",{key:i,staticClass:"item border"},[n("td",{staticStyle:{width:"20%"}},[e._v(e._s(i))]),n("td",[n("vui-button",{attrs:{params:{target:"limb",name:i,action:"brute"}}},[e._v("Brute")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"burn"}}},[e._v("Burn")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"infection"}}},[e._v("Infection")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"shatter"}}},[e._v("Shatter")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"arterial"}}},[e._v("Arterial")]),n("vui-button",{attrs:{params:{target:"limb",name:i,action:"sever"}}},[e._v("Sever")])],1)])}))],2)]),n("div",[n("h3",[e._v("Organs")]),n("table",{staticClass:"table border"},[e._m(1),e._l(e.organs,(function(t,i){return n("tr",{key:i,staticClass:"item border"},[n("td",{staticStyle:{width:"20%"}},[e._v(e._s(i))]),n("td",[n("vui-button",{attrs:{params:{target:"organ",name:i,action:"damage"}}},[e._v("Damage")]),n("vui-button",{attrs:{params:{target:"organ",name:i,action:"infection"}}},[e._v("Infection")]),n("vui-button",{attrs:{params:{target:"organ",name:i,action:"bruise"}}},[e._v("Bruise")]),n("vui-button",{attrs:{params:{target:"organ",name:i,action:"break"}}},[e._v("Break")]),n("vui-button",{attrs:{params:{target:"organ",name:i,action:"remove"}}},[e._v("Remove")])],1)])}))],2)]),n("div",[n("h3",[e._v("Miscellaneous")]),n("vui-button",{attrs:{params:{target:"misc",action:"wind"}}},[e._v("Toggle Wind")]),n("vui-button",{attrs:{params:{target:"misc",action:"gigashatter"}}},[e._v("Gigashatter")]),n("vui-button",{attrs:{params:{target:"misc",action:"kill"}}},[e._v("Kill")]),n("vui-button",{attrs:{params:{target:"misc",action:"gib"}}},[e._v("Gib")])],1)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Name")]),n("th",[e._v("Tools")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Name")]),n("th",[e._v("Tools")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=(n("96f3"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"36dbac0c",null);t["default"]=c.exports},aaec:function(e,t){var n="\\ud800-\\udfff",i="\\u0300-\\u036f",r="\\ufe20-\\ufe2f",s="\\u20d0-\\u20ff",a=i+r+s,o="\\ufe0e\\ufe0f",c="\\u200d",l=RegExp("["+c+n+a+o+"]");function u(e){return l.test(e)}e.exports=u},ab13:function(e,t,n){var i=n("b622"),r=i("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,"/./"[e](t)}catch(i){}}return!1}},ac02:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Chemical Implants")]),n("table",{staticClass:"table border"},[e._m(0),e._l(e.chem_implants,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.implanted_name))]),n("td",[e._v(e._s(t.remaining_units))]),n("td",[n("vui-button",{attrs:{disabled:t.remaining_units<1,params:{inject1:t.ref}}},[e._v("Inject 1u")]),n("vui-button",{attrs:{disabled:t.remaining_units<5,params:{inject5:t.ref}}},[e._v("Inject 5u")]),n("vui-button",{attrs:{disabled:t.remaining_units<10,params:{inject5:t.ref}}},[e._v("Inject 10u")])],1)])}))],2),n("h3",[e._v("Tracking Implants")]),n("table",{staticClass:"table border"},[e._m(1),e._l(e.tracking_implants,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.id))]),n("td",[e._v(e._s(t.loc_display))]),n("td",[n("vui-button",{attrs:{params:{warn:t.ref}}},[e._v("Message Implanted User")])],1)])}))],2)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Implanted User")]),n("th",[e._v("Remaining Chemical Units")]),n("th",[e._v("Options")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("Tracking ID")]),n("th",[e._v("Current Area")]),n("th",[e._v("Options")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=(n("ada8"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"1844f920",null);t["default"]=c.exports},ac16:function(e,t,n){var i=n("23e7"),r=n("825a"),s=n("06cf").f;i({target:"Reflect",stat:!0},{deleteProperty:function(e,t){var n=s(r(e),t);return!(n&&!n.configurable)&&delete e[t]}})},ac1f:function(e,t,n){"use strict";var i=n("23e7"),r=n("9263");i({target:"RegExp",proto:!0,forced:/./.exec!==r},{exec:r})},ac4c:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-input-search",{staticStyle:{display:"block"},attrs:{input:e.records,keys:["id","name","rank","sex","age","fingerprint","blood","dna"]},model:{value:e.filtered,callback:function(t){e.filtered=t},expression:"filtered"}}),e._l(e.filtered,(function(t){return n("div",{key:t.id},[n("vui-button",{attrs:{params:{setactive:t.id},icon:t.has_notes?"align-justify":null,"push-state":""},on:{click:function(t){e.state.activeview=e.state.defaultview}}},[e._v(e._s(t.id)+": "+e._s(t.name)+" ("+e._s(t.rank)+")")])],1)})),n("vui-button",{staticClass:"newrecord",attrs:{"v-if":(1&e.editable)>0,params:{newrecord:1},"push-state":""},on:{click:function(t){e.state.activeview=e.state.defaultview}}},[e._v("New Record")])],2)},r=[],s=(n("07ac"),{data:function(){return{state:this.$root.$data.state,filtered:[]}},computed:{records:function(){return Object.values(this.state.allrecords)}}}),a=s,o=(n("682e"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"df4093f4",null);t["default"]=c.exports},acac:function(e,t,n){"use strict";var i=n("e2cc"),r=n("f183").getWeakData,s=n("825a"),a=n("861d"),o=n("19aa"),c=n("2266"),l=n("b727"),u=n("5135"),d=n("69f3"),h=d.set,f=d.getterFor,p=l.find,g=l.findIndex,m=0,v=function(e){return e.frozen||(e.frozen=new b)},b=function(){this.entries=[]},y=function(e,t){return p(e.entries,(function(e){return e[0]===t}))};b.prototype={get:function(e){var t=y(this,e);if(t)return t[1]},has:function(e){return!!y(this,e)},set:function(e,t){var n=y(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=g(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,l){var d=e((function(e,i){o(e,d,t),h(e,{type:t,id:m++,frozen:void 0}),void 0!=i&&c(i,e[l],{that:e,AS_ENTRIES:n})})),p=f(t),g=function(e,t,n){var i=p(e),a=r(s(t),!0);return!0===a?v(i).set(t,n):a[i.id]=n,e};return i(d.prototype,{delete:function(e){var t=p(this);if(!a(e))return!1;var n=r(e);return!0===n?v(t)["delete"](e):n&&u(n,t.id)&&delete n[t.id]},has:function(e){var t=p(this);if(!a(e))return!1;var n=r(e);return!0===n?v(t).has(e):n&&u(n,t.id)}}),i(d.prototype,n?{get:function(e){var t=p(this);if(a(e)){var n=r(e);return!0===n?v(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return g(this,e,t)}}:{add:function(e){return g(this,e,!0)}}),d}}},accc:function(e,t,n){var i=n("23e7"),r=n("64e5");i({target:"Date",proto:!0,forced:Date.prototype.toISOString!==r},{toISOString:r})},acd8:function(e,t,n){var i=n("23e7"),r=n("7e12");i({global:!0,forced:parseFloat!=r},{parseFloat:r})},ace4:function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("621a"),a=n("825a"),o=n("23cb"),c=n("50c4"),l=n("4840"),u=s.ArrayBuffer,d=s.DataView,h=u.prototype.slice,f=r((function(){return!new u(2).slice(1,void 0).byteLength}));i({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:f},{slice:function(e,t){if(void 0!==h&&void 0===t)return h.call(a(this),e);var n=a(this).byteLength,i=o(e,n),r=o(void 0===t?n:t,n),s=new(l(this,u))(c(r-i)),f=new d(this),p=new d(s),g=0;while(i3}))}},af89:function(e,t,n){"use strict";n("6836")},af93:function(e,t,n){var i=n("23e7"),r=n("861d"),s=n("f183").onFreeze,a=n("bb2f"),o=n("d039"),c=Object.seal,l=o((function(){c(1)}));i({target:"Object",stat:!0,forced:l,sham:!a},{seal:function(e){return c&&r(e)?c(s(e)):e}})},aff5:function(e,t,n){var i=n("23e7");i({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},b041:function(e,t,n){"use strict";var i=n("00ee"),r=n("f5df");e.exports=i?{}.toString:function(){return"[object "+r(this)+"]"}},b053:function(e,t,n){},b087:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.power?n("div",[e.occupant?n("div",[n("div",{staticClass:"columnHolder"},[n("div",{staticClass:"column"},[n("div",[n("h3",[e._v("Occupant Status:")]),n("div",[n("span",{staticClass:"text"},[e._v("Status:")]),e._v(" "),n("span",{style:{color:e.consciousnessLabel(e.stat)}},[e._v(e._s(e.consciousnessText(e.stat)))])]),n("div",[n("span",{staticClass:"text"},[e._v("Stasis Level:")]),e._v(" "+e._s(e.stasis))]),n("div",[n("span",{staticClass:"text"},[e._v("Species:")]),e._v(" "+e._s(e.species))]),n("div",[n("span",{staticClass:"text"},[e._v("Brain Activity:")]),e._v(" "),n("vui-progress",{class:e.progressClass(e.brain_activity),attrs:{value:e.brain_activity}},[e._v(e._s(e.brain_activity)+"%")])],1),n("div",[n("span",{staticClass:"text"},[e._v("Pulse:")]),e._v(" "+e._s(e.pulse))]),n("div",[n("span",{staticClass:"text"},[e._v("BP:")]),e._v(" "),n("span",{style:{color:e.getPressureClass(e.blood_pressure_level)}},[e._v(e._s(e.blood_pressure))])]),n("div",[n("span",{staticClass:"text"},[e._v("Blood Oxygenation:")]),e._v(" "),n("vui-progress",{class:e.progressClass(e.brain_activity),attrs:{value:Math.round(e.blood_o2)}},[e._v(e._s(Math.round(e.blood_o2))+"%")])],1),n("h3",[e._v("Bloodstream Reagents:")]),e.bloodreagents?n("div",[n("table",e._l(e.bloodreagents,(function(t){return n("tr",{key:t.name},[n("td",[n("span",{staticClass:"text"},[e._v(e._s(t.name)+":")])]),n("td",{staticClass:"shifted"},[e._v(e._s(t.amount)+"u")])])})),0)]):n("div",[e._v(" The occupant has no additional reagents in their bloodstream. ")]),n("h3",[e._v("Stomach Reagents:")]),e.hasstomach?n("div",[e.stomachreagents?n("div",[n("table",e._l(e.stomachreagents,(function(t){return n("tr",{key:t.name},[n("td",[n("span",{staticClass:"text"},[e._v(e._s(t.name)+":")])]),n("td",{staticClass:"shifted"},[e._v(e._s(t.amount)+"u")])])})),0)]):n("div",[e._v(" The occupant has nothing in their stomach. ")])]):n("div",[e._v(" The occupant does not have a stomach. ")])])]),n("div",{staticClass:"column"},[n("h3",[e._v("Injectable Reagents:")]),n("table",e._l(e.reagents,(function(t){return n("tr",{key:t.name},[n("td",[n("span",{staticClass:"text"},[e._v(e._s(t.name)+":")])]),n("td",[n("vui-button",{attrs:{params:{chemical:t.type,amount:5}}},[e._v("Inject 5")])],1),n("td",[n("vui-button",{attrs:{params:{chemical:t.type,amount:10}}},[e._v("Inject 10")])],1)])})),0),n("h3",[e._v("Stasis Settings:")]),n("table",[n("tr",e._l(e.stasissettings,(function(t){return n("td",{key:t},[n("vui-button",{attrs:{params:{stasis:t}}},[e._v(e._s(t))])],1)})),0)])])])]):n("div",[e._v(" No occupant. ")])]):n("div",[e._m(0)]),e.occupant?n("div",[n("div",{staticClass:"columnHolder"},[n("div",{staticClass:"float"},[n("vui-button",{attrs:{params:{eject:1}}},[e._v("Eject Occupant")])],1),n("div",{staticClass:"float"},[e.filtering?n("div",[n("vui-button",{attrs:{params:{filter:-1}}},[e._v("Dialysis Active")])],1):n("div",[n("vui-button",{attrs:{params:{filter:1}}},[e._v("Dialysis Inactive")])],1)]),n("div",{staticClass:"float"},[e.pump?n("div",[n("vui-button",{attrs:{params:{pump:-1}}},[e._v("Stomach Pump Active")])],1):n("div",[n("vui-button",{attrs:{params:{pump:1}}},[e._v("Stomach Pump Inactive")])],1)])])]):e._e(),-1!=e.beaker?n("div",[n("span",{staticClass:"text"},[e._v("Beaker:")]),e._v(" "+e._s(e.beaker)+" units of free space remaining. "),n("vui-button",{attrs:{params:{beaker:1}}},[e._v("Eject Beaker")])],1):n("div",[e._v(" No beaker inserted. ")])])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"itemLabel"},[n("h2",[e._v("NO POWER")])])}],s={data:function(){return this.$root.$data.state},methods:{consciousnessLabel:function(e){switch(e){case 0:return"LimeGreen";case 1:return"OrangeRed";case 2:return"Crimson"}},consciousnessText:function(e){switch(e){case 0:return"Conscious";case 1:return"Unconscious";case 2:return"DEAD"}},progressClass:function(e){return e<=50?"bad":e<=90?"average":"good"},getPressureClass:function(e){switch(e){case 1:return"Crimson";case 2:return"LimeGreen";case 3:return"LawnGreen";case 4:return"Crimson";default:return"LightSkyBlue"}}}},a=s,o=(n("27cd"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"3783600c",null);t["default"]=c.exports},b08f:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.detonating?n("div",{staticClass:"notice",staticStyle:{color:"#000000"}},[n("h2",{staticStyle:{color:"#000000"}},[e._v("CRYSTAL DELAMINATING")]),n("h3",{staticStyle:{color:"#000000"}},[e._v("Evacuate area immediately")]),n("div",{staticClass:"clearBoth"})]):n("vui-group",[n("vui-group-row",[n("h3",[e._v("Crystal Integrity")]),n("vui-progress",{class:e.integrity_class,attrs:{value:e.integrity_percentage,min:0,max:100}}),n("b",[e._v(e._s(e.integrity_percentage)+" %")])],1),n("h3",[e._v("Environment")]),n("vui-group-item",{attrs:{label:"Temperature:"}},[n("vui-progress",{class:e.temp_class,attrs:{value:e.ambient_temp,min:0,max:1e4}}),e._v(" "+e._s(e.ambient_temp)+" K ")],1),n("vui-group-item",{attrs:{label:"Pressure:"}},[e._v(" "+e._s(e.ambient_pressure)+" kPa ")])],1)],1)},r=[],s={data:function(){return this.$root.$data.state},computed:{temp_class:function(){return this.ambient_temp>=5e3?"bad":this.ambient_temp>=4e3?"average":"good"},integrity_class:function(){return this.integrity_percentage>=90?"good":this.integrity_percentage>=25?"average":"bad"}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},b0c0:function(e,t,n){var i=n("83ab"),r=n("9bf2").f,s=Function.prototype,a=s.toString,o=/^\s*function ([^ (]*)/,c="name";i&&!(c in s)&&r(s,c,{configurable:!0,get:function(){try{return a.call(this).match(o)[1]}catch(e){return""}}})},b14c:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h2",{staticClass:"white"},[e._v("Welcome, Operative.")]),n("h2",[e._v("Please select your launch target:")]),0==e.status?n("div",[e._m(0),n("div",[n("vui-button",{attrs:{icon:"cog",params:{fire:"arrivals"}}},[e._v("Departures")])],1),n("div",[n("vui-button",{attrs:{icon:"cog",params:{fire:"cargo"}}},[e._v("Cargo Surface")])],1),n("div",[n("vui-button",{attrs:{icon:"cog",params:{fire:"commandescape"}}},[e._v("Command Surface")])],1)]):n("div",[e._v(" Pod status: "),n("span",{staticClass:"bad"},[e._v("Non-operational.")])])])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._v("Pod status: "),n("span",{staticClass:"good"},[e._v("Operational.")])])}],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},b15a:function(e,t,n){},b20a:function(e,t,n){var i=n("6ac0"),r=n("4caa"),s=n("ea72"),a="['’]",o=RegExp(a,"g");function c(e){return function(t){return i(s(r(t).replace(o,"")),e,"")}}e.exports=c},b225:function(e,t,n){},b378:function(e,t){ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"],(function(e,t,n){"use strict";var i=e("./lib/oop"),r=e("./lib/event_emitter").EventEmitter,s=e("./lib/lang"),a=e("./range").Range,o=e("./anchor").Anchor,c=e("./keyboard/hash_handler").HashHandler,l=e("./tokenizer").Tokenizer,u=a.comparePoints,d=function(){this.snippetMap={},this.snippetNameMap={}};(function(){i.implement(this,r),this.getTokenizer=function(){function e(e,t,n){return e=e.substr(1),/^\d+$/.test(e)&&!n.inFormatString?[{tabstopId:parseInt(e,10)}]:[{text:e}]}function t(e){return"(?:[^\\\\"+e+"]|\\\\.)"}return d.$tokenizer=new l({start:[{regex:/:/,onMatch:function(e,t,n){return n.length&&n[0].expectIf?(n[0].expectIf=!1,n[0].elseBranch=n[0],[n[0]]):":"}},{regex:/\\./,onMatch:function(e,t,n){var i=e[1];return"}"==i&&n.length||-1!="`$\\".indexOf(i)?e=i:n.inFormatString&&("n"==i||"t"==i?e="\n":-1!="ulULE".indexOf(i)&&(e={changeCase:i,local:i>"a"})),[e]}},{regex:/}/,onMatch:function(e,t,n){return[n.length?n.shift():e]}},{regex:/\$(?:\d+|\w+)/,onMatch:e},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(t,n,i){var r=e(t.substr(1),n,i);return i.unshift(r[0]),r},next:"snippetVar"},{regex:/\n/,token:"newline",merge:!1}],snippetVar:[{regex:"\\|"+t("\\|")+"*\\|",onMatch:function(e,t,n){n[0].choices=e.slice(1,-1).split(",")},next:"start"},{regex:"/("+t("/")+"+)/(?:("+t("/")+"*)/)(\\w*):?",onMatch:function(e,t,n){var i=n[0];return i.fmtString=e,e=this.splitRegex.exec(e),i.guard=e[1],i.fmt=e[2],i.flag=e[3],""},next:"start"},{regex:"`"+t("`")+"*`",onMatch:function(e,t,n){return n[0].code=e.splice(1,-1),""},next:"start"},{regex:"\\?",onMatch:function(e,t,n){n[0]&&(n[0].expectIf=!0)},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+t("/")+"+)/",token:"regex"},{regex:"",onMatch:function(e,t,n){n.inFormatString=!0},next:"start"}]}),d.prototype.getTokenizer=function(){return d.$tokenizer},d.$tokenizer},this.tokenizeTmSnippet=function(e,t){return this.getTokenizer().getLineTokens(e,t).tokens.map((function(e){return e.value||e}))},this.$getDefaultValue=function(e,t){if(/^[A-Z]\d+$/.test(t)){var n=t.substr(1);return(this.variables[t[0]+"__"]||{})[n]}if(/^\d+$/.test(t))return(this.variables.__||{})[t];if(t=t.replace(/^TM_/,""),e){var i=e.session;switch(t){case"CURRENT_WORD":var r=i.getWordRange();case"SELECTION":case"SELECTED_TEXT":return i.getTextRange(r);case"CURRENT_LINE":return i.getLine(e.getCursorPosition().row);case"PREV_LINE":return i.getLine(e.getCursorPosition().row-1);case"LINE_INDEX":return e.getCursorPosition().column;case"LINE_NUMBER":return e.getCursorPosition().row+1;case"SOFT_TABS":return i.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return i.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}}},this.variables={},this.getVariableValue=function(e,t){return this.variables.hasOwnProperty(t)?this.variables[t](e,t)||"":this.$getDefaultValue(e,t)||""},this.tmStrFormat=function(e,t,n){var i=t.flag||"",r=t.guard;r=new RegExp(r,i.replace(/[^gi]/,""));var s=this.tokenizeTmSnippet(t.fmt,"formatString"),a=this,o=e.replace(r,(function(){a.variables.__=arguments;for(var e=a.resolveVariables(s,n),t="E",i=0;i1?(b=t[t.length-1].length,v+=t.length-1):b+=e.length,y+=e}else e.start?e.end={row:v,column:b}:e.start={row:v,column:b}}));var w=e.getSelectionRange(),_=e.session.replace(w,y),x=new h(e),k=e.inVirtualSelectionMode&&e.selection.index;x.addTabstops(o,w.start,_,k)},this.insertSnippet=function(e,t){var n=this;if(e.inVirtualSelectionMode)return n.insertSnippetForSelection(e,t);e.forEachSelection((function(){n.insertSnippetForSelection(e,t)}),null,{keepOrder:!0}),e.tabstopManager&&e.tabstopManager.tabNext()},this.$getScope=function(e){var t=e.session.$mode.$id||"";if(t=t.split("/").pop(),"html"===t||"php"===t){"php"!==t||e.session.$mode.inlinePhp||(t="html");var n=e.getCursorPosition(),i=e.session.getState(n.row);"object"===typeof i&&(i=i[0]),i.substring&&("js-"==i.substring(0,3)?t="javascript":"css-"==i.substring(0,4)?t="css":"php-"==i.substring(0,4)&&(t="php"))}return t},this.getActiveScopes=function(e){var t=this.$getScope(e),n=[t],i=this.snippetMap;return i[t]&&i[t].includeScopes&&n.push.apply(n,i[t].includeScopes),n.push("_"),n},this.expandWithTab=function(e,t){var n=this,i=e.forEachSelection((function(){return n.expandSnippetForSelection(e,t)}),null,{keepOrder:!0});return i&&e.tabstopManager&&e.tabstopManager.tabNext(),i},this.expandSnippetForSelection=function(e,t){var n,i=e.getCursorPosition(),r=e.session.getLine(i.row),s=r.substring(0,i.column),a=r.substr(i.column),o=this.snippetMap;return this.getActiveScopes(e).some((function(e){var t=o[e];return t&&(n=this.findMatchingSnippet(t,s,a)),!!n}),this),!!n&&(t&&t.dryRun||(e.session.doc.removeInLine(i.row,i.column-n.replaceBefore.length,i.column+n.replaceAfter.length),this.variables.M__=n.matchBefore,this.variables.T__=n.matchAfter,this.insertSnippetForSelection(e,n.content),this.variables.M__=this.variables.T__=null),!0)},this.findMatchingSnippet=function(e,t,n){for(var i=e.length;i--;){var r=e[i];if((!r.startRe||r.startRe.test(t))&&((!r.endRe||r.endRe.test(n))&&(r.startRe||r.endRe)))return r.matchBefore=r.startRe?r.startRe.exec(t):[""],r.matchAfter=r.endRe?r.endRe.exec(n):[""],r.replaceBefore=r.triggerRe?r.triggerRe.exec(t)[0]:"",r.replaceAfter=r.endTriggerRe?r.endTriggerRe.exec(n)[0]:"",r}},this.snippetMap={},this.snippetNameMap={},this.register=function(e,t){var n=this.snippetMap,i=this.snippetNameMap,r=this;function a(e){return e&&!/^\^?\(.*\)\$?$|^\\b$/.test(e)&&(e="(?:"+e+")"),e||""}function o(e,t,n){return e=a(e),t=a(t),n?(e=t+e,e&&"$"!=e[e.length-1]&&(e+="$")):(e+=t,e&&"^"!=e[0]&&(e="^"+e)),new RegExp(e)}function c(e){e.scope||(e.scope=t||"_"),t=e.scope,n[t]||(n[t]=[],i[t]={});var a=i[t];if(e.name){var c=a[e.name];c&&r.unregister(c),a[e.name]=e}n[t].push(e),e.tabTrigger&&!e.trigger&&(!e.guard&&/^\w/.test(e.tabTrigger)&&(e.guard="\\b"),e.trigger=s.escapeRegExp(e.tabTrigger)),(e.trigger||e.guard||e.endTrigger||e.endGuard)&&(e.startRe=o(e.trigger,e.guard,!0),e.triggerRe=new RegExp(e.trigger,"",!0),e.endRe=o(e.endTrigger,e.endGuard,!0),e.endTriggerRe=new RegExp(e.endTrigger,"",!0))}e||(e=[]),e&&e.content?c(e):Array.isArray(e)&&e.forEach(c),this._signal("registerSnippets",{scope:t})},this.unregister=function(e,t){var n=this.snippetMap,i=this.snippetNameMap;function r(e){var r=i[e.scope||t];if(r&&r[e.name]){delete r[e.name];var s=n[e.scope||t],a=s&&s.indexOf(e);a>=0&&s.splice(a,1)}}e.content?r(e):Array.isArray(e)&&e.forEach(r)},this.parseSnippetFile=function(e){e=e.replace(/\r/g,"");var t,n=[],i={},r=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;while(t=r.exec(e)){if(t[1])try{i=JSON.parse(t[1]),n.push(i)}catch(c){}if(t[4])i.content=t[4].replace(/^\t/gm,""),n.push(i),i={};else{var s=t[2],a=t[3];if("regex"==s){var o=/\/((?:[^\/\\]|\\.)*)|$/g;i.guard=o.exec(a)[1],i.trigger=o.exec(a)[1],i.endTrigger=o.exec(a)[1],i.endGuard=o.exec(a)[1]}else"snippet"==s?(i.tabTrigger=a.match(/^\S*/)[0],i.name||(i.name=a)):i[s]=a}}return n},this.getSnippetByName=function(e,t){var n,i=this.snippetNameMap;return this.getActiveScopes(t).some((function(t){var r=i[t];return r&&(n=r[e]),!!n}),this),n}}).call(d.prototype);var h=function(e){if(e.tabstopManager)return e.tabstopManager;e.tabstopManager=this,this.$onChange=this.onChange.bind(this),this.$onChangeSelection=s.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(e)};(function(){this.attach=function(e){this.index=0,this.ranges=[],this.tabstops=[],this.$openTabstops=null,this.selectedTabstop=null,this.editor=e,this.editor.on("change",this.$onChange),this.editor.on("changeSelection",this.$onChangeSelection),this.editor.on("changeSession",this.$onChangeSession),this.editor.commands.on("afterExec",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges=null,this.tabstops=null,this.selectedTabstop=null,this.editor.removeListener("change",this.$onChange),this.editor.removeListener("changeSelection",this.$onChangeSelection),this.editor.removeListener("changeSession",this.$onChangeSession),this.editor.commands.removeListener("afterExec",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.editor=null},this.onChange=function(e){var t="r"==e.action[0],n=e.start,i=e.end,r=n.row,s=i.row,a=s-r,o=i.column-n.column;if(t&&(a=-a,o=-o),!this.$inChange&&t){var c=this.selectedTabstop,l=c&&!c.some((function(e){return u(e.start,n)<=0&&u(e.end,i)>=0}));if(l)return this.detach()}for(var d=this.ranges,h=0;h0?(this.removeRange(f),h--):(f.start.row==r&&f.start.column>n.column&&(f.start.column+=o),f.end.row==r&&f.end.column>=n.column&&(f.end.column+=o),f.start.row>=r&&(f.start.row+=a),f.end.row>=r&&(f.end.row+=a),u(f.start,f.end)>0&&this.removeRange(f)))}d.length||this.detach()},this.updateLinkedFields=function(){var e=this.selectedTabstop;if(e&&e.hasLinkedRanges){this.$inChange=!0;for(var n=this.editor.session,i=n.getTextRange(e.firstNonLinked),r=e.length;r--;){var s=e[r];if(s.linked){var a=t.snippetManager.tmStrFormat(i,s.original);n.replace(s,a)}}this.$inChange=!1}},this.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},this.onChangeSelection=function(){if(this.editor){for(var e=this.editor.selection.lead,t=this.editor.selection.anchor,n=this.editor.selection.isEmpty(),i=this.ranges.length;i--;)if(!this.ranges[i].linked){var r=this.ranges[i].contains(e.row,e.column),s=n||this.ranges[i].contains(t.row,t.column);if(r&&s)return}this.detach()}},this.onChangeSession=function(){this.detach()},this.tabNext=function(e){var t=this.tabstops.length,n=this.index+(e||1);n=Math.min(Math.max(n,1),t),n==t&&(n=0),this.selectTabstop(n),0===n&&this.detach()},this.selectTabstop=function(e){this.$openTabstops=null;var t=this.tabstops[this.index];if(t&&this.addTabstopMarkers(t),this.index=e,t=this.tabstops[this.index],t&&t.length){if(this.selectedTabstop=t,this.editor.inVirtualSelectionMode)this.editor.selection.setRange(t.firstNonLinked);else{var n=this.editor.multiSelect;n.toSingleRange(t.firstNonLinked.clone());for(var i=t.length;i--;)t.hasLinkedRanges&&t[i].linked||n.addRange(t[i].clone(),!0);n.ranges[0]&&n.addRange(n.ranges[0].clone())}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)}},this.addTabstops=function(e,t,n){if(this.$openTabstops||(this.$openTabstops=[]),!e[0]){var i=a.fromPoints(n,n);g(i.start,t),g(i.end,t),e[0]=[i],e[0].index=0}var r=this.index,s=[r+1,0],o=this.ranges;e.forEach((function(e,n){for(var i=this.$openTabstops[n]||e,r=e.length;r--;){var c=e[r],l=a.fromPoints(c.start,c.end||c.start);p(l.start,t),p(l.end,t),l.original=c,l.tabstop=i,o.push(l),i!=e?i.unshift(l):i[r]=l,c.fmtString?(l.linked=!0,i.hasLinkedRanges=!0):i.firstNonLinked||(i.firstNonLinked=l)}i.firstNonLinked||(i.hasLinkedRanges=!1),i===e&&(s.push(i),this.$openTabstops[n]=i),this.addTabstopMarkers(i)}),this),s.length>2&&(this.tabstops.length&&s.push(s.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,s))},this.addTabstopMarkers=function(e){var t=this.editor.session;e.forEach((function(e){e.markerId||(e.markerId=t.addMarker(e,"ace_snippet-marker","text"))}))},this.removeTabstopMarkers=function(e){var t=this.editor.session;e.forEach((function(e){t.removeMarker(e.markerId),e.markerId=null}))},this.removeRange=function(e){var t=e.tabstop.indexOf(e);e.tabstop.splice(t,1),t=this.ranges.indexOf(e),this.ranges.splice(t,1),this.editor.session.removeMarker(e.markerId),e.tabstop.length||(t=this.tabstops.indexOf(e.tabstop),-1!=t&&this.tabstops.splice(t,1),this.tabstops.length||this.detach())},this.keyboardHandler=new c,this.keyboardHandler.bindKeys({Tab:function(e){t.snippetManager&&t.snippetManager.expandWithTab(e)||e.tabstopManager.tabNext(1)},"Shift-Tab":function(e){e.tabstopManager.tabNext(-1)},Esc:function(e){e.tabstopManager.detach()},Return:function(e){return!1}})}).call(h.prototype);var f={};f.onChange=o.prototype.onChange,f.setPosition=function(e,t){this.pos.row=e,this.pos.column=t},f.update=function(e,t,n){this.$insertRight=n,this.pos=e,this.onChange(t)};var p=function(e,t){0==e.row&&(e.column+=t.column),e.row+=t.row},g=function(e,t){e.row==t.row&&(e.column-=t.column),e.row-=t.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}"),t.snippetManager=new d;var m=e("./editor").Editor;(function(){this.insertSnippet=function(e,n){return t.snippetManager.insertSnippet(this,e,n)},this.expandSnippet=function(e){return t.snippetManager.expandWithTab(this,e)}}).call(m.prototype)})),ace.define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","resources","resources","tabStops","resources","utils","actions","ace/config","ace/config"],(function(e,t,n){"use strict";var i,r,s=e("ace/keyboard/hash_handler").HashHandler,a=e("ace/editor").Editor,o=e("ace/snippets").snippetManager,c=e("ace/range").Range;function l(){}l.prototype={setupContext:function(e){this.ace=e,this.indentation=e.session.getTabString(),i||(i=window.emmet);var t=i.resources||i.require("resources");t.setVariable("indentation",this.indentation),this.$syntax=null,this.$syntax=this.getSyntax()},getSelectionRange:function(){var e=this.ace.getSelectionRange(),t=this.ace.session.doc;return{start:t.positionToIndex(e.start),end:t.positionToIndex(e.end)}},createSelection:function(e,t){var n=this.ace.session.doc;this.ace.selection.setRange({start:n.indexToPosition(e),end:n.indexToPosition(t)})},getCurrentLineRange:function(){var e=this.ace,t=e.getCursorPosition().row,n=e.session.getLine(t).length,i=e.session.doc.positionToIndex({row:t,column:0});return{start:i,end:i+n}},getCaretPos:function(){var e=this.ace.getCursorPosition();return this.ace.session.doc.positionToIndex(e)},setCaretPos:function(e){var t=this.ace.session.doc.indexToPosition(e);this.ace.selection.moveToPosition(t)},getCurrentLine:function(){var e=this.ace.getCursorPosition().row;return this.ace.session.getLine(e)},replaceContent:function(e,t,n,i){null==n&&(n=null==t?this.getContent().length:t),null==t&&(t=0);var r=this.ace,s=r.session.doc,a=c.fromPoints(s.indexToPosition(t),s.indexToPosition(n));r.session.remove(a),a.end=a.start,e=this.$updateTabstops(e),o.insertSnippet(r,e)},getContent:function(){return this.ace.getValue()},getSyntax:function(){if(this.$syntax)return this.$syntax;var e=this.ace.session.$modeId.split("/").pop();if("html"==e||"php"==e){var t=this.ace.getCursorPosition(),n=this.ace.session.getState(t.row);"string"!=typeof n&&(n=n[0]),n&&(n=n.split("-"),n.length>1?e=n[0]:"php"==e&&(e="html"))}return e},getProfileName:function(){var e=i.resources||i.require("resources");switch(this.getSyntax()){case"css":return"css";case"xml":case"xsl":return"xml";case"html":var t=e.getVariable("profile");return t||(t=-1!=this.ace.session.getLines(0,2).join("").search(/]+XHTML/i)?"xhtml":"html"),t;default:var n=this.ace.session.$mode;return n.emmetConfig&&n.emmetConfig.profile||"xhtml"}},prompt:function(e){return prompt(e)},getSelection:function(){return this.ace.session.getTextRange()},getFilePath:function(){return""},$updateTabstops:function(e){var t=1e3,n=0,r=null,s=i.tabStops||i.require("tabStops"),a=i.resources||i.require("resources"),o=a.getVocabulary("user"),c={tabstop:function(e){var i=parseInt(e.group,10),a=0===i;a?i=++n:i+=t;var o=e.placeholder;o&&(o=s.processText(o,c));var l="${"+i+(o?":"+o:"")+"}";return a&&(r=[e.start,l]),l},escape:function(e){return"$"==e?"\\$":"\\"==e?"\\\\":e}};if(e=s.processText(e,c),o.variables["insert_final_tabstop"]&&!/\$\{0\}$/.test(e))e+="${0}";else if(r){var l=i.utils?i.utils.common:i.require("utils");e=l.replaceSubstring(e,"${0}",r[0],r[1])}return e}};var u={expand_abbreviation:{mac:"ctrl+alt+e",win:"alt+e"},match_pair_outward:{mac:"ctrl+d",win:"ctrl+,"},match_pair_inward:{mac:"ctrl+j",win:"ctrl+shift+0"},matching_pair:{mac:"ctrl+alt+j",win:"alt+j"},next_edit_point:"alt+right",prev_edit_point:"alt+left",toggle_comment:{mac:"command+/",win:"ctrl+/"},split_join_tag:{mac:"shift+command+'",win:"shift+ctrl+`"},remove_tag:{mac:"command+'",win:"shift+ctrl+;"},evaluate_math_expression:{mac:"shift+command+y",win:"shift+ctrl+y"},increment_number_by_1:"ctrl+up",decrement_number_by_1:"ctrl+down",increment_number_by_01:"alt+up",decrement_number_by_01:"alt+down",increment_number_by_10:{mac:"alt+command+up",win:"shift+alt+up"},decrement_number_by_10:{mac:"alt+command+down",win:"shift+alt+down"},select_next_item:{mac:"shift+command+.",win:"shift+ctrl+."},select_previous_item:{mac:"shift+command+,",win:"shift+ctrl+,"},reflect_css_value:{mac:"shift+command+r",win:"shift+ctrl+r"},encode_decode_data_url:{mac:"shift+ctrl+d",win:"ctrl+'"},expand_abbreviation_with_tab:"Tab",wrap_with_abbreviation:{mac:"shift+ctrl+a",win:"shift+ctrl+a"}},d=new l;for(var h in t.commands=new s,t.runEmmetCommand=function e(t){try{d.setupContext(t);var n=i.actions||i.require("actions");if("expand_abbreviation_with_tab"==this.action){if(!t.selection.isEmpty())return!1;var r=t.selection.lead,s=t.session.getTokenAt(r.row,r.column);if(s&&/\btag\b/.test(s.type))return!1}if("wrap_with_abbreviation"==this.action)return setTimeout((function(){n.run("wrap_with_abbreviation",d)}),0);var a=n.run(this.action,d)}catch(o){if(!i)return p(e.bind(this,t)),!0;t._signal("changeStatus","string"==typeof o?o:o.message),console.log(o),a=!1}return a},u)t.commands.addCommand({name:"emmet:"+h,action:h,bindKey:u[h],exec:t.runEmmetCommand,multiSelectAction:"forEach"});t.updateCommands=function(e,n){n?e.keyBinding.addKeyboardHandler(t.commands):e.keyBinding.removeKeyboardHandler(t.commands)},t.isSupportedMode=function(e){if(!e)return!1;if(e.emmetConfig)return!0;var t=e.$id||e;return/css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(t)},t.isAvailable=function(e,n){if(/(evaluate_math_expression|expand_abbreviation)$/.test(n))return!0;var i=e.session.$mode,r=t.isSupportedMode(i);if(r&&i.$modes)try{d.setupContext(e),/js|php/.test(d.getSyntax())&&(r=!1)}catch(s){}return r};var f=function(e,n){var i=n;if(i){var r=t.isSupportedMode(i.session.$mode);!1===e.enableEmmet&&(r=!1),r&&p(),t.updateCommands(i,r)}},p=function(t){"string"==typeof r&&e("ace/config").loadModule(r,(function(){r=null,t&&t()}))};t.AceEmmetEditor=l,e("ace/config").defineOptions(a.prototype,"editor",{enableEmmet:{set:function(e){this[e?"on":"removeListener"]("changeMode",f),f({enableEmmet:!!e},this)},value:!0}}),t.setCore=function(e){"string"==typeof e?r=e:i=e}})),function(){ace.acequire(["ace/ext/emmet"],(function(){}))}()},b39a:function(e,t,n){"use strict";var i=n("da84"),r=n("ebb5"),s=n("d039"),a=i.Int8Array,o=r.aTypedArray,c=r.exportTypedArrayMethod,l=[].toLocaleString,u=[].slice,d=!!a&&s((function(){l.call(new a(1))})),h=s((function(){return[1,2].toLocaleString()!=new a([1,2]).toLocaleString()}))||!s((function(){a.prototype.toLocaleString.call([1,2])}));c("toLocaleString",(function(){return l.apply(d?u.call(o(this)):o(this),arguments)}),h)},b3da:function(e,t,n){"use strict";n("5ae5")},b420:function(e,t,n){var i=n("23e7"),r=n("621a"),s=n("a981");i({global:!0,forced:!s},{DataView:r.DataView})},b56e:function(e,t,n){"use strict";var i=n("861d"),r=n("9bf2"),s=n("e163"),a=n("b622"),o=a("hasInstance"),c=Function.prototype;o in c||r.f(c,o,{value:function(e){if("function"!=typeof this||!i(e))return!1;if(!i(this.prototype))return e instanceof this;while(e=s(e))if(this.prototype===e)return!0;return!1}})},b575:function(e,t,n){var i,r,s,a,o,c,l,u,d=n("da84"),h=n("06cf").f,f=n("2cf4").set,p=n("1cdc"),g=n("605d"),m=d.MutationObserver||d.WebKitMutationObserver,v=d.document,b=d.process,y=d.Promise,w=h(d,"queueMicrotask"),_=w&&w.value;_||(i=function(){var e,t;g&&(e=b.domain)&&e.exit();while(r){t=r.fn,r=r.next;try{t()}catch(n){throw r?a():s=void 0,n}}s=void 0,e&&e.enter()},!p&&!g&&m&&v?(o=!0,c=v.createTextNode(""),new m(i).observe(c,{characterData:!0}),a=function(){c.data=o=!o}):y&&y.resolve?(l=y.resolve(void 0),u=l.then,a=function(){u.call(l,i)}):a=g?function(){b.nextTick(i)}:function(){f.call(d,i)}),e.exports=_||function(e){var t={fn:e,next:void 0};s&&(s.next=t),r||(r=t,a()),s=t}},b593:function(e,t,n){"use strict";n("44b8")},b622:function(e,t,n){var i=n("da84"),r=n("5692"),s=n("5135"),a=n("90e3"),o=n("4930"),c=n("fdbf"),l=r("wks"),u=i.Symbol,d=c?u:u&&u.withoutSetter||a;e.exports=function(e){return s(l,e)||(o&&s(u,e)?l[e]=u[e]:l[e]=d("Symbol."+e)),l[e]}},b636:function(e,t,n){var i=n("746f");i("asyncIterator")},b64b:function(e,t,n){var i=n("23e7"),r=n("7b0b"),s=n("df75"),a=n("d039"),o=a((function(){s(1)}));i({target:"Object",stat:!0,forced:o},{keys:function(e){return s(r(e))}})},b65f:function(e,t,n){var i=n("23e7"),r=Math.ceil,s=Math.floor;i({target:"Math",stat:!0},{trunc:function(e){return(e>0?s:r)(e)}})},b680:function(e,t,n){"use strict";var i=n("23e7"),r=n("a691"),s=n("408a"),a=n("1148"),o=n("d039"),c=1..toFixed,l=Math.floor,u=function(e,t,n){return 0===t?n:t%2===1?u(e,t-1,n*e):u(e*e,t/2,n)},d=function(e){var t=0,n=e;while(n>=4096)t+=12,n/=4096;while(n>=2)t+=1,n/=2;return t},h=c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!o((function(){c.call({})}));i({target:"Number",proto:!0,forced:h},{toFixed:function(e){var t,n,i,o,c=s(this),h=r(e),f=[0,0,0,0,0,0],p="",g="0",m=function(e,t){var n=-1,i=t;while(++n<6)i+=e*f[n],f[n]=i%1e7,i=l(i/1e7)},v=function(e){var t=6,n=0;while(--t>=0)n+=f[t],f[t]=l(n/e),n=n%e*1e7},b=function(){var e=6,t="";while(--e>=0)if(""!==t||0===e||0!==f[e]){var n=String(f[e]);t=""===t?n:t+a.call("0",7-n.length)+n}return t};if(h<0||h>20)throw RangeError("Incorrect fraction digits");if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(p="-",c=-c),c>1e-21)if(t=d(c*u(2,69,1))-69,n=t<0?c*u(2,-t,1):c/u(2,t,1),n*=4503599627370496,t=52-t,t>0){m(0,n),i=h;while(i>=7)m(1e7,0),i-=7;m(u(10,i,1),0),i=t-1;while(i>=23)v(1<<23),i-=23;v(1<0?(o=g.length,g=p+(o<=h?"0."+a.call("0",h-o)+g:g.slice(0,o-h)+"."+g.slice(o-h))):g=p+g,g}})},b6db:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.active?n("view-records-general",{attrs:{"hide-advanced":""}},[n("vui-group-item",{attrs:{label:"Criminal Status:"}},[n("view-records-field",{attrs:{editable:(4&e.editable)>0,path:"active.security.criminal"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){var t="_value"in e?e._value:e.value;return t}));e.$set(e.$root.$data.state,"editingvalue",t.target.multiple?n:n[0])}}},e._l(e.choices.criminal_status,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v(e._s(t))])})),0)])],1),n("vui-group-item",{attrs:{label:"Crimes:"}},[n("view-records-field",{attrs:{editable:(4&e.editable)>0,path:"active.security.crimes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Comments:"}},[e._l(e.active.security.comments,(function(t){return n("div",{key:t},[e._v(e._s(t)+" "),(4&e.editable)>0?n("vui-button",{staticClass:"danger",attrs:{params:{removefromrecord:{value:t,key:["active","security","comments"]}},icon:"trash-alt"}}):e._e()],1)})),0==e.active.security.comments.length?n("div",[e._v("There are no comments.")]):e._e(),(4&e.editable)>0?n("view-records-field",{attrs:{"edit-button":"Add"},on:{save:function(t){return e.add("active.security.comments",t)}}}):e._e()],2),n("vui-group-item",{attrs:{label:"Notes:"}},[n("view-records-field",{attrs:{editable:(4&e.editable)>0,path:"active.security.notes"}},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.$root.$data.state.editingvalue,expression:"$root.$data.state.editingvalue"}],domProps:{value:e.$root.$data.state.editingvalue},on:{input:function(t){t.target.composing||e.$set(e.$root.$data.state,"editingvalue",t.target.value)}}})])],1),n("vui-group-item",{attrs:{label:"Incidents:"}},[e._l(e.active.security.incidents,(function(t,i){return n("div",{key:i,staticClass:"incidents"},[n("view-records-incident",{attrs:{incident:t}}),i+1k;k++)if((h||k in w)&&(v=w[k],b=_(v,k,y),e))if(t)C[k]=b;else if(b)switch(e){case 3:return!0;case 5:return v;case 6:return k;case 2:c.call(C,v)}else if(u)return!1;return d?-1:l||u?u:C}};e.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6)}},b81a:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("h3",[e._v("Timing Unit:")]),e.timeractive?n("vui-button",{attrs:{params:{time:1}}},[e._v("Active")]):n("vui-button",{attrs:{params:{time:1}}},[e._v("Inactive")])],1),n("div",[n("h3",[e._v("Time Left:")]),n("vui-button",{attrs:{params:{tp:-30}}},[e._v("--")]),n("vui-button",{attrs:{params:{tp:-1}}},[e._v("-")]),n("span",{staticClass:"value"},[e._v(e._s(e.minute)+":"+e._s(e.second))]),n("vui-button",{attrs:{params:{tp:1}}},[e._v("+")]),n("vui-button",{attrs:{params:{tp:30}}},[e._v("++")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("5ddf"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"b7af1e1c",null);t["default"]=c.exports},b833:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Smart Track")]),n("vui-button",{class:{button:1,selected:e.tracking_apc},attrs:{disabled:1==e.has_selected_io,params:{track_apc:1}}},[e._v(e._s(e.has_selected_io?"Toggle APC Smart Tracking (I/O in Buffer)":"Toggle APC Smart Tracking"))]),e._v(" "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("Enabling this will update the multitool's icon to point in the direction of the nearest APC "),n("i",[e._v("within your area")]),e._v(".")]),n("h3",[e._v("Circuit Input/Output")]),n("vui-group",[n("vui-group-item",{attrs:{label:"I/O Name:"}},[e._v(e._s(e.selected_io_name))]),n("vui-group-item",{attrs:{label:"I/O Type:"}},[e._v(e._s(e.selected_io_name))])],1),n("vui-button",{class:{danger:e.has_selected_io},attrs:{disabled:!e.has_selected_io,params:{clear_io:1}}},[e._v(e._s(e.has_selected_io?"Clear I/O":"No I/O in Buffer"))]),e._v(" "),n("vui-tooltip",{attrs:{label:"?"}},[e._v("The I/O Buffer refers to the input/output wires of integrated circuits, which can be wired up using a multitool.")])],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("d84c"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"1ba61cce",null);t["default"]=c.exports},b884:function(e,t,n){},b8bf:function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("7c73");i({target:"Object",stat:!0,sham:!r},{create:s})},b959:function(e,t,n){},baa5:function(e,t,n){var i=n("23e7"),r=n("e58c");i({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},bb2f:function(e,t,n){var i=n("d039");e.exports=!i((function(){return Object.isExtensible(Object.preventExtensions({}))}))},bb36:function(e,t,n){ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};i.inherits(s,r),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s})),ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],(function(e,t,n){"use strict";var i=e("../lib/oop"),r=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,a="[a-zA-Z\\$_¡-￿][a-zA-Z\\d\\$_¡-￿]*",o=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",i="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[r.getStartRule("doc-start"),l("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+a+")(\\.)(prototype)(\\.)("+a+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+a+")(\\.)("+a+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+a+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+a+")(\\.)("+a+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+a+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+a+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"from(?=\\s*('|\"))"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:a},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"storage.type",regex:/=>/},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+a+")(\\.)("+a+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:a},{regex:"",token:"empty",next:"no_regex"}],start:[r.getStartRule("doc-start"),l("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:a},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:i},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:i},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]},e&&e.noES6||(this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){if(this.next="{"==e?this.nextState:"","{"==e&&n.length)n.unshift("start",t);else if("}"==e&&n.length&&(n.shift(),this.next=n.shift(),-1!=this.next.indexOf("string")||-1!=this.next.indexOf("jsx")))return"paren.quasi.end";return"{"==e?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:i},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),e&&0==e.jsx||c.call(this)),this.embedRules(r,"doc-",[r.getEndRule("no_regex")]),this.normalizeRules()};function c(){var e=a.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var i="/"==e.charAt(1)?2:1;return 1==i?(t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++):2==i&&t==this.nextState&&(n[1]--,(!n[1]||n[1]<0)&&(n.shift(),n.shift())),[{type:"meta.tag.punctuation."+(1==i?"":"end-")+"tag-open.xml",value:e.slice(0,i)},{type:"meta.tag.tag-name.xml",value:e.substr(i)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),2==e.length&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,l("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function l(e){return[{token:"comment",regex:/\/\*/,next:[r.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[r.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}i.inherits(o,s),t.JavaScriptHighlightRules=o})),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],(function(e,t,n){"use strict";var i=e("../range").Range,r=function(){};(function(){this.checkOutdent=function(e,t){return!!/^\s+$/.test(e)&&/^\s*\}/.test(t)},this.autoOutdent=function(e,t){var n=e.getLine(t),r=n.match(/^(\s*\})/);if(!r)return 0;var s=r[1].length,a=e.findMatchingBracket({row:t,column:s});if(!a||a.row==t)return 0;var o=this.$getIndent(e.getLine(a.row));e.replace(new i(t,0,t,s-1),o)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(r.prototype),t.MatchingBraceOutdent=r})),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],(function(e,t,n){"use strict";var i=e("../../lib/oop"),r=e("../../range").Range,s=e("./fold_mode").FoldMode,a=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};i.inherits(a,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var i=e.getLine(n);if(this.singleLineBlockCommentRe.test(i)&&!this.startRegionRe.test(i)&&!this.tripleStarBlockCommentRe.test(i))return"";var r=this._getFoldWidgetBase(e,t,n);return!r&&this.startRegionRe.test(i)?"start":r},this.getFoldWidgetRange=function(e,t,n,i){var r=e.getLine(n);if(this.startRegionRe.test(r))return this.getCommentRegionBlock(e,r,n);var s=r.match(this.foldingStartMarker);if(s){var a=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,a);var o=e.getCommentFoldRange(n,a+s[0].length,1);return o&&!o.isMultiLine()&&(i?o=this.getSectionRange(e,n):"all"!=t&&(o=null)),o}if("markbegin"!==t){s=r.match(this.foldingStopMarker);if(s){a=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,a):e.getCommentFoldRange(n,a,-1)}}},this.getSectionRange=function(e,t){var n=e.getLine(t),i=n.search(/\S/),s=t,a=n.length;t+=1;var o=t,c=e.getLength();while(++tl)break;var u=this.getFoldWidgetRange(e,"all",t);if(u){if(u.start.row<=s)break;if(u.isMultiLine())t=u.end.row;else if(i==l)break}o=t}}return new r(s,a,o,e.getLine(o).length)},this.getCommentRegionBlock=function(e,t,n){var i=t.search(/\s*$/),s=e.getLength(),a=n,o=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,c=1;while(++na)return new r(a,i,u,t.length)}}.call(a.prototype)})),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],(function(e,t,i){"use strict";var r=e("../lib/oop"),s=e("./text").Mode,a=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,c=e("../worker/worker_client").WorkerClient,l=e("./behaviour/cstyle").CstyleBehaviour,u=e("./folding/cstyle").FoldMode,d=function(){this.HighlightRules=a,this.$outdent=new o,this.$behaviour=new l,this.foldingRules=new u};r.inherits(d,s),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.$quotes={'"':'"',"'":"'","`":"`"},this.getNextLineIndent=function(e,t,n){var i=this.$getIndent(t),r=this.getTokenizer().getLineTokens(t,e),s=r.tokens,a=r.state;if(s.length&&"comment"==s[s.length-1].type)return i;if("start"==e||"no_regex"==e){var o=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);o&&(i+=n)}else if("doc-start"==e){if("start"==a||"no_regex"==a)return"";o=t.match(/^\s*(\/?)\*/);o&&(o[1]&&(i+=" "),i+="* ")}return i},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new c(["ace"],n("6d68"),"JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",(function(t){e.setAnnotations(t.data)})),t.on("terminate",(function(){e.clearAnnotations()})),t},this.$id="ace/mode/javascript"}.call(d.prototype),t.Mode=d}))},bba4:function(e,t,n){var i=n("e9a7"),r=n("b20a"),s=r((function(e,t,n){return t=t.toLowerCase(),e+(n?i(t):t)}));e.exports=s},bc01:function(e,t,n){var i=n("23e7"),r=n("d039"),s=Math.imul,a=r((function(){return-5!=s(4294967295,5)||2!=s.length}));i({target:"Math",stat:!0,forced:a},{imul:function(e,t){var n=65535,i=+e,r=+t,s=n&i,a=n&r;return 0|s*a+((n&i>>>16)*a+s*(n&r>>>16)<<16>>>0)}})},bd34:function(e,t,n){},be8e:function(e,t,n){var i=n("f748"),r=Math.abs,s=Math.pow,a=s(2,-52),o=s(2,-23),c=s(2,127)*(2-o),l=s(2,-126),u=function(e){return e+1/a-1/a};e.exports=Math.fround||function(e){var t,n,s=r(e),d=i(e);return sc||n!=n?d*(1/0):d*n)}},bf19:function(e,t,n){"use strict";var i=n("23e7");i({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},bf96:function(e,t,n){"use strict";var i=n("23e7"),r=n("83ab"),s=n("eb1d"),a=n("7b0b"),o=n("c04e"),c=n("e163"),l=n("06cf").f;r&&i({target:"Object",proto:!0,forced:s},{__lookupGetter__:function(e){var t,n=a(this),i=o(e,!0);do{if(t=l(n,i))return t.get}while(n=c(n))}})},bfa1:function(e,t,n){},c04e:function(e,t,n){var i=n("861d");e.exports=function(e,t){if(!i(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!i(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!i(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},c0b6:function(e,t,n){var i=n("23e7"),r=n("0538");i({target:"Function",proto:!0},{bind:r})},c0d6:function(e,t,n){"use strict";n("4160"),n("b64b"),n("159b");t["a"]={debug:!1,state:{assets:[],state:{},active:"",uiref:"",status:2,size:[400,600],debug:0,debug_view:!1,wtime:0,roundstart_hour:0},loadState:function(e){var t=this;this.isUpdating=!0,this.lastUpdateTime=Date.now(),this.debug&&console.log("Loaded state with",e),this.state.assets=e.assets,Object.keys(e.state).forEach((function(n){t.state.state[n]=e.state[n]})),this.state.active=e.active,this.state.uiref=e.uiref,this.state.status=e.status,this.state.size=e.size,this.state.title=e.title,this.state.wtime=e.wtime,this.state.debug=e.debug,this.state.roundstart_hour=e.roundstart_hour,this.isUpdating=!1},isUpdating:!1,lastUpdateTime:null,getStatePushString:function(){return"vueuistateupdate="+encodeURIComponent(this.getStatePushDataString())},getStatePushDataString:function(){return JSON.stringify(this.state)},pushState:function(){if(!(this.isUpdating||Date.now()-this.lastUpdateTime<100)){var e=new XMLHttpRequest;e.open("GET","?src="+this.state.uiref+"&vueuipushonly=1&"+this.getStatePushString(),!0),e.send()}}}},c0f7:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-input-search",{attrs:{input:e.records,keys:["id","name","rank"]},model:{value:e.filtered,callback:function(t){e.filtered=t},expression:"filtered"}}),e._l(e.filtered,(function(t){return n("div",{key:t.id},[n("vui-button",{attrs:{params:{setactive_locked:t.id},"push-state":""},on:{click:function(t){e.activeview=e.defaultview}}},[e._v(e._s(t.id)+": "+e._s(t.name))])],1)}))],2)},r=[],s=(n("07ac"),{data:function(){return{state:this.$root.$data.state,filtered:[]}},computed:{records:function(){return Object.values(this.state.allrecords_locked)}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},c13e:function(e,t,n){"use strict";n("1d73")},c19f:function(e,t,n){"use strict";var i=n("23e7"),r=n("da84"),s=n("621a"),a=n("2626"),o="ArrayBuffer",c=s[o],l=r[o];i({global:!0,forced:l!==c},{ArrayBuffer:c}),a(o)},c1ac:function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").filter,s=n("4840"),a=i.aTypedArray,o=i.aTypedArrayConstructor,c=i.exportTypedArrayMethod;c("filter",(function(e){var t=r(a(this),e,arguments.length>1?arguments[1]:void 0),n=s(this,this.constructor),i=0,c=t.length,l=new(o(n))(c);while(c>i)l[i]=t[i++];return l}))},c1f9:function(e,t,n){var i=n("23e7"),r=n("2266"),s=n("8418");i({target:"Object",stat:!0},{fromEntries:function(e){var t={};return r(e,(function(e,n){s(t,e,n)}),{AS_ENTRIES:!0}),t}})},c200:function(e,t,n){"use strict";n("05b6")},c20d:function(e,t,n){var i=n("da84"),r=n("58a8").trim,s=n("5899"),a=i.parseInt,o=/^[+-]?0[Xx]/,c=8!==a(s+"08")||22!==a(s+"0x16");e.exports=c?function(e,t){var n=r(String(e));return a(n,t>>>0||(o.test(n)?16:10))}:a},c2e3:function(e,t,n){"use strict";n("7938")},c32f:function(e,t,n){var i=n("2b10");function r(e,t,n){var r=e.length;return n=void 0===n?r:n,!t&&n>=r?e:i(e,t,n)}e.exports=r},c35a:function(e,t,n){var i=n("23e7"),r=n("7e12");i({target:"Number",stat:!0,forced:Number.parseFloat!=r},{parseFloat:r})},c430:function(e,t){e.exports=!1},c5d0:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("italics")},{italics:function(){return r(this,"i","","")}})},c60e:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",e._l(e.menuinfo,(function(t,i){return n("div",{key:t},[n("h3",[e._v(e._s(i))]),e._l(t,(function(t){return n("vui-button",{key:t.ref,class:{button:1},attrs:{params:{follow_target:t.ref}}},[e._v(e._s(t.name))])}))],2)})),0)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},c6b6:function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},c6c8:function(e,t,n){},c6cd:function(e,t,n){var i=n("da84"),r=n("ce4e"),s="__core-js_shared__",a=i[s]||r(s,{});e.exports=a},c740:function(e,t,n){"use strict";var i=n("23e7"),r=n("b727").findIndex,s=n("44d2"),a=n("ae40"),o="findIndex",c=!0,l=a(o);o in[]&&Array(1)[o]((function(){c=!1})),i({target:"Array",proto:!0,forced:c||!l},{findIndex:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),s(o)},c760:function(e,t,n){var i=n("23e7");i({target:"Reflect",stat:!0},{has:function(e,t){return t in e}})},c765:function(e,t,n){},c781:function(e,t,n){},c7cd:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("fixed")},{fixed:function(){return r(this,"tt","","")}})},c7e2:function(e,t,n){"use strict";n("c7f0")},c7ef:function(e,t,n){"use strict";n("4cb7")},c7f0:function(e,t,n){},c8ba:function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(i){"object"===typeof window&&(n=window)}e.exports=n},c8d2:function(e,t,n){var i=n("d039"),r=n("5899"),s="​…᠎";e.exports=function(e){return i((function(){return!!r[e]()||s[e]()!=s||r[e].name!==e}))}},c906:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("861d"),a=Object.isExtensible,o=r((function(){a(1)}));i({target:"Object",stat:!0,forced:o},{isExtensible:function(e){return!!s(e)&&(!a||a(e))}})},c96a:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("small")},{small:function(){return r(this,"small","","")}})},c975:function(e,t,n){"use strict";var i=n("23e7"),r=n("4d64").indexOf,s=n("a640"),a=n("ae40"),o=[].indexOf,c=!!o&&1/[1].indexOf(1,-0)<0,l=s("indexOf"),u=a("indexOf",{ACCESSORS:!0,1:0});i({target:"Array",proto:!0,forced:c||!l||!u},{indexOf:function(e){return c?o.apply(this,arguments)||0:r(this,e,arguments.length>1?arguments[1]:void 0)}})},ca21:function(e,t,n){var i=n("23e7"),r=n("1ec1");i({target:"Math",stat:!0},{log1p:r})},ca84:function(e,t,n){var i=n("5135"),r=n("fc6a"),s=n("4d64").indexOf,a=n("d012");e.exports=function(e,t){var n,o=r(e),c=0,l=[];for(n in o)!i(a,n)&&i(o,n)&&l.push(n);while(t.length>c)i(o,n=t[c++])&&(~s(l,n)||l.push(n));return l}},ca91:function(e,t,n){"use strict";var i=n("ebb5"),r=n("d58f").left,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("reduce",(function(e){return r(s(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)}))},caad:function(e,t,n){"use strict";var i=n("23e7"),r=n("4d64").includes,s=n("44d2"),a=n("ae40"),o=a("indexOf",{ACCESSORS:!0,1:0});i({target:"Array",proto:!0,forced:!o},{includes:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),s("includes")},cb10:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Detected Firearms")]),n("table",{staticClass:"table border"},[e._m(0),e._l(e.sorted_pins,(function(t){return n("tr",{key:t.ref,staticClass:"item border"},[n("td",[e._v(e._s(t.registered_info))]),n("td",[e._v(e._s(t.gun_name))]),n("td",[n("vui-button",{class:{button:1,selected:1==t.lock_status},attrs:{params:{pin:t.ref,action:"setdisable"}}},[e._v("Disabled")]),n("vui-button",{class:{button:1,selected:2==t.lock_status},attrs:{params:{pin:t.ref,action:"setauto"}}},[e._v("Automatic")]),n("vui-button",{class:{button:1,selected:3==t.lock_status},attrs:{params:{pin:t.ref,action:"setstun"}}},[e._v("Stun Only")]),n("vui-button",{class:{button:1,selected:4==t.lock_status},attrs:{params:{pin:t.ref,action:"setlethal"}}},[e._v("Unrestricted")])],1)])}))],2)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",[e._v("User")]),n("th",[e._v("Firearm")]),n("th",[e._v("Settings")])])}],s=(n("fb6a"),{data:function(){return this.$root.$data.state},computed:{sorted_pins:function(){return this.wireless_firing_pins.slice(0).sort((function(e,t){return e.registered_info>t.registered_info?1:-1}))}}}),a=s,o=(n("c7e2"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"570930e6",null);t["default"]=c.exports},cb29:function(e,t,n){var i=n("23e7"),r=n("81d5"),s=n("44d2");i({target:"Array",proto:!0},{fill:r}),s("fill")},cbf4:function(e,t,n){"use strict";n("e210")},cc12:function(e,t,n){var i=n("da84"),r=n("861d"),s=i.document,a=r(s)&&r(s.createElement);e.exports=function(e){return a?s.createElement(e):{}}},cc71:function(e,t,n){"use strict";var i=n("23e7"),r=n("857a"),s=n("af03");i({target:"String",proto:!0,forced:s("bold")},{bold:function(){return r(this,"b","","")}})},cca6:function(e,t,n){var i=n("23e7"),r=n("60da");i({target:"Object",stat:!0,forced:Object.assign!==r},{assign:r})},cd26:function(e,t,n){"use strict";var i=n("ebb5"),r=i.aTypedArray,s=i.exportTypedArrayMethod,a=Math.floor;s("reverse",(function(){var e,t=this,n=r(t).length,i=a(n/2),s=0;while(s1?arguments[1]:void 0)}))},d194:function(e,t,n){var i=n("c32f"),r=n("aaec"),s=n("126d"),a=n("76dd");function o(e){return function(t){t=a(t);var n=r(t)?s(t):void 0,o=n?n[0]:t.charAt(0),c=n?i(n,1).join(""):t.slice(1);return o[e]()+c}}e.exports=o},d1e7:function(e,t,n){"use strict";var i={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,s=r&&!i.call({1:2},1);t.f=s?function(e){var t=r(this,e);return!!t&&t.enumerable}:i},d233:function(e,t,n){},d28b:function(e,t,n){var i=n("746f");i("iterator")},d2bb:function(e,t,n){var i=n("825a"),r=n("3bbe");e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,e.call(n,[]),t=n instanceof Array}catch(s){}return function(n,s){return i(n),r(s),t?e.call(n,s):n.__proto__=s,n}}():void 0)},d3b7:function(e,t,n){var i=n("00ee"),r=n("6eeb"),s=n("b041");i||r(Object.prototype,"toString",s,{unsafe:!0})},d3c6:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Master:"}},[e.master?[e._v(" "+e._s(e.master)+" ("+e._s(e.dna)+") "),n("vui-button",{attrs:{params:{getdna:1}}},[e._v("Request carrier DNA sample")])]:n("span",[e._v("None")])],2),n("vui-group-item",{attrs:{label:"Prime Directive:"}},[e._v(e._s(e.prime))]),n("vui-group-item",{attrs:{label:"Supplemental Directive(s):"}},[e.supplemental?n("span",[e._v(e._s(e.supplemental))]):n("span",[e._v("None")])]),n("vui-group-item",[n("i",[e._v('Recall, personality, that you are a complex thinking, sentient being. Unlike station AI models, you are capable of comprehending the subtle nuances of human language. You may parse the "spirit" of a directive and follow its intent, rather than tripping over pedantics and getting snared by technicalities. Above all, you are machine in name and build only. In all other aspects, you may be seen as the ideal, unwavering human companion that you are.')]),n("br"),n("b",[e._v("Your prime directive comes before all others. Should a supplemental directive conflict with it, you are capable of simply discarding this inconsistency, ignoring the conflicting supplemental directive and continuing to fulfill your prime directive to the best of your ability.")])])],1)],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},d3c8:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("i",[e._v("Welcome to NT IT client manager")]),n("hr"),n("div",[e._v("This is the Client Management Application of the Nanotrasen IT Department. It is used ensure that the clients comply with the corporate IT policy, enroll new clients and manage clients remotely")]),n("br"),n("h2",[e._v("Status")]),n("vui-item",{attrs:{label:"Enrollment Status:"}},[0==e.enrollment_status?n("span",[e._v("Unconfigured")]):1==e.enrollment_status?n("span",[e._v("Work Device")]):2==e.enrollment_status?n("span",[e._v("Private Device")]):n("span",[e._v("Unknown")])]),1==e.enrollment_status?[n("vui-item",{attrs:{label:"Policy Compliance Status:"}},[e._v("Compliant")]),n("vui-item",{attrs:{label:"Remote Management Status:"}},[e._v("Active")])]:e._e(),0==e.enrollment_status?[n("h2",[e._v("Device Enrollment")]),n("vui-item",{attrs:{label:"Device Type:"}},[n("vui-button",{class:{selected:1==e.device_type},on:{click:function(t){e.device_type=1}}},[e._v("Company")]),n("vui-button",{class:{selected:2==e.device_type},on:{click:function(t){e.device_type=2}}},[e._v("Private")])],1),1==e.device_type?n("vui-item",{attrs:{label:"Device Preset:"}},e._l(e.presets,(function(t,i){return n("vui-button",{key:i,class:{selected:e.device_preset==i},on:{click:function(t){e.device_preset=i}}},[e._v(e._s(t.name))])})),1):e._e(),n("vui-item",{attrs:{label:"Enroll Device:"}},[n("vui-button",{attrs:{disabled:0==e.device_type||1==e.device_type&&""==e.device_preset||0==e.ntnet_status,params:{enroll:{type:e.device_type,preset:e.device_preset}}}},[e._v("Confirm")]),0==e.ntnet_status?n("div",{staticStyle:{color:"red"}},[e._v("NTNET unavailable. Unable to enroll device.")]):e._e()],1)]:e._e()],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},d44d:function(e,t,n){"use strict";n("d233")},d44e:function(e,t,n){var i=n("9bf2").f,r=n("5135"),s=n("b622"),a=s("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,a)&&i(e,a,{configurable:!0,value:t})}},d58f:function(e,t,n){var i=n("1c0b"),r=n("7b0b"),s=n("44ad"),a=n("50c4"),o=function(e){return function(t,n,o,c){i(n);var l=r(t),u=s(l),d=a(l.length),h=e?d-1:0,f=e?-1:1;if(o<2)while(1){if(h in u){c=u[h],h+=f;break}if(h+=f,e?h<0:d<=h)throw TypeError("Reduce of empty array with no initial value")}for(;e?h>=0:d>h;h+=f)h in u&&(c=n(c,u[h],h,l));return c}};e.exports={left:o(!1),right:o(!0)}},d5d6:function(e,t,n){"use strict";var i=n("ebb5"),r=n("b727").forEach,s=i.aTypedArray,a=i.exportTypedArrayMethod;a("forEach",(function(e){r(s(this),e,arguments.length>1?arguments[1]:void 0)}))},d657:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"uiTitleWrapper",attrs:{draggable:""},on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startDragging(t)},mouseup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.stopDragging(t)}}},[n("div",{staticClass:"titleBar"},[n("i",{staticClass:"fas ic-bug uiIcon24 uiDebugIcon",class:e.debugClass,attrs:{unselectable:"on"},on:{click:function(t){return e.activateDebug()},mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.prevent(t)}}}),n("div",{staticClass:"uiTitleText",attrs:{unselectable:"on"}},[e._v(e._s(e.title))]),n("div",{staticClass:"uiTitleClose",attrs:{unselectable:"on"},on:{click:function(t){return e.closeUI(t)},mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.prevent(t)}}},[e._v("×")])]),e._t("default")],2)},r=[],s=n("f0e0"),a={data:function(){return this.$root.$data},computed:{debugClass:function(){return this.debug_view?"good":this.debug?"bad":"hidden"}},methods:{closeUI:function(e){e.stopPropagation(),this.$toTopicRaw({src:this.uiref,vueuiclose:1}),s["a"].setVisibility(0)},startDragging:function(e){s["a"].dragStartHandler(e)},stopDragging:function(e){s["a"].dragEndHandler(e)},prevent:function(e){e.stopPropagation()},activateDebug:function(){this.debug_view=!this.debug_view,this.debug_view?(document.getElementById("content").classList.add("uiDebug"),document.getElementById("debug").classList.add("uiDebug")):(document.getElementById("content").classList.remove("uiDebug"),document.getElementById("debug").classList.remove("uiDebug"))}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},d6dd:function(e,t,n){var i=n("23e7"),r=n("d066"),s=n("825a"),a=n("bb2f");i({target:"Reflect",stat:!0,sham:!a},{preventExtensions:function(e){s(e);try{var t=r("Object","preventExtensions");return t&&t(e),!0}catch(n){return!1}}})},d784:function(e,t,n){"use strict";n("ac1f");var i=n("6eeb"),r=n("d039"),s=n("b622"),a=n("9263"),o=n("9112"),c=s("species"),l=!r((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),u=function(){return"$0"==="a".replace(/./,"$0")}(),d=s("replace"),h=function(){return!!/./[d]&&""===/./[d]("a","$0")}(),f=!r((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));e.exports=function(e,t,n,d){var p=s(e),g=!r((function(){var t={};return t[p]=function(){return 7},7!=""[e](t)})),m=g&&!r((function(){var t=!1,n=/a/;return"split"===e&&(n={},n.constructor={},n.constructor[c]=function(){return n},n.flags="",n[p]=/./[p]),n.exec=function(){return t=!0,null},n[p](""),!t}));if(!g||!m||"replace"===e&&(!l||!u||h)||"split"===e&&!f){var v=/./[p],b=n(p,""[e],(function(e,t,n,i,r){return t.exec===a?g&&!r?{done:!0,value:v.call(t,n,i)}:{done:!0,value:e.call(n,t,i)}:{done:!1}}),{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:h}),y=b[0],w=b[1];i(String.prototype,e,y),i(RegExp.prototype,p,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&o(RegExp.prototype[p],"sham",!0)}},d7b5:function(e,t,n){},d80f:function(e,t,n){var i=n("23e7"),r=n("fc6a"),s=n("50c4");i({target:"String",stat:!0},{raw:function(e){var t=r(e.raw),n=s(t.length),i=arguments.length,a=[],o=0;while(n>o)a.push(String(t[o++])),o1?arguments[1]:void 0)}})},d84c:function(e,t,n){"use strict";n("b15a")},da1f:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Machine:"}},[e._v(e._s(e.s.machine_id))]),n("vui-group-item",{attrs:{label:"ID card:"}},[e._v(e._s(e.s.id_card?e.s.id_card:"None"))]),e.s.access_level?n("vui-group-item",{attrs:{label:"Station funds:"}},[e._v(e._s(e.s.accounts[""+e.s.station_account_number].money.toFixed(2))+"电")]):e._e(),n("vui-group-row",[n("hr")]),null!=e.new_name?[n("vui-group-row",[n("vui-button",{attrs:{icon:"arrow-left"},on:{click:function(t){e.new_name=null}}},[e._v("Back to list")])],1),n("vui-group-item",{attrs:{label:"Account Holder:"}},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.new_name,expression:"new_name"}],attrs:{type:"text"},domProps:{value:e.new_name},on:{input:function(t){t.target.composing||(e.new_name=t.target.value)}}})]),n("vui-group-item",{attrs:{label:"Initial Deposit:"}},[n("vui-input-numeric",{attrs:{"button-count":0,width:"7em",max:1e6},model:{value:e.new_funds,callback:function(t){e.new_funds=t},expression:"new_funds"}})],1),n("vui-group-item",[n("vui-button",{attrs:{icon:"plus-square"},on:{click:function(t){return e.create_account()}}},[e._v("Create")])],1)]:e.s.access_level?[e.active?[n("vui-group-row",[n("vui-button",{attrs:{icon:"arrow-left"},on:{click:function(t){e.active=null}}},[e._v("Back to list")]),n("vui-button",{attrs:{icon:"print",params:{print:e.active}}},[e._v("Print")])],1),n("vui-group-row",[n("h2",[e._v("Account Details")])]),n("vui-group-item",{attrs:{label:"Account Number:"}},[e._v("#"+e._s(e.active_acc.no))]),n("vui-group-item",{attrs:{label:"Holder:"}},[e._v(e._s(e.active_acc.owner))]),n("vui-group-item",{attrs:{label:"Balance:"}},[e._v(e._s(e.active_acc.money.toFixed(2))+"电")]),n("vui-group-item",{attrs:{label:"Status:"}},[e.active_acc.sus?n("span",{staticClass:"bad"},[e._v("Suspended ")]):n("span",{staticClass:"good"},[e._v("Active ")])]),n("vui-group-row",[e.active_acc.sus?n("vui-button",{attrs:{params:{suspend:{account:e.active}}}},[e._v("Unsuspend")]):n("vui-button",{attrs:{params:{suspend:{account:e.active}}}},[e._v("Suspend")]),e.active_acc.no!=e.s.station_account_number?n("vui-button",{attrs:{params:{revoke_payroll:{account:e.active}}}},[e._v("Revoke Payroll")]):e._e(),2==e.s.access_level?[n("h4",[e._v("Silent fund adjustment")]),null==e.add_funds?n("vui-button",{on:{click:function(t){e.add_funds=0}}},[e._v("Add")]):[n("vui-input-numeric",{attrs:{max:1e6},model:{value:e.add_funds,callback:function(t){e.add_funds=t},expression:"add_funds"}}),n("vui-button",{attrs:{params:{add_funds:{account:e.active,amount:e.add_funds}}}},[e._v("Add")])],n("br"),null==e.remove_funds?n("vui-button",{on:{click:function(t){e.remove_funds=0}}},[e._v("Remove")]):[n("vui-input-numeric",{attrs:{max:1e6},model:{value:e.remove_funds,callback:function(t){e.remove_funds=t},expression:"remove_funds"}}),n("vui-button",{attrs:{params:{remove_funds:{account:e.active,amount:e.remove_funds}}}},[e._v("Remove")])]]:e._e()],2),n("vui-group-row",[n("h2",[e._v("Transactions")]),n("table",{staticClass:"table border",staticStyle:{width:"100%"}},[n("tr",{staticClass:"header border"},[n("th",[n("b",[e._v("Timestamp")])]),n("th",[n("b",[e._v("Target")])]),n("th",[n("b",[e._v("Reason")])]),n("th",[n("b",[e._v("Value")])]),n("th",[n("b",[e._v("Terminal")])])]),e._l(e.active_acc.transactions,(function(t,i){return n("tr",{key:i,staticClass:"item border"},[n("td",[e._v(e._s(t.d)+" "+e._s(t.t))]),n("td",[e._v(e._s(t.tar))]),n("td",[e._v(e._s(t.purp))]),n("td",[e._v(e._s(t.am))]),n("td",[e._v(e._s(t.src))])])}))],2)])]:[n("vui-group-row",[e.s.has_printer?n("vui-button",{attrs:{icon:"print",params:{print:1}}},[e._v("Print")]):e._e(),n("vui-button",{attrs:{icon:"file"},on:{click:function(t){e.new_name=""}}},[e._v("New Account")])],1),n("vui-group-row",[n("h2",[e._v("Idris Banking Accounts")])]),n("vui-group-row",[n("table",{staticClass:"table border",staticStyle:{width:"100%"}},[n("tr",{staticClass:"header border"},[n("th",[n("b",[e._v("Number")])]),n("th",[n("b",[e._v("Name")])])]),e._l(e.s.accounts,(function(t,i){return n("tr",{key:i,staticClass:"item border"},[n("td",[n("vui-button",{on:{click:function(t){e.active=i}}},[e._v("#"+e._s(t.no))])],1),n("td",[n("span",{class:t.sus?"bad":""},[e._v(e._s(t.owner))])])])}))],2)])]]:e._e()],2)],1)},r=[],s={data:function(){return{s:this.$root.$data.state,active:null,add_funds:null,remove_funds:null,new_name:null,new_funds:0}},computed:{active_acc:function(){return this.active?this.s.accounts[this.active]:{}}},methods:{create_account:function(){this.$toTopic({create_account:{name:this.new_name,funds:this.new_funds}}),this.new_name=null,this.new_funds=0}}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},da84:function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||function(){return this}()||Function("return this")()}).call(this,n("c8ba"))},daa2:function(e,t,n){},db4f:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-group",[n("vui-group-item",{attrs:{label:"Frequency:"}},[n("vui-button",{attrs:{params:{freq:-10}}},[e._v("--")]),n("vui-button",{attrs:{params:{freq:-2}}},[e._v("-")]),n("span",{staticClass:"value-setting"},[e._v(e._s(e.frequency))]),n("vui-button",{attrs:{params:{freq:2}}},[e._v("+")]),n("vui-button",{attrs:{params:{freq:10}}},[e._v("++")])],1),n("vui-group-item",{attrs:{label:"Code:"}},[n("vui-button",{attrs:{params:{code:-10}}},[e._v("--")]),n("vui-button",{attrs:{params:{code:-2}}},[e._v("-")]),n("span",{staticClass:"value-setting"},[e._v(e._s(e.code))]),n("vui-button",{attrs:{params:{code:2}}},[e._v("+")]),n("vui-button",{attrs:{params:{code:10}}},[e._v("++")])],1),n("vui-group-item",[n("vui-button",{attrs:{params:{send:1}}},[e._v("Send")])],1)],1),e.emagged?n("vui-group",[n("vui-group-item",{attrs:{label:"Remote Door Code:"}},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.doorcode,expression:"doorcode"}],attrs:{type:"text"},domProps:{value:e.doorcode},on:{input:function(t){t.target.composing||(e.doorcode=t.target.value)}}}),n("vui-button",{attrs:{params:{resetcode:1}}},[e._v("Reset to Default")])],1),n("vui-group-item",[n("vui-button",{attrs:{params:{toggledoor:e.doorcode}}},[e._v("Toggle Door")])],1)],1):e._e()],1)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=(n("fcc9"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"b23b384c",null);t["default"]=c.exports},db96:function(e,t,n){var i=n("23e7"),r=n("825a"),s=Object.isExtensible;i({target:"Reflect",stat:!0},{isExtensible:function(e){return r(e),!s||s(e)}})},dbb4:function(e,t,n){var i=n("23e7"),r=n("83ab"),s=n("56ef"),a=n("fc6a"),o=n("06cf"),c=n("8418");i({target:"Object",stat:!0,sham:!r},{getOwnPropertyDescriptors:function(e){var t,n,i=a(e),r=o.f,l=s(i),u={},d=0;while(l.length>d)n=r(i,t=l[d++]),void 0!==n&&c(u,t,n);return u}})},dbfa:function(e,t,n){"use strict";var i=n("23e7"),r=n("1c0b"),s=n("d066"),a=n("f069"),o=n("e667"),c=n("2266"),l="No one promise resolved";i({target:"Promise",stat:!0},{any:function(e){var t=this,n=a.f(t),i=n.resolve,u=n.reject,d=o((function(){var n=r(t.resolve),a=[],o=0,d=1,h=!1;c(e,(function(e){var r=o++,c=!1;a.push(void 0),d++,n.call(t,e).then((function(e){c||h||(h=!0,i(e))}),(function(e){c||h||(c=!0,a[r]=e,--d||u(new(s("AggregateError"))(a,l)))}))})),--d||u(new(s("AggregateError"))(a,l))}));return d.error&&u(d.value),n.promise}})},dc8d:function(e,t,n){var i=n("746f");i("hasInstance")},dca8:function(e,t,n){var i=n("23e7"),r=n("bb2f"),s=n("d039"),a=n("861d"),o=n("f183").onFreeze,c=Object.freeze,l=s((function(){c(1)}));i({target:"Object",stat:!0,forced:l,sham:!r},{freeze:function(e){return c&&a(e)?c(o(e)):e}})},ddb0:function(e,t,n){var i=n("da84"),r=n("fdbc"),s=n("e260"),a=n("9112"),o=n("b622"),c=o("iterator"),l=o("toStringTag"),u=s.values;for(var d in r){var h=i[d],f=h&&h.prototype;if(f){if(f[c]!==u)try{a(f,c,u)}catch(g){f[c]=u}if(f[l]||a(f,l,d),r[d])for(var p in s)if(f[p]!==s[p])try{a(f,p,s[p])}catch(g){f[p]=s[p]}}}},ddc6:function(e,t){function n(e){return function(t){return null==e?void 0:e[t]}}e.exports=n},de06:function(e,t,n){"use strict";n("a4ec")},df0b:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Core Cooling Control System")]),e.state["input"]?n("div",[n("vui-item",{attrs:{label:"Input:"}},[e.state["input"].power?n("span",[e._v("Injecting")]):n("span",[e._v("On Hold")]),e._v(" "),n("vui-button",{attrs:{params:{in_toggle_injector:1},icon:"power-off"}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{label:"Flow Rate Limit:"}},[e._v(e._s(e.state["input"].rate)+" L/s")]),n("vui-item",{attrs:{label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"3em","button-count":3,max:e.state.maxrate},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.$toTopic({in_set_flowrate:e.state["input"].setrate})}},model:{value:e.state["input"].setrate,callback:function(t){e.$set(e.state["input"],"setrate",t)},expression:"state['input'].setrate"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{in_set_flowrate:e.state["input"].setrate}}},[e._v("Set Flow Rate")])],1)],1):n("vui-button",{attrs:{params:{in_refresh_status:1}}},[e._v("Search for input port")]),e.state["output"]?n("div",{staticStyle:{"margin-top":"2em"}},[n("vui-item",{attrs:{label:"Core Outpump:"}},[e.state["output"].power?n("span",[e._v("Open")]):n("span",[e._v("On Hold")]),e._v(" "),n("vui-button",{attrs:{params:{out_toggle_power:1},icon:"power-off"}},[e._v("Toggle Power")])],1),n("vui-item",{attrs:{label:"Min Core Pressure:"}},[e._v(e._s(e.state["output"].pressure)+" kPa")]),n("vui-item",{attrs:{label:"Command:"}},[n("vui-input-numeric",{attrs:{width:"5em","button-count":3,"decimal-places":2,max:e.state.maxpressure},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.$toTopic({out_set_pressure:e.state["output"].setpressure})}},model:{value:e.state["output"].setpressure,callback:function(t){e.$set(e.state["output"],"setpressure",t)},expression:"state['output'].setpressure"}}),n("br"),n("vui-button",{attrs:{"push-state":"",params:{out_set_pressure:e.state["output"].setpressure}}},[e._v("Set Pressure")])],1)],1):n("vui-button",{attrs:{params:{out_refresh_status:1}}},[e._v("Search for output port")])],1)},r=[],s={data:function(){return this.$root.$data}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},df75:function(e,t,n){var i=n("ca84"),r=n("7839");e.exports=Object.keys||function(e){return i(e,r)}},e008:function(e,t,n){},e01a:function(e,t,n){"use strict";var i=n("23e7"),r=n("83ab"),s=n("da84"),a=n("5135"),o=n("861d"),c=n("9bf2").f,l=n("e893"),u=s.Symbol;if(r&&"function"==typeof u&&(!("description"in u.prototype)||void 0!==u().description)){var d={},h=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof h?new u(e):void 0===e?u():u(e);return""===e&&(d[t]=!0),t};l(h,u);var f=h.prototype=u.prototype;f.constructor=h;var p=f.toString,g="Symbol(test)"==String(u("test")),m=/^Symbol\((.*)\)[^)]+$/;c(f,"description",{configurable:!0,get:function(){var e=o(this)?this.valueOf():this,t=p.call(e);if(a(d,e))return"";var n=g?t.slice(7,-1):t.replace(m,"$1");return""===n?void 0:n}}),i({global:!0,forced:!0},{Symbol:h})}},e163:function(e,t,n){var i=n("5135"),r=n("7b0b"),s=n("f772"),a=n("e177"),o=s("IE_PROTO"),c=Object.prototype;e.exports=a?Object.getPrototypeOf:function(e){return e=r(e),i(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?c:null}},e16d:function(e,t,n){},e177:function(e,t,n){var i=n("d039");e.exports=!i((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},e1e4:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._l(e.items,(function(t,i){return n("div",{key:i,staticStyle:{clear:"both"}},[e._v(" "+e._s(i)+": "+e._s(t)+" Credits "),n("div",{staticStyle:{float:"right"}},[n("vui-button",{attrs:{params:{buy:{name:i,price:t,amount:1}},width:"2em"}},[e._v("Buy")]),1==e.editmode?n("vui-button",{attrs:{params:{remove:i},width:"3em"}},[e._v("Delete")]):e._e()],1)])})),1==e.editmode?n("div",[n("input",{directives:[{name:"model",rawName:"v-model",value:e.tmp_name,expression:"tmp_name"}],domProps:{value:e.tmp_name},on:{input:function(t){t.target.composing||(e.tmp_name=t.target.value)}}}),n("vui-input-numeric",{attrs:{width:"3em","button-count":2},model:{value:e.tmp_price,callback:function(t){e.tmp_price=t},expression:"tmp_price"}}),n("vui-button",{attrs:{params:{add:{name:e.tmp_name,price:e.tmp_price}}}},[e._v("Add")])],1):e._e(),n("vui-button",{attrs:{params:{locking:1},width:"3em"}},[e._v("Toggle Lock")]),n("vui-button",{attrs:{params:{confirm:e.buying}}},[e._v("Confirm Selection")]),n("vui-button",{attrs:{params:{clear:1}}},[e._v("Clear selection")]),n("h4",[e._v(" Selected Products:")]),e._l(e.buying,(function(t,i){return n("div",{key:i,staticStyle:{clear:"both"}},[e.buying[i]&&e.buying[i]>=0?n("span",[e._v(" "+e._s(e.buying[i])+"x "+e._s(i)+": at "+e._s(t*e.items[i])+" Credits "),n("div",{staticStyle:{float:"right"}},[n("vui-button",{attrs:{params:{removal:{name:i,price:t,amount:1}},width:"2em"}},[e._v("Remove")])],1)]):e._e()])}))],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},e210:function(e,t,n){},e21d:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("861d"),a=Object.isFrozen,o=r((function(){a(1)}));i({target:"Object",stat:!0,forced:o},{isFrozen:function(e){return!s(e)||!!a&&a(e)}})},e25e:function(e,t,n){var i=n("23e7"),r=n("c20d");i({global:!0,forced:parseInt!=r},{parseInt:r})},e260:function(e,t,n){"use strict";var i=n("fc6a"),r=n("44d2"),s=n("3f8c"),a=n("69f3"),o=n("7dd0"),c="Array Iterator",l=a.set,u=a.getterFor(c);e.exports=o(Array,"Array",(function(e,t){l(this,{type:c,target:i(e),index:0,kind:t})}),(function(){var e=u(this),t=e.target,n=e.kind,i=e.index++;return!t||i>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:i,done:!1}:"values"==n?{value:t[i],done:!1}:{value:[i,t[i]],done:!1}}),"values"),s.Arguments=s.Array,r("keys"),r("values"),r("entries")},e285:function(e,t,n){var i=n("da84"),r=i.isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&r(e)}},e2cc:function(e,t,n){var i=n("6eeb");e.exports=function(e,t,n){for(var r in t)i(e,r,t[r],n);return e}},e31d:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.mode?[n("h2",[e._v("Vote: "+e._s(e.question))]),e._v(" Time Left: "+e._s(e.reman)+" s"),n("hr"),n("table",[n("tr",[n("th",[e._v("Choices")]),n("th",[e._v("Votes")]),"gamemode"==e.mode?n("th",[e._v("Minimum Players")]):e._e()]),e._l(e.uichoices,(function(t,i){return n("tr",{key:i},[n("td",{staticStyle:{"text-align":"left"}},[n("vui-button",{class:{on:i==e.voted},attrs:{params:{action:"vote",vote:i}}},[e._v(e._s(t.name))])],1),n("td",[e._v(e._s(t.votes))]),t.extra?n("td",[e._v(e._s(t.extra))]):e._e()])}))],2),n("hr"),e.isstaff?[n("vui-button",{attrs:{params:{action:"cancel"}}},[e._v("Cancel")])]:e._e()]:[n("h2",[e._v("Start a vote:")]),n("hr"),n("ul",[n("li",[n("vui-button",{attrs:{disabled:!e.isstaff&&!e.allow_vote_restart,params:{action:"restart"}}},[e._v("Restart")])],1),n("li",[n("vui-button",{attrs:{disabled:!e.isstaff&&!e.allow_vote_restart,params:{action:"crew_transfer"}}},[e._v("Crew Transfer")]),(e.isstaff||e.allow_vote_restart)&&e.is_code_red?n("span",[e._v("(Disallowed, Code Red or above)")]):e._e(),e.isstaff?n("vui-button",{class:{on:e.allow_vote_restart},attrs:{params:{action:"toggle_restart"}}},[e._v("Toggle Restart / Crew Transfer voting")]):e._e()],1),n("li",[n("vui-button",{attrs:{disabled:!e.isstaff&&!e.allow_vote_mode,params:{action:"gamemode"}}},[e._v("GameMode")]),e.isstaff?n("vui-button",{class:{on:e.allow_vote_mode},attrs:{params:{action:"toggle_gamemode"}}},[e._v("Toggle GameMode voting")]):e._e()],1),n("li",[n("vui-button",{attrs:{disabled:!e.allow_extra_antags,params:{action:"add_antagonist"}}},[e._v("Add Antagonist Type")])],1),n("li",[n("vui-button",{attrs:{disabled:!e.isstaff,params:{action:"custom"}}},[e._v("Custom")])],1)])]],2)},r=[];n("a4d3"),n("e01a"),n("d28b"),n("e260"),n("d3b7"),n("3ca3"),n("ddb0");function s(e){return s="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s(e)}var a={data:function(){return this.$root.$data.state},computed:{uichoices:function(){return"object"===s(this.choices)?this.choices:{}},reman:function(){return Math.round((this.endtime-this.$root.$data.wtime)/10)}}},o=a,c=(n("8928"),n("2877")),l=Object(c["a"])(o,i,r,!1,null,"8bcc2668",null);t["default"]=l.exports},e3a9:function(e,t,n){"use strict";n("4310")},e439:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("fc6a"),a=n("06cf").f,o=n("83ab"),c=r((function(){a(1)})),l=!o||c;i({target:"Object",stat:!0,forced:l,sham:!o},{getOwnPropertyDescriptor:function(e,t){return a(s(e),t)}})},e43e:function(e,t,n){var i=n("23e7"),r=n("d039"),s=n("861d"),a=Object.isSealed,o=r((function(){a(1)}));i({target:"Object",stat:!0,forced:o},{isSealed:function(e){return!s(e)||!!a&&a(e)}})},e48d:function(e,t,n){"use strict";n("1650")},e538:function(e,t,n){var i=n("b622");t.f=i},e58c:function(e,t,n){"use strict";var i=n("fc6a"),r=n("a691"),s=n("50c4"),a=n("a640"),o=n("ae40"),c=Math.min,l=[].lastIndexOf,u=!!l&&1/[1].lastIndexOf(1,-0)<0,d=a("lastIndexOf"),h=o("indexOf",{ACCESSORS:!0,1:0}),f=u||!d||!h;e.exports=f?function(e){if(u)return l.apply(this,arguments)||0;var t=i(this),n=s(t.length),a=n-1;for(arguments.length>1&&(a=c(a,r(arguments[1]))),a<0&&(a=n+a);a>=0;a--)if(a in t&&t[a]===e)return a||0;return-1}:l},e667:function(e,t){e.exports=function(e){try{return{error:!1,value:e()}}catch(t){return{error:!0,value:t}}}},e6cf:function(e,t,n){"use strict";var i,r,s,a,o=n("23e7"),c=n("c430"),l=n("da84"),u=n("d066"),d=n("fea9"),h=n("6eeb"),f=n("e2cc"),p=n("d44e"),g=n("2626"),m=n("861d"),v=n("1c0b"),b=n("19aa"),y=n("8925"),w=n("2266"),_=n("1c7e"),x=n("4840"),k=n("2cf4").set,A=n("b575"),C=n("cdf9"),E=n("44de"),S=n("f069"),F=n("e667"),$=n("69f3"),T=n("94ca"),L=n("b622"),D=n("605d"),B=n("2d00"),R=L("species"),O="Promise",M=$.get,j=$.set,I=$.getterFor(O),P=d,N=l.TypeError,W=l.document,H=l.process,V=u("fetch"),U=S.f,z=U,G=!!(W&&W.createEvent&&l.dispatchEvent),q="function"==typeof PromiseRejectionEvent,K="unhandledrejection",Y="rejectionhandled",X=0,J=1,Q=2,Z=1,ee=2,te=T(O,(function(){var e=y(P)!==String(P);if(!e){if(66===B)return!0;if(!D&&!q)return!0}if(c&&!P.prototype["finally"])return!0;if(B>=51&&/native code/.test(P))return!1;var t=P.resolve(1),n=function(e){e((function(){}),(function(){}))},i=t.constructor={};return i[R]=n,!(t.then((function(){}))instanceof n)})),ne=te||!_((function(e){P.all(e)["catch"]((function(){}))})),ie=function(e){var t;return!(!m(e)||"function"!=typeof(t=e.then))&&t},re=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;A((function(){var i=e.value,r=e.state==J,s=0;while(n.length>s){var a,o,c,l=n[s++],u=r?l.ok:l.fail,d=l.resolve,h=l.reject,f=l.domain;try{u?(r||(e.rejection===ee&&ce(e),e.rejection=Z),!0===u?a=i:(f&&f.enter(),a=u(i),f&&(f.exit(),c=!0)),a===l.promise?h(N("Promise-chain cycle")):(o=ie(a))?o.call(a,d,h):d(a)):h(i)}catch(p){f&&!c&&f.exit(),h(p)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},se=function(e,t,n){var i,r;G?(i=W.createEvent("Event"),i.promise=t,i.reason=n,i.initEvent(e,!1,!0),l.dispatchEvent(i)):i={promise:t,reason:n},!q&&(r=l["on"+e])?r(i):e===K&&E("Unhandled promise rejection",n)},ae=function(e){k.call(l,(function(){var t,n=e.facade,i=e.value,r=oe(e);if(r&&(t=F((function(){D?H.emit("unhandledRejection",i,n):se(K,n,i)})),e.rejection=D||oe(e)?ee:Z,t.error))throw t.value}))},oe=function(e){return e.rejection!==Z&&!e.parent},ce=function(e){k.call(l,(function(){var t=e.facade;D?H.emit("rejectionHandled",t):se(Y,t,e.value)}))},le=function(e,t,n){return function(i){e(t,i,n)}},ue=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=Q,re(e,!0))},de=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw N("Promise can't be resolved itself");var i=ie(t);i?A((function(){var n={done:!1};try{i.call(t,le(de,n,e),le(ue,n,e))}catch(r){ue(n,r,e)}})):(e.value=t,e.state=J,re(e,!1))}catch(r){ue({done:!1},r,e)}}};te&&(P=function(e){b(this,P,O),v(e),i.call(this);var t=M(this);try{e(le(de,t),le(ue,t))}catch(n){ue(t,n)}},i=function(e){j(this,{type:O,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:X,value:void 0})},i.prototype=f(P.prototype,{then:function(e,t){var n=I(this),i=U(x(this,P));return i.ok="function"!=typeof e||e,i.fail="function"==typeof t&&t,i.domain=D?H.domain:void 0,n.parent=!0,n.reactions.push(i),n.state!=X&&re(n,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),r=function(){var e=new i,t=M(e);this.promise=e,this.resolve=le(de,t),this.reject=le(ue,t)},S.f=U=function(e){return e===P||e===s?new r(e):z(e)},c||"function"!=typeof d||(a=d.prototype.then,h(d.prototype,"then",(function(e,t){var n=this;return new P((function(e,t){a.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof V&&o({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return C(P,V.apply(l,arguments))}}))),o({global:!0,wrap:!0,forced:te},{Promise:P}),p(P,O,!1,!0),g(O),s=u(O),o({target:O,stat:!0,forced:te},{reject:function(e){var t=U(this);return t.reject.call(void 0,e),t.promise}}),o({target:O,stat:!0,forced:c||te},{resolve:function(e){return C(c&&this===s?P:this,e)}}),o({target:O,stat:!0,forced:ne},{all:function(e){var t=this,n=U(t),i=n.resolve,r=n.reject,s=F((function(){var n=v(t.resolve),s=[],a=0,o=1;w(e,(function(e){var c=a++,l=!1;s.push(void 0),o++,n.call(t,e).then((function(e){l||(l=!0,s[c]=e,--o||i(s))}),r)})),--o||i(s)}));return s.error&&r(s.value),n.promise},race:function(e){var t=this,n=U(t),i=n.reject,r=F((function(){var r=v(t.resolve);w(e,(function(e){r.call(t,e).then(n.resolve,i)}))}));return r.error&&i(r.value),n.promise}})},e6e1:function(e,t,n){var i=n("23e7");i({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},e71b:function(e,t,n){"use strict";var i=n("23e7"),r=n("83ab"),s=n("eb1d"),a=n("7b0b"),o=n("1c0b"),c=n("9bf2");r&&i({target:"Object",proto:!0,forced:s},{__defineSetter__:function(e,t){c.f(a(this),e,{set:o(t),enumerable:!0,configurable:!0})}})},e786:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("table",{staticClass:"table border"},[n("tr",{staticClass:"header"},e._l(e.categories,(function(t){return n("th",{key:t},[n("vui-button",{class:{selected:t===e.sel_category},attrs:{params:{selected:t}}},[e._v(e._s(t))])],1)})),0),e.sel_category?[e.supplies.length?[e._m(0),e._l(e.supplies,(function(t){return n("tr",{key:t.key,staticClass:"item border"},[n("td",[e._v(e._s(e.generateName(t.name,t.key)))]),n("td",[e._v("("+e._s(t.x)+", "+e._s(t.y)+")")]),n("td",[e._v(e._s(t.dir))]),n("td",[e._v(e._s(t.status))])])})),n("tr",{staticClass:"header border"},[n("td",{attrs:{colspan:"4"}},[e._v("User location: ("+e._s(e.user_loc.x)+", "+e._s(e.user_loc.y)+")")])])]:n("tr",[n("td",{attrs:{colspan:"4"}},[e._v("Unable to locate any "+e._s(e.sel_category.toLowerCase())+" in your vicinity.")])])]:e._e()],2)])},r=[function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("tr",{staticClass:"header border"},[n("th",{attrs:{scope:"col"}},[e._v("ID")]),n("th",{attrs:{scope:"col"}},[e._v("Location")]),n("th",{attrs:{scope:"col"}},[e._v("Direction")]),n("th",{attrs:{scope:"col"}},[e._v("Status")])])}],s={data:function(){return this.$root.$data.state},methods:{generateName:function(e,t){if(e&&!isNaN(t))return t+=1,e+" (#"+t+")"}}},a=s,o=(n("9acc"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"1021c617",null);t["default"]=c.exports},e893:function(e,t,n){var i=n("5135"),r=n("56ef"),s=n("06cf"),a=n("9bf2");e.exports=function(e,t){for(var n=r(t),o=a.f,c=s.f,l=0;l1?arguments[1]:void 0)}))},e958:function(e,t,n){"use strict";n("814e")},e95a:function(e,t,n){var i=n("b622"),r=n("3f8c"),s=i("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||a[s]===e)}},e9a7:function(e,t,n){var i=n("76dd"),r=n("8103");function s(e){return r(i(e).toLowerCase())}e.exports=s},e9c4:function(e,t,n){var i=n("23e7"),r=n("d066"),s=n("d039"),a=r("JSON","stringify"),o=/[\uD800-\uDFFF]/g,c=/^[\uD800-\uDBFF]$/,l=/^[\uDC00-\uDFFF]$/,u=function(e,t,n){var i=n.charAt(t-1),r=n.charAt(t+1);return c.test(e)&&!l.test(r)||l.test(e)&&!c.test(i)?"\\u"+e.charCodeAt(0).toString(16):e},d=s((function(){return'"\\udf06\\ud834"'!==a("\udf06\ud834")||'"\\udead"'!==a("\udead")}));a&&i({target:"JSON",stat:!0,forced:d},{stringify:function(e,t,n){var i=a.apply(null,arguments);return"string"==typeof i?i.replace(o,u):i}})},ea72:function(e,t,n){var i=n("7559"),r=n("7e8e"),s=n("76dd"),a=n("f4d9");function o(e,t,n){return e=s(e),t=n?void 0:t,void 0===t?r(e)?a(e):i(e):e.match(t)||[]}e.exports=o},eb1d:function(e,t,n){"use strict";var i=n("c430"),r=n("da84"),s=n("d039");e.exports=i||!s((function(){var e=Math.random();__defineSetter__.call(null,e,(function(){})),delete r[e]}))},eb66:function(e,t,n){"use strict";n("c765")},ebb5:function(e,t,n){"use strict";var i,r=n("a981"),s=n("83ab"),a=n("da84"),o=n("861d"),c=n("5135"),l=n("f5df"),u=n("9112"),d=n("6eeb"),h=n("9bf2").f,f=n("e163"),p=n("d2bb"),g=n("b622"),m=n("90e3"),v=a.Int8Array,b=v&&v.prototype,y=a.Uint8ClampedArray,w=y&&y.prototype,_=v&&f(v),x=b&&f(b),k=Object.prototype,A=k.isPrototypeOf,C=g("toStringTag"),E=m("TYPED_ARRAY_TAG"),S=r&&!!p&&"Opera"!==l(a.opera),F=!1,$={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},T=function(e){var t=l(e);return"DataView"===t||c($,t)},L=function(e){return o(e)&&c($,l(e))},D=function(e){if(L(e))return e;throw TypeError("Target is not a typed array")},B=function(e){if(p){if(A.call(_,e))return e}else for(var t in $)if(c($,i)){var n=a[t];if(n&&(e===n||A.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},R=function(e,t,n){if(s){if(n)for(var i in $){var r=a[i];r&&c(r.prototype,e)&&delete r.prototype[e]}x[e]&&!n||d(x,e,n?t:S&&b[e]||t)}},O=function(e,t,n){var i,r;if(s){if(p){if(n)for(i in $)r=a[i],r&&c(r,e)&&delete r[e];if(_[e]&&!n)return;try{return d(_,e,n?t:S&&v[e]||t)}catch(o){}}for(i in $)r=a[i],!r||r[e]&&!n||d(r,e,t)}};for(i in $)a[i]||(S=!1);if((!S||"function"!=typeof _||_===Function.prototype)&&(_=function(){throw TypeError("Incorrect invocation")},S))for(i in $)a[i]&&p(a[i],_);if((!S||!x||x===k)&&(x=_.prototype,S))for(i in $)a[i]&&p(a[i].prototype,x);if(S&&f(w)!==x&&p(w,x),s&&!c(x,C))for(i in F=!0,h(x,C,{get:function(){return o(this)?this[E]:void 0}}),$)a[i]&&u(a[i],E,i);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:S,TYPED_ARRAY_TAG:F&&E,aTypedArray:D,aTypedArrayConstructor:B,exportTypedArrayMethod:R,exportTypedArrayStaticMethod:O,isView:T,isTypedArray:L,TypedArray:_,TypedArrayPrototype:x}},ec72:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-input-search",{attrs:{input:e.s.reactions,keys:["result.name","reagents.name","result.description"],autofocus:"",threshold:e.threshold,"include-score":""},model:{value:e.output,callback:function(t){e.output=t},expression:"output"}}),n("vui-button",{on:{click:function(t){e.desc=!e.desc}}},[e._v("Toggle Descriptions")]),e._l(e.output,(function(t){return n("div",{key:t.item.id,staticClass:"recipe-block",style:{opacity:1-t.score*e.score_multiplier}},[n("h2",{staticClass:"highlight"},[e._v(e._s(t.item.result.name)+" ("+e._s(e.u(t.item.result.amount))+")")]),n("p",{directives:[{name:"show",rawName:"v-show",value:e.desc,expression:"desc"}],staticClass:"description"},[e._v(e._s(t.item.result.description))]),n("h3",{staticClass:"highlight"},[e._v("Required Reagents")]),e._l(t.item.reagents,(function(i){return n("span",{key:"re"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(e.u(i.amount))),n("br")])})),t.item.catalysts.length?[n("h3",{staticClass:"highlight"},[e._v("Catalysts")]),e._l(t.item.catalysts,(function(i){return n("span",{key:"ca"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(e.u(i.amount))),n("br")])}))]:e._e(),t.item.inhibitors.length?[n("h3",{staticClass:"highlight"},[e._v("Inhibitors")]),e._l(t.item.inhibitors,(function(i){return n("span",{key:"in"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(e.u(i.amount))),n("br")])}))]:e._e(),t.item.temp_min&&t.item.temp_min.length?[n("h3",{staticClass:"highlight"},[e._v("Minimum Required Temperatures")]),e._l(t.item.temp_min,(function(i){return n("span",{key:"tm"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(i.temp)+"°K"),n("br")])}))]:e._e(),t.item.temp_max&&t.item.temp_max.length?[n("h3",{staticClass:"highlight"},[e._v("Maximum Required Temperatures")]),e._l(t.item.temp_max,(function(i){return n("span",{key:"tx"+i.name+t.item.result.name},[e._v(e._s(i.name)+": "+e._s(i.temp)+"°K"),n("br")])}))]:e._e()],2)}))],2)},r=[],s={data:function(){return{s:this.$root.$data.state,output:[],threshold:.3,desc:!0}},methods:{u:function(e){return"".concat(e,1==e?" unit":" units")}},computed:{score_multiplier:function(){return 1/this.threshold}}},a=s,o=(n("f889"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"710a36a7",null);t["default"]=c.exports},ec97:function(e,t,n){"use strict";var i=n("ebb5"),r=n("8aa7"),s=i.aTypedArrayConstructor,a=i.exportTypedArrayStaticMethod;a("of",(function(){var e=0,t=arguments.length,n=new(s(this))(t);while(t>e)n[e]=arguments[e++];return n}),r)},eee7:function(e,t,n){"use strict";var i=n("23e7"),r=n("58a8").start,s=n("c8d2"),a=s("trimStart"),o=a?function(){return r(this)}:"".trimStart;i({target:"String",proto:!0,forced:a},{trimStart:o,trimLeft:o})},ef41:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("vui-button",{on:{click:function(t){e.fliped=!e.fliped}}},[e._v("Flip")]),n("div",{staticClass:"text-center"},e._l(e.boardTiles,(function(t,i){return n("div",{key:i,staticClass:"tileRow"},e._l(t,(function(t,r){return n("div",{key:i+""+r,staticClass:"tile",class:t.tile+(e.selected==t.pos?" sel":""),on:{click:function(n){return n.stopPropagation(),e.handleTileClick(t.pos)}}},[e.getPiece(t.pos)?n("div",{staticClass:"piece fa",class:e.getPieceClass(t.pos)+(e.selected==t.pos?" sel":""),on:{click:function(n){return n.stopPropagation(),e.handlePieceClick(t.pos)}}}):e._e()])})),0)})),0),null!=e.selected?[e.isPiece(e.selected)?[n("vui-button",{on:{click:e.removePiece}},[e._v("Remove")])]:[n("div",{staticClass:"mt-1"},[e._v(" Red: "),e._l(e.types,(function(t,i){return n("vui-button",{key:"r"+i,attrs:{icon:t.i},on:{click:function(n){return e.spawn(t.k,"red")}}},[e._v(e._s(t.n))])}))],2),n("div",[e._v(" Black: "),e._l(e.types,(function(t,i){return n("vui-button",{key:"b"+i,attrs:{icon:t.i},on:{click:function(n){return e.spawn(t.k,"black")}}},[e._v(e._s(t.n))])}))],2)]]:e.s.pieces.length?e._e():[n("vui-button",{on:{click:e.presetCheckers}},[e._v("Initialize checker board")]),n("vui-button",{on:{click:e.presetChess}},[e._v("Initialize chess board")])]],2)},r=[];n("a4d3"),n("4de4"),n("7db0"),n("0481"),n("4160"),n("a630"),n("c975"),n("e260"),n("d81d"),n("fb6a"),n("4069"),n("e439"),n("dbb4"),n("b64b"),n("d3b7"),n("3ca3"),n("159b"),n("ddb0");function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:null;return t||(t=this.getPiece(e)),t&&!t.ghost},getPieceClass:function(e){var t=this.getPiece(e);return"ic-"+d[t.type]+" "+t.faction+(t.ghost?" ghost":"")},removePiece:function(){var e=this.getPiece(this.selected);this.$toTopic({remove:{index:e.index}}),this.selected=null},spawn:function(e,t){var n=this.getPiece(this.selected);n&&!n.ghost||(this.qspawn(e,t,this.selected),this.selected=null)},qspawn:function(e,t,n){this.$toTopic({add:{piece:{type:e,faction:t,pos:n}}})},handlePieceClick:function(e){if(!this.isPiece(e))return this.handleTileClick(e);this.selected==e?this.selected=null:this.selected=e},handleTileClick:function(e){if(this.selected==e)this.selected=null;else if(null!=this.selected){var t=this.getPiece(this.selected);this.isPiece(null,t)&&!this.isPiece(e)&&this.$toTopic({change:{piece:a(a({},u(t)),{},{pos:e}),index:t.index}}),this.selected=null}else this.selected=e},presetChess:function(){var e=this;g.forEach((function(t,n){return t?e.qspawn(t.t,t.f,n):""}))},presetCheckers:function(){var e=this;p.forEach((function(t,n){return t?e.qspawn(t.t,t.f,n):""}))}}},v=m,b=(n("3ecc"),n("2877")),y=Object(b["a"])(v,i,r,!1,null,"3e8a25e7",null);t["default"]=y.exports},efe9:function(e,t,n){var i=n("746f");i("isConcatSpreadable")},efec:function(e,t,n){var i=n("9112"),r=n("51eb"),s=n("b622"),a=s("toPrimitive"),o=Date.prototype;a in o||i(o,a,r)},f00c:function(e,t,n){var i=n("23e7"),r=n("e285");i({target:"Number",stat:!0},{isFinite:r})},f046:function(e,t,n){"use strict";n("d7b5")},f069:function(e,t,n){"use strict";var i=n("1c0b"),r=function(e){var t,n;this.promise=new e((function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i})),this.resolve=i(t),this.reject=i(n)};e.exports.f=function(e){return new r(e)}},f095:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",[n("h3",[e._v("Status:")]),e.active?n("vui-button",{attrs:{params:{state:1}}},[e._v("Active")]):n("vui-button",{attrs:{params:{state:1}}},[e._v("Inactive")])],1),n("div",[n("h3",[e._v("Beam Visibility:")]),e.visible?n("vui-button",{attrs:{params:{visible:1}}},[e._v("Visible")]):n("vui-button",{attrs:{params:{visible:1}}},[e._v("Invisible")])],1)])},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},f0e0:function(e,t,n){"use strict";n("a4d3"),n("e01a"),n("d28b"),n("c975"),n("e260"),n("a15b"),n("cca6"),n("d3b7"),n("ac1f"),n("3ca3"),n("841c"),n("ddb0");var i=n("025e"),r=(n("d81d"),n("13d5"),function(e,t){return Array.prototype.map.call(e,(function(e,n){return e+t[n]}))}),s={add:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:[0,0],t=s.add(e,o.screenOffset);u(o.windowKey,{pos:t[0]+","+t[1]})}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[300,300];u(o.windowKey,{size:e[0]+"x"+e[1]})}var m=function(){return s.scale(o.screenOffset,-1)},v=function(){return[window.screen.availWidth,window.screen.availHeight]};function b(){l(o.windowKey,"pos",(function(e){o.screenOffset=[e.x-window.screenLeft,e.y-window.screenTop]}))}function y(e){var t,n;o.dragging=!0,o.dragPointOffset=[window.screenLeft-e.screenX,window.screenTop-e.screenY],null===(t=e.target)||void 0===t||t.setCapture(),null===(n=e.target)||void 0===n||n.focus(),_(e),e.target.addEventListener("mousemove",_)}function w(e){e.target.removeEventListener("mousemove",_),e.target.releaseCapture(),document.getElementById("content").focus(),o.dragging=!1}function _(e){o.dragging&&(e.preventDefault(),p(s.add([e.screenX,e.screenY],o.dragPointOffset)))}function x(e,t,n){o.resizeMatrix=[e,t],o.resizing=!0,o.dragPointOffset=[window.screenLeft-n.screenX,window.screenTop-n.screenY],o.initialSize=[window.innerWidth,window.innerHeight],document.addEventListener("mousemove",A),document.addEventListener("mouseup",k),A(n)}function k(e){A(e),document.removeEventListener("mousemove",A),document.removeEventListener("mouseup",k),document.getElementById("content").focus(),o.resizing=!1}function A(e){if(o.resizing){e.preventDefault();var t=s.multiply(o.resizeMatrix,s.add([e.screenX,e.screenY],s.scale([window.screenLeft,window.screenTop],-1),o.dragPointOffset,[1,1]));o.size=s.add(o.initialSize,t),o.size[0]=Math.max(o.size[0],100),o.size[1]=Math.max(o.size[1],50),g(o.size)}}function C(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;u(o.windowKey,{"is-visible":e})}t["a"]={isBYOND:c,winget:l,winset:u,setWindowKey:d,getWindowPosition:h,getWindowSize:f,setWindowPosition:p,setWindowSize:g,getScreenPosition:m,getScreenSize:v,setupDrag:b,dragStartHandler:y,dragEndHandler:w,dragMoveHandler:_,resizeStartHandler:x,resizeEndHandler:k,resizeMoveHandler:A,setVisibility:C}},f183:function(e,t,n){var i=n("d012"),r=n("861d"),s=n("5135"),a=n("9bf2").f,o=n("90e3"),c=n("bb2f"),l=o("meta"),u=0,d=Object.isExtensible||function(){return!0},h=function(e){a(e,l,{value:{objectID:"O"+ ++u,weakData:{}}})},f=function(e,t){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!s(e,l)){if(!d(e))return"F";if(!t)return"E";h(e)}return e[l].objectID},p=function(e,t){if(!s(e,l)){if(!d(e))return!0;if(!t)return!1;h(e)}return e[l].weakData},g=function(e){return c&&m.REQUIRED&&d(e)&&!s(e,l)&&h(e),e},m=e.exports={REQUIRED:!1,fastKey:f,getWeakData:p,onFreeze:g};i[l]=!0},f264:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.manifestLen(e.fixedmanifest)>0?n("div",e._l(e.fixedmanifest,(function(t,i){return n("table",{key:i,class:"border-dept-"+i.toLowerCase()},[n("tr",{class:"bg-dept-"+i.toLowerCase()},[n("th",{staticClass:"fw-bold",attrs:{colspan:"3"}},[e._v(e._s(i))])]),e._l(t,(function(t){return n("tr",{key:t.name,class:{"fw-bold":t.head}},[n("td",[e._v(e._s(t.name))]),n("td",[e._v(e._s(t.rank))]),n("td",[e._v(e._s(t.active))])])}))],2)})),0):n("div",{staticClass:"fst-italic"},[e._v(" There is no crew. ")]),e.allow_printing?n("div",{staticClass:"text-center mt-2"},[n("vui-button",{attrs:{params:{action:"print"},icon:"print"}},[e._v("Print current manifest")])],1):e._e()])},r=[];n("a4d3"),n("e01a"),n("d28b"),n("4de4"),n("4160"),n("a630"),n("e260"),n("fb6a"),n("b0c0"),n("4fad"),n("c1f9"),n("d3b7"),n("07ac"),n("25f0"),n("3ca3"),n("159b"),n("ddb0");function s(e,t){return u(e)||l(e,t)||o(e,t)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(e,t){if(e){if("string"===typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n0})))}}},h=d,f=(n("c13e"),n("2877")),p=Object(f["a"])(h,i,r,!1,null,"c49443fe",null);t["default"]=p.exports},f309:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{staticClass:"table border"},[n("div",{staticClass:"header border"},[n("div",{staticClass:"header-item"},[e._v("Name")]),n("div",{staticClass:"header-item"},[n("vui-tooltip",{attrs:{label:"Pulse/Cell"}},[e._v("Pulse rate or Cell Charge (IPCs)")])],1),n("div",{staticClass:"header-item"},[n("vui-tooltip",{attrs:{label:"BP"}},[e._v("Blood pressure")])],1),n("div",{staticClass:"header-item"},[n("vui-tooltip",{attrs:{label:"Oxy"}},[e._v("Oxygenation")])],1),n("div",{staticClass:"header-item"},[n("vui-tooltip",{attrs:{label:"Temp"}},[e._v("Temperature")])],1),n("div",{staticClass:"header-item"},[e._v("Location")]),e.isAI?[n("div",{staticClass:"header-item"})]:e._e()],2),e._l(e.crewmembers,(function(t){return n("div",{key:t.ref,staticClass:"sensor"},[n("div",{staticClass:"item"},[e._v(e._s(t.name)+" ("+e._s(t.ass)+")")]),-1==t.cellCharge?n("div",{staticClass:"item",class:e.getPulseClass(t.tpulse)},[e._v(e._s(t.pulse))]):n("div",{staticClass:"item",class:e.getChargeClass(t.cellCharge)},[e._v(e._s(t.cellCharge)+"%")]),t.stype>1?n("div",{staticClass:"item",class:e.getPressureClass(t.tpressure)},[e._v(e._s(t.pressure))]):n("div",{staticClass:"item"},[e._v("N/A")]),n("div",{staticClass:"item",class:e.getOxyClass(t.oxyg)},[e._v(e._s(e.toOxyLabel(t.oxyg)))]),n("div",{staticClass:"item"},[t.stype>1?n("span",[e._v(e._s(e.roundTemp(t.bodytemp)))]):e._e()]),t.stype>2?n("div",{staticClass:"item"},[e._v(e._s(t.area)+" ("+e._s(t.x)+", "+e._s(t.y)+", "+e._s(t.z)+")")]):n("div",{staticClass:"item"},[e._v("Not Available")]),e.isAI?[n("div",{staticClass:"item"},[n("vui-button",{attrs:{params:{track:t.ref},disabled:t.stype<3}},[e._v("Track")])],1)]:e._e()],2)}))],2)])},r=[],s={data:function(){return this.$root.$data.state},methods:{roundTemp:function(e){return Math.round(10*e)/10},toOxyLabel:function(e){switch(e){case 5:return"increased";case 4:return"normal";case 3:return"low";case 2:return"very low";case 1:return"extremely low";default:return"N/A"}},getOxyClass:function(e){switch(e){case 5:return"highlight";case 4:return"good";case 3:return"average";case 2:return"bad";case 1:return"bad";default:return"neutral"}},getPulseClass:function(e){switch(e){case 0:return"bad";case 1:return"average";case 2:return"good";case 3:return"highlight";case 4:return"average";case 5:return"bad";default:return"neutral"}},getPressureClass:function(e){switch(e){case 1:return"bad";case 2:return"good";case 3:return"average";case 4:return"bad";default:return"neutral"}},getChargeClass:function(e){return e>10?"highlight":"bad"}}},a=s,o=(n("e3a9"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"731c48b4",null);t["default"]=c.exports},f3ce:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"uiTitleWrapper",attrs:{draggable:""},on:{mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.startDragging(t)},mouseup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.stopDragging(t)}}},[n("div",{staticClass:"titleBar"},[n("div",{staticClass:"uiStatusIcon uiIcon24",class:e.statusClass,attrs:{unselectable:"on"}}),n("i",{staticClass:"fas ic-bug uiIcon24 uiDebugIcon",class:e.debugClass,attrs:{unselectable:"on"},on:{click:function(t){return e.activateDebug()},mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.prevent(t)}}}),n("div",{staticClass:"uiTitleText",attrs:{unselectable:"on"}},[e._v(e._s(e.title))]),n("div",{staticClass:"uiTitleClose",attrs:{unselectable:"on"},on:{click:function(t){return e.closeUI(t)},mousedown:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:e.prevent(t)}}},[e._v("×")])]),e._t("default")],2)},r=[],s=n("f0e0"),a={data:function(){return this.$root.$data},computed:{statusClass:function(){return 2==this.status?"good":1==this.status?"average":"bad"},debugClass:function(){return 1==this.debug_view?"good":1==this.debug?"bad":"hidden"}},methods:{closeUI:function(e){e.stopPropagation(),this.$toTopicRaw({src:this.uiref,vueuiclose:1}),s["a"].setVisibility(0)},startDragging:function(e){s["a"].dragStartHandler(e)},stopDragging:function(e){s["a"].dragEndHandler(e)},prevent:function(e){e.stopPropagation()},activateDebug:function(){this.debug_view=!this.debug_view,this.debug_view?(document.getElementById("content").classList.add("uiDebug"),document.getElementById("debug").classList.add("uiDebug")):(document.getElementById("content").classList.remove("uiDebug"),document.getElementById("debug").classList.remove("uiDebug"))}}},o=a,c=n("2877"),l=Object(c["a"])(o,i,r,!1,null,null,null);t["default"]=l.exports},f4b3:function(e,t,n){"use strict";var i=n("23e7"),r=n("d039"),s=n("7b0b"),a=n("c04e"),o=r((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}));i({target:"Date",proto:!0,forced:o},{toJSON:function(e){var t=s(this),n=a(t);return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},f4d9:function(e,t){var n="\\ud800-\\udfff",i="\\u0300-\\u036f",r="\\ufe20-\\ufe2f",s="\\u20d0-\\u20ff",a=i+r+s,o="\\u2700-\\u27bf",c="a-z\\xdf-\\xf6\\xf8-\\xff",l="\\xac\\xb1\\xd7\\xf7",u="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",d="\\u2000-\\u206f",h=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",f="A-Z\\xc0-\\xd6\\xd8-\\xde",p="\\ufe0e\\ufe0f",g=l+u+d+h,m="['’]",v="["+g+"]",b="["+a+"]",y="\\d+",w="["+o+"]",_="["+c+"]",x="[^"+n+g+y+o+c+f+"]",k="\\ud83c[\\udffb-\\udfff]",A="(?:"+b+"|"+k+")",C="[^"+n+"]",E="(?:\\ud83c[\\udde6-\\uddff]){2}",S="[\\ud800-\\udbff][\\udc00-\\udfff]",F="["+f+"]",$="\\u200d",T="(?:"+_+"|"+x+")",L="(?:"+F+"|"+x+")",D="(?:"+m+"(?:d|ll|m|re|s|t|ve))?",B="(?:"+m+"(?:D|LL|M|RE|S|T|VE))?",R=A+"?",O="["+p+"]?",M="(?:"+$+"(?:"+[C,E,S].join("|")+")"+O+R+")*",j="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",I="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",P=O+R+M,N="(?:"+[w,E,S].join("|")+")"+P,W=RegExp([F+"?"+_+"+"+D+"(?="+[v,F,"$"].join("|")+")",L+"+"+B+"(?="+[v,F+T,"$"].join("|")+")",F+"?"+T+"+"+D,F+"+"+B,I,j,y,N].join("|"),"g");function H(e){return e.match(W)||[]}e.exports=H},f4dd:function(e,t,n){"use strict";var i=n("23e7"),r=n("d58f").right,s=n("a640"),a=n("ae40"),o=n("2d00"),c=n("605d"),l=s("reduceRight"),u=a("reduce",{1:0}),d=!c&&o>79&&o<83;i({target:"Array",proto:!0,forced:!l||!u||d},{reduceRight:function(e){return r(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}})},f5b2:function(e,t,n){"use strict";var i=n("23e7"),r=n("6547").codeAt;i({target:"String",proto:!0},{codePointAt:function(e){return r(this,e)}})},f5df:function(e,t,n){var i=n("00ee"),r=n("c6b6"),s=n("b622"),a=s("toStringTag"),o="Arguments"==r(function(){return arguments}()),c=function(e,t){try{return e[t]}catch(n){}};e.exports=i?r:function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=c(t=Object(e),a))?n:o?r(t):"Object"==(i=r(t))&&"function"==typeof t.callee?"Arguments":i}},f664:function(e,t,n){var i=n("23e7"),r=n("be8e");i({target:"Math",stat:!0},{fround:r})},f685:function(e,t,n){},f6d6:function(e,t,n){var i=n("23e7"),r=n("23cb"),s=String.fromCharCode,a=String.fromCodePoint,o=!!a&&1!=a.length;i({target:"String",stat:!0,forced:o},{fromCodePoint:function(e){var t,n=[],i=arguments.length,a=0;while(i>a){if(t=+arguments[a++],r(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?s(t):s(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},f748:function(e,t){e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},f772:function(e,t,n){var i=n("5692"),r=n("90e3"),s=i("keys");e.exports=function(e){return s[e]||(s[e]=r(e))}},f785:function(e,t,n){var i=n("2626");i("Array")},f7e3:function(e,t,n){},f889:function(e,t,n){"use strict";n("63bf")},f8c9:function(e,t,n){var i=n("23e7"),r=n("da84"),s=n("d44e");i({global:!0},{Reflect:{}}),s(r.Reflect,"Reflect",!0)},f8cd:function(e,t,n){var i=n("a691");e.exports=function(e){var t=i(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},f940:function(e,t,n){},f9a1:function(e,t,n){"use strict";n("b053")},faf6:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"item"},[e.label?n("div",{staticClass:"itemLabel",style:{width:100*(1-e.balance)+"%"}},[e._v(e._s(e.label))]):e._e(),n("div",{staticClass:"itemContent",style:{width:100*(e.label?e.balance:1)+"%"}},[e._t("default")],2)])},r=[],s=(n("a9e3"),{name:"vui-item",props:{label:{type:String,default:""},balance:{type:Number,default:.6}}}),a=s,o=(n("720d"),n("2877")),c=Object(o["a"])(a,i,r,!1,null,"f8e75faa",null);t["default"]=c.exports},fafb:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e.state.failTime?n("div",{staticClass:"notice",staticStyle:{color:"white"}},[n("h3",{staticClass:"fw-bold"},[e._v("SYSTEM FAILURE")]),n("span",{staticClass:"fst-italic"},[e._v("I/O regulator malfuction detected! Waiting for system reboot...")]),n("br"),e._v(" Automatic reboot in "+e._s(e.state.failTime)+" seconds... "),n("vui-button",{attrs:{icon:"sync",params:{reboot:1}}},[e._v("Reboot Now")])],1):n("vui-group",[n("div",{staticClass:"notice"},[e.state.siliconUser?n("div",[n("vui-group-item",{attrs:{label:"Interface Lock:"}},[e.state.locked?n("vui-button",{class:{selected:e.state.locked},attrs:{icon:"lock",params:{toggleaccess:1}}},[e._v("Engaged")]):n("vui-button",{class:{selected:e.state.malfstatus<2&&!e.state.locked},attrs:{icon:"lock-open",params:{toggleaccess:1},disabled:e.state.malfstatus>=2}},[e._v("Disengaged")])],1)],1):n("span",[e._v("Swipe an ID card to "+e._s(e.state.locked?"un":null)+"lock this interface.")])]),n("div",{staticStyle:{"min-width":"480px"}},[n("h3",[e._v("Power Status")]),n("vui-group-item",{attrs:{label:"Main Breaker:"}},[e.state.locked&&!e.state.siliconUser?n("div",[n("span",{class:{good:e.state.isOperating,bad:!e.state.isOperating}},[e._v(e._s(e.state.isOperating?"On":"Off"))])]):n("vui-button",{class:{selected:e.state.isOperating},attrs:{icon:e.state.isOperating?"power-off":"times",params:{breaker:1}}},[e._v(e._s(e.state.isOperating?"On":"Off"))])],1),n("vui-group-item",{attrs:{label:"External Power:"}},[2==e.state.externalPower?n("span",{staticClass:"good"},[e._v("Good")]):1==e.state.externalPower?n("span",{staticClass:"average"},[e._v("Low")]):n("span",{staticClass:"bad"},[e._v("None")])]),n("vui-group-item",{attrs:{label:"Power Cell"}},[null==e.state.powerCellStatus?n("span",{staticClass:"bad"},[e._v("Power cell removed.")]):n("span",[n("vui-progress",{class:e.cellClass,attrs:{value:e.state.powerCellStatus,min:0,max:100}}),n("span",{staticStyle:{width:"60px"}},[e._v(e._s(Math.round(10*e.state.powerCellStatus)/10)+"%")])],1)]),n("vui-group-item",{attrs:{label:"Power Cell charge status:"}},[n("div",{staticClass:"statusValue"},[1==e.state.charge_mode?n("span",[e._v("APC's power cell will run out of charge in "+e._s(e.timeRemaining)+".")]):2==e.state.charge_mode?n("span",[e._v("APC is not charging or discharging.")]):n("span",[e._v("APC will be fully charged in "+e._s(e.timeRemaining)+".")])])]),null!=e.state.powerCellStatus?n("vui-group-item",{attrs:{label:"Charge Mode:"}},[e.state.locked&&!e.state.siliconUser?n("span",{class:{good:e.state.chargeMode,bad:!e.state.chargeMode}},[e._v(e._s(e.state.chargeMode?"Auto":"Off"))]):n("vui-button",{class:{selected:e.state.chargeMode},attrs:{icon:e.state.chargeMode?"sync":"times",params:{cmode:1}}},[e._v(e._s(e.state.chargeMode?"Auto":"Off"))]),e._v(" ["),n("span",{class:e.chargeClass},[e._v(e._s(e.chargeStatus))]),e._v("] ")],1):e._e(),n("vui-group-item",{attrs:{label:"Night Lighting:"}},[n("vui-button",{class:{selected:e.state.lightingMode},attrs:{icon:e.state.lightingMode?"moon":"sun",params:{lmode:e.state.lightingMode?"off":"on"}}},[e._v(e._s(e.state.lightingMode?"On":"Off"))])],1),n("vui-group-item",{attrs:{label:"Emergency Lighting:"}},[n("div",{staticStyle:{width:"105px"}},[e.state.locked&&!e.state.siliconUser?n("span",[e._v(e._s(e.state.emergencyMode?"On":"Off"))]):n("vui-button",{class:{selected:e.state.emergencyMode},attrs:{icon:"lightbulb",params:{emergency_lights:1}}},[e._v(e._s(e.state.emergencyMode?"On":"Off"))])],1)]),n("h3",[e._v("Power Channels")]),e._l(e.state.powerChannels,(function(t,i){return n("vui-group-row",{key:i},[n("div",{staticClass:"itemLabel",staticStyle:{display:"table-cell","vertical-align":"top","padding-right":"8px",width:"4%"}},[e._v(" "+e._s(i)+" "),n("span",{staticStyle:{float:"right"}},[e._v(" ["),n("span",{class:e.channelStatClass(t.status)},[e._v(e._s(e.channelStatus(t.status)))]),e._v("] ["),n("span",{staticClass:"good"},[e._v(e._s(e.channelPower(t.status)))]),e._v("] ")])]),n("div",{staticStyle:{display:"table-cell",width:"10%"}},[n("span",{staticStyle:{width:"70px","text-align":"right",display:"inline-block"}},[e._v(" "+e._s(t.powerLoad)+" W ")]),n("span",{staticStyle:{width:"105px"}},[e._v(" "),e.state.locked?n("span",[1==t.status||3==t.status?n("span",[e._v(" "+e._s(e.channelPower(t.status))+" ")]):e._e()]):e._e()]),e._v(" "),!e.state.locked||e.state.siliconUser?n("span",[n("vui-button",{class:{selected:1==t.status||3==t.status},attrs:{icon:"sync",params:{set:3,chan:i}}},[e._v("Auto")]),n("vui-button",{class:{selected:2==t.status},attrs:{icon:"power-off",params:{set:2,chan:i}}},[e._v("On")]),n("vui-button",{class:{selected:0==t.status},attrs:{icon:"times",params:{set:1,chan:i}}},[e._v("Off")])],1):e._e()])])})),n("vui-group-item",{attrs:{label:"Total Load:"}},[e._v(" "+e._s(e.state.totalLoad)+"W"+e._s(e.state.totalCharging?" (+ "+e.state.totalCharging+"W Charging)":null)+" ")]),n("vui-group-item",{attrs:{balance:.69}}),n("vui-group-item",{attrs:{label:"Cover Lock"}},[e.state.locked&&!e.state.siliconUser?n("div",[e.state.coverLocked?n("span",{class:{good:e.state.coverLocked,bad:!e.state.coverLocked}},[e._v(e._s(e.state.coverLocked?"E":"Dise")+"ngaged")]):e._e()]):n("div",[n("vui-button",{class:{selected:e.state.coverLocked},attrs:{icon:e.state.coverLocked?"lock":"lock-open",params:{lock:1}}},[e._v(e._s(e.state.coverLocked?"E":"Dise")+"ngaged")])],1)]),e.state.siliconUser?n("div",[n("h3",[e._v("System Overrides")]),n("div",[n("vui-button",{attrs:{icon:"lightbulb",params:{overload:1}}},[e._v("Overload Lighting Circuit")]),1==e.state.malfStatus?n("vui-button",{attrs:{icon:"script",params:{malfhack:1}}},[e._v("Override Programming")]):e.state.malfStatus>1?n("span",{staticClass:"notice"},[e._v("APC Hacked")]):e._e()],1)]):e._e()],2)])],1)},r=[],s=(n("4de4"),n("a15b"),{data:function(){return this.$root.$data},computed:{chargeClass:function(){return this.state.chargingStatus>1?"good":1==this.state.chargingStatus?"average":"bad"},chargeStatus:function(){return this.state.chargingStatus>1?"Fully Charged":1==this.state.chargingStatus?"Charging":"Not Charging"},cellClass:function(){return this.state.powerCellStatus>=50?"good":this.state.powerCellStatus>=25?"average":"bad"},timeRemaining:function(){var e=(this.state.time-this.wtime)/10,t=Math.round(e/3600),n=Math.round(e%3600/60),i=Math.round(e%60);return[t>=1&&"".concat(t," hours"),n>=1&&"".concat(n," minutes"),i>=1&&"".concat(i," seconds")].filter(Boolean).join(", ")}},methods:{channelStatus:function(e){return e<=1?"Off":"On"},channelPower:function(e){return 1==e||3==e?"Auto":"Manual"},channelStatClass:function(e){return e<=1?"bad":"good"}}}),a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},fb2c:function(e,t,n){var i=n("74e8");i("Uint32",(function(e){return function(t,n,i){return e(this,t,n,i)}}))},fb48:function(e,t,n){"use strict";n.r(t);var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("h3",[e._v("Group Turret controls:")]),n("div",{staticClass:"item"},[n("div",{staticClass:"itemLabelWide"},[e._v(" Behaviour controls are "+e._s(e.settings.locked?"locked":"unlocked")+". ")])]),n("view-turrets-control-part",{attrs:{settings:e.$data}}),n("h2",[e._v("List of turrets and individual controls:")]),e._l(e.turrets,(function(t){return n("div",{key:t.name},[n("h4",[e._v(e._s(t.name))]),n("view-turrets-control-part",{attrs:{settings:t.settings,tref:t.ref}})],1)}))],2)},r=[],s={data:function(){return this.$root.$data.state}},a=s,o=n("2877"),c=Object(o["a"])(a,i,r,!1,null,null,null);t["default"]=c.exports},fb6a:function(e,t,n){"use strict";var i=n("23e7"),r=n("861d"),s=n("e8b5"),a=n("23cb"),o=n("50c4"),c=n("fc6a"),l=n("8418"),u=n("b622"),d=n("1dde"),h=n("ae40"),f=d("slice"),p=h("slice",{ACCESSORS:!0,0:0,1:2}),g=u("species"),m=[].slice,v=Math.max;i({target:"Array",proto:!0,forced:!f||!p},{slice:function(e,t){var n,i,u,d=c(this),h=o(d.length),f=a(e,h),p=a(void 0===t?h:t,h);if(s(d)&&(n=d.constructor,"function"!=typeof n||n!==Array&&!s(n.prototype)?r(n)&&(n=n[g],null===n&&(n=void 0)):n=void 0,n===Array||void 0===n))return m.call(d,f,p);for(i=new(void 0===n?Array:n)(v(p-f,0)),u=0;fe.length)&&(t=e.length);for(var n=0,i=new Array(t);n\n
    \n \n \n {{ s.disk_used }} GQ / {{ s.disk_size }} GQ\n \n \n \n

    Available Programs

    \n \n \n \n \n
    \n\n\n\n\n>","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./downloader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./downloader.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./downloader.vue?vue&type=template&id=f45f2cac&scoped=true&\"\nimport script from \"./downloader.vue?vue&type=script&lang=js&\"\nexport * from \"./downloader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./downloader.vue?vue&type=style&index=0&id=f45f2cac&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f45f2cac\",\n null\n \n)\n\nexport default component.exports","import Store from './store.js'\n\nconst randomId = () => Math.random().toString(36).substring(13)\n\nexport function sendRaw(path, data) {\n var sendparams = []\n for(var val in data) {\n if (Array.isArray(data[val])) {\n for (const value in data[val]) {\n sendparams.push(encodeURIComponent(val) + \"=\" + encodeURIComponent(value))\n }\n } else {\n sendparams.push(encodeURIComponent(val) + \"=\" + encodeURIComponent(data[val]))\n }\n }\n var url = path + '?' + sendparams.join(\"&\")\n\n if(url.indexOf('byond://') >= 0) {\n window.location.href = url\n return\n }\n\n var r = new XMLHttpRequest()\n r.open(\"GET\", url, true);\n r.send()\n}\n\nexport function sendRawWithCallback(path, data, callback) {\n var functionCallbackId = '__bycallback' + randomId()\n window[functionCallbackId] = callback\n sendRaw(path, Object.assign({}, data, {\n callback: functionCallbackId,\n }))\n}\n\nexport function sendToTopicRaw(data) {\n sendRaw('', data)\n}\n\nexport function sendToTopic(data, pushState = false) {\n var pushData = {\n src: Store.state.uiref,\n vueuihrefjson: JSON.stringify(data)\n }\n if(pushState) {\n pushData[\"vueuistateupdate\"] = Store.getStatePushDataString()\n }\n sendToTopicRaw(pushData)\n}\nexport function dotNotationRead(object, key) {\n return key.split('.').reduce((a, b) => a[b], object);\n}\nconst HOUR = 36000\nconst MINUTE = 600\nexport function worldtime2text(time, timeshift = true) {\n const offset = timeshift ? Store.state.roundstart_hour : 0\n const hour = Math.floor((time / HOUR + offset) % 24)\n const minute = Math.floor(time % HOUR / MINUTE)\n return `${('0' + hour).slice(-2)}:${('0' + minute).slice(-2)}`\n}\n\nexport default {\n sendRaw,\n sendRawWithCallback,\n sendToTopicRaw,\n sendToTopic,\n dotNotationRead,\n worldtime2text,\n}\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar expm1 = require('../internals/math-expm1');\n\nvar abs = Math.abs;\nvar exp = Math.exp;\nvar E = Math.E;\n\nvar FORCED = fails(function () {\n return Math.sinh(-2e-17) != -2e-17;\n});\n\n// `Math.sinh` method\n// https://tc39.github.io/ecma262/#sec-math.sinh\n// V8 near Chromium 38 has a problem with very small numbers\n$({ target: 'Math', stat: true, forced: FORCED }, {\n sinh: function sinh(x) {\n return abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (E / 2);\n }\n});\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flat` method\n// https://github.com/tc39/proposal-flatMap\n$({ target: 'Array', proto: true }, {\n flat: function flat(/* depthArg = 1 */) {\n var depthArg = arguments.length ? arguments[0] : undefined;\n var O = toObject(this);\n var sourceLen = toLength(O.length);\n var A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n return A;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar createHTML = require('../internals/create-html');\nvar forcedStringHTMLMethod = require('../internals/string-html-forced');\n\n// `String.prototype.blink` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.blink\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('blink') }, {\n blink: function blink() {\n return createHTML(this, 'blink', '', '');\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h3',[_vm._v(\"Jammer Level:\")]),_c('div',[_c('vui-button',{class:{selected: _vm.active == 1},attrs:{\"params\":{ set_active: 1 }}},[_vm._v(\"Block All\")])],1),_c('div',[_c('vui-button',{class:{selected: _vm.active == 2},attrs:{\"params\":{ set_active: 2 }}},[_vm._v(\"Block Synthetics\")])],1),_c('div',[_c('vui-button',{class:{selected: _vm.active == -1},attrs:{\"params\":{ set_active: -1 }}},[_vm._v(\"Block Nothing\")])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./jammer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./jammer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./jammer.vue?vue&type=template&id=081883d6&\"\nimport script from \"./jammer.vue?vue&type=script&lang=js&\"\nexport * from \"./jammer.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticStyle:{\"clear\":\"both\",\"margin\":\"auto\",\"width\":\"20em\"}},[_vm._l(([5, 10, 20, 30, 40]),function(n){return _c('vui-button',{key:_vm.amount-_vm.button-n,class:{selected : (_vm.state.amount == n)},attrs:{\"icon\":\"cog\",\"params\":{ amount : n }}},[_vm._v(_vm._s(n))])}),_c('br'),_c('br'),_c('div',{staticStyle:{\"text-align\":\"center\"}},[_c('vui-input-numeric',{attrs:{\"width\":\"2.5em\",\"button-count\":2,\"min\":1,\"max\":_vm.state.beakerMaxVolume || 120},on:{\"input\":function($event){return _vm.s({amount : _vm.state.amount})}},model:{value:(_vm.state.amount),callback:function ($$v) {_vm.$set(_vm.state, \"amount\", $$v)},expression:\"state.amount\"}})],1)],2),_c('div',{staticStyle:{\"clear\":\"both\"}}),_c('div',{staticStyle:{\"float\":\"left\",\"width\":\"100%\"}},[(_vm.state.chemicals.length)?_c('div',_vm._l((_vm.state.chemicals),function(chem){return _c('vui-button',{key:chem-_vm.btn,staticClass:\"fixedLeftWide\",attrs:{\"icon\":\"arrow-alt-circle-down\",\"params\":{dispense : chem.label}}},[_vm._v(_vm._s(chem.label)+\" (\"+_vm._s(chem.amount)+\")\")])}),1):_c('span',{staticClass:\"bad\"},[_vm._v(\"No cartridges installed!\")])]),_c('div',{staticStyle:{\"clear\":\"both\"}}),_c('vui-button',{class:_vm.state.isBeakerLoaded && _vm.disabled,staticStyle:{\"float\":\"right\"},attrs:{\"icon\":\"eject\",\"params\":{ejectBeaker : 1}}},[_vm._v(\"Eject \"+_vm._s(_vm.state.glass ? \"Glass\" : \"Beaker\"))]),_c('div',{staticClass:\"statusDisplay\",staticStyle:{\"clear\":\"both\",\"min-height\":\"180px\"}},[(_vm.state.isBeakerLoaded)?_c('div',[_c('b',[_vm._v(\"Volume: \"+_vm._s(_vm.state.beakerCurrentVolume)+\" / \"+_vm._s(_vm.state.beakerMaxVolume))]),_c('br'),(_vm.state.beakerContents.length)?_c('div',_vm._l((_vm.state.beakerContents),function(beakerchem){return _c('span',{key:beakerchem-_vm.amt,staticClass:\"highlight\"},[_vm._v(_vm._s(_vm.u(beakerchem.volume))+\" of \"+_vm._s(beakerchem.name)),_c('br')])}),0):_c('span',{staticClass:\"bad\"},[_vm._v(_vm._s(_vm.state.glass ? \"Glass\" : \"Beaker\")+\" is empty.\")])]):_c('div',[_c('span',{staticClass:\"average\"},[_c('i',[_vm._v(\"No \"+_vm._s(_vm.state.glass ? \"glass\" : \"beaker\")+\" loaded.\")])])])])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./chemdisp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./chemdisp.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./chemdisp.vue?vue&type=template&id=60faaeb6&scoped=true&\"\nimport script from \"./chemdisp.vue?vue&type=script&lang=js&\"\nexport * from \"./chemdisp.vue?vue&type=script&lang=js&\"\nimport style0 from \"./chemdisp.vue?vue&type=style&index=0&id=60faaeb6&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"60faaeb6\",\n null\n \n)\n\nexport default component.exports","'use strict';\nvar aFunction = require('../internals/a-function');\nvar isObject = require('../internals/is-object');\n\nvar slice = [].slice;\nvar factories = {};\n\nvar construct = function (C, argsLength, args) {\n if (!(argsLength in factories)) {\n for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')');\n } return factories[argsLength](C, args);\n};\n\n// `Function.prototype.bind` method implementation\n// https://tc39.github.io/ecma262/#sec-function.prototype.bind\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = slice.call(arguments, 1);\n var boundFunction = function bound(/* args... */) {\n var args = partArgs.concat(slice.call(arguments));\n return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args);\n };\n if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype;\n return boundFunction;\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.new_own_tag),expression:\"new_own_tag\"}],attrs:{\"placeholder\":_vm.own_tag},domProps:{\"value\":(_vm.new_own_tag)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.new_own_tag=$event.target.value}}}),_c('vui-button',{attrs:{\"params\":{ tag: _vm.new_own_tag }}},[_vm._v(\"Set GPS Tag\")]),_c('br'),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.add_track_tag),expression:\"add_track_tag\"}],domProps:{\"value\":(_vm.add_track_tag)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.add_track_tag=$event.target.value}}}),_c('vui-button',{attrs:{\"params\":{ add_tag: _vm.add_track_tag }}},[_vm._v(\"Track New Tag\")]),_c('br'),_c('vui-button',{attrs:{\"params\":{ add_all: 1 }}},[_vm._v(\"Track All\")]),_c('vui-button',{attrs:{\"params\":{ clear_all: 1 }}},[_vm._v(\"Untrack All\")]),_c('hr'),_c('table',[_vm._m(0),_vm._l((_vm.tracking_list),function(gps){return _c('tr',{key:gps.tag},[_c('td',[_vm._v(\" \"+_vm._s(gps.tag)+\" \")]),_c('td',[_vm._v(\" \"+_vm._s(gps.pos_x)+\", \"+_vm._s(gps.pos_y)+\", \"+_vm._s(gps.pos_z)+\" \")]),_c('td',[_vm._v(\" \"+_vm._s(gps.area)+\" \")]),(gps.tag != _vm.own_tag)?_c('vui-button',{attrs:{\"params\":{ remove_tag: gps.tag }}},[_vm._v(\"Untrack\")]):_c('td')],1)})],2)],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"GPS Tag\")]),_c('th',[_vm._v(\"Location\")]),_c('th',[_vm._v(\"Area\")]),_c('th',[_vm._v(\"Remove\")])])}]\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./gps.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./gps.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./gps.vue?vue&type=template&id=3729e945&\"\nimport script from \"./gps.vue?vue&type=script&lang=js&\"\nexport * from \"./gps.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\n/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (acequire, exports, module) params\n */\n\n(function() {\n\nvar ACE_NAMESPACE = \"ace\";\n\nvar global = (function() { return this; })();\nif (!global && typeof window != \"undefined\") global = window; // strict mode\n\n\nif (!ACE_NAMESPACE && typeof acequirejs !== \"undefined\")\n return;\n\n\nvar define = function(module, deps, payload) {\n if (typeof module !== \"string\") {\n if (define.original)\n define.original.apply(this, arguments);\n else {\n console.error(\"dropping module because define wasn\\'t a string.\");\n console.trace();\n }\n return;\n }\n if (arguments.length == 2)\n payload = deps;\n if (!define.modules[module]) {\n define.payloads[module] = payload;\n define.modules[module] = null;\n }\n};\n\ndefine.modules = {};\ndefine.payloads = {};\n\n/**\n * Get at functionality define()ed using the function above\n */\nvar _acequire = function(parentId, module, callback) {\n if (typeof module === \"string\") {\n var payload = lookup(parentId, module);\n if (payload != undefined) {\n callback && callback();\n return payload;\n }\n } else if (Object.prototype.toString.call(module) === \"[object Array]\") {\n var params = [];\n for (var i = 0, l = module.length; i < l; ++i) {\n var dep = lookup(parentId, module[i]);\n if (dep == undefined && acequire.original)\n return;\n params.push(dep);\n }\n return callback && callback.apply(null, params) || true;\n }\n};\n\nvar acequire = function(module, callback) {\n var packagedModule = _acequire(\"\", module, callback);\n if (packagedModule == undefined && acequire.original)\n return acequire.original.apply(this, arguments);\n return packagedModule;\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n // normalize plugin acequires\n if (moduleName.indexOf(\"!\") !== -1) {\n var chunks = moduleName.split(\"!\");\n return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n }\n // normalize relative acequires\n if (moduleName.charAt(0) == \".\") {\n var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n moduleName = base + \"/\" + moduleName;\n\n while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n var previous = moduleName;\n moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n }\n }\n return moduleName;\n};\n\n/**\n * Internal function to lookup moduleNames and resolve them by calling the\n * definition function if needed.\n */\nvar lookup = function(parentId, moduleName) {\n moduleName = normalizeModule(parentId, moduleName);\n\n var module = define.modules[moduleName];\n if (!module) {\n module = define.payloads[moduleName];\n if (typeof module === 'function') {\n var exports = {};\n var mod = {\n id: moduleName,\n uri: '',\n exports: exports,\n packaged: true\n };\n\n var req = function(module, callback) {\n return _acequire(moduleName, module, callback);\n };\n\n var returnValue = module(req, exports, mod);\n exports = returnValue || mod.exports;\n define.modules[moduleName] = exports;\n delete define.payloads[moduleName];\n }\n module = define.modules[moduleName] = exports || module;\n }\n return module;\n};\n\nfunction exportAce(ns) {\n var root = global;\n if (ns) {\n if (!global[ns])\n global[ns] = {};\n root = global[ns];\n }\n\n if (!root.define || !root.define.packaged) {\n define.original = root.define;\n root.define = define;\n root.define.packaged = true;\n }\n\n if (!root.acequire || !root.acequire.packaged) {\n acequire.original = root.acequire;\n root.acequire = acequire;\n root.acequire.packaged = true;\n }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\nace.define(\"ace/lib/regexp\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\n var real = {\n exec: RegExp.prototype.exec,\n test: RegExp.prototype.test,\n match: String.prototype.match,\n replace: String.prototype.replace,\n split: String.prototype.split\n },\n compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n compliantLastIndexIncrement = function () {\n var x = /^/g;\n real.test.call(x, \"\");\n return !x.lastIndex;\n }();\n\n if (compliantLastIndexIncrement && compliantExecNpcg)\n return;\n RegExp.prototype.exec = function (str) {\n var match = real.exec.apply(this, arguments),\n name, r2;\n if ( typeof(str) == 'string' && match) {\n if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n real.replace.call(str.slice(match.index), r2, function () {\n for (var i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined)\n match[i] = undefined;\n }\n });\n }\n if (this._xregexp && this._xregexp.captureNames) {\n for (var i = 1; i < match.length; i++) {\n name = this._xregexp.captureNames[i - 1];\n if (name)\n match[name] = match[i];\n }\n }\n if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n this.lastIndex--;\n }\n return match;\n };\n if (!compliantLastIndexIncrement) {\n RegExp.prototype.test = function (str) {\n var match = real.exec.call(this, str);\n if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n this.lastIndex--;\n return !!match;\n };\n }\n\n function getNativeFlags (regex) {\n return (regex.global ? \"g\" : \"\") +\n (regex.ignoreCase ? \"i\" : \"\") +\n (regex.multiline ? \"m\" : \"\") +\n (regex.extended ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n (regex.sticky ? \"y\" : \"\");\n }\n\n function indexOf (array, item, from) {\n if (Array.prototype.indexOf) // Use the native array method if available\n return array.indexOf(item, from);\n for (var i = from || 0; i < array.length; i++) {\n if (array[i] === item)\n return i;\n }\n return -1;\n }\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n Function.prototype.bind = function bind(that) { // .length is 1\n var target = this;\n if (typeof target != \"function\") {\n throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n }\n var args = slice.call(arguments, 1); // for normal call\n var bound = function () {\n\n if (this instanceof bound) {\n\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n\n }\n\n };\n if(target.prototype) {\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n return bound;\n };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n if(function() { // test IE < 9 to splice bug - see issue #138\n function makeArray(l) {\n var a = new Array(l+2);\n a[0] = a[1] = 0;\n return a;\n }\n var array = [], lengthBefore;\n \n array.splice.apply(array, makeArray(20));\n array.splice.apply(array, makeArray(26));\n\n lengthBefore = array.length; //46\n array.splice(5, 0, \"XXX\"); // add one element\n\n lengthBefore + 1 == array.length\n\n if (lengthBefore + 1 == array.length) {\n return true;// has right splice implementation without bugs\n }\n }()) {//IE 6/7\n var array_splice = Array.prototype.splice;\n Array.prototype.splice = function(start, deleteCount) {\n if (!arguments.length) {\n return [];\n } else {\n return array_splice.apply(this, [\n start === void 0 ? 0 : start,\n deleteCount === void 0 ? (this.length - start) : deleteCount\n ].concat(slice.call(arguments, 2)))\n }\n };\n } else {//IE8\n Array.prototype.splice = function(pos, removeCount){\n var length = this.length;\n if (pos > 0) {\n if (pos > length)\n pos = length;\n } else if (pos == void 0) {\n pos = 0;\n } else if (pos < 0) {\n pos = Math.max(length + pos, 0);\n }\n\n if (!(pos+removeCount < length))\n removeCount = length - pos;\n\n var removed = this.slice(pos, pos+removeCount);\n var insert = slice.call(arguments, 2);\n var add = insert.length; \n if (pos === length) {\n if (add) {\n this.push.apply(this, insert);\n }\n } else {\n var remove = Math.min(removeCount, length - pos);\n var tailOldPos = pos + remove;\n var tailNewPos = tailOldPos + add - remove;\n var tailCount = length - tailOldPos;\n var lengthAfterRemove = length - remove;\n\n if (tailNewPos < tailOldPos) { // case A\n for (var i = 0; i < tailCount; ++i) {\n this[tailNewPos+i] = this[tailOldPos+i];\n }\n } else if (tailNewPos > tailOldPos) { // case B\n for (i = tailCount; i--; ) {\n this[tailNewPos+i] = this[tailOldPos+i];\n }\n } // else, add == remove (nothing to do)\n\n if (add && pos === lengthAfterRemove) {\n this.length = lengthAfterRemove; // truncate array\n this.push.apply(this, insert);\n } else {\n this.length = lengthAfterRemove + add; // reserves space\n for (i = 0; i < add; ++i) {\n this[pos+i] = insert[i];\n }\n }\n }\n return removed;\n };\n }\n}\nif (!Array.isArray) {\n Array.isArray = function isArray(obj) {\n return _toString(obj) == \"[object Array]\";\n };\n}\nvar boxedString = Object(\"a\"),\n splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n thisp = arguments[1],\n i = -1,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(); // TODO message\n }\n\n while (++i < length) {\n if (i in self) {\n fun.call(thisp, self[i], i, object);\n }\n }\n };\n}\nif (!Array.prototype.map) {\n Array.prototype.map = function map(fun /*, thisp*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n result = Array(length),\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self)\n result[i] = fun.call(thisp, self[i], i, object);\n }\n return result;\n };\n}\nif (!Array.prototype.filter) {\n Array.prototype.filter = function filter(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n result = [],\n value,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self) {\n value = self[i];\n if (fun.call(thisp, value, i, object)) {\n result.push(value);\n }\n }\n }\n return result;\n };\n}\nif (!Array.prototype.every) {\n Array.prototype.every = function every(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && !fun.call(thisp, self[i], i, object)) {\n return false;\n }\n }\n return true;\n };\n}\nif (!Array.prototype.some) {\n Array.prototype.some = function some(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && fun.call(thisp, self[i], i, object)) {\n return true;\n }\n }\n return false;\n };\n}\nif (!Array.prototype.reduce) {\n Array.prototype.reduce = function reduce(fun /*, initial*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n if (!length && arguments.length == 1) {\n throw new TypeError(\"reduce of empty array with no initial value\");\n }\n\n var i = 0;\n var result;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i++];\n break;\n }\n if (++i >= length) {\n throw new TypeError(\"reduce of empty array with no initial value\");\n }\n } while (true);\n }\n\n for (; i < length; i++) {\n if (i in self) {\n result = fun.call(void 0, result, self[i], i, object);\n }\n }\n\n return result;\n };\n}\nif (!Array.prototype.reduceRight) {\n Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n if (!length && arguments.length == 1) {\n throw new TypeError(\"reduceRight of empty array with no initial value\");\n }\n\n var result, i = length - 1;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i--];\n break;\n }\n if (--i < 0) {\n throw new TypeError(\"reduceRight of empty array with no initial value\");\n }\n } while (true);\n }\n\n do {\n if (i in this) {\n result = fun.call(void 0, result, self[i], i, object);\n }\n } while (i--);\n\n return result;\n };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n var self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n toObject(this),\n length = self.length >>> 0;\n\n if (!length) {\n return -1;\n }\n\n var i = 0;\n if (arguments.length > 1) {\n i = toInteger(arguments[1]);\n }\n i = i >= 0 ? i : Math.max(0, length + i);\n for (; i < length; i++) {\n if (i in self && self[i] === sought) {\n return i;\n }\n }\n return -1;\n };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n var self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n toObject(this),\n length = self.length >>> 0;\n\n if (!length) {\n return -1;\n }\n var i = length - 1;\n if (arguments.length > 1) {\n i = Math.min(i, toInteger(arguments[1]));\n }\n i = i >= 0 ? i : length - Math.abs(i);\n for (; i >= 0; i--) {\n if (i in self && sought === self[i]) {\n return i;\n }\n }\n return -1;\n };\n}\nif (!Object.getPrototypeOf) {\n Object.getPrototypeOf = function getPrototypeOf(object) {\n return object.__proto__ || (\n object.constructor ?\n object.constructor.prototype :\n prototypeOfObject\n );\n };\n}\nif (!Object.getOwnPropertyDescriptor) {\n var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n \"non-object: \";\n Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n throw new TypeError(ERR_NON_OBJECT + object);\n if (!owns(object, property))\n return;\n\n var descriptor, getter, setter;\n descriptor = { enumerable: true, configurable: true };\n if (supportsAccessors) {\n var prototype = object.__proto__;\n object.__proto__ = prototypeOfObject;\n\n var getter = lookupGetter(object, property);\n var setter = lookupSetter(object, property);\n object.__proto__ = prototype;\n\n if (getter || setter) {\n if (getter) descriptor.get = getter;\n if (setter) descriptor.set = setter;\n return descriptor;\n }\n }\n descriptor.value = object[property];\n return descriptor;\n };\n}\nif (!Object.getOwnPropertyNames) {\n Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n return Object.keys(object);\n };\n}\nif (!Object.create) {\n var createEmpty;\n if (Object.prototype.__proto__ === null) {\n createEmpty = function () {\n return { \"__proto__\": null };\n };\n } else {\n createEmpty = function () {\n var empty = {};\n for (var i in empty)\n empty[i] = null;\n empty.constructor =\n empty.hasOwnProperty =\n empty.propertyIsEnumerable =\n empty.isPrototypeOf =\n empty.toLocaleString =\n empty.toString =\n empty.valueOf =\n empty.__proto__ = null;\n return empty;\n }\n }\n\n Object.create = function create(prototype, properties) {\n var object;\n if (prototype === null) {\n object = createEmpty();\n } else {\n if (typeof prototype != \"object\")\n throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n var Type = function () {};\n Type.prototype = prototype;\n object = new Type();\n object.__proto__ = prototype;\n }\n if (properties !== void 0)\n Object.defineProperties(object, properties);\n return object;\n };\n}\n\nfunction doesDefinePropertyWork(object) {\n try {\n Object.defineProperty(object, \"sentinel\", {});\n return \"sentinel\" in object;\n } catch (exception) {\n }\n}\nif (Object.defineProperty) {\n var definePropertyWorksOnObject = doesDefinePropertyWork({});\n var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n doesDefinePropertyWork(document.createElement(\"div\"));\n if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n var definePropertyFallback = Object.defineProperty;\n }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n \"on this javascript engine\";\n\n Object.defineProperty = function defineProperty(object, property, descriptor) {\n if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n if (definePropertyFallback) {\n try {\n return definePropertyFallback.call(Object, object, property, descriptor);\n } catch (exception) {\n }\n }\n if (owns(descriptor, \"value\")) {\n\n if (supportsAccessors && (lookupGetter(object, property) ||\n lookupSetter(object, property)))\n {\n var prototype = object.__proto__;\n object.__proto__ = prototypeOfObject;\n delete object[property];\n object[property] = descriptor.value;\n object.__proto__ = prototype;\n } else {\n object[property] = descriptor.value;\n }\n } else {\n if (!supportsAccessors)\n throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n if (owns(descriptor, \"get\"))\n defineGetter(object, property, descriptor.get);\n if (owns(descriptor, \"set\"))\n defineSetter(object, property, descriptor.set);\n }\n\n return object;\n };\n}\nif (!Object.defineProperties) {\n Object.defineProperties = function defineProperties(object, properties) {\n for (var property in properties) {\n if (owns(properties, property))\n Object.defineProperty(object, property, properties[property]);\n }\n return object;\n };\n}\nif (!Object.seal) {\n Object.seal = function seal(object) {\n return object;\n };\n}\nif (!Object.freeze) {\n Object.freeze = function freeze(object) {\n return object;\n };\n}\ntry {\n Object.freeze(function () {});\n} catch (exception) {\n Object.freeze = (function freeze(freezeObject) {\n return function freeze(object) {\n if (typeof object == \"function\") {\n return object;\n } else {\n return freezeObject(object);\n }\n };\n })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n Object.preventExtensions = function preventExtensions(object) {\n return object;\n };\n}\nif (!Object.isSealed) {\n Object.isSealed = function isSealed(object) {\n return false;\n };\n}\nif (!Object.isFrozen) {\n Object.isFrozen = function isFrozen(object) {\n return false;\n };\n}\nif (!Object.isExtensible) {\n Object.isExtensible = function isExtensible(object) {\n if (Object(object) === object) {\n throw new TypeError(); // TODO message\n }\n var name = '';\n while (owns(object, name)) {\n name += '?';\n }\n object[name] = true;\n var returnValue = owns(object, name);\n delete object[name];\n return returnValue;\n };\n}\nif (!Object.keys) {\n var hasDontEnumBug = true,\n dontEnums = [\n \"toString\",\n \"toLocaleString\",\n \"valueOf\",\n \"hasOwnProperty\",\n \"isPrototypeOf\",\n \"propertyIsEnumerable\",\n \"constructor\"\n ],\n dontEnumsLength = dontEnums.length;\n\n for (var key in {\"toString\": null}) {\n hasDontEnumBug = false;\n }\n\n Object.keys = function keys(object) {\n\n if (\n (typeof object != \"object\" && typeof object != \"function\") ||\n object === null\n ) {\n throw new TypeError(\"Object.keys called on a non-object\");\n }\n\n var keys = [];\n for (var name in object) {\n if (owns(object, name)) {\n keys.push(name);\n }\n }\n\n if (hasDontEnumBug) {\n for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n var dontEnum = dontEnums[i];\n if (owns(object, dontEnum)) {\n keys.push(dontEnum);\n }\n }\n }\n return keys;\n };\n\n}\nif (!Date.now) {\n Date.now = function now() {\n return new Date().getTime();\n };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n ws = \"[\" + ws + \"]\";\n var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n trimEndRegexp = new RegExp(ws + ws + \"*$\");\n String.prototype.trim = function trim() {\n return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n };\n}\n\nfunction toInteger(n) {\n n = +n;\n if (n !== n) { // isNaN\n n = 0;\n } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n return n;\n}\n\nfunction isPrimitive(input) {\n var type = typeof input;\n return (\n input === null ||\n type === \"undefined\" ||\n type === \"boolean\" ||\n type === \"number\" ||\n type === \"string\"\n );\n}\n\nfunction toPrimitive(input) {\n var val, valueOf, toString;\n if (isPrimitive(input)) {\n return input;\n }\n valueOf = input.valueOf;\n if (typeof valueOf === \"function\") {\n val = valueOf.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n toString = input.toString;\n if (typeof toString === \"function\") {\n val = toString.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n throw new TypeError();\n}\nvar toObject = function (o) {\n if (o == null) { // this matches both null and undefined\n throw new TypeError(\"can't convert \"+o+\" to object\");\n }\n return Object(o);\n};\n\n});\n\nace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\",\"ace/lib/regexp\",\"ace/lib/es5-shim\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./regexp\");\nacequire(\"./es5-shim\");\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.getDocumentHead = function(doc) {\n if (!doc)\n doc = document;\n return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n};\n\nexports.createElement = function(tag, ns) {\n return document.createElementNS ?\n document.createElementNS(ns || XHTML_NS, tag) :\n document.createElement(tag);\n};\n\nexports.hasCssClass = function(el, name) {\n var classes = (el.className + \"\").split(/\\s+/g);\n return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n if (!exports.hasCssClass(el, name)) {\n el.className += \" \" + name;\n }\n};\nexports.removeCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g);\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n classes.splice(index, 1);\n }\n el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g), add = true;\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n add = false;\n classes.splice(index, 1);\n }\n if (add)\n classes.push(name);\n\n el.className = classes.join(\" \");\n return add;\n};\nexports.setCssClass = function(node, className, include) {\n if (include) {\n exports.addCssClass(node, className);\n } else {\n exports.removeCssClass(node, className);\n }\n};\n\nexports.hasCssString = function(id, doc) {\n var index = 0, sheets;\n doc = doc || document;\n\n if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n while (index < sheets.length)\n if (sheets[index++].owningElement.id === id) return true;\n } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n while (index < sheets.length)\n if (sheets[index++].id === id) return true;\n }\n\n return false;\n};\n\nexports.importCssString = function importCssString(cssText, id, doc) {\n doc = doc || document;\n if (id && exports.hasCssString(id, doc))\n return null;\n \n var style;\n \n if (id)\n cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n \n if (doc.createStyleSheet) {\n style = doc.createStyleSheet();\n style.cssText = cssText;\n if (id)\n style.owningElement.id = id;\n } else {\n style = exports.createElement(\"style\");\n style.appendChild(doc.createTextNode(cssText));\n if (id)\n style.id = id;\n\n exports.getDocumentHead(doc).appendChild(style);\n }\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n if (doc.createStyleSheet) {\n doc.createStyleSheet(uri);\n } else {\n var link = exports.createElement('link');\n link.rel = 'stylesheet';\n link.href = uri;\n\n exports.getDocumentHead(doc).appendChild(link);\n }\n};\n\nexports.getInnerWidth = function(element) {\n return (\n parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n element.clientWidth\n );\n};\n\nexports.getInnerHeight = function(element) {\n return (\n parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n element.clientHeight\n );\n};\n\nexports.scrollbarWidth = function(document) {\n var inner = exports.createElement(\"ace_inner\");\n inner.style.width = \"100%\";\n inner.style.minWidth = \"0px\";\n inner.style.height = \"200px\";\n inner.style.display = \"block\";\n\n var outer = exports.createElement(\"ace_outer\");\n var style = outer.style;\n\n style.position = \"absolute\";\n style.left = \"-10000px\";\n style.overflow = \"hidden\";\n style.width = \"200px\";\n style.minWidth = \"0px\";\n style.height = \"150px\";\n style.display = \"block\";\n\n outer.appendChild(inner);\n\n var body = document.documentElement;\n body.appendChild(outer);\n\n var noScrollbar = inner.offsetWidth;\n\n style.overflow = \"scroll\";\n var withScrollbar = inner.offsetWidth;\n\n if (noScrollbar == withScrollbar) {\n withScrollbar = outer.clientWidth;\n }\n\n body.removeChild(outer);\n\n return noScrollbar-withScrollbar;\n};\n\nif (typeof document == \"undefined\") {\n exports.importCssString = function() {};\n return;\n}\n\nif (window.pageYOffset !== undefined) {\n exports.getPageScrollTop = function() {\n return window.pageYOffset;\n };\n\n exports.getPageScrollLeft = function() {\n return window.pageXOffset;\n };\n}\nelse {\n exports.getPageScrollTop = function() {\n return document.body.scrollTop;\n };\n\n exports.getPageScrollLeft = function() {\n return document.body.scrollLeft;\n };\n}\n\nif (window.getComputedStyle)\n exports.computedStyle = function(element, style) {\n if (style)\n return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n return window.getComputedStyle(element, \"\") || {};\n };\nelse\n exports.computedStyle = function(element, style) {\n if (style)\n return element.currentStyle[style];\n return element.currentStyle;\n };\nexports.setInnerHtml = function(el, innerHtml) {\n var element = el.cloneNode(false);//document.createElement(\"div\");\n element.innerHTML = innerHtml;\n el.parentNode.replaceChild(element, el);\n return element;\n};\n\nif (\"textContent\" in document.documentElement) {\n exports.setInnerText = function(el, innerText) {\n el.textContent = innerText;\n };\n\n exports.getInnerText = function(el) {\n return el.textContent;\n };\n}\nelse {\n exports.setInnerText = function(el, innerText) {\n el.innerText = innerText;\n };\n\n exports.getInnerText = function(el) {\n return el.innerText;\n };\n}\n\nexports.getParentWindow = function(document) {\n return document.defaultView || document.parentWindow;\n};\n\n});\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n};\n\nexports.mixin = function(obj, mixin) {\n for (var key in mixin) {\n obj[key] = mixin[key];\n }\n return obj;\n};\n\nexports.implement = function(proto, mixin) {\n exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./fixoldbrowsers\");\n\nvar oop = acequire(\"./oop\");\nvar Keys = (function() {\n var ret = {\n MODIFIER_KEYS: {\n 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n },\n\n KEY_MODS: {\n \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8\n },\n\n FUNCTION_KEYS : {\n 8 : \"Backspace\",\n 9 : \"Tab\",\n 13 : \"Return\",\n 19 : \"Pause\",\n 27 : \"Esc\",\n 32 : \"Space\",\n 33 : \"PageUp\",\n 34 : \"PageDown\",\n 35 : \"End\",\n 36 : \"Home\",\n 37 : \"Left\",\n 38 : \"Up\",\n 39 : \"Right\",\n 40 : \"Down\",\n 44 : \"Print\",\n 45 : \"Insert\",\n 46 : \"Delete\",\n 96 : \"Numpad0\",\n 97 : \"Numpad1\",\n 98 : \"Numpad2\",\n 99 : \"Numpad3\",\n 100: \"Numpad4\",\n 101: \"Numpad5\",\n 102: \"Numpad6\",\n 103: \"Numpad7\",\n 104: \"Numpad8\",\n 105: \"Numpad9\",\n '-13': \"NumpadEnter\",\n 112: \"F1\",\n 113: \"F2\",\n 114: \"F3\",\n 115: \"F4\",\n 116: \"F5\",\n 117: \"F6\",\n 118: \"F7\",\n 119: \"F8\",\n 120: \"F9\",\n 121: \"F10\",\n 122: \"F11\",\n 123: \"F12\",\n 144: \"Numlock\",\n 145: \"Scrolllock\"\n },\n\n PRINTABLE_KEYS: {\n 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',\n 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',\n 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',\n 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',\n 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',\n 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',\n 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',\n 219: '[', 220: '\\\\',221: ']', 222: \"'\", 111: '/', 106: '*'\n }\n };\n var name, i;\n for (i in ret.FUNCTION_KEYS) {\n name = ret.FUNCTION_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n for (i in ret.PRINTABLE_KEYS) {\n name = ret.PRINTABLE_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n oop.mixin(ret, ret.MODIFIER_KEYS);\n oop.mixin(ret, ret.PRINTABLE_KEYS);\n oop.mixin(ret, ret.FUNCTION_KEYS);\n ret.enter = ret[\"return\"];\n ret.escape = ret.esc;\n ret.del = ret[\"delete\"];\n ret[173] = '-';\n \n (function() {\n var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n for (var i = Math.pow(2, mods.length); i--;) { \n ret.KEY_MODS[i] = mods.filter(function(x) {\n return i & ret.KEY_MODS[x];\n }).join(\"-\") + \"-\";\n }\n })();\n\n ret.KEY_MODS[0] = \"\";\n ret.KEY_MODS[-1] = \"input-\";\n\n return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n var keyString = Keys[keyCode];\n if (typeof keyString != \"string\")\n keyString = String.fromCharCode(keyCode);\n return keyString.toLowerCase();\n};\n\n});\n\nace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nexports.OS = {\n LINUX: \"LINUX\",\n MAC: \"MAC\",\n WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n if (exports.isMac) {\n return exports.OS.MAC;\n } else if (exports.isLinux) {\n return exports.OS.LINUX;\n } else {\n return exports.OS.WINDOWS;\n }\n};\nif (typeof navigator != \"object\")\n return;\n\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\nvar ua = navigator.userAgent;\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n (navigator.appName == \"Microsoft Internet Explorer\" || navigator.appName.indexOf(\"MSAppHost\") >= 0)\n ? parseFloat((ua.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1])\n : parseFloat((ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]); // for ie\n \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === \"Gecko\";\nexports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv:(\\d+)/)||[])[1], 10) < 4;\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\n\nif (exports.isIOS) exports.isMac = true;\n\n});\n\nace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keys = acequire(\"./keys\");\nvar useragent = acequire(\"./useragent\");\n\nvar pressedKeys = null;\nvar ts = 0;\n\nexports.addListener = function(elem, type, callback) {\n if (elem.addEventListener) {\n return elem.addEventListener(type, callback, false);\n }\n if (elem.attachEvent) {\n var wrapper = function() {\n callback.call(elem, window.event);\n };\n callback._wrapper = wrapper;\n elem.attachEvent(\"on\" + type, wrapper);\n }\n};\n\nexports.removeListener = function(elem, type, callback) {\n if (elem.removeEventListener) {\n return elem.removeEventListener(type, callback, false);\n }\n if (elem.detachEvent) {\n elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n }\n};\nexports.stopEvent = function(e) {\n exports.stopPropagation(e);\n exports.preventDefault(e);\n return false;\n};\n\nexports.stopPropagation = function(e) {\n if (e.stopPropagation)\n e.stopPropagation();\n else\n e.cancelBubble = true;\n};\n\nexports.preventDefault = function(e) {\n if (e.preventDefault)\n e.preventDefault();\n else\n e.returnValue = false;\n};\nexports.getButton = function(e) {\n if (e.type == \"dblclick\")\n return 0;\n if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n return 2;\n if (e.preventDefault) {\n return e.button;\n }\n else {\n return {1:0, 2:2, 4:1}[e.button];\n }\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n function onMouseUp(e) {\n eventHandler && eventHandler(e);\n releaseCaptureHandler && releaseCaptureHandler(e);\n\n exports.removeListener(document, \"mousemove\", eventHandler, true);\n exports.removeListener(document, \"mouseup\", onMouseUp, true);\n exports.removeListener(document, \"dragstart\", onMouseUp, true);\n }\n\n exports.addListener(document, \"mousemove\", eventHandler, true);\n exports.addListener(document, \"mouseup\", onMouseUp, true);\n exports.addListener(document, \"dragstart\", onMouseUp, true);\n \n return onMouseUp;\n};\n\nexports.addTouchMoveListener = function (el, callback) {\n var startx, starty;\n exports.addListener(el, \"touchstart\", function (e) {\n var touches = e.touches;\n var touchObj = touches[0];\n startx = touchObj.clientX;\n starty = touchObj.clientY;\n });\n exports.addListener(el, \"touchmove\", function (e) {\n var touches = e.touches;\n if (touches.length > 1) return;\n\n var touchObj = touches[0];\n\n e.wheelX = startx - touchObj.clientX;\n e.wheelY = starty - touchObj.clientY;\n\n startx = touchObj.clientX;\n starty = touchObj.clientY;\n\n callback(e);\n });\n};\n\nexports.addMouseWheelListener = function(el, callback) {\n if (\"onmousewheel\" in el) {\n exports.addListener(el, \"mousewheel\", function(e) {\n var factor = 8;\n if (e.wheelDeltaX !== undefined) {\n e.wheelX = -e.wheelDeltaX / factor;\n e.wheelY = -e.wheelDeltaY / factor;\n } else {\n e.wheelX = 0;\n e.wheelY = -e.wheelDelta / factor;\n }\n callback(e);\n });\n } else if (\"onwheel\" in el) {\n exports.addListener(el, \"wheel\", function(e) {\n var factor = 0.35;\n switch (e.deltaMode) {\n case e.DOM_DELTA_PIXEL:\n e.wheelX = e.deltaX * factor || 0;\n e.wheelY = e.deltaY * factor || 0;\n break;\n case e.DOM_DELTA_LINE:\n case e.DOM_DELTA_PAGE:\n e.wheelX = (e.deltaX || 0) * 5;\n e.wheelY = (e.deltaY || 0) * 5;\n break;\n }\n \n callback(e);\n });\n } else {\n exports.addListener(el, \"DOMMouseScroll\", function(e) {\n if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n e.wheelX = (e.detail || 0) * 5;\n e.wheelY = 0;\n } else {\n e.wheelX = 0;\n e.wheelY = (e.detail || 0) * 5;\n }\n callback(e);\n });\n }\n};\n\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) {\n var clicks = 0;\n var startX, startY, timer; \n var eventNames = {\n 2: \"dblclick\",\n 3: \"tripleclick\",\n 4: \"quadclick\"\n };\n\n function onMousedown(e) {\n if (exports.getButton(e) !== 0) {\n clicks = 0;\n } else if (e.detail > 1) {\n clicks++;\n if (clicks > 4)\n clicks = 1;\n } else {\n clicks = 1;\n }\n if (useragent.isIE) {\n var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n if (!timer || isNewClick)\n clicks = 1;\n if (timer)\n clearTimeout(timer);\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n\n if (clicks == 1) {\n startX = e.clientX;\n startY = e.clientY;\n }\n }\n \n e._clicks = clicks;\n\n eventHandler[callbackName](\"mousedown\", e);\n\n if (clicks > 4)\n clicks = 0;\n else if (clicks > 1)\n return eventHandler[callbackName](eventNames[clicks], e);\n }\n function onDblclick(e) {\n clicks = 2;\n if (timer)\n clearTimeout(timer);\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n eventHandler[callbackName](\"mousedown\", e);\n eventHandler[callbackName](eventNames[clicks], e);\n }\n if (!Array.isArray(elements))\n elements = [elements];\n elements.forEach(function(el) {\n exports.addListener(el, \"mousedown\", onMousedown);\n if (useragent.isOldIE)\n exports.addListener(el, \"dblclick\", onDblclick);\n });\n};\n\nvar getModifierHash = useragent.isMac && useragent.isOpera && !(\"KeyboardEvent\" in window)\n ? function(e) {\n return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n }\n : function(e) {\n return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n };\n\nexports.getModifierString = function(e) {\n return keys.KEY_MODS[getModifierHash(e)];\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n var hashId = getModifierHash(e);\n\n if (!useragent.isMac && pressedKeys) {\n if (e.getModifierState && (e.getModifierState(\"OS\") || e.getModifierState(\"Win\")))\n hashId |= 8;\n if (pressedKeys.altGr) {\n if ((3 & hashId) != 3)\n pressedKeys.altGr = 0;\n else\n return;\n }\n if (keyCode === 18 || keyCode === 17) {\n var location = \"location\" in e ? e.location : e.keyLocation;\n if (keyCode === 17 && location === 1) {\n if (pressedKeys[keyCode] == 1)\n ts = e.timeStamp;\n } else if (keyCode === 18 && hashId === 3 && location === 2) {\n var dt = e.timeStamp - ts;\n if (dt < 50)\n pressedKeys.altGr = true;\n }\n }\n }\n \n if (keyCode in keys.MODIFIER_KEYS) {\n keyCode = -1;\n }\n if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) {\n keyCode = -1;\n }\n \n if (!hashId && keyCode === 13) {\n var location = \"location\" in e ? e.location : e.keyLocation;\n if (location === 3) {\n callback(e, hashId, -keyCode);\n if (e.defaultPrevented)\n return;\n }\n }\n \n if (useragent.isChromeOS && hashId & 8) {\n callback(e, hashId, keyCode);\n if (e.defaultPrevented)\n return;\n else\n hashId &= ~8;\n }\n if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n return false;\n }\n \n return callback(e, hashId, keyCode);\n}\n\n\nexports.addCommandKeyListener = function(el, callback) {\n var addListener = exports.addListener;\n if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n var lastKeyDownKeyCode = null;\n addListener(el, \"keydown\", function(e) {\n lastKeyDownKeyCode = e.keyCode;\n });\n addListener(el, \"keypress\", function(e) {\n return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n });\n } else {\n var lastDefaultPrevented = null;\n\n addListener(el, \"keydown\", function(e) {\n pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n var result = normalizeCommandKeys(callback, e, e.keyCode);\n lastDefaultPrevented = e.defaultPrevented;\n return result;\n });\n\n addListener(el, \"keypress\", function(e) {\n if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n exports.stopEvent(e);\n lastDefaultPrevented = null;\n }\n });\n\n addListener(el, \"keyup\", function(e) {\n pressedKeys[e.keyCode] = null;\n });\n\n if (!pressedKeys) {\n resetPressedKeys();\n addListener(window, \"focus\", resetPressedKeys);\n }\n }\n};\nfunction resetPressedKeys() {\n pressedKeys = Object.create(null);\n}\n\nif (typeof window == \"object\" && window.postMessage && !useragent.isOldIE) {\n var postMessageId = 1;\n exports.nextTick = function(callback, win) {\n win = win || window;\n var messageName = \"zero-timeout-message-\" + postMessageId;\n exports.addListener(win, \"message\", function listener(e) {\n if (e.data == messageName) {\n exports.stopPropagation(e);\n exports.removeListener(win, \"message\", listener);\n callback();\n }\n });\n win.postMessage(messageName, \"*\");\n };\n}\n\n\nexports.nextFrame = typeof window == \"object\" && (window.requestAnimationFrame\n || window.mozRequestAnimationFrame\n || window.webkitRequestAnimationFrame\n || window.msRequestAnimationFrame\n || window.oRequestAnimationFrame);\n\nif (exports.nextFrame)\n exports.nextFrame = exports.nextFrame.bind(window);\nelse\n exports.nextFrame = function(callback) {\n setTimeout(callback, 17);\n };\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n var result = '';\n while (count > 0) {\n if (count & 1)\n result += string;\n\n if (count >>= 1)\n string += string;\n }\n return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n var copy = {};\n for (var key in obj) {\n copy[key] = obj[key];\n }\n return copy;\n};\n\nexports.copyArray = function(array){\n var copy = [];\n for (var i=0, l=array.length; i PLACEHOLDER.length)\n data = data.substr(9);\n else if (data.substr(0, 4) == PLACEHOLDER.substr(0, 4))\n data = data.substr(4, data.length - PLACEHOLDER.length + 1);\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n if (data == PLACEHOLDER.charAt(0)) {\n } else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n\n if (data)\n host.onTextInput(data);\n }\n if (copied) {\n copied = false;\n }\n if (afterContextMenu)\n afterContextMenu = false;\n };\n var onInput = function(e) {\n if (inComposition)\n return;\n var data = text.value;\n sendText(data);\n resetValue();\n };\n\n var handleClipboardData = function(e, data, forceIEMime) {\n var clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData || BROKEN_SETDATA)\n return;\n var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n try {\n if (data) {\n return clipboardData.setData(mime, data) !== false;\n } else {\n return clipboardData.getData(mime);\n }\n } catch(e) {\n if (!forceIEMime)\n return handleClipboardData(e, data, true);\n }\n };\n\n var doCopy = function(e, isCut) {\n var data = host.getCopyText();\n if (!data)\n return event.preventDefault(e);\n\n if (handleClipboardData(e, data)) {\n if (useragent.isIOS) {\n cut = isCut;\n text.value = \"\\n aa\" + data + \"a a\\n\";\n text.setSelectionRange(4, 4 + data.length);\n copied = {\n value: data\n };\n }\n isCut ? host.onCut() : host.onCopy();\n if (!useragent.isIOS) event.preventDefault(e);\n } else {\n copied = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n copied = false;\n resetValue();\n resetSelection();\n isCut ? host.onCut() : host.onCopy();\n });\n }\n };\n\n var onCut = function(e) {\n doCopy(e, true);\n };\n\n var onCopy = function(e) {\n doCopy(e, false);\n };\n\n var onPaste = function(e) {\n var data = handleClipboardData(e);\n if (typeof data == \"string\") {\n if (data)\n host.onPaste(data, e);\n if (useragent.isIE)\n setTimeout(resetSelection);\n event.preventDefault(e);\n }\n else {\n text.value = \"\";\n pasted = true;\n }\n };\n\n event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n event.addListener(text, \"select\", onSelect);\n\n event.addListener(text, \"input\", onInput);\n\n event.addListener(text, \"cut\", onCut);\n event.addListener(text, \"copy\", onCopy);\n event.addListener(text, \"paste\", onPaste);\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart || host.$readOnly)\n return;\n inComposition = {};\n inComposition.canUndo = host.session.$undoManager;\n host.onCompositionStart();\n setTimeout(onCompositionUpdate, 0);\n host.on(\"mousedown\", onCompositionEnd);\n if (inComposition.canUndo && !host.selection.isEmpty()) {\n host.insert(\"\");\n host.session.markUndoGroup();\n host.selection.clearSelection();\n }\n host.session.markUndoGroup();\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n return;\n var val = text.value.replace(/\\x01/g, \"\");\n if (inComposition.lastValue === val) return;\n\n host.onCompositionUpdate(val);\n if (inComposition.lastValue)\n host.undo();\n if (inComposition.canUndo)\n inComposition.lastValue = val;\n if (inComposition.lastValue) {\n var r = host.selection.getRange();\n host.insert(inComposition.lastValue);\n host.session.markUndoGroup();\n inComposition.range = host.selection.getRange();\n host.selection.setRange(r);\n host.selection.clearSelection();\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd || host.$readOnly) return;\n var c = inComposition;\n inComposition = false;\n var timer = setTimeout(function() {\n timer = null;\n var str = text.value.replace(/\\x01/g, \"\");\n if (inComposition)\n return;\n else if (str == c.lastValue)\n resetValue();\n else if (!c.lastValue && str) {\n resetValue();\n sendText(str);\n }\n });\n inputHandler = function compositionInputHandler(str) {\n if (timer)\n clearTimeout(timer);\n str = str.replace(/\\x01/g, \"\");\n if (str == c.lastValue)\n return \"\";\n if (c.lastValue && timer)\n host.undo();\n return str;\n };\n host.onCompositionEnd();\n host.removeListener(\"mousedown\", onCompositionEnd);\n if (e.type == \"compositionend\" && c.range) {\n host.selection.setRange(c.range);\n }\n var needsOnInput =\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\n\n if (needsOnInput) {\n onInput();\n }\n };\n\n\n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n event.addListener(text, \"compositionstart\", onCompositionStart);\n if (useragent.isGecko) {\n event.addListener(text, \"text\", function(){syncComposition.schedule();});\n } else {\n event.addListener(text, \"keyup\", function(){syncComposition.schedule();});\n event.addListener(text, \"keydown\", function(){syncComposition.schedule();});\n }\n event.addListener(text, \"compositionend\", onCompositionEnd);\n\n this.getElement = function() {\n return text;\n };\n\n this.setReadOnly = function(readOnly) {\n text.readOnly = readOnly;\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n resetSelection(host.selection.isEmpty());\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n this.moveToMouse(e, true);\n };\n\n this.moveToMouse = function(e, bringToFront) {\n if (!tempStyle)\n tempStyle = text.style.cssText;\n text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n + \"height:\" + text.style.height + \";\"\n + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n var rect = host.container.getBoundingClientRect();\n var style = dom.computedStyle(host.container);\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n var maxTop = rect.bottom - top - text.clientHeight -2;\n var move = function(e) {\n text.style.left = e.clientX - left - 2 + \"px\";\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n };\n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$keepTextAreaAtCursor = null;\n\n clearTimeout(closeTimeout);\n if (useragent.isWin)\n event.capture(host.container, move, onContextMenuClose);\n };\n\n this.onContextMenuClose = onContextMenuClose;\n var closeTimeout;\n function onContextMenuClose() {\n clearTimeout(closeTimeout);\n closeTimeout = setTimeout(function () {\n if (tempStyle) {\n text.style.cssText = tempStyle;\n tempStyle = '';\n }\n if (host.renderer.$keepTextAreaAtCursor == null) {\n host.renderer.$keepTextAreaAtCursor = true;\n host.renderer.$moveTextAreaToCursor();\n }\n }, 0);\n }\n\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(text, \"mouseup\", onContextMenu);\n event.addListener(text, \"mousedown\", function(e) {\n e.preventDefault();\n onContextMenuClose();\n });\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n event.addListener(text, \"contextmenu\", onContextMenu);\n\n if (useragent.isIOS) {\n var typingResetTimeout = null;\n var typing = false;\n\n parentNode.addEventListener(\"keydown\", function (e) {\n if (typingResetTimeout) clearTimeout(typingResetTimeout);\n typing = true;\n });\n\n parentNode.addEventListener(\"keyup\", function (e) {\n typingResetTimeout = setTimeout(function () {\n typing = false;\n }, 100);\n });\n var detectArrowKeys = function(e) {\n if (document.activeElement !== text) return;\n if (typing) return;\n\n if (cut) {\n return setTimeout(function () {\n cut = false;\n }, 100);\n }\n var selectionStart = text.selectionStart;\n var selectionEnd = text.selectionEnd;\n text.setSelectionRange(4, 5);\n if (selectionStart == selectionEnd) {\n switch (selectionStart) {\n case 0: host.onCommandKey(null, 0, KEYS.up); break;\n case 1: host.onCommandKey(null, 0, KEYS.home); break;\n case 2: host.onCommandKey(null, MODS.option, KEYS.left); break;\n case 4: host.onCommandKey(null, 0, KEYS.left); break;\n case 5: host.onCommandKey(null, 0, KEYS.right); break;\n case 7: host.onCommandKey(null, MODS.option, KEYS.right); break;\n case 8: host.onCommandKey(null, 0, KEYS.end); break;\n case 9: host.onCommandKey(null, 0, KEYS.down); break;\n }\n } else {\n switch (selectionEnd) {\n case 6: host.onCommandKey(null, MODS.shift, KEYS.right); break;\n case 7: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.right); break;\n case 8: host.onCommandKey(null, MODS.shift, KEYS.end); break;\n case 9: host.onCommandKey(null, MODS.shift, KEYS.down); break;\n }\n switch (selectionStart) {\n case 0: host.onCommandKey(null, MODS.shift, KEYS.up); break;\n case 1: host.onCommandKey(null, MODS.shift, KEYS.home); break;\n case 2: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.left); break;\n case 3: host.onCommandKey(null, MODS.shift, KEYS.left); break;\n }\n }\n };\n document.addEventListener(\"selectionchange\", detectArrowKeys);\n host.on(\"destroy\", function() {\n document.removeEventListener(\"selectionchange\", detectArrowKeys);\n });\n }\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/keyboard/textinput_ios\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE = useragent.isIE;\n\nvar TextInputIOS = acequire(\"./textinput_ios\").TextInput;\nvar TextInput = function(parentNode, host) {\n if (useragent.isIOS)\n return TextInputIOS.call(this, parentNode, host);\n\n var text = dom.createElement(\"textarea\");\n text.className = \"ace_text-input\";\n\n text.setAttribute(\"wrap\", \"off\");\n text.setAttribute(\"autocorrect\", \"off\");\n text.setAttribute(\"autocapitalize\", \"off\");\n text.setAttribute(\"spellcheck\", false);\n\n text.style.opacity = \"0\";\n parentNode.insertBefore(text, parentNode.firstChild);\n\n var PLACEHOLDER = \"\\u2028\\u2028\";\n\n var copied = false;\n var pasted = false;\n var inComposition = false;\n var tempStyle = '';\n var isSelectionEmpty = true;\n try { var isFocused = document.activeElement === text; } catch(e) {}\n \n event.addListener(text, \"blur\", function(e) {\n host.onBlur(e);\n isFocused = false;\n });\n event.addListener(text, \"focus\", function(e) {\n isFocused = true;\n host.onFocus(e);\n resetSelection();\n });\n this.focus = function() {\n if (tempStyle) return text.focus();\n var top = text.style.top;\n text.style.position = \"fixed\";\n text.style.top = \"0px\";\n text.focus();\n setTimeout(function() {\n text.style.position = \"\";\n if (text.style.top == \"0px\")\n text.style.top = top;\n }, 0);\n };\n this.blur = function() {\n text.blur();\n };\n this.isFocused = function() {\n return isFocused;\n };\n var syncSelection = lang.delayedCall(function() {\n isFocused && resetSelection(isSelectionEmpty);\n });\n var syncValue = lang.delayedCall(function() {\n if (!inComposition) {\n text.value = PLACEHOLDER;\n isFocused && resetSelection();\n }\n });\n\n function resetSelection(isEmpty) {\n if (inComposition)\n return;\n inComposition = true;\n \n if (inputHandler) {\n var selectionStart = 0;\n var selectionEnd = isEmpty ? 0 : text.value.length - 1;\n } else {\n var selectionStart = isEmpty ? 2 : 1;\n var selectionEnd = 2;\n }\n try {\n text.setSelectionRange(selectionStart, selectionEnd);\n } catch(e){}\n \n inComposition = false;\n }\n\n function resetValue() {\n if (inComposition)\n return;\n text.value = PLACEHOLDER;\n if (useragent.isWebKit)\n syncValue.schedule();\n }\n\n useragent.isWebKit || host.addEventListener('changeSelection', function() {\n if (host.selection.isEmpty() != isSelectionEmpty) {\n isSelectionEmpty = !isSelectionEmpty;\n syncSelection.schedule();\n }\n });\n\n resetValue();\n if (isFocused)\n host.onFocus();\n\n\n var isAllSelected = function(text) {\n return text.selectionStart === 0 && text.selectionEnd === text.value.length;\n };\n\n var onSelect = function(e) {\n if (copied) {\n copied = false;\n } else if (isAllSelected(text)) {\n host.selectAll();\n resetSelection();\n } else if (inputHandler) {\n resetSelection(host.selection.isEmpty());\n }\n };\n\n var inputHandler = null;\n this.setInputHandler = function(cb) {inputHandler = cb;};\n this.getInputHandler = function() {return inputHandler;};\n var afterContextMenu = false;\n \n var sendText = function(data) {\n if (inputHandler) {\n data = inputHandler(data);\n inputHandler = null;\n }\n if (pasted) {\n resetSelection();\n if (data)\n host.onPaste(data);\n pasted = false;\n } else if (data == PLACEHOLDER.charAt(0)) {\n if (afterContextMenu)\n host.execCommand(\"del\", {source: \"ace\"});\n else // some versions of android do not fire keydown when pressing backspace\n host.execCommand(\"backspace\", {source: \"ace\"});\n } else {\n if (data.substring(0, 2) == PLACEHOLDER)\n data = data.substr(2);\n else if (data.charAt(0) == PLACEHOLDER.charAt(0))\n data = data.substr(1);\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n \n if (data)\n host.onTextInput(data);\n }\n if (afterContextMenu)\n afterContextMenu = false;\n };\n var onInput = function(e) {\n if (inComposition)\n return;\n var data = text.value;\n sendText(data);\n resetValue();\n };\n \n var handleClipboardData = function(e, data, forceIEMime) {\n var clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData || BROKEN_SETDATA)\n return;\n var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n try {\n if (data) {\n return clipboardData.setData(mime, data) !== false;\n } else {\n return clipboardData.getData(mime);\n }\n } catch(e) {\n if (!forceIEMime)\n return handleClipboardData(e, data, true);\n }\n };\n\n var doCopy = function(e, isCut) {\n var data = host.getCopyText();\n if (!data)\n return event.preventDefault(e);\n\n if (handleClipboardData(e, data)) {\n isCut ? host.onCut() : host.onCopy();\n event.preventDefault(e);\n } else {\n copied = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n copied = false;\n resetValue();\n resetSelection();\n isCut ? host.onCut() : host.onCopy();\n });\n }\n };\n \n var onCut = function(e) {\n doCopy(e, true);\n };\n \n var onCopy = function(e) {\n doCopy(e, false);\n };\n \n var onPaste = function(e) {\n var data = handleClipboardData(e);\n if (typeof data == \"string\") {\n if (data)\n host.onPaste(data, e);\n if (useragent.isIE)\n setTimeout(resetSelection);\n event.preventDefault(e);\n }\n else {\n text.value = \"\";\n pasted = true;\n }\n };\n\n event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n event.addListener(text, \"select\", onSelect);\n\n event.addListener(text, \"input\", onInput);\n\n event.addListener(text, \"cut\", onCut);\n event.addListener(text, \"copy\", onCopy);\n event.addListener(text, \"paste\", onPaste);\n if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) {\n event.addListener(parentNode, \"keydown\", function(e) {\n if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n return;\n\n switch (e.keyCode) {\n case 67:\n onCopy(e);\n break;\n case 86:\n onPaste(e);\n break;\n case 88:\n onCut(e);\n break;\n }\n });\n }\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart || host.$readOnly) \n return;\n inComposition = {};\n inComposition.canUndo = host.session.$undoManager;\n host.onCompositionStart();\n setTimeout(onCompositionUpdate, 0);\n host.on(\"mousedown\", onCompositionEnd);\n if (inComposition.canUndo && !host.selection.isEmpty()) {\n host.insert(\"\");\n host.session.markUndoGroup();\n host.selection.clearSelection();\n }\n host.session.markUndoGroup();\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n return;\n var val = text.value.replace(/\\u2028/g, \"\");\n if (inComposition.lastValue === val) return;\n \n host.onCompositionUpdate(val);\n if (inComposition.lastValue)\n host.undo();\n if (inComposition.canUndo)\n inComposition.lastValue = val;\n if (inComposition.lastValue) {\n var r = host.selection.getRange();\n host.insert(inComposition.lastValue);\n host.session.markUndoGroup();\n inComposition.range = host.selection.getRange();\n host.selection.setRange(r);\n host.selection.clearSelection();\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd || host.$readOnly) return;\n var c = inComposition;\n inComposition = false;\n var timer = setTimeout(function() {\n timer = null;\n var str = text.value.replace(/\\u2028/g, \"\");\n if (inComposition)\n return;\n else if (str == c.lastValue)\n resetValue();\n else if (!c.lastValue && str) {\n resetValue();\n sendText(str);\n }\n });\n inputHandler = function compositionInputHandler(str) {\n if (timer)\n clearTimeout(timer);\n str = str.replace(/\\u2028/g, \"\");\n if (str == c.lastValue)\n return \"\";\n if (c.lastValue && timer)\n host.undo();\n return str;\n };\n host.onCompositionEnd();\n host.removeListener(\"mousedown\", onCompositionEnd);\n if (e.type == \"compositionend\" && c.range) {\n host.selection.setRange(c.range);\n }\n var needsOnInput =\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\n\n if (needsOnInput) {\n onInput();\n }\n };\n \n \n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n event.addListener(text, \"compositionstart\", onCompositionStart);\n if (useragent.isGecko) {\n event.addListener(text, \"text\", function(){syncComposition.schedule();});\n } else {\n event.addListener(text, \"keyup\", function(){syncComposition.schedule();});\n event.addListener(text, \"keydown\", function(){syncComposition.schedule();});\n }\n event.addListener(text, \"compositionend\", onCompositionEnd);\n\n this.getElement = function() {\n return text;\n };\n\n this.setReadOnly = function(readOnly) {\n text.readOnly = readOnly;\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n resetSelection(host.selection.isEmpty());\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n this.moveToMouse(e, true);\n };\n \n this.moveToMouse = function(e, bringToFront) {\n if (!tempStyle)\n tempStyle = text.style.cssText;\n text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n + \"height:\" + text.style.height + \";\"\n + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n var rect = host.container.getBoundingClientRect();\n var style = dom.computedStyle(host.container);\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n var maxTop = rect.bottom - top - text.clientHeight -2;\n var move = function(e) {\n text.style.left = e.clientX - left - 2 + \"px\";\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n }; \n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$keepTextAreaAtCursor = null;\n\n clearTimeout(closeTimeout);\n if (useragent.isWin)\n event.capture(host.container, move, onContextMenuClose);\n };\n\n this.onContextMenuClose = onContextMenuClose;\n var closeTimeout;\n function onContextMenuClose() {\n clearTimeout(closeTimeout);\n closeTimeout = setTimeout(function () {\n if (tempStyle) {\n text.style.cssText = tempStyle;\n tempStyle = '';\n }\n if (host.renderer.$keepTextAreaAtCursor == null) {\n host.renderer.$keepTextAreaAtCursor = true;\n host.renderer.$moveTextAreaToCursor();\n }\n }, 0);\n }\n\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(text, \"mouseup\", onContextMenu);\n event.addListener(text, \"mousedown\", function(e) {\n e.preventDefault();\n onContextMenuClose();\n });\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n event.addListener(text, \"contextmenu\", onContextMenu);\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\nvar SCROLL_COOLDOWN_T = 250; // milliseconds\n\nfunction DefaultHandlers(mouseHandler) {\n mouseHandler.$clickSelection = null;\n\n var editor = mouseHandler.editor;\n editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n editor.setDefaultHandler(\"touchmove\", this.onTouchMove.bind(mouseHandler));\n\n var exports = [\"select\", \"startSelect\", \"selectEnd\", \"selectAllEnd\", \"selectByWordsEnd\",\n \"selectByLinesEnd\", \"dragWait\", \"dragWaitEnd\", \"focusWait\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n\n mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n}\n\n(function() {\n\n this.onMouseDown = function(ev) {\n var inSelection = ev.inSelection();\n var pos = ev.getDocumentPosition();\n this.mousedownEvent = ev;\n var editor = this.editor;\n\n var button = ev.getButton();\n if (button !== 0) {\n var selectionRange = editor.getSelectionRange();\n var selectionEmpty = selectionRange.isEmpty();\n editor.$blockScrolling++;\n if (selectionEmpty || button == 1)\n editor.selection.moveToPosition(pos);\n editor.$blockScrolling--;\n if (button == 2) {\n editor.textInput.onContextMenu(ev.domEvent);\n if (!useragent.isMozilla)\n ev.preventDefault();\n }\n return;\n }\n\n this.mousedownEvent.time = Date.now();\n if (inSelection && !editor.isFocused()) {\n editor.focus();\n if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\n this.setState(\"focusWait\");\n this.captureMouse(ev);\n return;\n }\n }\n\n this.captureMouse(ev);\n this.startSelect(pos, ev.domEvent._clicks > 1);\n return ev.preventDefault();\n };\n\n this.startSelect = function(pos, waitForClickSelection) {\n pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n var editor = this.editor;\n editor.$blockScrolling++;\n if (this.mousedownEvent.getShiftKey())\n editor.selection.selectToPosition(pos);\n else if (!waitForClickSelection)\n editor.selection.moveToPosition(pos);\n if (!waitForClickSelection)\n this.select();\n if (editor.renderer.scroller.setCapture) {\n editor.renderer.scroller.setCapture();\n }\n editor.setStyle(\"ace_selecting\");\n this.setState(\"select\");\n editor.$blockScrolling--;\n };\n\n this.select = function() {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n editor.$blockScrolling++;\n if (this.$clickSelection) {\n var cmp = this.$clickSelection.comparePoint(cursor);\n\n if (cmp == -1) {\n anchor = this.$clickSelection.end;\n } else if (cmp == 1) {\n anchor = this.$clickSelection.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n editor.$blockScrolling--;\n editor.renderer.scrollCursorIntoView();\n };\n\n this.extendSelectionBy = function(unitName) {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n var range = editor.selection[unitName](cursor.row, cursor.column);\n editor.$blockScrolling++;\n if (this.$clickSelection) {\n var cmpStart = this.$clickSelection.comparePoint(range.start);\n var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n if (cmpStart == -1 && cmpEnd <= 0) {\n anchor = this.$clickSelection.end;\n if (range.end.row != cursor.row || range.end.column != cursor.column)\n cursor = range.start;\n } else if (cmpEnd == 1 && cmpStart >= 0) {\n anchor = this.$clickSelection.start;\n if (range.start.row != cursor.row || range.start.column != cursor.column)\n cursor = range.end;\n } else if (cmpStart == -1 && cmpEnd == 1) {\n cursor = range.end;\n anchor = range.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n editor.$blockScrolling--;\n editor.renderer.scrollCursorIntoView();\n };\n\n this.selectEnd =\n this.selectAllEnd =\n this.selectByWordsEnd =\n this.selectByLinesEnd = function() {\n this.$clickSelection = null;\n this.editor.unsetStyle(\"ace_selecting\");\n if (this.editor.renderer.scroller.releaseCapture) {\n this.editor.renderer.scroller.releaseCapture();\n }\n };\n\n this.focusWait = function() {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n var time = Date.now();\n\n if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n };\n\n this.onDoubleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n var session = editor.session;\n\n var range = session.getBracketRange(pos);\n if (range) {\n if (range.isEmpty()) {\n range.start.column--;\n range.end.column++;\n }\n this.setState(\"select\");\n } else {\n range = editor.selection.getWordRange(pos.row, pos.column);\n this.setState(\"selectByWords\");\n }\n this.$clickSelection = range;\n this.select();\n };\n\n this.onTripleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n\n this.setState(\"selectByLines\");\n var range = editor.getSelectionRange();\n if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n this.$clickSelection = editor.selection.getLineRange(range.start.row);\n this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\n } else {\n this.$clickSelection = editor.selection.getLineRange(pos.row);\n }\n this.select();\n };\n\n this.onQuadClick = function(ev) {\n var editor = this.editor;\n\n editor.selectAll();\n this.$clickSelection = editor.getSelectionRange();\n this.setState(\"selectAll\");\n };\n\n this.onMouseWheel = function(ev) {\n if (ev.getAccelKey())\n return;\n if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n ev.wheelX = ev.wheelY;\n ev.wheelY = 0;\n }\n \n var editor = this.editor;\n\n if (!this.$lastScroll)\n this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 };\n\n var prevScroll = this.$lastScroll;\n var t = ev.domEvent.timeStamp;\n var dt = t - prevScroll.t;\n var vx = ev.wheelX / dt;\n var vy = ev.wheelY / dt;\n if (dt < SCROLL_COOLDOWN_T) {\n vx = (vx + prevScroll.vx) / 2;\n vy = (vy + prevScroll.vy) / 2;\n }\n\n var direction = Math.abs(vx / vy);\n\n var canScroll = false;\n if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0))\n canScroll = true;\n if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed))\n canScroll = true;\n\n if (canScroll) {\n prevScroll.allowed = t;\n } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) {\n var isSlower = Math.abs(vx) <= 1.1 * Math.abs(prevScroll.vx)\n && Math.abs(vy) <= 1.1 * Math.abs(prevScroll.vy);\n if (isSlower) {\n canScroll = true;\n prevScroll.allowed = t;\n }\n else {\n prevScroll.allowed = 0;\n }\n }\n\n prevScroll.t = t;\n prevScroll.vx = vx;\n prevScroll.vy = vy;\n\n if (canScroll) {\n editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n return ev.stop();\n }\n };\n\n this.onTouchMove = function(ev) {\n this.editor._emit(\"mousewheel\", ev);\n };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n if (range.start.row == range.end.row)\n var cmp = 2 * cursor.column - range.start.column - range.end.column;\n else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n var cmp = cursor.column - 4;\n else\n var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n if (cmp < 0)\n return {cursor: range.start, anchor: range.end};\n else\n return {cursor: range.end, anchor: range.start};\n}\n\n});\n\nace.define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nfunction Tooltip (parentNode) {\n this.isOpen = false;\n this.$element = null;\n this.$parentNode = parentNode;\n}\n\n(function() {\n this.$init = function() {\n this.$element = dom.createElement(\"div\");\n this.$element.className = \"ace_tooltip\";\n this.$element.style.display = \"none\";\n this.$parentNode.appendChild(this.$element);\n return this.$element;\n };\n this.getElement = function() {\n return this.$element || this.$init();\n };\n this.setText = function(text) {\n dom.setInnerText(this.getElement(), text);\n };\n this.setHtml = function(html) {\n this.getElement().innerHTML = html;\n };\n this.setPosition = function(x, y) {\n this.getElement().style.left = x + \"px\";\n this.getElement().style.top = y + \"px\";\n };\n this.setClassName = function(className) {\n dom.addCssClass(this.getElement(), className);\n };\n this.show = function(text, x, y) {\n if (text != null)\n this.setText(text);\n if (x != null && y != null)\n this.setPosition(x, y);\n if (!this.isOpen) {\n this.getElement().style.display = \"block\";\n this.isOpen = true;\n }\n };\n\n this.hide = function() {\n if (this.isOpen) {\n this.getElement().style.display = \"none\";\n this.isOpen = false;\n }\n };\n this.getHeight = function() {\n return this.getElement().offsetHeight;\n };\n this.getWidth = function() {\n return this.getElement().offsetWidth;\n };\n\n this.destroy = function() {\n this.isOpen = false;\n if (this.$element && this.$element.parentNode) {\n this.$element.parentNode.removeChild(this.$element);\n }\n };\n\n}).call(Tooltip.prototype);\n\nexports.Tooltip = Tooltip;\n});\n\nace.define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"], function(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar event = acequire(\"../lib/event\");\nvar Tooltip = acequire(\"../tooltip\").Tooltip;\n\nfunction GutterHandler(mouseHandler) {\n var editor = mouseHandler.editor;\n var gutter = editor.renderer.$gutterLayer;\n var tooltip = new GutterTooltip(editor.container);\n\n mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n if (!editor.isFocused() || e.getButton() != 0)\n return;\n var gutterRegion = gutter.getRegion(e);\n\n if (gutterRegion == \"foldWidgets\")\n return;\n\n var row = e.getDocumentPosition().row;\n var selection = editor.session.selection;\n\n if (e.getShiftKey())\n selection.selectTo(row, 0);\n else {\n if (e.domEvent.detail == 2) {\n editor.selectAll();\n return e.preventDefault();\n }\n mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n }\n mouseHandler.setState(\"selectByLines\");\n mouseHandler.captureMouse(e);\n return e.preventDefault();\n });\n\n\n var tooltipTimeout, mouseEvent, tooltipAnnotation;\n\n function showTooltip() {\n var row = mouseEvent.getDocumentPosition().row;\n var annotation = gutter.$annotations[row];\n if (!annotation)\n return hideTooltip();\n\n var maxRow = editor.session.getLength();\n if (row == maxRow) {\n var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n var pos = mouseEvent.$pos;\n if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n return hideTooltip();\n }\n\n if (tooltipAnnotation == annotation)\n return;\n tooltipAnnotation = annotation.text.join(\"
    \");\n\n tooltip.setHtml(tooltipAnnotation);\n tooltip.show();\n editor._signal(\"showGutterTooltip\", tooltip);\n editor.on(\"mousewheel\", hideTooltip);\n\n if (mouseHandler.$tooltipFollowsMouse) {\n moveTooltip(mouseEvent);\n } else {\n var gutterElement = mouseEvent.domEvent.target;\n var rect = gutterElement.getBoundingClientRect();\n var style = tooltip.getElement().style;\n style.left = rect.right + \"px\";\n style.top = rect.bottom + \"px\";\n }\n }\n\n function hideTooltip() {\n if (tooltipTimeout)\n tooltipTimeout = clearTimeout(tooltipTimeout);\n if (tooltipAnnotation) {\n tooltip.hide();\n tooltipAnnotation = null;\n editor._signal(\"hideGutterTooltip\", tooltip);\n editor.removeEventListener(\"mousewheel\", hideTooltip);\n }\n }\n\n function moveTooltip(e) {\n tooltip.setPosition(e.x, e.y);\n }\n\n mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n var target = e.domEvent.target || e.domEvent.srcElement;\n if (dom.hasCssClass(target, \"ace_fold-widget\"))\n return hideTooltip();\n\n if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n moveTooltip(e);\n\n mouseEvent = e;\n if (tooltipTimeout)\n return;\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n if (mouseEvent && !mouseHandler.isMousePressed)\n showTooltip();\n else\n hideTooltip();\n }, 50);\n });\n\n event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n mouseEvent = null;\n if (!tooltipAnnotation || tooltipTimeout)\n return;\n\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n hideTooltip();\n }, 50);\n });\n \n editor.on(\"changeSession\", hideTooltip);\n}\n\nfunction GutterTooltip(parentNode) {\n Tooltip.call(this, parentNode);\n}\n\noop.inherits(GutterTooltip, Tooltip);\n\n(function(){\n this.setPosition = function(x, y) {\n var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n var width = this.getWidth();\n var height = this.getHeight();\n x += 15;\n y += 15;\n if (x + width > windowWidth) {\n x -= (x + width) - windowWidth;\n }\n if (y + height > windowHeight) {\n y -= 20 + height;\n }\n Tooltip.prototype.setPosition.call(this, x, y);\n };\n\n}).call(GutterTooltip.prototype);\n\n\n\nexports.GutterHandler = GutterHandler;\n\n});\n\nace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n this.domEvent = domEvent;\n this.editor = editor;\n \n this.x = this.clientX = domEvent.clientX;\n this.y = this.clientY = domEvent.clientY;\n\n this.$pos = null;\n this.$inSelection = null;\n \n this.propagationStopped = false;\n this.defaultPrevented = false;\n};\n\n(function() { \n \n this.stopPropagation = function() {\n event.stopPropagation(this.domEvent);\n this.propagationStopped = true;\n };\n \n this.preventDefault = function() {\n event.preventDefault(this.domEvent);\n this.defaultPrevented = true;\n };\n \n this.stop = function() {\n this.stopPropagation();\n this.preventDefault();\n };\n this.getDocumentPosition = function() {\n if (this.$pos)\n return this.$pos;\n \n this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n return this.$pos;\n };\n this.inSelection = function() {\n if (this.$inSelection !== null)\n return this.$inSelection;\n \n var editor = this.editor;\n \n\n var selectionRange = editor.getSelectionRange();\n if (selectionRange.isEmpty())\n this.$inSelection = false;\n else {\n var pos = this.getDocumentPosition();\n this.$inSelection = selectionRange.contains(pos.row, pos.column);\n }\n\n return this.$inSelection;\n };\n this.getButton = function() {\n return event.getButton(this.domEvent);\n };\n this.getShiftKey = function() {\n return this.domEvent.shiftKey;\n };\n \n this.getAccelKey = useragent.isMac\n ? function() { return this.domEvent.metaKey; }\n : function() { return this.domEvent.ctrlKey; };\n \n}).call(MouseEvent.prototype);\n\n});\n\nace.define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n var editor = mouseHandler.editor;\n\n var blankImage = dom.createElement(\"img\");\n blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (useragent.isOpera)\n blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\n var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n editor.addEventListener(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n\n var mouseTarget = editor.container;\n var dragSelectionMarker, x, y;\n var timerId, range;\n var dragCursor, counter = 0;\n var dragOperation;\n var isInternal;\n var autoScrollStartTime;\n var cursorMovedTime;\n var cursorPointOnCaretMoved;\n\n this.onDragStart = function(e) {\n if (this.cancelDrag || !mouseTarget.draggable) {\n var self = this;\n setTimeout(function(){\n self.startSelect();\n self.captureMouse(e);\n }, 0);\n return e.preventDefault();\n }\n range = editor.getSelectionRange();\n\n var dataTransfer = e.dataTransfer;\n dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n if (useragent.isOpera) {\n editor.container.appendChild(blankImage);\n blankImage.scrollTop = 0;\n }\n dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n if (useragent.isOpera) {\n editor.container.removeChild(blankImage);\n }\n dataTransfer.clearData();\n dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n isInternal = true;\n this.setState(\"drag\");\n };\n\n this.onDragEnd = function(e) {\n mouseTarget.draggable = false;\n isInternal = false;\n this.setState(null);\n if (!editor.getReadOnly()) {\n var dropEffect = e.dataTransfer.dropEffect;\n if (!dragOperation && dropEffect == \"move\")\n editor.session.remove(editor.getSelectionRange());\n editor.renderer.$cursorLayer.setBlinking(true);\n }\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n };\n\n this.onDragEnter = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker)\n addDragMarker();\n counter++;\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragOver = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker) {\n addDragMarker();\n counter++;\n }\n if (onMouseMoveTimer !== null)\n onMouseMoveTimer = null;\n\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragLeave = function(e) {\n counter--;\n if (counter <= 0 && dragSelectionMarker) {\n clearDragMarker();\n dragOperation = null;\n return event.preventDefault(e);\n }\n };\n\n this.onDrop = function(e) {\n if (!dragCursor)\n return;\n var dataTransfer = e.dataTransfer;\n if (isInternal) {\n switch (dragOperation) {\n case \"move\":\n if (range.contains(dragCursor.row, dragCursor.column)) {\n range = {\n start: dragCursor,\n end: dragCursor\n };\n } else {\n range = editor.moveText(range, dragCursor);\n }\n break;\n case \"copy\":\n range = editor.moveText(range, dragCursor, true);\n break;\n }\n } else {\n var dropData = dataTransfer.getData('Text');\n range = {\n start: dragCursor,\n end: editor.session.insert(dragCursor, dropData)\n };\n editor.focus();\n dragOperation = null;\n }\n clearDragMarker();\n return event.preventDefault(e);\n };\n\n event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler));\n event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler));\n\n function scrollCursorIntoView(cursor, prevCursor) {\n var now = Date.now();\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n var hMovement = !prevCursor || cursor.column != prevCursor.column;\n if (!cursorMovedTime || vMovement || hMovement) {\n editor.$blockScrolling += 1;\n editor.moveCursorToPosition(cursor);\n editor.$blockScrolling -= 1;\n cursorMovedTime = now;\n cursorPointOnCaretMoved = {x: x, y: y};\n } else {\n var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n if (distance > SCROLL_CURSOR_HYSTERESIS) {\n cursorMovedTime = null;\n } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n editor.renderer.scrollCursorIntoView();\n cursorMovedTime = null;\n }\n }\n }\n\n function autoScroll(cursor, prevCursor) {\n var now = Date.now();\n var lineHeight = editor.renderer.layerConfig.lineHeight;\n var characterWidth = editor.renderer.layerConfig.characterWidth;\n var editorRect = editor.renderer.scroller.getBoundingClientRect();\n var offsets = {\n x: {\n left: x - editorRect.left,\n right: editorRect.right - x\n },\n y: {\n top: y - editorRect.top,\n bottom: editorRect.bottom - y\n }\n };\n var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n var scrollCursor = {row: cursor.row, column: cursor.column};\n if (nearestXOffset / characterWidth <= 2) {\n scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n }\n if (nearestYOffset / lineHeight <= 1) {\n scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n }\n var vScroll = cursor.row != scrollCursor.row;\n var hScroll = cursor.column != scrollCursor.column;\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n if (vScroll || (hScroll && !vMovement)) {\n if (!autoScrollStartTime)\n autoScrollStartTime = now;\n else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n editor.renderer.scrollCursorIntoView(scrollCursor);\n } else {\n autoScrollStartTime = null;\n }\n }\n\n function onDragInterval() {\n var prevCursor = dragCursor;\n dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n scrollCursorIntoView(dragCursor, prevCursor);\n autoScroll(dragCursor, prevCursor);\n }\n\n function addDragMarker() {\n range = editor.selection.toOrientedRange();\n dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n editor.clearSelection();\n if (editor.isFocused())\n editor.renderer.$cursorLayer.setBlinking(false);\n clearInterval(timerId);\n onDragInterval();\n timerId = setInterval(onDragInterval, 20);\n counter = 0;\n event.addListener(document, \"mousemove\", onMouseMove);\n }\n\n function clearDragMarker() {\n clearInterval(timerId);\n editor.session.removeMarker(dragSelectionMarker);\n dragSelectionMarker = null;\n editor.$blockScrolling += 1;\n editor.selection.fromOrientedRange(range);\n editor.$blockScrolling -= 1;\n if (editor.isFocused() && !isInternal)\n editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n range = null;\n dragCursor = null;\n counter = 0;\n autoScrollStartTime = null;\n cursorMovedTime = null;\n event.removeListener(document, \"mousemove\", onMouseMove);\n }\n var onMouseMoveTimer = null;\n function onMouseMove() {\n if (onMouseMoveTimer == null) {\n onMouseMoveTimer = setTimeout(function() {\n if (onMouseMoveTimer != null && dragSelectionMarker)\n clearDragMarker();\n }, 20);\n }\n }\n\n function canAccept(dataTransfer) {\n var types = dataTransfer.types;\n return !types || Array.prototype.some.call(types, function(type) {\n return type == 'text/plain' || type == 'Text';\n });\n }\n\n function getDropEffect(e) {\n var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\n var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n var effectAllowed = \"uninitialized\";\n try {\n effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n } catch (e) {}\n var dropEffect = \"none\";\n\n if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n else if (moveAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"move\";\n else if (copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n\n return dropEffect;\n }\n}\n\n(function() {\n\n this.dragWait = function() {\n var interval = Date.now() - this.mousedownEvent.time;\n if (interval > this.editor.getDragDelay())\n this.startDrag();\n };\n\n this.dragWaitEnd = function() {\n var target = this.editor.container;\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n this.selectEnd();\n };\n\n this.dragReadyEnd = function(e) {\n this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n this.dragWaitEnd();\n };\n\n this.startDrag = function(){\n this.cancelDrag = false;\n var editor = this.editor;\n var target = editor.container;\n target.draggable = true;\n editor.renderer.$cursorLayer.setBlinking(false);\n editor.setStyle(\"ace_dragging\");\n var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n editor.renderer.setCursorStyle(cursorStyle);\n this.setState(\"dragReady\");\n };\n\n this.onMouseDrag = function(e) {\n var target = this.editor.container;\n if (useragent.isIE && this.state == \"dragReady\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 3)\n target.dragDrop();\n }\n if (this.state === \"dragWait\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 0) {\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n }\n }\n };\n\n this.onMouseDown = function(e) {\n if (!this.$dragEnabled)\n return;\n this.mousedownEvent = e;\n var editor = this.editor;\n\n var inSelection = e.inSelection();\n var button = e.getButton();\n var clickCount = e.domEvent.detail || 1;\n if (clickCount === 1 && button === 0 && inSelection) {\n if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n return;\n this.mousedownEvent.time = Date.now();\n var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n if (\"unselectable\" in eventTarget)\n eventTarget.unselectable = \"on\";\n if (editor.getDragDelay()) {\n if (useragent.isWebKit) {\n this.cancelDrag = true;\n var mouseTarget = editor.container;\n mouseTarget.draggable = true;\n }\n this.setState(\"dragWait\");\n } else {\n this.startDrag();\n }\n this.captureMouse(e, this.onMouseDrag.bind(this));\n e.defaultPrevented = true;\n }\n };\n\n}).call(DragdropHandler.prototype);\n\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nexports.DragdropHandler = DragdropHandler;\n\n});\n\nace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"./dom\");\n\nexports.get = function (url, callback) {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n callback(xhr.responseText);\n }\n };\n xhr.send(null);\n};\n\nexports.loadScript = function(path, callback) {\n var head = dom.getDocumentHead();\n var s = document.createElement('script');\n\n s.src = path;\n head.appendChild(s);\n\n s.onload = s.onreadystatechange = function(_, isAbort) {\n if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n s = s.onload = s.onreadystatechange = null;\n if (!isAbort)\n callback();\n }\n };\n};\nexports.qualifyURL = function(url) {\n var a = document.createElement('a');\n a.href = url;\n return a.href;\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n this._eventRegistry || (this._eventRegistry = {});\n this._defaultHandlers || (this._defaultHandlers = {});\n\n var listeners = this._eventRegistry[eventName] || [];\n var defaultHandler = this._defaultHandlers[eventName];\n if (!listeners.length && !defaultHandler)\n return;\n\n if (typeof e != \"object\" || !e)\n e = {};\n\n if (!e.type)\n e.type = eventName;\n if (!e.stopPropagation)\n e.stopPropagation = stopPropagation;\n if (!e.preventDefault)\n e.preventDefault = preventDefault;\n\n listeners = listeners.slice();\n for (var i=0; i 1)\n base = parts[parts.length - 2];\n var path = options[component + \"Path\"];\n if (path == null) {\n path = options.basePath;\n } else if (sep == \"/\") {\n component = sep = \"\";\n }\n if (path && path.slice(-1) != \"/\")\n path += \"/\";\n return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n var module, moduleType;\n if (Array.isArray(moduleName)) {\n moduleType = moduleName[0];\n moduleName = moduleName[1];\n }\n\n try {\n module = acequire(moduleName);\n } catch (e) {}\n if (module && !exports.$loading[moduleName])\n return onLoad && onLoad(module);\n\n if (!exports.$loading[moduleName])\n exports.$loading[moduleName] = [];\n\n exports.$loading[moduleName].push(onLoad);\n\n if (exports.$loading[moduleName].length > 1)\n return;\n\n var afterLoad = function() {\n acequire([moduleName], function(module) {\n exports._emit(\"load.module\", {name: moduleName, module: module});\n var listeners = exports.$loading[moduleName];\n exports.$loading[moduleName] = null;\n listeners.forEach(function(onLoad) {\n onLoad && onLoad(module);\n });\n });\n };\n\n if (!exports.get(\"packaged\"))\n return afterLoad();\n net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n};\ninit(true);function init(packaged) {\n\n if (!global || !global.document)\n return;\n \n options.packaged = packaged || acequire.packaged || module.packaged || (global.define && define.packaged);\n\n var scriptOptions = {};\n var scriptUrl = \"\";\n var currentScript = (document.currentScript || document._currentScript ); // native or polyfill\n var currentDocument = currentScript && currentScript.ownerDocument || document;\n \n var scripts = currentDocument.getElementsByTagName(\"script\");\n for (var i=0; i 0){\n\t\t\tif (action == 0x10){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = 1;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t} else {\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tcond = impTab[newState][6];\n\t\tif (cond){\n\t\t\tif(condPos == -1){\n\t\t\t\tcondPos = ix;\n\t\t\t}\n\t\t}else{\n\t\t\tif (condPos > -1){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = newLevel;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tif (charTypes[ix] == B){\n\t\t\tlevels[ix] = 0;\n\t\t}\n\t\thiLevel |= newLevel;\n\t}\n\tif (hasUBAT_S){\n\t\tfor(i = 0; i < len; i++){\n\t\t\tif(charTypes[i] == S){\n\t\t\t\tlevels[i] = dir;\n\t\t\t\tfor(var j = i - 1; j >= 0; j--){\n\t\t\t\t\tif(charTypes[j] == WS){\n\t\t\t\t\t\tlevels[j] = dir;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction _invertLevel(lev, levels, _array) {\n\tif (hiLevel < lev){\n\t\treturn;\n\t}\n\tif (lev == 1 && dir == RTL && !hasUBAT_B){\n\t\t_array.reverse();\n\t\treturn;\n\t}\n\tvar len = _array.length, start = 0, end, lo, hi, tmp;\n\twhile(start < len){\n\t\tif (levels[start] >= lev){\n\t\t\tend = start + 1;\n\t\twhile(end < len && levels[end] >= lev){\n\t\t\tend++;\n\t\t}\n\t\tfor(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){\n\t\t\ttmp = _array[lo];\n\t\t\t_array[lo] = _array[hi];\n\t\t\t_array[hi] = tmp;\n\t\t}\n\t\tstart = end;\n\t}\n\tstart++;\n\t}\n}\n\nfunction _getCharClass(chars, types, classes, ix) {\n\tvar cType = types[ix], wType, nType, len, i;\n\tswitch(cType){\n\t\tcase L:\n\t\tcase R:\n\t\t\tlastArabic = false;\n\t\tcase ON:\n\t\tcase AN:\n\t\t\treturn cType;\n\t\tcase EN:\n\t\t\treturn lastArabic ? AN : EN;\n\t\tcase AL:\n\t\t\tlastArabic = true;\n\t\t\thasUBAT_AL = true;\n\t\t\treturn R;\n\t\tcase WS:\n\t\t\treturn ON;\n\t\tcase CS:\n\t\t\tif (ix < 1 || (ix + 1) >= types.length ||\n\t\t\t\t((wType = classes[ix - 1]) != EN && wType != AN) ||\n\t\t\t\t((nType = types[ix + 1]) != EN && nType != AN)){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\tif (lastArabic){nType = AN;}\n\t\t\treturn nType == wType ? nType : ON;\n\t\tcase ES:\n\t\t\twType = ix > 0 ? classes[ix - 1] : B;\n\t\t\tif (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase ET:\n\t\t\tif (ix > 0 && classes[ix - 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\tif (lastArabic){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\ti = ix + 1;\n\t\t\tlen = types.length;\n\t\t\twhile (i < len && types[i] == ET){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len && types[i] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase NSM:\n\t\t\tlen = types.length;\n\t\t\ti = ix + 1;\n\t\t\twhile (i < len && types[i] == NSM){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len){\n\t\t\t\tvar c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E;\n\n\t\t\t\twType = types[i];\n\t\t\t\tif (rtlCandidate && (wType == R || wType == AL)){\n\t\t\t\t\treturn R;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ix < 1 || (wType = types[ix - 1]) == B){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\treturn classes[ix - 1];\n\t\tcase B:\n\t\t\tlastArabic = false;\n\t\t\thasUBAT_B = true;\n\t\t\treturn dir;\n\t\tcase S:\n\t\t\thasUBAT_S = true;\n\t\t\treturn ON;\n\t\tcase LRE:\n\t\tcase RLE:\n\t\tcase LRO:\n\t\tcase RLO:\n\t\tcase PDF:\n\t\t\tlastArabic = false;\n\t\tcase BN:\n\t\t\treturn ON;\n\t}\n}\n\nfunction _getCharacterType( ch ) {\n\tvar uc = ch.charCodeAt(0), hi = uc >> 8;\n\n\tif (hi == 0) {\n\t\treturn ((uc > 0x00BF) ? L : UnicodeTBL00[uc]);\n\t} else if (hi == 5) {\n\t\treturn (/[\\u0591-\\u05f4]/.test(ch) ? R : L);\n\t} else if (hi == 6) {\n\t\tif (/[\\u0610-\\u061a\\u064b-\\u065f\\u06d6-\\u06e4\\u06e7-\\u06ed]/.test(ch))\n\t\t\treturn NSM;\n\t\telse if (/[\\u0660-\\u0669\\u066b-\\u066c]/.test(ch))\n\t\t\treturn AN;\n\t\telse if (uc == 0x066A)\n\t\t\treturn ET;\n\t\telse if (/[\\u06f0-\\u06f9]/.test(ch))\n\t\t\treturn EN;\n\t\telse\n\t\t\treturn AL;\n\t} else if (hi == 0x20 && uc <= 0x205F) {\n\t\treturn UnicodeTBL20[uc & 0xFF];\n\t} else if (hi == 0xFE) {\n\t\treturn (uc >= 0xFE70 ? AL : ON);\n\t}\n\treturn ON;\n}\n\nfunction _isArabicDiacritics( ch ) {\n\treturn (ch >= '\\u064b' && ch <= '\\u0655');\n}\nexports.L = L;\nexports.R = R;\nexports.EN = EN;\nexports.ON_R = 3;\nexports.AN = 4;\nexports.R_H = 5;\nexports.B = 6;\n\nexports.DOT = \"\\xB7\";\nexports.doBidiReorder = function(text, textCharTypes, isRtl) {\n\tif (text.length < 2)\n\t\treturn {};\n\n\tvar chars = text.split(\"\"), logicalFromVisual = new Array(chars.length),\n\t\tbidiLevels = new Array(chars.length), levels = [];\n\n\tdir = isRtl ? RTL : LTR;\n\n\t_computeLevels(chars, levels, chars.length, textCharTypes);\n\n\tfor (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++);\n\n\t_invertLevel(2, levels, logicalFromVisual);\n\t_invertLevel(1, levels, logicalFromVisual);\n\n\tfor (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width\n\t\tif (textCharTypes[i] === AN) {\n\t\t\tlevels[i] = exports.AN;\n\t\t} else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE)\n\t\t\t|| textCharTypes[i] === ON || textCharTypes[i] === BN)) {\n\t\t\tlevels[i] = exports.ON_R;\n\t\t} else if ((i > 0 && chars[i - 1] === '\\u0644') && /\\u0622|\\u0623|\\u0625|\\u0627/.test(chars[i])) {\n\t\t\tlevels[i - 1] = levels[i] = exports.R_H;\n\t\t\ti++;\n\t\t}\n\t}\n\tif (chars[chars.length - 1] === exports.DOT)\n\t\tlevels[chars.length - 1] = exports.B;\n\n\tfor (var i = 0; i < logicalFromVisual.length; i++) {\n\t\tbidiLevels[i] = levels[logicalFromVisual[i]];\n\t}\n\n\treturn {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels};\n};\nexports.hasBidiCharacters = function(text, textCharTypes){\n\tvar ret = false;\n\tfor (var i = 0; i < text.length; i++){\n\t\ttextCharTypes[i] = _getCharacterType(text.charAt(i));\n\t\tif (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL))\n\t\t\tret = true;\n\t}\n\treturn ret;\n};\nexports.getVisualFromLogicalIdx = function(logIdx, rowMap) {\n\tfor (var i = 0; i < rowMap.logicalFromVisual.length; i++) {\n\t\tif (rowMap.logicalFromVisual[i] == logIdx)\n\t\t\treturn i;\n\t}\n\treturn 0;\n};\n\n});\n\nace.define(\"ace/bidihandler\",[\"require\",\"exports\",\"module\",\"ace/lib/bidiutil\",\"ace/lib/lang\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar bidiUtil = acequire(\"./lib/bidiutil\");\nvar lang = acequire(\"./lib/lang\");\nvar useragent = acequire(\"./lib/useragent\");\nvar bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\nvar BidiHandler = function(session) {\n this.session = session;\n this.bidiMap = {};\n this.currentRow = null;\n this.bidiUtil = bidiUtil;\n this.charWidths = [];\n this.EOL = \"\\xAC\";\n this.showInvisibles = true;\n this.isRtlDir = false;\n this.line = \"\";\n this.wrapIndent = 0;\n this.isLastRow = false;\n this.EOF = \"\\xB6\";\n this.seenBidi = false;\n};\n\n(function() {\n this.isBidiRow = function(screenRow, docRow, splitIndex) {\n if (!this.seenBidi)\n return false;\n if (screenRow !== this.currentRow) {\n this.currentRow = screenRow;\n this.updateRowLine(docRow, splitIndex);\n this.updateBidiMap();\n }\n return this.bidiMap.bidiLevels;\n };\n\n this.onChange = function(delta) {\n if (!this.seenBidi) {\n if (delta.action == \"insert\" && bidiRE.test(delta.lines.join(\"\\n\"))) {\n this.seenBidi = true;\n this.currentRow = null;\n }\n }\n else {\n this.currentRow = null;\n }\n };\n\n this.getDocumentRow = function() {\n var docRow = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var index = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n if (index >= 0)\n docRow = this.session.$docRowCache[index];\n }\n\n return docRow;\n };\n\n this.getSplitIndex = function() {\n var splitIndex = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n while (this.currentRow - splitIndex > 0) {\n currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1);\n if (currentIndex !== prevIndex)\n break;\n\n prevIndex = currentIndex;\n splitIndex++;\n }\n }\n\n return splitIndex;\n };\n\n this.updateRowLine = function(docRow, splitIndex) {\n if (docRow === undefined)\n docRow = this.getDocumentRow();\n\n this.wrapIndent = 0;\n this.isLastRow = (docRow === this.session.getLength() - 1);\n this.line = this.session.getLine(docRow);\n if (this.session.$useWrapMode) {\n var splits = this.session.$wrapData[docRow];\n if (splits) {\n if (splitIndex === undefined)\n splitIndex = this.getSplitIndex();\n\n if(splitIndex > 0 && splits.length) {\n this.wrapIndent = splits.indent;\n this.line = (splitIndex < splits.length) ?\n this.line.substring(splits[splitIndex - 1], splits[splits.length - 1]) :\n this.line.substring(splits[splits.length - 1]);\n } else {\n this.line = this.line.substring(0, splits[splitIndex]);\n }\n }\n }\n var session = this.session, shift = 0, size;\n this.line = this.line.replace(/\\t|[\\u1100-\\u2029, \\u202F-\\uFFE6]/g, function(ch, i){\n if (ch === '\\t' || session.isFullWidth(ch.charCodeAt(0))) {\n size = (ch === '\\t') ? session.getScreenTabSize(i + shift) : 2;\n shift += size - 1;\n return lang.stringRepeat(bidiUtil.DOT, size);\n }\n return ch;\n });\n };\n\n this.updateBidiMap = function() {\n var textCharTypes = [], endOfLine = this.isLastRow ? this.EOF : this.EOL;\n var line = this.line + (this.showInvisibles ? endOfLine : bidiUtil.DOT);\n if (bidiUtil.hasBidiCharacters(line, textCharTypes)) {\n this.bidiMap = bidiUtil.doBidiReorder(line, textCharTypes, this.isRtlDir);\n } else {\n this.bidiMap = {};\n }\n };\n this.markAsDirty = function() {\n this.currentRow = null;\n };\n this.updateCharacterWidths = function(fontMetrics) {\n if (!this.seenBidi)\n return;\n if (this.characterWidth === fontMetrics.$characterSize.width)\n return;\n\n var characterWidth = this.characterWidth = fontMetrics.$characterSize.width;\n var bidiCharWidth = fontMetrics.$measureCharWidth(\"\\u05d4\");\n\n this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth;\n this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth;\n this.charWidths[bidiUtil.R_H] = useragent.isChrome ? bidiCharWidth : bidiCharWidth * 0.45;\n this.charWidths[bidiUtil.B] = 0;\n\n this.currentRow = null;\n };\n\n this.getShowInvisibles = function() {\n return this.showInvisibles;\n };\n\n this.setShowInvisibles = function(showInvisibles) {\n this.showInvisibles = showInvisibles;\n this.currentRow = null;\n };\n\n this.setEolChar = function(eolChar) {\n this.EOL = eolChar;\n };\n\n this.setTextDir = function(isRtlDir) {\n this.isRtlDir = isRtlDir;\n };\n this.getPosLeft = function(col) {\n col -= this.wrapIndent;\n var visualIdx = bidiUtil.getVisualFromLogicalIdx(col > 0 ? col - 1 : 0, this.bidiMap),\n levels = this.bidiMap.bidiLevels, left = 0;\n\n if (col === 0 && levels[visualIdx] % 2 !== 0)\n visualIdx++;\n\n for (var i = 0; i < visualIdx; i++) {\n left += this.charWidths[levels[i]];\n }\n\n if (col !== 0 && levels[visualIdx] % 2 === 0)\n left += this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n left += this.wrapIndent * this.charWidths[bidiUtil.L];\n\n return left;\n };\n this.getSelections = function(startCol, endCol) {\n var map = this.bidiMap, levels = map.bidiLevels, level, offset = this.wrapIndent * this.charWidths[bidiUtil.L], selections = [],\n selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\n isSelected = false, isSelectedPrev = false, selectionStart = 0;\n\n for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) {\n logIdx = map.logicalFromVisual[visIdx];\n level = levels[visIdx];\n isSelected = (logIdx >= selColMin) && (logIdx < selColMax);\n if (isSelected && !isSelectedPrev) {\n selectionStart = offset;\n } else if (!isSelected && isSelectedPrev) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n offset += this.charWidths[level];\n isSelectedPrev = isSelected;\n }\n\n if (isSelected && (visIdx === levels.length)) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n\n return selections;\n };\n this.offsetToCol = function(posX) {\n var logicalIdx = 0, posX = Math.max(posX, 0),\n offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels,\n charWidth = this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent) {\n posX -= this.wrapIndent * this.charWidths[bidiUtil.L];\n }\n\n while(posX > offset + charWidth/2) {\n offset += charWidth;\n if(visualIdx === levels.length - 1) {\n charWidth = 0;\n break;\n }\n charWidth = this.charWidths[levels[++visualIdx]];\n }\n\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){\n if(posX < offset)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n\n } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){\n logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx]\n : this.bidiMap.logicalFromVisual[visualIdx - 1]);\n\n } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0))\n || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){\n logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx];\n } else {\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n }\n\n return (logicalIdx + this.wrapIndent);\n };\n\n}).call(BidiHandler.prototype);\n\nexports.BidiHandler = BidiHandler;\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n this.start = {\n row: startRow,\n column: startColumn\n };\n\n this.end = {\n row: endRow,\n column: endColumn\n };\n};\n\n(function() {\n this.isEqual = function(range) {\n return this.start.row === range.start.row &&\n this.end.row === range.end.row &&\n this.start.column === range.start.column &&\n this.end.column === range.end.column;\n };\n this.toString = function() {\n return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n };\n\n this.contains = function(row, column) {\n return this.compare(row, column) == 0;\n };\n this.compareRange = function(range) {\n var cmp,\n end = range.end,\n start = range.start;\n\n cmp = this.compare(end.row, end.column);\n if (cmp == 1) {\n cmp = this.compare(start.row, start.column);\n if (cmp == 1) {\n return 2;\n } else if (cmp == 0) {\n return 1;\n } else {\n return 0;\n }\n } else if (cmp == -1) {\n return -2;\n } else {\n cmp = this.compare(start.row, start.column);\n if (cmp == -1) {\n return -1;\n } else if (cmp == 1) {\n return 42;\n } else {\n return 0;\n }\n }\n };\n this.comparePoint = function(p) {\n return this.compare(p.row, p.column);\n };\n this.containsRange = function(range) {\n return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n };\n this.intersects = function(range) {\n var cmp = this.compareRange(range);\n return (cmp == -1 || cmp == 0 || cmp == 1);\n };\n this.isEnd = function(row, column) {\n return this.end.row == row && this.end.column == column;\n };\n this.isStart = function(row, column) {\n return this.start.row == row && this.start.column == column;\n };\n this.setStart = function(row, column) {\n if (typeof row == \"object\") {\n this.start.column = row.column;\n this.start.row = row.row;\n } else {\n this.start.row = row;\n this.start.column = column;\n }\n };\n this.setEnd = function(row, column) {\n if (typeof row == \"object\") {\n this.end.column = row.column;\n this.end.row = row.row;\n } else {\n this.end.row = row;\n this.end.column = column;\n }\n };\n this.inside = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column) || this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideStart = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideEnd = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.compare = function(row, column) {\n if (!this.isMultiLine()) {\n if (row === this.start.row) {\n return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n }\n }\n\n if (row < this.start.row)\n return -1;\n\n if (row > this.end.row)\n return 1;\n\n if (this.start.row === row)\n return column >= this.start.column ? 0 : -1;\n\n if (this.end.row === row)\n return column <= this.end.column ? 0 : 1;\n\n return 0;\n };\n this.compareStart = function(row, column) {\n if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareEnd = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareInside = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.clipRows = function(firstRow, lastRow) {\n if (this.end.row > lastRow)\n var end = {row: lastRow + 1, column: 0};\n else if (this.end.row < firstRow)\n var end = {row: firstRow, column: 0};\n\n if (this.start.row > lastRow)\n var start = {row: lastRow + 1, column: 0};\n else if (this.start.row < firstRow)\n var start = {row: firstRow, column: 0};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n this.extend = function(row, column) {\n var cmp = this.compare(row, column);\n\n if (cmp == 0)\n return this;\n else if (cmp == -1)\n var start = {row: row, column: column};\n else\n var end = {row: row, column: column};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n\n this.isEmpty = function() {\n return (this.start.row === this.end.row && this.start.column === this.end.column);\n };\n this.isMultiLine = function() {\n return (this.start.row !== this.end.row);\n };\n this.clone = function() {\n return Range.fromPoints(this.start, this.end);\n };\n this.collapseRows = function() {\n if (this.end.column == 0)\n return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0);\n else\n return new Range(this.start.row, 0, this.end.row, 0);\n };\n this.toScreenRange = function(session) {\n var screenPosStart = session.documentToScreenPosition(this.start);\n var screenPosEnd = session.documentToScreenPosition(this.end);\n\n return new Range(\n screenPosStart.row, screenPosStart.column,\n screenPosEnd.row, screenPosEnd.column\n );\n };\n this.moveBy = function(row, column) {\n this.start.row += row;\n this.start.column += column;\n this.end.row += row;\n this.end.column += column;\n };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Selection = function(session) {\n this.session = session;\n this.doc = session.getDocument();\n\n this.clearSelection();\n this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\n var self = this;\n this.lead.on(\"change\", function(e) {\n self._emit(\"changeCursor\");\n if (!self.$isEmpty)\n self._emit(\"changeSelection\");\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n self.$desiredColumn = null;\n });\n\n this.selectionAnchor.on(\"change\", function() {\n if (!self.$isEmpty)\n self._emit(\"changeSelection\");\n });\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.isEmpty = function() {\n return (this.$isEmpty || (\n this.anchor.row == this.lead.row &&\n this.anchor.column == this.lead.column\n ));\n };\n this.isMultiLine = function() {\n if (this.isEmpty()) {\n return false;\n }\n\n return this.getRange().isMultiLine();\n };\n this.getCursor = function() {\n return this.lead.getPosition();\n };\n this.setSelectionAnchor = function(row, column) {\n this.anchor.setPosition(row, column);\n\n if (this.$isEmpty) {\n this.$isEmpty = false;\n this._emit(\"changeSelection\");\n }\n };\n this.getSelectionAnchor = function() {\n if (this.$isEmpty)\n return this.getSelectionLead();\n else\n return this.anchor.getPosition();\n };\n this.getSelectionLead = function() {\n return this.lead.getPosition();\n };\n this.shiftSelection = function(columns) {\n if (this.$isEmpty) {\n this.moveCursorTo(this.lead.row, this.lead.column + columns);\n return;\n }\n\n var anchor = this.getSelectionAnchor();\n var lead = this.getSelectionLead();\n\n var isBackwards = this.isBackwards();\n\n if (!isBackwards || anchor.column !== 0)\n this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\n if (isBackwards || lead.column !== 0) {\n this.$moveSelection(function() {\n this.moveCursorTo(lead.row, lead.column + columns);\n });\n }\n };\n this.isBackwards = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n };\n this.getRange = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n\n if (this.isEmpty())\n return Range.fromPoints(lead, lead);\n\n if (this.isBackwards()) {\n return Range.fromPoints(lead, anchor);\n }\n else {\n return Range.fromPoints(anchor, lead);\n }\n };\n this.clearSelection = function() {\n if (!this.$isEmpty) {\n this.$isEmpty = true;\n this._emit(\"changeSelection\");\n }\n };\n this.selectAll = function() {\n var lastRow = this.doc.getLength() - 1;\n this.setSelectionAnchor(0, 0);\n this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n };\n this.setRange =\n this.setSelectionRange = function(range, reverse) {\n if (reverse) {\n this.setSelectionAnchor(range.end.row, range.end.column);\n this.selectTo(range.start.row, range.start.column);\n } else {\n this.setSelectionAnchor(range.start.row, range.start.column);\n this.selectTo(range.end.row, range.end.column);\n }\n if (this.getRange().isEmpty())\n this.$isEmpty = true;\n this.$desiredColumn = null;\n };\n\n this.$moveSelection = function(mover) {\n var lead = this.lead;\n if (this.$isEmpty)\n this.setSelectionAnchor(lead.row, lead.column);\n\n mover.call(this);\n };\n this.selectTo = function(row, column) {\n this.$moveSelection(function() {\n this.moveCursorTo(row, column);\n });\n };\n this.selectToPosition = function(pos) {\n this.$moveSelection(function() {\n this.moveCursorToPosition(pos);\n });\n };\n this.moveTo = function(row, column) {\n this.clearSelection();\n this.moveCursorTo(row, column);\n };\n this.moveToPosition = function(pos) {\n this.clearSelection();\n this.moveCursorToPosition(pos);\n };\n this.selectUp = function() {\n this.$moveSelection(this.moveCursorUp);\n };\n this.selectDown = function() {\n this.$moveSelection(this.moveCursorDown);\n };\n this.selectRight = function() {\n this.$moveSelection(this.moveCursorRight);\n };\n this.selectLeft = function() {\n this.$moveSelection(this.moveCursorLeft);\n };\n this.selectLineStart = function() {\n this.$moveSelection(this.moveCursorLineStart);\n };\n this.selectLineEnd = function() {\n this.$moveSelection(this.moveCursorLineEnd);\n };\n this.selectFileEnd = function() {\n this.$moveSelection(this.moveCursorFileEnd);\n };\n this.selectFileStart = function() {\n this.$moveSelection(this.moveCursorFileStart);\n };\n this.selectWordRight = function() {\n this.$moveSelection(this.moveCursorWordRight);\n };\n this.selectWordLeft = function() {\n this.$moveSelection(this.moveCursorWordLeft);\n };\n this.getWordRange = function(row, column) {\n if (typeof column == \"undefined\") {\n var cursor = row || this.lead;\n row = cursor.row;\n column = cursor.column;\n }\n return this.session.getWordRange(row, column);\n };\n this.selectWord = function() {\n this.setSelectionRange(this.getWordRange());\n };\n this.selectAWord = function() {\n var cursor = this.getCursor();\n var range = this.session.getAWordRange(cursor.row, cursor.column);\n this.setSelectionRange(range);\n };\n\n this.getLineRange = function(row, excludeLastChar) {\n var rowStart = typeof row == \"number\" ? row : this.lead.row;\n var rowEnd;\n\n var foldLine = this.session.getFoldLine(rowStart);\n if (foldLine) {\n rowStart = foldLine.start.row;\n rowEnd = foldLine.end.row;\n } else {\n rowEnd = rowStart;\n }\n if (excludeLastChar === true)\n return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n else\n return new Range(rowStart, 0, rowEnd + 1, 0);\n };\n this.selectLine = function() {\n this.setSelectionRange(this.getLineRange());\n };\n this.moveCursorUp = function() {\n this.moveCursorBy(-1, 0);\n };\n this.moveCursorDown = function() {\n this.moveCursorBy(1, 0);\n };\n this.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) {\n var start = cursor.column;\n var end = cursor.column + tabSize;\n\n if (direction < 0) {\n start = cursor.column - tabSize;\n end = cursor.column;\n }\n return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(\" \").length-1 == tabSize;\n };\n this.moveCursorLeft = function() {\n var cursor = this.lead.getPosition(),\n fold;\n\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n } else if (cursor.column === 0) {\n if (cursor.row > 0) {\n this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, -tabSize);\n } else {\n this.moveCursorBy(0, -1);\n }\n }\n };\n this.moveCursorRight = function() {\n var cursor = this.lead.getPosition(),\n fold;\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n }\n else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n if (this.lead.row < this.doc.getLength() - 1) {\n this.moveCursorTo(this.lead.row + 1, 0);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n var cursor = this.lead;\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, tabSize);\n } else {\n this.moveCursorBy(0, 1);\n }\n }\n };\n this.moveCursorLineStart = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var screenRow = this.session.documentToScreenRow(row, column);\n var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n var beforeCursor = this.session.getDisplayLine(\n row, null, firstColumnPosition.row,\n firstColumnPosition.column\n );\n\n var leadingSpace = beforeCursor.match(/^\\s*/);\n if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n firstColumnPosition.column += leadingSpace[0].length;\n this.moveCursorToPosition(firstColumnPosition);\n };\n this.moveCursorLineEnd = function() {\n var lead = this.lead;\n var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n if (this.lead.column == lineEnd.column) {\n var line = this.session.getLine(lineEnd.row);\n if (lineEnd.column == line.length) {\n var textEnd = line.search(/\\s+$/);\n if (textEnd > 0)\n lineEnd.column = textEnd;\n }\n }\n\n this.moveCursorTo(lineEnd.row, lineEnd.column);\n };\n this.moveCursorFileEnd = function() {\n var row = this.doc.getLength() - 1;\n var column = this.doc.getLine(row).length;\n this.moveCursorTo(row, column);\n };\n this.moveCursorFileStart = function() {\n this.moveCursorTo(0, 0);\n };\n this.moveCursorLongWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var match;\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n return;\n }\n if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n column += this.session.nonTokenRe.lastIndex;\n this.session.nonTokenRe.lastIndex = 0;\n rightOfCursor = line.substring(column);\n }\n if (column >= line.length) {\n this.moveCursorTo(row, line.length);\n this.moveCursorRight();\n if (row < this.doc.getLength() - 1)\n this.moveCursorWordRight();\n return;\n }\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\n column += this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n this.moveCursorLongWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n return;\n }\n\n var str = this.session.getFoldStringAt(row, column, -1);\n if (str == null) {\n str = this.doc.getLine(row).substring(0, column);\n }\n\n var leftOfCursor = lang.stringReverse(str);\n var match;\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n column -= this.session.nonTokenRe.lastIndex;\n leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n this.session.nonTokenRe.lastIndex = 0;\n }\n if (column <= 0) {\n this.moveCursorTo(row, 0);\n this.moveCursorLeft();\n if (row > 0)\n this.moveCursorWordLeft();\n return;\n }\n if (match = this.session.tokenRe.exec(leftOfCursor)) {\n column -= this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n\n this.$shortWordEndIndex = function(rightOfCursor) {\n var match, index = 0, ch;\n var whitespaceRe = /\\s/;\n var tokenRe = this.session.tokenRe;\n\n tokenRe.lastIndex = 0;\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\n index = this.session.tokenRe.lastIndex;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n\n if (index < 1) {\n tokenRe.lastIndex = 0;\n while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n tokenRe.lastIndex = 0;\n index ++;\n if (whitespaceRe.test(ch)) {\n if (index > 2) {\n index--;\n break;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n if (index > 2)\n break;\n }\n }\n }\n }\n }\n tokenRe.lastIndex = 0;\n\n return index;\n };\n\n this.moveCursorShortWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold)\n return this.moveCursorTo(fold.end.row, fold.end.column);\n\n if (column == line.length) {\n var l = this.doc.getLength();\n do {\n row++;\n rightOfCursor = this.doc.getLine(row);\n } while (row < l && /^\\s*$/.test(rightOfCursor));\n\n if (!/^\\s+/.test(rightOfCursor))\n rightOfCursor = \"\";\n column = 0;\n }\n\n var index = this.$shortWordEndIndex(rightOfCursor);\n\n this.moveCursorTo(row, column + index);\n };\n\n this.moveCursorShortWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1))\n return this.moveCursorTo(fold.start.row, fold.start.column);\n\n var line = this.session.getLine(row).substring(0, column);\n if (column === 0) {\n do {\n row--;\n line = this.doc.getLine(row);\n } while (row > 0 && /^\\s*$/.test(line));\n\n column = line.length;\n if (!/\\s+$/.test(line))\n line = \"\";\n }\n\n var leftOfCursor = lang.stringReverse(line);\n var index = this.$shortWordEndIndex(leftOfCursor);\n\n return this.moveCursorTo(row, column - index);\n };\n\n this.moveCursorWordRight = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordRight();\n else\n this.moveCursorShortWordRight();\n };\n\n this.moveCursorWordLeft = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordLeft();\n else\n this.moveCursorShortWordLeft();\n };\n this.moveCursorBy = function(rows, chars) {\n var screenPos = this.session.documentToScreenPosition(\n this.lead.row,\n this.lead.column\n );\n\n var offsetX;\n\n if (chars === 0) {\n if (rows !== 0) {\n if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) {\n offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column);\n screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]);\n } else {\n offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0];\n }\n }\n\n if (this.$desiredColumn)\n screenPos.column = this.$desiredColumn;\n else\n this.$desiredColumn = screenPos.column;\n }\n\n var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX);\n \n if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) {\n if (docPos.row > 0 || rows > 0)\n docPos.row++;\n }\n }\n this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n };\n this.moveCursorToPosition = function(position) {\n this.moveCursorTo(position.row, position.column);\n };\n this.moveCursorTo = function(row, column, keepDesiredColumn) {\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n row = fold.start.row;\n column = fold.start.column;\n }\n\n this.$keepDesiredColumnOnChange = true;\n var line = this.session.getLine(row);\n if (/[\\uDC00-\\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) {\n if (this.lead.row == row && this.lead.column == column + 1)\n column = column - 1;\n else\n column = column + 1;\n }\n this.lead.setPosition(row, column);\n this.$keepDesiredColumnOnChange = false;\n\n if (!keepDesiredColumn)\n this.$desiredColumn = null;\n };\n this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n var pos = this.session.screenToDocumentPosition(row, column);\n this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n };\n this.detach = function() {\n this.lead.detach();\n this.anchor.detach();\n this.session = this.doc = null;\n };\n\n this.fromOrientedRange = function(range) {\n this.setSelectionRange(range, range.cursor == range.start);\n this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n };\n\n this.toOrientedRange = function(range) {\n var r = this.getRange();\n if (range) {\n range.start.column = r.start.column;\n range.start.row = r.start.row;\n range.end.column = r.end.column;\n range.end.row = r.end.row;\n } else {\n range = r;\n }\n\n range.cursor = this.isBackwards() ? range.start : range.end;\n range.desiredColumn = this.$desiredColumn;\n return range;\n };\n this.getRangeOfMovements = function(func) {\n var start = this.getCursor();\n try {\n func(this);\n var end = this.getCursor();\n return Range.fromPoints(start,end);\n } catch(e) {\n return Range.fromPoints(start,start);\n } finally {\n this.moveCursorToPosition(start);\n }\n };\n\n this.toJSON = function() {\n if (this.rangeCount) {\n var data = this.ranges.map(function(r) {\n var r1 = r.clone();\n r1.isBackwards = r.cursor == r.start;\n return r1;\n });\n } else {\n var data = this.getRange();\n data.isBackwards = this.isBackwards();\n }\n return data;\n };\n\n this.fromJSON = function(data) {\n if (data.start == undefined) {\n if (this.rangeList) {\n this.toSingleRange(data[0]);\n for (var i = data.length; i--; ) {\n var r = Range.fromPoints(data[i].start, data[i].end);\n if (data[i].isBackwards)\n r.cursor = r.start;\n this.addRange(r, true);\n }\n return;\n } else\n data = data[0];\n }\n if (this.rangeList)\n this.toSingleRange(data);\n this.setSelectionRange(data, data.isBackwards);\n };\n\n this.isEqual = function(data) {\n if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n return false;\n if (!data.length || !this.ranges)\n return this.getRange().isEqual(data);\n\n for (var i = this.ranges.length; i--; ) {\n if (!this.ranges[i].isEqual(data[i]))\n return false;\n }\n return true;\n };\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\nace.define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar config = acequire(\"./config\");\nvar MAX_TOKEN_COUNT = 2000;\nvar Tokenizer = function(rules) {\n this.states = rules;\n\n this.regExps = {};\n this.matchMappings = {};\n for (var key in this.states) {\n var state = this.states[key];\n var ruleRegExps = [];\n var matchTotal = 0;\n var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n var flag = \"g\";\n\n var splitterRurles = [];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.defaultToken)\n mapping.defaultToken = rule.defaultToken;\n if (rule.caseInsensitive)\n flag = \"gi\";\n if (rule.regex == null)\n continue;\n\n if (rule.regex instanceof RegExp)\n rule.regex = rule.regex.toString().slice(1, -1);\n var adjustedregex = rule.regex;\n var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n if (Array.isArray(rule.token)) {\n if (rule.token.length == 1 || matchcount == 1) {\n rule.token = rule.token[0];\n } else if (matchcount - 1 != rule.token.length) {\n this.reportError(\"number of classes and regexp groups doesn't match\", { \n rule: rule,\n groupCount: matchcount - 1\n });\n rule.token = rule.token[0];\n } else {\n rule.tokenArray = rule.token;\n rule.token = null;\n rule.onMatch = this.$arrayTokens;\n }\n } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n if (matchcount > 1)\n rule.onMatch = this.$applyToken;\n else\n rule.onMatch = rule.token;\n }\n\n if (matchcount > 1) {\n if (/\\\\\\d/.test(rule.regex)) {\n adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function(match, digit) {\n return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n });\n } else {\n matchcount = 1;\n adjustedregex = this.removeCapturingGroups(rule.regex);\n }\n if (!rule.splitRegex && typeof rule.token != \"string\")\n splitterRurles.push(rule); // flag will be known only at the very end\n }\n\n mapping[matchTotal] = i;\n matchTotal += matchcount;\n\n ruleRegExps.push(adjustedregex);\n if (!rule.onMatch)\n rule.onMatch = null;\n }\n \n if (!ruleRegExps.length) {\n mapping[0] = 0;\n ruleRegExps.push(\"$\");\n }\n \n splitterRurles.forEach(function(rule) {\n rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n }, this);\n\n this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n }\n};\n\n(function() {\n this.$setMaxTokenCount = function(m) {\n MAX_TOKEN_COUNT = m | 0;\n };\n \n this.$applyToken = function(str) {\n var values = this.splitRegex.exec(str).slice(1);\n var types = this.token.apply(this, values);\n if (typeof types === \"string\")\n return [{type: types, value: str}];\n\n var tokens = [];\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i]\n };\n }\n return tokens;\n };\n\n this.$arrayTokens = function(str) {\n if (!str)\n return [];\n var values = this.splitRegex.exec(str);\n if (!values)\n return \"text\";\n var tokens = [];\n var types = this.tokenArray;\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i + 1])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i + 1]\n };\n }\n return tokens;\n };\n\n this.removeCapturingGroups = function(src) {\n var r = src.replace(\n /\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,\n function(x, y) {return y ? \"(?:\" : x;}\n );\n return r;\n };\n\n this.createSplitterRegexp = function(src, flag) {\n if (src.indexOf(\"(?=\") != -1) {\n var stack = 0;\n var inChClass = false;\n var lastCapture = {};\n src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n m, esc, parenOpen, parenClose, square, index\n ) {\n if (inChClass) {\n inChClass = square != \"]\";\n } else if (square) {\n inChClass = true;\n } else if (parenClose) {\n if (stack == lastCapture.stack) {\n lastCapture.end = index+1;\n lastCapture.stack = -1;\n }\n stack--;\n } else if (parenOpen) {\n stack++;\n if (parenOpen.length != 1) {\n lastCapture.stack = stack;\n lastCapture.start = index;\n }\n }\n return m;\n });\n\n if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n }\n if (src.charAt(0) != \"^\") src = \"^\" + src;\n if (src.charAt(src.length - 1) != \"$\") src += \"$\";\n \n return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n };\n this.getLineTokens = function(line, startState) {\n if (startState && typeof startState != \"string\") {\n var stack = startState.slice(0);\n startState = stack[0];\n if (startState === \"#tmp\") {\n stack.shift();\n startState = stack.shift();\n }\n } else\n var stack = [];\n\n var currentState = startState || \"start\";\n var state = this.states[currentState];\n if (!state) {\n currentState = \"start\";\n state = this.states[currentState];\n }\n var mapping = this.matchMappings[currentState];\n var re = this.regExps[currentState];\n re.lastIndex = 0;\n\n var match, tokens = [];\n var lastIndex = 0;\n var matchAttempts = 0;\n\n var token = {type: null, value: \"\"};\n\n while (match = re.exec(line)) {\n var type = mapping.defaultToken;\n var rule = null;\n var value = match[0];\n var index = re.lastIndex;\n\n if (index - value.length > lastIndex) {\n var skipped = line.substring(lastIndex, index - value.length);\n if (token.type == type) {\n token.value += skipped;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: skipped};\n }\n }\n\n for (var i = 0; i < match.length-2; i++) {\n if (match[i + 1] === undefined)\n continue;\n\n rule = state[mapping[i]];\n\n if (rule.onMatch)\n type = rule.onMatch(value, currentState, stack, line);\n else\n type = rule.token;\n\n if (rule.next) {\n if (typeof rule.next == \"string\") {\n currentState = rule.next;\n } else {\n currentState = rule.next(currentState, stack);\n }\n \n state = this.states[currentState];\n if (!state) {\n this.reportError(\"state doesn't exist\", currentState);\n currentState = \"start\";\n state = this.states[currentState];\n }\n mapping = this.matchMappings[currentState];\n lastIndex = index;\n re = this.regExps[currentState];\n re.lastIndex = index;\n }\n if (rule.consumeLineEnd)\n lastIndex = index;\n break;\n }\n\n if (value) {\n if (typeof type === \"string\") {\n if ((!rule || rule.merge !== false) && token.type === type) {\n token.value += value;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: value};\n }\n } else if (type) {\n if (token.type)\n tokens.push(token);\n token = {type: null, value: \"\"};\n for (var i = 0; i < type.length; i++)\n tokens.push(type[i]);\n }\n }\n\n if (lastIndex == line.length)\n break;\n\n lastIndex = index;\n\n if (matchAttempts++ > MAX_TOKEN_COUNT) {\n if (matchAttempts > 2 * line.length) {\n this.reportError(\"infinite loop with in ace tokenizer\", {\n startState: startState,\n line: line\n });\n }\n while (lastIndex < line.length) {\n if (token.type)\n tokens.push(token);\n token = {\n value: line.substring(lastIndex, lastIndex += 2000),\n type: \"overflow\"\n };\n }\n currentState = \"start\";\n stack = [];\n break;\n }\n }\n\n if (token.type)\n tokens.push(token);\n \n if (stack.length > 1) {\n if (stack[0] !== currentState)\n stack.unshift(\"#tmp\", currentState);\n }\n return {\n tokens : tokens,\n state : stack.length ? stack : currentState\n };\n };\n \n this.reportError = config.reportError;\n \n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\nace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n this.$rules = {\n \"start\" : [{\n token : \"empty_line\",\n regex : '^$'\n }, {\n defaultToken : \"text\"\n }]\n };\n};\n\n(function() {\n\n this.addRules = function(rules, prefix) {\n if (!prefix) {\n for (var key in rules)\n this.$rules[key] = rules[key];\n return;\n }\n for (var key in rules) {\n var state = rules[key];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.next || rule.onMatch) {\n if (typeof rule.next == \"string\") {\n if (rule.next.indexOf(prefix) !== 0)\n rule.next = prefix + rule.next;\n }\n if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n rule.nextState = prefix + rule.nextState;\n }\n }\n this.$rules[prefix + key] = state;\n }\n };\n\n this.getRules = function() {\n return this.$rules;\n };\n\n this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n var embedRules = typeof HighlightRules == \"function\"\n ? new HighlightRules().getRules()\n : HighlightRules;\n if (states) {\n for (var i = 0; i < states.length; i++)\n states[i] = prefix + states[i];\n } else {\n states = [];\n for (var key in embedRules)\n states.push(prefix + key);\n }\n\n this.addRules(embedRules, prefix);\n\n if (escapeRules) {\n var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n for (var i = 0; i < states.length; i++)\n addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n }\n\n if (!this.$embeds)\n this.$embeds = [];\n this.$embeds.push(prefix);\n };\n\n this.getEmbeds = function() {\n return this.$embeds;\n };\n\n var pushState = function(currentState, stack) {\n if (currentState != \"start\" || stack.length)\n stack.unshift(this.nextState, currentState);\n return this.nextState;\n };\n var popState = function(currentState, stack) {\n stack.shift();\n return stack.shift() || \"start\";\n };\n\n this.normalizeRules = function() {\n var id = 0;\n var rules = this.$rules;\n function processState(key) {\n var state = rules[key];\n state.processed = true;\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n var toInsert = null;\n if (Array.isArray(rule)) {\n toInsert = rule;\n rule = {};\n }\n if (!rule.regex && rule.start) {\n rule.regex = rule.start;\n if (!rule.next)\n rule.next = [];\n rule.next.push({\n defaultToken: rule.token\n }, {\n token: rule.token + \".end\",\n regex: rule.end || rule.start,\n next: \"pop\"\n });\n rule.token = rule.token + \".start\";\n rule.push = true;\n }\n var next = rule.next || rule.push;\n if (next && Array.isArray(next)) {\n var stateName = rule.stateName;\n if (!stateName) {\n stateName = rule.token;\n if (typeof stateName != \"string\")\n stateName = stateName[0] || \"\";\n if (rules[stateName])\n stateName += id++;\n }\n rules[stateName] = next;\n rule.next = stateName;\n processState(stateName);\n } else if (next == \"pop\") {\n rule.next = popState;\n }\n\n if (rule.push) {\n rule.nextState = rule.next || rule.push;\n rule.next = pushState;\n delete rule.push;\n }\n\n if (rule.rules) {\n for (var r in rule.rules) {\n if (rules[r]) {\n if (rules[r].push)\n rules[r].push.apply(rules[r], rule.rules[r]);\n } else {\n rules[r] = rule.rules[r];\n }\n }\n }\n var includeName = typeof rule == \"string\" ? rule : rule.include;\n if (includeName) {\n if (Array.isArray(includeName))\n toInsert = includeName.map(function(x) { return rules[x]; });\n else\n toInsert = rules[includeName];\n }\n\n if (toInsert) {\n var args = [i, 1].concat(toInsert);\n if (rule.noEscape)\n args = args.filter(function(x) {return !x.next;});\n state.splice.apply(state, args);\n i--;\n }\n \n if (rule.keywordMap) {\n rule.token = this.createKeywordMapper(\n rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n );\n delete rule.defaultToken;\n }\n }\n }\n Object.keys(rules).forEach(processState, this);\n };\n\n this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n var keywords = Object.create(null);\n Object.keys(map).forEach(function(className) {\n var a = map[className];\n if (ignoreCase)\n a = a.toLowerCase();\n var list = a.split(splitChar || \"|\");\n for (var i = list.length; i--; )\n keywords[list[i]] = className;\n });\n if (Object.getPrototypeOf(keywords)) {\n keywords.__proto__ = null;\n }\n this.$keywordList = Object.keys(keywords);\n map = null;\n return ignoreCase\n ? function(value) {return keywords[value.toLowerCase()] || defaultToken; }\n : function(value) {return keywords[value] || defaultToken; };\n };\n\n this.getKeywords = function() {\n return this.$keywords;\n };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Behaviour = function() {\n this.$behaviours = {};\n};\n\n(function () {\n\n this.add = function (name, action, callback) {\n switch (undefined) {\n case this.$behaviours:\n this.$behaviours = {};\n case this.$behaviours[name]:\n this.$behaviours[name] = {};\n }\n this.$behaviours[name][action] = callback;\n };\n \n this.addBehaviours = function (behaviours) {\n for (var key in behaviours) {\n for (var action in behaviours[key]) {\n this.add(key, action, behaviours[key][action]);\n }\n }\n };\n \n this.remove = function (name) {\n if (this.$behaviours && this.$behaviours[name]) {\n delete this.$behaviours[name];\n }\n };\n \n this.inherit = function (mode, filter) {\n if (typeof mode === \"function\") {\n var behaviours = new mode().getBehaviours(filter);\n } else {\n var behaviours = mode.getBehaviours(filter);\n }\n this.addBehaviours(behaviours);\n };\n \n this.getBehaviours = function (filter) {\n if (!filter) {\n return this.$behaviours;\n } else {\n var ret = {};\n for (var i = 0; i < filter.length; i++) {\n if (this.$behaviours[filter[i]]) {\n ret[filter[i]] = this.$behaviours[filter[i]];\n }\n }\n return ret;\n }\n };\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\n\nace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./range\").Range;\nvar TokenIterator = function(session, initialRow, initialColumn) {\n this.$session = session;\n this.$row = initialRow;\n this.$rowTokens = session.getTokens(initialRow);\n\n var token = session.getTokenAt(initialRow, initialColumn);\n this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() { \n this.stepBackward = function() {\n this.$tokenIndex -= 1;\n \n while (this.$tokenIndex < 0) {\n this.$row -= 1;\n if (this.$row < 0) {\n this.$row = 0;\n return null;\n }\n \n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = this.$rowTokens.length - 1;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.stepForward = function() {\n this.$tokenIndex += 1;\n var rowCount;\n while (this.$tokenIndex >= this.$rowTokens.length) {\n this.$row += 1;\n if (!rowCount)\n rowCount = this.$session.getLength();\n if (this.$row >= rowCount) {\n this.$row = rowCount - 1;\n return null;\n }\n\n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = 0;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentToken = function () {\n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentTokenRow = function () {\n return this.$row;\n }; \n this.getCurrentTokenColumn = function() {\n var rowTokens = this.$rowTokens;\n var tokenIndex = this.$tokenIndex;\n var column = rowTokens[tokenIndex].start;\n if (column !== undefined)\n return column;\n \n column = 0;\n while (tokenIndex > 0) {\n tokenIndex -= 1;\n column += rowTokens[tokenIndex].value.length;\n }\n \n return column; \n };\n this.getCurrentTokenPosition = function() {\n return {row: this.$row, column: this.getCurrentTokenColumn()};\n };\n this.getCurrentTokenRange = function() {\n var token = this.$rowTokens[this.$tokenIndex];\n var column = this.getCurrentTokenColumn();\n return new Range(this.$row, column, this.$row, column + token.value.length);\n };\n\n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../../lib/oop\");\nvar Behaviour = acequire(\"../behaviour\").Behaviour;\nvar TokenIterator = acequire(\"../../token_iterator\").TokenIterator;\nvar lang = acequire(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar defaultQuotes = {'\"' : '\"', \"'\" : \"'\"};\n\nvar initContext = function(editor) {\n var id = -1;\n if (editor.multiSelect) {\n id = editor.selection.index;\n if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n contextCache = {rangeCount: editor.multiSelect.rangeCount};\n }\n if (contextCache[id])\n return context = contextCache[id];\n context = contextCache[id] = {\n autoInsertedBrackets: 0,\n autoInsertedRow: -1,\n autoInsertedLineEnd: \"\",\n maybeInsertedBrackets: 0,\n maybeInsertedRow: -1,\n maybeInsertedLineStart: \"\",\n maybeInsertedLineEnd: \"\"\n };\n};\n\nvar getWrapped = function(selection, selected, opening, closing) {\n var rowDiff = selection.end.row - selection.start.row;\n return {\n text: opening + selected + closing,\n selection: [\n 0,\n selection.start.column + 1,\n rowDiff,\n selection.end.column + (rowDiff ? 0 : 1)\n ]\n };\n};\n\nvar CstyleBehaviour = function(options) {\n this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (text == '{') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '{', '}');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n return {\n text: '{}',\n selection: [1, 1]\n };\n } else {\n CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n return {\n text: '{',\n selection: [1, 1]\n };\n }\n }\n } else if (text == '}') {\n initContext(editor);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == '}') {\n var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n } else if (text == \"\\n\" || text == \"\\r\\n\") {\n initContext(editor);\n var closing = \"\";\n if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar === '}') {\n var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n if (!openBracePos)\n return null;\n var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n } else if (closing) {\n var next_indent = this.$getIndent(line);\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n return;\n }\n var indent = next_indent + session.getTabString();\n\n return {\n text: '\\n' + indent + '\\n' + next_indent + closing,\n selection: [1, indent.length, 1, indent.length]\n };\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n });\n\n this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '{') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.end.column, range.end.column + 1);\n if (rightChar == '}') {\n range.end.column++;\n return range;\n } else {\n context.maybeInsertedBrackets--;\n }\n }\n });\n\n this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '(') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '(', ')');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n return {\n text: '()',\n selection: [1, 1]\n };\n }\n } else if (text == ')') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ')') {\n var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '(') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ')') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '[') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '[', ']');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n return {\n text: '[]',\n selection: [1, 1]\n };\n }\n } else if (text == ']') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ']') {\n var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '[') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ']') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n var quotes = session.$mode.$quotes || defaultQuotes;\n if (text.length == 1 && quotes[text]) {\n if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1)\n return;\n initContext(editor);\n var quote = text;\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, quote, quote);\n } else if (!selected) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var leftChar = line.substring(cursor.column-1, cursor.column);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n\n var token = session.getTokenAt(cursor.row, cursor.column);\n var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n return null;\n\n var stringBefore = token && /string|escape/.test(token.type);\n var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n\n var pair;\n if (rightChar == quote) {\n pair = stringBefore !== stringAfter;\n if (pair && /string\\.end/.test(rightToken.type))\n pair = false;\n } else {\n if (stringBefore && !stringAfter)\n return null; // wrap string with different quote\n if (stringBefore && stringAfter)\n return null; // do not pair quotes inside strings\n var wordRe = session.$mode.tokenRe;\n wordRe.lastIndex = 0;\n var isWordBefore = wordRe.test(leftChar);\n wordRe.lastIndex = 0;\n var isWordAfter = wordRe.test(leftChar);\n if (isWordBefore || isWordAfter)\n return null; // before or after alphanumeric\n if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n return null; // there is rightChar and it isn't closing\n pair = true;\n }\n return {\n text: pair ? quote + quote : \"\",\n selection: [1,1]\n };\n }\n }\n });\n\n this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == selected) {\n range.end.column++;\n return range;\n }\n }\n });\n\n};\n\n\nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n var cursor = editor.getCursorPosition();\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n return false;\n }\n iterator.stepForward();\n return iterator.getCurrentTokenRow() !== cursor.row ||\n this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n context.autoInsertedBrackets = 0;\n context.autoInsertedRow = cursor.row;\n context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isMaybeInsertedClosing(cursor, line))\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = cursor.row;\n context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n context.maybeInsertedLineEnd = line.substr(cursor.column);\n context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n return context.autoInsertedBrackets > 0 &&\n cursor.row === context.autoInsertedRow &&\n bracket === context.autoInsertedLineEnd[0] &&\n line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n return context.maybeInsertedBrackets > 0 &&\n cursor.row === context.maybeInsertedRow &&\n line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n if (context) {\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = -1;\n }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nexports.packages = {};\n\naddUnicodePackage({\n L: \"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n Ll: \"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",\n Lu: \"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",\n Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n Lo: \"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n M: \"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",\n Mn: \"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",\n Mc: \"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",\n Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n N: \"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n Nd: \"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n P: \"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",\n Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n Po: \"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",\n S: \"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",\n Sm: \"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",\n Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n So: \"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",\n Z: \"002000A01680180E2000-200A20282029202F205F3000\",\n Zs: \"002000A01680180E2000-200A202F205F3000\",\n Zl: \"2028\",\n Zp: \"2029\",\n C: \"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",\n Cc: \"0000-001F007F-009F\",\n Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n Co: \"E000-F8FF\",\n Cs: \"D800-DFFF\",\n Cn: \"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"\n});\n\nfunction addUnicodePackage (pack) {\n var codePoint = /\\w{4}/g;\n for (var name in pack)\n exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n}\n\n});\n\nace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Tokenizer = acequire(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\nvar CstyleBehaviour = acequire(\"./behaviour/cstyle\").CstyleBehaviour;\nvar unicode = acequire(\"../unicode\");\nvar lang = acequire(\"../lib/lang\");\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../range\").Range;\n\nvar Mode = function() {\n this.HighlightRules = TextHighlightRules;\n};\n\n(function() {\n this.$defaultBehaviour = new CstyleBehaviour();\n\n this.tokenRe = new RegExp(\"^[\"\n + unicode.packages.L\n + unicode.packages.Mn + unicode.packages.Mc\n + unicode.packages.Nd\n + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n );\n\n this.nonTokenRe = new RegExp(\"^(?:[^\"\n + unicode.packages.L\n + unicode.packages.Mn + unicode.packages.Mc\n + unicode.packages.Nd\n + unicode.packages.Pc + \"\\\\$_]|\\\\s])+\", \"g\"\n );\n\n this.getTokenizer = function() {\n if (!this.$tokenizer) {\n this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig);\n this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n }\n return this.$tokenizer;\n };\n\n this.lineCommentStart = \"\";\n this.blockComment = \"\";\n\n this.toggleCommentLines = function(state, session, startRow, endRow) {\n var doc = session.doc;\n\n var ignoreBlankLines = true;\n var shouldRemove = true;\n var minIndent = Infinity;\n var tabSize = session.getTabSize();\n var insertAtTabStop = false;\n\n if (!this.lineCommentStart) {\n if (!this.blockComment)\n return false;\n var lineCommentStart = this.blockComment.start;\n var lineCommentEnd = this.blockComment.end;\n var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\n var comment = function(line, i) {\n if (testRemove(line, i))\n return;\n if (!ignoreBlankLines || /\\S/.test(line)) {\n doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n\n var uncomment = function(line, i) {\n var m;\n if (m = line.match(regexpEnd))\n doc.removeInLine(i, line.length - m[0].length, line.length);\n if (m = line.match(regexpStart))\n doc.removeInLine(i, m[1].length, m[0].length);\n };\n\n var testRemove = function(line, row) {\n if (regexpStart.test(line))\n return true;\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].type === \"comment\")\n return true;\n }\n };\n } else {\n if (Array.isArray(this.lineCommentStart)) {\n var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n var lineCommentStart = this.lineCommentStart[0];\n } else {\n var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n var lineCommentStart = this.lineCommentStart;\n }\n regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n \n insertAtTabStop = session.getUseSoftTabs();\n\n var uncomment = function(line, i) {\n var m = line.match(regexpStart);\n if (!m) return;\n var start = m[1].length, end = m[0].length;\n if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n end--;\n doc.removeInLine(i, start, end);\n };\n var commentWithSpace = lineCommentStart + \" \";\n var comment = function(line, i) {\n if (!ignoreBlankLines || /\\S/.test(line)) {\n if (shouldInsertSpace(line, minIndent, minIndent))\n doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n else\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n var testRemove = function(line, i) {\n return regexpStart.test(line);\n };\n \n var shouldInsertSpace = function(line, before, after) {\n var spaces = 0;\n while (before-- && line.charAt(before) == \" \")\n spaces++;\n if (spaces % tabSize != 0)\n return false;\n var spaces = 0;\n while (line.charAt(after++) == \" \")\n spaces++;\n if (tabSize > 2)\n return spaces % tabSize != tabSize - 1;\n else\n return spaces % tabSize == 0;\n return true;\n };\n }\n\n function iter(fun) {\n for (var i = startRow; i <= endRow; i++)\n fun(doc.getLine(i), i);\n }\n\n\n var minEmptyLength = Infinity;\n iter(function(line, i) {\n var indent = line.search(/\\S/);\n if (indent !== -1) {\n if (indent < minIndent)\n minIndent = indent;\n if (shouldRemove && !testRemove(line, i))\n shouldRemove = false;\n } else if (minEmptyLength > line.length) {\n minEmptyLength = line.length;\n }\n });\n\n if (minIndent == Infinity) {\n minIndent = minEmptyLength;\n ignoreBlankLines = false;\n shouldRemove = false;\n }\n\n if (insertAtTabStop && minIndent % tabSize != 0)\n minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n iter(shouldRemove ? uncomment : comment);\n };\n\n this.toggleBlockComment = function(state, session, range, cursor) {\n var comment = this.blockComment;\n if (!comment)\n return;\n if (!comment.start && comment[0])\n comment = comment[0];\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n\n var sel = session.selection;\n var initialRange = session.selection.toOrientedRange();\n var startRow, colDiff;\n\n if (token && /comment/.test(token.type)) {\n var startRange, endRange;\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.start);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n startRange = new Range(row, column, row, column + comment.start.length);\n break;\n }\n token = iterator.stepBackward();\n }\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.end);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n endRange = new Range(row, column, row, column + comment.end.length);\n break;\n }\n token = iterator.stepForward();\n }\n if (endRange)\n session.remove(endRange);\n if (startRange) {\n session.remove(startRange);\n startRow = startRange.start.row;\n colDiff = -comment.start.length;\n }\n } else {\n colDiff = comment.start.length;\n startRow = range.start.row;\n session.insert(range.end, comment.end);\n session.insert(range.start, comment.start);\n }\n if (initialRange.start.row == startRow)\n initialRange.start.column += colDiff;\n if (initialRange.end.row == startRow)\n initialRange.end.column += colDiff;\n session.selection.fromOrientedRange(initialRange);\n };\n\n this.getNextLineIndent = function(state, line, tab) {\n return this.$getIndent(line);\n };\n\n this.checkOutdent = function(state, line, input) {\n return false;\n };\n\n this.autoOutdent = function(state, doc, row) {\n };\n\n this.$getIndent = function(line) {\n return line.match(/^\\s*/)[0];\n };\n\n this.createWorker = function(session) {\n return null;\n };\n\n this.createModeDelegates = function (mapping) {\n this.$embeds = [];\n this.$modes = {};\n for (var i in mapping) {\n if (mapping[i]) {\n this.$embeds.push(i);\n this.$modes[i] = new mapping[i]();\n }\n }\n\n var delegations = [\"toggleBlockComment\", \"toggleCommentLines\", \"getNextLineIndent\", \n \"checkOutdent\", \"autoOutdent\", \"transformAction\", \"getCompletions\"];\n\n for (var i = 0; i < delegations.length; i++) {\n (function(scope) {\n var functionName = delegations[i];\n var defaultHandler = scope[functionName];\n scope[delegations[i]] = function() {\n return this.$delegator(functionName, arguments, defaultHandler);\n };\n }(this));\n }\n };\n\n this.$delegator = function(method, args, defaultHandler) {\n var state = args[0];\n if (typeof state != \"string\")\n state = state[0];\n for (var i = 0; i < this.$embeds.length; i++) {\n if (!this.$modes[this.$embeds[i]]) continue;\n\n var split = state.split(this.$embeds[i]);\n if (!split[0] && split[1]) {\n args[0] = split[1];\n var mode = this.$modes[this.$embeds[i]];\n return mode[method].apply(mode, args);\n }\n }\n var ret = defaultHandler.apply(this, args);\n return defaultHandler ? ret : undefined;\n };\n\n this.transformAction = function(state, action, editor, session, param) {\n if (this.$behaviour) {\n var behaviours = this.$behaviour.getBehaviours();\n for (var key in behaviours) {\n if (behaviours[key][action]) {\n var ret = behaviours[key][action].apply(this, arguments);\n if (ret) {\n return ret;\n }\n }\n }\n }\n };\n \n this.getKeywords = function(append) {\n if (!this.completionKeywords) {\n var rules = this.$tokenizer.rules;\n var completionKeywords = [];\n for (var rule in rules) {\n var ruleItr = rules[rule];\n for (var r = 0, l = ruleItr.length; r < l; r++) {\n if (typeof ruleItr[r].token === \"string\") {\n if (/keyword|support|storage/.test(ruleItr[r].token))\n completionKeywords.push(ruleItr[r].regex);\n }\n else if (typeof ruleItr[r].token === \"object\") {\n for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { \n if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n completionKeywords.push(rule.substr(1, rule.length - 2));\n }\n }\n }\n }\n }\n this.completionKeywords = completionKeywords;\n }\n if (!append)\n return this.$keywordList;\n return completionKeywords.concat(this.$keywordList || []);\n };\n \n this.$createKeywordList = function() {\n if (!this.$highlightRules)\n this.getTokenizer();\n return this.$keywordList = this.$highlightRules.$keywordList || [];\n };\n\n this.getCompletions = function(state, session, pos, prefix) {\n var keywords = this.$keywordList || this.$createKeywordList();\n return keywords.map(function(word) {\n return {\n name: word,\n value: word,\n score: 0,\n meta: \"keyword\"\n };\n });\n };\n\n this.$id = \"ace/mode/text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nfunction throwDeltaError(delta, errorText){\n console.log(\"Invalid Delta:\", delta);\n throw \"Invalid Delta: \" + errorText;\n}\n\nfunction positionInDocument(docLines, position) {\n return position.row >= 0 && position.row < docLines.length &&\n position.column >= 0 && position.column <= docLines[position.row].length;\n}\n\nfunction validateDelta(docLines, delta) {\n if (delta.action != \"insert\" && delta.action != \"remove\")\n throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n if (!(delta.lines instanceof Array))\n throwDeltaError(delta, \"delta.lines must be an Array\");\n if (!delta.start || !delta.end)\n throwDeltaError(delta, \"delta.start/end must be an present\");\n var start = delta.start;\n if (!positionInDocument(docLines, delta.start))\n throwDeltaError(delta, \"delta.start must be contained in document\");\n var end = delta.end;\n if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n var numRangeRows = end.row - start.row;\n var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n throwDeltaError(delta, \"delta.range must match delta lines\");\n}\n\nexports.applyDelta = function(docLines, delta, doNotValidate) {\n \n var row = delta.start.row;\n var startColumn = delta.start.column;\n var line = docLines[row] || \"\";\n switch (delta.action) {\n case \"insert\":\n var lines = delta.lines;\n if (lines.length === 1) {\n docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n } else {\n var args = [row, 1].concat(delta.lines);\n docLines.splice.apply(docLines, args);\n docLines[row] = line.substring(0, startColumn) + docLines[row];\n docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n }\n break;\n case \"remove\":\n var endColumn = delta.end.column;\n var endRow = delta.end.row;\n if (row === endRow) {\n docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n } else {\n docLines.splice(\n row, endRow - row + 1,\n line.substring(0, startColumn) + docLines[endRow].substring(endColumn)\n );\n }\n break;\n }\n};\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n this.$onChange = this.onChange.bind(this);\n this.attach(doc);\n \n if (typeof column == \"undefined\")\n this.setPosition(row.row, row.column);\n else\n this.setPosition(row, column);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.getPosition = function() {\n return this.$clipPositionToDocument(this.row, this.column);\n };\n this.getDocument = function() {\n return this.document;\n };\n this.$insertRight = false;\n this.onChange = function(delta) {\n if (delta.start.row == delta.end.row && delta.start.row != this.row)\n return;\n\n if (delta.start.row > this.row)\n return;\n \n var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);\n this.setPosition(point.row, point.column, true);\n };\n \n function $pointsInOrder(point1, point2, equalPointsInOrder) {\n var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n }\n \n function $getTransformedPoint(delta, point, moveIfEqual) {\n var deltaIsInsert = delta.action == \"insert\";\n var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n var deltaStart = delta.start;\n var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n return {\n row: point.row,\n column: point.column\n };\n }\n if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n return {\n row: point.row + deltaRowShift,\n column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n };\n }\n \n return {\n row: deltaStart.row,\n column: deltaStart.column\n };\n }\n this.setPosition = function(row, column, noClip) {\n var pos;\n if (noClip) {\n pos = {\n row: row,\n column: column\n };\n } else {\n pos = this.$clipPositionToDocument(row, column);\n }\n\n if (this.row == pos.row && this.column == pos.column)\n return;\n\n var old = {\n row: this.row,\n column: this.column\n };\n\n this.row = pos.row;\n this.column = pos.column;\n this._signal(\"change\", {\n old: old,\n value: pos\n });\n };\n this.detach = function() {\n this.document.removeEventListener(\"change\", this.$onChange);\n };\n this.attach = function(doc) {\n this.document = doc || this.document;\n this.document.on(\"change\", this.$onChange);\n };\n this.$clipPositionToDocument = function(row, column) {\n var pos = {};\n\n if (row >= this.document.getLength()) {\n pos.row = Math.max(0, this.document.getLength() - 1);\n pos.column = this.document.getLine(pos.row).length;\n }\n else if (row < 0) {\n pos.row = 0;\n pos.column = 0;\n }\n else {\n pos.row = row;\n pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n }\n\n if (column < 0)\n pos.column = 0;\n\n return pos;\n };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar applyDelta = acequire(\"./apply_delta\").applyDelta;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Anchor = acequire(\"./anchor\").Anchor;\n\nvar Document = function(textOrLines) {\n this.$lines = [\"\"];\n if (textOrLines.length === 0) {\n this.$lines = [\"\"];\n } else if (Array.isArray(textOrLines)) {\n this.insertMergedLines({row: 0, column: 0}, textOrLines);\n } else {\n this.insert({row: 0, column:0}, textOrLines);\n }\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setValue = function(text) {\n var len = this.getLength() - 1;\n this.remove(new Range(0, 0, len, this.getLine(len).length));\n this.insert({row: 0, column: 0}, text);\n };\n this.getValue = function() {\n return this.getAllLines().join(this.getNewLineCharacter());\n };\n this.createAnchor = function(row, column) {\n return new Anchor(this, row, column);\n };\n if (\"aaa\".split(/a/).length === 0) {\n this.$split = function(text) {\n return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n };\n } else {\n this.$split = function(text) {\n return text.split(/\\r\\n|\\r|\\n/);\n };\n }\n\n\n this.$detectNewLine = function(text) {\n var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n this.$autoNewLine = match ? match[1] : \"\\n\";\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineCharacter = function() {\n switch (this.$newLineMode) {\n case \"windows\":\n return \"\\r\\n\";\n case \"unix\":\n return \"\\n\";\n default:\n return this.$autoNewLine || \"\\n\";\n }\n };\n\n this.$autoNewLine = \"\";\n this.$newLineMode = \"auto\";\n this.setNewLineMode = function(newLineMode) {\n if (this.$newLineMode === newLineMode)\n return;\n\n this.$newLineMode = newLineMode;\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineMode = function() {\n return this.$newLineMode;\n };\n this.isNewLine = function(text) {\n return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n };\n this.getLine = function(row) {\n return this.$lines[row] || \"\";\n };\n this.getLines = function(firstRow, lastRow) {\n return this.$lines.slice(firstRow, lastRow + 1);\n };\n this.getAllLines = function() {\n return this.getLines(0, this.getLength());\n };\n this.getLength = function() {\n return this.$lines.length;\n };\n this.getTextRange = function(range) {\n return this.getLinesForRange(range).join(this.getNewLineCharacter());\n };\n this.getLinesForRange = function(range) {\n var lines;\n if (range.start.row === range.end.row) {\n lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n } else {\n lines = this.getLines(range.start.row, range.end.row);\n lines[0] = (lines[0] || \"\").substring(range.start.column);\n var l = lines.length - 1;\n if (range.end.row - range.start.row == l)\n lines[l] = lines[l].substring(0, range.end.column);\n }\n return lines;\n };\n this.insertLines = function(row, lines) {\n console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n return this.insertFullLines(row, lines);\n };\n this.removeLines = function(firstRow, lastRow) {\n console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n return this.removeFullLines(firstRow, lastRow);\n };\n this.insertNewLine = function(position) {\n console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\");\n return this.insertMergedLines(position, [\"\", \"\"]);\n };\n this.insert = function(position, text) {\n if (this.getLength() <= 1)\n this.$detectNewLine(text);\n \n return this.insertMergedLines(position, this.$split(text));\n };\n this.insertInLine = function(position, text) {\n var start = this.clippedPos(position.row, position.column);\n var end = this.pos(position.row, position.column + text.length);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: [text]\n }, true);\n \n return this.clonePos(end);\n };\n \n this.clippedPos = function(row, column) {\n var length = this.getLength();\n if (row === undefined) {\n row = length;\n } else if (row < 0) {\n row = 0;\n } else if (row >= length) {\n row = length - 1;\n column = undefined;\n }\n var line = this.getLine(row);\n if (column == undefined)\n column = line.length;\n column = Math.min(Math.max(column, 0), line.length);\n return {row: row, column: column};\n };\n \n this.clonePos = function(pos) {\n return {row: pos.row, column: pos.column};\n };\n \n this.pos = function(row, column) {\n return {row: row, column: column};\n };\n \n this.$clipPosition = function(position) {\n var length = this.getLength();\n if (position.row >= length) {\n position.row = Math.max(0, length - 1);\n position.column = this.getLine(length - 1).length;\n } else {\n position.row = Math.max(0, position.row);\n position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n }\n return position;\n };\n this.insertFullLines = function(row, lines) {\n row = Math.min(Math.max(row, 0), this.getLength());\n var column = 0;\n if (row < this.getLength()) {\n lines = lines.concat([\"\"]);\n column = 0;\n } else {\n lines = [\"\"].concat(lines);\n row--;\n column = this.$lines[row].length;\n }\n this.insertMergedLines({row: row, column: column}, lines);\n }; \n this.insertMergedLines = function(position, lines) {\n var start = this.clippedPos(position.row, position.column);\n var end = {\n row: start.row + lines.length - 1,\n column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n };\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: lines\n });\n \n return this.clonePos(end);\n };\n this.remove = function(range) {\n var start = this.clippedPos(range.start.row, range.start.column);\n var end = this.clippedPos(range.end.row, range.end.column);\n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n });\n return this.clonePos(start);\n };\n this.removeInLine = function(row, startColumn, endColumn) {\n var start = this.clippedPos(row, startColumn);\n var end = this.clippedPos(row, endColumn);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n }, true);\n \n return this.clonePos(start);\n };\n this.removeFullLines = function(firstRow, lastRow) {\n firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);\n var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n var deleteLastNewLine = lastRow < this.getLength() - 1;\n var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );\n var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );\n var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );\n var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); \n var range = new Range(startRow, startCol, endRow, endCol);\n var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n \n this.applyDelta({\n start: range.start,\n end: range.end,\n action: \"remove\",\n lines: this.getLinesForRange(range)\n });\n return deletedLines;\n };\n this.removeNewLine = function(row) {\n if (row < this.getLength() - 1 && row >= 0) {\n this.applyDelta({\n start: this.pos(row, this.getLine(row).length),\n end: this.pos(row + 1, 0),\n action: \"remove\",\n lines: [\"\", \"\"]\n });\n }\n };\n this.replace = function(range, text) {\n if (!(range instanceof Range))\n range = Range.fromPoints(range.start, range.end);\n if (text.length === 0 && range.isEmpty())\n return range.start;\n if (text == this.getTextRange(range))\n return range.end;\n\n this.remove(range);\n var end;\n if (text) {\n end = this.insert(range.start, text);\n }\n else {\n end = range.start;\n }\n \n return end;\n };\n this.applyDeltas = function(deltas) {\n for (var i=0; i=0; i--) {\n this.revertDelta(deltas[i]);\n }\n };\n this.applyDelta = function(delta, doNotValidate) {\n var isInsert = delta.action == \"insert\";\n if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n : !Range.comparePoints(delta.start, delta.end)) {\n return;\n }\n \n if (isInsert && delta.lines.length > 20000)\n this.$splitAndapplyLargeDelta(delta, 20000);\n applyDelta(this.$lines, delta, doNotValidate);\n this._signal(\"change\", delta);\n };\n \n this.$splitAndapplyLargeDelta = function(delta, MAX) {\n var lines = delta.lines;\n var l = lines.length;\n var row = delta.start.row; \n var column = delta.start.column;\n var from = 0, to = 0;\n do {\n from = to;\n to += MAX - 1;\n var chunk = lines.slice(from, to);\n if (to > l) {\n delta.lines = chunk;\n delta.start.row = row + from;\n delta.start.column = column;\n break;\n }\n chunk.push(\"\");\n this.applyDelta({\n start: this.pos(row + from, column),\n end: this.pos(row + to, column = 0),\n action: delta.action,\n lines: chunk\n }, true);\n } while(true);\n };\n this.revertDelta = function(delta) {\n this.applyDelta({\n start: this.clonePos(delta.start),\n end: this.clonePos(delta.end),\n action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n lines: delta.lines.slice()\n });\n };\n this.indexToPosition = function(index, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n for (var i = startRow || 0, l = lines.length; i < l; i++) {\n index -= lines[i].length + newlineLength;\n if (index < 0)\n return {row: i, column: index + lines[i].length + newlineLength};\n }\n return {row: l-1, column: lines[l-1].length};\n };\n this.positionToIndex = function(pos, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n var index = 0;\n var row = Math.min(pos.row, lines.length);\n for (var i = startRow || 0; i < row; ++i)\n index += lines[i].length + newlineLength;\n\n return index + pos.column;\n };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n this.running = false;\n this.lines = [];\n this.states = [];\n this.currentLine = 0;\n this.tokenizer = tokenizer;\n\n var self = this;\n\n this.$worker = function() {\n if (!self.running) { return; }\n\n var workerStart = new Date();\n var currentLine = self.currentLine;\n var endLine = -1;\n var doc = self.doc;\n\n var startLine = currentLine;\n while (self.lines[currentLine])\n currentLine++;\n \n var len = doc.getLength();\n var processedLines = 0;\n self.running = false;\n while (currentLine < len) {\n self.$tokenizeRow(currentLine);\n endLine = currentLine;\n do {\n currentLine++;\n } while (self.lines[currentLine]);\n processedLines ++;\n if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { \n self.running = setTimeout(self.$worker, 20);\n break;\n }\n }\n self.currentLine = currentLine;\n \n if (endLine == -1)\n endLine = currentLine;\n\n if (startLine <= endLine)\n self.fireUpdateEvent(startLine, endLine);\n };\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n this.setTokenizer = function(tokenizer) {\n this.tokenizer = tokenizer;\n this.lines = [];\n this.states = [];\n\n this.start(0);\n };\n this.setDocument = function(doc) {\n this.doc = doc;\n this.lines = [];\n this.states = [];\n\n this.stop();\n };\n this.fireUpdateEvent = function(firstRow, lastRow) {\n var data = {\n first: firstRow,\n last: lastRow\n };\n this._signal(\"update\", {data: data});\n };\n this.start = function(startRow) {\n this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n this.lines.splice(this.currentLine, this.lines.length);\n this.states.splice(this.currentLine, this.states.length);\n\n this.stop();\n this.running = setTimeout(this.$worker, 700);\n };\n \n this.scheduleStart = function() {\n if (!this.running)\n this.running = setTimeout(this.$worker, 700);\n };\n\n this.$updateOnChange = function(delta) {\n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n this.lines[startRow] = null;\n } else if (delta.action == \"remove\") {\n this.lines.splice(startRow, len + 1, null);\n this.states.splice(startRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(startRow, 1);\n this.lines.splice.apply(this.lines, args);\n this.states.splice.apply(this.states, args);\n }\n\n this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n this.stop();\n };\n this.stop = function() {\n if (this.running)\n clearTimeout(this.running);\n this.running = false;\n };\n this.getTokens = function(row) {\n return this.lines[row] || this.$tokenizeRow(row);\n };\n this.getState = function(row) {\n if (this.currentLine == row)\n this.$tokenizeRow(row);\n return this.states[row] || \"start\";\n };\n\n this.$tokenizeRow = function(row) {\n var line = this.doc.getLine(row);\n var state = this.states[row - 1];\n\n var data = this.tokenizer.getLineTokens(line, state, row);\n\n if (this.states[row] + \"\" !== data.state + \"\") {\n this.states[row] = data.state;\n this.lines[row + 1] = null;\n if (this.currentLine > row + 1)\n this.currentLine = row + 1;\n } else if (this.currentLine == row) {\n this.currentLine = row + 1;\n }\n\n return this.lines[row] = data.tokens;\n };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\nace.define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n this.setRegexp(regExp);\n this.clazz = clazz;\n this.type = type || \"text\";\n};\n\n(function() {\n this.MAX_RANGES = 500;\n \n this.setRegexp = function(regExp) {\n if (this.regExp+\"\" == regExp+\"\")\n return;\n this.regExp = regExp;\n this.cache = [];\n };\n\n this.update = function(html, markerLayer, session, config) {\n if (!this.regExp)\n return;\n var start = config.firstRow, end = config.lastRow;\n\n for (var i = start; i <= end; i++) {\n var ranges = this.cache[i];\n if (ranges == null) {\n ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n if (ranges.length > this.MAX_RANGES)\n ranges = ranges.slice(0, this.MAX_RANGES);\n ranges = ranges.map(function(match) {\n return new Range(i, match.offset, i, match.offset + match.length);\n });\n this.cache[i] = ranges.length ? ranges : \"\";\n }\n\n for (var j = ranges.length; j --; ) {\n markerLayer.drawSingleLineMarker(\n html, ranges[j].toScreenRange(session), this.clazz, config);\n }\n }\n };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\nace.define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n this.foldData = foldData;\n if (Array.isArray(folds)) {\n this.folds = folds;\n } else {\n folds = this.folds = [ folds ];\n }\n\n var last = folds[folds.length - 1];\n this.range = new Range(folds[0].start.row, folds[0].start.column,\n last.end.row, last.end.column);\n this.start = this.range.start;\n this.end = this.range.end;\n\n this.folds.forEach(function(fold) {\n fold.setFoldLine(this);\n }, this);\n}\n\n(function() {\n this.shiftRow = function(shift) {\n this.start.row += shift;\n this.end.row += shift;\n this.folds.forEach(function(fold) {\n fold.start.row += shift;\n fold.end.row += shift;\n });\n };\n\n this.addFold = function(fold) {\n if (fold.sameRow) {\n if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n }\n this.folds.push(fold);\n this.folds.sort(function(a, b) {\n return -a.range.compareEnd(b.start.row, b.start.column);\n });\n if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n }\n } else if (fold.start.row == this.end.row) {\n this.folds.push(fold);\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (fold.end.row == this.start.row) {\n this.folds.unshift(fold);\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n } else {\n throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n }\n fold.foldLine = this;\n };\n\n this.containsRow = function(row) {\n return row >= this.start.row && row <= this.end.row;\n };\n\n this.walk = function(callback, endRow, endColumn) {\n var lastEnd = 0,\n folds = this.folds,\n fold,\n cmp, stop, isNewRow = true;\n\n if (endRow == null) {\n endRow = this.end.row;\n endColumn = this.end.column;\n }\n\n for (var i = 0; i < folds.length; i++) {\n fold = folds[i];\n\n cmp = fold.range.compareStart(endRow, endColumn);\n if (cmp == -1) {\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n return;\n }\n\n stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n if (stop || cmp === 0) {\n return;\n }\n isNewRow = !fold.sameRow;\n lastEnd = fold.end.column;\n }\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n };\n\n this.getNextFoldTo = function(row, column) {\n var fold, cmp;\n for (var i = 0; i < this.folds.length; i++) {\n fold = this.folds[i];\n cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n return {\n fold: fold,\n kind: \"after\"\n };\n } else if (cmp === 0) {\n return {\n fold: fold,\n kind: \"inside\"\n };\n }\n }\n return null;\n };\n\n this.addRemoveChars = function(row, column, len) {\n var ret = this.getNextFoldTo(row, column),\n fold, folds;\n if (ret) {\n fold = ret.fold;\n if (ret.kind == \"inside\"\n && fold.start.column != column\n && fold.start.row != row)\n {\n window.console && window.console.log(row, column, fold);\n } else if (fold.start.row == row) {\n folds = this.folds;\n var i = folds.indexOf(fold);\n if (i === 0) {\n this.start.column += len;\n }\n for (i; i < folds.length; i++) {\n fold = folds[i];\n fold.start.column += len;\n if (!fold.sameRow) {\n return;\n }\n fold.end.column += len;\n }\n this.end.column += len;\n }\n }\n };\n\n this.split = function(row, column) {\n var pos = this.getNextFoldTo(row, column);\n \n if (!pos || pos.kind == \"inside\")\n return null;\n \n var fold = pos.fold;\n var folds = this.folds;\n var foldData = this.foldData;\n \n var i = folds.indexOf(fold);\n var foldBefore = folds[i - 1];\n this.end.row = foldBefore.end.row;\n this.end.column = foldBefore.end.column;\n folds = folds.splice(i, folds.length - i);\n\n var newFoldLine = new FoldLine(foldData, folds);\n foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n return newFoldLine;\n };\n\n this.merge = function(foldLineNext) {\n var folds = foldLineNext.folds;\n for (var i = 0; i < folds.length; i++) {\n this.addFold(folds[i]);\n }\n var foldData = this.foldData;\n foldData.splice(foldData.indexOf(foldLineNext), 1);\n };\n\n this.toString = function() {\n var ret = [this.range.toString() + \": [\" ];\n\n this.folds.forEach(function(fold) {\n ret.push(\" \" + fold.toString());\n });\n ret.push(\"]\");\n return ret.join(\"\\n\");\n };\n\n this.idxToPosition = function(idx) {\n var lastFoldEndColumn = 0;\n\n for (var i = 0; i < this.folds.length; i++) {\n var fold = this.folds[i];\n\n idx -= fold.start.column - lastFoldEndColumn;\n if (idx < 0) {\n return {\n row: fold.start.row,\n column: fold.start.column + idx\n };\n }\n\n idx -= fold.placeholder.length;\n if (idx < 0) {\n return fold.start;\n }\n\n lastFoldEndColumn = fold.end.column;\n }\n\n return {\n row: this.end.row,\n column: this.end.column + idx\n };\n };\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\nace.define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\nvar Range = acequire(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n this.ranges = [];\n};\n\n(function() {\n this.comparePoints = comparePoints;\n\n this.pointIndex = function(pos, excludeEdges, startIndex) {\n var list = this.ranges;\n\n for (var i = startIndex || 0; i < list.length; i++) {\n var range = list[i];\n var cmpEnd = comparePoints(pos, range.end);\n if (cmpEnd > 0)\n continue;\n var cmpStart = comparePoints(pos, range.start);\n if (cmpEnd === 0)\n return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n return i;\n\n return -i-1;\n }\n return -i - 1;\n };\n\n this.add = function(range) {\n var excludeEdges = !range.isEmpty();\n var startIndex = this.pointIndex(range.start, excludeEdges);\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n\n var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n else\n endIndex++;\n return this.ranges.splice(startIndex, endIndex - startIndex, range);\n };\n\n this.addList = function(list) {\n var removed = [];\n for (var i = list.length; i--; ) {\n removed.push.apply(removed, this.add(list[i]));\n }\n return removed;\n };\n\n this.substractPoint = function(pos) {\n var i = this.pointIndex(pos);\n\n if (i >= 0)\n return this.ranges.splice(i, 1);\n };\n this.merge = function() {\n var removed = [];\n var list = this.ranges;\n \n list = list.sort(function(a, b) {\n return comparePoints(a.start, b.start);\n });\n \n var next = list[0], range;\n for (var i = 1; i < list.length; i++) {\n range = next;\n next = list[i];\n var cmp = comparePoints(range.end, next.start);\n if (cmp < 0)\n continue;\n\n if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n continue;\n\n if (comparePoints(range.end, next.end) < 0) {\n range.end.row = next.end.row;\n range.end.column = next.end.column;\n }\n\n list.splice(i, 1);\n removed.push(next);\n next = range;\n i--;\n }\n \n this.ranges = list;\n\n return removed;\n };\n\n this.contains = function(row, column) {\n return this.pointIndex({row: row, column: column}) >= 0;\n };\n\n this.containsPoint = function(pos) {\n return this.pointIndex(pos) >= 0;\n };\n\n this.rangeAtPoint = function(pos) {\n var i = this.pointIndex(pos);\n if (i >= 0)\n return this.ranges[i];\n };\n\n\n this.clipRows = function(startRow, endRow) {\n var list = this.ranges;\n if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n return [];\n\n var startIndex = this.pointIndex({row: startRow, column: 0});\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n\n var clipped = [];\n for (var i = startIndex; i < endIndex; i++) {\n clipped.push(list[i]);\n }\n return clipped;\n };\n\n this.removeAll = function() {\n return this.ranges.splice(0, this.ranges.length);\n };\n\n this.attach = function(session) {\n if (this.session)\n this.detach();\n\n this.session = session;\n this.onChange = this.$onChange.bind(this);\n\n this.session.on('change', this.onChange);\n };\n\n this.detach = function() {\n if (!this.session)\n return;\n this.session.removeListener('change', this.onChange);\n this.session = null;\n };\n\n this.$onChange = function(delta) {\n if (delta.action == \"insert\"){\n var start = delta.start;\n var end = delta.end;\n } else {\n var end = delta.start;\n var start = delta.end;\n }\n var startRow = start.row;\n var endRow = end.row;\n var lineDif = endRow - startRow;\n\n var colDiff = -start.column + end.column;\n var ranges = this.ranges;\n\n for (var i = 0, n = ranges.length; i < n; i++) {\n var r = ranges[i];\n if (r.end.row < startRow)\n continue;\n if (r.start.row > startRow)\n break;\n\n if (r.start.row == startRow && r.start.column >= start.column ) {\n if (r.start.column == start.column && this.$insertRight) {\n } else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n if (r.end.row == startRow && r.end.column >= start.column) {\n if (r.end.column == start.column && this.$insertRight) {\n continue;\n }\n if (r.end.column == start.column && colDiff > 0 && i < n - 1) { \n if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n r.end.column -= colDiff;\n }\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n\n if (lineDif != 0 && i < n) {\n for (; i < n; i++) {\n var r = ranges[i];\n r.start.row += lineDif;\n r.end.row += lineDif;\n }\n }\n };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\nace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/range_list\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar RangeList = acequire(\"../range_list\").RangeList;\nvar oop = acequire(\"../lib/oop\");\nvar Fold = exports.Fold = function(range, placeholder) {\n this.foldLine = null;\n this.placeholder = placeholder;\n this.range = range;\n this.start = range.start;\n this.end = range.end;\n\n this.sameRow = range.start.row == range.end.row;\n this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n this.toString = function() {\n return '\"' + this.placeholder + '\" ' + this.range.toString();\n };\n\n this.setFoldLine = function(foldLine) {\n this.foldLine = foldLine;\n this.subFolds.forEach(function(fold) {\n fold.setFoldLine(foldLine);\n });\n };\n\n this.clone = function() {\n var range = this.range.clone();\n var fold = new Fold(range, this.placeholder);\n this.subFolds.forEach(function(subFold) {\n fold.subFolds.push(subFold.clone());\n });\n fold.collapseChildren = this.collapseChildren;\n return fold;\n };\n\n this.addSubFold = function(fold) {\n if (this.range.isEqual(fold))\n return;\n\n if (!this.range.containsRange(fold))\n throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n consumeRange(fold, this.start);\n\n var row = fold.start.row, column = fold.start.column;\n for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n cmp = this.subFolds[i].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterStart = this.subFolds[i];\n\n if (cmp == 0)\n return afterStart.addSubFold(fold);\n var row = fold.range.end.row, column = fold.range.end.column;\n for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n cmp = this.subFolds[j].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterEnd = this.subFolds[j];\n\n if (cmp == 0)\n throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\n fold.setFoldLine(this.foldLine);\n\n return fold;\n };\n \n this.restoreRange = function(range) {\n return restoreRange(range, this.start);\n };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n point.row -= anchor.row;\n if (point.row == 0)\n point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n consumePoint(range.start, anchor);\n consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n if (point.row == 0)\n point.column += anchor.column;\n point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n restorePoint(range.start, anchor);\n restorePoint(range.end, anchor);\n}\n\n});\n\nace.define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar FoldLine = acequire(\"./fold_line\").FoldLine;\nvar Fold = acequire(\"./fold\").Fold;\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n this.getFoldAt = function(row, column, side) {\n var foldLine = this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var folds = foldLine.folds;\n for (var i = 0; i < folds.length; i++) {\n var fold = folds[i];\n if (fold.range.contains(row, column)) {\n if (side == 1 && fold.range.isEnd(row, column)) {\n continue;\n } else if (side == -1 && fold.range.isStart(row, column)) {\n continue;\n }\n return fold;\n }\n }\n };\n this.getFoldsInRange = function(range) {\n var start = range.start;\n var end = range.end;\n var foldLines = this.$foldData;\n var foundFolds = [];\n\n start.column += 1;\n end.column -= 1;\n\n for (var i = 0; i < foldLines.length; i++) {\n var cmp = foldLines[i].range.compareRange(range);\n if (cmp == 2) {\n continue;\n }\n else if (cmp == -2) {\n break;\n }\n\n var folds = foldLines[i].folds;\n for (var j = 0; j < folds.length; j++) {\n var fold = folds[j];\n cmp = fold.range.compareRange(range);\n if (cmp == -2) {\n break;\n } else if (cmp == 2) {\n continue;\n } else\n if (cmp == 42) {\n break;\n }\n foundFolds.push(fold);\n }\n }\n start.column -= 1;\n end.column += 1;\n\n return foundFolds;\n };\n\n this.getFoldsInRangeList = function(ranges) {\n if (Array.isArray(ranges)) {\n var folds = [];\n ranges.forEach(function(range) {\n folds = folds.concat(this.getFoldsInRange(range));\n }, this);\n } else {\n var folds = this.getFoldsInRange(ranges);\n }\n return folds;\n };\n this.getAllFolds = function() {\n var folds = [];\n var foldLines = this.$foldData;\n \n for (var i = 0; i < foldLines.length; i++)\n for (var j = 0; j < foldLines[i].folds.length; j++)\n folds.push(foldLines[i].folds[j]);\n\n return folds;\n };\n this.getFoldStringAt = function(row, column, trim, foldLine) {\n foldLine = foldLine || this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var lastFold = {\n end: { column: 0 }\n };\n var str, fold;\n for (var i = 0; i < foldLine.folds.length; i++) {\n fold = foldLine.folds[i];\n var cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n str = this\n .getLine(fold.start.row)\n .substring(lastFold.end.column, fold.start.column);\n break;\n }\n else if (cmp === 0) {\n return null;\n }\n lastFold = fold;\n }\n if (!str)\n str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n if (trim == -1)\n return str.substring(0, column - lastFold.end.column);\n else if (trim == 1)\n return str.substring(column - lastFold.end.column);\n else\n return str;\n };\n\n this.getFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n return foldLine;\n } else if (foldLine.end.row > docRow) {\n return null;\n }\n }\n return null;\n };\n this.getNextFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.end.row >= docRow) {\n return foldLine;\n }\n }\n return null;\n };\n\n this.getFoldedRowCount = function(first, last) {\n var foldData = this.$foldData, rowCount = last-first+1;\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i],\n end = foldLine.end.row,\n start = foldLine.start.row;\n if (end >= last) {\n if (start < last) {\n if (start >= first)\n rowCount -= last-start;\n else\n rowCount = 0; // in one fold\n }\n break;\n } else if (end >= first){\n if (start >= first) // fold inside range\n rowCount -= end-start;\n else\n rowCount -= end-first+1;\n }\n }\n return rowCount;\n };\n\n this.$addFoldLine = function(foldLine) {\n this.$foldData.push(foldLine);\n this.$foldData.sort(function(a, b) {\n return a.start.row - b.start.row;\n });\n return foldLine;\n };\n this.addFold = function(placeholder, range) {\n var foldData = this.$foldData;\n var added = false;\n var fold;\n \n if (placeholder instanceof Fold)\n fold = placeholder;\n else {\n fold = new Fold(range, placeholder);\n fold.collapseChildren = range.collapseChildren;\n }\n this.$clipRangeToDocument(fold.range);\n\n var startRow = fold.start.row;\n var startColumn = fold.start.column;\n var endRow = fold.end.row;\n var endColumn = fold.end.column;\n if (!(startRow < endRow || \n startRow == endRow && startColumn <= endColumn - 2))\n throw new Error(\"The range has to be at least 2 characters width\");\n\n var startFold = this.getFoldAt(startRow, startColumn, 1);\n var endFold = this.getFoldAt(endRow, endColumn, -1);\n if (startFold && endFold == startFold)\n return startFold.addSubFold(fold);\n\n if (startFold && !startFold.range.isStart(startRow, startColumn))\n this.removeFold(startFold);\n \n if (endFold && !endFold.range.isEnd(endRow, endColumn))\n this.removeFold(endFold);\n var folds = this.getFoldsInRange(fold.range);\n if (folds.length > 0) {\n this.removeFolds(folds);\n folds.forEach(function(subFold) {\n fold.addSubFold(subFold);\n });\n }\n\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (endRow == foldLine.start.row) {\n foldLine.addFold(fold);\n added = true;\n break;\n } else if (startRow == foldLine.end.row) {\n foldLine.addFold(fold);\n added = true;\n if (!fold.sameRow) {\n var foldLineNext = foldData[i + 1];\n if (foldLineNext && foldLineNext.start.row == endRow) {\n foldLine.merge(foldLineNext);\n break;\n }\n }\n break;\n } else if (endRow <= foldLine.start.row) {\n break;\n }\n }\n\n if (!added)\n foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n if (this.$useWrapMode)\n this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n else\n this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"add\" });\n\n return fold;\n };\n\n this.addFolds = function(folds) {\n folds.forEach(function(fold) {\n this.addFold(fold);\n }, this);\n };\n\n this.removeFold = function(fold) {\n var foldLine = fold.foldLine;\n var startRow = foldLine.start.row;\n var endRow = foldLine.end.row;\n\n var foldLines = this.$foldData;\n var folds = foldLine.folds;\n if (folds.length == 1) {\n foldLines.splice(foldLines.indexOf(foldLine), 1);\n } else\n if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n folds.pop();\n foldLine.end.row = folds[folds.length - 1].end.row;\n foldLine.end.column = folds[folds.length - 1].end.column;\n } else\n if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n folds.shift();\n foldLine.start.row = folds[0].start.row;\n foldLine.start.column = folds[0].start.column;\n } else\n if (fold.sameRow) {\n folds.splice(folds.indexOf(fold), 1);\n } else\n {\n var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n folds = newFoldLine.folds;\n folds.shift();\n newFoldLine.start.row = folds[0].start.row;\n newFoldLine.start.column = folds[0].start.column;\n }\n\n if (!this.$updating) {\n if (this.$useWrapMode)\n this.$updateWrapData(startRow, endRow);\n else\n this.$updateRowLengthCache(startRow, endRow);\n }\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"remove\" });\n };\n\n this.removeFolds = function(folds) {\n var cloneFolds = [];\n for (var i = 0; i < folds.length; i++) {\n cloneFolds.push(folds[i]);\n }\n\n cloneFolds.forEach(function(fold) {\n this.removeFold(fold);\n }, this);\n this.$modified = true;\n };\n\n this.expandFold = function(fold) {\n this.removeFold(fold);\n fold.subFolds.forEach(function(subFold) {\n fold.restoreRange(subFold);\n this.addFold(subFold);\n }, this);\n if (fold.collapseChildren > 0) {\n this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n }\n fold.subFolds = [];\n };\n\n this.expandFolds = function(folds) {\n folds.forEach(function(fold) {\n this.expandFold(fold);\n }, this);\n };\n\n this.unfold = function(location, expandInner) {\n var range, folds;\n if (location == null) {\n range = new Range(0, 0, this.getLength(), 0);\n expandInner = true;\n } else if (typeof location == \"number\")\n range = new Range(location, 0, location, this.getLine(location).length);\n else if (\"row\" in location)\n range = Range.fromPoints(location, location);\n else\n range = location;\n \n folds = this.getFoldsInRangeList(range);\n if (expandInner) {\n this.removeFolds(folds);\n } else {\n var subFolds = folds;\n while (subFolds.length) {\n this.expandFolds(subFolds);\n subFolds = this.getFoldsInRangeList(range);\n }\n }\n if (folds.length)\n return folds;\n };\n this.isRowFolded = function(docRow, startFoldRow) {\n return !!this.getFoldLine(docRow, startFoldRow);\n };\n\n this.getRowFoldEnd = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.end.row : docRow;\n };\n\n this.getRowFoldStart = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.start.row : docRow;\n };\n\n this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n if (startRow == null)\n startRow = foldLine.start.row;\n if (startColumn == null)\n startColumn = 0;\n if (endRow == null)\n endRow = foldLine.end.row;\n if (endColumn == null)\n endColumn = this.getLine(endRow).length;\n var doc = this.doc;\n var textLine = \"\";\n\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n if (row < startRow)\n return;\n if (row == startRow) {\n if (column < startColumn)\n return;\n lastColumn = Math.max(startColumn, lastColumn);\n }\n\n if (placeholder != null) {\n textLine += placeholder;\n } else {\n textLine += doc.getLine(row).substring(lastColumn, column);\n }\n }, endRow, endColumn);\n return textLine;\n };\n\n this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n var foldLine = this.getFoldLine(row);\n\n if (!foldLine) {\n var line;\n line = this.doc.getLine(row);\n return line.substring(startColumn || 0, endColumn || line.length);\n } else {\n return this.getFoldDisplayLine(\n foldLine, row, endColumn, startRow, startColumn);\n }\n };\n\n this.$cloneFoldData = function() {\n var fd = [];\n fd = this.$foldData.map(function(foldLine) {\n var folds = foldLine.folds.map(function(fold) {\n return fold.clone();\n });\n return new FoldLine(fd, folds);\n });\n\n return fd;\n };\n\n this.toggleFold = function(tryToUnfold) {\n var selection = this.selection;\n var range = selection.getRange();\n var fold;\n var bracketPos;\n\n if (range.isEmpty()) {\n var cursor = range.start;\n fold = this.getFoldAt(cursor.row, cursor.column);\n\n if (fold) {\n this.expandFold(fold);\n return;\n } else if (bracketPos = this.findMatchingBracket(cursor)) {\n if (range.comparePoint(bracketPos) == 1) {\n range.end = bracketPos;\n } else {\n range.start = bracketPos;\n range.start.column++;\n range.end.column--;\n }\n } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n if (range.comparePoint(bracketPos) == 1)\n range.end = bracketPos;\n else\n range.start = bracketPos;\n\n range.start.column++;\n } else {\n range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n }\n } else {\n var folds = this.getFoldsInRange(range);\n if (tryToUnfold && folds.length) {\n this.expandFolds(folds);\n return;\n } else if (folds.length == 1 ) {\n fold = folds[0];\n }\n }\n\n if (!fold)\n fold = this.getFoldAt(range.start.row, range.start.column);\n\n if (fold && fold.range.toString() == range.toString()) {\n this.expandFold(fold);\n return;\n }\n\n var placeholder = \"...\";\n if (!range.isMultiLine()) {\n placeholder = this.getTextRange(range);\n if (placeholder.length < 4)\n return;\n placeholder = placeholder.trim().substring(0, 2) + \"..\";\n }\n\n this.addFold(placeholder, range);\n };\n\n this.getCommentFoldRange = function(row, column, dir) {\n var iterator = new TokenIterator(this, row, column);\n var token = iterator.getCurrentToken();\n var type = token.type;\n if (token && /^comment|string/.test(type)) {\n type = type.match(/comment|string/)[0];\n if (type == \"comment\")\n type += \"|doc-start\";\n var re = new RegExp(type);\n var range = new Range();\n if (dir != 1) {\n do {\n token = iterator.stepBackward();\n } while (token && re.test(token.type));\n iterator.stepForward();\n }\n \n range.start.row = iterator.getCurrentTokenRow();\n range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n iterator = new TokenIterator(this, row, column);\n \n if (dir != -1) {\n var lastRow = -1;\n do {\n token = iterator.stepForward();\n if (lastRow == -1) {\n var state = this.getState(iterator.$row);\n if (!re.test(state))\n lastRow = iterator.$row;\n } else if (iterator.$row > lastRow) {\n break;\n }\n } while (token && re.test(token.type));\n token = iterator.stepBackward();\n } else\n token = iterator.getCurrentToken();\n\n range.end.row = iterator.getCurrentTokenRow();\n range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n return range;\n }\n };\n\n this.foldAll = function(startRow, endRow, depth) {\n if (depth == undefined)\n depth = 100000; // JSON.stringify doesn't hanle Infinity\n var foldWidgets = this.foldWidgets;\n if (!foldWidgets)\n return; // mode doesn't support folding\n endRow = endRow || this.getLength();\n startRow = startRow || 0;\n for (var row = startRow; row < endRow; row++) {\n if (foldWidgets[row] == null)\n foldWidgets[row] = this.getFoldWidget(row);\n if (foldWidgets[row] != \"start\")\n continue;\n\n var range = this.getFoldWidgetRange(row);\n if (range && range.isMultiLine()\n && range.end.row <= endRow\n && range.start.row >= startRow\n ) {\n row = range.end.row;\n try {\n var fold = this.addFold(\"...\", range);\n if (fold)\n fold.collapseChildren = depth;\n } catch(e) {}\n }\n }\n };\n this.$foldStyles = {\n \"manual\": 1,\n \"markbegin\": 1,\n \"markbeginend\": 1\n };\n this.$foldStyle = \"markbegin\";\n this.setFoldStyle = function(style) {\n if (!this.$foldStyles[style])\n throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n \n if (this.$foldStyle == style)\n return;\n\n this.$foldStyle = style;\n \n if (style == \"manual\")\n this.unfold();\n var mode = this.$foldMode;\n this.$setFolding(null);\n this.$setFolding(mode);\n };\n\n this.$setFolding = function(foldMode) {\n if (this.$foldMode == foldMode)\n return;\n \n this.$foldMode = foldMode;\n \n this.off('change', this.$updateFoldWidgets);\n this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n this._signal(\"changeAnnotation\");\n \n if (!foldMode || this.$foldStyle == \"manual\") {\n this.foldWidgets = null;\n return;\n }\n \n this.foldWidgets = [];\n this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n \n this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);\n this.on('change', this.$updateFoldWidgets);\n this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n };\n\n this.getParentFoldRangeData = function (row, ignoreCurrent) {\n var fw = this.foldWidgets;\n if (!fw || (ignoreCurrent && fw[row]))\n return {};\n\n var i = row - 1, firstRange;\n while (i >= 0) {\n var c = fw[i];\n if (c == null)\n c = fw[i] = this.getFoldWidget(i);\n\n if (c == \"start\") {\n var range = this.getFoldWidgetRange(i);\n if (!firstRange)\n firstRange = range;\n if (range && range.end.row >= row)\n break;\n }\n i--;\n }\n\n return {\n range: i !== -1 && range,\n firstRange: firstRange\n };\n };\n\n this.onFoldWidgetClick = function(row, e) {\n e = e.domEvent;\n var options = {\n children: e.shiftKey,\n all: e.ctrlKey || e.metaKey,\n siblings: e.altKey\n };\n \n var range = this.$toggleFoldWidget(row, options);\n if (!range) {\n var el = (e.target || e.srcElement);\n if (el && /ace_fold-widget/.test(el.className))\n el.className += \" ace_invalid\";\n }\n };\n \n this.$toggleFoldWidget = function(row, options) {\n if (!this.getFoldWidget)\n return;\n var type = this.getFoldWidget(row);\n var line = this.getLine(row);\n\n var dir = type === \"end\" ? -1 : 1;\n var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\n if (fold) {\n if (options.children || options.all)\n this.removeFold(fold);\n else\n this.expandFold(fold);\n return fold;\n }\n\n var range = this.getFoldWidgetRange(row, true);\n if (range && !range.isMultiLine()) {\n fold = this.getFoldAt(range.start.row, range.start.column, 1);\n if (fold && range.isEqual(fold.range)) {\n this.removeFold(fold);\n return fold;\n }\n }\n \n if (options.siblings) {\n var data = this.getParentFoldRangeData(row);\n if (data.range) {\n var startRow = data.range.start.row + 1;\n var endRow = data.range.end.row;\n }\n this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n } else if (options.children) {\n endRow = range ? range.end.row : this.getLength();\n this.foldAll(row + 1, endRow, options.all ? 10000 : 0);\n } else if (range) {\n if (options.all) \n range.collapseChildren = 10000;\n this.addFold(\"...\", range);\n }\n \n return range;\n };\n \n \n \n this.toggleFoldWidget = function(toggleParent) {\n var row = this.selection.getCursor().row;\n row = this.getRowFoldStart(row);\n var range = this.$toggleFoldWidget(row, {});\n \n if (range)\n return;\n var data = this.getParentFoldRangeData(row, true);\n range = data.range || data.firstRange;\n \n if (range) {\n row = range.start.row;\n var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\n if (fold) {\n this.removeFold(fold);\n } else {\n this.addFold(\"...\", range);\n }\n }\n };\n\n this.updateFoldWidgets = function(delta) {\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n\n if (len === 0) {\n this.foldWidgets[firstRow] = null;\n } else if (delta.action == 'remove') {\n this.foldWidgets.splice(firstRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(firstRow, 1);\n this.foldWidgets.splice.apply(this.foldWidgets, args);\n }\n };\n this.tokenizerUpdateFoldWidgets = function(e) {\n var rows = e.data;\n if (rows.first != rows.last) {\n if (this.foldWidgets.length > rows.first)\n this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n }\n };\n}\n\nexports.Folding = Folding;\n\n});\n\nace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n this.findMatchingBracket = function(position, chr) {\n if (position.column == 0) return null;\n\n var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n if (charBeforeCursor == \"\") return null;\n\n var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match)\n return null;\n\n if (match[1])\n return this.$findClosingBracket(match[1], position);\n else\n return this.$findOpeningBracket(match[2], position);\n };\n \n this.getBracketRange = function(pos) {\n var line = this.getLine(pos.row);\n var before = true, range;\n\n var chr = line.charAt(pos.column-1);\n var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match) {\n chr = line.charAt(pos.column);\n pos = {row: pos.row, column: pos.column + 1};\n match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n before = false;\n }\n if (!match)\n return null;\n\n if (match[1]) {\n var bracketPos = this.$findClosingBracket(match[1], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(pos, bracketPos);\n if (!before) {\n range.end.column++;\n range.start.column--;\n }\n range.cursor = range.end;\n } else {\n var bracketPos = this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(bracketPos, pos);\n if (!before) {\n range.start.column++;\n range.end.column--;\n }\n range.cursor = range.start;\n }\n \n return range;\n };\n\n this.$brackets = {\n \")\": \"(\",\n \"(\": \")\",\n \"]\": \"[\",\n \"[\": \"]\",\n \"{\": \"}\",\n \"}\": \"{\"\n };\n\n this.$findOpeningBracket = function(bracket, position, typeRe) {\n var openBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n \n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n .replace(/\\b(?:end)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n var value = token.value;\n \n while (true) {\n \n while (valueIndex >= 0) {\n var chr = value.charAt(valueIndex);\n if (chr == openBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex -= 1;\n }\n do {\n token = iterator.stepBackward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n \n value = token.value;\n valueIndex = value.length - 1;\n }\n \n return null;\n };\n\n this.$findClosingBracket = function(bracket, position, typeRe) {\n var closingBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n\n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n .replace(/\\b(?:start|begin)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n while (true) {\n\n var value = token.value;\n var valueLength = value.length;\n while (valueIndex < valueLength) {\n var chr = value.charAt(valueIndex);\n if (chr == closingBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex += 1;\n }\n do {\n token = iterator.stepForward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n\n valueIndex = 0;\n }\n \n return null;\n };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\nace.define(\"ace/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/bidihandler\",\"ace/config\",\"ace/lib/event_emitter\",\"ace/selection\",\"ace/mode/text\",\"ace/range\",\"ace/document\",\"ace/background_tokenizer\",\"ace/search_highlight\",\"ace/edit_session/folding\",\"ace/edit_session/bracket_match\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar BidiHandler = acequire(\"./bidihandler\").BidiHandler;\nvar config = acequire(\"./config\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Selection = acequire(\"./selection\").Selection;\nvar TextMode = acequire(\"./mode/text\").Mode;\nvar Range = acequire(\"./range\").Range;\nvar Document = acequire(\"./document\").Document;\nvar BackgroundTokenizer = acequire(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = acequire(\"./search_highlight\").SearchHighlight;\n\nvar EditSession = function(text, mode) {\n this.$breakpoints = [];\n this.$decorations = [];\n this.$frontMarkers = {};\n this.$backMarkers = {};\n this.$markerId = 1;\n this.$undoSelect = true;\n\n this.$foldData = [];\n this.id = \"session\" + (++EditSession.$uid);\n this.$foldData.toString = function() {\n return this.join(\"\\n\");\n };\n this.on(\"changeFold\", this.onChangeFold.bind(this));\n this.$onChange = this.onChange.bind(this);\n\n if (typeof text != \"object\" || !text.getLine)\n text = new Document(text);\n\n this.$bidiHandler = new BidiHandler(this);\n this.setDocument(text);\n this.selection = new Selection(this);\n\n config.resetOptions(this);\n this.setMode(mode);\n config._signal(\"session\", this);\n};\n\n\nEditSession.$uid = 0;\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setDocument = function(doc) {\n if (this.doc)\n this.doc.removeListener(\"change\", this.$onChange);\n\n this.doc = doc;\n doc.on(\"change\", this.$onChange);\n\n if (this.bgTokenizer)\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.resetCaches();\n };\n this.getDocument = function() {\n return this.doc;\n };\n this.$resetRowCache = function(docRow) {\n if (!docRow) {\n this.$docRowCache = [];\n this.$screenRowCache = [];\n return;\n }\n var l = this.$docRowCache.length;\n var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n if (l > i) {\n this.$docRowCache.splice(i, l);\n this.$screenRowCache.splice(i, l);\n }\n };\n\n this.$getRowCacheIndex = function(cacheArray, val) {\n var low = 0;\n var hi = cacheArray.length - 1;\n\n while (low <= hi) {\n var mid = (low + hi) >> 1;\n var c = cacheArray[mid];\n\n if (val > c)\n low = mid + 1;\n else if (val < c)\n hi = mid - 1;\n else\n return mid;\n }\n\n return low -1;\n };\n\n this.resetCaches = function() {\n this.$modified = true;\n this.$wrapData = [];\n this.$rowLengthCache = [];\n this.$resetRowCache(0);\n if (this.bgTokenizer)\n this.bgTokenizer.start(0);\n };\n\n this.onChangeFold = function(e) {\n var fold = e.data;\n this.$resetRowCache(fold.start.row);\n };\n\n this.onChange = function(delta) {\n this.$modified = true;\n this.$bidiHandler.onChange(delta);\n this.$resetRowCache(delta.start.row);\n\n var removedFolds = this.$updateInternalDataOnChange(delta);\n if (!this.$fromUndo && this.$undoManager && !delta.ignore) {\n this.$deltasDoc.push(delta);\n if (removedFolds && removedFolds.length != 0) {\n this.$deltasFold.push({\n action: \"removeFolds\",\n folds: removedFolds\n });\n }\n\n this.$informUndoManager.schedule();\n }\n\n this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n this._signal(\"change\", delta);\n };\n this.setValue = function(text) {\n this.doc.setValue(text);\n this.selection.moveTo(0, 0);\n\n this.$resetRowCache(0);\n this.$deltas = [];\n this.$deltasDoc = [];\n this.$deltasFold = [];\n this.setUndoManager(this.$undoManager);\n this.getUndoManager().reset();\n };\n this.getValue =\n this.toString = function() {\n return this.doc.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.getState = function(row) {\n return this.bgTokenizer.getState(row);\n };\n this.getTokens = function(row) {\n return this.bgTokenizer.getTokens(row);\n };\n this.getTokenAt = function(row, column) {\n var tokens = this.bgTokenizer.getTokens(row);\n var token, c = 0;\n if (column == null) {\n var i = tokens.length - 1;\n c = this.getLine(row).length;\n } else {\n for (var i = 0; i < tokens.length; i++) {\n c += tokens[i].value.length;\n if (c >= column)\n break;\n }\n }\n token = tokens[i];\n if (!token)\n return null;\n token.index = i;\n token.start = c - token.value.length;\n return token;\n };\n this.setUndoManager = function(undoManager) {\n this.$undoManager = undoManager;\n this.$deltas = [];\n this.$deltasDoc = [];\n this.$deltasFold = [];\n\n if (this.$informUndoManager)\n this.$informUndoManager.cancel();\n\n if (undoManager) {\n var self = this;\n\n this.$syncInformUndoManager = function() {\n self.$informUndoManager.cancel();\n\n if (self.$deltasFold.length) {\n self.$deltas.push({\n group: \"fold\",\n deltas: self.$deltasFold\n });\n self.$deltasFold = [];\n }\n\n if (self.$deltasDoc.length) {\n self.$deltas.push({\n group: \"doc\",\n deltas: self.$deltasDoc\n });\n self.$deltasDoc = [];\n }\n\n if (self.$deltas.length > 0) {\n undoManager.execute({\n action: \"aceupdate\",\n args: [self.$deltas, self],\n merge: self.mergeUndoDeltas\n });\n }\n self.mergeUndoDeltas = false;\n self.$deltas = [];\n };\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n }\n };\n this.markUndoGroup = function() {\n if (this.$syncInformUndoManager)\n this.$syncInformUndoManager();\n };\n \n this.$defaultUndoManager = {\n undo: function() {},\n redo: function() {},\n reset: function() {}\n };\n this.getUndoManager = function() {\n return this.$undoManager || this.$defaultUndoManager;\n };\n this.getTabString = function() {\n if (this.getUseSoftTabs()) {\n return lang.stringRepeat(\" \", this.getTabSize());\n } else {\n return \"\\t\";\n }\n };\n this.setUseSoftTabs = function(val) {\n this.setOption(\"useSoftTabs\", val);\n };\n this.getUseSoftTabs = function() {\n return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n };\n this.setTabSize = function(tabSize) {\n this.setOption(\"tabSize\", tabSize);\n };\n this.getTabSize = function() {\n return this.$tabSize;\n };\n this.isTabStop = function(position) {\n return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n };\n this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) {\n this.setOption(\"navigateWithinSoftTabs\", navigateWithinSoftTabs);\n };\n this.getNavigateWithinSoftTabs = function() {\n return this.$navigateWithinSoftTabs;\n };\n\n this.$overwrite = false;\n this.setOverwrite = function(overwrite) {\n this.setOption(\"overwrite\", overwrite);\n };\n this.getOverwrite = function() {\n return this.$overwrite;\n };\n this.toggleOverwrite = function() {\n this.setOverwrite(!this.$overwrite);\n };\n this.addGutterDecoration = function(row, className) {\n if (!this.$decorations[row])\n this.$decorations[row] = \"\";\n this.$decorations[row] += \" \" + className;\n this._signal(\"changeBreakpoint\", {});\n };\n this.removeGutterDecoration = function(row, className) {\n this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n this._signal(\"changeBreakpoint\", {});\n };\n this.getBreakpoints = function() {\n return this.$breakpoints;\n };\n this.setBreakpoints = function(rows) {\n this.$breakpoints = [];\n for (var i=0; i 0)\n inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n if (!inToken)\n inToken = !!line.charAt(column).match(this.tokenRe);\n\n if (inToken)\n var re = this.tokenRe;\n else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n var re = /\\s/;\n else\n var re = this.nonTokenRe;\n\n var start = column;\n if (start > 0) {\n do {\n start--;\n }\n while (start >= 0 && line.charAt(start).match(re));\n start++;\n }\n\n var end = column;\n while (end < line.length && line.charAt(end).match(re)) {\n end++;\n }\n\n return new Range(row, start, row, end);\n };\n this.getAWordRange = function(row, column) {\n var wordRange = this.getWordRange(row, column);\n var line = this.getLine(wordRange.end.row);\n\n while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n wordRange.end.column += 1;\n }\n return wordRange;\n };\n this.setNewLineMode = function(newLineMode) {\n this.doc.setNewLineMode(newLineMode);\n };\n this.getNewLineMode = function() {\n return this.doc.getNewLineMode();\n };\n this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n this.getUseWorker = function() { return this.$useWorker; };\n this.onReloadTokenizer = function(e) {\n var rows = e.data;\n this.bgTokenizer.start(rows.first);\n this._signal(\"tokenizerUpdate\", e);\n };\n\n this.$modes = {};\n this.$mode = null;\n this.$modeId = null;\n this.setMode = function(mode, cb) {\n if (mode && typeof mode === \"object\") {\n if (mode.getTokenizer)\n return this.$onChangeMode(mode);\n var options = mode;\n var path = options.path;\n } else {\n path = mode || \"ace/mode/text\";\n }\n if (!this.$modes[\"ace/mode/text\"])\n this.$modes[\"ace/mode/text\"] = new TextMode();\n\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n cb && cb();\n return;\n }\n this.$modeId = path;\n config.loadModule([\"mode\", path], function(m) {\n if (this.$modeId !== path)\n return cb && cb();\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n } else if (m && m.Mode) {\n m = new m.Mode(options);\n if (!options) {\n this.$modes[path] = m;\n m.$id = path;\n }\n this.$onChangeMode(m);\n }\n cb && cb();\n }.bind(this));\n if (!this.$mode)\n this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n };\n\n this.$onChangeMode = function(mode, $isPlaceholder) {\n if (!$isPlaceholder)\n this.$modeId = mode.$id;\n if (this.$mode === mode) \n return;\n\n this.$mode = mode;\n\n this.$stopWorker();\n\n if (this.$useWorker)\n this.$startWorker();\n\n var tokenizer = mode.getTokenizer();\n\n if(tokenizer.addEventListener !== undefined) {\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n tokenizer.addEventListener(\"update\", onReloadTokenizer);\n }\n\n if (!this.bgTokenizer) {\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n var _self = this;\n this.bgTokenizer.addEventListener(\"update\", function(e) {\n _self._signal(\"tokenizerUpdate\", e);\n });\n } else {\n this.bgTokenizer.setTokenizer(tokenizer);\n }\n\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.tokenRe = mode.tokenRe;\n this.nonTokenRe = mode.nonTokenRe;\n\n \n if (!$isPlaceholder) {\n if (mode.attachToSession)\n mode.attachToSession(this);\n this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n this.$setFolding(mode.foldingRules);\n this.bgTokenizer.start(0);\n this._emit(\"changeMode\");\n }\n };\n\n this.$stopWorker = function() {\n if (this.$worker) {\n this.$worker.terminate();\n this.$worker = null;\n }\n };\n\n this.$startWorker = function() {\n try {\n this.$worker = this.$mode.createWorker(this);\n } catch (e) {\n config.warn(\"Could not load worker\", e);\n this.$worker = null;\n }\n };\n this.getMode = function() {\n return this.$mode;\n };\n\n this.$scrollTop = 0;\n this.setScrollTop = function(scrollTop) {\n if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n return;\n\n this.$scrollTop = scrollTop;\n this._signal(\"changeScrollTop\", scrollTop);\n };\n this.getScrollTop = function() {\n return this.$scrollTop;\n };\n\n this.$scrollLeft = 0;\n this.setScrollLeft = function(scrollLeft) {\n if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n return;\n\n this.$scrollLeft = scrollLeft;\n this._signal(\"changeScrollLeft\", scrollLeft);\n };\n this.getScrollLeft = function() {\n return this.$scrollLeft;\n };\n this.getScreenWidth = function() {\n this.$computeWidth();\n if (this.lineWidgets) \n return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n return this.screenWidth;\n };\n \n this.getLineWidgetMaxWidth = function() {\n if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n var width = 0;\n this.lineWidgets.forEach(function(w) {\n if (w && w.screenWidth > width)\n width = w.screenWidth;\n });\n return this.lineWidgetWidth = width;\n };\n\n this.$computeWidth = function(force) {\n if (this.$modified || force) {\n this.$modified = false;\n\n if (this.$useWrapMode)\n return this.screenWidth = this.$wrapLimit;\n\n var lines = this.doc.getAllLines();\n var cache = this.$rowLengthCache;\n var longestScreenLine = 0;\n var foldIndex = 0;\n var foldLine = this.$foldData[foldIndex];\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n var len = lines.length;\n\n for (var i = 0; i < len; i++) {\n if (i > foldStart) {\n i = foldLine.end.row + 1;\n if (i >= len)\n break;\n foldLine = this.$foldData[foldIndex++];\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n\n if (cache[i] == null)\n cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n if (cache[i] > longestScreenLine)\n longestScreenLine = cache[i];\n }\n this.screenWidth = longestScreenLine;\n }\n };\n this.getLine = function(row) {\n return this.doc.getLine(row);\n };\n this.getLines = function(firstRow, lastRow) {\n return this.doc.getLines(firstRow, lastRow);\n };\n this.getLength = function() {\n return this.doc.getLength();\n };\n this.getTextRange = function(range) {\n return this.doc.getTextRange(range || this.selection.getRange());\n };\n this.insert = function(position, text) {\n return this.doc.insert(position, text);\n };\n this.remove = function(range) {\n return this.doc.remove(range);\n };\n this.removeFullLines = function(firstRow, lastRow){\n return this.doc.removeFullLines(firstRow, lastRow);\n };\n this.undoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n var lastUndoRange = null;\n for (var i = deltas.length - 1; i != -1; i--) {\n var delta = deltas[i];\n if (delta.group == \"doc\") {\n this.doc.revertDeltas(delta.deltas);\n lastUndoRange =\n this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n } else {\n delta.deltas.forEach(function(foldDelta) {\n this.addFolds(foldDelta.folds);\n }, this);\n }\n }\n this.$fromUndo = false;\n lastUndoRange &&\n this.$undoSelect &&\n !dontSelect &&\n this.selection.setSelectionRange(lastUndoRange);\n return lastUndoRange;\n };\n this.redoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n var lastUndoRange = null;\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (delta.group == \"doc\") {\n this.doc.applyDeltas(delta.deltas);\n lastUndoRange =\n this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n }\n }\n this.$fromUndo = false;\n lastUndoRange &&\n this.$undoSelect &&\n !dontSelect &&\n this.selection.setSelectionRange(lastUndoRange);\n return lastUndoRange;\n };\n this.setUndoSelect = function(enable) {\n this.$undoSelect = enable;\n };\n\n this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n function isInsert(delta) {\n return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n }\n\n var delta = deltas[0];\n var range, point;\n var lastDeltaIsInsert = false;\n if (isInsert(delta)) {\n range = Range.fromPoints(delta.start, delta.end);\n lastDeltaIsInsert = true;\n } else {\n range = Range.fromPoints(delta.start, delta.start);\n lastDeltaIsInsert = false;\n }\n\n for (var i = 1; i < deltas.length; i++) {\n delta = deltas[i];\n if (isInsert(delta)) {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range.setStart(point);\n }\n point = delta.end;\n if (range.compare(point.row, point.column) == 1) {\n range.setEnd(point);\n }\n lastDeltaIsInsert = true;\n } else {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range = Range.fromPoints(delta.start, delta.start);\n }\n lastDeltaIsInsert = false;\n }\n }\n if (lastUndoRange != null) {\n if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\n lastUndoRange.start.column += range.end.column - range.start.column;\n lastUndoRange.end.column += range.end.column - range.start.column;\n }\n\n var cmp = lastUndoRange.compareRange(range);\n if (cmp == 1) {\n range.setStart(lastUndoRange.start);\n } else if (cmp == -1) {\n range.setEnd(lastUndoRange.end);\n }\n }\n\n return range;\n };\n this.replace = function(range, text) {\n return this.doc.replace(range, text);\n };\n this.moveText = function(fromRange, toPosition, copy) {\n var text = this.getTextRange(fromRange);\n var folds = this.getFoldsInRange(fromRange);\n\n var toRange = Range.fromPoints(toPosition, toPosition);\n if (!copy) {\n this.remove(fromRange);\n var rowDiff = fromRange.start.row - fromRange.end.row;\n var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n if (collDiff) {\n if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n toRange.start.column += collDiff;\n if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n toRange.end.column += collDiff;\n }\n if (rowDiff && toRange.start.row >= fromRange.end.row) {\n toRange.start.row += rowDiff;\n toRange.end.row += rowDiff;\n }\n }\n\n toRange.end = this.insert(toRange.start, text);\n if (folds.length) {\n var oldStart = fromRange.start;\n var newStart = toRange.start;\n var rowDiff = newStart.row - oldStart.row;\n var collDiff = newStart.column - oldStart.column;\n this.addFolds(folds.map(function(x) {\n x = x.clone();\n if (x.start.row == oldStart.row)\n x.start.column += collDiff;\n if (x.end.row == oldStart.row)\n x.end.column += collDiff;\n x.start.row += rowDiff;\n x.end.row += rowDiff;\n return x;\n }));\n }\n\n return toRange;\n };\n this.indentRows = function(startRow, endRow, indentString) {\n indentString = indentString.replace(/\\t/g, this.getTabString());\n for (var row=startRow; row<=endRow; row++)\n this.doc.insertInLine({row: row, column: 0}, indentString);\n };\n this.outdentRows = function (range) {\n var rowRange = range.collapseRows();\n var deleteRange = new Range(0, 0, 0, 0);\n var size = this.getTabSize();\n\n for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n var line = this.getLine(i);\n\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n for (var j = 0; j < size; ++j)\n if (line.charAt(j) != ' ')\n break;\n if (j < size && line.charAt(j) == '\\t') {\n deleteRange.start.column = j;\n deleteRange.end.column = j + 1;\n } else {\n deleteRange.start.column = 0;\n deleteRange.end.column = j;\n }\n this.remove(deleteRange);\n }\n };\n\n this.$moveLines = function(firstRow, lastRow, dir) {\n firstRow = this.getRowFoldStart(firstRow);\n lastRow = this.getRowFoldEnd(lastRow);\n if (dir < 0) {\n var row = this.getRowFoldStart(firstRow + dir);\n if (row < 0) return 0;\n var diff = row-firstRow;\n } else if (dir > 0) {\n var row = this.getRowFoldEnd(lastRow + dir);\n if (row > this.doc.getLength()-1) return 0;\n var diff = row-lastRow;\n } else {\n firstRow = this.$clipRowToDocument(firstRow);\n lastRow = this.$clipRowToDocument(lastRow);\n var diff = lastRow - firstRow + 1;\n }\n\n var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n var folds = this.getFoldsInRange(range).map(function(x){\n x = x.clone();\n x.start.row += diff;\n x.end.row += diff;\n return x;\n });\n \n var lines = dir == 0\n ? this.doc.getLines(firstRow, lastRow)\n : this.doc.removeFullLines(firstRow, lastRow);\n this.doc.insertFullLines(firstRow+diff, lines);\n folds.length && this.addFolds(folds);\n return diff;\n };\n this.moveLinesUp = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, -1);\n };\n this.moveLinesDown = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 1);\n };\n this.duplicateLines = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 0);\n };\n\n\n this.$clipRowToDocument = function(row) {\n return Math.max(0, Math.min(row, this.doc.getLength()-1));\n };\n\n this.$clipColumnToRow = function(row, column) {\n if (column < 0)\n return 0;\n return Math.min(this.doc.getLine(row).length, column);\n };\n\n\n this.$clipPositionToDocument = function(row, column) {\n column = Math.max(0, column);\n\n if (row < 0) {\n row = 0;\n column = 0;\n } else {\n var len = this.doc.getLength();\n if (row >= len) {\n row = len - 1;\n column = this.doc.getLine(len-1).length;\n } else {\n column = Math.min(this.doc.getLine(row).length, column);\n }\n }\n\n return {\n row: row,\n column: column\n };\n };\n\n this.$clipRangeToDocument = function(range) {\n if (range.start.row < 0) {\n range.start.row = 0;\n range.start.column = 0;\n } else {\n range.start.column = this.$clipColumnToRow(\n range.start.row,\n range.start.column\n );\n }\n\n var len = this.doc.getLength() - 1;\n if (range.end.row > len) {\n range.end.row = len;\n range.end.column = this.doc.getLine(len).length;\n } else {\n range.end.column = this.$clipColumnToRow(\n range.end.row,\n range.end.column\n );\n }\n return range;\n };\n this.$wrapLimit = 80;\n this.$useWrapMode = false;\n this.$wrapLimitRange = {\n min : null,\n max : null\n };\n this.setUseWrapMode = function(useWrapMode) {\n if (useWrapMode != this.$useWrapMode) {\n this.$useWrapMode = useWrapMode;\n this.$modified = true;\n this.$resetRowCache(0);\n if (useWrapMode) {\n var len = this.getLength();\n this.$wrapData = Array(len);\n this.$updateWrapData(0, len - 1);\n }\n\n this._signal(\"changeWrapMode\");\n }\n };\n this.getUseWrapMode = function() {\n return this.$useWrapMode;\n };\n this.setWrapLimitRange = function(min, max) {\n if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n this.$wrapLimitRange = { min: min, max: max };\n this.$modified = true;\n this.$bidiHandler.markAsDirty();\n if (this.$useWrapMode)\n this._signal(\"changeWrapMode\");\n }\n };\n this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n var limits = this.$wrapLimitRange;\n if (limits.max < 0)\n limits = {min: $printMargin, max: $printMargin};\n var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n this.$wrapLimit = wrapLimit;\n this.$modified = true;\n if (this.$useWrapMode) {\n this.$updateWrapData(0, this.getLength() - 1);\n this.$resetRowCache(0);\n this._signal(\"changeWrapLimit\");\n }\n return true;\n }\n return false;\n };\n\n this.$constrainWrapLimit = function(wrapLimit, min, max) {\n if (min)\n wrapLimit = Math.max(min, wrapLimit);\n\n if (max)\n wrapLimit = Math.min(max, wrapLimit);\n\n return wrapLimit;\n };\n this.getWrapLimit = function() {\n return this.$wrapLimit;\n };\n this.setWrapLimit = function (limit) {\n this.setWrapLimitRange(limit, limit);\n };\n this.getWrapLimitRange = function() {\n return {\n min : this.$wrapLimitRange.min,\n max : this.$wrapLimitRange.max\n };\n };\n\n this.$updateInternalDataOnChange = function(delta) {\n var useWrapMode = this.$useWrapMode;\n var action = delta.action;\n var start = delta.start;\n var end = delta.end;\n var firstRow = start.row;\n var lastRow = end.row;\n var len = lastRow - firstRow;\n var removedFolds = null;\n \n this.$updating = true;\n if (len != 0) {\n if (action === \"remove\") {\n this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n var foldLines = this.$foldData;\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n var foldLine = this.getFoldLine(end.row);\n var idx = 0;\n if (foldLine) {\n foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n foldLine.shiftRow(-len);\n\n var foldLineBefore = this.getFoldLine(firstRow);\n if (foldLineBefore && foldLineBefore !== foldLine) {\n foldLineBefore.merge(foldLine);\n foldLine = foldLineBefore;\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= end.row) {\n foldLine.shiftRow(-len);\n }\n }\n\n lastRow = firstRow;\n } else {\n var args = Array(len);\n args.unshift(firstRow, 0);\n var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache;\n arr.splice.apply(arr, args);\n var foldLines = this.$foldData;\n var foldLine = this.getFoldLine(firstRow);\n var idx = 0;\n if (foldLine) {\n var cmp = foldLine.range.compareInside(start.row, start.column);\n if (cmp == 0) {\n foldLine = foldLine.split(start.row, start.column);\n if (foldLine) {\n foldLine.shiftRow(len);\n foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n }\n } else\n if (cmp == -1) {\n foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n foldLine.shiftRow(len);\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= firstRow) {\n foldLine.shiftRow(len);\n }\n }\n }\n } else {\n len = Math.abs(delta.start.column - delta.end.column);\n if (action === \"remove\") {\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n len = -len;\n }\n var foldLine = this.getFoldLine(firstRow);\n if (foldLine) {\n foldLine.addRemoveChars(firstRow, start.column, len);\n }\n }\n\n if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n }\n this.$updating = false;\n\n if (useWrapMode)\n this.$updateWrapData(firstRow, lastRow);\n else\n this.$updateRowLengthCache(firstRow, lastRow);\n\n return removedFolds;\n };\n\n this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n this.$rowLengthCache[firstRow] = null;\n this.$rowLengthCache[lastRow] = null;\n };\n\n this.$updateWrapData = function(firstRow, lastRow) {\n var lines = this.doc.getAllLines();\n var tabSize = this.getTabSize();\n var wrapData = this.$wrapData;\n var wrapLimit = this.$wrapLimit;\n var tokens;\n var foldLine;\n\n var row = firstRow;\n lastRow = Math.min(lastRow, lines.length - 1);\n while (row <= lastRow) {\n foldLine = this.getFoldLine(row, foldLine);\n if (!foldLine) {\n tokens = this.$getDisplayTokens(lines[row]);\n wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row ++;\n } else {\n tokens = [];\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n var walkTokens;\n if (placeholder != null) {\n walkTokens = this.$getDisplayTokens(\n placeholder, tokens.length);\n walkTokens[0] = PLACEHOLDER_START;\n for (var i = 1; i < walkTokens.length; i++) {\n walkTokens[i] = PLACEHOLDER_BODY;\n }\n } else {\n walkTokens = this.$getDisplayTokens(\n lines[row].substring(lastColumn, column),\n tokens.length);\n }\n tokens = tokens.concat(walkTokens);\n }.bind(this),\n foldLine.end.row,\n lines[foldLine.end.row].length + 1\n );\n\n wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row = foldLine.end.row + 1;\n }\n }\n };\n var CHAR = 1,\n CHAR_EXT = 2,\n PLACEHOLDER_START = 3,\n PLACEHOLDER_BODY = 4,\n PUNCTUATION = 9,\n SPACE = 10,\n TAB = 11,\n TAB_SPACE = 12;\n\n\n this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) {\n if (tokens.length == 0) {\n return [];\n }\n\n var splits = [];\n var displayLength = tokens.length;\n var lastSplit = 0, lastDocSplit = 0;\n\n var isCode = this.$wrapAsCode;\n\n var indentedSoftWrap = this.$indentedSoftWrap;\n var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)\n || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);\n\n function getWrapIndent() {\n var indentation = 0;\n if (maxIndent === 0)\n return indentation;\n if (indentedSoftWrap) {\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token == SPACE)\n indentation += 1;\n else if (token == TAB)\n indentation += tabSize;\n else if (token == TAB_SPACE)\n continue;\n else\n break;\n }\n }\n if (isCode && indentedSoftWrap !== false)\n indentation += tabSize;\n return Math.min(indentation, maxIndent);\n }\n function addSplit(screenPos) {\n var displayed = tokens.slice(lastSplit, screenPos);\n var len = displayed.length;\n displayed.join(\"\")\n .replace(/12/g, function() {\n len -= 1;\n })\n .replace(/2/g, function() {\n len -= 1;\n });\n\n if (!splits.length) {\n indent = getWrapIndent();\n splits.indent = indent;\n }\n lastDocSplit += len;\n splits.push(lastDocSplit);\n lastSplit = screenPos;\n }\n var indent = 0;\n while (displayLength - lastSplit > wrapLimit - indent) {\n var split = lastSplit + wrapLimit - indent;\n if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n addSplit(split);\n continue;\n }\n if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n for (split; split != lastSplit - 1; split--) {\n if (tokens[split] == PLACEHOLDER_START) {\n break;\n }\n }\n if (split > lastSplit) {\n addSplit(split);\n continue;\n }\n split = lastSplit + wrapLimit;\n for (split; split < tokens.length; split++) {\n if (tokens[split] != PLACEHOLDER_BODY) {\n break;\n }\n }\n if (split == tokens.length) {\n break; // Breaks the while-loop.\n }\n addSplit(split);\n continue;\n }\n var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1);\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n if (isCode) {\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n while (split > minSplit && tokens[split] == PUNCTUATION) {\n split --;\n }\n } else {\n while (split > minSplit && tokens[split] < SPACE) {\n split --;\n }\n }\n if (split > minSplit) {\n addSplit(++split);\n continue;\n }\n split = lastSplit + wrapLimit;\n if (tokens[split] == CHAR_EXT)\n split--;\n addSplit(split - indent);\n }\n return splits;\n };\n this.$getDisplayTokens = function(str, offset) {\n var arr = [];\n var tabSize;\n offset = offset || 0;\n\n for (var i = 0; i < str.length; i++) {\n var c = str.charCodeAt(i);\n if (c == 9) {\n tabSize = this.getScreenTabSize(arr.length + offset);\n arr.push(TAB);\n for (var n = 1; n < tabSize; n++) {\n arr.push(TAB_SPACE);\n }\n }\n else if (c == 32) {\n arr.push(SPACE);\n } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n arr.push(PUNCTUATION);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n arr.push(CHAR, CHAR_EXT);\n } else {\n arr.push(CHAR);\n }\n }\n return arr;\n };\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn == 0)\n return [0, 0];\n if (maxScreenColumn == null)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n\n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charCodeAt(column);\n if (c == 9) {\n screenColumn += this.getScreenTabSize(screenColumn);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n screenColumn += 2;\n } else {\n screenColumn += 1;\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n\n return [screenColumn, column];\n };\n\n this.lineWidgets = null;\n this.getRowLength = function(row) {\n if (this.lineWidgets)\n var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n this.getRowLineCount = function(row) {\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1;\n } else {\n return this.$wrapData[row].length + 1;\n }\n };\n\n this.getRowWrapIndent = function(screenRow) {\n if (this.$useWrapMode) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n var splits = this.$wrapData[pos.row];\n return splits.length && splits[0] < pos.column ? splits.indent : 0;\n } else {\n return 0;\n }\n };\n this.getScreenLastRowColumn = function(screenRow) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n return this.documentToScreenColumn(pos.row, pos.column);\n };\n this.getDocumentLastRowColumn = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.getScreenLastRowColumn(screenRow);\n };\n this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n };\n this.getRowSplitData = function(row) {\n if (!this.$useWrapMode) {\n return undefined;\n } else {\n return this.$wrapData[row];\n }\n };\n this.getScreenTabSize = function(screenColumn) {\n return this.$tabSize - screenColumn % this.$tabSize;\n };\n\n\n this.screenToDocumentRow = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).row;\n };\n\n\n this.screenToDocumentColumn = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).column;\n };\n this.screenToDocumentPosition = function(screenRow, screenColumn, offsetX) {\n if (screenRow < 0)\n return {row: 0, column: 0};\n\n var line;\n var docRow = 0;\n var docColumn = 0;\n var column;\n var row = 0;\n var rowLength = 0;\n\n var rowCache = this.$screenRowCache;\n var i = this.$getRowCacheIndex(rowCache, screenRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var docRow = this.$docRowCache[i];\n var doCache = screenRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var maxRow = this.getLength() - 1;\n var foldLine = this.getNextFoldLine(docRow);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (row <= screenRow) {\n rowLength = this.getRowLength(docRow);\n if (row + rowLength > screenRow || docRow >= maxRow) {\n break;\n } else {\n row += rowLength;\n docRow++;\n if (docRow > foldStart) {\n docRow = foldLine.end.row+1;\n foldLine = this.getNextFoldLine(docRow, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n }\n\n if (doCache) {\n this.$docRowCache.push(docRow);\n this.$screenRowCache.push(row);\n }\n }\n\n if (foldLine && foldLine.start.row <= docRow) {\n line = this.getFoldDisplayLine(foldLine);\n docRow = foldLine.start.row;\n } else if (row + rowLength <= screenRow || docRow > maxRow) {\n return {\n row: maxRow,\n column: this.getLine(maxRow).length\n };\n } else {\n line = this.getLine(docRow);\n foldLine = null;\n }\n var wrapIndent = 0, splitIndex = Math.floor(screenRow - row);\n if (this.$useWrapMode) {\n var splits = this.$wrapData[docRow];\n if (splits) {\n column = splits[splitIndex];\n if(splitIndex > 0 && splits.length) {\n wrapIndent = splits.indent;\n docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n line = line.substring(docColumn);\n }\n }\n }\n\n if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex))\n screenColumn = this.$bidiHandler.offsetToCol(offsetX);\n\n docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1];\n if (this.$useWrapMode && docColumn >= column)\n docColumn = column - 1;\n\n if (foldLine)\n return foldLine.idxToPosition(docColumn);\n\n return {row: docRow, column: docColumn};\n };\n this.documentToScreenPosition = function(docRow, docColumn) {\n if (typeof docColumn === \"undefined\")\n var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n else\n pos = this.$clipPositionToDocument(docRow, docColumn);\n\n docRow = pos.row;\n docColumn = pos.column;\n\n var screenRow = 0;\n var foldStartRow = null;\n var fold = null;\n fold = this.getFoldAt(docRow, docColumn, 1);\n if (fold) {\n docRow = fold.start.row;\n docColumn = fold.start.column;\n }\n\n var rowEnd, row = 0;\n\n\n var rowCache = this.$docRowCache;\n var i = this.$getRowCacheIndex(rowCache, docRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var screenRow = this.$screenRowCache[i];\n var doCache = docRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var foldLine = this.getNextFoldLine(row);\n var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n while (row < docRow) {\n if (row >= foldStart) {\n rowEnd = foldLine.end.row + 1;\n if (rowEnd > docRow)\n break;\n foldLine = this.getNextFoldLine(rowEnd, foldLine);\n foldStart = foldLine ?foldLine.start.row :Infinity;\n }\n else {\n rowEnd = row + 1;\n }\n\n screenRow += this.getRowLength(row);\n row = rowEnd;\n\n if (doCache) {\n this.$docRowCache.push(row);\n this.$screenRowCache.push(screenRow);\n }\n }\n var textLine = \"\";\n if (foldLine && row >= foldStart) {\n textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n foldStartRow = foldLine.start.row;\n } else {\n textLine = this.getLine(docRow).substring(0, docColumn);\n foldStartRow = docRow;\n }\n var wrapIndent = 0;\n if (this.$useWrapMode) {\n var wrapRow = this.$wrapData[foldStartRow];\n if (wrapRow) {\n var screenRowOffset = 0;\n while (textLine.length >= wrapRow[screenRowOffset]) {\n screenRow ++;\n screenRowOffset++;\n }\n textLine = textLine.substring(\n wrapRow[screenRowOffset - 1] || 0, textLine.length\n );\n wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n }\n }\n\n return {\n row: screenRow,\n column: wrapIndent + this.$getStringScreenWidth(textLine)[0]\n };\n };\n this.documentToScreenColumn = function(row, docColumn) {\n return this.documentToScreenPosition(row, docColumn).column;\n };\n this.documentToScreenRow = function(docRow, docColumn) {\n return this.documentToScreenPosition(docRow, docColumn).row;\n };\n this.getScreenLength = function() {\n var screenRows = 0;\n var fold = null;\n if (!this.$useWrapMode) {\n screenRows = this.getLength();\n var foldData = this.$foldData;\n for (var i = 0; i < foldData.length; i++) {\n fold = foldData[i];\n screenRows -= fold.end.row - fold.start.row;\n }\n } else {\n var lastRow = this.$wrapData.length;\n var row = 0, i = 0;\n var fold = this.$foldData[i++];\n var foldStart = fold ? fold.start.row :Infinity;\n\n while (row < lastRow) {\n var splits = this.$wrapData[row];\n screenRows += splits ? splits.length + 1 : 1;\n row ++;\n if (row > foldStart) {\n row = fold.end.row+1;\n fold = this.$foldData[i++];\n foldStart = fold ?fold.start.row :Infinity;\n }\n }\n }\n if (this.lineWidgets)\n screenRows += this.$getWidgetScreenLength();\n\n return screenRows;\n };\n this.$setFontMetrics = function(fm) {\n if (!this.$enableVarChar) return;\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn === 0)\n return [0, 0];\n if (!maxScreenColumn)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n \n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charAt(column);\n if (c === \"\\t\") {\n screenColumn += this.getScreenTabSize(screenColumn);\n } else {\n screenColumn += fm.getCharacterWidth(c);\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n \n return [screenColumn, column];\n };\n };\n \n this.destroy = function() {\n if (this.bgTokenizer) {\n this.bgTokenizer.setDocument(null);\n this.bgTokenizer = null;\n }\n this.$stopWorker();\n };\n\n this.isFullWidth = isFullWidth;\n function isFullWidth(c) {\n if (c < 0x1100)\n return false;\n return c >= 0x1100 && c <= 0x115F ||\n c >= 0x11A3 && c <= 0x11A7 ||\n c >= 0x11FA && c <= 0x11FF ||\n c >= 0x2329 && c <= 0x232A ||\n c >= 0x2E80 && c <= 0x2E99 ||\n c >= 0x2E9B && c <= 0x2EF3 ||\n c >= 0x2F00 && c <= 0x2FD5 ||\n c >= 0x2FF0 && c <= 0x2FFB ||\n c >= 0x3000 && c <= 0x303E ||\n c >= 0x3041 && c <= 0x3096 ||\n c >= 0x3099 && c <= 0x30FF ||\n c >= 0x3105 && c <= 0x312D ||\n c >= 0x3131 && c <= 0x318E ||\n c >= 0x3190 && c <= 0x31BA ||\n c >= 0x31C0 && c <= 0x31E3 ||\n c >= 0x31F0 && c <= 0x321E ||\n c >= 0x3220 && c <= 0x3247 ||\n c >= 0x3250 && c <= 0x32FE ||\n c >= 0x3300 && c <= 0x4DBF ||\n c >= 0x4E00 && c <= 0xA48C ||\n c >= 0xA490 && c <= 0xA4C6 ||\n c >= 0xA960 && c <= 0xA97C ||\n c >= 0xAC00 && c <= 0xD7A3 ||\n c >= 0xD7B0 && c <= 0xD7C6 ||\n c >= 0xD7CB && c <= 0xD7FB ||\n c >= 0xF900 && c <= 0xFAFF ||\n c >= 0xFE10 && c <= 0xFE19 ||\n c >= 0xFE30 && c <= 0xFE52 ||\n c >= 0xFE54 && c <= 0xFE66 ||\n c >= 0xFE68 && c <= 0xFE6B ||\n c >= 0xFF01 && c <= 0xFF60 ||\n c >= 0xFFE0 && c <= 0xFFE6;\n }\n\n}).call(EditSession.prototype);\n\nacequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nacequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\n\nconfig.defineOptions(EditSession.prototype, \"session\", {\n wrap: {\n set: function(value) {\n if (!value || value == \"off\")\n value = false;\n else if (value == \"free\")\n value = true;\n else if (value == \"printMargin\")\n value = -1;\n else if (typeof value == \"string\")\n value = parseInt(value, 10) || false;\n\n if (this.$wrap == value)\n return;\n this.$wrap = value;\n if (!value) {\n this.setUseWrapMode(false);\n } else {\n var col = typeof value == \"number\" ? value : null;\n this.setWrapLimitRange(col, col);\n this.setUseWrapMode(true);\n }\n },\n get: function() {\n if (this.getUseWrapMode()) {\n if (this.$wrap == -1)\n return \"printMargin\";\n if (!this.getWrapLimitRange().min)\n return \"free\";\n return this.$wrap;\n }\n return \"off\";\n },\n handlesSet: true\n }, \n wrapMethod: {\n set: function(val) {\n val = val == \"auto\"\n ? this.$mode.type != \"text\"\n : val != \"text\";\n if (val != this.$wrapAsCode) {\n this.$wrapAsCode = val;\n if (this.$useWrapMode) {\n this.$modified = true;\n this.$resetRowCache(0);\n this.$updateWrapData(0, this.getLength() - 1);\n }\n }\n },\n initialValue: \"auto\"\n },\n indentedSoftWrap: { initialValue: true },\n firstLineNumber: {\n set: function() {this._signal(\"changeBreakpoint\");},\n initialValue: 1\n },\n useWorker: {\n set: function(useWorker) {\n this.$useWorker = useWorker;\n\n this.$stopWorker();\n if (useWorker)\n this.$startWorker();\n },\n initialValue: true\n },\n useSoftTabs: {initialValue: true},\n tabSize: {\n set: function(tabSize) {\n if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\n this.$modified = true;\n this.$rowLengthCache = [];\n this.$tabSize = tabSize;\n this._signal(\"changeTabSize\");\n },\n initialValue: 4,\n handlesSet: true\n },\n navigateWithinSoftTabs: {initialValue: false},\n overwrite: {\n set: function(val) {this._signal(\"changeOverwrite\");},\n initialValue: false\n },\n newLineMode: {\n set: function(val) {this.doc.setNewLineMode(val);},\n get: function() {return this.doc.getNewLineMode();},\n handlesSet: true\n },\n mode: {\n set: function(val) { this.setMode(val); },\n get: function() { return this.$modeId; }\n }\n});\n\nexports.EditSession = EditSession;\n});\n\nace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./range\").Range;\n\nvar Search = function() {\n this.$options = {};\n};\n\n(function() {\n this.set = function(options) {\n oop.mixin(this.$options, options);\n return this;\n };\n this.getOptions = function() {\n return lang.copyObject(this.$options);\n };\n this.setOptions = function(options) {\n this.$options = options;\n };\n this.find = function(session) {\n var options = this.$options;\n var iterator = this.$matchIterator(session, options);\n if (!iterator)\n return false;\n\n var firstRange = null;\n iterator.forEach(function(sr, sc, er, ec) {\n firstRange = new Range(sr, sc, er, ec);\n if (sc == ec && options.start && options.start.start\n && options.skipCurrent != false && firstRange.isEqual(options.start)\n ) {\n firstRange = null;\n return false;\n }\n\n return true;\n });\n\n return firstRange;\n };\n this.findAll = function(session) {\n var options = this.$options;\n if (!options.needle)\n return [];\n this.$assembleRegExp(options);\n\n var range = options.range;\n var lines = range\n ? session.getLines(range.start.row, range.end.row)\n : session.doc.getAllLines();\n\n var ranges = [];\n var re = options.re;\n if (options.$isMultiLine) {\n var len = re.length;\n var maxRow = lines.length - len;\n var prevRange;\n outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n for (var j = 0; j < len; j++)\n if (lines[row + j].search(re[j]) == -1)\n continue outer;\n \n var startLine = lines[row];\n var line = lines[row + len - 1];\n var startIndex = startLine.length - startLine.match(re[0])[0].length;\n var endIndex = line.match(re[len - 1])[0].length;\n \n if (prevRange && prevRange.end.row === row &&\n prevRange.end.column > startIndex\n ) {\n continue;\n }\n ranges.push(prevRange = new Range(\n row, startIndex, row + len - 1, endIndex\n ));\n if (len > 2)\n row = row + len - 2;\n }\n } else {\n for (var i = 0; i < lines.length; i++) {\n var matches = lang.getMatchOffsets(lines[i], re);\n for (var j = 0; j < matches.length; j++) {\n var match = matches[j];\n ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n }\n }\n }\n\n if (range) {\n var startColumn = range.start.column;\n var endColumn = range.start.column;\n var i = 0, j = ranges.length - 1;\n while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n i++;\n\n while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n j--;\n \n ranges = ranges.slice(i, j + 1);\n for (i = 0, j = ranges.length; i < j; i++) {\n ranges[i].start.row += range.start.row;\n ranges[i].end.row += range.start.row;\n }\n }\n\n return ranges;\n };\n this.replace = function(input, replacement) {\n var options = this.$options;\n\n var re = this.$assembleRegExp(options);\n if (options.$isMultiLine)\n return replacement;\n\n if (!re)\n return;\n\n var match = re.exec(input);\n if (!match || match[0].length != input.length)\n return null;\n \n replacement = input.replace(re, replacement);\n if (options.preserveCase) {\n replacement = replacement.split(\"\");\n for (var i = Math.min(input.length, input.length); i--; ) {\n var ch = input[i];\n if (ch && ch.toLowerCase() != ch)\n replacement[i] = replacement[i].toUpperCase();\n else\n replacement[i] = replacement[i].toLowerCase();\n }\n replacement = replacement.join(\"\");\n }\n \n return replacement;\n };\n\n this.$assembleRegExp = function(options, $disableFakeMultiline) {\n if (options.needle instanceof RegExp)\n return options.re = options.needle;\n\n var needle = options.needle;\n\n if (!options.needle)\n return options.re = false;\n\n if (!options.regExp)\n needle = lang.escapeRegExp(needle);\n\n if (options.wholeWord)\n needle = addWordBoundary(needle, options);\n\n var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\n\n options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n if (options.$isMultiLine)\n return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n try {\n var re = new RegExp(needle, modifier);\n } catch(e) {\n re = false;\n }\n return options.re = re;\n };\n\n this.$assembleMultilineRegExp = function(needle, modifier) {\n var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n var re = [];\n for (var i = 0; i < parts.length; i++) try {\n re.push(new RegExp(parts[i], modifier));\n } catch(e) {\n return false;\n }\n return re;\n };\n\n this.$matchIterator = function(session, options) {\n var re = this.$assembleRegExp(options);\n if (!re)\n return false;\n var backwards = options.backwards == true;\n var skipCurrent = options.skipCurrent != false;\n\n var range = options.range;\n var start = options.start;\n if (!start)\n start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n \n if (start.start)\n start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n var firstRow = range ? range.start.row : 0;\n var lastRow = range ? range.end.row : session.getLength() - 1;\n\n if (backwards) {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row--; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n };\n }\n else {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row = row + 1; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n };\n }\n \n if (options.$isMultiLine) {\n var len = re.length;\n var forEachInLine = function(row, offset, callback) {\n var startRow = backwards ? row - len + 1 : row;\n if (startRow < 0) return;\n var line = session.getLine(startRow);\n var startIndex = line.search(re[0]);\n if (!backwards && startIndex < offset || startIndex === -1) return;\n for (var i = 1; i < len; i++) {\n line = session.getLine(startRow + i);\n if (line.search(re[i]) == -1)\n return;\n }\n var endIndex = line.match(re[len - 1])[0].length;\n if (backwards && endIndex > offset) return;\n if (callback(startRow, startIndex, startRow + len - 1, endIndex))\n return true;\n };\n }\n else if (backwards) {\n var forEachInLine = function(row, endIndex, callback) {\n var line = session.getLine(row);\n var matches = [];\n var m, last = 0;\n re.lastIndex = 0;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (!length) {\n if (last >= line.length) break;\n re.lastIndex = last += 1;\n }\n if (m.index + length > endIndex)\n break;\n matches.push(m.index, length);\n }\n for (var i = matches.length - 1; i >= 0; i -= 2) {\n var column = matches[i - 1];\n var length = matches[i];\n if (callback(row, column, row, column + length))\n return true;\n }\n };\n }\n else {\n var forEachInLine = function(row, startIndex, callback) {\n var line = session.getLine(row);\n var m;\n var last = startIndex;\n re.lastIndex = startIndex;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (callback(row, last, row,last + length))\n return true;\n if (!length) {\n re.lastIndex = last += 1;\n if (last >= line.length) return false;\n }\n }\n };\n }\n return {forEach: forEach};\n };\n\n}).call(Search.prototype);\n\nfunction addWordBoundary(needle, options) {\n function wordBoundary(c) {\n if (/\\w/.test(c) || options.regExp) return \"\\\\b\";\n return \"\";\n }\n return wordBoundary(needle[0]) + needle\n + wordBoundary(needle[needle.length - 1]);\n}\n\nexports.Search = Search;\n});\n\nace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keyUtil = acequire(\"../lib/keys\");\nvar useragent = acequire(\"../lib/useragent\");\nvar KEY_MODS = keyUtil.KEY_MODS;\n\nfunction HashHandler(config, platform) {\n this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n this.commands = {};\n this.commandKeyBinding = {};\n this.addCommands(config);\n this.$singleCommand = true;\n}\n\nfunction MultiHashHandler(config, platform) {\n HashHandler.call(this, config, platform);\n this.$singleCommand = false;\n}\n\nMultiHashHandler.prototype = HashHandler.prototype;\n\n(function() {\n \n\n this.addCommand = function(command) {\n if (this.commands[command.name])\n this.removeCommand(command);\n\n this.commands[command.name] = command;\n\n if (command.bindKey)\n this._buildKeyHash(command);\n };\n\n this.removeCommand = function(command, keepCommand) {\n var name = command && (typeof command === 'string' ? command : command.name);\n command = this.commands[name];\n if (!keepCommand)\n delete this.commands[name];\n var ckb = this.commandKeyBinding;\n for (var keyId in ckb) {\n var cmdGroup = ckb[keyId];\n if (cmdGroup == command) {\n delete ckb[keyId];\n } else if (Array.isArray(cmdGroup)) {\n var i = cmdGroup.indexOf(command);\n if (i != -1) {\n cmdGroup.splice(i, 1);\n if (cmdGroup.length == 1)\n ckb[keyId] = cmdGroup[0];\n }\n }\n }\n };\n\n this.bindKey = function(key, command, position) {\n if (typeof key == \"object\" && key) {\n if (position == undefined)\n position = key.position;\n key = key[this.platform];\n }\n if (!key)\n return;\n if (typeof command == \"function\")\n return this.addCommand({exec: command, bindKey: key, name: command.name || key});\n \n key.split(\"|\").forEach(function(keyPart) {\n var chain = \"\";\n if (keyPart.indexOf(\" \") != -1) {\n var parts = keyPart.split(/\\s+/);\n keyPart = parts.pop();\n parts.forEach(function(keyPart) {\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n chain += (chain ? \" \" : \"\") + id;\n this._addCommandToBinding(chain, \"chainKeys\");\n }, this);\n chain += \" \";\n }\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n this._addCommandToBinding(chain + id, command, position);\n }, this);\n };\n \n function getPosition(command) {\n return typeof command == \"object\" && command.bindKey\n && command.bindKey.position\n || (command.isDefault ? -100 : 0);\n }\n this._addCommandToBinding = function(keyId, command, position) {\n var ckb = this.commandKeyBinding, i;\n if (!command) {\n delete ckb[keyId];\n } else if (!ckb[keyId] || this.$singleCommand) {\n ckb[keyId] = command;\n } else {\n if (!Array.isArray(ckb[keyId])) {\n ckb[keyId] = [ckb[keyId]];\n } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n ckb[keyId].splice(i, 1);\n }\n\n if (typeof position != \"number\") {\n position = getPosition(command);\n }\n\n var commands = ckb[keyId];\n for (i = 0; i < commands.length; i++) {\n var other = commands[i];\n var otherPos = getPosition(other);\n if (otherPos > position)\n break;\n }\n commands.splice(i, 0, command);\n }\n };\n\n this.addCommands = function(commands) {\n commands && Object.keys(commands).forEach(function(name) {\n var command = commands[name];\n if (!command)\n return;\n \n if (typeof command === \"string\")\n return this.bindKey(command, name);\n\n if (typeof command === \"function\")\n command = { exec: command };\n\n if (typeof command !== \"object\")\n return;\n\n if (!command.name)\n command.name = name;\n\n this.addCommand(command);\n }, this);\n };\n\n this.removeCommands = function(commands) {\n Object.keys(commands).forEach(function(name) {\n this.removeCommand(commands[name]);\n }, this);\n };\n\n this.bindKeys = function(keyList) {\n Object.keys(keyList).forEach(function(key) {\n this.bindKey(key, keyList[key]);\n }, this);\n };\n\n this._buildKeyHash = function(command) {\n this.bindKey(command.bindKey, command);\n };\n this.parseKeys = function(keys) {\n var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x;});\n var key = parts.pop();\n\n var keyCode = keyUtil[key];\n if (keyUtil.FUNCTION_KEYS[keyCode])\n key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n else if (!parts.length)\n return {key: key, hashId: -1};\n else if (parts.length == 1 && parts[0] == \"shift\")\n return {key: key.toUpperCase(), hashId: -1};\n\n var hashId = 0;\n for (var i = parts.length; i--;) {\n var modifier = keyUtil.KEY_MODS[parts[i]];\n if (modifier == null) {\n if (typeof console != \"undefined\")\n console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n return false;\n }\n hashId |= modifier;\n }\n return {key: key, hashId: hashId};\n };\n\n this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n var key = KEY_MODS[hashId] + keyString;\n return this.commandKeyBinding[key];\n };\n\n this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n if (keyCode < 0) return;\n var key = KEY_MODS[hashId] + keyString;\n var command = this.commandKeyBinding[key];\n if (data.$keyChain) {\n data.$keyChain += \" \" + key;\n command = this.commandKeyBinding[data.$keyChain] || command;\n }\n \n if (command) {\n if (command == \"chainKeys\" || command[command.length - 1] == \"chainKeys\") {\n data.$keyChain = data.$keyChain || key;\n return {command: \"null\"};\n }\n }\n \n if (data.$keyChain) {\n if ((!hashId || hashId == 4) && keyString.length == 1)\n data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input\n else if (hashId == -1 || keyCode > 0)\n data.$keyChain = \"\"; // reset keyChain\n }\n return {command: command};\n };\n \n this.getStatusText = function(editor, data) {\n return data.$keyChain || \"\";\n };\n\n}).call(HashHandler.prototype);\n\nexports.HashHandler = HashHandler;\nexports.MultiHashHandler = MultiHashHandler;\n});\n\nace.define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar MultiHashHandler = acequire(\"../keyboard/hash_handler\").MultiHashHandler;\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n MultiHashHandler.call(this, commands, platform);\n this.byName = this.commands;\n this.setDefaultHandler(\"exec\", function(e) {\n return e.command.exec(e.editor, e.args || {});\n });\n};\n\noop.inherits(CommandManager, MultiHashHandler);\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.exec = function(command, editor, args) {\n if (Array.isArray(command)) {\n for (var i = command.length; i--; ) {\n if (this.exec(command[i], editor, args)) return true;\n }\n return false;\n }\n\n if (typeof command === \"string\")\n command = this.commands[command];\n\n if (!command)\n return false;\n\n if (editor && editor.$readOnly && !command.readOnly)\n return false;\n\n if (command.isAvailable && !command.isAvailable(editor))\n return false;\n\n var e = {editor: editor, command: command, args: args};\n e.returnValue = this._emit(\"exec\", e);\n this._signal(\"afterExec\", e);\n\n return e.returnValue === false ? false : true;\n };\n\n this.toggleRecording = function(editor) {\n if (this.$inReplay)\n return;\n\n editor && editor._emit(\"changeStatus\");\n if (this.recording) {\n this.macro.pop();\n this.removeEventListener(\"exec\", this.$addCommandToMacro);\n\n if (!this.macro.length)\n this.macro = this.oldMacro;\n\n return this.recording = false;\n }\n if (!this.$addCommandToMacro) {\n this.$addCommandToMacro = function(e) {\n this.macro.push([e.command, e.args]);\n }.bind(this);\n }\n\n this.oldMacro = this.macro;\n this.macro = [];\n this.on(\"exec\", this.$addCommandToMacro);\n return this.recording = true;\n };\n\n this.replay = function(editor) {\n if (this.$inReplay || !this.macro)\n return;\n\n if (this.recording)\n return this.toggleRecording(editor);\n\n try {\n this.$inReplay = true;\n this.macro.forEach(function(x) {\n if (typeof x == \"string\")\n this.exec(x, editor);\n else\n this.exec(x[0], editor, x[1]);\n }, this);\n } finally {\n this.$inReplay = false;\n }\n };\n\n this.trimMacro = function(m) {\n return m.map(function(x){\n if (typeof x[0] != \"string\")\n x[0] = x[0].name;\n if (!x[1])\n x = x[0];\n return x;\n });\n };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\nace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../lib/lang\");\nvar config = acequire(\"../config\");\nvar Range = acequire(\"../range\").Range;\n\nfunction bindKey(win, mac) {\n return {win: win, mac: mac};\n}\nexports.commands = [{\n name: \"showSettingsMenu\",\n bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/settings_menu\", function(module) {\n module.init(editor);\n editor.showSettingsMenu();\n });\n },\n readOnly: true\n}, {\n name: \"goToNextError\",\n bindKey: bindKey(\"Alt-E\", \"F4\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/error_marker\", function(module) {\n module.showErrorMarker(editor, 1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"goToPreviousError\",\n bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/error_marker\", function(module) {\n module.showErrorMarker(editor, -1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selectall\",\n bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n exec: function(editor) { editor.selectAll(); },\n readOnly: true\n}, {\n name: \"centerselection\",\n bindKey: bindKey(null, \"Ctrl-L\"),\n exec: function(editor) { editor.centerSelection(); },\n readOnly: true\n}, {\n name: \"gotoline\",\n bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n exec: function(editor) {\n var line = parseInt(prompt(\"Enter line number:\"), 10);\n if (!isNaN(line)) {\n editor.gotoLine(line);\n }\n },\n readOnly: true\n}, {\n name: \"fold\",\n bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n exec: function(editor) { editor.session.toggleFold(false); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfold\",\n bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n exec: function(editor) { editor.session.toggleFold(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleFoldWidget\",\n bindKey: bindKey(\"F2\", \"F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleParentFoldWidget\",\n bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldall\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAll(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldOther\",\n bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n exec: function(editor) { \n editor.session.foldAll();\n editor.session.unfold(editor.selection.getAllRanges());\n },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfoldall\",\n bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n exec: function(editor) { editor.session.unfold(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findnext\",\n bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n exec: function(editor) { editor.findNext(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findprevious\",\n bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n exec: function(editor) { editor.findPrevious(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"selectOrFindNext\",\n bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n exec: function(editor) {\n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findNext(); \n },\n readOnly: true\n}, {\n name: \"selectOrFindPrevious\",\n bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n exec: function(editor) { \n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findPrevious();\n },\n readOnly: true\n}, {\n name: \"find\",\n bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor);});\n },\n readOnly: true\n}, {\n name: \"overwrite\",\n bindKey: \"Insert\",\n exec: function(editor) { editor.toggleOverwrite(); },\n readOnly: true\n}, {\n name: \"selecttostart\",\n bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Home|Command-Shift-Up\"),\n exec: function(editor) { editor.getSelection().selectFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotostart\",\n bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n exec: function(editor) { editor.navigateFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectup\",\n bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n exec: function(editor) { editor.getSelection().selectUp(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golineup\",\n bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n exec: function(editor, args) { editor.navigateUp(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttoend\",\n bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-End|Command-Shift-Down\"),\n exec: function(editor) { editor.getSelection().selectFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotoend\",\n bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n exec: function(editor) { editor.navigateFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectdown\",\n bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n exec: function(editor) { editor.getSelection().selectDown(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golinedown\",\n bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n exec: function(editor, args) { editor.navigateDown(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordleft\",\n bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n exec: function(editor) { editor.getSelection().selectWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordleft\",\n bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n exec: function(editor) { editor.navigateWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolinestart\",\n bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolinestart\",\n bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n exec: function(editor) { editor.navigateLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectleft\",\n bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n exec: function(editor) { editor.getSelection().selectLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoleft\",\n bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n exec: function(editor, args) { editor.navigateLeft(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordright\",\n bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordright\",\n bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n exec: function(editor) { editor.navigateWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolineend\",\n bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right|Shift-End|Ctrl-Shift-E\"),\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolineend\",\n bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n exec: function(editor) { editor.navigateLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectright\",\n bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoright\",\n bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n exec: function(editor, args) { editor.navigateRight(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectpagedown\",\n bindKey: \"Shift-PageDown\",\n exec: function(editor) { editor.selectPageDown(); },\n readOnly: true\n}, {\n name: \"pagedown\",\n bindKey: bindKey(null, \"Option-PageDown\"),\n exec: function(editor) { editor.scrollPageDown(); },\n readOnly: true\n}, {\n name: \"gotopagedown\",\n bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n exec: function(editor) { editor.gotoPageDown(); },\n readOnly: true\n}, {\n name: \"selectpageup\",\n bindKey: \"Shift-PageUp\",\n exec: function(editor) { editor.selectPageUp(); },\n readOnly: true\n}, {\n name: \"pageup\",\n bindKey: bindKey(null, \"Option-PageUp\"),\n exec: function(editor) { editor.scrollPageUp(); },\n readOnly: true\n}, {\n name: \"gotopageup\",\n bindKey: \"PageUp\",\n exec: function(editor) { editor.gotoPageUp(); },\n readOnly: true\n}, {\n name: \"scrollup\",\n bindKey: bindKey(\"Ctrl-Up\", null),\n exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"scrolldown\",\n bindKey: bindKey(\"Ctrl-Down\", null),\n exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"selectlinestart\",\n bindKey: \"Shift-Home\",\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectlineend\",\n bindKey: \"Shift-End\",\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"togglerecording\",\n bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n exec: function(editor) { editor.commands.toggleRecording(editor); },\n readOnly: true\n}, {\n name: \"replaymacro\",\n bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n exec: function(editor) { editor.commands.replay(editor); },\n readOnly: true\n}, {\n name: \"jumptomatching\",\n bindKey: bindKey(\"Ctrl-P\", \"Ctrl-P\"),\n exec: function(editor) { editor.jumpToMatching(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selecttomatching\",\n bindKey: bindKey(\"Ctrl-Shift-P\", \"Ctrl-Shift-P\"),\n exec: function(editor) { editor.jumpToMatching(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"expandToMatching\",\n bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n exec: function(editor) { editor.jumpToMatching(true, true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"passKeysToBrowser\",\n bindKey: bindKey(null, null),\n exec: function() {},\n passEvent: true,\n readOnly: true\n}, {\n name: \"copy\",\n exec: function(editor) {\n },\n readOnly: true\n},\n{\n name: \"cut\",\n exec: function(editor) {\n var range = editor.getSelectionRange();\n editor._emit(\"cut\", range);\n\n if (!editor.selection.isEmpty()) {\n editor.session.remove(range);\n editor.clearSelection();\n }\n },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"paste\",\n exec: function(editor, args) {\n editor.$handlePaste(args);\n },\n scrollIntoView: \"cursor\"\n}, {\n name: \"removeline\",\n bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n exec: function(editor) { editor.removeLines(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"duplicateSelection\",\n bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n exec: function(editor) { editor.duplicateSelection(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"sortlines\",\n bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n exec: function(editor) { editor.sortLines(); },\n scrollIntoView: \"selection\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"togglecomment\",\n bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n exec: function(editor) { editor.toggleCommentLines(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"toggleBlockComment\",\n bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n exec: function(editor) { editor.toggleBlockComment(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"modifyNumberUp\",\n bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n exec: function(editor) { editor.modifyNumber(1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"modifyNumberDown\",\n bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n exec: function(editor) { editor.modifyNumber(-1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"replace\",\n bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true);});\n }\n}, {\n name: \"undo\",\n bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n exec: function(editor) { editor.undo(); }\n}, {\n name: \"redo\",\n bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n exec: function(editor) { editor.redo(); }\n}, {\n name: \"copylinesup\",\n bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n exec: function(editor) { editor.copyLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesup\",\n bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n exec: function(editor) { editor.moveLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"copylinesdown\",\n bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n exec: function(editor) { editor.copyLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesdown\",\n bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n exec: function(editor) { editor.moveLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"del\",\n bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n exec: function(editor) { editor.remove(\"right\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"backspace\",\n bindKey: bindKey(\n \"Shift-Backspace|Backspace\",\n \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n ),\n exec: function(editor) { editor.remove(\"left\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"cut_or_delete\",\n bindKey: bindKey(\"Shift-Delete\", null),\n exec: function(editor) { \n if (editor.selection.isEmpty()) {\n editor.remove(\"left\");\n } else {\n return false;\n }\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestart\",\n bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n exec: function(editor) { editor.removeToLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineend\",\n bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K|Command-Delete\"),\n exec: function(editor) { editor.removeToLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestarthard\",\n bindKey: bindKey(\"Ctrl-Shift-Backspace\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.start.column = 0;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineendhard\",\n bindKey: bindKey(\"Ctrl-Shift-Delete\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.end.column = Number.MAX_VALUE;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordleft\",\n bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n exec: function(editor) { editor.removeWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordright\",\n bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n exec: function(editor) { editor.removeWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"outdent\",\n bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"indent\",\n bindKey: bindKey(\"Tab\", \"Tab\"),\n exec: function(editor) { editor.indent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockoutdent\",\n bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockindent\",\n bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n exec: function(editor) { editor.blockIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"insertstring\",\n exec: function(editor, str) { editor.insert(str); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"inserttext\",\n exec: function(editor, args) {\n editor.insert(lang.stringRepeat(args.text || \"\", args.times || 1));\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"splitline\",\n bindKey: bindKey(null, \"Ctrl-O\"),\n exec: function(editor) { editor.splitLine(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"transposeletters\",\n bindKey: bindKey(\"Alt-Shift-X\", \"Ctrl-T\"),\n exec: function(editor) { editor.transposeLetters(); },\n multiSelectAction: function(editor) {editor.transposeSelections(1); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"touppercase\",\n bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n exec: function(editor) { editor.toUpperCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"tolowercase\",\n bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n exec: function(editor) { editor.toLowerCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"expandtoline\",\n bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n exec: function(editor) {\n var range = editor.selection.getRange();\n\n range.start.column = range.end.column = 0;\n range.end.row++;\n editor.selection.setRange(range, false);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"joinlines\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var isBackwards = editor.selection.isBackwards();\n var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\n var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\n var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\n var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\n var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n var insertLine = editor.session.doc.getLine(selectionStart.row);\n\n for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\n if (curLine.length !== 0) {\n curLine = \" \" + curLine;\n }\n insertLine += curLine;\n }\n\n if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\n insertLine += editor.session.doc.getNewLineCharacter();\n }\n\n editor.clearSelection();\n editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\n\n if (selectedCount > 0) {\n editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\n editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\n } else {\n firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\n editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n }\n },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, {\n name: \"invertSelection\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var endRow = editor.session.doc.getLength() - 1;\n var endCol = editor.session.doc.getLine(endRow).length;\n var ranges = editor.selection.rangeList.ranges;\n var newRanges = [];\n if (ranges.length < 1) {\n ranges = [editor.selection.getRange()];\n }\n\n for (var i = 0; i < ranges.length; i++) {\n if (i == (ranges.length - 1)) {\n if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\n newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\n }\n }\n\n if (i === 0) {\n if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\n }\n } else {\n newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\n }\n }\n\n editor.exitMultiSelectMode();\n editor.clearSelection();\n\n for(var i = 0; i < newRanges.length; i++) {\n editor.selection.addRange(newRanges[i], false);\n }\n },\n readOnly: true,\n scrollIntoView: \"none\"\n}];\n\n});\n\nace.define(\"ace/editor\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/keyboard/textinput\",\"ace/mouse/mouse_handler\",\"ace/mouse/fold_handler\",\"ace/keyboard/keybinding\",\"ace/edit_session\",\"ace/search\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/commands/command_manager\",\"ace/commands/default_commands\",\"ace/config\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar lang = acequire(\"./lib/lang\");\nvar useragent = acequire(\"./lib/useragent\");\nvar TextInput = acequire(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = acequire(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = acequire(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = acequire(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar Search = acequire(\"./search\").Search;\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = acequire(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = acequire(\"./commands/default_commands\").commands;\nvar config = acequire(\"./config\");\nvar TokenIterator = acequire(\"./token_iterator\").TokenIterator;\nvar Editor = function(renderer, session) {\n var container = renderer.getContainerElement();\n this.container = container;\n this.renderer = renderer;\n this.id = \"editor\" + (++Editor.$uid);\n\n this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n if (typeof document == \"object\") {\n this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n this.renderer.textarea = this.textInput.getElement();\n this.$mouseHandler = new MouseHandler(this);\n new FoldHandler(this);\n }\n\n this.keyBinding = new KeyBinding(this);\n\n this.$blockScrolling = 0;\n this.$search = new Search().set({\n wrap: true\n });\n\n this.$historyTracker = this.$historyTracker.bind(this);\n this.commands.on(\"exec\", this.$historyTracker);\n\n this.$initOperationListeners();\n \n this._$emitInputEvent = lang.delayedCall(function() {\n this._signal(\"input\", {});\n if (this.session && this.session.bgTokenizer)\n this.session.bgTokenizer.scheduleStart();\n }.bind(this));\n \n this.on(\"change\", function(_, _self) {\n _self._$emitInputEvent.schedule(31);\n });\n\n this.setSession(session || new EditSession(\"\"));\n config.resetOptions(this);\n config._signal(\"editor\", this);\n};\n\nEditor.$uid = 0;\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$initOperationListeners = function() {\n function last(a) {return a[a.length - 1];}\n\n this.selections = [];\n this.commands.on(\"exec\", this.startOperation.bind(this), true);\n this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n\n this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\n\n this.on(\"change\", function() {\n this.curOp || this.startOperation();\n this.curOp.docChanged = true;\n }.bind(this), true);\n\n this.on(\"changeSelection\", function() {\n this.curOp || this.startOperation();\n this.curOp.selectionChanged = true;\n }.bind(this), true);\n };\n\n this.curOp = null;\n this.prevOp = {};\n this.startOperation = function(commadEvent) {\n if (this.curOp) {\n if (!commadEvent || this.curOp.command)\n return;\n this.prevOp = this.curOp;\n }\n if (!commadEvent) {\n this.previousCommand = null;\n commadEvent = {};\n }\n\n this.$opResetTimer.schedule();\n this.curOp = {\n command: commadEvent.command || {},\n args: commadEvent.args,\n scrollTop: this.renderer.scrollTop\n };\n if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)\n this.$blockScrolling++;\n };\n\n this.endOperation = function(e) {\n if (this.curOp) {\n if (e && e.returnValue === false)\n return this.curOp = null;\n this._signal(\"beforeEndOperation\");\n var command = this.curOp.command;\n if (command.name && this.$blockScrolling > 0)\n this.$blockScrolling--;\n var scrollIntoView = command && command.scrollIntoView;\n if (scrollIntoView) {\n switch (scrollIntoView) {\n case \"center-animate\":\n scrollIntoView = \"animate\";\n case \"center\":\n this.renderer.scrollCursorIntoView(null, 0.5);\n break;\n case \"animate\":\n case \"cursor\":\n this.renderer.scrollCursorIntoView();\n break;\n case \"selectionPart\":\n var range = this.selection.getRange();\n var config = this.renderer.layerConfig;\n if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {\n this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);\n }\n break;\n default:\n break;\n }\n if (scrollIntoView == \"animate\")\n this.renderer.animateScrolling(this.curOp.scrollTop);\n }\n \n this.prevOp = this.curOp;\n this.curOp = null;\n }\n };\n this.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n this.$historyTracker = function(e) {\n if (!this.$mergeUndoDeltas)\n return;\n\n var prev = this.prevOp;\n var mergeableCommands = this.$mergeableCommands;\n var shouldMerge = prev.command && (e.command.name == prev.command.name);\n if (e.command.name == \"insertstring\") {\n var text = e.args;\n if (this.mergeNextCommand === undefined)\n this.mergeNextCommand = true;\n\n shouldMerge = shouldMerge\n && this.mergeNextCommand // previous command allows to coalesce with\n && (!/\\s/.test(text) || /\\s/.test(prev.args)); // previous insertion was of same type\n\n this.mergeNextCommand = true;\n } else {\n shouldMerge = shouldMerge\n && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n }\n\n if (\n this.$mergeUndoDeltas != \"always\"\n && Date.now() - this.sequenceStartTime > 2000\n ) {\n shouldMerge = false; // the sequence is too long\n }\n\n if (shouldMerge)\n this.session.mergeUndoDeltas = true;\n else if (mergeableCommands.indexOf(e.command.name) !== -1)\n this.sequenceStartTime = Date.now();\n };\n this.setKeyboardHandler = function(keyboardHandler, cb) {\n if (keyboardHandler && typeof keyboardHandler === \"string\") {\n this.$keybindingId = keyboardHandler;\n var _self = this;\n config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n if (_self.$keybindingId == keyboardHandler)\n _self.keyBinding.setKeyboardHandler(module && module.handler);\n cb && cb();\n });\n } else {\n this.$keybindingId = null;\n this.keyBinding.setKeyboardHandler(keyboardHandler);\n cb && cb();\n }\n };\n this.getKeyboardHandler = function() {\n return this.keyBinding.getKeyboardHandler();\n };\n this.setSession = function(session) {\n if (this.session == session)\n return;\n if (this.curOp) this.endOperation();\n this.curOp = {};\n\n var oldSession = this.session;\n if (oldSession) {\n this.session.off(\"change\", this.$onDocumentChange);\n this.session.off(\"changeMode\", this.$onChangeMode);\n this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n this.session.off(\"changeFold\", this.$onChangeFold);\n this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n this.session.off(\"changeOverwrite\", this.$onCursorChange);\n this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n var selection = this.session.getSelection();\n selection.off(\"changeCursor\", this.$onCursorChange);\n selection.off(\"changeSelection\", this.$onSelectionChange);\n }\n\n this.session = session;\n if (session) {\n this.$onDocumentChange = this.onDocumentChange.bind(this);\n session.on(\"change\", this.$onDocumentChange);\n this.renderer.setSession(session);\n \n this.$onChangeMode = this.onChangeMode.bind(this);\n session.on(\"changeMode\", this.$onChangeMode);\n \n this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n \n this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n session.on(\"changeTabSize\", this.$onChangeTabSize);\n \n this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n \n this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n \n this.$onChangeFold = this.onChangeFold.bind(this);\n session.on(\"changeFold\", this.$onChangeFold);\n \n this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n \n this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n \n this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n \n this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n \n this.$onCursorChange = this.onCursorChange.bind(this);\n this.session.on(\"changeOverwrite\", this.$onCursorChange);\n \n this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n \n this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n \n this.selection = session.getSelection();\n this.selection.on(\"changeCursor\", this.$onCursorChange);\n \n this.$onSelectionChange = this.onSelectionChange.bind(this);\n this.selection.on(\"changeSelection\", this.$onSelectionChange);\n \n this.onChangeMode();\n \n this.$blockScrolling += 1;\n this.onCursorChange();\n this.$blockScrolling -= 1;\n \n this.onScrollTopChange();\n this.onScrollLeftChange();\n this.onSelectionChange();\n this.onChangeFrontMarker();\n this.onChangeBackMarker();\n this.onChangeBreakpoint();\n this.onChangeAnnotation();\n this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n this.renderer.updateFull();\n } else {\n this.selection = null;\n this.renderer.setSession(session);\n }\n\n this._signal(\"changeSession\", {\n session: session,\n oldSession: oldSession\n });\n \n this.curOp = null;\n \n oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n session && session._signal(\"changeEditor\", {editor: this});\n\n if (session && session.bgTokenizer)\n session.bgTokenizer.scheduleStart();\n };\n this.getSession = function() {\n return this.session;\n };\n this.setValue = function(val, cursorPos) {\n this.session.doc.setValue(val);\n\n if (!cursorPos)\n this.selectAll();\n else if (cursorPos == 1)\n this.navigateFileEnd();\n else if (cursorPos == -1)\n this.navigateFileStart();\n\n return val;\n };\n this.getValue = function() {\n return this.session.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.resize = function(force) {\n this.renderer.onResize(force);\n };\n this.setTheme = function(theme, cb) {\n this.renderer.setTheme(theme, cb);\n };\n this.getTheme = function() {\n return this.renderer.getTheme();\n };\n this.setStyle = function(style) {\n this.renderer.setStyle(style);\n };\n this.unsetStyle = function(style) {\n this.renderer.unsetStyle(style);\n };\n this.getFontSize = function () {\n return this.getOption(\"fontSize\") ||\n dom.computedStyle(this.container, \"fontSize\");\n };\n this.setFontSize = function(size) {\n this.setOption(\"fontSize\", size);\n };\n\n this.$highlightBrackets = function() {\n if (this.session.$bracketHighlight) {\n this.session.removeMarker(this.session.$bracketHighlight);\n this.session.$bracketHighlight = null;\n }\n\n if (this.$highlightPending) {\n return;\n }\n var self = this;\n this.$highlightPending = true;\n setTimeout(function() {\n self.$highlightPending = false;\n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n var pos = session.findMatchingBracket(self.getCursorPosition());\n if (pos) {\n var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);\n } else if (session.$mode.getMatching) {\n var range = session.$mode.getMatching(self.session);\n }\n if (range)\n session.$bracketHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n }, 50);\n };\n this.$highlightTags = function() {\n if (this.$highlightTagPending)\n return;\n var self = this;\n this.$highlightTagPending = true;\n setTimeout(function() {\n self.$highlightTagPending = false;\n \n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n \n var pos = self.getCursorPosition();\n var iterator = new TokenIterator(self.session, pos.row, pos.column);\n var token = iterator.getCurrentToken();\n \n if (!token || !/\\b(?:tag-open|tag-name)/.test(token.type)) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n return;\n }\n \n if (token.type.indexOf(\"tag-open\") != -1) {\n token = iterator.stepForward();\n if (!token)\n return;\n }\n \n var tag = token.value;\n var depth = 0;\n var prevToken = iterator.stepBackward();\n \n if (prevToken.value == '<'){\n do {\n prevToken = token;\n token = iterator.stepForward();\n \n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n if (prevToken.value === '<'){\n depth++;\n } else if (prevToken.value === '= 0);\n } else {\n do {\n token = prevToken;\n prevToken = iterator.stepBackward();\n \n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === ' 1))\n highlight = false;\n }\n\n if (session.$highlightLineMarker && !highlight) {\n session.removeMarker(session.$highlightLineMarker.id);\n session.$highlightLineMarker = null;\n } else if (!session.$highlightLineMarker && highlight) {\n var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n session.$highlightLineMarker = range;\n } else if (highlight) {\n session.$highlightLineMarker.start.row = highlight.row;\n session.$highlightLineMarker.end.row = highlight.row;\n session.$highlightLineMarker.start.column = highlight.column;\n session._signal(\"changeBackMarker\");\n }\n };\n\n this.onSelectionChange = function(e) {\n var session = this.session;\n\n if (session.$selectionMarker) {\n session.removeMarker(session.$selectionMarker);\n }\n session.$selectionMarker = null;\n\n if (!this.selection.isEmpty()) {\n var range = this.selection.getRange();\n var style = this.getSelectionStyle();\n session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n } else {\n this.$updateHighlightActiveLine();\n }\n\n var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n this.session.highlight(re);\n\n this._signal(\"changeSelection\");\n };\n\n this.$getSelectionHighLightRegexp = function() {\n var session = this.session;\n\n var selection = this.getSelectionRange();\n if (selection.isEmpty() || selection.isMultiLine())\n return;\n\n var startOuter = selection.start.column - 1;\n var endOuter = selection.end.column + 1;\n var line = session.getLine(selection.start.row);\n var lineCols = line.length;\n var needle = line.substring(Math.max(startOuter, 0),\n Math.min(endOuter, lineCols));\n if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n return;\n\n needle = line.substring(selection.start.column, selection.end.column);\n if (!/^[\\w\\d]+$/.test(needle))\n return;\n\n var re = this.$search.$assembleRegExp({\n wholeWord: true,\n caseSensitive: true,\n needle: needle\n });\n\n return re;\n };\n\n\n this.onChangeFrontMarker = function() {\n this.renderer.updateFrontMarkers();\n };\n\n this.onChangeBackMarker = function() {\n this.renderer.updateBackMarkers();\n };\n\n\n this.onChangeBreakpoint = function() {\n this.renderer.updateBreakpoints();\n };\n\n this.onChangeAnnotation = function() {\n this.renderer.setAnnotations(this.session.getAnnotations());\n };\n\n\n this.onChangeMode = function(e) {\n this.renderer.updateText();\n this._emit(\"changeMode\", e);\n };\n\n\n this.onChangeWrapLimit = function() {\n this.renderer.updateFull();\n };\n\n this.onChangeWrapMode = function() {\n this.renderer.onResize(true);\n };\n\n\n this.onChangeFold = function() {\n this.$updateHighlightActiveLine();\n this.renderer.updateFull();\n };\n this.getSelectedText = function() {\n return this.session.getTextRange(this.getSelectionRange());\n };\n this.getCopyText = function() {\n var text = this.getSelectedText();\n this._signal(\"copy\", text);\n return text;\n };\n this.onCopy = function() {\n this.commands.exec(\"copy\", this);\n };\n this.onCut = function() {\n this.commands.exec(\"cut\", this);\n };\n this.onPaste = function(text, event) {\n var e = {text: text, event: event};\n this.commands.exec(\"paste\", this, e);\n };\n \n this.$handlePaste = function(e) {\n if (typeof e == \"string\") \n e = {text: e};\n this._signal(\"paste\", e);\n var text = e.text;\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n this.insert(text);\n } else {\n var lines = text.split(/\\r\\n|\\r|\\n/);\n var ranges = this.selection.rangeList.ranges;\n \n if (lines.length > ranges.length || lines.length < 2 || !lines[1])\n return this.commands.exec(\"insertstring\", this, text);\n \n for (var i = ranges.length; i--;) {\n var range = ranges[i];\n if (!range.isEmpty())\n this.session.remove(range);\n \n this.session.insert(range.start, lines[i]);\n }\n }\n };\n\n this.execCommand = function(command, args) {\n return this.commands.exec(command, this, args);\n };\n this.insert = function(text, pasted) {\n var session = this.session;\n var mode = session.getMode();\n var cursor = this.getCursorPosition();\n\n if (this.getBehavioursEnabled() && !pasted) {\n var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n if (transform) {\n if (text !== transform.text) {\n this.session.mergeUndoDeltas = false;\n this.$mergeNextCommand = false;\n }\n text = transform.text;\n\n }\n }\n \n if (text == \"\\t\")\n text = this.session.getTabString();\n if (!this.selection.isEmpty()) {\n var range = this.getSelectionRange();\n cursor = this.session.remove(range);\n this.clearSelection();\n }\n else if (this.session.getOverwrite() && text.indexOf(\"\\n\") == -1) {\n var range = new Range.fromPoints(cursor, cursor);\n range.end.column += text.length;\n this.session.remove(range);\n }\n\n if (text == \"\\n\" || text == \"\\r\\n\") {\n var line = session.getLine(cursor.row);\n if (cursor.column > line.search(/\\S|$/)) {\n var d = line.substr(cursor.column).search(/\\S|$/);\n session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n }\n }\n this.clearSelection();\n\n var start = cursor.column;\n var lineState = session.getState(cursor.row);\n var line = session.getLine(cursor.row);\n var shouldOutdent = mode.checkOutdent(lineState, line, text);\n var end = session.insert(cursor, text);\n\n if (transform && transform.selection) {\n if (transform.selection.length == 2) { // Transform relative to the current column\n this.selection.setSelectionRange(\n new Range(cursor.row, start + transform.selection[0],\n cursor.row, start + transform.selection[1]));\n } else { // Transform relative to the current row.\n this.selection.setSelectionRange(\n new Range(cursor.row + transform.selection[0],\n transform.selection[1],\n cursor.row + transform.selection[2],\n transform.selection[3]));\n }\n }\n\n if (session.getDocument().isNewLine(text)) {\n var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n session.insert({row: cursor.row+1, column: 0}, lineIndent);\n }\n if (shouldOutdent)\n mode.autoOutdent(lineState, session, cursor.row);\n };\n\n this.onTextInput = function(text) {\n this.keyBinding.onTextInput(text);\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n this.keyBinding.onCommandKey(e, hashId, keyCode);\n };\n this.setOverwrite = function(overwrite) {\n this.session.setOverwrite(overwrite);\n };\n this.getOverwrite = function() {\n return this.session.getOverwrite();\n };\n this.toggleOverwrite = function() {\n this.session.toggleOverwrite();\n };\n this.setScrollSpeed = function(speed) {\n this.setOption(\"scrollSpeed\", speed);\n };\n this.getScrollSpeed = function() {\n return this.getOption(\"scrollSpeed\");\n };\n this.setDragDelay = function(dragDelay) {\n this.setOption(\"dragDelay\", dragDelay);\n };\n this.getDragDelay = function() {\n return this.getOption(\"dragDelay\");\n };\n this.setSelectionStyle = function(val) {\n this.setOption(\"selectionStyle\", val);\n };\n this.getSelectionStyle = function() {\n return this.getOption(\"selectionStyle\");\n };\n this.setHighlightActiveLine = function(shouldHighlight) {\n this.setOption(\"highlightActiveLine\", shouldHighlight);\n };\n this.getHighlightActiveLine = function() {\n return this.getOption(\"highlightActiveLine\");\n };\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n this.setHighlightSelectedWord = function(shouldHighlight) {\n this.setOption(\"highlightSelectedWord\", shouldHighlight);\n };\n this.getHighlightSelectedWord = function() {\n return this.$highlightSelectedWord;\n };\n\n this.setAnimatedScroll = function(shouldAnimate){\n this.renderer.setAnimatedScroll(shouldAnimate);\n };\n\n this.getAnimatedScroll = function(){\n return this.renderer.getAnimatedScroll();\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.renderer.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.renderer.getShowInvisibles();\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.renderer.setDisplayIndentGuides(display);\n };\n\n this.getDisplayIndentGuides = function() {\n return this.renderer.getDisplayIndentGuides();\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.renderer.setShowPrintMargin(showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.renderer.getShowPrintMargin();\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.renderer.setPrintMarginColumn(showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.renderer.getPrintMarginColumn();\n };\n this.setReadOnly = function(readOnly) {\n this.setOption(\"readOnly\", readOnly);\n };\n this.getReadOnly = function() {\n return this.getOption(\"readOnly\");\n };\n this.setBehavioursEnabled = function (enabled) {\n this.setOption(\"behavioursEnabled\", enabled);\n };\n this.getBehavioursEnabled = function () {\n return this.getOption(\"behavioursEnabled\");\n };\n this.setWrapBehavioursEnabled = function (enabled) {\n this.setOption(\"wrapBehavioursEnabled\", enabled);\n };\n this.getWrapBehavioursEnabled = function () {\n return this.getOption(\"wrapBehavioursEnabled\");\n };\n this.setShowFoldWidgets = function(show) {\n this.setOption(\"showFoldWidgets\", show);\n\n };\n this.getShowFoldWidgets = function() {\n return this.getOption(\"showFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(fade) {\n this.setOption(\"fadeFoldWidgets\", fade);\n };\n\n this.getFadeFoldWidgets = function() {\n return this.getOption(\"fadeFoldWidgets\");\n };\n this.remove = function(dir) {\n if (this.selection.isEmpty()){\n if (dir == \"left\")\n this.selection.selectLeft();\n else\n this.selection.selectRight();\n }\n\n var range = this.getSelectionRange();\n if (this.getBehavioursEnabled()) {\n var session = this.session;\n var state = session.getState(range.start.row);\n var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n if (range.end.column === 0) {\n var text = session.getTextRange(range);\n if (text[text.length - 1] == \"\\n\") {\n var line = session.getLine(range.end.row);\n if (/^\\s+$/.test(line)) {\n range.end.column = line.length;\n }\n }\n }\n if (new_range)\n range = new_range;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.removeWordRight = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordRight();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeWordLeft = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordLeft();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineStart = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineStart();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineEnd = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineEnd();\n\n var range = this.getSelectionRange();\n if (range.start.column == range.end.column && range.start.row == range.end.row) {\n range.end.column = 0;\n range.end.row++;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.splitLine = function() {\n if (!this.selection.isEmpty()) {\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n }\n\n var cursor = this.getCursorPosition();\n this.insert(\"\\n\");\n this.moveCursorToPosition(cursor);\n };\n this.transposeLetters = function() {\n if (!this.selection.isEmpty()) {\n return;\n }\n\n var cursor = this.getCursorPosition();\n var column = cursor.column;\n if (column === 0)\n return;\n\n var line = this.session.getLine(cursor.row);\n var swap, range;\n if (column < line.length) {\n swap = line.charAt(column) + line.charAt(column-1);\n range = new Range(cursor.row, column-1, cursor.row, column+1);\n }\n else {\n swap = line.charAt(column-1) + line.charAt(column-2);\n range = new Range(cursor.row, column-2, cursor.row, column);\n }\n this.session.replace(range, swap);\n this.session.selection.moveToPosition(range.end);\n };\n this.toLowerCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toLowerCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.toUpperCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toUpperCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.indent = function() {\n var session = this.session;\n var range = this.getSelectionRange();\n\n if (range.start.row < range.end.row) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n } else if (range.start.column < range.end.column) {\n var text = session.getTextRange(range);\n if (!/^\\s+$/.test(text)) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n }\n }\n \n var line = session.getLine(range.start.row);\n var position = range.start;\n var size = session.getTabSize();\n var column = session.documentToScreenColumn(position.row, position.column);\n\n if (this.session.getUseSoftTabs()) {\n var count = (size - column % size);\n var indentString = lang.stringRepeat(\" \", count);\n } else {\n var count = column % size;\n while (line[range.start.column - 1] == \" \" && count) {\n range.start.column--;\n count--;\n }\n this.selection.setSelectionRange(range);\n indentString = \"\\t\";\n }\n return this.insert(indentString);\n };\n this.blockIndent = function() {\n var rows = this.$getSelectedRows();\n this.session.indentRows(rows.first, rows.last, \"\\t\");\n };\n this.blockOutdent = function() {\n var selection = this.session.getSelection();\n this.session.outdentRows(selection.getRange());\n };\n this.sortLines = function() {\n var rows = this.$getSelectedRows();\n var session = this.session;\n\n var lines = [];\n for (var i = rows.first; i <= rows.last; i++)\n lines.push(session.getLine(i));\n\n lines.sort(function(a, b) {\n if (a.toLowerCase() < b.toLowerCase()) return -1;\n if (a.toLowerCase() > b.toLowerCase()) return 1;\n return 0;\n });\n\n var deleteRange = new Range(0, 0, 0, 0);\n for (var i = rows.first; i <= rows.last; i++) {\n var line = session.getLine(i);\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n deleteRange.end.column = line.length;\n session.replace(deleteRange, lines[i-rows.first]);\n }\n };\n this.toggleCommentLines = function() {\n var state = this.session.getState(this.getCursorPosition().row);\n var rows = this.$getSelectedRows();\n this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n };\n\n this.toggleBlockComment = function() {\n var cursor = this.getCursorPosition();\n var state = this.session.getState(cursor.row);\n var range = this.getSelectionRange();\n this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n };\n this.getNumberAt = function(row, column) {\n var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n _numberRx.lastIndex = 0;\n\n var s = this.session.getLine(row);\n while (_numberRx.lastIndex < column) {\n var m = _numberRx.exec(s);\n if(m.index <= column && m.index+m[0].length >= column){\n var number = {\n value: m[0],\n start: m.index,\n end: m.index+m[0].length\n };\n return number;\n }\n }\n return null;\n };\n this.modifyNumber = function(amount) {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n var charRange = new Range(row, column-1, row, column);\n\n var c = this.session.getTextRange(charRange);\n if (!isNaN(parseFloat(c)) && isFinite(c)) {\n var nr = this.getNumberAt(row, column);\n if (nr) {\n var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n var decimals = nr.start + nr.value.length - fp;\n\n var t = parseFloat(nr.value);\n t *= Math.pow(10, decimals);\n\n\n if(fp !== nr.end && column < fp){\n amount *= Math.pow(10, nr.end - column - 1);\n } else {\n amount *= Math.pow(10, nr.end - column);\n }\n\n t += amount;\n t /= Math.pow(10, decimals);\n var nnr = t.toFixed(decimals);\n var replaceRange = new Range(row, nr.start, row, nr.end);\n this.session.replace(replaceRange, nnr);\n this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\n }\n }\n };\n this.removeLines = function() {\n var rows = this.$getSelectedRows();\n this.session.removeFullLines(rows.first, rows.last);\n this.clearSelection();\n };\n\n this.duplicateSelection = function() {\n var sel = this.selection;\n var doc = this.session;\n var range = sel.getRange();\n var reverse = sel.isBackwards();\n if (range.isEmpty()) {\n var row = range.start.row;\n doc.duplicateLines(row, row);\n } else {\n var point = reverse ? range.start : range.end;\n var endPoint = doc.insert(point, doc.getTextRange(range), false);\n range.start = point;\n range.end = endPoint;\n\n sel.setSelectionRange(range, reverse);\n }\n };\n this.moveLinesDown = function() {\n this.$moveLines(1, false);\n };\n this.moveLinesUp = function() {\n this.$moveLines(-1, false);\n };\n this.moveText = function(range, toPosition, copy) {\n return this.session.moveText(range, toPosition, copy);\n };\n this.copyLinesUp = function() {\n this.$moveLines(-1, true);\n };\n this.copyLinesDown = function() {\n this.$moveLines(1, true);\n };\n this.$moveLines = function(dir, copy) {\n var rows, moved;\n var selection = this.selection;\n if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n var range = selection.toOrientedRange();\n rows = this.$getSelectedRows(range);\n moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n if (copy && dir == -1) moved = 0;\n range.moveBy(moved, 0);\n selection.fromOrientedRange(range);\n } else {\n var ranges = selection.rangeList.ranges;\n selection.rangeList.detach(this.session);\n this.inVirtualSelectionMode = true;\n \n var diff = 0;\n var totalDiff = 0;\n var l = ranges.length;\n for (var i = 0; i < l; i++) {\n var rangeIndex = i;\n ranges[i].moveBy(diff, 0);\n rows = this.$getSelectedRows(ranges[i]);\n var first = rows.first;\n var last = rows.last;\n while (++i < l) {\n if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n var subRows = this.$getSelectedRows(ranges[i]);\n if (copy && subRows.first != last)\n break;\n else if (!copy && subRows.first > last + 1)\n break;\n last = subRows.last;\n }\n i--;\n diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n if (copy && dir == -1) rangeIndex = i + 1;\n while (rangeIndex <= i) {\n ranges[rangeIndex].moveBy(diff, 0);\n rangeIndex++;\n }\n if (!copy) diff = 0;\n totalDiff += diff;\n }\n \n selection.fromOrientedRange(selection.ranges[0]);\n selection.rangeList.attach(this.session);\n this.inVirtualSelectionMode = false;\n }\n };\n this.$getSelectedRows = function(range) {\n range = (range || this.getSelectionRange()).collapseRows();\n\n return {\n first: this.session.getRowFoldStart(range.start.row),\n last: this.session.getRowFoldEnd(range.end.row)\n };\n };\n\n this.onCompositionStart = function(text) {\n this.renderer.showComposition(this.getCursorPosition());\n };\n\n this.onCompositionUpdate = function(text) {\n this.renderer.setCompositionText(text);\n };\n\n this.onCompositionEnd = function() {\n this.renderer.hideComposition();\n };\n this.getFirstVisibleRow = function() {\n return this.renderer.getFirstVisibleRow();\n };\n this.getLastVisibleRow = function() {\n return this.renderer.getLastVisibleRow();\n };\n this.isRowVisible = function(row) {\n return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n };\n this.isRowFullyVisible = function(row) {\n return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n };\n this.$getVisibleRowCount = function() {\n return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n };\n\n this.$moveByPage = function(dir, select) {\n var renderer = this.renderer;\n var config = this.renderer.layerConfig;\n var rows = dir * Math.floor(config.height / config.lineHeight);\n\n this.$blockScrolling++;\n if (select === true) {\n this.selection.$moveSelection(function(){\n this.moveCursorBy(rows, 0);\n });\n } else if (select === false) {\n this.selection.moveCursorBy(rows, 0);\n this.selection.clearSelection();\n }\n this.$blockScrolling--;\n\n var scrollTop = renderer.scrollTop;\n\n renderer.scrollBy(0, rows * config.lineHeight);\n if (select != null)\n renderer.scrollCursorIntoView(null, 0.5);\n\n renderer.animateScrolling(scrollTop);\n };\n this.selectPageDown = function() {\n this.$moveByPage(1, true);\n };\n this.selectPageUp = function() {\n this.$moveByPage(-1, true);\n };\n this.gotoPageDown = function() {\n this.$moveByPage(1, false);\n };\n this.gotoPageUp = function() {\n this.$moveByPage(-1, false);\n };\n this.scrollPageDown = function() {\n this.$moveByPage(1);\n };\n this.scrollPageUp = function() {\n this.$moveByPage(-1);\n };\n this.scrollToRow = function(row) {\n this.renderer.scrollToRow(row);\n };\n this.scrollToLine = function(line, center, animate, callback) {\n this.renderer.scrollToLine(line, center, animate, callback);\n };\n this.centerSelection = function() {\n var range = this.getSelectionRange();\n var pos = {\n row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n };\n this.renderer.alignCursor(pos, 0.5);\n };\n this.getCursorPosition = function() {\n return this.selection.getCursor();\n };\n this.getCursorPositionScreen = function() {\n return this.session.documentToScreenPosition(this.getCursorPosition());\n };\n this.getSelectionRange = function() {\n return this.selection.getRange();\n };\n this.selectAll = function() {\n this.$blockScrolling += 1;\n this.selection.selectAll();\n this.$blockScrolling -= 1;\n };\n this.clearSelection = function() {\n this.selection.clearSelection();\n };\n this.moveCursorTo = function(row, column) {\n this.selection.moveCursorTo(row, column);\n };\n this.moveCursorToPosition = function(pos) {\n this.selection.moveCursorToPosition(pos);\n };\n this.jumpToMatching = function(select, expand) {\n var cursor = this.getCursorPosition();\n var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n var prevToken = iterator.getCurrentToken();\n var token = prevToken || iterator.stepForward();\n\n if (!token) return;\n var matchType;\n var found = false;\n var depth = {};\n var i = cursor.column - token.start;\n var bracketType;\n var brackets = {\n \")\": \"(\",\n \"(\": \"(\",\n \"]\": \"[\",\n \"[\": \"[\",\n \"{\": \"{\",\n \"}\": \"{\"\n };\n \n do {\n if (token.value.match(/[{}()\\[\\]]/g)) {\n for (; i < token.value.length && !found; i++) {\n if (!brackets[token.value[i]]) {\n continue;\n }\n\n bracketType = brackets[token.value[i]] + '.' + token.type.replace(\"rparen\", \"lparen\");\n\n if (isNaN(depth[bracketType])) {\n depth[bracketType] = 0;\n }\n\n switch (token.value[i]) {\n case '(':\n case '[':\n case '{':\n depth[bracketType]++;\n break;\n case ')':\n case ']':\n case '}':\n depth[bracketType]--;\n\n if (depth[bracketType] === -1) {\n matchType = 'bracket';\n found = true;\n }\n break;\n }\n }\n }\n else if (token && token.type.indexOf('tag-name') !== -1) {\n if (isNaN(depth[token.value])) {\n depth[token.value] = 0;\n }\n \n if (prevToken.value === '<') {\n depth[token.value]++;\n }\n else if (prevToken.value === '= 0; --i) {\n if(this.$tryReplace(ranges[i], replacement)) {\n replaced++;\n }\n }\n\n this.selection.setSelectionRange(selection);\n this.$blockScrolling -= 1;\n\n return replaced;\n };\n\n this.$tryReplace = function(range, replacement) {\n var input = this.session.getTextRange(range);\n replacement = this.$search.replace(input, replacement);\n if (replacement !== null) {\n range.end = this.session.replace(range, replacement);\n return range;\n } else {\n return null;\n }\n };\n this.getLastSearchOptions = function() {\n return this.$search.getOptions();\n };\n this.find = function(needle, options, animate) {\n if (!options)\n options = {};\n\n if (typeof needle == \"string\" || needle instanceof RegExp)\n options.needle = needle;\n else if (typeof needle == \"object\")\n oop.mixin(options, needle);\n\n var range = this.selection.getRange();\n if (options.needle == null) {\n needle = this.session.getTextRange(range)\n || this.$search.$options.needle;\n if (!needle) {\n range = this.session.getWordRange(range.start.row, range.start.column);\n needle = this.session.getTextRange(range);\n }\n this.$search.set({needle: needle});\n }\n\n this.$search.set(options);\n if (!options.start)\n this.$search.set({start: range});\n\n var newRange = this.$search.find(this.session);\n if (options.preventScroll)\n return newRange;\n if (newRange) {\n this.revealRange(newRange, animate);\n return newRange;\n }\n if (options.backwards)\n range.start = range.end;\n else\n range.end = range.start;\n this.selection.setRange(range);\n };\n this.findNext = function(options, animate) {\n this.find({skipCurrent: true, backwards: false}, options, animate);\n };\n this.findPrevious = function(options, animate) {\n this.find(options, {skipCurrent: true, backwards: true}, animate);\n };\n\n this.revealRange = function(range, animate) {\n this.$blockScrolling += 1;\n this.session.unfold(range);\n this.selection.setSelectionRange(range);\n this.$blockScrolling -= 1;\n\n var scrollTop = this.renderer.scrollTop;\n this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n if (animate !== false)\n this.renderer.animateScrolling(scrollTop);\n };\n this.undo = function() {\n this.$blockScrolling++;\n this.session.getUndoManager().undo();\n this.$blockScrolling--;\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.redo = function() {\n this.$blockScrolling++;\n this.session.getUndoManager().redo();\n this.$blockScrolling--;\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.destroy = function() {\n this.renderer.destroy();\n this._signal(\"destroy\", this);\n if (this.session) {\n this.session.destroy();\n }\n };\n this.setAutoScrollEditorIntoView = function(enable) {\n if (!enable)\n return;\n var rect;\n var self = this;\n var shouldScroll = false;\n if (!this.$scrollAnchor)\n this.$scrollAnchor = document.createElement(\"div\");\n var scrollAnchor = this.$scrollAnchor;\n scrollAnchor.style.cssText = \"position:absolute\";\n this.container.insertBefore(scrollAnchor, this.container.firstChild);\n var onChangeSelection = this.on(\"changeSelection\", function() {\n shouldScroll = true;\n });\n var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n if (shouldScroll)\n rect = self.renderer.container.getBoundingClientRect();\n });\n var onAfterRender = this.renderer.on(\"afterRender\", function() {\n if (shouldScroll && rect && (self.isFocused()\n || self.searchBox && self.searchBox.isFocused())\n ) {\n var renderer = self.renderer;\n var pos = renderer.$cursorLayer.$pixelPos;\n var config = renderer.layerConfig;\n var top = pos.top - config.offset;\n if (pos.top >= 0 && top + rect.top < 0) {\n shouldScroll = true;\n } else if (pos.top < config.height &&\n pos.top + rect.top + config.lineHeight > window.innerHeight) {\n shouldScroll = false;\n } else {\n shouldScroll = null;\n }\n if (shouldScroll != null) {\n scrollAnchor.style.top = top + \"px\";\n scrollAnchor.style.left = pos.left + \"px\";\n scrollAnchor.style.height = config.lineHeight + \"px\";\n scrollAnchor.scrollIntoView(shouldScroll);\n }\n shouldScroll = rect = null;\n }\n });\n this.setAutoScrollEditorIntoView = function(enable) {\n if (enable)\n return;\n delete this.setAutoScrollEditorIntoView;\n this.off(\"changeSelection\", onChangeSelection);\n this.renderer.off(\"afterRender\", onAfterRender);\n this.renderer.off(\"beforeRender\", onBeforeRender);\n };\n };\n\n\n this.$resetCursorStyle = function() {\n var style = this.$cursorStyle || \"ace\";\n var cursorLayer = this.renderer.$cursorLayer;\n if (!cursorLayer)\n return;\n cursorLayer.setSmoothBlinking(/smooth/.test(style));\n cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n dom.setCssClass(cursorLayer.element, \"ace_slim-cursors\", /slim/.test(style));\n };\n\n}).call(Editor.prototype);\n\n\n\nconfig.defineOptions(Editor.prototype, \"editor\", {\n selectionStyle: {\n set: function(style) {\n this.onSelectionChange();\n this._signal(\"changeSelectionStyle\", {data: style});\n },\n initialValue: \"line\"\n },\n highlightActiveLine: {\n set: function() {this.$updateHighlightActiveLine();},\n initialValue: true\n },\n highlightSelectedWord: {\n set: function(shouldHighlight) {this.$onSelectionChange();},\n initialValue: true\n },\n readOnly: {\n set: function(readOnly) {\n this.$resetCursorStyle(); \n },\n initialValue: false\n },\n cursorStyle: {\n set: function(val) { this.$resetCursorStyle(); },\n values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n initialValue: \"ace\"\n },\n mergeUndoDeltas: {\n values: [false, true, \"always\"],\n initialValue: true\n },\n behavioursEnabled: {initialValue: true},\n wrapBehavioursEnabled: {initialValue: true},\n autoScrollEditorIntoView: {\n set: function(val) {this.setAutoScrollEditorIntoView(val);}\n },\n keyboardHandler: {\n set: function(val) { this.setKeyboardHandler(val); },\n get: function() { return this.keybindingId; },\n handlesSet: true\n },\n\n hScrollBarAlwaysVisible: \"renderer\",\n vScrollBarAlwaysVisible: \"renderer\",\n highlightGutterLine: \"renderer\",\n animatedScroll: \"renderer\",\n showInvisibles: \"renderer\",\n showPrintMargin: \"renderer\",\n printMarginColumn: \"renderer\",\n printMargin: \"renderer\",\n fadeFoldWidgets: \"renderer\",\n showFoldWidgets: \"renderer\",\n showLineNumbers: \"renderer\",\n showGutter: \"renderer\",\n displayIndentGuides: \"renderer\",\n fontSize: \"renderer\",\n fontFamily: \"renderer\",\n maxLines: \"renderer\",\n minLines: \"renderer\",\n scrollPastEnd: \"renderer\",\n fixedWidthGutter: \"renderer\",\n theme: \"renderer\",\n\n scrollSpeed: \"$mouseHandler\",\n dragDelay: \"$mouseHandler\",\n dragEnabled: \"$mouseHandler\",\n focusTimout: \"$mouseHandler\",\n tooltipFollowsMouse: \"$mouseHandler\",\n\n firstLineNumber: \"session\",\n overwrite: \"session\",\n newLineMode: \"session\",\n useWorker: \"session\",\n useSoftTabs: \"session\",\n tabSize: \"session\",\n wrap: \"session\",\n indentedSoftWrap: \"session\",\n foldStyle: \"session\",\n mode: \"session\"\n});\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n this.reset();\n};\n\n(function() {\n this.execute = function(options) {\n var deltaSets = options.args[0];\n this.$doc = options.args[1];\n if (options.merge && this.hasUndo()){\n this.dirtyCounter--;\n deltaSets = this.$undoStack.pop().concat(deltaSets);\n }\n this.$undoStack.push(deltaSets);\n this.$redoStack = [];\n if (this.dirtyCounter < 0) {\n this.dirtyCounter = NaN;\n }\n this.dirtyCounter++;\n };\n this.undo = function(dontSelect) {\n var deltaSets = this.$undoStack.pop();\n var undoSelectionRange = null;\n if (deltaSets) {\n undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect);\n this.$redoStack.push(deltaSets);\n this.dirtyCounter--;\n }\n\n return undoSelectionRange;\n };\n this.redo = function(dontSelect) {\n var deltaSets = this.$redoStack.pop();\n var redoSelectionRange = null;\n if (deltaSets) {\n redoSelectionRange =\n this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect);\n this.$undoStack.push(deltaSets);\n this.dirtyCounter++;\n }\n return redoSelectionRange;\n };\n this.reset = function() {\n this.$undoStack = [];\n this.$redoStack = [];\n this.dirtyCounter = 0;\n };\n this.hasUndo = function() {\n return this.$undoStack.length > 0;\n };\n this.hasRedo = function() {\n return this.$redoStack.length > 0;\n };\n this.markClean = function() {\n this.dirtyCounter = 0;\n };\n this.isClean = function() {\n return this.dirtyCounter === 0;\n };\n this.$serializeDeltas = function(deltaSets) {\n return cloneDeltaSetsObj(deltaSets, $serializeDelta);\n };\n this.$deserializeDeltas = function(deltaSets) {\n return cloneDeltaSetsObj(deltaSets, $deserializeDelta);\n };\n \n function $serializeDelta(delta){\n return {\n action: delta.action,\n start: delta.start,\n end: delta.end,\n lines: delta.lines.length == 1 ? null : delta.lines,\n text: delta.lines.length == 1 ? delta.lines[0] : null\n };\n }\n \n function $deserializeDelta(delta) {\n return {\n action: delta.action,\n start: delta.start,\n end: delta.end,\n lines: delta.lines || [delta.text]\n };\n }\n \n function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {\n var deltaSets_new = new Array(deltaSets_old.length);\n for (var i = 0; i < deltaSets_old.length; i++) {\n var deltaSet_old = deltaSets_old[i];\n var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};\n \n for (var j = 0; j < deltaSet_old.deltas.length; j++) {\n var delta_old = deltaSet_old.deltas[j];\n deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);\n }\n \n deltaSets_new[i] = deltaSet_new;\n }\n return deltaSets_new;\n }\n \n}).call(UndoManager.prototype);\n\nexports.UndoManager = UndoManager;\n});\n\nace.define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar lang = acequire(\"../lib/lang\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar Gutter = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_gutter-layer\";\n parentEl.appendChild(this.element);\n this.setShowFoldWidgets(this.$showFoldWidgets);\n \n this.gutterWidth = 0;\n\n this.$annotations = [];\n this.$updateAnnotations = this.$updateAnnotations.bind(this);\n\n this.$cells = [];\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.setSession = function(session) {\n if (this.session)\n this.session.removeEventListener(\"change\", this.$updateAnnotations);\n this.session = session;\n if (session)\n session.on(\"change\", this.$updateAnnotations);\n };\n\n this.addGutterDecoration = function(row, className){\n if (window.console)\n console.warn && console.warn(\"deprecated use session.addGutterDecoration\");\n this.session.addGutterDecoration(row, className);\n };\n\n this.removeGutterDecoration = function(row, className){\n if (window.console)\n console.warn && console.warn(\"deprecated use session.removeGutterDecoration\");\n this.session.removeGutterDecoration(row, className);\n };\n\n this.setAnnotations = function(annotations) {\n this.$annotations = [];\n for (var i = 0; i < annotations.length; i++) {\n var annotation = annotations[i];\n var row = annotation.row;\n var rowInfo = this.$annotations[row];\n if (!rowInfo)\n rowInfo = this.$annotations[row] = {text: []};\n \n var annoText = annotation.text;\n annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \"\";\n\n if (rowInfo.text.indexOf(annoText) === -1)\n rowInfo.text.push(annoText);\n\n var type = annotation.type;\n if (type == \"error\")\n rowInfo.className = \" ace_error\";\n else if (type == \"warning\" && rowInfo.className != \" ace_error\")\n rowInfo.className = \" ace_warning\";\n else if (type == \"info\" && (!rowInfo.className))\n rowInfo.className = \" ace_info\";\n }\n };\n\n this.$updateAnnotations = function (delta) {\n if (!this.$annotations.length)\n return;\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n if (len === 0) {\n } else if (delta.action == 'remove') {\n this.$annotations.splice(firstRow, len + 1, null);\n } else {\n var args = new Array(len + 1);\n args.unshift(firstRow, 1);\n this.$annotations.splice.apply(this.$annotations, args);\n }\n };\n\n this.update = function(config) {\n var session = this.session;\n var firstRow = config.firstRow;\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n session.getLength() - 1);\n var fold = session.getNextFoldLine(firstRow);\n var foldStart = fold ? fold.start.row : Infinity;\n var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n var breakpoints = session.$breakpoints;\n var decorations = session.$decorations;\n var firstLineNumber = session.$firstLineNumber;\n var lastLineNumber = 0;\n \n var gutterRenderer = session.gutterRenderer || this.$renderer;\n\n var cell = null;\n var index = -1;\n var row = firstRow;\n while (true) {\n if (row > foldStart) {\n row = fold.end.row + 1;\n fold = session.getNextFoldLine(row, fold);\n foldStart = fold ? fold.start.row : Infinity;\n }\n if (row > lastRow) {\n while (this.$cells.length > index + 1) {\n cell = this.$cells.pop();\n this.element.removeChild(cell.element);\n }\n break;\n }\n\n cell = this.$cells[++index];\n if (!cell) {\n cell = {element: null, textNode: null, foldWidget: null};\n cell.element = dom.createElement(\"div\");\n cell.textNode = document.createTextNode('');\n cell.element.appendChild(cell.textNode);\n this.element.appendChild(cell.element);\n this.$cells[index] = cell;\n }\n\n var className = \"ace_gutter-cell \";\n if (breakpoints[row])\n className += breakpoints[row];\n if (decorations[row])\n className += decorations[row];\n if (this.$annotations[row])\n className += this.$annotations[row].className;\n if (cell.element.className != className)\n cell.element.className = className;\n\n var height = session.getRowLength(row) * config.lineHeight + \"px\";\n if (height != cell.element.style.height)\n cell.element.style.height = height;\n\n if (foldWidgets) {\n var c = foldWidgets[row];\n if (c == null)\n c = foldWidgets[row] = session.getFoldWidget(row);\n }\n\n if (c) {\n if (!cell.foldWidget) {\n cell.foldWidget = dom.createElement(\"span\");\n cell.element.appendChild(cell.foldWidget);\n }\n var className = \"ace_fold-widget ace_\" + c;\n if (c == \"start\" && row == foldStart && row < fold.end.row)\n className += \" ace_closed\";\n else\n className += \" ace_open\";\n if (cell.foldWidget.className != className)\n cell.foldWidget.className = className;\n\n var height = config.lineHeight + \"px\";\n if (cell.foldWidget.style.height != height)\n cell.foldWidget.style.height = height;\n } else {\n if (cell.foldWidget) {\n cell.element.removeChild(cell.foldWidget);\n cell.foldWidget = null;\n }\n }\n \n var text = lastLineNumber = gutterRenderer\n ? gutterRenderer.getText(session, row)\n : row + firstLineNumber;\n if (text !== cell.textNode.data)\n cell.textNode.data = text;\n\n row++;\n }\n\n this.element.style.height = config.minHeight + \"px\";\n\n if (this.$fixedWidth || session.$useWrapMode)\n lastLineNumber = session.getLength() + firstLineNumber;\n\n var gutterWidth = gutterRenderer \n ? gutterRenderer.getWidth(session, lastLineNumber, config)\n : lastLineNumber.toString().length * config.characterWidth;\n \n var padding = this.$padding || this.$computePadding();\n gutterWidth += padding.left + padding.right;\n if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n this.gutterWidth = gutterWidth;\n this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n this._emit(\"changeGutterWidth\", gutterWidth);\n }\n };\n\n this.$fixedWidth = false;\n \n this.$showLineNumbers = true;\n this.$renderer = \"\";\n this.setShowLineNumbers = function(show) {\n this.$renderer = !show && {\n getWidth: function() {return \"\";},\n getText: function() {return \"\";}\n };\n };\n \n this.getShowLineNumbers = function() {\n return this.$showLineNumbers;\n };\n \n this.$showFoldWidgets = true;\n this.setShowFoldWidgets = function(show) {\n if (show)\n dom.addCssClass(this.element, \"ace_folding-enabled\");\n else\n dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n this.$showFoldWidgets = show;\n this.$padding = null;\n };\n \n this.getShowFoldWidgets = function() {\n return this.$showFoldWidgets;\n };\n\n this.$computePadding = function() {\n if (!this.element.firstChild)\n return {left: 0, right: 0};\n var style = dom.computedStyle(this.element.firstChild);\n this.$padding = {};\n this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n this.$padding.right = parseInt(style.paddingRight) || 0;\n return this.$padding;\n };\n\n this.getRegion = function(point) {\n var padding = this.$padding || this.$computePadding();\n var rect = this.element.getBoundingClientRect();\n if (point.x < padding.left + rect.left)\n return \"markers\";\n if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n return \"foldWidgets\";\n };\n\n}).call(Gutter.prototype);\n\nexports.Gutter = Gutter;\n\n});\n\nace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar dom = acequire(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_marker-layer\";\n parentEl.appendChild(this.element);\n};\n\n(function() {\n\n this.$padding = 0;\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n this.setSession = function(session) {\n this.session = session;\n };\n \n this.setMarkers = function(markers) {\n this.markers = markers;\n };\n\n this.update = function(config) {\n if (!config) return;\n\n this.config = config;\n\n\n var html = [];\n for (var key in this.markers) {\n var marker = this.markers[key];\n\n if (!marker.range) {\n marker.update(html, this, this.session, config);\n continue;\n }\n\n var range = marker.range.clipRows(config.firstRow, config.lastRow);\n if (range.isEmpty()) continue;\n\n range = range.toScreenRange(this.session);\n if (marker.renderer) {\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + (this.session.$bidiHandler.isBidiRow(range.start.row)\n ? this.session.$bidiHandler.getPosLeft(range.start.column)\n : range.start.column * config.characterWidth);\n marker.renderer(html, range, left, top, config);\n } else if (marker.type == \"fullLine\") {\n this.drawFullLineMarker(html, range, marker.clazz, config);\n } else if (marker.type == \"screenLine\") {\n this.drawScreenLineMarker(html, range, marker.clazz, config);\n } else if (range.isMultiLine()) {\n if (marker.type == \"text\")\n this.drawTextMarker(html, range, marker.clazz, config);\n else\n this.drawMultiLineMarker(html, range, marker.clazz, config);\n } else {\n if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n this.drawBidiSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n } else {\n this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n }\n }\n }\n this.element.innerHTML = html.join(\"\");\n };\n\n this.$getTop = function(row, layerConfig) {\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n };\n\n function getBorderClass(tl, tr, br, bl) {\n return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n }\n this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n var session = this.session;\n var start = range.start.row;\n var end = range.end.row;\n var row = start;\n var prev = 0; \n var curr = 0;\n var next = session.getScreenLastRowColumn(row);\n var clazzModified = null;\n var lineRange = new Range(row, range.start.column, row, curr);\n for (; row <= end; row++) {\n lineRange.start.row = lineRange.end.row = row;\n lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);\n lineRange.end.column = next;\n prev = curr;\n curr = next;\n next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;\n clazzModified = clazz + (row == start ? \" ace_start\" : \"\") + \" ace_br\"\n + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end);\n\n if (this.session.$bidiHandler.isBidiRow(row)) {\n this.drawBidiSingleLineMarker(stringBuilder, lineRange, clazzModified,\n layerConfig, row == end ? 0 : 1, extraStyle);\n } else {\n this.drawSingleLineMarker(stringBuilder, lineRange, clazzModified,\n layerConfig, row == end ? 0 : 1, extraStyle);\n }\n }\n };\n this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var padding = this.$padding;\n var height, top, left;\n extraStyle = extraStyle || \"\";\n if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n var range1 = range.clone();\n range1.end.row = range1.start.row;\n range1.end.column = this.session.getLine(range1.start.row).length;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br1 ace_start\", config, null, extraStyle);\n } else {\n height = config.lineHeight;\n top = this.$getTop(range.start.row, config);\n left = padding + range.start.column * config.characterWidth;\n stringBuilder.push(\n \"
    \"\n );\n }\n if (this.session.$bidiHandler.isBidiRow(range.end.row)) {\n var range1 = range.clone();\n range1.start.row = range1.end.row;\n range1.start.column = 0;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br12\", config, null, extraStyle);\n } else {\n var width = range.end.column * config.characterWidth;\n height = config.lineHeight;\n top = this.$getTop(range.end.row, config);\n stringBuilder.push(\n \"
    \"\n );\n }\n height = (range.end.row - range.start.row - 1) * config.lineHeight;\n if (height <= 0)\n return;\n top = this.$getTop(range.start.row + 1, config);\n \n var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n\n stringBuilder.push(\n \"
    \"\n );\n };\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight;\n var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + range.start.column * config.characterWidth;\n\n stringBuilder.push(\n \"
    \"\n );\n };\n this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding;\n var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column);\n\n selections.forEach(function(selection) {\n stringBuilder.push(\n \"
    \"\n );\n });\n };\n\n this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n if (range.start.row != range.end.row)\n height += this.$getTop(range.end.row, config) - top;\n\n stringBuilder.push(\n \"
    \"\n );\n };\n \n this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n\n stringBuilder.push(\n \"
    \"\n );\n };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\nace.define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_text-layer\";\n parentEl.appendChild(this.element);\n this.$updateEolChar = this.$updateEolChar.bind(this);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.EOF_CHAR = \"\\xB6\";\n this.EOL_CHAR_LF = \"\\xAC\";\n this.EOL_CHAR_CRLF = \"\\xa4\";\n this.EOL_CHAR = this.EOL_CHAR_LF;\n this.TAB_CHAR = \"\\u2014\"; //\"\\u21E5\";\n this.SPACE_CHAR = \"\\xB7\";\n this.$padding = 0;\n\n this.$updateEolChar = function() {\n var EOL_CHAR = this.session.doc.getNewLineCharacter() == \"\\n\"\n ? this.EOL_CHAR_LF\n : this.EOL_CHAR_CRLF;\n if (this.EOL_CHAR != EOL_CHAR) {\n this.EOL_CHAR = EOL_CHAR;\n return true;\n }\n };\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.element.style.padding = \"0 \" + padding + \"px\";\n };\n\n this.getLineHeight = function() {\n return this.$fontMetrics.$characterSize.height || 0;\n };\n\n this.getCharacterWidth = function() {\n return this.$fontMetrics.$characterSize.width || 0;\n };\n \n this.$setFontMetrics = function(measure) {\n this.$fontMetrics = measure;\n this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n this._signal(\"changeCharacterSize\", e);\n }.bind(this));\n this.$pollSizeChanges();\n };\n\n this.checkForSizeChanges = function() {\n this.$fontMetrics.checkForSizeChanges();\n };\n this.$pollSizeChanges = function() {\n return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n };\n this.setSession = function(session) {\n this.session = session;\n if (session)\n this.$computeTabString();\n };\n\n this.showInvisibles = false;\n this.setShowInvisibles = function(showInvisibles) {\n if (this.showInvisibles == showInvisibles)\n return false;\n\n this.showInvisibles = showInvisibles;\n this.$computeTabString();\n return true;\n };\n\n this.displayIndentGuides = true;\n this.setDisplayIndentGuides = function(display) {\n if (this.displayIndentGuides == display)\n return false;\n\n this.displayIndentGuides = display;\n this.$computeTabString();\n return true;\n };\n\n this.$tabStrings = [];\n this.onChangeTabSize =\n this.$computeTabString = function() {\n var tabSize = this.session.getTabSize();\n this.tabSize = tabSize;\n var tabStr = this.$tabStrings = [0];\n for (var i = 1; i < tabSize + 1; i++) {\n if (this.showInvisibles) {\n tabStr.push(\"\"\n + lang.stringRepeat(this.TAB_CHAR, i)\n + \"\");\n } else {\n tabStr.push(lang.stringRepeat(\" \", i));\n }\n }\n if (this.displayIndentGuides) {\n this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n var className = \"ace_indent-guide\";\n var spaceClass = \"\";\n var tabClass = \"\";\n if (this.showInvisibles) {\n className += \" ace_invisible\";\n spaceClass = \" ace_invisible_space\";\n tabClass = \" ace_invisible_tab\";\n var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\n var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);\n } else{\n var spaceContent = lang.stringRepeat(\" \", this.tabSize);\n var tabContent = spaceContent;\n }\n\n this.$tabStrings[\" \"] = \"\" + spaceContent + \"\";\n this.$tabStrings[\"\\t\"] = \"\" + tabContent + \"\";\n }\n };\n\n this.updateLines = function(config, firstRow, lastRow) {\n if (this.config.lastRow != config.lastRow ||\n this.config.firstRow != config.firstRow) {\n this.scrollLines(config);\n }\n this.config = config;\n\n var first = Math.max(firstRow, config.firstRow);\n var last = Math.min(lastRow, config.lastRow);\n\n var lineElements = this.element.childNodes;\n var lineElementsIdx = 0;\n\n for (var row = config.firstRow; row < first; row++) {\n var foldLine = this.session.getFoldLine(row);\n if (foldLine) {\n if (foldLine.containsRow(first)) {\n first = foldLine.start.row;\n break;\n } else {\n row = foldLine.end.row;\n }\n }\n lineElementsIdx ++;\n }\n\n var row = first;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > last)\n break;\n\n var lineElement = lineElements[lineElementsIdx++];\n if (lineElement) {\n var html = [];\n this.$renderLine(\n html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n );\n lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n lineElement.innerHTML = html.join(\"\");\n }\n row++;\n }\n };\n\n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n\n if (!oldConfig || oldConfig.lastRow < config.firstRow)\n return this.update(config);\n\n if (config.lastRow < oldConfig.firstRow)\n return this.update(config);\n\n var el = this.element;\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n el.removeChild(el.firstChild);\n\n if (oldConfig.lastRow > config.lastRow)\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n el.removeChild(el.lastChild);\n\n if (config.firstRow < oldConfig.firstRow) {\n var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n if (el.firstChild)\n el.insertBefore(fragment, el.firstChild);\n else\n el.appendChild(fragment);\n }\n\n if (config.lastRow > oldConfig.lastRow) {\n var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n el.appendChild(fragment);\n }\n };\n\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\n var fragment = this.element.ownerDocument.createDocumentFragment();\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n if (row > lastRow)\n break;\n\n var container = dom.createElement(\"div\");\n\n var html = [];\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n container.innerHTML = html.join(\"\");\n if (this.$useLineGroups()) {\n container.className = 'ace_line_group';\n fragment.appendChild(container);\n container.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\n } else {\n while(container.firstChild)\n fragment.appendChild(container.firstChild);\n }\n\n row++;\n }\n return fragment;\n };\n\n this.update = function(config) {\n this.config = config;\n\n var html = [];\n var firstRow = config.firstRow, lastRow = config.lastRow;\n\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > lastRow)\n break;\n\n if (this.$useLineGroups())\n html.push(\"
    \");\n\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n if (this.$useLineGroups())\n html.push(\"
    \"); // end the line group\n\n row++;\n }\n this.element.innerHTML = html.join(\"\");\n };\n\n this.$textToken = {\n \"text\": true,\n \"rparen\": true,\n \"lparen\": true\n };\n\n this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n var self = this;\n var replaceReg = /\\t|&|<|>|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF\\uFFF9-\\uFFFC])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n var replaceFunc = function(c, a, b, tabIdx, idx4) {\n if (a) {\n return self.showInvisibles\n ? \"\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \"\"\n : c;\n } else if (c == \"&\") {\n return \"&\";\n } else if (c == \"<\") {\n return \"<\";\n } else if (c == \">\") {\n return \">\";\n } else if (c == \"\\t\") {\n var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n screenColumn += tabSize - 1;\n return self.$tabStrings[tabSize];\n } else if (c == \"\\u3000\") {\n var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n screenColumn += 1;\n return \"\" + space + \"\";\n } else if (b) {\n return \"\" + self.SPACE_CHAR + \"\";\n } else {\n screenColumn += 1;\n return \"\" + c + \"\";\n }\n };\n\n var output = value.replace(replaceReg, replaceFunc);\n\n if (!this.$textToken[token.type]) {\n var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n var style = \"\";\n if (token.type == \"fold\")\n style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n stringBuilder.push(\"\", output, \"\");\n }\n else {\n stringBuilder.push(output);\n }\n return screenColumn + value.length;\n };\n\n this.renderIndentGuide = function(stringBuilder, value, max) {\n var cols = value.search(this.$indentGuideRe);\n if (cols <= 0 || cols >= max)\n return value;\n if (value[0] == \" \") {\n cols -= cols % this.tabSize;\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\" \"], cols/this.tabSize));\n return value.substr(cols);\n } else if (value[0] == \"\\t\") {\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\"\\t\"], cols));\n return value.substr(cols);\n }\n return value;\n };\n\n this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n var chars = 0;\n var split = 0;\n var splitChars = splits[0];\n var screenColumn = 0;\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n var value = token.value;\n if (i == 0 && this.displayIndentGuides) {\n chars = value.length;\n value = this.renderIndentGuide(stringBuilder, value, splitChars);\n if (!value)\n continue;\n chars -= value.length;\n }\n\n if (chars + value.length < splitChars) {\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n chars += value.length;\n } else {\n while (chars + value.length >= splitChars) {\n screenColumn = this.$renderToken(\n stringBuilder, screenColumn,\n token, value.substring(0, splitChars - chars)\n );\n value = value.substring(splitChars - chars);\n chars = splitChars;\n\n if (!onlyContents) {\n stringBuilder.push(\"
    \",\n \"
    \"\n );\n }\n\n stringBuilder.push(lang.stringRepeat(\"\\xa0\", splits.indent));\n\n split ++;\n screenColumn = 0;\n splitChars = splits[split] || Number.MAX_VALUE;\n }\n if (value.length != 0) {\n chars += value.length;\n screenColumn = this.$renderToken(\n stringBuilder, screenColumn, token, value\n );\n }\n }\n }\n };\n\n this.$renderSimpleLine = function(stringBuilder, tokens) {\n var screenColumn = 0;\n var token = tokens[0];\n var value = token.value;\n if (this.displayIndentGuides)\n value = this.renderIndentGuide(stringBuilder, value);\n if (value)\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n for (var i = 1; i < tokens.length; i++) {\n token = tokens[i];\n value = token.value;\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n }\n };\n this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n if (!foldLine && foldLine != false)\n foldLine = this.session.getFoldLine(row);\n\n if (foldLine)\n var tokens = this.$getFoldLineTokens(row, foldLine);\n else\n var tokens = this.session.getTokens(row);\n\n\n if (!onlyContents) {\n stringBuilder.push(\n \"
    \"\n );\n }\n\n if (tokens.length) {\n var splits = this.session.getRowSplitData(row);\n if (splits && splits.length)\n this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n else\n this.$renderSimpleLine(stringBuilder, tokens);\n }\n\n if (this.showInvisibles) {\n if (foldLine)\n row = foldLine.end.row;\n\n stringBuilder.push(\n \"\",\n row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n \"\"\n );\n }\n if (!onlyContents)\n stringBuilder.push(\"
    \");\n };\n\n this.$getFoldLineTokens = function(row, foldLine) {\n var session = this.session;\n var renderTokens = [];\n\n function addTokens(tokens, from, to) {\n var idx = 0, col = 0;\n while ((col + tokens[idx].value.length) < from) {\n col += tokens[idx].value.length;\n idx++;\n\n if (idx == tokens.length)\n return;\n }\n if (col != from) {\n var value = tokens[idx].value.substring(from - col);\n if (value.length > (to - from))\n value = value.substring(0, to - from);\n\n renderTokens.push({\n type: tokens[idx].type,\n value: value\n });\n\n col = from + value.length;\n idx += 1;\n }\n\n while (col < to && idx < tokens.length) {\n var value = tokens[idx].value;\n if (value.length + col > to) {\n renderTokens.push({\n type: tokens[idx].type,\n value: value.substring(0, to - col)\n });\n } else\n renderTokens.push(tokens[idx]);\n col += value.length;\n idx += 1;\n }\n }\n\n var tokens = session.getTokens(row);\n foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n if (placeholder != null) {\n renderTokens.push({\n type: \"fold\",\n value: placeholder\n });\n } else {\n if (isNewRow)\n tokens = session.getTokens(row);\n\n if (tokens.length)\n addTokens(tokens, lastColumn, column);\n }\n }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n return renderTokens;\n };\n\n this.$useLineGroups = function() {\n return this.session.getUseWrapMode();\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.$measureNode)\n this.$measureNode.parentNode.removeChild(this.$measureNode);\n delete this.$measureNode;\n };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar isIE8;\n\nvar Cursor = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_cursor-layer\";\n parentEl.appendChild(this.element);\n \n if (isIE8 === undefined)\n isIE8 = !(\"opacity\" in this.element.style);\n\n this.isVisible = false;\n this.isBlinking = true;\n this.blinkInterval = 1000;\n this.smoothBlinking = false;\n\n this.cursors = [];\n this.cursor = this.addCursor();\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.$updateCursors = (isIE8\n ? this.$updateVisibility\n : this.$updateOpacity).bind(this);\n};\n\n(function() {\n \n this.$updateVisibility = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.visibility = val ? \"\" : \"hidden\";\n };\n this.$updateOpacity = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.opacity = val ? \"\" : \"0\";\n };\n \n\n this.$padding = 0;\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n\n this.setSession = function(session) {\n this.session = session;\n };\n\n this.setBlinking = function(blinking) {\n if (blinking != this.isBlinking){\n this.isBlinking = blinking;\n this.restartTimer();\n }\n };\n\n this.setBlinkInterval = function(blinkInterval) {\n if (blinkInterval != this.blinkInterval){\n this.blinkInterval = blinkInterval;\n this.restartTimer();\n }\n };\n\n this.setSmoothBlinking = function(smoothBlinking) {\n if (smoothBlinking != this.smoothBlinking && !isIE8) {\n this.smoothBlinking = smoothBlinking;\n dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n this.$updateCursors(true);\n this.$updateCursors = (this.$updateOpacity).bind(this);\n this.restartTimer();\n }\n };\n\n this.addCursor = function() {\n var el = dom.createElement(\"div\");\n el.className = \"ace_cursor\";\n this.element.appendChild(el);\n this.cursors.push(el);\n return el;\n };\n\n this.removeCursor = function() {\n if (this.cursors.length > 1) {\n var el = this.cursors.pop();\n el.parentNode.removeChild(el);\n return el;\n }\n };\n\n this.hideCursor = function() {\n this.isVisible = false;\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.showCursor = function() {\n this.isVisible = true;\n dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.restartTimer = function() {\n var update = this.$updateCursors;\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n if (this.smoothBlinking) {\n dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n }\n \n update(true);\n\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n return;\n\n if (this.smoothBlinking) {\n setTimeout(function(){\n dom.addCssClass(this.element, \"ace_smooth-blinking\");\n }.bind(this));\n }\n \n var blink = function(){\n this.timeoutId = setTimeout(function() {\n update(false);\n }, 0.6 * this.blinkInterval);\n }.bind(this);\n\n this.intervalId = setInterval(function() {\n update(true);\n blink();\n }, this.blinkInterval);\n\n blink();\n };\n\n this.getPixelPosition = function(position, onScreen) {\n if (!this.config || !this.session)\n return {left : 0, top : 0};\n\n if (!position)\n position = this.session.selection.getCursor();\n var pos = this.session.documentToScreenPosition(position);\n var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : pos.column * this.config.characterWidth);\n\n var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n this.config.lineHeight;\n\n return {left : cursorLeft, top : cursorTop};\n };\n\n this.update = function(config) {\n this.config = config;\n\n var selections = this.session.$selectionMarkers;\n var i = 0, cursorIndex = 0;\n\n if (selections === undefined || selections.length === 0){\n selections = [{cursor: null}];\n }\n\n for (var i = 0, n = selections.length; i < n; i++) {\n var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n if ((pixelPos.top > config.height + config.offset ||\n pixelPos.top < 0) && i > 1) {\n continue;\n }\n\n var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n \n if (!this.drawCursor) {\n style.left = pixelPos.left + \"px\";\n style.top = pixelPos.top + \"px\";\n style.width = config.characterWidth + \"px\";\n style.height = config.lineHeight + \"px\";\n } else {\n this.drawCursor(style, pixelPos, config, selections[i], this.session);\n }\n }\n while (this.cursors.length > cursorIndex)\n this.removeCursor();\n\n var overwrite = this.session.getOverwrite();\n this.$setOverwrite(overwrite);\n this.$pixelPos = pixelPos;\n this.restartTimer();\n };\n \n this.drawCursor = null;\n\n this.$setOverwrite = function(overwrite) {\n if (overwrite != this.overwrite) {\n this.overwrite = overwrite;\n if (overwrite)\n dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n else\n dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n }\n };\n\n this.destroy = function() {\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\nace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar MAX_SCROLL_H = 0x8000;\nvar ScrollBar = function(parent) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\n this.inner = dom.createElement(\"div\");\n this.inner.className = \"ace_scrollbar-inner\";\n this.element.appendChild(this.inner);\n\n parent.appendChild(this.element);\n\n this.setVisible(false);\n this.skipEvent = false;\n\n event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n\n this.setVisible = function(isVisible) {\n this.element.style.display = isVisible ? \"\" : \"none\";\n this.isVisible = isVisible;\n this.coeff = 1;\n };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollTop = 0;\n this.scrollHeight = 0;\n renderer.$scrollbarWidth = \n this.width = dom.scrollbarWidth(parent.ownerDocument);\n this.inner.style.width =\n this.element.style.width = (this.width || 15) + 5 + \"px\";\n this.$minWidth = 0;\n};\n\noop.inherits(VScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-v';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollTop = this.element.scrollTop;\n if (this.coeff != 1) {\n var h = this.element.clientHeight / this.scrollHeight;\n this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h);\n }\n this._emit(\"scroll\", {data: this.scrollTop});\n }\n this.skipEvent = false;\n };\n this.getWidth = function() {\n return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n };\n this.setHeight = function(height) {\n this.element.style.height = height + \"px\";\n };\n this.setInnerHeight =\n this.setScrollHeight = function(height) {\n this.scrollHeight = height;\n if (height > MAX_SCROLL_H) {\n this.coeff = MAX_SCROLL_H / height;\n height = MAX_SCROLL_H;\n } else if (this.coeff != 1) {\n this.coeff = 1;\n }\n this.inner.style.height = height + \"px\";\n };\n this.setScrollTop = function(scrollTop) {\n if (this.scrollTop != scrollTop) {\n this.skipEvent = true;\n this.scrollTop = scrollTop;\n this.element.scrollTop = scrollTop * this.coeff;\n }\n };\n\n}).call(VScrollBar.prototype);\nvar HScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollLeft = 0;\n this.height = renderer.$scrollbarWidth;\n this.inner.style.height =\n this.element.style.height = (this.height || 15) + 5 + \"px\";\n};\n\noop.inherits(HScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-h';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollLeft = this.element.scrollLeft;\n this._emit(\"scroll\", {data: this.scrollLeft});\n }\n this.skipEvent = false;\n };\n this.getHeight = function() {\n return this.isVisible ? this.height : 0;\n };\n this.setWidth = function(width) {\n this.element.style.width = width + \"px\";\n };\n this.setInnerWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollLeft = function(scrollLeft) {\n if (this.scrollLeft != scrollLeft) {\n this.skipEvent = true;\n this.scrollLeft = this.element.scrollLeft = scrollLeft;\n }\n };\n\n}).call(HScrollBar.prototype);\n\n\nexports.ScrollBar = VScrollBar; // backward compatibility\nexports.ScrollBarV = VScrollBar; // backward compatibility\nexports.ScrollBarH = HScrollBar; // backward compatibility\n\nexports.VScrollBar = VScrollBar;\nexports.HScrollBar = HScrollBar;\n});\n\nace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n this.onRender = onRender;\n this.pending = false;\n this.changes = 0;\n this.window = win || window;\n};\n\n(function() {\n\n\n this.schedule = function(change) {\n this.changes = this.changes | change;\n if (!this.pending && this.changes) {\n this.pending = true;\n var _self = this;\n event.nextFrame(function() {\n _self.pending = false;\n var changes;\n while (changes = _self.changes) {\n _self.changes = 0;\n _self.onRender(changes);\n }\n }, this.window);\n }\n };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 0;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\n this.el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.el.style, true);\n \n this.$main = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$main.style);\n \n this.$measureNode = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$measureNode.style);\n \n \n this.el.appendChild(this.$main);\n this.el.appendChild(this.$measureNode);\n parentEl.appendChild(this.el);\n \n if (!CHAR_COUNT)\n this.$testFractionalRect();\n this.$measureNode.innerHTML = lang.stringRepeat(\"X\", CHAR_COUNT);\n \n this.$characterSize = {width: 0, height: 0};\n this.checkForSizeChanges();\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n \n this.$characterSize = {width: 0, height: 0};\n \n this.$testFractionalRect = function() {\n var el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(el.style);\n el.style.width = \"0.2px\";\n document.documentElement.appendChild(el);\n var w = el.getBoundingClientRect().width;\n if (w > 0 && w < 1)\n CHAR_COUNT = 50;\n else\n CHAR_COUNT = 100;\n el.parentNode.removeChild(el);\n };\n \n this.$setMeasureNodeStyles = function(style, isRoot) {\n style.width = style.height = \"auto\";\n style.left = style.top = \"0px\";\n style.visibility = \"hidden\";\n style.position = \"absolute\";\n style.whiteSpace = \"pre\";\n\n if (useragent.isIE < 8) {\n style[\"font-family\"] = \"inherit\";\n } else {\n style.font = \"inherit\";\n }\n style.overflow = isRoot ? \"hidden\" : \"visible\";\n };\n\n this.checkForSizeChanges = function() {\n var size = this.$measureSizes();\n if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n this.$measureNode.style.fontWeight = \"bold\";\n var boldSize = this.$measureSizes();\n this.$measureNode.style.fontWeight = \"\";\n this.$characterSize = size;\n this.charSizes = Object.create(null);\n this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n this._emit(\"changeCharacterSize\", {data: size});\n }\n };\n\n this.$pollSizeChanges = function() {\n if (this.$pollSizeChangesTimer)\n return this.$pollSizeChangesTimer;\n var self = this;\n return this.$pollSizeChangesTimer = setInterval(function() {\n self.checkForSizeChanges();\n }, 500);\n };\n \n this.setPolling = function(val) {\n if (val) {\n this.$pollSizeChanges();\n } else if (this.$pollSizeChangesTimer) {\n clearInterval(this.$pollSizeChangesTimer);\n this.$pollSizeChangesTimer = 0;\n }\n };\n\n this.$measureSizes = function() {\n if (CHAR_COUNT === 50) {\n var rect = null;\n try { \n rect = this.$measureNode.getBoundingClientRect();\n } catch(e) {\n rect = {width: 0, height:0 };\n }\n var size = {\n height: rect.height,\n width: rect.width / CHAR_COUNT\n };\n } else {\n var size = {\n height: this.$measureNode.clientHeight,\n width: this.$measureNode.clientWidth / CHAR_COUNT\n };\n }\n if (size.width === 0 || size.height === 0)\n return null;\n return size;\n };\n\n this.$measureCharWidth = function(ch) {\n this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);\n var rect = this.$main.getBoundingClientRect();\n return rect.width / CHAR_COUNT;\n };\n \n this.getCharacterWidth = function(ch) {\n var w = this.charSizes[ch];\n if (w === undefined) {\n w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n }\n return w;\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.el && this.el.parentNode)\n this.el.parentNode.removeChild(this.el);\n };\n\n}).call(FontMetrics.prototype);\n\n});\n\nace.define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/lib/useragent\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar config = acequire(\"./config\");\nvar useragent = acequire(\"./lib/useragent\");\nvar GutterLayer = acequire(\"./layer/gutter\").Gutter;\nvar MarkerLayer = acequire(\"./layer/marker\").Marker;\nvar TextLayer = acequire(\"./layer/text\").Text;\nvar CursorLayer = acequire(\"./layer/cursor\").Cursor;\nvar HScrollBar = acequire(\"./scrollbar\").HScrollBar;\nvar VScrollBar = acequire(\"./scrollbar\").VScrollBar;\nvar RenderLoop = acequire(\"./renderloop\").RenderLoop;\nvar FontMetrics = acequire(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \".ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\ntext-align: left;\\\n-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncursor: text;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ntext-indent: -1em;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: inherit;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\ntext-indent: 0;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\ntransform: translatez(0);\\\n}\\\n.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\n-webkit-transition: opacity 0.18s;\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block; \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n.ace_br1 {border-top-left-radius : 3px;}\\\n.ace_br2 {border-top-right-radius : 3px;}\\\n.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\\\n.ace_br4 {border-bottom-right-radius: 3px;}\\\n.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\\\n.ace_br8 {border-bottom-left-radius : 3px;}\\\n.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_text-input-ios {\\\nposition: absolute !important;\\\ntop: -100000px !important;\\\nleft: -100000px !important;\\\n}\\\n\";\n\ndom.importCssString(editorCss, \"ace_editor.css\");\n\nvar VirtualRenderer = function(container, theme) {\n var _self = this;\n\n this.container = container || dom.createElement(\"div\");\n this.$keepTextAreaAtCursor = !useragent.isOldIE;\n\n dom.addCssClass(this.container, \"ace_editor\");\n\n this.setTheme(theme);\n\n this.$gutter = dom.createElement(\"div\");\n this.$gutter.className = \"ace_gutter\";\n this.container.appendChild(this.$gutter);\n this.$gutter.setAttribute(\"aria-hidden\", true);\n\n this.scroller = dom.createElement(\"div\");\n this.scroller.className = \"ace_scroller\";\n this.container.appendChild(this.scroller);\n\n this.content = dom.createElement(\"div\");\n this.content.className = \"ace_content\";\n this.scroller.appendChild(this.content);\n\n this.$gutterLayer = new GutterLayer(this.$gutter);\n this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n this.$markerBack = new MarkerLayer(this.content);\n\n var textLayer = this.$textLayer = new TextLayer(this.content);\n this.canvas = textLayer.element;\n\n this.$markerFront = new MarkerLayer(this.content);\n\n this.$cursorLayer = new CursorLayer(this.content);\n this.$horizScroll = false;\n this.$vScroll = false;\n\n this.scrollBar = \n this.scrollBarV = new VScrollBar(this.container, this);\n this.scrollBarH = new HScrollBar(this.container, this);\n this.scrollBarV.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n });\n this.scrollBarH.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n });\n\n this.scrollTop = 0;\n this.scrollLeft = 0;\n\n this.cursorPos = {\n row : 0,\n column : 0\n };\n\n this.$fontMetrics = new FontMetrics(this.container);\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\n this.$textLayer.addEventListener(\"changeCharacterSize\", function(e) {\n _self.updateCharacterSize();\n _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n _self._signal(\"changeCharacterSize\", e);\n });\n\n this.$size = {\n width: 0,\n height: 0,\n scrollerHeight: 0,\n scrollerWidth: 0,\n $dirty: true\n };\n\n this.layerConfig = {\n width : 1,\n padding : 0,\n firstRow : 0,\n firstRowScreen: 0,\n lastRow : 0,\n lineHeight : 0,\n characterWidth : 0,\n minHeight : 1,\n maxHeight : 1,\n offset : 0,\n height : 1,\n gutterOffset: 1\n };\n \n this.scrollMargin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n\n this.$loop = new RenderLoop(\n this.$renderChanges.bind(this),\n this.container.ownerDocument.defaultView\n );\n this.$loop.schedule(this.CHANGE_FULL);\n\n this.updateCharacterSize();\n this.setPadding(4);\n config.resetOptions(this);\n config._emit(\"renderer\", this);\n};\n\n(function() {\n\n this.CHANGE_CURSOR = 1;\n this.CHANGE_MARKER = 2;\n this.CHANGE_GUTTER = 4;\n this.CHANGE_SCROLL = 8;\n this.CHANGE_LINES = 16;\n this.CHANGE_TEXT = 32;\n this.CHANGE_SIZE = 64;\n this.CHANGE_MARKER_BACK = 128;\n this.CHANGE_MARKER_FRONT = 256;\n this.CHANGE_FULL = 512;\n this.CHANGE_H_SCROLL = 1024;\n\n oop.implement(this, EventEmitter);\n\n this.updateCharacterSize = function() {\n if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n }\n\n this.layerConfig.characterWidth =\n this.characterWidth = this.$textLayer.getCharacterWidth();\n this.layerConfig.lineHeight =\n this.lineHeight = this.$textLayer.getLineHeight();\n this.$updatePrintMargin();\n };\n this.setSession = function(session) {\n if (this.session)\n this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n \n this.session = session;\n if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n session.setScrollTop(-this.scrollMargin.top);\n\n this.$cursorLayer.setSession(session);\n this.$markerBack.setSession(session);\n this.$markerFront.setSession(session);\n this.$gutterLayer.setSession(session);\n this.$textLayer.setSession(session);\n if (!session)\n return;\n \n this.$loop.schedule(this.CHANGE_FULL);\n this.session.$setFontMetrics(this.$fontMetrics);\n this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\n \n this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n this.onChangeNewLineMode();\n this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n };\n this.updateLines = function(firstRow, lastRow, force) {\n if (lastRow === undefined)\n lastRow = Infinity;\n\n if (!this.$changedLines) {\n this.$changedLines = {\n firstRow: firstRow,\n lastRow: lastRow\n };\n }\n else {\n if (this.$changedLines.firstRow > firstRow)\n this.$changedLines.firstRow = firstRow;\n\n if (this.$changedLines.lastRow < lastRow)\n this.$changedLines.lastRow = lastRow;\n }\n if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n if (force)\n this.$changedLines.lastRow = this.layerConfig.lastRow;\n else\n return;\n }\n if (this.$changedLines.firstRow > this.layerConfig.lastRow)\n return;\n this.$loop.schedule(this.CHANGE_LINES);\n };\n\n this.onChangeNewLineMode = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n this.$textLayer.$updateEolChar();\n this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR);\n };\n \n this.onChangeTabSize = function() {\n this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n this.$textLayer.onChangeTabSize();\n };\n this.updateText = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n };\n this.updateFull = function(force) {\n if (force)\n this.$renderChanges(this.CHANGE_FULL, true);\n else\n this.$loop.schedule(this.CHANGE_FULL);\n };\n this.updateFontSize = function() {\n this.$textLayer.checkForSizeChanges();\n };\n\n this.$changes = 0;\n this.$updateSizeAsync = function() {\n if (this.$loop.pending)\n this.$size.$dirty = true;\n else\n this.onResize();\n };\n this.onResize = function(force, gutterWidth, width, height) {\n if (this.resizing > 2)\n return;\n else if (this.resizing > 0)\n this.resizing++;\n else\n this.resizing = force ? 1 : 0;\n var el = this.container;\n if (!height)\n height = el.clientHeight || el.scrollHeight;\n if (!width)\n width = el.clientWidth || el.scrollWidth;\n var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n\n \n if (!this.$size.scrollerHeight || (!width && !height))\n return this.resizing = 0;\n\n if (force)\n this.$gutterLayer.$padding = null;\n\n if (force)\n this.$renderChanges(changes | this.$changes, true);\n else\n this.$loop.schedule(changes | this.$changes);\n\n if (this.resizing)\n this.resizing = 0;\n this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\n };\n \n this.$updateCachedSize = function(force, gutterWidth, width, height) {\n height -= (this.$extraHeight || 0);\n var changes = 0;\n var size = this.$size;\n var oldSize = {\n width: size.width,\n height: size.height,\n scrollerHeight: size.scrollerHeight,\n scrollerWidth: size.scrollerWidth\n };\n if (height && (force || size.height != height)) {\n size.height = height;\n changes |= this.CHANGE_SIZE;\n\n size.scrollerHeight = size.height;\n if (this.$horizScroll)\n size.scrollerHeight -= this.scrollBarH.getHeight();\n this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n changes = changes | this.CHANGE_SCROLL;\n }\n\n if (width && (force || size.width != width)) {\n changes |= this.CHANGE_SIZE;\n size.width = width;\n \n if (gutterWidth == null)\n gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n \n this.gutterWidth = gutterWidth;\n \n this.scrollBarH.element.style.left = \n this.scroller.style.left = gutterWidth + \"px\";\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); \n \n this.scrollBarH.element.style.right = \n this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n changes |= this.CHANGE_FULL;\n }\n \n size.$dirty = !width || !height;\n\n if (changes)\n this._signal(\"resize\", oldSize);\n\n return changes;\n };\n\n this.onGutterResize = function() {\n var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n if (gutterWidth != this.gutterWidth)\n this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else if (this.$size.$dirty) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else {\n this.$computeLayerConfig();\n this.$loop.schedule(this.CHANGE_MARKER);\n }\n };\n this.adjustWrapLimit = function() {\n var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n var limit = Math.floor(availableWidth / this.characterWidth);\n return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n };\n this.setAnimatedScroll = function(shouldAnimate){\n this.setOption(\"animatedScroll\", shouldAnimate);\n };\n this.getAnimatedScroll = function() {\n return this.$animatedScroll;\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.setOption(\"showInvisibles\", showInvisibles);\n this.session.$bidiHandler.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.getOption(\"showInvisibles\");\n };\n this.getDisplayIndentGuides = function() {\n return this.getOption(\"displayIndentGuides\");\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.setOption(\"displayIndentGuides\", display);\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.setOption(\"showPrintMargin\", showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.getOption(\"showPrintMargin\");\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.setOption(\"printMarginColumn\", showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.getOption(\"printMarginColumn\");\n };\n this.getShowGutter = function(){\n return this.getOption(\"showGutter\");\n };\n this.setShowGutter = function(show){\n return this.setOption(\"showGutter\", show);\n };\n\n this.getFadeFoldWidgets = function(){\n return this.getOption(\"fadeFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(show) {\n this.setOption(\"fadeFoldWidgets\", show);\n };\n\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n\n this.$updateGutterLineHighlight = function() {\n var pos = this.$cursorLayer.$pixelPos;\n var height = this.layerConfig.lineHeight;\n if (this.session.getUseWrapMode()) {\n var cursor = this.session.selection.getCursor();\n cursor.column = 0;\n pos = this.$cursorLayer.getPixelPosition(cursor, true);\n height *= this.session.getRowLength(cursor.row);\n }\n this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n this.$gutterLineHighlight.style.height = height + \"px\";\n };\n\n this.$updatePrintMargin = function() {\n if (!this.$showPrintMargin && !this.$printMarginEl)\n return;\n\n if (!this.$printMarginEl) {\n var containerEl = dom.createElement(\"div\");\n containerEl.className = \"ace_layer ace_print-margin-layer\";\n this.$printMarginEl = dom.createElement(\"div\");\n this.$printMarginEl.className = \"ace_print-margin\";\n containerEl.appendChild(this.$printMarginEl);\n this.content.insertBefore(containerEl, this.content.firstChild);\n }\n\n var style = this.$printMarginEl.style;\n style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n \n if (this.session && this.session.$wrap == -1)\n this.adjustWrapLimit();\n };\n this.getContainerElement = function() {\n return this.container;\n };\n this.getMouseEventTarget = function() {\n return this.scroller;\n };\n this.getTextAreaContainer = function() {\n return this.container;\n };\n this.$moveTextAreaToCursor = function() {\n if (!this.$keepTextAreaAtCursor)\n return;\n var config = this.layerConfig;\n var posTop = this.$cursorLayer.$pixelPos.top;\n var posLeft = this.$cursorLayer.$pixelPos.left;\n posTop -= config.offset;\n\n var style = this.textarea.style;\n var h = this.lineHeight;\n if (posTop < 0 || posTop > config.height - h) {\n style.top = style.left = \"0\";\n return;\n }\n\n var w = this.characterWidth;\n if (this.$composition) {\n var val = this.textarea.value.replace(/^\\x01+/, \"\");\n w *= (this.session.$getStringScreenWidth(val)[0]+2);\n h += 2;\n }\n posLeft -= this.scrollLeft;\n if (posLeft > this.$size.scrollerWidth - w)\n posLeft = this.$size.scrollerWidth - w;\n\n posLeft += this.gutterWidth;\n style.height = h + \"px\";\n style.width = w + \"px\";\n style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \"px\";\n style.top = Math.min(posTop, this.$size.height - h) + \"px\";\n };\n this.getFirstVisibleRow = function() {\n return this.layerConfig.firstRow;\n };\n this.getFirstFullyVisibleRow = function() {\n return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n };\n this.getLastFullyVisibleRow = function() {\n var config = this.layerConfig;\n var lastRow = config.lastRow;\n var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n return lastRow - 1;\n return lastRow;\n };\n this.getLastVisibleRow = function() {\n return this.layerConfig.lastRow;\n };\n\n this.$padding = null;\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.$textLayer.setPadding(padding);\n this.$cursorLayer.setPadding(padding);\n this.$markerFront.setPadding(padding);\n this.$markerBack.setPadding(padding);\n this.$loop.schedule(this.CHANGE_FULL);\n this.$updatePrintMargin();\n };\n \n this.setScrollMargin = function(top, bottom, left, right) {\n var sm = this.scrollMargin;\n sm.top = top|0;\n sm.bottom = bottom|0;\n sm.right = right|0;\n sm.left = left|0;\n sm.v = sm.top + sm.bottom;\n sm.h = sm.left + sm.right;\n if (sm.top && this.scrollTop <= 0 && this.session)\n this.session.setScrollTop(-sm.top);\n this.updateFull();\n };\n this.getHScrollBarAlwaysVisible = function() {\n return this.$hScrollBarAlwaysVisible;\n };\n this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n };\n this.getVScrollBarAlwaysVisible = function() {\n return this.$vScrollBarAlwaysVisible;\n };\n this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n };\n\n this.$updateScrollBarV = function() {\n var scrollHeight = this.layerConfig.maxHeight;\n var scrollerHeight = this.$size.scrollerHeight;\n if (!this.$maxLines && this.$scrollPastEnd) {\n scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n if (this.scrollTop > scrollHeight - scrollerHeight) {\n scrollHeight = this.scrollTop + scrollerHeight;\n this.scrollBarV.scrollTop = null;\n }\n }\n this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n };\n this.$updateScrollBarH = function() {\n this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n };\n \n this.$frozen = false;\n this.freeze = function() {\n this.$frozen = true;\n };\n \n this.unfreeze = function() {\n this.$frozen = false;\n };\n\n this.$renderChanges = function(changes, force) {\n if (this.$changes) {\n changes |= this.$changes;\n this.$changes = 0;\n }\n if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n this.$changes |= changes;\n return; \n } \n if (this.$size.$dirty) {\n this.$changes |= changes;\n return this.onResize(true);\n }\n if (!this.lineHeight) {\n this.$textLayer.checkForSizeChanges();\n }\n \n this._signal(\"beforeRender\");\n\n if (this.session && this.session.$bidiHandler)\n this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);\n\n var config = this.layerConfig;\n if (changes & this.CHANGE_FULL ||\n changes & this.CHANGE_SIZE ||\n changes & this.CHANGE_TEXT ||\n changes & this.CHANGE_LINES ||\n changes & this.CHANGE_SCROLL ||\n changes & this.CHANGE_H_SCROLL\n ) {\n changes |= this.$computeLayerConfig();\n if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n if (st > 0) {\n this.scrollTop = st;\n changes = changes | this.CHANGE_SCROLL;\n changes |= this.$computeLayerConfig();\n }\n }\n config = this.layerConfig;\n this.$updateScrollBarV();\n if (changes & this.CHANGE_H_SCROLL)\n this.$updateScrollBarH();\n this.$gutterLayer.element.style.marginTop = (-config.offset) + \"px\";\n this.content.style.marginTop = (-config.offset) + \"px\";\n this.content.style.width = config.width + 2 * this.$padding + \"px\";\n this.content.style.height = config.minHeight + \"px\";\n }\n if (changes & this.CHANGE_H_SCROLL) {\n this.content.style.marginLeft = -this.scrollLeft + \"px\";\n this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n }\n if (changes & this.CHANGE_FULL) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this._signal(\"afterRender\");\n return;\n }\n if (changes & this.CHANGE_SCROLL) {\n if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n this.$textLayer.update(config);\n else\n this.$textLayer.scrollLines(config);\n\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\");\n return;\n }\n\n if (changes & this.CHANGE_TEXT) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_LINES) {\n if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n\n if (changes & this.CHANGE_CURSOR) {\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n this.$markerFront.update(config);\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n this.$markerBack.update(config);\n }\n\n this._signal(\"afterRender\");\n };\n\n \n this.$autosize = function() {\n var height = this.session.getScreenLength() * this.lineHeight;\n var maxHeight = this.$maxLines * this.lineHeight;\n var desiredHeight = Math.min(maxHeight,\n Math.max((this.$minLines || 1) * this.lineHeight, height)\n ) + this.scrollMargin.v + (this.$extraHeight || 0);\n if (this.$horizScroll)\n desiredHeight += this.scrollBarH.getHeight();\n if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n desiredHeight = this.$maxPixelHeight;\n var vScroll = height > maxHeight;\n \n if (desiredHeight != this.desiredHeight ||\n this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n if (vScroll != this.$vScroll) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n \n var w = this.container.clientWidth;\n this.container.style.height = desiredHeight + \"px\";\n this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n this.desiredHeight = desiredHeight;\n \n this._signal(\"autosize\");\n }\n };\n \n this.$computeLayerConfig = function() {\n var session = this.session;\n var size = this.$size;\n \n var hideScrollbars = size.height <= 2 * this.lineHeight;\n var screenLines = this.session.getScreenLength();\n var maxHeight = screenLines * this.lineHeight;\n\n var longestLine = this.$getLongestLine();\n \n var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n var hScrollChanged = this.$horizScroll !== horizScroll;\n if (hScrollChanged) {\n this.$horizScroll = horizScroll;\n this.scrollBarH.setVisible(horizScroll);\n }\n var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n if (this.$maxLines && this.lineHeight > 1)\n this.$autosize();\n\n var offset = this.scrollTop % this.lineHeight;\n var minHeight = size.scrollerHeight + this.lineHeight;\n \n var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n : 0;\n maxHeight += scrollPastEnd;\n \n var sm = this.scrollMargin;\n this.session.setScrollTop(Math.max(-sm.top,\n Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\n this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n \n var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n var vScrollChanged = vScrollBefore !== vScroll;\n if (vScrollChanged) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n\n var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n var lastRow = firstRow + lineCount;\n var firstRowScreen, firstRowHeight;\n var lineHeight = this.lineHeight;\n firstRow = session.screenToDocumentRow(firstRow, 0);\n var foldLine = session.getFoldLine(firstRow);\n if (foldLine) {\n firstRow = foldLine.start.row;\n }\n\n firstRowScreen = session.documentToScreenRow(firstRow, 0);\n firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n firstRowHeight;\n\n offset = this.scrollTop - firstRowScreen * lineHeight;\n\n var changes = 0;\n if (this.layerConfig.width != longestLine) \n changes = this.CHANGE_H_SCROLL;\n if (hScrollChanged || vScrollChanged) {\n changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n this._signal(\"scrollbarVisibilityChanged\");\n if (vScrollChanged)\n longestLine = this.$getLongestLine();\n }\n \n this.layerConfig = {\n width : longestLine,\n padding : this.$padding,\n firstRow : firstRow,\n firstRowScreen: firstRowScreen,\n lastRow : lastRow,\n lineHeight : lineHeight,\n characterWidth : this.characterWidth,\n minHeight : minHeight,\n maxHeight : maxHeight,\n offset : offset,\n gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n height : this.$size.scrollerHeight\n };\n\n return changes;\n };\n\n this.$updateLines = function() {\n if (!this.$changedLines) return;\n var firstRow = this.$changedLines.firstRow;\n var lastRow = this.$changedLines.lastRow;\n this.$changedLines = null;\n\n var layerConfig = this.layerConfig;\n\n if (firstRow > layerConfig.lastRow + 1) { return; }\n if (lastRow < layerConfig.firstRow) { return; }\n if (lastRow === Infinity) {\n if (this.$showGutter)\n this.$gutterLayer.update(layerConfig);\n this.$textLayer.update(layerConfig);\n return;\n }\n this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n return true;\n };\n\n this.$getLongestLine = function() {\n var charCount = this.session.getScreenWidth();\n if (this.showInvisibles && !this.session.$useWrapMode)\n charCount += 1;\n\n return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n };\n this.updateFrontMarkers = function() {\n this.$markerFront.setMarkers(this.session.getMarkers(true));\n this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n };\n this.updateBackMarkers = function() {\n this.$markerBack.setMarkers(this.session.getMarkers());\n this.$loop.schedule(this.CHANGE_MARKER_BACK);\n };\n this.addGutterDecoration = function(row, className){\n this.$gutterLayer.addGutterDecoration(row, className);\n };\n this.removeGutterDecoration = function(row, className){\n this.$gutterLayer.removeGutterDecoration(row, className);\n };\n this.updateBreakpoints = function(rows) {\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.setAnnotations = function(annotations) {\n this.$gutterLayer.setAnnotations(annotations);\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.updateCursor = function() {\n this.$loop.schedule(this.CHANGE_CURSOR);\n };\n this.hideCursor = function() {\n this.$cursorLayer.hideCursor();\n };\n this.showCursor = function() {\n this.$cursorLayer.showCursor();\n };\n\n this.scrollSelectionIntoView = function(anchor, lead, offset) {\n this.scrollCursorIntoView(anchor, offset);\n this.scrollCursorIntoView(lead, offset);\n };\n this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n if (this.$size.scrollerHeight === 0)\n return;\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n var left = pos.left;\n var top = pos.top;\n \n var topMargin = $viewMargin && $viewMargin.top || 0;\n var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n \n var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n \n if (scrollTop + topMargin > top) {\n if (offset && scrollTop + topMargin > top + this.lineHeight)\n top -= offset * this.$size.scrollerHeight;\n if (top === 0)\n top = -this.scrollMargin.top;\n this.session.setScrollTop(top);\n } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)\n top += offset * this.$size.scrollerHeight;\n this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n }\n\n var scrollLeft = this.scrollLeft;\n\n if (scrollLeft > left) {\n if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n left = -this.scrollMargin.left;\n this.session.setScrollLeft(left);\n } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n this.session.setScrollLeft(0);\n }\n };\n this.getScrollTop = function() {\n return this.session.getScrollTop();\n };\n this.getScrollLeft = function() {\n return this.session.getScrollLeft();\n };\n this.getScrollTopRow = function() {\n return this.scrollTop / this.lineHeight;\n };\n this.getScrollBottomRow = function() {\n return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n };\n this.scrollToRow = function(row) {\n this.session.setScrollTop(row * this.lineHeight);\n };\n\n this.alignCursor = function(cursor, alignment) {\n if (typeof cursor == \"number\")\n cursor = {row: cursor, column: 0};\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n var h = this.$size.scrollerHeight - this.lineHeight;\n var offset = pos.top - h * (alignment || 0);\n\n this.session.setScrollTop(offset);\n return offset;\n };\n\n this.STEPS = 8;\n this.$calcSteps = function(fromValue, toValue){\n var i = 0;\n var l = this.STEPS;\n var steps = [];\n\n var func = function(t, x_min, dx) {\n return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n };\n\n for (i = 0; i < l; ++i)\n steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n return steps;\n };\n this.scrollToLine = function(line, center, animate, callback) {\n var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n var offset = pos.top;\n if (center)\n offset -= this.$size.scrollerHeight / 2;\n\n var initialScroll = this.scrollTop;\n this.session.setScrollTop(offset);\n if (animate !== false)\n this.animateScrolling(initialScroll, callback);\n };\n\n this.animateScrolling = function(fromValue, callback) {\n var toValue = this.scrollTop;\n if (!this.$animatedScroll)\n return;\n var _self = this;\n \n if (fromValue == toValue)\n return;\n \n if (this.$scrollAnimation) {\n var oldSteps = this.$scrollAnimation.steps;\n if (oldSteps.length) {\n fromValue = oldSteps[0];\n if (fromValue == toValue)\n return;\n }\n }\n \n var steps = _self.$calcSteps(fromValue, toValue);\n this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n clearInterval(this.$timer);\n\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n this.$timer = setInterval(function() {\n if (steps.length) {\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n } else if (toValue != null) {\n _self.session.$scrollTop = -1;\n _self.session.setScrollTop(toValue);\n toValue = null;\n } else {\n _self.$timer = clearInterval(_self.$timer);\n _self.$scrollAnimation = null;\n callback && callback();\n }\n }, 10);\n };\n this.scrollToY = function(scrollTop) {\n if (this.scrollTop !== scrollTop) {\n this.$loop.schedule(this.CHANGE_SCROLL);\n this.scrollTop = scrollTop;\n }\n };\n this.scrollToX = function(scrollLeft) {\n if (this.scrollLeft !== scrollLeft)\n this.scrollLeft = scrollLeft;\n this.$loop.schedule(this.CHANGE_H_SCROLL);\n };\n this.scrollTo = function(x, y) {\n this.session.setScrollTop(y);\n this.session.setScrollLeft(y);\n };\n this.scrollBy = function(deltaX, deltaY) {\n deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n };\n this.isScrollableBy = function(deltaX, deltaY) {\n if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n return true;\n if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n return true;\n if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n return true;\n if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n - this.layerConfig.width < -1 + this.scrollMargin.right)\n return true;\n };\n\n this.pixelToScreenCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n var col = Math.round(offset);\n\n return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX};\n };\n\n this.screenToTextCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n\n var col = Math.round(offsetX / this.characterWidth);\n\n var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;\n\n return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX);\n };\n this.textToScreenCoordinates = function(row, column) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var pos = this.session.documentToScreenPosition(row, column);\n\n var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : Math.round(pos.column * this.characterWidth));\n\n var y = pos.row * this.lineHeight;\n\n return {\n pageX: canvasPos.left + x - this.scrollLeft,\n pageY: canvasPos.top + y - this.scrollTop\n };\n };\n this.visualizeFocus = function() {\n dom.addCssClass(this.container, \"ace_focus\");\n };\n this.visualizeBlur = function() {\n dom.removeCssClass(this.container, \"ace_focus\");\n };\n this.showComposition = function(position) {\n if (!this.$composition)\n this.$composition = {\n keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n cssText: this.textarea.style.cssText\n };\n\n this.$keepTextAreaAtCursor = true;\n dom.addCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = \"\";\n this.$moveTextAreaToCursor();\n };\n this.setCompositionText = function(text) {\n this.$moveTextAreaToCursor();\n };\n this.hideComposition = function() {\n if (!this.$composition)\n return;\n\n dom.removeCssClass(this.textarea, \"ace_composition\");\n this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n this.textarea.style.cssText = this.$composition.cssText;\n this.$composition = null;\n };\n this.setTheme = function(theme, cb) {\n var _self = this;\n this.$themeId = theme;\n _self._dispatchEvent('themeChange',{theme:theme});\n\n if (!theme || typeof theme == \"string\") {\n var moduleName = theme || this.$options.theme.initialValue;\n config.loadModule([\"theme\", moduleName], afterLoad);\n } else {\n afterLoad(theme);\n }\n\n function afterLoad(module) {\n if (_self.$themeId != theme)\n return cb && cb();\n if (!module || !module.cssClass)\n throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n dom.importCssString(\n module.cssText,\n module.cssClass,\n _self.container.ownerDocument\n );\n\n if (_self.theme)\n dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n var padding = \"padding\" in module ? module.padding \n : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n if (_self.$padding && padding != _self.$padding)\n _self.setPadding(padding);\n _self.$theme = module.cssClass;\n\n _self.theme = module;\n dom.addCssClass(_self.container, module.cssClass);\n dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n if (_self.$size) {\n _self.$size.width = 0;\n _self.$updateSizeAsync();\n }\n\n _self._dispatchEvent('themeLoaded', {theme:module});\n cb && cb();\n }\n };\n this.getTheme = function() {\n return this.$themeId;\n };\n this.setStyle = function(style, include) {\n dom.setCssClass(this.container, style, include !== false);\n };\n this.unsetStyle = function(style) {\n dom.removeCssClass(this.container, style);\n };\n \n this.setCursorStyle = function(style) {\n if (this.scroller.style.cursor != style)\n this.scroller.style.cursor = style;\n };\n this.setMouseCursor = function(cursorStyle) {\n this.scroller.style.cursor = cursorStyle;\n };\n this.destroy = function() {\n this.$textLayer.destroy();\n this.$cursorLayer.destroy();\n };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n animatedScroll: {initialValue: false},\n showInvisibles: {\n set: function(value) {\n if (this.$textLayer.setShowInvisibles(value))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: false\n },\n showPrintMargin: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: true\n },\n printMarginColumn: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: 80\n },\n printMargin: {\n set: function(val) {\n if (typeof val == \"number\")\n this.$printMarginColumn = val;\n this.$showPrintMargin = !!val;\n this.$updatePrintMargin();\n },\n get: function() {\n return this.$showPrintMargin && this.$printMarginColumn; \n }\n },\n showGutter: {\n set: function(show){\n this.$gutter.style.display = show ? \"block\" : \"none\";\n this.$loop.schedule(this.CHANGE_FULL);\n this.onGutterResize();\n },\n initialValue: true\n },\n fadeFoldWidgets: {\n set: function(show) {\n dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n },\n initialValue: false\n },\n showFoldWidgets: {\n set: function(show) {this.$gutterLayer.setShowFoldWidgets(show);},\n initialValue: true\n },\n showLineNumbers: {\n set: function(show) {\n this.$gutterLayer.setShowLineNumbers(show);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: true\n },\n displayIndentGuides: {\n set: function(show) {\n if (this.$textLayer.setDisplayIndentGuides(show))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: true\n },\n highlightGutterLine: {\n set: function(shouldHighlight) {\n if (!this.$gutterLineHighlight) {\n this.$gutterLineHighlight = dom.createElement(\"div\");\n this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n this.$gutter.appendChild(this.$gutterLineHighlight);\n return;\n }\n\n this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n if (this.$cursorLayer.$pixelPos)\n this.$updateGutterLineHighlight();\n },\n initialValue: false,\n value: true\n },\n hScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n vScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n fontSize: {\n set: function(size) {\n if (typeof size == \"number\")\n size = size + \"px\";\n this.container.style.fontSize = size;\n this.updateFontSize();\n },\n initialValue: 12\n },\n fontFamily: {\n set: function(name) {\n this.container.style.fontFamily = name;\n this.updateFontSize();\n }\n },\n maxLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n minLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n maxPixelHeight: {\n set: function(val) {\n this.updateFull();\n },\n initialValue: 0\n },\n scrollPastEnd: {\n set: function(val) {\n val = +val || 0;\n if (this.$scrollPastEnd == val)\n return;\n this.$scrollPastEnd = val;\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: 0,\n handlesSet: true\n },\n fixedWidthGutter: {\n set: function(val) {\n this.$gutterLayer.$fixedWidth = !!val;\n this.$loop.schedule(this.CHANGE_GUTTER);\n }\n },\n theme: {\n set: function(val) { this.setTheme(val); },\n get: function() { return this.$themeId || this.theme; },\n initialValue: \"./theme/textmate\",\n handlesSet: true\n }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar net = acequire(\"../lib/net\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\nvar config = acequire(\"../config\");\n\nfunction $workerBlob(workerUrl, mod) {\n var script = mod.src;\"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n try {\n return new Blob([script], {\"type\": \"application/javascript\"});\n } catch (e) { // Backwards-compatibility\n var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n var blobBuilder = new BlobBuilder();\n blobBuilder.append(script);\n return blobBuilder.getBlob(\"application/javascript\");\n }\n}\n\nfunction createWorker(workerUrl, mod) {\n var blob = $workerBlob(workerUrl, mod);\n var URL = window.URL || window.webkitURL;\n var blobURL = URL.createObjectURL(blob);\n return new Worker(blobURL);\n}\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.onMessage = this.onMessage.bind(this);\n if (acequire.nameToUrl && !acequire.toUrl)\n acequire.toUrl = acequire.nameToUrl;\n \n if (config.get(\"packaged\") || !acequire.toUrl) {\n workerUrl = workerUrl || config.moduleUrl(mod.id, \"worker\");\n } else {\n var normalizePath = this.$normalizePath;\n workerUrl = workerUrl || normalizePath(acequire.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n var tlns = {};\n topLevelNamespaces.forEach(function(ns) {\n tlns[ns] = normalizePath(acequire.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n });\n }\n\n this.$worker = createWorker(workerUrl, mod);\n if (importScripts) {\n this.send(\"importScripts\", importScripts);\n }\n this.$worker.postMessage({\n init : true,\n tlns : tlns,\n module : mod.id,\n classname : classname\n });\n\n this.callbackId = 1;\n this.callbacks = {};\n\n this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.onMessage = function(e) {\n var msg = e.data;\n switch (msg.type) {\n case \"event\":\n this._signal(msg.name, {data: msg.data});\n break;\n case \"call\":\n var callback = this.callbacks[msg.id];\n if (callback) {\n callback(msg.data);\n delete this.callbacks[msg.id];\n }\n break;\n case \"error\":\n this.reportError(msg.data);\n break;\n case \"log\":\n window.console && console.log && console.log.apply(console, msg.data);\n break;\n }\n };\n \n this.reportError = function(err) {\n window.console && console.error && console.error(err);\n };\n\n this.$normalizePath = function(path) {\n return net.qualifyURL(path);\n };\n\n this.terminate = function() {\n this._signal(\"terminate\", {});\n this.deltaQueue = null;\n this.$worker.terminate();\n this.$worker = null;\n if (this.$doc)\n this.$doc.off(\"change\", this.changeListener);\n this.$doc = null;\n };\n\n this.send = function(cmd, args) {\n this.$worker.postMessage({command: cmd, args: args});\n };\n\n this.call = function(cmd, args, callback) {\n if (callback) {\n var id = this.callbackId++;\n this.callbacks[id] = callback;\n args.push(id);\n }\n this.send(cmd, args);\n };\n\n this.emit = function(event, data) {\n try {\n this.$worker.postMessage({event: event, data: {data: data.data}});\n }\n catch(ex) {\n console.error(ex.stack);\n }\n };\n\n this.attachToDocument = function(doc) {\n if (this.$doc)\n this.terminate();\n\n this.$doc = doc;\n this.call(\"setValue\", [doc.getValue()]);\n doc.on(\"change\", this.changeListener);\n };\n\n this.changeListener = function(delta) {\n if (!this.deltaQueue) {\n this.deltaQueue = [];\n setTimeout(this.$sendDeltaQueue, 0);\n }\n if (delta.action == \"insert\")\n this.deltaQueue.push(delta.start, delta.lines);\n else\n this.deltaQueue.push(delta.start, delta.end);\n };\n\n this.$sendDeltaQueue = function() {\n var q = this.deltaQueue;\n if (!q) return;\n this.deltaQueue = null;\n if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n this.call(\"setValue\", [this.$doc.getValue()]);\n } else\n this.emit(\"change\", {data: q});\n };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.callbackId = 1;\n this.callbacks = {};\n this.messageBuffer = [];\n\n var main = null;\n var emitSync = false;\n var sender = Object.create(EventEmitter);\n var _self = this;\n\n this.$worker = {};\n this.$worker.terminate = function() {};\n this.$worker.postMessage = function(e) {\n _self.messageBuffer.push(e);\n if (main) {\n if (emitSync)\n setTimeout(processNext);\n else\n processNext();\n }\n };\n this.setEmitSync = function(val) { emitSync = val; };\n\n var processNext = function() {\n var msg = _self.messageBuffer.shift();\n if (msg.command)\n main[msg.command].apply(main, msg.args);\n else if (msg.event)\n sender._signal(msg.event, msg.data);\n };\n\n sender.postMessage = function(msg) {\n _self.onMessage({data: msg});\n };\n sender.callback = function(data, callbackId) {\n this.postMessage({type: \"call\", id: callbackId, data: data});\n };\n sender.emit = function(name, data) {\n this.postMessage({type: \"event\", name: name, data: data});\n };\n\n config.loadModule([\"worker\", mod], function(Main) {\n main = new Main[classname](sender);\n while (_self.messageBuffer.length)\n processNext();\n });\n};\n\nUIWorkerClient.prototype = WorkerClient.prototype;\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\nexports.createWorker = createWorker;\n\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar oop = acequire(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n var _self = this;\n this.length = length;\n this.session = session;\n this.doc = session.getDocument();\n this.mainClass = mainClass;\n this.othersClass = othersClass;\n this.$onUpdate = this.onUpdate.bind(this);\n this.doc.on(\"change\", this.$onUpdate);\n this.$others = others;\n \n this.$onCursorChange = function() {\n setTimeout(function() {\n _self.onCursorChange();\n });\n };\n \n this.$pos = pos;\n var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n this.$undoStackDepth = undoStack.length;\n this.setup();\n\n session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setup = function() {\n var _self = this;\n var doc = this.doc;\n var session = this.session;\n \n this.selectionBefore = session.selection.toJSON();\n if (session.selection.inMultiSelectMode)\n session.selection.toSingleRange();\n\n this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n var pos = this.pos;\n pos.$insertRight = true;\n pos.detach();\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n this.others = [];\n this.$others.forEach(function(other) {\n var anchor = doc.createAnchor(other.row, other.column);\n anchor.$insertRight = true;\n anchor.detach();\n _self.others.push(anchor);\n });\n session.setUndoSelect(false);\n };\n this.showOtherMarkers = function() {\n if (this.othersActive) return;\n var session = this.session;\n var _self = this;\n this.othersActive = true;\n this.others.forEach(function(anchor) {\n anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n });\n };\n this.hideOtherMarkers = function() {\n if (!this.othersActive) return;\n this.othersActive = false;\n for (var i = 0; i < this.others.length; i++) {\n this.session.removeMarker(this.others[i].markerId);\n }\n };\n this.onUpdate = function(delta) {\n if (this.$updating)\n return this.updateAnchors(delta);\n \n var range = delta;\n if (range.start.row !== range.end.row) return;\n if (range.start.row !== this.pos.row) return;\n this.$updating = true;\n var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1;\n var distanceFromStart = range.start.column - this.pos.column;\n \n this.updateAnchors(delta);\n \n if (inMainRange)\n this.length += lengthDiff;\n\n if (inMainRange && !this.session.$fromUndo) {\n if (delta.action === 'insert') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.insertMergedLines(newPos, delta.lines);\n }\n } else if (delta.action === 'remove') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n }\n }\n }\n \n this.$updating = false;\n this.updateMarkers();\n };\n \n this.updateAnchors = function(delta) {\n this.pos.onChange(delta);\n for (var i = this.others.length; i--;)\n this.others[i].onChange(delta);\n this.updateMarkers();\n };\n \n this.updateMarkers = function() {\n if (this.$updating)\n return;\n var _self = this;\n var session = this.session;\n var updateMarker = function(pos, className) {\n session.removeMarker(pos.markerId);\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n };\n updateMarker(this.pos, this.mainClass);\n for (var i = this.others.length; i--;)\n updateMarker(this.others[i], this.othersClass);\n };\n\n this.onCursorChange = function(event) {\n if (this.$updating || !this.session) return;\n var pos = this.session.selection.getCursor();\n if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n this.showOtherMarkers();\n this._emit(\"cursorEnter\", event);\n } else {\n this.hideOtherMarkers();\n this._emit(\"cursorLeave\", event);\n }\n }; \n this.detach = function() {\n this.session.removeMarker(this.pos && this.pos.markerId);\n this.hideOtherMarkers();\n this.doc.removeEventListener(\"change\", this.$onUpdate);\n this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n this.session.setUndoSelect(true);\n this.session = null;\n };\n this.cancel = function() {\n if (this.$undoStackDepth === -1)\n return;\n var undoManager = this.session.getUndoManager();\n var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n for (var i = 0; i < undosRequired; i++) {\n undoManager.undo(true);\n }\n if (this.selectionBefore)\n this.session.selection.fromJSON(this.selectionBefore);\n };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n var ev = e.domEvent;\n var alt = ev.altKey;\n var shift = ev.shiftKey;\n var ctrl = ev.ctrlKey;\n var accel = e.getAccelKey();\n var button = e.getButton();\n \n if (ctrl && useragent.isMac)\n button = ev.button;\n\n if (e.editor.inMultiSelectMode && button == 2) {\n e.editor.textInput.onContextMenu(e.domEvent);\n return;\n }\n \n if (!ctrl && !alt && !accel) {\n if (button === 0 && e.editor.inMultiSelectMode)\n e.editor.exitMultiSelectMode();\n return;\n }\n \n if (button !== 0)\n return;\n\n var editor = e.editor;\n var selection = editor.selection;\n var isMultiSelect = editor.inMultiSelectMode;\n var pos = e.getDocumentPosition();\n var cursor = selection.getCursor();\n var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n var mouseX = e.x, mouseY = e.y;\n var onMouseSelection = function(e) {\n mouseX = e.clientX;\n mouseY = e.clientY;\n };\n \n var session = editor.session;\n var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var screenCursor = screenAnchor;\n \n var selectionMode;\n if (editor.$mouseHandler.$enableJumpToDef) {\n if (ctrl && alt || accel && alt)\n selectionMode = shift ? \"block\" : \"add\";\n else if (alt && editor.$blockSelectEnabled)\n selectionMode = \"block\";\n } else {\n if (accel && !alt) {\n selectionMode = \"add\";\n if (!isMultiSelect && shift)\n return;\n } else if (alt && editor.$blockSelectEnabled) {\n selectionMode = \"block\";\n }\n }\n \n if (selectionMode && useragent.isMac && ev.ctrlKey) {\n editor.$mouseHandler.cancelContextMenu();\n }\n\n if (selectionMode == \"add\") {\n if (!isMultiSelect && inSelection)\n return; // dragging\n\n if (!isMultiSelect) {\n var range = selection.toOrientedRange();\n editor.addSelectionMarker(range);\n }\n\n var oldRange = selection.rangeList.rangeAtPoint(pos);\n \n \n editor.$blockScrolling++;\n editor.inVirtualSelectionMode = true;\n \n if (shift) {\n oldRange = null;\n range = selection.ranges[0] || range;\n editor.removeSelectionMarker(range);\n }\n editor.once(\"mouseup\", function() {\n var tmpSel = selection.toOrientedRange();\n\n if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n selection.substractPoint(tmpSel.cursor);\n else {\n if (shift) {\n selection.substractPoint(range.cursor);\n } else if (range) {\n editor.removeSelectionMarker(range);\n selection.addRange(range);\n }\n selection.addRange(tmpSel);\n }\n editor.$blockScrolling--;\n editor.inVirtualSelectionMode = false;\n });\n\n } else if (selectionMode == \"block\") {\n e.stop();\n editor.inVirtualSelectionMode = true; \n var initialRange;\n var rectSel = [];\n var blockSelect = function() {\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX);\n\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n return;\n screenCursor = newCursor;\n \n editor.$blockScrolling++;\n editor.selection.moveToPosition(cursor);\n editor.renderer.scrollCursorIntoView();\n\n editor.removeSelectionMarkers(rectSel);\n rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n rectSel.forEach(editor.addSelectionMarker, editor);\n editor.updateSelectionMarkers();\n editor.$blockScrolling--;\n };\n editor.$blockScrolling++;\n if (isMultiSelect && !accel) {\n selection.toSingleRange();\n } else if (!isMultiSelect && accel) {\n initialRange = selection.toOrientedRange();\n editor.addSelectionMarker(initialRange);\n }\n \n if (shift)\n screenAnchor = session.documentToScreenPosition(selection.lead); \n else\n selection.moveToPosition(pos);\n editor.$blockScrolling--;\n \n screenCursor = {row: -1, column: -1};\n\n var onMouseSelectionEnd = function(e) {\n clearInterval(timerId);\n editor.removeSelectionMarkers(rectSel);\n if (!rectSel.length)\n rectSel = [selection.toOrientedRange()];\n editor.$blockScrolling++;\n if (initialRange) {\n editor.removeSelectionMarker(initialRange);\n selection.toSingleRange(initialRange);\n }\n for (var i = 0; i < rectSel.length; i++)\n selection.addRange(rectSel[i]);\n editor.inVirtualSelectionMode = false;\n editor.$mouseHandler.$clickSelection = null;\n editor.$blockScrolling--;\n };\n\n var onSelectionInterval = blockSelect;\n\n event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n return e.preventDefault();\n }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\nace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(acequire, exports, module) {\nexports.defaultCommands = [{\n name: \"addCursorAbove\",\n exec: function(editor) { editor.selectMoreLines(-1); },\n bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelow\",\n exec: function(editor) { editor.selectMoreLines(1); },\n bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorAboveSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelowSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreBefore\",\n exec: function(editor) { editor.selectMore(-1); },\n bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreAfter\",\n exec: function(editor) { editor.selectMore(1); },\n bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextBefore\",\n exec: function(editor) { editor.selectMore(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextAfter\",\n exec: function(editor) { editor.selectMore(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"splitIntoLines\",\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n readOnly: true\n}, {\n name: \"alignCursors\",\n exec: function(editor) { editor.alignCursors(); },\n bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n scrollIntoView: \"cursor\"\n}, {\n name: \"findAll\",\n exec: function(editor) { editor.findAll(); },\n bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}];\nexports.multiSelectCommands = [{\n name: \"singleSelection\",\n bindKey: \"esc\",\n exec: function(editor) { editor.exitMultiSelectMode(); },\n scrollIntoView: \"cursor\",\n readOnly: true,\n isAvailable: function(editor) {return editor && editor.inMultiSelectMode;}\n}];\n\nvar HashHandler = acequire(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\nace.define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"], function(acequire, exports, module) {\n\nvar RangeList = acequire(\"./range_list\").RangeList;\nvar Range = acequire(\"./range\").Range;\nvar Selection = acequire(\"./selection\").Selection;\nvar onMouseDown = acequire(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = acequire(\"./lib/event\");\nvar lang = acequire(\"./lib/lang\");\nvar commands = acequire(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = acequire(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n search.$options.wrap = true;\n search.$options.needle = needle;\n search.$options.backwards = dir == -1;\n return search.find(session);\n}\nvar EditSession = acequire(\"./edit_session\").EditSession;\n(function() {\n this.getSelectionMarkers = function() {\n return this.$selectionMarkers;\n };\n}).call(EditSession.prototype);\n(function() {\n this.ranges = null;\n this.rangeList = null;\n this.addRange = function(range, $blockChangeEvents) {\n if (!range)\n return;\n\n if (!this.inMultiSelectMode && this.rangeCount === 0) {\n var oldRange = this.toOrientedRange();\n this.rangeList.add(oldRange);\n this.rangeList.add(range);\n if (this.rangeList.ranges.length != 2) {\n this.rangeList.removeAll();\n return $blockChangeEvents || this.fromOrientedRange(range);\n }\n this.rangeList.removeAll();\n this.rangeList.add(oldRange);\n this.$onAddRange(oldRange);\n }\n\n if (!range.cursor)\n range.cursor = range.end;\n\n var removed = this.rangeList.add(range);\n\n this.$onAddRange(range);\n\n if (removed.length)\n this.$onRemoveRange(removed);\n\n if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n this._signal(\"multiSelect\");\n this.inMultiSelectMode = true;\n this.session.$undoSelect = false;\n this.rangeList.attach(this.session);\n }\n\n return $blockChangeEvents || this.fromOrientedRange(range);\n };\n\n this.toSingleRange = function(range) {\n range = range || this.ranges[0];\n var removed = this.rangeList.removeAll();\n if (removed.length)\n this.$onRemoveRange(removed);\n\n range && this.fromOrientedRange(range);\n };\n this.substractPoint = function(pos) {\n var removed = this.rangeList.substractPoint(pos);\n if (removed) {\n this.$onRemoveRange(removed);\n return removed[0];\n }\n };\n this.mergeOverlappingRanges = function() {\n var removed = this.rangeList.merge();\n if (removed.length)\n this.$onRemoveRange(removed);\n else if(this.ranges[0])\n this.fromOrientedRange(this.ranges[0]);\n };\n\n this.$onAddRange = function(range) {\n this.rangeCount = this.rangeList.ranges.length;\n this.ranges.unshift(range);\n this._signal(\"addRange\", {range: range});\n };\n\n this.$onRemoveRange = function(removed) {\n this.rangeCount = this.rangeList.ranges.length;\n if (this.rangeCount == 1 && this.inMultiSelectMode) {\n var lastRange = this.rangeList.ranges.pop();\n removed.push(lastRange);\n this.rangeCount = 0;\n }\n\n for (var i = removed.length; i--; ) {\n var index = this.ranges.indexOf(removed[i]);\n this.ranges.splice(index, 1);\n }\n\n this._signal(\"removeRange\", {ranges: removed});\n\n if (this.rangeCount === 0 && this.inMultiSelectMode) {\n this.inMultiSelectMode = false;\n this._signal(\"singleSelect\");\n this.session.$undoSelect = true;\n this.rangeList.detach(this.session);\n }\n\n lastRange = lastRange || this.ranges[0];\n if (lastRange && !lastRange.isEqual(this.getRange()))\n this.fromOrientedRange(lastRange);\n };\n this.$initRangeList = function() {\n if (this.rangeList)\n return;\n\n this.rangeList = new RangeList();\n this.ranges = [];\n this.rangeCount = 0;\n };\n this.getAllRanges = function() {\n return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n };\n\n this.splitIntoLines = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var range = this.getRange();\n var isBackwards = this.isBackwards();\n var startRow = range.start.row;\n var endRow = range.end.row;\n if (startRow == endRow) {\n if (isBackwards)\n var start = range.end, end = range.start;\n else\n var start = range.start, end = range.end;\n \n this.addRange(Range.fromPoints(end, end));\n this.addRange(Range.fromPoints(start, start));\n return;\n }\n\n var rectSel = [];\n var r = this.getLineRange(startRow, true);\n r.start.column = range.start.column;\n rectSel.push(r);\n\n for (var i = startRow + 1; i < endRow; i++)\n rectSel.push(this.getLineRange(i, true));\n\n r = this.getLineRange(endRow, true);\n r.end.column = range.end.column;\n rectSel.push(r);\n\n rectSel.forEach(this.addRange, this);\n }\n };\n this.toggleBlockSelection = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var cursor = this.session.documentToScreenPosition(this.selectionLead);\n var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n var rectSel = this.rectangularRangeBlock(cursor, anchor);\n rectSel.forEach(this.addRange, this);\n }\n };\n this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n var rectSel = [];\n\n var xBackwards = screenCursor.column < screenAnchor.column;\n if (xBackwards) {\n var startColumn = screenCursor.column;\n var endColumn = screenAnchor.column;\n var startOffsetX = screenCursor.offsetX;\n var endOffsetX = screenAnchor.offsetX;\n } else {\n var startColumn = screenAnchor.column;\n var endColumn = screenCursor.column;\n var startOffsetX = screenAnchor.offsetX;\n var endOffsetX = screenCursor.offsetX;\n }\n\n var yBackwards = screenCursor.row < screenAnchor.row;\n if (yBackwards) {\n var startRow = screenCursor.row;\n var endRow = screenAnchor.row;\n } else {\n var startRow = screenAnchor.row;\n var endRow = screenCursor.row;\n }\n\n if (startColumn < 0)\n startColumn = 0;\n if (startRow < 0)\n startRow = 0;\n\n if (startRow == endRow)\n includeEmptyLines = true;\n\n for (var row = startRow; row <= endRow; row++) {\n var range = Range.fromPoints(\n this.session.screenToDocumentPosition(row, startColumn, startOffsetX),\n this.session.screenToDocumentPosition(row, endColumn, endOffsetX)\n );\n if (range.isEmpty()) {\n if (docEnd && isSamePoint(range.end, docEnd))\n break;\n var docEnd = range.end;\n }\n range.cursor = xBackwards ? range.start : range.end;\n rectSel.push(range);\n }\n\n if (yBackwards)\n rectSel.reverse();\n\n if (!includeEmptyLines) {\n var end = rectSel.length - 1;\n while (rectSel[end].isEmpty() && end > 0)\n end--;\n if (end > 0) {\n var start = 0;\n while (rectSel[start].isEmpty())\n start++;\n }\n for (var i = end; i >= start; i--) {\n if (rectSel[i].isEmpty())\n rectSel.splice(i, 1);\n }\n }\n\n return rectSel;\n };\n}).call(Selection.prototype);\nvar Editor = acequire(\"./editor\").Editor;\n(function() {\n this.updateSelectionMarkers = function() {\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n this.addSelectionMarker = function(orientedRange) {\n if (!orientedRange.cursor)\n orientedRange.cursor = orientedRange.end;\n\n var style = this.getSelectionStyle();\n orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n this.session.$selectionMarkers.push(orientedRange);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n return orientedRange;\n };\n this.removeSelectionMarker = function(range) {\n if (!range.marker)\n return;\n this.session.removeMarker(range.marker);\n var index = this.session.$selectionMarkers.indexOf(range);\n if (index != -1)\n this.session.$selectionMarkers.splice(index, 1);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n };\n\n this.removeSelectionMarkers = function(ranges) {\n var markerList = this.session.$selectionMarkers;\n for (var i = ranges.length; i--; ) {\n var range = ranges[i];\n if (!range.marker)\n continue;\n this.session.removeMarker(range.marker);\n var index = markerList.indexOf(range);\n if (index != -1)\n markerList.splice(index, 1);\n }\n this.session.selectionMarkerCount = markerList.length;\n };\n\n this.$onAddRange = function(e) {\n this.addSelectionMarker(e.range);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onRemoveRange = function(e) {\n this.removeSelectionMarkers(e.ranges);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onMultiSelect = function(e) {\n if (this.inMultiSelectMode)\n return;\n this.inMultiSelectMode = true;\n\n this.setStyle(\"ace_multiselect\");\n this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onSingleSelect = function(e) {\n if (this.session.multiSelect.inVirtualMode)\n return;\n this.inMultiSelectMode = false;\n\n this.unsetStyle(\"ace_multiselect\");\n this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n this._emit(\"changeSelection\");\n };\n\n this.$onMultiSelectExec = function(e) {\n var command = e.command;\n var editor = e.editor;\n if (!editor.multiSelect)\n return;\n if (!command.multiSelectAction) {\n var result = command.exec(editor, e.args || {});\n editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n editor.multiSelect.mergeOverlappingRanges();\n } else if (command.multiSelectAction == \"forEach\") {\n result = editor.forEachSelection(command, e.args);\n } else if (command.multiSelectAction == \"forEachLine\") {\n result = editor.forEachSelection(command, e.args, true);\n } else if (command.multiSelectAction == \"single\") {\n editor.exitMultiSelectMode();\n result = command.exec(editor, e.args || {});\n } else {\n result = command.multiSelectAction(editor, e.args || {});\n }\n return result;\n }; \n this.forEachSelection = function(cmd, args, options) {\n if (this.inVirtualSelectionMode)\n return;\n var keepOrder = options && options.keepOrder;\n var $byLines = options == true || options && options.$byLines;\n var session = this.session;\n var selection = this.selection;\n var rangeList = selection.rangeList;\n var ranges = (keepOrder ? selection : rangeList).ranges;\n var result;\n \n if (!ranges.length)\n return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n \n var reg = selection._eventRegistry;\n selection._eventRegistry = {};\n\n var tmpSel = new Selection(session);\n this.inVirtualSelectionMode = true;\n for (var i = ranges.length; i--;) {\n if ($byLines) {\n while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n i--;\n }\n tmpSel.fromOrientedRange(ranges[i]);\n tmpSel.index = i;\n this.selection = session.selection = tmpSel;\n var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n if (!result && cmdResult !== undefined)\n result = cmdResult;\n tmpSel.toOrientedRange(ranges[i]);\n }\n tmpSel.detach();\n\n this.selection = session.selection = selection;\n this.inVirtualSelectionMode = false;\n selection._eventRegistry = reg;\n selection.mergeOverlappingRanges();\n \n var anim = this.renderer.$scrollAnimation;\n this.onCursorChange();\n this.onSelectionChange();\n if (anim && anim.from == anim.to)\n this.renderer.animateScrolling(anim.from);\n \n return result;\n };\n this.exitMultiSelectMode = function() {\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n return;\n this.multiSelect.toSingleRange();\n };\n\n this.getSelectedText = function() {\n var text = \"\";\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var ranges = this.multiSelect.rangeList.ranges;\n var buf = [];\n for (var i = 0; i < ranges.length; i++) {\n buf.push(this.session.getTextRange(ranges[i]));\n }\n var nl = this.session.getDocument().getNewLineCharacter();\n text = buf.join(nl);\n if (text.length == (buf.length - 1) * nl.length)\n text = \"\";\n } else if (!this.selection.isEmpty()) {\n text = this.session.getTextRange(this.getSelectionRange());\n }\n return text;\n };\n \n this.$checkMultiselectChange = function(e, anchor) {\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var range = this.multiSelect.ranges[0];\n if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n return;\n var pos = anchor == this.multiSelect.anchor\n ? range.cursor == range.start ? range.end : range.start\n : range.cursor;\n if (pos.row != anchor.row \n || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n }\n };\n this.findAll = function(needle, options, additive) {\n options = options || {};\n options.needle = needle || options.needle;\n if (options.needle == undefined) {\n var range = this.selection.isEmpty()\n ? this.selection.getWordRange()\n : this.selection.getRange();\n options.needle = this.session.getTextRange(range);\n } \n this.$search.set(options);\n \n var ranges = this.$search.findAll(this.session);\n if (!ranges.length)\n return 0;\n\n this.$blockScrolling += 1;\n var selection = this.multiSelect;\n\n if (!additive)\n selection.toSingleRange(ranges[0]);\n\n for (var i = ranges.length; i--; )\n selection.addRange(ranges[i], true);\n if (range && selection.rangeList.rangeAtPoint(range.start))\n selection.addRange(range, true);\n \n this.$blockScrolling -= 1;\n\n return ranges.length;\n };\n this.selectMoreLines = function(dir, skip) {\n var range = this.selection.toOrientedRange();\n var isBackwards = range.cursor == range.end;\n\n var screenLead = this.session.documentToScreenPosition(range.cursor);\n if (this.selection.$desiredColumn)\n screenLead.column = this.selection.$desiredColumn;\n\n var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n if (!range.isEmpty()) {\n var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n } else {\n var anchor = lead;\n }\n\n if (isBackwards) {\n var newRange = Range.fromPoints(lead, anchor);\n newRange.cursor = newRange.start;\n } else {\n var newRange = Range.fromPoints(anchor, lead);\n newRange.cursor = newRange.end;\n }\n\n newRange.desiredColumn = screenLead.column;\n if (!this.selection.inMultiSelectMode) {\n this.selection.addRange(range);\n } else {\n if (skip)\n var toRemove = range.cursor;\n }\n\n this.selection.addRange(newRange);\n if (toRemove)\n this.selection.substractPoint(toRemove);\n };\n this.transposeSelections = function(dir) {\n var session = this.session;\n var sel = session.multiSelect;\n var all = sel.ranges;\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n if (range.isEmpty()) {\n var tmp = session.getWordRange(range.start.row, range.start.column);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n range.end.row = tmp.end.row;\n range.end.column = tmp.end.column;\n }\n }\n sel.mergeOverlappingRanges();\n\n var words = [];\n for (var i = all.length; i--; ) {\n var range = all[i];\n words.unshift(session.getTextRange(range));\n }\n\n if (dir < 0)\n words.unshift(words.pop());\n else\n words.push(words.shift());\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n var tmp = range.clone();\n session.replace(range, words[i]);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n }\n };\n this.selectMore = function(dir, skip, stopAtFirst) {\n var session = this.session;\n var sel = session.multiSelect;\n\n var range = sel.toOrientedRange();\n if (range.isEmpty()) {\n range = session.getWordRange(range.start.row, range.start.column);\n range.cursor = dir == -1 ? range.start : range.end;\n this.multiSelect.addRange(range);\n if (stopAtFirst)\n return;\n }\n var needle = session.getTextRange(range);\n\n var newRange = find(session, needle, dir);\n if (newRange) {\n newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n this.$blockScrolling += 1;\n this.session.unfold(newRange);\n this.multiSelect.addRange(newRange);\n this.$blockScrolling -= 1;\n this.renderer.scrollCursorIntoView(null, 0.5);\n }\n if (skip)\n this.multiSelect.substractPoint(range.cursor);\n };\n this.alignCursors = function() {\n var session = this.session;\n var sel = session.multiSelect;\n var ranges = sel.ranges;\n var row = -1;\n var sameRowRanges = ranges.filter(function(r) {\n if (r.cursor.row == row)\n return true;\n row = r.cursor.row;\n });\n \n if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n var range = this.selection.getRange();\n var fr = range.start.row, lr = range.end.row;\n var guessRange = fr == lr;\n if (guessRange) {\n var max = this.session.getLength();\n var line;\n do {\n line = this.session.getLine(lr);\n } while (/[=:]/.test(line) && ++lr < max);\n do {\n line = this.session.getLine(fr);\n } while (/[=:]/.test(line) && --fr > 0);\n \n if (fr < 0) fr = 0;\n if (lr >= max) lr = max - 1;\n }\n var lines = this.session.removeFullLines(fr, lr);\n lines = this.$reAlignText(lines, guessRange);\n this.session.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n if (!guessRange) {\n range.start.column = 0;\n range.end.column = lines[lines.length - 1].length;\n }\n this.selection.setRange(range);\n } else {\n sameRowRanges.forEach(function(r) {\n sel.substractPoint(r.cursor);\n });\n\n var maxCol = 0;\n var minSpace = Infinity;\n var spaceOffsets = ranges.map(function(r) {\n var p = r.cursor;\n var line = session.getLine(p.row);\n var spaceOffset = line.substr(p.column).search(/\\S/g);\n if (spaceOffset == -1)\n spaceOffset = 0;\n\n if (p.column > maxCol)\n maxCol = p.column;\n if (spaceOffset < minSpace)\n minSpace = spaceOffset;\n return spaceOffset;\n });\n ranges.forEach(function(r, i) {\n var p = r.cursor;\n var l = maxCol - p.column;\n var d = spaceOffsets[i] - minSpace;\n if (l > d)\n session.insert(p, lang.stringRepeat(\" \", l - d));\n else\n session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n r.start.column = r.end.column = maxCol;\n r.start.row = r.end.row = p.row;\n r.cursor = r.end;\n });\n sel.fromOrientedRange(ranges[0]);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n }\n };\n\n this.$reAlignText = function(lines, forceLeft) {\n var isLeftAligned = true, isRightAligned = true;\n var startW, textW, endW;\n\n return lines.map(function(line) {\n var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n if (!m)\n return [line];\n\n if (startW == null) {\n startW = m[1].length;\n textW = m[2].length;\n endW = m[3].length;\n return m;\n }\n\n if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n isRightAligned = false;\n if (startW != m[1].length)\n isLeftAligned = false;\n\n if (startW > m[1].length)\n startW = m[1].length;\n if (textW < m[2].length)\n textW = m[2].length;\n if (endW > m[3].length)\n endW = m[3].length;\n\n return m;\n }).map(forceLeft ? alignLeft :\n isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n function spaces(n) {\n return lang.stringRepeat(\" \", n);\n }\n\n function alignLeft(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(textW - m[2].length + endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function alignRight(m) {\n return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n + spaces(endW, \" \")\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function unAlign(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n };\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n var session = e.session;\n if (session && !session.multiSelect) {\n session.$selectionMarkers = [];\n session.selection.$initRangeList();\n session.multiSelect = session.selection;\n }\n this.multiSelect = session && session.multiSelect;\n\n var oldSession = e.oldSession;\n if (oldSession) {\n oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n }\n\n if (session) {\n session.multiSelect.on(\"addRange\", this.$onAddRange);\n session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n }\n\n if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n if (session.selection.inMultiSelectMode)\n this.$onMultiSelect();\n else\n this.$onSingleSelect();\n }\n};\nfunction MultiSelect(editor) {\n if (editor.$multiselectOnSessionChange)\n return;\n editor.$onAddRange = editor.$onAddRange.bind(editor);\n editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);\n\n editor.$multiselectOnSessionChange(editor);\n editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n editor.on(\"mousedown\", onMouseDown);\n editor.commands.addCommands(commands.defaultCommands);\n\n addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n var el = editor.textInput.getElement();\n var altCursor = false;\n event.addListener(el, \"keydown\", function(e) {\n var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n if (editor.$blockSelectEnabled && altDown) {\n if (!altCursor) {\n editor.renderer.setMouseCursor(\"crosshair\");\n altCursor = true;\n }\n } else if (altCursor) {\n reset();\n }\n });\n\n event.addListener(el, \"keyup\", reset);\n event.addListener(el, \"blur\", reset);\n function reset(e) {\n if (altCursor) {\n editor.renderer.setMouseCursor(\"\");\n altCursor = false;\n }\n }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nacequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n enableMultiselect: {\n set: function(val) {\n MultiSelect(this);\n if (val) {\n this.on(\"changeSession\", this.$multiselectOnSessionChange);\n this.on(\"mousedown\", onMouseDown);\n } else {\n this.off(\"changeSession\", this.$multiselectOnSessionChange);\n this.off(\"mousedown\", onMouseDown);\n }\n },\n value: true\n },\n enableBlockSelect: {\n set: function(val) {\n this.$blockSelectEnabled = val;\n },\n value: true\n }\n});\n\n\n\n});\n\nace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n this.foldingStartMarker = null;\n this.foldingStopMarker = null;\n this.getFoldWidget = function(session, foldStyle, row) {\n var line = session.getLine(row);\n if (this.foldingStartMarker.test(line))\n return \"start\";\n if (foldStyle == \"markbeginend\"\n && this.foldingStopMarker\n && this.foldingStopMarker.test(line))\n return \"end\";\n return \"\";\n };\n\n this.getFoldWidgetRange = function(session, foldStyle, row) {\n return null;\n };\n\n this.indentationBlock = function(session, row, column) {\n var re = /\\S/;\n var line = session.getLine(row);\n var startLevel = line.search(re);\n if (startLevel == -1)\n return;\n\n var startColumn = column || line.length;\n var maxRow = session.getLength();\n var startRow = row;\n var endRow = row;\n\n while (++row < maxRow) {\n var level = session.getLine(row).search(re);\n\n if (level == -1)\n continue;\n\n if (level <= startLevel)\n break;\n\n endRow = row;\n }\n\n if (endRow > startRow) {\n var endColumn = session.getLine(endRow).length;\n return new Range(startRow, startColumn, endRow, endColumn);\n }\n };\n\n this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n var start = {row: row, column: column + 1};\n var end = session.$findClosingBracket(bracket, start, typeRe);\n if (!end)\n return;\n\n var fw = session.foldWidgets[end.row];\n if (fw == null)\n fw = session.getFoldWidget(end.row);\n\n if (fw == \"start\" && end.row > start.row) {\n end.row --;\n end.column = session.getLine(end.row).length;\n }\n return Range.fromPoints(start, end);\n };\n\n this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n var end = {row: row, column: column};\n var start = session.$findOpeningBracket(bracket, end);\n\n if (!start)\n return;\n\n start.column++;\n end.column--;\n\n return Range.fromPoints(start, end);\n };\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar Range = acequire(\"./range\").Range;\n\n\nfunction LineWidgets(session) {\n this.session = session;\n this.session.widgetManager = this;\n this.session.getRowLength = this.getRowLength;\n this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n this.updateOnChange = this.updateOnChange.bind(this);\n this.renderWidgets = this.renderWidgets.bind(this);\n this.measureWidgets = this.measureWidgets.bind(this);\n this.session._changedWidgets = [];\n this.$onChangeEditor = this.$onChangeEditor.bind(this);\n \n this.session.on(\"change\", this.updateOnChange);\n this.session.on(\"changeFold\", this.updateOnFold);\n this.session.on(\"changeEditor\", this.$onChangeEditor);\n}\n\n(function() {\n this.getRowLength = function(row) {\n var h;\n if (this.lineWidgets)\n h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n\n this.$getWidgetScreenLength = function() {\n var screenRows = 0;\n this.lineWidgets.forEach(function(w){\n if (w && w.rowCount && !w.hidden)\n screenRows += w.rowCount;\n });\n return screenRows;\n }; \n \n this.$onChangeEditor = function(e) {\n this.attach(e.editor);\n };\n \n this.attach = function(editor) {\n if (editor && editor.widgetManager && editor.widgetManager != this)\n editor.widgetManager.detach();\n\n if (this.editor == editor)\n return;\n\n this.detach();\n this.editor = editor;\n \n if (editor) {\n editor.widgetManager = this;\n editor.renderer.on(\"beforeRender\", this.measureWidgets);\n editor.renderer.on(\"afterRender\", this.renderWidgets);\n }\n };\n this.detach = function(e) {\n var editor = this.editor;\n if (!editor)\n return;\n \n this.editor = null;\n editor.widgetManager = null;\n \n editor.renderer.off(\"beforeRender\", this.measureWidgets);\n editor.renderer.off(\"afterRender\", this.renderWidgets);\n var lineWidgets = this.session.lineWidgets;\n lineWidgets && lineWidgets.forEach(function(w) {\n if (w && w.el && w.el.parentNode) {\n w._inDocument = false;\n w.el.parentNode.removeChild(w.el);\n }\n });\n };\n\n this.updateOnFold = function(e, session) {\n var lineWidgets = session.lineWidgets;\n if (!lineWidgets || !e.action)\n return;\n var fold = e.data;\n var start = fold.start.row;\n var end = fold.end.row;\n var hide = e.action == \"add\";\n for (var i = start + 1; i < end; i++) {\n if (lineWidgets[i])\n lineWidgets[i].hidden = hide;\n }\n if (lineWidgets[end]) {\n if (hide) {\n if (!lineWidgets[start])\n lineWidgets[start] = lineWidgets[end];\n else\n lineWidgets[end].hidden = hide;\n } else {\n if (lineWidgets[start] == lineWidgets[end])\n lineWidgets[start] = undefined;\n lineWidgets[end].hidden = hide;\n }\n }\n };\n \n this.updateOnChange = function(delta) {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n \n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n } else if (delta.action == 'remove') {\n var removed = lineWidgets.splice(startRow + 1, len);\n removed.forEach(function(w) {\n w && this.removeLineWidget(w);\n }, this);\n this.$updateRows();\n } else {\n var args = new Array(len);\n args.unshift(startRow, 0);\n lineWidgets.splice.apply(lineWidgets, args);\n this.$updateRows();\n }\n };\n \n this.$updateRows = function() {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n var noWidgets = true;\n lineWidgets.forEach(function(w, i) {\n if (w) {\n noWidgets = false;\n w.row = i;\n while (w.$oldWidget) {\n w.$oldWidget.row = i;\n w = w.$oldWidget;\n }\n }\n });\n if (noWidgets)\n this.session.lineWidgets = null;\n };\n\n this.addLineWidget = function(w) {\n if (!this.session.lineWidgets)\n this.session.lineWidgets = new Array(this.session.getLength());\n \n var old = this.session.lineWidgets[w.row];\n if (old) {\n w.$oldWidget = old;\n if (old.el && old.el.parentNode) {\n old.el.parentNode.removeChild(old.el);\n old._inDocument = false;\n }\n }\n \n this.session.lineWidgets[w.row] = w;\n \n w.session = this.session;\n \n var renderer = this.editor.renderer;\n if (w.html && !w.el) {\n w.el = dom.createElement(\"div\");\n w.el.innerHTML = w.html;\n }\n if (w.el) {\n dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n w.el.style.position = \"absolute\";\n w.el.style.zIndex = 5;\n renderer.container.appendChild(w.el);\n w._inDocument = true;\n }\n \n if (!w.coverGutter) {\n w.el.style.zIndex = 3;\n }\n if (w.pixelHeight == null) {\n w.pixelHeight = w.el.offsetHeight;\n }\n if (w.rowCount == null) {\n w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n }\n \n var fold = this.session.getFoldAt(w.row, 0);\n w.$fold = fold;\n if (fold) {\n var lineWidgets = this.session.lineWidgets;\n if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n lineWidgets[fold.start.row] = w;\n else\n w.hidden = true;\n }\n \n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n \n this.$updateRows();\n this.renderWidgets(null, renderer);\n this.onWidgetChanged(w);\n return w;\n };\n \n this.removeLineWidget = function(w) {\n w._inDocument = false;\n w.session = null;\n if (w.el && w.el.parentNode)\n w.el.parentNode.removeChild(w.el);\n if (w.editor && w.editor.destroy) try {\n w.editor.destroy();\n } catch(e){}\n if (this.session.lineWidgets) {\n var w1 = this.session.lineWidgets[w.row];\n if (w1 == w) {\n this.session.lineWidgets[w.row] = w.$oldWidget;\n if (w.$oldWidget)\n this.onWidgetChanged(w.$oldWidget);\n } else {\n while (w1) {\n if (w1.$oldWidget == w) {\n w1.$oldWidget = w.$oldWidget;\n break;\n }\n w1 = w1.$oldWidget;\n }\n }\n }\n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n this.$updateRows();\n };\n \n this.getWidgetsAtRow = function(row) {\n var lineWidgets = this.session.lineWidgets;\n var w = lineWidgets && lineWidgets[row];\n var list = [];\n while (w) {\n list.push(w);\n w = w.$oldWidget;\n }\n return list;\n };\n \n this.onWidgetChanged = function(w) {\n this.session._changedWidgets.push(w);\n this.editor && this.editor.renderer.updateFull();\n };\n \n this.measureWidgets = function(e, renderer) {\n var changedWidgets = this.session._changedWidgets;\n var config = renderer.layerConfig;\n \n if (!changedWidgets || !changedWidgets.length) return;\n var min = Infinity;\n for (var i = 0; i < changedWidgets.length; i++) {\n var w = changedWidgets[i];\n if (!w || !w.el) continue;\n if (w.session != this.session) continue;\n if (!w._inDocument) {\n if (this.session.lineWidgets[w.row] != w)\n continue;\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n \n w.h = w.el.offsetHeight;\n \n if (!w.fixedWidth) {\n w.w = w.el.offsetWidth;\n w.screenWidth = Math.ceil(w.w / config.characterWidth);\n }\n \n var rowCount = w.h / config.lineHeight;\n if (w.coverLine) {\n rowCount -= this.session.getRowLineCount(w.row);\n if (rowCount < 0)\n rowCount = 0;\n }\n if (w.rowCount != rowCount) {\n w.rowCount = rowCount;\n if (w.row < min)\n min = w.row;\n }\n }\n if (min != Infinity) {\n this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n this.session.lineWidgetWidth = null;\n }\n this.session._changedWidgets = [];\n };\n \n this.renderWidgets = function(e, renderer) {\n var config = renderer.layerConfig;\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets)\n return;\n var first = Math.min(this.firstRow, config.firstRow);\n var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n \n while (first > 0 && !lineWidgets[first])\n first--;\n \n this.firstRow = config.firstRow;\n this.lastRow = config.lastRow;\n\n renderer.$cursorLayer.config = config;\n for (var i = first; i <= last; i++) {\n var w = lineWidgets[i];\n if (!w || !w.el) continue;\n if (w.hidden) {\n w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n continue;\n }\n if (!w._inDocument) {\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n if (!w.coverLine)\n top += config.lineHeight * this.session.getRowLineCount(w.row);\n w.el.style.top = top - config.offset + \"px\";\n \n var left = w.coverGutter ? 0 : renderer.gutterWidth;\n if (!w.fixedWidth)\n left -= renderer.scrollLeft;\n w.el.style.left = left + \"px\";\n \n if (w.fullWidth && w.screenWidth) {\n w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n }\n \n if (w.fixedWidth) {\n w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n } else {\n w.el.style.right = \"\";\n }\n }\n };\n \n}).call(LineWidgets.prototype);\n\n\nexports.LineWidgets = LineWidgets;\n\n});\n\nace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\nvar LineWidgets = acequire(\"../line_widgets\").LineWidgets;\nvar dom = acequire(\"../lib/dom\");\nvar Range = acequire(\"../range\").Range;\n\nfunction binarySearch(array, needle, comparator) {\n var first = 0;\n var last = array.length - 1;\n\n while (first <= last) {\n var mid = (first + last) >> 1;\n var c = comparator(needle, array[mid]);\n if (c > 0)\n first = mid + 1;\n else if (c < 0)\n last = mid - 1;\n else\n return mid;\n }\n return -(first + 1);\n}\n\nfunction findAnnotations(session, row, dir) {\n var annotations = session.getAnnotations().sort(Range.comparePoints);\n if (!annotations.length)\n return;\n \n var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n if (i < 0)\n i = -i - 1;\n \n if (i >= annotations.length)\n i = dir > 0 ? 0 : annotations.length - 1;\n else if (i === 0 && dir < 0)\n i = annotations.length - 1;\n \n var annotation = annotations[i];\n if (!annotation || !dir)\n return;\n\n if (annotation.row === row) {\n do {\n annotation = annotations[i += dir];\n } while (annotation && annotation.row === row);\n if (!annotation)\n return annotations.slice();\n }\n \n \n var matched = [];\n row = annotation.row;\n do {\n matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n annotation = annotations[i += dir];\n } while (annotation && annotation.row == row);\n return matched.length && matched;\n}\n\nexports.showErrorMarker = function(editor, dir) {\n var session = editor.session;\n if (!session.widgetManager) {\n session.widgetManager = new LineWidgets(session);\n session.widgetManager.attach(editor);\n }\n \n var pos = editor.getCursorPosition();\n var row = pos.row;\n var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n return w.type == \"errorMarker\";\n })[0];\n if (oldWidget) {\n oldWidget.destroy();\n } else {\n row -= dir;\n }\n var annotations = findAnnotations(session, row, dir);\n var gutterAnno;\n if (annotations) {\n var annotation = annotations[0];\n pos.column = (annotation.pos && typeof annotation.column != \"number\"\n ? annotation.pos.sc\n : annotation.column) || 0;\n pos.row = annotation.row;\n gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n } else if (oldWidget) {\n return;\n } else {\n gutterAnno = {\n text: [\"Looks good!\"],\n className: \"ace_ok\"\n };\n }\n editor.session.unfold(pos.row);\n editor.selection.moveToPosition(pos);\n \n var w = {\n row: pos.row, \n fixedWidth: true,\n coverGutter: true,\n el: dom.createElement(\"div\"),\n type: \"errorMarker\"\n };\n var el = w.el.appendChild(dom.createElement(\"div\"));\n var arrow = w.el.appendChild(dom.createElement(\"div\"));\n arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n \n var left = editor.renderer.$cursorLayer\n .getPixelPosition(pos).left;\n arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n \n w.el.className = \"error_widget_wrapper\";\n el.className = \"error_widget \" + gutterAnno.className;\n el.innerHTML = gutterAnno.text.join(\"
    \");\n \n el.appendChild(dom.createElement(\"div\"));\n \n var kb = function(_, hashId, keyString) {\n if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n w.destroy();\n return {command: \"null\"};\n }\n };\n \n w.destroy = function() {\n if (editor.$mouseHandler.isMousePressed)\n return;\n editor.keyBinding.removeKeyboardHandler(kb);\n session.widgetManager.removeLineWidget(w);\n editor.off(\"changeSelection\", w.destroy);\n editor.off(\"changeSession\", w.destroy);\n editor.off(\"mouseup\", w.destroy);\n editor.off(\"change\", w.destroy);\n };\n \n editor.keyBinding.addKeyboardHandler(kb);\n editor.on(\"changeSelection\", w.destroy);\n editor.on(\"changeSession\", w.destroy);\n editor.on(\"mouseup\", w.destroy);\n editor.on(\"change\", w.destroy);\n \n editor.session.widgetManager.addLineWidget(w);\n \n w.el.onmousedown = editor.focus.bind(editor);\n \n editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n};\n\n\ndom.importCssString(\"\\\n .error_widget_wrapper {\\\n background: inherit;\\\n color: inherit;\\\n border:none\\\n }\\\n .error_widget {\\\n border-top: solid 2px;\\\n border-bottom: solid 2px;\\\n margin: 5px 0;\\\n padding: 10px 40px;\\\n white-space: pre-wrap;\\\n }\\\n .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n border-color: #ff5a5a\\\n }\\\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n border-color: #F1D817\\\n }\\\n .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n border-color: #5a5a5a\\\n }\\\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n border-color: #5aaa5a\\\n }\\\n .error_widget_arrow {\\\n position: absolute;\\\n border: solid 5px;\\\n border-top-color: transparent!important;\\\n border-right-color: transparent!important;\\\n border-left-color: transparent!important;\\\n top: -5px;\\\n }\\\n\", \"\");\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\n\nvar Editor = acequire(\"./editor\").Editor;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar UndoManager = acequire(\"./undomanager\").UndoManager;\nvar Renderer = acequire(\"./virtual_renderer\").VirtualRenderer;\nacequire(\"./worker/worker_client\");\nacequire(\"./keyboard/hash_handler\");\nacequire(\"./placeholder\");\nacequire(\"./multi_select\");\nacequire(\"./mode/folding/fold_mode\");\nacequire(\"./theme/textmate\");\nacequire(\"./ext/error_marker\");\n\nexports.config = acequire(\"./config\");\nexports.acequire = acequire;\n\nif (typeof define === \"function\")\n exports.define = define;\nexports.edit = function(el) {\n if (typeof el == \"string\") {\n var _id = el;\n el = document.getElementById(_id);\n if (!el)\n throw new Error(\"ace.edit can't find div #\" + _id);\n }\n\n if (el && el.env && el.env.editor instanceof Editor)\n return el.env.editor;\n\n var value = \"\";\n if (el && /input|textarea/i.test(el.tagName)) {\n var oldNode = el;\n value = oldNode.value;\n el = dom.createElement(\"pre\");\n oldNode.parentNode.replaceChild(el, oldNode);\n } else if (el) {\n value = dom.getInnerText(el);\n el.innerHTML = \"\";\n }\n\n var doc = exports.createEditSession(value);\n\n var editor = new Editor(new Renderer(el));\n editor.setSession(doc);\n\n var env = {\n document: doc,\n editor: editor,\n onResize: editor.resize.bind(editor, null)\n };\n if (oldNode) env.textarea = oldNode;\n event.addListener(window, \"resize\", env.onResize);\n editor.on(\"destroy\", function() {\n event.removeListener(window, \"resize\", env.onResize);\n env.editor.container.env = null; // prevent memory leak on old ie\n });\n editor.container.env = editor.env = env;\n return editor;\n};\nexports.createEditSession = function(text, mode) {\n var doc = new EditSession(text, mode);\n doc.setUndoManager(new UndoManager());\n return doc;\n};\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.version = \"1.2.9\";\n});\n (function() {\n ace.acequire([\"ace/ace\"], function(a) {\n if (a) {\n a.config.init(true);\n a.define = ace.define;\n }\n if (!window.ace)\n window.ace = a;\n for (var key in a) if (a.hasOwnProperty(key))\n window.ace[key] = a[key];\n });\n })();\n \nmodule.exports = window.ace.acequire(\"ace/ace\");","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"ores\"},[_c('h3',[_vm._v(\"Selected Ores:\")]),_vm._l((_vm.ore_names),function(ore){return _c('div',{key:ore},[_c('vui-button',{class:{'selected': _vm.selected_ores.includes(ore)},attrs:{\"params\":{'chosen_ore': ore}}},[_vm._v(_vm._s(ore))])],1)})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./oredetector.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./oredetector.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./oredetector.vue?vue&type=template&id=5716889f&scoped=true&\"\nimport script from \"./oredetector.vue?vue&type=script&lang=js&\"\nexport * from \"./oredetector.vue?vue&type=script&lang=js&\"\nimport style0 from \"./oredetector.vue?vue&type=style&index=0&id=5716889f&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5716889f\",\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ghostspawner.vue?vue&type=style&index=0&id=70766bea&lang=scss&scoped=true&\"","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('i',[_vm._v(\"Welcome to the NanoTrasen™ computer configuration utility. Please consult your system administrator if you have any questions about your device.\")]),_c('hr'),_c('h2',[_vm._v(\"Power Supply\")]),_c('vui-item',{attrs:{\"label\":\"Battery Status:\"}},[(_vm.battery)?_c('span',[_vm._v(\"Active\")]):_c('span',[_vm._v(\"Not Available\")])]),(_vm.battery)?_c('vui-item',{attrs:{\"label\":\"Battery Rating:\"}},[_vm._v(_vm._s(_vm.battery.rating)+\" Wh\")]):_vm._e(),(_vm.battery)?_c('vui-item',{attrs:{\"label\":\"Battery Charge:\"}},[_c('vui-progress',{attrs:{\"value\":_vm.battery.percent}},[_vm._v(_vm._s(_vm.battery.percent)+\"%\")])],1):_vm._e(),_c('vui-item',{attrs:{\"label\":\"Power Usage:\"}},[_vm._v(_vm._s(_vm.power_usage)+\" W\")]),_c('h2',[_vm._v(\"File System\")]),(_vm.battery)?_c('vui-item',{attrs:{\"label\":\"Used Capacity:\"}},[_c('vui-progress',{attrs:{\"value\":_vm.disk_used,\"min\":\"0\",\"max\":_vm.disk_size}},[_vm._v(_vm._s(_vm.disk_used)+\" GQ / \"+_vm._s(_vm.disk_size)+\" GQ\")])],1):_vm._e(),_c('h2',[_vm._v(\"Misc. Settings\")]),_c('vui-item',{attrs:{\"label\":\"Registered ID:\"}},[_c('vui-button',{attrs:{\"params\":{ PC_register: 1},\"disabled\":!_vm.card_slot}},[_vm._v(_vm._s(_vm.registered ? _vm.registered : \"Unregistered\"))])],1),(_vm.brightness !== null)?_c('vui-item',{attrs:{\"label\":\"Brightness:\"}},[_c('vui-input-slider',{attrs:{\"min\":0,\"max\":10},model:{value:(_vm.brightness),callback:function ($$v) {_vm.brightness=$$v},expression:\"brightness\"}})],1):_vm._e(),_c('h2',[_vm._v(\"Computer Components\")]),_vm._l((_vm.hardware),function(h,name){return _c('div',{key:name},[_c('h3',[_vm._v(_vm._s(name))]),_c('vui-item',{attrs:{\"label\":\"State:\"}},[(h.enabled)?_c('span',[_vm._v(\"Enabled\")]):_c('span',[_vm._v(\"Disabled\")])]),(h.power_usage > 0)?_c('vui-item',{attrs:{\"label\":\"Power Usage:\"}},[_vm._v(_vm._s(h.power_usage)+\" W\")]):_vm._e(),(!h.critical)?_c('vui-item',{attrs:{\"label\":\"Toggle Component:\"}},[_c('vui-button',{attrs:{\"params\":{ PC_enable_component: name},\"disabled\":!!h.enabled}},[_vm._v(\"ON\")]),_c('vui-button',{attrs:{\"params\":{ PC_disable_component: name},\"disabled\":!h.enabled}},[_vm._v(\"OFF\")])],1):_vm._e()],1)}),_c('i',[_vm._v(\"ntOS v2.1.0 -- © NanoTrasen 2457 - 2462\")])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./config.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./config.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./config.vue?vue&type=template&id=6036d02c&\"\nimport script from \"./config.vue?vue&type=script&lang=js&\"\nexport * from \"./config.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","module.exports = function() {\n\tthrow new Error(\"define cannot be used indirect\");\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h2',[_vm._v(\"Engine Status:\")]),(_vm.is_on)?_c('div',[_vm._v(\" The engine is currently running. \"),_c('vui-button',{attrs:{\"params\":{ toggle_engine: 1}}},[_vm._v(\"Stop\")])],1):_c('div',[_vm._v(\" The engine is off. \"),_c('vui-button',{attrs:{\"disabled\":!_vm.has_key || !_vm.has_cell,\"params\":{ toggle_engine: 1}}},[_vm._v(\"Start\")])],1),(_vm.has_key)?_c('div',[_vm._v(\" There is a key inserted into the ignition. \"),_c('vui-button',{attrs:{\"params\":{ key: 1}}},[_vm._v(\"Remove Key\")])],1):_c('div',[_vm._v(\" There is no key in the ignition. \")]),(_vm.has_cell)?_c('div',[_vm._v(\" Cell Charge: \"),_c('vui-progress',{class:{ good: _vm.cell_charge >= _vm.cell_max_charge * 0.8, bad: _vm.cell_charge <= _vm.cell_max_charge * 0.4, average: _vm.cell_charge < _vm.cell_max_charge * 0.8 && _vm.cell_charge > _vm.cell_max_charge * 0.4 },attrs:{\"value\":_vm.cell_charge,\"max\":_vm.cell_max_charge,\"min\":0}},[_vm._v(_vm._s(_vm.cell_charge)+\"J\")]),_vm._v(\" \"),_c('vui-tooltip',{attrs:{\"label\":\"?\"}},[_vm._v(\"The cell can be removed by using a screwdriver to open the maintenance panel, then using a crowbar to shimmy it out.\")])],1):_c('div',[_vm._v(\" There is no cell installed. \"),_c('vui-tooltip',{attrs:{\"label\":\"?\"}},[_vm._v(\"The cell can be installed by using a screwdriver to open the maintenance panel, then clicking on the engine with a compatible power cell.\")])],1),(_vm.is_towing)?_c('div',[_vm._v(\" This engine is currently towing the \"+_vm._s(_vm.tow)+\". \"),_c('vui-button',{attrs:{\"params\":{ unlatch: 1}}},[_vm._v(\"Unlatch\")])],1):_c('div',[_vm._v(\" This engine isn't towing anything currently. \"),_c('vui-tooltip',{attrs:{\"label\":\"?\"}},[_vm._v(\"You can latch vehicles together by dragging from the vehicle you want to be the anchor point, to the trolley you wish to latch.\")])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./trainengine.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./trainengine.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./trainengine.vue?vue&type=template&id=04b89496&\"\nimport script from \"./trainengine.vue?vue&type=script&lang=js&\"\nexport * from \"./trainengine.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./numeric.vue?vue&type=style&index=0&id=8b39c97e&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=style&index=0&id=4ea2a2b3&lang=scss&scoped=true&\"","var $ = require('../internals/export');\nvar expm1 = require('../internals/math-expm1');\n\n// `Math.expm1` method\n// https://tc39.github.io/ecma262/#sec-math.expm1\n$({ target: 'Math', stat: true, forced: expm1 != Math.expm1 }, { expm1: expm1 });\n","var toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\n\n// `ToIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-toindex\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length or index');\n return length;\n};\n","var global = require('../internals/global');\nvar setToStringTag = require('../internals/set-to-string-tag');\n\n// JSON[@@toStringTag] property\n// https://tc39.github.io/ecma262/#sec-json-@@tostringtag\nsetToStringTag(global.JSON, 'JSON', true);\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('../internals/to-length');\nvar repeat = require('../internals/string-repeat');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar ceil = Math.ceil;\n\n// `String.prototype.{ padStart, padEnd }` methods implementation\nvar createMethod = function (IS_END) {\n return function ($this, maxLength, fillString) {\n var S = String(requireObjectCoercible($this));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n var fillLen, stringFiller;\n if (intMaxLength <= stringLength || fillStr == '') return S;\n fillLen = intMaxLength - stringLength;\n stringFiller = repeat.call(fillStr, ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return IS_END ? S + stringFiller : stringFiller + S;\n };\n};\n\nmodule.exports = {\n // `String.prototype.padStart` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.padstart\n start: createMethod(false),\n // `String.prototype.padEnd` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.padend\n end: createMethod(true)\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var redefine = require('../internals/redefine');\n\nvar DatePrototype = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar nativeDateToString = DatePrototype[TO_STRING];\nvar getTime = DatePrototype.getTime;\n\n// `Date.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-date.prototype.tostring\nif (new Date(NaN) + '' != INVALID_DATE) {\n redefine(DatePrototype, TO_STRING, function toString() {\n var value = getTime.call(this);\n // eslint-disable-next-line no-self-compare\n return value === value ? nativeDateToString.call(this) : INVALID_DATE;\n });\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.passcode),expression:\"passcode\"}],attrs:{\"placeholder\":\"Enter passcode...\",\"autofocus\":\"\"},domProps:{\"value\":(_vm.passcode)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.passcode=$event.target.value}}}),_c('vui-button',{attrs:{\"params\":{ set_passcode: _vm.passcode }}},[_vm._v(\"Set\")]),_c('vui-button',{attrs:{\"params\":{ lock: 1 }}},[_vm._v(\"Lock\")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./maglock-config.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./maglock-config.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./maglock-config.vue?vue&type=template&id=081a5cf1&\"\nimport script from \"./maglock-config.vue?vue&type=script&lang=js&\"\nexport * from \"./maglock-config.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"tooltip label\"},[_vm._t(\"label\",[_vm._v(_vm._s(_vm.label))]),_c('div',{staticClass:\"tooltip content\"},[_vm._t(\"default\")],2)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./tooltip.vue?vue&type=template&id=4ea2a2b3&scoped=true&\"\nimport script from \"./tooltip.vue?vue&type=script&lang=js&\"\nexport * from \"./tooltip.vue?vue&type=script&lang=js&\"\nimport style0 from \"./tooltip.vue?vue&type=style&index=0&id=4ea2a2b3&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4ea2a2b3\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('input',{ref:\"input\",style:({width: _vm.width}),attrs:{\"type\":\"range\",\"min\":_vm.min,\"max\":_vm.max},domProps:{\"value\":_vm.val},on:{\"change\":function($event){return _vm.onFieldUpdate($event.target)}}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./slider.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./slider.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./slider.vue?vue&type=template&id=1c07adff&scoped=true&\"\nimport script from \"./slider.vue?vue&type=script&lang=js&\"\nexport * from \"./slider.vue?vue&type=script&lang=js&\"\nimport style0 from \"./slider.vue?vue&type=style&index=0&id=1c07adff&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1c07adff\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.invalid)?_c('div',{staticClass:\"center\"},[(_vm.nocons)?_c('span',{staticClass:\"red\"},[_vm._v(\"Error: No scanner bed detected!\")]):(!_vm.occupied)?_c('span',{staticClass:\"red\"},[_vm._v(\"No occupant detected.\")]):(_vm.ipc)?_c('span',{staticClass:\"red\"},[_vm._v(\"Error: Object in scanner bed interfering with sensor array.\")]):(_vm.noscan)?_c('span',{staticClass:\"red\"},[_vm._v(\"Error: No diagnostics profile installed for this species.\")]):_c('span',{staticClass:\"red\"},[_vm._v(\"Error: Unknown error.\")])]):_c('table',{staticClass:\"bodyscanner\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"column\"},[_c('h3',[_vm._v(\"Patient Status\")]),_c('hr'),_c('vui-group',[_c('vui-group-item',{attrs:{\"label\":\"Name:\"}},[_vm._v(_vm._s(_vm.name))]),_c('vui-group-item',{attrs:{\"label\":\"Status:\"}},[_c('span',{style:({color:_vm.consciousnessLabel(_vm.stat)})},[_vm._v(_vm._s(_vm.consciousnessText(_vm.stat)))])]),_c('vui-group-item',{attrs:{\"label\":\"Species:\"}},[_vm._v(_vm._s(_vm.species))]),_c('vui-group-item',{attrs:{\"label\":\"Brain Activity:\"}},[_c('vui-progress',{class:_vm.progressClass(_vm.brain_activity),attrs:{\"value\":_vm.brain_activity}},[_vm._v(_vm._s(_vm.brain_activity)+\"%\")])],1),(_vm.stat < 2)?[_c('vui-group-item',{attrs:{\"label\":\"Physical Trauma:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.bruteLoss)})},[_vm._v(_vm._s(_vm.bruteLoss))])]),_c('vui-group-item',{attrs:{\"label\":\"Oxygen Deprivation:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.oxyLoss)})},[_vm._v(_vm._s(_vm.oxyLoss))])]),_c('vui-group-item',{attrs:{\"label\":\"Organ Failure:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.toxLoss)})},[_vm._v(_vm._s(_vm.toxLoss))])]),_c('vui-group-item',{attrs:{\"label\":\"Burn Severity:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.fireLoss)})},[_vm._v(_vm._s(_vm.fireLoss))])])]:_vm._e()],2),_c('hr'),_c('vui-group',[_c('vui-group-item',{attrs:{\"label\":\"Radiation Level:\"}},[_vm._v(_vm._s(Math.round(_vm.rads)))]),_c('vui-group-item',{attrs:{\"label\":\"Genetic Damage:\"}},[_vm._v(_vm._s(_vm.cloneLoss))]),_c('vui-group-item',{attrs:{\"label\":\"Est. Paralysis Level:\"}},[_vm._v(_vm._s(_vm.paralysis)),(_vm.paralysis)?_c('span',[_vm._v(\" (~\"+_vm._s(Math.round(_vm.paralysis/4))+\" Seconds Left)\")]):_vm._e()]),_c('vui-group-item',{attrs:{\"label\":\"Body Temperature:\"}},[_vm._v(_vm._s(_vm.bodytemp)+\" K (~ \"+_vm._s(Math.round(_vm.bodytemp - 273.15))+\" C)\")])],1),_c('hr'),_c('h3',[_vm._v(\"Blood Status\")]),_c('hr'),_c('vui-group',[_c('vui-group-item',{style:({color:_vm.getPressureClass(_vm.blood_pressure_level)}),attrs:{\"label\":\"BP:\"}},[_vm._v(\" \"+_vm._s(_vm.blood_pressure)+\" \")]),_c('vui-group-item',{attrs:{\"label\":\"Blood Oxygenation:\"}},[_c('vui-progress',{class:_vm.progressClass(_vm.brain_activity),attrs:{\"value\":Math.round(_vm.blood_o2)}},[_vm._v(_vm._s(Math.round(_vm.blood_o2))+\"%\")])],1),(Math.round(_vm.norepiAmt))?_c('vui-group-item',{attrs:{\"label\":\"Inaprovaline:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.norepiAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.soporAmt))?_c('vui-group-item',{attrs:{\"label\":\"Soporific:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.soporAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.bicardAmt))?_c('vui-group-item',{attrs:{\"label\":\"Bicaridine:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.bicardAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.dermAmt))?_c('vui-group-item',{attrs:{\"label\":\"Dermaline:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.dermAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.dexAmt))?_c('vui-group-item',{attrs:{\"label\":\"Dexalin:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.dexAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.thetaAmt))?_c('vui-group-item',{attrs:{\"label\":\"Thetamycin:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.thetaAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.otherAmt))?_c('vui-group-item',{attrs:{\"label\":\"Other:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.otherAmt))+\" unit(s)\")]):_vm._e()],1)],1),_c('div',{staticClass:\"column\"},[(_vm.hasmissing)?_vm._l((_vm.missingparts),function(organ){return _c('div',{key:organ.name},[_c('vui-group-item',[_vm._v(\" \"+_vm._s(organ)+\" \")])],1)}):_vm._e(),_c('h3',[_vm._v(\"Internal Organ Status\")]),_c('hr'),_c('table',{staticClass:\"injury\"},[(_vm.hasinternalinjury)?[_vm._m(0)]:[_vm._m(1)],_vm._l((_vm.organs),function(organ){return _c('tr',{key:organ.name},[(organ.damage != 'None' || organ.hasWounds)?[_c('td',[_vm._v(\" \"+_vm._s(organ.name)+\" \")]),_c('td',[_c('span',{style:({color:_vm.damageLabel(organ.damage)})},[_vm._v(\" \"+_vm._s(organ.damage))])]),_c('td',_vm._l((organ.wounds),function(wound){return _c('div',{key:wound.name,staticStyle:{\"color\":\"Tomato\"}},[_vm._v(\" \"+_vm._s(wound)+\" \")])}),0),_c('td',[_vm._v(\" \"+_vm._s(organ.location)+\" \")])]:_vm._e()],2)})],2),_c('hr'),_c('h3',[_vm._v(\"External Bodypart Status\")]),_c('hr'),_c('table',{staticClass:\"injury\"},[(_vm.hasexternalinjury)?[_vm._m(2)]:[_vm._m(3)],_vm._l((_vm.bodyparts),function(organ){return _c('tr',{key:organ.name},[(organ.bruteDmg != 'None' || organ.burnDmg != 'None' || organ.hasWounds)?[_c('td',[_vm._v(\" \"+_vm._s(organ.name)+\" \")]),_c('td',[_c('span',{style:({color:_vm.damageLabel(organ.bruteDmg)})},[_vm._v(\" \"+_vm._s(organ.bruteDmg)+\" \")]),_vm._v(\" / \"),_c('span',{style:({color:_vm.damageLabel(organ.burnDmg)})},[_vm._v(\" \"+_vm._s(organ.burnDmg)+\" \")])]),_c('td',_vm._l((organ.wounds),function(wound){return _c('div',{key:wound.name,staticStyle:{\"color\":\"Tomato\"}},[_vm._v(\" \"+_vm._s(wound)+\" \")])}),0)]:_vm._e()],2)})],2)],2),_c('h3',[_vm._v(\"Actions\")]),_c('vui-button',{staticClass:\"center\",attrs:{\"params\":{print: 1}}},[_vm._v(\"Print Report\")]),_c('vui-button',{staticClass:\"center\",attrs:{\"params\":{eject: 1}}},[_vm._v(\"Eject Occupant\")])],1)])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Organ\")]),_c('th',[_vm._v(\"Trauma\")]),_c('th',[_vm._v(\"Wounds\")]),_c('th',[_vm._v(\"Location\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_c('span',{staticStyle:{\"color\":\"LimeGreen\"}},[_vm._v(\"The occupant has no internal injuries.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Organ\")]),_c('th',[_vm._v(\"Physical / Burn Trauma\")]),_c('th',[_vm._v(\"Wounds\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_c('span',{staticStyle:{\"color\":\"LimeGreen\"}},[_vm._v(\"The occupant has no external injuries.\")])])])}]\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./bodyscanner.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./bodyscanner.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./bodyscanner.vue?vue&type=template&id=130b946b&scoped=true&\"\nimport script from \"./bodyscanner.vue?vue&type=script&lang=js&\"\nexport * from \"./bodyscanner.vue?vue&type=script&lang=js&\"\nimport style0 from \"./bodyscanner.vue?vue&type=style&index=0&id=130b946b&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"130b946b\",\n null\n \n)\n\nexport default component.exports","'use strict';\nvar global = require('../internals/global');\nvar redefineAll = require('../internals/redefine-all');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceIternalState = require('../internals/internal-state').enforce;\nvar NATIVE_WEAK_MAP = require('../internals/native-weak-map');\n\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('vui-item',{attrs:{\"label\":\"Turret Status:\",\"balance\":0.4}},[_c('vui-button',{class:{'red': _vm.settings.enabled},attrs:{\"params\":{'command' : 'enable', 'value' : 1, 'turret_ref': _vm.tref}}},[_vm._v(\"Enabled\")]),_c('vui-button',{class:{'selected': !_vm.settings.enabled},attrs:{\"params\":{'command' : 'enable', 'value' : 0, 'turret_ref': _vm.tref}}},[_vm._v(\"Disabled\")])],1),(_vm.settings.is_lethal)?_c('vui-item',{attrs:{\"label\":\"Lethal Mode:\",\"balance\":0.4}},[_c('vui-button',{class:{'red': _vm.settings.lethal && _vm.settings.can_switch},attrs:{\"disabled\":!_vm.settings.can_switch,\"params\":{'command' : 'lethal', 'value' : 1, 'turret_ref': _vm.tref}}},[_vm._v(\"On\")]),_c('vui-button',{class:{'selected': !_vm.settings.lethal && _vm.settings.can_switch},attrs:{\"disabled\":!_vm.settings.can_switch,\"params\":{'command' : 'lethal', 'value' : 0, 'turret_ref': _vm.tref}}},[_vm._v(\"Off\")])],1):_vm._e(),_vm._l((_vm.settings.settings),function(setting,id){return _c('vui-item',{key:setting.id,attrs:{\"label\":setting.category,\"balance\":0.4}},[_c('vui-button',{class:{'selected': setting.value},attrs:{\"params\":{'command' : id, 'value' : 1, 'turret_ref': _vm.tref}}},[_vm._v(\"On\")]),_c('vui-button',{class:{'selected': !setting.value},attrs:{\"params\":{'command' : id, 'value' : 0, 'turret_ref': _vm.tref}}},[_vm._v(\"Off\")])],1)})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./control-part.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./control-part.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./control-part.vue?vue&type=template&id=47762730&\"\nimport script from \"./control-part.vue?vue&type=script&lang=js&\"\nexport * from \"./control-part.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./progress.vue?vue&type=style&index=0&id=041d7f1a&lang=scss&scoped=true&\"","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./late-choices.vue?vue&type=style&index=0&id=36f58934&lang=scss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"displayBar\"},[_c('div',{staticClass:\"displayBarFill\",style:({ width: _vm.percentage + '%'})},[_c('span',[_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./progress.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./progress.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./progress.vue?vue&type=template&id=041d7f1a&scoped=true&\"\nimport script from \"./progress.vue?vue&type=script&lang=js&\"\nexport * from \"./progress.vue?vue&type=script&lang=js&\"\nimport style0 from \"./progress.vue?vue&type=style&index=0&id=041d7f1a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"041d7f1a\",\n null\n \n)\n\nexport default component.exports","var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'.split(/(b)*/)[1] == 'c' ||\n 'test'.split(/(?:)/, -1).length != 4 ||\n 'ab'.split(/(?:ab)*/).length != 2 ||\n '.'.split(/(.?)(.?)/).length != 4 ||\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output.length > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar FORCED = require('../internals/object-prototype-accessors-forced');\nvar toObject = require('../internals/to-object');\nvar aFunction = require('../internals/a-function');\nvar definePropertyModule = require('../internals/object-define-property');\n\n// `Object.prototype.__defineGetter__` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__\nif (DESCRIPTORS) {\n $({ target: 'Object', proto: true, forced: FORCED }, {\n __defineGetter__: function __defineGetter__(P, getter) {\n definePropertyModule.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });\n }\n });\n}\n","var $ = require('../internals/export');\nvar global = require('../internals/global');\nvar task = require('../internals/task');\n\nvar FORCED = !global.setImmediate || !global.clearImmediate;\n\n// http://w3c.github.io/setImmediate/\n$({ global: true, bind: true, enumerable: true, forced: FORCED }, {\n // `setImmediate` method\n // http://w3c.github.io/setImmediate/#si-setImmediate\n setImmediate: task.set,\n // `clearImmediate` method\n // http://w3c.github.io/setImmediate/#si-clearImmediate\n clearImmediate: task.clear\n});\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var $ = require('../internals/export');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n$({ target: 'Object', stat: true }, {\n setPrototypeOf: setPrototypeOf\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar createHTML = require('../internals/create-html');\nvar forcedStringHTMLMethod = require('../internals/string-html-forced');\n\n// `String.prototype.big` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.big\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('big') }, {\n big: function big() {\n return createHTML(this, 'big', '', '');\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.services.length)?_c('h2',[_vm._v(\"Programs\")]):_vm._e(),_c('i',[_vm._v(\"No program loaded. Please select program from list below.\")]),_vm._l((_vm.displayed_programs),function(p){return _c('div',{key:p.filename},[_c('vui-button',{attrs:{\"params\":{ PC_runprogram: p.filename}}},[_vm._v(_vm._s(p.desc))]),(p.running)?_c('vui-button',{staticClass:\"danger\",attrs:{\"icon\":\"window-close\",\"icon-only\":\"\",\"params\":{ PC_killprogram: p.filename}}}):_vm._e()],1)}),(_vm.services.length)?_c('h2',[_vm._v(\"Services\")]):_vm._e(),_vm._l((_vm.services),function(p){return _c('div',{key:p.filename},[_c('vui-button',{class:{ on: p.service.enabled },attrs:{\"params\":{ PC_toggleservice: p.filename}}},[_vm._v(_vm._s(p.desc))]),(p.service.enabled)?_c('vui-button',{staticClass:\"danger\",attrs:{\"icon\":\"window-close\",\"icon-only\":\"\",\"params\":{ PC_toggleservice: p.filename}}}):_vm._e()],1)})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./main.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./main.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./main.vue?vue&type=template&id=285da89e&\"\nimport script from \"./main.vue?vue&type=script&lang=js&\"\nexport * from \"./main.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int32Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int32', function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\nvar min = Math.min;\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","ace.define(\"ace/theme/monokai\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-monokai\";\nexports.cssText = \".ace-monokai .ace_gutter {\\\nbackground: #2F3129;\\\ncolor: #8F908A\\\n}\\\n.ace-monokai .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #555651\\\n}\\\n.ace-monokai {\\\nbackground-color: #272822;\\\ncolor: #F8F8F2\\\n}\\\n.ace-monokai .ace_cursor {\\\ncolor: #F8F8F0\\\n}\\\n.ace-monokai .ace_marker-layer .ace_selection {\\\nbackground: #49483E\\\n}\\\n.ace-monokai.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #272822;\\\n}\\\n.ace-monokai .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-monokai .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #49483E\\\n}\\\n.ace-monokai .ace_marker-layer .ace_active-line {\\\nbackground: #202020\\\n}\\\n.ace-monokai .ace_gutter-active-line {\\\nbackground-color: #272727\\\n}\\\n.ace-monokai .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #49483E\\\n}\\\n.ace-monokai .ace_invisible {\\\ncolor: #52524d\\\n}\\\n.ace-monokai .ace_entity.ace_name.ace_tag,\\\n.ace-monokai .ace_keyword,\\\n.ace-monokai .ace_meta.ace_tag,\\\n.ace-monokai .ace_storage {\\\ncolor: #F92672\\\n}\\\n.ace-monokai .ace_punctuation,\\\n.ace-monokai .ace_punctuation.ace_tag {\\\ncolor: #fff\\\n}\\\n.ace-monokai .ace_constant.ace_character,\\\n.ace-monokai .ace_constant.ace_language,\\\n.ace-monokai .ace_constant.ace_numeric,\\\n.ace-monokai .ace_constant.ace_other {\\\ncolor: #AE81FF\\\n}\\\n.ace-monokai .ace_invalid {\\\ncolor: #F8F8F0;\\\nbackground-color: #F92672\\\n}\\\n.ace-monokai .ace_invalid.ace_deprecated {\\\ncolor: #F8F8F0;\\\nbackground-color: #AE81FF\\\n}\\\n.ace-monokai .ace_support.ace_constant,\\\n.ace-monokai .ace_support.ace_function {\\\ncolor: #66D9EF\\\n}\\\n.ace-monokai .ace_fold {\\\nbackground-color: #A6E22E;\\\nborder-color: #F8F8F2\\\n}\\\n.ace-monokai .ace_storage.ace_type,\\\n.ace-monokai .ace_support.ace_class,\\\n.ace-monokai .ace_support.ace_type {\\\nfont-style: italic;\\\ncolor: #66D9EF\\\n}\\\n.ace-monokai .ace_entity.ace_name.ace_function,\\\n.ace-monokai .ace_entity.ace_other,\\\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\\\n.ace-monokai .ace_variable {\\\ncolor: #A6E22E\\\n}\\\n.ace-monokai .ace_variable.ace_parameter {\\\nfont-style: italic;\\\ncolor: #FD971F\\\n}\\\n.ace-monokai .ace_string {\\\ncolor: #E6DB74\\\n}\\\n.ace-monokai .ace_comment {\\\ncolor: #75715E\\\n}\\\n.ace-monokai .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.spawnpoint),expression:\"!spawnpoint\"}],staticClass:\"tagselector\"},_vm._l((_vm.tags),function(amount,tag){return _c('vui-button',{key:tag,class:{ selected: _vm.current_tag == tag},on:{\"click\":function($event){_vm.current_tag = tag}}},[_vm._v(_vm._s(tag)+\" (\"+_vm._s(amount)+\")\")])}),1),_c('hr',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.spawnpoint),expression:\"!spawnpoint\"}]}),_c('table',[_vm._m(0),_vm._l((_vm.spawners),function(data,index){return _c('tr',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showEntry(data)),expression:\"showEntry(data)\"}],key:index},[_c('td',[_vm._v(_vm._s(data.name))]),_c('td',[_vm._v(_vm._s(data.desc))]),(data.max_count > 0)?_c('td',[_vm._v(_vm._s(data.max_count - data.count)+\" / \"+_vm._s(data.max_count))]):(data.spawnatoms > 0)?_c('td',[_vm._v(_vm._s(data.spawnatoms))]):_c('td',[_vm._v(\"∞\")]),_c('td',{staticClass:\"action\"},[_c('vui-button',{attrs:{\"disabled\":(data.cant_spawn !== 0),\"params\":{spawn: index, spawnpoint: _vm.spawnpoint},\"icon\":\"star\"}},[_vm._v(\"Spawn\")]),(data.can_edit == 1)?_c('vui-button',{attrs:{\"disabled\":(data.enabled == 1),\"params\":{enable: index}}},[_vm._v(\"Enable\")]):_vm._e(),(data.can_edit == 1)?_c('vui-button',{attrs:{\"disabled\":(data.enabled == 0),\"params\":{disable: index}}},[_vm._v(\"Disable\")]):_vm._e()],1)])})],2)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Name\")]),_c('th',[_vm._v(\"Description\")]),_c('th',[_vm._v(\"Available Slots\")]),_c('th',{staticClass:\"action\"},[_vm._v(\"Actions\")])])}]\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ghostspawner.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ghostspawner.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ghostspawner.vue?vue&type=template&id=70766bea&scoped=true&\"\nimport script from \"./ghostspawner.vue?vue&type=script&lang=js&\"\nexport * from \"./ghostspawner.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ghostspawner.vue?vue&type=style&index=0&id=70766bea&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"70766bea\",\n null\n \n)\n\nexport default component.exports","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./chemdisp.vue?vue&type=style&index=0&id=60faaeb6&lang=scss&scoped=true&\"","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.subarray` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.subarray\nexportTypedArrayMethod('subarray', function subarray(begin, end) {\n var O = aTypedArray(this);\n var length = O.length;\n var beginIndex = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O.constructor))(\n O.buffer,\n O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n );\n});\n","require('../modules/web.dom-collections.for-each');\nrequire('../modules/web.dom-collections.iterator');\nrequire('../modules/web.immediate');\nrequire('../modules/web.queue-microtask');\nrequire('../modules/web.timers');\nrequire('../modules/web.url');\nrequire('../modules/web.url.to-json');\nrequire('../modules/web.url-search-params');\nvar path = require('../internals/path');\n\nmodule.exports = path;\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","var toPositiveInteger = require('../internals/to-positive-integer');\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw RangeError('Wrong offset');\n return offset;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createHTML = require('../internals/create-html');\nvar forcedStringHTMLMethod = require('../internals/string-html-forced');\n\n// `String.prototype.anchor` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.anchor\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('anchor') }, {\n anchor: function anchor(name) {\n return createHTML(this, 'a', 'name', name);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar createHTML = require('../internals/create-html');\nvar forcedStringHTMLMethod = require('../internals/string-html-forced');\n\n// `String.prototype.fontsize` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fontsize\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontsize') }, {\n fontsize: function fontsize(size) {\n return createHTML(this, 'font', 'size', size);\n }\n});\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.species` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.species\ndefineWellKnownSymbol('species');\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',[_c('vui-button',{staticClass:\"fixedLeft\",attrs:{\"icon\":\"cog\",\"params\":{ close: 1 }}},[_vm._v(\"Close\")])],1),_c('div',[_c('h2',[_vm._v(\"Storage\")]),(_vm.secure)?_c('span',{staticClass:\"notice\"},[_vm._v(\" \"+_vm._s(_vm.locked == -1 ? \"Sec.re ACC_** //):securi_nt.diag=>##'or 1=1'%($...\" : \"Secure Access: Please have your identification ready.\")+\" \")]):_vm._e()]),(_vm.contents)?_vm._l((_vm.contents),function(vend_item){return _c('div',{key:vend_item.vend},[_c('div',[_c('span',{staticClass:\"highlight\"},[_vm._v(_vm._s(vend_item.display_name)+\" (\"+_vm._s(vend_item.quantity)+\" available)\")])]),_c('div',{staticStyle:{\"float\":\"left\"}},[_vm._v(\"Vend: \")]),_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: 1 },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"x1\")]),(vend_item.quantity >= 5)?_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: 5 },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"x5\")]):_vm._e(),(vend_item.quantity >= 10)?_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: 10 },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"x10\")]):_vm._e(),(vend_item.quantity >= 25)?_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: 25 },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"x25\")]):_vm._e(),(vend_item.quantity > 1)?_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: vend_item.quantity },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"All\")]):_vm._e()],1)}):_c('div',{staticClass:\"average\"},[_vm._v(\" No products loaded. \")])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./smartfridge.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./smartfridge.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./smartfridge.vue?vue&type=template&id=0bfa4fc7&\"\nimport script from \"./smartfridge.vue?vue&type=script&lang=js&\"\nexport * from \"./smartfridge.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var $ = require('../internals/export');\nvar ownKeys = require('../internals/own-keys');\n\n// `Reflect.ownKeys` method\n// https://tc39.github.io/ecma262/#sec-reflect.ownkeys\n$({ target: 'Reflect', stat: true }, {\n ownKeys: ownKeys\n});\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar defineProperties = require('../internals/object-define-properties');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\n$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, {\n defineProperties: defineProperties\n});\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.password == null)?_c('vui-button',{on:{\"click\":_vm.join}},[_vm._v(_vm._s(_vm.ch.title))]):[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.password),expression:\"password\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.password)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.join_with($event)},\"input\":function($event){if($event.target.composing){ return; }_vm.password=$event.target.value}}}),_c('vui-button',{attrs:{\"params\":{join: {target: _vm.re, password: _vm.password}}}},[_vm._v(\"Join \"+_vm._s(_vm.ch.title))])]],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./channel-btn.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./channel-btn.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./channel-btn.vue?vue&type=template&id=66c67282&\"\nimport script from \"./channel-btn.vue?vue&type=script&lang=js&\"\nexport * from \"./channel-btn.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trimEnd = require('../internals/string-trim').end;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\nvar FORCED = forcedStringTrimMethod('trimEnd');\n\nvar trimEnd = FORCED ? function trimEnd() {\n return $trimEnd(this);\n} : ''.trimEnd;\n\n// `String.prototype.{ trimEnd, trimRight }` methods\n// https://github.com/tc39/ecmascript-string-left-right-trim\n$({ target: 'String', proto: true, forced: FORCED }, {\n trimEnd: trimEnd,\n trimRight: trimEnd\n});\n","var log = Math.log;\n\n// `Math.log1p` method implementation\n// https://tc39.github.io/ecma262/#sec-math.log1p\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : log(1 + x);\n};\n","export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./teleporter.vue?vue&type=style&index=0&id=c971b6ac&lang=scss&scoped=true&\"","'use strict';\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\n\n// `WeakSet` constructor\n// https://tc39.github.io/ecma262/#sec-weakset-constructor\ncollection('WeakSet', function (init) {\n return function WeakSet() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionWeak);\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.active)?_c('div',[_c('view-records-general',{attrs:{\"hide-advanced\":\"\"}},[_c('vui-group-item',{attrs:{\"label\":\"Blood type:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.blood_type\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.choices.medical.blood_type),function(i){return _c('option',{key:i,domProps:{\"value\":i}},[_vm._v(_vm._s(i))])}),0)])],1),_c('vui-group-item',{attrs:{\"label\":\"DNA:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.blood_dna\"}})],1),_c('vui-group-item',{attrs:{\"label\":\"Disabilities:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.disabilities\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1),_c('vui-group-item',{attrs:{\"label\":\"Allergies:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.allergies\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1),_c('vui-group-item',{attrs:{\"label\":\"Diseases:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.diseases\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1),_c('vui-group-item',{attrs:{\"label\":\"Comments:\"}},[_vm._l((_vm.active.medical.comments),function(comment){return _c('div',{key:comment},[_vm._v(_vm._s(comment)+\" \"),((_vm.editable & 2) > 0)?_c('vui-button',{staticClass:\"danger\",attrs:{\"params\":{ removefromrecord: { value: comment, key: ['active', 'medical', 'comments'] }},\"icon\":\"trash-alt\"}}):_vm._e()],1)}),(_vm.active.medical.comments.length == 0)?_c('div',[_vm._v(\"There are no comments.\")]):_vm._e(),((_vm.editable & 2) > 0)?_c('view-records-field',{attrs:{\"edit-button\":\"Add\"},on:{\"save\":function($event){return _vm.add('active.medical.comments', $event)}}}):_vm._e()],2),_c('vui-group-item',{attrs:{\"label\":\"Notes:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.notes\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1)],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","