diff --git a/.gitignore b/.gitignore
index 4147856a2..4e1caf1bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
Changelog.txt
Netburner.txt
-README.md
\ No newline at end of file
+README.md
+/node_modules
\ No newline at end of file
diff --git a/css/interactivetutorial.css b/css/interactivetutorial.css
index 12990bb96..95e51b380 100644
--- a/css/interactivetutorial.css
+++ b/css/interactivetutorial.css
@@ -40,6 +40,7 @@
-moz-box-shadow: 1px 1px 3px #000;
-webkit-box-shadow: 1px 1px 3px #000;
box-shadow: 1px 1px 3px #000;
+ background-color:black;
}
#interactive-tutorial-exit {
@@ -65,4 +66,3 @@
text-decoration: none;
cursor: pointer;
}
-
diff --git a/css/menupages.css b/css/menupages.css
index 3d8d98612..ac67756af 100644
--- a/css/menupages.css
+++ b/css/menupages.css
@@ -16,6 +16,42 @@
}
/* Script Editor */
+#script-editor-container {
+ background-color:transparent;
+}
+#javascript-editor {
+ margin: 10px;
+
+ height: 80%;
+ width: 100%;
+ margin-left: 6px;
+
+ padding-left: 6px;
+ padding-top: 6px;
+ padding-bottom: 6px;
+
+ border: 2px solid var(--my-highlight-color);
+ z-index: 1;
+ font-family: 'Lucida Console', 'Lucida Sans Unicode', 'Fira Mono', 'Consolas', 'Courier New', Courier, monospace, 'Times New Roman';
+}
+
+#javascript-editor textarea {
+ color: var(--my-font-color);
+}
+
+.ace_line,
+.ace_line * {
+ color: var(--my-font-color);
+ background-color:transparent;
+ margin:0px;
+ padding:0px;
+}
+
+.ace_text-input {
+ font-size:16px;
+ background-color:transparent;
+}
+
/* This temp element is used for auto adjusting filename field */
.tmp-element {
visibility: hidden;
@@ -56,6 +92,7 @@
#script-editor-wrapper {
height:100%;
width: 70%;
+ background:transparent;
}
#script-editor-filename-wrapper {
@@ -103,28 +140,6 @@
color: #ffffff;
}
-#script-editor-text {
- color: var(--my-font-color);
- height: 80%;
- width: 100%;
- margin-left: 6px;
-
- padding-left: 6px;
- padding-top: 6px;
- padding-bottom: 6px;
-
- border: 2px solid var(--my-highlight-color);
- -webkit-box-shadow:
- inset 0 0 8px rgba(0,0,0,0.1),
- 0 0 16px rgba(0,0,0,0.1);
- -moz-box-shadow:
- inset 0 0 8px rgba(0,0,0,0.1),
- 0 0 16px rgba(0,0,0,0.1);
- box-shadow:
- inset 0 0 8px rgba(0,0,0,0.1),
- 0 0 16px rgba(0,0,0,0.1);
-}
-
/* Active scripts */
.active-scripts-list {
list-style-type: none;
@@ -261,6 +276,7 @@
box-shadow: 1px 1px 3px #000;
margin: 4px;
padding: 4px;
+ background-color:black;
}
.active-scripts-button:hover,
@@ -569,6 +585,7 @@ div.faction-clear {
color: var(--my-font-color);
padding: 4px;
margin: 4px;
+ background-color:black;
}
.stock-market-buy-sell-button {
diff --git a/css/popupboxes.css b/css/popupboxes.css
index 9d9ad0b17..d84c84fd1 100644
--- a/css/popupboxes.css
+++ b/css/popupboxes.css
@@ -7,6 +7,7 @@
top: 0;
width: 100%;
height: 100%;
+ overflow:auto;
background-color: rbga(var(--my-background-color), 0.4);
}
@@ -16,7 +17,6 @@
padding: 12px;
border: 5px solid var(--my-highlight-color);
width: 70%;
- overflow: auto; /* Enable scroll if needed */
color: var(--my-font-color);
}
@@ -29,6 +29,7 @@
padding: 2px;
margin: 6px;
border: 1px solid white;
+ background-color:black;
}
.popup-box-button:hover,
@@ -43,6 +44,12 @@
cursor: default;
}
+#yes-no-text-input-box-input {
+ color: var(--my-font-color);
+ border: 1px solid white;
+ background-color:black;
+}
+
.dialog-box-container,
#log-box-container {
display: block;
@@ -94,20 +101,6 @@
cursor: pointer;
}
-/* Purchase server box */
-#purchase-server-box-container {
- transition: opacity 400ms ease-in;
-}
-
-#purchase-server-box-input {
- color: white;
-}
-
-/* Purchase Augmentation Box */
-#purchase-augmentation-box-container {
- transition: opacity 400ms ease-in;
-}
-
/* Faction invitation box */
#faction-invitation-box-container {
transition: opacity 400ms ease-in;
diff --git a/css/styles.css b/css/styles.css
index 74661d623..564b9522c 100644
--- a/css/styles.css
+++ b/css/styles.css
@@ -1,20 +1,20 @@
/** This removes all padding and margins as well as
setting a default font size and family for the page **/
-
:root{
--my-font-color: #66ff33;
--my-background-color: #000000;
--my-highlight-color: #ffffff;
}
-
* {
margin: 0;
padding: 0;
font-size: 16px;
font-family: 'Lucida Console', 'Lucida Sans Unicode', 'Fira Mono', 'Consolas', 'Courier New', Courier, monospace, 'Times New Roman';
- /*background-color: #252527;*/
+}
+
+body {
background-color: var(--my-background-color);
}
@@ -41,6 +41,10 @@ span {
padding: 4px;
}
+#entire-game-container {
+ background-color:transparent;
+}
+
/* Disable border highlight on elements */
input:focus,
textarea:focus,
@@ -346,6 +350,7 @@ a:link, a:visited {
-webkit-box-shadow: 1px 1px 3px #000;
box-shadow: 1px 1px 3px #000;
height: 22px;
+ background-color:black;
}
#character-overview-save-button:hover,
diff --git a/dist/bundle.js b/dist/bundle.js
new file mode 100644
index 000000000..e6cdfabad
--- /dev/null
+++ b/dist/bundle.js
@@ -0,0 +1,64355 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 4);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Player; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return loadPlayer; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Augmentations_js__ = __webpack_require__(16);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__BitNode_js__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Company_js__ = __webpack_require__(17);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Constants_js__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__CreateProgram_js__ = __webpack_require__(14);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Crimes_js__ = __webpack_require__(40);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__engine_js__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__Faction_js__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__Gang_js__ = __webpack_require__(29);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__Location_js__ = __webpack_require__(12);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__Server_js__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__ = __webpack_require__(11);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__SourceFile_js__ = __webpack_require__(30);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js__ = __webpack_require__(23);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_13__utils_decimal_js__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__utils_HelperFunctions_js__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__utils_IPAddress_js__ = __webpack_require__(21);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__utils_JSONReviver_js__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__ = __webpack_require__(5);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function PlayerObject() {
+ //Skills and stats
+ this.hacking_skill = 1;
+
+ //Fighting
+ this.hp = 10;
+ this.max_hp = 10;
+ this.strength = 1; //Damage dealt
+ this.defense = 1; //Damage received
+ this.dexterity = 1; //Accuracy
+ this.agility = 1; //Dodge %
+
+ //Labor stats
+ this.charisma = 1;
+ //Intelligence, perhaps?
+
+ //Hacking multipliers
+ this.hacking_chance_mult = 1; //Increase through ascensions/augmentations
+ this.hacking_speed_mult = 1; //Decrease through ascensions/augmentations
+ this.hacking_money_mult = 1; //Increase through ascensions/augmentations. Can't go above 1
+ this.hacking_grow_mult = 1;
+
+ //Experience and multipliers
+ this.hacking_exp = 0;
+ this.strength_exp = 0;
+ this.defense_exp = 0;
+ this.dexterity_exp = 0;
+ this.agility_exp = 0;
+ this.charisma_exp = 0;
+
+ this.hacking_mult = 1;
+ this.strength_mult = 1;
+ this.defense_mult = 1;
+ this.dexterity_mult = 1;
+ this.agility_mult = 1;
+ this.charisma_mult = 1;
+
+ this.hacking_exp_mult = 1;
+ this.strength_exp_mult = 1;
+ this.defense_exp_mult = 1;
+ this.dexterity_exp_mult = 1;
+ this.agility_exp_mult = 1;
+ this.charisma_exp_mult = 1;
+
+ this.company_rep_mult = 1;
+ this.faction_rep_mult = 1;
+
+ //Money
+ this.money = new __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js___default.a(1000);
+ this.total_money = new __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js___default.a(0); //Total money ever earned in this "simulation"
+ this.lifetime_money = new __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js___default.a(0); //Total money ever earned
+
+ //IP Address of Starting (home) computer
+ this.homeComputer = "";
+
+ //Location information
+ this.city = __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12;
+ this.location = "";
+
+ //Company Information
+ this.companyName = ""; //Name of Company, equivalent to an object from Locations
+ this.companyPosition = ""; //CompanyPosition object
+
+ //Servers
+ this.currentServer = ""; //IP address of Server currently being accessed through terminal
+ this.discoveredServers = []; //IP addresses of secret servers not in the network that you have discovered
+ this.purchasedServers = [];
+ this.hacknetNodes = [];
+ this.totalHacknetNodeProduction = 0;
+
+ //Factions
+ this.factions = []; //Names of all factions player has joined
+ this.factionInvitations = []; //Outstanding faction invitations
+
+ //Augmentations
+ this.queuedAugmentations = [];
+ this.augmentations = [];
+
+ this.sourceFiles = [];
+
+ //Crime statistics
+ this.numPeopleKilled = 0;
+ this.karma = 0;
+
+ this.crime_money_mult = 1;
+ this.crime_success_mult = 1;
+
+ //Flag to let the engine know the player is starting an action
+ // Current actions: hack, analyze
+ this.startAction = false;
+ this.actionTime = 0;
+
+ //Flags/variables for working (Company, Faction, Creating Program, Taking Class)
+ this.isWorking = false;
+ this.workType = "";
+
+ this.currentWorkFactionName = "";
+ this.currentWorkFactionDescription = "";
+
+ this.workHackExpGainRate = 0;
+ this.workStrExpGainRate = 0;
+ this.workDefExpGainRate = 0;
+ this.workDexExpGainRate = 0;
+ this.workAgiExpGainRate = 0;
+ this.workChaExpGainRate = 0;
+ this.workRepGainRate = 0;
+ this.workMoneyGainRate = 0;
+ this.workMoneyLossRate = 0;
+
+ this.workHackExpGained = 0;
+ this.workStrExpGained = 0;
+ this.workDefExpGained = 0;
+ this.workDexExpGained = 0;
+ this.workAgiExpGained = 0;
+ this.workChaExpGained = 0;
+ this.workRepGained = 0;
+ this.workMoneyGained = 0;
+
+ this.createProgramName = "";
+
+ this.className = "";
+
+ this.crimeType = "";
+
+ this.timeWorked = 0; //in ms
+ this.timeNeededToCompleteWork = 0;
+
+ this.work_money_mult = 1;
+
+ //Hacknet Node multipliers
+ this.hacknet_node_money_mult = 1;
+ this.hacknet_node_purchase_cost_mult = 1;
+ this.hacknet_node_ram_cost_mult = 1;
+ this.hacknet_node_core_cost_mult = 1;
+ this.hacknet_node_level_cost_mult = 1;
+
+ //Stock Market
+ this.hasWseAccount = false;
+ this.hasTixApiAccess = false;
+
+ //Gang
+ this.gang = 0;
+
+ //bitnode
+ this.bitNodeN = 1;
+
+ //Flags for determining whether certain "thresholds" have been achieved
+ this.firstFacInvRecvd = false;
+ this.firstAugPurchased = false;
+ this.firstJobRecvd = false;
+ this.firstTimeTraveled = false;
+ this.firstProgramAvailable = false;
+
+ //Used to store the last update time.
+ this.lastUpdate = 0;
+ this.totalPlaytime = 0;
+ this.playtimeSinceLastAug = 0;
+};
+
+PlayerObject.prototype.init = function() {
+ /* Initialize Player's home computer */
+ var t_homeComp = new __WEBPACK_IMPORTED_MODULE_10__Server_js__["d" /* Server */](Object(__WEBPACK_IMPORTED_MODULE_16__utils_IPAddress_js__["a" /* createRandomIp */])(), "home", "Home PC", true, true, true, 8);
+ this.homeComputer = t_homeComp.ip;
+ this.currentServer = t_homeComp.ip;
+ Object(__WEBPACK_IMPORTED_MODULE_10__Server_js__["a" /* AddToAllServers */])(t_homeComp);
+
+ this.getHomeComputer().programs.push(__WEBPACK_IMPORTED_MODULE_4__CreateProgram_js__["a" /* Programs */].NukeProgram);
+}
+
+PlayerObject.prototype.increaseMultiplier = function(name, val) {
+ let mult = this[name];
+ if (mult === null || mult === undefined) {
+ console.log("ERROR: Could not find this multiplier " + name);
+ return;
+ }
+ mult *= val;
+}
+
+PlayerObject.prototype.prestigeAugmentation = function() {
+ var homeComp = this.getHomeComputer();
+ this.currentServer = homeComp.ip;
+ this.homeComputer = homeComp.ip;
+
+ this.numPeopleKilled = 0;
+ this.karma = 0;
+
+ //Reset stats
+ this.hacking_skill = 1;
+
+ this.strength = 1;
+ this.defense = 1;
+ this.dexterity = 1;
+ this.agility = 1;
+
+ this.charisma = 1;
+
+ this.hacking_exp = 0;
+ this.strength_exp = 0;
+ this.defense_exp = 0;
+ this.dexterity_exp = 0;
+ this.agility_exp = 0;
+ this.charisma_exp = 0;
+
+ this.money = new __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js___default.a(1000);
+
+ this.city = __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12;
+ this.location = "";
+
+ this.companyName = "";
+ this.companyPosition = "";
+
+ this.discoveredServers = [];
+ this.purchasedServers = [];
+
+ this.factions = [];
+ this.factionInvitations = [];
+
+ this.queuedAugmentations = [];
+
+ this.startAction = false;
+ this.actionTime = 0;
+
+ this.isWorking = false;
+ this.currentWorkFactionName = "";
+ this.currentWorkFactionDescription = "";
+ this.createProgramName = "";
+ this.className = "";
+ this.crimeType = "";
+
+ this.workHackExpGainRate = 0;
+ this.workStrExpGainRate = 0;
+ this.workDefExpGainRate = 0;
+ this.workDexExpGainRate = 0;
+ this.workAgiExpGainRate = 0;
+ this.workChaExpGainRate = 0;
+ this.workRepGainRate = 0;
+ this.workMoneyGainRate = 0;
+
+ this.workHackExpGained = 0;
+ this.workStrExpGained = 0;
+ this.workDefExpGained = 0;
+ this.workDexExpGained = 0;
+ this.workAgiExpGained = 0;
+ this.workChaExpGained = 0;
+ this.workRepGained = 0;
+ this.workMoneyGained = 0;
+
+ this.timeWorked = 0;
+
+ this.lastUpdate = new Date().getTime();
+
+ this.playtimeSinceLastAug = 0;
+
+ this.hacknetNodes.length = 0;
+ this.totalHacknetNodeProduction = 0;
+}
+
+PlayerObject.prototype.prestigeSourceFile = function() {
+ var homeComp = this.getHomeComputer();
+ this.currentServer = homeComp.ip;
+ this.homeComputer = homeComp.ip;
+
+ this.numPeopleKilled = 0;
+ this.karma = 0;
+
+ //Reset stats
+ this.hacking_skill = 1;
+
+ this.strength = 1;
+ this.defense = 1;
+ this.dexterity = 1;
+ this.agility = 1;
+
+ this.charisma = 1;
+
+ this.hacking_exp = 0;
+ this.strength_exp = 0;
+ this.defense_exp = 0;
+ this.dexterity_exp = 0;
+ this.agility_exp = 0;
+ this.charisma_exp = 0;
+
+ this.money = new __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js___default.a(1000);
+
+ this.city = __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12;
+ this.location = "";
+
+ this.companyName = "";
+ this.companyPosition = "";
+
+ this.discoveredServers = [];
+ this.purchasedServers = [];
+
+ this.factions = [];
+ this.factionInvitations = [];
+
+ this.queuedAugmentations = [];
+ this.augmentations = [];
+
+ this.startAction = false;
+ this.actionTime = 0;
+
+ this.isWorking = false;
+ this.currentWorkFactionName = "";
+ this.currentWorkFactionDescription = "";
+ this.createProgramName = "";
+ this.className = "";
+ this.crimeType = "";
+
+ this.workHackExpGainRate = 0;
+ this.workStrExpGainRate = 0;
+ this.workDefExpGainRate = 0;
+ this.workDexExpGainRate = 0;
+ this.workAgiExpGainRate = 0;
+ this.workChaExpGainRate = 0;
+ this.workRepGainRate = 0;
+ this.workMoneyGainRate = 0;
+
+ this.workHackExpGained = 0;
+ this.workStrExpGained = 0;
+ this.workDefExpGained = 0;
+ this.workDexExpGained = 0;
+ this.workAgiExpGained = 0;
+ this.workChaExpGained = 0;
+ this.workRepGained = 0;
+ this.workMoneyGained = 0;
+
+ this.timeWorked = 0;
+
+ this.lastUpdate = new Date().getTime();
+
+ this.hacknetNodes.length = 0;
+ this.totalHacknetNodeProduction = 0;
+
+ //Gang
+ this.gang = null;
+
+ //Reset Stock market
+ this.hasWseAccount = false;
+ this.hasTixApiAccess = false;
+
+ this.playtimeSinceLastAug = 0;
+}
+
+PlayerObject.prototype.getCurrentServer = function() {
+ return __WEBPACK_IMPORTED_MODULE_10__Server_js__["b" /* AllServers */][this.currentServer];
+}
+
+PlayerObject.prototype.getHomeComputer = function() {
+ return __WEBPACK_IMPORTED_MODULE_10__Server_js__["b" /* AllServers */][this.homeComputer];
+}
+
+//Calculates skill level based on experience. The same formula will be used for every skill
+// At the maximum possible exp (MAX_INT = 9007199254740991), the hacking skill will be 1796 TODO REcalculate this
+// Gets to level 1000 hacking skill at (TODO Determine this)
+PlayerObject.prototype.calculateSkill = function(exp) {
+ return Math.max(Math.floor(32 * Math.log(exp + 534.5) - 200), 1);
+}
+
+PlayerObject.prototype.updateSkillLevels = function() {
+ this.hacking_skill = Math.floor(this.calculateSkill(this.hacking_exp) * this.hacking_mult);
+ this.strength = Math.floor(this.calculateSkill(this.strength_exp) * this.strength_mult);
+ this.defense = Math.floor(this.calculateSkill(this.defense_exp) * this.defense_mult);
+ this.dexterity = Math.floor(this.calculateSkill(this.dexterity_exp) * this.dexterity_mult);
+ this.agility = Math.floor(this.calculateSkill(this.agility_exp) * this.agility_mult);
+ this.charisma = Math.floor(this.calculateSkill(this.charisma_exp) * this.charisma_mult);
+
+ var ratio = this.hp / this.max_hp;
+ this.max_hp = Math.floor(10 + this.defense / 10);
+ Player.hp = Math.round(this.max_hp * ratio);
+}
+
+PlayerObject.prototype.resetMultipliers = function() {
+ this.hacking_chance_mult = 1;
+ this.hacking_speed_mult = 1;
+ this.hacking_money_mult = 1;
+ this.hacking_grow_mult = 1;
+
+ this.hacking_mult = 1;
+ this.strength_mult = 1;
+ this.defense_mult = 1;
+ this.dexterity_mult = 1;
+ this.agility_mult = 1;
+ this.charisma_mult = 1;
+
+ this.hacking_exp_mult = 1;
+ this.strength_exp_mult = 1;
+ this.defense_exp_mult = 1;
+ this.dexterity_exp_mult = 1;
+ this.agility_exp_mult = 1;
+ this.charisma_exp_mult = 1;
+
+ this.company_rep_mult = 1;
+ this.faction_rep_mult = 1;
+
+ this.crime_money_mult = 1;
+ this.crime_success_mult = 1;
+
+ this.hacknet_node_money_mult = 1;
+ this.hacknet_node_purchase_cost_mult = 1;
+ this.hacknet_node_ram_cost_mult = 1;
+ this.hacknet_node_core_cost_mult = 1;
+ this.hacknet_node_level_cost_mult = 1;
+
+ this.work_money_mult = 1;
+}
+
+//Calculates the chance of hacking a server
+//The formula is:
+// (2 * hacking_chance_multiplier * hacking_skill - requiredLevel) 100 - difficulty
+// ----------------------------------------------------------- * -----------------
+// (2 * hacking_chance_multiplier * hacking_skill) 100
+PlayerObject.prototype.calculateHackingChance = function() {
+ var difficultyMult = (100 - this.getCurrentServer().hackDifficulty) / 100;
+ var skillMult = (1.75 * this.hacking_skill);
+ var skillChance = (skillMult - this.getCurrentServer().requiredHackingSkill) / skillMult;
+ var chance = skillChance * difficultyMult * this.hacking_chance_mult;
+ if (chance > 1) {return 1;}
+ if (chance < 0) {return 0;}
+ return chance;
+}
+
+//Calculate the time it takes to hack a server in seconds. Returns the time
+//The formula is:
+// (2.5 * requiredLevel * difficulty + 200)
+// ----------------------------------- * hacking_speed_multiplier
+// hacking_skill + 100
+PlayerObject.prototype.calculateHackingTime = function() {
+ var difficultyMult = this.getCurrentServer().requiredHackingSkill * this.getCurrentServer().hackDifficulty;
+ var skillFactor = (2.5 * difficultyMult + 200) / (this.hacking_skill + 100);
+ return 5 * skillFactor / this.hacking_speed_mult;
+}
+
+//Calculates the PERCENTAGE of a server's money that the player will hack from the server if successful
+//The formula is:
+// (hacking_skill - (requiredLevel-1)) 100 - difficulty
+// --------------------------------------* ----------------------- * hacking_money_multiplier
+// hacking_skill 100
+PlayerObject.prototype.calculatePercentMoneyHacked = function() {
+ var difficultyMult = (100 - this.getCurrentServer().hackDifficulty) / 100;
+ var skillMult = (this.hacking_skill - (this.getCurrentServer().requiredHackingSkill - 1)) / this.hacking_skill;
+ var percentMoneyHacked = difficultyMult * skillMult * this.hacking_money_mult / 240;
+ console.log("Percent money hacked calculated to be: " + percentMoneyHacked);
+ if (percentMoneyHacked < 0) {return 0;}
+ if (percentMoneyHacked > 1) {return 1;}
+ return percentMoneyHacked * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].ManualHackMoney;
+}
+
+//Returns how much EXP the player gains on a successful hack
+//The formula is:
+// difficulty * requiredLevel * hacking_multiplier
+PlayerObject.prototype.calculateExpGain = function() {
+ var s = this.getCurrentServer();
+ if (s.baseDifficulty == null) {
+ s.baseDifficulty = s.hackDifficulty;
+ }
+ return (s.baseDifficulty * this.hacking_exp_mult * 0.3 + 3) * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].HackExpGain;
+}
+
+//Hack/Analyze a server. Return the amount of time the hack will take. This lets the Terminal object know how long to disable itself for
+//This assumes that the server being hacked is not purchased by the player, that the player's hacking skill is greater than the
+//required hacking skill and that the player has admin rights.
+PlayerObject.prototype.hack = function() {
+ this.actionTime = this.calculateHackingTime();
+ console.log("Hacking time: " + this.actionTime);
+ this.startAction = true; //Set the startAction flag so the engine starts the hacking process
+}
+
+PlayerObject.prototype.analyze = function() {
+ this.actionTime = 1;
+ this.startAction = true;
+}
+
+PlayerObject.prototype.hasProgram = function(programName) {
+ var home = Player.getHomeComputer();
+ for (var i = 0; i < home.programs.length; ++i) {
+ if (programName.toLowerCase() == home.programs[i].toLowerCase()) {return true;}
+ }
+ return false;
+}
+
+PlayerObject.prototype.setMoney = function(money) {
+ if (isNaN(money)) {
+ console.log("ERR: NaN passed into Player.setMoney()"); return;
+ }
+ this.money = money;
+}
+
+PlayerObject.prototype.gainMoney = function(money) {
+ if (isNaN(money)) {
+ console.log("ERR: NaN passed into Player.gainMoney()"); return;
+ }
+ this.money = this.money.plus(money);
+ this.total_money = this.total_money.plus(money);
+ this.lifetime_money = this.lifetime_money.plus(money);
+}
+
+PlayerObject.prototype.loseMoney = function(money) {
+ if (isNaN(money)) {
+ console.log("ERR: NaN passed into Player.loseMoney()"); return;
+ }
+ this.money = this.money.minus(money);
+}
+
+PlayerObject.prototype.gainHackingExp = function(exp) {
+ if (isNaN(exp)) {
+ console.log("ERR: NaN passed into Player.gainHackingExp()"); return;
+ }
+ this.hacking_exp += exp;
+}
+
+PlayerObject.prototype.gainStrengthExp = function(exp) {
+ if (isNaN(exp)) {
+ console.log("ERR: NaN passed into Player.gainStrengthExp()"); return;
+ }
+ this.strength_exp += exp;
+}
+
+PlayerObject.prototype.gainDefenseExp = function(exp) {
+ if (isNaN(exp)) {
+ console.log("ERR: NaN passed into player.gainDefenseExp()"); return;
+ }
+ this.defense_exp += exp;
+}
+
+PlayerObject.prototype.gainDexterityExp = function(exp) {
+ if (isNaN(exp)) {
+ console.log("ERR: NaN passed into Player.gainDexterityExp()"); return;
+ }
+ this.dexterity_exp += exp;
+}
+
+PlayerObject.prototype.gainAgilityExp = function(exp) {
+ if (isNaN(exp)) {
+ console.log("ERR: NaN passed into Player.gainAgilityExp()"); return;
+ }
+ this.agility_exp += exp;
+}
+
+PlayerObject.prototype.gainCharismaExp = function(exp) {
+ if (isNaN(exp)) {
+ console.log("ERR: NaN passed into Player.gainCharismaExp()"); return;
+ }
+ this.charisma_exp += exp;
+}
+
+/******* Working functions *******/
+PlayerObject.prototype.resetWorkStatus = function() {
+ this.workHackExpGainRate = 0;
+ this.workStrExpGainRate = 0;
+ this.workDefExpGainRate = 0;
+ this.workDexExpGainRate = 0;
+ this.workAgiExpGainRate = 0;
+ this.workChaExpGainRate = 0;
+ this.workRepGainRate = 0;
+ this.workMoneyGainRate = 0;
+
+ this.workHackExpGained = 0;
+ this.workStrExpGained = 0;
+ this.workDefExpGained = 0;
+ this.workDexExpGained = 0;
+ this.workAgiExpGained = 0;
+ this.workChaExpGained = 0;
+ this.workRepGained = 0;
+ this.workMoneyGained = 0;
+
+ this.timeWorked = 0;
+
+ this.currentWorkFactionName = "";
+ this.currentWorkFactionDescription = "";
+ this.createProgramName = "";
+ this.className = "";
+
+ document.getElementById("work-in-progress-text").innerHTML = "";
+}
+
+PlayerObject.prototype.gainWorkExp = function() {
+ this.gainHackingExp(this.workHackExpGained);
+ this.gainStrengthExp(this.workStrExpGained);
+ this.gainDefenseExp(this.workDefExpGained);
+ this.gainDexterityExp(this.workDexExpGained);
+ this.gainAgilityExp(this.workAgiExpGained);
+ this.gainCharismaExp(this.workChaExpGained);
+}
+
+/* Working for Company */
+PlayerObject.prototype.finishWork = function(cancelled, sing=false) {
+ //Since the work was cancelled early, player only gains half of what they've earned so far
+ if (cancelled) {
+ this.workRepGained /= 2;
+ }
+
+ this.gainWorkExp();
+
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ company.playerReputation += (this.workRepGained);
+
+ this.gainMoney(this.workMoneyGained);
+
+ this.updateSkillLevels();
+
+ var txt = "You earned a total of: " +
+ "$" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + " " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGained, 4) + " reputation for the company " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " hacking exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " strength exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " defense exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " dexterity exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " agility exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " charisma exp ";
+
+ if (cancelled) {
+ txt = "You worked a short shift of " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " " +
+ "Since you cancelled your work early, you only gained half of the reputation you earned. " + txt;
+ } else {
+ txt = "You worked a full shift of 8 hours! " +
+ "You earned a total of: " + txt;
+ }
+ if (!sing) {Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])(txt);}
+
+ var mainMenu = document.getElementById("mainmenu-container");
+ mainMenu.style.visibility = "visible";
+ this.isWorking = false;
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadTerminalContent();
+
+ if (sing) {
+ return "You worked a short shift of " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " and " +
+ "earned $" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + ", " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGained, 4) + " reputation, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " hacking exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " strength exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " defense exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " dexterity exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " agility exp, and " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " charisma exp.";
+ }
+}
+
+PlayerObject.prototype.startWork = function() {
+ this.resetWorkStatus();
+ this.isWorking = true;
+ this.workType = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeCompany;
+
+ this.workHackExpGainRate = this.getWorkHackExpGain();
+ this.workStrExpGainRate = this.getWorkStrExpGain();
+ this.workDefExpGainRate = this.getWorkDefExpGain();
+ this.workDexExpGainRate = this.getWorkDexExpGain();
+ this.workAgiExpGainRate = this.getWorkAgiExpGain();
+ this.workChaExpGainRate = this.getWorkChaExpGain();
+ this.workRepGainRate = this.getWorkRepGain();
+ this.workMoneyGainRate = this.getWorkMoneyGain();
+
+ this.timeNeededToCompleteWork = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MillisecondsPer8Hours;
+
+ //Remove all old event listeners from Cancel button
+ var newCancelButton = Object(__WEBPACK_IMPORTED_MODULE_15__utils_HelperFunctions_js__["b" /* clearEventListeners */])("work-in-progress-cancel-button");
+ newCancelButton.innerHTML = "Cancel Work";
+ newCancelButton.addEventListener("click", function() {
+ Player.finishWork(true);
+ return false;
+ });
+
+ //Display Work In Progress Screen
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadWorkInProgressContent();
+}
+
+PlayerObject.prototype.work = function(numCycles) {
+ this.workRepGainRate = this.getWorkRepGain();
+
+ this.workHackExpGained += this.workHackExpGainRate * numCycles;
+ this.workStrExpGained += this.workStrExpGainRate * numCycles;
+ this.workDefExpGained += this.workDefExpGainRate * numCycles;
+ this.workDexExpGained += this.workDexExpGainRate * numCycles;
+ this.workAgiExpGained += this.workAgiExpGainRate * numCycles;
+ this.workChaExpGained += this.workChaExpGainRate * numCycles;
+ this.workRepGained += this.workRepGainRate * numCycles;
+ this.workMoneyGained += this.workMoneyGainRate * numCycles;
+
+ var cyclesPerSec = 1000 / __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed;
+
+ this.timeWorked += __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed * numCycles;
+
+ //If timeWorked == 8 hours, then finish. You can only gain 8 hours worth of exp and money
+ if (this.timeWorked >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MillisecondsPer8Hours) {
+ var maxCycles = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].GameCyclesPer8Hours;
+ this.workHackExpGained = this.workHackExpGainRate * maxCycles;
+ this.workStrExpGained = this.workStrExpGainRate * maxCycles;
+ this.workDefExpGained = this.workDefExpGainRate * maxCycles;
+ this.workDexExpGained = this.workDexExpGainRate * maxCycles;
+ this.workAgiExpGained = this.workAgiExpGainRate * maxCycles;
+ this.workChaExpGained = this.workChaExpGainRate * maxCycles;
+ this.workRepGained = this.workRepGainRate * maxCycles;
+ this.workMoneyGained = this.workMoneyGainRate * maxCycles;
+ this.finishWork(false);
+ return;
+ }
+
+ var txt = document.getElementById("work-in-progress-text");
+ txt.innerHTML = "You are currently working as a " + this.companyPosition.positionName +
+ " at " + Player.companyName + " " +
+ "You have been working for " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " " +
+ "You have earned: " +
+ "$" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + " ($" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGainRate * cyclesPerSec, 2) + " / sec) " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGainRate * cyclesPerSec, 4) + " / sec) reputation for this company " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGainRate * cyclesPerSec, 4) + " / sec) hacking exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGainRate * cyclesPerSec, 4) + " / sec) strength exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGainRate * cyclesPerSec, 4) + " / sec) defense exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGainRate * cyclesPerSec, 4) + " / sec) dexterity exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGainRate * cyclesPerSec, 4) + " / sec) agility exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGainRate * cyclesPerSec, 4) + " / sec) charisma exp " +
+ "You will automatically finish after working for 8 hours. You can cancel earlier if you wish, " +
+ "but you will only gain half of the reputation you've earned so far."
+
+}
+
+PlayerObject.prototype.startWorkPartTime = function() {
+ this.resetWorkStatus();
+ this.isWorking = true;
+ this.workType = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeCompanyPartTime;
+
+ this.workHackExpGainRate = this.getWorkHackExpGain();
+ this.workStrExpGainRate = this.getWorkStrExpGain();
+ this.workDefExpGainRate = this.getWorkDefExpGain();
+ this.workDexExpGainRate = this.getWorkDexExpGain();
+ this.workAgiExpGainRate = this.getWorkAgiExpGain();
+ this.workChaExpGainRate = this.getWorkChaExpGain();
+ this.workRepGainRate = this.getWorkRepGain();
+ this.workMoneyGainRate = this.getWorkMoneyGain();
+
+ this.timeNeededToCompleteWork = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MillisecondsPer8Hours;
+
+ var newCancelButton = Object(__WEBPACK_IMPORTED_MODULE_15__utils_HelperFunctions_js__["b" /* clearEventListeners */])("work-in-progress-cancel-button");
+ newCancelButton.innerHTML = "Stop Working";
+ newCancelButton.addEventListener("click", function() {
+ Player.finishWorkPartTime();
+ return false;
+ });
+
+ //Display Work In Progress Screen
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadWorkInProgressContent();
+}
+
+PlayerObject.prototype.workPartTime = function(numCycles) {
+ this.workRepGainRate = this.getWorkRepGain();
+
+ this.workHackExpGained += this.workHackExpGainRate * numCycles;
+ this.workStrExpGained += this.workStrExpGainRate * numCycles;
+ this.workDefExpGained += this.workDefExpGainRate * numCycles;
+ this.workDexExpGained += this.workDexExpGainRate * numCycles;
+ this.workAgiExpGained += this.workAgiExpGainRate * numCycles;
+ this.workChaExpGained += this.workChaExpGainRate * numCycles;
+ this.workRepGained += this.workRepGainRate * numCycles;
+ this.workMoneyGained += this.workMoneyGainRate * numCycles;
+
+ var cyclesPerSec = 1000 / __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed;
+
+ this.timeWorked += __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed * numCycles;
+
+ //If timeWorked == 8 hours, then finish. You can only gain 8 hours worth of exp and money
+ if (this.timeWorked >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MillisecondsPer8Hours) {
+ var maxCycles = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].GameCyclesPer8Hours;
+ this.workHackExpGained = this.workHackExpGainRate * maxCycles;
+ this.workStrExpGained = this.workStrExpGainRate * maxCycles;
+ this.workDefExpGained = this.workDefExpGainRate * maxCycles;
+ this.workDexExpGained = this.workDexExpGainRate * maxCycles;
+ this.workAgiExpGained = this.workAgiExpGainRate * maxCycles;
+ this.workChaExpGained = this.workChaExpGainRate * maxCycles;
+ this.workRepGained = this.workRepGainRate * maxCycles;
+ this.workMoneyGained = this.workMoneyGainRate * maxCycles;
+ this.finishWorkPartTime();
+ return;
+ }
+
+ var txt = document.getElementById("work-in-progress-text");
+ txt.innerHTML = "You are currently working as a " + this.companyPosition.positionName +
+ " at " + Player.companyName + " " +
+ "You have been working for " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " " +
+ "You have earned: " +
+ "$" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + " ($" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGainRate * cyclesPerSec, 2) + " / sec) " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGainRate * cyclesPerSec, 4) + " / sec) reputation for this company " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGainRate * cyclesPerSec, 4) + " / sec) hacking exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGainRate * cyclesPerSec, 4) + " / sec) strength exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGainRate * cyclesPerSec, 4) + " / sec) defense exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGainRate * cyclesPerSec, 4) + " / sec) dexterity exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGainRate * cyclesPerSec, 4) + " / sec) agility exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGainRate * cyclesPerSec, 4) + " / sec) charisma exp " +
+ "You will automatically finish after working for 8 hours. You can cancel earlier if you wish, " +
+ "and there will be no penalty because this is a part-time job.";
+
+}
+
+PlayerObject.prototype.finishWorkPartTime = function(sing=false) {
+ this.gainWorkExp();
+
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ company.playerReputation += (this.workRepGained);
+
+ this.gainMoney(this.workMoneyGained);
+
+ this.updateSkillLevels();
+
+ var txt = "You earned a total of: " +
+ "$" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + " " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGained, 4) + " reputation for the company " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " hacking exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " strength exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " defense exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " dexterity exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " agility exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " charisma exp ";
+ txt = "You worked for " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " " + txt;
+ if (!sing) {Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])(txt);}
+
+ var mainMenu = document.getElementById("mainmenu-container");
+ mainMenu.style.visibility = "visible";
+ this.isWorking = false;
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadTerminalContent();
+ if (sing) {
+ return "You worked for " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " and " +
+ "earned a total of " +
+ "$" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + ", " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGained, 4) + " reputation, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " hacking exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " strength exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " defense exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " dexterity exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " agility exp, and " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " charisma exp";
+ }
+}
+
+/* Working for Faction */
+PlayerObject.prototype.finishFactionWork = function(cancelled, sing=false) {
+ this.gainWorkExp();
+
+ var faction = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */][this.currentWorkFactionName];
+ faction.playerReputation += (this.workRepGained);
+
+ this.gainMoney(this.workMoneyGained);
+
+ this.updateSkillLevels();
+
+ var txt = "You worked for your faction " + faction.name + " for a total of " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " " +
+ "You earned a total of: " +
+ "$" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + " " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGained, 4) + " reputation for the faction " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " hacking exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " strength exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " defense exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " dexterity exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " agility exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " charisma exp ";
+ if (!sing) {Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])(txt);}
+
+ var mainMenu = document.getElementById("mainmenu-container");
+ mainMenu.style.visibility = "visible";
+
+ this.isWorking = false;
+
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadTerminalContent();
+ if (sing) {
+ return "You worked for your faction " + faction.name + " for a total of " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + ". " +
+ "You earned " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGained, 4) + " rep, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " hacking exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " str exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " def exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " dex exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " agi exp, and " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " cha exp.";
+ }
+}
+
+PlayerObject.prototype.startFactionWork = function(faction) {
+ //Update reputation gain rate to account for faction favor
+ var favorMult = 1 + (faction.favor / 100);
+ if (isNaN(favorMult)) {favorMult = 1;}
+ this.workRepGainRate *= favorMult;
+ this.workRepGainRate *= __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkRepGain;
+
+ this.isWorking = true;
+ this.workType = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeFaction;
+ this.currentWorkFactionName = faction.name;
+
+ this.timeNeededToCompleteWork = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MillisecondsPer20Hours;
+
+ var cancelButton = Object(__WEBPACK_IMPORTED_MODULE_15__utils_HelperFunctions_js__["b" /* clearEventListeners */])("work-in-progress-cancel-button");
+ cancelButton.innerHTML = "Stop Faction Work";
+ cancelButton.addEventListener("click", function() {
+ Player.finishFactionWork(true);
+ return false;
+ });
+
+ //Display Work In Progress Screen
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadWorkInProgressContent();
+}
+
+PlayerObject.prototype.startFactionHackWork = function(faction) {
+ this.resetWorkStatus();
+
+ this.workHackExpGainRate = .15 * this.hacking_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workRepGainRate = this.hacking_skill / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel * this.faction_rep_mult;
+
+ this.factionWorkType = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].FactionWorkHacking;
+ this.currentWorkFactionDescription = "carrying out hacking contracts";
+
+ this.startFactionWork(faction);
+}
+
+PlayerObject.prototype.startFactionFieldWork = function(faction) {
+ this.resetWorkStatus();
+
+ this.workHackExpGainRate = .1 * this.hacking_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workStrExpGainRate = .1 * this.strength_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workDefExpGainRate = .1 * this.defense_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workDexExpGainRate = .1 * this.dexterity_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workAgiExpGainRate = .1 * this.agility_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workChaExpGainRate = .1 * this.charisma_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workRepGainRate = this.getFactionFieldWorkRepGain();
+
+ this.factionWorkType = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].FactionWorkField;
+ this.currentWorkFactionDescription = "carrying out field missions"
+
+ this.startFactionWork(faction);
+}
+
+PlayerObject.prototype.startFactionSecurityWork = function(faction) {
+ this.resetWorkStatus();
+
+ this.workHackExpGainRate = 0.05 * this.hacking_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workStrExpGainRate = 0.15 * this.strength_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workDefExpGainRate = 0.15 * this.defense_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workDexExpGainRate = 0.15 * this.dexterity_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workAgiExpGainRate = 0.15 * this.agility_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workChaExpGainRate = 0.00 * this.charisma_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkExpGain;
+ this.workRepGainRate = this.getFactionSecurityWorkRepGain();
+
+ this.factionWorkType = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].FactionWorkSecurity;
+ this.currentWorkFactionDescription = "performing security detail"
+
+ this.startFactionWork(faction);
+}
+
+PlayerObject.prototype.workForFaction = function(numCycles) {
+ var faction = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */][this.currentWorkFactionName];
+
+ //Constantly update the rep gain rate
+ switch (this.factionWorkType) {
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].FactionWorkHacking:
+ this.workRepGainRate = this.hacking_skill / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel * this.faction_rep_mult;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].FactionWorkField:
+ this.workRepGainRate = this.getFactionFieldWorkRepGain();
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].FactionWorkSecurity:
+ this.workRepGainRate = this.getFactionSecurityWorkRepGain();
+ break;
+ default:
+ break;
+ }
+
+ //Update reputation gain rate to account for faction favor
+ var favorMult = 1 + (faction.favor / 100);
+ if (isNaN(favorMult)) {favorMult = 1;}
+ this.workRepGainRate *= favorMult;
+ this.workRepGainRate *= __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].FactionWorkRepGain;
+
+ this.workHackExpGained += this.workHackExpGainRate * numCycles;
+ this.workStrExpGained += this.workStrExpGainRate * numCycles;
+ this.workDefExpGained += this.workDefExpGainRate * numCycles;
+ this.workDexExpGained += this.workDexExpGainRate * numCycles;
+ this.workAgiExpGained += this.workAgiExpGainRate * numCycles;
+ this.workChaExpGained += this.workChaExpGainRate * numCycles;
+ this.workRepGained += this.workRepGainRate * numCycles;
+ this.workMoneyGained += this.workMoneyGainRate * numCycles;
+
+ var cyclesPerSec = 1000 / __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed;
+
+ this.timeWorked += __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed * numCycles;
+
+ //If timeWorked == 20 hours, then finish. You can only work for the faction for 20 hours
+ if (this.timeWorked >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MillisecondsPer20Hours) {
+ var maxCycles = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].GameCyclesPer20Hours;
+ this.workHackExpGained = this.workHackExpGainRate * maxCycles;
+ this.workStrExpGained = this.workStrExpGainRate * maxCycles;
+ this.workDefExpGained = this.workDefExpGainRate * maxCycles;
+ this.workDexExpGained = this.workDexExpGainRate * maxCycles;
+ this.workAgiExpGained = this.workAgiExpGainRate * maxCycles;
+ this.workChaExpGained = this.workChaExpGainRate * maxCycles;
+ this.workRepGained = this.workRepGainRate * maxCycles;
+ this.workMoneyGained = this.workMoneyGainRate * maxCycles;
+ this.finishFactionWork(false);
+ }
+
+ var txt = document.getElementById("work-in-progress-text");
+ txt.innerHTML = "You are currently " + this.currentWorkFactionDescription + " for your faction " + faction.name + "." +
+ " You have been doing this for " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " " +
+ "You have earned: " +
+ "$" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGainRate * cyclesPerSec, 2) + " / sec) " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workRepGainRate * cyclesPerSec, 4) + " / sec) reputation for this faction " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGainRate * cyclesPerSec, 4) + " / sec) hacking exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGainRate * cyclesPerSec, 4) + " / sec) strength exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGainRate * cyclesPerSec, 4) + " / sec) defense exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGainRate * cyclesPerSec, 4) + " / sec) dexterity exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGainRate * cyclesPerSec, 4) + " / sec) agility exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGainRate * cyclesPerSec, 4) + " / sec) charisma exp " +
+
+ "You will automatically finish after working for 20 hours. You can cancel earlier if you wish. " +
+ "There is no penalty for cancelling earlier.";
+}
+
+
+//Money gained per game cycle
+PlayerObject.prototype.getWorkMoneyGain = function() {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ return this.companyPosition.baseSalary * company.salaryMultiplier *
+ this.work_money_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CompanyWorkMoney;
+}
+
+//Hack exp gained per game cycle
+PlayerObject.prototype.getWorkHackExpGain = function() {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ return this.companyPosition.hackingExpGain * company.expMultiplier *
+ this.hacking_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CompanyWorkExpGain;
+}
+
+//Str exp gained per game cycle
+PlayerObject.prototype.getWorkStrExpGain = function() {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ return this.companyPosition.strengthExpGain * company.expMultiplier *
+ this.strength_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CompanyWorkExpGain;
+}
+
+//Def exp gained per game cycle
+PlayerObject.prototype.getWorkDefExpGain = function() {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ return this.companyPosition.defenseExpGain * company.expMultiplier *
+ this.defense_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CompanyWorkExpGain;
+}
+
+//Dex exp gained per game cycle
+PlayerObject.prototype.getWorkDexExpGain = function() {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ return this.companyPosition.dexterityExpGain * company.expMultiplier *
+ this.dexterity_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CompanyWorkExpGain;
+}
+
+//Agi exp gained per game cycle
+PlayerObject.prototype.getWorkAgiExpGain = function() {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ return this.companyPosition.agilityExpGain * company.expMultiplier *
+ this.agility_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CompanyWorkExpGain;
+}
+
+//Charisma exp gained per game cycle
+PlayerObject.prototype.getWorkChaExpGain = function() {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ return this.companyPosition.charismaExpGain * company.expMultiplier *
+ this.charisma_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CompanyWorkExpGain;
+}
+
+//Reputation gained per game cycle
+PlayerObject.prototype.getWorkRepGain = function() {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ var jobPerformance = this.companyPosition.calculateJobPerformance(this.hacking_skill, this.strength,
+ this.defense, this.dexterity,
+ this.agility, this.charisma);
+ //Update reputation gain rate to account for company favor
+ var favorMult = 1 + (company.favor / 100);
+ if (isNaN(favorMult)) {favorMult = 1;}
+ return jobPerformance * this.company_rep_mult * favorMult;
+}
+
+PlayerObject.prototype.getFactionSecurityWorkRepGain = function() {
+ var t = 0.9 * (this.hacking_skill / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel +
+ this.strength / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel +
+ this.defense / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel +
+ this.dexterity / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel +
+ this.agility / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel) / 5;
+ return t * this.faction_rep_mult;
+}
+
+PlayerObject.prototype.getFactionFieldWorkRepGain = function() {
+ var t = 0.9 * (this.hacking_skill / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel +
+ this.strength / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel +
+ this.defense / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel +
+ this.dexterity / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel +
+ this.agility / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel +
+ this.charisma / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel) / 6;
+ return t * this.faction_rep_mult;
+}
+
+/* Creating a Program */
+PlayerObject.prototype.startCreateProgramWork = function(programName, time, reqLevel) {
+ this.resetWorkStatus();
+ this.isWorking = true;
+ this.workType = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeCreateProgram;
+
+ //Time needed to complete work affected by hacking skill (linearly based on
+ //ratio of (your skill - required level) to MAX skill)
+ var timeMultiplier = (__WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel - (this.hacking_skill - reqLevel)) / __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].MaxSkillLevel;
+ if (timeMultiplier > 1) {timeMultiplier = 1;}
+ if (timeMultiplier < 0.01) {timeMultiplier = 0.01;}
+
+ this.timeNeededToCompleteWork = timeMultiplier * time;
+ //Check for incomplete program
+ for (var i = 0; i < Player.getHomeComputer().programs.length; ++i) {
+ var programFile = Player.getHomeComputer().programs[i];
+ if (programFile.startsWith(programName) && programFile.endsWith("%-INC")) {
+ var res = programFile.split("-");
+ if (res.length != 3) {break;}
+ var percComplete = Number(res[1].slice(0, -1));
+ if (isNaN(percComplete) || percComplete < 0 || percComplete >= 100) {break;}
+ this.timeWorked = percComplete / 100 * this.timeNeededToCompleteWork;
+ Player.getHomeComputer().programs.splice(i, 1);
+ }
+ }
+
+ this.createProgramName = programName;
+
+ var cancelButton = Object(__WEBPACK_IMPORTED_MODULE_15__utils_HelperFunctions_js__["b" /* clearEventListeners */])("work-in-progress-cancel-button");
+ cancelButton.innerHTML = "Cancel work on creating program";
+ cancelButton.addEventListener("click", function() {
+ Player.finishCreateProgramWork(true);
+ return false;
+ });
+
+ //Display Work In Progress Screen
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadWorkInProgressContent();
+}
+
+PlayerObject.prototype.createProgramWork = function(numCycles) {
+ this.timeWorked += __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed * numCycles;
+ var programName = this.createProgramName;
+
+ if (this.timeWorked >= this.timeNeededToCompleteWork) {
+ this.finishCreateProgramWork(false);
+ }
+
+ var txt = document.getElementById("work-in-progress-text");
+ txt.innerHTML = "You are currently working on coding " + programName + ". " +
+ "You have been working for " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " " +
+ "The program is " + (this.timeWorked / this.timeNeededToCompleteWork * 100).toFixed(2) + "% complete. " +
+ "If you cancel, your work will be saved and you can come back to complete the program later.";
+}
+
+PlayerObject.prototype.finishCreateProgramWork = function(cancelled, sing=false) {
+ var programName = this.createProgramName;
+ if (cancelled === false) {
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("You've finished creating " + programName + "! " +
+ "The new program can be found on your home computer.");
+
+ Player.getHomeComputer().programs.push(programName);
+ } else {
+ var perc = Math.floor(this.timeWorked / this.timeNeededToCompleteWork * 100).toString();
+ var incompleteName = programName + "-" + perc + "%-INC";
+ Player.getHomeComputer().programs.push(incompleteName);
+ }
+
+ var mainMenu = document.getElementById("mainmenu-container");
+ mainMenu.style.visibility = "visible";
+
+ Player.isWorking = false;
+
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadTerminalContent();
+}
+
+/* Studying/Taking Classes */
+PlayerObject.prototype.startClass = function(costMult, expMult, className) {
+ this.resetWorkStatus();
+ this.isWorking = true;
+ this.workType = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeStudyClass;
+
+ this.className = className;
+
+ var gameCPS = 1000 / __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed;
+
+ //Base exp gains per second
+ var baseStudyComputerScienceExp = 0.5;
+ var baseDataStructuresExp = 1;
+ var baseNetworksExp = 2;
+ var baseAlgorithmsExp = 4;
+ var baseManagementExp = 2;
+ var baseLeadershipExp = 4;
+ var baseGymExp = 1;
+
+ //Find cost and exp gain per game cycle
+ var cost = 0;
+ var hackExp = 0, strExp = 0, defExp = 0, dexExp = 0, agiExp = 0, chaExp = 0;
+ switch (className) {
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassStudyComputerScience:
+ hackExp = baseStudyComputerScienceExp * expMult / gameCPS;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassDataStructures:
+ cost = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassDataStructuresBaseCost * costMult / gameCPS;
+ hackExp = baseDataStructuresExp * expMult / gameCPS;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassNetworks:
+ cost = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassNetworksBaseCost * costMult / gameCPS;
+ hackExp = baseNetworksExp * expMult / gameCPS;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassAlgorithms:
+ cost = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassAlgorithmsBaseCost * costMult / gameCPS;
+ hackExp = baseAlgorithmsExp * expMult / gameCPS;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassManagement:
+ cost = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassManagementBaseCost * costMult / gameCPS;
+ chaExp = baseManagementExp * expMult / gameCPS;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassLeadership:
+ cost = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassLeadershipBaseCost * costMult / gameCPS;
+ chaExp = baseLeadershipExp * expMult / gameCPS;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymStrength:
+ cost = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymBaseCost * costMult / gameCPS;
+ strExp = baseGymExp * expMult / gameCPS;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymDefense:
+ cost = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymBaseCost * costMult / gameCPS;
+ defExp = baseGymExp * expMult / gameCPS;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymDexterity:
+ cost = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymBaseCost * costMult / gameCPS;
+ dexExp = baseGymExp * expMult / gameCPS;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymAgility:
+ cost = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymBaseCost * costMult / gameCPS;
+ agiExp = baseGymExp * expMult / gameCPS;
+ break;
+ default:
+ throw new Error("ERR: Invalid/unregocnized class name");
+ return;
+ }
+
+ this.workMoneyLossRate = cost;
+ this.workHackExpGainRate = hackExp * this.hacking_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].ClassGymExpGain;
+ this.workStrExpGainRate = strExp * this.strength_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].ClassGymExpGain;;
+ this.workDefExpGainRate = defExp * this.defense_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].ClassGymExpGain;;
+ this.workDexExpGainRate = dexExp * this.dexterity_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].ClassGymExpGain;;
+ this.workAgiExpGainRate = agiExp * this.agility_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].ClassGymExpGain;;
+ this.workChaExpGainRate = chaExp * this.charisma_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].ClassGymExpGain;;
+
+ var cancelButton = Object(__WEBPACK_IMPORTED_MODULE_15__utils_HelperFunctions_js__["b" /* clearEventListeners */])("work-in-progress-cancel-button");
+ if (className == __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymStrength ||
+ className == __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymDefense ||
+ className == __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymDexterity ||
+ className == __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].ClassGymAgility) {
+ cancelButton.innerHTML = "Stop training at gym";
+ } else {
+ cancelButton.innerHTML = "Stop taking course";
+ }
+ cancelButton.addEventListener("click", function() {
+ Player.finishClass();
+ return false;
+ });
+
+ //Display Work In Progress Screen
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadWorkInProgressContent();
+}
+
+PlayerObject.prototype.takeClass = function(numCycles) {
+ this.timeWorked += __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed * numCycles;
+ var className = this.className;
+
+ this.workHackExpGained += this.workHackExpGainRate * numCycles;
+ this.workStrExpGained += this.workStrExpGainRate * numCycles;
+ this.workDefExpGained += this.workDefExpGainRate * numCycles;
+ this.workDexExpGained += this.workDexExpGainRate * numCycles;
+ this.workAgiExpGained += this.workAgiExpGainRate * numCycles;
+ this.workChaExpGained += this.workChaExpGainRate * numCycles;
+ this.workRepGained += this.workRepGainRate * numCycles;
+ this.workMoneyGained += this.workMoneyGainRate * numCycles;
+ this.workMoneyGained -= this.workMoneyLossRate * numCycles;
+
+ var cyclesPerSec = 1000 / __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed;
+
+ var txt = document.getElementById("work-in-progress-text");
+ txt.innerHTML = "You have been " + className + " for " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + " " +
+ "This has cost you: " +
+ "$" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + " ($" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyLossRate * cyclesPerSec, 2) + " / sec) " +
+ "You have gained: " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGainRate * cyclesPerSec, 4) + " / sec) hacking exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGainRate * cyclesPerSec, 4) + " / sec) defense exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGainRate * cyclesPerSec, 4) + " / sec) strength exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGainRate * cyclesPerSec, 4) + " / sec) dexterity exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGainRate * cyclesPerSec, 4) + " / sec) agility exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " (" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGainRate * cyclesPerSec, 4) + " / sec) charisma exp " +
+ "You may cancel at any time";
+}
+
+//The 'sing' argument defines whether or not this function was called
+//through a Singularity Netscript function
+PlayerObject.prototype.finishClass = function(sing=false) {
+ this.gainWorkExp();
+
+ if (this.workMoneyGained > 0) {
+ throw new Error("ERR: Somehow gained money while taking class");
+ }
+ this.loseMoney(this.workMoneyGained * -1);
+
+ this.updateSkillLevels();
+ var txt = "After " + this.className + " for " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + ", " +
+ "you spent a total of $" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained * -1, 2) + ". " +
+ "You earned a total of: " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " hacking exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " strength exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " defense exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " dexterity exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " agility exp " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " charisma exp ";
+ if (!sing) {Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])(txt);}
+
+ var mainMenu = document.getElementById("mainmenu-container");
+ mainMenu.style.visibility = "visible";
+
+ this.isWorking = false;
+
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadLocationContent();
+
+ if (sing) {return "After " + this.className + " for " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeWorked) + ", " +
+ "you spent a total of $" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained * -1, 2) + ". " +
+ "You earned a total of: " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 3) + " hacking exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 3) + " strength exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 3) + " defense exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 3) + " dexterity exp, " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 3) + " agility exp, and " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 3) + " charisma exp";}
+}
+
+//The EXP and $ gains are hardcoded. Time is in ms
+PlayerObject.prototype.startCrime = function(hackExp, strExp, defExp, dexExp, agiExp, chaExp, money, time) {
+ this.resetWorkStatus();
+ this.isWorking = true;
+ this.workType = __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeCrime;
+
+ this.workHackExpGained = hackExp * this.hacking_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CrimeExpGain;
+ this.workStrExpGained = strExp * this.strength_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CrimeExpGain;
+ this.workDefExpGained = defExp * this.defense_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CrimeExpGain;
+ this.workDexExpGained = dexExp * this.dexterity_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CrimeExpGain;
+ this.workAgiExpGained = agiExp * this.agility_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CrimeExpGain;
+ this.workChaExpGained = chaExp * this.charisma_exp_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CrimeExpGain;
+ this.workMoneyGained = money * this.crime_money_mult * __WEBPACK_IMPORTED_MODULE_1__BitNode_js__["a" /* BitNodeMultipliers */].CrimeMoney;
+
+ this.timeNeededToCompleteWork = time;
+
+ //Remove all old event listeners from Cancel button
+ var newCancelButton = Object(__WEBPACK_IMPORTED_MODULE_15__utils_HelperFunctions_js__["b" /* clearEventListeners */])("work-in-progress-cancel-button")
+ newCancelButton.innerHTML = "Cancel crime"
+ newCancelButton.addEventListener("click", function() {
+ Player.finishCrime(true);
+ return false;
+ });
+
+ //Display Work In Progress Screen
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadWorkInProgressContent();
+}
+
+PlayerObject.prototype.commitCrime = function (numCycles) {
+ this.timeWorked += __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"]._idleSpeed * numCycles;
+
+ if (this.timeWorked >= this.timeNeededToCompleteWork) {Player.finishCrime(false); return;}
+
+ var percent = Math.round(Player.timeWorked / Player.timeNeededToCompleteWork * 100);
+ var numBars = Math.round(percent / 5);
+ if (numBars < 0) {numBars = 0;}
+ if (numBars > 20) {numBars = 20;}
+ var progressBar = "[" + Array(numBars+1).join("|") + Array(20 - numBars + 1).join(" ") + "]";
+
+ var txt = document.getElementById("work-in-progress-text");
+ txt.innerHTML = "You are attempting to " + Player.crimeType + ". " +
+ "Time remaining: " + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(this.timeNeededToCompleteWork - this.timeWorked) + " " +
+ progressBar.replace( / /g, " " );
+}
+
+PlayerObject.prototype.finishCrime = function(cancelled) {
+ //Determine crime success/failure
+ if (!cancelled) {
+ var statusText = ""; //TODO, unique message for each crime when you succeed
+ if (Object(__WEBPACK_IMPORTED_MODULE_5__Crimes_js__["w" /* determineCrimeSuccess */])(this.crimeType, this.workMoneyGained)) {
+ //Handle Karma and crime statistics
+ switch(this.crimeType) {
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeShoplift:
+ this.karma -= 0.1;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeRobStore:
+ this.karma -= 0.5;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeMug:
+ this.karma -= 0.25;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeLarceny:
+ this.karma -= 1.5;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeDrugs:
+ this.karma -= 0.5;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeTraffickArms:
+ this.karma -= 1;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeHomicide:
+ ++this.numPeopleKilled;
+ this.karma -= 3;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeGrandTheftAuto:
+ this.karma -= 5;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeKidnap:
+ this.karma -= 6;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeAssassination:
+ ++this.numPeopleKilled;
+ this.karma -= 10;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CrimeHeist:
+ this.karma -= 15;
+ break;
+ default:
+ console.log(this.crimeType);
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("ERR: Unrecognized crime type. This is probably a bug please contact the developer");
+ return;
+ }
+
+ //On a crime success, gain 2x exp
+ this.workHackExpGained *= 2;
+ this.workStrExpGained *= 2;
+ this.workDefExpGained *= 2;
+ this.workDexExpGained *= 2;
+ this.workAgiExpGained *= 2;
+ this.workChaExpGained *= 2;
+
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Crime successful! " +
+ "You gained: "+
+ "$" + Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workMoneyGained, 2) + " " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " hacking experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " strength experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " defense experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " dexterity experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " agility experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " charisma experience");
+ } else {
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Crime failed! " +
+ "You gained: "+
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workHackExpGained, 4) + " hacking experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workStrExpGained, 4) + " strength experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDefExpGained, 4) + " defense experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workDexExpGained, 4) + " dexterity experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workAgiExpGained, 4) + " agility experience " +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.workChaExpGained, 4) + " charisma experience");
+ }
+
+ this.gainWorkExp();
+ }
+
+
+
+ var mainMenu = document.getElementById("mainmenu-container");
+ mainMenu.style.visibility = "visible";
+ this.isWorking = false;
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadLocationContent();
+}
+
+//Cancels the player's current "work" assignment and gives the proper rewards
+//Used only for Singularity functions, so no popups are created
+PlayerObject.prototype.singularityStopWork = function() {
+ if (!this.isWorking) {return "";}
+ var res; //Earnings text for work
+ switch (this.workType) {
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeStudyClass:
+ res = this.finishClass(true);
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeCompany:
+ res = this.finishWork(true, true);
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeCompanyPartTime:
+ res = this.finishWorkPartTime(true);
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeFaction:
+ res = this.finishFactionWork(true, true);
+ break;
+ case __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].WorkTypeCreateProgram:
+ res = this.finishCreateProgramWork(true, true);
+ break;
+ default:
+ console.log("ERROR: Unrecognized work type");
+ return "";
+ }
+ return res;
+}
+
+
+//Returns true if hospitalized, false otherwise
+PlayerObject.prototype.takeDamage = function(amt) {
+ this.hp -= amt;
+ if (this.hp <= 0) {
+ this.hospitalize();
+ return true;
+ } else {
+ return false;
+ }
+}
+
+PlayerObject.prototype.hospitalize = function() {
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("You were in critical condition! You were taken to the hospital where " +
+ "luckily they were able to save your life. You were charged $" +
+ Object(__WEBPACK_IMPORTED_MODULE_18__utils_StringHelperFunctions_js__["c" /* formatNumber */])(this.max_hp * __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].HospitalCostPerHp, 2));
+ Player.loseMoney(this.max_hp * __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].HospitalCostPerHp);
+ this.hp = this.max_hp;
+}
+
+/********* Company job application **********/
+//Determines the job that the Player should get (if any) at the current company
+//The 'sing' argument designates whether or not this is being called from
+//the applyToCompany() Netscript Singularity function
+PlayerObject.prototype.applyForJob = function(entryPosType, sing=false) {
+ var currCompany = "";
+ if (this.companyName != "") {
+ currCompany = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ }
+ var currPositionName = "";
+ if (this.companyPosition != "") {
+ currPositionName = this.companyPosition.positionName;
+ }
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.location]; //Company being applied to
+ if (sing && !(company instanceof __WEBPACK_IMPORTED_MODULE_2__Company_js__["b" /* Company */])) {
+ return "ERROR: Invalid company name: " + this.location + ". applyToCompany() failed";
+ }
+
+ var pos = entryPosType;
+
+ if (!this.isQualified(company, pos)) {
+ var reqText = Object(__WEBPACK_IMPORTED_MODULE_2__Company_js__["f" /* getJobRequirementText */])(company, pos);
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Unforunately, you do not qualify for this position " + reqText);
+ return;
+ }
+
+ while (true) {
+ if (__WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].Debug) {console.log("Determining qualification for next Company Position");}
+ var newPos = Object(__WEBPACK_IMPORTED_MODULE_2__Company_js__["g" /* getNextCompanyPosition */])(pos);
+ if (newPos == null) {break;}
+
+ //Check if this company has this position
+ if (company.hasPosition(newPos)) {
+ if (!this.isQualified(company, newPos)) {
+ //If player not qualified for next job, break loop so player will be given current job
+ break;
+ }
+ pos = newPos;
+ } else {
+ break;
+ }
+ }
+
+ //Check if the determined job is the same as the player's current job
+ if (currCompany != "") {
+ if (currCompany.companyName == company.companyName &&
+ pos.positionName == currPositionName) {
+ var nextPos = Object(__WEBPACK_IMPORTED_MODULE_2__Company_js__["g" /* getNextCompanyPosition */])(pos);
+ if (nextPos == null) {
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("You are already at the highest position for your field! No promotion available");
+ } else if (company.hasPosition(nextPos)) {
+ if (sing) {return false;}
+ var reqText = Object(__WEBPACK_IMPORTED_MODULE_2__Company_js__["f" /* getJobRequirementText */])(company, nextPos);
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Unfortunately, you do not qualify for a promotion " + reqText);
+ } else {
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("You are already at the highest position for your field! No promotion available");
+ }
+ return; //Same job, do nothing
+ }
+ }
+
+
+ //Lose reputation from a Company if you are leaving it for another job
+ var leaveCompany = false;
+ var oldCompanyName = "";
+ if (currCompany != "") {
+ if (currCompany.companyName != company.companyName) {
+ leaveCompany = true;
+ oldCompanyName = currCompany.companyName;
+ company.playerReputation -= 1000;
+ if (company.playerReputation < 0) {company.playerReputation = 0;}
+ }
+ }
+
+ this.companyName = company.companyName;
+ this.companyPosition = pos;
+
+ Player.firstJobRecvd = true;
+
+ if (leaveCompany) {
+ if (sing) {return true;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Congratulations! You were offered a new job at " + this.companyName + " as a " +
+ pos.positionName + "! " +
+ "You lost 1000 reputation at your old company " + oldCompanyName + " because you left.");
+ } else {
+ if (sing) {return true;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Congratulations! You were offered a new job at " + this.companyName + " as a " + pos.positionName + "!");
+ }
+
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadLocationContent();
+}
+
+//Returns your next position at a company given the field (software, business, etc.)
+PlayerObject.prototype.getNextCompanyPosition = function(company, entryPosType) {
+ var currCompany = null;
+ if (this.companyName != "") {
+ currCompany = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ }
+
+ //Not employed at this company, so return the entry position
+ if (currCompany == null || (currCompany.companyName != company.companyName)) {
+ return entryPosType;
+ }
+
+ //If the entry pos type and the player's current position have the same type,
+ //return the player's "nextCompanyPosition". Otherwise return the entryposType
+ //Employed at this company, so just return the next position if it exists.
+ if ((this.companyPosition.isSoftwareJob() && entryPosType.isSoftwareJob()) ||
+ (this.companyPosition.isITJob() && entryPosType.isITJob()) ||
+ (this.companyPosition.isSecurityEngineerJob() && entryPosType.isSecurityEngineerJob()) ||
+ (this.companyPosition.isNetworkEngineerJob() && entryPosType.isNetworkEngineerJob()) ||
+ (this.companyPosition.isSecurityJob() && entryPosType.isSecurityJob()) ||
+ (this.companyPosition.isAgentJob() && entryPosTypeisAgentJob()) ||
+ (this.companyPosition.isSoftwareConsultantJob() && entryPosType.isSoftwareConsultantJob()) ||
+ (this.companyPosition.isBusinessConsultantJob() && entryPosType.isBusinessConsultantJob()) ||
+ (this.companyPosition.isPartTimeJob() && entryPosType.isPartTimeJob())) {
+ return Object(__WEBPACK_IMPORTED_MODULE_2__Company_js__["g" /* getNextCompanyPosition */])(this.companyPosition);
+ }
+
+
+ return entryPosType;
+}
+
+PlayerObject.prototype.applyForSoftwareJob = function(sing=false) {
+ return this.applyForJob(__WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].SoftwareIntern, sing);
+}
+
+PlayerObject.prototype.applyForSoftwareConsultantJob = function(sing=false) {
+ return this.applyForJob(__WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].SoftwareConsultant, sing);
+}
+
+PlayerObject.prototype.applyForItJob = function(sing=false) {
+ return this.applyForJob(__WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].ITIntern, sing);
+}
+
+PlayerObject.prototype.applyForSecurityEngineerJob = function(sing=false) {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.location]; //Company being applied to
+ if (this.isQualified(company, __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].SecurityEngineer)) {
+ return this.applyForJob(__WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].SecurityEngineer, sing);
+ } else {
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Unforunately, you do not qualify for this position");
+ }
+}
+
+PlayerObject.prototype.applyForNetworkEngineerJob = function(sing=false) {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.location]; //Company being applied to
+ if (this.isQualified(company, __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].NetworkEngineer)) {
+ return this.applyForJob(__WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].NetworkEngineer, sing);
+ } else {
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Unforunately, you do not qualify for this position");
+ }
+}
+
+PlayerObject.prototype.applyForBusinessJob = function(sing=false) {
+ return this.applyForJob(__WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].BusinessIntern, sing);
+}
+
+PlayerObject.prototype.applyForBusinessConsultantJob = function(sing=false) {
+ return this.applyForJob(__WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].BusinessConsultant, sing);
+}
+
+PlayerObject.prototype.applyForSecurityJob = function(sing=false) {
+ //TODO If case for POlice departments
+ return this.applyForJob(__WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].SecurityGuard, sing);
+}
+
+PlayerObject.prototype.applyForAgentJob = function(sing=false) {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.location]; //Company being applied to
+ if (this.isQualified(company, __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].FieldAgent)) {
+ return this.applyForJob(__WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].FieldAgent, sing);
+ } else {
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Unforunately, you do not qualify for this position");
+ }
+}
+
+PlayerObject.prototype.applyForEmployeeJob = function(sing=false) {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.location]; //Company being applied to
+ if (this.isQualified(company, __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].Employee)) {
+ Player.firstJobRecvd = true;
+ this.companyName = company.companyName;
+ this.companyPosition = __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].Employee;
+ if (sing) {return true;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Congratulations, you are now employed at " + this.companyName);
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadLocationContent();
+ } else {
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Unforunately, you do not qualify for this position");
+ }
+}
+
+PlayerObject.prototype.applyForPartTimeEmployeeJob = function(sing=false) {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.location]; //Company being applied to
+ if (this.isQualified(company, __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].PartTimeEmployee)) {
+ Player.firstJobRecvd = true;
+ this.companyName = company.companyName;
+ this.companyPosition = __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].PartTimeEmployee;
+ if (sing) {return true;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Congratulations, you are now employed part-time at " + this.companyName);
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadLocationContent();
+ } else {
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Unforunately, you do not qualify for this position");
+ }
+}
+
+PlayerObject.prototype.applyForWaiterJob = function(sing=false) {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.location]; //Company being applied to
+ if (this.isQualified(company, __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].Waiter)) {
+ Player.firstJobRecvd = true;
+ this.companyName = company.companyName;
+ this.companyPosition = __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].Waiter;
+ if (sing) {return true;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Congratulations, you are now employed as a waiter at " + this.companyName);
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadLocationContent();
+ } else {
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Unforunately, you do not qualify for this position");
+ }
+}
+
+PlayerObject.prototype.applyForPartTimeWaiterJob = function(sing=false) {
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.location]; //Company being applied to
+ if (this.isQualified(company, __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].PartTimeWaiter)) {
+ Player.firstJobRecvd = true;
+ this.companyName = company.companyName;
+ this.companyPosition = __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].PartTimeWaiter;
+ if (sing) {return true;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Congratulations, you are now employed as a part-time waiter at " + this.companyName);
+ __WEBPACK_IMPORTED_MODULE_6__engine_js__["Engine"].loadLocationContent();
+ } else {
+ if (sing) {return false;}
+ Object(__WEBPACK_IMPORTED_MODULE_14__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Unforunately, you do not qualify for this position");
+ }
+}
+
+//Checks if the Player is qualified for a certain position
+PlayerObject.prototype.isQualified = function(company, position) {
+ var offset = company.jobStatReqOffset;
+ var reqHacking = position.requiredHacking > 0 ? position.requiredHacking+offset : 0;
+ var reqStrength = position.requiredStrength > 0 ? position.requiredStrength+offset : 0;
+ var reqDefense = position.requiredDefense > 0 ? position.requiredDefense+offset : 0;
+ var reqDexterity = position.requiredDexterity > 0 ? position.requiredDexterity+offset : 0;
+ var reqAgility = position.requiredDexterity > 0 ? position.requiredDexterity+offset : 0;
+ var reqCharisma = position.requiredCharisma > 0 ? position.requiredCharisma+offset : 0;
+
+ if (this.hacking_skill >= reqHacking &&
+ this.strength >= reqStrength &&
+ this.defense >= reqDefense &&
+ this.dexterity >= reqDexterity &&
+ this.agility >= reqAgility &&
+ this.charisma >= reqCharisma &&
+ company.playerReputation >= position.requiredReputation) {
+ return true;
+ }
+ return false;
+}
+
+/********** Reapplying Augmentations and Source File ***********/
+PlayerObject.prototype.reapplyAllAugmentations = function(resetMultipliers=true) {
+ console.log("Re-applying augmentations");
+ if (resetMultipliers) {
+ this.resetMultipliers();
+ }
+
+ for (let i = 0; i < this.augmentations.length; ++i) {
+ //Compatibility with new version
+ if (typeof this.augmentations[i] === 'string' || this.augmentations[i] instanceof String) {
+ var newOwnedAug = new PlayerOwnedAugmentation(this.augmentations[i]);
+ if (this.augmentations[i] == __WEBPACK_IMPORTED_MODULE_0__Augmentations_js__["b" /* AugmentationNames */].NeuroFluxGovernor) {
+ newOwnedAug.level = __WEBPACK_IMPORTED_MODULE_0__Augmentations_js__["c" /* Augmentations */][__WEBPACK_IMPORTED_MODULE_0__Augmentations_js__["b" /* AugmentationNames */].NeuroFluxGovernor].level;
+ }
+ this.augmentations[i] = newOwnedAug;
+ }
+
+ var augName = this.augmentations[i].name;
+ var aug = __WEBPACK_IMPORTED_MODULE_0__Augmentations_js__["c" /* Augmentations */][augName];
+ aug.owned = true;
+ if (aug == null) {
+ console.log("WARNING: Invalid augmentation name");
+ continue;
+ }
+ if (aug.name == __WEBPACK_IMPORTED_MODULE_0__Augmentations_js__["b" /* AugmentationNames */].NeuroFluxGovernor) {
+ for (let j = 0; j < aug.level; ++j) {
+ Object(__WEBPACK_IMPORTED_MODULE_0__Augmentations_js__["e" /* applyAugmentation */])(this.augmentations[i], true);
+ }
+ continue;
+ }
+ Object(__WEBPACK_IMPORTED_MODULE_0__Augmentations_js__["e" /* applyAugmentation */])(this.augmentations[i], true);
+ }
+}
+
+PlayerObject.prototype.reapplyAllSourceFiles = function() {
+ console.log("Re-applying source files");
+ //Will always be called after reapplyAllAugmentations() so multipliers do not have to be reset
+ //this.resetMultipliers();
+
+ for (let i = 0; i < this.sourceFiles.length; ++i) {
+ var srcFileKey = "SourceFile" + this.sourceFiles[i].n;
+ var sourceFileObject = __WEBPACK_IMPORTED_MODULE_12__SourceFile_js__["b" /* SourceFiles */][srcFileKey];
+ if (sourceFileObject == null) {
+ console.log("ERROR: Invalid source file number: " + this.sourceFiles[i].n);
+ continue;
+ }
+ Object(__WEBPACK_IMPORTED_MODULE_12__SourceFile_js__["c" /* applySourceFile */])(this.sourceFiles[i]);
+ }
+}
+
+/*************** Check for Faction Invitations *************/
+//This function sets the requirements to join a Faction. It checks whether the Player meets
+//those requirements and will return an array of all factions that the Player should
+//receive an invitation to
+PlayerObject.prototype.checkForFactionInvitations = function() {
+ let invitedFactions = []; //Array which will hold all Factions th eplayer should be invited to
+
+ var numAugmentations = this.augmentations.length;
+
+ var company = __WEBPACK_IMPORTED_MODULE_2__Company_js__["a" /* Companies */][this.companyName];
+ var companyRep = 0;
+ if (company != null) {
+ companyRep = company.playerReputation;
+ }
+
+ //Illuminati
+ var illuminatiFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Illuminati"];
+ if (!illuminatiFac.isBanned && !illuminatiFac.isMember && !illuminatiFac.alreadyInvited &&
+ numAugmentations >= 30 &&
+ this.money.gte(150000000000) &&
+ this.hacking_skill >= 1500 &&
+ this.strength >= 1200 && this.defense >= 1200 &&
+ this.dexterity >= 1200 && this.agility >= 1200) {
+ invitedFactions.push(illuminatiFac);
+ }
+
+ //Daedalus
+ var daedalusFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Daedalus"];
+ if (!daedalusFac.isBanned && !daedalusFac.isMember && !daedalusFac.alreadyInvited &&
+ numAugmentations >= 30 &&
+ this.money.gte(100000000000) &&
+ (this.hacking_skill >= 2500 ||
+ (this.strength >= 1500 && this.defense >= 1500 &&
+ this.dexterity >= 1500 && this.agility >= 1500))) {
+ invitedFactions.push(daedalusFac);
+ }
+
+ //The Covenant
+ var covenantFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["The Covenant"];
+ if (!covenantFac.isBanned && !covenantFac.isMember && !covenantFac.alreadyInvited &&
+ numAugmentations >= 30 &&
+ this.money.gte(75000000000) &&
+ this.hacking_skill >= 850 &&
+ this.strength >= 850 &&
+ this.defense >= 850 &&
+ this.dexterity >= 850 &&
+ this.agility >= 850) {
+ invitedFactions.push(covenantFac);
+ }
+
+ //ECorp
+ var ecorpFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["ECorp"];
+ if (!ecorpFac.isBanned && !ecorpFac.isMember && !ecorpFac.alreadyInvited &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].AevumECorp && companyRep >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CorpFactionRepRequirement) {
+ invitedFactions.push(ecorpFac);
+ }
+
+ //MegaCorp
+ var megacorpFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["MegaCorp"];
+ if (!megacorpFac.isBanned && !megacorpFac.isMember && !megacorpFac.alreadyInvited &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12MegaCorp && companyRep >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CorpFactionRepRequirement) {
+ invitedFactions.push(megacorpFac);
+ }
+
+ //Bachman & Associates
+ var bachmanandassociatesFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Bachman & Associates"];
+ if (!bachmanandassociatesFac.isBanned && !bachmanandassociatesFac.isMember &&
+ !bachmanandassociatesFac.alreadyInvited &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].AevumBachmanAndAssociates && companyRep >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CorpFactionRepRequirement) {
+ invitedFactions.push(bachmanandassociatesFac);
+ }
+
+ //Blade Industries
+ var bladeindustriesFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Blade Industries"];
+ if (!bladeindustriesFac.isBanned && !bladeindustriesFac.isMember && !bladeindustriesFac.alreadyInvited &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12BladeIndustries && companyRep >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CorpFactionRepRequirement) {
+ invitedFactions.push(bladeindustriesFac);
+ }
+
+ //NWO
+ var nwoFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["NWO"];
+ if (!nwoFac.isBanned && !nwoFac.isMember && !nwoFac.alreadyInvited &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].VolhavenNWO && companyRep >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CorpFactionRepRequirement) {
+ invitedFactions.push(nwoFac);
+ }
+
+ //Clarke Incorporated
+ var clarkeincorporatedFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Clarke Incorporated"];
+ if (!clarkeincorporatedFac.isBanned && !clarkeincorporatedFac.isMember && !clarkeincorporatedFac.alreadyInvited &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].AevumClarkeIncorporated && companyRep >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CorpFactionRepRequirement) {
+ invitedFactions.push(clarkeincorporatedFac);
+ }
+
+ //OmniTek Incorporated
+ var omnitekincorporatedFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["OmniTek Incorporated"];
+ if (!omnitekincorporatedFac.isBanned && !omnitekincorporatedFac.isMember && !omnitekincorporatedFac.alreadyInvited &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].VolhavenOmniTekIncorporated && companyRep >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CorpFactionRepRequirement) {
+ invitedFactions.push(omnitekincorporatedFac);
+ }
+
+ //Four Sigma
+ var foursigmaFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Four Sigma"];
+ if (!foursigmaFac.isBanned && !foursigmaFac.isMember && !foursigmaFac.alreadyInvited &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12FourSigma && companyRep >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CorpFactionRepRequirement) {
+ invitedFactions.push(foursigmaFac);
+ }
+
+ //KuaiGong International
+ var kuaigonginternationalFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["KuaiGong International"];
+ if (!kuaigonginternationalFac.isBanned && !kuaigonginternationalFac.isMember &&
+ !kuaigonginternationalFac.alreadyInvited &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].ChongqingKuaiGongInternational && companyRep >= __WEBPACK_IMPORTED_MODULE_3__Constants_js__["a" /* CONSTANTS */].CorpFactionRepRequirement) {
+ invitedFactions.push(kuaigonginternationalFac);
+ }
+
+ //Fulcrum Secret Technologies - If u've unlocked fulcrum secret technolgoies server and have a high rep with the company
+ var fulcrumsecrettechonologiesFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Fulcrum Secret Technologies"];
+ var fulcrumSecretServer = __WEBPACK_IMPORTED_MODULE_10__Server_js__["b" /* AllServers */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["a" /* SpecialServerIps */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["b" /* SpecialServerNames */].FulcrumSecretTechnologies]];
+ if (fulcrumSecretServer == null) {
+ console.log("ERROR: Could not find Fulcrum Secret Technologies Server");
+ } else {
+ if (!fulcrumsecrettechonologiesFac.isBanned && !fulcrumsecrettechonologiesFac.isMember &&
+ !fulcrumsecrettechonologiesFac.alreadyInvited &&
+ fulcrumSecretServer.manuallyHacked &&
+ this.companyName == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].AevumFulcrumTechnologies && companyRep >= 250000) {
+ invitedFactions.push(fulcrumsecrettechonologiesFac);
+ }
+ }
+
+ //BitRunners
+ var bitrunnersFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["BitRunners"];
+ var homeComp = this.getHomeComputer();
+ var bitrunnersServer = __WEBPACK_IMPORTED_MODULE_10__Server_js__["b" /* AllServers */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["a" /* SpecialServerIps */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["b" /* SpecialServerNames */].BitRunnersServer]];
+ if (bitrunnersServer == null) {
+ console.log("ERROR: Could not find BitRunners Server");
+ } else if (!bitrunnersFac.isBanned && !bitrunnersFac.isMember && bitrunnersServer.manuallyHacked &&
+ !bitrunnersFac.alreadyInvited && this.hacking_skill >= 500 && homeComp.maxRam >= 128) {
+ invitedFactions.push(bitrunnersFac);
+ }
+
+ //The Black Hand
+ var theblackhandFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["The Black Hand"];
+ var blackhandServer = __WEBPACK_IMPORTED_MODULE_10__Server_js__["b" /* AllServers */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["a" /* SpecialServerIps */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["b" /* SpecialServerNames */].TheBlackHandServer]];
+ if (blackhandServer == null) {
+ console.log("ERROR: Could not find The Black Hand Server");
+ } else if (!theblackhandFac.isBanned && !theblackhandFac.isMember && blackhandServer.manuallyHacked &&
+ !theblackhandFac.alreadyInvited && this.hacking_skill >= 350 && homeComp.maxRam >= 64) {
+ invitedFactions.push(theblackhandFac);
+ }
+
+ //NiteSec
+ var nitesecFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["NiteSec"];
+ var nitesecServer = __WEBPACK_IMPORTED_MODULE_10__Server_js__["b" /* AllServers */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["a" /* SpecialServerIps */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["b" /* SpecialServerNames */].NiteSecServer]];
+ if (nitesecServer == null) {
+ console.log("ERROR: Could not find NiteSec Server");
+ } else if (!nitesecFac.isBanned && !nitesecFac.isMember && nitesecServer.manuallyHacked &&
+ !nitesecFac.alreadyInvited && this.hacking_skill >= 200 && homeComp.maxRam >= 32) {
+ invitedFactions.push(nitesecFac);
+ }
+
+ //Chongqing
+ var chongqingFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Chongqing"];
+ if (!chongqingFac.isBanned && !chongqingFac.isMember && !chongqingFac.alreadyInvited &&
+ this.money.gte(20000000) && this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Chongqing) {
+ invitedFactions.push(chongqingFac);
+ }
+
+ //Sector-12
+ var sector12Fac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Sector-12"];
+ if (!sector12Fac.isBanned && !sector12Fac.isMember && !sector12Fac.alreadyInvited &&
+ this.money.gte(15000000) && this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12) {
+ invitedFactions.push(sector12Fac);
+ }
+
+ //New Tokyo
+ var newtokyoFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["New Tokyo"];
+ if (!newtokyoFac.isBanned && !newtokyoFac.isMember && !newtokyoFac.alreadyInvited &&
+ this.money.gte(20000000) && this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].NewTokyo) {
+ invitedFactions.push(newtokyoFac);
+ }
+
+ //Aevum
+ var aevumFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Aevum"];
+ if (!aevumFac.isBanned && !aevumFac.isMember && !aevumFac.alreadyInvited &&
+ this.money.gte(40000000) && this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Aevum) {
+ invitedFactions.push(aevumFac);
+ }
+
+ //Ishima
+ var ishimaFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Ishima"];
+ if (!ishimaFac.isBanned && !ishimaFac.isMember && !ishimaFac.alreadyInvited &&
+ this.money.gte(30000000) && this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Ishima) {
+ invitedFactions.push(ishimaFac);
+ }
+
+ //Volhaven
+ var volhavenFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Volhaven"];
+ if (!volhavenFac.isBanned && !volhavenFac.isMember && !volhavenFac.alreadyInvited &&
+ this.money.gte(50000000) && this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Volhaven) {
+ invitedFactions.push(volhavenFac);
+ }
+
+ //Speakers for the Dead
+ var speakersforthedeadFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Speakers for the Dead"];
+ if (!speakersforthedeadFac.isBanned && !speakersforthedeadFac.isMember && !speakersforthedeadFac.alreadyInvited &&
+ this.hacking_skill >= 100 && this.strength >= 300 && this.defense >= 300 &&
+ this.dexterity >= 300 && this.agility >= 300 && this.numPeopleKilled >= 30 &&
+ this.karma <= -45 && this.companyName != __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12CIA &&
+ this.companyName != __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12NSA) {
+ invitedFactions.push(speakersforthedeadFac);
+ }
+
+ //The Dark Army
+ var thedarkarmyFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["The Dark Army"];
+ if (!thedarkarmyFac.isBanned && !thedarkarmyFac.isMember && !thedarkarmyFac.alreadyInvited &&
+ this.hacking_skill >= 300 && this.strength >= 300 && this.defense >= 300 &&
+ this.dexterity >= 300 && this.agility >= 300 && this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Chongqing &&
+ this.numPeopleKilled >= 5 && this.karma <= -45 && this.companyName != __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12CIA &&
+ this.companyName != __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12NSA) {
+ invitedFactions.push(thedarkarmyFac);
+ }
+
+ //The Syndicate
+ var thesyndicateFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["The Syndicate"];
+ if (!thesyndicateFac.isBanned && !thesyndicateFac.isMember && !thesyndicateFac.alreadyInvited &&
+ this.hacking_skill >= 200 && this.strength >= 200 && this.defense >= 200 &&
+ this.dexterity >= 200 && this.agility >= 200 &&
+ (this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Aevum || this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12) &&
+ this.money.gte(10000000) && this.karma <= -90 &&
+ this.companyName != __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12CIA && this.companyName != __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Sector12NSA) {
+ invitedFactions.push(thesyndicateFac);
+ }
+
+ //Silhouette
+ var silhouetteFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Silhouette"];
+ if (!silhouetteFac.isBanned && !silhouetteFac.isMember && !silhouetteFac.alreadyInvited &&
+ (this.companyPosition.positionName == __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].CTO.positionName ||
+ this.companyPosition.positionName == __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].CFO.positionName ||
+ this.companyPosition.positionName == __WEBPACK_IMPORTED_MODULE_2__Company_js__["d" /* CompanyPositions */].CEO.positionName) &&
+ this.money.gte(15000000) && this.karma <= -22) {
+ invitedFactions.push(silhouetteFac);
+ }
+
+ //Tetrads
+ var tetradsFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Tetrads"];
+ if (!tetradsFac.isBanned && !tetradsFac.isMember && !tetradsFac.alreadyInvited &&
+ (this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Chongqing || this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].NewTokyo ||
+ this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Ishima) && this.strength >= 75 && this.defense >= 75 &&
+ this.dexterity >= 75 && this.agility >= 75 && this.karma <= -18) {
+ invitedFactions.push(tetradsFac);
+ }
+
+ //SlumSnakes
+ var slumsnakesFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Slum Snakes"];
+ if (!slumsnakesFac.isBanned && !slumsnakesFac.isMember && !slumsnakesFac.alreadyInvited &&
+ this.strength >= 30 && this.defense >= 30 && this.dexterity >= 30 &&
+ this.agility >= 30 && this.karma <= -9 && this.money.gte(1000000)) {
+ invitedFactions.push(slumsnakesFac);
+ }
+
+ //Netburners
+ var netburnersFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Netburners"];
+ var totalHacknetRam = 0;
+ var totalHacknetCores = 0;
+ var totalHacknetLevels = 0;
+ for (var i = 0; i < Player.hacknetNodes.length; ++i) {
+ totalHacknetLevels += Player.hacknetNodes[i].level;
+ totalHacknetRam += Player.hacknetNodes[i].ram;
+ totalHacknetCores += Player.hacknetNodes[i].cores;
+ }
+ if (!netburnersFac.isBanned && !netburnersFac.isMember && !netburnersFac.alreadyInvited &&
+ this.hacking_skill >= 80 && totalHacknetRam >= 8 &&
+ totalHacknetCores >= 4 && totalHacknetLevels >= 100) {
+ invitedFactions.push(netburnersFac);
+ }
+
+ //Tian Di Hui
+ var tiandihuiFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["Tian Di Hui"];
+ if (!tiandihuiFac.isBanned && !tiandihuiFac.isMember && !tiandihuiFac.alreadyInvited &&
+ this.money.gte(1000000) && this.hacking_skill >= 50 &&
+ (this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Chongqing || this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].NewTokyo ||
+ this.city == __WEBPACK_IMPORTED_MODULE_9__Location_js__["a" /* Locations */].Ishima)) {
+ invitedFactions.push(tiandihuiFac);
+ }
+
+ //CyberSec
+ var cybersecFac = __WEBPACK_IMPORTED_MODULE_7__Faction_js__["b" /* Factions */]["CyberSec"];
+ var cybersecServer = __WEBPACK_IMPORTED_MODULE_10__Server_js__["b" /* AllServers */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["a" /* SpecialServerIps */][__WEBPACK_IMPORTED_MODULE_11__SpecialServerIps_js__["b" /* SpecialServerNames */].CyberSecServer]];
+ if (cybersecServer == null) {
+ console.log("ERROR: Could not find CyberSec Server");
+ } else if (!cybersecFac.isBanned && !cybersecFac.isMember && cybersecServer.manuallyHacked &&
+ !cybersecFac.alreadyInvited && this.hacking_skill >= 50) {
+ invitedFactions.push(cybersecFac);
+ }
+
+ return invitedFactions;
+}
+
+
+/*************** Gang ****************/
+//Returns true if Player is in a gang and false otherwise
+PlayerObject.prototype.inGang = function() {
+ if (this.gang == null || this.gang == undefined) {return false;}
+ return (this.gang instanceof __WEBPACK_IMPORTED_MODULE_8__Gang_js__["b" /* Gang */]);
+}
+
+PlayerObject.prototype.startGang = function(factionName, hacking) {
+ this.gang = new __WEBPACK_IMPORTED_MODULE_8__Gang_js__["b" /* Gang */](factionName, hacking);
+}
+
+/************* BitNodes **************/
+PlayerObject.prototype.setBitNodeNumber = function(n) {
+ this.bitNodeN = n;
+}
+
+/* Functions for saving and loading the Player data */
+function loadPlayer(saveString) {
+ Player = JSON.parse(saveString, __WEBPACK_IMPORTED_MODULE_17__utils_JSONReviver_js__["c" /* Reviver */]);
+
+ //Parse Decimal.js objects
+ Player.money = new __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js___default.a(Player.money);
+ Player.total_money = new __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js___default.a(Player.total_money);
+ Player.lifetime_money = new __WEBPACK_IMPORTED_MODULE_13__utils_decimal_js___default.a(Player.lifetime_money);
+}
+
+PlayerObject.prototype.toJSON = function() {
+ return Object(__WEBPACK_IMPORTED_MODULE_17__utils_JSONReviver_js__["b" /* Generic_toJSON */])("PlayerObject", this);
+}
+
+PlayerObject.fromJSON = function(value) {
+ return Object(__WEBPACK_IMPORTED_MODULE_17__utils_JSONReviver_js__["a" /* Generic_fromJSON */])(PlayerObject, value.data);
+}
+
+__WEBPACK_IMPORTED_MODULE_17__utils_JSONReviver_js__["c" /* Reviver */].constructors.PlayerObject = PlayerObject;
+
+let Player = new PlayerObject();
+
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* unused harmony export sizeOfObject */
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return addOffset; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return clearEventListeners; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return getRandomInt; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return compareArrays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return printArray; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return powerOfTwo; });
+//General helper functions
+
+//Returns the size (number of keys) of an object
+function sizeOfObject(obj) {
+ var size = 0, key;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) size++;
+ }
+ return size;
+}
+
+//Adds a random offset to a number within a certain percentage
+//e.g. addOffset(100, 5) will return anything from 95 to 105.
+//The percentage argument must be between 0 and 100;
+function addOffset(n, percentage) {
+ if (percentage < 0 || percentage > 100) {return;}
+
+ var offset = n * (percentage / 100);
+
+ return n + ((Math.random() * (2 * offset)) - offset);
+}
+
+//Given an element by its Id(usually an 'a' element), removes all event listeners
+//from that element by cloning and replacing. Then returns the new cloned element
+function clearEventListeners(elemId) {
+ var elem = document.getElementById(elemId);
+ if (elem == null) {console.log("ERR: Could not find element for: " + elemId); return null;}
+ var newElem = elem.cloneNode(true);
+ elem.parentNode.replaceChild(newElem, elem);
+ return newElem;
+}
+
+function getRandomInt(min, max) {
+ if (min > max) {return getRandomInt(max, min);}
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+}
+
+//Returns true if all elements are equal, and false otherwise
+//Assumes both arguments are arrays and that there are no nested arrays
+function compareArrays(a1, a2) {
+ if (a1.length != a2.length) {
+ return false;
+ }
+
+ for (var i = 0; i < a1.length; ++i) {
+ if (a1[i] != a2[i]) {return false;}
+ }
+ return true;
+}
+
+function printArray(a) {
+ return "[" + a.join(", ") + "]";
+}
+
+//Returns bool indicating whether or not its a power of 2
+function powerOfTwo(n) {
+ if (isNaN(n)) {return false;}
+ return n && (n & (n-1)) === 0;
+}
+
+
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return dialogBoxCreate; });
+/* Pop up Dialog Box */
+let dialogBoxes = [];
+
+//Close dialog box when clicking outside
+$(document).click(function(event) {
+ if (dialogBoxOpened && dialogBoxes.length >= 1) {
+ if (!$(event.target).closest(dialogBoxes[0]).length){
+ dialogBoxes[0].remove();
+ dialogBoxes.splice(0, 1);
+ if (dialogBoxes.length == 0) {
+ dialogBoxOpened = false;
+ } else {
+ dialogBoxes[0].style.visibility = "visible";
+ }
+ }
+ }
+});
+
+
+//Dialog box close buttons
+$(document).on('click', '.dialog-box-close-button', function( event ) {
+ if (dialogBoxOpened && dialogBoxes.length >= 1) {
+ dialogBoxes[0].remove();
+ dialogBoxes.splice(0, 1);
+ if (dialogBoxes.length == 0) {
+ dialogBoxOpened = false;
+ } else {
+ dialogBoxes[0].style.visibility = "visible";
+ }
+ }
+});
+
+var dialogBoxOpened = false;
+
+function dialogBoxCreate(txt) {
+ var container = document.createElement("div");
+ container.setAttribute("class", "dialog-box-container");
+
+ var content = document.createElement("div");
+ content.setAttribute("class", "dialog-box-content");
+
+ var closeButton = document.createElement("span");
+ closeButton.setAttribute("class", "dialog-box-close-button");
+ closeButton.innerHTML = "×"
+
+ var textE = document.createElement("p");
+ textE.innerHTML = txt;
+
+ content.appendChild(closeButton);
+ content.appendChild(textE);
+ container.appendChild(content);
+
+ document.body.appendChild(container);
+ if (dialogBoxes.length >= 1) {
+ container.style.visibility = "hidden";
+ }
+ dialogBoxes.push(container);
+
+ setTimeout(function() {
+ dialogBoxOpened = true;
+ }, 400);
+}
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(8)))
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CONSTANTS; });
+let CONSTANTS = {
+ Version: "0.28.1",
+
+ //Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience
+ //and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then
+ //the player will have this level assuming no multipliers. Multipliers can cause skills to go above this.
+ MaxSkillLevel: 975,
+
+ //How much reputation is needed to join a megacorporation's faction
+ CorpFactionRepRequirement: 250000,
+
+ /* Base costs */
+ BaseCostFor1GBOfRamHome: 30000,
+ BaseCostFor1GBOfRamServer: 50000, //1 GB of RAM
+ BaseCostFor1GBOfRamHacknetNode: 30000,
+
+ BaseCostForHacknetNode: 1000,
+ BaseCostForHacknetNodeCore: 500000,
+
+ /* Hacknet Node constants */
+ HacknetNodeMoneyGainPerLevel: 1.6,
+ HacknetNodePurchaseNextMult: 1.85, //Multiplier when purchasing an additional hacknet node
+ HacknetNodeUpgradeLevelMult: 1.04, //Multiplier for cost when upgrading level
+ HacknetNodeUpgradeRamMult: 1.28, //Multiplier for cost when upgrading RAM
+ HacknetNodeUpgradeCoreMult: 1.48, //Multiplier for cost when buying another core
+
+ HacknetNodeMaxLevel: 200,
+ HacknetNodeMaxRam: 64,
+ HacknetNodeMaxCores: 16,
+
+ /* Faction and Company favor */
+ FactionReputationToFavorBase: 500,
+ FactionReputationToFavorMult: 1.02,
+ CompanyReputationToFavorBase: 500,
+ CompanyReputationToFavorMult: 1.02,
+
+
+ /* Augmentation */
+ //NeuroFlux Governor cost multiplier as you level up
+ NeuroFluxGovernorLevelMult: 1.14,
+
+ //RAM Costs for different commands
+ ScriptWhileRamCost: 0.2,
+ ScriptForRamCost: 0.2,
+ ScriptIfRamCost: 0.1,
+ ScriptHackRamCost: 0.1,
+ ScriptGrowRamCost: 0.15,
+ ScriptWeakenRamCost: 0.15,
+ ScriptScanRamCost: 0.2,
+ ScriptNukeRamCost: 0.05,
+ ScriptBrutesshRamCost: 0.05,
+ ScriptFtpcrackRamCost: 0.05,
+ ScriptRelaysmtpRamCost: 0.05,
+ ScriptHttpwormRamCost: 0.05,
+ ScriptSqlinjectRamCost: 0.05,
+ ScriptRunRamCost: 0.8,
+ ScriptExecRamCost: 1.1,
+ ScriptScpRamCost: 0.5,
+ ScriptKillRamCost: 0.5, //Kill and killall
+ ScriptHasRootAccessRamCost: 0.05,
+ ScriptGetHostnameRamCost: 0.05,
+ ScriptGetHackingLevelRamCost: 0.05,
+ ScriptGetServerCost: 0.1,
+ ScriptFileExistsRamCost: 0.1,
+ ScriptIsRunningRamCost: 0.1,
+ ScriptOperatorRamCost: 0.01,
+ ScriptPurchaseHacknetRamCost: 1.5,
+ ScriptHacknetNodesRamCost: 1.0, //Base cost for accessing hacknet nodes array
+ ScriptHNUpgLevelRamCost: 0.4,
+ ScriptHNUpgRamRamCost: 0.6,
+ ScriptHNUpgCoreRamCost: 0.8,
+ ScriptGetStockRamCost: 2.0,
+ ScriptBuySellStockRamCost: 2.5,
+ ScriptPurchaseServerRamCost: 2.0,
+ ScriptRoundRamCost: 0.05,
+ ScriptReadWriteRamCost: 1.0,
+ ScriptArbScriptRamCost: 1.0, //Functions that apply to all scripts regardless of args
+ ScriptGetScriptRamCost: 0.1,
+ ScriptGetHackTimeRamCost: 0.05,
+
+ ScriptSingularityFn1RamCost: 1,
+ ScriptSingularityFn2RamCost: 2,
+ ScriptSingularityFn3RamCost: 3,
+
+ MultithreadingRAMCost: 1,
+
+ //Server constants
+ ServerBaseGrowthRate: 1.03, //Unadjusted Growth rate
+ ServerMaxGrowthRate: 1.0035, //Maximum possible growth rate (max rate accounting for server security)
+ ServerFortifyAmount: 0.002, //Amount by which server's security increases when its hacked/grown
+ ServerWeakenAmount: 0.05, //Amount by which server's security decreases when weakened
+
+ PurchasedServerLimit: 25,
+
+ //Augmentation Constants
+ AugmentationCostMultiplier: 5, //Used for balancing costs without having to readjust every Augmentation cost
+ AugmentationRepMultiplier: 2.5, //Used for balancing rep cost without having to readjust every value
+ MultipleAugMultiplier: 1.9,
+
+ //How much a TOR router costs
+ TorRouterCost: 200000,
+
+ //Infiltration constants
+ InfiltrationBribeBaseAmount: 100000, //Amount per clearance level
+ InfiltrationMoneyValue: 2000, //Convert "secret" value to money
+
+ //Stock market constants
+ WSEAccountCost: 200000000,
+ TIXAPICost: 5000000000,
+ StockMarketCommission: 100000,
+
+ //Hospital/Health
+ HospitalCostPerHp: 100000,
+
+ //Gang constants
+ GangRespectToReputationRatio: 2, //Respect is divided by this to get rep gain
+ MaximumGangMembers: 20,
+ GangRecruitCostMultiplier: 2,
+ GangTerritoryUpdateTimer: 150,
+
+ MillisecondsPer20Hours: 72000000,
+ GameCyclesPer20Hours: 72000000 / 200,
+
+ MillisecondsPer10Hours: 36000000,
+ GameCyclesPer10Hours: 36000000 / 200,
+
+ MillisecondsPer8Hours: 28800000,
+ GameCyclesPer8Hours: 28800000 / 200,
+
+ MillisecondsPer4Hours: 14400000,
+ GameCyclesPer4Hours: 14400000 / 200,
+
+ MillisecondsPer2Hours: 7200000,
+ GameCyclesPer2Hours: 7200000 / 200,
+
+ MillisecondsPerHour: 3600000,
+ GameCyclesPerHour: 3600000 / 200,
+
+ MillisecondsPerHalfHour: 1800000,
+ GameCyclesPerHalfHour: 1800000 / 200,
+
+ MillisecondsPerQuarterHour: 900000,
+ GameCyclesPerQuarterHour: 900000 / 200,
+
+ MillisecondsPerFiveMinutes: 300000,
+ GameCyclesPerFiveMinutes: 300000 / 200,
+
+ FactionWorkHacking: "Faction Hacking Work",
+ FactionWorkField: "Faction Field Work",
+ FactionWorkSecurity: "Faction Security Work",
+
+ WorkTypeCompany: "Working for Company",
+ WorkTypeCompanyPartTime: "Working for Company part-time",
+ WorkTypeFaction: "Working for Faction",
+ WorkTypeCreateProgram: "Working on Create a Program",
+ WorkTypeStudyClass: "Studying or Taking a class at university",
+ WorkTypeCrime: "Committing a crime",
+
+ ClassStudyComputerScience: "studying Computer Science",
+ ClassDataStructures: "taking a Data Structures course",
+ ClassNetworks: "taking a Networks course",
+ ClassAlgorithms: "taking an Algorithms course",
+ ClassManagement: "taking a Management course",
+ ClassLeadership: "taking a Leadership course",
+ ClassGymStrength: "training your strength at a gym",
+ ClassGymDefense: "training your defense at a gym",
+ ClassGymDexterity: "training your dexterity at a gym",
+ ClassGymAgility: "training your agility at a gym",
+
+ ClassDataStructuresBaseCost: 40,
+ ClassNetworksBaseCost: 80,
+ ClassAlgorithmsBaseCost: 320,
+ ClassManagementBaseCost: 160,
+ ClassLeadershipBaseCost: 320,
+ ClassGymBaseCost: 120,
+
+ CrimeShoplift: "shoplift",
+ CrimeRobStore: "rob a store",
+ CrimeMug: "mug someone",
+ CrimeLarceny: "commit larceny",
+ CrimeDrugs: "deal drugs",
+ CrimeTraffickArms: "traffick illegal arms",
+ CrimeHomicide: "commit homicide",
+ CrimeGrandTheftAuto: "commit grand theft auto",
+ CrimeKidnap: "kidnap someone for ransom",
+ CrimeAssassination: "assassinate a high-profile target",
+ CrimeHeist: "pull off the ultimate heist",
+
+ /* Tutorial related things */
+ TutorialNetworkingText: "Servers are a central part of the game. You start with a single personal server (your home computer) " +
+ "and you can purchase additional servers as you progress through the game. Connecting to other servers " +
+ "and hacking them can be a major source of income and experience. Servers can also be used to run " +
+ "scripts which can automatically hack servers for you. " +
+ "In order to navigate between machines, use the 'scan' or 'scan-analyze' Terminal command to see all servers " +
+ "that are reachable from your current server. Then, you can use the 'connect [hostname/ip]' " +
+ "command to connect to one of the available machines. " +
+ "The 'hostname' and 'ifconfig' commands can be used to display the hostname/IP of the " +
+ "server you are currently connected to.",
+
+ TutorialHackingText: "In the year 2077, currency has become digital and decentralized. People and corporations " +
+ "store their money on servers. By hacking these servers, you can steal their money and gain " +
+ "experience. " +
+ "
Gaining root access " +
+ "The key to hacking a server is to gain root access to that server. This can be done using " +
+ "the NUKE virus (NUKE.exe). You start the game with a copy of the NUKE virus on your home " +
+ "computer. The NUKE virus attacks the target server's open ports using buffer overflow " +
+ "exploits. When successful, you are granted root administrative access to the machine. " +
+ "Typically, in order for the NUKE virus to succeed, the target server needs to have at least " +
+ "one of its ports opened. Some servers have no security and will not need any ports opened. Some " +
+ "will have very high security and will need many ports opened. In order to open ports on another " +
+ "server, you will need to run programs that attack the server to open specific ports. These programs " +
+ "can be coded once your hacking skill gets high enough, or they can be purchased if you can find " +
+ "a seller. " +
+ "In order to determine how many ports need to be opened to successfully NUKE a server, connect to " +
+ "that server and run the 'analyze' command. This will also show you which ports have already been " +
+ "opened. " +
+ "Once you have enough ports opened and have ran the NUKE virus to gain root access, the server " +
+ "can then be hacked by simply calling the 'hack' command through terminal, or by using a script. " +
+ "Hacking mechanics " +
+ "When you execute the hack command, either manually through the terminal or automatically through " +
+ "a script, you attempt to hack the server. This action takes time. The more advanced a server's " +
+ "security is, the more time it will take. Your hacking skill level also affects the hacking time, " +
+ "with a higher hacking skill leading to shorter hacking times. Also, running the hack command " +
+ "manually through terminal is faster than hacking from a script. " +
+ "Your attempt to hack a server will not always succeed. The chance you have to successfully hack a " +
+ "server is also determined by the server's security and your hacking skill level. Even if your " +
+ "hacking attempt is unsuccessful, you will still gain experience points. " +
+ "When you successfully hack a server. You steal a certain percentage of that server's total money. This " +
+ "percentage is determined by the server's security and your hacking skill level. The amount of money " +
+ "on a server is not limitless. So, if you constantly hack a server and deplete its money, then you will " +
+ "encounter diminishing returns in your hacking (since you are only hacking a certain percentage). You can " +
+ "increase the amount of money on a server using a script and the grow() function in Netscript. " +
+ "Server Security " +
+ "Each server has a security level, which is denoted by a number between 1 and 100. A higher number means " +
+ "the server has stronger security. As mentioned above, a server's security level is an important factor " +
+ "to consider when hacking. You can check a server's security level using the 'analyze' command, although this " +
+ "only gives an estimate (with 5% uncertainty). You can also check a server's security in a script, using the " +
+ "getServerSecurityLevel(server) function in Netscript. See the Netscript documentation for more details. " +
+ "This function will give you an exact value for a server's security. " +
+ "Whenever a server is hacked manually or through a script, its security level increases by a small amount. Calling " +
+ "the grow() command in a script will also increase security level of the target server. These actions will " +
+ "make it harder for you to hack the server, and decrease the amount of money you can steal. You can lower a " +
+ "server's security level in a script using the weaken(server) function in Netscript. See the Netscript " +
+ "documentation for more details. " +
+ "A server has a minimum security level that is equal to one third of its starting security, rounded to the " +
+ "nearest integer. To be more precise: " +
+ "server.minSecurityLevel = Math.max(1, Math.round(server.startingSecurityLevel / 3)) " +
+ "This means that a server's security will not fall below this value if you are trying to weaken it.",
+
+ TutorialScriptsText: "Scripts can be used to automate the hacking process. Scripts must be written in the Netscript language. " +
+ "Documentation about the Netscript language can be found in the 'Netscript Programming Language' " +
+ "section of this 'Tutorial' page. " +
+ "It is highly recommended that you have a basic background in programming to start writing scripts. " +
+ "You by no means need to be an expert. All you need is some familiarity with basic programming " +
+ "constructs like for/while loops, if statements, " +
+ "functions, variables, etc. The Netscript programming language most resembles the Javascript language. " +
+ "Therefore, a good beginner's programming tutorial to read might be " +
+ "this one . Note that while the Netscript language is similar to Javascript, it is not the exact same, so the " +
+ "syntax will vary a little bit. " +
+ "Running a script requires RAM. The more complex a script is, the more RAM " +
+ "it requires to run. Scripts can be run on any server you have root access to. " +
+ "Here are some Terminal commands that are useful when working with scripts: " +
+ "check [script] [args...] Prints the logs of the script specified by the name and arguments to Terminal. Arguments should be separated " +
+ "by a space. Note that scripts are uniquely " +
+ "identified by their arguments as well as their name. For example, if you ran a script 'foo.script' with the argument 'foodnstuff' then in order to 'check' it you must " +
+ "also add the 'foodnstuff' argument to the check command as so: check foo.script foodnstuff " +
+ "free Shows the current server's RAM usage and availability " +
+ "kill [script] [args...] Stops a script that is running with the specified script name and arguments. " +
+ "Arguments should be separated by a space. Note that " +
+ "scripts are uniquely identified by their arguments as well as their name. For example, if you ran a script 'foo.script' with the " +
+ "argument 1 and 2, then just typing 'kill foo.script' will not work. You have to use 'kill foo.script 1 2'. " +
+ "mem [script] [-t] [n] Check how much RAM a script requires to run with n threads " +
+ "nano [script] Create/Edit a script. The name of the script must end with the '.script' extension " +
+ "ps Displays all scripts that are actively running on the current server " +
+ "rm [script] Delete a script " +
+ "run [script] [-t] [n] [args...] Run a script with n threads and the specified arguments. Each argument should be separated by a space. " +
+ "Both the arguments and thread specification are optional. If neither are specified, then the script will be run single-threaded with no arguments. " +
+ "Examples: run foo.script The command above will run 'foo.script' single-threaded with no arguments." +
+ " run foo.script -t 10 The command above will run 'foo.script' with 10 threads and no arguments." +
+ " run foo.script foodnstuff sigma-cosmetics 10 The command above will run 'foo.script' single-threaded with three arguments: [foodnstuff, sigma-cosmetics, 10]" +
+ " run foo.script -t 50 foodnstuff The command above will run 'foo.script' with 50 threads and a single argument: [foodnstuff] " +
+ "tail [script] [args...] Displays the logs of the script specified by the name and arguments. Note that scripts are uniquely " +
+ "identified by their arguments as well as their name. For example, if you ran a script 'foo.script' with the argument 'foodnstuff' then in order to 'tail' it you must " +
+ "also add the 'foodnstuff' argument to the tail command as so: tail foo.script foodnstuff " +
+ "top Displays all active scripts and their RAM usage " +
+ " Multithreading scripts " +
+ "Scripts can be multithreaded. A multithreaded script runs the script's code once in each thread. The result is that " +
+ "every call to the hack(), grow(), and weaken() Netscript functions will have its effect multiplied by the number of threads. " +
+ "For example, if a normal single-threaded script is able to hack $10,000, then running the same script with 5 threads would " +
+ "yield $50,000. " +
+ "When multithreading a script, the total RAM cost can be calculated by simply multiplying the base RAM cost of the script " +
+ "with the number of threads, where the base cost refers to the amount of RAM required to run the script single-threaded. " +
+ "In the terminal, you can run the " +
+ "'mem [scriptname] -t n' command to see how much RAM a script requires with n threads. " +
+ "Every method for running a script has an option for making it multihreaded. To run a script with " +
+ "n threads from a Terminal: " +
+ "run [scriptname] -t n " +
+ "Using Netscript commands: " +
+ "run('scriptname.script', n); " +
+ "exec('scriptname.script, 'targetServer', n); " +
+ " Notes about how scripts work offline " +
+ " The scripts that you write and execute are interpreted in Javascript. For this " +
+ "reason, it is not possible for these scripts to run while offline (when the game is closed). " +
+ "It is important to note that for this reason, conditionals such as if/else statements and certain " +
+ "commands such as purchaseHacknetNode() or nuke() will not work while the game is offline. " +
+ "However, Scripts WILL continue to generate money and hacking exp for you while the game is offline. This " +
+ "offline production is based off of the scripts' production while the game is online. " +
+ "grow() and weaken() are two Netscript commands that will also be applied when the game is offline, although at a slower rate " +
+ "compared to if the game was open. This is done by having each script keep track of the " +
+ "rate at which the grow() and weaken() commands are called when the game is online. These calculated rates are used to determine how many times " +
+ "these function calls would be made while the game is offline. " +
+ "Also, note that because of the way the Netscript interpreter is implemented, " +
+ "whenever you reload or re-open the game all of the scripts that you are running will " +
+ "start running from the BEGINNING of the code. The game does not keep track of where exactly " +
+ "the execution of a script is when it saves/loads. ",
+ TutorialNetscriptText: "Netscript is a programming language implemented for this game. The language has " +
+ "your basic programming constructs and several built-in commands that are used to hack. " +
+ "Official Wiki and Documentation " +
+ "Check out Bitburner's wiki for the official Netscript documentation " +
+ ". The wiki documentation will contain more details and " +
+ "code examples than this documentation page. Also, it can be opened up in another tab/window for convenience! " +
+ " Variables and data types " +
+ "The following data types are supported by Netscript: " +
+ "numeric - Integers and floats (eg. 6, 10.4999) " +
+ "string - Encapsulated by single or double quotes (eg. 'this is a string') " +
+ "boolean - true or false " +
+ "Strings are fully functional Javascript strings , " +
+ "which means that all of the member functions of Javascript strings such as toLowerCase() and includes() are also " +
+ "available in Netscript! " +
+ "To create a variable, use the assign (=) operator. The language is not strongly typed. Examples: " +
+ "i = 5; " +
+ "s = 'this game is awesome!'; " +
+ "In the first example above, we are creating the variable i and assigning it a value of 5. In the second, " +
+ "we are creating the variable s and assigning it the value of a string. Note that all expressions must be " +
+ "ended with a semicolon. " +
+ " Operators " +
+ "The following operators are supported by Netscript: " +
+ " + " +
+ " - " +
+ " * " +
+ " / " +
+ " % " +
+ " && " +
+ " || " +
+ " < " +
+ " > " +
+ " <= " +
+ " >= " +
+ " == " +
+ " != " +
+ " ++ (Note: This ONLY pre-increments. Post-increment does not work) " +
+ " -- (Note: This ONLY pre-decrements. Post-decrement does not work) " +
+ " - (Negation operator) " +
+ " ! " +
+ " Arrays " +
+ "Netscript arrays have the same properties and functions as javascript arrays. For information see javascripts array documentation. "+
+ " Script Arguments " +
+ "Arguments passed into a script can be accessed using a special array called 'args'. The arguments can be accessed like a normal array using the [] " +
+ "operator. (args[0], args[1], args[2]...) " +
+ "For example, let's say we want to make a generic script 'generic-run.script' and we plan to pass two arguments into that script. The first argument will be the name of " +
+ "another script, and the second argument will be a number. This generic script will run the script specified in the first argument " +
+ "with the amount of threads specified in the second element. The code would look like: " +
+ "run(args[0], args[1]); " +
+ "It is also possible to get the number of arguments that was passed into a script using: " +
+ "args.length " +
+ "Note that none of the other functions that typically work with arrays, such as remove(), insert(), clear(), etc., will work on the " +
+ "args array. " +
+ " Functions " +
+ "You can NOT define you own functions in Netscript (yet), but there are several built in functions that " +
+ "you may use: " +
+ "hack(hostname/ip) Core function that is used to try and hack servers to steal money and gain hacking experience. The argument passed in must be a string with " +
+ "either the IP or hostname of the server you want to hack. The runtime for this command depends on your hacking level and the target server's security level. " +
+ " A script can hack a server from anywhere. It does not need to be running on the same server to hack that server. " +
+ "For example, you can create a script that hacks the 'foodnstuff' server and run that script on any server in the game. A successful hack() on " +
+ "a server will raise that server's security level by 0.002. Returns true if the hack is successful and " +
+ "false otherwise. " +
+ "Examples: hack('foodnstuff'); or hack('148.192.0.12'); " +
+ "sleep(n, log=true) Suspends the script for n milliseconds. The second argument is an optional boolean that indicates " +
+ "whether or not the function should log the sleep action. If this argument is true, then calling this function will write " +
+ "'Sleeping for N milliseconds' to the script's logs. If it's false, then this function will not log anything. " +
+ "If this argument is not specified then it will be true by default. Example: sleep(5000); " +
+ "grow(hostname/ip) Use your hacking skills to increase the amount of money available on a server. The argument passed in " +
+ "must be a string with either the IP or hostname of the target server. The runtime for this command depends on your hacking level and the target server's security level. " +
+ "When grow() completes, the money available on a target server will be increased by a certain, fixed percentage. This percentage " +
+ "is determined by the server's growth rate and varies between servers. Generally, higher-level servers have higher growth rates. " +
+ "Like hack(), grow() can be called on any server, regardless of where the script is running. " +
+ "The grow() command requires root access to the target server, but there is no required hacking level to run the command. " +
+ "It also raises the security level of the target server by 0.004. " +
+ "Returns the number by which the money on the server was multiplied for the growth. " +
+ "Works offline at a slower rate. Example: grow('foodnstuff'); " +
+ "weaken(hostname/ip) Use your hacking skills to attack a server's security, lowering the server's security level. The argument passed " +
+ "in must be a string with either the IP or hostname of the target server. The runtime for this command depends on your " +
+ "hacking level and the target server's security level. This function lowers the security level of the target server by " +
+ "0.05. Like hack() and grow(), weaken() can be called on " +
+ "any server, regardless of where the script is running. This command requires root access to the target server, but " +
+ "there is no required hacking level to run the command. Returns " +
+ "0.1. Works offline at a slower rate Example: weaken('foodnstuff'); " +
+ "print(x) Prints a value or a variable to the scripts logs (which can be viewed with the 'tail [script]' terminal command ). " +
+ "tprint(x) Prints a value or a variable to the Terminal " +
+ "clearLog() Clears the script's logs. " +
+ "scan(hostname/ip) Returns an array containing the hostnames of all servers that are one node away from the specified server. " +
+ "The argument must be a string containing the IP or hostname of the target server. The hostnames in the returned array are strings. " +
+ "nuke(hostname/ip) Run NUKE.exe on the target server. NUKE.exe must exist on your home computer. Does NOT work while offline Example: nuke('foodnstuff'); " +
+ "brutessh(hostname/ip) Run BruteSSH.exe on the target server. BruteSSH.exe must exist on your home computer. Does NOT work while offline Example: brutessh('foodnstuff'); " +
+ "ftpcrack(hostname/ip) Run FTPCrack.exe on the target server. FTPCrack.exe must exist on your home computer. Does NOT work while offline Example: ftpcrack('foodnstuff'); " +
+ "relaysmtp(hostname/ip) Run relaySMTP.exe on the target server. relaySMTP.exe must exist on your home computer. Does NOT work while offline Example: relaysmtp('foodnstuff'); " +
+ "httpworm(hostname/ip) Run HTTPWorm.exe on the target server. HTTPWorm.exe must exist on your home computer. Does NOT work while offline Example: httpworm('foodnstuff'); " +
+ "sqlinject(hostname/ip) Run SQLInject.exe on the target server. SQLInject.exe must exist on your home computer. Does NOT work while offline Example: sqlinject('foodnstuff'); " +
+ "run(script, [numThreads], [args...]) Run a script as a separate process. The first argument that is passed in is the name of the script as a string. This function can only " +
+ "be used to run scripts located on the current server (the server running the script that calls this function). The second argument " +
+ "is optional, and it specifies how many threads to run the script with. This argument must be a number greater than 0. If it is omitted, then the script will be run single-threaded. Any additional arguments will specify " +
+ "arguments to pass into the new script that is being run. If arguments are specified for the new script, then the second argument numThreads argument must be filled in with a value. " +
+ "Returns true if the script is successfully started, and false otherwise. Requires a significant amount " +
+ "of RAM to run this command. Does NOT work while offline " +
+ "The simplest way to use the run command is to call it with just the script name. The following example will run 'foo.script' single-threaded with no arguments: " +
+ "run('foo.script'); " +
+ "The following example will run 'foo.script' but with 5 threads instead of single-threaded: " +
+ "run('foo.script', 5); " +
+ "The following example will run 'foo.script' single-threaded, and will pass the string 'foodnstuff' into the script as an argument: " +
+ "run('foo.script', 1, 'foodnstuff'); " +
+ "exec(script, hostname/ip, [numThreads], [args...]) Run a script as a separate process on another server. The first argument is the name of the script as a string. The " +
+ "second argument is a string with the hostname or IP of the 'target server' on which to run the script. The specified script must exist on the target server. " +
+ "The third argument is optional, and it specifies how many threads to run the script with. If it is omitted, then the script will be run single-threaded. " +
+ "This argument must be a number that is greater than 0. Any additional arguments will specify arguments to pass into the new script that is being run. If " +
+ "arguments are specified for the new script, then the third argument numThreads must be filled in with a value. Returns " +
+ "true if the script is successfully started, and false otherwise. Does NOT work while offline " +
+ "The simplest way to use the exec command is to call it with just the script name and the target server. The following example will try to run 'generic-hack.script' " +
+ "on the 'foodnstuff' server: " +
+ "exec('generic-hack.script', 'foodnstuff'); " +
+ "The following example will try to run the script 'generic-hack.script' on the 'joesguns' server with 10 threads: " +
+ "exec('generic-hack.script', 'joesguns', 10); " +
+ "The following example will try to run the script 'foo.script' on the 'foodnstuff' server with 5 threads. It will also pass the number 1 and the string 'test' in as arguments " +
+ "to the script. " +
+ "exec('foo.script', 'foodnstuff', 5, 1, 'test'); " +
+ "kill(script, hostname/ip, [args...]) Kills the script on the target server specified by the script's name and arguments. Remember that " +
+ "scripts are uniquely identified by both their name and arguments. For example, if 'foo.script' is run with the argument 1, then this is not the " +
+ "same as 'foo.script' run with the argument 2, even though they have the same code. " +
+ "The first argument must be a string with the name of the script. The name is case-sensitive. " +
+ "The second argument must be a string with the hostname or IP of the target server. Any additional arguments to the function will specify the arguments passed " +
+ "into the script that should be killed. The function will try to kill the specified script on the target server. " +
+ "If the script is found on the specified server and is running, then it will be killed and this function " +
+ "will return true. Otherwise, this function will return false. " +
+ "Examples: " +
+ "If you are trying to kill a script named 'foo.script' on the 'foodnstuff' server that was ran with no arguments, use this: " +
+ "kill('foo.script', 'foodnstuff'); " +
+ "If you are trying to kill a script named 'foo.script' on the current server that was ran with no arguments, use this: " +
+ "kill('foo.script', getHostname()); " +
+ "If you are trying to kill a script named 'foo.script' on the current server that was ran with the arguments 1 and 'foodnstuff', use this: " +
+ "kill('foo.script', getHostname(), 1, 'foodnstuff'); " +
+ "killall(hostname/ip) Kills all running scripts on the specified server. This function takes a single argument which " +
+ "must be a string containing the hostname or IP of the target server. This function will always return true. " +
+ "scp(script, hostname/ip) Copies a script to another server. The first argument is a string with the filename of the script " +
+ "to be copied. The second argument is a string with the hostname or IP of the destination server. Returns true if the script is successfully " +
+ "copied over and false otherwise. Example: scp('hack-template.script', 'foodnstuff'); " +
+ "hasRootAccess(hostname/ip) Returns a boolean (true or false) indicating whether or not the Player has root access to a server. " +
+ "The argument passed in must be a string with either the hostname or IP of the target server. Does NOT work while offline. " +
+ "Example: if (hasRootAccess('foodnstuff') == false) { nuke('foodnstuff'); } " +
+ "getHostname() Returns a string with the hostname of the server that the script is running on " +
+ "getHackingLevel() Returns the Player's current hacking level. Does NOT work while offline " +
+ "getServerMoneyAvailable(hostname/ip) Returns the amount of money available on a server. The argument passed in must be a string with either the " +
+ "hostname or IP of the target server. Does NOT work while offline Example: getServerMoneyAvailable('foodnstuff'); " +
+ "getServerMaxMoney(hostname/ip) Returns the maximum amount of money that can be available on a server. The argument passed in must be a string with " +
+ "the hostname or IP of the target server. Does NOT work while offline Example: getServerMaxMoney('foodnstuff'); " +
+ "getServerGrowth(hostname/ip) Returns the server's intrinsic 'growth parameter'. This growth parameter is a number " +
+ "between 1 and 100 that represents how quickly the server's money grows. This parameter affects the percentage by which this server's " +
+ "money is increased when using the grow() function. A higher growth parameter will result in a higher percentage from grow(). " +
+ "The argument passed in must be a string with the hostname or IP of the target server. " +
+ "getServerSecurityLevel(hostname/ip) Returns the security level of a server. The argument passed in must be a string with either the " +
+ "hostname or IP of the target server. A server's security is denoted by a number between 1 and 100. Does NOT work while offline. " +
+ "getServerBaseSecurityLevel(hostname/ip) Returns the base security level of a server. This is the security level that the server starts out with. " +
+ "This is different than getServerSecurityLevel() because getServerSecurityLevel() returns the current security level of a server, which can constantly change " +
+ "due to hack(), grow(), and weaken() calls on that server. The base security level will stay the same until you reset by installing an Augmentation. " +
+ "The argument passed in must be a string with either the hostname or IP of the target server. A server's base security is denoted by a number between 1 and 100. " +
+ "Does NOT work while offline. " +
+ "getServerRequiredHackingLevel(hostname/ip) Returns the required hacking level of a server. The argument passed in must be a string with either the " +
+ "hostname or IP or the target server. Does NOT work while offline " +
+ "getServerNumPortsRequired(hostname/ip) Returns the number of open ports required to successfully run NUKE.exe on a server. The argument " +
+ "passed in must be a string with either the hostname or IP of the target server. Does NOT work while offline " +
+ "getServerRam(hostname/ip) Returns an array with two elements that gives information about the target server's RAM. The first " +
+ "element in the array is the amount of RAM that the server has (in GB). The second element in the array is the amount of RAM that " +
+ "is currently being used on the server. " +
+ "fileExists(filename, [hostname/ip]) Returns a boolean (true or false) indicating whether the specified file exists on a server. " +
+ "The first argument must be a string with the name of the file. A file can either be a script or a program. A script name is case-sensitive, but a " +
+ "program is not. For example, fileExists('brutessh.exe') will work fine, even though the actual program is named BruteSSH.exe. " +
+ "The second argument is a string with the hostname or IP of the server on which to search for the program. This second argument is optional. " +
+ "If it is omitted, then the function will search through the current server (the server running the script that calls this function) for the file. " +
+ "Example: fileExists('foo.script', 'foodnstuff'); " +
+ "Example: fileExists('ftpcrack.exe'); " +
+ "The first example above will return true if the script named 'foo.script' exists on the 'foodnstuff' server, and false otherwise. The second example above will " +
+ "return true if the current server (the server on which this function runs) contains the FTPCrack.exe program, and false otherwise. " +
+ "isRunning(filename, hostname/ip, [args...]) Returns a boolean (true or false) indicating whether the specified script is running on a server. " +
+ "Remember that a script is uniquely identified by both its name and its arguments. " +
+ "The first argument must be a string with the name of the script. The script name is case sensitive. The second argument is a string with the " +
+ "hostname or IP of the target server. Any additional arguments passed to the function will specify the arguments passed into the target script. " +
+ "The function will check whether the script is running on that target server. " +
+ "Example: isRunning('foo.script', 'foodnstuff'); " +
+ "Example: isRunning('foo.script', getHostname()); " +
+ "Example: isRunning('foo.script', 'joesguns', 1, 5, 'test'); " +
+ "The first example above will return true if there is a script named 'foo.script' with no arguments running on the 'foodnstuff' server, and false otherwise. The second " +
+ "example above will return true if there is a script named 'foo.script' with no arguments running on the current server, and false otherwise. " +
+ "The third example above will return true if there is a script named 'foo.script' with the arguments 1, 5, and 'test' running on the 'joesguns' server, and " +
+ "false otherwise. " +
+ "getNextHacknetNodeCost() Returns the cost of purchasing a new Hacknet Node " +
+ "purchaseHacknetNode() Purchases a new Hacknet Node. Returns a number with the index of the Hacknet Node. This index is equivalent to the number " +
+ "at the end of the Hacknet Node's name (e.g The Hacknet Node named 'hacknet-node-4' will have an index of 4). If the player cannot afford to purchase " +
+ "a new Hacknet Node then the function will return false. Does NOT work offline " +
+ "purchaseServer(hostname, ram) Purchases a server with the specified hostname and amount of RAM. The first argument can be any data type, " +
+ "but it will be converted to a string using Javascript's String function. Anything that resolves to an empty string will cause the function to fail. " +
+ "The second argument specified the amount of RAM (in GB) for the server. This argument must resolve to a numeric and it must be a power of 2 " +
+ "(2, 4, 8, etc...). " +
+ "Purchasing a server using this Netscript function is twice as expensive as manually purchasing a server from a location in the World. " +
+ "This function returns the hostname of the newly purchased server as a string. If the function fails to purchase a server, then it will return " +
+ "an empty string. The function will fail if the arguments passed in are invalid or if the player does not have enough money to purchase the specified server. " +
+ "round(n) Rounds the number n to the nearest integer. If the argument passed in is not a number, then the function will return 0. " +
+ "write(port, data) Writes data to a port. The first argument must be a number between 1 and 10 that specifies the port. The second " +
+ "argument defines the data to write to the port. If the second argument is not specified then it will write an empty string to the port. " +
+ "read(port) Reads data from a port. The first argument must be a number between 1 and 10 that specifies the port. A port is a serialized queue. " +
+ "This function will remove the first element from the queue and return it. If the queue is empty, then the string 'NULL PORT DATA' will be returned. " +
+ "scriptRunning(scriptname, hostname/ip) Returns a boolean indicating whether any instance of the specified script is running " +
+ "on a server, regardless of its arguments. This is different than the isRunning() function because it does not " +
+ "try to identify a specific instance of a running script by its arguments. " +
+ "The first argument must be a string with the name of the script. The script name is case sensitive. The second argument is " +
+ "a string with the hostname or IP of the target server. Both arguments are required. " +
+ "scriptKill(scriptname, hostname/ip) Kills all scripts with the specified filename that are running on the server specified by the " +
+ "hostname/ip, regardless of arguments. Returns true if one or more scripts were successfully killed, and false if there were none. " +
+ "The first argument must be a string with the name of the script. The script name is case sensitive. The second argument is " +
+ "a string with the hostname or IP of the target server. Both arguments are required. " +
+ "getScriptRam(scriptname, hostname/ip) Returns the amount of RAM required to run the specified script on the " +
+ "target server. The first argument must be a string with the name of the script. The script name is case sensitive. " +
+ "The second argument is a string with the hostname or IP of the server where that script is. Both arguments are required. " +
+ "getHackTime(hostname/ip) Returns the amount of time in seconds it takes to execute the hack() Netscript function " +
+ "on the server specified by the hostname/ip. The argument must be a string with the hostname/ip of the target server. " +
+ "getGrowTime(hostname/ip) Returns the amount of time in seconds it takes to execute the grow() Netscript function " +
+ "on the server specified by the hostname/ip. The argument must be a string with the hostname/ip of the target server. " +
+ "getWeakenTime(hostname/ip) Returns the amount of time in seconds it takes to execute the weaken() Netscript function " +
+ "on the server specified by the hostname/ip. The argument must be a string with the hostname/ip of the target server. " +
+ "Hacknet Nodes API " +
+ "Netscript provides the following API for accessing and upgrading your Hacknet Nodes through scripts. This API does NOT work offline. " +
+ "hacknetnodes A special variable. This is an array that maps to the Player's Hacknet Nodes. The Hacknet Nodes are accessed through " +
+ "indexes. These indexes correspond to the number at the end of the name of the Hacknet Node. For example, the first Hacknet Node you purchase " +
+ "will have the same 'hacknet-node-0' and can be accessed with hacknetnodes[0]. The fourth Hacknet Node you purchase will have the name " +
+ "'hacknet-node-3' and can be accessed with hacknetnodes[3]. " +
+ "hacknetnodes.length Returns the number of Hacknet Nodes that the player owns " +
+ "hacknetnodes[i].level Returns the level of the corresponding Hacknet Node " +
+ "hacknetnodes[i].ram Returns the amount of RAM on the corresponding Hacknet Node " +
+ "hacknetnodes[i].cores Returns the number of cores on the corresponding Hacknet Node " +
+ "hacknetnodes[i].upgradeLevel(n) Tries to upgrade the level of the corresponding Hacknet Node n times. The argument n must be a " +
+ "positive integer. Returns true if the Hacknet Node's level is successfully upgraded n times or up to the max level (200), and false otherwise. " +
+ "hacknetnodes[i].upgradeRam() Tries to upgrade the amount of RAM on the corresponding Hacknet Node. Returns true if the " +
+ "RAM is successfully upgraded, and false otherwise. " +
+ "hacknetnodes[i].upgradeCore() Attempts to purchase an additional core for the corresponding Hacknet Node. Returns true if the " +
+ "additional core is successfully purchase, and false otherwise. " +
+ "Example: The following is an example of one way a script can be used to automate the purchasing and upgrading of Hacknet Nodes. " +
+ "This script purchases new Hacknet Nodes until the player has four. Then, it iteratively upgrades each of those four Hacknet Nodes " +
+ "to a level of at least 75, RAM to at least 8GB, and number of cores to at least 2. " +
+ "while(hacknetnodes.length < 4) { " +
+ " purchaseHacknetNode(); " +
+ "} " +
+ "for (i = 0; i < 4; i = i++) { " +
+ " while (hacknetnodes[i].level <= 75) { " +
+ " hacknetnodes[i].upgradeLevel(5); " +
+ " sleep(10000); " +
+ " } " +
+ "} " +
+ "for (i = 0; i < 4; i = i++) { " +
+ " while (hacknetnodes[i].ram < 8) { " +
+ " hacknetnodes[i].upgradeRam(); " +
+ " sleep(10000); " +
+ " } " +
+ "} " +
+ "for (i = 0; i < 4; i = i++) { " +
+ " while (hacknetnodes[i].cores < 2) { " +
+ " hacknetnodes[i].upgradeCore(); " +
+ " sleep(10000); " +
+ " } " +
+ "} " +
+ "Trade Information eXchange (TIX) API " +
+ "getStockPrice(sym) Returns the price of a stock. The argument passed in must be the stock's symbol (NOT THE COMPANY NAME!). The symbol " +
+ "is a sequence of two to four capital letters. The symbol argument must be a string. " +
+ "Example: getStockPrice('FSIG'); " +
+ "getStockPosition(sym) Returns an array of two elements that represents the player's position in a stock. The first element " +
+ "in the array is the number of shares the player owns of the specified stock. The second element in the array is the average price of the player's " +
+ "shares. Both elements are numbers. The argument passed in must be the stock's symbol, which is a sequence of two to four capital letters. " +
+ "Example: pos = getStockPosition('ECP'); shares = pos[0]; avgPx = pos[1]; "+
+ "buyStock(sym, shares) Attempts to purchase shares of a stock. The first argument must be a string with the stock's symbol. The second argument " +
+ "must be the number of shares to purchase. " +
+ "If the player does not have enough money to purchase specified number of shares, then no shares will be purchased (it will not purchase the most you can afford). " +
+ "Remember that every transaction on the stock exchange costs a certain commission fee. " +
+ "The function will return true if it successfully purchases the specified number of shares of stock, and false otherwise. " +
+ "sellStock(sym, shares) Attempts to sell shares of a stock. The first argument must be a string with the stock's symbol. The second argument " +
+ "must be the number of shares to sell. " +
+ "If the specified number of shares in the function exceeds the amount that the player actually owns, then this function will sell all owned shares. " +
+ "Remember that every transaction on the stock exchange costs a certain commission fee. " +
+ "The net profit made from selling stocks with this function is reflected in the script's statistics. This net profit is calculated as: " +
+ "shares * (sell price - average price of purchased shares) " +
+ "This function will return true if the shares of stock are successfully sold and false otherwise. " +
+ "While loops " +
+ "A while loop is a control flow statement that repeatedly executes code as long as a condition is met. " +
+ "while ([cond] ) { [code] } " +
+ "As long as [cond] remains true, the code block [code] will continuously execute. Example: " +
+ "i = 0; while (i < 10) { hack('foodnstuff'); i = i + 1; } " +
+ "This code above repeats the 'hack('foodnstuff')' command 10 times before it stops and exits. " +
+ "while(true) { hack('foodnstuff'); } " +
+ "This while loop above is an infinite loop (continuously runs until the script is manually stopped) that repeatedly runs the 'hack('foodnstuff')' command. " +
+ "Note that a semicolon is needed at closing bracket of the while loop, UNLESS it is at the end of the code " +
+ "For loops " +
+ "A for loop is another control flow statement that allows code to be repeated by iterations. The structure is: " +
+ "for ([init] ; [cond] ; [post] ) { code } " +
+ "The [init] expression evaluates before the for loop begins. The for loop will continue to execute " +
+ "as long as [cond] is met. The [post] expression will evaluate at the end of every iteration " +
+ "of the for loop. The following example shows code that will run the 'hack('foodnstuff');' command 10 times " +
+ " using a for loop: " +
+ "for (i = 0; i < 10; i = i++) { hack('foodnstuff'); } " +
+ " If statements " +
+ "If/Else if/Else statements are conditional statements used to perform different actions based on different conditions: " +
+ "if (condition1) { code1 } else if (condition2) { code2 } else { " +
+ " code3 } " +
+ "In the code above, first condition1 will be checked. If this condition is true, then code1 will execute and the " +
+ "rest of the if/else if/else statement will be skipped. If condition1 is NOT true, then the code will then go on to check " +
+ "condition2 . If condition2 is true, then code2 will be executed, and the rest of the if/else if/else statement " +
+ "will be skipped. If none of the conditions are true, then the code within the else block (code3 ) will be executed. " +
+ "Note that a conditional statement can have any number of 'else if' statements. " +
+ "Example: " +
+ "if(getServerMoneyAvailable('foodnstuff') > 200000) { hack('foodnstuff'); " +
+ "} else { grow('foodnstuff'); } " +
+ "The code above will use the getServerMoneyAvailable() function to check how much money there is on the 'foodnstuff' server. " +
+ "If there is more than $200,000, then it will try to hack that server. If there is $200,000 or less on the server, " +
+ "then the code will call grow('foodnstuff') instead and add more money to the server. ",
+ TutorialSingularityFunctionsText: "Singularity Functions " +
+ "The Singularity Functions are a special set of Netscript functions that are unlocked in BitNode-4. " +
+ "These functions allow you to control many additional aspects of the game through scripts, such as " +
+ "working for factions/companies, purchasing/installing Augmentations, and creating programs. " +
+ "If you are in BitNode-4, then you will automatically have access to all of these functions. " +
+ "You can use the Singularity Functions in other BitNodes if and only if you have the Source-File " +
+ "for BitNode-4 (aka Source-File 4). Each level of Source-File 4 will open up additional Singularity " +
+ "Functions that you can use in other BitNodes. If your Source-File 4 is upgraded all the way to level 3, " +
+ "then you will be able to access all of the Singularity Functions. " +
+ "Note that Singularity Functions require a lot of RAM outside of BitNode-4 (their RAM costs are multiplied by " +
+ "10 if you are not in BitNode-4). " +
+ "universityCourse(universityName, courseName) " +
+ "If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function. " +
+ "This function will automatically set you to start taking a course at a university. If you are already " +
+ "in the middle of some 'working' action (such as working at a company, for a faction, or on a program), " +
+ "then running this function will automatically cancel that action and give you your earnings. " +
+ "The first argument must be a string with the name of the university. The names are NOT case-sensitive. " +
+ "Note that you must be in the correct city for whatever university you specify. The three universities are: " +
+ "Summit University Rothman University ZB Institute of Technology " +
+ "The second argument must be a string with the name of the course you are taking. These names are NOT case-sensitive. " +
+ "The available courses are: " +
+ "Study Computer Science Data Structures Networks Algorithms Management Leadership " +
+ "The cost and experience gains for all of these universities and classes are the same as if you were to manually " +
+ "visit and take these classes. " +
+ "This function will return true if you successfully start taking the course, and false otherwise. " +
+ "gymWorkout(gymName, stat) " +
+ "If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function. " +
+ "This function will automatically set you to start working out at a gym to train a particular stat. If you are " +
+ "already in the middle of some 'working' action (such as working at a company, for a faction, or on a program), then " +
+ "running this function will automatically cancel that action and give you your earnings. " +
+ "The first argument must be a string with the name of the gym. The names are NOT case-sensitive. Note that you must " +
+ "be in the correct city for whatever gym you specify. The available gyms are: " +
+ "Crush Fitness Gym Snap Fitness Gym Iron Gym Powerhouse Gym Millenium Fitness Gym " +
+ "The second argument must be a string with the stat you want to work out. These are NOT case-sensitive. " +
+ "The valid stats are: strength OR str defense OR def dexterity OR dex agility OR agi " +
+ "The cost and experience gains for all of these gyms are the same as if you were to manually visit these gyms and train " +
+ "This function will return true if you successfully start working out at the gym, and false otherwise. " +
+ "travelToCity(cityname) " +
+ "If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function. " +
+ "This function allows the player to travel to any city. The cost for using this function is the same as the cost for traveling through the Travel Agency. " +
+ "The argument passed into this must be a string with the name of the city to travel to. Note that this argument IS CASE SENSITIVE. The valid cities are: " +
+ "Aevum Chongqing Sector-12 New Tokyo Ishima Volhaven " +
+ "This function will return true if you successfully travel to the specified city and false otherwise. " +
+ "purchaseTor() " +
+ "If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function. " +
+ "This function allows you to automatically purchase a TOR router. The cost for purchasing a TOR router using this " +
+ "function is the same as if you were to manually purchase one. " +
+ "This function will return true if it successfully purchase a TOR router and false otherwise. " +
+ "purchaseProgram(programName) " +
+ "If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function. " +
+ "This function allows you to automatically purchase programs. You MUST have a TOR router in order to use this function. " +
+ "The argument passed in must be a string with the name of the program (including the '.exe' extension). This argument is " +
+ "NOT case-sensitive. Example: " +
+ "purchaseProgram('brutessh.exe'); " +
+ "The cost of purchasing programs using this function is the same as if you were purchasing them through the Dark Web (using " +
+ "the buy Terminal command). " +
+ "This function will return true if the specified program is purchased, and false otherwise. " +
+ "upgradeHomeRam() " +
+ "If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function. " +
+ "This function will upgrade amount of RAM on the player's home computer. The cost is the same as if you were to do it manually. " +
+ "This function will return true if the player's home computer RAM is successfully upgraded, and false otherwise. " +
+ "getUpgradeHomeRamCost() " +
+ "If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function. " +
+ "Returns the cost of upgrading the player's home computer RAM. " +
+ "workForCompany() " +
+ "If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function. " +
+ "This function will automatically set you to start working at the company at which you are employed. If you are already " +
+ "in the middle of some 'working' action (such as working for a faction, training at a gym, or creating a program), then " +
+ "running this function will automatically cancel that action and give you your earnings. " +
+ "This function will return true if the player starts working, and false otherwise. " +
+ "applyToCompany(companyName, field) " +
+ "If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function. " +
+ "This function will automatically try to apply to the specified company for a position in the specified field. This " +
+ "function can also be used to apply for promotions by specifying the company and field you are already employed at. " +
+ "The first argument must be a string with the name of the company. This argument IS CASE-SENSITIVE. The second argument must " +
+ "be a string representing the 'field' to which you want to apply. This second argument is NOT case-sensitive. Valid values for " +
+ "the second argument are: " +
+ "software software consultant it security engineer network engineer business business consultant " +
+ "security agent employee part-time employee waiter part-time waiter " +
+ "This function will return true if you successfully get a job/promotion, and false otherwise. Note " +
+ "that if you are trying to use this function to apply for a promotion and you don't get one, it will return false. " +
+ "getCompanyRep(companyName) " +
+ "If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function. " +
+ "This function will return the amount of reputation you have at the specified company. If the company passed in as " +
+ "an argument is invalid, -1 will be returned. " +
+ "The argument passed in must be a string with the name of the company. This argument IS CASE-SENSITIVE. " +
+ "checkFactionInvitations() " +
+ "If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function. " +
+ "Returns an array with the name of all Factions you currently have oustanding invitations from. " +
+ "joinFaction(name) " +
+ "If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function. " +
+ "This function will automatically accept an invitation from a faction and join it. " +
+ "The argument must be a string with the name of the faction. This name IS CASE-SENSITIVE. " +
+ "workForFaction(factionName, workType) " +
+ "If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function. " +
+ "This function will automatically set you to start working for the specified Faction. Obviously, you " +
+ "must be a member of the Faction or else this function will fail. If you are already in the middle of " +
+ "some 'working' action (such as working for a company, training at a gym, or creating a program), then running " +
+ "this function will automatically cancel that action and give you your earnings. " +
+ "The first argument must be a string with the name of the faction. This argument IS CASE-SENSITIVE. The second argument " +
+ "must be a string with the type of work you want to perform for the faction. The valid values for this argument are: " +
+ " hacking/hacking contracts/hackingcontracts field/fieldwork/field work security/securitywork/security work " +
+ "This function will return true if you successfully start working for the specified faction, and false otherwise. " +
+ "getFactionRep(factionName) " +
+ "If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function. " +
+ "This function returns the amount of reputation you have for the specified Faction. The argument must be a " +
+ "string with the name of the Faction. The argument IS CASE-SENSITIVE. " +
+ "createProgram(programName) " +
+ "If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function. " +
+ "This function will automatically set you to start working on creating the specified program. If you are already in " +
+ "the middle of some 'working' action (such as working for a company, training at a gym, or taking a course), then " +
+ "running this function will automatically cancel that action and give you your earnings. " +
+ "The argument passed in must be a string designating the name of the program. This argument is NOT case-sensitive. " +
+ "Example: createProgram('relaysmtp.exe'); " +
+ "Note that creating a program using this function has the same hacking level requirements as it normally would. These level requirements are: " +
+ "BruteSSH.exe: 50 FTPCrack.exe: 100 relaySMTP.exe: 250 HTTPWorm.exe: 500 SQLInject.exe: 750 " +
+ "DeepscanV1.exe: 75 DeepscanV2.exe: 400 ServerProfiler.exe: 75 AutoLink.exe: 25 " +
+ "This function returns true if you successfully start working on the specified program, and false otherwise. " +
+ "getAugmentationCost(augName) " +
+ "If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function. " +
+ "This function returns an array with two elements that gives the cost for the specified Augmentation" +
+ ". The first element in the returned array is the reputation requirement of the Augmentation, and the second element " +
+ "is the money cost. " +
+ "The argument passed in must be a string with the name of the Augmentation. This argument IS CASE-SENSITIVE. " +
+ "If an invalid Augmentation name is passed in, this function will return the array [-1, -1]. " +
+ "purchaseAugmentation(factionName, augName) " +
+ "If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function. " +
+ "This function will try to purchase the specified Augmentation through the given Faction. " +
+ "The two arguments must be strings specifying the name of the Faction and Augmentation, respectively. These arguments are both CASE-SENSITIVE. " +
+ "This function will return true if the Augmentation is successfully purchased, and false otherwise. " +
+ "installAugmentations() " +
+ "If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function. " +
+ "This function will automatically install your Augmentations, resetting the game as usual. " +
+ "It will return true if successful, and false otherwise.",
+
+ TutorialTravelingText:"There are six major cities in the world that you are able to travel to: " +
+ " Aevum " +
+ " Chongqing " +
+ " Sector-12 " +
+ " New Tokyo " +
+ " Ishima " +
+ " Volhaven " +
+ "To travel between cities, visit your current city's travel agency through the 'World' page. " +
+ "From the travel agency you can travel to any other city. Doing so costs money. " +
+ "Each city has its own set of companies and unique locations. Also, certain content is only available to you " +
+ "if you are in certain cities, so get exploring!",
+ TutorialCompaniesText: "Hacking is not the only way to gain money and experience! Located around the world are many " +
+ "different companies which you can work for. By working for a company you can earn money, " +
+ "train your various labor skills, and unlock powerful passive perks. " +
+ "To apply for a job, visit the company you want to work for through the 'World' menu. The company " +
+ "page will have options that let you apply to positions in the company. There might be several different " +
+ "positions you can apply for, ranging from software engineer to business analyst to security officer. " +
+ "When you apply for a job, you will get the offer if your stats are high enough. Your first position at " +
+ "a company will be an entry-level position such as 'intern'. Once you get the job, an button will appear on " +
+ "the company page that allows you to work for the company. Click this button to start working. " +
+ "Working occurs in 8 hour shifts. Once you start working, you will begin earning money, experience, " +
+ "and reputation. The rate at which you money and experience depends on the company and your position. " +
+ "The amount of reputation you gain for your company is based on your job performance, which is affected by " +
+ "your stats. Different positions value different stats. When you are working, you are unable to perform any " +
+ "other actions such as using your terminal or visiting other locations (However, note that any scripts you have " +
+ "running on servers will continue to run as you work!). It is possible to cancel your work shift before the " +
+ "8 hours is up. However, if you have a full-time job, then cancelling a shift early will result in you gaining " +
+ "only half of the reputation " +
+ "that you had earned up to that point. There are also part-time/consultant jobs available where you will not " +
+ " be penalized if you cancel a work shift early. However, these positions pay less than full-time positions. " +
+ "As you continue to work at a company, you will gain more and more reputation at that company. When your stats " +
+ "and reputation are high enough, you can get a promotion. You can apply for a promotion on the company page, just like " +
+ "you applied for the job originally. Higher positions at a company provide better salaries and stat gains. " +
+ "Infiltrating Companies " +
+ "Many companies have facilities that you can attempt to infiltrate. By infiltrating, you can steal classified company secrets " +
+ "and then sell these for money or for faction reputation. To try and infiltrate a company, visit a company through the " +
+ "'World' menu. There will be an option that says 'Infiltrate Company'. " +
+ "When infiltrating a company, you must progress through clearance levels in the facility. Every clearance level " +
+ "has some form of security that you must get past. There are several forms of security, ranging from high-tech security systems to " +
+ "armed guards. For each form of security, there are a variety of options that you can choose to try and bypass the security. Examples " +
+ "include hacking the security, engaging in combat, assassination, or sneaking past the security. The chance to succeed for each option " +
+ "is determined in part by your stats. So, for example, trying to hack the security system relies on your hacking skill, whereas trying to " +
+ "sneak past the security relies on your agility level. " +
+ "The facility has a 'security level' that affects your chance of success when trying to get past a clearance level. " +
+ "Every time you advance to the next clearance level, the facility's security level will increase by a fixed amount. Furthermore " +
+ "the options you choose and whether you succeed or fail will affect the security level as well. For example, " +
+ "if you try to kill a security guard and fail, the security level will increase by a lot. If you choose to sneak past " +
+ "security and succeed, the security level will not increase at all. " +
+ "Every 5 clearance levels, you will steal classified company secrets that can be sold for money or faction reputation. However, " +
+ "in order to sell these secrets you must successfully escape the facility using the 'Escape' option. Furthermore, companies have " +
+ "a max clearance level. If you reach the max clearance level you will automatically escape the facility with all of your " +
+ "stolen secrets. ",
+ TutorialFactionsText: "Throughout the game you may receive invitations from factions. There are many different factions, and each faction " +
+ "has different criteria for determining its potential members. Joining a faction and furthering its cause is crucial " +
+ "to progressing in the game and unlocking endgame content. " +
+ "It is possible to join multiple factions if you receive invitations from them. However, note that joining a faction " +
+ "may prevent you from joining other rival factions. " +
+ "The 'Factions' link on the menu brings up a list of all factions that you have joined. " +
+ "You can select a Faction on this list to go to that Faction page. This page displays general " +
+ "information about the Faction and also lets you perform work for the faction. " +
+ "Working for a Faction is similar to working for a company except that you don't get paid a salary. " +
+ "You will only earn reputation in your Faction and train your stats. Also, cancelling work early " +
+ "when working for a Faction does NOT result in reduced experience/reputation earnings. " +
+ "Earning reputation for a Faction unlocks powerful Augmentations. Purchasing and installing these Augmentations will " +
+ "upgrade your abilities. The Augmentations that are available to unlock vary from faction to faction.",
+ TutorialAugmentationsText: "Advances in science and medicine have lead to powerful new technologies that allow people to augment themselves " +
+ "beyond normal human capabilities. There are many different types of Augmentations, ranging from cybernetic to " +
+ "genetic to biological. Acquiring these Augmentations enhances the user's physical and mental faculties. " +
+ "Because of how powerful these Augmentations are, the technology behind them is kept private and secret by the " +
+ "corporations and organizations that create them. Therefore, the only way for the player to obtain Augmentations is " +
+ "through Factions. After joining a Faction and earning enough reputation in it, you will be able to purchase " +
+ "its Augmentations. Different Factions offer different Augmentations. Augmentations must be purchased in order to be installed, " +
+ "and they are fairly expensive. " +
+ "When you purchase an Augmentation, the price of purchasing another Augmentation increases by 90%. This multiplier stacks for " +
+ "each Augmentation you purchase. You will not gain the benefits of your purchased Augmentations until you install them. You can " +
+ "choose to install Augmentations through the 'Augmentations' menu tab. Once you install your purchased Augmentations, " +
+ "their costs are reset back to the original price. " +
+ "Unfortunately, installing Augmentations has side effects. You will lose most of the progress you've made, including your " +
+ "skills, stats, and money. You will have to start over, but you will have all of the Augmentations you have installed to " +
+ "help you progress. " +
+ "To summarize, here is a list of everything you will LOSE when you install an Augmentation: " +
+ "Stats/Skills " +
+ "Money " +
+ "Scripts on all servers EXCEPT your home computer " +
+ "Purchased servers " +
+ "Hacknet Nodes " +
+ "Company/faction reputation " +
+ "Jobs and Faction memberships " +
+ "Programs " +
+ "Stocks " +
+ "TOR router " +
+ "Here is everything you will KEEP when you install an Augmentation: " +
+ "Every Augmentation you have installed " +
+ "Scripts on your home computer " +
+ "RAM Upgrades on your home computer " +
+ "World Stock Exchange account and TIX API Access ",
+
+ LatestUpdate:
+ "v0.28.1 " +
+ "-The script editor now uses the open-source Ace editor, which provides a much better experience when coding! " +
+ "-Added tprint() Netscript function " +
+ "v0.28.0 " +
+ "-Added BitNode-4: The Singularity " +
+ "-Added BitNode-11: The Big Crash " +
+ "-Migrated the codebase to use webpack (doesn't affect any in game content, except maybe some slight " +
+ "performance improvements and there may be bugs that result from dependency errors)"
+}
+
+
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Engine", function() { return Engine; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_DialogBox_js__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__utils_GameOptions_js__ = __webpack_require__(37);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js__ = __webpack_require__(38);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils_LogBox_js__ = __webpack_require__(26);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__ActiveScriptsUI_js__ = __webpack_require__(27);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__Augmentations_js__ = __webpack_require__(16);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__BitNode_js__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__Company_js__ = __webpack_require__(17);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__Constants_js__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__CreateProgram_js__ = __webpack_require__(14);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__Faction_js__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__Location_js__ = __webpack_require__(12);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__Gang_js__ = __webpack_require__(29);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__HacknetNode_js__ = __webpack_require__(32);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__InteractiveTutorial_js__ = __webpack_require__(22);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__Literature_js__ = __webpack_require__(43);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__Message_js__ = __webpack_require__(24);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__NetscriptFunctions_js__ = __webpack_require__(39);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__NetscriptWorker_js__ = __webpack_require__(15);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__Player_js__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__Prestige_js__ = __webpack_require__(31);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__RedPill_js__ = __webpack_require__(44);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__SaveObject_js__ = __webpack_require__(58);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__Script_js__ = __webpack_require__(18);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__Server_js__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__Settings_js__ = __webpack_require__(13);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__SourceFile_js__ = __webpack_require__(30);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__SpecialServerIps_js__ = __webpack_require__(11);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__StockMarket_js__ = __webpack_require__(25);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__Terminal_js__ = __webpack_require__(19);
+var ace = __webpack_require__(33);
+__webpack_require__(35);
+__webpack_require__(36);
+__webpack_require__(49);
+__webpack_require__(50);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/* Shortcuts to navigate through the game
+ * Alt-t - Terminal
+ * Alt-c - Character
+ * Alt-e - Script editor
+ * Alt-s - Active scripts
+ * Alt-h - Hacknet Nodes
+ * Alt-w - City
+ * Alt-j - Job
+ * Alt-r - Travel Agency of current city
+ * Alt-p - Create program
+ * Alt-f - Factions
+ * Alt-a - Augmentations
+ * Alt-u - Tutorial
+ * Alt-o - Options
+ */
+$(document).keydown(function(e) {
+ if (!__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].isWorking && !__WEBPACK_IMPORTED_MODULE_23__RedPill_js__["b" /* redPillFlag */]) {
+ if (e.keyCode == 84 && e.altKey) {
+ e.preventDefault();
+ Engine.loadTerminalContent();
+ } else if (e.keyCode == 67 && e.altKey) {
+ e.preventDefault();
+ Engine.loadCharacterContent();
+ } else if (e.keyCode == 69 && e.altKey) {
+ e.preventDefault();
+ Engine.loadScriptEditorContent();
+ } else if (e.keyCode == 83 && e.altKey) {
+ e.preventDefault();
+ Engine.loadActiveScriptsContent();
+ } else if (e.keyCode == 72 && e.altKey) {
+ e.preventDefault();
+ Engine.loadHacknetNodesContent();
+ } else if (e.keyCode == 87 && e.altKey) {
+ e.preventDefault();
+ Engine.loadWorldContent();
+ } else if (e.keyCode == 74 && e.altKey) {
+ e.preventDefault();
+ Engine.loadJobContent();
+ } else if (e.keyCode == 82 && e.altKey) {
+ e.preventDefault();
+ Engine.loadTravelContent();
+ } else if (e.keyCode == 80 && e.altKey) {
+ e.preventDefault();
+ Engine.loadCreateProgramContent();
+ } else if (e.keyCode == 70 && e.altKey) {
+ e.preventDefault();
+ Engine.loadFactionsContent();
+ } else if (e.keyCode == 65 && e.altKey) {
+ e.preventDefault();
+ Engine.loadAugmentationsContent();
+ } else if (e.keyCode == 85 && e.altKey) {
+ e.preventDefault();
+ Engine.loadTutorialContent();
+ }
+ }
+
+ if (e.keyCode == 79 && e.altKey) {
+ e.preventDefault();
+ Object(__WEBPACK_IMPORTED_MODULE_1__utils_GameOptions_js__["b" /* gameOptionsBoxOpen */])();
+ }
+});
+
+let Engine = {
+ version: "",
+ Debug: true,
+
+ //Clickable objects
+ Clickables: {
+ //Main menu buttons
+ terminalMainMenuButton: null,
+ characterMainMenuButton: null,
+ scriptEditorMainMenuButton: null,
+ activeScriptsMainMenuButton: null,
+ hacknetNodesMainMenuButton: null,
+ worldMainMenuButton: null,
+ travelMainMenuButton: null,
+ jobMainMenuButton: null,
+ createProgramMainMenuButton: null,
+ factionsMainMenuButton: null,
+ augmentationsMainMenuButton: null,
+ tutorialMainMenuButton: null,
+ saveMainMenuButton: null,
+ deleteMainMenuButton: null,
+
+ //Tutorial buttons
+ tutorialNetworkingButton: null,
+ tutorialHackingButton: null,
+ tutorialScriptsButton: null,
+ tutorialNetscriptButton: null,
+ tutorialTravelingButton: null,
+ tutorialCompaniesButton: null,
+ tutorialFactionsButton: null,
+ tutorialAugmentationsButton: null,
+ tutorialBackButton: null,
+ },
+
+ //Display objects
+ Display: {
+ //Progress bar
+ progress: null,
+
+ //Display for status text (such as "Saved" or "Loaded")
+ statusText: null,
+
+ hacking_skill: null,
+
+ //Main menu content
+ terminalContent: null,
+ characterContent: null,
+ scriptEditorContent: null,
+ activeScriptsContent: null,
+ hacknetNodesContent: null,
+ worldContent: null,
+ createProgramContent: null,
+ factionsContent: null,
+ factionContent: null,
+ factionAugmentationsContent: null,
+ augmentationsContent: null,
+ tutorialContent: null,
+ infiltrationContent: null,
+ stockMarketContent: null,
+ locationContent: null,
+ workInProgressContent: null,
+ redPillContent: null,
+
+ //Character info
+ characterInfo: null,
+ },
+
+ //Current page status
+ Page: {
+ Terminal: "Terminal",
+ CharacterInfo: "CharacterInfo",
+ ScriptEditor: "ScriptEditor",
+ ActiveScripts: "ActiveScripts",
+ HacknetNodes: "HacknetNodes",
+ World: "World",
+ CreateProgram: "CreateProgram",
+ Factions: "Factions",
+ Faction: "Faction",
+ Augmentations: "Augmentations",
+ Tutorial: "Tutorial",
+ Location: "Location",
+ workInProgress: "WorkInProgress",
+ RedPill: "RedPill",
+ Infiltration: "Infiltration",
+ StockMarket: "StockMarket",
+ Gang: "Gang",
+ },
+ currentPage: null,
+
+
+ //Time variables (milliseconds unix epoch time)
+ _lastUpdate: new Date().getTime(),
+ _idleSpeed: 200, //Speed (in ms) at which the main loop is updated
+
+
+ /* Load content when a main menu button is clicked */
+ loadTerminalContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.terminalContent.style.visibility = "visible";
+ Engine.currentPage = Engine.Page.Terminal;
+ document.getElementById("terminal-menu-link").classList.add("active");
+ },
+
+ loadCharacterContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.characterContent.style.visibility = "visible";
+ Engine.displayCharacterInfo();
+ Engine.currentPage = Engine.Page.CharacterInfo;
+ document.getElementById("stats-menu-link").classList.add("active");
+ },
+
+ loadScriptEditorContent: function(filename = "", code = "") {
+ Engine.hideAllContent();
+ Engine.Display.scriptEditorContent.style.visibility = "visible";
+ var editor = ace.edit('javascript-editor');
+ if (filename != "") {
+ document.getElementById("script-editor-filename").value = filename;
+ editor.setValue(code);
+ }
+ editor.focus();
+ Object(__WEBPACK_IMPORTED_MODULE_25__Script_js__["f" /* updateScriptEditorContent */])();
+ Engine.currentPage = Engine.Page.ScriptEditor;
+ document.getElementById("create-script-menu-link").classList.add("active");
+ },
+
+ loadActiveScriptsContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.activeScriptsContent.style.visibility = "visible";
+ Object(__WEBPACK_IMPORTED_MODULE_6__ActiveScriptsUI_js__["c" /* setActiveScriptsClickHandlers */])();
+ Engine.currentPage = Engine.Page.ActiveScripts;
+ document.getElementById("active-scripts-menu-link").classList.add("active");
+ },
+
+ loadHacknetNodesContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.hacknetNodesContent.style.visibility = "visible";
+ Object(__WEBPACK_IMPORTED_MODULE_15__HacknetNode_js__["a" /* displayHacknetNodesContent */])();
+ Engine.currentPage = Engine.Page.HacknetNodes;
+ document.getElementById("hacknet-nodes-menu-link").classList.add("active");
+ },
+
+ loadWorldContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.worldContent.style.visibility = "visible";
+ Engine.displayWorldInfo();
+ Engine.currentPage = Engine.Page.World;
+ document.getElementById("city-menu-link").classList.add("active");
+ },
+
+ loadCreateProgramContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.createProgramContent.style.visibility = "visible";
+ Object(__WEBPACK_IMPORTED_MODULE_11__CreateProgram_js__["b" /* displayCreateProgramContent */])();
+ Engine.currentPage = Engine.Page.CreateProgram;
+ document.getElementById("create-program-menu-link").classList.add("active");
+ },
+
+ loadFactionsContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.factionsContent.style.visibility = "visible";
+ Engine.displayFactionsInfo();
+ Engine.currentPage = Engine.Page.Factions;
+ document.getElementById("factions-menu-link").classList.add("active");
+ },
+
+ loadFactionContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.factionContent.style.visibility = "visible";
+ Engine.currentPage = Engine.Page.Faction;
+ },
+
+ loadAugmentationsContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.augmentationsContent.style.visibility = "visible";
+ Engine.displayAugmentationsContent();
+ Engine.currentPage = Engine.Page.Augmentations;
+ document.getElementById("augmentations-menu-link").classList.add("active");
+ },
+
+ loadTutorialContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.tutorialContent.style.visibility = "visible";
+ Engine.displayTutorialContent();
+ Engine.currentPage = Engine.Page.Tutorial;
+ document.getElementById("tutorial-menu-link").classList.add("active");
+ },
+
+ loadLocationContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.locationContent.style.visibility = "visible";
+ Object(__WEBPACK_IMPORTED_MODULE_13__Location_js__["b" /* displayLocationContent */])();
+ Engine.currentPage = Engine.Page.Location;
+ },
+
+ loadTravelContent: function() {
+ switch(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].city) {
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Aevum:
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].location = __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].AevumTravelAgency;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Chongqing:
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].location = __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].ChongqingTravelAgency;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Sector12:
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].location = __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Sector12TravelAgency;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].NewTokyo:
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].location = __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].NewTokyoTravelAgency;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Ishima:
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].location = __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].IshimaTravelAgency;
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Volhaven:
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].location = __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].VolhavenTravelAgency;
+ break;
+ default:
+ Object(__WEBPACK_IMPORTED_MODULE_0__utils_DialogBox_js__["a" /* dialogBoxCreate */])("ERROR: Invalid city. This is a bug please contact game dev");
+ break;
+ }
+ Engine.loadLocationContent();
+ },
+
+ loadJobContent: function() {
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].companyName == "") {
+ Object(__WEBPACK_IMPORTED_MODULE_0__utils_DialogBox_js__["a" /* dialogBoxCreate */])("You do not currently have a job! You can visit various companies " +
+ "in the city and try to find a job.");
+ return;
+ }
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].location = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].companyName;
+ Engine.loadLocationContent();
+ },
+
+ loadWorkInProgressContent: function() {
+ Engine.hideAllContent();
+ var mainMenu = document.getElementById("mainmenu-container");
+ mainMenu.style.visibility = "hidden";
+ Engine.Display.workInProgressContent.style.visibility = "visible";
+ Engine.currentPage = Engine.Page.WorkInProgress;
+ },
+
+ loadRedPillContent: function() {
+ Engine.hideAllContent();
+ var mainMenu = document.getElementById("mainmenu-container");
+ mainMenu.style.visibility = "hidden";
+ Engine.Display.redPillContent.style.visibility = "visible";
+ Engine.currentPage = Engine.Page.RedPill;
+ },
+
+ loadInfiltrationContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.infiltrationContent.style.visibility = "visible";
+ Engine.currentPage = Engine.Page.Infiltration;
+ },
+
+ loadStockMarketContent: function() {
+ Engine.hideAllContent();
+ Engine.Display.stockMarketContent.style.visibility = "visible";
+ Object(__WEBPACK_IMPORTED_MODULE_30__StockMarket_js__["c" /* displayStockMarketContent */])();
+ Engine.currentPage = Engine.Page.StockMarket;
+ },
+
+ loadGangContent: function() {
+ Engine.hideAllContent();
+ if (document.getElementById("gang-container") || __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].inGang()) {
+ Object(__WEBPACK_IMPORTED_MODULE_14__Gang_js__["c" /* displayGangContent */])();
+ Engine.currentPage = Engine.Page.Gang;
+ } else {
+ Engine.loadTerminalContent();
+ Engine.currentPage = Engine.Page.Terminal;
+ }
+
+ },
+
+ //Helper function that hides all content
+ hideAllContent: function() {
+ Engine.Display.terminalContent.style.visibility = "hidden";
+ Engine.Display.characterContent.style.visibility = "hidden";
+ Engine.Display.scriptEditorContent.style.visibility = "hidden";
+ Engine.Display.activeScriptsContent.style.visibility = "hidden";
+ Engine.Display.hacknetNodesContent.style.visibility = "hidden";
+ Engine.Display.worldContent.style.visibility = "hidden";
+ Engine.Display.createProgramContent.style.visibility = "hidden";
+ Engine.Display.factionsContent.style.visibility = "hidden";
+ Engine.Display.factionContent.style.visibility = "hidden";
+ Engine.Display.factionAugmentationsContent.style.visibility = "hidden";
+ Engine.Display.augmentationsContent.style.visibility = "hidden";
+ Engine.Display.tutorialContent.style.visibility = "hidden";
+ Engine.Display.locationContent.style.visibility = "hidden";
+ Engine.Display.workInProgressContent.style.visibility = "hidden";
+ Engine.Display.redPillContent.style.visibility = "hidden";
+ Engine.Display.infiltrationContent.style.visibility = "hidden";
+ Engine.Display.stockMarketContent.style.visibility = "hidden";
+ if (document.getElementById("gang-container")) {
+ document.getElementById("gang-container").style.visibility = "hidden";
+ }
+
+ //Location lists
+ Engine.aevumLocationsList.style.display = "none";
+ Engine.chongqingLocationsList.style.display = "none";
+ Engine.sector12LocationsList.style.display = "none";
+ Engine.newTokyoLocationsList.style.display = "none";
+ Engine.ishimaLocationsList.style.display = "none";
+ Engine.volhavenLocationsList.style.display = "none";
+
+ //Make nav menu tabs inactive
+ document.getElementById("terminal-menu-link").classList.remove("active");
+ document.getElementById("create-script-menu-link").classList.remove("active");
+ document.getElementById("active-scripts-menu-link").classList.remove("active");
+ document.getElementById("create-program-menu-link").classList.remove("active");
+ document.getElementById("stats-menu-link").classList.remove("active");
+ document.getElementById("factions-menu-link").classList.remove("active");
+ document.getElementById("augmentations-menu-link").classList.remove("active");
+ document.getElementById("hacknet-nodes-menu-link").classList.remove("active");
+ document.getElementById("city-menu-link").classList.remove("active");
+ document.getElementById("tutorial-menu-link").classList.remove("active");
+ document.getElementById("options-menu-link").classList.remove("active");
+ },
+
+ displayCharacterOverviewInfo: function() {
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hp == null) {__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hp = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].max_hp;}
+ document.getElementById("character-overview-text").innerHTML =
+ ("Hp: " + __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hp + " / " + __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].max_hp + " " +
+ "Money: " + __WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js___default()(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].money.toNumber()).format('($0.000a)') + " " +
+ "Hack: " + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacking_skill).toLocaleString() + " " +
+ "Str: " + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].strength).toLocaleString() + " " +
+ "Def: " + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].defense).toLocaleString() + " " +
+ "Dex: " + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].dexterity).toLocaleString() + " " +
+ "Agi: " + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].agility).toLocaleString() + " " +
+ "Cha: " + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].charisma).toLocaleString()
+ ).replace( / /g, " " );
+ },
+
+ /* Display character info */
+ displayCharacterInfo: function() {
+ var companyPosition = "";
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].companyPosition != "") {
+ companyPosition = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].companyPosition.positionName;
+ }
+ Engine.Display.characterInfo.innerHTML =
+ ('General ' +
+ 'Current City: ' + __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].city + ' ' +
+ 'Employer: ' + __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].companyName + ' ' +
+ 'Job Title: ' + companyPosition + ' ' +
+ 'Money: $' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].money.toNumber(), 2)+ ' ' +
+ 'Stats ' +
+ 'Hacking Level: ' + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacking_skill).toLocaleString() +
+ " (" + __WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js___default()(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacking_exp).format('(0.000a)') + ' experience) ' +
+ 'Strength: ' + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].strength).toLocaleString() +
+ " (" + __WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js___default()(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].strength_exp).format('(0.000a)') + ' experience) ' +
+ 'Defense: ' + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].defense).toLocaleString() +
+ " (" + __WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js___default()(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].defense_exp).format('(0.000a)')+ ' experience) ' +
+ 'Dexterity: ' + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].dexterity).toLocaleString() +
+ " (" + __WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js___default()(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].dexterity_exp).format('(0.000a)') + ' experience) ' +
+ 'Agility: ' + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].agility).toLocaleString() +
+ " (" + __WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js___default()(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].agility_exp).format('(0.000a)') + ' experience) ' +
+ 'Charisma: ' + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].charisma).toLocaleString() +
+ " (" + __WEBPACK_IMPORTED_MODULE_3__utils_numeral_min_js___default()(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].charisma_exp).format('(0.000a)') + ' experience) ' +
+ 'Multipliers ' +
+ 'Hacking Chance multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacking_chance_mult * 100, 2) + '% ' +
+ 'Hacking Speed multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacking_speed_mult * 100, 2) + '% ' +
+ 'Hacking Money multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacking_money_mult * 100, 2) + '% ' +
+ 'Hacking Growth multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacking_grow_mult * 100, 2) + '% ' +
+ 'Hacking Level multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacking_mult * 100, 2) + '% ' +
+ 'Hacking Experience multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacking_exp_mult * 100, 2) + '% ' +
+ 'Strength Level multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].strength_mult * 100, 2) + '% ' +
+ 'Strength Experience multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].strength_exp_mult * 100, 2) + '% ' +
+ 'Defense Level multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].defense_mult * 100, 2) + '% ' +
+ 'Defense Experience multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].defense_exp_mult * 100, 2) + '% ' +
+ 'Dexterity Level multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].dexterity_mult * 100, 2) + '% ' +
+ 'Dexterity Experience multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].dexterity_exp_mult * 100, 2) + '% ' +
+ 'Agility Level multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].agility_mult * 100, 2) + '% ' +
+ 'Agility Experience multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].agility_exp_mult * 100, 2) + '% ' +
+ 'Charisma Level multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].charisma_mult * 100, 2) + '% ' +
+ 'Charisma Experience multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].charisma_exp_mult * 100, 2) + '% ' +
+ 'Hacknet Node production multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacknet_node_money_mult * 100, 2) + '% ' +
+ 'Hacknet Node purchase cost multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacknet_node_purchase_cost_mult * 100, 2) + '% ' +
+ 'Hacknet Node RAM upgrade cost multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacknet_node_ram_cost_mult * 100, 2) + '% ' +
+ 'Hacknet Node Core purchase cost multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacknet_node_core_cost_mult * 100, 2) + '% ' +
+ 'Hacknet Node level upgrade cost multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacknet_node_level_cost_mult * 100, 2) + '% ' +
+ 'Company reputation gain multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].company_rep_mult * 100, 2) + '% ' +
+ 'Faction reputation gain multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].faction_rep_mult * 100, 2) + '% ' +
+ 'Salary multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].work_money_mult * 100, 2) + '% ' +
+ 'Crime success multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].crime_success_mult * 100, 2) + '% ' +
+ 'Crime money multiplier: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].crime_money_mult * 100, 2) + '% ' +
+ 'Misc ' +
+ 'Servers owned: ' + __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].purchasedServers.length + ' ' +
+ 'Hacknet Nodes owned: ' + __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hacknetNodes.length + ' ' +
+ 'Augmentations installed: ' + __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].augmentations.length + ' ' +
+ 'Time played since last Augmentation: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].playtimeSinceLastAug) + ' ' +
+ 'Time played: ' + Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["b" /* convertTimeMsToTimeElapsedString */])(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].totalPlaytime) + ' ').replace( / /g, " " );
+ },
+
+ /* Display locations in the world*/
+ aevumLocationsList: null,
+ chongqingLocationsList: null,
+ sector12LocationsList: null,
+ newTokyoLocationsList: null,
+ ishimaLocationsList: null,
+ volhavenLocationsList: null,
+
+ displayWorldInfo: function() {
+ Engine.aevumLocationsList.style.display = "none";
+ Engine.chongqingLocationsList.style.display = "none";
+ Engine.sector12LocationsList.style.display = "none";
+ Engine.newTokyoLocationsList.style.display = "none";
+ Engine.ishimaLocationsList.style.display = "none";
+ Engine.volhavenLocationsList.style.display = "none";
+
+ document.getElementById("world-city-name").innerHTML = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].city;
+ var cityDesc = document.getElementById("world-city-desc"); //TODO
+ switch(__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].city) {
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Aevum:
+ Engine.aevumLocationsList.style.display = "inline";
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Chongqing:
+ Engine.chongqingLocationsList.style.display = "inline";
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Sector12:
+ Engine.sector12LocationsList.style.display = "inline";
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].NewTokyo:
+ Engine.newTokyoLocationsList.style.display = "inline";
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Ishima:
+ Engine.ishimaLocationsList.style.display = "inline";
+ break;
+ case __WEBPACK_IMPORTED_MODULE_13__Location_js__["a" /* Locations */].Volhaven:
+ Engine.volhavenLocationsList.style.display = "inline";
+ break;
+ default:
+ console.log("Invalid city value in Player object!");
+ break;
+ }
+
+ document.getElementById("generic-locations-list").style.display = "inline";
+ },
+
+ displayFactionsInfo: function() {
+ //Clear the list of joined factions
+ var factionsList = document.getElementById("factions-list");
+ while (factionsList.firstChild) {
+ factionsList.removeChild(factionsList.firstChild);
+ }
+
+ //Re-add a link for each faction you are a member of
+ for (var i = 0; i < __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].factions.length; ++i) {
+ (function () {
+ var factionName = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].factions[i];
+
+ //Add the faction to the Factions page content
+ var item = document.createElement("li");
+ var aElem = document.createElement("a");
+ aElem.setAttribute("class", "a-link-button");
+ aElem.innerHTML = factionName;
+ aElem.addEventListener("click", function() {
+ Engine.loadFactionContent();
+ Object(__WEBPACK_IMPORTED_MODULE_12__Faction_js__["c" /* displayFactionContent */])(factionName);
+ return false;
+ });
+ item.appendChild(aElem);
+ factionsList.appendChild(item);
+ }()); //Immediate invocation
+ }
+
+ //Clear the list of invitations
+ var invitationsList = document.getElementById("outstanding-faction-invitations-list");
+ while (invitationsList.firstChild) {
+ invitationsList.removeChild(invitationsList.firstChild);
+ }
+
+ //Add a link to accept for each faction you have invitiations for
+ for (var i = 0; i < __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].factionInvitations.length; ++i) {
+ (function () {
+ var factionName = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].factionInvitations[i];
+
+ var item = document.createElement("li");
+
+ var pElem = document.createElement("p");
+ pElem.innerText = factionName;
+ pElem.style.display = "inline";
+ pElem.style.margin = "4px";
+ pElem.style.padding = "4px";
+
+ var aElem = document.createElement("a");
+ aElem.innerText = "Accept Faction Invitation";
+ aElem.setAttribute("class", "a-link-button");
+ aElem.style.display = "inline";
+ aElem.style.margin = "4px";
+ aElem.style.padding = "4px";
+ aElem.addEventListener("click", function() {
+ Object(__WEBPACK_IMPORTED_MODULE_12__Faction_js__["h" /* joinFaction */])(__WEBPACK_IMPORTED_MODULE_12__Faction_js__["b" /* Factions */][factionName]);
+ for (var i = 0; i < __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].factionInvitations.length; ++i) {
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].factionInvitations[i] == factionName) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].factionInvitations.splice(i, 1);
+ break;
+ }
+ }
+ Engine.displayFactionsInfo();
+ return false;
+ });
+
+ item.appendChild(pElem);
+ item.appendChild(aElem);
+ item.style.margin = "6px";
+ item.style.padding = "6px";
+ invitationsList.appendChild(item);
+ }());
+ }
+ },
+
+ displayAugmentationsContent: function() {
+ //Purchased/queued augmentations
+ var queuedAugmentationsList = document.getElementById("queued-augmentations-list");
+
+ while (queuedAugmentationsList.firstChild) {
+ queuedAugmentationsList.removeChild(queuedAugmentationsList.firstChild);
+ }
+
+ for (var i = 0; i < __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].queuedAugmentations.length; ++i) {
+ var augName = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].queuedAugmentations[i].name;
+ var aug = __WEBPACK_IMPORTED_MODULE_7__Augmentations_js__["c" /* Augmentations */][augName];
+
+ var item = document.createElement("li");
+ var hElem = document.createElement("h2");
+ var pElem = document.createElement("p");
+
+ item.setAttribute("class", "installed-augmentation");
+ hElem.innerHTML = augName;
+ if (augName == __WEBPACK_IMPORTED_MODULE_7__Augmentations_js__["b" /* AugmentationNames */].NeuroFluxGovernor) {
+ hElem.innerHTML += " - Level " + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].queuedAugmentations[i].level);
+ }
+ pElem.innerHTML = aug.info;
+
+ item.appendChild(hElem);
+ item.appendChild(pElem);
+
+ queuedAugmentationsList.appendChild(item);
+ }
+
+ //Install Augmentations button
+ var installButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("install-augmentations-button");
+ installButton.addEventListener("click", function() {
+ Object(__WEBPACK_IMPORTED_MODULE_7__Augmentations_js__["h" /* installAugmentations */])();
+ return false;
+ });
+
+ //Installed augmentations
+ var augmentationsList = document.getElementById("augmentations-list");
+
+ while (augmentationsList.firstChild) {
+ augmentationsList.removeChild(augmentationsList.firstChild);
+ }
+
+ //Source Files - Temporary...Will probably put in a separate pane Later
+ for (var i = 0; i < __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].sourceFiles.length; ++i) {
+ var srcFileKey = "SourceFile" + __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].sourceFiles[i].n;
+ var sourceFileObject = __WEBPACK_IMPORTED_MODULE_28__SourceFile_js__["b" /* SourceFiles */][srcFileKey];
+ if (sourceFileObject == null) {
+ console.log("ERROR: Invalid source file number: " + __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].sourceFiles[i].n);
+ continue;
+ }
+ var item = document.createElement("li");
+ var hElem = document.createElement("h2");
+ var pElem = document.createElement("p");
+
+ item.setAttribute("class", "installed-augmentation");
+ hElem.innerHTML = sourceFileObject.name + " ";
+ hElem.innerHTML += "Level " + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].sourceFiles[i].lvl) + " / 3";
+ pElem.innerHTML = sourceFileObject.info;
+
+ item.appendChild(hElem);
+ item.appendChild(pElem);
+
+ augmentationsList.appendChild(item);
+ }
+
+ for (var i = 0; i < __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].augmentations.length; ++i) {
+ var augName = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].augmentations[i].name;
+ var aug = __WEBPACK_IMPORTED_MODULE_7__Augmentations_js__["c" /* Augmentations */][augName];
+
+ var item = document.createElement("li");
+ var hElem = document.createElement("h2");
+ var pElem = document.createElement("p");
+
+ item.setAttribute("class", "installed-augmentation");
+ hElem.innerHTML = augName;
+ if (augName == __WEBPACK_IMPORTED_MODULE_7__Augmentations_js__["b" /* AugmentationNames */].NeuroFluxGovernor) {
+ hElem.innerHTML += " - Level " + (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].augmentations[i].level);
+ }
+ pElem.innerHTML = aug.info;
+
+ item.appendChild(hElem);
+ item.appendChild(pElem);
+
+ augmentationsList.appendChild(item);
+ }
+ },
+
+ displayTutorialContent: function() {
+ document.getElementById("tutorial-getting-started-link").style.display = "block";
+ Engine.Clickables.tutorialNetworkingButton.style.display = "block";
+ Engine.Clickables.tutorialHackingButton.style.display = "block";
+ Engine.Clickables.tutorialScriptsButton.style.display = "block";
+ Engine.Clickables.tutorialNetscriptButton.style.display = "block";
+ Engine.Clickables.tutorialTravelingButton.style.display = "block";
+ Engine.Clickables.tutorialCompaniesButton.style.display = "block";
+ Engine.Clickables.tutorialFactionsButton.style.display = "block";
+ Engine.Clickables.tutorialAugmentationsButton.style.display = "block";
+ document.getElementById("tutorial-shortcuts-link").style.display = "block";
+
+ Engine.Clickables.tutorialBackButton.style.display = "none";
+ document.getElementById("tutorial-text").style.display = "none";
+ },
+
+ //Displays the text when a section of the Tutorial is opened
+ displayTutorialPage: function(text) {
+ document.getElementById("tutorial-getting-started-link").style.display = "none";
+ Engine.Clickables.tutorialNetworkingButton.style.display = "none";
+ Engine.Clickables.tutorialHackingButton.style.display = "none";
+ Engine.Clickables.tutorialScriptsButton.style.display = "none";
+ Engine.Clickables.tutorialNetscriptButton.style.display = "none";
+ Engine.Clickables.tutorialTravelingButton.style.display = "none";
+ Engine.Clickables.tutorialCompaniesButton.style.display = "none";
+ Engine.Clickables.tutorialFactionsButton.style.display = "none";
+ Engine.Clickables.tutorialAugmentationsButton.style.display = "none";
+ document.getElementById("tutorial-shortcuts-link").style.display = "none";
+
+ Engine.Clickables.tutorialBackButton.style.display = "inline-block";
+ document.getElementById("tutorial-text").style.display = "block";
+ document.getElementById("tutorial-text").innerHTML = text;
+ },
+
+ /* Main Event Loop */
+ idleTimer: function() {
+ //Get time difference
+ var _thisUpdate = new Date().getTime();
+ var diff = _thisUpdate - Engine._lastUpdate;
+ var offset = diff % Engine._idleSpeed;
+
+ //Divide this by cycle time to determine how many cycles have elapsed since last update
+ diff = Math.floor(diff / Engine._idleSpeed);
+
+ if (diff > 0) {
+ //Update the game engine by the calculated number of cycles
+ Engine._lastUpdate = _thisUpdate - offset;
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].lastUpdate = _thisUpdate - offset;
+ Engine.updateGame(diff);
+ }
+
+ window.requestAnimationFrame(Engine.idleTimer);
+ },
+
+ updateGame: function(numCycles = 1) {
+ //Update total playtime
+ var time = numCycles * Engine._idleSpeed;
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].totalPlaytime == null) {__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].totalPlaytime = 0;}
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].playtimeSinceLastAug == null) {__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].playtimeSinceLastAug = 0;}
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].totalPlaytime += time;
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].playtimeSinceLastAug += time;
+
+ //Start Manual hack
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].startAction == true) {
+ Engine._totalActionTime = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].actionTime;
+ Engine._actionTimeLeft = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].actionTime;
+ Engine._actionInProgress = true;
+ Engine._actionProgressBarCount = 1;
+ Engine._actionProgressStr = "[ ]";
+ Engine._actionTimeStr = "Time left: ";
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].startAction = false;
+ }
+
+ //Working
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].isWorking) {
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeFaction) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workForFaction(numCycles);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeCreateProgram) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].createProgramWork(numCycles);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeStudyClass) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].takeClass(numCycles);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeCrime) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].commitCrime(numCycles);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeCompanyPartTime) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workPartTime(numCycles);
+ } else {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].work(numCycles);
+ }
+ }
+
+ //Gang, if applicable
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].bitNodeN == 2 && __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].inGang()) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].gang.process(numCycles);
+ }
+
+ //Counters
+ Engine.decrementAllCounters(numCycles);
+ Engine.checkCounters();
+
+ //Manual hacks
+ if (Engine._actionInProgress == true) {
+ Engine.updateHackProgress(numCycles);
+ }
+
+ //Update the running time of all active scripts
+ Object(__WEBPACK_IMPORTED_MODULE_20__NetscriptWorker_js__["g" /* updateOnlineScriptTimes */])(numCycles);
+
+ //Hacknet Nodes
+ Object(__WEBPACK_IMPORTED_MODULE_15__HacknetNode_js__["c" /* processAllHacknetNodeEarnings */])(numCycles);
+ },
+
+ //Counters for the main event loop. Represent the number of game cycles are required
+ //for something to happen.
+ Counters: {
+ autoSaveCounter: 300, //Autosave every minute
+ updateSkillLevelsCounter: 10, //Only update skill levels every 2 seconds. Might improve performance
+ updateDisplays: 3, //Update displays such as Active Scripts display and character display
+ updateDisplaysMed: 9,
+ updateDisplaysLong: 15,
+ createProgramNotifications: 10, //Checks whether any programs can be created and notifies
+ checkFactionInvitations: 100, //Check whether you qualify for any faction invitations
+ passiveFactionGrowth: 600,
+ messages: 150,
+ stockTick: 30, //Update stock prices
+ sCr: 1500,
+ updateScriptEditorDisplay: 5,
+ },
+
+ decrementAllCounters: function(numCycles = 1) {
+ for (var counter in Engine.Counters) {
+ if (Engine.Counters.hasOwnProperty(counter)) {
+ Engine.Counters[counter] = Engine.Counters[counter] - numCycles;
+ }
+ }
+ },
+
+ //Checks if any counters are 0 and if they are, executes whatever
+ //is necessary and then resets the counter
+ checkCounters: function() {
+ if (Engine.Counters.autoSaveCounter <= 0) {
+ __WEBPACK_IMPORTED_MODULE_24__SaveObject_js__["b" /* saveObject */].saveGame();
+ Engine.Counters.autoSaveCounter = 300;
+ }
+
+ if (Engine.Counters.updateSkillLevelsCounter <= 0) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].updateSkillLevels();
+ Engine.Counters.updateSkillLevelsCounter = 10;
+ }
+
+ if (Engine.Counters.updateDisplays <= 0) {
+ Engine.displayCharacterOverviewInfo();
+ if (Engine.currentPage == Engine.Page.CharacterInfo) {
+ Engine.displayCharacterInfo();
+ } else if (Engine.currentPage == Engine.Page.HacknetNodes) {
+ Object(__WEBPACK_IMPORTED_MODULE_15__HacknetNode_js__["e" /* updateHacknetNodesContent */])();
+ } else if (Engine.currentPage == Engine.Page.CreateProgram) {
+ Object(__WEBPACK_IMPORTED_MODULE_11__CreateProgram_js__["b" /* displayCreateProgramContent */])();
+ }
+
+ if (__WEBPACK_IMPORTED_MODULE_5__utils_LogBox_js__["b" /* logBoxOpened */]) {
+ Object(__WEBPACK_IMPORTED_MODULE_5__utils_LogBox_js__["c" /* logBoxUpdateText */])();
+ }
+
+ Engine.Counters.updateDisplays = 3;
+ }
+
+ if (Engine.Counters.updateDisplaysMed <= 0) {
+ if (Engine.currentPage == Engine.Page.ActiveScripts) {
+ Object(__WEBPACK_IMPORTED_MODULE_6__ActiveScriptsUI_js__["d" /* updateActiveScriptsItems */])();
+ }
+ Engine.Counters.updateDisplaysMed = 9;
+ }
+
+ if (Engine.Counters.updateDisplaysLong <= 0) {
+ if (Engine.currentPage === Engine.Page.Gang) {
+ Object(__WEBPACK_IMPORTED_MODULE_14__Gang_js__["e" /* updateGangContent */])();
+ }
+ Engine.Counters.updateDisplaysLong = 15;
+ }
+
+ if (Engine.Counters.createProgramNotifications <= 0) {
+ var num = Object(__WEBPACK_IMPORTED_MODULE_11__CreateProgram_js__["c" /* getNumAvailableCreateProgram */])();
+ var elem = document.getElementById("create-program-notification");
+ if (num > 0) {
+ elem.innerHTML = num;
+ elem.setAttribute("class", "notification-on");
+ } else {
+ elem.innerHTML = "";
+ elem.setAttribute("class", "notification-off");
+ }
+ Engine.Counters.createProgramNotifications = 10;
+ }
+
+ if (Engine.Counters.checkFactionInvitations <= 0) {
+ var invitedFactions = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].checkForFactionInvitations();
+ if (invitedFactions.length > 0) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].firstFacInvRecvd = true;
+ var randFaction = invitedFactions[Math.floor(Math.random() * invitedFactions.length)];
+ Object(__WEBPACK_IMPORTED_MODULE_12__Faction_js__["g" /* inviteToFaction */])(randFaction);
+ }
+ Engine.Counters.checkFactionInvitations = 100;
+ }
+
+ if (Engine.Counters.passiveFactionGrowth <= 0) {
+ var adjustedCycles = Math.floor((600 - Engine.Counters.passiveFactionGrowth));
+ Object(__WEBPACK_IMPORTED_MODULE_12__Faction_js__["j" /* processPassiveFactionRepGain */])(adjustedCycles);
+ Engine.Counters.passiveFactionGrowth = 600;
+ }
+
+ if (Engine.Counters.messages <= 0) {
+ Object(__WEBPACK_IMPORTED_MODULE_18__Message_js__["c" /* checkForMessagesToSend */])();
+ Engine.Counters.messages = 150;
+ }
+
+ if (Engine.Counters.stockTick <= 0) {
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hasWseAccount) {
+ Object(__WEBPACK_IMPORTED_MODULE_30__StockMarket_js__["k" /* updateStockPrices */])();
+ }
+ Engine.Counters.stockTick = 30;
+ }
+
+ if (Engine.Counters.sCr <= 0) {
+ //Assume 4Sig will always indicate state of market
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hasWseAccount) {
+ Object(__WEBPACK_IMPORTED_MODULE_30__StockMarket_js__["i" /* stockMarketCycle */])();
+ }
+ Engine.Counters.sCr = 1500;
+ }
+
+ if (Engine.Counters.updateScriptEditorDisplay <= 0) {
+ if (Engine.currentPage == Engine.Page.ScriptEditor) {
+ Object(__WEBPACK_IMPORTED_MODULE_25__Script_js__["f" /* updateScriptEditorContent */])();
+ }
+ Engine.Counters.updateScriptEditorDisplay = 5;
+ }
+ },
+
+ /* Calculates the hack progress for a manual (non-scripted) hack and updates the progress bar/time accordingly */
+ _totalActionTime: 0,
+ _actionTimeLeft: 0,
+ _actionTimeStr: "Time left: ",
+ _actionProgressStr: "[ ]",
+ _actionProgressBarCount: 1,
+ _actionInProgress: false,
+ updateHackProgress: function(numCycles = 1) {
+ var timeElapsedMilli = numCycles * Engine._idleSpeed;
+ Engine._actionTimeLeft -= (timeElapsedMilli/ 1000); //Substract idle speed (ms)
+ Engine._actionTimeLeft = Math.max(Engine._actionTimeLeft, 0);
+
+ //Calculate percent filled
+ var percent = Math.round((1 - Engine._actionTimeLeft / Engine._totalActionTime) * 100);
+
+ //Update progress bar
+ while (Engine._actionProgressBarCount * 2 <= percent) {
+ Engine._actionProgressStr = Engine._actionProgressStr.replaceAt(Engine._actionProgressBarCount, "|");
+ Engine._actionProgressBarCount += 1;
+ }
+
+ //Update hack time remaining
+ Engine._actionTimeStr = "Time left: " + Math.max(0, Math.round(Engine._actionTimeLeft)).toString() + "s";
+ document.getElementById("hack-progress").innerHTML = Engine._actionTimeStr;
+
+ //Dynamically update progress bar
+ document.getElementById("hack-progress-bar").innerHTML = Engine._actionProgressStr.replace( / /g, " " );
+
+ //Once percent is 100, the hack is completed
+ if (percent >= 100) {
+ Engine._actionInProgress = false;
+ __WEBPACK_IMPORTED_MODULE_31__Terminal_js__["a" /* Terminal */].finishAction();
+ }
+ },
+
+ _prevTimeout: null,
+ createStatusText: function(txt) {
+ if (Engine._prevTimeout != null) {
+ clearTimeout(Engine._prevTimeout);
+ Engine._prevTimeout = null;
+ }
+ var statusText = document.getElementById("status-text")
+ statusText.style.display = "inline-block";
+ statusText.setAttribute("class", "status-text");
+ statusText.innerHTML = txt;
+ Engine._prevTimeout = setTimeout(function() {
+ statusText.style.display = "none";
+ statusText.removeAttribute("class");
+ statusText.innerHTML = "";
+ }, 3000);
+ },
+
+ removeLoadingScreen: function() {
+ var loader = document.getElementById("loader");
+ if (!loader) {return;}
+ while(loader.firstChild) {
+ loader.removeChild(loader.firstChild);
+ }
+ loader.parentNode.removeChild(loader);
+ document.getElementById("entire-game-container").style.visibility = "visible";
+ },
+
+ load: function() {
+ //Load script editor
+ var editor = ace.edit('javascript-editor');
+ editor.getSession().setMode('ace/mode/javascript');
+ editor.setTheme('ace/theme/monokai');
+ document.getElementById('javascript-editor').style.fontSize='16px';
+ editor.setOption("showPrintMargin", false);
+
+ //Initialize main menu accordion panels to all start as "open"
+ var terminal = document.getElementById("terminal-tab");
+ var createScript = document.getElementById("create-script-tab");
+ var activeScripts = document.getElementById("active-scripts-tab");
+ var createProgram = document.getElementById("create-program-tab");
+ var stats = document.getElementById("stats-tab");
+ var factions = document.getElementById("factions-tab");
+ var augmentations = document.getElementById("augmentations-tab");
+ var hacknetnodes = document.getElementById("hacknet-nodes-tab");
+ var city = document.getElementById("city-tab");
+ var travel = document.getElementById("travel-tab");
+ var job = document.getElementById("job-tab");
+ var tutorial = document.getElementById("tutorial-tab");
+ var options = document.getElementById("options-tab");
+
+ //Load game from save or create new game
+ if (Object(__WEBPACK_IMPORTED_MODULE_24__SaveObject_js__["a" /* loadGame */])(__WEBPACK_IMPORTED_MODULE_24__SaveObject_js__["b" /* saveObject */])) {
+ console.log("Loaded game from save");
+ Object(__WEBPACK_IMPORTED_MODULE_8__BitNode_js__["d" /* initBitNodes */])();
+ Object(__WEBPACK_IMPORTED_MODULE_8__BitNode_js__["c" /* initBitNodeMultipliers */])();
+ Object(__WEBPACK_IMPORTED_MODULE_28__SourceFile_js__["d" /* initSourceFiles */])();
+ Engine.setDisplayElements(); //Sets variables for important DOM elements
+ Engine.init(); //Initialize buttons, work, etc.
+ __WEBPACK_IMPORTED_MODULE_9__Company_js__["d" /* CompanyPositions */].init();
+ Object(__WEBPACK_IMPORTED_MODULE_7__Augmentations_js__["g" /* initAugmentations */])(); //Also calls Player.reapplyAllAugmentations()
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].reapplyAllSourceFiles();
+ Object(__WEBPACK_IMPORTED_MODULE_30__StockMarket_js__["e" /* initStockSymbols */])();
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].hasWseAccount) {
+ Object(__WEBPACK_IMPORTED_MODULE_30__StockMarket_js__["f" /* initSymbolToStockMap */])();
+ }
+ Object(__WEBPACK_IMPORTED_MODULE_17__Literature_js__["a" /* initLiterature */])();
+ Object(__WEBPACK_IMPORTED_MODULE_19__NetscriptFunctions_js__["c" /* initSingularitySFFlags */])();
+
+ //Calculate the number of cycles have elapsed while offline
+ Engine._lastUpdate = new Date().getTime();
+ var lastUpdate = __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].lastUpdate;
+ var numCyclesOffline = Math.floor((Engine._lastUpdate - lastUpdate) / Engine._idleSpeed);
+
+ /* Process offline progress */
+ var offlineProductionFromScripts = Object(__WEBPACK_IMPORTED_MODULE_25__Script_js__["e" /* loadAllRunningScripts */])(); //This also takes care of offline production for those scripts
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].isWorking) {
+ console.log("work() called in load() for " + numCyclesOffline * Engine._idleSpeed + " milliseconds");
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeFaction) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workForFaction(numCyclesOffline);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeCreateProgram) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].createProgramWork(numCyclesOffline);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeStudyClass) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].takeClass(numCyclesOffline);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeCrime) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].commitCrime(numCyclesOffline);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeCompanyPartTime) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workPartTime(numCyclesOffline);
+ } else {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].work(numCyclesOffline);
+ }
+ }
+
+ //Hacknet Nodes offline progress
+ var offlineProductionFromHacknetNodes = Object(__WEBPACK_IMPORTED_MODULE_15__HacknetNode_js__["c" /* processAllHacknetNodeEarnings */])(numCyclesOffline);
+
+ //Passive faction rep gain offline
+ Object(__WEBPACK_IMPORTED_MODULE_12__Faction_js__["j" /* processPassiveFactionRepGain */])(numCyclesOffline);
+
+ //Gang progress for BitNode 2
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].bitNodeN != null && __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].bitNodeN == 2 && __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].inGang()) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].gang.process(numCyclesOffline);
+ }
+
+ //Update total playtime
+ var time = numCyclesOffline * Engine._idleSpeed;
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].totalPlaytime == null) {__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].totalPlaytime = 0;}
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].playtimeSinceLastAug == null) {__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].playtimeSinceLastAug = 0;}
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].totalPlaytime += time;
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].playtimeSinceLastAug += time;
+
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].lastUpdate = Engine._lastUpdate;
+ Engine.start(); //Run main game loop and Scripts loop
+ Engine.removeLoadingScreen();
+ Object(__WEBPACK_IMPORTED_MODULE_0__utils_DialogBox_js__["a" /* dialogBoxCreate */])("While you were offline, your scripts generated $" +
+ Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(offlineProductionFromScripts, 2) + " and your Hacknet Nodes generated $" +
+ Object(__WEBPACK_IMPORTED_MODULE_4__utils_StringHelperFunctions_js__["c" /* formatNumber */])(offlineProductionFromHacknetNodes, 2));
+ //Close main menu accordions for loaded game
+ terminal.style.maxHeight = null;
+ terminal.style.opacity = 0;
+ terminal.style.pointerEvents = "none";
+ createScript.style.maxHeight = null;
+ createScript.style.opacity = 0;
+ createScript.style.pointerEvents = "none";
+ activeScripts.style.maxHeight = null;
+ activeScripts.style.opacity = 0;
+ activeScripts.style.pointerEvents = "none";
+ createProgram.style.maxHeight = null;
+ createProgram.style.opacity = 0;
+ createProgram.style.pointerEvents = "none";
+ stats.style.maxHeight = null;
+ stats.style.opacity = 0;
+ stats.style.pointerEvents = "none";
+ factions.style.maxHeight = null;
+ factions.style.opacity = 0;
+ factions.style.pointerEvents = "none";
+ augmentations.style.maxHeight = null;
+ augmentations.style.opacity = 0;
+ augmentations.style.pointerEvents = "none";
+ hacknetnodes.style.maxHeight = null;
+ hacknetnodes.style.opacity = 0;
+ hacknetnodes.style.pointerEvents = "none";
+ city.style.maxHeight = null;
+ city.style.opacity = 0;
+ city.style.pointerEvents = "none";
+ travel.style.maxHeight = null;
+ travel.style.opacity = 0;
+ travel.style.pointerEvents = "none";
+ job.style.maxHeight = null;
+ job.style.opacity = 0;
+ job.style.pointerEvents = "none";
+ tutorial.style.maxHeight = null;
+ tutorial.style.opacity = 0;
+ tutorial.style.pointerEvents = "none";
+ options.style.maxHeight = null;
+ options.style.opacity = 0;
+ options.style.pointerEvents = "none";
+ } else {
+ //No save found, start new game
+ console.log("Initializing new game");
+ Object(__WEBPACK_IMPORTED_MODULE_8__BitNode_js__["d" /* initBitNodes */])();
+ Object(__WEBPACK_IMPORTED_MODULE_8__BitNode_js__["c" /* initBitNodeMultipliers */])();
+ Object(__WEBPACK_IMPORTED_MODULE_28__SourceFile_js__["d" /* initSourceFiles */])();
+ Object(__WEBPACK_IMPORTED_MODULE_29__SpecialServerIps_js__["c" /* initSpecialServerIps */])();
+ Engine.setDisplayElements(); //Sets variables for important DOM elements
+ Engine.start(); //Run main game loop and Scripts loop
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].init();
+ Object(__WEBPACK_IMPORTED_MODULE_26__Server_js__["f" /* initForeignServers */])();
+ Object(__WEBPACK_IMPORTED_MODULE_9__Company_js__["h" /* initCompanies */])();
+ Object(__WEBPACK_IMPORTED_MODULE_12__Faction_js__["f" /* initFactions */])();
+ __WEBPACK_IMPORTED_MODULE_9__Company_js__["d" /* CompanyPositions */].init();
+ Object(__WEBPACK_IMPORTED_MODULE_7__Augmentations_js__["g" /* initAugmentations */])();
+ Object(__WEBPACK_IMPORTED_MODULE_18__Message_js__["d" /* initMessages */])();
+ Object(__WEBPACK_IMPORTED_MODULE_30__StockMarket_js__["e" /* initStockSymbols */])();
+ Object(__WEBPACK_IMPORTED_MODULE_17__Literature_js__["a" /* initLiterature */])();
+ Object(__WEBPACK_IMPORTED_MODULE_19__NetscriptFunctions_js__["c" /* initSingularitySFFlags */])();
+
+ //Open main menu accordions for new game
+ //Main menu accordions
+ var hackingHdr = document.getElementById("hacking-menu-header");
+ hackingHdr.classList.toggle("opened");
+ var characterHdr = document.getElementById("character-menu-header");
+ characterHdr.classList.toggle("opened");
+ var worldHdr = document.getElementById("world-menu-header");
+ worldHdr.classList.toggle("opened");
+ var helpHdr = document.getElementById("help-menu-header");
+ helpHdr.classList.toggle("opened");
+ terminal.style.maxHeight = terminal.scrollHeight + "px";
+ terminal.style.display = "block";
+ createScript.style.maxHeight = createScript.scrollHeight + "px";
+ createScript.style.display = "block";
+ activeScripts.style.maxHeight = activeScripts.scrollHeight + "px";
+ activeScripts.style.display = "block";
+ createProgram.style.maxHeight = createProgram.scrollHeight + "px";
+ createProgram.style.display = "block";
+ stats.style.maxHeight = stats.scrollHeight + "px";
+ stats.style.display = "block";
+ factions.style.maxHeight = factions.scrollHeight + "px";
+ factions.style.display = "block";
+ augmentations.style.maxHeight = augmentations.scrollHeight + "px";
+ augmentations.style.display = "block";
+ hacknetnodes.style.maxHeight = hacknetnodes.scrollHeight + "px";
+ hacknetnodes.style.display = "block";
+ city.style.maxHeight = city.scrollHeight + "px";
+ city.style.display = "block";
+ travel.style.maxHeight = travel.scrollHeight + "px";
+ travel.style.display = "block";
+ job.style.maxHeight = job.scrollHeight + "px";
+ job.style.display = "block";
+ tutorial.style.maxHeight = tutorial.scrollHeight + "px";
+ tutorial.style.display = "block";
+ options.style.maxHeight = options.scrollHeight + "px";
+ options.style.display = "block";
+
+ //Start interactive tutorial
+ Object(__WEBPACK_IMPORTED_MODULE_16__InteractiveTutorial_js__["d" /* iTutorialStart */])();
+ Engine.removeLoadingScreen();
+ }
+ //Initialize labels on game settings
+ Object(__WEBPACK_IMPORTED_MODULE_27__Settings_js__["d" /* setSettingsLabels */])();
+ },
+
+ setDisplayElements: function() {
+ //Content elements
+ Engine.Display.terminalContent = document.getElementById("terminal-container");
+ Engine.currentPage = Engine.Page.Terminal;
+
+ Engine.Display.characterContent = document.getElementById("character-container");
+ Engine.Display.characterContent.style.visibility = "hidden";
+
+ Engine.Display.scriptEditorContent = document.getElementById("script-editor-container");
+ Engine.Display.scriptEditorContent.style.visibility = "hidden";
+
+ Engine.Display.activeScriptsContent = document.getElementById("active-scripts-container");
+ Engine.Display.activeScriptsContent.style.visibility = "hidden";
+
+ Engine.Display.hacknetNodesContent = document.getElementById("hacknet-nodes-container");
+ Engine.Display.hacknetNodesContent.style.visibility = "hidden";
+
+ Engine.Display.worldContent = document.getElementById("world-container");
+ Engine.Display.worldContent.style.visibility = "hidden";
+
+ Engine.Display.createProgramContent = document.getElementById("create-program-container");
+ Engine.Display.createProgramContent.style.visibility = "hidden";
+
+ Engine.Display.factionsContent = document.getElementById("factions-container");
+ Engine.Display.factionsContent.style.visibility = "hidden";
+
+
+ Engine.Display.factionContent = document.getElementById("faction-container");
+ Engine.Display.factionContent.style.visibility = "hidden";
+
+ Engine.Display.factionAugmentationsContent = document.getElementById("faction-augmentations-container");
+ Engine.Display.factionAugmentationsContent.style.visibility = "hidden";
+
+ Engine.Display.augmentationsContent = document.getElementById("augmentations-container");
+ Engine.Display.augmentationsContent.style.visibility = "hidden";
+
+ Engine.Display.tutorialContent = document.getElementById("tutorial-container");
+ Engine.Display.tutorialContent.style.visibility = "hidden";
+
+ Engine.Display.infiltrationContent = document.getElementById("infiltration-container");
+ Engine.Display.infiltrationContent.style.visibility = "hidden";
+
+ Engine.Display.stockMarketContent = document.getElementById("stock-market-container");
+ Engine.Display.stockMarketContent.style.visibility = "hidden";
+
+
+ //Character info
+ Engine.Display.characterInfo = document.getElementById("character-info");
+
+ //Location lists
+ Engine.aevumLocationsList = document.getElementById("aevum-locations-list");
+ Engine.chongqingLocationsList = document.getElementById("chongqing-locations-list");
+ Engine.sector12LocationsList = document.getElementById("sector12-locations-list");
+ Engine.newTokyoLocationsList = document.getElementById("newtokyo-locations-list");
+ Engine.ishimaLocationsList = document.getElementById("ishima-locations-list");
+ Engine.volhavenLocationsList = document.getElementById("volhaven-locations-list");
+
+ //Location page (page that shows up when you visit a specific location in World)
+ Engine.Display.locationContent = document.getElementById("location-container");
+ Engine.Display.locationContent.style.visibility = "hidden";
+
+ //Work In Progress
+ Engine.Display.workInProgressContent = document.getElementById("work-in-progress-container");
+ Engine.Display.workInProgressContent.style.visibility = "hidden";
+
+ //Red Pill / Hack World Daemon
+ Engine.Display.redPillContent = document.getElementById("red-pill-container");
+ Engine.Display.redPillContent.style.visibility = "hidden";
+
+ //Init Location buttons
+ Object(__WEBPACK_IMPORTED_MODULE_13__Location_js__["c" /* initLocationButtons */])();
+
+ //Tutorial buttons
+ Engine.Clickables.tutorialNetworkingButton = document.getElementById("tutorial-networking-link");
+ Engine.Clickables.tutorialNetworkingButton.addEventListener("click", function() {
+ Engine.displayTutorialPage(__WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialNetworkingText);
+ });
+
+ Engine.Clickables.tutorialHackingButton = document.getElementById("tutorial-hacking-link");
+ Engine.Clickables.tutorialHackingButton.addEventListener("click", function() {
+ Engine.displayTutorialPage(__WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialHackingText);
+ });
+
+ Engine.Clickables.tutorialScriptsButton = document.getElementById("tutorial-scripts-link");
+ Engine.Clickables.tutorialScriptsButton.addEventListener("click", function() {
+ Engine.displayTutorialPage(__WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialScriptsText);
+ });
+
+ Engine.Clickables.tutorialNetscriptButton = document.getElementById("tutorial-netscript-link");
+ Engine.Clickables.tutorialNetscriptButton.addEventListener("click", function() {
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].bitNodeN === 4 || __WEBPACK_IMPORTED_MODULE_19__NetscriptFunctions_js__["b" /* hasSingularitySF */]) {
+ Engine.displayTutorialPage(__WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialNetscriptText + __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialSingularityFunctionsText);
+ } else {
+ Engine.displayTutorialPage(__WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialNetscriptText);
+ }
+
+ });
+
+ Engine.Clickables.tutorialTravelingButton = document.getElementById("tutorial-traveling-link");
+ Engine.Clickables.tutorialTravelingButton.addEventListener("click", function() {
+ Engine.displayTutorialPage(__WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialTravelingText);
+ });
+
+ Engine.Clickables.tutorialCompaniesButton = document.getElementById("tutorial-jobs-link");
+ Engine.Clickables.tutorialCompaniesButton.addEventListener("click", function() {
+ Engine.displayTutorialPage(__WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialCompaniesText);
+ });
+
+ Engine.Clickables.tutorialFactionsButton = document.getElementById("tutorial-factions-link");
+ Engine.Clickables.tutorialFactionsButton.addEventListener("click", function() {
+ Engine.displayTutorialPage(__WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialFactionsText);
+ });
+
+ Engine.Clickables.tutorialAugmentationsButton = document.getElementById("tutorial-augmentations-link");
+ Engine.Clickables.tutorialAugmentationsButton.addEventListener("click", function() {
+ Engine.displayTutorialPage(__WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].TutorialAugmentationsText);
+ });
+
+ Engine.Clickables.tutorialBackButton = document.getElementById("tutorial-back-button");
+ Engine.Clickables.tutorialBackButton.addEventListener("click", function() {
+ Engine.displayTutorialContent();
+ });
+
+ //If DarkWeb already purchased, disable the button
+ if (__WEBPACK_IMPORTED_MODULE_29__SpecialServerIps_js__["a" /* SpecialServerIps */].hasOwnProperty("Darkweb Server")) {
+ document.getElementById("location-purchase-tor").setAttribute("class", "a-link-button-inactive");
+ }
+ },
+
+ /* Initialization */
+ init: function() {
+ //Import game link
+ document.getElementById("import-game-link").onclick = function() {
+ __WEBPACK_IMPORTED_MODULE_24__SaveObject_js__["b" /* saveObject */].importGame();
+ };
+
+ //Main menu accordions
+ var hackingHdr = document.getElementById("hacking-menu-header");
+ //hackingHdr.classList.toggle("opened");
+ var characterHdr = document.getElementById("character-menu-header");
+ //characterHdr.classList.toggle("opened");
+ var worldHdr = document.getElementById("world-menu-header");
+ //worldHdr.classList.toggle("opened");
+ var helpHdr = document.getElementById("help-menu-header");
+ //helpHdr.classList.toggle("opened");
+
+ hackingHdr.onclick = function() {
+ var terminal = document.getElementById("terminal-tab");
+ var terminalLink = document.getElementById("terminal-menu-link");
+ var createScript = document.getElementById("create-script-tab");
+ var createScriptLink = document.getElementById("create-script-menu-link");
+ var activeScripts = document.getElementById("active-scripts-tab");
+ var activeScriptsLink = document.getElementById("active-scripts-menu-link");
+ var createProgram = document.getElementById("create-program-tab");
+ var createProgramLink = document.getElementById("create-program-menu-link");
+ var createProgramNot = document.getElementById("create-program-notification");
+ this.classList.toggle("opened");
+ if (terminal.style.maxHeight) {
+ terminal.style.opacity = 0;
+ terminal.style.maxHeight = null;
+ terminalLink.style.opacity = 0;
+ terminalLink.style.maxHeight = null;
+ terminalLink.style.pointerEvents = "none";
+
+ createScript.style.opacity = 0;
+ createScript.style.maxHeight = null;
+ createScriptLink.style.opacity = 0;
+ createScriptLink.style.maxHeight = null;
+ createScriptLink.style.pointerEvents = "none";
+
+ activeScripts.style.opacity = 0;
+ activeScripts.style.maxHeight = null;
+ activeScriptsLink.style.opacity = 0;
+ activeScriptsLink.style.maxHeight = null;
+ activeScriptsLink.style.pointerEvents = "none";
+
+ createProgram.style.opacity = 0;
+ createProgram.style.maxHeight = null;
+ createProgramLink.style.opacity = 0;
+ createProgramLink.style.maxHeight = null;
+ createProgramLink.style.pointerEvents = "none";
+
+ createProgramNot.style.display = "none";
+ } else {
+ terminal.style.maxHeight = terminal.scrollHeight + "px";
+ terminal.style.opacity = 1;
+ terminalLink.style.maxHeight = terminalLink.scrollHeight + "px";
+ terminalLink.style.opacity = 1;
+ terminalLink.style.pointerEvents = "auto";
+
+ createScript.style.maxHeight = createScript.scrollHeight + "px";
+ createScript.style.opacity = 1;
+ createScriptLink.style.maxHeight = createScriptLink.scrollHeight + "px";
+ createScriptLink.style.opacity = 1;
+ createScriptLink.style.pointerEvents = "auto";
+
+ activeScripts.style.maxHeight = activeScripts.scrollHeight + "px";
+ activeScripts.style.opacity = 1;
+ activeScriptsLink.style.maxHeight = activeScriptsLink.scrollHeight + "px";
+ activeScriptsLink.style.opacity = 1;
+ activeScriptsLink.style.pointerEvents = "auto";
+
+ createProgram.style.maxHeight = createProgram.scrollHeight + "px";
+ createProgram.style.opacity = 1;
+ createProgramLink.style.maxHeight = createProgramLink.scrollHeight + "px";
+ createProgramLink.style.opacity = 1;
+ createProgramLink.style.pointerEvents = "auto";
+ createProgramNot.style.display = "block"
+ }
+ }
+
+ characterHdr.onclick = function() {
+ var stats = document.getElementById("stats-tab");
+ var statsLink = document.getElementById("stats-menu-link");
+ var factions = document.getElementById("factions-tab");
+ var factionsLink = document.getElementById("factions-menu-link");
+ var augmentations = document.getElementById("augmentations-tab");
+ var augmentationsLink = document.getElementById("augmentations-menu-link");
+ var hacknetnodes = document.getElementById("hacknet-nodes-tab");
+ var hacknetnodesLink = document.getElementById("hacknet-nodes-menu-link");
+ this.classList.toggle("opened");
+ if (stats.style.maxHeight) {
+ stats.style.opacity = 0;
+ stats.style.maxHeight = null;
+ statsLink.style.opacity = 0;
+ statsLink.style.maxHeight = null;
+ statsLink.style.pointerEvents = "none";
+
+ factions.style.opacity = 0;
+ factions.style.maxHeight = null;
+ factionsLink.style.opacity = 0;
+ factionsLink.style.maxHeight = null;
+ factionsLink.style.pointerEvents = "none";
+
+ augmentations.style.opacity = 0;
+ augmentations.style.maxHeight = null;
+ augmentationsLink.style.opacity = 0;
+ augmentationsLink.style.maxHeight = null;
+ augmentationsLink.style.pointerEvents = "none";
+
+ hacknetnodes.style.opacity = 0;
+ hacknetnodes.style.maxHeight = null;
+ hacknetnodesLink.style.opacity = 0;
+ hacknetnodesLink.style.maxHeight = null;
+ hacknetnodesLink.style.pointerEvents = "none";
+ } else {
+ stats.style.maxHeight = stats.scrollHeight + "px";
+ stats.style.opacity = 1;
+ statsLink.style.maxHeight = statsLink.scrollHeight + "px";
+ statsLink.style.opacity = 1;
+ statsLink.style.pointerEvents = "auto";
+
+ factions.style.maxHeight = factions.scrollHeight + "px";
+ factions.style.opacity = 1;
+ factionsLink.style.maxHeight = factionsLink.scrollHeight + "px";
+ factionsLink.style.opacity = 1;
+ factionsLink.style.pointerEvents = "auto";
+
+ augmentations.style.maxHeight = augmentations.scrollHeight + "px";
+ augmentations.style.opacity = 1;
+ augmentationsLink.style.maxHeight = augmentationsLink.scrollHeight + "px";
+ augmentationsLink.style.opacity = 1;
+ augmentationsLink.style.pointerEvents = "auto";
+
+ hacknetnodes.style.maxHeight = hacknetnodes.scrollHeight + "px";
+ hacknetnodes.style.opacity = 1;
+ hacknetnodesLink.style.maxHeight = hacknetnodesLink.scrollHeight + "px";
+ hacknetnodesLink.style.opacity = 1;
+ hacknetnodesLink.style.pointerEvents = "auto";
+ }
+ }
+
+ worldHdr.onclick = function() {
+ var city = document.getElementById("city-tab");
+ var cityLink = document.getElementById("city-menu-link");
+ var travel = document.getElementById("travel-tab");
+ var travelLink = document.getElementById("travel-menu-link");
+ var job = document.getElementById("job-tab");
+ var jobLink = document.getElementById("job-menu-link");
+ this.classList.toggle("opened");
+ if (city.style.maxHeight) {
+ city.style.opacity = 0;
+ city.style.maxHeight = null;
+ cityLink.style.opacity = 0;
+ cityLink.style.maxHeight = null;
+ cityLink.style.pointerEvents = "none";
+
+ travel.style.opacity = 0;
+ travel.style.maxHeight = null;
+ travelLink.style.opacity = 0;
+ travelLink.style.maxHeight = null;
+ travelLink.style.pointerEvents = "none";
+
+ job.style.opacity = 0;
+ job.style.maxHeight = null;
+ jobLink.style.opacity = 0;
+ jobLink.style.maxHeight = null;
+ jobLink.style.pointerEvents = "none";
+ } else {
+ city.style.maxHeight = city.scrollHeight + "px";
+ city.style.opacity = 1;
+ cityLink.style.maxHeight = cityLink.scrollHeight + "px";
+ cityLink.style.opacity = 1;
+ cityLink.style.pointerEvents = "auto";
+
+ travel.style.maxHeight = travel.scrollHeight + "px";
+ travel.style.opacity = 1;
+ travelLink.style.maxHeight = travelLink.scrollHeight + "px";
+ travelLink.style.opacity = 1;
+ travelLink.style.pointerEvents = "auto";
+
+ job.style.maxHeight = job.scrollHeight + "px";
+ job.style.opacity = 1;
+ jobLink.style.maxHeight = jobLink.scrollHeight + "px";
+ jobLink.style.opacity = 1;
+ jobLink.style.pointerEvents = "auto";
+ }
+ }
+
+ helpHdr.onclick = function() {
+ var tutorial = document.getElementById("tutorial-tab");
+ var tutorialLink = document.getElementById("tutorial-menu-link");
+ var options = document.getElementById("options-tab");
+ var optionsLink = document.getElementById("options-menu-link");
+ this.classList.toggle("opened");
+ if (tutorial.style.maxHeight) {
+ tutorial.style.opacity = 0;
+ tutorial.style.maxHeight = null;
+ tutorialLink.style.opacity = 0;
+ tutorialLink.style.maxHeight = null;
+ tutorialLink.style.pointerEvents = "none";
+
+ options.style.opacity = 0;
+ options.style.maxHeight = null;
+ optionsLink.style.opacity = 0;
+ optionsLink.style.maxHeight = null;
+ optionsLink.style.pointerEvents = "none";
+ } else {
+ tutorial.style.maxHeight = tutorial.scrollHeight + "px";
+ tutorial.style.opacity = 1;
+ tutorialLink.style.maxHeight = tutorialLink.scrollHeight + "px";
+ tutorialLink.style.opacity = 1;
+ tutorialLink.style.pointerEvents = "auto";
+
+ options.style.maxHeight = options.scrollHeight + "px";
+ options.style.opacity = 1;
+ optionsLink.style.maxHeight = optionsLink.scrollHeight + "px";
+ optionsLink.style.opacity = 1;
+ optionsLink.style.pointerEvents = "auto";
+ }
+ }
+
+ //Main menu buttons and content
+ Engine.Clickables.terminalMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("terminal-menu-link");
+ Engine.Clickables.terminalMainMenuButton.addEventListener("click", function() {
+ Engine.loadTerminalContent();
+ return false;
+ });
+
+ Engine.Clickables.characterMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("stats-menu-link");
+ Engine.Clickables.characterMainMenuButton.addEventListener("click", function() {
+ Engine.loadCharacterContent();
+ return false;
+ });
+
+ Engine.Clickables.scriptEditorMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("create-script-menu-link");
+ Engine.Clickables.scriptEditorMainMenuButton.addEventListener("click", function() {
+ Engine.loadScriptEditorContent();
+ return false;
+ });
+
+ Engine.Clickables.activeScriptsMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("active-scripts-menu-link");
+ Engine.Clickables.activeScriptsMainMenuButton.addEventListener("click", function() {
+ Engine.loadActiveScriptsContent();
+ return false;
+ });
+
+ Engine.Clickables.hacknetNodesMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("hacknet-nodes-menu-link");
+ Engine.Clickables.hacknetNodesMainMenuButton.addEventListener("click", function() {
+ Engine.loadHacknetNodesContent();
+ return false;
+ });
+
+ Engine.Clickables.worldMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("city-menu-link");
+ Engine.Clickables.worldMainMenuButton.addEventListener("click", function() {
+ Engine.loadWorldContent();
+ return false;
+ });
+
+ Engine.Clickables.travelMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("travel-menu-link");
+ Engine.Clickables.travelMainMenuButton.addEventListener("click", function() {
+ Engine.loadTravelContent();
+ return false;
+ });
+
+ Engine.Clickables.jobMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("job-menu-link");
+ Engine.Clickables.jobMainMenuButton.addEventListener("click", function() {
+ Engine.loadJobContent();
+ return false;
+ });
+
+
+ Engine.Clickables.createProgramMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("create-program-menu-link");
+ Engine.Clickables.createProgramMainMenuButton.addEventListener("click", function() {
+ Engine.loadCreateProgramContent();
+ return false;
+ });
+
+ Engine.Clickables.factionsMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("factions-menu-link");
+ Engine.Clickables.factionsMainMenuButton.addEventListener("click", function() {
+ Engine.loadFactionsContent();
+ return false;
+ });
+
+ Engine.Clickables.augmentationsMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("augmentations-menu-link");
+ Engine.Clickables.augmentationsMainMenuButton.addEventListener("click", function() {
+ Engine.loadAugmentationsContent();
+ return false;
+ });
+
+ Engine.Clickables.tutorialMainMenuButton = Object(__WEBPACK_IMPORTED_MODULE_2__utils_HelperFunctions_js__["b" /* clearEventListeners */])("tutorial-menu-link");
+ Engine.Clickables.tutorialMainMenuButton.addEventListener("click", function() {
+ Engine.loadTutorialContent();
+ return false;
+ });
+
+ //Active scripts list
+ Engine.ActiveScriptsList = document.getElementById("active-scripts-list");
+
+ //Save, Delete, Import/Export buttons
+ Engine.Clickables.saveMainMenuButton = document.getElementById("save-game-link");
+ Engine.Clickables.saveMainMenuButton.addEventListener("click", function() {
+ __WEBPACK_IMPORTED_MODULE_24__SaveObject_js__["b" /* saveObject */].saveGame();
+ return false;
+ });
+
+ Engine.Clickables.deleteMainMenuButton = document.getElementById("delete-game-link");
+ Engine.Clickables.deleteMainMenuButton.addEventListener("click", function() {
+ __WEBPACK_IMPORTED_MODULE_24__SaveObject_js__["b" /* saveObject */].deleteGame();
+ return false;
+ });
+
+ document.getElementById("export-game-link").addEventListener("click", function() {
+ __WEBPACK_IMPORTED_MODULE_24__SaveObject_js__["b" /* saveObject */].exportGame();
+ return false;
+ });
+
+ //Character Overview buttons
+ document.getElementById("character-overview-save-button").addEventListener("click", function() {
+ __WEBPACK_IMPORTED_MODULE_24__SaveObject_js__["b" /* saveObject */].saveGame();
+ return false;
+ });
+
+ document.getElementById("character-overview-options-button").addEventListener("click", function() {
+ Object(__WEBPACK_IMPORTED_MODULE_1__utils_GameOptions_js__["b" /* gameOptionsBoxOpen */])();
+ return false;
+ });
+
+ //Create Program buttons
+ Object(__WEBPACK_IMPORTED_MODULE_11__CreateProgram_js__["d" /* initCreateProgramButtons */])();
+
+ //Message at the top of terminal
+ Object(__WEBPACK_IMPORTED_MODULE_31__Terminal_js__["c" /* postNetburnerText */])();
+
+ //Player was working cancel button
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].isWorking) {
+ var cancelButton = document.getElementById("work-in-progress-cancel-button");
+ cancelButton.addEventListener("click", function() {
+ if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeFaction) {
+ var fac = __WEBPACK_IMPORTED_MODULE_12__Faction_js__["b" /* Factions */][__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].currentWorkFactionName];
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].finishFactionWork(true);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeCreateProgram) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].finishCreateProgramWork(true);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeStudyClass) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].finishClass();
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeCrime) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].finishCrime(true);
+ } else if (__WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].workType == __WEBPACK_IMPORTED_MODULE_10__Constants_js__["a" /* CONSTANTS */].WorkTypeCompanyPartTime) {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].finishWorkPartTime();
+ } else {
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].finishWork(true);
+ }
+ });
+ Engine.loadWorkInProgressContent();
+ }
+
+ //character overview screen
+ document.getElementById("character-overview-container").style.display = "block";
+
+ //Remove classes from links (they might be set from tutorial)
+ document.getElementById("terminal-menu-link").removeAttribute("class");
+ document.getElementById("stats-menu-link").removeAttribute("class");
+ document.getElementById("create-script-menu-link").removeAttribute("class");
+ document.getElementById("active-scripts-menu-link").removeAttribute("class");
+ document.getElementById("hacknet-nodes-menu-link").removeAttribute("class");
+ document.getElementById("city-menu-link").removeAttribute("class");
+ document.getElementById("tutorial-menu-link").removeAttribute("class");
+
+ //DEBUG Delete active Scripts on home
+ document.getElementById("debug-delete-scripts-link").addEventListener("click", function() {
+ console.log("Deleting running scripts on home computer");
+ __WEBPACK_IMPORTED_MODULE_21__Player_js__["a" /* Player */].getHomeComputer().runningScripts = [];
+ Object(__WEBPACK_IMPORTED_MODULE_0__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Forcefully deleted all running scripts on home computer. Please save and refresh page");
+ Object(__WEBPACK_IMPORTED_MODULE_1__utils_GameOptions_js__["a" /* gameOptionsBoxClose */])();
+ return false;
+ });
+
+ //DEBUG Soft Reset
+ document.getElementById("debug-soft-reset").addEventListener("click", function() {
+ Object(__WEBPACK_IMPORTED_MODULE_0__utils_DialogBox_js__["a" /* dialogBoxCreate */])("Soft Reset!");
+ Object(__WEBPACK_IMPORTED_MODULE_22__Prestige_js__["a" /* prestigeAugmentation */])();
+ Object(__WEBPACK_IMPORTED_MODULE_1__utils_GameOptions_js__["a" /* gameOptionsBoxClose */])();
+ return false;
+ });
+ },
+
+ start: function() {
+ //Run main loop
+ Engine.idleTimer();
+
+ //Scripts
+ Object(__WEBPACK_IMPORTED_MODULE_20__NetscriptWorker_js__["f" /* runScriptsLoop */])();
+ }
+};
+
+window.onload = function() {
+ Engine.load();
+};
+
+
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(8)))
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* unused harmony export getIndicesOf */
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return convertTimeMsToTimeElapsedString; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return longestCommonStart; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return isString; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return isPositiveNumber; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return containsAllStrings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return formatNumber; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return numOccurrences; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return numNetscriptOperators; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__DialogBox_js__ = __webpack_require__(2);
+
+
+//Netburner String helper functions
+
+//Searches for every occurence of searchStr within str and returns an array of the indices of
+//all these occurences
+function getIndicesOf(searchStr, str, caseSensitive) {
+ var searchStrLen = searchStr.length;
+ if (searchStrLen == 0) {
+ return [];
+ }
+ var startIndex = 0, index, indices = [];
+ if (!caseSensitive) {
+ str = str.toLowerCase();
+ searchStr = searchStr.toLowerCase();
+ }
+ while ((index = str.indexOf(searchStr, startIndex)) > -1) {
+ indices.push(index);
+ startIndex = index + searchStrLen;
+ }
+ return indices;
+}
+
+//Replaces the character at an index with a new character
+String.prototype.replaceAt=function(index, character) {
+ return this.substr(0, index) + character + this.substr(index+character.length);
+}
+
+//Converts a date representing time in milliseconds to a string with the format
+// H hours M minutes and S seconds
+// e.g. 10000 -> "0 hours 0 minutes and 10 seconds"
+// 120000 -> "0 0 hours 2 minutes and 0 seconds"
+function convertTimeMsToTimeElapsedString(time) {
+ //Convert ms to seconds, since we only have second-level precision
+ time = Math.floor(time / 1000);
+
+ var days = Math.floor(time / 86400);
+ time %= 86400;
+
+ var hours = Math.floor(time / 3600);
+ time %= 3600;
+
+ var minutes = Math.floor(time / 60);
+ time %= 60;
+
+ var seconds = time;
+
+ var res = "";
+ if (days) {res += days + " days ";}
+ if (hours) {res += hours + " hours ";}
+ if (minutes) {res += minutes + " minutes ";}
+ res += seconds + " seconds ";
+ return res;
+}
+
+//Finds the longest common starting substring in a set of strings
+function longestCommonStart(strings) {
+ if (!containsAllStrings(strings)) {return;}
+ if (strings.length == 0) {return;}
+
+ var A = strings.concat().sort(),
+ a1= A[0], a2= A[A.length-1], L= a1.length, i= 0;
+ while(i= 0) {
+ ++n;
+ pos += step;
+ } else break;
+ }
+ return n;
+}
+
+//Counters the number of Netscript operators in a string
+function numNetscriptOperators(string) {
+ var total = 0;
+ total += numOccurrences(string, "+");
+ total += numOccurrences(string, "-");
+ total += numOccurrences(string, "*");
+ total += numOccurrences(string, "/");
+ total += numOccurrences(string, "%");
+ total += numOccurrences(string, "&&");
+ total += numOccurrences(string, "||");
+ total += numOccurrences(string, "<");
+ total += numOccurrences(string, ">");
+ total += numOccurrences(string, "<=");
+ total += numOccurrences(string, ">=");
+ total += numOccurrences(string, "==");
+ total += numOccurrences(string, "!=");
+ if (isNaN(total)) {
+ Object(__WEBPACK_IMPORTED_MODULE_0__DialogBox_js__["a" /* dialogBoxCreate */])("ERROR in counting number of operators in script. This is a bug, please report to game developer");
+ total = 0;
+ }
+ return total;
+}
+
+
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return Server; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return AllServers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return getServer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return GetServerByHostname; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return loadAllServers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return AddToAllServers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return processSingleServerGrowth; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return initForeignServers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return prestigeAllServers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return prestigeHomeComputer; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__BitNode_js__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Constants_js__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__CreateProgram_js__ = __webpack_require__(14);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Player_js__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Script_js__ = __webpack_require__(18);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__ = __webpack_require__(11);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__ = __webpack_require__(21);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__utils_JSONReviver_js__ = __webpack_require__(7);
+
+
+
+
+
+
+
+
+
+
+function Server(ip=Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), hostname="", organizationName="",
+ isConnectedTo=false, adminRights=false, purchasedByPlayer=false, maxRam=0) {
+ /* Properties */
+ //Connection information
+ this.ip = ip;
+ var i = 0;
+ while (GetServerByHostname(hostname) != null) {
+ //Server already exists
+ hostname = hostname + "-" + i;
+ ++i;
+ }
+ this.hostname = hostname;
+ this.organizationName = organizationName;
+ this.isConnectedTo = isConnectedTo; //Whether the player is connected to this server
+
+ //Access information
+ this.hasAdminRights = adminRights; //Whether player has admin rights
+ this.purchasedByPlayer = purchasedByPlayer;
+ this.manuallyHacked = false; //Flag that tracks whether or not the server has been hacked at least once
+
+ //RAM, CPU speed and Scripts
+ this.maxRam = maxRam; //GB
+ this.ramUsed = 0;
+ this.cpuSpeed = 1; //MHz
+
+ this.scripts = [];
+ this.runningScripts = []; //Stores RunningScript objects
+ this.programs = [];
+ this.messages = [];
+
+ /* Hacking information (only valid for "foreign" aka non-purchased servers) */
+ //Skill required to attempt a hack. Whether a hack is successful will be determined
+ //by a separate formula
+ this.requiredHackingSkill = 1;
+
+ //Total money available on this server
+ this.moneyAvailable = 0;
+ this.moneyMax = 0;
+
+ //Parameters used in formulas that dictate how moneyAvailable and requiredHackingSkill change.
+ this.hackDifficulty = 1; //Affects hack success rate and how the requiredHackingSkill increases over time (1-100)
+ this.baseDifficulty = 1; //Starting difficulty
+ this.minDifficulty = 1;
+ this.serverGrowth = 0; //Affects how the moneyAvailable increases (0-100)
+ this.timesHacked = 0;
+
+ //The IP's of all servers reachable from this one (what shows up if you run scan/netstat)
+ // NOTE: Only contains IP and not the Server objects themselves
+ this.serversOnNetwork = [];
+
+ //Port information, required for porthacking servers to get admin rights
+ this.numOpenPortsRequired = 5;
+ this.sshPortOpen = false; //Port 22
+ this.ftpPortOpen = false; //Port 21
+ this.smtpPortOpen = false; //Port 25
+ this.httpPortOpen = false; //Port 80
+ this.sqlPortOpen = false; //Port 1433
+ this.openPortCount = 0;
+};
+
+//Set the hacking properties of a server
+Server.prototype.setHackingParameters = function(requiredHackingSkill, moneyAvailable, hackDifficulty, serverGrowth) {
+ this.requiredHackingSkill = requiredHackingSkill;
+ if (isNaN(moneyAvailable)) {
+ this.moneyAvailable = 1000000;
+ } else {
+ this.moneyAvailable = moneyAvailable * __WEBPACK_IMPORTED_MODULE_0__BitNode_js__["a" /* BitNodeMultipliers */].ServerStartingMoney;
+ }
+ this.moneyMax = 25 * this.moneyAvailable * __WEBPACK_IMPORTED_MODULE_0__BitNode_js__["a" /* BitNodeMultipliers */].ServerMaxMoney;
+ this.hackDifficulty = hackDifficulty;
+ this.baseDifficulty = hackDifficulty;
+ this.minDifficulty = Math.max(1, Math.round(hackDifficulty / 3));
+ this.serverGrowth = serverGrowth;
+}
+
+//Set the port properties of a server
+//Right now its only the number of open ports needed to PortHack the server.
+Server.prototype.setPortProperties = function(numOpenPortsReq) {
+ this.numOpenPortsRequired = numOpenPortsReq;
+}
+
+Server.prototype.setMaxRam = function(ram) {
+ this.maxRam = ram;
+}
+
+//The serverOnNetwork array holds the IP of all the servers. This function
+//returns the actual Server objects
+Server.prototype.getServerOnNetwork = function(i) {
+ if (i > this.serversOnNetwork.length) {
+ console.log("Tried to get server on network that was out of range");
+ return;
+ }
+ return AllServers[this.serversOnNetwork[i]];
+}
+
+//Given the name of the script, returns the corresponding
+//script object on the server (if it exists)
+Server.prototype.getScript = function(scriptName) {
+ for (var i = 0; i < this.scripts.length; i++) {
+ if (this.scripts[i].filename == scriptName) {
+ return this.scripts[i];
+ }
+ }
+ return null;
+}
+
+//Strengthens a server's security level (difficulty) by the specified amount
+Server.prototype.fortify = function(amt) {
+ this.hackDifficulty += amt;
+ if (this.hackDifficulty > 99) {this.hackDifficulty = 99;}
+}
+
+Server.prototype.weaken = function(amt) {
+ this.hackDifficulty -= (amt * __WEBPACK_IMPORTED_MODULE_0__BitNode_js__["a" /* BitNodeMultipliers */].ServerWeakenRate);
+ if (this.hackDifficulty < this.minDifficulty) {this.hackDifficulty = this.minDifficulty;}
+ if (this.hackDifficulty < 1) {this.hackDifficulty = 1;}
+}
+
+//Functions for loading and saving a Server
+Server.prototype.toJSON = function() {
+ return Object(__WEBPACK_IMPORTED_MODULE_8__utils_JSONReviver_js__["b" /* Generic_toJSON */])("Server", this);
+}
+
+Server.fromJSON = function(value) {
+ return Object(__WEBPACK_IMPORTED_MODULE_8__utils_JSONReviver_js__["a" /* Generic_fromJSON */])(Server, value.data);
+}
+
+__WEBPACK_IMPORTED_MODULE_8__utils_JSONReviver_js__["c" /* Reviver */].constructors.Server = Server;
+
+function initForeignServers() {
+ //MegaCorporations
+ var ECorpServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "ecorp", "ECorp", false, false, false, 0);
+ ECorpServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1150, 1300), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(30000000000, 70000000000), 99, 99);
+ ECorpServer.setPortProperties(5);
+ AddToAllServers(ECorpServer);
+
+ var MegaCorpServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "megacorp", "MegaCorp", false, false, false, 0);
+ MegaCorpServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1150, 1300), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(40000000000, 60000000000), 99, 99);
+ MegaCorpServer.setPortProperties(5);
+ AddToAllServers(MegaCorpServer);
+
+ var BachmanAndAssociatesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "b-and-a", "Bachman & Associates", false, false, false, 0);
+ BachmanAndAssociatesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1000, 1050), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(20000000000, 25000000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(75, 85), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(65, 75));
+ BachmanAndAssociatesServer.setPortProperties(5);
+ AddToAllServers(BachmanAndAssociatesServer);
+
+ var BladeIndustriesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "blade", "Blade Industries", false, false, false, 0);
+ BladeIndustriesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1000, 1100), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(12000000000, 20000000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(90, 95), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 75));
+ BladeIndustriesServer.setPortProperties(5);
+ BladeIndustriesServer.messages.push("beyond-man.lit");
+ AddToAllServers(BladeIndustriesServer);
+
+ var NWOServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "nwo", "New World Order", false, false, false, 0);
+ NWOServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1000, 1200), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(25000000000, 35000000000), 99, Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(75, 85));
+ NWOServer.setPortProperties(5);
+ NWOServer.messages.push("the-hidden-world.lit");
+ AddToAllServers(NWOServer);
+
+ var ClarkeIncorporatedServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "clarkeinc", "Clarke Incorporated", false, false, false, 0);
+ ClarkeIncorporatedServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1000, 1200), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(15000000000, 25000000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(50, 60), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(50, 70));
+ ClarkeIncorporatedServer.setPortProperties(5);
+ ClarkeIncorporatedServer.messages.push("beyond-man.lit");
+ ClarkeIncorporatedServer.messages.push("cost-of-immortality.lit");
+ AddToAllServers(ClarkeIncorporatedServer);
+
+ var OmniTekIncorporatedServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "omnitek", "OmniTek Incorporated", false, false, false, 0);
+ OmniTekIncorporatedServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(900, 1100), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(15000000000, 20000000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(90, 99), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(95, 99));
+ OmniTekIncorporatedServer.setPortProperties(5);
+ OmniTekIncorporatedServer.messages.push("coded-intelligence.lit");
+ AddToAllServers(OmniTekIncorporatedServer);
+
+ var FourSigmaServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "4sigma", "FourSigma", false, false, false, 0);
+ FourSigmaServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(950, 1200), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(15000000000, 25000000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 70), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(75, 99));
+ FourSigmaServer.setPortProperties(5);
+ AddToAllServers(FourSigmaServer);
+
+ var KuaiGongInternationalServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "kuai-gong", "KuaiGong International", false, false, false, 0);
+ KuaiGongInternationalServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1000, 1250), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(20000000000, 30000000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(95, 99), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(90, 99));
+ KuaiGongInternationalServer.setPortProperties(5);
+ AddToAllServers(KuaiGongInternationalServer);
+
+ //Technology and communications companies (large targets)
+ var FulcrumTechnologiesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "fulcrumtech", "Fulcrum Technologies", false, false, false, 64);
+ FulcrumTechnologiesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1000, 1200), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1400000000, 1800000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(85, 95), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(80, 99));
+ FulcrumTechnologiesServer.setPortProperties(5);
+ FulcrumTechnologiesServer.messages.push("simulated-reality.lit");
+ AddToAllServers(FulcrumTechnologiesServer);
+
+ var FulcrumSecretTechnologiesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "fulcrumassets", "Fulcrum Technologies Assets", false, false, false, 0);
+ FulcrumSecretTechnologiesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1200, 1500), 1000000, 99, 1);
+ FulcrumSecretTechnologiesServer.setPortProperties(5);
+ AddToAllServers(FulcrumSecretTechnologiesServer);
+ __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["a" /* SpecialServerIps */].addIp(__WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].FulcrumSecretTechnologies, FulcrumSecretTechnologiesServer.ip);
+
+ var StormTechnologiesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "stormtech", "Storm Technologies", false, false, false, 0);
+ StormTechnologiesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(900, 1050), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1000000000, 1200000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(80, 90), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 90));
+ StormTechnologiesServer.setPortProperties(5);
+ AddToAllServers(StormTechnologiesServer);
+
+ var DefCommServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "defcomm", "DefComm", false, false, false, 0);
+ DefCommServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(900, 1000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(800000000, 950000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(85, 95), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(50, 70));
+ DefCommServer.setPortProperties(5);
+ AddToAllServers(DefCommServer);
+
+ var InfoCommServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "infocomm", "InfoComm", false, false, false, 0);
+ InfoCommServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(875, 950), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(600000000, 900000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 90), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(35, 75));
+ InfoCommServer.setPortProperties(5);
+ AddToAllServers(InfoCommServer);
+
+ var HeliosLabsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "helios", "Helios Labs", false, false, false, 0);
+ HeliosLabsServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(800, 900), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(550000000, 750000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(85, 95), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80));
+ HeliosLabsServer.setPortProperties(5);
+ HeliosLabsServer.messages.push("beyond-man.lit");
+ AddToAllServers(HeliosLabsServer);
+
+ var VitaLifeServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "vitalife", "VitaLife", false, false, false, 32);
+ VitaLifeServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(775, 900), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(700000000, 800000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(80, 90), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 80));
+ VitaLifeServer.setPortProperties(5);
+ VitaLifeServer.messages.push("A-Green-Tomorrow.lit");
+ AddToAllServers(VitaLifeServer);
+
+ var IcarusMicrosystemsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "icarus", "Icarus Microsystems", false, false, false, 0);
+ IcarusMicrosystemsServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(850, 925), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(900000000, 1000000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(85, 95), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(85, 95));
+ IcarusMicrosystemsServer.setPortProperties(5);
+ AddToAllServers(IcarusMicrosystemsServer);
+
+ var UniversalEnergyServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "univ-energy", "Universal Energy", false, false, false, 32);
+ UniversalEnergyServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(800, 900), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1100000000, 1200000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(80, 90), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(80, 90));
+ UniversalEnergyServer.setPortProperties(4);
+ AddToAllServers(UniversalEnergyServer);
+
+ var TitanLabsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "titan-labs", "Titan Laboratories", false, false, false, 32);
+ TitanLabsServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(800, 875), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(750000000, 900000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 80));
+ TitanLabsServer.setPortProperties(5);
+ TitanLabsServer.messages.push("coded-intelligence.lit");
+ AddToAllServers(TitanLabsServer);
+
+ var MicrodyneTechnologiesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "microdyne", "Microdyne Technologies", false, false, false, 16);
+ MicrodyneTechnologiesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(800, 875), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(500000000, 700000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(65, 75), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 90));
+ MicrodyneTechnologiesServer.setPortProperties(5);
+ MicrodyneTechnologiesServer.messages.push("synthetic-muscles.lit");
+ AddToAllServers(MicrodyneTechnologiesServer);
+
+ var TaiYangDigitalServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "taiyang-digital", "Taiyang Digital", false, false, false, 0);
+ TaiYangDigitalServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(850, 950), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(800000000, 900000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80));
+ TaiYangDigitalServer.setPortProperties(5);
+ TaiYangDigitalServer.messages.push("A-Green-Tomorrow.lit");
+ TaiYangDigitalServer.messages.push("brighter-than-the-sun.lit");
+ AddToAllServers(TaiYangDigitalServer);
+
+ var GalacticCyberSystemsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "galactic-cyber", "Galactic Cybersystems", false, false, false, 0);
+ GalacticCyberSystemsServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(825, 875), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(750000000, 850000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(55, 65), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 90));
+ GalacticCyberSystemsServer.setPortProperties(5);
+ AddToAllServers(GalacticCyberSystemsServer);
+
+ //Defense Companies ("Large" Companies)
+ var AeroCorpServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "aerocorp", "AeroCorp", false, false, false, 0);
+ AeroCorpServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(850, 925), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1000000000, 1200000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(80, 90), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(55, 65));
+ AeroCorpServer.setPortProperties(5);
+ AeroCorpServer.messages.push("man-and-machine.lit");
+ AddToAllServers(AeroCorpServer);
+
+ var OmniaCybersystemsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "omnia", "Omnia Cybersystems", false, false, false, 0);
+ OmniaCybersystemsServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(850, 950), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(900000000, 1000000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(85, 95), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 70));
+ OmniaCybersystemsServer.setPortProperties(5);
+ AddToAllServers(OmniaCybersystemsServer);
+
+ var ZBDefenseServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "zb-def", "ZB Defense Industries", false, false, false, 0);
+ ZBDefenseServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(775, 825), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(900000000, 1100000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(55, 65), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(65, 75));
+ ZBDefenseServer.setPortProperties(4);
+ ZBDefenseServer.messages.push("synthetic-muscles.lit");
+ AddToAllServers(ZBDefenseServer);
+
+ var AppliedEnergeticsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "applied-energetics", "Applied Energetics", false, false, false, 0);
+ AppliedEnergeticsServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(775, 850), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(700000000, 1000000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 75));
+ AppliedEnergeticsServer.setPortProperties(4);
+ AddToAllServers(AppliedEnergeticsServer);
+
+ var SolarisSpaceSystemsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "solaris", "Solaris Space Systems", false, false, false, 0);
+ SolarisSpaceSystemsServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(750, 850), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(700000000, 900000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80));
+ SolarisSpaceSystemsServer.setPortProperties(5);
+ SolarisSpaceSystemsServer.messages.push("A-Green-Tomorrow.lit");
+ SolarisSpaceSystemsServer.messages.push("the-failed-frontier.lit");
+ AddToAllServers(SolarisSpaceSystemsServer);
+
+ var DeltaOneServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "deltaone", "Delta One", false, false, false, 0);
+ DeltaOneServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(800, 900), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1300000000, 1700000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(75, 85), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(50, 70));
+ DeltaOneServer.setPortProperties(5);
+ AddToAllServers(DeltaOneServer);
+
+ //Health, medicine, pharmaceutical companies ("Large" targets)
+ var GlobalPharmaceuticalsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "global-pharm", "Global Pharmaceuticals", false, false, false, 16);
+ GlobalPharmaceuticalsServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(750, 850), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1500000000, 1750000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(75, 85), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(80, 90));
+ GlobalPharmaceuticalsServer.setPortProperties(4);
+ GlobalPharmaceuticalsServer.messages.push("A-Green-Tomorrow.lit");
+ AddToAllServers(GlobalPharmaceuticalsServer);
+
+ var NovaMedicalServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "nova-med", "Nova Medical", false, false, false, 0);
+ NovaMedicalServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(775, 850), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1100000000, 1250000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(65, 85));
+ NovaMedicalServer.setPortProperties(4);
+ AddToAllServers(NovaMedicalServer);
+
+ var ZeusMedicalServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "zeus-med", "Zeus Medical", false, false, false, 0);
+ ZeusMedicalServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(800, 850), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1300000000, 1500000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 90), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80));
+ ZeusMedicalServer.setPortProperties(5);
+ AddToAllServers(ZeusMedicalServer);
+
+ var UnitaLifeGroupServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "unitalife", "UnitaLife Group", false, false, false, 32);
+ UnitaLifeGroupServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(775, 825), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(1000000000, 1100000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80));
+ UnitaLifeGroupServer.setPortProperties(4);
+ AddToAllServers(UnitaLifeGroupServer);
+
+ //"Medium level" targets
+ var LexoCorpServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "lexo-corp", "Lexo Corporation", false, false, false, 16);
+ LexoCorpServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(650, 750), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(700000000, 800000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(55, 65));
+ LexoCorpServer.setPortProperties(4);
+ AddToAllServers(LexoCorpServer);
+
+ var RhoConstructionServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "rho-construction", "Rho Construction", false, false, false, 0);
+ RhoConstructionServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(475, 525), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(500000000, 700000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(40, 60), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(40, 60));
+ RhoConstructionServer.setPortProperties(3);
+ AddToAllServers(RhoConstructionServer);
+
+ var AlphaEnterprisesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "alpha-ent", "Alpha Enterprises", false, false, false, 0);
+ AlphaEnterprisesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(500, 600), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(600000000, 750000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(50, 70), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(50, 60));
+ AlphaEnterprisesServer.setPortProperties(4);
+ AlphaEnterprisesServer.messages.push("sector-12-crime.lit");
+ AddToAllServers(AlphaEnterprisesServer);
+
+ var AevumPoliceServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "aevum-police", "Aevum Police Network", false, false, false, 0);
+ AevumPoliceServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(400, 450), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(200000000, 400000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(30, 50));
+ AevumPoliceServer.setPortProperties(4);
+ AddToAllServers(AevumPoliceServer);
+
+ var RothmanUniversityServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "rothman-uni", "Rothman University Network", false, false, false, 4);
+ RothmanUniversityServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(370, 430), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(175000000, 250000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(45, 55), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(35, 45));
+ RothmanUniversityServer.setPortProperties(3);
+ RothmanUniversityServer.messages.push("secret-societies.lit");
+ RothmanUniversityServer.messages.push("the-failed-frontier.lit");
+ RothmanUniversityServer.messages.push("tensions-in-tech-race.lit");
+ AddToAllServers(RothmanUniversityServer);
+
+ var ZBInstituteOfTechnologyServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "zb-institute", "ZB Institute of Technology Network", false, false, false, 4);
+ ZBInstituteOfTechnologyServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(725, 775), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(800000000, 1100000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(65, 85), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(75, 85));
+ ZBInstituteOfTechnologyServer.setPortProperties(5);
+ AddToAllServers(ZBInstituteOfTechnologyServer);
+
+ var SummitUniversityServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "summit-uni", "Summit University Network", false, false, false, 4);
+ SummitUniversityServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(425, 475), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(200000000, 350000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(45, 65), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(40, 60));
+ SummitUniversityServer.setPortProperties(3);
+ SummitUniversityServer.messages.push("secret-societies.lit");
+ SummitUniversityServer.messages.push("the-failed-frontier.lit");
+ SummitUniversityServer.messages.push("synthetic-muscles.lit");
+ AddToAllServers(SummitUniversityServer);
+
+ var SysCoreSecuritiesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "syscore", "SysCore Securities", false, false, false, 0);
+ SysCoreSecuritiesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(550, 650), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(400000000, 600000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 70));
+ SysCoreSecuritiesServer.setPortProperties(4);
+ AddToAllServers(SysCoreSecuritiesServer);
+
+ var CatalystVenturesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "catalyst", "Catalyst Ventures", false, false, false, 0);
+ CatalystVenturesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(400, 450), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(300000000, 550000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 70), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(25, 55));
+ CatalystVenturesServer.setPortProperties(3);
+ CatalystVenturesServer.messages.push("tensions-in-tech-race.lit");
+ AddToAllServers(CatalystVenturesServer);
+
+ var TheHubServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "the-hub", "The Hub", false, false, false, 0);
+ TheHubServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(275, 325), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(150000000, 200000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(35, 45), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(45, 55));
+ TheHubServer.setPortProperties(2);
+ AddToAllServers(TheHubServer);
+
+ var CompuTekServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "comptek", "CompuTek", false, false, false, 8);
+ CompuTekServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(300, 400), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(220000000, 250000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(55, 65), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(45, 65));
+ CompuTekServer.setPortProperties(3);
+ CompuTekServer.messages.push("man-and-machine.lit");
+ AddToAllServers(CompuTekServer);
+
+ var NetLinkTechnologiesServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "netlink", "NetLink Technologies", false, false, false, 0);
+ NetLinkTechnologiesServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(375, 425), 275000000, Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60, 80), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(45, 75));
+ NetLinkTechnologiesServer.setPortProperties(3);
+ NetLinkTechnologiesServer.messages.push("simulated-reality.lit");
+ AddToAllServers(NetLinkTechnologiesServer);
+
+ var JohnsonOrthopedicsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "johnson-ortho", "Johnson Orthopedics", false, false, false, 4);
+ JohnsonOrthopedicsServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(250, 300), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(70000000, 85000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(35, 65), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(35, 65));
+ JohnsonOrthopedicsServer.setPortProperties(2);
+ AddToAllServers(JohnsonOrthopedicsServer);
+
+ //"Low level" targets
+ var FoodNStuffServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "foodnstuff", "Food N Stuff Supermarket", false, false, false, 8);
+ FoodNStuffServer.setHackingParameters(1, 2000000, 10, 5);
+ FoodNStuffServer.setPortProperties(0);
+ FoodNStuffServer.messages.push("sector-12-crime.lit");
+ AddToAllServers(FoodNStuffServer);
+
+ var SigmaCosmeticsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "sigma-cosmetics", "Sigma Cosmetics", false, false, false, 8);
+ SigmaCosmeticsServer.setHackingParameters(5, 2300000, 10, 10);
+ SigmaCosmeticsServer.setPortProperties(0);
+ AddToAllServers(SigmaCosmeticsServer);
+
+ var JoesGunsServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "joesguns", "Joe's Guns", false, false, false, 8);
+ JoesGunsServer.setHackingParameters(10, 2500000, 15, 20);
+ JoesGunsServer.setPortProperties(0);
+ AddToAllServers(JoesGunsServer);
+
+ var Zer0NightclubServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "zer0", "ZER0 Nightclub", false, false, false, 4);
+ Zer0NightclubServer.setHackingParameters(75, 7500000, 25, 40);
+ Zer0NightclubServer.setPortProperties(1);
+ AddToAllServers(Zer0NightclubServer);
+
+ var NectarNightclubServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "nectar-net", "Nectar Nightclub Network", false, false, false, 8);
+ NectarNightclubServer.setHackingParameters(20, 2750000, 20, 25);
+ NectarNightclubServer.setPortProperties(0);
+ AddToAllServers(NectarNightclubServer);
+
+ var NeoNightclubServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "neo-net", "Neo Nightclub Network", false, false, false, 4);
+ NeoNightclubServer.setHackingParameters(50, 5000000, 25, 25);
+ NeoNightclubServer.setPortProperties(1);
+ NeoNightclubServer.messages.push("the-hidden-world.lit");
+ AddToAllServers(NeoNightclubServer);
+
+ var SilverHelixServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "silver-helix", "Silver Helix", false, false, false, 2);
+ SilverHelixServer.setHackingParameters(150, 45000000, 30, 30);
+ SilverHelixServer.setPortProperties(2);
+ SilverHelixServer.messages.push("new-triads.lit");
+ AddToAllServers(SilverHelixServer);
+
+ var HongFangTeaHouseServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "hong-fang-tea", "HongFang Teahouse", false, false, false, 8);
+ HongFangTeaHouseServer.setHackingParameters(30, 3000000, 15, 20);
+ HongFangTeaHouseServer.setPortProperties(0);
+ HongFangTeaHouseServer.messages.push("brighter-than-the-sun.lit");
+ AddToAllServers(HongFangTeaHouseServer);
+
+ var HaraKiriSushiBarServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "harakiri-sushi", "HaraKiri Sushi Bar Network", false, false, false, 8);
+ HaraKiriSushiBarServer.setHackingParameters(40, 4000000, 15, 40);
+ HaraKiriSushiBarServer.setPortProperties(0);
+ AddToAllServers(HaraKiriSushiBarServer);
+
+ var PhantasyServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "phantasy", "Phantasy Club", false, false, false, 0);
+ PhantasyServer.setHackingParameters(100, 24000000, 20, 35);
+ PhantasyServer.setPortProperties(2);
+ AddToAllServers(PhantasyServer);
+
+ var MaxHardwareServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "max-hardware", "Max Hardware Store", false, false, false, 4);
+ MaxHardwareServer.setHackingParameters(80, 10000000, 15, 30);
+ MaxHardwareServer.setPortProperties(1);
+ AddToAllServers(MaxHardwareServer);
+
+ var OmegaSoftwareServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "omega-net", "Omega Software", false, false, false, 8);
+ OmegaSoftwareServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(180, 220), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(60000000, 70000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(25, 35), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(30, 40));
+ OmegaSoftwareServer.setPortProperties(2);
+ OmegaSoftwareServer.messages.push("the-new-god.lit");
+ AddToAllServers(OmegaSoftwareServer);
+
+ //Gyms
+ var CrushFitnessGymServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "crush-fitness", "Crush Fitness", false, false, false, 0);
+ CrushFitnessGymServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(225, 275), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(40000000, 60000000), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(35, 45), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(27, 33));
+ CrushFitnessGymServer.setPortProperties(2);
+ AddToAllServers(CrushFitnessGymServer);
+
+ var IronGymServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "iron-gym", "Iron Gym Network", false, false, false, 4);
+ IronGymServer.setHackingParameters(100, 20000000, 30, 20);
+ IronGymServer.setPortProperties(1);
+ AddToAllServers(IronGymServer);
+
+ var MilleniumFitnessGymServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "millenium-fitness", "Millenium Fitness Network", false, false, false, 0);
+ MilleniumFitnessGymServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(475, 525), 250000000, Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(45, 55), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(25, 45));
+ MilleniumFitnessGymServer.setPortProperties(3);
+ AddToAllServers(MilleniumFitnessGymServer);
+
+ var PowerhouseGymServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "powerhouse-fitness", "Powerhouse Fitness", false, false, false, 0);
+ PowerhouseGymServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(950, 1100), 900000000, Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(55, 65), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(50, 60));
+ PowerhouseGymServer.setPortProperties(5);
+ AddToAllServers(PowerhouseGymServer);
+
+ var SnapFitnessGymServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "snap-fitness", "Snap Fitness", false, false, false, 0);
+ SnapFitnessGymServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(675, 800), 450000000, Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(40, 60), Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(40, 60));
+ SnapFitnessGymServer.setPortProperties(4);
+ AddToAllServers(SnapFitnessGymServer);
+
+ //Faction servers, cannot hack money from these
+ var BitRunnersServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "run4theh111z", "The Runners", false, false, false, 0);
+ BitRunnersServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(505, 550), 0, 0, 0);
+ BitRunnersServer.setPortProperties(4);
+ BitRunnersServer.messages.push("simulated-reality.lit");
+ BitRunnersServer.messages.push("the-new-god.lit");
+ AddToAllServers(BitRunnersServer);
+ __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["a" /* SpecialServerIps */].addIp(__WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].BitRunnersServer, BitRunnersServer.ip);
+
+ var TheBlackHandServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "I.I.I.I", "I.I.I.I", false, false, false, 0);
+ TheBlackHandServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(340, 365), 0, 0, 0);
+ TheBlackHandServer.setPortProperties(3);
+ TheBlackHandServer.messages.push("democracy-is-dead.lit");
+ AddToAllServers(TheBlackHandServer);
+ __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["a" /* SpecialServerIps */].addIp(__WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].TheBlackHandServer, TheBlackHandServer.ip);
+
+ var NiteSecServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "avmnite-02h", "NiteSec", false, false, false, 0);
+ NiteSecServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(202, 220), 0, 0, 0);
+ NiteSecServer.setPortProperties(2);
+ NiteSecServer.messages.push("democracy-is-dead.lit");
+ AddToAllServers(NiteSecServer);
+ __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["a" /* SpecialServerIps */].addIp(__WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].NiteSecServer, NiteSecServer.ip);
+
+ var DarkArmyServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), ".", ".", false, false, false, 0);
+ DarkArmyServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(505, 550), 0, 0, 0);
+ DarkArmyServer.setPortProperties(4);
+ AddToAllServers(DarkArmyServer);
+ __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["a" /* SpecialServerIps */].addIp(__WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].TheDarkArmyServer, DarkArmyServer.ip);
+
+ var CyberSecServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "CSEC", "CyberSec", false, false, false, 0);
+ CyberSecServer.setHackingParameters(Object(__WEBPACK_IMPORTED_MODULE_6__utils_HelperFunctions_js__["d" /* getRandomInt */])(51, 60), 0, 0, 0);
+ CyberSecServer.setPortProperties(1);
+ CyberSecServer.messages.push("democracy-is-dead.lit");
+ AddToAllServers(CyberSecServer);
+ __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["a" /* SpecialServerIps */].addIp(__WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].CyberSecServer, CyberSecServer.ip);
+
+ var DaedalusServer = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), "The-Cave", "Helios", false, false, false, 0);
+ DaedalusServer.setHackingParameters(925, 0, 0, 0);
+ DaedalusServer.setPortProperties(5);
+ DaedalusServer.messages.push("alpha-omega.lit");
+ AddToAllServers(DaedalusServer);
+ __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["a" /* SpecialServerIps */].addIp(__WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].DaedalusServer, DaedalusServer.ip);
+
+ //Super special Servers
+ var WorldDaemon = new Server(Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["a" /* createRandomIp */])(), __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].WorldDaemon, __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].WorldDaemon, false, false, false, 0);
+ WorldDaemon.setHackingParameters(3000, 0, 0, 0);
+ WorldDaemon.setPortProperties(5);
+ AddToAllServers(WorldDaemon);
+ __WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["a" /* SpecialServerIps */].addIp(__WEBPACK_IMPORTED_MODULE_5__SpecialServerIps_js__["b" /* SpecialServerNames */].WorldDaemon, WorldDaemon.ip);
+
+ /* Create a randomized network for all the foreign servers */
+ //Groupings for creating a randomized network
+ var NetworkGroup1 = [IronGymServer, FoodNStuffServer, SigmaCosmeticsServer, JoesGunsServer, HongFangTeaHouseServer, HaraKiriSushiBarServer];
+ var NetworkGroup2 = [MaxHardwareServer, NectarNightclubServer, Zer0NightclubServer, CyberSecServer];
+ var NetworkGroup3 = [OmegaSoftwareServer, PhantasyServer, SilverHelixServer, NeoNightclubServer];
+ var NetworkGroup4 = [CrushFitnessGymServer, NetLinkTechnologiesServer, CompuTekServer, TheHubServer, JohnsonOrthopedicsServer, NiteSecServer];
+ var NetworkGroup5 = [CatalystVenturesServer, SysCoreSecuritiesServer, SummitUniversityServer, ZBInstituteOfTechnologyServer, RothmanUniversityServer, TheBlackHandServer];
+ var NetworkGroup6 = [LexoCorpServer, RhoConstructionServer, AlphaEnterprisesServer, AevumPoliceServer, MilleniumFitnessGymServer];
+ var NetworkGroup7 = [GlobalPharmaceuticalsServer, AeroCorpServer, GalacticCyberSystemsServer, SnapFitnessGymServer];
+ var NetworkGroup8 = [DeltaOneServer, UnitaLifeGroupServer, OmniaCybersystemsServer];
+ var NetworkGroup9 = [ZeusMedicalServer, SolarisSpaceSystemsServer, UniversalEnergyServer, IcarusMicrosystemsServer, DefCommServer];
+ var NetworkGroup10 = [NovaMedicalServer, ZBDefenseServer, TaiYangDigitalServer, InfoCommServer];
+ var NetworkGroup11 = [AppliedEnergeticsServer, MicrodyneTechnologiesServer, TitanLabsServer, BitRunnersServer];
+ var NetworkGroup12 = [VitaLifeServer, HeliosLabsServer, StormTechnologiesServer, FulcrumTechnologiesServer];
+ var NetworkGroup13 = [KuaiGongInternationalServer, FourSigmaServer, OmniTekIncorporatedServer, DarkArmyServer];
+ var NetworkGroup14 = [PowerhouseGymServer, ClarkeIncorporatedServer, NWOServer, BladeIndustriesServer, BachmanAndAssociatesServer];
+ var NetworkGroup15 = [FulcrumSecretTechnologiesServer, MegaCorpServer, ECorpServer, DaedalusServer];
+
+ for (var i = 0; i < NetworkGroup2.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup1[Math.floor(Math.random() * NetworkGroup1.length)];
+ NetworkGroup2[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup2[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup3.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup2[Math.floor(Math.random() * NetworkGroup2.length)];
+ NetworkGroup3[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup3[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup4.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup3[Math.floor(Math.random() * NetworkGroup3.length)];
+ NetworkGroup4[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup4[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup5.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup4[Math.floor(Math.random() * NetworkGroup4.length)];
+ NetworkGroup5[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup5[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup6.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup5[Math.floor(Math.random() * NetworkGroup5.length)];
+ NetworkGroup6[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup6[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup7.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup6[Math.floor(Math.random() * NetworkGroup6.length)];
+ NetworkGroup7[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup7[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup8.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup7[Math.floor(Math.random() * NetworkGroup7.length)];
+ NetworkGroup8[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup8[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup9.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup8[Math.floor(Math.random() * NetworkGroup8.length)];
+ NetworkGroup9[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup9[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup10.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup9[Math.floor(Math.random() * NetworkGroup9.length)];
+ NetworkGroup10[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup10[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup11.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup10[Math.floor(Math.random() * NetworkGroup10.length)];
+ NetworkGroup11[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup11[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup12.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup11[Math.floor(Math.random() * NetworkGroup11.length)];
+ NetworkGroup12[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup12[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup13.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup12[Math.floor(Math.random() * NetworkGroup12.length)];
+ NetworkGroup13[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup13[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup14.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup13[Math.floor(Math.random() * NetworkGroup13.length)];
+ NetworkGroup14[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup14[i].ip);
+ }
+
+ for (var i = 0; i < NetworkGroup15.length; i++) {
+ var randomServerFromPrevGroup = NetworkGroup14[Math.floor(Math.random() * NetworkGroup14.length)];
+ NetworkGroup15[i].serversOnNetwork.push(randomServerFromPrevGroup.ip);
+ randomServerFromPrevGroup.serversOnNetwork.push(NetworkGroup15[i].ip);
+ }
+
+ //Connect the first tier of servers to the player's home computer
+ for (var i = 0; i < NetworkGroup1.length; i++) {
+ __WEBPACK_IMPORTED_MODULE_3__Player_js__["a" /* Player */].getHomeComputer().serversOnNetwork.push(NetworkGroup1[i].ip);
+ NetworkGroup1[i].serversOnNetwork.push(__WEBPACK_IMPORTED_MODULE_3__Player_js__["a" /* Player */].homeComputer);
+ }
+}
+
+//Applied server growth for a single server. Returns the percentage growth
+function processSingleServerGrowth(server, numCycles) {
+ //Server growth processed once every 450 game cycles
+ var numServerGrowthCycles = Math.max(Math.floor(numCycles / 450), 0);
+
+ //Get adjusted growth rate, which accounts for server security
+ var growthRate = __WEBPACK_IMPORTED_MODULE_1__Constants_js__["a" /* CONSTANTS */].ServerBaseGrowthRate;
+ var adjGrowthRate = 1 + (growthRate - 1) / server.hackDifficulty;
+ if (adjGrowthRate > __WEBPACK_IMPORTED_MODULE_1__Constants_js__["a" /* CONSTANTS */].ServerMaxGrowthRate) {adjGrowthRate = __WEBPACK_IMPORTED_MODULE_1__Constants_js__["a" /* CONSTANTS */].ServerMaxGrowthRate;}
+
+ //Calculate adjusted server growth rate based on parameters
+ var serverGrowthPercentage = server.serverGrowth / 100;
+ var numServerGrowthCyclesAdjusted = numServerGrowthCycles * serverGrowthPercentage * __WEBPACK_IMPORTED_MODULE_0__BitNode_js__["a" /* BitNodeMultipliers */].ServerGrowthRate;
+
+ //Apply serverGrowth for the calculated number of growth cycles
+ var serverGrowth = Math.pow(adjGrowthRate, numServerGrowthCyclesAdjusted * __WEBPACK_IMPORTED_MODULE_3__Player_js__["a" /* Player */].hacking_grow_mult);
+ if (serverGrowth < 1) {
+ console.log("WARN: serverGrowth calculated to be less than 1");
+ serverGrowth = 1;
+ }
+
+ server.moneyAvailable *= serverGrowth;
+ if (server.moneyMax && isNaN(server.moneyAvailable)) {
+ server.moneyAvailable = server.moneyMax;
+ }
+ if (server.moneyMax && server.moneyAvailable > server.moneyMax) {
+ server.moneyAvailable = server.moneyMax;
+ return 1;
+ }
+
+ //Growing increases server security twice as much as hacking
+ server.fortify(2 * __WEBPACK_IMPORTED_MODULE_1__Constants_js__["a" /* CONSTANTS */].ServerFortifyAmount * numServerGrowthCycles);
+ return serverGrowth;
+}
+
+function prestigeHomeComputer(homeComp) {
+ homeComp.programs.length = 0;
+ homeComp.runningScripts = [];
+ homeComp.serversOnNetwork = [];
+ homeComp.isConnectedTo = true;
+ homeComp.ramUsed = 0;
+ homeComp.programs.push(__WEBPACK_IMPORTED_MODULE_2__CreateProgram_js__["a" /* Programs */].NukeProgram);
+
+ homeComp.messages.length = 0;
+}
+
+//List of all servers that exist in the game, indexed by their ip
+let AllServers = {};
+
+function prestigeAllServers() {
+ for (var member in AllServers) {
+ delete AllServers[member];
+ }
+ AllServers = {};
+}
+
+function loadAllServers(saveString) {
+ AllServers = JSON.parse(saveString, __WEBPACK_IMPORTED_MODULE_8__utils_JSONReviver_js__["c" /* Reviver */]);
+}
+
+function SizeOfAllServers() {
+ var size = 0, key;
+ for (key in AllServers) {
+ if (AllServers.hasOwnProperty(key)) size++;
+ }
+ return size;
+}
+
+//Add a server onto the map of all servers in the game
+function AddToAllServers(server) {
+ var serverIp = server.ip;
+ if (Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["b" /* ipExists */])(serverIp)) {
+ console.log("IP of server that's being added: " + serverIp);
+ console.log("Hostname of the server thats being added: " + server.hostname);
+ console.log("The server that already has this IP is: " + AllServers[serverIp].hostname);
+ throw new Error("Error: Trying to add a server with an existing IP");
+ return;
+ }
+ AllServers[serverIp] = server;
+}
+
+//Returns server object with corresponding hostname
+// Relatively slow, would rather not use this a lot
+function GetServerByHostname(hostname) {
+ for (var ip in AllServers) {
+ if (AllServers.hasOwnProperty(ip)) {
+ if (AllServers[ip].hostname == hostname) {
+ return AllServers[ip];
+ }
+ }
+ }
+ return null;
+}
+
+//Get server by IP or hostname. Returns null if invalid
+function getServer(s) {
+ if (!Object(__WEBPACK_IMPORTED_MODULE_7__utils_IPAddress_js__["c" /* isValidIPAddress */])(s)) {
+ return GetServerByHostname(s);
+ } else {
+ return AllServers[s];
+ }
+}
+
+//Debugging tool
+function PrintAllServers() {
+ for (var ip in AllServers) {
+ if (AllServers.hasOwnProperty(ip)) {
+ console.log("Ip: " + ip + ", hostname: " + AllServers[ip].hostname);
+ }
+ }
+}
+
+
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Reviver; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Generic_toJSON; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Generic_fromJSON; });
+/* Generic Reviver, toJSON, and fromJSON functions used for saving and loading objects */
+
+// A generic "smart reviver" function.
+// Looks for object values with a `ctor` property and
+// a `data` property. If it finds them, and finds a matching
+// constructor that has a `fromJSON` property on it, it hands
+// off to that `fromJSON` fuunction, passing in the value.
+function Reviver(key, value) {
+ var ctor;
+ if (value == null) {
+ console.log("Reviver WRONGLY called with key: " + key + ", and value: " + value);
+ return 0;
+ }
+ if (typeof value === "object" &&
+ typeof value.ctor === "string" &&
+ typeof value.data !== "undefined") {
+ ctor = Reviver.constructors[value.ctor] || window[value.ctor];
+ if (typeof ctor === "function" &&
+ typeof ctor.fromJSON === "function") {
+
+ return ctor.fromJSON(value);
+ }
+ }
+ return value;
+}
+Reviver.constructors = {}; // A list of constructors the smart reviver should know about
+
+// A generic "toJSON" function that creates the data expected
+// by Reviver.
+// `ctorName` The name of the constructor to use to revive it
+// `obj` The object being serialized
+// `keys` (Optional) Array of the properties to serialize,
+// if not given then all of the objects "own" properties
+// that don't have function values will be serialized.
+// (Note: If you list a property in `keys`, it will be serialized
+// regardless of whether it's an "own" property.)
+// Returns: The structure (which will then be turned into a string
+// as part of the JSON.stringify algorithm)
+function Generic_toJSON(ctorName, obj, keys) {
+ var data, index, key;
+
+ if (!keys) {
+ keys = Object.keys(obj); // Only "own" properties are included
+ }
+
+ data = {};
+ for (index = 0; index < keys.length; ++index) {
+ key = keys[index];
+ data[key] = obj[key];
+ }
+ return {ctor: ctorName, data: data};
+}
+
+// A generic "fromJSON" function for use with Reviver: Just calls the
+// constructor function with no arguments, then applies all of the
+// key/value pairs from the raw data to the instance. Only useful for
+// constructors that can be reasonably called without arguments!
+// `ctor` The constructor to call
+// `data` The data to apply
+// Returns: The object
+function Generic_fromJSON(ctor, data) {
+ var obj, name;
+
+ obj = new ctor();
+ for (name in data) {
+ obj[name] = data[name];
+ }
+ return obj;
+}
+
+
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
+ * jQuery JavaScript Library v3.2.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2017-03-20T18:59Z
+ */
+( function( global, factory ) {
+
+ "use strict";
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var document = window.document;
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+
+
+ function DOMEval( code, doc ) {
+ doc = doc || document;
+
+ var script = doc.createElement( "script" );
+
+ script.text = code;
+ doc.head.appendChild( script ).parentNode.removeChild( script );
+ }
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+ version = "3.2.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android <=4.0 only
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([a-z])/g,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+
+ // Return all the elements in a clean array
+ if ( num == null ) {
+ return slice.call( this );
+ }
+
+ // Return just the one element from the set
+ return num < 0 ? this[ num + this.length ] : this[ num ];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = Array.isArray( copy ) ) ) ) {
+
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && Array.isArray( src ) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject( src ) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isFunction: function( obj ) {
+ return jQuery.type( obj ) === "function";
+ },
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+
+ // As of jQuery 3.0, isNumeric is limited to
+ // strings and numbers (primitives or objects)
+ // that can be coerced to finite numbers (gh-2662)
+ var type = jQuery.type( obj );
+ return ( type === "number" || type === "string" ) &&
+
+ // parseFloat NaNs numeric-cast false positives ("")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ !isNaN( obj - parseFloat( obj ) );
+ },
+
+ isPlainObject: function( obj ) {
+ var proto, Ctor;
+
+ // Detect obvious negatives
+ // Use toString instead of jQuery.type to catch host objects
+ if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+ return false;
+ }
+
+ proto = getProto( obj );
+
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
+ if ( !proto ) {
+ return true;
+ }
+
+ // Objects with prototype are plain iff they were constructed by a global Object function
+ Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+ return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+ },
+
+ isEmptyObject: function( obj ) {
+
+ /* eslint-disable no-unused-vars */
+ // See https://github.com/eslint/eslint/issues/6125
+ var name;
+
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android <=2.3 only (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ DOMEval( code );
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE <=9 - 11, Edge 12 - 13
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android <=4.0 only
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+ // Support: real iOS 8.2 only (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.3
+ * https://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-08-08
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // https://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+
+ // CSS escapes
+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+ fcssescape = function( ch, asCodePoint ) {
+ if ( asCodePoint ) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if ( ch === "\0" ) {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ },
+
+ disabledAncestor = addCombinator(
+ function( elem ) {
+ return elem.disabled === true && ("form" in elem || "label" in elem);
+ },
+ { dir: "parentNode", next: "legend" }
+ );
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+ // ID selector
+ if ( (m = match[1]) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( (elem = context.getElementById( m )) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && (elem = newContext.getElementById( m )) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !compilerCache[ selector + " " ] &&
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+ if ( nodeType !== 1 ) {
+ newContext = context;
+ newSelector = selector;
+
+ // qSA looks outside Element context, which is not what we want
+ // Thanks to Andrew Dupont for this workaround technique
+ // Support: IE <=8
+ // Exclude object elements
+ } else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( (nid = context.getAttribute( "id" )) ) {
+ nid = nid.replace( rcssescape, fcssescape );
+ } else {
+ context.setAttribute( "id", (nid = expando) );
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = "#" + nid + " " + toSelector( groups[i] );
+ }
+ newSelector = groups.join( "," );
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+ var el = document.createElement("fieldset");
+
+ try {
+ return !!fn( el );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( el.parentNode ) {
+ el.parentNode.removeChild( el );
+ }
+ // release memory in IE
+ el = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ a.sourceIndex - b.sourceIndex;
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+ return function( elem ) {
+
+ // Only certain elements can match :enabled or :disabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+ if ( "form" in elem ) {
+
+ // Check for inherited disabledness on relevant non-disabled elements:
+ // * listed form-associated elements in a disabled fieldset
+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+ // * option elements in a disabled optgroup
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+ // All such elements have a "form" property.
+ if ( elem.parentNode && elem.disabled === false ) {
+
+ // Option elements defer to a parent optgroup if present
+ if ( "label" in elem ) {
+ if ( "label" in elem.parentNode ) {
+ return elem.parentNode.disabled === disabled;
+ } else {
+ return elem.disabled === disabled;
+ }
+ }
+
+ // Support: IE 6 - 11
+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
+ return elem.isDisabled === disabled ||
+
+ // Where there is no isDisabled, check manually
+ /* jshint -W018 */
+ elem.isDisabled !== !disabled &&
+ disabledAncestor( elem ) === disabled;
+ }
+
+ return elem.disabled === disabled;
+
+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+ // even exist on them, let alone have a boolean value.
+ } else if ( "label" in elem ) {
+ return elem.disabled === disabled;
+ }
+
+ // Remaining elements are neither :enabled nor :disabled
+ return false;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, subWindow,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if ( preferredDoc !== document &&
+ (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+
+ // Support: IE 11, Edge
+ if ( subWindow.addEventListener ) {
+ subWindow.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( subWindow.attachEvent ) {
+ subWindow.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( el ) {
+ el.className = "i";
+ return !el.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( el ) {
+ el.appendChild( document.createComment("") );
+ return !el.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programmatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( el ) {
+ docElem.appendChild( el ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ });
+
+ // ID filter and find
+ if ( support.getById ) {
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var elem = context.getElementById( id );
+ return elem ? [ elem ] : [];
+ }
+ };
+ } else {
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+
+ // Support: IE 6 - 7 only
+ // getElementById is not reliable as a find shortcut
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var node, i, elems,
+ elem = context.getElementById( id );
+
+ if ( elem ) {
+
+ // Verify the id attribute
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+
+ // Fall back on getElementsByName
+ elems = context.getElementsByName( id );
+ i = 0;
+ while ( (elem = elems[i++]) ) {
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+ }
+ }
+
+ return [];
+ }
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See https://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( el ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // https://bugs.jquery.com/ticket/12359
+ docElem.appendChild( el ).innerHTML = " " +
+ "" +
+ " ";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !el.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !el.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibling-combinator selector` fails
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( el ) {
+ el.innerHTML = " " +
+ " ";
+
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ el.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( el.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( el.querySelectorAll(":enabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Support: IE9-11+
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
+ docElem.appendChild( el ).disabled = true;
+ if ( el.querySelectorAll(":disabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ el.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( el ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( el, "*" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( el, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !compilerCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.escape = function( sel ) {
+ return (sel + "").replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if ( useCache ) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": createDisabledPseudo( false ),
+ "disabled": createDisabledPseudo( true ),
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ skip = combinator.next,
+ key = skip || dir,
+ checkNonElements = base && key === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ return false;
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+ if ( skip && skip === elem.nodeName.toLowerCase() ) {
+ elem = elem[ dir ] || elem;
+ } else if ( (oldCache = uniqueCache[ key ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ key ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ if ( !context && elem.ownerDocument !== document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context || document, xml) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( el ) {
+ // Should return 1, but returns 4 (following)
+ return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( el ) {
+ el.innerHTML = " ";
+ return el.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( el ) {
+ el.innerHTML = " ";
+ el.firstChild.setAttribute( "value", "" );
+ return el.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( el ) {
+ return el.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+};
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+ }
+
+ // Single element
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+ }
+
+ // Arraylike of elements (jQuery, arguments, Array)
+ if ( typeof qualifier !== "string" ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+ }
+
+ // Simple selector that can be filtered directly, removing non-Elements
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ // Complex selector, compare the two sets, removing non-Elements
+ qualifier = jQuery.filter( qualifier, elements );
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
+ } );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ if ( elems.length === 1 && elem.nodeType === 1 ) {
+ return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+ }
+
+ return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i, ret,
+ len = this.length,
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ ret = this.pushStack( [] );
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ // Shortcut simple #id case for speed
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ if ( elem ) {
+
+ // Inject the element directly into the jQuery object
+ this[ 0 ] = elem;
+ this.length = 1;
+ }
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ targets = typeof selectors !== "string" && jQuery( selectors );
+
+ // Positional selectors never match, since there's no _selection_ context
+ if ( !rneedsContext.test( selectors ) ) {
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( targets ?
+ targets.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ if ( nodeName( elem, "iframe" ) ) {
+ return elem.contentDocument;
+ }
+
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+ // Treat the template element as a regular one in browsers that
+ // don't support it.
+ if ( nodeName( elem, "template" ) ) {
+ elem = elem.content || elem;
+ }
+
+ return jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = locked || options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( jQuery.isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory && !firing ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+function Identity( v ) {
+ return v;
+}
+function Thrower( ex ) {
+ throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+ var method;
+
+ try {
+
+ // Check for promise aspect first to privilege synchronous behavior
+ if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
+ method.call( value ).done( resolve ).fail( reject );
+
+ // Other thenables
+ } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
+ method.call( value, resolve, reject );
+
+ // Other non-thenables
+ } else {
+
+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+ // * false: [ value ].slice( 0 ) => resolve( value )
+ // * true: [ value ].slice( 1 ) => resolve()
+ resolve.apply( undefined, [ value ].slice( noValue ) );
+ }
+
+ // For Promises/A+, convert exceptions into rejections
+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+ // Deferred#then to conditionally suppress rejection.
+ } catch ( value ) {
+
+ // Support: Android 4.0 only
+ // Strict mode functions invoked without .call/.apply get global-object context
+ reject.apply( undefined, [ value ] );
+ }
+}
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, callbacks,
+ // ... .then handlers, argument index, [final state]
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
+ jQuery.Callbacks( "memory" ), 2 ],
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ "catch": function( fn ) {
+ return promise.then( null, fn );
+ },
+
+ // Keep pipe for back-compat
+ pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+
+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
+ var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+ then: function( onFulfilled, onRejected, onProgress ) {
+ var maxDepth = 0;
+ function resolve( depth, deferred, handler, special ) {
+ return function() {
+ var that = this,
+ args = arguments,
+ mightThrow = function() {
+ var returned, then;
+
+ // Support: Promises/A+ section 2.3.3.3.3
+ // https://promisesaplus.com/#point-59
+ // Ignore double-resolution attempts
+ if ( depth < maxDepth ) {
+ return;
+ }
+
+ returned = handler.apply( that, args );
+
+ // Support: Promises/A+ section 2.3.1
+ // https://promisesaplus.com/#point-48
+ if ( returned === deferred.promise() ) {
+ throw new TypeError( "Thenable self-resolution" );
+ }
+
+ // Support: Promises/A+ sections 2.3.3.1, 3.5
+ // https://promisesaplus.com/#point-54
+ // https://promisesaplus.com/#point-75
+ // Retrieve `then` only once
+ then = returned &&
+
+ // Support: Promises/A+ section 2.3.4
+ // https://promisesaplus.com/#point-64
+ // Only check objects and functions for thenability
+ ( typeof returned === "object" ||
+ typeof returned === "function" ) &&
+ returned.then;
+
+ // Handle a returned thenable
+ if ( jQuery.isFunction( then ) ) {
+
+ // Special processors (notify) just wait for resolution
+ if ( special ) {
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special )
+ );
+
+ // Normal processors (resolve) also hook into progress
+ } else {
+
+ // ...and disregard older resolution values
+ maxDepth++;
+
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special ),
+ resolve( maxDepth, deferred, Identity,
+ deferred.notifyWith )
+ );
+ }
+
+ // Handle all other returned values
+ } else {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Identity ) {
+ that = undefined;
+ args = [ returned ];
+ }
+
+ // Process the value(s)
+ // Default process is resolve
+ ( special || deferred.resolveWith )( that, args );
+ }
+ },
+
+ // Only normal processors (resolve) catch and reject exceptions
+ process = special ?
+ mightThrow :
+ function() {
+ try {
+ mightThrow();
+ } catch ( e ) {
+
+ if ( jQuery.Deferred.exceptionHook ) {
+ jQuery.Deferred.exceptionHook( e,
+ process.stackTrace );
+ }
+
+ // Support: Promises/A+ section 2.3.3.3.4.1
+ // https://promisesaplus.com/#point-61
+ // Ignore post-resolution exceptions
+ if ( depth + 1 >= maxDepth ) {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Thrower ) {
+ that = undefined;
+ args = [ e ];
+ }
+
+ deferred.rejectWith( that, args );
+ }
+ }
+ };
+
+ // Support: Promises/A+ section 2.3.3.3.1
+ // https://promisesaplus.com/#point-57
+ // Re-resolve promises immediately to dodge false rejection from
+ // subsequent errors
+ if ( depth ) {
+ process();
+ } else {
+
+ // Call an optional hook to record the stack, in case of exception
+ // since it's otherwise lost when execution goes async
+ if ( jQuery.Deferred.getStackHook ) {
+ process.stackTrace = jQuery.Deferred.getStackHook();
+ }
+ window.setTimeout( process );
+ }
+ };
+ }
+
+ return jQuery.Deferred( function( newDefer ) {
+
+ // progress_handlers.add( ... )
+ tuples[ 0 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ jQuery.isFunction( onProgress ) ?
+ onProgress :
+ Identity,
+ newDefer.notifyWith
+ )
+ );
+
+ // fulfilled_handlers.add( ... )
+ tuples[ 1 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ jQuery.isFunction( onFulfilled ) ?
+ onFulfilled :
+ Identity
+ )
+ );
+
+ // rejected_handlers.add( ... )
+ tuples[ 2 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ jQuery.isFunction( onRejected ) ?
+ onRejected :
+ Thrower
+ )
+ );
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 5 ];
+
+ // promise.progress = list.add
+ // promise.done = list.add
+ // promise.fail = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(
+ function() {
+
+ // state = "resolved" (i.e., fulfilled)
+ // state = "rejected"
+ state = stateString;
+ },
+
+ // rejected_callbacks.disable
+ // fulfilled_callbacks.disable
+ tuples[ 3 - i ][ 2 ].disable,
+
+ // progress_callbacks.lock
+ tuples[ 0 ][ 2 ].lock
+ );
+ }
+
+ // progress_handlers.fire
+ // fulfilled_handlers.fire
+ // rejected_handlers.fire
+ list.add( tuple[ 3 ].fire );
+
+ // deferred.notify = function() { deferred.notifyWith(...) }
+ // deferred.resolve = function() { deferred.resolveWith(...) }
+ // deferred.reject = function() { deferred.rejectWith(...) }
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+ return this;
+ };
+
+ // deferred.notifyWith = list.fireWith
+ // deferred.resolveWith = list.fireWith
+ // deferred.rejectWith = list.fireWith
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( singleValue ) {
+ var
+
+ // count of uncompleted subordinates
+ remaining = arguments.length,
+
+ // count of unprocessed arguments
+ i = remaining,
+
+ // subordinate fulfillment data
+ resolveContexts = Array( i ),
+ resolveValues = slice.call( arguments ),
+
+ // the master Deferred
+ master = jQuery.Deferred(),
+
+ // subordinate callback factory
+ updateFunc = function( i ) {
+ return function( value ) {
+ resolveContexts[ i ] = this;
+ resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( !( --remaining ) ) {
+ master.resolveWith( resolveContexts, resolveValues );
+ }
+ };
+ };
+
+ // Single- and empty arguments are adopted like Promise.resolve
+ if ( remaining <= 1 ) {
+ adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ !remaining );
+
+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
+ if ( master.state() === "pending" ||
+ jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+ return master.then();
+ }
+ }
+
+ // Multiple arguments are aggregated like Promise.all array elements
+ while ( i-- ) {
+ adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ }
+
+ return master.promise();
+ }
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+ // Support: IE 8 - 9 only
+ // Console exists when dev tools are open, which can happen at any time
+ if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+ window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+ }
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+ window.setTimeout( function() {
+ throw error;
+ } );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+ readyList
+ .then( fn )
+
+ // Wrap jQuery.readyException in a function so that the lookup
+ // happens at the time of error handling instead of callback
+ // registration.
+ .catch( function( error ) {
+ jQuery.readyException( error );
+ } );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+ }
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+} else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ if ( chainable ) {
+ return elems;
+ }
+
+ // Gets
+ if ( bulk ) {
+ return fn.call( elems );
+ }
+
+ return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ cache: function( owner ) {
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ // Always use camelCase key (gh-2257)
+ if ( typeof data === "string" ) {
+ cache[ jQuery.camelCase( data ) ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ jQuery.camelCase( prop ) ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+
+ // Always use camelCase key (gh-2257)
+ owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
+ },
+ access: function( owner, key, value ) {
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ return this.get( owner, key );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key !== undefined ) {
+
+ // Support array or space separated string of keys
+ if ( Array.isArray( key ) ) {
+
+ // If key is an array of keys...
+ // We always set camelCase keys, so remove that.
+ key = key.map( jQuery.camelCase );
+ } else {
+ key = jQuery.camelCase( key );
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ key = key in cache ?
+ [ key ] :
+ ( key.match( rnothtmlwhite ) || [] );
+ }
+
+ i = key.length;
+
+ while ( i-- ) {
+ delete cache[ key[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <=35 - 45
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+ if ( data === "true" ) {
+ return true;
+ }
+
+ if ( data === "false" ) {
+ return false;
+ }
+
+ if ( data === "null" ) {
+ return null;
+ }
+
+ // Only convert to a number if it doesn't change the string
+ if ( data === +data + "" ) {
+ return +data;
+ }
+
+ if ( rbrace.test( data ) ) {
+ return JSON.parse( data );
+ }
+
+ return data;
+}
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = getData( data );
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE 11 only
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // The key will always be camelCased in Data
+ data = dataUser.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each( function() {
+
+ // We always store the camelCased key
+ dataUser.set( this, key, value );
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || Array.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHiddenWithinTree = function( elem, el ) {
+
+ // isHiddenWithinTree might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+
+ // Inline style trumps all
+ return elem.style.display === "none" ||
+ elem.style.display === "" &&
+
+ // Otherwise, check computed style
+ // Support: Firefox <=43 - 45
+ // Disconnected elements can have computed display: none, so first confirm that elem is
+ // in the document.
+ jQuery.contains( elem.ownerDocument, elem ) &&
+
+ jQuery.css( elem, "display" ) === "none";
+ };
+
+var swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted,
+ scale = 1,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() {
+ return tween.cur();
+ } :
+ function() {
+ return jQuery.css( elem, prop, "" );
+ },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ do {
+
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ initialInUnit = initialInUnit / scale;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // Break the loop if scale is unchanged or perfect, or if we've just had enough.
+ } while (
+ scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+ );
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+ var temp,
+ doc = elem.ownerDocument,
+ nodeName = elem.nodeName,
+ display = defaultDisplayMap[ nodeName ];
+
+ if ( display ) {
+ return display;
+ }
+
+ temp = doc.body.appendChild( doc.createElement( nodeName ) );
+ display = jQuery.css( temp, "display" );
+
+ temp.parentNode.removeChild( temp );
+
+ if ( display === "none" ) {
+ display = "block";
+ }
+ defaultDisplayMap[ nodeName ] = display;
+
+ return display;
+}
+
+function showHide( elements, show ) {
+ var display, elem,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ // Determine new display value for elements that need to change
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ display = elem.style.display;
+ if ( show ) {
+
+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+ // check is required in this first loop unless we have a nonempty display value (either
+ // inline or about-to-be-restored)
+ if ( display === "none" ) {
+ values[ index ] = dataPriv.get( elem, "display" ) || null;
+ if ( !values[ index ] ) {
+ elem.style.display = "";
+ }
+ }
+ if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+ values[ index ] = getDefaultDisplay( elem );
+ }
+ } else {
+ if ( display !== "none" ) {
+ values[ index ] = "none";
+
+ // Remember what we're overwriting
+ dataPriv.set( elem, "display", display );
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop to avoid constant reflow
+ for ( index = 0; index < length; index++ ) {
+ if ( values[ index ] != null ) {
+ elements[ index ].style.display = values[ index ];
+ }
+ }
+
+ return elements;
+}
+
+jQuery.fn.extend( {
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each( function() {
+ if ( isHiddenWithinTree( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ } );
+ }
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // Support: IE <=9 only
+ option: [ 1, "", " " ],
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting or other required elements.
+ thead: [ 1, "" ],
+ col: [ 2, "" ],
+ tr: [ 2, "" ],
+ td: [ 3, "" ],
+
+ _default: [ 0, "", "" ]
+};
+
+// Support: IE <=9 only
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+ // Support: IE <=9 - 11 only
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret;
+
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ ret = context.getElementsByTagName( tag || "*" );
+
+ } else if ( typeof context.querySelectorAll !== "undefined" ) {
+ ret = context.querySelectorAll( tag || "*" );
+
+ } else {
+ ret = [];
+ }
+
+ if ( tag === undefined || tag && nodeName( context, tag ) ) {
+ return jQuery.merge( [ context ], ret );
+ }
+
+ return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+var documentElement = document.documentElement;
+
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE <=9 only
+// See #13393 for more info
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Ensure that invalid selectors throw exceptions at attach time
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
+ if ( selector ) {
+ jQuery.find.matchesSelector( documentElement, selector );
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = {};
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( nativeEvent ) {
+
+ // Make a writable jQuery.Event from the native event object
+ var event = jQuery.event.fix( nativeEvent );
+
+ var i, j, ret, matched, handleObj, handlerQueue,
+ args = new Array( arguments.length ),
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+
+ for ( i = 1; i < arguments.length; i++ ) {
+ args[ i ] = arguments[ i ];
+ }
+
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ if ( delegateCount &&
+
+ // Support: IE <=9
+ // Black-hole SVG instance trees (trac-13180)
+ cur.nodeType &&
+
+ // Support: Firefox <=42
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+ // Support: IE 11 only
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+ !( event.type === "click" && event.button >= 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+ matchedHandlers = [];
+ matchedSelectors = {};
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matchedSelectors[ sel ] === undefined ) {
+ matchedSelectors[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matchedSelectors[ sel ] ) {
+ matchedHandlers.push( handleObj );
+ }
+ }
+ if ( matchedHandlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ cur = this;
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ addProp: function( name, hook ) {
+ Object.defineProperty( jQuery.Event.prototype, name, {
+ enumerable: true,
+ configurable: true,
+
+ get: jQuery.isFunction( hook ) ?
+ function() {
+ if ( this.originalEvent ) {
+ return hook( this.originalEvent );
+ }
+ } :
+ function() {
+ if ( this.originalEvent ) {
+ return this.originalEvent[ name ];
+ }
+ },
+
+ set: function( value ) {
+ Object.defineProperty( this, name, {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: value
+ } );
+ }
+ } );
+ },
+
+ fix: function( originalEvent ) {
+ return originalEvent[ jQuery.expando ] ?
+ originalEvent :
+ new jQuery.Event( originalEvent );
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android <=2.3 only
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Create target properties
+ // Support: Safari <=6 - 7 only
+ // Target should not be a text node (#504, #13143)
+ this.target = ( src.target && src.target.nodeType === 3 ) ?
+ src.target.parentNode :
+ src.target;
+
+ this.currentTarget = src.currentTarget;
+ this.relatedTarget = src.relatedTarget;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+ altKey: true,
+ bubbles: true,
+ cancelable: true,
+ changedTouches: true,
+ ctrlKey: true,
+ detail: true,
+ eventPhase: true,
+ metaKey: true,
+ pageX: true,
+ pageY: true,
+ shiftKey: true,
+ view: true,
+ "char": true,
+ charCode: true,
+ key: true,
+ keyCode: true,
+ button: true,
+ buttons: true,
+ clientX: true,
+ clientY: true,
+ offsetX: true,
+ offsetY: true,
+ pointerId: true,
+ pointerType: true,
+ screenX: true,
+ screenY: true,
+ targetTouches: true,
+ toElement: true,
+ touches: true,
+
+ which: function( event ) {
+ var button = event.button;
+
+ // Add which for key events
+ if ( event.which == null && rkeyEvent.test( event.type ) ) {
+ return event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
+ if ( button & 1 ) {
+ return 1;
+ }
+
+ if ( button & 2 ) {
+ return 3;
+ }
+
+ if ( button & 4 ) {
+ return 2;
+ }
+
+ return 0;
+ }
+
+ return event.which;
+ }
+}, jQuery.event.addProp );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+
+ /* eslint-disable max-len */
+
+ // See https://github.com/eslint/eslint/issues/3229
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+ /* eslint-enable */
+
+ // Support: IE <=10 - 11, Edge 12 - 13
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+