0;x--)h="0"+h;return k>-1&&(h=h.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1"+m.delimiters.thousands)),0===c.indexOf(".")&&(h=""),l=h+v+(q?q:""),n?l=(n&&w?"(":"")+l+(n&&w?")":""):j>=0?l=0===j?(w?"-":"+")+l:l+(w?"-":"+"):w&&(l="-"+l),l},stringToNumber:function(a){var b,c,d,e=f[h.currentLocale],g=a,i={thousand:3,million:6,billion:9,trillion:12};if(h.zeroFormat&&a===h.zeroFormat)c=0;else if(h.nullFormat&&a===h.nullFormat||!a.replace(/[^0-9]+/g,"").length)c=null;else{c=1,"."!==e.delimiters.decimal&&(a=a.replace(/\./g,"").replace(e.delimiters.decimal,"."));for(b in i)if(d=new RegExp("[^a-zA-Z]"+e.abbreviations[b]+"(?:\\)|(\\"+e.currency.symbol+")?(?:\\))?)?$"),g.match(d)){c*=Math.pow(10,i[b]);break}c*=(a.split("-").length+Math.min(a.split("(").length-1,a.split(")").length-1))%2?1:-1,a=a.replace(/[^0-9\.]+/g,""),c*=Number(a)}return c},isNaN:function(a){return"number"==typeof a&&isNaN(a)},includes:function(a,b){return-1!==a.indexOf(b)},insert:function(a,b,c){return a.slice(0,c)+b+a.slice(c)},reduce:function(a,b){if(null===this)throw new TypeError("Array.prototype.reduce called on null or undefined");if("function"!=typeof b)throw new TypeError(b+" is not a function");var c,d=Object(a),e=d.length>>>0,f=0;if(3===arguments.length)c=arguments[2];else{for(;e>f&&!(f in d);)f++;if(f>=e)throw new TypeError("Reduce of empty array with no initial value");c=d[f++]}for(;e>f;f++)f in d&&(c=b(c,d[f],f,d));return c},multiplier:function(a){var b=a.toString().split(".");return b.length<2?1:Math.pow(10,b[1].length)},correctionFactor:function(){var a=Array.prototype.slice.call(arguments);return a.reduce(function(a,b){var d=c.multiplier(b);return a>d?a:d},1)},toFixed:function(a,b,c,d){var e,f,g,h,i=a.toString().split("."),j=b-(d||0);return e=2===i.length?Math.min(Math.max(i[1].length,j),b):j,g=Math.pow(10,e),h=(c(a+"e+"+e)/g).toFixed(e),d>b-e&&(f=new RegExp("\\.?0{1,"+(d-(b-e))+"}$"),h=h.replace(f,"")),h}},b.options=h,b.formats=e,b.locales=f,b.locale=function(a){return a&&(h.currentLocale=a.toLowerCase()),h.currentLocale},b.localeData=function(a){if(!a)return f[h.currentLocale];if(a=a.toLowerCase(),!f[a])throw new Error("Unknown locale : "+a);return f[a]},b.reset=function(){for(var a in g)h[a]=g[a]},b.zeroFormat=function(a){h.zeroFormat="string"==typeof a?a:null},b.nullFormat=function(a){h.nullFormat="string"==typeof a?a:null},b.defaultFormat=function(a){h.defaultFormat="string"==typeof a?a:"0.0"},b.register=function(a,b,c){if(b=b.toLowerCase(),this[a+"s"][b])throw new TypeError(b+" "+a+" already registered.");return this[a+"s"][b]=c,c},b.validate=function(a,c){var d,e,f,g,h,i,j,k;if("string"!=typeof a&&(a+="",console.warn&&console.warn("Numeral.js: Value is not string. It has been co-erced to: ",a)),a=a.trim(),a.match(/^\d+$/))return!0;if(""===a)return!1;try{j=b.localeData(c)}catch(l){j=b.localeData(b.locale())}return f=j.currency.symbol,h=j.abbreviations,d=j.delimiters.decimal,e="."===j.delimiters.thousands?"\\.":j.delimiters.thousands,k=a.match(/^[^\d]+/),null!==k&&(a=a.substr(1),k[0]!==f)?!1:(k=a.match(/[^\d]+$/),null!==k&&(a=a.slice(0,-1),k[0]!==h.thousand&&k[0]!==h.million&&k[0]!==h.billion&&k[0]!==h.trillion)?!1:(i=new RegExp(e+"{2}"),a.match(/[^\d.,]/g)?!1:(g=a.split(d),g.length>2?!1:g.length<2?!!g[0].match(/^\d+.*\d$/)&&!g[0].match(i):1===g[0].length?!!g[0].match(/^\d+$/)&&!g[0].match(i)&&!!g[1].match(/^\d+$/):!!g[0].match(/^\d+.*\d$/)&&!g[0].match(i)&&!!g[1].match(/^\d+$/))))},b.fn=a.prototype={clone:function(){return b(this)},format:function(a,c){var d,f,g,i=this._value,j=a||h.defaultFormat;if(c=c||Math.round,0===i&&null!==h.zeroFormat)f=h.zeroFormat;else if(null===i&&null!==h.nullFormat)f=h.nullFormat;else{for(d in e)if(j.match(e[d].regexps.format)){g=e[d].format;break}g=g||b._.numberToFormat,f=g(i,j,c)}return f},value:function(){return this._value},input:function(){return this._input},set:function(a){return this._value=Number(a),this},add:function(a){function b(a,b,c,e){return a+Math.round(d*b)}var d=c.correctionFactor.call(null,this._value,a);return this._value=c.reduce([this._value,a],b,0)/d,this},subtract:function(a){function b(a,b,c,e){return a-Math.round(d*b)}var d=c.correctionFactor.call(null,this._value,a);return this._value=c.reduce([a],b,Math.round(this._value*d))/d,this},multiply:function(a){function b(a,b,d,e){var f=c.correctionFactor(a,b);return Math.round(a*f)*Math.round(b*f)/Math.round(f*f)}return this._value=c.reduce([this._value,a],b,1),this},divide:function(a){function b(a,b,d,e){var f=c.correctionFactor(a,b);return Math.round(a*f)/Math.round(b*f)}return this._value=c.reduce([this._value,a],b),this},difference:function(a){return Math.abs(b(this._value).subtract(a).value())}},b.register("locale","en",{delimiters:{thousands:",",decimal:"."},abbreviations:{thousand:"k",million:"m",billion:"b",trillion:"t"},ordinal:function(a){var b=a%10;return 1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"},currency:{symbol:"$"}}),function(){b.register("format","bps",{regexps:{format:/(BPS)/,unformat:/(BPS)/},format:function(a,c,d){var e,f=b._.includes(c," BPS")?" ":"";return a=1e4*a,c=c.replace(/\s?BPS/,""),e=b._.numberToFormat(a,c,d),b._.includes(e,")")?(e=e.split(""),e.splice(-1,0,f+"BPS"),e=e.join("")):e=e+f+"BPS",e},unformat:function(a){return+(1e-4*b._.stringToNumber(a)).toFixed(15)}})}(),function(){var a={base:1e3,suffixes:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]},c={base:1024,suffixes:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},d=a.suffixes.concat(c.suffixes.filter(function(b){return a.suffixes.indexOf(b)<0})),e=d.join("|");e="("+e.replace("B","B(?!PS)")+")",b.register("format","bytes",{regexps:{format:/([0\s]i?b)/,unformat:new RegExp(e)},format:function(d,e,f){var g,h,i,j,k=b._.includes(e,"ib")?c:a,l=b._.includes(e," b")||b._.includes(e," ib")?" ":"";for(e=e.replace(/\s?i?b/,""),h=0;h<=k.suffixes.length;h++)if(i=Math.pow(k.base,h),j=Math.pow(k.base,h+1),null===d||0===d||d>=i&&j>d){l+=k.suffixes[h],i>0&&(d/=i);break}return g=b._.numberToFormat(d,e,f),g+l},unformat:function(d){var e,f,g=b._.stringToNumber(d);if(g){for(e=a.suffixes.length-1;e>=0;e--){if(b._.includes(d,a.suffixes[e])){f=Math.pow(a.base,e);break}if(b._.includes(d,c.suffixes[e])){f=Math.pow(c.base,e);break}}g*=f||1}return g}})}(),function(){b.register("format","currency",{regexps:{format:/(\$)/},format:function(a,c,d){var e,f,g,h=b.locales[b.options.currentLocale],i={before:c.match(/^([\+|\-|\(|\s|\$]*)/)[0],after:c.match(/([\+|\-|\)|\s|\$]*)$/)[0]};for(c=c.replace(/\s?\$\s?/,""),e=b._.numberToFormat(a,c,d),a>=0?(i.before=i.before.replace(/[\-\(]/,""),i.after=i.after.replace(/[\-\)]/,"")):0>a&&!b._.includes(i.before,"-")&&!b._.includes(i.before,"(")&&(i.before="-"+i.before),g=0;g
" +
+ "This is the first BitNode that you play through. It has no special " +
+ "modifications or mechanics.
" +
+ "Destroying this BitNode will give you Source-File 1, or if you already have " +
+ "this Source-File it will upgrade its level up to a maximum of 3. This Source-File " +
+ "lets the player start with 32GB of RAM on his/her home computer when entering a " +
+ "new BitNode, and also increases all of the player's multipliers by:
" +
+ "Level 1: 16%
" +
+ "Level 2: 24%
" +
+ "Level 3: 28%");
+ BitNodes["BitNode2"] = new BitNode(2, "Rise of the Underworld", "From the shadows, they rose", //Gangs
+ "From the shadows, they rose.
Organized crime groups quickly filled the void of power " +
+ "left behind from the collapse of Western government in the 2050's. As society and civlization broke down, " +
+ "people quickly succumbed to the innate human impulse of evil and savagery. The organized crime " +
+ "factions quickly rose to the top of the modern world.
" +
+ "In this BitNode:
The maximum amount of money available on a server is significantly decreased
" +
+ "The amount of money gained from crimes and Infiltration is tripled
" +
+ "Certain Factions (Slum Snakes, Tetrads, The Syndicate, The Dark Army, Speakers for the Dead, " +
+ "NiteSec, The Black Hand) give the player the ability to form and manage their own gangs. These gangs " +
+ "will earn the player money and reputation with the corresponding Faction
" +
+ "Every Augmentation in the game will be available through the Factions listed above
" +
+ "For every Faction NOT listed above, reputation gains are halved
" +
+ "You will no longer gain passive reputation with Factions
" +
+ "Destroying this BitNode will give you Source-File 2, or if you already have this Source-File it will " +
+ "upgrade its level up to a maximum of 3. This Source-File increases the player's crime success rate, " +
+ "crime money, and charisma multipliers by:
" +
+ "Level 1: 20%
" +
+ "Level 2: 30%
" +
+ "Level 3: 35%");
+ BitNodes["BitNode3"] = new BitNode(3, "Corporatocracy", "The Price of Civilization",
+ "Our greatest illusion is that a healthy society can revolve around a " +
+ "single-minded pursuit of wealth.
" +
+ "Sometime in the early 21st century economic and political globalization turned " +
+ "the world into a corporatocracy, and it never looked back. Now, the privileged " +
+ "elite will happily bankrupt their own countrymen, decimate their own community, " +
+ "and evict their neighbors from houses in their desperate bid to increase their wealth.
" +
+ "In this BitNode you can create and manage your own corporation. Running a successful corporation " +
+ "has the potential of generating massive profits. All other forms of income are reduced by 75%. Furthermore:
" +
+ "The price and reputation cost of all Augmentations is tripled
" +
+ "The starting and maximum amount of money on servers is reduced by 75%
" +
+ "Server growth rate is reduced by 80%
" +
+ "You will start out with $150b so that you can start your corporation
" +
+ "You now only need 75 reputation with a faction in order to donate to it, rather than 150
" +
+ "Destroying this BitNode will give you Source-File 3, or if you already have this Source-File it will " +
+ "upgrade its level up to a maximum of 3. This Source-File lets you create corporations on other BitNodes (although " +
+ "some BitNodes will disable this mechanic). This Source-File also increases your charisma and company salary multipliers by:
" +
+ "Level 1: 8%
" +
+ "Level 2: 12%
" +
+ "Level 3: 14%");
+ BitNodes["BitNode4"] = new BitNode(4, "The Singularity", "The Man and the Machine", "The Singularity has arrived. The human race is gone, replaced " +
+ "by artificially superintelligent beings that are more machine than man.
" +
+ "In this BitNode, progressing is significantly harder. Experience gain rates " +
+ "for all stats are reduced. Most methods of earning money will now give significantly less.
" +
+ "In this BitNode you will gain access to a new set of Netscript Functions known as Singularity Functions. " +
+ "These functions allow you to control most aspects of the game through scripts, including working for factions/companies, " +
+ "purchasing/installing Augmentations, and creating programs.
" +
+ "Destroying this BitNode will give you Source-File 4, or if you already have this Source-File it will " +
+ "upgrade its level up to a maximum of 3. This Source-File lets you access and use the Singularity " +
+ "Functions in other BitNodes. Each level of this Source-File will open up more Singularity Functions " +
+ "that you can use.");
+ BitNodes["BitNode5"] = new BitNode(5, "Artificial Intelligence", "Posthuman", "They said it couldn't be done. They said the human brain, " +
+ "along with its consciousness and intelligence, couldn't be replicated. They said the complexity " +
+ "of the brain results from unpredictable, nonlinear interactions that couldn't be modeled " +
+ "by 1's and 0's. They were wrong.
" +
+ "In this BitNode:
" +
+ "The base security level of servers is doubled
" +
+ "The starting money on servers is halved, but the maximum money remains the same
" +
+ "Most methods of earning money now give significantly less
" +
+ "Infiltration gives 50% more reputation and money
" +
+ "Corporations have 50% lower valuations and are therefore less profitable
" +
+ "Augmentations are more expensive
" +
+ "Hacking experience gain rates are reduced
" +
+ "Destroying this BitNode will give you Source-File 5, or if you already have this Source-File it will " +
+ "upgrade its level up to a maximum of 3. This Source-File grants you a special new stat called Intelligence. " +
+ "Intelligence is unique because it is permanent and persistent (it never gets reset back to 1). However " +
+ "gaining Intelligence experience is much slower than other stats, and it is also hidden (you won't know " +
+ "when you gain experience and how much). Higher Intelligence levels will boost your production for many actions " +
+ "in the game.
" +
+ "In addition, this Source-File will unlock the getBitNodeMultipliers() Netscript function, " +
+ "and will also raise all of your hacking-related multipliers by:
" +
+ "Level 1: 4%
" +
+ "Level 2: 6%
" +
+ "Level 3: 7%");
+ BitNodes["BitNode6"] = new BitNode(6, "Bladeburners", "Like Tears in Rain",
+ "In the middle of the 21st century, OmniTek Incorporated began designing and manufacturing advanced synthetic " +
+ "androids, or Synthoids for short. They achieved a major technological breakthrough in the sixth generation " +
+ "of their Synthoid design, called MK-VI, by developing a hyperintelligent AI. Many argue that this was " +
+ "the first sentient AI ever created. This resulted in Synthoid models that were stronger, faster, and more intelligent " +
+ "than the humans that had created them.
" +
+ "In this BitNode you will be able to access the Bladeburner Division at the NSA, which provides a new mechanic " +
+ "for progression. Furthermore:
" +
+ "Hacking and Hacknet Nodes will be significantly less profitable
" +
+ "Your hacking level is reduced by 50%
" +
+ "Hacking experience gain from scripts is reduced by 80%
" +
+ "Corporations have 80% lower valuations and are therefore less profitable
" +
+ "Working for companies is 50% less profitable
" +
+ "Crimes and Infiltration are 75% less profitable
" +
+ "Destroying this BitNode will give you Source-File 6, or if you already have this Source-File it will upgrade " +
+ "its level up to a maximum of 3. This Source-File allows you to access the NSA's Bladeburner Division in other " +
+ "BitNodes. In addition, this Source-File will raise the experience gain rate of all your combat stats by:
" +
+ "Level 1: 8%
" +
+ "Level 2: 12%
" +
+ "Level 3: 14%");
+ BitNodes["BitNode7"] = new BitNode(7, "Hacktocracy", "COMING SOON"); //Healthy Hacknet balancing mechanic
+ BitNodes["BitNode8"] = new BitNode(8, "Ghost of Wall Street", "Money never sleeps",
+ "You are trying to make a name for yourself as an up-and-coming hedge fund manager on Wall Street.
" +
+ "In this BitNode:
" +
+ "You start with $100 million
" +
+ "The only way to earn money is by trading on the stock market
" +
+ "You start with a WSE membership and access to the TIX API
" +
+ "You are able to short stocks and place different types of orders (limit/stop)
" +
+ "You can immediately donate to factions to gain reputation
" +
+ "Destroying this BitNode will give you Source-File 8, or if you already have this Source-File it will " +
+ "upgrade its level up to a maximum of 3. This Source-File grants the following benefits:
" +
+ "Level 1: Permanent access to WSE and TIX API
" +
+ "Level 2: Ability to short stocks in other BitNodes
" +
+ "Level 3: Ability to use limit/stop orders in other BitNodes
" +
+ "This Source-File also increases your hacking growth multipliers by: " +
+ "
Level 1: 8%
Level 2: 12%
Level 3: 14%");
+ BitNodes["BitNode9"] = new BitNode(9, "Do Androids Dream?", "COMING SOON");
+ BitNodes["BitNode10"] = new BitNode(10, "MegaCorp", "COMING SOON"); //Not sure yet
+ BitNodes["BitNode11"] = new BitNode(11, "The Big Crash", "Okay. Sell it all.",
+ "The 2050s was defined by the massive amounts of violent civil unrest and anarchic rebellion that rose all around the world. It was this period " +
+ "of disorder that eventually lead to the governmental reformation of many global superpowers, most notably " +
+ "the USA and China. But just as the world was slowly beginning to recover from these dark times, financial catastrophe hit.
" +
+ "In many countries, the high cost of trying to deal with the civil disorder bankrupted the governments. In all of this chaos and confusion, hackers " +
+ "were able to steal billions of dollars from the world's largest electronic banks, prompting an international banking crisis as " +
+ "governments were unable to bail out insolvent banks. Now, the world is slowly crumbling in the middle of the biggest economic crisis of all time.
" +
+ "In this BitNode:
" +
+ "The starting and maximum amount of money available on servers is significantly decreased
" +
+ "The growth rate of servers is halved
" +
+ "Weakening a server is twice as effective
" +
+ "Company wages are decreased by 50%
" +
+ "Corporation valuations are 99% lower and are therefore significantly less profitable
" +
+ "Hacknet Node production is significantly decreased
" +
+ "Crime and Infiltration are more lucrative
" +
+ "Augmentations are twice as expensive
" +
+ "Destroying this BitNode will give you Source-File 11, or if you already have this Source-File it will " +
+ "upgrade its level up to a maximum of 3. This Source-File makes it so that company favor increases BOTH " +
+ "the player's salary and reputation gain rate at that company by 1% per favor (rather than just the reputation gain). " +
+ "This Source-File also increases the player's company salary and reputation gain multipliers by:
" +
+ "Level 1: 24%
" +
+ "Level 2: 36%
" +
+ "Level 3: 42%");
+
+ //Books: Frontera, Shiner
+ BitNodes["BitNode12"] = new BitNode(12, "fOS", "COMING SOON"); //Unlocks the new game mode and the rest of the BitNodes
+ BitNodes["BitNode13"] = new BitNode(13, "", "COMING SOON");
+ BitNodes["BitNode14"] = new BitNode(14, "", "COMING SOON");
+ BitNodes["BitNode15"] = new BitNode(15, "", "COMING SOON");
+ BitNodes["BitNode16"] = new BitNode(16, "", "COMING SOON");
+ BitNodes["BitNode17"] = new BitNode(17, "", "COMING SOON");
+ BitNodes["BitNode18"] = new BitNode(18, "", "COMING SOON");
+ BitNodes["BitNode19"] = new BitNode(19, "", "COMING SOON");
+ BitNodes["BitNode20"] = new BitNode(20, "", "COMING SOON");
+ BitNodes["BitNode21"] = new BitNode(21, "", "COMING SOON");
+ BitNodes["BitNode22"] = new BitNode(22, "", "COMING SOON");
+ BitNodes["BitNode23"] = new BitNode(23, "", "COMING SOON");
+ BitNodes["BitNode24"] = new BitNode(24, "", "COMING SOON");
+}
+
+let BitNodeMultipliers = {
+ HackingLevelMultiplier: 1,
+
+ ServerMaxMoney: 1,
+ ServerStartingMoney: 1,
+ ServerGrowthRate: 1,
+ ServerWeakenRate: 1,
+ ServerStartingSecurity: 1,
+
+ ManualHackMoney: 1,
+ ScriptHackMoney: 1,
+ CompanyWorkMoney: 1,
+ CrimeMoney: 1,
+ HacknetNodeMoney: 1,
+
+ CompanyWorkExpGain: 1,
+ ClassGymExpGain: 1,
+ FactionWorkExpGain: 1,
+ HackExpGain: 1,
+ CrimeExpGain: 1,
+
+ FactionWorkRepGain: 1,
+ FactionPassiveRepGain: 1,
+ RepToDonateToFaction: 1,
+
+ AugmentationRepCost: 1,
+ AugmentationMoneyCost: 1,
+
+ InfiltrationMoney: 1,
+ InfiltrationRep: 1,
+
+ CorporationValuation: 1,
+}
+
+function initBitNodeMultipliers() {
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_0__["Player"].bitNodeN == null) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_0__["Player"].bitNodeN = 1;
+ }
+ for (var mult in BitNodeMultipliers) {
+ if (BitNodeMultipliers.hasOwnProperty(mult)) {
+ BitNodeMultipliers[mult] = 1;
+ }
+ }
+
+ switch (_Player_js__WEBPACK_IMPORTED_MODULE_0__["Player"].bitNodeN) {
+ case 1: //Source Genesis (every multiplier is 1)
+ break;
+ case 2: //Rise of the Underworld
+ BitNodeMultipliers.ServerMaxMoney = 0.2;
+ BitNodeMultipliers.ServerStartingMoney = 0.4;
+ BitNodeMultipliers.CrimeMoney = 3;
+ BitNodeMultipliers.InfiltrationMoney = 3;
+ BitNodeMultipliers.FactionWorkRepGain = 0.5;
+ BitNodeMultipliers.FactionPassiveRepGain = 0;
+ break;
+ case 3: //Corporatocracy
+ BitNodeMultipliers.RepToDonateToFaction = 0.5;
+ BitNodeMultipliers.AugmentationRepCost = 3;
+ BitNodeMultipliers.AugmentationMoneyCost = 3;
+ BitNodeMultipliers.ServerMaxMoney = 0.25;
+ BitNodeMultipliers.ServerStartingMoney = 0.25;
+ BitNodeMultipliers.ServerGrowthRate = 0.20;
+ BitNodeMultipliers.ScriptHackMoney = 0.25;
+ BitNodeMultipliers.CompanyWorkMoney = 0.25;
+ BitNodeMultipliers.CrimeMoney = 0.25;
+ BitNodeMultipliers.HacknetNodeMoney = 0.25;
+ break;
+ case 4: //The Singularity
+ BitNodeMultipliers.ServerMaxMoney = 0.15;
+ BitNodeMultipliers.ServerStartingMoney = 0.75;
+ BitNodeMultipliers.ScriptHackMoney = 0.2;
+ BitNodeMultipliers.CompanyWorkMoney = 0.1;
+ BitNodeMultipliers.CrimeMoney = 0.2;
+ BitNodeMultipliers.HacknetNodeMoney = 0.05;
+ BitNodeMultipliers.CompanyWorkExpGain = 0.5;
+ BitNodeMultipliers.ClassGymExpGain = 0.5;
+ BitNodeMultipliers.FactionWorkExpGain = 0.5;
+ BitNodeMultipliers.HackExpGain = 0.4;
+ BitNodeMultipliers.CrimeExpGain = 0.5;
+ BitNodeMultipliers.FactionWorkRepGain = 0.75;
+ break;
+ case 5: //Artificial intelligence
+ BitNodeMultipliers.ServerMaxMoney = 2;
+ BitNodeMultipliers.ServerStartingSecurity = 2;
+ BitNodeMultipliers.ServerStartingMoney = 0.5;
+ BitNodeMultipliers.ScriptHackMoney = 0.15;
+ BitNodeMultipliers.HacknetNodeMoney = 0.2;
+ BitNodeMultipliers.CrimeMoney = 0.5;
+ BitNodeMultipliers.InfiltrationRep = 1.5;
+ BitNodeMultipliers.InfiltrationMoney = 1.5;
+ BitNodeMultipliers.AugmentationMoneyCost = 2;
+ BitNodeMultipliers.HackExpGain = 0.5;
+ BitNodeMultipliers.CorporationValuation = 0.5;
+ break;
+ case 6: //Bladeburner
+ BitNodeMultipliers.HackingLevelMultiplier = 0.5;
+ BitNodeMultipliers.ServerMaxMoney = 0.5;
+ BitNodeMultipliers.ServerStartingMoney = 0.5;
+ BitNodeMultipliers.ServerStartingSecurity = 1.5;
+ BitNodeMultipliers.ScriptHackMoney = 0.5;
+ BitNodeMultipliers.CompanyWorkMoney = 0.5;
+ BitNodeMultipliers.CrimeMoney = 0.25;
+ BitNodeMultipliers.InfiltrationMoney = 0.25;
+ BitNodeMultipliers.CorporationValuation = 0.2;
+ BitNodeMultipliers.HacknetNodeMoney = 0.2;
+ BitNodeMultipliers.FactionPassiveRepGain = 0;
+ BitNodeMultipliers.HackExpGain = 0.2;
+ break;
+ case 8: //Ghost of Wall Street
+ BitNodeMultipliers.ScriptHackMoney = 0;
+ BitNodeMultipliers.ManualHackMoney = 0;
+ BitNodeMultipliers.CompanyWorkMoney = 0;
+ BitNodeMultipliers.CrimeMoney = 0;
+ BitNodeMultipliers.HacknetNodeMoney = 0;
+ BitNodeMultipliers.InfiltrationMoney = 0;
+ BitNodeMultipliers.RepToDonateToFaction = 0;
+ BitNodeMultipliers.CorporationValuation = 0;
+ break;
+ case 11: //The Big Crash
+ BitNodeMultipliers.ServerMaxMoney = 0.1;
+ BitNodeMultipliers.ServerStartingMoney = 0.1;
+ BitNodeMultipliers.ServerGrowthRate = 0.5;
+ BitNodeMultipliers.ServerWeakenRate = 2;
+ BitNodeMultipliers.CrimeMoney = 3;
+ BitNodeMultipliers.CompanyWorkMoney = 0.5;
+ BitNodeMultipliers.HacknetNodeMoney = 0.1;
+ BitNodeMultipliers.AugmentationMoneyCost = 2;
+ BitNodeMultipliers.InfiltrationMoney = 2.5;
+ BitNodeMultipliers.InfiltrationRep = 2.5;
+ BitNodeMultipliers.CorporationValuation = 0.01;
+ break;
+ default:
+ console.log("WARNING: Player.bitNodeN invalid");
+ break;
+ }
+}
+
+
+
+
+/***/ }),
+/* 16 */
+/*!****************************!*\
+ !*** ./utils/IPAddress.js ***!
+ \****************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createRandomIp", function() { return createRandomIp; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ipExists", function() { return ipExists; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isValidIPAddress", function() { return isValidIPAddress; });
+/* harmony import */ var _src_Server_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/Server.js */ 10);
+
+/* Functions to deal with manipulating IP addresses*/
+
+//Generate a random IP address
+//Will not return an IP address that already exists in the AllServers array
+function createRandomIp() {
+ var ip = createRandomByte(99) +'.' +
+ createRandomByte(9) +'.' +
+ createRandomByte(9) +'.' +
+ createRandomByte(9);
+
+ //If the Ip already exists, recurse to create a new one
+ if (ipExists(ip)) {
+ return createRandomIp();
+ }
+ return ip;
+}
+
+//Returns true if the IP already exists in one of the game's servers
+function ipExists(ip) {
+ for (var property in _src_Server_js__WEBPACK_IMPORTED_MODULE_0__["AllServers"]) {
+ if (_src_Server_js__WEBPACK_IMPORTED_MODULE_0__["AllServers"].hasOwnProperty(property)) {
+ if (property == ip) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+function createRandomByte(n=9) {
+ return Math.round(Math.random()*n);
+}
+
+function isValidIPAddress(ipaddress) {
+ if (/^(25[0-6]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-6]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-6]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-6]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress))
+ {
+ return true;
+ }
+ return false;
+}
+
+
+
+
+/***/ }),
+/* 17 */
+/*!*********************************!*\
+ !*** ./src/SpecialServerIps.js ***!
+ \*********************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SpecialServerNames", function() { return SpecialServerNames; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SpecialServerIps", function() { return SpecialServerIps; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SpecialServerIpsMap", function() { return SpecialServerIpsMap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadSpecialServerIps", function() { return loadSpecialServerIps; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prestigeSpecialServerIps", function() { return prestigeSpecialServerIps; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initSpecialServerIps", function() { return initSpecialServerIps; });
+/* harmony import */ var _utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/JSONReviver.js */ 8);
+
+
+/* Holds IP of Special Servers */
+let SpecialServerNames = {
+ FulcrumSecretTechnologies: "Fulcrum Secret Technologies Server",
+ CyberSecServer: "CyberSec Server",
+ NiteSecServer: "NiteSec Server",
+ TheBlackHandServer: "The Black Hand Server",
+ BitRunnersServer: "BitRunners Server",
+ TheDarkArmyServer: "The Dark Army Server",
+ DaedalusServer: "Daedalus Server",
+ WorldDaemon: "w0r1d_d43m0n",
+}
+function SpecialServerIpsMap() {}
+
+SpecialServerIpsMap.prototype.addIp = function(name, ip) {
+ this[name] = ip;
+}
+
+SpecialServerIpsMap.prototype.toJSON = function() {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_0__["Generic_toJSON"])("SpecialServerIpsMap", this);
+}
+
+SpecialServerIpsMap.fromJSON = function(value) {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_0__["Generic_fromJSON"])(SpecialServerIpsMap, value.data);
+}
+
+_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_0__["Reviver"].constructors.SpecialServerIpsMap = SpecialServerIpsMap;
+
+let SpecialServerIps = new SpecialServerIpsMap();
+
+function prestigeSpecialServerIps() {
+ for (var member in SpecialServerIps) {
+ delete SpecialServerIps[member];
+ }
+ SpecialServerIps = null;
+ SpecialServerIps = new SpecialServerIpsMap();
+}
+
+function loadSpecialServerIps(saveString) {
+ SpecialServerIps = JSON.parse(saveString, _utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_0__["Reviver"]);
+}
+
+function initSpecialServerIps() {
+ SpecialServerIps = new SpecialServerIpsMap();
+}
+
+
+
+
+/***/ }),
+/* 18 */
+/*!******************************!*\
+ !*** ./src/Augmentations.js ***!
+ \******************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AugmentationNames", function() { return AugmentationNames; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Augmentations", function() { return Augmentations; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlayerOwnedAugmentation", function() { return PlayerOwnedAugmentation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installAugmentations", function() { return installAugmentations; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initAugmentations", function() { return initAugmentations; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "applyAugmentation", function() { return applyAugmentation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "augmentationExists", function() { return augmentationExists; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Augmentation", function() { return Augmentation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "displayAugmentationsContent", function() { return displayAugmentationsContent; });
+/* harmony import */ var _BitNode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BitNode.js */ 15);
+/* harmony import */ var _Constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Constants.js */ 3);
+/* harmony import */ var _engine_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./engine.js */ 5);
+/* harmony import */ var _Faction_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Faction.js */ 11);
+/* harmony import */ var _NetscriptFunctions_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./NetscriptFunctions.js */ 29);
+/* harmony import */ var _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./NetscriptWorker.js */ 20);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _Prestige_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Prestige.js */ 57);
+/* harmony import */ var _SaveObject_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./SaveObject.js */ 46);
+/* harmony import */ var _Script_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Script.js */ 28);
+/* harmony import */ var _Server_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Server.js */ 10);
+/* harmony import */ var _SourceFile_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./SourceFile.js */ 42);
+/* harmony import */ var _utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils/DialogBox.js */ 6);
+/* harmony import */ var _utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utils/HelperFunctions.js */ 1);
+/* harmony import */ var _utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/JSONReviver.js */ 8);
+/* harmony import */ var _utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../utils/StringHelperFunctions.js */ 2);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//Augmentations
+function Augmentation(params) {
+ if (params.name == null || params.info == null || params.moneyCost == null || params.repCost == null) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_12__["dialogBoxCreate"])("ERROR Creating Augmentations. This is a bug please contact game dev");
+ return;
+ }
+ this.name = params.name;
+ this.info = params.info;
+ this.owned = false;
+ this.prereqs = params.prereqs ? params.prereqs : [];
+
+ //Price and reputation base requirements (can change based on faction multipliers)
+ this.baseRepRequirement = params.repCost * _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].AugmentationRepMultiplier * _BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].AugmentationRepCost;
+ this.baseCost = params.moneyCost * _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].AugmentationCostMultiplier * _BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].AugmentationMoneyCost;
+
+ //Level - Only applicable for some augmentations
+ // NeuroFlux Governor
+ this.level = 0;
+}
+
+//Takes in an array of faction names and adds this augmentation to all of those factions
+Augmentation.prototype.addToFactions = function(factionList) {
+ for (var i = 0; i < factionList.length; ++i) {
+ var faction = _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"][factionList[i]];
+ if (faction == null) {
+ throw new Error("In Augmentation.addToFactions(), could not find faction with this name:" + factionList[i]);
+ continue;
+ }
+ faction.augmentations.push(this.name);
+ }
+}
+
+Augmentation.prototype.addToAllFactions = function() {
+ for (var fac in _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"]) {
+ if (_Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"].hasOwnProperty(fac)) {
+ var facObj = _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"][fac];
+ if (facObj == null) {
+ console.log("ERROR: Invalid faction object");
+ continue;
+ }
+ facObj.augmentations.push(this.name);
+ }
+ }
+}
+
+Augmentation.prototype.toJSON = function() {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Generic_toJSON"])("Augmentation", this);
+}
+
+Augmentation.fromJSON = function(value) {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Generic_fromJSON"])(Augmentation, value.data);
+}
+
+_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Reviver"].constructors.Augmentation = Augmentation;
+
+let Augmentations = {}
+
+function AddToAugmentations(aug) {
+ var name = aug.name;
+ Augmentations[name] = aug;
+}
+
+let AugmentationNames = {
+ Targeting1: "Augmented Targeting I",
+ Targeting2: "Augmented Targeting II",
+ Targeting3: "Augmented Targeting III",
+ SyntheticHeart: "Synthetic Heart",
+ SynfibrilMuscle: "Synfibril Muscle",
+ CombatRib1: "Combat Rib I",
+ CombatRib2: "Combat Rib II",
+ CombatRib3: "Combat Rib III",
+ NanofiberWeave: "Nanofiber Weave",
+ SubdermalArmor: "NEMEAN Subdermal Weave",
+ WiredReflexes: "Wired Reflexes",
+ GrapheneBoneLacings: "Graphene Bone Lacings",
+ BionicSpine: "Bionic Spine",
+ GrapheneBionicSpine: "Graphene Bionic Spine Upgrade",
+ BionicLegs: "Bionic Legs",
+ GrapheneBionicLegs: "Graphene Bionic Legs Upgrade",
+ SpeechProcessor: "Speech Processor Implant",
+ TITN41Injection: "TITN-41 Gene-Modification Injection",
+ EnhancedSocialInteractionImplant: "Enhanced Social Interaction Implant",
+ BitWire: "BitWire",
+ ArtificialBioNeuralNetwork: "Artificial Bio-neural Network Implant",
+ ArtificialSynapticPotentiation: "Artificial Synaptic Potentiation",
+ EnhancedMyelinSheathing: "Enhanced Myelin Sheathing",
+ SynapticEnhancement: "Synaptic Enhancement Implant",
+ NeuralRetentionEnhancement: "Neural-Retention Enhancement",
+ DataJack: "DataJack",
+ ENM: "Embedded Netburner Module",
+ ENMCore: "Embedded Netburner Module Core Implant",
+ ENMCoreV2: "Embedded Netburner Module Core V2 Upgrade",
+ ENMCoreV3: "Embedded Netburner Module Core V3 Upgrade",
+ ENMAnalyzeEngine: "Embedded Netburner Module Analyze Engine",
+ ENMDMA: "Embedded Netburner Module Direct Memory Access Upgrade",
+ Neuralstimulator: "Neuralstimulator",
+ NeuralAccelerator: "Neural Accelerator",
+ CranialSignalProcessorsG1: "Cranial Signal Processors - Gen I",
+ CranialSignalProcessorsG2: "Cranial Signal Processors - Gen II",
+ CranialSignalProcessorsG3: "Cranial Signal Processors - Gen III",
+ CranialSignalProcessorsG4: "Cranial Signal Processors - Gen IV",
+ CranialSignalProcessorsG5: "Cranial Signal Processors - Gen V",
+ NeuronalDensification: "Neuronal Densification",
+ NuoptimalInjectorImplant: "Nuoptimal Nootropic Injector Implant",
+ SpeechEnhancement: "Speech Enhancement",
+ FocusWire: "FocusWire",
+ PCDNI: "PC Direct-Neural Interface",
+ PCDNIOptimizer: "PC Direct-Neural Interface Optimization Submodule",
+ PCDNINeuralNetwork: "PC Direct-Neural Interface NeuroNet Injector",
+ ADRPheromone1: "ADR-V1 Pheromone Gene",
+ ADRPheromone2: "ADR-V2 Pheromone Gene",
+ HacknetNodeCPUUpload: "Hacknet Node CPU Architecture Neural-Upload",
+ HacknetNodeCacheUpload: "Hacknet Node Cache Architecture Neural-Upload",
+ HacknetNodeNICUpload: "Hacknet Node NIC Architecture Neural-Upload",
+ HacknetNodeKernelDNI: "Hacknet Node Kernel Direct-Neural Interface",
+ HacknetNodeCoreDNI: "Hacknet Node Core Direct-Neural Interface",
+ NeuroFluxGovernor: "NeuroFlux Governor",
+ Neurotrainer1: "Neurotrainer I",
+ Neurotrainer2: "Neurotrainer II",
+ Neurotrainer3: "Neurotrainer III",
+ Hypersight: "HyperSight Corneal Implant",
+ LuminCloaking1: "LuminCloaking-V1 Skin Implant",
+ LuminCloaking2: "LuminCloaking-V2 Skin Implant",
+ HemoRecirculator: "HemoRecirculator",
+ SmartSonar: "SmartSonar Implant",
+ PowerRecirculator: "Power Recirculation Core",
+ QLink: "QLink",
+ TheRedPill: "The Red Pill",
+ SPTN97: "SPTN-97 Gene Modification",
+ HiveMind: "ECorp HVMind Implant",
+ CordiARCReactor: "CordiARC Fusion Reactor",
+ SmartJaw: "SmartJaw",
+ Neotra: "Neotra",
+ Xanipher: "Xanipher",
+ nextSENS: "nextSENS Gene Modification",
+ OmniTekInfoLoad: "OmniTek InfoLoad",
+ PhotosyntheticCells: "Photosynthetic Cells",
+ Neurolink: "BitRunners Neurolink",
+ TheBlackHand: "The Black Hand",
+ CRTX42AA: "CRTX42-AA Gene Modification",
+ Neuregen: "Neuregen Gene Modification",
+ CashRoot: "CashRoot Starter Kit",
+ NutriGen: "NutriGen Implant",
+ INFRARet: "INFRARET Enhancement",
+ DermaForce: "DermaForce Particle Barrier",
+ GrapheneBrachiBlades: "Graphene BranchiBlades Upgrade",
+ GrapheneBionicArms: "Graphene Bionic Arms Upgrade",
+ BrachiBlades: "BrachiBlades",
+ BionicArms: "Bionic Arms",
+ SNA: "Social Negotiation Assistant (S.N.A)",
+ EsperEyewear: "EsperTech Bladeburner Eyewear",
+ EMS4Recombination: "EMS-4 Recombination",
+ OrionShoulder: "ORION-MKIV Shoulder",
+ HyperionV1: "Hyperion Plasma Cannon V1",
+ HyperionV2: "Hyperion Plasma Cannon V2",
+ GolemSerum: "GOLEM Serum",
+ VangelisVirus: "Vangelis Virus",
+ VangelisVirus3: "Vangelis Virus 3.0",
+ INTERLINKED: "I.N.T.E.R.L.I.N.K.E.D",
+ BladeRunner: "Blade's Runners",
+ BladeArmor: "BLADE-51b Tesla Armor",
+ BladeArmorPowerCells: "BLADE-51b Tesla Armor: Power Cells Upgrade",
+ BladeArmorEnergyShielding: "BLADE-51b Tesla Armor: Energy Shielding Upgrade",
+ BladeArmorUnibeam: "BLADE-51b Tesla Armor: Unibeam Upgrade",
+ BladeArmorOmnibeam: "BLADE-51b Tesla Armor: Omnibeam Upgrade",
+ BladeArmorIPU: "BLADE-51b Tesla Armor: IPU Upgrade",
+
+ //Wasteland Augs
+ //PepBoy: "P.E.P-Boy", Plasma Energy Projection System
+ //PepBoyForceField Generates plasma force fields
+ //PepBoyBlasts Generate high density plasma concussive blasts
+ //PepBoyDataStorage STore more data on pep boy,
+}
+
+function initAugmentations() {
+ for (var name in _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"]) {
+ if (_Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"].hasOwnProperty(name)) {
+ _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"][name].augmentations = [];
+ }
+ }
+
+ //Reset Augmentations
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["clearObject"])(Augmentations);
+
+ //Combat stat augmentations
+ var HemoRecirculator = new Augmentation({
+ name:AugmentationNames.HemoRecirculator, moneyCost: 9e6, repCost:4e3,
+ info:"A heart implant that greatly increases the body's ability to effectively use and pump " +
+ "blood.
This augmentation increases all of the player's combat stats by 8%."
+ });
+ HemoRecirculator.addToFactions(["Tetrads", "The Dark Army", "The Syndicate"]);
+ if (augmentationExists(AugmentationNames.HemoRecirculator)) {
+ delete Augmentations[AugmentationNames.HemoRecirculator];
+ }
+ AddToAugmentations(HemoRecirculator);
+
+ var Targeting1 = new Augmentation({
+ name:AugmentationNames.Targeting1, moneyCost:3e6, repCost:2e3,
+ info:"This cranial implant is embedded within the player's inner ear structure and optic nerves. It regulates and enhances the user's " +
+ "balance and hand-eye coordination. It is also capable of augmenting reality by projecting digital information " +
+ "directly onto the retina. These enhancements allow the player to better lock-on and keep track of enemies.
" +
+ "This augmentation increases the player's dexterity by 10%."
+ });
+ Targeting1.addToFactions(["Slum Snakes", "The Dark Army", "The Syndicate", "Sector-12", "Volhaven", "Ishima",
+ "OmniTek Incorporated", "KuaiGong International", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.Targeting1)) {
+ delete Augmentations[AugmentationNames.Targeting1];
+ }
+ AddToAugmentations(Targeting1);
+
+ var Targeting2 = new Augmentation({
+ name:AugmentationNames.Targeting2, moneyCost:8.5e6, repCost:3.5e3,
+ info:"This is an upgrade of the Augmented Targeting I cranial implant, which is capable of augmenting reality " +
+ "and enhances the user's balance and hand-eye coordination.
This upgrade increases the player's dexterity " +
+ "by an additional 20%.",
+ prereqs:[AugmentationNames.Targeting1]
+ });
+ Targeting2.addToFactions(["The Dark Army", "The Syndicate", "Sector-12", "Volhaven", "Ishima",
+ "OmniTek Incorporated", "KuaiGong International", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.Targeting2)) {
+ delete Augmentations[AugmentationNames.Targeting2];
+ }
+ AddToAugmentations(Targeting2);
+
+ var Targeting3 = new Augmentation({
+ name:AugmentationNames.Targeting3, moneyCost:23e6, repCost:11e3,
+ info:"This is an upgrade of the Augmented Targeting II cranial implant, which is capable of augmenting reality " +
+ "and enhances the user's balance and hand-eye coordination.
This upgrade increases the player's dexterity " +
+ "by an additional 30%.",
+ prereqs:[AugmentationNames.Targeting2]
+ });
+ Targeting3.addToFactions(["The Dark Army", "The Syndicate", "OmniTek Incorporated",
+ "KuaiGong International", "Blade Industries", "The Covenant"]);
+ if (augmentationExists(AugmentationNames.Targeting3)) {
+ delete Augmentations[AugmentationNames.Targeting3];
+ }
+ AddToAugmentations(Targeting3);
+
+ var SyntheticHeart = new Augmentation({
+ name:AugmentationNames.SyntheticHeart, moneyCost:575e6, repCost:300e3,
+ info:"This advanced artificial heart, created from plasteel and graphene, is capable of pumping more blood " +
+ "at much higher efficiencies than a normal human heart.
This augmentation increases the player's agility " +
+ "and strength by 50%"
+ });
+ SyntheticHeart.addToFactions(["KuaiGong International", "Fulcrum Secret Technologies", "Speakers for the Dead",
+ "NWO", "The Covenant", "Daedalus", "Illuminati"]);
+ if (augmentationExists(AugmentationNames.SyntheticHeart)) {
+ delete Augmentations[AugmentationNames.SyntheticHeart];
+ }
+ AddToAugmentations(SyntheticHeart);
+
+ var SynfibrilMuscle = new Augmentation({
+ name:AugmentationNames.SynfibrilMuscle, repCost:175e3, moneyCost:225e6,
+ info:"The myofibrils in human muscles are injected with special chemicals that react with the proteins inside " +
+ "the myofibrils, altering their underlying structure. The end result is muscles that are stronger and more elastic. " +
+ "Scientists have named these artificially enhanced units 'synfibrils'.
This augmentation increases the player's " +
+ "strength and defense by 30%."
+ });
+ SynfibrilMuscle.addToFactions(["KuaiGong International", "Fulcrum Secret Technologies", "Speakers for the Dead",
+ "NWO", "The Covenant", "Daedalus", "Illuminati", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.SynfibrilMuscle)) {
+ delete Augmentations[AugmentationNames.SynfibrilMuscle];
+ }
+ AddToAugmentations(SynfibrilMuscle)
+
+ var CombatRib1 = new Augmentation({
+ name:AugmentationNames.CombatRib1, repCost:3e3, moneyCost:4750000,
+ info:"The human body's ribs are replaced with artificial ribs that automatically and continuously release cognitive " +
+ "and performance-enhancing drugs into the bloodstream, improving the user's abilities in combat.
" +
+ "This augmentation increases the player's strength and defense by 10%."
+ });
+ CombatRib1.addToFactions(["Slum Snakes", "The Dark Army", "The Syndicate", "Sector-12", "Volhaven", "Ishima",
+ "OmniTek Incorporated", "KuaiGong International", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.CombatRib1)) {
+ delete Augmentations[AugmentationNames.CombatRib1];
+ }
+ AddToAugmentations(CombatRib1);
+
+ var CombatRib2 = new Augmentation({
+ name:AugmentationNames.CombatRib2, repCost:7.5e3, moneyCost:13e6,
+ info:"This is an upgrade to the Combat Rib I augmentation, and is capable of releasing even more potent combat-enhancing " +
+ "drugs into the bloodstream.
This upgrade increases the player's strength and defense by an additional 14%.",
+ prereqs:[AugmentationNames.CombatRib1]
+ });
+ CombatRib2.addToFactions(["The Dark Army", "The Syndicate", "Sector-12", "Volhaven", "Ishima",
+ "OmniTek Incorporated", "KuaiGong International", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.CombatRib2)) {
+ delete Augmentations[AugmentationNames.CombatRib2];
+ }
+ AddToAugmentations(CombatRib2);
+
+ var CombatRib3 = new Augmentation({
+ name:AugmentationNames.CombatRib3, repCost:14e3, moneyCost:24e6,
+ info:"This is an upgrade to the Combat Rib II augmentation, and is capable of releasing even more potent combat-enhancing " +
+ "drugs into the bloodstream
. This upgrade increases the player's strength and defense by an additional 18%.",
+ prereqs:[AugmentationNames.CombatRib2],
+ });
+ CombatRib3.addToFactions(["The Dark Army", "The Syndicate", "OmniTek Incorporated",
+ "KuaiGong International", "Blade Industries", "The Covenant"]);
+ if (augmentationExists(AugmentationNames.CombatRib3)) {
+ delete Augmentations[AugmentationNames.CombatRib3];
+ }
+ AddToAugmentations(CombatRib3);
+
+ var NanofiberWeave = new Augmentation({
+ name:AugmentationNames.NanofiberWeave, repCost:15e3, moneyCost:25e6,
+ info:"Synthetic nanofibers are woven into the skin's extracellular matrix using electrospinning. " +
+ "This improves the skin's ability to regenerate itself and protect the body from external stresses and forces.
" +
+ "This augmentation increases the player's strength and defense by 20%."
+ });
+ NanofiberWeave.addToFactions(["Tian Di Hui", "The Syndicate", "The Dark Army", "Speakers for the Dead",
+ "Blade Industries", "Fulcrum Secret Technologies", "OmniTek Incorporated"]);
+ if (augmentationExists(AugmentationNames.NanofiberWeave)) {
+ delete Augmentations[AugmentationNames.NanofiberWeave];
+ }
+ AddToAugmentations(NanofiberWeave);
+
+ var SubdermalArmor = new Augmentation({
+ name:AugmentationNames.SubdermalArmor, repCost:350e3, moneyCost:650e6,
+ info:"The NEMEAN Subdermal Weave is a thin, light-weight, graphene plating that houses a dilatant fluid. " +
+ "The material is implanted underneath the skin, and is the most advanced form of defensive enhancement " +
+ "that has ever been created. The dilatant fluid, despite being thin and light, is extremely effective " +
+ "at stopping piercing blows and reducing blunt trauma. The properties of graphene allow the plating to " +
+ "mitigate damage from any fire-related or electrical traumas.
" +
+ "This augmentation increases the player's defense by 120%."
+ });
+ SubdermalArmor.addToFactions(["The Syndicate", "Fulcrum Secret Technologies", "Illuminati", "Daedalus",
+ "The Covenant"]);
+ if (augmentationExists(AugmentationNames.SubdermalArmor)) {
+ delete Augmentations[AugmentationNames.SubdermalArmor];
+ }
+ AddToAugmentations(SubdermalArmor);
+
+ var WiredReflexes = new Augmentation({
+ name:AugmentationNames.WiredReflexes, repCost:500, moneyCost:500e3,
+ info:"Synthetic nerve-enhancements are injected into all major parts of the somatic nervous system, " +
+ "supercharging the body's ability to send signals through neurons. This results in increased reflex speed.
" +
+ "This augmentation increases the player's agility and dexterity by 5%."
+ });
+ WiredReflexes.addToFactions(["Tian Di Hui", "Slum Snakes", "Sector-12", "Volhaven", "Aevum", "Ishima",
+ "The Syndicate", "The Dark Army", "Speakers for the Dead"]);
+ if (augmentationExists(AugmentationNames.WiredReflexes)) {
+ delete Augmentations[AugmentationNames.WiredReflexes];
+ }
+ AddToAugmentations(WiredReflexes);
+
+ var GrapheneBoneLacings = new Augmentation({
+ name:AugmentationNames.GrapheneBoneLacings, repCost:450e3, moneyCost:850e6,
+ info:"A graphene-based material is grafted and fused into the user's bones, significantly increasing " +
+ "their density and tensile strength.
" +
+ "This augmentation increases the player's strength and defense by 70%."
+ });
+ GrapheneBoneLacings.addToFactions(["Fulcrum Secret Technologies", "The Covenant"]);
+ if (augmentationExists(AugmentationNames.GrapheneBoneLacings)) {
+ delete Augmentations[AugmentationNames.GrapheneBoneLacings];
+ }
+ AddToAugmentations(GrapheneBoneLacings);
+
+ var BionicSpine = new Augmentation({
+ name:AugmentationNames.BionicSpine, repCost:18e3, moneyCost:25e6,
+ info:"An artificial spine created from plasteel and carbon fibers that completely replaces the organic spine. " +
+ "Not only is the Bionic Spine physically stronger than a human spine, but it is also capable of digitally " +
+ "stimulating and regulating the neural signals that are sent and received by the spinal cord. This results in " +
+ "greatly improved senses and reaction speeds.
" +
+ "This augmentation increases all of the player's combat stats by 15%."
+ });
+ BionicSpine.addToFactions(["Speakers for the Dead", "The Syndicate", "KuaiGong International",
+ "OmniTek Incorporated", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.BionicSpine)) {
+ delete Augmentations[AugmentationNames.BionicSpine];
+ }
+ AddToAugmentations(BionicSpine);
+
+ var GrapheneBionicSpine = new Augmentation({
+ name:AugmentationNames.GrapheneBionicSpine, repCost:650e3, moneyCost:1200e6,
+ info:"An upgrade to the Bionic Spine augmentation. It fuses the implant with an advanced graphene " +
+ "material to make it much stronger and lighter.
" +
+ "This augmentation increases all of the player's combat stats by 60%.",
+ prereqs:[AugmentationNames.BionicSpine],
+ });
+ GrapheneBionicSpine.addToFactions(["Fulcrum Secret Technologies", "ECorp"]);
+ if (augmentationExists(AugmentationNames.GrapheneBionicSpine)) {
+ delete Augmentations[AugmentationNames.GrapheneBionicSpine];
+ }
+ AddToAugmentations(GrapheneBionicSpine);
+
+ var BionicLegs = new Augmentation({
+ name:AugmentationNames.BionicLegs, repCost:60e3, moneyCost:75e6,
+ info:"Cybernetic legs created from plasteel and carbon fibers that completely replace the user's organic legs.
" +
+ "This augmentation increases the player's agility by 60%."
+ });
+ BionicLegs.addToFactions(["Speakers for the Dead", "The Syndicate", "KuaiGong International",
+ "OmniTek Incorporated", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.BionicLegs)) {
+ delete Augmentations[AugmentationNames.BionicLegs];
+ }
+ AddToAugmentations(BionicLegs);
+
+ var GrapheneBionicLegs = new Augmentation({
+ name:AugmentationNames.GrapheneBionicLegs, repCost:300e3, moneyCost:900e6,
+ info:"An upgrade to the Bionic Legs augmentation. It fuses the implant with an advanced graphene " +
+ "material to make it much stronger and lighter.
" +
+ "This augmentation increases the player's agility by an additional 150%.",
+ prereqs:[AugmentationNames.BionicLegs],
+ });
+ GrapheneBionicLegs.addToFactions(["MegaCorp", "ECorp", "Fulcrum Secret Technologies"]);
+ if (augmentationExists(AugmentationNames.GrapheneBionicLegs)) {
+ delete Augmentations[AugmentationNames.GrapheneBionicLegs];
+ }
+ AddToAugmentations(GrapheneBionicLegs);
+
+ //Labor stat augmentations
+ var SpeechProcessor = new Augmentation({
+ name:AugmentationNames.SpeechProcessor, repCost:3e3, moneyCost:10e6,
+ info:"A cochlear implant with an embedded computer that analyzes incoming speech. " +
+ "The embedded computer processes characteristics of incoming speech, such as tone " +
+ "and inflection, to pick up on subtle cues and aid in social interactions.
" +
+ "This augmentation increases the player's charisma by 20%."
+ });
+ SpeechProcessor.addToFactions(["Tian Di Hui", "Chongqing", "Sector-12", "New Tokyo", "Aevum",
+ "Ishima", "Volhaven", "Silhouette"]);
+ if (augmentationExists(AugmentationNames.SpeechProcessor)) {
+ delete Augmentations[AugmentationNames.SpeechProcessor];
+ }
+ AddToAugmentations(SpeechProcessor);
+
+ let TITN41Injection = new Augmentation({
+ name:AugmentationNames.TITN41Injection, repCost:10e3, moneyCost:38e6,
+ info:"TITN is a series of viruses that targets and alters the sequences of human DNA in genes that " +
+ "control personality. The TITN-41 strain alters these genes so that the subject becomes more " +
+ "outgoing and socialable.
" +
+ "This augmentation increases the player's charisma and charisma experience gain rate by 15%"
+ });
+ TITN41Injection.addToFactions(["Silhouette"]);
+ if (augmentationExists(AugmentationNames.TITN41Injection)) {
+ delete Augmentations[AugmentationNames.TITN41Injection];
+ }
+ AddToAugmentations(TITN41Injection);
+
+ var EnhancedSocialInteractionImplant = new Augmentation({
+ name:AugmentationNames.EnhancedSocialInteractionImplant, repCost:150e3, moneyCost:275e6,
+ info:"A cranial implant that greatly assists in the user's ability to analyze social situations " +
+ "and interactions. The system uses a wide variety of factors such as facial expression, body " +
+ "language, and the voice's tone/inflection to determine the best course of action during social" +
+ "situations. The implant also uses deep learning software to continuously learn new behavior" +
+ "patterns and how to best respond.
" +
+ "This augmentation increases the player's charisma and charisma experience gain rate by 60%."
+ });
+ EnhancedSocialInteractionImplant.addToFactions(["Bachman & Associates", "NWO", "Clarke Incorporated",
+ "OmniTek Incorporated", "Four Sigma"]);
+ if (augmentationExists(AugmentationNames.EnhancedSocialInteractionImplant)) {
+ delete Augmentations[AugmentationNames.EnhancedSocialInteractionImplant];
+ }
+ AddToAugmentations(EnhancedSocialInteractionImplant);
+
+ //Hacking augmentations
+ var BitWire = new Augmentation({
+ name:AugmentationNames.BitWire, repCost:1500, moneyCost:2e6,
+ info: "A small brain implant embedded in the cerebrum. This regulates and improves the brain's computing " +
+ "capabilities.
This augmentation increases the player's hacking skill by 5%"
+ });
+ BitWire.addToFactions(["CyberSec", "NiteSec"]);
+ if (augmentationExists(AugmentationNames.BitWire)) {
+ delete Augmentations[AugmentationNames.BitWire];
+ }
+ AddToAugmentations(BitWire);
+
+ var ArtificialBioNeuralNetwork = new Augmentation({
+ name:AugmentationNames.ArtificialBioNeuralNetwork, repCost:110e3, moneyCost:600e6,
+ info:"A network consisting of millions of nanoprocessors is embedded into the brain. " +
+ "The network is meant to mimick the way a biological brain solves a problem, which each " +
+ "nanoprocessor acting similar to the way a neuron would in a neural network. However, these " +
+ "nanoprocessors are programmed to perform computations much faster than organic neurons, " +
+ "allowing its user to solve much more complex problems at a much faster rate.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 3%
" +
+ "Increases the amount of money the player's gains from hacking by 15%
" +
+ "Increases the player's hacking skill by 12%"
+ });
+ ArtificialBioNeuralNetwork.addToFactions(["BitRunners", "Fulcrum Secret Technologies"]);
+ if (augmentationExists(AugmentationNames.ArtificialBioNeuralNetwork)) {
+ delete Augmentations[AugmentationNames.ArtificialBioNeuralNetwork];
+ }
+ AddToAugmentations(ArtificialBioNeuralNetwork);
+
+ var ArtificialSynapticPotentiation = new Augmentation({
+ name:AugmentationNames.ArtificialSynapticPotentiation, repCost:2500, moneyCost:16e6,
+ info:"The body is injected with a chemical that artificially induces synaptic potentiation, " +
+ "otherwise known as the strengthening of synapses. This results in a enhanced cognitive abilities.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 2%
" +
+ "Increases the player's hacking chance by 5%
" +
+ "Increases the player's hacking experience gain rate by 5%"
+ });
+ ArtificialSynapticPotentiation.addToFactions(["The Black Hand", "NiteSec"]);
+ if (augmentationExists(AugmentationNames.ArtificialSynapticPotentiation)) {
+ delete Augmentations[AugmentationNames.ArtificialSynapticPotentiation];
+ }
+ AddToAugmentations(ArtificialSynapticPotentiation);
+
+ var EnhancedMyelinSheathing = new Augmentation({
+ name:AugmentationNames.EnhancedMyelinSheathing, repCost:40e3, moneyCost:275e6,
+ info:"Electrical signals are used to induce a new, artificial form of myelinogensis in the human body. " +
+ "This process results in the proliferation of new, synthetic myelin sheaths in the nervous " +
+ "system. These myelin sheaths can propogate neuro-signals much faster than their organic " +
+ "counterparts, leading to greater processing speeds and better brain function.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 3%
" +
+ "Increases the player's hacking skill by 8%
" +
+ "Increases the player's hacking experience gain rate by 10%"
+ });
+ EnhancedMyelinSheathing.addToFactions(["Fulcrum Secret Technologies", "BitRunners", "The Black Hand"]);
+ if (augmentationExists(AugmentationNames.EnhancedMyelinSheathing)) {
+ delete Augmentations[AugmentationNames.EnhancedMyelinSheathing];
+ }
+ AddToAugmentations(EnhancedMyelinSheathing);
+
+ var SynapticEnhancement = new Augmentation({
+ name:AugmentationNames.SynapticEnhancement, repCost:800, moneyCost:1.5e6,
+ info:"A small cranial implant that continuously uses weak electric signals to stimulate the brain and " +
+ "induce stronger synaptic activity. This improves the user's cognitive abilities.
" +
+ "This augmentation increases the player's hacking speed by 3%."
+ });
+ SynapticEnhancement.addToFactions(["CyberSec"]);
+ if (augmentationExists(AugmentationNames.SynapticEnhancement)) {
+ delete Augmentations[AugmentationNames.SynapticEnhancement];
+ }
+ AddToAugmentations(SynapticEnhancement);
+
+ var NeuralRetentionEnhancement = new Augmentation({
+ name:AugmentationNames.NeuralRetentionEnhancement, repCost:8e3, moneyCost:50e6,
+ info:"Chemical injections are used to permanently alter and strengthen the brain's neuronal " +
+ "circuits, strengthening its ability to retain information.
" +
+ "This augmentation increases the player's hacking experience gain rate by 25%."
+ });
+ NeuralRetentionEnhancement.addToFactions(["NiteSec"]);
+ if (augmentationExists(AugmentationNames.NeuralRetentionEnhancement)) {
+ delete Augmentations[AugmentationNames.NeuralRetentionEnhancement];
+ }
+ AddToAugmentations(NeuralRetentionEnhancement);
+
+ var DataJack = new Augmentation({
+ name:AugmentationNames.DataJack, repCost:45e3, moneyCost:90e6,
+ info:"A brain implant that provides an interface for direct, wireless communication between a computer's main " +
+ "memory and the mind. This implant allows the user to not only access a computer's memory, but also alter " +
+ "and delete it.
" +
+ "This augmentation increases the amount of money the player gains from hacking by 25%"
+ });
+ DataJack.addToFactions(["BitRunners", "The Black Hand", "NiteSec", "Chongqing", "New Tokyo"]);
+ if (augmentationExists(AugmentationNames.DataJack)) {
+ delete Augmentations[AugmentationNames.DataJack];
+ }
+ AddToAugmentations(DataJack);
+
+ var ENM = new Augmentation({
+ name:AugmentationNames.ENM, repCost:6e3, moneyCost:50e6,
+ info:"A thin device embedded inside the arm containing a wireless module capable of connecting " +
+ "to nearby networks. Once connected, the Netburner Module is capable of capturing and " +
+ "processing all of the traffic on that network. By itself, the Embedded Netburner Module does " +
+ "not do much, but a variety of very powerful upgrades can be installed that allow you to fully " +
+ "control the traffic on a network.
" +
+ "This augmentation increases the player's hacking skill by 8%"
+ });
+ ENM.addToFactions(["BitRunners", "The Black Hand", "NiteSec", "ECorp", "MegaCorp",
+ "Fulcrum Secret Technologies", "NWO", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.ENM)) {
+ delete Augmentations[AugmentationNames.ENM];
+ }
+ AddToAugmentations(ENM);
+
+ var ENMCore = new Augmentation({
+ name:AugmentationNames.ENMCore, repCost:100e3, moneyCost:500e6,
+ info:"The Core library is an implant that upgrades the firmware of the Embedded Netburner Module. " +
+ "This upgrade allows the Embedded Netburner Module to generate its own data on a network.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 3%
" +
+ "Increases the amount of money the player gains from hacking by 10%
" +
+ "Increases the player's chance of successfully performing a hack by 3%
" +
+ "Increases the player's hacking experience gain rate by 7%
" +
+ "Increases the player's hacking skill by 7%",
+ prereqs:[AugmentationNames.ENM]
+ });
+ ENMCore.addToFactions(["BitRunners", "The Black Hand", "ECorp", "MegaCorp",
+ "Fulcrum Secret Technologies", "NWO", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.ENMCore)) {
+ delete Augmentations[AugmentationNames.ENMCore];
+ }
+ AddToAugmentations(ENMCore);
+
+ var ENMCoreV2 = new Augmentation({
+ name:AugmentationNames.ENMCoreV2, repCost:400e3, moneyCost:900e6,
+ info:"The Core V2 library is an implant that upgrades the firmware of the Embedded Netburner Module. " +
+ "This upgraded firmware allows the Embedded Netburner Module to control the information on " +
+ "a network by re-routing traffic, spoofing IP addresses, or altering the data inside network " +
+ "packets.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 5%
" +
+ "Increases the amount of money the player gains from hacking by 30%
" +
+ "Increases the player's chance of successfully performing a hack by 5%
" +
+ "Increases the player's hacking experience gain rate by 15%
" +
+ "Increases the player's hacking skill by 8%",
+ prereqs:[AugmentationNames.ENMCore]
+ });
+ ENMCoreV2.addToFactions(["BitRunners", "ECorp", "MegaCorp", "Fulcrum Secret Technologies", "NWO",
+ "Blade Industries", "OmniTek Incorporated", "KuaiGong International"]);
+ if (augmentationExists(AugmentationNames.ENMCoreV2)) {
+ delete Augmentations[AugmentationNames.ENMCoreV2];
+ }
+ AddToAugmentations(ENMCoreV2);
+
+ var ENMCoreV3 = new Augmentation({
+ name:AugmentationNames.ENMCoreV3, repCost:700e3, moneyCost:1500e6,
+ info:"The Core V3 library is an implant that upgrades the firmware of the Embedded Netburner Module. " +
+ "This upgraded firmware allows the Embedded Netburner Module to seamlessly inject code into " +
+ "any device on a network.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 5%
" +
+ "Increases the amount of money the player gains from hacking by 40%
" +
+ "Increases the player's chance of successfully performing a hack by 10%
" +
+ "Increases the player's hacking experience gain rate by 25%
" +
+ "Increases the player's hacking skill by 10%",
+ prereqs:[AugmentationNames.ENMCoreV2],
+ });
+ ENMCoreV3.addToFactions(["ECorp", "MegaCorp", "Fulcrum Secret Technologies", "NWO",
+ "Daedalus", "The Covenant", "Illuminati"]);
+ if (augmentationExists(AugmentationNames.ENMCoreV3)) {
+ delete Augmentations[AugmentationNames.ENMCoreV3];
+ }
+ AddToAugmentations(ENMCoreV3);
+
+ var ENMAnalyzeEngine = new Augmentation({
+ name:AugmentationNames.ENMAnalyzeEngine, repCost:250e3, moneyCost:1200e6,
+ info:"Installs the Analyze Engine for the Embedded Netburner Module, which is a CPU cluster " +
+ "that vastly outperforms the Netburner Module's native single-core processor.
" +
+ "This augmentation increases the player's hacking speed by 10%.",
+ prereqs:[AugmentationNames.ENM],
+ });
+ ENMAnalyzeEngine.addToFactions(["ECorp", "MegaCorp", "Fulcrum Secret Technologies", "NWO",
+ "Daedalus", "The Covenant", "Illuminati"]);
+ if (augmentationExists(AugmentationNames.ENMAnalyzeEngine)) {
+ delete Augmentations[AugmentationNames.ENMAnalyzeEngine];
+ }
+ AddToAugmentations(ENMAnalyzeEngine);
+
+ var ENMDMA = new Augmentation({
+ name:AugmentationNames.ENMDMA, repCost:400e3, moneyCost:1400e6,
+ info:"This implant installs a Direct Memory Access (DMA) controller into the " +
+ "Embedded Netburner Module. This allows the Module to send and receive data " +
+ "directly to and from the main memory of devices on a network.
" +
+ "This augmentation:
" +
+ "Increases the amount of money the player gains from hacking by 40%
" +
+ "Increases the player's chance of successfully performing a hack by 20%",
+ prereqs:[AugmentationNames.ENM],
+ });
+ ENMDMA.addToFactions(["ECorp", "MegaCorp", "Fulcrum Secret Technologies", "NWO",
+ "Daedalus", "The Covenant", "Illuminati"]);
+ if (augmentationExists(AugmentationNames.ENMDMA)) {
+ delete Augmentations[AugmentationNames.ENMDMA];
+ }
+ AddToAugmentations(ENMDMA);
+
+ var Neuralstimulator = new Augmentation({
+ name:AugmentationNames.Neuralstimulator, repCost:20e3, moneyCost:600e6,
+ info:"A cranial implant that intelligently stimulates certain areas of the brain " +
+ "in order to improve cognitive functions
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 2%
" +
+ "Increases the player's chance of successfully performing a hack by 10%
" +
+ "Increases the player's hacking experience gain rate by 12%"
+ });
+ Neuralstimulator.addToFactions(["The Black Hand", "Chongqing", "Sector-12", "New Tokyo", "Aevum",
+ "Ishima", "Volhaven", "Bachman & Associates", "Clarke Incorporated",
+ "Four Sigma"]);
+ if (augmentationExists(AugmentationNames.Neuralstimulator)) {
+ delete Augmentations[AugmentationNames.Neuralstimulator];
+ }
+ AddToAugmentations(Neuralstimulator);
+
+ var NeuralAccelerator = new Augmentation({
+ name:AugmentationNames.NeuralAccelerator, repCost:80e3, moneyCost:350e6,
+ info:"A microprocessor that accelerates the processing " +
+ "speed of biological neural networks. This is a cranial implant that is embedded inside the brain.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking skill by 10%
" +
+ "Increases the player's hacking experience gain rate by 15%
" +
+ "Increases the amount of money the player gains from hacking by 20%"
+ });
+ NeuralAccelerator.addToFactions(["BitRunners"]);
+ if (augmentationExists(AugmentationNames.NeuralAccelerator)) {
+ delete Augmentations[AugmentationNames.NeuralAccelerator];
+ }
+ AddToAugmentations(NeuralAccelerator);
+
+ var CranialSignalProcessorsG1 = new Augmentation({
+ name:AugmentationNames.CranialSignalProcessorsG1, repCost:4e3, moneyCost:14e6,
+ info:"The first generation of Cranial Signal Processors. Cranial Signal Processors " +
+ "are a set of specialized microprocessors that are attached to " +
+ "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " +
+ "so that the brain doesn't have to.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 1%
" +
+ "Increases the player's hacking skill by 5%"
+ });
+ CranialSignalProcessorsG1.addToFactions(["CyberSec"]);
+ if (augmentationExists(AugmentationNames.CranialSignalProcessorsG1)) {
+ delete Augmentations[AugmentationNames.CranialSignalProcessorsG1];
+ }
+ AddToAugmentations(CranialSignalProcessorsG1);
+
+ var CranialSignalProcessorsG2 = new Augmentation({
+ name:AugmentationNames.CranialSignalProcessorsG2, repCost:7500, moneyCost:25e6,
+ info:"The second generation of Cranial Signal Processors. Cranial Signal Processors " +
+ "are a set of specialized microprocessors that are attached to " +
+ "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " +
+ "so that the brain doesn't have to.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 2%
" +
+ "Increases the player's chance of successfully performing a hack by 5%
" +
+ "Increases the player's hacking skill by 7%"
+ });
+ CranialSignalProcessorsG2.addToFactions(["NiteSec"]);
+ if (augmentationExists(AugmentationNames.CranialSignalProcessorsG2)) {
+ delete Augmentations[AugmentationNames.CranialSignalProcessorsG2];
+ }
+ AddToAugmentations(CranialSignalProcessorsG2);
+
+ var CranialSignalProcessorsG3 = new Augmentation({
+ name:AugmentationNames.CranialSignalProcessorsG3, repCost:20e3, moneyCost:110e6,
+ info:"The third generation of Cranial Signal Processors. Cranial Signal Processors " +
+ "are a set of specialized microprocessors that are attached to " +
+ "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " +
+ "so that the brain doesn't have to.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 2%
" +
+ "Increases the amount of money the player gains from hacking by 15%
" +
+ "Increases the player's hacking skill by 9%"
+ });
+ CranialSignalProcessorsG3.addToFactions(["NiteSec", "The Black Hand"]);
+ if (augmentationExists(AugmentationNames.CranialSignalProcessorsG3)) {
+ delete Augmentations[AugmentationNames.CranialSignalProcessorsG3];
+ }
+ AddToAugmentations(CranialSignalProcessorsG3);
+
+ var CranialSignalProcessorsG4 = new Augmentation({
+ name:AugmentationNames.CranialSignalProcessorsG4, repCost:50e3, moneyCost:220e6,
+ info:"The fourth generation of Cranial Signal Processors. Cranial Signal Processors " +
+ "are a set of specialized microprocessors that are attached to " +
+ "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " +
+ "so that the brain doesn't have to.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 2%
" +
+ "Increases the amount of money the player gains from hacking by 20%
" +
+ "Increases the amount of money the player can inject into servers using grow() by 25%"
+ });
+ CranialSignalProcessorsG4.addToFactions(["The Black Hand"]);
+ if (augmentationExists(AugmentationNames.CranialSignalProcessorsG4)) {
+ delete Augmentations[AugmentationNames.CranialSignalProcessorsG4];
+ }
+ AddToAugmentations(CranialSignalProcessorsG4);
+
+ var CranialSignalProcessorsG5 = new Augmentation({
+ name:AugmentationNames.CranialSignalProcessorsG5, repCost:100e3, moneyCost:450e6,
+ info:"The fifth generation of Cranial Signal Processors. Cranial Signal Processors " +
+ "are a set of specialized microprocessors that are attached to " +
+ "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " +
+ "so that the brain doesn't have to.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking skill by 30%
" +
+ "Increases the amount of money the player gains from hacking by 25%
" +
+ "Increases the amount of money the player can inject into servers using grow() by 75%"
+ });
+ CranialSignalProcessorsG5.addToFactions(["BitRunners"]);
+ if (augmentationExists(AugmentationNames.CranialSignalProcessorsG5)) {
+ delete Augmentations[AugmentationNames.CranialSignalProcessorsG5];
+ }
+ AddToAugmentations(CranialSignalProcessorsG5);
+
+ var NeuronalDensification = new Augmentation({
+ name:AugmentationNames.NeuronalDensification, repCost:75e3, moneyCost:275e6,
+ info:"The brain is surgically re-engineered to have increased neuronal density " +
+ "by decreasing the neuron gap junction. Then, the body is genetically modified " +
+ "to enhance the production and capabilities of its neural stem cells.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking skill by 15%
" +
+ "Increases the player's hacking experience gain rate by 10%
"+
+ "Increases the player's hacking speed by 3%"
+ });
+ NeuronalDensification.addToFactions(["Clarke Incorporated"]);
+ if (augmentationExists(AugmentationNames.NeuronalDensification)) {
+ delete Augmentations[AugmentationNames.NeuronalDensification];
+ }
+ AddToAugmentations(NeuronalDensification);
+
+ //Work Augmentations
+ var NuoptimalInjectorImplant = new Augmentation({
+ name:AugmentationNames.NuoptimalInjectorImplant, repCost:2e3, moneyCost:4e6,
+ info:"This torso implant automatically injects nootropic supplements into " +
+ "the bloodstream to improve memory, increase focus, and provide other " +
+ "cognitive enhancements.
" +
+ "This augmentation increases the amount of reputation the player gains " +
+ "when working for a company by 20%."
+ });
+ NuoptimalInjectorImplant.addToFactions(["Tian Di Hui", "Volhaven", "New Tokyo", "Chongqing", "Ishima",
+ "Clarke Incorporated", "Four Sigma", "Bachman & Associates"]);
+ if (augmentationExists(AugmentationNames.NuoptimalInjectorImplant)) {
+ delete Augmentations[AugmentationNames.NuoptimalInjectorImplant];
+ }
+ AddToAugmentations(NuoptimalInjectorImplant);
+
+ var SpeechEnhancement = new Augmentation({
+ name:AugmentationNames.SpeechEnhancement, repCost:1e3, moneyCost:2.5e6,
+ info:"An advanced neural implant that improves your speaking abilities, making " +
+ "you more convincing and likable in conversations and overall improving your " +
+ "social interactions.
" +
+ "This augmentation:
" +
+ "Increases the player's charisma by 10%
" +
+ "Increases the amount of reputation the player gains when working for a company by 10%"
+ });
+ SpeechEnhancement.addToFactions(["Tian Di Hui", "Speakers for the Dead", "Four Sigma", "KuaiGong International",
+ "Clarke Incorporated", "Four Sigma", "Bachman & Associates"]);
+ if (augmentationExists(AugmentationNames.SpeechEnhancement)) {
+ delete Augmentations[AugmentationNames.SpeechEnhancement];
+ }
+ AddToAugmentations(SpeechEnhancement);
+
+ var FocusWire = new Augmentation({
+ name:AugmentationNames.FocusWire, repCost:30e3, moneyCost:180e6,
+ info:"A cranial implant that stops procrastination by blocking specific neural pathways " +
+ "in the brain.
" +
+ "This augmentation:
" +
+ "Increases all experience gains by 5%
" +
+ "Increases the amount of money the player gains from working by 20%
" +
+ "Increases the amount of reputation the player gains when working for a company by 10%"
+ });
+ FocusWire.addToFactions(["Bachman & Associates", "Clarke Incorporated", "Four Sigma", "KuaiGong International"]);
+ if (augmentationExists(AugmentationNames.FocusWire)) {
+ delete Augmentations[AugmentationNames.FocusWire];
+ }
+ AddToAugmentations(FocusWire)
+
+ var PCDNI = new Augmentation({
+ name:AugmentationNames.PCDNI, repCost:150e3, moneyCost:750e6,
+ info:"Installs a Direct-Neural Interface jack into your arm that is compatible with most " +
+ "computers. Connecting to a computer through this jack allows you to interface with " +
+ "it using the brain's electrochemical signals.
" +
+ "This augmentation:
" +
+ "Increases the amount of reputation the player gains when working for a company by 30%
" +
+ "Increases the player's hacking skill by 8%"
+ });
+ PCDNI.addToFactions(["Four Sigma", "OmniTek Incorporated", "ECorp", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.PCDNI)) {
+ delete Augmentations[AugmentationNames.PCDNI];
+ }
+ AddToAugmentations(PCDNI);
+
+ var PCDNIOptimizer = new Augmentation({
+ name:AugmentationNames.PCDNIOptimizer, repCost:200e3, moneyCost:900e6,
+ info:"This is a submodule upgrade to the PC Direct-Neural Interface augmentation. It " +
+ "improves the performance of the interface and gives the user more control options " +
+ "to the connected computer.
" +
+ "This augmentation:
" +
+ "Increases the amount of reputation the player gains when working for a company by 75%
" +
+ "Increases the player's hacking skill by 10%",
+ prereqs:[AugmentationNames.PCDNI],
+ });
+ PCDNIOptimizer.addToFactions(["Fulcrum Secret Technologies", "ECorp", "Blade Industries"]);
+ if (augmentationExists(AugmentationNames.PCDNIOptimizer)) {
+ delete Augmentations[AugmentationNames.PCDNIOptimizer];
+ }
+ AddToAugmentations(PCDNIOptimizer);
+
+ var PCDNINeuralNetwork = new Augmentation({
+ name:AugmentationNames.PCDNINeuralNetwork, repCost:600e3, moneyCost:1500e6,
+ info:"This is an additional installation that upgrades the functionality of the " +
+ "PC Direct-Neural Interface augmentation. When connected to a computer, " +
+ "The NeuroNet Injector upgrade allows the user to use his/her own brain's " +
+ "processing power to aid the computer in computational tasks.
" +
+ "This augmentation:
" +
+ "Increases the amount of reputation the player gains when working for a company by 100%
" +
+ "Increases the player's hacking skill by 10%
" +
+ "Increases the player's hacking speed by 5%",
+ prereqs:[AugmentationNames.PCDNI],
+ });
+ PCDNINeuralNetwork.addToFactions(["Fulcrum Secret Technologies"]);
+ if (augmentationExists(AugmentationNames.PCDNINeuralNetwork)) {
+ delete Augmentations[AugmentationNames.PCDNINeuralNetwork];
+ }
+ AddToAugmentations(PCDNINeuralNetwork);
+
+ var ADRPheromone1 = new Augmentation({
+ name:AugmentationNames.ADRPheromone1, repCost:1500, moneyCost:3.5e6,
+ info:"The body is genetically re-engineered so that it produces the ADR-V1 pheromone, " +
+ "an artificial pheromone discovered by scientists. The ADR-V1 pheromone, when excreted, " +
+ "triggers feelings of admiration and approval in other people.
" +
+ "This augmentation:
" +
+ "Increases the amount of reputation the player gains when working for a company by 10%
" +
+ "Increases the amount of reputation the player gains for a faction by 10%"
+ });
+ ADRPheromone1.addToFactions(["Tian Di Hui", "The Syndicate", "NWO", "MegaCorp", "Four Sigma"]);
+ if (augmentationExists(AugmentationNames.ADRPheromone1)) {
+ delete Augmentations[AugmentationNames.ADRPheromone1];
+ }
+ AddToAugmentations(ADRPheromone1);
+
+ var ADRPheromone2 = new Augmentation({
+ name:AugmentationNames.ADRPheromone2, repCost:25e3, moneyCost:110e6,
+ info:"The body is genetically re-engineered so that it produces the ADR-V2 pheromone, " +
+ "which is similar to but more potent than ADR-V1. This pheromone, when excreted, " +
+ "triggers feelings of admiration, approval, and respect in others.
" +
+ "This augmentation:
" +
+ "Increases the amount of reputation the player gains for a faction and company by 20%."
+ });
+ ADRPheromone2.addToFactions(["Silhouette", "Four Sigma", "Bachman & Associates", "Clarke Incorporated"]);
+ if (augmentationExists(AugmentationNames.ADRPheromone2)) {
+ delete Augmentations[AugmentationNames.ADRPheromone2];
+ }
+ AddToAugmentations(ADRPheromone2);
+
+ //HacknetNode Augmentations
+ var HacknetNodeCPUUpload = new Augmentation({
+ name:AugmentationNames.HacknetNodeCPUUpload, repCost:1500, moneyCost:2.2e6,
+ info:"Uploads the architecture and design details of a Hacknet Node's CPU into " +
+ "the brain. This allows the user to engineer custom hardware and software " +
+ "for the Hacknet Node that provides better performance.
" +
+ "This augmentation:
" +
+ "Increases the amount of money produced by Hacknet Nodes by 15%
" +
+ "Decreases the cost of purchasing a Hacknet Node by 15%"
+ });
+ HacknetNodeCPUUpload.addToFactions(["Netburners"]);
+ if (augmentationExists(AugmentationNames.HacknetNodeCPUUpload)) {
+ delete Augmentations[AugmentationNames.HacknetNodeCPUUpload];
+ }
+ AddToAugmentations(HacknetNodeCPUUpload);
+
+ var HacknetNodeCacheUpload = new Augmentation({
+ name:AugmentationNames.HacknetNodeCacheUpload, repCost:1e3, moneyCost:1.1e6,
+ info:"Uploads the architecture and design details of a Hacknet Node's main-memory cache " +
+ "into the brain. This allows the user to engineer custom cache hardware for the " +
+ "Hacknet Node that offers better performance.
" +
+ "This augmentation:
" +
+ "Increases the amount of money produced by Hacknet Nodes by 10%
" +
+ "Decreases the cost of leveling up a Hacknet Node by 15%"
+ });
+ HacknetNodeCacheUpload.addToFactions(["Netburners"]);
+ if (augmentationExists(AugmentationNames.HacknetNodeCacheUpload)) {
+ delete Augmentations[AugmentationNames.HacknetNodeCacheUpload];
+ }
+ AddToAugmentations(HacknetNodeCacheUpload);
+
+ var HacknetNodeNICUpload = new Augmentation({
+ name:AugmentationNames.HacknetNodeNICUpload, repCost:750, moneyCost:900e3,
+ info:"Uploads the architecture and design details of a Hacknet Node's Network Interface Card (NIC) " +
+ "into the brain. This allows the user to engineer a custom NIC for the Hacknet Node that " +
+ "offers better performance.
" +
+ "This augmentation:
" +
+ "Increases the amount of money produced by Hacknet Nodes by 10%
" +
+ "Decreases the cost of purchasing a Hacknet Node by 10%"
+ });
+ HacknetNodeNICUpload.addToFactions(["Netburners"]);
+ if (augmentationExists(AugmentationNames.HacknetNodeNICUpload)) {
+ delete Augmentations[AugmentationNames.HacknetNodeNICUpload];
+ }
+ AddToAugmentations(HacknetNodeNICUpload);
+
+ var HacknetNodeKernelDNI = new Augmentation({
+ name:AugmentationNames.HacknetNodeKernelDNI, repCost:3e3, moneyCost:8e6,
+ info:"Installs a Direct-Neural Interface jack into the arm that is capable of connecting to a " +
+ "Hacknet Node. This lets the user access and manipulate the Node's kernel using the mind's " +
+ "electrochemical signals.
" +
+ "This augmentation increases the amount of money produced by Hacknet Nodes by 25%."
+ });
+ HacknetNodeKernelDNI.addToFactions(["Netburners"]);
+ if (augmentationExists(AugmentationNames.HacknetNodeKernelDNI)) {
+ delete Augmentations[AugmentationNames.HacknetNodeKernelDNI];
+ }
+ AddToAugmentations(HacknetNodeKernelDNI);
+
+ var HacknetNodeCoreDNI = new Augmentation({
+ name:AugmentationNames.HacknetNodeCoreDNI, repCost:5e3, moneyCost:12e6,
+ info:"Installs a Direct-Neural Interface jack into the arm that is capable of connecting " +
+ "to a Hacknet Node. This lets the user access and manipulate the Node's processing logic using " +
+ "the mind's electrochemical signals.
" +
+ "This augmentation increases the amount of money produced by Hacknet Nodes by 45%."
+ });
+ HacknetNodeCoreDNI.addToFactions(["Netburners"]);
+ if (augmentationExists(AugmentationNames.HacknetNodeCoreDNI)) {
+ delete Augmentations[AugmentationNames.HacknetNodeCoreDNI];
+ }
+ AddToAugmentations(HacknetNodeCoreDNI);
+
+ //Misc/Hybrid augmentations
+ var NeuroFluxGovernor = new Augmentation({
+ name:AugmentationNames.NeuroFluxGovernor, repCost:500, moneyCost: 750e3,
+ info:"A device that is embedded in the back of the neck. The NeuroFlux Governor " +
+ "monitors and regulates nervous impulses coming to and from the spinal column, " +
+ "essentially 'governing' the body. By doing so, it improves the functionality of the " +
+ "body's nervous system.
" +
+ "This is a special augmentation because it can be leveled up infinitely. Each level of this augmentation " +
+ "increases ALL of the player's multipliers by 1%"
+ });
+ var nextLevel = Object(_Faction_js__WEBPACK_IMPORTED_MODULE_3__["getNextNeurofluxLevel"])();
+ NeuroFluxGovernor.level = nextLevel - 1;
+ mult = Math.pow(_Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].NeuroFluxGovernorLevelMult, NeuroFluxGovernor.level);
+ NeuroFluxGovernor.baseRepRequirement = 500 * mult * _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].AugmentationRepMultiplier * _BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].AugmentationRepCost;
+ NeuroFluxGovernor.baseCost = 750e3 * mult * _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].AugmentationCostMultiplier * _BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].AugmentationMoneyCost;
+ if (augmentationExists(AugmentationNames.NeuroFluxGovernor)) {
+ delete Augmentations[AugmentationNames.NeuroFluxGovernor];
+ }
+ NeuroFluxGovernor.addToAllFactions();
+ AddToAugmentations(NeuroFluxGovernor);
+
+ var Neurotrainer1 = new Augmentation({
+ name:AugmentationNames.Neurotrainer1, repCost:400, moneyCost:800e3,
+ info:"A decentralized cranial implant that improves the brain's ability to learn. It is " +
+ "installed by releasing millions of nanobots into the human brain, each of which " +
+ "attaches to a different neural pathway to enhance the brain's ability to retain " +
+ "and retrieve information.
" +
+ "This augmentation increases the player's experience gain rate for all stats by 10%"
+ });
+ Neurotrainer1.addToFactions(["CyberSec"]);
+ if (augmentationExists(AugmentationNames.Neurotrainer1)) {
+ delete Augmentations[AugmentationNames.Neurotrainer1];
+ }
+ AddToAugmentations(Neurotrainer1);
+
+ var Neurotrainer2 = new Augmentation({
+ name:AugmentationNames.Neurotrainer2, repCost:4e3, moneyCost:9e6,
+ info:"A decentralized cranial implant that improves the brain's ability to learn. This " +
+ "is a more powerful version of the Neurotrainer I augmentation, but it does not " +
+ "require Neurotrainer I to be installed as a prerequisite.
" +
+ "This augmentation increases the player's experience gain rate for all stats by 15%"
+ });
+ Neurotrainer2.addToFactions(["BitRunners", "NiteSec"]);
+ if (augmentationExists(AugmentationNames.Neurotrainer2)) {
+ delete Augmentations[AugmentationNames.Neurotrainer2];
+ }
+ AddToAugmentations(Neurotrainer2);
+
+ var Neurotrainer3 = new Augmentation({
+ name:AugmentationNames.Neurotrainer3, repCost:10e3, moneyCost:26e6,
+ info:"A decentralized cranial implant that improves the brain's ability to learn. This " +
+ "is a more powerful version of the Neurotrainer I and Neurotrainer II augmentation, " +
+ "but it does not require either of them to be installed as a prerequisite.
" +
+ "This augmentation increases the player's experience gain rate for all stats by 20%"
+ });
+ Neurotrainer3.addToFactions(["NWO", "Four Sigma"]);
+ if (augmentationExists(AugmentationNames.Neurotrainer3)) {
+ delete Augmentations[AugmentationNames.Neurotrainer3];
+ }
+ AddToAugmentations(Neurotrainer3);
+
+ var Hypersight = new Augmentation({
+ name:AugmentationNames.Hypersight, repCost:60e3, moneyCost:550e6,
+ info:"A bionic eye implant that grants sight capabilities far beyond those of a natural human. " +
+ "Embedded circuitry within the implant provides the ability to detect heat and movement " +
+ "through solid objects such as wells, thus providing 'x-ray vision'-like capabilities.
" +
+ "This augmentation:
" +
+ "Increases the player's dexterity by 40%
" +
+ "Increases the player's hacking speed by 3%
" +
+ "Increases the amount of money the player gains from hacking by 10%"
+ });
+ Hypersight.addToFactions(["Blade Industries", "KuaiGong International"]);
+ if (augmentationExists(AugmentationNames.Hypersight)) {
+ delete Augmentations[AugmentationNames.Hypersight];
+ }
+ AddToAugmentations(Hypersight);
+
+ var LuminCloaking1 = new Augmentation({
+ name:AugmentationNames.LuminCloaking1, repCost:600, moneyCost:1e6,
+ info:"A skin implant that reinforces the skin with highly-advanced synthetic cells. These " +
+ "cells, when powered, have a negative refractive index. As a result, they bend light " +
+ "around the skin, making the user much harder to see from the naked eye.
" +
+ "This augmentation:
" +
+ "Increases the player's agility by 5%
" +
+ "Increases the amount of money the player gains from crimes by 10%"
+ });
+ LuminCloaking1.addToFactions(["Slum Snakes", "Tetrads"]);
+ if (augmentationExists(AugmentationNames.LuminCloaking1)) {
+ delete Augmentations[AugmentationNames.LuminCloaking1];
+ }
+ AddToAugmentations(LuminCloaking1);
+
+ var LuminCloaking2 = new Augmentation({
+ name:AugmentationNames.LuminCloaking2, repCost:2e3, moneyCost:6e6,
+ info:"This is a more advanced version of the LuminCloaking-V2 augmentation. This skin implant " +
+ "reinforces the skin with highly-advanced synthetic cells. These " +
+ "cells, when powered, are capable of not only bending light but also of bending heat, " +
+ "making the user more resilient as well as stealthy.
" +
+ "This augmentation:
" +
+ "Increases the player's agility by 10%
" +
+ "Increases the player's defense by 10%
" +
+ "Increases the amount of money the player gains from crimes by 25%"
+ });
+ LuminCloaking2.addToFactions(["Slum Snakes", "Tetrads"]);
+ if (augmentationExists(AugmentationNames.LuminCloaking2)) {
+ delete Augmentations[AugmentationNames.LuminCloaking2];
+ }
+ AddToAugmentations(LuminCloaking2);
+
+ var SmartSonar = new Augmentation({
+ name:AugmentationNames.SmartSonar, repCost:9e3, moneyCost:15e6,
+ info:"A cochlear implant that helps the player detect and locate enemies " +
+ "using sound propagation.
" +
+ "This augmentation:
" +
+ "Increases the player's dexterity by 10%
" +
+ "Increases the player's dexterity experience gain rate by 15%
" +
+ "Increases the amount of money the player gains from crimes by 25%"
+ });
+ SmartSonar.addToFactions(["Slum Snakes"]);
+ if (augmentationExists(AugmentationNames.SmartSonar)) {
+ delete Augmentations[AugmentationNames.SmartSonar];
+ }
+ AddToAugmentations(SmartSonar);
+
+ var PowerRecirculator = new Augmentation({
+ name:AugmentationNames.PowerRecirculator, repCost:10e3, moneyCost:36e6,
+ info:"The body's nerves are attached with polypyrrole nanocircuits that " +
+ "are capable of capturing wasted energy (in the form of heat) " +
+ "and converting it back into usable power.
" +
+ "This augmentation:
" +
+ "Increases all of the player's stats by 5%
" +
+ "Increases the player's experience gain rate for all stats by 10%"
+ });
+ PowerRecirculator.addToFactions(["Tetrads", "The Dark Army", "The Syndicate", "NWO"]);
+ if (augmentationExists(AugmentationNames.PowerRecirculator)) {
+ delete Augmentations[AugmentationNames.PowerRecirculator];
+ }
+ AddToAugmentations(PowerRecirculator);
+
+ //Unique AUGS (Each Faction gets one unique augmentation)
+ //Factions that already have unique augs up to this point:
+ // Slum Snakes, CyberSec, Netburners, Fulcrum Secret Technologies,
+ // Silhouette
+
+ //Illuminati
+ var QLink = new Augmentation({
+ name:AugmentationNames.QLink, repCost:750e3, moneyCost:1300e6,
+ info:"A brain implant that wirelessly connects you to the Illuminati's " +
+ "quantum supercomputer, allowing you to access and use its incredible " +
+ "computing power.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking speed by 10%
" +
+ "Increases the player's chance of successfully performing a hack by 30%
" +
+ "Increases the amount of money the player gains from hacking by 100%"
+ });
+ QLink.addToFactions(["Illuminati"]);
+ if (augmentationExists(AugmentationNames.QLink)) {
+ delete Augmentations[AugmentationNames.QLink];
+ }
+ AddToAugmentations(QLink);
+
+ //Daedalus
+ var RedPill = new Augmentation({
+ name:AugmentationNames.TheRedPill, repCost:1e6, moneyCost:0,
+ info:"It's time to leave the cave"
+ });
+ RedPill.addToFactions(["Daedalus"]);
+ if (augmentationExists(AugmentationNames.TheRedPill)) {
+ delete Augmentations[AugmentationNames.TheRedPill];
+ }
+ AddToAugmentations(RedPill);
+
+ //Covenant
+ var SPTN97 = new Augmentation({
+ name:AugmentationNames.SPTN97, repCost:500e3, moneyCost:975e6,
+ info:"The SPTN-97 gene is injected into the genome. The SPTN-97 gene is an " +
+ "artificially-synthesized gene that was developed by DARPA to create " +
+ "super-soldiers through genetic modification. The gene was outlawed in " +
+ "2056.
" +
+ "This augmentation:
" +
+ "Increases all of the player's combat stats by 75%
" +
+ "Increases the player's hacking skill by 15%"
+ });
+ SPTN97.addToFactions(["The Covenant"]);
+ if (augmentationExists(AugmentationNames.SPTN97)) {
+ delete Augmentations[AugmentationNames.SPTN97];
+ }
+ AddToAugmentations(SPTN97);
+
+ //ECorp
+ var HiveMind = new Augmentation({
+ name:AugmentationNames.HiveMind, repCost:600e3, moneyCost:1100e6,
+ info:"A brain implant developed by ECorp. They do not reveal what " +
+ "exactly the implant does, but they promise that it will greatly " +
+ "enhance your abilities."
+ });
+ HiveMind.addToFactions(["ECorp"]);
+ if (augmentationExists(AugmentationNames.HiveMind)) {
+ delete Augmentations[AugmentationNames.HiveMind];
+ }
+ AddToAugmentations(HiveMind);
+
+ //MegaCorp
+ var CordiARCReactor = new Augmentation({
+ name:AugmentationNames.CordiARCReactor, repCost:450e3, moneyCost:1000e6,
+ info:"The thoracic cavity is equipped with a small chamber designed " +
+ "to hold and sustain hydrogen plasma. The plasma is used to generate " +
+ "fusion power through nuclear fusion, providing limitless amount of clean " +
+ "energy for the body.
" +
+ "This augmentation:
" +
+ "Increases all of the player's combat stats by 35%
" +
+ "Increases all of the player's combat stat experience gain rate by 35%"
+ });
+ CordiARCReactor.addToFactions(["MegaCorp"]);
+ if (augmentationExists(AugmentationNames.CordiARCReactor)) {
+ delete Augmentations[AugmentationNames.CordiARCReactor];
+ }
+ AddToAugmentations(CordiARCReactor);
+
+ //BachmanAndAssociates
+ var SmartJaw = new Augmentation({
+ name:AugmentationNames.SmartJaw, repCost:150e3, moneyCost:550e6,
+ info:"A bionic jaw that contains advanced hardware and software " +
+ "capable of psychoanalyzing and profiling the personality of " +
+ "others using optical imaging software.
" +
+ "This augmentation:
" +
+ "Increases the player's charisma by 50%.
" +
+ "Increases the player's charisma experience gain rate by 50%
" +
+ "Increases the amount of reputation the player gains for a company by 25%
" +
+ "Increases the amount of reputation the player gains for a faction by 25%"
+ });
+ SmartJaw.addToFactions(["Bachman & Associates"]);
+ if (augmentationExists(AugmentationNames.SmartJaw)) {
+ delete Augmentations[AugmentationNames.SmartJaw];
+ }
+ AddToAugmentations(SmartJaw);
+
+ //BladeIndustries
+ var Neotra = new Augmentation({
+ name:AugmentationNames.Neotra, repCost:225e3, moneyCost:575e6,
+ info:"A highly-advanced techno-organic drug that is injected into the skeletal " +
+ "and integumentary system. The drug permanently modifies the DNA of the " +
+ "body's skin and bone cells, granting them the ability to repair " +
+ "and restructure themselves.
" +
+ "This augmentation increases the player's strength and defense by 55%"
+ });
+ Neotra.addToFactions(["Blade Industries"]);
+ if (augmentationExists(AugmentationNames.Neotra)) {
+ delete Augmentations[AugmentationNames.Neotra];
+ }
+ AddToAugmentations(Neotra);
+
+ //NWO
+ var Xanipher = new Augmentation({
+ name:AugmentationNames.Xanipher, repCost:350e3, moneyCost:850e6,
+ info:"A concoction of advanced nanobots that is orally ingested into the " +
+ "body. These nanobots induce physiological change and significantly " +
+ "improve the body's functionining in all aspects.
" +
+ "This augmentation:
" +
+ "Increases all of the player's stats by 20%
" +
+ "Increases the player's experience gain rate for all stats by 15%"
+ });
+ Xanipher.addToFactions(["NWO"]);
+ if (augmentationExists(AugmentationNames.Xanipher)) {
+ delete Augmentations[AugmentationNames.Xanipher];
+ }
+ AddToAugmentations(Xanipher);
+
+ //ClarkeIncorporated
+ var nextSENS = new Augmentation({
+ name:AugmentationNames.nextSENS, repCost:175e3, moneyCost:385e6,
+ info:"The body is genetically re-engineered to maintain a state " +
+ "of negligible senescence, preventing the body from " +
+ "deteriorating with age.
" +
+ "This augmentation increases all of the player's stats by 20%"
+ });
+ nextSENS.addToFactions(["Clarke Incorporated"]);
+ if (augmentationExists(AugmentationNames.nextSENS)) {
+ delete Augmentations[AugmentationNames.nextSENS];
+ }
+ AddToAugmentations(nextSENS);
+
+ //OmniTekIncorporated
+ var OmniTekInfoLoad = new Augmentation({
+ name:AugmentationNames.OmniTekInfoLoad, repCost:250e3, moneyCost:575e6,
+ info:"OmniTek's data and information repository is uploaded " +
+ "into your brain, enhancing your programming and " +
+ "hacking abilities.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking skill by 20%
" +
+ "Increases the player's hacking experience gain rate by 25%"
+ });
+ OmniTekInfoLoad.addToFactions(["OmniTek Incorporated"]);
+ if (augmentationExists(AugmentationNames.OmniTekInfoLoad)) {
+ delete Augmentations[AugmentationNames.OmniTekInfoLoad];
+ }
+ AddToAugmentations(OmniTekInfoLoad);
+
+ //FourSigma
+ //TODO Later when Intelligence is added in . Some aug that greatly increases int
+
+ //KuaiGongInternational
+ var PhotosyntheticCells = new Augmentation({
+ name:AugmentationNames.PhotosyntheticCells, repCost:225e3, moneyCost:550e6,
+ info:"Chloroplasts are added to epidermal stem cells and are applied " +
+ "to the body using a skin graft. The result is photosynthetic " +
+ "skin cells, allowing users to generate their own energy " +
+ "and nutrition using solar power.
" +
+ "This augmentation increases the player's strength, defense, and agility by 40%"
+ });
+ PhotosyntheticCells.addToFactions(["KuaiGong International"]);
+ if (augmentationExists(AugmentationNames.PhotosyntheticCells)) {
+ delete Augmentations[AugmentationNames.PhotosyntheticCells];
+ }
+ AddToAugmentations(PhotosyntheticCells);
+
+ //BitRunners
+ var Neurolink = new Augmentation({
+ name:AugmentationNames.Neurolink, repCost:350e3, moneyCost:875e6,
+ info:"A brain implant that provides a high-bandwidth, direct neural link between your " +
+ "mind and BitRunners' data servers, which reportedly contain " +
+ "the largest database of hacking tools and information in the world.
" +
+ "This augmentation:
" +
+ "Increases the player's hacking skill by 15%
" +
+ "Increases the player's hacking experience gain rate by 20%
" +
+ "Increases the player's chance of successfully performing a hack by 10%
" +
+ "Increases the player's hacking speed by 5%
" +
+ "Lets the player start with the FTPCrack.exe and relaySMTP.exe programs after a reset"
+ });
+ Neurolink.addToFactions(["BitRunners"]);
+ if (augmentationExists(AugmentationNames.Neurolink)) {
+ delete Augmentations[AugmentationNames.Neurolink];
+ }
+ AddToAugmentations(Neurolink);
+
+ //BlackHand
+ var TheBlackHand = new Augmentation({
+ name:AugmentationNames.TheBlackHand, repCost:40e3, moneyCost:110e6,
+ info:"A highly advanced bionic hand. This prosthetic not only " +
+ "enhances strength and dexterity but it is also embedded " +
+ "with hardware and firmware that lets the user connect to, access and hack " +
+ "devices and machines just by touching them.
" +
+ "This augmentation:
" +
+ "Increases the player's strength and dexterity by 15%
" +
+ "Increases the player's hacking skill by 10%
" +
+ "Increases the player's hacking speed by 2%
" +
+ "Increases the amount of money the player gains from hacking by 10%"
+ });
+ TheBlackHand.addToFactions(["The Black Hand"]);
+ if (augmentationExists(AugmentationNames.TheBlackHand)) {
+ delete Augmentations[AugmentationNames.TheBlackHand];
+ }
+ AddToAugmentations(TheBlackHand);
+
+ //NiteSec
+ var CRTX42AA = new Augmentation({
+ name:AugmentationNames.CRTX42AA, repCost:18e3, moneyCost:45e6,
+ info:"The CRTX42-AA gene is injected into the genome. " +
+ "The CRTX42-AA is an artificially-synthesized gene that targets the visual and prefrontal " +
+ "cortex and improves cognitive abilities.
" +
+ "This augmentation:
" +
+ "Improves the player's hacking skill by 8%
" +
+ "Improves the player's hacking experience gain rate by 15%"
+ });
+ CRTX42AA.addToFactions(["NiteSec"]);
+ if (augmentationExists(AugmentationNames.CRTX42AA)) {
+ delete Augmentations[AugmentationNames.CRTX42AA];
+ }
+ AddToAugmentations(CRTX42AA);
+
+ //Chongqing
+ var Neuregen = new Augmentation({
+ name:AugmentationNames.Neuregen, repCost:15e3, moneyCost:75e6,
+ info:"A drug that genetically modifies the neurons in the brain. " +
+ "The result is that these neurons never die and continuously " +
+ "regenerate and strengthen themselves.
" +
+ "This augmentation increases the player's hacking experience gain rate by 40%"
+ });
+ Neuregen.addToFactions(["Chongqing"]);
+ if (augmentationExists(AugmentationNames.Neuregen)) {
+ delete Augmentations[AugmentationNames.Neuregen];
+ }
+ AddToAugmentations(Neuregen);
+
+ //Sector12
+ var CashRoot = new Augmentation({
+ name:AugmentationNames.CashRoot, repCost:5e3, moneyCost:25e6,
+ info:"A collection of digital assets saved on a small chip. The chip is implanted " +
+ "into your wrist. A small jack in the chip allows you to connect it to a computer " +
+ "and upload the assets.
" +
+ "This augmentation:
" +
+ "Lets the player start with $1,000,000 after a reset
" +
+ "Lets the player start with the BruteSSH.exe program after a reset"
+ });
+ CashRoot.addToFactions(["Sector-12"]);
+ if (augmentationExists(AugmentationNames.CashRoot)) {
+ delete Augmentations[AugmentationNames.CashRoot];
+ }
+ AddToAugmentations(CashRoot);
+
+ //NewTokyo
+ var NutriGen = new Augmentation({
+ name:AugmentationNames.NutriGen, repCost:2500, moneyCost:500e3,
+ info:"A thermo-powered artificial nutrition generator. Endogenously " +
+ "synthesizes glucose, amino acids, and vitamins and redistributes them " +
+ "across the body. The device is powered by the body's naturally wasted " +
+ "energy in the form of heat.
" +
+ "This augmentation:
" +
+ "Increases the player's experience gain rate for all combat stats by 20%"
+ });
+ NutriGen.addToFactions(["New Tokyo"]);
+ if (augmentationExists(AugmentationNames.NutriGen)) {
+ delete Augmentations[AugmentationNames.NutriGen];
+ }
+ AddToAugmentations(NutriGen);
+
+ //Aevum
+ //TODO Later Something that lets you learn advanced math...this increases int
+ //and profits as a trader/from trading
+
+ //Ishima
+ var INFRARet = new Augmentation({
+ name:AugmentationNames.INFRARet, repCost:3e3, moneyCost:6e6,
+ info:"A retina implant consisting of a tiny chip that sits behind the " +
+ "retina. This implant lets people visually detect infrared radiation.
" +
+ "This augmentation:
" +
+ "Increases the player's crime success rate by 25%
" +
+ "Increases the amount of money the player gains from crimes by 10%
" +
+ "Increases the player's dexterity by 10%"
+ });
+ INFRARet.addToFactions(["Ishima"]);
+ if (augmentationExists(AugmentationNames.INFRARet)) {
+ delete Augmentations[AugmentationNames.INFRARet];
+ }
+ AddToAugmentations(INFRARet);
+
+ //Volhaven
+ var DermaForce = new Augmentation({
+ name:AugmentationNames.DermaForce, repCost:6e3, moneyCost:10e6,
+ info:"A synthetic skin is grafted onto the body. The skin consists of " +
+ "millions of nanobots capable of projecting high-density muon beams, " +
+ "creating an energy barrier around the user.
" +
+ "This augmentation increases the player's defense by 40%"
+ });
+ DermaForce.addToFactions(["Volhaven"]);
+ if (augmentationExists(AugmentationNames.DermaForce)) {
+ delete Augmentations[AugmentationNames.DermaForce];
+ }
+ AddToAugmentations(DermaForce);
+
+ //SpeakersForTheDead
+ var GrapheneBrachiBlades = new Augmentation({
+ name:AugmentationNames.GrapheneBrachiBlades, repCost:90e3, moneyCost:500e6,
+ info:"An upgrade to the BrachiBlades augmentation. It infuses " +
+ "the retractable blades with an advanced graphene material " +
+ "to make them much stronger and lighter.
" +
+ "This augmentation:
" +
+ "Increases the player's strength and defense by 40%
" +
+ "Increases the player's crime success rate by 10%
" +
+ "Increases the amount of money the player gains from crimes by 30%",
+ prereqs:[AugmentationNames.BrachiBlades],
+ });
+ GrapheneBrachiBlades.addToFactions(["Speakers for the Dead"]);
+ if (augmentationExists(AugmentationNames.GrapheneBrachiBlades)) {
+ delete Augmentations[AugmentationNames.GrapheneBrachiBlades];
+ }
+ AddToAugmentations(GrapheneBrachiBlades);
+
+ //DarkArmy
+ var GrapheneBionicArms = new Augmentation({
+ name:AugmentationNames.GrapheneBionicArms, repCost:200e3, moneyCost:750e6,
+ info:"An upgrade to the Bionic Arms augmentation. It infuses the " +
+ "prosthetic arms with an advanced graphene material " +
+ "to make them much stronger and lighter.
" +
+ "This augmentation increases the player's strength and dexterity by 85%",
+ prereqs:[AugmentationNames.BionicArms],
+ });
+ GrapheneBionicArms.addToFactions(["The Dark Army"]);
+ if (augmentationExists(AugmentationNames.GrapheneBionicArms)) {
+ delete Augmentations[AugmentationNames.GrapheneBionicArms];
+ }
+ AddToAugmentations(GrapheneBionicArms);
+
+ //TheSyndicate
+ var BrachiBlades = new Augmentation({
+ name:AugmentationNames.BrachiBlades, repCost:5e3, moneyCost:18e6,
+ info:"A set of retractable plasteel blades are implanted in the arm, underneath the skin. " +
+ "
This augmentation:
" +
+ "Increases the player's strength and defense by 15%
" +
+ "Increases the player's crime success rate by 10%
" +
+ "Increases the amount of money the player gains from crimes by 15%"
+ });
+ BrachiBlades.addToFactions(["The Syndicate"]);
+ if (augmentationExists(AugmentationNames.BrachiBlades)) {
+ delete Augmentations[AugmentationNames.BrachiBlades];
+ }
+ AddToAugmentations(BrachiBlades);
+
+ //Tetrads
+ var BionicArms = new Augmentation({
+ name:AugmentationNames.BionicArms, repCost:25e3, moneyCost:55e6,
+ info:"Cybernetic arms created from plasteel and carbon fibers that completely replace " +
+ "the user's organic arms.
" +
+ "This augmentation increases the user's strength and dexterity by 30%"
+ });
+ BionicArms.addToFactions(["Tetrads"]);
+ if (augmentationExists(AugmentationNames.BionicArms)) {
+ delete Augmentations[AugmentationNames.BionicArms];
+ }
+ AddToAugmentations(BionicArms);
+
+ //TianDiHui
+ var SNA = new Augmentation({
+ name:AugmentationNames.SNA, repCost:2500, moneyCost:6e6,
+ info:"A cranial implant that affects the user's personality, making them better " +
+ "at negotiation in social situations.
" +
+ "This augmentation:
" +
+ "Increases the amount of money the player earns at a company by 10%
" +
+ "Increases the amount of reputation the player gains when working for a " +
+ "company or faction by 15%"
+ });
+ SNA.addToFactions(["Tian Di Hui"]);
+ if (augmentationExists(AugmentationNames.SNA)) {
+ delete Augmentations[AugmentationNames.SNA];
+ }
+ AddToAugmentations(SNA);
+
+ //For BitNode-2, add all Augmentations to crime/evil factions.
+ //Do this before adding special Augmentations that become available in later BitNodes
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bitNodeN === 2) {
+ console.log("Adding all augmentations to crime factions for Bit node 2");
+ _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"]["Slum Snakes"].addAllAugmentations();
+ _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"]["Tetrads"].addAllAugmentations();
+ _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"]["The Syndicate"].addAllAugmentations();
+ _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"]["The Dark Army"].addAllAugmentations();
+ _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"]["Speakers for the Dead"].addAllAugmentations();
+ _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"]["NiteSec"].addAllAugmentations();
+ _Faction_js__WEBPACK_IMPORTED_MODULE_3__["Factions"]["The Black Hand"].addAllAugmentations();
+ }
+
+ //Special Bladeburner Augmentations
+ var BladeburnersFactionName = "Bladeburners";
+ if (Object(_Faction_js__WEBPACK_IMPORTED_MODULE_3__["factionExists"])(BladeburnersFactionName)) {
+ var EsperEyewear = new Augmentation({
+ name:AugmentationNames.EsperEyewear, repCost:400, moneyCost:30e6,
+ info:"Ballistic-grade protective and retractable eyewear that was designed specially " +
+ "for Bladeburner units. This " +
+ "is implanted by installing a mechanical frame in the skull's orbit. " +
+ "This frame interfaces with the brain and allows the user to " +
+ "automatically extrude and extract the eyewear. The eyewear protects " +
+ "against debris, shrapnel, laser, flash, and gas. It is also " +
+ "embedded with a data processing chip that can be programmed to display an " +
+ "AR HUD and assist the user in field missions.
" +
+ "This augmentation:
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 3%
" +
+ "Increases the player's dexterity by 3%"
+ });
+ EsperEyewear.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(EsperEyewear);
+
+ var EMS4Recombination = new Augmentation({
+ name:AugmentationNames.EMS4Recombination, repCost: 800, moneyCost:50e6,
+ info:"A DNA recombination of the EMS-4 Gene. This genetic engineering " +
+ "technique was originally used on Bladeburners during the Synthoid uprising " +
+ "to induce wakefulness and concentration, suppress fear, reduce empathy, and " +
+ "improve reflexes and memory-recall among other things.
" +
+ "This augmentation:
" +
+ "Increases the player's sucess chance in Bladeburner contracts/operations by 3%
" +
+ "Increases the player's effectiveness in Bladeburner Field Analysis by 5%
" +
+ "Increases the player's Bladeburner stamina gain rate by 1%"
+ });
+ EMS4Recombination.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(EMS4Recombination);
+
+ var OrionShoulder = new Augmentation({
+ name:AugmentationNames.OrionShoulder, repCost:2e3, moneyCost:100e6,
+ info:"A bionic shoulder augmentation for the right shoulder. Using cybernetics, " +
+ "the ORION-MKIV shoulder enhances the strength and dexterity " +
+ "of the user's right arm. It also provides protection due to its " +
+ "crystallized graphene plating.
" +
+ "This augmentation:
" +
+ "Increases the player's defense by 5%.
" +
+ "Increases the player's strength and dexterity by 3%
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 4%"
+ });
+ OrionShoulder.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(OrionShoulder);
+
+ var HyperionV1 = new Augmentation({
+ name:AugmentationNames.HyperionV1, repCost: 4e3, moneyCost:500e6,
+ info:"A pair of mini plasma cannons embedded into the hands. The Hyperion is capable " +
+ "of rapidly firing bolts of high-density plasma. The weapon is meant to " +
+ "be used against augmented enemies as the ionized " +
+ "nature of the plasma disrupts the electrical systems of Augmentations. However, " +
+ "it can also be effective against non-augmented enemies due to its high temperature " +
+ "and concussive force.
" +
+ "This augmentation:
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 5%"
+ });
+ HyperionV1.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(HyperionV1);
+
+ var HyperionV2 = new Augmentation({
+ name:AugmentationNames.HyperionV2, repCost:8e3, moneyCost:1e9,
+ info:"A pair of mini plasma cannons embedded into the hands. This augmentation " +
+ "is more advanced and powerful than the original V1 model. This V2 model is " +
+ "more power-efficiency, more accurate, and can fire plasma bolts at a much " +
+ "higher velocity than the V1 model.
" +
+ "This augmentation:
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 7%",
+ prereqs:[AugmentationNames.HyperionV1]
+ });
+ HyperionV2.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(HyperionV2);
+
+ var GolemSerum = new Augmentation({
+ name:AugmentationNames.GolemSerum, repCost:10e3, moneyCost:2e9,
+ info:"A serum that permanently enhances many aspects of a human's capabilities, " +
+ "including strength, speed, immune system performance, and mitochondrial efficiency. The " +
+ "serum was originally developed by the Chinese military in an attempt to " +
+ "create super soldiers.
" +
+ "This augmentation:
" +
+ "Increases all of the player's combat stats by 5%
" +
+ "Increases the player's Bladeburner stamina gain rate by 5%
"
+ });
+ GolemSerum.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(GolemSerum);
+
+ var VangelisVirus = new Augmentation({
+ name:AugmentationNames.VangelisVirus, repCost:6e3, moneyCost:500e6,
+ info:"A synthetic symbiotic virus that is injected into the human brain tissue. The Vangelis virus " +
+ "heightens the senses and focus of its host, and also enhances its intuition.
" +
+ "This augmentation:
" +
+ "Increases the player's effectiveness in Bladeburner Field Analysis by 10%
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 4%
" +
+ "Increases the player's dexterity experience gain rate by 5%"
+ });
+ VangelisVirus.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(VangelisVirus);
+
+ var VangelisVirus3 = new Augmentation({
+ name:AugmentationNames.VangelisVirus3, repCost:12e3, moneyCost:2e9,
+ info:"An improved version of Vangelis, a synthetic symbiotic virus that is " +
+ "injected into the human brain tissue. On top of the benefits of the original " +
+ "virus, this also grants an accelerated healing factor and enhanced " +
+ "agility/reflexes.
" +
+ "This augmentation:
" +
+ "Increases the player's effectiveness in Bladeburner Field Analysis by 15%
" +
+ "Increases the player's defense and dexterity experience gain rate by 5%
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 5%",
+ prereqs:[AugmentationNames.VangelisVirus]
+ });
+ VangelisVirus3.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(VangelisVirus3);
+
+ var INTERLINKED = new Augmentation({
+ name:AugmentationNames.INTERLINKED, repCost:8e3, moneyCost:1e9,
+ info:"The DNA is genetically modified to enhance the human's body " +
+ "extracellular matrix (ECM). This improves the ECM's ability to " +
+ "structurally support the body and grants heightened strength and " +
+ "durability.
" +
+ "This augmentation:
" +
+ "Increases the player's experience gain rate for all combat stats by 4%
" +
+ "Increases the player's Bladeburner max stamina by 10%"
+ });
+ INTERLINKED.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(INTERLINKED);
+
+ var BladeRunner = new Augmentation({
+ name:AugmentationNames.BladeRunner, repCost:8e3, moneyCost:1.5e9,
+ info:"A cybernetic foot augmentation that was specially created for Bladeburners " +
+ "during the Synthoid Uprising. The organic musculature of the human foot " +
+ "is enhanced with flexible carbon nanotube matrices that are controlled by " +
+ "intelligent servo-motors.
" +
+ "This augmentation:
" +
+ "Increases the player's agility by 5%
" +
+ "Increases the player's Bladeburner max stamina by 5%
" +
+ "Increases the player's Bladeburner stamina gain rate by 5%
"
+ });
+ BladeRunner.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(BladeRunner);
+
+ var BladeArmor = new Augmentation({
+ name:AugmentationNames.BladeArmor, repCost:4e3, moneyCost:250e6,
+ info:"A powered exoskeleton suit (exosuit) designed as armor for Bladeburner units. This " +
+ "exoskeleton is incredibly adaptable and can protect the wearer from blunt, piercing, " +
+ "concussive, thermal, chemical, and electric trauma. It also enhances the user's " +
+ "strength and agility.
" +
+ "This augmentation:
" +
+ "Increases all of the player's combat stats by 2%
" +
+ "Increases the player's Bladeburner stamina gain rate by 2%
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 3%",
+ });
+ BladeArmor.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(BladeArmor);
+
+ var BladeArmorPowerCells = new Augmentation({
+ name:AugmentationNames.BladeArmorPowerCells, repCost:6e3, moneyCost:500e6,
+ info:"Upgrades the BLADE-51b Tesla Armor with Ion Power Cells, which are capable of " +
+ "more efficiently storing and using power.
" +
+ "This augmentation:
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 5%" +
+ "Increases the player's Bladeburner stamina gain rate by 2%
" +
+ "Increases the player's Bladeburner max stamina by 5%
",
+ prereqs:[AugmentationNames.BladeArmor]
+ });
+ BladeArmorPowerCells.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(BladeArmorPowerCells);
+
+ var BladeArmorEnergyShielding = new Augmentation({
+ name:AugmentationNames.BladeArmorEnergyShielding, repCost:7e3, moneyCost:1e9,
+ info:"Upgrades the BLADE-51b Tesla Armor with a plasma energy propulsion system " +
+ "that is capable of projecting an energy shielding force field.
" +
+ "This augmentation:
" +
+ "Increases the player's defense by 5%
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 6%",
+ prereqs:[AugmentationNames.BladeArmor]
+ });
+ BladeArmorEnergyShielding.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(BladeArmorEnergyShielding);
+
+ var BladeArmorUnibeam = new Augmentation({
+ name:AugmentationNames.BladeArmorUnibeam, repCost:10e3, moneyCost:3e9,
+ info:"Upgrades the BLADE-51b Tesla Armor with a concentrated deuterium-fluoride laser " +
+ "weapon. It's precision an accuracy makes it useful for quickly neutralizing " +
+ "threats while keeping casualties to a minimum.
" +
+ "This augmentation:
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 8%",
+ prereqs:[AugmentationNames.BladeArmor]
+ });
+ BladeArmorUnibeam.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(BladeArmorUnibeam);
+
+ var BladeArmorOmnibeam = new Augmentation({
+ name:AugmentationNames.BladeArmorOmnibeam, repCost:20e3, moneyCost:5e9,
+ info:"Upgrades the BLADE-51b Tesla Armor Unibeam augmentation to use " +
+ "multiple-fiber system. The upgraded weapon uses multiple fiber laser " +
+ "modules that combine together to form a single, more powerful beam of up to " +
+ "2000MW.
" +
+ "This augmentation:
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 10%",
+ prereqs:[AugmentationNames.BladeArmorUnibeam]
+ });
+ BladeArmorOmnibeam.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(BladeArmorOmnibeam);
+
+ var BladeArmorIPU = new Augmentation({
+ name:AugmentationNames.BladeArmorIPU, repCost: 5e3, moneyCost:200e6,
+ info:"Upgrades the BLADE-51b Tesla Armor with an AI Information Processing " +
+ "Unit that was specially designed to analyze Synthoid related data and " +
+ "information.
" +
+ "This augmentation:
" +
+ "Increases the player's effectiveness in Bladeburner Field Analysis by 15%
" +
+ "Increases the player's success chance in Bladeburner contracts/operations by 2%",
+ prereqs:[AugmentationNames.BladeArmor]
+ });
+ BladeArmorIPU.addToFactions([BladeburnersFactionName]);
+ resetAugmentation(BladeArmorIPU);
+ }
+
+ //Update costs based on how many have been purchased
+ var mult = Math.pow(_Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].MultipleAugMultiplier, _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].queuedAugmentations.length);
+ for (var name in Augmentations) {
+ if (Augmentations.hasOwnProperty(name)) {
+ Augmentations[name].baseCost *= mult;
+ }
+ }
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].reapplyAllAugmentations();
+
+
+}
+
+//Resets an Augmentation during (re-initizliation)
+function resetAugmentation(newAugObject) {
+ if (!(newAugObject instanceof Augmentation)) {
+ throw new Error("Invalid argument 'newAugObject' passed into resetAugmentation");
+ }
+ var name = newAugObject.name;
+ if (augmentationExists(name)) {
+ delete Augmentations[name];
+ }
+ AddToAugmentations(newAugObject);
+}
+
+function applyAugmentation(aug, reapply=false) {
+ Augmentations[aug.name].owned = true;
+ switch(aug.name) {
+ //Combat stat augmentations
+ case AugmentationNames.Targeting1:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.10;
+ break;
+ case AugmentationNames.Targeting2:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.20;
+ break;
+ case AugmentationNames.Targeting3:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.30;
+ break;
+ case AugmentationNames.SyntheticHeart: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.5;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.5;
+ break;
+ case AugmentationNames.SynfibrilMuscle: //Medium-high level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.3;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.3;
+ break;
+ case AugmentationNames.CombatRib1:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.1;
+ break;
+ case AugmentationNames.CombatRib2:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.14;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.14;
+ break;
+ case AugmentationNames.CombatRib3:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.18;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.18;
+ break;
+ case AugmentationNames.NanofiberWeave: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.2;
+ break;
+ case AugmentationNames.SubdermalArmor: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 2.2;
+ break;
+ case AugmentationNames.WiredReflexes: //Low level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.05;
+ break;
+ case AugmentationNames.GrapheneBoneLacings: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.7;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.7;
+ break;
+ case AugmentationNames.BionicSpine: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.15;
+ break;
+ case AugmentationNames.GrapheneBionicSpine: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.6;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.6;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.6;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.6;
+ break;
+ case AugmentationNames.BionicLegs: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.6;
+ break;
+ case AugmentationNames.GrapheneBionicLegs: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 2.5;
+ break;
+
+ //Labor stats augmentations
+ case AugmentationNames.EnhancedSocialInteractionImplant: //Med-high level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_mult *= 1.6;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.6;
+ break;
+ case AugmentationNames.TITN41Injection:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.15;
+ break;
+ case AugmentationNames.SpeechProcessor: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_mult *= 1.2;
+ break;
+
+ //Hacking augmentations
+ case AugmentationNames.BitWire:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.05;
+ break;
+ case AugmentationNames.ArtificialBioNeuralNetwork: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.03;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.12;
+ break;
+ case AugmentationNames.ArtificialSynapticPotentiation: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.05;
+ break;
+ case AugmentationNames.EnhancedMyelinSheathing: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.03;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.08;
+ break;
+ case AugmentationNames.SynapticEnhancement: //Low Level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.03;
+ break;
+ case AugmentationNames.NeuralRetentionEnhancement: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.25;
+ break;
+ case AugmentationNames.DataJack: //Med low level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.25;
+ break;
+ case AugmentationNames.ENM: //Medium level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.08;
+ break;
+ case AugmentationNames.ENMCore: //Medium level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.03;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.03;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.07;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.07;
+ break;
+ case AugmentationNames.ENMCoreV2: //Medium high level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.3;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.08;
+ break;
+ case AugmentationNames.ENMCoreV3: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.4;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.25;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.1;
+ break;
+ case AugmentationNames.ENMAnalyzeEngine: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.1;
+ break;
+ case AugmentationNames.ENMDMA: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.4;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.2;
+ break;
+ case AugmentationNames.Neuralstimulator: //Medium Level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.12;
+ break;
+ case AugmentationNames.NeuralAccelerator:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.2;
+ break;
+ case AugmentationNames.CranialSignalProcessorsG1:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.05;
+ break;
+ case AugmentationNames.CranialSignalProcessorsG2:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.07;
+ break;
+ case AugmentationNames.CranialSignalProcessorsG3:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.09;
+ break;
+ case AugmentationNames.CranialSignalProcessorsG4:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_grow_mult *= 1.25;
+ break;
+ case AugmentationNames.CranialSignalProcessorsG5:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.3;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.25;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_grow_mult *= 1.75;
+ break;
+ case AugmentationNames.NeuronalDensification:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.03;
+ break;
+
+ //Work augmentations
+ case AugmentationNames.NuoptimalInjectorImplant: //Low medium level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.2;
+ break;
+ case AugmentationNames.SpeechEnhancement: //Low level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_mult *= 1.1;
+ break;
+ case AugmentationNames.FocusWire: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].work_money_mult *= 1.2;
+ break;
+ case AugmentationNames.PCDNI: //Med level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.3;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.08;
+ break;
+ case AugmentationNames.PCDNIOptimizer: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.75;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.1;
+ break;
+ case AugmentationNames.PCDNINeuralNetwork: //High level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.05;
+ break;
+ case AugmentationNames.ADRPheromone1:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].faction_rep_mult *= 1.1;
+ break;
+ case AugmentationNames.ADRPheromone2:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].faction_rep_mult *= 1.2;
+ break;
+
+ //Hacknet Node Augmentations
+ case AugmentationNames.HacknetNodeCPUUpload:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_money_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_purchase_cost_mult *= 0.85;
+ break;
+ case AugmentationNames.HacknetNodeCacheUpload:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_money_mult *= 1.10;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_level_cost_mult *= 0.85;
+ break;
+ case AugmentationNames.HacknetNodeNICUpload:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_money_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_purchase_cost_mult *= 0.9;
+ break;
+ case AugmentationNames.HacknetNodeKernelDNI:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_money_mult *= 1.25;
+ break;
+ case AugmentationNames.HacknetNodeCoreDNI:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_money_mult *= 1.45;
+ break;
+
+ //Misc augmentations
+ case AugmentationNames.NeuroFluxGovernor:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_grow_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.01;
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_mult *= 1.01;
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.01;
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].faction_rep_mult *= 1.01;
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_money_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_success_mult *= 1.01;
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_money_mult *= 1.01;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_purchase_cost_mult *= 0.99;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_ram_cost_mult *= 0.99;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_core_cost_mult *= 0.99;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacknet_node_level_cost_mult *= 0.99;
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].work_money_mult *= 1.01;
+
+ if (!reapply) {
+ Augmentations[aug.name].level = aug.level;
+ for (var i = 0; i < _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations.length; ++i) {
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations[i].name == AugmentationNames.NeuroFluxGovernor) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations[i].level = aug.level;
+ break;
+ }
+ }
+ }
+ break;
+ case AugmentationNames.Neurotrainer1: //Low Level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.1;
+ break;
+ case AugmentationNames.Neurotrainer2: //Medium level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.15;
+ break;
+ case AugmentationNames.Neurotrainer3: //High Level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.2;
+ break;
+ case AugmentationNames.Hypersight: //Medium high level
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.4;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.03;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.1;
+ break;
+ case AugmentationNames.LuminCloaking1:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_money_mult *= 1.1;
+ break;
+ case AugmentationNames.LuminCloaking2:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_money_mult *= 1.25;
+ break;
+ case AugmentationNames.HemoRecirculator:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.08;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.08;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.08;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.08;
+ break;
+ case AugmentationNames.SmartSonar:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_money_mult *= 1.25;
+ break;
+ case AugmentationNames.PowerRecirculator:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.1;
+ break;
+ //Unique augmentations (for factions)
+ case AugmentationNames.QLink:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.3;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 2;
+ break;
+ case AugmentationNames.TheRedPill:
+ break;
+ case AugmentationNames.SPTN97:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.75;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.75;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.75;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.75;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.15;
+ break;
+ case AugmentationNames.HiveMind:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_grow_mult *= 3;
+ break;
+ case AugmentationNames.CordiARCReactor:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.35;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.35;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.35;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.35;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.35;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.35;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.35;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.35;
+ break;
+ case AugmentationNames.SmartJaw:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_mult *= 1.5;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.5;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.25;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].faction_rep_mult *= 1.25;
+ break;
+ case AugmentationNames.Neotra:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.55;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.55;
+ break;
+ case AugmentationNames.Xanipher:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_exp_mult *= 1.15;
+ break;
+ case AugmentationNames.nextSENS:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].charisma_mult *= 1.2;
+ break;
+ case AugmentationNames.OmniTekInfoLoad:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.25;
+ break;
+ case AugmentationNames.PhotosyntheticCells:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.4;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.4;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.4;
+ break;
+ case AugmentationNames.Neurolink:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_chance_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.05;
+ break;
+ case AugmentationNames.TheBlackHand:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_speed_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_money_mult *= 1.1;
+ break;
+ case AugmentationNames.CRTX42AA:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_mult *= 1.08;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.15;
+ break;
+ case AugmentationNames.Neuregen:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].hacking_exp_mult *= 1.4;
+ break;
+ case AugmentationNames.CashRoot:
+ break;
+ case AugmentationNames.NutriGen:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.2;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.2;
+ break;
+ case AugmentationNames.INFRARet:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_success_mult *= 1.25;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_money_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.1;
+ break;
+ case AugmentationNames.DermaForce:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.4;
+ break;
+ case AugmentationNames.GrapheneBrachiBlades:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.4;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.4;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_success_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_money_mult *= 1.3;
+ break;
+ case AugmentationNames.GrapheneBionicArms:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.85;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.85;
+ break;
+ case AugmentationNames.BrachiBlades:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_success_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].crime_money_mult *= 1.15;
+ break;
+ case AugmentationNames.BionicArms:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.3;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.3;
+ break;
+ case AugmentationNames.SNA:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].work_money_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].company_rep_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].faction_rep_mult *= 1.15;
+ break;
+
+ //Bladeburner augmentations
+ case AugmentationNames.EsperEyewear:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.03;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.03;
+ break;
+ case AugmentationNames.EMS4Recombination:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.03;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_analysis_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_stamina_gain_mult *= 1.01;
+ break;
+ case AugmentationNames.OrionShoulder:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.03;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.03;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.04;
+ break;
+ case AugmentationNames.HyperionV1:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.05;
+ break;
+ case AugmentationNames.HyperionV2:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.07;
+ break;
+ case AugmentationNames.GolemSerum:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_stamina_gain_mult *= 1.05;
+ break;
+ case AugmentationNames.VangelisVirus:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_analysis_mult *= 1.1;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.04;
+ break;
+ case AugmentationNames.VangelisVirus3:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_analysis_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.05;
+ break;
+ case AugmentationNames.INTERLINKED:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_exp_mult *= 1.04;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_exp_mult *= 1.04;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_exp_mult *= 1.04;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_exp_mult *= 1.04;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_max_stamina_mult *= 1.1;
+ break;
+ case AugmentationNames.BladeRunner:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_max_stamina_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_stamina_gain_mult *= 1.05;
+ break;
+ case AugmentationNames.BladeArmor:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].strength_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].dexterity_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].agility_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_stamina_gain_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.03;
+ break;
+ case AugmentationNames.BladeArmorPowerCells:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_stamina_gain_mult *= 1.02;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_max_stamina_mult *= 1.05;
+ break;
+ case AugmentationNames.BladeArmorEnergyShielding:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].defense_mult *= 1.05;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.06;
+ break;
+ case AugmentationNames.BladeArmorUnibeam:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.08;
+ break;
+ case AugmentationNames.BladeArmorOmnibeam:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.1;
+ break;
+ case AugmentationNames.BladeArmorIPU:
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_analysis_mult *= 1.15;
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bladeburner_success_chance_mult *= 1.02;
+ break;
+ default:
+ throw new Error("ERROR: No such augmentation!");
+ return;
+ }
+
+ if (aug.name == AugmentationNames.NeuroFluxGovernor) {
+ for (var i = 0; i < _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations.length; ++i) {
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations[i].name == AugmentationNames.NeuroFluxGovernor) {
+ //Already have this aug, just upgrade the level
+ return;
+ }
+ }
+ }
+
+ if (!reapply) {
+ var ownedAug = new PlayerOwnedAugmentation(aug.name);
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations.push(ownedAug);
+ }
+}
+
+function PlayerOwnedAugmentation(name) {
+ this.name = name;
+ this.level = 1;
+}
+
+function installAugmentations(cbScript=null) {
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].queuedAugmentations.length == 0) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_12__["dialogBoxCreate"])("You have not purchased any Augmentations to install!");
+ return false;
+ }
+ var augmentationList = "";
+ for (var i = 0; i < _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].queuedAugmentations.length; ++i) {
+ var aug = Augmentations[_Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].queuedAugmentations[i].name];
+ if (aug == null) {
+ console.log("ERROR. Invalid augmentation");
+ continue;
+ }
+ applyAugmentation(_Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].queuedAugmentations[i]);
+ augmentationList += (aug.name + "
");
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].queuedAugmentations = [];
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_12__["dialogBoxCreate"])("You slowly drift to sleep as scientists put you under in order " +
+ "to install the following Augmentations:
" + augmentationList +
+ "
You wake up in your home...you feel different...");
+ Object(_Prestige_js__WEBPACK_IMPORTED_MODULE_7__["prestigeAugmentation"])();
+
+ //Run a script after prestiging
+ if (cbScript && Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_15__["isString"])(cbScript)) {
+ var home = _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].getHomeComputer();
+ for (var i = 0; i < home.scripts.length; ++i) {
+ if (home.scripts[i].filename === cbScript) {
+ var script = home.scripts[i];
+ var ramUsage = script.ramUsage;
+ var ramAvailable = home.maxRam - home.ramUsed;
+ if (ramUsage > ramAvailable) {
+ return; //Not enough RAM
+ }
+ var runningScriptObj = new _Script_js__WEBPACK_IMPORTED_MODULE_9__["RunningScript"](script, []); //No args
+ runningScriptObj.threads = 1; //Only 1 thread
+ home.runningScripts.push(runningScriptObj);
+ Object(_NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_5__["addWorkerScript"])(runningScriptObj, home);
+ }
+ }
+ }
+}
+
+function augmentationExists(name) {
+ return Augmentations.hasOwnProperty(name);
+}
+
+//Used for testing balance
+function giveAllAugmentations() {
+ for (var name in Augmentations) {
+ var aug = Augmentations[name];
+ if (aug == null) {continue;}
+ var ownedAug = new PlayerOwnedAugmentation(name);
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations.push(ownedAug);
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].reapplyAllAugmentations();
+}
+
+function displayAugmentationsContent() {
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["removeChildrenFromElement"])(_engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent);
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("h1", {
+ innerText:"Purchased Augmentations",
+ }));
+
+ //Bladeburner text, once mechanic is unlocked
+ var bladeburnerText = "\n";
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].bitNodeN === 6 || _NetscriptFunctions_js__WEBPACK_IMPORTED_MODULE_4__["hasBladeburnerSF"]) {
+ bladeburnerText = "Bladeburner Progress\n\n";
+ }
+
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("pre", {
+ width:"70%", whiteSpace:"pre-wrap", display:"block",
+ innerText:"Below is a list of all Augmentations you have purchased but not yet installed. Click the button below to install them.\n" +
+ "WARNING: Installing your Augmentations resets most of your progress, including:\n\n" +
+ "Stats/Skill levels and Experience\n" +
+ "Money\n" +
+ "Scripts on every computer but your home computer\n" +
+ "Purchased servers\n" +
+ "Hacknet Nodes\n" +
+ "Faction/Company reputation\n" +
+ "Stocks\n" +
+ bladeburnerText +
+ "Installing Augmentations lets you start over with the perks and benefits granted by all " +
+ "of the Augmentations you have ever installed. Also, you will keep any scripts and RAM/Core upgrades " +
+ "on your home computer (but you will lose all programs besides NUKE.exe)."
+ }));
+
+ //Install Augmentations button
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("a", {
+ class:"a-link-button", innerText:"Install Augmentations",
+ tooltip:"'I never asked for this'",
+ clickListener:()=>{
+ installAugmentations();
+ return false;
+ }
+ }));
+
+ //Backup button
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("a", {
+ class:"a-link-button flashing-button", innerText:"Backup Save (Export)",
+ tooltip:"It's always a good idea to backup/export your save!",
+ clickListener:()=>{
+ _SaveObject_js__WEBPACK_IMPORTED_MODULE_8__["saveObject"].exportGame();
+ return false;
+ }
+ }));
+
+ //Purchased/queued augmentations list
+ var queuedAugmentationsList = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("ul", {class:"augmentations-list"});
+
+ for (var i = 0; i < _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].queuedAugmentations.length; ++i) {
+ var augName = _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].queuedAugmentations[i].name;
+ var aug = Augmentations[augName];
+
+ var displayName = augName;
+ if (augName === AugmentationNames.NeuroFluxGovernor) {
+ displayName += " - Level " + (_Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].queuedAugmentations[i].level);
+ }
+
+ var accordion = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createAccordionElement"])({hdrText:displayName, panelText:aug.info});
+ queuedAugmentationsList.appendChild(accordion[0]);
+ }
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(queuedAugmentationsList);
+
+ //Installed augmentations list
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("h1", {
+ innerText:"Installed Augmentations", marginTop:"8px",
+ }));
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("p", {
+ width:"70%", whiteSpace:"pre-wrap",
+ innerText:"List of all Augmentations (including Source Files) that have been " +
+ "installed. You have gained the effects of these Augmentations."
+ }));
+
+ var augmentationsList = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("ul", {class:"augmentations-list"});
+
+ //Expand/Collapse All buttons
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("a", {
+ class:"a-link-button", fontSize:"14px", innerText:"Expand All", display:"inline-block",
+ clickListener:()=>{
+ var allHeaders = augmentationsList.getElementsByClassName("accordion-header");
+ for (var i = 0; i < allHeaders.length; ++i) {
+ if (!allHeaders[i].classList.contains("active")) {allHeaders[i].click();}
+ }
+ }
+ }));
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("a", {
+ class:"a-link-button", fontSize:"14px", innerText:"Collapse All", display:"inline-block",
+ clickListener:()=>{
+ var allHeaders = augmentationsList.getElementsByClassName("accordion-header");
+ for (var i = 0; i < allHeaders.length; ++i) {
+ if (allHeaders[i].classList.contains("active")) {allHeaders[i].click();}
+ }
+ }
+ }));
+
+ //Sort Buttons
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("a", {
+ class:"a-link-button", fontSize:"14px", innerText:"Sort in Order",
+ tooltip:"Sorts the Augmentations alphabetically and Source Files in numerical order (1, 2, 3,...)",
+ clickListener:()=>{
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["removeChildrenFromElement"])(augmentationsList);
+
+ //Create a copy of Player's Source Files and augs array and sort them
+ var sourceFiles = _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].sourceFiles.slice();
+ var augs = _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations.slice();
+ sourceFiles.sort((sf1, sf2)=>{
+ return sf1.n - sf2.n;
+ });
+ augs.sort((aug1, aug2)=>{
+ return aug1.name <= aug2.name ? -1 : 1;
+ });
+ displaySourceFiles(augmentationsList, sourceFiles);
+ displayAugmentations(augmentationsList, augs);
+ }
+ }));
+
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createElement"])("a", {
+ class:"a-link-button", fontSize:"14px", innerText:"Sort by Acquirement Time",
+ tooltip:"Sorts the Augmentations and Source Files based on when you acquired them (same as default)",
+ clickListener:()=>{
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["removeChildrenFromElement"])(augmentationsList);
+ displaySourceFiles(augmentationsList, _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].sourceFiles);
+ displayAugmentations(augmentationsList, _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations);
+ }
+ }));
+
+ //Source Files - Temporary...Will probably put in a separate pane Later
+ displaySourceFiles(augmentationsList, _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].sourceFiles);
+ displayAugmentations(augmentationsList, _Player_js__WEBPACK_IMPORTED_MODULE_6__["Player"].augmentations);
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].Display.augmentationsContent.appendChild(augmentationsList);
+}
+
+//Creates the accordion elements to display Augmentations
+// @listElement - List DOM element to append accordion elements to
+// @augs - Array of Augmentation objects
+function displayAugmentations(listElement, augs) {
+ for (var i = 0; i < augs.length; ++i) {
+ var augName = augs[i].name;
+ var aug = Augmentations[augName];
+
+ var displayName = augName;
+ if (augName === AugmentationNames.NeuroFluxGovernor) {
+ displayName += " - Level " + (augs[i].level);
+ }
+ var accordion = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createAccordionElement"])({hdrText:displayName, panelText:aug.info});
+ listElement.appendChild(accordion[0]);
+ }
+}
+
+//Creates the accordion elements to display Source Files
+// @listElement - List DOM element to append accordion elements to
+// @sourceFiles - Array of Source File objects
+function displaySourceFiles(listElement, sourceFiles) {
+ for (var i = 0; i < sourceFiles.length; ++i) {
+ var srcFileKey = "SourceFile" + sourceFiles[i].n;
+ var sourceFileObject = _SourceFile_js__WEBPACK_IMPORTED_MODULE_11__["SourceFiles"][srcFileKey];
+ if (sourceFileObject == null) {
+ console.log("ERROR: Invalid source file number: " + sourceFiles[i].n);
+ continue;
+ }
+ var accordion = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_13__["createAccordionElement"])({
+ hdrText:sourceFileObject.name + "
" + "Level " + (sourceFiles[i].lvl) + " / 3",
+ panelText:sourceFileObject.info
+ });
+
+ listElement.appendChild(accordion[0]);
+ }
+}
+
+
+
+
+
+/***/ }),
+/* 19 */
+/*!***********************!*\
+ !*** ./src/Crimes.js ***!
+ \***********************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitShopliftCrime", function() { return commitShopliftCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitRobStoreCrime", function() { return commitRobStoreCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitMugCrime", function() { return commitMugCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitLarcenyCrime", function() { return commitLarcenyCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitDealDrugsCrime", function() { return commitDealDrugsCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitBondForgeryCrime", function() { return commitBondForgeryCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitTraffickArmsCrime", function() { return commitTraffickArmsCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitHomicideCrime", function() { return commitHomicideCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitGrandTheftAutoCrime", function() { return commitGrandTheftAutoCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitKidnapCrime", function() { return commitKidnapCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitAssassinationCrime", function() { return commitAssassinationCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commitHeistCrime", function() { return commitHeistCrime; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeSuccess", function() { return determineCrimeSuccess; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceShoplift", function() { return determineCrimeChanceShoplift; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceRobStore", function() { return determineCrimeChanceRobStore; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceMug", function() { return determineCrimeChanceMug; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceLarceny", function() { return determineCrimeChanceLarceny; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceDealDrugs", function() { return determineCrimeChanceDealDrugs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceBondForgery", function() { return determineCrimeChanceBondForgery; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceTraffickArms", function() { return determineCrimeChanceTraffickArms; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceHomicide", function() { return determineCrimeChanceHomicide; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceGrandTheftAuto", function() { return determineCrimeChanceGrandTheftAuto; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceKidnap", function() { return determineCrimeChanceKidnap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceAssassination", function() { return determineCrimeChanceAssassination; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "determineCrimeChanceHeist", function() { return determineCrimeChanceHeist; });
+/* harmony import */ var _Constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Constants.js */ 3);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/DialogBox.js */ 6);
+
+
+
+
+/* Crimes.js */
+function commitShopliftCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeShoplift;
+ var time = 2000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(0, 0, 0, 2/div, 2/div, 0, 15000/div, time, singParams); //$7500/s, 1 exp/s
+ return time;
+}
+
+function commitRobStoreCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeRobStore;
+ var time = 60000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(30/div, 0, 0, 45/div, 45/div, 0, 400000/div, time, singParams); //$6666,6/2, 0.5exp/s, 0.75exp/s
+ return time;
+}
+
+function commitMugCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeMug;
+ var time = 4000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(0, 3/div, 3/div, 3/div, 3/div, 0, 36000/div, time, singParams); //$9000/s, .66 exp/s
+ return time;
+}
+
+function commitLarcenyCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeLarceny;
+ var time = 90000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(45/div, 0, 0, 60/div, 60/div, 0, 800000/div, time, singParams) // $8888.88/s, .5 exp/s, .66 exp/s
+ return time;
+}
+
+function commitDealDrugsCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeDrugs;
+ var time = 10000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(0, 0, 0, 5/div, 5/div, 10/div, 120000/div, time, singParams); //$12000/s, .5 exp/s, 1 exp/s
+ return time;
+}
+
+function commitBondForgeryCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeBondForgery;
+ var time = 300000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(100/div, 0, 0, 150/div, 0, 15/div, 4500000/div, time, singParams); //$15000/s, 0.33 hack exp/s, .5 dex exp/s, .05 cha exp
+ return time;
+}
+
+function commitTraffickArmsCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeTraffickArms;
+ var time = 40000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(0, 20/div, 20/div, 20/div, 20/div, 40/div, 600000/div, time, singParams); //$15000/s, .5 combat exp/s, 1 cha exp/s
+ return time;
+}
+
+function commitHomicideCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeHomicide;
+ var time = 3000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(0, 2/div, 2/div, 2/div, 2/div, 0, 45000/div, time, singParams); //$15000/s, 0.66 combat exp/s
+ return time;
+}
+
+function commitGrandTheftAutoCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeGrandTheftAuto;
+ var time = 80000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(0, 20/div, 20/div, 20/div, 80/div, 40/div, 1600000/div, time, singParams); //$20000/s, .25 exp/s, 1 exp/s, .5 exp/s
+ return time;
+}
+
+function commitKidnapCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeKidnap;
+ var time = 120000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(0, 80/div, 80/div, 80/div, 80/div, 80/div, 3600000/div, time, singParams); //$30000/s. .66 exp/s
+ return time;
+}
+
+function commitAssassinationCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeAssassination;
+ var time = 300000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(0, 300/div, 300/div, 300/div, 300/div, 0, 12000000/div, time, singParams); //$40000/s, 1 exp/s
+ return time;
+}
+
+function commitHeistCrime(div=1, singParams=null) {
+ if (div <= 0) {div = 1;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crimeType = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeHeist;
+ var time = 600000;
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].startCrime(450/div, 450/div, 450/div, 450/div, 450/div, 450/div, 120000000/div, time, singParams); //$200000/s, .75exp/s
+ return time;
+}
+
+function determineCrimeSuccess(crime, moneyGained) {
+ var chance = 0;
+ switch (crime) {
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeShoplift:
+ chance = determineCrimeChanceShoplift();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeRobStore:
+ chance = determineCrimeChanceRobStore();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeMug:
+ chance = determineCrimeChanceMug();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeLarceny:
+ chance = determineCrimeChanceLarceny();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeDrugs:
+ chance = determineCrimeChanceDealDrugs();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeBondForgery:
+ chance = determineCrimeChanceBondForgery();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeTraffickArms:
+ chance = determineCrimeChanceTraffickArms();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeHomicide:
+ chance = determineCrimeChanceHomicide();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeGrandTheftAuto:
+ chance = determineCrimeChanceGrandTheftAuto();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeKidnap:
+ chance = determineCrimeChanceKidnap();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeAssassination:
+ chance = determineCrimeChanceAssassination();
+ break;
+ case _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].CrimeHeist:
+ chance = determineCrimeChanceHeist();
+ break;
+ default:
+ console.log(crime);
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_2__["dialogBoxCreate"])("ERR: Unrecognized crime type. This is probably a bug please contact the developer");
+ return;
+ }
+
+ if (Math.random() <= chance) {
+ //Success
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].gainMoney(moneyGained);
+ return true;
+ } else {
+ //Failure
+ return false;
+ }
+}
+
+let intWgt = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].IntelligenceCrimeWeight;
+let maxLvl = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].MaxSkillLevel;
+
+function determineCrimeChanceShoplift() {
+ var chance = (_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl) * 20;
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceRobStore() {
+ var chance = (0.5 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].hacking_skill / maxLvl +
+ 2 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ 1 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl) * 5;
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceMug() {
+ var chance = (1.5 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].strength / maxLvl +
+ 0.5 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].defense / maxLvl +
+ 1.5 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ 0.5 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl) * 5;
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceLarceny() {
+ var chance = (0.5 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].hacking_skill / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl) * 3;
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceDealDrugs() {
+ var chance = (3*_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].charisma / maxLvl +
+ 2*_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl);
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceBondForgery() {
+ var chance = (0.1*_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].hacking_skill / maxLvl +
+ 2.5*_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ 2*intWgt*_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl);
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceTraffickArms() {
+ var chance = (_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].charisma / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].strength / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].defense / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl) / 2;
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceHomicide() {
+ var chance = (2 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].strength / maxLvl +
+ 2 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].defense / maxLvl +
+ 0.5 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ 0.5 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl);
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceGrandTheftAuto() {
+ var chance = (_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].hacking_skill / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].strength / maxLvl +
+ 4 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ 2 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ 2 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].charisma / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl) / 8;
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceKidnap() {
+ var chance = (_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].charisma / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].strength / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl) / 5;
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceAssassination() {
+ var chance = (_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].strength / maxLvl +
+ 2 * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl) / 8;
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+function determineCrimeChanceHeist() {
+ var chance = (_Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].hacking_skill / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].strength / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].defense / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].dexterity / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].agility / maxLvl +
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].charisma / maxLvl +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].intelligence / maxLvl) / 18;
+ chance *= _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].crime_success_mult;
+ return Math.min(chance, 1);
+}
+
+
+
+
+/***/ }),
+/* 20 */
+/*!********************************!*\
+ !*** ./src/NetscriptWorker.js ***!
+ \********************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WorkerScript", function() { return WorkerScript; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "workerScripts", function() { return workerScripts; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NetscriptPorts", function() { return NetscriptPorts; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptsLoop", function() { return runScriptsLoop; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "killWorkerScript", function() { return killWorkerScript; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addWorkerScript", function() { return addWorkerScript; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateOnlineScriptTimes", function() { return updateOnlineScriptTimes; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prestigeWorkerScripts", function() { return prestigeWorkerScripts; });
+/* harmony import */ var _ActiveScriptsUI_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActiveScriptsUI.js */ 43);
+/* harmony import */ var _Constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Constants.js */ 3);
+/* harmony import */ var _engine_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./engine.js */ 5);
+/* harmony import */ var _NetscriptEnvironment_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./NetscriptEnvironment.js */ 67);
+/* harmony import */ var _NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./NetscriptEvaluator.js */ 7);
+/* harmony import */ var _NetscriptPort_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./NetscriptPort.js */ 45);
+/* harmony import */ var _Server_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Server.js */ 10);
+/* harmony import */ var _Settings_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Settings.js */ 24);
+/* harmony import */ var _utils_acorn_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/acorn.js */ 35);
+/* harmony import */ var _utils_acorn_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_utils_acorn_js__WEBPACK_IMPORTED_MODULE_8__);
+/* harmony import */ var _utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/DialogBox.js */ 6);
+/* harmony import */ var _utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/HelperFunctions.js */ 1);
+
+
+
+
+
+
+
+
+
+
+
+
+
+function WorkerScript(runningScriptObj) {
+ this.name = runningScriptObj.filename;
+ this.running = false;
+ this.serverIp = null;
+ this.code = runningScriptObj.scriptRef.code;
+ this.env = new _NetscriptEnvironment_js__WEBPACK_IMPORTED_MODULE_3__["Environment"](this);
+ this.env.set("args", runningScriptObj.args.slice());
+ this.output = "";
+ this.ramUsage = 0;
+ this.scriptRef = runningScriptObj;
+ this.errorMessage = "";
+ this.args = runningScriptObj.args.slice();
+ this.delay = null;
+ this.fnWorker = null; //Workerscript for a function call
+ this.checkingRam = false;
+ this.loadedFns = {}; //Stores names of fns that are "loaded" by this script, thus using RAM
+ this.disableLogs = {}; //Stores names of fns that should have logs disabled
+}
+
+//Returns the server on which the workerScript is running
+WorkerScript.prototype.getServer = function() {
+ return _Server_js__WEBPACK_IMPORTED_MODULE_6__["AllServers"][this.serverIp];
+}
+
+//Array containing all scripts that are running across all servers, to easily run them all
+let workerScripts = [];
+
+var NetscriptPorts = [];
+for (var i = 0; i < _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].NumNetscriptPorts; ++i) {
+ NetscriptPorts.push(new _NetscriptPort_js__WEBPACK_IMPORTED_MODULE_5__["NetscriptPort"]());
+}
+
+function prestigeWorkerScripts() {
+ for (var i = 0; i < workerScripts.length; ++i) {
+ Object(_ActiveScriptsUI_js__WEBPACK_IMPORTED_MODULE_0__["deleteActiveScriptsItem"])(workerScripts[i]);
+ workerScripts[i].env.stopFlag = true;
+ }
+ workerScripts.length = 0;
+}
+
+//Loop through workerScripts and run every script that is not currently running
+function runScriptsLoop() {
+ //Delete any scripts that finished or have been killed. Loop backwards bc removing
+ //items fucks up the indexing
+ for (var i = workerScripts.length - 1; i >= 0; i--) {
+ if (workerScripts[i].running == false && workerScripts[i].env.stopFlag == true) {
+ //Delete script from the runningScripts array on its host serverIp
+ var ip = workerScripts[i].serverIp;
+ var name = workerScripts[i].name;
+
+ //Free RAM
+ _Server_js__WEBPACK_IMPORTED_MODULE_6__["AllServers"][ip].ramUsed -= workerScripts[i].ramUsage;
+
+ //Delete script from Active Scripts
+ Object(_ActiveScriptsUI_js__WEBPACK_IMPORTED_MODULE_0__["deleteActiveScriptsItem"])(workerScripts[i]);
+
+ for (var j = 0; j < _Server_js__WEBPACK_IMPORTED_MODULE_6__["AllServers"][ip].runningScripts.length; j++) {
+ if (_Server_js__WEBPACK_IMPORTED_MODULE_6__["AllServers"][ip].runningScripts[j].filename == name &&
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["compareArrays"])(_Server_js__WEBPACK_IMPORTED_MODULE_6__["AllServers"][ip].runningScripts[j].args, workerScripts[i].args)) {
+ _Server_js__WEBPACK_IMPORTED_MODULE_6__["AllServers"][ip].runningScripts.splice(j, 1);
+ break;
+ }
+ }
+
+ //Delete script from workerScripts
+ workerScripts.splice(i, 1);
+ }
+ }
+
+ //Run any scripts that haven't been started
+ for (var i = 0; i < workerScripts.length; i++) {
+ //If it isn't running, start the script
+ if (workerScripts[i].running == false && workerScripts[i].env.stopFlag == false) {
+ try {
+ var ast = Object(_utils_acorn_js__WEBPACK_IMPORTED_MODULE_8__["parse"])(workerScripts[i].code, {sourceType:"module"});
+ //console.log(ast);
+ } catch (e) {
+ console.log("Error parsing script: " + workerScripts[i].name);
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_9__["dialogBoxCreate"])("Syntax ERROR in " + workerScripts[i].name + ":
" + e);
+ workerScripts[i].env.stopFlag = true;
+ continue;
+ }
+
+ workerScripts[i].running = true;
+ var p = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_4__["evaluate"])(ast, workerScripts[i]);
+ //Once the code finishes (either resolved or rejected, doesnt matter), set its
+ //running status to false
+ p.then(function(w) {
+ console.log("Stopping script " + w.name + " because it finished running naturally");
+ w.running = false;
+ w.env.stopFlag = true;
+ w.scriptRef.log("Script finished running");
+ }).catch(function(w) {
+ if (w instanceof Error) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_9__["dialogBoxCreate"])("Script runtime unknown error. This is a bug please contact game developer");
+ console.log("ERROR: Evaluating workerscript returns an Error. THIS SHOULDN'T HAPPEN: " + w.toString());
+ return;
+ } else if (w.constructor === Array && w.length === 2 && w[0] === "RETURNSTATEMENT") {
+ //Script ends with a return statement
+ console.log("Script returning with value: " + w[1]);
+ //TODO maybe do something with this in the future
+ return;
+ } else if (w instanceof WorkerScript) {
+ if (Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_4__["isScriptErrorMessage"])(w.errorMessage)) {
+ var errorTextArray = w.errorMessage.split("|");
+ if (errorTextArray.length != 4) {
+ console.log("ERROR: Something wrong with Error text in evaluator...");
+ console.log("Error text: " + errorText);
+ return;
+ }
+ var serverIp = errorTextArray[1];
+ var scriptName = errorTextArray[2];
+ var errorMsg = errorTextArray[3];
+
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_9__["dialogBoxCreate"])("Script runtime error:
Server Ip: " + serverIp +
+ "
Script name: " + scriptName +
+ "
Args:" + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["printArray"])(w.args) + "
" + errorMsg);
+ w.scriptRef.log("Script crashed with runtime error");
+ } else {
+ w.scriptRef.log("Script killed");
+ }
+ w.running = false;
+ w.env.stopFlag = true;
+
+ } else if (Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_4__["isScriptErrorMessage"])(w)) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_9__["dialogBoxCreate"])("Script runtime unknown error. This is a bug please contact game developer");
+ console.log("ERROR: Evaluating workerscript returns only error message rather than WorkerScript object. THIS SHOULDN'T HAPPEN: " + w.toString());
+ return;
+ } else {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_9__["dialogBoxCreate"])("An unknown script died for an unknown reason. This is a bug please contact game dev");
+ }
+ });
+ }
+ }
+
+ setTimeout(runScriptsLoop, 6000);
+}
+
+//Queues a script to be killed by settings its stop flag to true. Then, the code will reject
+//all of its promises recursively, and when it does so it will no longer be running.
+//The runScriptsLoop() will then delete the script from worker scripts
+function killWorkerScript(runningScriptObj, serverIp) {
+ for (var i = 0; i < workerScripts.length; i++) {
+ if (workerScripts[i].name == runningScriptObj.filename && workerScripts[i].serverIp == serverIp &&
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["compareArrays"])(workerScripts[i].args, runningScriptObj.args)) {
+ workerScripts[i].env.stopFlag = true;
+ Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_4__["killNetscriptDelay"])(workerScripts[i]);
+ //Recursively kill all functions
+ var curr = workerScripts[i];
+ while (curr.fnWorker) {
+ curr.fnWorker.env.stopFlag = true;
+ Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_4__["killNetscriptDelay"])(curr.fnWorker);
+ curr = curr.fnWorker;
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+//Queues a script to be run
+function addWorkerScript(runningScriptObj, server) {
+ var filename = runningScriptObj.filename;
+
+ //Update server's ram usage
+ var threads = 1;
+ if (runningScriptObj.threads && !isNaN(runningScriptObj.threads)) {
+ threads = runningScriptObj.threads;
+ } else {
+ runningScriptObj.threads = 1;
+ }
+ var ramUsage = runningScriptObj.scriptRef.ramUsage * threads
+ * Math.pow(_Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].MultithreadingRAMCost, threads-1);
+ var ramAvailable = server.maxRam - server.ramUsed;
+ if (ramUsage > ramAvailable) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_9__["dialogBoxCreate"])("Not enough RAM to run script " + runningScriptObj.filename + " with args " +
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["printArray"])(runningScriptObj.args) + ". This likely occurred because you re-loaded " +
+ "the game and the script's RAM usage increased (either because of an update to the game or " +
+ "your changes to the script.)");
+ return;
+ }
+ server.ramUsed += ramUsage;
+
+ //Create the WorkerScript
+ var s = new WorkerScript(runningScriptObj);
+ s.serverIp = server.ip;
+ s.ramUsage = ramUsage;
+
+ //Add the WorkerScript to the Active Scripts list
+ Object(_ActiveScriptsUI_js__WEBPACK_IMPORTED_MODULE_0__["addActiveScriptsItem"])(s);
+
+ //Add the WorkerScript
+ workerScripts.push(s);
+ return;
+}
+
+//Updates the online running time stat of all running scripts
+function updateOnlineScriptTimes(numCycles = 1) {
+ var time = (numCycles * _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"]._idleSpeed) / 1000; //seconds
+ for (var i = 0; i < workerScripts.length; ++i) {
+ workerScripts[i].scriptRef.onlineRunningTime += time;
+ }
+}
+
+
+
+
+/***/ }),
+/* 21 */
+/*!****************************!*\
+ !*** ./src/StockMarket.js ***!
+ \****************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StockMarket", function() { return StockMarket; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StockSymbols", function() { return StockSymbols; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SymbolToStockMap", function() { return SymbolToStockMap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initStockSymbols", function() { return initStockSymbols; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initStockMarket", function() { return initStockMarket; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initSymbolToStockMap", function() { return initSymbolToStockMap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stockMarketCycle", function() { return stockMarketCycle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buyStock", function() { return buyStock; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sellStock", function() { return sellStock; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shortStock", function() { return shortStock; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sellShort", function() { return sellShort; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateStockPrices", function() { return updateStockPrices; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "displayStockMarketContent", function() { return displayStockMarketContent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateStockTicker", function() { return updateStockTicker; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateStockPlayerPosition", function() { return updateStockPlayerPosition; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadStockMarket", function() { return loadStockMarket; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setStockMarketContentCreated", function() { return setStockMarketContentCreated; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "placeOrder", function() { return placeOrder; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cancelOrder", function() { return cancelOrder; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Order", function() { return Order; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrderTypes", function() { return OrderTypes; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PositionTypes", function() { return PositionTypes; });
+/* harmony import */ var _Constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Constants.js */ 3);
+/* harmony import */ var _engine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./engine.js */ 5);
+/* harmony import */ var _Location_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Location.js */ 4);
+/* harmony import */ var _NetscriptFunctions_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./NetscriptFunctions.js */ 29);
+/* harmony import */ var _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./NetscriptWorker.js */ 20);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/DialogBox.js */ 6);
+/* harmony import */ var _utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/HelperFunctions.js */ 1);
+/* harmony import */ var _utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/JSONReviver.js */ 8);
+/* harmony import */ var _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/numeral.min.js */ 13);
+/* harmony import */ var _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9__);
+/* harmony import */ var _utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/StringHelperFunctions.js */ 2);
+/* harmony import */ var _utils_YesNoBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/YesNoBox.js */ 12);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/* StockMarket.js */
+function Stock(name, symbol, mv, b, otlkMag, initPrice=10000) {
+ this.symbol = symbol;
+ this.name = name;
+ this.price = initPrice;
+
+ this.playerShares = 0;
+ this.playerAvgPx = 0;
+ this.playerShortShares = 0;
+ this.playerAvgShortPx = 0;
+ this.mv = mv;
+ this.b = b;
+ this.otlkMag = otlkMag;
+
+ this.posTxtEl = null;
+}
+
+Stock.prototype.toJSON = function() {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Generic_toJSON"])("Stock", this);
+}
+
+Stock.fromJSON = function(value) {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Generic_fromJSON"])(Stock, value.data);
+}
+
+_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Reviver"].constructors.Stock = Stock;
+
+var OrderTypes = {
+ LimitBuy: "Limit Buy Order",
+ LimitSell: "Limit Sell Order",
+ StopBuy: "Stop Buy Order",
+ StopSell: "Stop Sell Order"
+}
+
+var PositionTypes = {
+ Long: "L",
+ Short: "S"
+}
+
+function placeOrder(stock, shares, price, type, position, workerScript=null) {
+ var tixApi = (workerScript instanceof _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_4__["WorkerScript"]);
+ var order = new Order(stock, shares, price, type, position);
+ if (isNaN(shares) || isNaN(price)) {
+ if (tixApi) {
+ workerScript.scriptRef.log("ERROR: Invalid numeric value provided for either 'shares' or 'price' argument");
+ } else {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("ERROR: Invalid numeric value provided for either 'shares' or 'price' argument");
+ }
+ return false;
+ }
+ if (StockMarket["Orders"] == null) {
+ var orders = {};
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ if (!(stock instanceof Stock)) {continue;}
+ orders[stock.symbol] = [];
+ }
+ }
+ StockMarket["Orders"] = orders;
+ }
+ StockMarket["Orders"][stock.symbol].push(order);
+ //Process to see if it should be executed immediately
+ processOrders(order.stock, order.type, order.pos);
+ updateStockOrderList(order.stock);
+ return true;
+}
+
+//Returns true if successfully cancels an order, false otherwise
+function cancelOrder(params, workerScript=null) {
+ var tixApi = (workerScript instanceof _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_4__["WorkerScript"]);
+ if (StockMarket["Orders"] == null) {return false;}
+ if (params.order && params.order instanceof Order) {
+ var order = params.order;
+ //An 'Order' object is passed in
+ var stockOrders = StockMarket["Orders"][order.stock.symbol];
+ for (var i = 0; i < stockOrders.length; ++i) {
+ if (order == stockOrders[i]) {
+ stockOrders.splice(i, 1);
+ updateStockOrderList(order.stock);
+ return true;
+ }
+ }
+ return false;
+ } else if (params.stock && params.shares && params.price && params.type &&
+ params.pos && params.stock instanceof Stock) {
+ //Order properties are passed in. Need to look for the order
+ var stockOrders = StockMarket["Orders"][params.stock.symbol];
+ var orderTxt = params.stock.symbol + " - " + params.shares + " @ " +
+ _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(params.price).format('$0.000a');
+ for (var i = 0; i < stockOrders.length; ++i) {
+ var order = stockOrders[i];
+ if (params.shares === order.shares &&
+ params.price === order.price &&
+ params.type === order.type &&
+ params.pos === order.pos) {
+ stockOrders.splice(i, 1);
+ updateStockOrderList(order.stock);
+ if (tixApi) {
+ workerScript.scriptRef.log("Successfully cancelled order: " + orderTxt);
+ }
+ return true;
+ }
+ }
+ if (tixApi) {
+ workerScript.scriptRef.log("Failed to cancel order: " + orderTxt);
+ }
+ return false;
+ }
+ return false;
+}
+
+function executeOrder(order) {
+ var stock = order.stock;
+ var orderBook = StockMarket["Orders"];
+ var stockOrders = orderBook[stock.symbol];
+ var res = true;
+ console.log("Executing the following order:");
+ console.log(order);
+ switch (order.type) {
+ case OrderTypes.LimitBuy:
+ case OrderTypes.StopBuy:
+ if (order.pos === PositionTypes.Long) {
+ res = buyStock(order.stock, order.shares) && res;
+ } else if (order.pos === PositionTypes.Short) {
+ res = shortStock(order.stock, order.shares) && res;
+ }
+ break;
+ case OrderTypes.LimitSell:
+ case OrderTypes.StopSell:
+ if (order.pos === PositionTypes.Long) {
+ res = sellStock(order.stock, order.shares) && res;
+ } else if (order.pos === PositionTypes.Short) {
+ res = sellShort(order.stock, order.shares) && res;
+ }
+ break;
+ }
+ if (res) {
+ //Remove order from order book
+ for (var i = 0; i < stockOrders.length; ++i) {
+ if (order == stockOrders[i]) {
+ stockOrders.splice(i, 1);
+ updateStockOrderList(order.stock);
+ return;
+ }
+ }
+ console.log("ERROR: Could not find the following Order in Order Book: ");
+ console.log(order);
+ } else {
+ console.log("Order failed to execute");
+ }
+}
+
+function Order(stock, shares, price, type, position) {
+ this.stock = stock;
+ this.shares = shares;
+ this.price = price;
+ this.type = type;
+ this.pos = position;
+}
+
+Order.prototype.toJSON = function() {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Generic_toJSON"])("Order", this);
+}
+
+Order.fromJSON = function(value) {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Generic_fromJSON"])(Order, value.data);
+}
+
+_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Reviver"].constructors.Order = Order;
+
+let StockMarket = {} //Full name to stock object
+let StockSymbols = {} //Full name to symbol
+let SymbolToStockMap = {}; //Symbol to Stock object
+
+function loadStockMarket(saveString) {
+ if (saveString === "") {
+ StockMarket = {};
+ } else {
+ StockMarket = JSON.parse(saveString, _utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Reviver"]);
+ }
+}
+
+function initStockSymbols() {
+ //Stocks for companies at which you can work
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumECorp] = "ECP";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12MegaCorp] = "MGCP";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12BladeIndustries] = "BLD";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumClarkeIncorporated] = "CLRK";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenOmniTekIncorporated] = "OMTK";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12FourSigma] = "FSIG";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].ChongqingKuaiGongInternational] = "KGI";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumFulcrumTechnologies] = "FLCM";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].IshimaStormTechnologies] = "STM";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].NewTokyoDefComm] = "DCOMM";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenHeliosLabs] = "HLS";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].NewTokyoVitaLife] = "VITA";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12IcarusMicrosystems] = "ICRS";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12UniversalEnergy] = "UNV";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumAeroCorp] = "AERO";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenOmniaCybersystems] = "OMN";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].ChongqingSolarisSpaceSystems] = "SLRS";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].NewTokyoGlobalPharmaceuticals] = "GPH";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].IshimaNovaMedical] = "NVMD";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumWatchdogSecurity] = "WDS";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenLexoCorp] = "LXO";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumRhoConstruction] = "RHOC";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12AlphaEnterprises] = "APHE";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenSysCoreSecurities] = "SYSC";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenCompuTek] = "CTK";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumNetLinkTechnologies] = "NTLK";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].IshimaOmegaSoftware] = "OMGA";
+ StockSymbols[_Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12FoodNStuff] = "FNS";
+
+ //Stocks for other companies
+ StockSymbols["Sigma Cosmetics"] = "SGC";
+ StockSymbols["Joes Guns"] = "JGN";
+ StockSymbols["Catalyst Ventures"] = "CTYS";
+ StockSymbols["Microdyne Technologies"] = "MDYN";
+ StockSymbols["Titan Laboratories"] = "TITN";
+}
+
+function initStockMarket() {
+ for (var stk in StockMarket) {
+ if (StockMarket.hasOwnProperty(stk)) {
+ delete StockMarket[stk];
+ }
+ }
+
+ var ecorp = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumECorp;
+ var ecorpStk = new Stock(ecorp, StockSymbols[ecorp], 0.45, true, 19, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(20000, 25000));
+ StockMarket[ecorp] = ecorpStk;
+
+ var megacorp = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12MegaCorp;
+ var megacorpStk = new Stock(megacorp, StockSymbols[megacorp], 0.45, true, 19, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(25000, 33000));
+ StockMarket[megacorp] = megacorpStk;
+
+ var blade = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12BladeIndustries;
+ var bladeStk = new Stock(blade, StockSymbols[blade], 0.75, true, 13, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(15000, 22000));
+ StockMarket[blade] = bladeStk;
+
+ var clarke = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumClarkeIncorporated;
+ var clarkeStk = new Stock(clarke, StockSymbols[clarke], 0.7, true, 12, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(15000, 20000));
+ StockMarket[clarke] = clarkeStk;
+
+ var omnitek = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenOmniTekIncorporated;
+ var omnitekStk = new Stock(omnitek, StockSymbols[omnitek], 0.65, true, 12, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(35000, 40000));
+ StockMarket[omnitek] = omnitekStk;
+
+ var foursigma = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12FourSigma;
+ var foursigmaStk = new Stock(foursigma, StockSymbols[foursigma], 1.05, true, 17, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(60000, 70000));
+ StockMarket[foursigma] = foursigmaStk;
+
+ var kuaigong = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].ChongqingKuaiGongInternational;
+ var kuaigongStk = new Stock(kuaigong, StockSymbols[kuaigong], 0.8, true, 10, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(20000, 24000));
+ StockMarket[kuaigong] = kuaigongStk;
+
+ var fulcrum = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumFulcrumTechnologies;
+ var fulcrumStk = new Stock(fulcrum, StockSymbols[fulcrum], 1.25, true, 16, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(30000, 35000));
+ StockMarket[fulcrum] = fulcrumStk;
+
+ var storm = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].IshimaStormTechnologies;
+ var stormStk = new Stock(storm, StockSymbols[storm], 0.85, true, 7, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(21000, 24000));
+ StockMarket[storm] = stormStk;
+
+ var defcomm = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].NewTokyoDefComm;
+ var defcommStk = new Stock(defcomm, StockSymbols[defcomm], 0.65, true, 10, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(10000, 15000));
+ StockMarket[defcomm] = defcommStk;
+
+ var helios = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenHeliosLabs;
+ var heliosStk = new Stock(helios, StockSymbols[helios], 0.6, true, 9, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(12000, 16000));
+ StockMarket[helios] = heliosStk;
+
+ var vitalife = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].NewTokyoVitaLife;
+ var vitalifeStk = new Stock(vitalife, StockSymbols[vitalife], 0.75, true, 7, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(10000, 12000));
+ StockMarket[vitalife] = vitalifeStk;
+
+ var icarus = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12IcarusMicrosystems;
+ var icarusStk = new Stock(icarus, StockSymbols[icarus], 0.65, true, 7.5, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(16000, 20000));
+ StockMarket[icarus] = icarusStk;
+
+ var universalenergy = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12UniversalEnergy;
+ var universalenergyStk = new Stock(universalenergy, StockSymbols[universalenergy], 0.55, true, 10, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(20000, 25000));
+ StockMarket[universalenergy] = universalenergyStk;
+
+ var aerocorp = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumAeroCorp;
+ var aerocorpStk = new Stock(aerocorp, StockSymbols[aerocorp], 0.6, true, 6, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(10000, 15000));
+ StockMarket[aerocorp] = aerocorpStk;
+
+ var omnia = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenOmniaCybersystems;
+ var omniaStk = new Stock(omnia, StockSymbols[omnia], 0.7, true, 4.5, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(9000, 12000));
+ StockMarket[omnia] = omniaStk;
+
+ var solaris = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].ChongqingSolarisSpaceSystems;
+ var solarisStk = new Stock(solaris, StockSymbols[solaris], 0.75, true, 8.5, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(18000, 24000));
+ StockMarket[solaris] = solarisStk;
+
+ var globalpharm = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].NewTokyoGlobalPharmaceuticals;
+ var globalpharmStk = new Stock(globalpharm, StockSymbols[globalpharm], 0.6, true, 10.5, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(18000, 24000));
+ StockMarket[globalpharm] = globalpharmStk;
+
+ var nova = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].IshimaNovaMedical;
+ var novaStk = new Stock(nova, StockSymbols[nova], 0.75, true, 5, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(18000, 24000));
+ StockMarket[nova] = novaStk;
+
+ var watchdog = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumWatchdogSecurity;
+ var watchdogStk = new Stock(watchdog, StockSymbols[watchdog], 2.5, true, 1.5, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(5000, 7500));
+ StockMarket[watchdog] = watchdogStk;
+
+ var lexocorp = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenLexoCorp;
+ var lexocorpStk = new Stock(lexocorp, StockSymbols[lexocorp], 1.25, true, 6, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(5000, 7500));
+ StockMarket[lexocorp] = lexocorpStk;
+
+ var rho = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumRhoConstruction;
+ var rhoStk = new Stock(rho, StockSymbols[rho], 0.6, true, 1, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(3000, 6000));
+ StockMarket[rho] = rhoStk;
+
+ var alpha = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12AlphaEnterprises;
+ var alphaStk = new Stock(alpha, StockSymbols[alpha], 1.9, true, 10, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(5000, 7500));
+ StockMarket[alpha] = alphaStk;
+
+ var syscore = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenSysCoreSecurities;
+ var syscoreStk = new Stock(syscore, StockSymbols[syscore], 1.6, true, 3, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(4000, 7000))
+ StockMarket[syscore] = syscoreStk;
+
+ var computek = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].VolhavenCompuTek;
+ var computekStk = new Stock(computek, StockSymbols[computek], 0.9, true, 4, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(2000, 5000));
+ StockMarket[computek] = computekStk;
+
+ var netlink = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].AevumNetLinkTechnologies;
+ var netlinkStk = new Stock(netlink, StockSymbols[netlink], 4.2, true, 1, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(2000, 4000));
+ StockMarket[netlink] = netlinkStk;
+
+ var omega = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].IshimaOmegaSoftware;
+ var omegaStk = new Stock(omega, StockSymbols[omega], 1, true, 0.5, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(3000, 6000));
+ StockMarket[omega] = omegaStk;
+
+ var fns = _Location_js__WEBPACK_IMPORTED_MODULE_2__["Locations"].Sector12FoodNStuff;
+ var fnsStk = new Stock(fns, StockSymbols[fns], 0.75, false, 1, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(1000, 4000));
+ StockMarket[fns] = fnsStk;
+
+ var sigmacosm = "Sigma Cosmetics";
+ var sigmacosmStk = new Stock(sigmacosm, StockSymbols[sigmacosm], 2.8, true, 0, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(2000, 3000));
+ StockMarket[sigmacosm] = sigmacosmStk;
+
+ var joesguns = "Joes Guns";
+ var joesgunsStk = new Stock(joesguns, StockSymbols[joesguns], 3.8, true, 1, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(500, 1000));
+ StockMarket[joesguns] = joesgunsStk;
+
+ var catalyst = "Catalyst Ventures";
+ var catalystStk = new Stock(catalyst, StockSymbols[catalyst], 1.45, true, 13.5, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(500, 1000));
+ StockMarket[catalyst] = catalystStk;
+
+ var microdyne = "Microdyne Technologies";
+ var microdyneStk = new Stock(microdyne, StockSymbols[microdyne], 0.75, true, 8, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(20000, 25000));
+ StockMarket[microdyne] = microdyneStk;
+
+ var titanlabs = "Titan Laboratories";
+ var titanlabsStk = new Stock(titanlabs, StockSymbols[titanlabs], 0.6, true, 11, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["getRandomInt"])(15000, 20000));
+ StockMarket[titanlabs] = titanlabsStk;
+
+ var orders = {};
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ if (!(stock instanceof Stock)) {continue;}
+ orders[stock.symbol] = [];
+ }
+ }
+ StockMarket["Orders"] = orders;
+}
+
+function initSymbolToStockMap() {
+ for (var name in StockSymbols) {
+ if (StockSymbols.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ if (stock == null) {
+ console.log("ERROR finding stock");
+ continue;
+ }
+ var symbol = StockSymbols[name];
+ SymbolToStockMap[symbol] = stock;
+ }
+ }
+}
+
+function stockMarketCycle() {
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ var thresh = 0.6;
+ if (stock.b) {thresh = 0.4;}
+ if (Math.random() < thresh) {
+ stock.b = !stock.b;
+ }
+ }
+ }
+}
+
+//Returns true if successful, false otherwise
+function buyStock(stock, shares) {
+ if (stock == null || shares < 0 || isNaN(shares)) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("Failed to buy stock. This may be a bug, contact developer");
+ return false;
+ }
+ shares = Math.round(shares);
+ if (shares == 0) {return false;}
+
+ var totalPrice = stock.price * shares;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].money.lt(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission)) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("You do not have enough money to purchase this. You need $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission, 2).toString() + ".");
+ return false;
+ }
+
+ var origTotal = stock.playerShares * stock.playerAvgPx;
+ _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].loseMoney(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission);
+ var newTotal = origTotal + totalPrice;
+ stock.playerShares += shares;
+ stock.playerAvgPx = newTotal / stock.playerShares;
+ updateStockPlayerPosition(stock);
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("Bought " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(shares, 0) + " shares of " + stock.symbol + " at $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(stock.price, 2) + " per share. You also paid $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission, 2) + " in commission fees.");
+ return true;
+}
+
+//Returns true if successful and false otherwise
+function sellStock(stock, shares) {
+ if (shares == 0) {return false;}
+ if (stock == null || shares < 0 || isNaN(shares)) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("Failed to sell stock. This may be a bug, contact developer");
+ return false;
+ }
+ shares = Math.round(shares);
+ if (shares > stock.playerShares) {shares = stock.playerShares;}
+ if (shares === 0) {return false;}
+ var gains = stock.price * shares - _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission;
+ _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].gainMoney(gains);
+ stock.playerShares -= shares;
+ if (stock.playerShares == 0) {
+ stock.playerAvgPx = 0;
+ }
+ updateStockPlayerPosition(stock);
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("Sold " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(shares, 0) + " shares of " + stock.symbol + " at $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(stock.price, 2) + " per share. After commissions, you gained " +
+ "a total of $" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(gains, 2));
+ return true;
+}
+
+//Returns true if successful and false otherwise
+function shortStock(stock, shares, workerScript=null) {
+ var tixApi = (workerScript instanceof _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_4__["WorkerScript"]);
+ if (stock == null || isNaN(shares) || shares < 0) {
+ if (tixApi) {
+ workerScript.scriptRef.log("ERROR: shortStock() failed because of invalid arguments.");
+ } else {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("Failed to initiate a short position in a stock. This is probably " +
+ "due to an invalid quantity. Otherwise, this may be a bug, so contact developer");
+ }
+ return false;
+ }
+ shares = Math.round(shares);
+ if (shares === 0) {return false;}
+
+ var totalPrice = stock.price * shares;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].money.lt(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission)) {
+ if (tixApi) {
+ workerScript.scriptRef.log("ERROR: shortStock() failed because you do not have " +
+ "money to purchase this short position. You need " +
+ _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission).format('($0.000a)'));
+ } else {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("You do not have enough money to purchase this short position. You need $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission, 2) + ".");
+ }
+
+ return false;
+ }
+
+ var origTotal = stock.playerShortShares * stock.playerAvgShortPx;
+ _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].loseMoney(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission);
+ var newTotal = origTotal + totalPrice;
+ stock.playerShortShares += shares;
+ stock.playerAvgShortPx = newTotal / stock.playerShortShares;
+ updateStockPlayerPosition(stock);
+ if (tixApi) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.shortStock == null) {
+ workerScript.scriptRef.log("Bought a short position of " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(shares, 0) + " shares of " + stock.symbol + " at " +
+ _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(stock.price).format('($0.000a)') + " per share. Paid " +
+ _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission).format('($0.000a)') + " in commission fees.");
+ }
+ } else {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("Bought a short position of " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(shares, 0) + " shares of " + stock.symbol + " at $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(stock.price, 2) + " per share. You also paid $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission, 2) + " in commission fees.");
+ }
+ return true;
+}
+
+//Returns true if successful and false otherwise
+function sellShort(stock, shares, workerScript=null) {
+ var tixApi = (workerScript instanceof _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_4__["WorkerScript"]);
+ if (stock == null || isNaN(shares) || shares < 0) {
+ if (tixApi) {
+ workerScript.scriptRef.log("ERROR: sellShort() failed because of invalid arguments.");
+ } else {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("Failed to sell a short position in a stock. This is probably " +
+ "due to an invalid quantity. Otherwise, this may be a bug, so contact developer");
+ }
+ return false;
+ }
+ shares = Math.round(shares);
+ if (shares > stock.playerShortShares) {shares = stock.playerShortShares;}
+ if (shares === 0) {return false;}
+
+ var origCost = shares * stock.playerAvgShortPx;
+ var profit = ((stock.playerAvgShortPx - stock.price) * shares) - _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission;
+ if (isNaN(profit)) {profit = 0;}
+ _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].gainMoney(origCost + profit);
+ if (tixApi) {
+ workerScript.scriptRef.onlineMoneyMade += profit;
+ _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].scriptProdSinceLastAug += profit;
+ }
+
+ stock.playerShortShares -= shares;
+ if (stock.playerShortShares === 0) {
+ stock.playerAvgShortPx = 0;
+ }
+ updateStockPlayerPosition(stock);
+ if (tixApi) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.sellShort == null) {
+ workerScript.scriptRef.log("Sold your short position of " + shares + " shares of " + stock.symbol + " at " +
+ _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(stock.price).format('($0.000a)') + " per share. After commissions, you gained " +
+ "a total of " + _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(origCost + profit).format('($0.000a)'));
+ }
+ } else {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])("Sold your short position of " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(shares, 0) + " shares of " + stock.symbol + " at $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(stock.price, 2) + " per share. After commissions, you gained " +
+ "a total of $" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(origCost + profit, 2));
+ }
+
+ return true;
+}
+
+function updateStockPrices() {
+ var v = Math.random();
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ if (!(stock instanceof Stock)) {continue;}
+ var av = (v * stock.mv) / 100;
+ if (isNaN(av)) {av = .02;}
+
+ var chc = 50;
+ if (stock.b) {
+ chc = (chc + stock.otlkMag)/100;
+ if (isNaN(chc)) {chc = 0.5;}
+ } else {
+ chc = (chc - stock.otlkMag)/100;
+ if (isNaN(chc)) {chc = 0.5;}
+ }
+
+ var c = Math.random();
+ if (c < chc) {
+ stock.price *= (1 + av);
+ processOrders(stock, OrderTypes.LimitBuy, PositionTypes.Short);
+ processOrders(stock, OrderTypes.LimitSell, PositionTypes.Long);
+ processOrders(stock, OrderTypes.StopBuy, PositionTypes.Long);
+ processOrders(stock, OrderTypes.StopSell, PositionTypes.Short);
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].Page.StockMarket) {
+ updateStockTicker(stock, true);
+ }
+ } else {
+ stock.price /= (1 + av);
+ processOrders(stock, OrderTypes.LimitBuy, PositionTypes.Long);
+ processOrders(stock, OrderTypes.LimitSell, PositionTypes.Short);
+ processOrders(stock, OrderTypes.StopBuy, PositionTypes.Short);
+ processOrders(stock, OrderTypes.StopSell, PositionTypes.Long);
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].Page.StockMarket) {
+ updateStockTicker(stock, false);
+ }
+ }
+
+ var otlkMagChange = stock.otlkMag * av;
+ if (stock.otlkMag <= 0.1) {
+ otlkMagChange = 1;
+ }
+ if (c < 0.5) {
+ stock.otlkMag += otlkMagChange;
+ } else {
+ stock.otlkMag -= otlkMagChange;
+ }
+ if (stock.otlkMag < 0) {
+ stock.otlkMag *= -1;
+ stock.b = !stock.b;
+ }
+
+ }
+ }
+}
+
+//Checks and triggers any orders for the specified stock
+function processOrders(stock, orderType, posType) {
+ var orderBook = StockMarket["Orders"];
+ if (orderBook == null) {
+ var orders = {};
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ if (!(stock instanceof Stock)) {continue;}
+ orders[stock.symbol] = [];
+ }
+ }
+ StockMarket["Orders"] = orders;
+ return; //Newly created, so no orders to process
+ }
+ var stockOrders = orderBook[stock.symbol];
+ if (stockOrders == null || !(stockOrders.constructor === Array)) {
+ console.log("ERROR: Invalid Order book for " + stock.symbol + " in processOrders()");
+ stockOrders = [];
+ return;
+ }
+ for (var i = 0; i < stockOrders.length; ++i) {
+ var order = stockOrders[i];
+ if (order.type === orderType && order.pos === posType) {
+ switch(order.type) {
+ case OrderTypes.LimitBuy:
+ if (order.pos === PositionTypes.Long && stock.price <= order.price) {
+ executeOrder/*66*/(order);
+ } else if (order.pos === PositionTypes.Short && stock.price >= order.price) {
+ executeOrder/*66*/(order);
+ }
+ break;
+ case OrderTypes.LimitSell:
+ if (order.pos === PositionTypes.Long && stock.price >= order.price) {
+ executeOrder/*66*/(order);
+ } else if (order.pos === PositionTypes.Short && stock.price <= order.price) {
+ executeOrder/*66*/(order);
+ }
+ break;
+ case OrderTypes.StopBuy:
+ if (order.pos === PositionTypes.Long && stock.price >= order.price) {
+ executeOrder/*66*/(order);
+ } else if (order.pos === PositionTypes.Short && stock.price <= order.price) {
+ executeOrder/*66*/(order);
+ }
+ break;
+ case OrderTypes.StopSell:
+ if (order.pos === PositionTypes.Long && stock.price <= order.price) {
+ executeOrder/*66*/(order);
+ } else if (order.pos === PositionTypes.Short && stock.price >= order.price) {
+ executeOrder/*66*/(order);
+ }
+ break;
+ default:
+ console.log("Invalid order type: " + order.type);
+ return;
+ }
+ }
+ }
+}
+
+function setStockMarketContentCreated(b) {
+ stockMarketContentCreated = b;
+}
+
+var stockMarketContentCreated = false;
+var stockMarketPortfolioMode = false;
+var COMM = _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission;
+function displayStockMarketContent() {
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasWseAccount == null) {_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasWseAccount = false;}
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasTixApiAccess == null) {_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasTixApiAccess = false;}
+
+ //Purchase WSE Account button
+ var wseAccountButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["clearEventListeners"])("stock-market-buy-account");
+ wseAccountButton.innerText = "Buy WSE Account - $" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].WSEAccountCost, 2).toString();
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasWseAccount && _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].money.gte(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].WSEAccountCost)) {
+ wseAccountButton.setAttribute("class", "a-link-button");
+ } else {
+ wseAccountButton.setAttribute("class", "a-link-button-inactive");
+ }
+ wseAccountButton.addEventListener("click", function() {
+ _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasWseAccount = true;
+ initStockMarket();
+ initSymbolToStockMap();
+ _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].loseMoney(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].WSEAccountCost);
+ displayStockMarketContent();
+ return false;
+ });
+
+ //Purchase TIX API Access account
+ var tixApiAccessButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["clearEventListeners"])("stock-market-buy-tix-api");
+ tixApiAccessButton.innerText = "Buy Trade Information eXchange (TIX) API Access - $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].TIXAPICost, 2).toString();
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasTixApiAccess && _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].money.gte(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].TIXAPICost)) {
+ tixApiAccessButton.setAttribute("class", "a-link-button");
+ } else {
+ tixApiAccessButton.setAttribute("class", "a-link-button-inactive");
+ }
+ tixApiAccessButton.addEventListener("click", function() {
+ _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasTixApiAccess = true;
+ _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].loseMoney(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].TIXAPICost);
+ displayStockMarketContent();
+ return false;
+ });
+
+ var stockList = document.getElementById("stock-market-list");
+ if (stockList == null) {return;}
+
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasWseAccount) {
+ stockMarketContentCreated = false;
+ while (stockList.firstChild) {
+ stockList.removeChild(stockList.firstChild);
+ }
+ return;
+ }
+
+ //Create stock market content if you have an account
+ if (!stockMarketContentCreated && _Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasWseAccount) {
+ console.log("Creating Stock Market UI");
+ document.getElementById("stock-market-commission").innerHTML =
+ "Commission Fees: Every transaction you make has a $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].StockMarketCommission, 2) + " commission fee.
" +
+ "WARNING: When you reset after installing Augmentations, the Stock Market is reset. " +
+ "This means all your positions are lost, so make sure to sell your stocks before installing " +
+ "Augmentations!";
+
+ var investopediaButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["clearEventListeners"])("stock-market-investopedia");
+ investopediaButton.addEventListener("click", function() {
+ var txt = "When making a transaction on the stock market, there are two " +
+ "types of positions: Long and Short. A Long position is the typical " +
+ "scenario where you buy a stock and earn a profit if the price of that " +
+ "stock increases. Meanwhile, a Short position is the exact opposite. " +
+ "In a Short position you purchase shares of a stock and earn a profit " +
+ "if the price of that stock decreases. This is also called 'shorting' a stock.
" +
+ "NOTE: Shorting stocks is not available immediately, and must be unlocked later on in the game.
" +
+ "There are three different types of orders you can make to buy or sell " +
+ "stocks on the exchange: Market Order, Limit Order, and Stop Order. " +
+ "Note that Limit Orders and Stop Orders are not available immediately, and must be unlocked " +
+ "later on in the game.
" +
+ "When you place a Market Order to buy or sell a stock, the order executes " +
+ "immediately at whatever the current price of the stock is. For example " +
+ "if you choose to short a stock with 5000 shares using a Market Order, " +
+ "you immediately purchase those 5000 shares in a Short position at whatever " +
+ "the current market price is for that stock.
" +
+ "A Limit Order is an order that only executes under certain conditions. " +
+ "A Limit Order is used to buy or sell a stock at a specified price or better. " +
+ "For example, lets say you purchased a Long position of 100 shares of some stock " +
+ "at a price of $10 per share. You can place a Limit Order to sell those 100 shares " +
+ "at $50 or better. The Limit Order will execute when the price of the stock reaches a " +
+ "value of $50 or higher.
" +
+ "A Stop Order is the opposite of a Limit Order. It is used to buy or sell a stock " +
+ "at a specified price (before the price gets 'worse'). For example, lets say you purchased " +
+ "a Short position of 100 shares of some stock at a price of $100 per share. " +
+ "The current price of the stock is $80 (a profit of $20 per share). You can place a " +
+ "Stop Order to sell the Short position if the stock's price reaches $90 or higher. " +
+ "This can be used to lock in your profits and limit any losses.
" +
+ "Here is a summary of how each order works and when they execute:
" +
+ "In a LONG Position:
" +
+ "A Limit Order to buy will execute if the stock's price <= order's price
" +
+ "A Limit Order to sell will execute if the stock's price >= order's price
" +
+ "A Stop Order to buy will execute if the stock's price >= order's price
" +
+ "A Stop Order to sell will execute if the stock's price <= order's price
" +
+ "In a SHORT Position:
" +
+ "A Limit Order to buy will execute if the stock's price >= order's price
" +
+ "A Limit Order to sell will execute if the stock's price <= order's price
" +
+ "A Stop Order to buy will execute if the stock's price <= order's price
" +
+ "A Stop Order to sell will execute if the stock's price >= order's price.";
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_6__["dialogBoxCreate"])(txt);
+ return false;
+ });
+
+ //Switch to Portfolio Mode Button
+ var modeBtn = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["clearEventListeners"])("stock-market-mode");
+ if (modeBtn) {
+ modeBtn.innerHTML = "Switch to 'Portfolio' Mode" +
+ "Displays only the stocks for which you have shares or orders";
+ modeBtn.addEventListener("click", switchToPortfolioMode);
+ }
+
+ //Expand/Collapse tickers buttons
+ var expandBtn = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["clearEventListeners"])("stock-market-expand-tickers"),
+ collapseBtn = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["clearEventListeners"])("stock-market-collapse-tickers"),
+ stockList = document.getElementById("stock-market-list");
+ if (expandBtn) {
+ expandBtn.addEventListener("click", ()=>{
+ var tickerHdrs = stockList.getElementsByClassName("accordion-header");
+ for (var i = 0; i < tickerHdrs.length; ++i) {
+ if (!tickerHdrs[i].classList.contains("active")) {
+ tickerHdrs[i].click();
+ }
+ }
+ });
+ }
+ if (collapseBtn) {
+ collapseBtn.addEventListener("click",()=>{
+ var tickerHdrs = stockList.getElementsByClassName("accordion-header");
+ for (var i = 0; i < tickerHdrs.length; ++i) {
+ if (tickerHdrs[i].classList.contains("active")) {
+ tickerHdrs[i].click();
+ }
+ }
+ });
+ }
+
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ if (!(stock instanceof Stock)) {continue;} //orders property is an array
+ createStockTicker(stock);
+ }
+ }
+ setStockTickerClickHandlers(); //Clicking headers opens/closes panels
+ stockMarketContentCreated = true;
+ }
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].hasWseAccount) {
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ updateStockTicker(stock, null);
+ updateStockOrderList(stock);
+ }
+ }
+ }
+}
+
+//Displays only stocks you have position/order in
+function switchToPortfolioMode() {
+ stockMarketPortfolioMode = true;
+ var stockList = document.getElementById("stock-market-list");
+ if (stockList == null) {return;}
+ var modeBtn = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["clearEventListeners"])("stock-market-mode");
+ if (modeBtn) {
+ modeBtn.innerHTML = "Switch to 'All stocks' Mode" +
+ "Displays all stocks on the WSE";
+ modeBtn.addEventListener("click", switchToDisplayAllMode);
+ }
+ while(stockList.firstChild) {stockList.removeChild(stockList.firstChild);}
+
+ //Get Order book (create it if it hasn't been created)
+ var orderBook = StockMarket["Orders"];
+ if (orderBook == null) {
+ var orders = {};
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ if (!(stock instanceof Stock)) {continue;}
+ orders[stock.symbol] = [];
+ }
+ }
+ StockMarket["Orders"] = orders;
+ }
+
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ if (!(stock instanceof Stock)) {continue;} //orders property is an array
+ var stockOrders = orderBook[stock.symbol];
+ if (stock.playerShares === 0 && stock.playerShortShares === 0 &&
+ stockOrders.length === 0) {continue;}
+ createStockTicker(stock);
+ }
+ }
+ setStockTickerClickHandlers();
+}
+
+//Displays all stocks
+function switchToDisplayAllMode() {
+ stockMarketPortfolioMode = false;
+ var stockList = document.getElementById("stock-market-list");
+ if (stockList == null) {return;}
+ var modeBtn = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["clearEventListeners"])("stock-market-mode");
+ if (modeBtn) {
+ modeBtn.innerHTML = "Switch to 'Portfolio' Mode" +
+ "Displays only the stocks for which you have shares or orders";
+ modeBtn.addEventListener("click", switchToPortfolioMode);
+ }
+ while(stockList.firstChild) {stockList.removeChild(stockList.firstChild);}
+ for (var name in StockMarket) {
+ if (StockMarket.hasOwnProperty(name)) {
+ var stock = StockMarket[name];
+ if (!(stock instanceof Stock)) {continue;} //orders property is an array
+ createStockTicker(stock);
+ }
+ }
+ setStockTickerClickHandlers();
+}
+
+function createStockTicker(stock) {
+ if (!(stock instanceof Stock)) {
+ console.log("Invalid stock in createStockSticker()");
+ return;
+ }
+ var tickerId = "stock-market-ticker-" + stock.symbol;
+ var li = document.createElement("li"), hdr = document.createElement("button");
+ hdr.classList.add("accordion-header");
+ hdr.setAttribute("id", tickerId + "-hdr");
+ hdr.innerHTML = stock.name + " - " + stock.symbol + " - $" + stock.price;
+
+ //Div for entire panel
+ var stockDiv = document.createElement("div");
+ stockDiv.classList.add("accordion-panel");
+ stockDiv.setAttribute("id", tickerId + "-panel");
+
+ /* Create panel DOM */
+ var qtyInput = document.createElement("input"),
+ longShortSelect = document.createElement("select"),
+ orderTypeSelect = document.createElement("select"),
+ buyButton = document.createElement("span"),
+ sellButton = document.createElement("span"),
+ buyMaxButton = document.createElement("span"),
+ sellAllButton = document.createElement("span"),
+ positionTxt = document.createElement("p"),
+ orderList = document.createElement("ul");
+
+ qtyInput.classList.add("stock-market-input");
+ qtyInput.placeholder = "Quantity (Shares)";
+ qtyInput.setAttribute("id", tickerId + "-qty-input");
+ qtyInput.setAttribute("onkeydown", "return ( event.ctrlKey || event.altKey " +
+ " || (47Long Position: " +
+ "Shares in the long position will increase " +
+ "in value if the price of the corresponding stock increases
" +
+ "
Shares: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(stock.playerShares, 0) +
+ "
Average Price: " + _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(stock.playerAvgPx).format('$0.000a') +
+ " (Total Cost: " + _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(totalCost).format('$0.000a') + ")" +
+ "
Profit: " + _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(gains).format('$0.000a') +
+ " (" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(percentageGains*100, 2) + "%)
";
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_5__["Player"].bitNodeN === 8 || (_NetscriptFunctions_js__WEBPACK_IMPORTED_MODULE_3__["hasWallStreetSF"] && _NetscriptFunctions_js__WEBPACK_IMPORTED_MODULE_3__["wallStreetSFLvl"] >= 2)) {
+ stock.posTxtEl.innerHTML +=
+ "Short Position: " +
+ "Shares in short position will increase " +
+ "in value if the price of the corresponding stock decreases
" +
+ "
Shares: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(stock.playerShortShares, 0) +
+ "
Average Price: " + _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(stock.playerAvgShortPx).format('$0.000a') +
+ " (Total Cost: " + _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(shortTotalCost).format('$0.000a') + ")" +
+ "
Profit: " + _utils_numeral_min_js__WEBPACK_IMPORTED_MODULE_9___default()(shortGains).format('$0.000a') +
+ " (" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(shortPercentageGains*100, 2) + "%)" +
+ "Orders:
";
+ }
+
+}
+
+function updateStockOrderList(stock) {
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].currentPage !== _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].Page.StockMarket) {return;}
+ var tickerId = "stock-market-ticker-" + stock.symbol;
+ var orderList = document.getElementById(tickerId + "-order-list");
+ if (orderList == null) {
+ if (!stockMarketPortfolioMode) {console.log("ERROR: Could not find order list for " + stock.symbol);}
+ return;
+ }
+
+ var orderBook = StockMarket["Orders"];
+ if (orderBook == null) {
+ console.log("ERROR: Could not find order book in stock market");
+ return;
+ }
+ var stockOrders = orderBook[stock.symbol];
+ if (stockOrders == null) {
+ console.log("ERROR: Could not find orders for: " + stock.symbol);
+ return;
+ }
+
+ if (stockMarketPortfolioMode) {
+ if (stock.playerShares === 0 && stock.playerShortShares === 0 &&
+ StockMarket["Orders"] && StockMarket["Orders"][stock.symbol] &&
+ StockMarket["Orders"][stock.symbol].length === 0) {
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["removeElementById"])(tickerId + "-hdr");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["removeElementById"])(tickerId + "-panel");
+ return;
+ } else {
+ //If the ticker hasn't been created, create it (handles updating)
+ //If it has been created, continue normally
+ if (document.getElementById(tickerId + "-hdr") == null) {
+ createStockTicker(stock);
+ setStockTickerClickHandlers();
+ return;
+ }
+ }
+ }
+
+ //Remove everything from list
+ while (orderList.firstChild) {
+ orderList.removeChild(orderList.firstChild);
+ }
+
+ for (var i = 0; i < stockOrders.length; ++i) {
+ (function() {
+ var order = stockOrders[i];
+ var li = document.createElement("li");
+ li.style.padding = "4px";
+ var posText = (order.pos === PositionTypes.Long ? "Long Position" : "Short Position");
+ li.style.color = "white";
+ li.innerText = order.type + " - " + posText + " - " +
+ order.shares + " @ $" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_10__["formatNumber"])(order.price, 2);
+
+ var cancelButton = document.createElement("span");
+ cancelButton.classList.add("stock-market-order-cancel-btn");
+ cancelButton.classList.add("a-link-button");
+ cancelButton.innerHTML = "Cancel Order";
+ cancelButton.addEventListener("click", function() {
+ cancelOrder({order: order}, null);
+ return false;
+ });
+ li.appendChild(cancelButton);
+ orderList.appendChild(li);
+ }());
+
+ }
+}
+
+
+
+
+/***/ }),
+/* 22 */
+/*!*************************!*\
+ !*** ./src/Terminal.js ***!
+ \*************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "postNetburnerText", function() { return postNetburnerText; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "post", function() { return post; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Terminal", function() { return Terminal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KEY", function() { return KEY; });
+/* harmony import */ var _Alias_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Alias.js */ 30);
+/* harmony import */ var _Constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Constants.js */ 3);
+/* harmony import */ var _CreateProgram_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CreateProgram.js */ 14);
+/* harmony import */ var _DarkWeb_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DarkWeb.js */ 33);
+/* harmony import */ var _engine_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./engine.js */ 5);
+/* harmony import */ var _Fconf_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Fconf.js */ 34);
+/* harmony import */ var _HelpText_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./HelpText.js */ 69);
+/* harmony import */ var _InteractiveTutorial_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./InteractiveTutorial.js */ 25);
+/* harmony import */ var _Literature_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Literature.js */ 53);
+/* harmony import */ var _Message_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Message.js */ 27);
+/* harmony import */ var _NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./NetscriptEvaluator.js */ 7);
+/* harmony import */ var _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./NetscriptWorker.js */ 20);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _RedPill_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./RedPill.js */ 44);
+/* harmony import */ var _Script_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Script.js */ 28);
+/* harmony import */ var _Server_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Server.js */ 10);
+/* harmony import */ var _Settings_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Settings.js */ 24);
+/* harmony import */ var _SpecialServerIps_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./SpecialServerIps.js */ 17);
+/* harmony import */ var _TextFile_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./TextFile.js */ 41);
+/* harmony import */ var _utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../utils/StringHelperFunctions.js */ 2);
+/* harmony import */ var _utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../utils/HelperFunctions.js */ 1);
+/* harmony import */ var _utils_LogBox_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../utils/LogBox.js */ 51);
+/* harmony import */ var _utils_YesNoBox_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../utils/YesNoBox.js */ 12);
+/* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jszip */ 118);
+/* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(jszip__WEBPACK_IMPORTED_MODULE_23__);
+/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! file-saver */ 117);
+/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_24__);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/* Write text to terminal */
+//If replace is true then spaces are replaced with " "
+function post(input) {
+ $("#terminal-input").before(' ');
+ updateTerminalScroll();
+}
+
+//Same thing as post but the td cells have ids so they can be animated for the hack progress bar
+function hackProgressBarPost(input) {
+ $("#terminal-input").before('' + input + ' ');
+ updateTerminalScroll();
+}
+
+function hackProgressPost(input) {
+ $("#terminal-input").before('' + input + ' ');
+ updateTerminalScroll();
+}
+
+//Scroll to the bottom of the terminal's 'text area'
+function updateTerminalScroll() {
+ var element = document.getElementById("terminal-container");
+ element.scrollTop = element.scrollHeight;
+}
+
+function postNetburnerText() {
+ post("Bitburner v" + _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].Version);
+}
+
+
+//Key Codes
+var KEY = {
+ TAB: 9,
+ ENTER: 13,
+ CTRL: 17,
+ UPARROW: 38,
+ DOWNARROW: 40,
+ A: 65,
+ B: 66,
+ C: 67,
+ D: 68,
+ E: 69,
+ F: 70,
+ H: 72,
+ K: 75,
+ L: 76,
+ M: 77,
+ N: 78,
+ P: 80,
+ U: 85,
+ W: 87,
+}
+
+//Defines key commands in terminal
+$(document).keydown(function(event) {
+ //Terminal
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"].Page.Terminal) {
+ var terminalInput = document.getElementById("terminal-input-text-box");
+ if (terminalInput != null && !event.ctrlKey && !event.shiftKey) {terminalInput.focus();}
+
+ if (event.keyCode === KEY.ENTER) {
+ event.preventDefault(); //Prevent newline from being entered in Script Editor
+ var command = $('input[class=terminal-input]').val();
+ if (command.length > 0) {
+ post("[" + _Player_js__WEBPACK_IMPORTED_MODULE_12__["Player"].getCurrentServer().hostname + " ~]> " + command);
+
+ Terminal.resetTerminalInput(); //Clear input first
+ Terminal.executeCommand(command);
+ }
+ }
+
+ if (event.keyCode === KEY.C && event.ctrlKey) {
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"]._actionInProgress) {
+ //Cancel action
+ post("Cancelling...");
+ _engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"]._actionInProgress = false;
+ Terminal.finishAction(true);
+ } else if (_Fconf_js__WEBPACK_IMPORTED_MODULE_5__["FconfSettings"].ENABLE_BASH_HOTKEYS) {
+ //Dont prevent default so it still copies
+ Terminal.resetTerminalInput(); //Clear Terminal
+ }
+ }
+
+ if (event.keyCode === KEY.L && event.ctrlKey) {
+ event.preventDefault();
+ Terminal.executeCommand("clear"); //Clear screen
+ }
+
+ //Ctrl p same as up arrow
+ //Ctrl n same as down arrow
+
+ if (event.keyCode === KEY.UPARROW ||
+ (_Fconf_js__WEBPACK_IMPORTED_MODULE_5__["FconfSettings"].ENABLE_BASH_HOTKEYS && event.keyCode === KEY.P && event.ctrlKey)) {
+ if (_Fconf_js__WEBPACK_IMPORTED_MODULE_5__["FconfSettings"].ENABLE_BASH_HOTKEYS) {event.preventDefault();}
+ //Cycle through past commands
+ if (terminalInput == null) {return;}
+ var i = Terminal.commandHistoryIndex;
+ var len = Terminal.commandHistory.length;
+
+ if (len == 0) {return;}
+ if (i < 0 || i > len) {
+ Terminal.commandHistoryIndex = len;
+ }
+
+ if (i != 0) {
+ --Terminal.commandHistoryIndex;
+ }
+ var prevCommand = Terminal.commandHistory[Terminal.commandHistoryIndex];
+ terminalInput.value = prevCommand;
+ setTimeout(function(){terminalInput.selectionStart = terminalInput.selectionEnd = 10000; }, 0);
+ }
+
+ if (event.keyCode === KEY.DOWNARROW ||
+ (_Fconf_js__WEBPACK_IMPORTED_MODULE_5__["FconfSettings"].ENABLE_BASH_HOTKEYS && event.keyCode === KEY.M && event.ctrlKey)) {
+ if (_Fconf_js__WEBPACK_IMPORTED_MODULE_5__["FconfSettings"].ENABLE_BASH_HOTKEYS) {event.preventDefault();}
+ //Cycle through past commands
+ if (terminalInput == null) {return;}
+ var i = Terminal.commandHistoryIndex;
+ var len = Terminal.commandHistory.length;
+
+ if (len == 0) {return;}
+ if (i < 0 || i > len) {
+ Terminal.commandHistoryIndex = len;
+ }
+
+ //Latest command, put nothing
+ if (i == len || i == len-1) {
+ Terminal.commandHistoryIndex = len;
+ terminalInput.value = "";
+ } else {
+ ++Terminal.commandHistoryIndex;
+ var prevCommand = Terminal.commandHistory[Terminal.commandHistoryIndex];
+ terminalInput.value = prevCommand;
+ }
+ }
+
+ if (event.keyCode === KEY.TAB) {
+ //Autocomplete
+ if (terminalInput == null) {return;}
+ var input = terminalInput.value;
+ if (input == "") {return;}
+ input = input.trim();
+ input = input.replace(/\s\s+/g, ' ');
+
+ var commandArray = input.split(" ");
+ var index = commandArray.length - 2;
+ if (index < -1) {index = 0;}
+ var allPos = determineAllPossibilitiesForTabCompletion(input, index);
+ if (allPos.length == 0) {return;}
+
+ var arg = "";
+ var command = "";
+ if (commandArray.length == 0) {return;}
+ if (commandArray.length == 1) {command = commandArray[0];}
+ else if (commandArray.length == 2) {
+ command = commandArray[0];
+ arg = commandArray[1];
+ } else if (commandArray.length == 3) {
+ command = commandArray[0] + " " + commandArray[1];
+ arg = commandArray[2];
+ } else {
+ arg = commandArray.pop();
+ command = commandArray.join(" ");
+ }
+
+ tabCompletion(command, arg, allPos);
+ }
+
+ //Extra Bash Emulation Hotkeys, must be enabled through .fconf
+ if (_Fconf_js__WEBPACK_IMPORTED_MODULE_5__["FconfSettings"].ENABLE_BASH_HOTKEYS) {
+ if (event.keyCode === KEY.A && event.ctrlKey) {
+ event.preventDefault();
+ Terminal.moveTextCursor("home");
+ }
+
+ if (event.keyCode === KEY.E && event.ctrlKey) {
+ event.preventDefault();
+ Terminal.moveTextCursor("end");
+ }
+
+ if (event.keyCode === KEY.B && event.ctrlKey) {
+ event.preventDefault();
+ Terminal.moveTextCursor("prevchar");
+ }
+
+ if (event.keyCode === KEY.B && event.altKey) {
+ event.preventDefault();
+ Terminal.moveTextCursor("prevword");
+ }
+
+ if (event.keyCode === KEY.F && event.ctrlKey) {
+ event.preventDefault();
+ Terminal.moveTextCursor("nextchar");
+ }
+
+ if (event.keyCode === KEY.F && event.altKey) {
+ event.preventDefault();
+ Terminal.moveTextCursor("nextword");
+ }
+
+
+ if ((event.keyCode === KEY.H || event.keyCode === KEY.D) && event.ctrlKey) {
+ Terminal.modifyInput("backspace");
+ event.preventDefault();
+ }
+
+ //TODO AFTER THIS:
+
+ //alt + d deletes word after cursor
+ //^w deletes word before cursor
+ //^k clears line after cursor
+ //^u clears line before cursor
+ }
+ }
+});
+
+//Keep terminal in focus
+let terminalCtrlPressed = false;
+$(document).ready(function() {
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"].Page.Terminal) {
+ $('.terminal-input').focus();
+ }
+});
+$(document).keydown(function(e) {
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"].Page.Terminal) {
+ if (e.which == 17) {
+ terminalCtrlPressed = true;
+ } else if (terminalCtrlPressed == true) {
+ //Don't focus
+ } else {
+ var inputTextBox = document.getElementById("terminal-input-text-box");
+ if (inputTextBox != null) {
+ inputTextBox.focus();
+ }
+
+ terminalCtrlPressed = false;
+ }
+ }
+})
+$(document).keyup(function(e) {
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_4__["Engine"].Page.Terminal) {
+ if (e.which == 17) {
+ terminalCtrlPressed = false;
+ }
+ }
+})
+
+//Implements a tab completion feature for terminal
+// command - Command (first arg only)
+// arg - Incomplete argument string that the function will try to complete, or will display
+// a series of possible options for
+// allPossibilities - Array of strings containing all possibilities that the
+// string can complete to
+// index - index of argument that is being "tab completed". By default is 0, the first argument
+function tabCompletion(command, arg, allPossibilities, index=0) {
+ if (!(allPossibilities.constructor === Array)) {return;}
+ if (!Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_19__["containsAllStrings"])(allPossibilities)) {return;}
+
+ if (!command.startsWith("./")) {
+ command = command.toLowerCase();
+ }
+
+ //Remove all options in allPossibilities that do not match the current string
+ //that we are attempting to autocomplete
+ if (arg == "") {
+ for (var i = allPossibilities.length-1; i >= 0; --i) {
+ if (!allPossibilities[i].toLowerCase().startsWith(command.toLowerCase())) {
+ allPossibilities.splice(i, 1);
+ }
+ }
+ } else {
+ for (var i = allPossibilities.length-1; i >= 0; --i) {
+ if (!allPossibilities[i].toLowerCase().startsWith(arg.toLowerCase())) {
+ allPossibilities.splice(i, 1);
+ }
+ }
+ }
+
+ var val = "";
+ if (allPossibilities.length == 0) {
+ return;
+ } else if (allPossibilities.length == 1) {
+ if (arg == "") {
+ //Autocomplete command
+ val = allPossibilities[0] + " ";
+ } else {
+ val = command + " " + allPossibilities[0];
+ }
+ document.getElementById("terminal-input-text-box").value = val;
+ document.getElementById("terminal-input-text-box").focus();
+ } else {
+ var longestStartSubstr = Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_19__["longestCommonStart"])(allPossibilities);
+ //If the longest common starting substring of remaining possibilities is the same
+ //as whatevers already in terminal, just list all possible options. Otherwise,
+ //change the input in the terminal to the longest common starting substr
+ var allOptionsStr = "";
+ for (var i = 0; i < allPossibilities.length; ++i) {
+ allOptionsStr += allPossibilities[i];
+ allOptionsStr += " ";
+ }
+ if (arg == "") {
+ if (longestStartSubstr == command) {
+ post("> " + command);
+ post(allOptionsStr);
+ } else {
+ document.getElementById("terminal-input-text-box").value = longestStartSubstr;
+ document.getElementById("terminal-input-text-box").focus();
+ }
+ } else {
+ if (longestStartSubstr == arg) {
+ //List all possible options
+ post("> " + command + " " + arg);
+ post(allOptionsStr);
+ } else {
+ document.getElementById("terminal-input-text-box").value = command + " " + longestStartSubstr;
+ document.getElementById("terminal-input-text-box").focus();
+ }
+ }
+
+ }
+}
+
+function determineAllPossibilitiesForTabCompletion(input, index=0) {
+ var allPos = [];
+ allPos = allPos.concat(Object.keys(_Alias_js__WEBPACK_IMPORTED_MODULE_0__["GlobalAliases"]));
+ var currServ = _Player_js__WEBPACK_IMPORTED_MODULE_12__["Player"].getCurrentServer();
+ input = input.toLowerCase();
+
+ //If the command starts with './' and the index == -1, then the user
+ //has input ./partialexecutablename so autocomplete the script or program
+ //Put './' in front of each script/executable
+ if (input.startsWith("./") && index == -1) {
+ //All programs and scripts
+ for (var i = 0; i < currServ.scripts.length; ++i) {
+ allPos.push("./" + currServ.scripts[i].filename);
+ }
+
+ //Programs are on home computer
+ var homeComputer = _Player_js__WEBPACK_IMPORTED_MODULE_12__["Player"].getHomeComputer();
+ for(var i = 0; i < homeComputer.programs.length; ++i) {
+ allPos.push("./" + homeComputer.programs[i]);
+ }
+ return allPos;
+ }
+
+ //Autocomplete the command
+ if (index == -1) {
+ return ["alias", "analyze", "cat", "check", "clear", "cls", "connect", "download", "free",
+ "hack", "help", "home", "hostname", "ifconfig", "kill", "killall",
+ "ls", "lscpu", "mem", "nano", "ps", "rm", "run", "scan", "scan-analyze",
+ "scp", "sudov", "tail", "theme", "top"].concat(Object.keys(_Alias_js__WEBPACK_IMPORTED_MODULE_0__["Aliases"])).concat(Object.keys(_Alias_js__WEBPACK_IMPORTED_MODULE_0__["GlobalAliases"]));
+ }
+
+ if (input.startsWith ("buy ")) {
+ return [_CreateProgram_js__WEBPACK_IMPORTED_MODULE_2__["Programs"].BruteSSHProgram, _CreateProgram_js__WEBPACK_IMPORTED_MODULE_2__["Programs"].FTPCrackProgram, _CreateProgram_js__WEBPACK_IMPORTED_MODULE_2__["Programs"].RelaySMTPProgram,
+ _CreateProgram_js__WEBPACK_IMPORTED_MODULE_2__["Programs"].HTTPWormProgram, _CreateProgram_js__WEBPACK_IMPORTED_MODULE_2__["Programs"].SQLInjectProgram, _CreateProgram_js__WEBPACK_IMPORTED_MODULE_2__["Programs"].DeepscanV1,
+ _CreateProgram_js__WEBPACK_IMPORTED_MODULE_2__["Programs"].DeepscanV2].concat(Object.keys(_Alias_js__WEBPACK_IMPORTED_MODULE_0__["GlobalAliases"]));
+ }
+
+ if (input.startsWith("scp ") && index == 1) {
+ for (var iphostname in _Server_js__WEBPACK_IMPORTED_MODULE_15__["AllServers"]) {
+ if (_Server_js__WEBPACK_IMPORTED_MODULE_15__["AllServers"].hasOwnProperty(iphostname)) {
+ allPos.push(_Server_js__WEBPACK_IMPORTED_MODULE_15__["AllServers"][iphostname].ip);
+ allPos.push(_Server_js__WEBPACK_IMPORTED_MODULE_15__["AllServers"][iphostname].hostname);
+ }
+ }
+ }
+
+ if (input.startsWith("scp ") && index == 0) {
+ //All Scripts and lit files
+ for (var i = 0; i < currServ.scripts.length; ++i) {
+ allPos.push(currServ.scripts[i].filename);
+ }
+ for (var i = 0; i < currServ.messages.length; ++i) {
+ if (!(currServ.messages[i] instanceof _Message_js__WEBPACK_IMPORTED_MODULE_9__["Message"])) {
+ allPos.push(currServ.messages[i]);
+ }
+ }
+ for (var i = 0; i < currServ.textFiles.length; ++i) {
+ allPos.push(currServ.textFiles[i].fn);
+ }
+ }
+
+ if (input.startsWith("connect ") || input.startsWith("telnet ")) {
+ //All network connections
+ for (var i = 0; i < currServ.serversOnNetwork.length; ++i) {
+ var serv = _Server_js__WEBPACK_IMPORTED_MODULE_15__["AllServers"][currServ.serversOnNetwork[i]];
+ if (serv == null) {continue;}
+ allPos.push(serv.ip); //IP
+ allPos.push(serv.hostname); //Hostname
+ }
+ return allPos;
+ }
+
+ if (input.startsWith("kill ") || input.startsWith("tail ") ||
+ input.startsWith("mem ") || input.startsWith("check ")) {
+ //All Scripts
+ for (var i = 0; i < currServ.scripts.length; ++i) {
+ allPos.push(currServ.scripts[i].filename);
+ }
+ return allPos;
+ }
+
+ if (input.startsWith("nano ")) {
+ //Scripts and text files and .fconf
+ for (var i = 0; i < currServ.scripts.length; ++i) {
+ allPos.push(currServ.scripts[i].filename);
+ }
+ for (var i = 0; i < currServ.textFiles.length; ++i) {
+ allPos.push(currServ.textFiles[i].fn);
+ }
+ allPos.push(".fconf");
+ return allPos;
+ }
+
+ if (input.startsWith("rm ")) {
+ for (var i = 0; i < currServ.scripts.length; ++i) {
+ allPos.push(currServ.scripts[i].filename);
+ }
+ for (var i = 0; i < currServ.programs.length; ++i) {
+ allPos.push(currServ.programs[i]);
+ }
+ for (var i = 0; i < currServ.messages.length; ++i) {
+ if (!(currServ.messages[i] instanceof _Message_js__WEBPACK_IMPORTED_MODULE_9__["Message"]) && Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_19__["isString"])(currServ.messages[i]) &&
+ currServ.messages[i].endsWith(".lit")) {
+ allPos.push(currServ.messages[i]);
+ }
+ }
+ for (var i = 0; i < currServ.textFiles.length; ++i) {
+ allPos.push(currServ.textFiles[i].fn);
+ }
+ return allPos;
+ }
+
+ if (input.startsWith("run ")) {
+ //All programs and scripts
+ for (var i = 0; i < currServ.scripts.length; ++i) {
+ allPos.push(currServ.scripts[i].filename);
+ }
+
+ //Programs are on home computer
+ var homeComputer = _Player_js__WEBPACK_IMPORTED_MODULE_12__["Player"].getHomeComputer();
+ for(var i = 0; i < homeComputer.programs.length; ++i) {
+ allPos.push(homeComputer.programs[i]);
+ }
+ return allPos;
+ }
+
+ if (input.startsWith("cat ")) {
+ for (var i = 0; i < currServ.messages.length; ++i) {
+ if (currServ.messages[i] instanceof _Message_js__WEBPACK_IMPORTED_MODULE_9__["Message"]) {
+ allPos.push(currServ.messages[i].filename);
+ } else {
+ allPos.push(currServ.messages[i]);
+ }
+ }
+ for (var i = 0; i < currServ.textFiles.length; ++i) {
+ allPos.push(currServ.textFiles[i].fn);
+ }
+ return allPos;
+ }
+
+ if (input.startsWith("download ")) {
+ for (var i = 0; i < currServ.textFiles.length; ++i) {
+ allPos.push(currServ.textFiles[i].fn);
+ }
+ for (var i = 0; i < currServ.scripts.length; ++i) {
+ allPos.push(currServ.scripts[i].filename);
+ }
+ }
+ return allPos;
+}
+
+let Terminal = {
+ //Flags to determine whether the player is currently running a hack or an analyze
+ hackFlag: false,
+ analyzeFlag: false,
+
+ commandHistory: [],
+ commandHistoryIndex: 0,
+
+ resetTerminalInput: function() {
+ document.getElementById("terminal-input-td").innerHTML =
+ "' + input + '
" +
+ "Do you want to travel to the BitNode Nexus? This allows you to reset the current BitNode " +
+ "and select a new one.");
+
+ break;
+ default:
+ post("Invalid executable. Cannot be run");
+ return;
+ }
+ },
+
+ runScript: function(scriptName) {
+ var server = _Player_js__WEBPACK_IMPORTED_MODULE_12__["Player"].getCurrentServer();
+
+ var numThreads = 1;
+ var args = [];
+ var results = scriptName.split(" ");
+ if (results.length <= 0) {
+ post("This is a bug. Please contact developer");
+ }
+ scriptName = results[0];
+ if (results.length > 1) {
+ if (results.length >= 3 && results[1] == "-t") {
+ numThreads = Math.round(Number(results[2]));
+ if (isNaN(numThreads) || numThreads < 1) {
+ post("Invalid number of threads specified. Number of threads must be greater than 0");
+ return;
+ }
+ for (var i = 3; i < results.length; ++i) {
+ var arg = results[i];
+
+ //Forced string
+ if ((arg.startsWith("'") && arg.endsWith("'")) ||
+ (arg.startsWith('"') && arg.endsWith('"'))) {
+ args.push(arg.slice(1, -1));
+ continue;
+ }
+ //Number
+ var tempNum = Number(arg);
+ if (!isNaN(tempNum)) {
+ args.push(tempNum);
+ continue;
+ }
+ //Otherwise string
+ args.push(arg);
+ }
+ } else {
+ for (var i = 1; i < results.length; ++i) {
+ var arg = results[i];
+
+ //Forced string
+ if ((arg.startsWith("'") && arg.endsWith("'")) ||
+ (arg.startsWith('"') && arg.endsWith('"'))) {
+ args.push(arg.slice(1, -1));
+ continue;
+ }
+ //Number
+ var tempNum = Number(arg);
+ if (!isNaN(tempNum)) {
+ args.push(tempNum);
+ continue;
+ }
+ //Otherwise string
+ args.push(arg);
+ }
+ }
+ }
+
+
+ //Check if this script is already running
+ if (Object(_Script_js__WEBPACK_IMPORTED_MODULE_14__["findRunningScript"])(scriptName, args, server) != null) {
+ post("ERROR: This script is already running. Cannot run multiple instances");
+ return;
+ }
+
+ //Check if the script exists and if it does run it
+ for (var i = 0; i < server.scripts.length; i++) {
+ if (server.scripts[i].filename == scriptName) {
+ //Check for admin rights and that there is enough RAM availble to run
+ var script = server.scripts[i];
+ var ramUsage = script.ramUsage * numThreads * Math.pow(_Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].MultithreadingRAMCost, numThreads-1);
+ var ramAvailable = server.maxRam - server.ramUsed;
+
+ if (server.hasAdminRights == false) {
+ post("Need root access to run script");
+ return;
+ } else if (ramUsage > ramAvailable){
+ post("This machine does not have enough RAM to run this script with " +
+ numThreads + " threads. Script requires " + ramUsage + "GB of RAM");
+ return;
+ } else {
+ //Able to run script
+ post("Running script with " + numThreads + " thread(s) and args: " + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_20__["printArray"])(args) + ".");
+ post("May take a few seconds to start up the process...");
+ var runningScriptObj = new _Script_js__WEBPACK_IMPORTED_MODULE_14__["RunningScript"](script, args);
+ runningScriptObj.threads = numThreads;
+ server.runningScripts.push(runningScriptObj);
+
+ Object(_NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_11__["addWorkerScript"])(runningScriptObj, server);
+ return;
+ }
+ }
+ }
+
+ post("ERROR: No such script");
+ }
+};
+
+
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ 38)))
+
+/***/ }),
+/* 23 */
+/*!**************************!*\
+ !*** ./utils/decimal.js ***!
+ \**************************/
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/*! decimal.js v7.2.3 https://github.com/MikeMcl/decimal.js/LICENCE */
+;(function (globalScope) {
+ 'use strict';
+
+
+ /*
+ * decimal.js v7.2.3
+ * An arbitrary-precision Decimal type for JavaScript.
+ * https://github.com/MikeMcl/decimal.js
+ * Copyright (c) 2017 Michael Mclaughlin
" +
+ "This tutorial will show you the basics of the game. " +
+ "You may skip the tutorial at any time.");
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "inline-block";
+ next.addEventListener("click", function() {
+ iTutorialNextStep();
+ return false;
+ });
+ break;
+ case iTutorialSteps.GoToCharacterPage:
+ iTutorialSetText("Let's start by heading to the Stats page. Click the 'Stats' tab on " +
+ "the main navigation menu (left-hand side of the screen)");
+
+ //No next button
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "none";
+
+ //Flash Character tab
+ document.getElementById("stats-menu-link").setAttribute("class", "flashing-button");
+
+ //Initialize everything necessary to open the "Character" page
+ var charaterMainMenuButton = document.getElementById("stats-menu-link");
+ charaterMainMenuButton.addEventListener("click", function() {
+ _engine_js__WEBPACK_IMPORTED_MODULE_0__["Engine"].loadCharacterContent();
+ iTutorialNextStep(); //Opening the character page will go to the next step
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("stats-menu-link");
+ return false;
+ });
+ break;
+ case iTutorialSteps.CharacterPage:
+ iTutorialSetText("The Stats page shows a lot of important information about your progress, " +
+ "such as your skills, money, and bonuses/multipliers. ")
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "inline-block";
+ next.addEventListener("click", function() {
+ iTutorialNextStep();
+ return false;
+ });
+ break;
+ case iTutorialSteps.CharacterGoToTerminalPage:
+ iTutorialSetText("Let's head to your computer's terminal by clicking the 'Terminal' tab on the " +
+ "main navigation menu.");
+ //No next button
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "none";
+
+ document.getElementById("terminal-menu-link").setAttribute("class", "flashing-button");
+
+ //Initialize everything necessary to open the 'Terminal' Page
+ var terminalMainMenuButton = document.getElementById("terminal-menu-link");
+ terminalMainMenuButton.addEventListener("click", function() {
+ _engine_js__WEBPACK_IMPORTED_MODULE_0__["Engine"].loadTerminalContent();
+ iTutorialNextStep();
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("terminal-menu-link");
+ return false;
+ });
+ break;
+ case iTutorialSteps.TerminalIntro:
+ iTutorialSetText("The Terminal is used to interface with your home computer as well as " +
+ "all of the other machines around the world.");
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "inline-block";
+ next.addEventListener("click", function() {
+ iTutorialNextStep();
+ return false;
+ });
+ break;
+ case iTutorialSteps.TerminalHelp:
+ iTutorialSetText("Let's try it out. Start by entering the 'help' command into the Terminal " +
+ "(Don't forget to press Enter after typing the command)");
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "none";
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalLs:
+ iTutorialSetText("The 'help' command displays a list of all available Terminal commands, how to use them, " +
+ "and a description of what they do.
Let's try another command. Enter the 'ls' command");
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalScan:
+ iTutorialSetText("'ls' is a basic command that shows all of the contents (programs/scripts) " +
+ "on the computer. Right now, it shows that you have a program called 'NUKE.exe' on your computer. " +
+ "We'll get to what this does later.
Using your home computer's terminal, you can connect " +
+ "to other machines throughout the world. Let's do that now by first entering " +
+ "the 'scan' command. ");
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalScanAnalyze1:
+ iTutorialSetText("The 'scan' command shows all available network connections. In other words, " +
+ "it displays a list of all servers that can be connected to from your " +
+ "current machine. A server is identified by either its IP or its hostname.
" +
+ "That's great and all, but there's so many servers. Which one should you go to? " +
+ "The 'scan-analyze' command gives some more detailed information about servers on the " +
+ "network. Try it now");
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalScanAnalyze2:
+ iTutorialSetText("You just ran 'scan-analyze' with a depth of one. This command shows more detailed " +
+ "information about each server that you can connect to (servers that are a distance of " +
+ "one node away).
It is also possible to run 'scan-analyze' with " +
+ "a higher depth. Let's try a depth of two with the following command: 'scan-analyze 2'.")
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalConnect:
+ iTutorialSetText("Now you can see information about all servers that are up to two nodes away, as well " +
+ "as figure out how to navigate to those servers through the network. You can only connect to " +
+ "a server that is one node away. To connect to a machine, use the 'connect [ip/hostname]' command. You can type in " +
+ "the ip or the hostname, but dont use both.
" +
+ "From the results of the 'scan-analyze' command, we can see that the 'foodnstuff' server is " +
+ "only one node away. Let's connect so it now using: 'connect foodnstuff'");
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalAnalyze:
+ iTutorialSetText("You are now connected to another machine! What can you do now? You can hack it!
In the year 2077, currency has " +
+ "become digital and decentralized. People and corporations store their money " +
+ "on servers and computers. Using your hacking abilities, you can hack servers " +
+ "to steal money and gain experience.
" +
+ "Before you try to hack a server, you should run diagnostics using the 'analyze' command");
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalNuke:
+ iTutorialSetText("When the 'analyze' command finishes running it will show useful information " +
+ "about hacking the server.
For this server, the required hacking skill is only 1, " +
+ "which means you can hack it right now. However, in order to hack a server " +
+ "you must first gain root access. The 'NUKE.exe' program that we saw earlier on your " +
+ "home computer is a virus that will grant you root access to a machine if there are enough " +
+ "open ports.
The 'analyze' results shows that there do not need to be any open ports " +
+ "on this machine for the NUKE virus to work, so go ahead and run the virus using the " +
+ "'run NUKE.exe' command.");
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalManualHack:
+ iTutorialSetText("You now have root access! You can hack the server using the 'hack' command. " +
+ "Try doing that now.");
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalHackingMechanics:
+ iTutorialSetText("You are now attempting to hack the server. Note that performing a hack takes time and " +
+ "only has a certain percentage chance " +
+ "of success. This time and success chance is determined by a variety of factors, including " +
+ "your hacking skill and the server's security level.
" +
+ "If your attempt to hack the server is successful, you will steal a certain percentage " +
+ "of the server's total money. This percentage is affected by your hacking skill and " +
+ "the server's security 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.");
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "inline-block";
+ next.addEventListener("click", function() {
+ iTutorialNextStep();
+ return false;
+ });
+ break;
+ case iTutorialSteps.TerminalCreateScript:
+ iTutorialSetText("Hacking is the core mechanic of the game and is necessary for progressing. However, " +
+ "you don't want to be hacking manually the entire time. You can automate your hacking " +
+ "by writing scripts!
To create a new script or edit an existing one, you can use the 'nano' " +
+ "command. Scripts must end with the '.script' extension. Let's make a script now by " +
+ "entering 'nano foodnstuff.script' after the hack command finishes running (Sidenote: Pressing ctrl + c" +
+ " will end a command like hack early)");
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "none";
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalTypeScript:
+ iTutorialSetText("This is the script editor. You can use it to program your scripts. Scripts are " +
+ "written in the Netscript language, a programming language created for " +
+ "this game. There are details about the Netscript language in the documentation, which " +
+ "can be accessed in the 'Tutorial' tab on the main navigation menu. I highly suggest you check " +
+ "it out after this tutorial. For now, just copy " +
+ "and paste the following code into the script editor:
" +
+ "while(true) {
" +
+ " hack('foodnstuff');
" +
+ "}
" +
+ "For anyone with basic programming experience, this code should be straightforward. " +
+ "This script will continuously hack the 'foodnstuff' server.
" +
+ "To save and close the script editor, press the button in the bottom left, or press ctrl + b.");
+ //next step triggered in saveAndCloseScriptEditor() (Script.js)
+ break;
+ case iTutorialSteps.TerminalFree:
+ iTutorialSetText("Now we'll run the script. Scripts require a certain amount of RAM to run, and can be " +
+ "run on any machine which you have root access to. Different servers have different " +
+ "amounts of RAM. You can also purchase more RAM for your home server.
To check how much " +
+ "RAM is available on this machine, enter the 'free' command.");
+ //next step triggered by terminal commmand
+ break;
+ case iTutorialSteps.TerminalRunScript:
+ iTutorialSetText("We have 16GB of free RAM on this machine, which is enough to run our " +
+ "script. Let's run our script using 'run foodnstuff.script'.");
+ //next step triggered by terminal commmand
+ break;
+ case iTutorialSteps.TerminalGoToActiveScriptsPage:
+ iTutorialSetText("Your script is now running! The script might take a few seconds to 'fully start up'. " +
+ "Your scripts will continuously run in the background and will automatically stop if " +
+ "the code ever completes (the 'foodnstuff.script' will never complete because it " +
+ "runs an infinite loop).
These scripts can passively earn you income and hacking experience. " +
+ "Your scripts will also earn money and experience while you are offline, although at a " +
+ "much slower rate.
" +
+ "Let's check out some statistics for our running scripts by clicking the " +
+ "'Active Scripts' link in the main navigation menu.");
+ document.getElementById("active-scripts-menu-link").setAttribute("class", "flashing-button");
+ var activeScriptsMainMenuButton = document.getElementById("active-scripts-menu-link");
+ activeScriptsMainMenuButton.addEventListener("click", function() {
+ _engine_js__WEBPACK_IMPORTED_MODULE_0__["Engine"].loadActiveScriptsContent();
+ iTutorialNextStep();
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("active-scripts-menu-link");
+ return false;
+ });
+ break;
+ case iTutorialSteps.ActiveScriptsPage:
+ iTutorialSetText("This page displays stats/information about all of your scripts that are " +
+ "running across every existing server. You can use this to gauge how well " +
+ "your scripts are doing. Let's go back to the Terminal now using the 'Terminal'" +
+ "link.");
+ document.getElementById("terminal-menu-link").setAttribute("class", "flashing-button");
+ //Initialize everything necessary to open the 'Terminal' Page
+ var terminalMainMenuButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("terminal-menu-link");
+ terminalMainMenuButton.addEventListener("click", function() {
+ _engine_js__WEBPACK_IMPORTED_MODULE_0__["Engine"].loadTerminalContent();
+ iTutorialNextStep();
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("terminal-menu-link");
+ return false;
+ });
+ break;
+ case iTutorialSteps.ActiveScriptsToTerminal:
+ iTutorialSetText("One last thing about scripts, each active script contains logs that detail " +
+ "what it's doing. We can check these logs using the 'tail' command. Do that " +
+ "now for the script we just ran by typing 'tail foodnstuff.script'");
+ //next step triggered by terminal command
+ break;
+ case iTutorialSteps.TerminalTailScript:
+ iTutorialSetText("The log for this script won't show much right now (it might show nothing at all) because it " +
+ "just started running...but check back again in a few minutes!
" +
+ "This pretty much covers the basics of hacking. To learn more about writing " +
+ "scripts using the Netscript language, select the 'Tutorial' link in the " +
+ "main navigation menu to look at the documentation. For now, let's move on " +
+ "to something else!");
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "inline-block";
+ next.addEventListener("click", function() {
+ iTutorialNextStep();
+ return false;
+ });
+ break;
+ case iTutorialSteps.GoToHacknetNodesPage:
+ iTutorialSetText("Hacking is not the only way to earn money. One other way to passively " +
+ "earn money is by purchasing and upgrading Hacknet Nodes. Let's go to " +
+ "the 'Hacknet Nodes' page through the main navigation menu now.");
+ document.getElementById("hacknet-nodes-menu-link").setAttribute("class", "flashing-button");
+ var hacknetNodesButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("hacknet-nodes-menu-link");
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "none";
+ hacknetNodesButton.addEventListener("click", function() {
+ _engine_js__WEBPACK_IMPORTED_MODULE_0__["Engine"].loadHacknetNodesContent();
+ iTutorialNextStep();
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("hacknet-nodes-menu-link");
+ return false;
+ });
+ break;
+ case iTutorialSteps.HacknetNodesIntroduction:
+ iTutorialSetText("From this page you can purchase new Hacknet Nodes and upgrade your " +
+ "existing ones. Let's purchase a new one now.");
+ //Next step triggered by purchaseHacknet() (HacknetNode.js)
+ break;
+ case iTutorialSteps.HacknetNodesGoToWorldPage:
+ iTutorialSetText("You just purchased a Hacknet Node! This Hacknet Node will passively " +
+ "earn you money over time, both online and offline. When you get enough " +
+ " money, you can upgrade " +
+ "your newly-purchased Hacknet Node below.
" +
+ "Let's go to the 'City' page through the main navigation menu.");
+ document.getElementById("city-menu-link").setAttribute("class", "flashing-button");
+ var worldButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("city-menu-link");
+ worldButton.addEventListener("click", function() {
+ _engine_js__WEBPACK_IMPORTED_MODULE_0__["Engine"].loadWorldContent();
+ iTutorialNextStep();
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("city-menu-link");
+ return false;
+ });
+ break;
+ case iTutorialSteps.WorldDescription:
+ iTutorialSetText("This page lists all of the different locations you can currently " +
+ "travel to. Each location has something that you can do. " +
+ "There's a lot of content out in the world, make sure " +
+ "you explore and discover!
" +
+ "Lastly, click on the 'Tutorial' link in the main navigation menu.");
+ document.getElementById("tutorial-menu-link").setAttribute("class", "flashing-button");
+ var tutorialButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("tutorial-menu-link");
+ tutorialButton.addEventListener("click", function() {
+ _engine_js__WEBPACK_IMPORTED_MODULE_0__["Engine"].loadTutorialContent();
+ iTutorialNextStep();
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("tutorial-menu-link");
+ return false;
+ });
+ break;
+
+ case iTutorialSteps.TutorialPageInfo:
+ iTutorialSetText("This page contains a lot of different documentation about the game's " +
+ "content and mechanics. I know it's a lot, but I highly suggest you read " +
+ "(or at least skim) through this before you start playing. That's the end of the tutorial. " +
+ "Hope you enjoy the game!");
+ var next = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-next");
+ next.style.display = "inline-block";
+ next.innerHTML = "Finish Tutorial";
+
+ var backButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_3__["clearEventListeners"])("interactive-tutorial-back");
+ backButton.style.display = "none";
+
+ next.addEventListener("click", function() {
+ iTutorialNextStep();
+ return false;
+ });
+ break;
+ case iTutorialSteps.End:
+ iTutorialEnd();
+ break;
+ default:
+ throw new Error("Invalid tutorial step");
+ }
+}
+
+//Go to the next step and evaluate it
+function iTutorialNextStep() {
+ switch(currITutorialStep) {
+ case iTutorialSteps.Start:
+ currITutorialStep = iTutorialSteps.GoToCharacterPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.GoToCharacterPage:
+ document.getElementById("stats-menu-link").removeAttribute("class");
+ currITutorialStep = iTutorialSteps.CharacterPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.CharacterPage:
+ currITutorialStep = iTutorialSteps.CharacterGoToTerminalPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.CharacterGoToTerminalPage:
+ document.getElementById("terminal-menu-link").removeAttribute("class");
+ currITutorialStep = iTutorialSteps.TerminalIntro;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalIntro:
+ currITutorialStep = iTutorialSteps.TerminalHelp;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalHelp:
+ currITutorialStep = iTutorialSteps.TerminalLs;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalLs:
+ currITutorialStep = iTutorialSteps.TerminalScan;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalScan:
+ currITutorialStep = iTutorialSteps.TerminalScanAnalyze1;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalScanAnalyze1:
+ currITutorialStep = iTutorialSteps.TerminalScanAnalyze2;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalScanAnalyze2:
+ currITutorialStep = iTutorialSteps.TerminalConnect;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalConnect:
+ currITutorialStep = iTutorialSteps.TerminalAnalyze;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalAnalyze:
+ currITutorialStep = iTutorialSteps.TerminalNuke;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalNuke:
+ currITutorialStep = iTutorialSteps.TerminalManualHack;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalManualHack:
+ currITutorialStep = iTutorialSteps.TerminalHackingMechanics;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalHackingMechanics:
+ currITutorialStep = iTutorialSteps.TerminalCreateScript;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalCreateScript:
+ currITutorialStep = iTutorialSteps.TerminalTypeScript;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalTypeScript:
+ currITutorialStep = iTutorialSteps.TerminalFree;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalFree:
+ currITutorialStep = iTutorialSteps.TerminalRunScript;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalRunScript:
+ currITutorialStep = iTutorialSteps.TerminalGoToActiveScriptsPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalGoToActiveScriptsPage:
+ document.getElementById("active-scripts-menu-link").removeAttribute("class");
+ currITutorialStep = iTutorialSteps.ActiveScriptsPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.ActiveScriptsPage:
+ document.getElementById("terminal-menu-link").removeAttribute("class");
+ currITutorialStep = iTutorialSteps.ActiveScriptsToTerminal;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.ActiveScriptsToTerminal:
+ currITutorialStep = iTutorialSteps.TerminalTailScript;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalTailScript:
+ currITutorialStep = iTutorialSteps.GoToHacknetNodesPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.GoToHacknetNodesPage:
+ document.getElementById("hacknet-nodes-menu-link").removeAttribute("class");
+ currITutorialStep = iTutorialSteps.HacknetNodesIntroduction;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.HacknetNodesIntroduction:
+ currITutorialStep = iTutorialSteps.HacknetNodesGoToWorldPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.HacknetNodesGoToWorldPage:
+ document.getElementById("city-menu-link").removeAttribute("class");
+ currITutorialStep = iTutorialSteps.WorldDescription;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.WorldDescription:
+ document.getElementById("tutorial-menu-link").removeAttribute("class");
+ currITutorialStep = iTutorialSteps.TutorialPageInfo;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TutorialPageInfo:
+ currITutorialStep = iTutorialSteps.End;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.End:
+ break;
+ default:
+ throw new Error("Invalid tutorial step");
+ }
+}
+
+//Go to previous step and evaluate
+function iTutorialPrevStep() {
+ switch(currITutorialStep) {
+ case iTutorialSteps.Start:
+ currITutorialStep = iTutorialSteps.Start;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.GoToCharacterPage:
+ currITutorialStep = iTutorialSteps.Start;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.CharacterPage:
+ currITutorialStep = iTutorialSteps.GoToCharacterPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.CharacterGoToTerminalPage:
+ currITutorialStep = iTutorialSteps.CharacterPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalIntro:
+ currITutorialStep = iTutorialSteps.CharacterGoToTerminalPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalHelp:
+ currITutorialStep = iTutorialSteps.TerminalIntro;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalLs:
+ currITutorialStep = iTutorialSteps.TerminalHelp;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalScan:
+ currITutorialStep = iTutorialSteps.TerminalLs;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalConnect:
+ currITutorialStep = iTutorialSteps.TerminalScan;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalAnalyze:
+ currITutorialStep = iTutorialSteps.TerminalConnect;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalNuke:
+ currITutorialStep = iTutorialSteps.TerminalAnalyze;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalManualHack:
+ currITutorialStep = iTutorialSteps.TerminalNuke;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalHackingMechanics:
+ currITutorialStep = iTutorialSteps.TerminalManualHack;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalCreateScript:
+ currITutorialStep = iTutorialSteps.TerminalManualHack;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalTypeScript:
+ currITutorialStep = iTutorialSteps.TerminalCreateScript;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalFree:
+ currITutorialStep = iTutorialSteps.TerminalTypeScript;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalRunScript:
+ currITutorialStep = iTutorialSteps.TerminalFree;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalGoToActiveScriptsPage:
+ currITutorialStep = iTutorialSteps.TerminalRunScript;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.ActiveScriptsPage:
+ currITutorialStep = iTutorialSteps.TerminalGoToActiveScriptsPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.ActiveScriptsToTerminal:
+ currITutorialStep = iTutorialSteps.ActiveScriptsPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TerminalTailScript:
+ currITutorialStep = iTutorialSteps.ActiveScriptsToTerminal;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.GoToHacknetNodesPage:
+ currITutorialStep = iTutorialSteps.TerminalTailScript;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.HacknetNodesIntroduction:
+ currITutorialStep = iTutorialSteps.GoToHacknetNodesPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.HacknetNodesGoToWorldPage:
+ currITutorialStep = iTutorialSteps.HacknetNodesIntroduction;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.WorldDescription:
+ currITutorialStep = iTutorialSteps.HacknetNodesGoToWorldPage;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.TutorialPageInfo:
+ currITutorialStep = iTutorialSteps.WorldDescription;
+ iTutorialEvaluateStep();
+ break;
+ case iTutorialSteps.End:
+ break;
+ default:
+ throw new Error("Invalid tutorial step");
+ }
+}
+
+function iTutorialEnd() {
+ //Re-enable auto save
+ _engine_js__WEBPACK_IMPORTED_MODULE_0__["Engine"].Counters.autoSaveCounter = 300;
+ console.log("Ending interactive tutorial");
+ _engine_js__WEBPACK_IMPORTED_MODULE_0__["Engine"].init();
+ currITutorialStep = iTutorialSteps.End;
+ iTutorialIsRunning = false;
+ document.getElementById("interactive-tutorial-container").style.display = "none";
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_2__["dialogBoxCreate"])("If you are new to the game, the following links may be useful for you!
" +
+ "Getting Started Guide" +
+ "Wiki
" +
+ "The Beginner's Guide to Hacking was added to your home computer! It contains some tips/pointers for starting out with the game. " +
+ "To read it, go to Terminal and enter
cat hackers-starting-handbook.lit");
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].getHomeComputer().messages.push("hackers-starting-handbook.lit");
+}
+
+function iTutorialSetText(txt) {
+ var textBox = document.getElementById("interactive-tutorial-text");
+ if (textBox == null) {throw new Error("Could not find text box"); return;}
+ textBox.innerHTML = txt;
+ textBox.parentElement.scrollTop = 0; // this resets scroll position
+}
+
+
+
+
+/***/ }),
+/* 26 */
+/*!****************************!*\
+ !*** ./src/FactionInfo.js ***!
+ \****************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FactionInfo", function() { return FactionInfo; });
+//Contains the "information" property for all the Factions, which is just a description
+//of each faction
+let FactionInfo = {
+ //Endgame
+ IlluminatiInfo: "Humanity never changes. No matter how civilized society becomes, it will eventually fall back " +
+ "into chaos. And from this chaos, we are the Invisible hand that guides them to order. ",
+
+ DaedalusInfo: "Yesterday we obeyed kings and bent our necks to emperors. Today we kneel only to truth.",
+
+ CovenantInfo: "Surrender yourself. Give up your empty individuality to become part of something great, something eternal. " +
+ "Become a slave. Submit your mind, body, and soul. Only then can you set yourself free.
" +
+ "Only then can you discover immortality.",
+
+ //Megacorporations, each forms its own faction
+ ECorpInfo: "ECorp's mission is simple: to connect the world of today with the technology of tomorrow. " +
+ "With our wide range of Internet-related software and commercial hardware, ECorp makes the world's " +
+ "information universally accessible.",
+
+ MegaCorpInfo: "MegaCorp does things that others don't. We imagine. We create. We invent. We build things that " +
+ "others have never even dreamed of. Our work fills the world's needs for food, water, power, and " +
+ "transporation on an unprecendented scale, in ways that no other company can.
" +
+ "In our labs and factories and on the ground with customers, MegaCorp is ushering in a new era for the world.",
+
+ BachmanAndAssociatesInfo: "Where Law and Business meet - thats where we are.
" +
+ "Legal Insight - Business Instinct - Experience Innovation",
+
+ BladeIndustriesInfo: "Augmentation is salvation",
+
+ NWOInfo: "The human being does not truly desire freedom. It wants " +
+ "to be observed, understood, and judged. It wants to be given purpose and " +
+ "direction in its life. That is why humans created God. " +
+ "And that is why humans created civilization - " +
+ "not because of willingness, " +
+ "but because of a need to be incorporated into higher orders of structure and meaning.",
+
+ ClarkeIncorporatedInfo: "Unlocking the power of the genome",
+
+ OmniTekIncorporatedInfo: "Simply put, our mission is to design and build robots that make a difference",
+
+ FourSigmaInfo: "The scientific method is the best way to approach investing. Big strategies backed up with big data. Driven by " +
+ "deep learning and innovative ideas. And improved by iteration. That's Four Sigma.",
+
+ KuaiGongInternationalInfo: "Dream big. Work hard. Make history.",
+
+ //Other Corporations
+ FulcrumSecretTechnologiesInfo: "The human organism has an innate desire to worship. " +
+ "That is why they created gods. If there were no gods, " +
+ "it would be necessary to create them. And now we can.",
+
+ //Hacker groups
+ BitRunnersInfo: "Our entire lives are controlled by bits. All of our actions, our thoughts, our personal information. "+
+ "It's all transformed into bits, stored in bits, communicated through bits. It’s impossible for any person " +
+ "to move, to live, to operate at any level without the use of bits. " +
+ "And when a person moves, lives, and operates, they leave behind their bits, mere traces of seemingly " +
+ "meaningless fragments of information. But these bits can be reconstructed. Transformed. Used.
" +
+ "Those who run the bits, run the world",
+
+
+ BlackHandInfo: "The world, so afraid of strong government, now has no government. Only power - Digital power. Financial power. " +
+ "Technological power. " +
+ "And those at the top rule with an invisible hand. They built a society where the rich get richer, " +
+ "and everyone else suffers.
" +
+ "So much pain. So many lives. Their darkness must end.",
+
+ NiteSecInfo:
+" __..__
" +
+" _.nITESECNIt.
" +
+" .-'NITESECNITESEc.
" +
+" .' NITESECNITESECn
" +
+" / NITESECNITESEC;
" +
+" : :NITESECNITESEC;
" +
+" ; $ NITESECNITESECN
" +
+" : _, ,N'ITESECNITESEC
" +
+" : .+^^`, : `NITESECNIT
" +
+" ) /), `-,-=,NITESECNI
" +
+" / ^ ,-;|NITESECN;
" +
+" / _.' '-';NITESECN
" +
+" ( , ,-''`^NITE'
" +
+" )` :`. .'
" +
+" )-- ; `- /
" +
+" \' _.-' :
" +
+" ( _.-' \. \
" +
+" \------. \ \
" +
+" \. \ \
" +
+" \ _.nIt
" +
+" \ _.nITESECNi
" +
+" nITESECNIT^' \
" +
+" NITE^' ___ \
" +
+" / .gP''''Tp. \
" +
+" : d' . `b \
" +
+" ; d' o `b ;
" +
+" / d; `b|
" +
+" /, $; @ `:
" +
+" /' $$ ;
" +
+" .' $$b o |
" +
+" .' d$$$; :
" +
+" / .d$$$$; , ;
" +
+" d .dNITESEC $ |
" +
+" :bp.__.gNITESEC$$ :$ ;
" +
+" NITESECNITESECNIT $$b :
",
+
+ //City factions, essentially governments
+ ChongqingInfo: "Serve the people",
+ Sector12Info: "The City of the Future",
+ HongKongInfo: "Asia's World City",
+ AevumInfo: "The Silicon City",
+ IshimaInfo: "The East Asian Order of the Future",
+ VolhavenInfo: "Benefit, Honour, and Glory",
+
+ //Criminal Organizations/Gangs
+ SpeakersForTheDeadInfo: "It is better to reign in hell than to serve in heaven.",
+
+ DarkArmyInfo: "The World doesn't care about right or wrong. It's all about power.",
+
+ TheSyndicateInfo: "Honor holds you back",
+
+ SilhouetteInfo: "Corporations have filled the void of power left behind by the collapse of Western government. The issue is they've become so big " +
+ "that you don't know who they're working for. And if you're employed at one of these corporations, you don't even know who you're working " +
+ "for.\n\n" +
+ "That's terror. Terror, fear, and corruption. All born into the system, all propagated by the system.",
+
+ TetradsInfo: "Following the Mandate of Heaven and Carrying out the Way",
+
+ SlumSnakesInfo: "Slum Snakes rule!",
+
+ //Earlygame factions - factions the player will prestige with early on that don't
+ //belong in other categories
+ NetburnersInfo: "~~//*>H4CK|\|3T 8URN3R5**>?>\\~~",
+
+ TianDiHuiInfo: "Obey Heaven and Work Righteousness",
+
+ CyberSecInfo: "The Internet is the first thing that humanity has built that humanity doesn’t understand, " +
+ "the largest experiment in anarchy that we have ever had. And as the world becomes increasingly " +
+ "dominated by the internet, society approaches the brink of total chaos. " +
+ "We serve only to protect society, to protect humanity, to protect the world from its imminent collapse.",
+
+ //Special Factions
+ BladeburnersInfo: "It's too bad they won't live. But then again, who does?
" +
+ "Note that for this faction, reputation can only be gained through Bladeburner actions. Completing " +
+ "Bladeburner contracts/operations will increase your reputation.",
+}
+
+
+
+
+/***/ }),
+/* 27 */
+/*!************************!*\
+ !*** ./src/Message.js ***!
+ \************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Messages", function() { return Messages; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkForMessagesToSend", function() { return checkForMessagesToSend; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sendMessage", function() { return sendMessage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showMessage", function() { return showMessage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadMessages", function() { return loadMessages; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initMessages", function() { return initMessages; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Message", function() { return Message; });
+/* harmony import */ var _Augmentations_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Augmentations.js */ 18);
+/* harmony import */ var _CreateProgram_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CreateProgram.js */ 14);
+/* harmony import */ var _Missions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Missions.js */ 32);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _RedPill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./RedPill.js */ 44);
+/* harmony import */ var _Server_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Server.js */ 10);
+/* harmony import */ var _Settings_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Settings.js */ 24);
+/* harmony import */ var _utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/DialogBox.js */ 6);
+/* harmony import */ var _utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/JSONReviver.js */ 8);
+
+
+
+
+
+
+
+
+
+
+/* Message.js */
+function Message(filename="", msg="") {
+ this.filename = filename;
+ this.msg = msg;
+ this.recvd = false;
+}
+
+Message.prototype.toJSON = function() {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Generic_toJSON"])("Message", this);
+}
+
+
+Message.fromJSON = function(value) {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Generic_fromJSON"])(Message, value.data);
+}
+
+_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Reviver"].constructors.Message = Message;
+
+//Sends message to player, including a pop up
+function sendMessage(msg, forced=false) {
+ console.log("sending message: " + msg.filename);
+ msg.recvd = true;
+ if (forced || !_Settings_js__WEBPACK_IMPORTED_MODULE_6__["Settings"].SuppressMessages) {
+ showMessage(msg);
+ }
+ addMessageToServer(msg, "home");
+}
+
+function showMessage(msg) {
+ var txt = "Message received from unknown sender:
" +
+ "" + msg.msg + "
" +
+ "This message was saved as " + msg.filename + " onto your home computer.";
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_7__["dialogBoxCreate"])(txt);
+}
+
+//Adds a message to a server
+function addMessageToServer(msg, serverHostname) {
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_5__["GetServerByHostname"])(serverHostname);
+ if (server == null) {
+ console.log("WARNING: Did not locate " + serverHostname);
+ return;
+ }
+ for (var i = 0; i < server.messages.length; ++i) {
+ if (server.messages[i].filename === msg.filename) {
+ return; //Already exists
+ }
+ }
+ server.messages.push(msg);
+}
+
+//Checks if any of the 'timed' messages should be sent
+function checkForMessagesToSend() {
+ var jumper0 = Messages[MessageFilenames.Jumper0];
+ var jumper1 = Messages[MessageFilenames.Jumper1];
+ var jumper2 = Messages[MessageFilenames.Jumper2];
+ var jumper3 = Messages[MessageFilenames.Jumper3];
+ var jumper4 = Messages[MessageFilenames.Jumper4];
+ var cybersecTest = Messages[MessageFilenames.CyberSecTest];
+ var nitesecTest = Messages[MessageFilenames.NiteSecTest];
+ var bitrunnersTest = Messages[MessageFilenames.BitRunnersTest];
+ var redpill = Messages[MessageFilenames.RedPill];
+
+ var redpillOwned = false;
+ if (_Augmentations_js__WEBPACK_IMPORTED_MODULE_0__["Augmentations"][_Augmentations_js__WEBPACK_IMPORTED_MODULE_0__["AugmentationNames"].TheRedPill].owned) {
+ redpillOwned = true;
+ }
+
+ if (redpill && redpillOwned && _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].sourceFiles.length === 0 && !_RedPill_js__WEBPACK_IMPORTED_MODULE_4__["redPillFlag"] && !_Missions_js__WEBPACK_IMPORTED_MODULE_2__["inMission"]) {
+ if (!_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_7__["dialogBoxOpened"]) {
+ sendMessage(redpill, true);
+ }
+ } else if (redpill && redpillOwned) {
+ //If player has already destroyed a BitNode, message is not forced
+ if (!_RedPill_js__WEBPACK_IMPORTED_MODULE_4__["redPillFlag"] && !_Missions_js__WEBPACK_IMPORTED_MODULE_2__["inMission"] && !_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_7__["dialogBoxOpened"]) {
+ sendMessage(redpill);
+ }
+ } else if (jumper0 && !jumper0.recvd && _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill >= 25) {
+ sendMessage(jumper0);
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_1__["Programs"].Flight);
+ } else if (jumper1 && !jumper1.recvd && _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill >= 40) {
+ sendMessage(jumper1);
+ } else if (cybersecTest && !cybersecTest.recvd && _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill >= 50) {
+ sendMessage(cybersecTest);
+ } else if (jumper2 && !jumper2.recvd && _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill >= 175) {
+ sendMessage(jumper2);
+ } else if (nitesecTest && !nitesecTest.recvd && _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill >= 200) {
+ sendMessage(nitesecTest);
+ } else if (jumper3 && !jumper3.recvd && _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill >= 350) {
+ sendMessage(jumper3);
+ } else if (jumper4 && !jumper4.recvd && _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill >= 490) {
+ sendMessage(jumper4);
+ } else if (bitrunnersTest && !bitrunnersTest.recvd && _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill >= 500) {
+ sendMessage(bitrunnersTest);
+ }
+}
+
+function AddToAllMessages(msg) {
+ Messages[msg.filename] = msg;
+}
+
+let Messages = {}
+
+function loadMessages(saveString) {
+ Messages = JSON.parse(saveString, _utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_8__["Reviver"]);
+}
+
+let MessageFilenames = {
+ Jumper0: "j0.msg",
+ Jumper1: "j1.msg",
+ Jumper2: "j2.msg",
+ Jumper3: "j3.msg",
+ Jumper4: "j4.msg",
+ CyberSecTest: "csec-test.msg",
+ NiteSecTest: "nitesec-test.msg",
+ BitRunnersTest: "19dfj3l1nd.msg",
+ RedPill: "icarus.msg",
+}
+
+function initMessages() {
+ //Reset
+ Messages = {};
+
+ //jump3R Messages
+ AddToAllMessages(new Message(MessageFilenames.Jumper0,
+ "I know you can sense it. I know you're searching for it. " +
+ "It's why you spend night after " +
+ "night at your computer.
It's real, I've seen it. And I can " +
+ "help you find it. But not right now. You're not ready yet.
" +
+ "Use this program to track your progress
" +
+ "The fl1ght.exe program was added to your home computer
" +
+ "-jump3R"));
+ AddToAllMessages(new Message(MessageFilenames.Jumper1,
+ "Soon you will be contacted by a hacking group known as CyberSec. " +
+ "They can help you with your search.
" +
+ "You should join them, garner their favor, and " +
+ "exploit them for their Augmentations. But do not trust them. " +
+ "They are not what they seem. No one is.
" +
+ "-jump3R"));
+ AddToAllMessages(new Message(MessageFilenames.Jumper2,
+ "Do not try to save the world. There is no world to save. If " +
+ "you want to find the truth, worry only about yourself. Ethics and " +
+ "morals will get you killed.
Watch out for a hacking group known as NiteSec." +
+ "
-jump3R"));
+ AddToAllMessages(new Message(MessageFilenames.Jumper3,
+ "You must learn to walk before you can run. And you must " +
+ "run before you can fly. Look for the black hand.
" +
+ "I.I.I.I
-jump3R"));
+ AddToAllMessages(new Message(MessageFilenames.Jumper4,
+ "To find what you are searching for, you must understand the bits. " +
+ "The bits are all around us. The runners will help you.
" +
+ "-jump3R"));
+
+ //Messages from hacking factions
+ AddToAllMessages(new Message(MessageFilenames.CyberSecTest,
+ "We've been watching you. Your skills are very impressive. But you're wasting " +
+ "your talents. If you join us, you can put your skills to good use and change " +
+ "the world for the better. If you join us, we can unlock your full potential.
" +
+ "But first, you must pass our test. Find and hack our server using the Terminal.
" +
+ "-CyberSec"));
+ AddToAllMessages(new Message(MessageFilenames.NiteSecTest,
+ "People say that the corrupted governments and corporations rule the world. " +
+ "Yes, maybe they do. But do you know who everyone really fears? People " +
+ "like us. Because they can't hide from us. Because they can't fight shadows " +
+ "and ideas with bullets.
" +
+ "Join us, and people will fear you, too.
" +
+ "Find and hack our hidden server using the Terminal. Then, we will contact you again." +
+ "
-NiteSec"));
+ AddToAllMessages(new Message(MessageFilenames.BitRunnersTest,
+ "We know what you are doing. We know what drives you. We know " +
+ "what you are looking for.
" +
+ "We can help you find the answers.
" +
+ "run4theh111z"));
+
+ AddToAllMessages(new Message(MessageFilenames.RedPill,
+ "@)(#V%*N)@(#*)*C)@#%*)*V)@#(*%V@)(#VN%*)@#(*%
" +
+ ")@B(*#%)@)M#B*%V)____FIND___#$@)#%(B*)@#(*%B)
" +
+ "@_#(%_@#M(BDSPOMB__THE-CAVE_#)$(*@#$)@#BNBEGB
" +
+ "DFLSMFVMV)#@($*)@#*$MV)@#(*$V)M#(*$)M@(#*VM$)"));
+}
+
+
+
+
+/***/ }),
+/* 28 */
+/*!***********************!*\
+ !*** ./src/Script.js ***!
+ \***********************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateScriptEditorContent", function() { return updateScriptEditorContent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadAllRunningScripts", function() { return loadAllRunningScripts; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findRunningScript", function() { return findRunningScript; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunningScript", function() { return RunningScript; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Script", function() { return Script; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AllServersMap", function() { return AllServersMap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scriptEditorInit", function() { return scriptEditorInit; });
+/* harmony import */ var _Constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Constants.js */ 3);
+/* harmony import */ var _engine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./engine.js */ 5);
+/* harmony import */ var _Fconf_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Fconf.js */ 34);
+/* harmony import */ var _InteractiveTutorial_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./InteractiveTutorial.js */ 25);
+/* harmony import */ var _NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./NetscriptEvaluator.js */ 7);
+/* harmony import */ var _NetscriptFunctions_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./NetscriptFunctions.js */ 29);
+/* harmony import */ var _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./NetscriptWorker.js */ 20);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _Server_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Server.js */ 10);
+/* harmony import */ var _Settings_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Settings.js */ 24);
+/* harmony import */ var _Terminal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Terminal.js */ 22);
+/* harmony import */ var _TextFile_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./TextFile.js */ 41);
+/* harmony import */ var _utils_acorn_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils/acorn.js */ 35);
+/* harmony import */ var _utils_acorn_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_utils_acorn_js__WEBPACK_IMPORTED_MODULE_12__);
+/* harmony import */ var _utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utils/DialogBox.js */ 6);
+/* harmony import */ var _utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/JSONReviver.js */ 8);
+/* harmony import */ var _utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../utils/HelperFunctions.js */ 1);
+/* harmony import */ var _utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../utils/StringHelperFunctions.js */ 2);
+var ace = __webpack_require__(/*! brace */ 192);
+__webpack_require__(/*! brace/mode/javascript */ 191);
+__webpack_require__(/*! ../netscript */ 190);
+__webpack_require__(/*! brace/theme/chaos */ 189);
+__webpack_require__(/*! brace/theme/chrome */ 188);
+__webpack_require__(/*! brace/theme/monokai */ 187);
+__webpack_require__(/*! brace/theme/solarized_dark */ 186);
+__webpack_require__(/*! brace/theme/solarized_light */ 185);
+__webpack_require__(/*! brace/theme/terminal */ 184);
+__webpack_require__(/*! brace/theme/twilight */ 183);
+__webpack_require__(/*! brace/theme/xcode */ 182);
+__webpack_require__(/*! brace/keybinding/vim */ 181);
+__webpack_require__(/*! brace/keybinding/emacs */ 180);
+__webpack_require__(/*! brace/ext/language_tools */ 179);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var keybindings = {
+ ace: null,
+ vim: "ace/keyboard/vim",
+ emacs: "ace/keyboard/emacs",
+};
+
+var scriptEditorRamCheck = null, scriptEditorRamText = null;
+function scriptEditorInit() {
+ //Create buttons at the bottom of script editor
+ var wrapper = document.getElementById("script-editor-buttons-wrapper");
+ if (wrapper == null) {
+ console.log("Error finding 'script-editor-buttons-wrapper'");
+ return;
+ }
+ var closeButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_15__["createElement"])("a", {
+ class:"a-link-button", display:"inline-block",
+ innerText:"Save & Close (Ctrl + b)",
+ clickListener:()=>{
+ saveAndCloseScriptEditor();
+ return false;
+ }
+ });
+
+ scriptEditorRamText = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_15__["createElement"])("p", {
+ display:"inline-block", margin:"10px", id:"script-editor-status-text"
+ });
+
+ var checkboxLabel = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_15__["createElement"])("label", {
+ for:"script-editor-ram-check", margin:"4px", marginTop: "8px",
+ innerText:"Dynamic RAM Usage Checker", color:"white",
+ tooltip:"Enable/Disable the dynamic RAM Usage display. You may " +
+ "want to disable it for very long scripts because there may be " +
+ "performance issues"
+ });
+
+ scriptEditorRamCheck = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_15__["createElement"])("input", {
+ type:"checkbox", name:"script-editor-ram-check", id:"script-editor-ram-check",
+ margin:"4px", marginTop: "8px",
+ });
+ scriptEditorRamCheck.checked = true;
+
+ var documentationButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_15__["createElement"])("a", {
+ display:"inline-block", class:"a-link-button", innerText:"Netscript Documentation",
+ href:"https://bitburner.readthedocs.io/en/latest/index.html",
+ target:"_blank"
+ });
+
+ wrapper.appendChild(closeButton);
+ wrapper.appendChild(scriptEditorRamText);
+ wrapper.appendChild(scriptEditorRamCheck);
+ wrapper.appendChild(checkboxLabel);
+ wrapper.appendChild(documentationButton);
+
+ //Initialize ACE Script editor
+ var editor = ace.edit('javascript-editor');
+ editor.getSession().setMode('ace/mode/netscript');
+ editor.setTheme('ace/theme/monokai');
+ document.getElementById('javascript-editor').style.fontSize='16px';
+ editor.setOption("showPrintMargin", false);
+
+ /* Script editor options */
+ //Theme
+ var themeDropdown = document.getElementById("script-editor-option-theme");
+ if (_Settings_js__WEBPACK_IMPORTED_MODULE_9__["Settings"].EditorTheme) {
+ var initialIndex = 2;
+ for (var i = 0; i < themeDropdown.options.length; ++i) {
+ if (themeDropdown.options[i].value === _Settings_js__WEBPACK_IMPORTED_MODULE_9__["Settings"].EditorTheme) {
+ initialIndex = i;
+ break;
+ }
+ }
+ themeDropdown.selectedIndex = initialIndex;
+ } else {
+ themeDropdown.selectedIndex = 2;
+ }
+
+ themeDropdown.onchange = function() {
+ var val = themeDropdown.value;
+ _Settings_js__WEBPACK_IMPORTED_MODULE_9__["Settings"].EditorTheme = val;
+ var themePath = "ace/theme/" + val.toLowerCase();
+ editor.setTheme(themePath);
+ };
+ themeDropdown.onchange();
+
+ //Keybinding
+ var keybindingDropdown = document.getElementById("script-editor-option-keybinding");
+ if (_Settings_js__WEBPACK_IMPORTED_MODULE_9__["Settings"].EditorKeybinding) {
+ var initialIndex = 0;
+ for (var i = 0; i < keybindingDropdown.options.length; ++i) {
+ if (keybindingDropdown.options[i].value === _Settings_js__WEBPACK_IMPORTED_MODULE_9__["Settings"].EditorKeybinding) {
+ initialIndex = i;
+ break;
+ }
+ }
+ keybindingDropdown.selectedIndex = initialIndex;
+ } else {
+ keybindingDropdown.selectedIndex = 0;
+ }
+ keybindingDropdown.onchange = function() {
+ var val = keybindingDropdown.value;
+ _Settings_js__WEBPACK_IMPORTED_MODULE_9__["Settings"].EditorKeybinding = val;
+ editor.setKeyboardHandler(keybindings[val.toLowerCase()]);
+ };
+ keybindingDropdown.onchange();
+
+ //Highlight Active line
+ var highlightActiveChkBox = document.getElementById("script-editor-option-highlightactiveline");
+ highlightActiveChkBox.onchange = function() {
+ editor.setHighlightActiveLine(highlightActiveChkBox.checked);
+ };
+
+ //Show Invisibles
+ var showInvisiblesChkBox = document.getElementById("script-editor-option-showinvisibles");
+ showInvisiblesChkBox.onchange = function() {
+ editor.setShowInvisibles(showInvisiblesChkBox.checked);
+ };
+
+ //Use Soft Tab
+ var softTabChkBox = document.getElementById("script-editor-option-usesofttab");
+ softTabChkBox.onchange = function() {
+ editor.getSession().setUseSoftTabs(softTabChkBox.checked);
+ };
+
+ //Jshint Maxerr
+ var maxerr = document.getElementById("script-editor-option-maxerr");
+ var maxerrLabel = document.getElementById("script-editor-option-maxerror-value-label");
+ maxerrLabel.innerHTML = maxerr.value;
+ maxerr.onchange = function() {
+ editor.getSession().$worker.send("changeOptions", [{maxerr:maxerr.value}]);
+ maxerrLabel.innerHTML = maxerr.value;
+ }
+
+ //Configure some of the VIM keybindings
+ ace.config.loadModule('ace/keyboard/vim', function(module) {
+ var VimApi = module.CodeMirror.Vim;
+ VimApi.defineEx('write', 'w', function(cm, input) {
+ saveAndCloseScriptEditor();
+ });
+ VimApi.defineEx('quit', 'q', function(cm, input) {
+ _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].loadTerminalContent();
+ });
+ VimApi.defineEx('xwritequit', 'x', function(cm, input) {
+ saveAndCloseScriptEditor();
+ });
+ VimApi.defineEx('wqwritequit', 'wq', function(cm, input) {
+ saveAndCloseScriptEditor();
+ });
+ });
+
+ //Function autocompleter
+ editor.setOption("enableBasicAutocompletion", true);
+ var autocompleter = {
+ getCompletions: function(editor, session, pos, prefix, callback) {
+ if (prefix.length === 0) {callback(null, []); return;}
+ var words = [];
+ var fns = Object(_NetscriptFunctions_js__WEBPACK_IMPORTED_MODULE_5__["NetscriptFunctions"])(null);
+ for (var name in fns) {
+ if (fns.hasOwnProperty(name)) {
+ words.push({
+ name: name,
+ value: name,
+ });
+ }
+ }
+ callback(null, words);
+ },
+ }
+ editor.completers = [autocompleter];
+}
+
+//Updates RAM usage in script
+function updateScriptEditorContent() {
+ var filename = document.getElementById("script-editor-filename").value;
+ if (scriptEditorRamCheck == null || !scriptEditorRamCheck.checked || !filename.endsWith(".script")) {
+ scriptEditorRamText.innerText = "N/A";
+ return;
+ }
+ var editor = ace.edit('javascript-editor');
+ var code = editor.getValue();
+ var codeCopy = code.repeat(1);
+ var ramUsage = calculateRamUsage(codeCopy);
+ if (ramUsage !== -1) {
+ scriptEditorRamText.innerText = "RAM: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_16__["formatNumber"])(ramUsage, 2).toString() + "GB";
+ } else {
+ scriptEditorRamText.innerText = "RAM: Syntax Error";
+ }
+}
+
+//Define key commands in script editor (ctrl o to save + close, etc.)
+$(document).keydown(function(e) {
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].Page.ScriptEditor) {
+ //Ctrl + b
+ if (e.keyCode == 66 && (e.ctrlKey || e.metaKey)) {
+ e.preventDefault();
+ saveAndCloseScriptEditor();
+ }
+ }
+});
+
+function saveAndCloseScriptEditor() {
+ var filename = document.getElementById("script-editor-filename").value;
+ var editor = ace.edit('javascript-editor');
+ var code = editor.getValue();
+ if (_InteractiveTutorial_js__WEBPACK_IMPORTED_MODULE_3__["iTutorialIsRunning"] && _InteractiveTutorial_js__WEBPACK_IMPORTED_MODULE_3__["currITutorialStep"] == _InteractiveTutorial_js__WEBPACK_IMPORTED_MODULE_3__["iTutorialSteps"].TerminalTypeScript) {
+ if (filename != "foodnstuff.script") {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_13__["dialogBoxCreate"])("Leave the script name as 'foodnstuff'!");
+ return;
+ }
+ code = code.replace(/\s/g, "");
+ if (code.indexOf("while(true){hack('foodnstuff');}") == -1) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_13__["dialogBoxCreate"])("Please copy and paste the code from the tutorial!");
+ return;
+ }
+ Object(_InteractiveTutorial_js__WEBPACK_IMPORTED_MODULE_3__["iTutorialNextStep"])();
+ }
+
+ if (filename == "") {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_13__["dialogBoxCreate"])("You must specify a filename!");
+ return;
+ }
+
+ if (checkValidFilename(filename) == false) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_13__["dialogBoxCreate"])("Script filename can contain only alphanumerics, hyphens, and underscores");
+ return;
+ }
+
+ var s = _Player_js__WEBPACK_IMPORTED_MODULE_7__["Player"].getCurrentServer();
+ if (filename === ".fconf") {
+ try {
+ Object(_Fconf_js__WEBPACK_IMPORTED_MODULE_2__["parseFconfSettings"])(code);
+ } catch(e) {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_13__["dialogBoxCreate"])("Invalid .fconf file");
+ return;
+ }
+ } else if (filename.endsWith(".script")) {
+ //If the current script already exists on the server, overwrite it
+ for (var i = 0; i < s.scripts.length; i++) {
+ if (filename == s.scripts[i].filename) {
+ s.scripts[i].saveScript();
+ _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].loadTerminalContent();
+ return;
+ }
+ }
+
+ //If the current script does NOT exist, create a new one
+ var script = new Script();
+ script.saveScript();
+ s.scripts.push(script);
+ } else if (filename.endsWith(".txt")) {
+ for (var i = 0; i < s.textFiles.length; ++i) {
+ if (s.textFiles[i].fn === filename) {
+ s.textFiles[i].write(code);
+ _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].loadTerminalContent();
+ return;
+ }
+ }
+ var textFile = new _TextFile_js__WEBPACK_IMPORTED_MODULE_11__["TextFile"](filename, code);
+ s.textFiles.push(textFile);
+ } else {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_13__["dialogBoxCreate"])("Invalid filename. Must be either a script (.script) or " +
+ " or text file (.txt)")
+ return;
+ }
+ _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].loadTerminalContent();
+}
+
+//Checks that the string contains only valid characters for a filename, which are alphanumeric,
+// underscores, hyphens, and dots
+function checkValidFilename(filename) {
+ var regex = /^[.a-zA-Z0-9_-]+$/;
+
+ if (filename.match(regex)) {
+ return true;
+ }
+ return false;
+}
+
+function Script() {
+ this.filename = "";
+ this.code = "";
+ this.ramUsage = 0;
+ this.server = ""; //IP of server this script is on
+};
+
+//Get the script data from the Script Editor and save it to the object
+Script.prototype.saveScript = function() {
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].Page.ScriptEditor) {
+ //Update code and filename
+ var editor = ace.edit('javascript-editor');
+ var code = editor.getValue();
+ this.code = code.replace(/^\s+|\s+$/g, '');
+
+ var filename = document.getElementById("script-editor-filename").value;
+ this.filename = filename;
+
+ //Server
+ this.server = _Player_js__WEBPACK_IMPORTED_MODULE_7__["Player"].currentServer;
+
+ //Calculate/update ram usage, execution time, etc.
+ this.updateRamUsage();
+ }
+}
+
+//Updates how much RAM the script uses when it is running.
+Script.prototype.updateRamUsage = function() {
+ var codeCopy = this.code.repeat(1);
+ var res = calculateRamUsage(codeCopy);
+ if (res !== -1) {
+ this.ramUsage = res;
+ }
+}
+
+function calculateRamUsage(codeCopy) {
+ //Create a temporary/mock WorkerScript and an AST from the code
+ var currServ = _Player_js__WEBPACK_IMPORTED_MODULE_7__["Player"].getCurrentServer();
+ var workerScript = new _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_6__["WorkerScript"]({
+ filename:"foo",
+ scriptRef: {code:""},
+ args:[]
+ });
+ workerScript.checkingRam = true; //Netscript functions will return RAM usage
+ workerScript.serverIp = currServ.ip;
+
+ try {
+ var ast = Object(_utils_acorn_js__WEBPACK_IMPORTED_MODULE_12__["parse"])(codeCopy, {sourceType:"module"});
+ } catch(e) {
+ return -1;
+ }
+
+ //Search through AST, scanning for any 'Identifier' nodes for functions, or While/For/If nodes
+ var queue = [], ramUsage = 1.4;
+ var whileUsed = false, forUsed = false, ifUsed = false;
+ queue.push(ast);
+ while (queue.length != 0) {
+ var exp = queue.shift();
+ switch (exp.type) {
+ case "ImportDeclaration":
+ //Gets an array of all imported functions as AST expressions
+ //and pushes them on the queue.
+ var res = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_4__["evaluateImport"])(exp, workerScript, true);
+ for (var i = 0; i < res.length; ++i) {
+ queue.push(res[i]);
+ }
+ break;
+ case "BlockStatement":
+ case "Program":
+ for (var i = 0; i < exp.body.length; ++i) {
+ if (exp.body[i] instanceof _utils_acorn_js__WEBPACK_IMPORTED_MODULE_12__["Node"]) {
+ queue.push(exp.body[i]);
+ }
+ }
+ break;
+ case "WhileStatement":
+ if (!whileUsed) {
+ ramUsage += _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].ScriptWhileRamCost;
+ whileUsed = true;
+ }
+ break;
+ case "ForStatement":
+ if (!forUsed) {
+ ramUsage += _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].ScriptForRamCost;
+ forUsed = true;
+ }
+ break;
+ case "IfStatement":
+ if (!ifUsed) {
+ ramUsage += _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].ScriptIfRamCost;
+ ifUsed = true;
+ }
+ break;
+ case "Identifier":
+ if (exp.name in workerScript.env.vars) {
+ var func = workerScript.env.get(exp.name);
+ if (typeof func === "function") {
+ try {
+ var res = func.apply(null, []);
+ if (typeof res === "number") {
+ ramUsage += res;
+ }
+ } catch(e) {
+ console.log("ERROR applying function: " + e);
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ for (var prop in exp) {
+ if (exp.hasOwnProperty(prop)) {
+ if (exp[prop] instanceof _utils_acorn_js__WEBPACK_IMPORTED_MODULE_12__["Node"]) {
+ queue.push(exp[prop]);
+ }
+ }
+ }
+ }
+
+ //Special case: hacknetnodes array
+ if (codeCopy.includes("hacknetnodes")) {
+ ramUsage += _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].ScriptHacknetNodesRamCost;
+ }
+ return ramUsage;
+}
+
+Script.prototype.download = function() {
+ var filename = this.filename + ".js";
+ var file = new Blob([this.code], {type: 'text/plain'});
+ if (window.navigator.msSaveOrOpenBlob) {// IE10+
+ window.navigator.msSaveOrOpenBlob(file, filename);
+ } else { // Others
+ var a = document.createElement("a"),
+ url = URL.createObjectURL(file);
+ a.href = url;
+ a.download = filename;
+ document.body.appendChild(a);
+ a.click();
+ setTimeout(function() {
+ document.body.removeChild(a);
+ window.URL.revokeObjectURL(url);
+ }, 0);
+ }
+}
+
+Script.prototype.toJSON = function() {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Generic_toJSON"])("Script", this);
+}
+
+
+Script.fromJSON = function(value) {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Generic_fromJSON"])(Script, value.data);
+}
+
+_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Reviver"].constructors.Script = Script;
+
+//Called when the game is loaded. Loads all running scripts (from all servers)
+//into worker scripts so that they will start running
+function loadAllRunningScripts() {
+ var count = 0;
+ var total = 0;
+ for (var property in _Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"]) {
+ if (_Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"].hasOwnProperty(property)) {
+ var server = _Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"][property];
+
+ //Reset each server's RAM usage to 0
+ server.ramUsed = 0;
+
+ for (var j = 0; j < server.runningScripts.length; ++j) {
+ count++;
+ Object(_NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_6__["addWorkerScript"])(server.runningScripts[j], server);
+
+ //Offline production
+ total += scriptCalculateOfflineProduction(server.runningScripts[j]);
+ }
+ }
+ }
+ return total;
+ console.log("Loaded " + count.toString() + " running scripts");
+}
+
+function scriptCalculateOfflineProduction(runningScriptObj) {
+ //The Player object stores the last update time from when we were online
+ var thisUpdate = new Date().getTime();
+ var lastUpdate = _Player_js__WEBPACK_IMPORTED_MODULE_7__["Player"].lastUpdate;
+ var timePassed = (thisUpdate - lastUpdate) / 1000; //Seconds
+ console.log("Offline for " + timePassed + " seconds");
+
+ //Calculate the "confidence" rating of the script's true production. This is based
+ //entirely off of time. We will arbitrarily say that if a script has been running for
+ //4 hours (14400 sec) then we are completely confident in its ability
+ var confidence = (runningScriptObj.onlineRunningTime) / 14400;
+ if (confidence >= 1) {confidence = 1;}
+
+ //Data map: [MoneyStolen, NumTimesHacked, NumTimesGrown, NumTimesWeaken]
+
+ //Grow
+ for (var ip in runningScriptObj.dataMap) {
+ if (runningScriptObj.dataMap.hasOwnProperty(ip)) {
+ if (runningScriptObj.dataMap[ip][2] == 0 || runningScriptObj.dataMap[ip][2] == null) {continue;}
+ var serv = _Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"][ip];
+ if (serv == null) {continue;}
+ var timesGrown = Math.round(0.5 * runningScriptObj.dataMap[ip][2] / runningScriptObj.onlineRunningTime * timePassed);
+ console.log(runningScriptObj.filename + " called grow() on " + serv.hostname + " " + timesGrown + " times while offline");
+ runningScriptObj.log("Called grow() on " + serv.hostname + " " + timesGrown + " times while offline");
+ var growth = Object(_Server_js__WEBPACK_IMPORTED_MODULE_8__["processSingleServerGrowth"])(serv, timesGrown * 450);
+ runningScriptObj.log(serv.hostname + " grown by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_16__["formatNumber"])(growth * 100 - 100, 6) + "% from grow() calls made while offline");
+ }
+ }
+
+ var totalOfflineProduction = 0;
+ for (var ip in runningScriptObj.dataMap) {
+ if (runningScriptObj.dataMap.hasOwnProperty(ip)) {
+ if (runningScriptObj.dataMap[ip][0] == 0 || runningScriptObj.dataMap[ip][0] == null) {continue;}
+ var serv = _Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"][ip];
+ if (serv == null) {continue;}
+ var production = 0.5 * runningScriptObj.dataMap[ip][0] / runningScriptObj.onlineRunningTime * timePassed;
+ production *= confidence;
+ if (production > serv.moneyAvailable) {
+ production = serv.moneyAvailable;
+ }
+ totalOfflineProduction += production;
+ _Player_js__WEBPACK_IMPORTED_MODULE_7__["Player"].gainMoney(production);
+ console.log(runningScriptObj.filename + " generated $" + production + " while offline by hacking " + serv.hostname);
+ runningScriptObj.log(runningScriptObj.filename + " generated $" + production + " while offline by hacking " + serv.hostname);
+ serv.moneyAvailable -= production;
+ if (serv.moneyAvailable < 0) {serv.moneyAvailable = 0;}
+ if (isNaN(serv.moneyAvailable)) {serv.moneyAvailable = 0;}
+ }
+ }
+
+ //Offline EXP gain
+ //A script's offline production will always be at most half of its online production.
+ var expGain = 0.5 * (runningScriptObj.onlineExpGained / runningScriptObj.onlineRunningTime) * timePassed;
+ expGain *= confidence;
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_7__["Player"].gainHackingExp(expGain);
+
+ //Update script stats
+ runningScriptObj.offlineMoneyMade += totalOfflineProduction;
+ runningScriptObj.offlineRunningTime += timePassed;
+ runningScriptObj.offlineExpGained += expGain;
+
+ //Fortify a server's security based on how many times it was hacked
+ for (var ip in runningScriptObj.dataMap) {
+ if (runningScriptObj.dataMap.hasOwnProperty(ip)) {
+ if (runningScriptObj.dataMap[ip][1] == 0 || runningScriptObj.dataMap[ip][1] == null) {continue;}
+ var serv = _Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"][ip];
+ if (serv == null) {continue;}
+ var timesHacked = Math.round(0.5 * runningScriptObj.dataMap[ip][1] / runningScriptObj.onlineRunningTime * timePassed);
+ console.log(runningScriptObj.filename + " hacked " + serv.hostname + " " + timesHacked + " times while offline");
+ runningScriptObj.log("Hacked " + serv.hostname + " " + timesHacked + " times while offline");
+ serv.fortify(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].ServerFortifyAmount * timesHacked);
+ }
+ }
+
+ //Weaken
+ for (var ip in runningScriptObj.dataMap) {
+ if (runningScriptObj.dataMap.hasOwnProperty(ip)) {
+ if (runningScriptObj.dataMap[ip][3] == 0 || runningScriptObj.dataMap[ip][3] == null) {continue;}
+ var serv = _Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"][ip];
+ if (serv == null) {continue;}
+ var timesWeakened = Math.round(0.5 * runningScriptObj.dataMap[ip][3] / runningScriptObj.onlineRunningTime * timePassed);
+ console.log(runningScriptObj.filename + " called weaken() on " + serv.hostname + " " + timesWeakened + " times while offline");
+ runningScriptObj.log("Called weaken() on " + serv.hostname + " " + timesWeakened + " times while offline");
+ serv.weaken(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].ServerWeakenAmount * timesWeakened);
+ }
+ }
+
+ return totalOfflineProduction;
+}
+
+//Returns a RunningScript object matching the filename and arguments on the
+//designated server, and false otherwise
+function findRunningScript(filename, args, server) {
+ for (var i = 0; i < server.runningScripts.length; ++i) {
+ if (server.runningScripts[i].filename == filename &&
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_15__["compareArrays"])(server.runningScripts[i].args, args)) {
+ return server.runningScripts[i];
+ }
+ }
+ return null;
+}
+
+function RunningScript(script, args) {
+ if (script == null || script == undefined) {return;}
+ this.filename = script.filename;
+ this.args = args;
+ this.scriptRef = script;
+ this.server = script.server; //IP Address only
+
+ this.logs = []; //Script logging. Array of strings, with each element being a log entry
+ this.logUpd = false;
+
+ //Stats to display on the Scripts menu, and used to determine offline progress
+ this.offlineRunningTime = 0.01; //Seconds
+ this.offlineMoneyMade = 0;
+ this.offlineExpGained = 0;
+ this.onlineRunningTime = 0.01; //Seconds
+ this.onlineMoneyMade = 0;
+ this.onlineExpGained = 0;
+
+ this.threads = 1;
+
+ //[MoneyStolen, NumTimesHacked, NumTimesGrown, NumTimesWeaken]
+ this.dataMap = new AllServersMap([0, 0, 0, 0], true);
+}
+
+RunningScript.prototype.log = function(txt) {
+ if (this.logs.length > _Settings_js__WEBPACK_IMPORTED_MODULE_9__["Settings"].MaxLogCapacity) {
+ //Delete first element and add new log entry to the end.
+ //TODO Eventually it might be better to replace this with circular array
+ //to improve performance
+ this.logs.shift();
+ }
+ this.logs.push(txt);
+ this.logUpd = true;
+}
+
+RunningScript.prototype.displayLog = function() {
+ for (var i = 0; i < this.logs.length; ++i) {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_10__["post"])(this.logs[i]);
+ }
+}
+
+RunningScript.prototype.clearLog = function() {
+ this.logs.length = 0;
+}
+
+//Update the moneyStolen and numTimesHack maps when hacking
+RunningScript.prototype.recordHack = function(serverIp, moneyGained, n=1) {
+ if (this.dataMap == null) {
+ //[MoneyStolen, NumTimesHacked, NumTimesGrown, NumTimesWeaken]
+ this.dataMap = new AllServersMap([0, 0, 0, 0], true);
+ }
+ this.dataMap[serverIp][0] += moneyGained;
+ this.dataMap[serverIp][1] += n;
+}
+
+//Update the grow map when calling grow()
+RunningScript.prototype.recordGrow = function(serverIp, n=1) {
+ if (this.dataMap == null) {
+ //[MoneyStolen, NumTimesHacked, NumTimesGrown, NumTimesWeaken]
+ this.dataMap = new AllServersMap([0, 0, 0, 0], true);
+ }
+ this.dataMap[serverIp][2] += n;
+}
+
+//Update the weaken map when calling weaken() {
+RunningScript.prototype.recordWeaken = function(serverIp, n=1) {
+ if (this.dataMap == null) {
+ //[MoneyStolen, NumTimesHacked, NumTimesGrown, NumTimesWeaken]
+ this.dataMap = new AllServersMap([0, 0, 0, 0], true);
+ }
+ this.dataMap[serverIp][3] += n;
+}
+
+RunningScript.prototype.toJSON = function() {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Generic_toJSON"])("RunningScript", this);
+}
+
+
+RunningScript.fromJSON = function(value) {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Generic_fromJSON"])(RunningScript, value.data);
+}
+
+_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Reviver"].constructors.RunningScript = RunningScript;
+
+//Creates an object that creates a map/dictionary with the IP of each existing server as
+//a key. Initializes every key with a specified value that can either by a number or an array
+function AllServersMap(arr=false, filterOwned=false) {
+ for (var ip in _Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"]) {
+ if (_Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"].hasOwnProperty(ip)) {
+ if (filterOwned && (_Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"][ip].purchasedByPlayer || _Server_js__WEBPACK_IMPORTED_MODULE_8__["AllServers"][ip].hostname === "home")) {
+ continue;
+ }
+ if (arr) {
+ this[ip] = [0, 0, 0, 0];
+ } else {
+ this[ip] = 0;
+ }
+ }
+ }
+}
+
+AllServersMap.prototype.toJSON = function() {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Generic_toJSON"])("AllServersMap", this);
+}
+
+
+AllServersMap.fromJSON = function(value) {
+ return Object(_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Generic_fromJSON"])(AllServersMap, value.data);
+}
+
+_utils_JSONReviver_js__WEBPACK_IMPORTED_MODULE_14__["Reviver"].constructors.AllServersMap = AllServersMap;
+
+
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ 38)))
+
+/***/ }),
+/* 29 */
+/*!***********************************!*\
+ !*** ./src/NetscriptFunctions.js ***!
+ \***********************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NetscriptFunctions", function() { return NetscriptFunctions; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initSingularitySFFlags", function() { return initSingularitySFFlags; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasSingularitySF", function() { return hasSingularitySF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasBn11SF", function() { return hasBn11SF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasWallStreetSF", function() { return hasWallStreetSF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wallStreetSFLvl", function() { return wallStreetSFLvl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasCorporationSF", function() { return hasCorporationSF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasAISF", function() { return hasAISF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasBladeburnerSF", function() { return hasBladeburnerSF; });
+/* harmony import */ var _ActiveScriptsUI_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ActiveScriptsUI.js */ 43);
+/* harmony import */ var _Augmentations_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Augmentations.js */ 18);
+/* harmony import */ var _BitNode_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./BitNode.js */ 15);
+/* harmony import */ var _Crimes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Crimes.js */ 19);
+/* harmony import */ var _Company_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Company.js */ 9);
+/* harmony import */ var _Constants_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Constants.js */ 3);
+/* harmony import */ var _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CreateProgram.js */ 14);
+/* harmony import */ var _DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./DarkWeb.js */ 33);
+/* harmony import */ var _engine_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./engine.js */ 5);
+/* harmony import */ var _Faction_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Faction.js */ 11);
+/* harmony import */ var _HacknetNode_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./HacknetNode.js */ 39);
+/* harmony import */ var _Location_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Location.js */ 4);
+/* harmony import */ var _Message_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Message.js */ 27);
+/* harmony import */ var _Missions_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Missions.js */ 32);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _Script_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Script.js */ 28);
+/* harmony import */ var _Server_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Server.js */ 10);
+/* harmony import */ var _Settings_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Settings.js */ 24);
+/* harmony import */ var _SpecialServerIps_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./SpecialServerIps.js */ 17);
+/* harmony import */ var _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./StockMarket.js */ 21);
+/* harmony import */ var _Terminal_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Terminal.js */ 22);
+/* harmony import */ var _TextFile_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./TextFile.js */ 41);
+/* harmony import */ var _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./NetscriptWorker.js */ 20);
+/* harmony import */ var _NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./NetscriptEvaluator.js */ 7);
+/* harmony import */ var _NetscriptEnvironment_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./NetscriptEnvironment.js */ 67);
+/* harmony import */ var _NetscriptPort_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./NetscriptPort.js */ 45);
+/* harmony import */ var _utils_decimal_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../utils/decimal.js */ 23);
+/* harmony import */ var _utils_decimal_js__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(_utils_decimal_js__WEBPACK_IMPORTED_MODULE_26__);
+/* harmony import */ var _utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../utils/DialogBox.js */ 6);
+/* harmony import */ var _utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../utils/HelperFunctions.js */ 1);
+/* harmony import */ var _utils_IPAddress_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../utils/IPAddress.js */ 16);
+/* harmony import */ var _utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../utils/StringHelperFunctions.js */ 2);
+/* harmony import */ var _utils_YesNoBox_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../utils/YesNoBox.js */ 12);
+var sprintf = __webpack_require__(/*! sprintf-js */ 82).sprintf,
+ vsprintf = __webpack_require__(/*! sprintf-js */ 82).vsprintf
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var hasCorporationSF=false, //Source-File 3
+ hasSingularitySF=false, //Source-File 4
+ hasAISF=false, //Source-File 5
+ hasBladeburnerSF=false, //Source-File 6
+ hasWallStreetSF=false, //Source-File 8
+ hasBn11SF=false; //Source-File 11
+
+
+
+var singularitySFLvl=1, wallStreetSFLvl=1;
+
+//Used to check and set flags for every Source File, despite the name of the function
+function initSingularitySFFlags() {
+ for (var i = 0; i < _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].sourceFiles.length; ++i) {
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].sourceFiles[i].n === 3) {
+ hasCorporationSF = true;
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].sourceFiles[i].n === 4) {
+ hasSingularitySF = true;
+ singularitySFLvl = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].sourceFiles[i].lvl;
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].sourceFiles[i].n === 5) {
+ hasAISF = true;
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].sourceFiles[i].n === 6) {
+ hasBladeburnerSF = true;
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].sourceFiles[i].n === 8) {
+ hasWallStreetSF = true;
+ wallStreetSFLvl = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].sourceFiles[i].lvl;
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].sourceFiles[i].n === 11) {
+ hasBn11SF = true;
+ }
+ }
+}
+
+function NetscriptFunctions(workerScript) {
+ return {
+ Math : Math,
+ Date : Date,
+ Number : Number,
+ hacknetnodes : _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacknetNodes,
+ sprintf : sprintf,
+ vsprintf: vsprintf,
+ scan : function(ip=workerScript.serverIp, hostnames=true){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.scan) {
+ return 0;
+ } else {
+ workerScript.loadedFns.scan = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptScanRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, 'Invalid IP or hostname passed into scan() command');
+ }
+ var out = [];
+ for (var i = 0; i < server.serversOnNetwork.length; i++) {
+ var entry;
+ if (hostnames) {
+ entry = server.getServerOnNetwork(i).hostname;
+ } else {
+ entry = server.getServerOnNetwork(i).ip;
+ }
+ if (entry == null) {
+ continue;
+ }
+ out.push(entry);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.scan == null) {
+ workerScript.scriptRef.log('scan() returned ' + server.serversOnNetwork.length + ' connections for ' + server.hostname);
+ }
+ return out;
+ },
+ hack : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.hack) {
+ return 0;
+ } else {
+ workerScript.loadedFns.hack = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptHackRamCost;
+ }
+ }
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Hack() call has incorrect number of arguments. Takes 1 argument");
+ }
+ var threads = workerScript.scriptRef.threads;
+ if (isNaN(threads) || threads < 1) {threads = 1;}
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("hack() error. Invalid IP or hostname passed in: " + ip + ". Stopping...");
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "hack() error. Invalid IP or hostname passed in: " + ip + ". Stopping...");
+ }
+
+ //Calculate the hacking time
+ var hackingTime = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateHackingTime"])(server); //This is in seconds
+
+ //No root access or skill level too low
+ if (server.hasAdminRights == false) {
+ workerScript.scriptRef.log("Cannot hack this server (" + server.hostname + ") because user does not have root access");
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot hack this server (" + server.hostname + ") because user does not have root access");
+ }
+
+ if (server.requiredHackingSkill > _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill) {
+ workerScript.scriptRef.log("Cannot hack this server (" + server.hostname + ") because user's hacking skill is not high enough");
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot hack this server (" + server.hostname + ") because user's hacking skill is not high enough");
+ }
+
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.hack == null) {
+ workerScript.scriptRef.log("Attempting to hack " + ip + " in " + hackingTime.toFixed(3) + " seconds (t=" + threads + ")");
+ }
+ return Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["netscriptDelay"])(hackingTime* 1000, workerScript).then(function() {
+ if (workerScript.env.stopFlag) {return Promise.reject(workerScript);}
+ var hackChance = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateHackingChance"])(server);
+ var rand = Math.random();
+ var expGainedOnSuccess = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateExpGain"])(server) * threads;
+ var expGainedOnFailure = (expGainedOnSuccess / 4);
+ if (rand < hackChance) { //Success!
+ var moneyGained = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculatePercentMoneyHacked"])(server);
+ moneyGained = Math.floor(server.moneyAvailable * moneyGained) * threads;
+
+ //Over-the-top safety checks
+ if (moneyGained <= 0) {
+ moneyGained = 0;
+ expGainedOnSuccess = expGainedOnFailure;
+ }
+ if (moneyGained > server.moneyAvailable) {moneyGained = server.moneyAvailable;}
+ server.moneyAvailable -= moneyGained;
+ if (server.moneyAvailable < 0) {server.moneyAvailable = 0;}
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainMoney(moneyGained);
+ workerScript.scriptRef.onlineMoneyMade += moneyGained;
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].scriptProdSinceLastAug += moneyGained;
+ workerScript.scriptRef.recordHack(server.ip, moneyGained, threads);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainHackingExp(expGainedOnSuccess);
+ workerScript.scriptRef.onlineExpGained += expGainedOnSuccess;
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.hack == null) {
+ workerScript.scriptRef.log("Script SUCCESSFULLY hacked " + server.hostname + " for $" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(moneyGained, 2) + " and " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(expGainedOnSuccess, 4) + " exp (t=" + threads + ")");
+ }
+ server.fortify(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ServerFortifyAmount * threads);
+ return Promise.resolve(moneyGained);
+ } else {
+ //Player only gains 25% exp for failure?
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainHackingExp(expGainedOnFailure);
+ workerScript.scriptRef.onlineExpGained += expGainedOnFailure;
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.hack == null) {
+ workerScript.scriptRef.log("Script FAILED to hack " + server.hostname + ". Gained " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(expGainedOnFailure, 4) + " exp (t=" + threads + ")");
+ }
+ return Promise.resolve(0);
+ }
+ });
+ },
+ sleep : function(time){
+ if (workerScript.checkingRam) {return 0;}
+ if (time === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "sleep() call has incorrect number of arguments. Takes 1 argument");
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.sleep == null) {
+ workerScript.scriptRef.log("Sleeping for " + time + " milliseconds");
+ }
+ return Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["netscriptDelay"])(time, workerScript).then(function() {
+ return Promise.resolve(true);
+ });
+ },
+ grow : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.grow) {
+ return 0;
+ } else {
+ workerScript.loadedFns.grow = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGrowRamCost;
+ }
+ }
+ var threads = workerScript.scriptRef.threads;
+ if (isNaN(threads) || threads < 1) {threads = 1;}
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "grow() call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("Cannot grow(). Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot grow(). Invalid IP or hostname passed in: " + ip);
+ }
+
+ //No root access or skill level too low
+ if (server.hasAdminRights == false) {
+ workerScript.scriptRef.log("Cannot grow this server (" + server.hostname + ") because user does not have root access");
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot grow this server (" + server.hostname + ") because user does not have root access");
+ }
+
+ var growTime = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateGrowTime"])(server);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.grow == null) {
+ workerScript.scriptRef.log("Executing grow() on server " + server.hostname + " in " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(growTime/1000, 3) + " seconds (t=" + threads + ")");
+ }
+ return Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["netscriptDelay"])(growTime, workerScript).then(function() {
+ if (workerScript.env.stopFlag) {return Promise.reject(workerScript);}
+ server.moneyAvailable += (1 * threads); //It can be grown even if it has no money
+ var growthPercentage = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["processSingleServerGrowth"])(server, 450 * threads);
+ workerScript.scriptRef.recordGrow(server.ip, threads);
+ var expGain = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateExpGain"])(server) * threads;
+ if (growthPercentage == 1) {
+ expGain = 0;
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.grow == null) {
+ workerScript.scriptRef.log("Available money on " + server.hostname + " grown by " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(growthPercentage*100 - 100, 6) + "%. Gained " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(expGain, 4) + " hacking exp (t=" + threads +")");
+ }
+ workerScript.scriptRef.onlineExpGained += expGain;
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainHackingExp(expGain);
+ return Promise.resolve(growthPercentage);
+ });
+ },
+ weaken : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.weaken) {
+ return 0;
+ } else {
+ workerScript.loadedFns.weaken = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptWeakenRamCost;
+ }
+ }
+ var threads = workerScript.scriptRef.threads;
+ if (isNaN(threads) || threads < 1) {threads = 1;}
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "weaken() call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("Cannot weaken(). Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot weaken(). Invalid IP or hostname passed in: " + ip);
+ }
+
+ //No root access or skill level too low
+ if (server.hasAdminRights == false) {
+ workerScript.scriptRef.log("Cannot weaken this server (" + server.hostname + ") because user does not have root access");
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot weaken this server (" + server.hostname + ") because user does not have root access");
+ }
+
+ var weakenTime = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateWeakenTime"])(server);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.weaken == null) {
+ workerScript.scriptRef.log("Executing weaken() on server " + server.hostname + " in " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(weakenTime/1000, 3) + " seconds (t=" + threads + ")");
+ }
+ return Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["netscriptDelay"])(weakenTime, workerScript).then(function() {
+ if (workerScript.env.stopFlag) {return Promise.reject(workerScript);}
+ server.weaken(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ServerWeakenAmount * threads);
+ workerScript.scriptRef.recordWeaken(server.ip, threads);
+ var expGain = Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateExpGain"])(server) * threads;
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.weaken == null) {
+ workerScript.scriptRef.log("Server security level on " + server.hostname + " weakened to " + server.hackDifficulty +
+ ". Gained " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(expGain, 4) + " hacking exp (t=" + threads + ")");
+ }
+ workerScript.scriptRef.onlineExpGained += expGain;
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainHackingExp(expGain);
+ return Promise.resolve(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ServerWeakenAmount * threads);
+ });
+ },
+ print : function(args){
+ if (workerScript.checkingRam) {return 0;}
+ if (args === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "print() call has incorrect number of arguments. Takes 1 argument");
+ }
+ workerScript.scriptRef.log(args.toString());
+ },
+ tprint : function(args) {
+ if (workerScript.checkingRam) {return 0;}
+ if (args === undefined || args == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "tprint() call has incorrect number of arguments. Takes 1 argument");
+ }
+ var x = args.toString();
+ if (Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["isHTML"])(x)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].takeDamage(1);
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_27__["dialogBoxCreate"])("You suddenly feel a sharp shooting pain through your body as an angry voice in your head exclaims:
" +
+ "DON'T USE TPRINT() TO OUTPUT HTML ELEMENTS TO YOUR TERMINAL!!!!
" +
+ "(You lost 1 HP)");
+ return;
+ }
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_20__["post"])(workerScript.scriptRef.filename + ": " + args.toString());
+ },
+ clearLog : function() {
+ if (workerScript.checkingRam) {return 0;}
+ workerScript.scriptRef.clearLog();
+ },
+ disableLog : function(fn) {
+ if (workerScript.checkingRam) {return 0;}
+ workerScript.disableLogs[fn] = true;
+ workerScript.scriptRef.log("Disabled logging for " + fn);
+ },
+ enableLog : function(fn) {
+ if (workerScript.checkingRam) {return 0;}
+ delete workerScript.disableLogs[fn];
+ workerScript.scriptRef.log("Enabled logging for " + fn);
+ },
+ nuke : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.nuke) {
+ return 0;
+ } else {
+ workerScript.loadedFns.nuke = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPortProgramRamCost;
+ }
+ }
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Program call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("Cannot call nuke(). Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot call nuke(). Invalid IP or hostname passed in: " + ip);
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasProgram(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].NukeProgram)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You do not have the NUKE.exe virus!");
+ }
+ if (server.openPortCount < server.numOpenPortsRequired) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Not enough ports opened to use NUKE.exe virus");
+ }
+ if (server.hasAdminRights) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.nuke == null) {
+ workerScript.scriptRef.log("Already have root access to " + server.hostname);
+ }
+ } else {
+ server.hasAdminRights = true;
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.nuke == null) {
+ workerScript.scriptRef.log("Executed NUKE.exe virus on " + server.hostname + " to gain root access");
+ }
+ }
+ return true;
+ },
+ brutessh : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.brutessh) {
+ return 0;
+ } else {
+ workerScript.loadedFns.brutessh = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPortProgramRamCost;
+ }
+ }
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Program call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("Cannot call brutessh(). Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot call brutessh(). Invalid IP or hostname passed in: " + ip);
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasProgram(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].BruteSSHProgram)) {
+ workerScript.scriptRef.log("You do not have the BruteSSH.exe program!");
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You do not have the BruteSSH.exe program!");
+ }
+ if (!server.sshPortOpen) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.brutessh == null) {
+ workerScript.scriptRef.log("Executed BruteSSH.exe on " + server.hostname + " to open SSH port (22)");
+ }
+ server.sshPortOpen = true;
+ ++server.openPortCount;
+ } else {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.brutessh == null) {
+ workerScript.scriptRef.log("SSH Port (22) already opened on " + server.hostname);
+ }
+ }
+ return true;
+ },
+ ftpcrack : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.ftpcrack) {
+ return 0;
+ } else {
+ workerScript.loadedFns.ftpcrack = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPortProgramRamCost;
+ }
+ }
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Program call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip);
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasProgram(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].FTPCrackProgram)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You do not have the FTPCrack.exe program!");
+ }
+ if (!server.ftpPortOpen) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.ftpcrack == null) {
+ workerScript.scriptRef.log("Executed FTPCrack.exe on " + server.hostname + " to open FTP port (21)");
+ }
+ server.ftpPortOpen = true;
+ ++server.openPortCount;
+ } else {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.ftpcrack == null) {
+ workerScript.scriptRef.log("FTP Port (21) already opened on " + server.hostname);
+ }
+ }
+ return true;
+ },
+ relaysmtp : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.relaysmtp) {
+ return 0;
+ } else {
+ workerScript.loadedFns.relaysmtp = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPortProgramRamCost;
+ }
+ }
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Program call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip);
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasProgram(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].RelaySMTPProgram)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You do not have the relaySMTP.exe program!");
+ }
+ if (!server.smtpPortOpen) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.relaysmtp == null) {
+ workerScript.scriptRef.log("Executed relaySMTP.exe on " + server.hostname + " to open SMTP port (25)");
+ }
+ server.smtpPortOpen = true;
+ ++server.openPortCount;
+ } else {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.relaysmtp == null) {
+ workerScript.scriptRef.log("SMTP Port (25) already opened on " + server.hostname);
+ }
+ }
+ return true;
+ },
+ httpworm : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.httpworm) {
+ return 0;
+ } else {
+ workerScript.loadedFns.httpworm = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPortProgramRamCost;
+ }
+ }
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Program call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("Cannot call httpworm(). Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot call httpworm(). Invalid IP or hostname passed in: " + ip);
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasProgram(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].HTTPWormProgram)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You do not have the HTTPWorm.exe program!");
+ }
+ if (!server.httpPortOpen) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.httpworm == null) {
+ workerScript.scriptRef.log("Executed HTTPWorm.exe on " + server.hostname + " to open HTTP port (80)");
+ }
+ server.httpPortOpen = true;
+ ++server.openPortCount;
+ } else {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.httpworm == null) {
+ workerScript.scriptRef.log("HTTP Port (80) already opened on " + server.hostname);
+ }
+ }
+ return true;
+ },
+ sqlinject : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.sqlinject) {
+ return 0;
+ } else {
+ workerScript.loadedFns.sqlinject = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPortProgramRamCost;
+ }
+ }
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Program call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip);
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasProgram(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].SQLInjectProgram)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You do not have the SQLInject.exe program!");
+ }
+ if (!server.sqlPortOpen) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.sqlinject == null) {
+ workerScript.scriptRef.log("Executed SQLInject.exe on " + server.hostname + " to open SQL port (1433)");
+ }
+ server.sqlPortOpen = true;
+ ++server.openPortCount;
+ } else {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.sqlinject == null) {
+ workerScript.scriptRef.log("SQL Port (1433) already opened on " + server.hostname);
+ }
+ }
+ return true;
+ },
+ run : function(scriptname,threads = 1){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.run) {
+ return 0;
+ } else {
+ workerScript.loadedFns.run = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptRunRamCost;
+ }
+ }
+ if (scriptname === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "run() call has incorrect number of arguments. Usage: run(scriptname, [numThreads], [arg1], [arg2]...)");
+ }
+ if (isNaN(threads) || threads < 1) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid argument for thread count passed into run(). Must be numeric and greater than 0");
+ }
+ var argsForNewScript = [];
+ for (var i = 2; i < arguments.length; ++i) {
+ argsForNewScript.push(arguments[i]);
+ }
+ var scriptServer = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(workerScript.serverIp);
+ if (scriptServer == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Could not find server. This is a bug in the game. Report to game dev");
+ }
+
+ return Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["runScriptFromScript"])(scriptServer, scriptname, argsForNewScript, workerScript, threads);
+ },
+ exec : function(scriptname,ip,threads = 1) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.exec) {
+ return 0;
+ } else {
+ workerScript.loadedFns.exec = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptExecRamCost;
+ }
+ }
+ if (scriptname === undefined || ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "exec() call has incorrect number of arguments. Usage: exec(scriptname, server, [numThreads], [arg1], [arg2]...)");
+ }
+ if (isNaN(threads) || threads < 1) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid argument for thread count passed into exec(). Must be numeric and greater than 0");
+ }
+ var argsForNewScript = [];
+ for (var i = 3; i < arguments.length; ++i) {
+ argsForNewScript.push(arguments[i]);
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid hostname/ip passed into exec() command: " + ip);
+ }
+ return Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["runScriptFromScript"])(server, scriptname, argsForNewScript, workerScript, threads);
+ },
+ spawn : function(scriptname, threads) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.spawn) {
+ return 0;
+ } else {
+ workerScript.loadedFns.spawn = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSpawnRamCost;
+ }
+ }
+ if (scriptname == null || threads == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid scriptname or numThreads argument passed to spawn()");
+ }
+ setTimeout(()=>{
+ NetscriptFunctions(workerScript).run.apply(this, arguments);
+ }, 20000);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.spawn == null) {
+ workerScript.scriptRef.log("spawn() will execute " + scriptname + " in 20 seconds");
+ }
+ NetscriptFunctions(workerScript).exit();
+ },
+ kill : function(filename,ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.kill) {
+ return 0;
+ } else {
+ workerScript.loadedFns.kill = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptKillRamCost;
+ }
+ }
+
+ if (filename === undefined || ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "kill() call has incorrect number of arguments. Usage: kill(scriptname, server, [arg1], [arg2]...)");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("kill() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "kill() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ var argsForKillTarget = [];
+ for (var i = 2; i < arguments.length; ++i) {
+ argsForKillTarget.push(arguments[i]);
+ }
+ var runningScriptObj = Object(_Script_js__WEBPACK_IMPORTED_MODULE_15__["findRunningScript"])(filename, argsForKillTarget, server);
+ if (runningScriptObj == null) {
+ workerScript.scriptRef.log("kill() failed. No such script "+ filename + " on " + server.hostname + " with args: " + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_28__["printArray"])(argsForKillTarget));
+ return false;
+ }
+ var res = Object(_NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["killWorkerScript"])(runningScriptObj, server.ip);
+ if (res) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.kill == null) {
+ workerScript.scriptRef.log("Killing " + filename + " on " + server.hostname + " with args: " + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_28__["printArray"])(argsForKillTarget) + ". May take up to a few minutes for the scripts to die...");
+ }
+ return true;
+ } else {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.kill == null) {
+ workerScript.scriptRef.log("kill() failed. No such script "+ filename + " on " + server.hostname + " with args: " + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_28__["printArray"])(argsForKillTarget));
+ }
+ return false;
+ }
+ },
+ killall : function(ip=workerScript.serverIp){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.killall) {
+ return 0;
+ } else {
+ workerScript.loadedFns.killall = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptKillRamCost;
+ }
+ }
+
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "killall() call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("killall() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "killall() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ var scriptsRunning = (server.runningScripts.length > 0);
+ for (var i = server.runningScripts.length-1; i >= 0; --i) {
+ Object(_NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["killWorkerScript"])(server.runningScripts[i], server.ip);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.killall == null) {
+ workerScript.scriptRef.log("killall(): Killing all scripts on " + server.hostname + ". May take a few minutes for the scripts to die");
+ }
+ return scriptsRunning;
+ },
+ exit : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.exit) {
+ return 0;
+ } else {
+ workerScript.loadedFns.exit = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptKillRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(workerScript.serverIp);
+ if (server == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error getting Server for this script in exit(). This is a bug please contact game dev");
+ }
+ if (Object(_NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["killWorkerScript"])(workerScript.scriptRef, server.ip)) {
+ workerScript.scriptRef.log("Exiting...");
+ } else {
+ workerScript.scriptRef.log("Exit failed(). This is a bug please contact game developer");
+ }
+ },
+ scp : function(scriptname, ip1, ip2) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.scp) {
+ return 0;
+ } else {
+ workerScript.loadedFns.scp = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptScpRamCost;
+ }
+ }
+ if (arguments.length !== 2 && arguments.length !== 3) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error: scp() call has incorrect number of arguments. Takes 2 or 3 arguments");
+ }
+ if (scriptname && scriptname.constructor === Array) {
+ //Recursively call scp on all elements of array
+ var res = false;
+ scriptname.forEach(function(script) {
+ if (NetscriptFunctions(workerScript).scp(script, ip1, ip2)) {
+ res = true;
+ };
+ });
+ return res;
+ }
+ if (!scriptname.endsWith(".lit") && !scriptname.endsWith(".script") &&
+ !scriptname.endsWith("txt")) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error: scp() does not work with this file type. It only works for .script, .lit, and .txt files");
+ }
+
+ var destServer, currServ;
+
+ if (arguments.length === 3) { //scriptname, source, destination
+ if (scriptname === undefined || ip1 === undefined || ip2 === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error: scp() call has incorrect number of arguments. Takes 2 or 3 arguments");
+ }
+ destServer = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip2);
+ if (destServer == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error: Invalid hostname/ip passed into scp() command: " + ip);
+ }
+
+ currServ = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip1);
+ if (currServ == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Could not find server ip for this script. This is a bug please contact game developer");
+ }
+ } else if (arguments.length === 2) { //scriptname, destination
+ if (scriptname === undefined || ip1 === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error: scp() call has incorrect number of arguments. Takes 2 or 3 arguments");
+ }
+ destServer = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip1);
+ if (destServer == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error: Invalid hostname/ip passed into scp() command: " + ip);
+ }
+
+ currServ = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(workerScript.serverIp);
+ if (currServ == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Could not find server ip for this script. This is a bug please contact game developer");
+ }
+ }
+
+ //Scp for lit files
+ if (scriptname.endsWith(".lit")) {
+ var found = false;
+ for (var i = 0; i < currServ.messages.length; ++i) {
+ if (!(currServ.messages[i] instanceof _Message_js__WEBPACK_IMPORTED_MODULE_12__["Message"]) && currServ.messages[i] == scriptname) {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ workerScript.scriptRef.log(scriptname + " does not exist. scp() failed");
+ return false;
+ }
+
+ for (var i = 0; i < destServer.messages.length; ++i) {
+ if (destServer.messages[i] === scriptname) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.scp == null) {
+ workerScript.scriptRef.log(scriptname + " copied over to " + destServer.hostname);
+ }
+ return true; //Already exists
+ }
+ }
+ destServer.messages.push(scriptname);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.scp == null) {
+ workerScript.scriptRef.log(scriptname + " copied over to " + destServer.hostname);
+ }
+ return true;
+ }
+
+ //Scp for text files
+ if (scriptname.endsWith(".txt")) {
+ var found = false, txtFile;
+ for (var i = 0; i < currServ.textFiles.length; ++i) {
+ if (currServ.textFiles[i].fn === scriptname) {
+ found = true;
+ txtFile = currServ.textFiles[i];
+ break;
+ }
+ }
+
+ if (!found) {
+ workerScript.scriptRef.log(scriptname + " does not exist. scp() failed");
+ return false;
+ }
+
+ for (var i = 0; i < destServer.textFiles.length; ++i) {
+ if (destServer.textFiles[i].fn === scriptname) {
+ //Overwrite
+ destServer.textFiles[i].text = txtFile.text;
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.scp == null) {
+ workerScript.scriptRef.log(scriptname + " copied over to " + destServer.hostname);
+ }
+ return true;
+ }
+ }
+ var newFile = new _TextFile_js__WEBPACK_IMPORTED_MODULE_21__["TextFile"](txtFile.fn, txtFile.text);
+ destServer.textFiles.push(newFile);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.scp == null) {
+ workerScript.scriptRef.log(scriptname + " copied over to " + destServer.hostname);
+ }
+ return true;
+ }
+
+ //Scp for script files
+ var sourceScript = null;
+ for (var i = 0; i < currServ.scripts.length; ++i) {
+ if (scriptname == currServ.scripts[i].filename) {
+ sourceScript = currServ.scripts[i];
+ break;
+ }
+ }
+ if (sourceScript == null) {
+ workerScript.scriptRef.log(scriptname + " does not exist. scp() failed");
+ return false;
+ }
+
+ //Overwrite script if it already exists
+ for (var i = 0; i < destServer.scripts.length; ++i) {
+ if (scriptname == destServer.scripts[i].filename) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.scp == null) {
+ workerScript.scriptRef.log("WARNING: " + scriptname + " already exists on " + destServer.hostname + " and it will be overwritten.");
+ workerScript.scriptRef.log(scriptname + " overwritten on " + destServer.hostname);
+ }
+ var oldScript = destServer.scripts[i];
+ oldScript.code = sourceScript.code;
+ oldScript.ramUsage = sourceScript.ramUsage;
+ return true;
+ }
+ }
+
+ //Create new script if it does not already exist
+ var newScript = new _Script_js__WEBPACK_IMPORTED_MODULE_15__["Script"]();
+ newScript.filename = scriptname;
+ newScript.code = sourceScript.code;
+ newScript.ramUsage = sourceScript.ramUsage;
+ newScript.server = destServer.ip;
+ destServer.scripts.push(newScript);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.scp == null) {
+ workerScript.scriptRef.log(scriptname + " copied over to " + destServer.hostname);
+ }
+ return true;
+ },
+ ls : function(ip, grep) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.ls) {
+ return 0;
+ } else {
+ workerScript.loadedFns.ls = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptScanRamCost;
+ }
+ }
+ if (ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ls() failed because of invalid arguments. Usage: ls(ip/hostname, [grep filter])");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("ls() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ls() failed. Invalid IP or hostname passed in: " + ip);
+ }
+
+ //Get the grep filter, if one exists
+ var filter = false;
+ if (arguments.length >= 2) {
+ filter = grep.toString();
+ }
+
+ var allFiles = [];
+ for (var i = 0; i < server.programs.length; i++) {
+ if (filter) {
+ if (server.programs[i].includes(filter)) {
+ allFiles.push(server.programs[i]);
+ }
+ } else {
+ allFiles.push(server.programs[i]);
+ }
+ }
+ for (var i = 0; i < server.scripts.length; i++) {
+ if (filter) {
+ if (server.scripts[i].filename.includes(filter)) {
+ allFiles.push(server.scripts[i].filename);
+ }
+ } else {
+ allFiles.push(server.scripts[i].filename);
+ }
+
+ }
+ for (var i = 0; i < server.messages.length; i++) {
+ if (filter) {
+ if (server.messages[i] instanceof _Message_js__WEBPACK_IMPORTED_MODULE_12__["Message"]) {
+ if (server.messages[i].filename.includes(filter)) {
+ allFiles.push(server.messages[i].filename);
+ }
+ } else if (server.messages[i].includes(filter)) {
+ allFiles.push(server.messages[i]);
+ }
+ } else {
+ if (server.messages[i] instanceof _Message_js__WEBPACK_IMPORTED_MODULE_12__["Message"]) {
+ allFiles.push(server.messages[i].filename);
+ } else {
+ allFiles.push(server.messages[i]);
+ }
+ }
+ }
+
+ for (var i = 0; i < server.textFiles.length; i++) {
+ if (filter) {
+ if (server.textFiles[i].fn.includes(filter)) {
+ allFiles.push(server.textFiles[i].fn);
+ }
+ } else {
+ allFiles.push(server.textFiles[i].fn);
+ }
+ }
+
+ //Sort the files alphabetically then print each
+ allFiles.sort();
+ return allFiles;
+ },
+ hasRootAccess : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.hasRootAccess) {
+ return 0;
+ } else {
+ workerScript.loadedFns.hasRootAccess = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptHasRootAccessRamCost;
+ }
+ }
+ if (ip===undefined){
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "hasRootAccess() call has incorrect number of arguments. Takes 1 argument");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null){
+ workerScript.scriptRef.log("hasRootAccess() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "hasRootAccess() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ return server.hasAdminRights;
+ },
+ getIp : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getIp) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getIp = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetHostnameRamCost;
+ }
+ }
+ var scriptServer = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(workerScript.serverIp);
+ if (scriptServer == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Could not find server. This is a bug in the game. Report to game dev");
+ }
+ return scriptServer.ip;
+ },
+ getHostname : function(){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getHostname) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getHostname = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetHostnameRamCost;
+ }
+ }
+ var scriptServer = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(workerScript.serverIp);
+ if (scriptServer == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Could not find server. This is a bug in the game. Report to game dev");
+ }
+ return scriptServer.hostname;
+ },
+ getHackingLevel : function(){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getHackingLevel) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getHackingLevel = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetHackingLevelRamCost;
+ }
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].updateSkillLevels();
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getHackingLevel == null) {
+ workerScript.scriptRef.log("getHackingLevel() returned " + _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill);
+ }
+ return _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill;
+ },
+ getHackingMultipliers : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getHackingMultipliers) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getHackingMultipliers = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetMultipliersRamCost;
+ }
+ }
+ return {
+ chance: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_chance_mult,
+ speed: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_speed_mult,
+ money: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_money_mult,
+ growth: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_grow_mult,
+ };
+ },
+ getBitNodeMultipliers: function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getBitNodeMultipliers) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getBitNodeMultipliers = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetMultipliersRamCost;
+ }
+ }
+ if (!hasAISF) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getBitNodeMultipliers(). It requires Source-File 5 to run.");
+ }
+ return _BitNode_js__WEBPACK_IMPORTED_MODULE_2__["BitNodeMultipliers"];
+ },
+ getServerMoneyAvailable : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getServerMoneyAvailable) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getServerMoneyAvailable = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getServerMoneyAvailable() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getServerMoneyAvailable() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ if (server.hostname == "home") {
+ //Return player's money
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerMoneyAvailable == null) {
+ workerScript.scriptRef.log("getServerMoneyAvailable('home') returned player's money: $" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.toNumber(), 2));
+ }
+ return _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.toNumber();
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerMoneyAvailable == null) {
+ workerScript.scriptRef.log("getServerMoneyAvailable() returned " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.moneyAvailable, 2) + " for " + server.hostname);
+ }
+ return server.moneyAvailable;
+ },
+ getServerSecurityLevel : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getServerSecurityLevel) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getServerSecurityLevel = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getServerSecurityLevel() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getServerSecurityLevel() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerSecurityLevel == null) {
+ workerScript.scriptRef.log("getServerSecurityLevel() returned " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.hackDifficulty, 3) + " for " + server.hostname);
+ }
+ return server.hackDifficulty;
+ },
+ getServerBaseSecurityLevel : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getServerBaseSecurityLevel) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getServerBaseSecurityLevel = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getServerBaseSecurityLevel() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getServerBaseSecurityLevel() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerBaseSecurityLevel == null) {
+ workerScript.scriptRef.log("getServerBaseSecurityLevel() returned " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.baseDifficulty, 3) + " for " + server.hostname);
+ }
+ return server.baseDifficulty;
+ },
+ getServerMinSecurityLevel : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getServerMinSecurityLevel) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getServerMinSecurityLevel = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getServerMinSecurityLevel() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getServerMinSecurityLevel() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerMinSecurityLevel == null) {
+ workerScript.scriptRef.log("getServerMinSecurityLevel() returned " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.minDifficulty, 3) + " for " + server.hostname);
+ }
+ return server.minDifficulty;
+ },
+ getServerRequiredHackingLevel : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getServerRequiredHackingLevel) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getServerRequiredHackingLevel = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getServerRequiredHackingLevel() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getServerRequiredHackingLevel() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerRequiredHackingLevel == null) {
+ workerScript.scriptRef.log("getServerRequiredHackingLevel returned " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.requiredHackingSkill, 0) + " for " + server.hostname);
+ }
+ return server.requiredHackingSkill;
+ },
+ getServerMaxMoney : function(ip){
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getServerMaxMoney) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getServerMaxMoney = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getServerMaxMoney() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getServerMaxMoney() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerMaxMoney == null) {
+ workerScript.scriptRef.log("getServerMaxMoney() returned " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.moneyMax, 0) + " for " + server.hostname);
+ }
+ return server.moneyMax;
+ },
+ getServerGrowth : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getServerGrowth) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getServerGrowth = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getServerGrowth() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getServerGrowth() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerGrowth == null) {
+ workerScript.scriptRef.log("getServerGrowth() returned " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.serverGrowth, 0) + " for " + server.hostname);
+ }
+ return server.serverGrowth;
+ },
+ getServerNumPortsRequired : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getServerNumPortsRequired) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getServerNumPortsRequired = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getServerNumPortsRequired() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getServerNumPortsRequired() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerNumPortsRequired == null) {
+ workerScript.scriptRef.log("getServerNumPortsRequired() returned " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.numOpenPortsRequired, 0) + " for " + server.hostname);
+ }
+ return server.numOpenPortsRequired;
+ },
+ getServerRam : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getServerRam) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getServerRam = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getServerRam() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getServerRam() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.getServerRam == null) {
+ workerScript.scriptRef.log("getServerRam() returned [" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.maxRam, 2) + "GB, " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(server.ramUsed, 2) + "GB]");
+ }
+ return [server.maxRam, server.ramUsed];
+ },
+ serverExists : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.serverExists) {
+ return 0;
+ } else {
+ workerScript.loadedFns.serverExists = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetServerRamCost;
+ }
+ }
+ return (Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip) !== null);
+ },
+ fileExists : function(filename,ip=workerScript.serverIp) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.fileExists) {
+ return 0;
+ } else {
+ workerScript.loadedFns.fileExists = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptFileExistsRamCost;
+ }
+ }
+ if (filename === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "fileExists() call has incorrect number of arguments. Usage: fileExists(scriptname, [server])");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("fileExists() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "fileExists() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ for (var i = 0; i < server.scripts.length; ++i) {
+ if (filename == server.scripts[i].filename) {
+ return true;
+ }
+ }
+ for (var i = 0; i < server.programs.length; ++i) {
+ if (filename.toLowerCase() == server.programs[i].toLowerCase()) {
+ return true;
+ }
+ }
+ for (var i = 0; i < server.messages.length; ++i) {
+ if (!(server.messages[i] instanceof _Message_js__WEBPACK_IMPORTED_MODULE_12__["Message"]) &&
+ filename.toLowerCase() === server.messages[i]) {
+ return true;
+ }
+ }
+ var txtFile = Object(_TextFile_js__WEBPACK_IMPORTED_MODULE_21__["getTextFile"])(filename, server);
+ if (txtFile != null) {
+ return true;
+ }
+ return false;
+ },
+ isRunning : function(filename,ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.isRunning) {
+ return 0;
+ } else {
+ workerScript.loadedFns.isRunning = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptIsRunningRamCost;
+ }
+ }
+ if (filename === undefined || ip === undefined) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "isRunning() call has incorrect number of arguments. Usage: isRunning(scriptname, server, [arg1], [arg2]...)");
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("isRunning() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "isRunning() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ var argsForTargetScript = [];
+ for (var i = 2; i < arguments.length; ++i) {
+ argsForTargetScript.push(arguments[i]);
+ }
+ return (Object(_Script_js__WEBPACK_IMPORTED_MODULE_15__["findRunningScript"])(filename, argsForTargetScript, server) != null);
+ },
+ getNextHacknetNodeCost : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getNextHacknetNodeCost) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getNextHacknetNodeCost = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPurchaseHacknetRamCost;
+ }
+ }
+ return Object(_HacknetNode_js__WEBPACK_IMPORTED_MODULE_10__["getCostOfNextHacknetNode"])();
+ },
+
+ purchaseHacknetNode : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.purchaseHacknetNode) {
+ return 0;
+ } else {
+ workerScript.loadedFns.purchaseHacknetNode = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPurchaseHacknetRamCost;
+ }
+ }
+ return Object(_HacknetNode_js__WEBPACK_IMPORTED_MODULE_10__["purchaseHacknet"])();
+ },
+ getStockPrice : function(symbol) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getStockPrice) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getStockPrice = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetStockRamCost;
+ }
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasTixApiAccess) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You don't have TIX API Access! Cannot use getStockPrice()");
+ }
+ var stock = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["SymbolToStockMap"][symbol];
+ if (stock == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid stock symbol passed into getStockPrice()");
+ }
+ return parseFloat(stock.price.toFixed(3));
+ },
+ getStockPosition : function(symbol) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getStockPosition) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getStockPosition = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetStockRamCost;
+ }
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasTixApiAccess) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You don't have TIX API Access! Cannot use getStockPosition()");
+ }
+ var stock = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["SymbolToStockMap"][symbol];
+ if (stock == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid stock symbol passed into getStockPrice()");
+ }
+ return [stock.playerShares, stock.playerAvgPx, stock.playerShortShares, stock.playerAvgShortPx];
+ },
+ buyStock : function(symbol, shares) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.buyStock) {
+ return 0;
+ } else {
+ workerScript.loadedFns.buyStock = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptBuySellStockRamCost;
+ }
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasTixApiAccess) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You don't have TIX API Access! Cannot use buyStock()");
+ }
+ var stock = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["SymbolToStockMap"][symbol];
+ if (stock == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid stock symbol passed into buyStock()");
+ }
+ if (shares < 0 || isNaN(shares)) {
+ workerScript.scriptRef.log("Error: Invalid 'shares' argument passed to buyStock()");
+ return 0;
+ }
+ shares = Math.round(shares);
+ if (shares === 0) {return 0;}
+
+ var totalPrice = stock.price * shares;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.lt(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].StockMarketCommission)) {
+ workerScript.scriptRef.log("Not enough money to purchase " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(shares, 0) + " shares of " +
+ symbol + ". Need $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].StockMarketCommission, 2).toString());
+ return 0;
+ }
+
+ var origTotal = stock.playerShares * stock.playerAvgPx;
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(totalPrice + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].StockMarketCommission);
+ var newTotal = origTotal + totalPrice;
+ stock.playerShares += shares;
+ stock.playerAvgPx = newTotal / stock.playerShares;
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_8__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_8__["Engine"].Page.StockMarket) {
+ Object(_StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["updateStockPlayerPosition"])(stock);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.buyStock == null) {
+ workerScript.scriptRef.log("Bought " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(shares, 0) + " shares of " + stock.symbol + " at $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(stock.price, 2) + " per share");
+ }
+ return stock.price;
+ },
+ sellStock : function(symbol, shares) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.sellStock) {
+ return 0;
+ } else {
+ workerScript.loadedFns.sellStock = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptBuySellStockRamCost;
+ }
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasTixApiAccess) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You don't have TIX API Access! Cannot use sellStock()");
+ }
+ var stock = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["SymbolToStockMap"][symbol];
+ if (stock == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid stock symbol passed into sellStock()");
+ }
+ if (shares < 0 || isNaN(shares)) {
+ workerScript.scriptRef.log("Error: Invalid 'shares' argument passed to sellStock()");
+ return 0;
+ }
+ shares = Math.round(shares);
+ if (shares > stock.playerShares) {shares = stock.playerShares;}
+ if (shares === 0) {return 0;}
+ var gains = stock.price * shares - _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].StockMarketCommission;
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainMoney(gains);
+
+ //Calculate net profit and add to script stats
+ var netProfit = ((stock.price - stock.playerAvgPx) * shares) - _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].StockMarketCommission;
+ if (isNaN(netProfit)) {netProfit = 0;}
+ workerScript.scriptRef.onlineMoneyMade += netProfit;
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].scriptProdSinceLastAug += netProfit;
+
+ stock.playerShares -= shares;
+ if (stock.playerShares == 0) {
+ stock.playerAvgPx = 0;
+ }
+ if (_engine_js__WEBPACK_IMPORTED_MODULE_8__["Engine"].currentPage == _engine_js__WEBPACK_IMPORTED_MODULE_8__["Engine"].Page.StockMarket) {
+ Object(_StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["updateStockPlayerPosition"])(stock);
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.sellStock == null) {
+ workerScript.scriptRef.log("Sold " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(shares, 0) + " shares of " + stock.symbol + " at $" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(stock.price, 2) + " per share. Gained " +
+ "$" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(gains, 2));
+ }
+ return stock.price;
+ },
+ shortStock(symbol, shares) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.shortStock) {
+ return 0;
+ } else {
+ workerScript.loadedFns.shortStock = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptBuySellStockRamCost;
+ }
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasTixApiAccess) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You don't have TIX API Access! Cannot use shortStock()");
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 8) {
+ if (!(hasWallStreetSF && wallStreetSFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Cannot use shortStock(). You must either be in BitNode-8 or you must have Level 2 of Source-File 8");
+ }
+ }
+ var stock = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["SymbolToStockMap"][symbol];
+ if (stock == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Invalid stock symbol passed into shortStock()");
+ }
+ var res = Object(_StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["shortStock"])(stock, shares, workerScript);
+ return res ? stock.price : 0;
+ },
+ sellShort(symbol, shares) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.sellShort) {
+ return 0;
+ } else {
+ workerScript.loadedFns.sellShort = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptBuySellStockRamCost;
+ }
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasTixApiAccess) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You don't have TIX API Access! Cannot use sellShort()");
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 8) {
+ if (!(hasWallStreetSF && wallStreetSFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Cannot use sellShort(). You must either be in BitNode-8 or you must have Level 2 of Source-File 8");
+ }
+ }
+ var stock = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["SymbolToStockMap"][symbol];
+ if (stock == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Invalid stock symbol passed into sellShort()");
+ }
+ var res = Object(_StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["sellShort"])(stock, shares, workerScript);
+ return res ? stock.price : 0;
+ },
+ placeOrder(symbol, shares, price, type, pos) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.placeOrder) {
+ return 0;
+ } else {
+ workerScript.loadedFns.placeOrder = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptBuySellStockRamCost;
+ }
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasTixApiAccess) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You don't have TIX API Access! Cannot use placeOrder()");
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 8) {
+ if (!(hasWallStreetSF && wallStreetSFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Cannot use placeOrder(). You must either be in BitNode-8 or have Level 3 of Source-File 8");
+ }
+ }
+ var stock = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["SymbolToStockMap"][symbol];
+ if (stock == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Invalid stock symbol passed into placeOrder()");
+ }
+ var orderType, orderPos;
+ type = type.toLowerCase();
+ if (type.includes("limit") && type.includes("buy")) {
+ orderType = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["OrderTypes"].LimitBuy;
+ } else if (type.includes("limit") && type.includes("sell")) {
+ orderType = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["OrderTypes"].LimitSell;
+ } else if (type.includes("stop") && type.includes("buy")) {
+ orderType = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["OrderTypes"].StopBuy;
+ } else if (type.includes("stop") && type.includes("sell")) {
+ orderType = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["OrderTypes"].StopSell;
+ } else {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Invalid Order Type passed into placeOrder()");
+ }
+
+ pos = pos.toLowerCase();
+ if (pos.includes("l")) {
+ orderPos = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["PositionTypes"].Long;
+ } else if (pos.includes('s')) {
+ orderPos = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["PositionTypes"].Short;
+ } else {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Invalid Position Type passed into placeOrder()");
+ }
+
+ return Object(_StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["placeOrder"])(stock, shares, price, orderType, orderPos, workerScript);
+ },
+ cancelOrder(symbol, shares, price, type, pos) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.cancelOrder) {
+ return 0;
+ } else {
+ workerScript.loadedFns.cancelOrder = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptBuySellStockRamCost;
+ }
+ }
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hasTixApiAccess) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "You don't have TIX API Access! Cannot use cancelOrder()");
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 8) {
+ if (!(hasWallStreetSF && wallStreetSFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Cannot use cancelOrder(). You must either be in BitNode-8 or have Level 3 of Source-File 8");
+ }
+ }
+ var stock = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["SymbolToStockMap"][symbol];
+ if (stock == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Invalid stock symbol passed into cancelOrder()");
+ }
+ if (isNaN(shares) || isNaN(price)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Invalid shares or price argument passed into cancelOrder(). Must be numeric");
+ }
+ var orderType, orderPos;
+ type = type.toLowerCase();
+ if (type.includes("limit") && type.includes("buy")) {
+ orderType = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["OrderTypes"].LimitBuy;
+ } else if (type.includes("limit") && type.includes("sell")) {
+ orderType = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["OrderTypes"].LimitSell;
+ } else if (type.includes("stop") && type.includes("buy")) {
+ orderType = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["OrderTypes"].StopBuy;
+ } else if (type.includes("stop") && type.includes("sell")) {
+ orderType = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["OrderTypes"].StopSell;
+ } else {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Invalid Order Type passed into placeOrder()");
+ }
+
+ pos = pos.toLowerCase();
+ if (pos.includes("l")) {
+ orderPos = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["PositionTypes"].Long;
+ } else if (pos.includes('s')) {
+ orderPos = _StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["PositionTypes"].Short;
+ } else {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERROR: Invalid Position Type passed into placeOrder()");
+ }
+ var params = {
+ stock: stock,
+ shares: shares,
+ price: price,
+ type: orderType,
+ pos: orderPos
+ };
+ return Object(_StockMarket_js__WEBPACK_IMPORTED_MODULE_19__["cancelOrder"])(params, workerScript);
+ },
+ purchaseServer : function(hostname, ram) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.purchaseServer) {
+ return 0;
+ } else {
+ workerScript.loadedFns.purchaseServer = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPurchaseServerRamCost;
+ }
+ }
+ var hostnameStr = String(hostname);
+ hostnameStr = hostnameStr.replace(/\s+/g, '');
+ if (hostnameStr == "") {
+ workerScript.scriptRef.log("Error: Passed empty string for hostname argument of purchaseServer()");
+ return "";
+ }
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].purchasedServers.length >= _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].PurchasedServerLimit) {
+ workerScript.scriptRef.log("Error: You have reached the maximum limit of " + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].PurchasedServerLimit +
+ " servers. You cannot purchase any more.");
+ return "";
+ }
+
+ ram = Math.round(ram);
+ if (isNaN(ram) || !Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_28__["powerOfTwo"])(ram)) {
+ workerScript.scriptRef.log("Error: Invalid ram argument passed to purchaseServer(). Must be numeric and a power of 2");
+ return "";
+ }
+
+ var cost = ram * _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].BaseCostFor1GBOfRamServer;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.lt(cost)) {
+ workerScript.scriptRef.log("Error: Not enough money to purchase server. Need $" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(cost, 2));
+ return "";
+ }
+ var newServ = new _Server_js__WEBPACK_IMPORTED_MODULE_16__["Server"](Object(_utils_IPAddress_js__WEBPACK_IMPORTED_MODULE_29__["createRandomIp"])(), hostnameStr, "", false, true, true, ram);
+ Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["AddToAllServers"])(newServ);
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].purchasedServers.push(newServ.ip);
+ var homeComputer = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer();
+ homeComputer.serversOnNetwork.push(newServ.ip);
+ newServ.serversOnNetwork.push(homeComputer.ip);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(cost);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.purchaseServer == null) {
+ workerScript.scriptRef.log("Purchased new server with hostname " + newServ.hostname + " for $" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["formatNumber"])(cost, 2));
+ }
+ return newServ.hostname;
+ },
+ deleteServer : function(hostname) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.deleteServer) {
+ return 0;
+ } else {
+ workerScript.loadedFns.deleteServer = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPurchaseServerRamCost;
+ }
+ }
+ var hostnameStr = String(hostname);
+ hostnameStr = hostnameStr.replace(/\s\s+/g, '');
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["GetServerByHostname"])(hostnameStr);
+ if (server == null) {
+ workerScript.scriptRef.log("Error: Could not find server with hostname " + hostnameStr + ". deleteServer() failed");
+ return false;
+ }
+
+ if (!server.purchasedByPlayer || server.hostname == "home") {
+ workerScript.scriptRef.log("Error: Server " + server.hostname + " is not a purchased server. " +
+ "Cannot be deleted. deleteServer failed");
+ return false;
+ }
+
+ var ip = server.ip;
+
+ //A server cannot delete itself
+ if (ip == workerScript.serverIp) {
+ workerScript.scriptRef.log("Error: Cannot call deleteServer() on self. Function failed");
+ return false;
+ }
+
+ //Delete all scripts running on server
+ if (server.runningScripts.length > 0) {
+ workerScript.scriptRef.log("Error: Cannot delete server " + server.hostname + " because it still has scripts running.");
+ return false;
+ }
+
+ //Delete from player's purchasedServers array
+ var found = false;
+ for (var i = 0; i < _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].purchasedServers.length; ++i) {
+ if (ip == _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].purchasedServers[i]) {
+ found = true;
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].purchasedServers.splice(i, 1);
+ break;
+ }
+ }
+
+ if (!found) {
+ workerScript.scriptRef.log("Error: Could not identify server " + server.hostname +
+ "as a purchased server. This is likely a bug please contact game dev");
+ return false;
+ }
+
+ //Delete from all servers
+ delete _Server_js__WEBPACK_IMPORTED_MODULE_16__["AllServers"][ip];
+
+ //Delete from home computer
+ found = false;
+ var homeComputer = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer();
+ for (var i = 0; i < homeComputer.serversOnNetwork.length; ++i) {
+ if (ip == homeComputer.serversOnNetwork[i]) {
+ homeComputer.serversOnNetwork.splice(i, 1);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.deleteServer == null) {
+ workerScript.scriptRef.log("Deleted server " + hostnameStr);
+ }
+ return true;
+ }
+ }
+ //Wasn't found on home computer
+ workerScript.scriptRef.log("Error: Could not find server " + server.hostname +
+ "as a purchased server. This is likely a bug please contact game dev");
+ return false;
+ },
+ getPurchasedServers : function(hostname=true) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getPurchasedServers) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getPurchasedServers = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptPurchaseServerRamCost;
+ }
+ }
+ var res = [];
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].purchasedServers.forEach(function(ip) {
+ if (hostname) {
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: Could not find server in getPurchasedServers(). This is a bug please report to game dev");
+ }
+ res.push(server.hostname);
+ } else {
+ res.push(ip);
+ }
+ });
+ return res;
+ },
+ write : function(port, data="", mode="a") {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.write) {
+ return 0;
+ } else {
+ workerScript.loadedFns.write = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptReadWriteRamCost;
+ }
+ }
+ if (!isNaN(port)) { //Write to port
+ //Port 1-10
+ port = Math.round(port);
+ if (port < 1 || port > _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: Trying to write to invalid port: " + port + ". Only ports 1-" + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts + " are valid.");
+ }
+ var port = _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["NetscriptPorts"][port-1];
+ if (port == null || !(port instanceof _NetscriptPort_js__WEBPACK_IMPORTED_MODULE_25__["NetscriptPort"])) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Could not find port: " + port + ". This is a bug contact the game developer");
+ }
+ return port.write(data);
+ } else if (Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["isString"])(port)) { //Write to text file
+ var fn = port;
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(workerScript.serverIp);
+ if (server == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error getting Server for this script in write(). This is a bug please contact game dev");
+ }
+ var txtFile = Object(_TextFile_js__WEBPACK_IMPORTED_MODULE_21__["getTextFile"])(fn, server);
+ if (txtFile == null) {
+ txtFile = Object(_TextFile_js__WEBPACK_IMPORTED_MODULE_21__["createTextFile"])(fn, data, server);
+ return true;
+ }
+ if (mode === "w") {
+ txtFile.write(data);
+ } else {
+ txtFile.append(data);
+ }
+ return true;
+ } else {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid argument passed in for write: " + port);
+ }
+ },
+ read : function(port) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.read) {
+ return 0;
+ } else {
+ workerScript.loadedFns.read = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptReadWriteRamCost;
+ }
+ }
+ if (!isNaN(port)) { //Read from port
+ //Port 1-10
+ port = Math.round(port);
+ if (port < 1 || port > _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: Trying to read from invalid port: " + port + ". Only ports 1-" + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts + " are valid.");
+ }
+ var port = _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["NetscriptPorts"][port-1];
+ if (port == null || !(port instanceof _NetscriptPort_js__WEBPACK_IMPORTED_MODULE_25__["NetscriptPort"])) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: Could not find port: " + port + ". This is a bug contact the game developer");
+ }
+ return port.read();
+ } else if (Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["isString"])(port)) { //Read from text file
+ var fn = port;
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(workerScript.serverIp);
+ if (server == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error getting Server for this script in read(). This is a bug please contact game dev");
+ }
+ var txtFile = Object(_TextFile_js__WEBPACK_IMPORTED_MODULE_21__["getTextFile"])(fn, server);
+ if (txtFile !== null) {
+ return txtFile.text;
+ } else {
+ return "";
+ }
+ } else {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid argument passed in for read(): " + port);
+ }
+ },
+ peek : function(port) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.peek) {
+ return 0;
+ } else {
+ workerScript.loadedFns.peek = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptReadWriteRamCost;
+ }
+ }
+ if (isNaN(port)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: peek() called with invalid argument. Must be a port number between 1 and " + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts);
+ }
+ port = Math.round(port);
+ if (port < 1 || port > _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: peek() called with invalid argument. Must be a port number between 1 and " + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts);
+ }
+ var port = _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["NetscriptPorts"][port-1];
+ if (port == null || !(port instanceof _NetscriptPort_js__WEBPACK_IMPORTED_MODULE_25__["NetscriptPort"])) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: Could not find port: " + port + ". This is a bug contact the game developer");
+ }
+ return port.peek();
+ },
+ clear : function(port) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.clear) {
+ return 0;
+ } else {
+ workerScript.loadedFns.clear = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptReadWriteRamCost;
+ }
+ }
+ if (!isNaN(port)) { //Clear port
+ port = Math.round(port);
+ if (port < 1 || port > _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: Trying to clear invalid port: " + port + ". Only ports 1-" + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts + " are valid");
+ }
+ var port = _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["NetscriptPorts"][port-1];
+ if (port == null || !(port instanceof _NetscriptPort_js__WEBPACK_IMPORTED_MODULE_25__["NetscriptPort"])) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: Could not find port: " + port + ". This is a bug contact the game developer");
+ }
+ return port.clear();
+ } else if (Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["isString"])(port)) { //Clear text file
+ var fn = port;
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(workerScript.serverIp);
+ if (server == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error getting Server for this script in clear(). This is a bug please contact game dev");
+ }
+ var txtFile = Object(_TextFile_js__WEBPACK_IMPORTED_MODULE_21__["getTextFile"])(fn, server);
+ if (txtFile != null) {
+ txtFile.write("");
+ }
+ } else {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid argument passed in for clear(): " + port);
+ }
+ return 0;
+ },
+ getPortHandle : function(port) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getPortHandle) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getPortHandle = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptReadWriteRamCost * 10;
+ }
+ }
+ if (isNaN(port)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: Invalid argument passed into getPortHandle(). Must be an integer between 1 and " + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts);
+ }
+ port = Math.round(port);
+ if (port < 1 || port > _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: getPortHandle() called with invalid port number: " + port + ". Only ports 1-" + _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].NumNetscriptPorts + " are valid");
+ }
+ var port = _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["NetscriptPorts"][port-1];
+ if (port == null || !(port instanceof _NetscriptPort_js__WEBPACK_IMPORTED_MODULE_25__["NetscriptPort"])) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "ERR: Could not find port: " + port + ". This is a bug contact the game developer");
+ }
+ return port;
+ },
+ rm : function(fn) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.rm) {
+ return 0;
+ } else {
+ workerScript.loadedFns.rm = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptReadWriteRamCost;
+ }
+ }
+ var s = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(workerScript.serverIp);
+ if (s == null) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Error getting Server for this script in clear(). This is a bug please contact game dev");
+ }
+
+ if (fn.includes(".exe")) {
+ for (var i = 0; i < s.programs.length; ++i) {
+ if (s.programs[i] === fn) {
+ s.programs.splice(i, 1);
+ return true;
+ }
+ }
+ } else if (fn.endsWith(".script")) {
+ for (var i = 0; i < s.scripts.length; ++i) {
+ if (s.scripts[i].filename === fn) {
+ //Check that the script isnt currently running
+ for (var j = 0; j < s.runningScripts.length; ++j) {
+ if (s.runningScripts[j].filename === fn) {
+ workerScript.scriptRef.log("Cannot delete a script that is currently running!");
+ return false;
+ }
+ }
+ s.scripts.splice(i, 1);
+ return true;
+ }
+ }
+ } else if (fn.endsWith(".lit")) {
+ for (var i = 0; i < s.messages.length; ++i) {
+ var f = s.messages[i];
+ if (!(f instanceof _Message_js__WEBPACK_IMPORTED_MODULE_12__["Message"]) && Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["isString"])(f) && f === fn) {
+ s.messages.splice(i, 1);
+ return true;
+ }
+ }
+ } else if (fn.endsWith(".txt")) {
+ for (var i = 0; i < s.textFiles.length; ++i) {
+ if (s.textFiles[i].fn === fn) {
+ s.textFiles.splice(i, 1);
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+ scriptRunning : function(scriptname, ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.scriptRunning) {
+ return 0;
+ } else {
+ workerScript.loadedFns.scriptRunning = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptArbScriptRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("scriptRunning() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "scriptRunning() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ for (var i = 0; i < server.runningScripts.length; ++i) {
+ if (server.runningScripts[i].filename == scriptname) {
+ return true;
+ }
+ }
+ return false;
+ },
+ scriptKill : function(scriptname, ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.scriptKill) {
+ return 0;
+ } else {
+ workerScript.loadedFns.scriptKill = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptArbScriptRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("scriptKill() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "scriptKill() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ var suc = false;
+ for (var i = 0; i < server.runningScripts.length; ++i) {
+ if (server.runningScripts[i].filename == scriptname) {
+ Object(_NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["killWorkerScript"])(server.runningScripts[i], server.ip);
+ suc = true;
+ }
+ }
+ return suc;
+ },
+ getScriptRam : function (scriptname, ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getScriptRam) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getScriptRam = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetScriptRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getScriptRam() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getScriptRam() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ for (var i = 0; i < server.scripts.length; ++i) {
+ if (server.scripts[i].filename == scriptname) {
+ return server.scripts[i].ramUsage;
+ }
+ }
+ return 0;
+ },
+ getHackTime : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getHackTime) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getHackTime = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetHackTimeRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getHackTime() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getHackTime() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ return Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateHackingTime"])(server); //Returns seconds
+ },
+ getGrowTime : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getGrowTime) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getGrowTime = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetHackTimeRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getGrowTime() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getGrowTime() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ return Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateGrowTime"])(server) / 1000; //Returns seconds
+ },
+ getWeakenTime : function(ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getWeakenTime) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getWeakenTime = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetHackTimeRamCost;
+ }
+ }
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getWeakenTime() failed. Invalid IP or hostname passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getWeakenTime() failed. Invalid IP or hostname passed in: " + ip);
+ }
+ return Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["scriptCalculateWeakenTime"])(server) / 1000; //Returns seconds
+ },
+ getScriptIncome : function(scriptname, ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getScriptIncome) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getScriptIncome = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetScriptRamCost;
+ }
+ }
+ if (arguments.length === 0) {
+ //Get total script income
+ var res = [];
+ res.push(Object(_ActiveScriptsUI_js__WEBPACK_IMPORTED_MODULE_0__["updateActiveScriptsItems"])());
+ res.push(_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].scriptProdSinceLastAug / (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].playtimeSinceLastAug/1000));
+ return res;
+ } else {
+ //Get income for a particular script
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getScriptIncome() failed. Invalid IP or hostnamed passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getScriptIncome() failed. Invalid IP or hostnamed passed in: " + ip);
+ }
+ var argsForScript = [];
+ for (var i = 2; i < arguments.length; ++i) {
+ argsForScript.push(arguments[i]);
+ }
+ var runningScriptObj = Object(_Script_js__WEBPACK_IMPORTED_MODULE_15__["findRunningScript"])(scriptname, argsForScript, server);
+ if (runningScriptObj == null) {
+ workerScript.scriptRef.log("getScriptIncome() failed. No such script "+ scriptname + " on " + server.hostname + " with args: " + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_28__["printArray"])(argsForScript));
+ return -1;
+ }
+ return runningScriptObj.onlineMoneyMade / runningScriptObj.onlineRunningTime;
+ }
+ },
+ getScriptExpGain : function(scriptname, ip) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getScriptExpGain) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getScriptExpGain = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetScriptRamCost;
+ }
+ }
+ if (arguments.length === 0) {
+ var total = 0;
+ for (var i = 0; i < _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["workerScripts"].length; ++i) {
+ total += (_NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["workerScripts"][i].scriptRef.onlineExpGained / _NetscriptWorker_js__WEBPACK_IMPORTED_MODULE_22__["workerScripts"][i].scriptRef.onlineRunningTime);
+ }
+ return total;
+ } else {
+ //Get income for a particular script
+ var server = Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["getServer"])(ip);
+ if (server == null) {
+ workerScript.scriptRef.log("getScriptExpGain() failed. Invalid IP or hostnamed passed in: " + ip);
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "getScriptExpGain() failed. Invalid IP or hostnamed passed in: " + ip);
+ }
+ var argsForScript = [];
+ for (var i = 2; i < arguments.length; ++i) {
+ argsForScript.push(arguments[i]);
+ }
+ var runningScriptObj = Object(_Script_js__WEBPACK_IMPORTED_MODULE_15__["findRunningScript"])(scriptname, argsForScript, server);
+ if (runningScriptObj == null) {
+ workerScript.scriptRef.log("getScriptExpGain() failed. No such script "+ scriptname + " on " + server.hostname + " with args: " + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_28__["printArray"])(argsForScript));
+ return -1;
+ }
+ return runningScriptObj.onlineExpGained / runningScriptObj.onlineRunningTime;
+ }
+ },
+ getTimeSinceLastAug : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getTimeSinceLastAug) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getTimeSinceLastAug = true;
+ return _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptGetHackTimeRamCost;
+ }
+ }
+ return _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].playtimeSinceLastAug;
+ },
+ prompt : function(txt) {
+ if (workerScript.checkingRam) {return 0;}
+ if (_utils_YesNoBox_js__WEBPACK_IMPORTED_MODULE_31__["yesNoBoxOpen"]) {
+ workerScript.scriptRef.log("ERROR: confirm() failed because a pop-up dialog box is already open");
+ return false;
+ }
+ if (!Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["isString"])(txt)) {txt = String(txt);}
+ var yesBtn = Object(_utils_YesNoBox_js__WEBPACK_IMPORTED_MODULE_31__["yesNoBoxGetYesButton"])(), noBtn = Object(_utils_YesNoBox_js__WEBPACK_IMPORTED_MODULE_31__["yesNoBoxGetNoButton"])();
+ yesBtn.innerHTML = "Yes";
+ noBtn.innerHTML = "No";
+ return new Promise(function(resolve, reject) {
+ yesBtn.addEventListener("click", ()=>{
+ Object(_utils_YesNoBox_js__WEBPACK_IMPORTED_MODULE_31__["yesNoBoxClose"])();
+ resolve(true);
+ });
+ noBtn.addEventListener("click", ()=>{
+ Object(_utils_YesNoBox_js__WEBPACK_IMPORTED_MODULE_31__["yesNoBoxClose"])();
+ resolve(false);
+ });
+ Object(_utils_YesNoBox_js__WEBPACK_IMPORTED_MODULE_31__["yesNoBoxCreate"])(txt);
+ });
+ },
+
+ /* Singularity Functions */
+ universityCourse : function(universityName, className) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.universityCourse) {
+ return 0;
+ } else {
+ workerScript.loadedFns.universityCourse = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn1RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 1)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run universityCourse(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
+ return false;
+ }
+ }
+ if (_Missions_js__WEBPACK_IMPORTED_MODULE_13__["inMission"]) {
+ workerScript.scriptRef.log("ERROR: universityCourse() failed because you are in the middle of a mission.");
+ return;
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].isWorking) {
+ var txt = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].singularityStopWork();
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.universityCourse == null) {
+ workerScript.scriptRef.log(txt);
+ }
+ }
+
+ var costMult, expMult;
+ switch(universityName.toLowerCase()) {
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].AevumSummitUniversity.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city != _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Aevum) {
+ workerScript.scriptRef.log("ERROR: You cannot study at Summit University because you are not in Aevum. universityCourse() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].AevumSummitUniversity;
+ costMult = 4;
+ expMult = 3;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12RothmanUniversity.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city != _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12) {
+ workerScript.scriptRef.log("ERROR: You cannot study at Rothman University because you are not in Sector-12. universityCourse() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12RothmanUniversity;
+ costMult = 3;
+ expMult = 2;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].VolhavenZBInstituteOfTechnology.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city != _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Volhaven) {
+ workerScript.scriptRef.log("ERROR: You cannot study at ZB Institute of Technology because you are not in Volhaven. universityCourse() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].VolhavenZBInstituteOfTechnology;
+ costMult = 5;
+ expMult = 4;
+ break;
+ default:
+ workerScript.scriptRef.log("Invalid university name: " + universityName + ". universityCourse() failed");
+ return false;
+ }
+
+ var task;
+ switch(className.toLowerCase()) {
+ case "Study Computer Science".toLowerCase():
+ task = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassStudyComputerScience;
+ break;
+ case "Data Structures".toLowerCase():
+ task = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassDataStructures;
+ break;
+ case "Networks".toLowerCase():
+ task = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassNetworks;
+ break;
+ case "Algorithms".toLowerCase():
+ task = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassAlgorithms;
+ break;
+ case "Management".toLowerCase():
+ task = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassManagement;
+ break;
+ case "Leadership".toLowerCase():
+ task = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassLeadership;
+ break;
+ default:
+ workerScript.scriptRef.log("Invalid class name: " + className + ". universityCourse() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startClass(costMult, expMult, task);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.universityCourse == null) {
+ workerScript.scriptRef.log("Started " + task + " at " + universityName);
+ }
+ return true;
+ },
+
+ gymWorkout : function(gymName, stat) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.gymWorkout) {
+ return 0;
+ } else {
+ workerScript.loadedFns.gymWorkout = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn1RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 1)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run gymWorkout(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
+ return false;
+ }
+ }
+ if (_Missions_js__WEBPACK_IMPORTED_MODULE_13__["inMission"]) {
+ workerScript.scriptRef.log("ERROR: gymWorkout() failed because you are in the middle of a mission.");
+ return;
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].isWorking) {
+ var txt = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].singularityStopWork();
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.gymWorkout == null) {
+ workerScript.scriptRef.log(txt);
+ }
+ }
+ var costMult, expMult;
+ switch(gymName.toLowerCase()) {
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].AevumCrushFitnessGym.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city != _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Aevum) {
+ workerScript.scriptRef.log("ERROR: You cannot workout at Crush Fitness because you are not in Aevum. gymWorkout() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].AevumCrushFitnessGym;
+ costMult = 2;
+ expMult = 1.5;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].AevumSnapFitnessGym.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city != _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Aevum) {
+ workerScript.scriptRef.log("ERROR: You cannot workout at Snap Fitness because you are not in Aevum. gymWorkout() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].AevumSnapFitnessGym;
+ costMult = 6;
+ expMult = 4;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12IronGym.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city != _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12) {
+ workerScript.scriptRef.log("ERROR: You cannot workout at Iron Gym because you are not in Sector-12. gymWorkout() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12IronGym;
+ costMult = 1;
+ expMult = 1;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12PowerhouseGym.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city != _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12) {
+ workerScript.scriptRef.log("ERROR: You cannot workout at Powerhouse Gym because you are not in Sector-12. gymWorkout() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12PowerhouseGym;
+ costMult = 10;
+ expMult = 7.5;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].VolhavenMilleniumFitnessGym:
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city != _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Volhaven) {
+ workerScript.scriptRef.log("ERROR: You cannot workout at Millenium Fitness Gym because you are not in Volhaven. gymWorkout() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].VolhavenMilleniumFitnessGym;
+ costMult = 3;
+ expMult = 2.5;
+ break;
+ default:
+ workerScript.scriptRef.log("Invalid gym name: " + gymName + ". gymWorkout() failed");
+ return false;
+ }
+
+ switch(stat.toLowerCase()) {
+ case "strength".toLowerCase():
+ case "str".toLowerCase():
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startClass(costMult, expMult, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassGymStrength);
+ break;
+ case "defense".toLowerCase():
+ case "def".toLowerCase():
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startClass(costMult, expMult, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassGymDefense);
+ break;
+ case "dexterity".toLowerCase():
+ case "dex".toLowerCase():
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startClass(costMult, expMult, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassGymDexterity);
+ break;
+ case "agility".toLowerCase():
+ case "agi".toLowerCase():
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startClass(costMult, expMult, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ClassGymAgility);
+ break;
+ default:
+ workerScript.scriptRef.log("Invalid stat: " + stat + ". gymWorkout() failed");
+ return false;
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.gymWorkout == null) {
+ workerScript.scriptRef.log("Started training " + stat + " at " + gymName);
+ }
+ return true;
+ },
+
+ travelToCity(cityname) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.travelToCity) {
+ return 0;
+ } else {
+ workerScript.loadedFns.travelToCity = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn1RamCost / 2;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 1)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run travelToCity(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
+ return false;
+ }
+ }
+
+ switch(cityname) {
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Aevum:
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Chongqing:
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12:
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].NewTokyo:
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Ishima:
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Volhaven:
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(200000);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city = cityname;
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainIntelligenceExp(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].IntelligenceSingFnBaseExpGain);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.travelToCity == null) {
+ workerScript.scriptRef.log("Traveled to " + cityname);
+ }
+ return true;
+ default:
+ workerScript.scriptRef.log("ERROR: Invalid city name passed into travelToCity().");
+ return false;
+ }
+ },
+
+ purchaseTor() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.purchaseTor) {
+ return 0;
+ } else {
+ workerScript.loadedFns.purchaseTor = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn1RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 1)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run purchaseTor(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
+ return false;
+ }
+ }
+
+ if (_SpecialServerIps_js__WEBPACK_IMPORTED_MODULE_18__["SpecialServerIps"]["Darkweb Server"] != null) {
+ workerScript.scriptRef.log("You already have a TOR router! purchaseTor() failed");
+ return false;
+ }
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.lt(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].TorRouterCost)) {
+ workerScript.scriptRef.log("ERROR: You cannot afford to purchase a Tor router. purchaseTor() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].TorRouterCost);
+
+ var darkweb = new _Server_js__WEBPACK_IMPORTED_MODULE_16__["Server"](Object(_utils_IPAddress_js__WEBPACK_IMPORTED_MODULE_29__["createRandomIp"])(), "darkweb", "", false, false, false, 1);
+ Object(_Server_js__WEBPACK_IMPORTED_MODULE_16__["AddToAllServers"])(darkweb);
+ _SpecialServerIps_js__WEBPACK_IMPORTED_MODULE_18__["SpecialServerIps"].addIp("Darkweb Server", darkweb.ip);
+
+ document.getElementById("location-purchase-tor").setAttribute("class", "a-link-button-inactive");
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().serversOnNetwork.push(darkweb.ip);
+ darkweb.serversOnNetwork.push(_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().ip);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainIntelligenceExp(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].IntelligenceSingFnBaseExpGain);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.purchaseTor == null) {
+ workerScript.scriptRef.log("You have purchased a Tor router!");
+ }
+ return true;
+ },
+ purchaseProgram(programName) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.purchaseProgram) {
+ return 0;
+ } else {
+ workerScript.loadedFns.purchaseProgram = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn1RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 1)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run purchaseProgram(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
+ return false;
+ }
+ }
+
+ if (_SpecialServerIps_js__WEBPACK_IMPORTED_MODULE_18__["SpecialServerIps"]["Darkweb Server"] == null) {
+ workerScript.scriptRef.log("ERROR: You do not have TOR router. purchaseProgram() failed.");
+ return false;
+ }
+
+ switch(programName.toLowerCase()) {
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].BruteSSHProgram.toLowerCase():
+ var price = Object(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["parseDarkwebItemPrice"])(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["DarkWebItems"].BruteSSHProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].BruteSSHProgram);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.purchaseProgram == null) {
+ workerScript.scriptRef.log("You have purchased the BruteSSH.exe program. The new program can be found on your home computer.");
+ }
+ } else {
+ workerScript.scriptRef.log("Not enough money to purchase " + programName);
+ return false;
+ }
+ return true;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].FTPCrackProgram.toLowerCase():
+ var price = Object(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["parseDarkwebItemPrice"])(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["DarkWebItems"].FTPCrackProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].FTPCrackProgram);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.purchaseProgram == null) {
+ workerScript.scriptRef.log("You have purchased the FTPCrack.exe program. The new program can be found on your home computer.");
+ }
+ } else {
+ workerScript.scriptRef.log("Not enough money to purchase " + programName);
+ return false;
+ }
+ return true;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].RelaySMTPProgram.toLowerCase():
+ var price = Object(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["parseDarkwebItemPrice"])(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["DarkWebItems"].RelaySMTPProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].RelaySMTPProgram);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.purchaseProgram == null) {
+ workerScript.scriptRef.log("You have purchased the relaySMTP.exe program. The new program can be found on your home computer.");
+ }
+ } else {
+ workerScript.scriptRef.log("Not enough money to purchase " + programName);
+ return false;
+ }
+ return true;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].HTTPWormProgram.toLowerCase():
+ var price = Object(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["parseDarkwebItemPrice"])(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["DarkWebItems"].HTTPWormProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].HTTPWormProgram);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.purchaseProgram == null) {
+ workerScript.scriptRef.log("You have purchased the HTTPWorm.exe program. The new program can be found on your home computer.");
+ }
+ } else {
+ workerScript.scriptRef.log("Not enough money to purchase " + programName);
+ return false;
+ }
+ return true;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].SQLInjectProgram.toLowerCase():
+ var price = Object(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["parseDarkwebItemPrice"])(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["DarkWebItems"].SQLInjectProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].SQLInjectProgram);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.purchaseProgram == null) {
+ workerScript.scriptRef.log("You have purchased the SQLInject.exe program. The new program can be found on your home computer.");
+ }
+ } else {
+ workerScript.scriptRef.log("Not enough money to purchase " + programName);
+ return false;
+ }
+ return true;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].DeepscanV1.toLowerCase():
+ var price = Object(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["parseDarkwebItemPrice"])(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["DarkWebItems"].DeepScanV1Program);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].DeepscanV1);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.purchaseProgram == null) {
+ workerScript.scriptRef.log("You have purchased the DeepscanV1.exe program. The new program can be found on your home computer.");
+ }
+ } else {
+ workerScript.scriptRef.log("Not enough money to purchase " + programName);
+ return false;
+ }
+ return true;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].DeepscanV2.toLowerCase():
+ var price = Object(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["parseDarkwebItemPrice"])(_DarkWeb_js__WEBPACK_IMPORTED_MODULE_7__["DarkWebItems"].DeepScanV2Program);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].DeepscanV2);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.purchaseProgram == null) {
+ workerScript.scriptRef.log("You have purchased the DeepscanV2.exe program. The new program can be found on your home computer.");
+ }
+ } else {
+ workerScript.scriptRef.log("Not enough money to purchase " + programName);
+ return false;
+ }
+ return true;
+ default:
+ workerScript.scriptRef.log("ERROR: Invalid program passed into purchaseProgram().");
+ return false;
+ }
+ return true;
+ },
+ getStats : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getStats) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getStats = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn1RamCost / 4;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 1)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getStats(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
+ return {};
+ }
+ }
+
+ return {
+ hacking: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill,
+ strength: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].strength,
+ defense: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].defense,
+ dexterity: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].dexterity,
+ agility: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].agility,
+ charisma: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].charisma,
+ intelligence: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].intelligence
+ }
+ },
+ getCharacterInformation : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getCharacterInformation) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getCharacterInformation = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn1RamCost / 4;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 1)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getCharacterInformation(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
+ return {};
+ }
+ }
+
+ var companyPositionTitle = "";
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].companyPosition instanceof _Company_js__WEBPACK_IMPORTED_MODULE_4__["CompanyPosition"]) {
+ companyPositionTitle = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].companyPosition.positionName;
+ }
+ return {
+ bitnode: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN,
+ company: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].companyName,
+ jobTitle: companyPositionTitle,
+ city: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city,
+ factions: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].factions.slice(),
+ tor: _SpecialServerIps_js__WEBPACK_IMPORTED_MODULE_18__["SpecialServerIps"].hasOwnProperty("Darkweb Server"),
+ timeWorked: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].timeWorked,
+ workHackExpGain: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].workHackExpGained,
+ workStrExpGain: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].workStrExpGained,
+ workDefExpGain: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].workDefExpGained,
+ workDexExpGain: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].workDexExpGained,
+ workAgiExpGain: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].workAgiExpGained,
+ workChaExpGain: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].workChaExpGained,
+ workRepGain: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].workRepGained,
+ workMoneyGain: _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].workMoneyGained,
+ };
+ },
+ isBusy : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.isBusy) {
+ return 0;
+ } else {
+ workerScript.loadedFns.isBusy = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn1RamCost / 4;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 1)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run isBusy(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
+ return;
+ }
+ }
+ return _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].isWorking;
+ },
+ stopAction : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.stopAction) {
+ return 0;
+ } else {
+ workerScript.loadedFns.stopAction = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn1RamCost / 2;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 1)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run stopAction(). It is a Singularity Function and requires SourceFile-4 (level 1) to run.");
+ return false;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].isWorking) {
+ var txt = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].singularityStopWork();
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.stopAction == null) {
+ workerScript.scriptRef.log(txt);
+ }
+ return true;
+ }
+ return false;
+ },
+ upgradeHomeRam : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.upgradeHomeRam) {
+ return 0;
+ } else {
+ workerScript.loadedFns.upgradeHomeRam = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run upgradeHomeRam(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return false;
+ }
+ }
+
+ //Calculate how many times ram has been upgraded (doubled)
+ var currentRam = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().maxRam;
+ var numUpgrades = Math.log2(currentRam);
+
+ //Calculate cost
+ //Have cost increase by some percentage each time RAM has been upgraded
+ var cost = currentRam * _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].BaseCostFor1GBOfRamHome;
+ var mult = Math.pow(1.55, numUpgrades);
+ cost = cost * mult;
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].money.lt(cost)) {
+ workerScript.scriptRef.log("ERROR: upgradeHomeRam() failed because you don't have enough money");
+ return false;
+ }
+
+ var homeComputer = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer();
+ homeComputer.maxRam *= 2;
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].loseMoney(cost);
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainIntelligenceExp(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].IntelligenceSingFnBaseExpGain);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.upgradeHomeRam == null) {
+ workerScript.scriptRef.log("Purchased additional RAM for home computer! It now has " + homeComputer.maxRam + "GB of RAM.");
+ }
+ return true;
+ },
+ getUpgradeHomeRamCost : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getUpgradeHomeRamCost) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getUpgradeHomeRamCost = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost / 2;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getUpgradeHomeRamCost(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return false;
+ }
+ }
+
+ //Calculate how many times ram has been upgraded (doubled)
+ var currentRam = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].getHomeComputer().maxRam;
+ var numUpgrades = Math.log2(currentRam);
+
+ //Calculate cost
+ //Have cost increase by some percentage each time RAM has been upgraded
+ var cost = currentRam * _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].BaseCostFor1GBOfRamHome;
+ var mult = Math.pow(1.55, numUpgrades);
+ return cost * mult;
+ },
+ workForCompany : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.workForCompany) {
+ return 0;
+ } else {
+ workerScript.loadedFns.workForCompany = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run workForCompany(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return false;
+ }
+ }
+
+ if (_Missions_js__WEBPACK_IMPORTED_MODULE_13__["inMission"]) {
+ workerScript.scriptRef.log("ERROR: workForCompany() failed because you are in the middle of a mission.");
+ return;
+ }
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].companyPosition == "" || !(_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].companyPosition instanceof _Company_js__WEBPACK_IMPORTED_MODULE_4__["CompanyPosition"])) {
+ workerScript.scriptRef.log("ERROR: workForCompany() failed because you do not have a job");
+ return false;
+ }
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].isWorking) {
+ var txt = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].singularityStopWork();
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.workForCompany == null) {
+ workerScript.scriptRef.log(txt);
+ }
+ }
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].companyPosition.isPartTimeJob()) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startWorkPartTime();
+ } else {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startWork();
+ }
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.workForCompany == null) {
+ workerScript.scriptRef.log("Began working at " + _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].companyName + " as a " + _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].companyPosition.positionName);
+ }
+ return true;
+ },
+ applyToCompany : function(companyName, field) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.applyToCompany) {
+ return 0;
+ } else {
+ workerScript.loadedFns.applyToCompany = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run applyToCompany(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return false;
+ }
+ }
+
+ if (!Object(_Company_js__WEBPACK_IMPORTED_MODULE_4__["companyExists"])(companyName)) {
+ workerScript.scriptRef.log("ERROR: applyToCompany() failed because specified company " + companyName + " does not exist.");
+ return false;
+ }
+
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = companyName;
+ var res;
+ switch (field.toLowerCase()) {
+ case "software":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForSoftwareJob(true);
+ break;
+ case "software consultant":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForSoftwareConsultantJob(true);
+ break;
+ case "it":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForItJob(true);
+ break;
+ case "security engineer":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForSecurityEngineerJob(true);
+ break;
+ case "network engineer":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForNetworkEngineerJob(true);
+ break;
+ case "business":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForBusinessJob(true);
+ break;
+ case "business consultant":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForBusinessConsultantJob(true);
+ break;
+ case "security":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForSecurityJob(true);
+ break;
+ case "agent":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForAgentJob(true);
+ break;
+ case "employee":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForEmployeeJob(true);
+ break;
+ case "part-time employee":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForPartTimeEmployeeJob(true);
+ break;
+ case "waiter":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForWaiterJob(true);
+ break;
+ case "part-time waiter":
+ res = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].applyForPartTimeWaiterJob(true);
+ break;
+ default:
+ workerScript.scriptRef.log("ERROR: Invalid job passed into applyToCompany: " + field + ". applyToCompany() failed");
+ return false;
+ }
+ //The Player object's applyForJob function can return string with special error messages
+ if (Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["isString"])(res)) {
+ workerScript.scriptRef.log(res);
+ return false;
+ }
+ if (res) {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.applyToCompany == null) {
+ workerScript.scriptRef.log("You were offered a new job at " + companyName + " as a " + _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].companyPosition.positionName);
+ }
+ } else {
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.applyToCompany == null) {
+ workerScript.scriptRef.log("You failed to get a new job/promotion at " + companyName + " in the " + field + " field.");
+ }
+ }
+ return res;
+ },
+ getCompanyRep : function(companyName) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getCompanyRep) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getCompanyRep = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost / 4;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getCompanyRep(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return false;
+ }
+ }
+
+ var company = _Company_js__WEBPACK_IMPORTED_MODULE_4__["Companies"][companyName];
+ if (company == null || !(company instanceof _Company_js__WEBPACK_IMPORTED_MODULE_4__["Company"])) {
+ workerScript.scriptRef.log("ERROR: Invalid companyName passed into getCompanyRep(): " + companyName);
+ return -1;
+ }
+ return company.playerReputation;
+ },
+ getCompanyFavor : function(companyName) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getCompanyFavor) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getCompanyFavor = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost / 4;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getCompanyFavor(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return false;
+ }
+ }
+
+ var company = _Company_js__WEBPACK_IMPORTED_MODULE_4__["Companies"][companyName];
+ if (company == null || !(company instanceof _Company_js__WEBPACK_IMPORTED_MODULE_4__["Company"])) {
+ workerScript.scriptRef.log("ERROR: Invalid companyName passed into getCompanyFavor(): " + companyName);
+ return -1;
+ }
+ return company.favor;
+ },
+ checkFactionInvitations : function() {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.checkFactionInvitations) {
+ return 0;
+ } else {
+ workerScript.loadedFns.checkFactionInvitations = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run checkFactionInvitations(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return false;
+ }
+ }
+ //Make a copy of Player.factionInvitations
+ return _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].factionInvitations.slice();
+ },
+ joinFaction : function(name) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.joinFaction) {
+ return 0;
+ } else {
+ workerScript.loadedFns.joinFaction = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run joinFaction(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return false;
+ }
+ }
+
+ if (!Object(_Faction_js__WEBPACK_IMPORTED_MODULE_9__["factionExists"])(name)) {
+ workerScript.scriptRef.log("ERROR: Faction specified in joinFaction() does not exist.");
+ return false;
+ }
+
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].factionInvitations.includes(name)) {
+ workerScript.scriptRef.log("ERROR: Cannot join " + name + " Faction because you have not been invited. joinFaction() failed");
+ return false;
+ }
+
+ var index = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].factionInvitations.indexOf(name);
+ if (index === -1) {
+ //Redundant and should never happen...
+ workerScript.scriptRef.log("ERROR: Cannot join " + name + " Faction because you have not been invited. joinFaction() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].factionInvitations.splice(index, 1);
+ var fac = _Faction_js__WEBPACK_IMPORTED_MODULE_9__["Factions"][name];
+ Object(_Faction_js__WEBPACK_IMPORTED_MODULE_9__["joinFaction"])(fac);
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainIntelligenceExp(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].IntelligenceSingFnBaseExpGain);
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.joinFaction == null) {
+ workerScript.scriptRef.log("Joined the " + name + " faction.");
+ }
+ return true;
+ },
+ workForFaction : function(name, type) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.workForFaction) {
+ return 0;
+ } else {
+ workerScript.loadedFns.workForFaction = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run workForFaction(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return false;
+ }
+ }
+
+ if (_Missions_js__WEBPACK_IMPORTED_MODULE_13__["inMission"]) {
+ workerScript.scriptRef.log("ERROR: workForFaction() failed because you are in the middle of a mission.");
+ return;
+ }
+
+ if (!Object(_Faction_js__WEBPACK_IMPORTED_MODULE_9__["factionExists"])(name)) {
+ workerScript.scriptRef.log("ERROR: Faction specified in workForFaction() does not exist.");
+ return false;
+ }
+
+ if (!_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].factions.includes(name)) {
+ workerScript.scriptRef.log("ERROR: workForFaction() failed because you are not a member of " + name);
+ return false;
+ }
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].isWorking) {
+ var txt = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].singularityStopWork();
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.workForFaction == null) {
+ workerScript.scriptRef.log(txt);
+ }
+ }
+
+ var fac = _Faction_js__WEBPACK_IMPORTED_MODULE_9__["Factions"][name];
+ //Arrays listing factions that allow each time of work
+ var hackAvailable = ["Illuminati", "Daedalus", "The Covenant", "ECorp", "MegaCorp",
+ "Bachman & Associates", "Blade Industries", "NWO", "Clarke Incorporated",
+ "OmniTek Incorporated", "Four Sigma", "KuaiGong International",
+ "Fulcrum Secret Technologies", "BitRunners", "The Black Hand",
+ "NiteSec", "Chongqing", "Sector-12", "New Tokyo", "Aevum",
+ "Ishima", "Volhaven", "Speakers for the Dead", "The Dark Army",
+ "The Syndicate", "Silhouette", "Netburners", "Tian Di Hui", "CyberSec"];
+ var fdWkAvailable = ["Illuminati", "Daedalus", "The Covenant", "ECorp", "MegaCorp",
+ "Bachman & Associates", "Blade Industries", "NWO", "Clarke Incorporated",
+ "OmniTek Incorporated", "Four Sigma", "KuaiGong International",
+ "The Black Hand", "Chongqing", "Sector-12", "New Tokyo", "Aevum",
+ "Ishima", "Volhaven", "Speakers for the Dead", "The Dark Army",
+ "The Syndicate", "Silhouette", "Tetrads", "Slum Snakes"];
+ var scWkAvailable = ["ECorp", "MegaCorp",
+ "Bachman & Associates", "Blade Industries", "NWO", "Clarke Incorporated",
+ "OmniTek Incorporated", "Four Sigma", "KuaiGong International",
+ "Fulcrum Secret Technologies", "Chongqing", "Sector-12", "New Tokyo", "Aevum",
+ "Ishima", "Volhaven", "Speakers for the Dead",
+ "The Syndicate", "Tetrads", "Slum Snakes", "Tian Di Hui"];
+
+ switch (type.toLowerCase()) {
+ case "hacking":
+ case "hacking contracts":
+ case "hackingcontracts":
+ if (!hackAvailable.includes(fac.name)) {
+ workerScript.scriptRef.log("ERROR: Cannot carry out hacking contracts for " + fac.name + ". workForFaction() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startFactionHackWork(fac);
+ workerScript.scriptRef.log("Started carrying out hacking contracts for " + fac.name);
+ return true;
+ case "field":
+ case "fieldwork":
+ case "field work":
+ if (!fdWkAvailable.includes(fac.name)) {
+ workerScript.scriptRef.log("ERROR: Cannot carry out field missions for " + fac.name + ". workForFaction() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startFactionFieldWork(fac);
+ workerScript.scriptRef.log("Started carrying out field missions for " + fac.name);
+ return true;
+ case "security":
+ case "securitywork":
+ case "security work":
+ if (!scWkAvailable.includes(fac.name)) {
+ workerScript.scriptRef.log("ERROR: Cannot serve as security detail for " + fac.name + ". workForFaction() failed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startFactionSecurityWork(fac);
+ workerScript.scriptRef.log("Started serving as security details for " + fac.name);
+ return true;
+ default:
+ workerScript.scriptRef.log("ERROR: Invalid work type passed into workForFaction(): " + type);
+ }
+ return true;
+ },
+ getFactionRep : function(name) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getFactionRep) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getFactionRep = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost / 4;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getFactionRep(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return -1;
+ }
+ }
+
+ if (!Object(_Faction_js__WEBPACK_IMPORTED_MODULE_9__["factionExists"])(name)) {
+ workerScript.scriptRef.log("ERROR: Faction specified in getFactionRep() does not exist.");
+ return -1;
+ }
+
+ return _Faction_js__WEBPACK_IMPORTED_MODULE_9__["Factions"][name].playerReputation;
+ },
+ getFactionFavor : function(name) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getFactionFavor) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getFactionFavor = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn2RamCost / 4;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 2)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getFactionFavor(). It is a Singularity Function and requires SourceFile-4 (level 2) to run.");
+ return -1;
+ }
+ }
+
+ if (!Object(_Faction_js__WEBPACK_IMPORTED_MODULE_9__["factionExists"])(name)) {
+ workerScript.scriptRef.log("ERROR: Faction specified in getFactionFavor() does not exist.");
+ return -1;
+ }
+
+ return _Faction_js__WEBPACK_IMPORTED_MODULE_9__["Factions"][name].favor;
+ },
+ createProgram : function(name) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.createProgram) {
+ return 0;
+ } else {
+ workerScript.loadedFns.createProgram = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn3RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run createProgram(). It is a Singularity Function and requires SourceFile-4 (level 3) to run.");
+ return false;
+ }
+ }
+ if (_Missions_js__WEBPACK_IMPORTED_MODULE_13__["inMission"]) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because you are in the middle of a mission.");
+ return;
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].isWorking) {
+ var txt = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].singularityStopWork();
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.createProgram == null) {
+ workerScript.scriptRef.log(txt);
+ }
+ }
+
+ switch(name.toLowerCase()) {
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].NukeProgram.toLowerCase():
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].NukeProgram, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPerFiveMinutes, 1);
+ break;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].BruteSSHProgram.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill < 50) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create BruteSSH (level 50 req)");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].BruteSSHProgram, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPerFiveMinutes * 2, 50);
+ break;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].FTPCrackProgram.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill < 100) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create FTPCrack (level 100 req)");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].FTPCrackProgram, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPerHalfHour, 100);
+ break;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].RelaySMTPProgram.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill < 250) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create relaySMTP (level 250 req)");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].RelaySMTPProgram, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPer2Hours, 250);
+ break;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].HTTPWormProgram.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill < 500) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create HTTPWorm (level 500 req)");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].HTTPWormProgram, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPer4Hours, 500);
+ break;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].SQLInjectProgram.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill < 750) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create SQLInject (level 750 req)");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].SQLInjectProgram, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPer8Hours, 750);
+ break;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].DeepscanV1.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill < 75) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create DeepscanV1 (level 75 req)");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].DeepscanV1, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPerQuarterHour, 75);
+ break;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].DeepscanV2.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill < 400) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create DeepscanV2 (level 400 req)");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].DeepscanV2, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPer2Hours, 400);
+ break;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].ServerProfiler.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill < 75) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create ServerProfiler (level 75 req)");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].ServerProfiler, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPerHalfHour, 75);
+ break;
+ case _CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].AutoLink.toLowerCase():
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].hacking_skill < 25) {
+ workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create AutoLink (level 25 req)");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].startCreateProgramWork(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_6__["Programs"].AutoLink, _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].MillisecondsPerQuarterHour, 25);
+ break;
+ default:
+ workerScript.scriptRef.log("ERROR: createProgram() failed because the specified program does not exist: " + name);
+ return false;
+ }
+ workerScript.scriptRef.log("Began creating program: " + name);
+ return true;
+ },
+ commitCrime : function(crime) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.commitCrime) {
+ return 0;
+ } else {
+ workerScript.loadedFns.commitCrime = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn3RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run commitCrime(). It is a Singularity Function and requires SourceFile-4 (level 3) to run.");
+ return;
+ }
+ }
+ if (_Missions_js__WEBPACK_IMPORTED_MODULE_13__["inMission"]) {
+ workerScript.scriptRef.log("ERROR: commitCrime() failed because you are in the middle of a mission.");
+ return;
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].isWorking) {
+ var txt = _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].singularityStopWork();
+ if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.commitCrime == null) {
+ workerScript.scriptRef.log(txt);
+ }
+ }
+
+ //Set Location to slums
+ switch(_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].city) {
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Aevum:
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].AevumSlums;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Chongqing:
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].ChongqingSlums;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12:
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Sector12Slums;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].NewTokyo:
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].NewTokyoSlums;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Ishima:
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].IshimaSlums;
+ break;
+ case _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].Volhaven:
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].location = _Location_js__WEBPACK_IMPORTED_MODULE_11__["Locations"].VolhavenSlums;
+ break;
+ default:
+ console.log("Invalid Player.city value");
+ }
+
+ crime = crime.toLowerCase();
+ if (crime.includes("shoplift")) {
+ workerScript.scriptRef.log("Attempting to shoplift...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitShopliftCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("rob") && crime.includes("store")) {
+ workerScript.scriptRef.log("Attempting to rob a store...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitRobStoreCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("mug")) {
+ workerScript.scriptRef.log("Attempting to mug someone...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitMugCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("larceny")) {
+ workerScript.scriptRef.log("Attempting to commit larceny...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitLarcenyCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("drugs")) {
+ workerScript.scriptRef.log("Attempting to deal drugs...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitDealDrugsCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("bond") && crime.includes("forge")) {
+ workerScript.scriptRef.log("Attempting to forge corporate bonds...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitBondForgeryCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("traffick") && crime.includes("arms")) {
+ workerScript.scriptRef.log("Attempting to traffick illegal arms...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitTraffickArmsCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("homicide")) {
+ workerScript.scriptRef.log("Attempting to commit homicide...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitHomicideCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("grand") && crime.includes("auto")) {
+ workerScript.scriptRef.log("Attempting to commit grand theft auto...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitGrandTheftAutoCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("kidnap")) {
+ workerScript.scriptRef.log("Attempting to kidnap and ransom a high-profile target...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitKidnapCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else if (crime.includes("assassinate")) {
+ workerScript.scriptRef.log("Attempting to assassinate a high-profile target...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitAssassinationCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript})
+ } else if (crime.includes("heist")) {
+ workerScript.scriptRef.log("Attempting to pull off a heist...");
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["commitHeistCrime"])(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].CrimeSingFnDivider, {workerscript: workerScript});
+ } else {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid crime passed into commitCrime(): " + crime);
+ }
+ },
+ getCrimeChance : function(crime) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getCrimeChance) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getCrimeChance = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn3RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getCrimeChance(). It is a Singularity Function and requires SourceFile-4 (level 3) to run.");
+ return;
+ }
+ }
+
+ crime = crime.toLowerCase();
+ if (crime.includes("shoplift")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceShoplift"])();
+ } else if (crime.includes("rob") && crime.includes("store")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceRobStore"])();
+ } else if (crime.includes("mug")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceMug"])();
+ } else if (crime.includes("larceny")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceLarceny"])();
+ } else if (crime.includes("drugs")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceDealDrugs"])();
+ } else if (crime.includes("bond") && crime.includes("forge")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceBondForgery"])();
+ } else if (crime.includes("traffick") && crime.includes("arms")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceTraffickArms"])();
+ } else if (crime.includes("homicide")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceHomicide"])();
+ } else if (crime.includes("grand") && crime.includes("auto")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceGrandTheftAuto"])();
+ } else if (crime.includes("kidnap")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceKidnap"])();
+ } else if (crime.includes("assassinate")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceAssassination"])();
+ } else if (crime.includes("heist")) {
+ return Object(_Crimes_js__WEBPACK_IMPORTED_MODULE_3__["determineCrimeChanceHeist"])();
+ } else {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Invalid crime passed into getCrimeChance(): " + crime);
+ }
+ },
+ getOwnedAugmentations : function(purchased=false) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getOwnedAugmentations) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getOwnedAugmentations = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn3RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getOwnedAugmentations(). It is a Singularity Function and requires SourceFile-4 (level 3) to run.");
+ return [];
+ }
+ }
+ var res = [];
+ for (var i = 0; i < _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].augmentations.length; ++i) {
+ res.push(_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].augmentations[i].name);
+ }
+ if (purchased) {
+ for (var i = 0; i < _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].queuedAugmentations.length; ++i) {
+ res.push(_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].queuedAugmentations[i].name);
+ }
+ }
+ return res;
+ },
+ getAugmentationsFromFaction : function(facname) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getAugmentationsFromFaction) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getAugmentationsFromFaction = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn3RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getAugmentationsFromFaction(). It is a Singularity Function and requires SourceFile-4 (level 3) to run.");
+ return [];
+ }
+ }
+
+ if (!Object(_Faction_js__WEBPACK_IMPORTED_MODULE_9__["factionExists"])(facname)) {
+ workerScript.scriptRef.log("ERROR: getAugmentationsFromFaction() failed. Invalid faction name passed in (this is case-sensitive): " + facname);
+ return [];
+ }
+
+ var fac = _Faction_js__WEBPACK_IMPORTED_MODULE_9__["Factions"][facname];
+ var res = [];
+ for (var i = 0; i < fac.augmentations.length; ++i) {
+ res.push(fac.augmentations[i]);
+ }
+ return res;
+ },
+ getAugmentationCost : function(name) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.getAugmentationCost) {
+ return 0;
+ } else {
+ workerScript.loadedFns.getAugmentationCost = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn3RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run getAugmentationCost(). It is a Singularity Function and requires SourceFile-4 (level 3) to run.");
+ return false;
+ }
+ }
+
+ if (!Object(_Augmentations_js__WEBPACK_IMPORTED_MODULE_1__["augmentationExists"])(name)) {
+ workerScript.scriptRef.log("ERROR: getAugmentationCost() failed. Invalid Augmentation name passed in (note: this is case-sensitive): " + name);
+ return [-1, -1];
+ }
+
+ var aug = _Augmentations_js__WEBPACK_IMPORTED_MODULE_1__["Augmentations"][name];
+ return [aug.baseRepRequirement, aug.baseCost];
+ },
+ purchaseAugmentation : function(faction, name) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.purchaseAugmentation) {
+ return 0;
+ } else {
+ workerScript.loadedFns.purchaseAugmentation = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn3RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run purchaseAugmentation(). It is a Singularity Function and requires SourceFile-4 (level 3) to run.");
+ return false;
+ }
+ }
+
+ var fac = _Faction_js__WEBPACK_IMPORTED_MODULE_9__["Factions"][faction];
+ if (fac == null || !(fac instanceof _Faction_js__WEBPACK_IMPORTED_MODULE_9__["Faction"])) {
+ workerScript.scriptRef.log("ERROR: purchaseAugmentation() failed because of invalid faction name: " + faction);
+ return false;
+ }
+
+ if (!fac.augmentations.includes(name)) {
+ workerScript.scriptRef.log("ERROR: purchaseAugmentation() failed because the faction " + faction + " does not contain the " + name + " augmentation");
+ return false;
+ }
+
+ var aug = _Augmentations_js__WEBPACK_IMPORTED_MODULE_1__["Augmentations"][name];
+ if (aug == null || !(aug instanceof _Augmentations_js__WEBPACK_IMPORTED_MODULE_1__["Augmentation"])) {
+ workerScript.scriptRef.log("ERROR: purchaseAugmentation() failed because of invalid augmentation name: " + name);
+ return false;
+ }
+
+ var isNeuroflux = false;
+ if (aug.name === _Augmentations_js__WEBPACK_IMPORTED_MODULE_1__["AugmentationNames"].NeuroFluxGovernor) {
+ isNeuroflux = true;
+ }
+
+ if (!isNeuroflux) {
+ for (var j = 0; j < _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].queuedAugmentations.length; ++j) {
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].queuedAugmentations[j].name === aug.name) {
+ workerScript.scriptRef.log("ERROR: purchaseAugmentation() failed because you already have " + name);
+ return false;
+ }
+ }
+ for (var j = 0; j < _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].augmentations.length; ++j) {
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].augmentations[j].name === aug.name) {
+ workerScript.scriptRef.log("ERROR: purchaseAugmentation() failed because you already have " + name);
+ return false;
+ }
+ }
+ }
+
+ if (fac.playerReputation < aug.baseRepRequirement) {
+ workerScript.scriptRef.log("ERROR: purchaseAugmentation() failed because you do not have enough reputation with " + fac.name);
+ return false;
+ }
+
+ var res = Object(_Faction_js__WEBPACK_IMPORTED_MODULE_9__["purchaseAugmentation"])(aug, fac, true);
+ workerScript.scriptRef.log(res);
+ if (Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_30__["isString"])(res) && res.startsWith("You purchased")) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainIntelligenceExp(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].IntelligenceSingFnBaseExpGain);
+ return true;
+ } else {
+ return false;
+ }
+ },
+ installAugmentations : function(cbScript) {
+ if (workerScript.checkingRam) {
+ if (workerScript.loadedFns.installAugmentations) {
+ return 0;
+ } else {
+ workerScript.loadedFns.installAugmentations = true;
+ var ramCost = _Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].ScriptSingularityFn3RamCost;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN !== 4) {ramCost *= 8;}
+ return ramCost;
+ }
+ }
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].bitNodeN != 4) {
+ if (!(hasSingularitySF && singularitySFLvl >= 3)) {
+ throw Object(_NetscriptEvaluator_js__WEBPACK_IMPORTED_MODULE_23__["makeRuntimeRejectMsg"])(workerScript, "Cannot run installAugmentations(). It is a Singularity Function and requires SourceFile-4 (level 3) to run.");
+ return false;
+ }
+ }
+
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].queuedAugmentations.length === 0) {
+ workerScript.scriptRef.log("ERROR: installAugmentations() failed because you do not have any Augmentations to be installed");
+ return false;
+ }
+ _Player_js__WEBPACK_IMPORTED_MODULE_14__["Player"].gainIntelligenceExp(_Constants_js__WEBPACK_IMPORTED_MODULE_5__["CONSTANTS"].IntelligenceSingFnBaseExpGain);
+ workerScript.scriptRef.log("Installing Augmentations. This will cause this script to be killed");
+ Object(_Augmentations_js__WEBPACK_IMPORTED_MODULE_1__["installAugmentations"])(cbScript);
+ return true;
+ }
+ }
+}
+
+
+
+
+/***/ }),
+/* 30 */
+/*!**********************!*\
+ !*** ./src/Alias.js ***!
+ \**********************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Aliases", function() { return Aliases; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GlobalAliases", function() { return GlobalAliases; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "printAliases", function() { return printAliases; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseAliasDeclaration", function() { return parseAliasDeclaration; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeAlias", function() { return removeAlias; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "substituteAliases", function() { return substituteAliases; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadAliases", function() { return loadAliases; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadGlobalAliases", function() { return loadGlobalAliases; });
+/* harmony import */ var _Terminal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Terminal.js */ 22);
+
+
+let Aliases = {};
+let GlobalAliases = {};
+
+function loadAliases(saveString) {
+ if (saveString === "") {
+ Aliases = {};
+ } else {
+ Aliases = JSON.parse(saveString);
+ }
+}
+
+function loadGlobalAliases(saveString) {
+ if (saveString === "") {
+ GlobalAliases = {};
+ } else {
+ GlobalAliases = JSON.parse(saveString);
+ }
+}
+
+//Print all aliases to terminal
+function printAliases() {
+ for (var name in Aliases) {
+ if (Aliases.hasOwnProperty(name)) {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_0__["post"])("alias " + name + "=" + Aliases[name]);
+ }
+ }
+ for (var name in GlobalAliases) {
+ if (GlobalAliases.hasOwnProperty(name)) {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_0__["post"])("global alias " + name + "=" + GlobalAliases[name]);
+ }
+ }
+}
+
+//True if successful, false otherwise
+function parseAliasDeclaration(dec,global=false) {
+ var re = /^([_|\w|!|%|,|@]+)="(.+)"$/;
+ var matches = dec.match(re);
+ if (matches == null || matches.length != 3) {return false;}
+ if (global){
+ addGlobalAlias(matches[1],matches[2]);
+ } else {
+ addAlias(matches[1], matches[2]);
+ }
+ return true;
+}
+
+function addAlias(name, value) {
+ if (name in GlobalAliases){
+ delete GlobalAliases[name];
+ }
+ Aliases[name] = value;
+}
+
+function addGlobalAlias(name, value) {
+ if (name in Aliases){
+ delete Aliases[name];
+ }
+ GlobalAliases[name] = value;
+}
+
+function getAlias(name) {
+ if (Aliases.hasOwnProperty(name)) {
+ return Aliases[name];
+ }
+ return null;
+}
+
+function getGlobalAlias(name) {
+ if (GlobalAliases.hasOwnProperty(name)) {
+ return GlobalAliases[name];
+ }
+ return null;
+}
+
+function removeAlias(name) {
+ if (Aliases.hasOwnProperty(name)) {
+ delete Aliases[name];
+ return true;
+ }
+ if (GlobalAliases.hasOwnProperty(name)) {
+ delete GlobalAliases[name];
+ return true;
+ }
+ return false;
+}
+
+//Returns the original string with any aliases substituted in
+//Aliases only applied to "whole words", one level deep
+function substituteAliases(origCommand) {
+ var commandArray = origCommand.split(" ");
+ if (commandArray.length>0){
+ var alias = getAlias(commandArray[0]);
+ if (alias != null) {
+ commandArray[0] = alias;
+ } else {
+ var alias = getGlobalAlias(commandArray[0]);
+ if (alias != null) {
+ commandArray[0] = alias;
+ }
+ }
+ for (var i = 0; i < commandArray.length; ++i) {
+ var alias = getGlobalAlias(commandArray[i]);
+ if (alias != null) {
+ commandArray[i] = alias;
+ }
+ }
+ }
+ return commandArray.join(" ");
+}
+
+
+
+
+/***/ }),
+/* 31 */
+/*!*****************************************!*\
+ !*** ./node_modules/jszip/lib/utils.js ***!
+ \*****************************************/
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var support = __webpack_require__(/*! ./support */ 50);
+var base64 = __webpack_require__(/*! ./base64 */ 104);
+var nodejsUtils = __webpack_require__(/*! ./nodejsUtils */ 64);
+var setImmediate = __webpack_require__(/*! core-js/library/fn/set-immediate */ 164);
+var external = __webpack_require__(/*! ./external */ 58);
+
+
+/**
+ * Convert a string that pass as a "binary string": it should represent a byte
+ * array but may have > 255 char codes. Be sure to take only the first byte
+ * and returns the byte array.
+ * @param {String} str the string to transform.
+ * @return {Array|Uint8Array} the string in a binary format.
+ */
+function string2binary(str) {
+ var result = null;
+ if (support.uint8array) {
+ result = new Uint8Array(str.length);
+ } else {
+ result = new Array(str.length);
+ }
+ return stringToArrayLike(str, result);
+}
+
+/**
+ * Create a new blob with the given content and the given type.
+ * @param {String|ArrayBuffer} part the content to put in the blob. DO NOT use
+ * an Uint8Array because the stock browser of android 4 won't accept it (it
+ * will be silently converted to a string, "[object Uint8Array]").
+ *
+ * Use only ONE part to build the blob to avoid a memory leak in IE11 / Edge:
+ * when a large amount of Array is used to create the Blob, the amount of
+ * memory consumed is nearly 100 times the original data amount.
+ *
+ * @param {String} type the mime type of the blob.
+ * @return {Blob} the created blob.
+ */
+exports.newBlob = function(part, type) {
+ exports.checkSupport("blob");
+
+ try {
+ // Blob constructor
+ return new Blob([part], {
+ type: type
+ });
+ }
+ catch (e) {
+
+ try {
+ // deprecated, browser only, old way
+ var Builder = self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder;
+ var builder = new Builder();
+ builder.append(part);
+ return builder.getBlob(type);
+ }
+ catch (e) {
+
+ // well, fuck ?!
+ throw new Error("Bug : can't construct the Blob.");
+ }
+ }
+
+
+};
+/**
+ * The identity function.
+ * @param {Object} input the input.
+ * @return {Object} the same input.
+ */
+function identity(input) {
+ return input;
+}
+
+/**
+ * Fill in an array with a string.
+ * @param {String} str the string to use.
+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).
+ * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.
+ */
+function stringToArrayLike(str, array) {
+ for (var i = 0; i < str.length; ++i) {
+ array[i] = str.charCodeAt(i) & 0xFF;
+ }
+ return array;
+}
+
+/**
+ * An helper for the function arrayLikeToString.
+ * This contains static informations and functions that
+ * can be optimized by the browser JIT compiler.
+ */
+var arrayToStringHelper = {
+ /**
+ * Transform an array of int into a string, chunk by chunk.
+ * See the performances notes on arrayLikeToString.
+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
+ * @param {String} type the type of the array.
+ * @param {Integer} chunk the chunk size.
+ * @return {String} the resulting string.
+ * @throws Error if the chunk is too big for the stack.
+ */
+ stringifyByChunk: function(array, type, chunk) {
+ var result = [], k = 0, len = array.length;
+ // shortcut
+ if (len <= chunk) {
+ return String.fromCharCode.apply(null, array);
+ }
+ while (k < len) {
+ if (type === "array" || type === "nodebuffer") {
+ result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
+ }
+ else {
+ result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
+ }
+ k += chunk;
+ }
+ return result.join("");
+ },
+ /**
+ * Call String.fromCharCode on every item in the array.
+ * This is the naive implementation, which generate A LOT of intermediate string.
+ * This should be used when everything else fail.
+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
+ * @return {String} the result.
+ */
+ stringifyByChar: function(array){
+ var resultStr = "";
+ for(var i = 0; i < array.length; i++) {
+ resultStr += String.fromCharCode(array[i]);
+ }
+ return resultStr;
+ },
+ applyCanBeUsed : {
+ /**
+ * true if the browser accepts to use String.fromCharCode on Uint8Array
+ */
+ uint8array : (function () {
+ try {
+ return support.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
+ } catch (e) {
+ return false;
+ }
+ })(),
+ /**
+ * true if the browser accepts to use String.fromCharCode on nodejs Buffer.
+ */
+ nodebuffer : (function () {
+ try {
+ return support.nodebuffer && String.fromCharCode.apply(null, nodejsUtils.allocBuffer(1)).length === 1;
+ } catch (e) {
+ return false;
+ }
+ })()
+ }
+};
+
+/**
+ * Transform an array-like object to a string.
+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
+ * @return {String} the result.
+ */
+function arrayLikeToString(array) {
+ // Performances notes :
+ // --------------------
+ // String.fromCharCode.apply(null, array) is the fastest, see
+ // see http://jsperf.com/converting-a-uint8array-to-a-string/2
+ // but the stack is limited (and we can get huge arrays !).
+ //
+ // result += String.fromCharCode(array[i]); generate too many strings !
+ //
+ // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2
+ // TODO : we now have workers that split the work. Do we still need that ?
+ var chunk = 65536,
+ type = exports.getTypeOf(array),
+ canUseApply = true;
+ if (type === "uint8array") {
+ canUseApply = arrayToStringHelper.applyCanBeUsed.uint8array;
+ } else if (type === "nodebuffer") {
+ canUseApply = arrayToStringHelper.applyCanBeUsed.nodebuffer;
+ }
+
+ if (canUseApply) {
+ while (chunk > 1) {
+ try {
+ return arrayToStringHelper.stringifyByChunk(array, type, chunk);
+ } catch (e) {
+ chunk = Math.floor(chunk / 2);
+ }
+ }
+ }
+
+ // no apply or chunk error : slow and painful algorithm
+ // default browser on android 4.*
+ return arrayToStringHelper.stringifyByChar(array);
+}
+
+exports.applyFromCharCode = arrayLikeToString;
+
+
+/**
+ * Copy the data from an array-like to an other array-like.
+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.
+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.
+ * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.
+ */
+function arrayLikeToArrayLike(arrayFrom, arrayTo) {
+ for (var i = 0; i < arrayFrom.length; i++) {
+ arrayTo[i] = arrayFrom[i];
+ }
+ return arrayTo;
+}
+
+// a matrix containing functions to transform everything into everything.
+var transform = {};
+
+// string to ?
+transform["string"] = {
+ "string": identity,
+ "array": function(input) {
+ return stringToArrayLike(input, new Array(input.length));
+ },
+ "arraybuffer": function(input) {
+ return transform["string"]["uint8array"](input).buffer;
+ },
+ "uint8array": function(input) {
+ return stringToArrayLike(input, new Uint8Array(input.length));
+ },
+ "nodebuffer": function(input) {
+ return stringToArrayLike(input, nodejsUtils.allocBuffer(input.length));
+ }
+};
+
+// array to ?
+transform["array"] = {
+ "string": arrayLikeToString,
+ "array": identity,
+ "arraybuffer": function(input) {
+ return (new Uint8Array(input)).buffer;
+ },
+ "uint8array": function(input) {
+ return new Uint8Array(input);
+ },
+ "nodebuffer": function(input) {
+ return nodejsUtils.newBufferFrom(input);
+ }
+};
+
+// arraybuffer to ?
+transform["arraybuffer"] = {
+ "string": function(input) {
+ return arrayLikeToString(new Uint8Array(input));
+ },
+ "array": function(input) {
+ return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
+ },
+ "arraybuffer": identity,
+ "uint8array": function(input) {
+ return new Uint8Array(input);
+ },
+ "nodebuffer": function(input) {
+ return nodejsUtils.newBufferFrom(new Uint8Array(input));
+ }
+};
+
+// uint8array to ?
+transform["uint8array"] = {
+ "string": arrayLikeToString,
+ "array": function(input) {
+ return arrayLikeToArrayLike(input, new Array(input.length));
+ },
+ "arraybuffer": function(input) {
+ return input.buffer;
+ },
+ "uint8array": identity,
+ "nodebuffer": function(input) {
+ return nodejsUtils.newBufferFrom(input);
+ }
+};
+
+// nodebuffer to ?
+transform["nodebuffer"] = {
+ "string": arrayLikeToString,
+ "array": function(input) {
+ return arrayLikeToArrayLike(input, new Array(input.length));
+ },
+ "arraybuffer": function(input) {
+ return transform["nodebuffer"]["uint8array"](input).buffer;
+ },
+ "uint8array": function(input) {
+ return arrayLikeToArrayLike(input, new Uint8Array(input.length));
+ },
+ "nodebuffer": identity
+};
+
+/**
+ * Transform an input into any type.
+ * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.
+ * If no output type is specified, the unmodified input will be returned.
+ * @param {String} outputType the output type.
+ * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.
+ * @throws {Error} an Error if the browser doesn't support the requested output type.
+ */
+exports.transformTo = function(outputType, input) {
+ if (!input) {
+ // undefined, null, etc
+ // an empty string won't harm.
+ input = "";
+ }
+ if (!outputType) {
+ return input;
+ }
+ exports.checkSupport(outputType);
+ var inputType = exports.getTypeOf(input);
+ var result = transform[inputType][outputType](input);
+ return result;
+};
+
+/**
+ * Return the type of the input.
+ * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.
+ * @param {Object} input the input to identify.
+ * @return {String} the (lowercase) type of the input.
+ */
+exports.getTypeOf = function(input) {
+ if (typeof input === "string") {
+ return "string";
+ }
+ if (Object.prototype.toString.call(input) === "[object Array]") {
+ return "array";
+ }
+ if (support.nodebuffer && nodejsUtils.isBuffer(input)) {
+ return "nodebuffer";
+ }
+ if (support.uint8array && input instanceof Uint8Array) {
+ return "uint8array";
+ }
+ if (support.arraybuffer && input instanceof ArrayBuffer) {
+ return "arraybuffer";
+ }
+};
+
+/**
+ * Throw an exception if the type is not supported.
+ * @param {String} type the type to check.
+ * @throws {Error} an Error if the browser doesn't support the requested type.
+ */
+exports.checkSupport = function(type) {
+ var supported = support[type.toLowerCase()];
+ if (!supported) {
+ throw new Error(type + " is not supported by this platform");
+ }
+};
+
+exports.MAX_VALUE_16BITS = 65535;
+exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1
+
+/**
+ * Prettify a string read as binary.
+ * @param {string} str the string to prettify.
+ * @return {string} a pretty string.
+ */
+exports.pretty = function(str) {
+ var res = '',
+ code, i;
+ for (i = 0; i < (str || "").length; i++) {
+ code = str.charCodeAt(i);
+ res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
+ }
+ return res;
+};
+
+/**
+ * Defer the call of a function.
+ * @param {Function} callback the function to call asynchronously.
+ * @param {Array} args the arguments to give to the callback.
+ */
+exports.delay = function(callback, args, self) {
+ setImmediate(function () {
+ callback.apply(self || null, args || []);
+ });
+};
+
+/**
+ * Extends a prototype with an other, without calling a constructor with
+ * side effects. Inspired by nodejs' `utils.inherits`
+ * @param {Function} ctor the constructor to augment
+ * @param {Function} superCtor the parent constructor to use
+ */
+exports.inherits = function (ctor, superCtor) {
+ var Obj = function() {};
+ Obj.prototype = superCtor.prototype;
+ ctor.prototype = new Obj();
+};
+
+/**
+ * Merge the objects passed as parameters into a new one.
+ * @private
+ * @param {...Object} var_args All objects to merge.
+ * @return {Object} a new object with the data of the others.
+ */
+exports.extend = function() {
+ var result = {}, i, attr;
+ for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers
+ for (attr in arguments[i]) {
+ if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
+ result[attr] = arguments[i][attr];
+ }
+ }
+ }
+ return result;
+};
+
+/**
+ * Transform arbitrary content into a Promise.
+ * @param {String} name a name for the content being processed.
+ * @param {Object} inputData the content to process.
+ * @param {Boolean} isBinary true if the content is not an unicode string
+ * @param {Boolean} isOptimizedBinaryString true if the string content only has one byte per character.
+ * @param {Boolean} isBase64 true if the string content is encoded with base64.
+ * @return {Promise} a promise in a format usable by JSZip.
+ */
+exports.prepareContent = function(name, inputData, isBinary, isOptimizedBinaryString, isBase64) {
+
+ // if inputData is already a promise, this flatten it.
+ var promise = external.Promise.resolve(inputData).then(function(data) {
+
+
+ var isBlob = support.blob && (data instanceof Blob || ['[object File]', '[object Blob]'].indexOf(Object.prototype.toString.call(data)) !== -1);
+
+ if (isBlob && typeof FileReader !== "undefined") {
+ return new external.Promise(function (resolve, reject) {
+ var reader = new FileReader();
+
+ reader.onload = function(e) {
+ resolve(e.target.result);
+ };
+ reader.onerror = function(e) {
+ reject(e.target.error);
+ };
+ reader.readAsArrayBuffer(data);
+ });
+ } else {
+ return data;
+ }
+ });
+
+ return promise.then(function(data) {
+ var dataType = exports.getTypeOf(data);
+
+ if (!dataType) {
+ return external.Promise.reject(
+ new Error("Can't read the data of '" + name + "'. Is it " +
+ "in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?")
+ );
+ }
+ // special case : it's way easier to work with Uint8Array than with ArrayBuffer
+ if (dataType === "arraybuffer") {
+ data = exports.transformTo("uint8array", data);
+ } else if (dataType === "string") {
+ if (isBase64) {
+ data = base64.decode(data);
+ }
+ else if (isBinary) {
+ // optimizedBinaryString === true means that the file has already been filtered with a 0xFF mask
+ if (isOptimizedBinaryString !== true) {
+ // this is a string, not in a base64 format.
+ // Be sure that this is a correct "binary string"
+ data = string2binary(data);
+ }
+ }
+ }
+ return data;
+ });
+};
+
+
+/***/ }),
+/* 32 */
+/*!*************************!*\
+ !*** ./src/Missions.js ***!
+ \*************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HackingMission", function() { return HackingMission; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "inMission", function() { return inMission; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setInMission", function() { return setInMission; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "currMission", function() { return currMission; });
+/* harmony import */ var _Constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Constants.js */ 3);
+/* harmony import */ var _engine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./engine.js */ 5);
+/* harmony import */ var _Faction_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Faction.js */ 11);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/DialogBox.js */ 6);
+/* harmony import */ var _utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/HelperFunctions.js */ 1);
+/* harmony import */ var _utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/StringHelperFunctions.js */ 2);
+/* harmony import */ var jsplumb__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jsplumb */ 193);
+/* harmony import */ var jsplumb__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(jsplumb__WEBPACK_IMPORTED_MODULE_7__);
+
+
+
+
+
+
+
+
+
+let inMission = false; //Flag to denote whether a mission is running
+let currMission = null;
+function setInMission(bool, mission) {
+ inMission = bool;
+ if (bool) {
+ currMission = mission;
+ } else {
+ currMission = null;
+ }
+}
+
+//Keyboard shortcuts
+$(document).keydown(function(e) {
+ if (inMission && currMission && currMission.selectedNode.length != 0) {
+ switch (e.keyCode) {
+ case 65: //a for Attack
+ currMission.actionButtons[0].click();
+ break;
+ case 83: //s for Scan
+ currMission.actionButtons[1].click();
+ break;
+ case 87: //w for Weaken
+ currMission.actionButtons[2].click();
+ break;
+ case 70: //f for Fortify
+ currMission.actionButtons[3].click();
+ break;
+ case 82: //r for Overflow
+ currMission.actionButtons[4].click();
+ break;
+ case 68: //d for Detach connection
+ currMission.actionButtons[5].click();
+ break;
+ default:
+ break;
+ }
+ }
+});
+
+let NodeTypes = {
+ Core: "CPU Core Node", //All actions available
+ Firewall: "Firewall Node", //No actions available
+ Database: "Database Node", //No actions available
+ Spam: "Spam Node", //No actions Available
+ Transfer: "Transfer Node", //Can Weaken, Scan, Fortify and Overflow
+ Shield: "Shield Node" //Can Fortify
+}
+
+let NodeActions = {
+ Attack: "Attacking", //Damaged based on attack stat + hacking level + opp def
+ Scan: "Scanning", //-Def for target, affected by attack and hacking level
+ Weaken: "Weakening", //-Attack for target, affected by attack and hacking level
+ Fortify: "Fortifying", //+Defense for Node, affected by hacking level
+ Overflow: "Overflowing", //+Attack but -Defense for Node, affected by hacking level
+}
+
+function Node(type, stats) {
+ this.type = type;
+ this.atk = stats.atk ? stats.atk : 0;
+ this.def = stats.def ? stats.def : 0;
+ this.hp = stats.hp ? stats.hp : 0;
+ this.maxhp = this.hp;
+ this.plyrCtrl = false;
+ this.enmyCtrl = false;
+ this.pos = [0, 0]; //x, y
+ this.el = null; //Holds the Node's DOM element
+ this.action = null;
+ this.targetedCount = 0; //Count of how many connections this node is the target of
+
+ //Holds the JsPlumb Connection object for this Node,
+ //where this Node is the Source (since each Node
+ //can only have 1 outgoing Connection)
+ this.conn = null;
+}
+
+Node.prototype.setPosition = function(x, y) {
+ this.pos = [x, y];
+}
+
+Node.prototype.setControlledByPlayer = function() {
+ this.plyrCtrl = true;
+ this.enmyCtrl = false;
+ if (this.el) {
+ this.el.classList.remove("hack-mission-enemy-node");
+ this.el.classList.add("hack-mission-player-node");
+ }
+}
+
+Node.prototype.setControlledByEnemy = function() {
+ this.plyrCtrl = false;
+ this.enmyCtrl = true;
+ if (this.el) {
+ this.el.classList.remove("hack-mission-player-node");
+ this.el.classList.add("hack-mission-enemy-node");
+ }
+}
+
+//Sets this node to be the active node
+Node.prototype.select = function(actionButtons) {
+ if (this.enmyCtrl) {return;}
+ this.el.classList.add("hack-mission-player-node-active");
+
+ //Make all buttons inactive
+ for (var i = 0; i < actionButtons.length; ++i) {
+ actionButtons[i].classList.remove("a-link-button");
+ actionButtons[i].classList.add("a-link-button-inactive");
+ }
+
+ switch(this.type) {
+ case NodeTypes.Core:
+ //All buttons active
+ for (var i = 0; i < actionButtons.length; ++i) {
+ actionButtons[i].classList.remove("a-link-button-inactive");
+ actionButtons[i].classList.add("a-link-button");
+ }
+ break;
+ case NodeTypes.Transfer:
+ actionButtons[1].classList.remove("a-link-button-inactive");
+ actionButtons[1].classList.add("a-link-button");
+ actionButtons[2].classList.remove("a-link-button-inactive");
+ actionButtons[2].classList.add("a-link-button");
+ actionButtons[3].classList.remove("a-link-button-inactive");
+ actionButtons[3].classList.add("a-link-button");
+ actionButtons[4].classList.remove("a-link-button-inactive");
+ actionButtons[4].classList.add("a-link-button");
+ actionButtons[5].classList.remove("a-link-button-inactive");
+ actionButtons[5].classList.add("a-link-button");
+ break;
+ case NodeTypes.Shield:
+ case NodeTypes.Firewall:
+ actionButtons[3].classList.remove("a-link-button-inactive");
+ actionButtons[3].classList.add("a-link-button");
+ break;
+ default:
+ break;
+ }
+}
+
+Node.prototype.deselect = function(actionButtons) {
+ this.el.classList.remove("hack-mission-player-node-active");
+ for (var i = 0; i < actionButtons.length; ++i) {
+ actionButtons[i].classList.remove("a-link-button");
+ actionButtons[i].classList.add("a-link-button-inactive");
+ }
+}
+
+
+Node.prototype.untarget = function() {
+ if (this.targetedCount === 0) {
+ console.log("WARN: Node " + this.el.id + " is being 'untargeted' when it has no target count");
+ return;
+ }
+ --this.targetedCount;
+}
+
+//Hacking mission instance
+//Takes in the reputation of the Faction for which the mission is
+//being conducted
+function HackingMission(rep, fac) {
+ this.faction = fac;
+
+ this.started = false;
+ this.time = 180000; //5 minutes to start, milliseconds
+
+ this.playerCores = [];
+ this.playerNodes = []; //Non-core nodes
+ this.playerAtk = 0;
+ this.playerDef = 0;
+
+ this.enemyCores = [];
+ this.enemyDatabases = [];
+ this.enemyNodes = []; //Non-core nodes
+ this.enemyAtk = 0;
+ this.enemyDef = 0;
+
+ this.miscNodes = [];
+
+ this.selectedNode = []; //Which of the player's nodes are currently selected
+
+ this.actionButtons = []; //DOM buttons for actions
+
+ this.availablePositions = [];
+ for (var r = 0; r < 8; ++r) {
+ for (var c = 0; c < 8; ++c) {
+ this.availablePositions.push([r, c]);
+ }
+ }
+
+ this.map = [];
+ for (var i = 0; i < 8; ++i) {
+ this.map.push([null, null, null, null, null, null, null, null]);
+ }
+
+ this.jsplumbinstance = null;
+
+ this.difficulty = rep / _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].HackingMissionRepToDiffConversion + 1;
+ console.log("difficulty: " + this.difficulty);
+ this.reward = 250 + (rep / _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].HackingMissionRepToRewardConversion);
+}
+
+HackingMission.prototype.init = function() {
+ //Create Header DOM
+ this.createPageDom();
+
+ //Create player starting nodes
+ var home = _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].getHomeComputer()
+ for (var i = 0; i < home.cpuCores; ++i) {
+ var stats = {
+ atk: (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill / 7.5) + 30,
+ def: (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill / 20),
+ hp: (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill / 4),
+ };
+ this.playerCores.push(new Node(NodeTypes.Core, stats));
+ this.playerCores[i].setControlledByPlayer();
+ this.setNodePosition(this.playerCores[i], i, 0);
+ this.removeAvailablePosition(i, 0);
+ }
+
+ //Randomly generate enemy nodes (CPU and Firewall) based on difficulty
+ var numNodes = Math.min(8, Math.max(1, Math.round(this.difficulty / 4)));
+ var numFirewalls = Math.min(20,
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(Math.round(this.difficulty/3), Math.round(this.difficulty/3) + 1));
+ var numDatabases = Math.min(10, Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(1, Math.round(this.difficulty / 3) + 1));
+ var totalNodes = numNodes + numFirewalls + numDatabases;
+ var xlimit = 7 - Math.floor(totalNodes / 8);
+ var randMult = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["addOffset"])(0.8 + (this.difficulty / 5), 10);
+ for (var i = 0; i < numNodes; ++i) {
+ var stats = {
+ atk: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(80, 86),
+ def: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(5, 10),
+ hp: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(210, 230)
+ }
+ this.enemyCores.push(new Node(NodeTypes.Core, stats));
+ this.enemyCores[i].setControlledByEnemy();
+ this.setNodeRandomPosition(this.enemyCores[i], xlimit);
+ }
+ for (var i = 0; i < numFirewalls; ++i) {
+ var stats = {
+ atk: 0,
+ def: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(10, 20),
+ hp: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(275, 300)
+ }
+ this.enemyNodes.push(new Node(NodeTypes.Firewall, stats));
+ this.enemyNodes[i].setControlledByEnemy();
+ this.setNodeRandomPosition(this.enemyNodes[i], xlimit);
+ }
+ for (var i = 0; i < numDatabases; ++i) {
+ var stats = {
+ atk: 0,
+ def: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(30, 55),
+ hp: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(210, 275)
+ }
+ var node = new Node(NodeTypes.Database, stats);
+ node.setControlledByEnemy();
+ this.setNodeRandomPosition(node, xlimit);
+ this.enemyDatabases.push(node);
+ }
+ this.calculateDefenses();
+ this.calculateAttacks();
+ this.createMap();
+}
+
+HackingMission.prototype.createPageDom = function() {
+ var container = document.getElementById("mission-container");
+
+ var favorMult = 1 + (this.faction.favor / 100);
+ var gain = this.reward * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].faction_rep_mult * favorMult;
+ var headerText = document.createElement("p");
+ headerText.innerHTML = "You are about to start a hacking mission! You will gain " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(gain, 3) + " faction reputation with " + this.faction.name +
+ " if you win. For more information " +
+ "about how hacking missions work, click one of the guide links " +
+ "below (one opens up an in-game guide and the other opens up " +
+ "the guide from the wiki). Click the 'Start' button to begin.";
+ headerText.style.display = "block";
+ headerText.classList.add("hack-mission-header-element");
+ headerText.style.width = "80%";
+
+ var inGameGuideBtn = document.createElement("a");
+ inGameGuideBtn.innerText = "How to Play";
+ inGameGuideBtn.classList.add("a-link-button");
+ inGameGuideBtn.style.display = "inline-block";
+ inGameGuideBtn.classList.add("hack-mission-header-element");
+ inGameGuideBtn.addEventListener("click", function() {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_4__["dialogBoxCreate"])(_Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].HackingMissionHowToPlay);
+ return false;
+ });
+
+ var wikiGuideBtn = document.createElement("a");
+ wikiGuideBtn.innerText = "Wiki Guide";
+ wikiGuideBtn.classList.add("a-link-button");
+ wikiGuideBtn.style.display = "inline-block";
+ wikiGuideBtn.classList.add("hack-mission-header-element");
+ wikiGuideBtn.target = "_blank";
+ //TODO Add link to wiki page wikiGuideBtn.href =
+
+
+ //Start button will get replaced with forfeit when game is started
+ var startBtn = document.createElement("a");
+ startBtn.innerHTML = "Start";
+ startBtn.setAttribute("id", "hack-mission-start-btn");
+ startBtn.classList.add("a-link-button");
+ startBtn.classList.add("hack-mission-header-element");
+ startBtn.style.display = "inline-block";
+ startBtn.addEventListener("click", ()=>{
+ this.start();
+ return false;
+ });
+
+ var forfeitMission = document.createElement("a");
+ forfeitMission.innerHTML = "Forfeit Mission (Exit)";
+ forfeitMission.classList.add("a-link-button");
+ forfeitMission.classList.add("hack-mission-header-element");
+ forfeitMission.style.display = "inline-block";
+ forfeitMission.addEventListener("click", ()=> {
+ this.finishMission(false);
+ return false;
+ });
+
+ var timer = document.createElement("p");
+ timer.setAttribute("id", "hacking-mission-timer");
+ timer.style.display = "inline-block";
+ timer.style.margin = "6px";
+
+ //Create Action Buttons (Attack/Scan/Weaken/ etc...)
+ var actionsContainer = document.createElement("span");
+ actionsContainer.style.display = "block";
+ actionsContainer.classList.add("hack-mission-action-buttons-container");
+ for (var i = 0; i < 6; ++i) {
+ this.actionButtons.push(document.createElement("a"));
+ this.actionButtons[i].style.display = "inline-block";
+ this.actionButtons[i].classList.add("a-link-button-inactive"); //Disabled at start
+ this.actionButtons[i].classList.add("tooltip"); //Disabled at start
+ this.actionButtons[i].classList.add("hack-mission-header-element");
+ actionsContainer.appendChild(this.actionButtons[i]);
+ }
+ this.actionButtons[0].innerText = "Attack(a)";
+ var atkTooltip = document.createElement("span");
+ atkTooltip.classList.add("tooltiptexthigh");
+ atkTooltip.innerText = "Lowers the targeted node's HP. The effectiveness of this depends on " +
+ "this node's Attack level, your hacking level, and the opponent's defense level.";
+ this.actionButtons[0].appendChild(atkTooltip);
+ this.actionButtons[1].innerText = "Scan(s)";
+ var scanTooltip = document.createElement("span");
+ scanTooltip.classList.add("tooltiptexthigh");
+ scanTooltip.innerText = "Lowers the targeted node's defense. The effectiveness of this depends on " +
+ "this node's Attack level, your hacking level, and the opponent's defense level.";
+ this.actionButtons[1].appendChild(scanTooltip);
+ this.actionButtons[2].innerText = "Weaken(w)";
+ var WeakenTooltip = document.createElement("span");
+ WeakenTooltip.classList.add("tooltiptexthigh");
+ WeakenTooltip.innerText = "Lowers the targeted node's attack. The effectiveness of this depends on " +
+ "this node's Attack level, your hacking level, and the opponent's defense level.";
+ this.actionButtons[2].appendChild(WeakenTooltip);
+ this.actionButtons[3].innerText = "Fortify(f)";
+ var fortifyTooltip = document.createElement("span");
+ fortifyTooltip.classList.add("tooltiptexthigh");
+ fortifyTooltip.innerText = "Raises this node's Defense level. The effectiveness of this depends on " +
+ "your hacking level";
+ this.actionButtons[3].appendChild(fortifyTooltip);
+ this.actionButtons[4].innerText = "Overflow(r)";
+ var overflowTooltip = document.createElement("span");
+ overflowTooltip.classList.add("tooltiptexthigh");
+ overflowTooltip.innerText = "Raises this node's Attack level but lowers its Defense level. The effectiveness " +
+ "of this depends on your hacking level.";
+ this.actionButtons[4].appendChild(overflowTooltip);
+ this.actionButtons[5].innerText = "Drop Connection(d)";
+ var dropconnTooltip = document.createElement("span");
+ dropconnTooltip.classList.add("tooltiptexthigh");
+ dropconnTooltip.innerText = "Removes this Node's current connection to some target Node, if it has one. This can " +
+ "also be done by simply clicking the white connection line.";
+ this.actionButtons[5].appendChild(dropconnTooltip);
+
+ //Player/enemy defense displays will be in action container
+ var playerStats = document.createElement("p");
+ var enemyStats = document.createElement("p");
+ playerStats.style.display = "inline-block";
+ enemyStats.style.display = "inline-block";
+ playerStats.style.color = "#00ccff";
+ enemyStats.style.color = "red";
+ playerStats.style.margin = "4px";
+ enemyStats.style.margin = "4px";
+ playerStats.setAttribute("id", "hacking-mission-player-stats");
+ enemyStats.setAttribute("id", "hacking-mission-enemy-stats");
+ actionsContainer.appendChild(playerStats);
+ actionsContainer.appendChild(enemyStats);
+
+ //Set Action Button event listeners
+ this.actionButtons[0].addEventListener("click", ()=>{
+ if (!(this.selectedNode.length > 0)) {
+ console.log("ERR: Pressing Action button without selected node");
+ return;
+ }
+ if (this.selectedNode[0].type !== NodeTypes.Core) {return;}
+ this.setActionButtonsActive(this.selectedNode[0].type);
+ this.setActionButton(NodeActions.Attack, false); //Set attack button inactive
+ this.selectedNode.forEach(function(node){
+ node.action = NodeActions.Attack;
+ });
+ });
+
+ this.actionButtons[1].addEventListener("click", ()=>{
+ if (!(this.selectedNode.length > 0)) {
+ console.log("ERR: Pressing Action button without selected node");
+ return;
+ }
+ var nodeType = this.selectedNode[0].type; //In a multiselect, every Node will have the same type
+ if (nodeType !== NodeTypes.Core && nodeType !== NodeTypes.Transfer) {return;}
+ this.setActionButtonsActive(nodeType);
+ this.setActionButton(NodeActions.Scan, false); //Set scan button inactive
+ this.selectedNode.forEach(function(node){
+ node.action = NodeActions.Scan;
+ });
+ });
+
+ this.actionButtons[2].addEventListener("click", ()=>{
+ if (!(this.selectedNode.length > 0)) {
+ console.log("ERR: Pressing Action button without selected node");
+ return;
+ }
+ var nodeType = this.selectedNode[0].type; //In a multiselect, every Node will have the same type
+ if (nodeType !== NodeTypes.Core && nodeType !== NodeTypes.Transfer) {return;}
+ this.setActionButtonsActive(nodeType);
+ this.setActionButton(NodeActions.Weaken, false); //Set Weaken button inactive
+ this.selectedNode.forEach(function(node){
+ node.action = NodeActions.Weaken;
+ });
+ });
+
+ this.actionButtons[3].addEventListener("click", ()=>{
+ if (!(this.selectedNode.length > 0)) {
+ console.log("ERR: Pressing Action button without selected node");
+ return;
+ }
+ this.setActionButtonsActive(this.selectedNode[0].type);
+ this.setActionButton(NodeActions.Fortify, false); //Set Fortify button inactive
+ this.selectedNode.forEach(function(node){
+ node.action = NodeActions.Fortify;
+ });
+ });
+
+ this.actionButtons[4].addEventListener("click", ()=>{
+ if (!(this.selectedNode.length > 0)) {
+ console.log("ERR: Pressing Action button without selected node");
+ return;
+ }
+ var nodeType = this.selectedNode[0].type;
+ if (nodeType !== NodeTypes.Core && nodeType !== NodeTypes.Transfer) {return;}
+ this.setActionButtonsActive(nodeType);
+ this.setActionButton(NodeActions.Overflow, false); //Set Overflow button inactive
+ this.selectedNode.forEach(function(node){
+ node.action = NodeActions.Overflow;
+ });
+ });
+
+ this.actionButtons[5].addEventListener("click", ()=>{
+ if (!(this.selectedNode.length > 0)) {
+ console.log("ERR: Pressing Action button without selected node");
+ return;
+ }
+ this.selectedNode.forEach(function(node){
+ if (node.conn) {
+ var endpoints = node.conn.endpoints;
+ endpoints[0].detachFrom(endpoints[1]);
+ }
+ node.action = NodeActions.Fortify;
+ });
+ // if (this.selectedNode.conn) {
+ // var endpoints = this.selectedNode.conn.endpoints;
+ // endpoints[0].detachFrom(endpoints[1]);
+ // }
+ })
+
+ var timeDisplay = document.createElement("p");
+
+ container.appendChild(headerText);
+ container.appendChild(inGameGuideBtn);
+ container.appendChild(wikiGuideBtn);
+ container.appendChild(startBtn);
+ container.appendChild(forfeitMission);
+ container.appendChild(timer);
+ container.appendChild(actionsContainer);
+ container.appendChild(timeDisplay);
+}
+
+HackingMission.prototype.setActionButtonsInactive = function() {
+ for (var i = 0; i < this.actionButtons.length; ++i) {
+ this.actionButtons[i].classList.remove("a-link-button");
+ this.actionButtons[i].classList.add("a-link-button-inactive");
+ }
+}
+
+HackingMission.prototype.setActionButtonsActive = function(nodeType=null) {
+ for (var i = 0; i < this.actionButtons.length; ++i) {
+ this.actionButtons[i].classList.add("a-link-button");
+ this.actionButtons[i].classList.remove("a-link-button-inactive");
+ }
+
+ //For Transfer, FireWall and Shield Nodes, certain buttons should always be disabled
+ //0 = Attack, 1 = Scan, 2 = Weaken, 3 = Fortify, 4 = overflow, 5 = Drop conn
+ if (nodeType) {
+ switch (nodeType) {
+ case NodeTypes.Firewall:
+ case NodeTypes.Shield:
+ this.actionButtons[0].classList.remove("a-link-button");
+ this.actionButtons[0].classList.add("a-link-button-inactive");
+ this.actionButtons[1].classList.remove("a-link-button");
+ this.actionButtons[1].classList.add("a-link-button-inactive");
+ this.actionButtons[2].classList.remove("a-link-button");
+ this.actionButtons[2].classList.add("a-link-button-inactive");
+ this.actionButtons[4].classList.remove("a-link-button");
+ this.actionButtons[4].classList.add("a-link-button-inactive");
+ this.actionButtons[5].classList.remove("a-link-button");
+ this.actionButtons[5].classList.add("a-link-button-inactive");
+ break;
+ case NodeTypes.Transfer:
+ this.actionButtons[0].classList.remove("a-link-button");
+ this.actionButtons[0].classList.add("a-link-button-inactive");
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+//True for active, false for inactive
+HackingMission.prototype.setActionButton = function(i, active=true) {
+ if (Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["isString"])(i)) {
+ switch (i) {
+ case NodeActions.Attack:
+ i = 0;
+ break;
+ case NodeActions.Scan:
+ i = 1;
+ break;
+ case NodeActions.Weaken:
+ i = 2;
+ break;
+ case NodeActions.Fortify:
+ i = 3;
+ break;
+ case NodeActions.Overflow:
+ default:
+ i = 4;
+ break;
+ }
+ }
+ if (active) {
+ this.actionButtons[i].classList.remove("a-link-button-inactive");
+ this.actionButtons[i].classList.add("a-link-button");
+ } else {
+ this.actionButtons[i].classList.remove("a-link-button");
+ this.actionButtons[i].classList.add("a-link-button-inactive");
+ }
+
+}
+
+HackingMission.prototype.calculateAttacks = function() {
+ var total = 0;
+ for (var i = 0; i < this.playerCores.length; ++i) {
+ total += this.playerCores[i].atk;
+ }
+ for (var i = 0; i < this.playerNodes.length; ++i) {
+ total += this.playerNodes[i].atk;
+ }
+ this.playerAtk = total;
+ document.getElementById("hacking-mission-player-stats").innerHTML =
+ "Player Attack: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(this.playerAtk, 1) + "
" +
+ "Player Defense: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(this.playerDef, 1);
+ total = 0;
+ for (var i = 0; i < this.enemyCores.length; ++i) {
+ total += this.enemyCores[i].atk;
+ }
+ for (var i = 0; i < this.enemyDatabases.length; ++i) {
+ total += this.enemyDatabases[i].atk;
+ }
+ for (var i = 0; i < this.enemyNodes.length; ++i) {
+ total += this.enemyNodes[i].atk;
+ }
+ this.enemyAtk = total;
+ document.getElementById("hacking-mission-enemy-stats").innerHTML =
+ "Enemy Attack: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(this.enemyAtk, 1) + "
" +
+ "Enemy Defense: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(this.enemyDef, 1);
+}
+
+HackingMission.prototype.calculateDefenses = function() {
+ var total = 0;
+ for (var i = 0; i < this.playerCores.length; ++i) {
+ total += this.playerCores[i].def;
+ }
+ for (var i = 0; i < this.playerNodes.length; ++i) {
+ total += this.playerNodes[i].def;
+ }
+ this.playerDef = total;
+ document.getElementById("hacking-mission-player-stats").innerHTML =
+ "Player Attack: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(this.playerAtk, 1) + "
" +
+ "Player Defense: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(this.playerDef, 1);
+ total = 0;
+ for (var i = 0; i < this.enemyCores.length; ++i) {
+ total += this.enemyCores[i].def;
+ }
+ for (var i = 0; i < this.enemyDatabases.length; ++i) {
+ total += this.enemyDatabases[i].def;
+ }
+ for (var i = 0; i < this.enemyNodes.length; ++i) {
+ total += this.enemyNodes[i].def;
+ }
+ this.enemyDef = total;
+ document.getElementById("hacking-mission-enemy-stats").innerHTML =
+ "Enemy Attack: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(this.enemyAtk, 1) + "
" +
+ "Enemy Defense: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(this.enemyDef, 1);
+}
+
+HackingMission.prototype.removeAvailablePosition = function(x, y) {
+ for (var i = 0; i < this.availablePositions.length; ++i) {
+ if (this.availablePositions[i][0] === x &&
+ this.availablePositions[i][1] === y) {
+ this.availablePositions.splice(i, 1);
+ return;
+ }
+ }
+ console.log("WARNING: removeAvailablePosition() did not remove " + x + ", " + y);
+}
+
+HackingMission.prototype.setNodePosition = function(nodeObj, x, y) {
+ if (!(nodeObj instanceof Node)) {
+ console.log("WARNING: Non-Node object passed into setNodePOsition");
+ return;
+ }
+ if (isNaN(x) || isNaN(y)) {
+ console.log("ERR: Invalid values passed as x and y for setNodePosition");
+ console.log(x);
+ console.log(y);
+ return;
+ }
+ nodeObj.pos = [x, y];
+ this.map[x][y] = nodeObj;
+}
+
+HackingMission.prototype.setNodeRandomPosition = function(nodeObj, xlimit=0) {
+ var i = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(0, this.availablePositions.length - 1);
+ if (this.availablePositions[i][1] < xlimit) {
+ //Recurse if not within limit
+ return this.setNodeRandomPosition(nodeObj, xlimit);
+ }
+ var pos = this.availablePositions.splice(i, 1);
+ pos = pos[0];
+ this.setNodePosition(nodeObj, pos[0], pos[1]);
+}
+
+HackingMission.prototype.createMap = function() {
+ //Use a grid
+ var map = document.createElement("div");
+ map.classList.add("hack-mission-grid");
+ map.setAttribute("id", "hacking-mission-map");
+ document.getElementById("mission-container").appendChild(map);
+
+ //Create random Nodes for every space in the map that
+ //hasn't been filled yet. The stats of each Node will be based on
+ //the player/enemy attack
+ var averageAttack = (this.playerAtk + this.enemyAtk) / 2;
+ for (var x = 0; x < 8; ++x) {
+ for (var y = 0; y < 8; ++y) {
+ if (!(this.map[x][y] instanceof Node)) {
+ var node, type = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(0, 2);
+ var randMult = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["addOffset"])(0.85 + (this.difficulty / 2), 15);
+ switch (type) {
+ case 0: //Spam
+ var stats = {
+ atk: 0,
+ def: averageAttack * 1.1 + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(15, 45),
+ hp: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(200, 225)
+ }
+ node = new Node(NodeTypes.Spam, stats);
+ break;
+ case 1: //Transfer
+ var stats = {
+ atk: 0,
+ def: averageAttack * 1.1 + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(15, 45),
+ hp: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(250, 275)
+ }
+ node = new Node(NodeTypes.Transfer, stats);
+ break;
+ case 2: //Shield
+ default:
+ var stats = {
+ atk: 0,
+ def: averageAttack * 1.1 + Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(30, 70),
+ hp: randMult * Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(300, 320)
+ }
+ node = new Node(NodeTypes.Shield, stats);
+ break;
+ }
+ this.setNodePosition(node, x, y);
+ this.removeAvailablePosition(x, y);
+ this.miscNodes.push(node);
+ }
+ }
+ }
+
+ //Create DOM elements in order
+ for (var r = 0; r < 8; ++r) {
+ for (var c = 0; c < 8; ++c) {
+ this.createNodeDomElement(this.map[r][c]);
+ }
+ }
+
+ //Configure all Player CPUS
+ for (var i = 0; i < this.playerCores.length; ++i) {
+ console.log("Configuring Player Node: " + this.playerCores[i].el.id);
+ this.configurePlayerNodeElement(this.playerCores[i].el);
+ }
+}
+
+HackingMission.prototype.createNodeDomElement = function(nodeObj) {
+ var nodeDiv = document.createElement("a"), txtEl = document.createElement('p');
+ nodeObj.el = nodeDiv;
+
+ //Set the node element's id based on its coordinates
+ var id = "hacking-mission-node-" + nodeObj.pos[0] + "-" + nodeObj.pos[1];
+ nodeDiv.setAttribute("id", id);
+ txtEl.setAttribute("id", id + "-txt");
+
+ //Set node classes for owner
+ nodeDiv.classList.add("hack-mission-node");
+ if (nodeObj.plyrCtrl) {
+ nodeDiv.classList.add("hack-mission-player-node");
+ } else if (nodeObj.enmyCtrl) {
+ nodeDiv.classList.add("hack-mission-enemy-node");
+ }
+
+ //Set node classes based on type
+ var txt;
+ switch (nodeObj.type) {
+ case NodeTypes.Core:
+ txt = "CPU Core
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ nodeDiv.classList.add("hack-mission-cpu-node");
+ break;
+ case NodeTypes.Firewall:
+ txt = "Firewall
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ nodeDiv.classList.add("hack-mission-firewall-node");
+ break;
+ case NodeTypes.Database:
+ txt = "Database
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ nodeDiv.classList.add("hack-mission-database-node");
+ break;
+ case NodeTypes.Spam:
+ txt = "Spam
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ nodeDiv.classList.add("hack-mission-spam-node");
+ break;
+ case NodeTypes.Transfer:
+ txt = "Transfer
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ nodeDiv.classList.add("hack-mission-transfer-node");
+ break;
+ case NodeTypes.Shield:
+ default:
+ txt = "Shield
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ nodeDiv.classList.add("hack-mission-shield-node");
+ break;
+ }
+
+ txt += "
Atk: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.atk, 1) +
+ "
Def: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.def, 1);
+ txtEl.innerHTML = txt;
+
+ nodeDiv.appendChild(txtEl);
+ document.getElementById("hacking-mission-map").appendChild(nodeDiv);
+}
+
+HackingMission.prototype.updateNodeDomElement = function(nodeObj) {
+ if (nodeObj.el == null) {
+ console.log("ERR: Calling updateNodeDomElement on a Node without an element");
+ return;
+ }
+
+ var id = "hacking-mission-node-" + nodeObj.pos[0] + "-" + nodeObj.pos[1];
+ var nodeDiv = document.getElementById(id), txtEl = document.getElementById(id + "-txt");
+
+ //Set node classes based on type
+ var txt;
+ switch (nodeObj.type) {
+ case NodeTypes.Core:
+ txt = "CPU Core
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ break;
+ case NodeTypes.Firewall:
+ txt = "Firewall
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ break;
+ case NodeTypes.Database:
+ txt = "Database
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ break;
+ case NodeTypes.Spam:
+ txt = "Spam
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ break;
+ case NodeTypes.Transfer:
+ txt = "Transfer
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ break;
+ case NodeTypes.Shield:
+ default:
+ txt = "Shield
" + "HP: " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.hp, 1);
+ break;
+ }
+
+ txt += "
Atk: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.atk, 1) +
+ "
Def: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(nodeObj.def, 1);
+ if (nodeObj.action) {
+ txt += "
" + nodeObj.action;
+ }
+ txtEl.innerHTML = txt;
+}
+
+//Gets a Node DOM element's corresponding Node object using its
+//element id. Function accepts either the DOM element object or the ID as
+//an argument
+HackingMission.prototype.getNodeFromElement = function(el) {
+ var id;
+ if (Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["isString"])(el)) {
+ id = el;
+ } else {
+ id = el.id;
+ }
+ id = id.replace("hacking-mission-node-", "");
+ var res = id.split('-');
+ if (res.length != 2) {
+ console.log("ERROR Parsing Hacking Mission Node Id. Could not find coordinates");
+ return null;
+ }
+ var x = res[0], y = res[1];
+ if (isNaN(x) || isNaN(y) || x >= 8 || y >= 8 || x < 0 || y < 0) {
+ console.log("ERROR: Unexpected values for x and y: " + x + ", " + y);
+ return null;
+ }
+ return this.map[x][y];
+}
+
+function selectNode(hackMissionInst, el) {
+ var nodeObj = hackMissionInst.getNodeFromElement(el);
+ if (nodeObj == null) {console.log("Error getting Node object");}
+ if (!nodeObj.plyrCtrl) {return;}
+
+ clearAllSelectedNodes(hackMissionInst);
+ nodeObj.select(hackMissionInst.actionButtons);
+ hackMissionInst.selectedNode.push(nodeObj);
+}
+
+function multiselectNode(hackMissionInst, el) {
+ var nodeObj = hackMissionInst.getNodeFromElement(el);
+ if (nodeObj == null) {console.log("ERROR: Getting Node Object in multiselectNode()");}
+ if (!nodeObj.plyrCtrl) {return;}
+
+ clearAllSelectedNodes(hackMissionInst);
+ var type = nodeObj.type;
+ if (type === NodeTypes.Core) {
+ hackMissionInst.playerCores.forEach(function(node) {
+ node.select(hackMissionInst.actionButtons);
+ hackMissionInst.selectedNode.push(node);
+ });
+ } else {
+ hackMissionInst.playerNodes.forEach(function(node) {
+ if (node.type === type) {
+ node.select(hackMissionInst.actionButtons);
+ hackMissionInst.selectedNode.push(node);
+ }
+ });
+ }
+}
+
+function clearAllSelectedNodes(hackMissionInst) {
+ if (hackMissionInst.selectedNode.length > 0) {
+ hackMissionInst.selectedNode.forEach(function(node){
+ node.deselect(hackMissionInst.actionButtons);
+ });
+ hackMissionInst.selectedNode.length = 0;
+ }
+}
+
+//Configures a DOM element representing a player-owned node to
+//be selectable and actionable
+//Note: Does NOT change its css class. This is handled by Node.setControlledBy...
+HackingMission.prototype.configurePlayerNodeElement = function(el) {
+ var nodeObj = this.getNodeFromElement(el);
+ if (nodeObj == null) {console.log("Error getting Node object");}
+
+ //Add event listener
+ var self = this;
+ function selectNodeWrapper() {
+ selectNode(self, el);
+ }
+ el.addEventListener("click", selectNodeWrapper);
+
+ function multiselectNodeWrapper() {
+ multiselectNode(self, el);
+ }
+ el.addEventListener("dblclick", multiselectNodeWrapper);
+
+
+ if (el.firstChild) {
+ el.firstChild.addEventListener("click", selectNodeWrapper);
+ }
+}
+
+//Configures a DOM element representing an enemy-node by removing
+//any event listeners
+HackingMission.prototype.configureEnemyNodeElement = function(el) {
+ //Deselect node if it was the selected node
+ var nodeObj = this.getNodeFromElement(el);
+ for (var i = 0; i < this.selectedNode.length; ++i) {
+ if (this.selectedNode[i] == nodeObj) {
+ nodeObj.deselect(this.actionButtons);
+ this.selectedNode.splice(i, 1);
+ break;
+ }
+ }
+}
+
+//Returns bool indicating whether a node is reachable by player
+//by checking if any of the adjacent nodes are owned by the player
+HackingMission.prototype.nodeReachable = function(node) {
+ var x = node.pos[0], y = node.pos[1];
+ if (x > 0 && this.map[x-1][y].plyrCtrl) {return true;}
+ if (x < 7 && this.map[x+1][y].plyrCtrl) {return true;}
+ if (y > 0 && this.map[x][y-1].plyrCtrl) {return true;}
+ if (y < 7 && this.map[x][y+1].plyrCtrl) {return true;}
+ return false;
+}
+
+HackingMission.prototype.nodeReachableByEnemy = function(node) {
+ if (node == null) {return false;}
+ var x = node.pos[0], y = node.pos[1];
+ if (x > 0 && this.map[x-1][y].enmyCtrl) {return true;}
+ if (x < 7 && this.map[x+1][y].enmyCtrl) {return true;}
+ if (y > 0 && this.map[x][y-1].enmyCtrl) {return true;}
+ if (y < 7 && this.map[x][y+1].enmyCtrl) {return true;}
+ return false;
+}
+
+HackingMission.prototype.start = function() {
+ this.started = true;
+ this.initJsPlumb();
+ var startBtn = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("hack-mission-start-btn");
+ startBtn.classList.remove("a-link-button");
+ startBtn.classList.add("a-link-button-inactive");
+}
+
+HackingMission.prototype.initJsPlumb = function() {
+ var instance = jsPlumb.getInstance({
+ DragOptions:{cursor:"pointer", zIndex:2000},
+ PaintStyle: {
+ gradient: { stops: [
+ [ 0, "#FFFFFF" ],
+ [ 1, "#FFFFFF" ]
+ ] },
+ stroke: "#FFFFFF",
+ strokeWidth: 8
+ },
+ });
+
+ this.jsplumbinstance = instance;
+
+ //All player cores are sources
+ for (var i = 0; i < this.playerCores.length; ++i) {
+ instance.makeSource(this.playerCores[i].el, {
+ deleteEndpointsOnEmpty:true,
+ maxConnections:1,
+ anchor:"Continuous",
+ connector:"Flowchart"
+ });
+ }
+
+ //Everything else is a target
+ for (var i = 0; i < this.enemyCores.length; ++i) {
+ instance.makeTarget(this.enemyCores[i].el, {
+ maxConnections:-1,
+ anchor:"Continuous",
+ connector:"Flowchart"
+ });
+ }
+ for (var i = 0; i < this.enemyDatabases.length; ++i) {
+ instance.makeTarget(this.enemyDatabases[i].el, {
+ maxConnections:-1,
+ anchor:"Continuous",
+ connector:["Flowchart"]
+ });
+ }
+ for (var i = 0; i < this.enemyNodes.length; ++i) {
+ instance.makeTarget(this.enemyNodes[i].el, {
+ maxConnections:-1,
+ anchor:"Continuous",
+ connector:"Flowchart"
+ });
+ }
+ for (var i = 0; i < this.miscNodes.length; ++i) {
+ instance.makeTarget(this.miscNodes[i].el, {
+ maxConnections:-1,
+ anchor:"Continuous",
+ connector:"Flowchart"
+ });
+ }
+
+ //Clicking a connection drops it
+ instance.bind("click", function(conn, originalEvent) {
+ var endpoints = conn.endpoints;
+ endpoints[0].detachFrom(endpoints[1]);
+ });
+
+ //Connection events
+ instance.bind("connection", (info)=>{
+ var targetNode = this.getNodeFromElement(info.target);
+
+ //Do not detach for enemy nodes
+ var thisNode = this.getNodeFromElement(info.source);
+ if (thisNode.enmyCtrl) {return;}
+
+ //If the node is not reachable, drop the connection
+ if (!this.nodeReachable(targetNode)) {
+ info.sourceEndpoint.detachFrom(info.targetEndpoint);
+ return;
+ }
+
+ var sourceNode = this.getNodeFromElement(info.source);
+ sourceNode.conn = info.connection;
+ var targetNode = this.getNodeFromElement(info.target);
+ ++targetNode.targetedCount;
+ });
+
+ //Detach Connection events
+ instance.bind("connectionDetached", (info, originalEvent)=>{
+ var sourceNode = this.getNodeFromElement(info.source);
+ sourceNode.conn = null;
+ var targetNode = this.getNodeFromElement(info.target);
+ targetNode.untarget();
+ });
+
+}
+
+//Drops all connections where the specified node is the source
+HackingMission.prototype.dropAllConnectionsFromNode = function(node) {
+ var allConns = this.jsplumbinstance.getAllConnections();
+ for (var i = allConns.length-1; i >= 0; --i) {
+ if (allConns[i].source == node.el) {
+ allConns[i].endpoints[0].detachFrom(allConns[i].endpoints[1]);
+ }
+ }
+}
+
+//Drops all connections where the specified node is the target
+HackingMission.prototype.dropAllConnectionsToNode = function(node) {
+ var allConns = this.jsplumbinstance.getAllConnections();
+ for (var i = allConns.length-1; i >= 0; --i) {
+ if (allConns[i].target == node.el) {
+ allConns[i].endpoints[0].detachFrom(allConns[i].endpoints[1]);
+ }
+ }
+ node.beingTargeted = false;
+}
+
+var storedCycles = 0;
+HackingMission.prototype.process = function(numCycles=1) {
+ if (!this.started) {return;}
+ storedCycles += numCycles;
+ if (storedCycles < 2) {return;} //Only process every 3 cycles minimum
+
+ var res = false;
+ //Process actions of all player nodes
+ this.playerCores.forEach((node)=>{
+ res |= this.processNode(node, storedCycles);
+ });
+
+ this.playerNodes.forEach((node)=>{
+ if (node.type === NodeTypes.Transfer ||
+ node.type === NodeTypes.Shield ||
+ node.type === NodeTypes.Firewall) {
+ res |= this.processNode(node, storedCycles);
+ }
+ });
+
+ //Process actions of all enemy nodes
+ this.enemyCores.forEach((node)=>{
+ this.enemyAISelectAction(node);
+ res |= this.processNode(node, storedCycles);
+ });
+
+ this.enemyNodes.forEach((node)=>{
+ if (node.type === NodeTypes.Transfer ||
+ node.type === NodeTypes.Shield ||
+ node.type === NodeTypes.Firewall) {
+ this.enemyAISelectAction(node);
+ res |= this.processNode(node, storedCycles);
+ }
+ });
+
+ //The hp of enemy databases increases slowly
+ this.enemyDatabases.forEach((node)=>{
+ node.maxhp += (0.1 * storedCycles);
+ node.hp += (0.1 * storedCycles);
+ });
+
+ if (res) {
+ this.calculateAttacks();
+ this.calculateDefenses();
+ }
+
+ //Win if all enemy databases are conquered
+ if (this.enemyDatabases.length === 0) {
+ this.finishMission(true);
+ return;
+ }
+
+ //Lose if all your cores are gone
+ if (this.playerCores.length === 0) {
+ this.finishMission(false);
+ return;
+ }
+
+ //Defense/hp of misc nodes increases slowly over time
+ this.miscNodes.forEach((node)=>{
+ node.def += (0.1 * storedCycles);
+ node.maxhp += (0.05 * storedCycles);
+ node.hp += (0.1 * storedCycles);
+ if (node.hp > node.maxhp) {node.hp = node.maxhp;}
+ this.updateNodeDomElement(node);
+ });
+
+ //Update timer and check if player lost
+ this.time -= (storedCycles * _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"]._idleSpeed);
+ if (this.time <= 0) {
+ this.finishMission(false);
+ return;
+ }
+ this.updateTimer();
+
+ storedCycles = 0;
+}
+
+//Returns a bool representing whether defenses need to be re-calculated
+HackingMission.prototype.processNode = function(nodeObj, numCycles=1) {
+ if (nodeObj.action == null) {
+ return;
+ }
+
+ var targetNode = null, def, atk;
+ if (nodeObj.conn) {
+ if (nodeObj.conn.target != null) {
+ targetNode = this.getNodeFromElement(nodeObj.conn.target);
+ } else {
+ targetNode = this.getNodeFromElement(nodeObj.conn.targetId);
+ }
+
+ if (targetNode == null) {
+ //Player is in the middle of dragging the connection,
+ //so the target node is null. Do nothing here
+ } else if (targetNode.plyrCtrl) {
+ def = this.playerDef;
+ atk = this.enemyAtk;
+ } else if (targetNode.enmyCtrl) {
+ def = this.enemyDef;
+ atk = this.playerAtk;
+ } else { //Misc Node
+ def = targetNode.def;
+ nodeObj.plyrCtrl ? atk = this.playerAtk : atk = this.enemyAtk;
+ }
+ }
+
+ //Calculations are per second, so divide everything by 5
+ var calcStats = false, plyr = nodeObj.plyrCtrl;
+ var enmyHacking = this.difficulty * _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].HackingMissionDifficultyToHacking;
+ switch(nodeObj.action) {
+ case NodeActions.Attack:
+ if (targetNode == null) {break;}
+ if (nodeObj.conn == null) {break;}
+ var dmg = this.calculateAttackDamage(atk, def, plyr ? _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill : enmyHacking);
+ targetNode.hp -= (dmg/5 * numCycles);
+ break;
+ case NodeActions.Scan:
+ if (targetNode == null) {break;}
+ if (nodeObj.conn == null) {break;}
+ var eff = this.calculateScanEffect(atk, def, plyr ? _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill : enmyHacking);
+ targetNode.def -= (eff/5 * numCycles);
+ calcStats = true;
+ break;
+ case NodeActions.Weaken:
+ if (targetNode == null) {break;}
+ if (nodeObj.conn == null) {break;}
+ var eff = this.calculateWeakenEffect(atk, def, plyr ? _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill : enmyHacking);
+ targetNode.atk -= (eff/5 * numCycles);
+ calcStats = true;
+ break;
+ case NodeActions.Fortify:
+ var eff = this.calculateFortifyEffect(_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill);
+ nodeObj.def += (eff/5 * numCycles);
+ calcStats = true;
+ break;
+ case NodeActions.Overflow:
+ var eff = this.calculateOverflowEffect(_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill);
+ if (nodeObj.def < eff) {break;}
+ nodeObj.def -= (eff/5 * numCycles);
+ nodeObj.atk += (eff/5 * numCycles);
+ calcStats = true;
+ break;
+ default:
+ console.log("ERR: Invalid Node Action: " + nodeObj.action);
+ break;
+ }
+
+ //Stats can't go below 0
+ if (nodeObj.atk < 0) {nodeObj.atk = 0;}
+ if (nodeObj.def < 0) {nodeObj.def = 0;}
+ if (targetNode && targetNode.atk < 0) {targetNode.atk = 0;}
+ if (targetNode && targetNode.def < 0) {targetNode.def = 0;}
+
+ //Conquering a node
+ if (targetNode && targetNode.hp <= 0) {
+ var conqueredByPlayer = nodeObj.plyrCtrl;
+ targetNode.hp = targetNode.maxhp;
+ targetNode.action = null;
+ targetNode.conn = null;
+ if (this.selectedNode == targetNode) {
+ targetNode.deselect(this.actionButtons);
+ }
+
+ //The conquered node has its stats reduced
+ targetNode.atk /= 2;
+ targetNode.def /= 3.5;
+
+ //Flag for whether the target node was a misc node
+ var isMiscNode = !targetNode.plyrCtrl && !targetNode.enmyCtrl;
+
+ //Remove all connections from Node
+ this.dropAllConnectionsToNode(targetNode);
+ this.dropAllConnectionsFromNode(targetNode);
+
+ //Changes the css class and turn the node into a JsPlumb Source/Target
+ if (conqueredByPlayer) {
+ targetNode.setControlledByPlayer();
+ this.jsplumbinstance.unmakeTarget(targetNode.el);
+ this.jsplumbinstance.makeSource(targetNode.el, {
+ deleteEndpointsOnEmpty:true,
+ maxConnections:1,
+ anchor:"Continuous",
+ connector:"Flowchart"
+ });
+ } else {
+ targetNode.setControlledByEnemy();
+ nodeObj.conn = null; //Clear connection
+ this.jsplumbinstance.unmakeSource(targetNode.el);
+ this.jsplumbinstance.makeTarget(targetNode.el, {
+ maxConnections:-1,
+ anchor:"Continuous",
+ connector:["Flowchart"]
+ });
+ }
+
+ calcStats = true;
+
+ //Helper function to swap nodes between the respective enemyNodes/playerNodes arrays
+ function swapNodes(orig, dest, targetNode) {
+ for (var i = 0; i < orig.length; ++i) {
+ if (orig[i] == targetNode) {
+ var node = orig.splice(i, 1);
+ node = node[0];
+ dest.push(node);
+ break;
+ }
+ }
+ }
+
+ switch(targetNode.type) {
+ case NodeTypes.Core:
+ if (conqueredByPlayer) {
+ swapNodes(this.enemyCores, this.playerCores, targetNode);
+ this.configurePlayerNodeElement(targetNode.el);
+ } else {
+ swapNodes(this.playerCores, this.enemyCores, targetNode);
+ this.configureEnemyNodeElement(targetNode.el);
+ }
+ break;
+ case NodeTypes.Firewall:
+ if (conqueredByPlayer) {
+ swapNodes(this.enemyNodes, this.playerNodes, targetNode);
+ } else {
+ swapNodes(this.playerNodes, this.enemyNodes, targetNode);
+ this.configureEnemyNodeElement(targetNode.el);
+ }
+ break;
+ case NodeTypes.Database:
+ if (conqueredByPlayer) {
+ swapNodes(this.enemyDatabases, this.playerNodes, targetNode);
+ } else {
+ swapNodes(this.playerNodes, this.enemyDatabases, targetNode);
+ }
+ break;
+ case NodeTypes.Spam:
+ if (conqueredByPlayer) {
+ swapNodes(isMiscNode ? this.miscNodes : this.enemyNodes, this.playerNodes, targetNode);
+ //Conquering spam node increases time limit
+ this.time += _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].HackingMissionSpamTimeIncrease;
+ } else {
+ swapNodes(isMiscNode ? this.miscNodes : this.playerNodes, this.enemyNodes, targetNode);
+ }
+
+ break;
+ case NodeTypes.Transfer:
+ //Conquering a Transfer node increases the attack of all cores by some percentages
+ if (conqueredByPlayer) {
+ swapNodes(isMiscNode ? this.miscNodes : this.enemyNodes, this.playerNodes, targetNode);
+ this.playerCores.forEach(function(node) {
+ node.atk *= _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].HackingMissionTransferAttackIncrease;
+ });
+ this.configurePlayerNodeElement(targetNode.el);
+ } else {
+ swapNodes(isMiscNode ? this.miscNodes : this.playerNodes, this.enemyNodes, targetNode);
+ this.enemyCores.forEach(function(node) {
+ node.atk *= _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].HackingMissionTransferAttackIncrease;
+ });
+ this.configureEnemyNodeElement(targetNode.el);
+ }
+ break;
+ case NodeTypes.Shield:
+ if (conqueredByPlayer) {
+ swapNodes(isMiscNode ? this.miscNodes : this.enemyNodes, this.playerNodes, targetNode);
+ this.configurePlayerNodeElement(targetNode.el);
+ } else {
+ swapNodes(isMiscNode ? this.miscNodes : this.playerNodes, this.enemyNodes, targetNode);
+ this.configureEnemyNodeElement(targetNode.el);
+ }
+ break;
+ }
+
+ //If a misc node was conquered, the defense for all misc nodes increases by some fixed amount
+ if (isMiscNode) { //&& conqueredByPlayer) {
+ this.miscNodes.forEach((node)=>{
+ if (node.targetedCount === 0) {
+ node.def *= _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].HackingMissionMiscDefenseIncrease;
+ }
+ });
+ }
+ }
+
+ //Update node DOMs
+ this.updateNodeDomElement(nodeObj);
+ if (targetNode) {this.updateNodeDomElement(targetNode);}
+ return calcStats;
+}
+
+//Enemy "AI" for CPU Core and Transfer Nodes
+HackingMission.prototype.enemyAISelectAction = function(nodeObj) {
+ if (nodeObj == null) {return;}
+ switch(nodeObj.type) {
+ case NodeTypes.Core:
+ //Select a single RANDOM target from miscNodes and player's Nodes
+ //If it is reachable, it will target it. If not, no target will
+ //be selected for now, and the next time process() gets called this will repeat
+ if (nodeObj.conn == null) {
+ if (this.miscNodes.length === 0) {
+ //Randomly pick a player node and attack it if its reachable
+ var rand = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(0, this.playerNodes.length-1);
+ var node;
+ if (this.playerNodes.length === 0) {
+ node = null;
+ } else {
+ node = this.playerNodes[rand];
+ }
+ if (this.nodeReachableByEnemy(node)) {
+ //Create connection
+ nodeObj.conn = this.jsplumbinstance.connect({
+ source:nodeObj.el,
+ target:node.el
+ });
+ ++node.targetedCount;
+ } else {
+ //Randomly pick a player core and attack it if its reachable
+ rand = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(0, this.playerCores.length-1);
+ if (this.playerCores.length === 0) {
+ return; //No Misc Nodes, no player Nodes, no Player cores. Player lost
+ } else {
+ node = this.playerCores[rand];
+ }
+
+ if (this.nodeReachableByEnemy(node)) {
+ //Create connection
+ nodeObj.conn = this.jsplumbinstance.connect({
+ source:nodeObj.el,
+ target:node.el
+ });
+ ++node.targetedCount;
+ }
+ }
+ } else {
+ //Randomly pick a misc node and attack it if its reachable
+ var rand = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(0, this.miscNodes.length-1);
+ var node = this.miscNodes[rand];
+ if (this.nodeReachableByEnemy(node)) {
+ nodeObj.conn = this.jsplumbinstance.connect({
+ source:nodeObj.el,
+ target:node.el,
+ });
+ ++node.targetedCount;
+ }
+ }
+
+ //If no connection was made, set the Core to Fortify
+ nodeObj.action = NodeActions.Fortify;
+ } else {
+ //If this node has a selected target
+ var targetNode;
+ if (nodeObj.conn.target) {
+ targetNode = this.getNodeFromElement(nodeObj.conn.target);
+ } else {
+ targetNode = this.getNodeFromElement(nodeObj.conn.targetId);
+ }
+ if (targetNode == null) {
+ console.log("Error getting Target node Object in enemyAISelectAction()");
+ }
+
+ if (targetNode.def > this.enemyAtk + 15) {
+ if (nodeObj.def < 50) {
+ nodeObj.action = NodeActions.Fortify;
+ } else {
+ nodeObj.action = NodeActions.Overflow;
+ }
+ } else if (Math.abs(targetNode.def - this.enemyAtk) <= 15) {
+ nodeObj.action = NodeActions.Scan;
+ } else {
+ nodeObj.action = NodeActions.Attack;
+ }
+ }
+ break;
+ case NodeTypes.Transfer:
+ //Switch between fortifying and overflowing as necessary
+ if (nodeObj.def < 125) {
+ nodeObj.action = NodeActions.Fortify;
+ } else {
+ nodeObj.action = NodeActions.Overflow;
+ }
+ break;
+ case NodeTypes.Firewall:
+ case NodeTypes.Shield:
+ nodeObj.action = NodeActions.Fortify;
+ break;
+ default:
+ break;
+ }
+}
+
+var hackEffWeightSelf = 130; //Weight for Node actions on self
+var hackEffWeightTarget = 25; //Weight for Node Actions against Target
+var hackEffWeightAttack = 80; //Weight for Attack action
+
+//Returns damage per cycle based on stats
+HackingMission.prototype.calculateAttackDamage = function(atk, def, hacking = 0) {
+ return Math.max(0.55 * (atk + (hacking / hackEffWeightAttack) - def), 1);
+}
+
+HackingMission.prototype.calculateScanEffect = function(atk, def, hacking=0) {
+ return Math.max(0.6 * ((atk) + hacking / hackEffWeightTarget - (def * 0.95)), 2);
+}
+
+HackingMission.prototype.calculateWeakenEffect = function(atk, def, hacking=0) {
+ return Math.max((atk) + hacking / hackEffWeightTarget - (def * 0.95), 2);
+}
+
+HackingMission.prototype.calculateFortifyEffect = function(hacking=0) {
+ return 0.9 * hacking / hackEffWeightSelf;
+}
+
+HackingMission.prototype.calculateOverflowEffect = function(hacking=0) {
+ return 0.95 * hacking / hackEffWeightSelf;
+}
+
+//Updates timer display
+HackingMission.prototype.updateTimer = function() {
+ var timer = document.getElementById("hacking-mission-timer");
+
+ //Convert time remaining to a string of the form mm:ss
+ var seconds = Math.round(this.time / 1000);
+ var minutes = Math.trunc(seconds / 60);
+ seconds %= 60;
+ var str = ("0" + minutes).slice(-2) + ":" + ("0" + seconds).slice(-2);
+ timer.innerText = "Time left: " + str;
+}
+
+//The 'win' argument is a bool for whether or not the player won
+HackingMission.prototype.finishMission = function(win) {
+ inMission = false;
+ currMission = null;
+
+ if (win) {
+ var favorMult = 1 + (this.faction.favor / 100);
+ console.log("Hacking mission base reward: " + this.reward);
+ console.log("favorMult: " + favorMult);
+ console.log("rep mult: " + _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].faction_rep_mult);
+ var gain = this.reward * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].faction_rep_mult * favorMult;
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_4__["dialogBoxCreate"])("Mission won! You earned " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(gain, 3) + " reputation with " + this.faction.name);
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].gainIntelligenceExp(this.difficulty * _Constants_js__WEBPACK_IMPORTED_MODULE_0__["CONSTANTS"].IntelligenceHackingMissionBaseExpGain);
+ this.faction.playerReputation += gain;
+ } else {
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_4__["dialogBoxCreate"])("Mission lost/forfeited! You did not gain any faction reputation.");
+ }
+
+ //Clear mission container
+ var container = document.getElementById("mission-container");
+ while(container.firstChild) {
+ container.removeChild(container.firstChild);
+ }
+
+ //Return to Faction page
+ document.getElementById("mainmenu-container").style.visibility = "visible";
+ document.getElementById("character-overview-wrapper").style.visibility = "visible";
+ _engine_js__WEBPACK_IMPORTED_MODULE_1__["Engine"].loadFactionContent();
+ Object(_Faction_js__WEBPACK_IMPORTED_MODULE_2__["displayFactionContent"])(this.faction.name);
+}
+
+
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ 38)))
+
+/***/ }),
+/* 33 */
+/*!************************!*\
+ !*** ./src/DarkWeb.js ***!
+ \************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkIfConnectedToDarkweb", function() { return checkIfConnectedToDarkweb; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "executeDarkwebTerminalCommand", function() { return executeDarkwebTerminalCommand; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "listAllDarkwebItems", function() { return listAllDarkwebItems; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buyDarkwebItem", function() { return buyDarkwebItem; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseDarkwebItemPrice", function() { return parseDarkwebItemPrice; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DarkWebItems", function() { return DarkWebItems; });
+/* harmony import */ var _CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CreateProgram.js */ 14);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _SpecialServerIps_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SpecialServerIps.js */ 17);
+/* harmony import */ var _Terminal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Terminal.js */ 22);
+/* harmony import */ var _utils_IPAddress_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/IPAddress.js */ 16);
+/* harmony import */ var _utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/StringHelperFunctions.js */ 2);
+
+
+
+
+
+
+
+
+
+/* DarkWeb.js */
+//Posts a "help" message if connected to DarkWeb
+function checkIfConnectedToDarkweb() {
+ if (_SpecialServerIps_js__WEBPACK_IMPORTED_MODULE_2__["SpecialServerIps"].hasOwnProperty("Darkweb Server")) {
+ var darkwebIp = _SpecialServerIps_js__WEBPACK_IMPORTED_MODULE_2__["SpecialServerIps"]["Darkweb Server"];
+ if (!Object(_utils_IPAddress_js__WEBPACK_IMPORTED_MODULE_4__["isValidIPAddress"])(darkwebIp)) {return;}
+ if (darkwebIp == _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].getCurrentServer().ip) {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("You are now connected to the dark web. From the dark web you can purchase illegal items. " +
+ "Use the 'buy -l' command to display a list of all the items you can buy. Use 'buy [item-name] " +
+ "to purchase an item");
+ }
+ }
+
+}
+
+//Handler for dark web commands. The terminal's executeCommand() function will pass
+//dark web-specific commands into this. It will pass in the raw split command array
+//rather than the command string
+function executeDarkwebTerminalCommand(commandArray) {
+ if (commandArray.length == 0) {return;}
+ switch (commandArray[0]) {
+ case "buy":
+ if (commandArray.length != 2) {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Incorrect number of arguments. Usage: ");
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("buy -l");
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("buy [item name]");
+ return;
+ }
+ var arg = commandArray[1];
+ if (arg == "-l") {
+ listAllDarkwebItems();
+ } else {
+ buyDarkwebItem(arg);
+ }
+ break;
+ default:
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Command not found");
+ break;
+ }
+}
+
+function listAllDarkwebItems() {
+ for (var item in DarkWebItems) {
+ if (DarkWebItems.hasOwnProperty(item)) {
+ var item = DarkWebItems[item];
+ //Convert string using toLocaleString
+ var split = item.split(" - ");
+ if (split.length == 3 && split[1].charAt(0) == '$') {
+ split[1] = split[1].slice(1);
+ split[1] = split[1].replace(/,/g, '');
+ var price = parseFloat(split[1]);
+ if (isNaN(price)) {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])(item);
+ return;
+ }
+ price = Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["formatNumber"])(price, 0);
+ split[1] = "$" + price.toString();
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])(split.join(" - "));
+ } else {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])(item);
+ }
+ }
+ }
+
+ var priceString = split[1];
+ //Check for errors
+ if (priceString.length == 0 || priceString.charAt(0) != '$') {
+ return -1;
+ }
+ //Remove dollar sign and commas
+ priceString = priceString.slice(1);
+ priceString = priceString.replace(/,/g, '');
+
+ //Convert string to numeric
+ var price = parseFloat(priceString);
+ if (isNaN(price)) {return -1;}
+ else {return price;}
+}
+
+function buyDarkwebItem(itemName) {
+ if (itemName.toLowerCase() == _CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].BruteSSHProgram.toLowerCase()) {
+ var price = parseDarkwebItemPrice(DarkWebItems.BruteSSHProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].BruteSSHProgram);
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("You have purchased the BruteSSH.exe program. The new program " +
+ "can be found on your home computer.");
+ } else {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Not enough money to purchase " + itemName);
+ }
+ } else if (itemName.toLowerCase() == _CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].FTPCrackProgram.toLowerCase()) {
+ var price = parseDarkwebItemPrice(DarkWebItems.FTPCrackProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].FTPCrackProgram);
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("You have purchased the FTPCrack.exe program. The new program " +
+ "can be found on your home computer.");
+ } else {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Not enough money to purchase " + itemName);
+ }
+ } else if (itemName.toLowerCase() == _CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].RelaySMTPProgram.toLowerCase()) {
+ var price = parseDarkwebItemPrice(DarkWebItems.RelaySMTPProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].RelaySMTPProgram);
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("You have purchased the relaySMTP.exe program. The new program " +
+ "can be found on your home computer.");
+ } else {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Not enough money to purchase " + itemName);
+ }
+ } else if (itemName.toLowerCase() == _CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].HTTPWormProgram.toLowerCase()) {
+ var price = parseDarkwebItemPrice(DarkWebItems.HTTPWormProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].HTTPWormProgram);
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("You have purchased the HTTPWorm.exe program. The new program " +
+ "can be found on your home computer.");
+ } else {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Not enough money to purchase " + itemName);
+ }
+ } else if (itemName.toLowerCase() == _CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].SQLInjectProgram.toLowerCase()) {
+ var price = parseDarkwebItemPrice(DarkWebItems.SQLInjectProgram);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].SQLInjectProgram);
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("You have purchased the SQLInject.exe program. The new program " +
+ "can be found on your home computer.");
+ } else {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Not enough money to purchase " + itemName);
+ }
+ } else if (itemName.toLowerCase() == _CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].DeepscanV1.toLowerCase()) {
+ var price = parseDarkwebItemPrice(DarkWebItems.DeepScanV1Program);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].DeepscanV1);
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("You have purchased the DeepscanV1.exe program. The new program " +
+ "can be found on your home computer.");
+ } else {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Not enough money to purchase " + itemName);
+ }
+ } else if (itemName.toLowerCase() == _CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].DeepscanV2.toLowerCase()) {
+ var price = parseDarkwebItemPrice(DarkWebItems.DeepScanV2Program);
+ if (price > 0 && _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].money.gt(price)) {
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].loseMoney(price);
+ _Player_js__WEBPACK_IMPORTED_MODULE_1__["Player"].getHomeComputer().programs.push(_CreateProgram_js__WEBPACK_IMPORTED_MODULE_0__["Programs"].DeepscanV2);
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("You have purchased the DeepscanV2.exe program. The new program " +
+ "can be found on your home computer.");
+ } else {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Not enough money to purchase " + itemName);
+ }
+ } else {
+ Object(_Terminal_js__WEBPACK_IMPORTED_MODULE_3__["post"])("Unrecognized item");
+ }
+}
+
+function parseDarkwebItemPrice(itemDesc) {
+ var split = itemDesc.split(" - ");
+ if (split.length == 3) {
+ var priceString = split[1];
+ //Check for errors
+ if (priceString.length == 0 || priceString.charAt(0) != '$') {
+ return -1;
+ }
+ //Remove dollar sign and commas
+ priceString = priceString.slice(1);
+ priceString = priceString.replace(/,/g, '');
+
+ //Convert string to numeric
+ var price = parseFloat(priceString);
+ if (isNaN(price)) {return -1;}
+ else {return price;}
+ } else {
+ return -1;
+ }
+}
+
+let DarkWebItems = {
+ BruteSSHProgram: "BruteSSH.exe - $500,000 - Opens up SSH Ports",
+ FTPCrackProgram: "FTPCrack.exe - $1,500,000 - Opens up FTP Ports",
+ RelaySMTPProgram: "relaySMTP.exe - $5,000,000 - Opens up SMTP Ports",
+ HTTPWormProgram: "HTTPWorm.exe - $30,000,000 - Opens up HTTP Ports",
+ SQLInjectProgram: "SQLInject.exe - $250,000,000 - Opens up SQL Ports",
+ DeepScanV1Program: "DeepscanV1.exe - $500,000 - Enables 'scan-analyze' with a depth up to 5",
+ DeepScanV2Program: "DeepscanV2.exe - $25,000,000 - Enables 'scan-analyze' with a depth up to 10",
+}
+
+
+
+
+/***/ }),
+/* 34 */
+/*!**********************!*\
+ !*** ./src/Fconf.js ***!
+ \**********************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FconfSettings", function() { return FconfSettings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createFconf", function() { return createFconf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseFconfSettings", function() { return parseFconfSettings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadFconf", function() { return loadFconf; });
+/* harmony import */ var _utils_acorn_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/acorn.js */ 35);
+/* harmony import */ var _utils_acorn_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_utils_acorn_js__WEBPACK_IMPORTED_MODULE_0__);
+
+
+var FconfSettings = {
+ ENABLE_BASH_HOTKEYS: false
+}
+
+var FconfComments = {
+ ENABLE_BASH_HOTKEYS: "Improved Bash emulation mode. Setting this to 1 enables several\n" +
+ "new Terminal shortcuts and features that more closely resemble\n" +
+ "a real Bash-style shell. Note that when this mode is enabled,\n" +
+ "the default browser shortcuts are overriden by the new Bash\n" +
+ "shortcuts.\n\n" +
+ "To see a full list of the Terminal shortcuts that this enables, see:\n" +
+ "http://bitburner.readthedocs.io/en/latest/shortcuts.html",
+}
+
+//Parse Fconf settings from the config text
+//Throws an exception if parsing fails
+function parseFconfSettings(config) {
+ var ast = Object(_utils_acorn_js__WEBPACK_IMPORTED_MODULE_0__["parse"])(config, {sourceType:"module"});
+ var queue = [];
+ queue.push(ast);
+ while (queue.length != 0) {
+ var exp = queue.shift();
+ switch (exp.type) {
+ case "BlockStatement":
+ case "Program":
+ for (var i = 0; i < exp.body.length; ++i) {
+ if (exp.body[i] instanceof _utils_acorn_js__WEBPACK_IMPORTED_MODULE_0__["Node"]) {
+ queue.push(exp.body[i]);
+ }
+ }
+ break;
+ case "AssignmentExpression":
+ var setting, value;
+ if (exp.left != null && exp.left.name != null) {
+ setting = exp.left.name;
+ } else {
+ break;
+ }
+ if (exp.right != null && exp.right.raw != null) {
+ value = exp.right.raw;
+ } else {
+ break;
+ }
+ parseFconfSetting(setting, value);
+ break;
+ default:
+ break;
+ }
+
+ for (var prop in exp) {
+ if (exp.hasOwnProperty(prop)) {
+ if (exp[prop] instanceof _utils_acorn_js__WEBPACK_IMPORTED_MODULE_0__["Node"]) {
+ queue.push(exp[prop]);
+ }
+ }
+ }
+ }
+}
+
+function parseFconfSetting(setting, value) {
+ setting = String(setting);
+ value = String(value);
+ if (setting == null || value == null || FconfSettings[setting] == null) {
+ console.log("WARNING: Invalid .fconf setting: " + setting);
+ return;
+ }
+
+ //Needed to convert entered value to boolean/strings accordingly
+ switch(setting) {
+ case "ENABLE_BASH_HOTKEYS":
+ var value = value.toLowerCase();
+ if (value === "1" || value === "true" || value === "y") {
+ value = true;
+ } else {
+ value = false;
+ }
+ FconfSettings[setting] = value;
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+//Create the .fconf file text from the settings
+function createFconf() {
+ var res = "";
+ for (var setting in FconfSettings) {
+ if (FconfSettings.hasOwnProperty(setting)) {
+ //Setting comments (description)
+ var comment = FconfComments[setting];
+ if (comment == null) {continue;}
+ var comment = comment.split("\n");
+ for (var i = 0; i < comment.length; ++i) {
+ res += ("//" + comment[i] + "\n");
+ }
+
+ var value = 0;
+ if (FconfSettings[setting] === true) {
+ value = "1";
+ } else if (FconfSettings[setting] === false) {
+ value = "0";
+ } else {
+ value = String(FconfSettings[setting]);
+ }
+ res += (setting + "=" + value + "\n");
+ }
+ }
+ return res;
+}
+
+function loadFconf(saveString) {
+ FconfSettings = JSON.parse(saveString);
+}
+
+
+
+
+/***/ }),
+/* 35 */
+/*!************************!*\
+ !*** ./utils/acorn.js ***!
+ \************************/
+/***/ (function(module, exports, __webpack_require__) {
+
+/*
+acorn.js
+https://github.com/ternjs/acorn
+
+Copyright (C) 2012-2017 by various contributors (see AUTHORS)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+(function (global, factory) {
+ true ? factory(exports) :
+ undefined;
+}(this, (function (exports) { 'use strict';
+
+// Reserved word lists for various dialects of the language
+
+var reservedWords = {
+ 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",
+ 5: "class enum extends super const export import",
+ 6: "enum",
+ strict: "implements interface let package private protected public static yield",
+ strictBind: "eval arguments"
+}
+
+// And the keywords
+
+var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"
+
+var keywords = {
+ 5: ecma5AndLessKeywords,
+ 6: ecma5AndLessKeywords + " const class extends export import super"
+}
+
+// ## Character categories
+
+// Big ugly regular expressions that match characters in the
+// whitespace, identifier, and identifier-start categories. These
+// are only applied when a character is found to actually have a
+// code point above 128.
+// Generated by `bin/generate-identifier-regex.js`.
+
+var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"
+var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"
+
+var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]")
+var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]")
+
+nonASCIIidentifierStartChars = nonASCIIidentifierChars = null
+
+// These are a run-length and offset encoded representation of the
+// >0xffff code points that are a valid part of identifiers. The
+// offset starts at 0x10000, and each pair of numbers represents an
+// offset to the next range, and then a size of the range. They were
+// generated by bin/generate-identifier-regex.js
+
+// eslint-disable-next-line comma-spacing
+var astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,17,26,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,26,45,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,785,52,76,44,33,24,27,35,42,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,54,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,86,25,391,63,32,0,449,56,264,8,2,36,18,0,50,29,881,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,881,68,12,0,67,12,65,0,32,6124,20,754,9486,1,3071,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,4149,196,60,67,1213,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,10591,541]
+
+// eslint-disable-next-line comma-spacing
+var astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,1306,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,52,0,13,2,49,13,10,2,4,9,83,11,7,0,161,11,6,9,7,3,57,0,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,87,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,423,9,838,7,2,7,17,9,57,21,2,13,19882,9,135,4,60,6,26,9,1016,45,17,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,2214,6,110,6,6,9,792487,239]
+
+// This has a complexity linear to the value of the code. The
+// assumption is that looking up astral identifier characters is
+// rare.
+function isInAstralSet(code, set) {
+ var pos = 0x10000
+ for (var i = 0; i < set.length; i += 2) {
+ pos += set[i]
+ if (pos > code) return false
+ pos += set[i + 1]
+ if (pos >= code) return true
+ }
+}
+
+// Test whether a given character code starts an identifier.
+
+function isIdentifierStart(code, astral) {
+ if (code < 65) return code === 36
+ if (code < 91) return true
+ if (code < 97) return code === 95
+ if (code < 123) return true
+ if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code))
+ if (astral === false) return false
+ return isInAstralSet(code, astralIdentifierStartCodes)
+}
+
+// Test whether a given character is part of an identifier.
+
+function isIdentifierChar(code, astral) {
+ if (code < 48) return code === 36
+ if (code < 58) return true
+ if (code < 65) return false
+ if (code < 91) return true
+ if (code < 97) return code === 95
+ if (code < 123) return true
+ if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code))
+ if (astral === false) return false
+ return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes)
+}
+
+// ## Token types
+
+// The assignment of fine-grained, information-carrying type objects
+// allows the tokenizer to store the information it has about a
+// token in a way that is very cheap for the parser to look up.
+
+// All token type variables start with an underscore, to make them
+// easy to recognize.
+
+// The `beforeExpr` property is used to disambiguate between regular
+// expressions and divisions. It is set on all token types that can
+// be followed by an expression (thus, a slash after them would be a
+// regular expression).
+//
+// The `startsExpr` property is used to check if the token ends a
+// `yield` expression. It is set on all token types that either can
+// directly start an expression (like a quotation mark) or can
+// continue an expression (like the body of a string).
+//
+// `isLoop` marks a keyword as starting a loop, which is important
+// to know when parsing a label, in order to allow or disallow
+// continue jumps to that label.
+
+var TokenType = function TokenType(label, conf) {
+ if ( conf === void 0 ) conf = {};
+
+ this.label = label
+ this.keyword = conf.keyword
+ this.beforeExpr = !!conf.beforeExpr
+ this.startsExpr = !!conf.startsExpr
+ this.isLoop = !!conf.isLoop
+ this.isAssign = !!conf.isAssign
+ this.prefix = !!conf.prefix
+ this.postfix = !!conf.postfix
+ this.binop = conf.binop || null
+ this.updateContext = null
+};
+
+function binop(name, prec) {
+ return new TokenType(name, {beforeExpr: true, binop: prec})
+}
+var beforeExpr = {beforeExpr: true};
+var startsExpr = {startsExpr: true};
+// Map keyword names to token types.
+
+var keywordTypes = {}
+
+// Succinct definitions of keyword token types
+function kw(name, options) {
+ if ( options === void 0 ) options = {};
+
+ options.keyword = name
+ return keywordTypes[name] = new TokenType(name, options)
+}
+
+var tt = {
+ num: new TokenType("num", startsExpr),
+ regexp: new TokenType("regexp", startsExpr),
+ string: new TokenType("string", startsExpr),
+ name: new TokenType("name", startsExpr),
+ eof: new TokenType("eof"),
+
+ // Punctuation token types.
+ bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}),
+ bracketR: new TokenType("]"),
+ braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}),
+ braceR: new TokenType("}"),
+ parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}),
+ parenR: new TokenType(")"),
+ comma: new TokenType(",", beforeExpr),
+ semi: new TokenType(";", beforeExpr),
+ colon: new TokenType(":", beforeExpr),
+ dot: new TokenType("."),
+ question: new TokenType("?", beforeExpr),
+ arrow: new TokenType("=>", beforeExpr),
+ template: new TokenType("template"),
+ ellipsis: new TokenType("...", beforeExpr),
+ backQuote: new TokenType("`", startsExpr),
+ dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}),
+
+ // Operators. These carry several kinds of properties to help the
+ // parser use them properly (the presence of these properties is
+ // what categorizes them as operators).
+ //
+ // `binop`, when present, specifies that this operator is a binary
+ // operator, and will refer to its precedence.
+ //
+ // `prefix` and `postfix` mark the operator as a prefix or postfix
+ // unary operator.
+ //
+ // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as
+ // binary operators with a very low precedence, that should result
+ // in AssignmentExpression nodes.
+
+ eq: new TokenType("=", {beforeExpr: true, isAssign: true}),
+ assign: new TokenType("_=", {beforeExpr: true, isAssign: true}),
+ incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}),
+ prefix: new TokenType("prefix", {beforeExpr: true, prefix: true, startsExpr: true}),
+ logicalOR: binop("||", 1),
+ logicalAND: binop("&&", 2),
+ bitwiseOR: binop("|", 3),
+ bitwiseXOR: binop("^", 4),
+ bitwiseAND: binop("&", 5),
+ equality: binop("==/!=", 6),
+ relational: binop(">", 7),
+ bitShift: binop("<>>", 8),
+ plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}),
+ modulo: binop("%", 10),
+ star: binop("*", 10),
+ slash: binop("/", 10),
+ starstar: new TokenType("**", {beforeExpr: true}),
+
+ // Keyword token types.
+ _break: kw("break"),
+ _case: kw("case", beforeExpr),
+ _catch: kw("catch"),
+ _continue: kw("continue"),
+ _debugger: kw("debugger"),
+ _default: kw("default", beforeExpr),
+ _do: kw("do", {isLoop: true, beforeExpr: true}),
+ _else: kw("else", beforeExpr),
+ _finally: kw("finally"),
+ _for: kw("for", {isLoop: true}),
+ _function: kw("function", startsExpr),
+ _if: kw("if"),
+ _return: kw("return", beforeExpr),
+ _switch: kw("switch"),
+ _throw: kw("throw", beforeExpr),
+ _try: kw("try"),
+ _var: kw("var"),
+ _const: kw("const"),
+ _while: kw("while", {isLoop: true}),
+ _with: kw("with"),
+ _new: kw("new", {beforeExpr: true, startsExpr: true}),
+ _this: kw("this", startsExpr),
+ _super: kw("super", startsExpr),
+ _class: kw("class"),
+ _extends: kw("extends", beforeExpr),
+ _export: kw("export"),
+ _import: kw("import"),
+ _null: kw("null", startsExpr),
+ _true: kw("true", startsExpr),
+ _false: kw("false", startsExpr),
+ _in: kw("in", {beforeExpr: true, binop: 7}),
+ _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}),
+ _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}),
+ _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}),
+ _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true})
+}
+
+// Matches a whole line break (where CRLF is considered a single
+// line break). Used to count lines.
+
+var lineBreak = /\r\n?|\n|\u2028|\u2029/
+var lineBreakG = new RegExp(lineBreak.source, "g")
+
+function isNewLine(code) {
+ return code === 10 || code === 13 || code === 0x2028 || code === 0x2029
+}
+
+var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/
+
+var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g
+
+var ref = Object.prototype;
+var hasOwnProperty = ref.hasOwnProperty;
+var toString = ref.toString;
+
+// Checks if an object has a property.
+
+function has(obj, propName) {
+ return hasOwnProperty.call(obj, propName)
+}
+
+var isArray = Array.isArray || (function (obj) { return (
+ toString.call(obj) === "[object Array]"
+); })
+
+// These are used when `options.locations` is on, for the
+// `startLoc` and `endLoc` properties.
+
+var Position = function Position(line, col) {
+ this.line = line
+ this.column = col
+};
+
+Position.prototype.offset = function offset (n) {
+ return new Position(this.line, this.column + n)
+};
+
+var SourceLocation = function SourceLocation(p, start, end) {
+ this.start = start
+ this.end = end
+ if (p.sourceFile !== null) this.source = p.sourceFile
+};
+
+// The `getLineInfo` function is mostly useful when the
+// `locations` option is off (for performance reasons) and you
+// want to find the line/column position for a given character
+// offset. `input` should be the code string that the offset refers
+// into.
+
+function getLineInfo(input, offset) {
+ for (var line = 1, cur = 0;;) {
+ lineBreakG.lastIndex = cur
+ var match = lineBreakG.exec(input)
+ if (match && match.index < offset) {
+ ++line
+ cur = match.index + match[0].length
+ } else {
+ return new Position(line, offset - cur)
+ }
+ }
+}
+
+// A second optional argument can be given to further configure
+// the parser process. These options are recognized:
+
+var defaultOptions = {
+ // `ecmaVersion` indicates the ECMAScript version to parse. Must
+ // be either 3, 5, 6 (2015), 7 (2016), or 8 (2017). This influences support
+ // for strict mode, the set of reserved words, and support for
+ // new syntax features. The default is 7.
+ ecmaVersion: 7,
+ // `sourceType` indicates the mode the code should be parsed in.
+ // Can be either `"script"` or `"module"`. This influences global
+ // strict mode and parsing of `import` and `export` declarations.
+ sourceType: "script",
+ // `onInsertedSemicolon` can be a callback that will be called
+ // when a semicolon is automatically inserted. It will be passed
+ // th position of the comma as an offset, and if `locations` is
+ // enabled, it is given the location as a `{line, column}` object
+ // as second argument.
+ onInsertedSemicolon: null,
+ // `onTrailingComma` is similar to `onInsertedSemicolon`, but for
+ // trailing commas.
+ onTrailingComma: null,
+ // By default, reserved words are only enforced if ecmaVersion >= 5.
+ // Set `allowReserved` to a boolean value to explicitly turn this on
+ // an off. When this option has the value "never", reserved words
+ // and keywords can also not be used as property names.
+ allowReserved: null,
+ // When enabled, a return at the top level is not considered an
+ // error.
+ allowReturnOutsideFunction: false,
+ // When enabled, import/export statements are not constrained to
+ // appearing at the top of the program.
+ allowImportExportEverywhere: false,
+ // When enabled, hashbang directive in the beginning of file
+ // is allowed and treated as a line comment.
+ allowHashBang: false,
+ // When `locations` is on, `loc` properties holding objects with
+ // `start` and `end` properties in `{line, column}` form (with
+ // line being 1-based and column 0-based) will be attached to the
+ // nodes.
+ locations: false,
+ // A function can be passed as `onToken` option, which will
+ // cause Acorn to call that function with object in the same
+ // format as tokens returned from `tokenizer().getToken()`. Note
+ // that you are not allowed to call the parser from the
+ // callback—that will corrupt its internal state.
+ onToken: null,
+ // A function can be passed as `onComment` option, which will
+ // cause Acorn to call that function with `(block, text, start,
+ // end)` parameters whenever a comment is skipped. `block` is a
+ // boolean indicating whether this is a block (`/* */`) comment,
+ // `text` is the content of the comment, and `start` and `end` are
+ // character offsets that denote the start and end of the comment.
+ // When the `locations` option is on, two more parameters are
+ // passed, the full `{line, column}` locations of the start and
+ // end of the comments. Note that you are not allowed to call the
+ // parser from the callback—that will corrupt its internal state.
+ onComment: null,
+ // Nodes have their start and end characters offsets recorded in
+ // `start` and `end` properties (directly on the node, rather than
+ // the `loc` object, which holds line/column data. To also add a
+ // [semi-standardized][range] `range` property holding a `[start,
+ // end]` array with the same numbers, set the `ranges` option to
+ // `true`.
+ //
+ // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678
+ ranges: false,
+ // It is possible to parse multiple files into a single AST by
+ // passing the tree produced by parsing the first file as
+ // `program` option in subsequent parses. This will add the
+ // toplevel forms of the parsed file to the `Program` (top) node
+ // of an existing parse tree.
+ program: null,
+ // When `locations` is on, you can pass this to record the source
+ // file in every node's `loc` object.
+ sourceFile: null,
+ // This value, if given, is stored in every node, whether
+ // `locations` is on or off.
+ directSourceFile: null,
+ // When enabled, parenthesized expressions are represented by
+ // (non-standard) ParenthesizedExpression nodes
+ preserveParens: false,
+ plugins: {}
+}
+
+// Interpret and default an options object
+
+function getOptions(opts) {
+ var options = {}
+
+ for (var opt in defaultOptions)
+ options[opt] = opts && has(opts, opt) ? opts[opt] : defaultOptions[opt]
+
+ if (options.ecmaVersion >= 2015)
+ options.ecmaVersion -= 2009
+
+ if (options.allowReserved == null)
+ options.allowReserved = options.ecmaVersion < 5
+
+ if (isArray(options.onToken)) {
+ var tokens = options.onToken
+ options.onToken = function (token) { return tokens.push(token); }
+ }
+ if (isArray(options.onComment))
+ options.onComment = pushComment(options, options.onComment)
+
+ return options
+}
+
+function pushComment(options, array) {
+ return function(block, text, start, end, startLoc, endLoc) {
+ var comment = {
+ type: block ? "Block" : "Line",
+ value: text,
+ start: start,
+ end: end
+ }
+ if (options.locations)
+ comment.loc = new SourceLocation(this, startLoc, endLoc)
+ if (options.ranges)
+ comment.range = [start, end]
+ array.push(comment)
+ }
+}
+
+// Registered plugins
+var plugins = {}
+
+function keywordRegexp(words) {
+ return new RegExp("^(" + words.replace(/ /g, "|") + ")$")
+}
+
+var Parser = function Parser(options, input, startPos) {
+ this.options = options = getOptions(options)
+ this.sourceFile = options.sourceFile
+ this.keywords = keywordRegexp(keywords[options.ecmaVersion >= 6 ? 6 : 5])
+ var reserved = ""
+ if (!options.allowReserved) {
+ for (var v = options.ecmaVersion;; v--)
+ if (reserved = reservedWords[v]) break
+ if (options.sourceType == "module") reserved += " await"
+ }
+ this.reservedWords = keywordRegexp(reserved)
+ var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict
+ this.reservedWordsStrict = keywordRegexp(reservedStrict)
+ this.reservedWordsStrictBind = keywordRegexp(reservedStrict + " " + reservedWords.strictBind)
+ this.input = String(input)
+
+ // Used to signal to callers of `readWord1` whether the word
+ // contained any escape sequences. This is needed because words with
+ // escape sequences must not be interpreted as keywords.
+ this.containsEsc = false
+
+ // Load plugins
+ this.loadPlugins(options.plugins)
+
+ // Set up token state
+
+ // The current position of the tokenizer in the input.
+ if (startPos) {
+ this.pos = startPos
+ this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1
+ this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length
+ } else {
+ this.pos = this.lineStart = 0
+ this.curLine = 1
+ }
+
+ // Properties of the current token:
+ // Its type
+ this.type = tt.eof
+ // For tokens that include more information than their type, the value
+ this.value = null
+ // Its start and end offset
+ this.start = this.end = this.pos
+ // And, if locations are used, the {line, column} object
+ // corresponding to those offsets
+ this.startLoc = this.endLoc = this.curPosition()
+
+ // Position information for the previous token
+ this.lastTokEndLoc = this.lastTokStartLoc = null
+ this.lastTokStart = this.lastTokEnd = this.pos
+
+ // The context stack is used to superficially track syntactic
+ // context to predict whether a regular expression is allowed in a
+ // given position.
+ this.context = this.initialContext()
+ this.exprAllowed = true
+
+ // Figure out if it's a module code.
+ this.inModule = options.sourceType === "module"
+ this.strict = this.inModule || this.strictDirective(this.pos)
+
+ // Used to signify the start of a potential arrow function
+ this.potentialArrowAt = -1
+
+ // Flags to track whether we are in a function, a generator, an async function.
+ this.inFunction = this.inGenerator = this.inAsync = false
+ // Positions to delayed-check that yield/await does not exist in default parameters.
+ this.yieldPos = this.awaitPos = 0
+ // Labels in scope.
+ this.labels = []
+
+ // If enabled, skip leading hashbang line.
+ if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === "#!")
+ this.skipLineComment(2)
+
+ // Scope tracking for duplicate variable names (see scope.js)
+ this.scopeStack = []
+ this.enterFunctionScope()
+};
+
+// DEPRECATED Kept for backwards compatibility until 3.0 in case a plugin uses them
+Parser.prototype.isKeyword = function isKeyword (word) { return this.keywords.test(word) };
+Parser.prototype.isReservedWord = function isReservedWord (word) { return this.reservedWords.test(word) };
+
+Parser.prototype.extend = function extend (name, f) {
+ this[name] = f(this[name])
+};
+
+Parser.prototype.loadPlugins = function loadPlugins (pluginConfigs) {
+ var this$1 = this;
+
+ for (var name in pluginConfigs) {
+ var plugin = plugins[name]
+ if (!plugin) throw new Error("Plugin '" + name + "' not found")
+ plugin(this$1, pluginConfigs[name])
+ }
+};
+
+Parser.prototype.parse = function parse () {
+ var node = this.options.program || this.startNode()
+ this.nextToken()
+ return this.parseTopLevel(node)
+};
+
+var pp = Parser.prototype
+
+// ## Parser utilities
+
+var literal = /^(?:'((?:[^']|\.)*)'|"((?:[^"]|\.)*)"|;)/
+pp.strictDirective = function(start) {
+ var this$1 = this;
+
+ for (;;) {
+ skipWhiteSpace.lastIndex = start
+ start += skipWhiteSpace.exec(this$1.input)[0].length
+ var match = literal.exec(this$1.input.slice(start))
+ if (!match) return false
+ if ((match[1] || match[2]) == "use strict") return true
+ start += match[0].length
+ }
+}
+
+// Predicate that tests whether the next token is of the given
+// type, and if yes, consumes it as a side effect.
+
+pp.eat = function(type) {
+ if (this.type === type) {
+ this.next()
+ return true
+ } else {
+ return false
+ }
+}
+
+// Tests whether parsed token is a contextual keyword.
+
+pp.isContextual = function(name) {
+ return this.type === tt.name && this.value === name
+}
+
+// Consumes contextual keyword if possible.
+
+pp.eatContextual = function(name) {
+ return this.value === name && this.eat(tt.name)
+}
+
+// Asserts that following token is given contextual keyword.
+
+pp.expectContextual = function(name) {
+ if (!this.eatContextual(name)) this.unexpected()
+}
+
+// Test whether a semicolon can be inserted at the current position.
+
+pp.canInsertSemicolon = function() {
+ return this.type === tt.eof ||
+ this.type === tt.braceR ||
+ lineBreak.test(this.input.slice(this.lastTokEnd, this.start))
+}
+
+pp.insertSemicolon = function() {
+ if (this.canInsertSemicolon()) {
+ if (this.options.onInsertedSemicolon)
+ this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc)
+ return true
+ }
+}
+
+// Consume a semicolon, or, failing that, see if we are allowed to
+// pretend that there is a semicolon at this position.
+
+pp.semicolon = function() {
+ if (!this.eat(tt.semi) && !this.insertSemicolon()) this.unexpected()
+}
+
+pp.afterTrailingComma = function(tokType, notNext) {
+ if (this.type == tokType) {
+ if (this.options.onTrailingComma)
+ this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc)
+ if (!notNext)
+ this.next()
+ return true
+ }
+}
+
+// Expect a token of a given type. If found, consume it, otherwise,
+// raise an unexpected token error.
+
+pp.expect = function(type) {
+ this.eat(type) || this.unexpected()
+}
+
+// Raise an unexpected token error.
+
+pp.unexpected = function(pos) {
+ this.raise(pos != null ? pos : this.start, "Unexpected token")
+}
+
+var DestructuringErrors = function DestructuringErrors() {
+ this.shorthandAssign = this.trailingComma = this.parenthesizedAssign = this.parenthesizedBind = -1
+};
+
+pp.checkPatternErrors = function(refDestructuringErrors, isAssign) {
+ if (!refDestructuringErrors) return
+ if (refDestructuringErrors.trailingComma > -1)
+ this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element")
+ var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind
+ if (parens > -1) this.raiseRecoverable(parens, "Parenthesized pattern")
+}
+
+pp.checkExpressionErrors = function(refDestructuringErrors, andThrow) {
+ var pos = refDestructuringErrors ? refDestructuringErrors.shorthandAssign : -1
+ if (!andThrow) return pos >= 0
+ if (pos > -1) this.raise(pos, "Shorthand property assignments are valid only in destructuring patterns")
+}
+
+pp.checkYieldAwaitInDefaultParams = function() {
+ if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos))
+ this.raise(this.yieldPos, "Yield expression cannot be a default value")
+ if (this.awaitPos)
+ this.raise(this.awaitPos, "Await expression cannot be a default value")
+}
+
+pp.isSimpleAssignTarget = function(expr) {
+ if (expr.type === "ParenthesizedExpression")
+ return this.isSimpleAssignTarget(expr.expression)
+ return expr.type === "Identifier" || expr.type === "MemberExpression"
+}
+
+var pp$1 = Parser.prototype
+
+// ### Statement parsing
+
+// Parse a program. Initializes the parser, reads any number of
+// statements, and wraps them in a Program node. Optionally takes a
+// `program` argument. If present, the statements will be appended
+// to its body instead of creating a new node.
+
+pp$1.parseTopLevel = function(node) {
+ var this$1 = this;
+
+ var exports = {}
+ if (!node.body) node.body = []
+ while (this.type !== tt.eof) {
+ var stmt = this$1.parseStatement(true, true, exports)
+ node.body.push(stmt)
+ }
+ this.next()
+ if (this.options.ecmaVersion >= 6) {
+ node.sourceType = this.options.sourceType
+ }
+ return this.finishNode(node, "Program")
+}
+
+var loopLabel = {kind: "loop"};
+var switchLabel = {kind: "switch"};
+pp$1.isLet = function() {
+ if (this.type !== tt.name || this.options.ecmaVersion < 6 || this.value != "let") return false
+ skipWhiteSpace.lastIndex = this.pos
+ var skip = skipWhiteSpace.exec(this.input)
+ var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next)
+ if (nextCh === 91 || nextCh == 123) return true // '{' and '['
+ if (isIdentifierStart(nextCh, true)) {
+ var pos = next + 1
+ while (isIdentifierChar(this.input.charCodeAt(pos), true)) ++pos
+ var ident = this.input.slice(next, pos)
+ if (!this.isKeyword(ident)) return true
+ }
+ return false
+}
+
+// check 'async [no LineTerminator here] function'
+// - 'async /*foo*/ function' is OK.
+// - 'async /*\n*/ function' is invalid.
+pp$1.isAsyncFunction = function() {
+ if (this.type !== tt.name || this.options.ecmaVersion < 8 || this.value != "async")
+ return false
+
+ skipWhiteSpace.lastIndex = this.pos
+ var skip = skipWhiteSpace.exec(this.input)
+ var next = this.pos + skip[0].length
+ return !lineBreak.test(this.input.slice(this.pos, next)) &&
+ this.input.slice(next, next + 8) === "function" &&
+ (next + 8 == this.input.length || !isIdentifierChar(this.input.charAt(next + 8)))
+}
+
+// Parse a single statement.
+//
+// If expecting a statement and finding a slash operator, parse a
+// regular expression literal. This is to handle cases like
+// `if (foo) /blah/.exec(foo)`, where looking at the previous token
+// does not help.
+
+pp$1.parseStatement = function(declaration, topLevel, exports) {
+ var starttype = this.type, node = this.startNode(), kind
+
+ if (this.isLet()) {
+ starttype = tt._var
+ kind = "let"
+ }
+
+ // Most types of statements are recognized by the keyword they
+ // start with. Many are trivial to parse, some require a bit of
+ // complexity.
+
+ switch (starttype) {
+ case tt._break: case tt._continue: return this.parseBreakContinueStatement(node, starttype.keyword)
+ case tt._debugger: return this.parseDebuggerStatement(node)
+ case tt._do: return this.parseDoStatement(node)
+ case tt._for: return this.parseForStatement(node)
+ case tt._function:
+ if (!declaration && this.options.ecmaVersion >= 6) this.unexpected()
+ return this.parseFunctionStatement(node, false)
+ case tt._class:
+ if (!declaration) this.unexpected()
+ return this.parseClass(node, true)
+ case tt._if: return this.parseIfStatement(node)
+ case tt._return: return this.parseReturnStatement(node)
+ case tt._switch: return this.parseSwitchStatement(node)
+ case tt._throw: return this.parseThrowStatement(node)
+ case tt._try: return this.parseTryStatement(node)
+ case tt._const: case tt._var:
+ kind = kind || this.value
+ if (!declaration && kind != "var") this.unexpected()
+ return this.parseVarStatement(node, kind)
+ case tt._while: return this.parseWhileStatement(node)
+ case tt._with: return this.parseWithStatement(node)
+ case tt.braceL: return this.parseBlock()
+ case tt.semi: return this.parseEmptyStatement(node)
+ case tt._export:
+ case tt._import:
+ if (!this.options.allowImportExportEverywhere) {
+ if (!topLevel)
+ this.raise(this.start, "'import' and 'export' may only appear at the top level")
+ if (!this.inModule)
+ this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'")
+ }
+ return starttype === tt._import ? this.parseImport(node) : this.parseExport(node, exports)
+
+ // If the statement does not start with a statement keyword or a
+ // brace, it's an ExpressionStatement or LabeledStatement. We
+ // simply start parsing an expression, and afterwards, if the
+ // next token is a colon and the expression was a simple
+ // Identifier node, we switch to interpreting it as a label.
+ default:
+ if (this.isAsyncFunction() && declaration) {
+ this.next()
+ return this.parseFunctionStatement(node, true)
+ }
+
+ var maybeName = this.value, expr = this.parseExpression()
+ if (starttype === tt.name && expr.type === "Identifier" && this.eat(tt.colon))
+ return this.parseLabeledStatement(node, maybeName, expr)
+ else return this.parseExpressionStatement(node, expr)
+ }
+}
+
+pp$1.parseBreakContinueStatement = function(node, keyword) {
+ var this$1 = this;
+
+ var isBreak = keyword == "break"
+ this.next()
+ if (this.eat(tt.semi) || this.insertSemicolon()) node.label = null
+ else if (this.type !== tt.name) this.unexpected()
+ else {
+ node.label = this.parseIdent()
+ this.semicolon()
+ }
+
+ // Verify that there is an actual destination to break or
+ // continue to.
+ var i = 0
+ for (; i < this.labels.length; ++i) {
+ var lab = this$1.labels[i]
+ if (node.label == null || lab.name === node.label.name) {
+ if (lab.kind != null && (isBreak || lab.kind === "loop")) break
+ if (node.label && isBreak) break
+ }
+ }
+ if (i === this.labels.length) this.raise(node.start, "Unsyntactic " + keyword)
+ return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement")
+}
+
+pp$1.parseDebuggerStatement = function(node) {
+ this.next()
+ this.semicolon()
+ return this.finishNode(node, "DebuggerStatement")
+}
+
+pp$1.parseDoStatement = function(node) {
+ this.next()
+ this.labels.push(loopLabel)
+ node.body = this.parseStatement(false)
+ this.labels.pop()
+ this.expect(tt._while)
+ node.test = this.parseParenExpression()
+ if (this.options.ecmaVersion >= 6)
+ this.eat(tt.semi)
+ else
+ this.semicolon()
+ return this.finishNode(node, "DoWhileStatement")
+}
+
+// Disambiguating between a `for` and a `for`/`in` or `for`/`of`
+// loop is non-trivial. Basically, we have to parse the init `var`
+// statement or expression, disallowing the `in` operator (see
+// the second parameter to `parseExpression`), and then check
+// whether the next token is `in` or `of`. When there is no init
+// part (semicolon immediately after the opening parenthesis), it
+// is a regular `for` loop.
+
+pp$1.parseForStatement = function(node) {
+ this.next()
+ this.labels.push(loopLabel)
+ this.enterLexicalScope()
+ this.expect(tt.parenL)
+ if (this.type === tt.semi) return this.parseFor(node, null)
+ var isLet = this.isLet()
+ if (this.type === tt._var || this.type === tt._const || isLet) {
+ var init$1 = this.startNode(), kind = isLet ? "let" : this.value
+ this.next()
+ this.parseVar(init$1, true, kind)
+ this.finishNode(init$1, "VariableDeclaration")
+ if ((this.type === tt._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1 &&
+ !(kind !== "var" && init$1.declarations[0].init))
+ return this.parseForIn(node, init$1)
+ return this.parseFor(node, init$1)
+ }
+ var refDestructuringErrors = new DestructuringErrors
+ var init = this.parseExpression(true, refDestructuringErrors)
+ if (this.type === tt._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) {
+ this.toAssignable(init)
+ this.checkLVal(init)
+ this.checkPatternErrors(refDestructuringErrors, true)
+ return this.parseForIn(node, init)
+ } else {
+ this.checkExpressionErrors(refDestructuringErrors, true)
+ }
+ return this.parseFor(node, init)
+}
+
+pp$1.parseFunctionStatement = function(node, isAsync) {
+ this.next()
+ return this.parseFunction(node, true, false, isAsync)
+}
+
+pp$1.isFunction = function() {
+ return this.type === tt._function || this.isAsyncFunction()
+}
+
+pp$1.parseIfStatement = function(node) {
+ this.next()
+ node.test = this.parseParenExpression()
+ // allow function declarations in branches, but only in non-strict mode
+ node.consequent = this.parseStatement(!this.strict && this.isFunction())
+ node.alternate = this.eat(tt._else) ? this.parseStatement(!this.strict && this.isFunction()) : null
+ return this.finishNode(node, "IfStatement")
+}
+
+pp$1.parseReturnStatement = function(node) {
+ if (!this.inFunction && !this.options.allowReturnOutsideFunction)
+ this.raise(this.start, "'return' outside of function")
+ this.next()
+
+ // In `return` (and `break`/`continue`), the keywords with
+ // optional arguments, we eagerly look for a semicolon or the
+ // possibility to insert one.
+
+ if (this.eat(tt.semi) || this.insertSemicolon()) node.argument = null
+ else { node.argument = this.parseExpression(); this.semicolon() }
+ return this.finishNode(node, "ReturnStatement")
+}
+
+pp$1.parseSwitchStatement = function(node) {
+ var this$1 = this;
+
+ this.next()
+ node.discriminant = this.parseParenExpression()
+ node.cases = []
+ this.expect(tt.braceL)
+ this.labels.push(switchLabel)
+ this.enterLexicalScope()
+
+ // Statements under must be grouped (by label) in SwitchCase
+ // nodes. `cur` is used to keep the node that we are currently
+ // adding statements to.
+
+ var cur
+ for (var sawDefault = false; this.type != tt.braceR;) {
+ if (this$1.type === tt._case || this$1.type === tt._default) {
+ var isCase = this$1.type === tt._case
+ if (cur) this$1.finishNode(cur, "SwitchCase")
+ node.cases.push(cur = this$1.startNode())
+ cur.consequent = []
+ this$1.next()
+ if (isCase) {
+ cur.test = this$1.parseExpression()
+ } else {
+ if (sawDefault) this$1.raiseRecoverable(this$1.lastTokStart, "Multiple default clauses")
+ sawDefault = true
+ cur.test = null
+ }
+ this$1.expect(tt.colon)
+ } else {
+ if (!cur) this$1.unexpected()
+ cur.consequent.push(this$1.parseStatement(true))
+ }
+ }
+ this.exitLexicalScope()
+ if (cur) this.finishNode(cur, "SwitchCase")
+ this.next() // Closing brace
+ this.labels.pop()
+ return this.finishNode(node, "SwitchStatement")
+}
+
+pp$1.parseThrowStatement = function(node) {
+ this.next()
+ if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start)))
+ this.raise(this.lastTokEnd, "Illegal newline after throw")
+ node.argument = this.parseExpression()
+ this.semicolon()
+ return this.finishNode(node, "ThrowStatement")
+}
+
+// Reused empty array added for node fields that are always empty.
+
+var empty = []
+
+pp$1.parseTryStatement = function(node) {
+ this.next()
+ node.block = this.parseBlock()
+ node.handler = null
+ if (this.type === tt._catch) {
+ var clause = this.startNode()
+ this.next()
+ this.expect(tt.parenL)
+ clause.param = this.parseBindingAtom()
+ this.enterLexicalScope()
+ this.checkLVal(clause.param, "let")
+ this.expect(tt.parenR)
+ clause.body = this.parseBlock(false)
+ this.exitLexicalScope()
+ node.handler = this.finishNode(clause, "CatchClause")
+ }
+ node.finalizer = this.eat(tt._finally) ? this.parseBlock() : null
+ if (!node.handler && !node.finalizer)
+ this.raise(node.start, "Missing catch or finally clause")
+ return this.finishNode(node, "TryStatement")
+}
+
+pp$1.parseVarStatement = function(node, kind) {
+ this.next()
+ this.parseVar(node, false, kind)
+ this.semicolon()
+ return this.finishNode(node, "VariableDeclaration")
+}
+
+pp$1.parseWhileStatement = function(node) {
+ this.next()
+ node.test = this.parseParenExpression()
+ this.labels.push(loopLabel)
+ node.body = this.parseStatement(false)
+ this.labels.pop()
+ return this.finishNode(node, "WhileStatement")
+}
+
+pp$1.parseWithStatement = function(node) {
+ if (this.strict) this.raise(this.start, "'with' in strict mode")
+ this.next()
+ node.object = this.parseParenExpression()
+ node.body = this.parseStatement(false)
+ return this.finishNode(node, "WithStatement")
+}
+
+pp$1.parseEmptyStatement = function(node) {
+ this.next()
+ return this.finishNode(node, "EmptyStatement")
+}
+
+pp$1.parseLabeledStatement = function(node, maybeName, expr) {
+ var this$1 = this;
+
+ for (var i = 0; i < this.labels.length; ++i)
+ if (this$1.labels[i].name === maybeName) this$1.raise(expr.start, "Label '" + maybeName + "' is already declared")
+ var kind = this.type.isLoop ? "loop" : this.type === tt._switch ? "switch" : null
+ for (var i$1 = this.labels.length - 1; i$1 >= 0; i$1--) {
+ var label = this$1.labels[i$1]
+ if (label.statementStart == node.start) {
+ label.statementStart = this$1.start
+ label.kind = kind
+ } else break
+ }
+ this.labels.push({name: maybeName, kind: kind, statementStart: this.start})
+ node.body = this.parseStatement(true)
+ if (node.body.type == "ClassDeclaration" ||
+ node.body.type == "VariableDeclaration" && node.body.kind != "var" ||
+ node.body.type == "FunctionDeclaration" && (this.strict || node.body.generator))
+ this.raiseRecoverable(node.body.start, "Invalid labeled declaration")
+ this.labels.pop()
+ node.label = expr
+ return this.finishNode(node, "LabeledStatement")
+}
+
+pp$1.parseExpressionStatement = function(node, expr) {
+ node.expression = expr
+ this.semicolon()
+ return this.finishNode(node, "ExpressionStatement")
+}
+
+// Parse a semicolon-enclosed block of statements, handling `"use
+// strict"` declarations when `allowStrict` is true (used for
+// function bodies).
+
+pp$1.parseBlock = function(createNewLexicalScope) {
+ var this$1 = this;
+ if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true;
+
+ var node = this.startNode()
+ node.body = []
+ this.expect(tt.braceL)
+ if (createNewLexicalScope) {
+ this.enterLexicalScope()
+ }
+ while (!this.eat(tt.braceR)) {
+ var stmt = this$1.parseStatement(true)
+ node.body.push(stmt)
+ }
+ if (createNewLexicalScope) {
+ this.exitLexicalScope()
+ }
+ return this.finishNode(node, "BlockStatement")
+}
+
+// Parse a regular `for` loop. The disambiguation code in
+// `parseStatement` will already have parsed the init statement or
+// expression.
+
+pp$1.parseFor = function(node, init) {
+ node.init = init
+ this.expect(tt.semi)
+ node.test = this.type === tt.semi ? null : this.parseExpression()
+ this.expect(tt.semi)
+ node.update = this.type === tt.parenR ? null : this.parseExpression()
+ this.expect(tt.parenR)
+ this.exitLexicalScope()
+ node.body = this.parseStatement(false)
+ this.labels.pop()
+ return this.finishNode(node, "ForStatement")
+}
+
+// Parse a `for`/`in` and `for`/`of` loop, which are almost
+// same from parser's perspective.
+
+pp$1.parseForIn = function(node, init) {
+ var type = this.type === tt._in ? "ForInStatement" : "ForOfStatement"
+ this.next()
+ node.left = init
+ node.right = this.parseExpression()
+ this.expect(tt.parenR)
+ this.exitLexicalScope()
+ node.body = this.parseStatement(false)
+ this.labels.pop()
+ return this.finishNode(node, type)
+}
+
+// Parse a list of variable declarations.
+
+pp$1.parseVar = function(node, isFor, kind) {
+ var this$1 = this;
+
+ node.declarations = []
+ node.kind = kind
+ for (;;) {
+ var decl = this$1.startNode()
+ this$1.parseVarId(decl, kind)
+ if (this$1.eat(tt.eq)) {
+ decl.init = this$1.parseMaybeAssign(isFor)
+ } else if (kind === "const" && !(this$1.type === tt._in || (this$1.options.ecmaVersion >= 6 && this$1.isContextual("of")))) {
+ this$1.unexpected()
+ } else if (decl.id.type != "Identifier" && !(isFor && (this$1.type === tt._in || this$1.isContextual("of")))) {
+ this$1.raise(this$1.lastTokEnd, "Complex binding patterns require an initialization value")
+ } else {
+ decl.init = null
+ }
+ node.declarations.push(this$1.finishNode(decl, "VariableDeclarator"))
+ if (!this$1.eat(tt.comma)) break
+ }
+ return node
+}
+
+pp$1.parseVarId = function(decl, kind) {
+ decl.id = this.parseBindingAtom(kind)
+ this.checkLVal(decl.id, kind, false)
+}
+
+// Parse a function declaration or literal (depending on the
+// `isStatement` parameter).
+
+pp$1.parseFunction = function(node, isStatement, allowExpressionBody, isAsync) {
+ this.initFunction(node)
+ if (this.options.ecmaVersion >= 6 && !isAsync)
+ node.generator = this.eat(tt.star)
+ if (this.options.ecmaVersion >= 8)
+ node.async = !!isAsync
+
+ if (isStatement) {
+ node.id = isStatement === "nullableID" && this.type != tt.name ? null : this.parseIdent()
+ if (node.id) {
+ this.checkLVal(node.id, "var")
+ }
+ }
+
+ var oldInGen = this.inGenerator, oldInAsync = this.inAsync,
+ oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldInFunc = this.inFunction
+ this.inGenerator = node.generator
+ this.inAsync = node.async
+ this.yieldPos = 0
+ this.awaitPos = 0
+ this.inFunction = true
+ this.enterFunctionScope()
+
+ if (!isStatement)
+ node.id = this.type == tt.name ? this.parseIdent() : null
+
+ this.parseFunctionParams(node)
+ this.parseFunctionBody(node, allowExpressionBody)
+
+ this.inGenerator = oldInGen
+ this.inAsync = oldInAsync
+ this.yieldPos = oldYieldPos
+ this.awaitPos = oldAwaitPos
+ this.inFunction = oldInFunc
+ return this.finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression")
+}
+
+pp$1.parseFunctionParams = function(node) {
+ this.expect(tt.parenL)
+ node.params = this.parseBindingList(tt.parenR, false, this.options.ecmaVersion >= 8, true)
+ this.checkYieldAwaitInDefaultParams()
+}
+
+// Parse a class declaration or literal (depending on the
+// `isStatement` parameter).
+
+pp$1.parseClass = function(node, isStatement) {
+ var this$1 = this;
+
+ this.next()
+
+ this.parseClassId(node, isStatement)
+ this.parseClassSuper(node)
+ var classBody = this.startNode()
+ var hadConstructor = false
+ classBody.body = []
+ this.expect(tt.braceL)
+ while (!this.eat(tt.braceR)) {
+ if (this$1.eat(tt.semi)) continue
+ var method = this$1.startNode()
+ var isGenerator = this$1.eat(tt.star)
+ var isAsync = false
+ var isMaybeStatic = this$1.type === tt.name && this$1.value === "static"
+ this$1.parsePropertyName(method)
+ method.static = isMaybeStatic && this$1.type !== tt.parenL
+ if (method.static) {
+ if (isGenerator) this$1.unexpected()
+ isGenerator = this$1.eat(tt.star)
+ this$1.parsePropertyName(method)
+ }
+ if (this$1.options.ecmaVersion >= 8 && !isGenerator && !method.computed &&
+ method.key.type === "Identifier" && method.key.name === "async" && this$1.type !== tt.parenL &&
+ !this$1.canInsertSemicolon()) {
+ isAsync = true
+ this$1.parsePropertyName(method)
+ }
+ method.kind = "method"
+ var isGetSet = false
+ if (!method.computed) {
+ var key = method.key;
+ if (!isGenerator && !isAsync && key.type === "Identifier" && this$1.type !== tt.parenL && (key.name === "get" || key.name === "set")) {
+ isGetSet = true
+ method.kind = key.name
+ key = this$1.parsePropertyName(method)
+ }
+ if (!method.static && (key.type === "Identifier" && key.name === "constructor" ||
+ key.type === "Literal" && key.value === "constructor")) {
+ if (hadConstructor) this$1.raise(key.start, "Duplicate constructor in the same class")
+ if (isGetSet) this$1.raise(key.start, "Constructor can't have get/set modifier")
+ if (isGenerator) this$1.raise(key.start, "Constructor can't be a generator")
+ if (isAsync) this$1.raise(key.start, "Constructor can't be an async method")
+ method.kind = "constructor"
+ hadConstructor = true
+ }
+ }
+ this$1.parseClassMethod(classBody, method, isGenerator, isAsync)
+ if (isGetSet) {
+ var paramCount = method.kind === "get" ? 0 : 1
+ if (method.value.params.length !== paramCount) {
+ var start = method.value.start
+ if (method.kind === "get")
+ this$1.raiseRecoverable(start, "getter should have no params")
+ else
+ this$1.raiseRecoverable(start, "setter should have exactly one param")
+ } else {
+ if (method.kind === "set" && method.value.params[0].type === "RestElement")
+ this$1.raiseRecoverable(method.value.params[0].start, "Setter cannot use rest params")
+ }
+ }
+ }
+ node.body = this.finishNode(classBody, "ClassBody")
+ return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression")
+}
+
+pp$1.parseClassMethod = function(classBody, method, isGenerator, isAsync) {
+ method.value = this.parseMethod(isGenerator, isAsync)
+ classBody.body.push(this.finishNode(method, "MethodDefinition"))
+}
+
+pp$1.parseClassId = function(node, isStatement) {
+ node.id = this.type === tt.name ? this.parseIdent() : isStatement === true ? this.unexpected() : null
+}
+
+pp$1.parseClassSuper = function(node) {
+ node.superClass = this.eat(tt._extends) ? this.parseExprSubscripts() : null
+}
+
+// Parses module export declaration.
+
+pp$1.parseExport = function(node, exports) {
+ var this$1 = this;
+
+ this.next()
+ // export * from '...'
+ if (this.eat(tt.star)) {
+ this.expectContextual("from")
+ node.source = this.type === tt.string ? this.parseExprAtom() : this.unexpected()
+ this.semicolon()
+ return this.finishNode(node, "ExportAllDeclaration")
+ }
+ if (this.eat(tt._default)) { // export default ...
+ this.checkExport(exports, "default", this.lastTokStart)
+ var isAsync
+ if (this.type === tt._function || (isAsync = this.isAsyncFunction())) {
+ var fNode = this.startNode()
+ this.next()
+ if (isAsync) this.next()
+ node.declaration = this.parseFunction(fNode, "nullableID", false, isAsync)
+ } else if (this.type === tt._class) {
+ var cNode = this.startNode()
+ node.declaration = this.parseClass(cNode, "nullableID")
+ } else {
+ node.declaration = this.parseMaybeAssign()
+ this.semicolon()
+ }
+ return this.finishNode(node, "ExportDefaultDeclaration")
+ }
+ // export var|const|let|function|class ...
+ if (this.shouldParseExportStatement()) {
+ node.declaration = this.parseStatement(true)
+ if (node.declaration.type === "VariableDeclaration")
+ this.checkVariableExport(exports, node.declaration.declarations)
+ else
+ this.checkExport(exports, node.declaration.id.name, node.declaration.id.start)
+ node.specifiers = []
+ node.source = null
+ } else { // export { x, y as z } [from '...']
+ node.declaration = null
+ node.specifiers = this.parseExportSpecifiers(exports)
+ if (this.eatContextual("from")) {
+ node.source = this.type === tt.string ? this.parseExprAtom() : this.unexpected()
+ } else {
+ // check for keywords used as local names
+ for (var i = 0; i < node.specifiers.length; i++) {
+ if (this$1.keywords.test(node.specifiers[i].local.name) || this$1.reservedWords.test(node.specifiers[i].local.name)) {
+ this$1.unexpected(node.specifiers[i].local.start)
+ }
+ }
+
+ node.source = null
+ }
+ this.semicolon()
+ }
+ return this.finishNode(node, "ExportNamedDeclaration")
+}
+
+pp$1.checkExport = function(exports, name, pos) {
+ if (!exports) return
+ if (has(exports, name))
+ this.raiseRecoverable(pos, "Duplicate export '" + name + "'")
+ exports[name] = true
+}
+
+pp$1.checkPatternExport = function(exports, pat) {
+ var this$1 = this;
+
+ var type = pat.type
+ if (type == "Identifier")
+ this.checkExport(exports, pat.name, pat.start)
+ else if (type == "ObjectPattern")
+ for (var i = 0; i < pat.properties.length; ++i)
+ this$1.checkPatternExport(exports, pat.properties[i].value)
+ else if (type == "ArrayPattern")
+ for (var i$1 = 0; i$1 < pat.elements.length; ++i$1) {
+ var elt = pat.elements[i$1]
+ if (elt) this$1.checkPatternExport(exports, elt)
+ }
+ else if (type == "AssignmentPattern")
+ this.checkPatternExport(exports, pat.left)
+ else if (type == "ParenthesizedExpression")
+ this.checkPatternExport(exports, pat.expression)
+}
+
+pp$1.checkVariableExport = function(exports, decls) {
+ var this$1 = this;
+
+ if (!exports) return
+ for (var i = 0; i < decls.length; i++)
+ this$1.checkPatternExport(exports, decls[i].id)
+}
+
+pp$1.shouldParseExportStatement = function() {
+ return this.type.keyword === "var" ||
+ this.type.keyword === "const" ||
+ this.type.keyword === "class" ||
+ this.type.keyword === "function" ||
+ this.isLet() ||
+ this.isAsyncFunction()
+}
+
+// Parses a comma-separated list of module exports.
+
+pp$1.parseExportSpecifiers = function(exports) {
+ var this$1 = this;
+
+ var nodes = [], first = true
+ // export { x, y as z } [from '...']
+ this.expect(tt.braceL)
+ while (!this.eat(tt.braceR)) {
+ if (!first) {
+ this$1.expect(tt.comma)
+ if (this$1.afterTrailingComma(tt.braceR)) break
+ } else first = false
+
+ var node = this$1.startNode()
+ node.local = this$1.parseIdent(true)
+ node.exported = this$1.eatContextual("as") ? this$1.parseIdent(true) : node.local
+ this$1.checkExport(exports, node.exported.name, node.exported.start)
+ nodes.push(this$1.finishNode(node, "ExportSpecifier"))
+ }
+ return nodes
+}
+
+// Parses import declaration.
+
+pp$1.parseImport = function(node) {
+ this.next()
+ // import '...'
+ if (this.type === tt.string) {
+ node.specifiers = empty
+ node.source = this.parseExprAtom()
+ } else {
+ node.specifiers = this.parseImportSpecifiers()
+ this.expectContextual("from")
+ node.source = this.type === tt.string ? this.parseExprAtom() : this.unexpected()
+ }
+ this.semicolon()
+ return this.finishNode(node, "ImportDeclaration")
+}
+
+// Parses a comma-separated list of module imports.
+
+pp$1.parseImportSpecifiers = function() {
+ var this$1 = this;
+
+ var nodes = [], first = true
+ if (this.type === tt.name) {
+ // import defaultObj, { x, y as z } from '...'
+ var node = this.startNode()
+ node.local = this.parseIdent()
+ this.checkLVal(node.local, "let")
+ nodes.push(this.finishNode(node, "ImportDefaultSpecifier"))
+ if (!this.eat(tt.comma)) return nodes
+ }
+ if (this.type === tt.star) {
+ var node$1 = this.startNode()
+ this.next()
+ this.expectContextual("as")
+ node$1.local = this.parseIdent()
+ this.checkLVal(node$1.local, "let")
+ nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier"))
+ return nodes
+ }
+ this.expect(tt.braceL)
+ while (!this.eat(tt.braceR)) {
+ if (!first) {
+ this$1.expect(tt.comma)
+ if (this$1.afterTrailingComma(tt.braceR)) break
+ } else first = false
+
+ var node$2 = this$1.startNode()
+ node$2.imported = this$1.parseIdent(true)
+ if (this$1.eatContextual("as")) {
+ node$2.local = this$1.parseIdent()
+ } else {
+ node$2.local = node$2.imported
+ if (this$1.isKeyword(node$2.local.name)) this$1.unexpected(node$2.local.start)
+ if (this$1.reservedWordsStrict.test(node$2.local.name)) this$1.raiseRecoverable(node$2.local.start, "The keyword '" + node$2.local.name + "' is reserved")
+ }
+ this$1.checkLVal(node$2.local, "let")
+ nodes.push(this$1.finishNode(node$2, "ImportSpecifier"))
+ }
+ return nodes
+}
+
+var pp$2 = Parser.prototype
+
+// Convert existing expression atom to assignable pattern
+// if possible.
+
+pp$2.toAssignable = function(node, isBinding) {
+ var this$1 = this;
+
+ if (this.options.ecmaVersion >= 6 && node) {
+ switch (node.type) {
+ case "Identifier":
+ if (this.inAsync && node.name === "await")
+ this.raise(node.start, "Can not use 'await' as identifier inside an async function")
+ break
+
+ case "ObjectPattern":
+ case "ArrayPattern":
+ break
+
+ case "ObjectExpression":
+ node.type = "ObjectPattern"
+ for (var i = 0; i < node.properties.length; i++) {
+ var prop = node.properties[i]
+ if (prop.kind !== "init") this$1.raise(prop.key.start, "Object pattern can't contain getter or setter")
+ this$1.toAssignable(prop.value, isBinding)
+ }
+ break
+
+ case "ArrayExpression":
+ node.type = "ArrayPattern"
+ this.toAssignableList(node.elements, isBinding)
+ break
+
+ case "AssignmentExpression":
+ if (node.operator === "=") {
+ node.type = "AssignmentPattern"
+ delete node.operator
+ this.toAssignable(node.left, isBinding)
+ // falls through to AssignmentPattern
+ } else {
+ this.raise(node.left.end, "Only '=' operator can be used for specifying default value.")
+ break
+ }
+
+ case "AssignmentPattern":
+ break
+
+ case "ParenthesizedExpression":
+ node.expression = this.toAssignable(node.expression, isBinding)
+ break
+
+ case "MemberExpression":
+ if (!isBinding) break
+
+ default:
+ this.raise(node.start, "Assigning to rvalue")
+ }
+ }
+ return node
+}
+
+// Convert list of expression atoms to binding list.
+
+pp$2.toAssignableList = function(exprList, isBinding) {
+ var this$1 = this;
+
+ var end = exprList.length
+ if (end) {
+ var last = exprList[end - 1]
+ if (last && last.type == "RestElement") {
+ --end
+ } else if (last && last.type == "SpreadElement") {
+ last.type = "RestElement"
+ var arg = last.argument
+ this.toAssignable(arg, isBinding)
+ if (arg.type !== "Identifier" && arg.type !== "MemberExpression" && arg.type !== "ArrayPattern")
+ this.unexpected(arg.start)
+ --end
+ }
+
+ if (isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier")
+ this.unexpected(last.argument.start)
+ }
+ for (var i = 0; i < end; i++) {
+ var elt = exprList[i]
+ if (elt) this$1.toAssignable(elt, isBinding)
+ }
+ return exprList
+}
+
+// Parses spread element.
+
+pp$2.parseSpread = function(refDestructuringErrors) {
+ var node = this.startNode()
+ this.next()
+ node.argument = this.parseMaybeAssign(false, refDestructuringErrors)
+ return this.finishNode(node, "SpreadElement")
+}
+
+pp$2.parseRest = function(allowNonIdent) {
+ var node = this.startNode()
+ this.next()
+
+ // RestElement inside of a function parameter must be an identifier
+ if (allowNonIdent) node.argument = this.type === tt.name ? this.parseIdent() : this.unexpected()
+ else node.argument = this.type === tt.name || this.type === tt.bracketL ? this.parseBindingAtom() : this.unexpected()
+
+ return this.finishNode(node, "RestElement")
+}
+
+// Parses lvalue (assignable) atom.
+
+pp$2.parseBindingAtom = function() {
+ if (this.options.ecmaVersion < 6) return this.parseIdent()
+ switch (this.type) {
+ case tt.name:
+ return this.parseIdent()
+
+ case tt.bracketL:
+ var node = this.startNode()
+ this.next()
+ node.elements = this.parseBindingList(tt.bracketR, true, true)
+ return this.finishNode(node, "ArrayPattern")
+
+ case tt.braceL:
+ return this.parseObj(true)
+
+ default:
+ this.unexpected()
+ }
+}
+
+pp$2.parseBindingList = function(close, allowEmpty, allowTrailingComma, allowNonIdent) {
+ var this$1 = this;
+
+ var elts = [], first = true
+ while (!this.eat(close)) {
+ if (first) first = false
+ else this$1.expect(tt.comma)
+ if (allowEmpty && this$1.type === tt.comma) {
+ elts.push(null)
+ } else if (allowTrailingComma && this$1.afterTrailingComma(close)) {
+ break
+ } else if (this$1.type === tt.ellipsis) {
+ var rest = this$1.parseRest(allowNonIdent)
+ this$1.parseBindingListItem(rest)
+ elts.push(rest)
+ if (this$1.type === tt.comma) this$1.raise(this$1.start, "Comma is not permitted after the rest element")
+ this$1.expect(close)
+ break
+ } else {
+ var elem = this$1.parseMaybeDefault(this$1.start, this$1.startLoc)
+ this$1.parseBindingListItem(elem)
+ elts.push(elem)
+ }
+ }
+ return elts
+}
+
+pp$2.parseBindingListItem = function(param) {
+ return param
+}
+
+// Parses assignment pattern around given atom if possible.
+
+pp$2.parseMaybeDefault = function(startPos, startLoc, left) {
+ left = left || this.parseBindingAtom()
+ if (this.options.ecmaVersion < 6 || !this.eat(tt.eq)) return left
+ var node = this.startNodeAt(startPos, startLoc)
+ node.left = left
+ node.right = this.parseMaybeAssign()
+ return this.finishNode(node, "AssignmentPattern")
+}
+
+// Verify that a node is an lval — something that can be assigned
+// to.
+// bindingType can be either:
+// 'var' indicating that the lval creates a 'var' binding
+// 'let' indicating that the lval creates a lexical ('let' or 'const') binding
+// 'none' indicating that the binding should be checked for illegal identifiers, but not for duplicate references
+
+pp$2.checkLVal = function(expr, bindingType, checkClashes) {
+ var this$1 = this;
+
+ switch (expr.type) {
+ case "Identifier":
+ if (this.strict && this.reservedWordsStrictBind.test(expr.name))
+ this.raiseRecoverable(expr.start, (bindingType ? "Binding " : "Assigning to ") + expr.name + " in strict mode")
+ if (checkClashes) {
+ if (has(checkClashes, expr.name))
+ this.raiseRecoverable(expr.start, "Argument name clash")
+ checkClashes[expr.name] = true
+ }
+ if (bindingType && bindingType !== "none") {
+ if (
+ bindingType === "var" && !this.canDeclareVarName(expr.name) ||
+ bindingType !== "var" && !this.canDeclareLexicalName(expr.name)
+ ) {
+ this.raiseRecoverable(expr.start, ("Identifier '" + (expr.name) + "' has already been declared"))
+ }
+ if (bindingType === "var") {
+ this.declareVarName(expr.name)
+ } else {
+ this.declareLexicalName(expr.name)
+ }
+ }
+ break
+
+ case "MemberExpression":
+ if (bindingType) this.raiseRecoverable(expr.start, (bindingType ? "Binding" : "Assigning to") + " member expression")
+ break
+
+ case "ObjectPattern":
+ for (var i = 0; i < expr.properties.length; i++)
+ this$1.checkLVal(expr.properties[i].value, bindingType, checkClashes)
+ break
+
+ case "ArrayPattern":
+ for (var i$1 = 0; i$1 < expr.elements.length; i$1++) {
+ var elem = expr.elements[i$1]
+ if (elem) this$1.checkLVal(elem, bindingType, checkClashes)
+ }
+ break
+
+ case "AssignmentPattern":
+ this.checkLVal(expr.left, bindingType, checkClashes)
+ break
+
+ case "RestElement":
+ this.checkLVal(expr.argument, bindingType, checkClashes)
+ break
+
+ case "ParenthesizedExpression":
+ this.checkLVal(expr.expression, bindingType, checkClashes)
+ break
+
+ default:
+ this.raise(expr.start, (bindingType ? "Binding" : "Assigning to") + " rvalue")
+ }
+}
+
+// A recursive descent parser operates by defining functions for all
+// syntactic elements, and recursively calling those, each function
+// advancing the input stream and returning an AST node. Precedence
+// of constructs (for example, the fact that `!x[1]` means `!(x[1])`
+// instead of `(!x)[1]` is handled by the fact that the parser
+// function that parses unary prefix operators is called first, and
+// in turn calls the function that parses `[]` subscripts — that
+// way, it'll receive the node for `x[1]` already parsed, and wraps
+// *that* in the unary operator node.
+//
+// Acorn uses an [operator precedence parser][opp] to handle binary
+// operator precedence, because it is much more compact than using
+// the technique outlined above, which uses different, nesting
+// functions to specify precedence, for all of the ten binary
+// precedence levels that JavaScript defines.
+//
+// [opp]: http://en.wikipedia.org/wiki/Operator-precedence_parser
+
+var pp$3 = Parser.prototype
+
+// Check if property name clashes with already added.
+// Object/class getters and setters are not allowed to clash —
+// either with each other or with an init property — and in
+// strict mode, init properties are also not allowed to be repeated.
+
+pp$3.checkPropClash = function(prop, propHash) {
+ if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand))
+ return
+ var key = prop.key;
+ var name
+ switch (key.type) {
+ case "Identifier": name = key.name; break
+ case "Literal": name = String(key.value); break
+ default: return
+ }
+ var kind = prop.kind;
+ if (this.options.ecmaVersion >= 6) {
+ if (name === "__proto__" && kind === "init") {
+ if (propHash.proto) this.raiseRecoverable(key.start, "Redefinition of __proto__ property")
+ propHash.proto = true
+ }
+ return
+ }
+ name = "$" + name
+ var other = propHash[name]
+ if (other) {
+ var redefinition
+ if (kind === "init") {
+ redefinition = this.strict && other.init || other.get || other.set
+ } else {
+ redefinition = other.init || other[kind]
+ }
+ if (redefinition)
+ this.raiseRecoverable(key.start, "Redefinition of property")
+ } else {
+ other = propHash[name] = {
+ init: false,
+ get: false,
+ set: false
+ }
+ }
+ other[kind] = true
+}
+
+// ### Expression parsing
+
+// These nest, from the most general expression type at the top to
+// 'atomic', nondivisible expression types at the bottom. Most of
+// the functions will simply let the function(s) below them parse,
+// and, *if* the syntactic construct they handle is present, wrap
+// the AST node that the inner parser gave them in another node.
+
+// Parse a full expression. The optional arguments are used to
+// forbid the `in` operator (in for loops initalization expressions)
+// and provide reference for storing '=' operator inside shorthand
+// property assignment in contexts where both object expression
+// and object pattern might appear (so it's possible to raise
+// delayed syntax error at correct position).
+
+pp$3.parseExpression = function(noIn, refDestructuringErrors) {
+ var this$1 = this;
+
+ var startPos = this.start, startLoc = this.startLoc
+ var expr = this.parseMaybeAssign(noIn, refDestructuringErrors)
+ if (this.type === tt.comma) {
+ var node = this.startNodeAt(startPos, startLoc)
+ node.expressions = [expr]
+ while (this.eat(tt.comma)) node.expressions.push(this$1.parseMaybeAssign(noIn, refDestructuringErrors))
+ return this.finishNode(node, "SequenceExpression")
+ }
+ return expr
+}
+
+// Parse an assignment expression. This includes applications of
+// operators like `+=`.
+
+pp$3.parseMaybeAssign = function(noIn, refDestructuringErrors, afterLeftParse) {
+ if (this.inGenerator && this.isContextual("yield")) return this.parseYield()
+
+ var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1
+ if (refDestructuringErrors) {
+ oldParenAssign = refDestructuringErrors.parenthesizedAssign
+ oldTrailingComma = refDestructuringErrors.trailingComma
+ refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1
+ } else {
+ refDestructuringErrors = new DestructuringErrors
+ ownDestructuringErrors = true
+ }
+
+ var startPos = this.start, startLoc = this.startLoc
+ if (this.type == tt.parenL || this.type == tt.name)
+ this.potentialArrowAt = this.start
+ var left = this.parseMaybeConditional(noIn, refDestructuringErrors)
+ if (afterLeftParse) left = afterLeftParse.call(this, left, startPos, startLoc)
+ if (this.type.isAssign) {
+ this.checkPatternErrors(refDestructuringErrors, true)
+ if (!ownDestructuringErrors) DestructuringErrors.call(refDestructuringErrors)
+ var node = this.startNodeAt(startPos, startLoc)
+ node.operator = this.value
+ node.left = this.type === tt.eq ? this.toAssignable(left) : left
+ refDestructuringErrors.shorthandAssign = -1 // reset because shorthand default was used correctly
+ this.checkLVal(left)
+ this.next()
+ node.right = this.parseMaybeAssign(noIn)
+ return this.finishNode(node, "AssignmentExpression")
+ } else {
+ if (ownDestructuringErrors) this.checkExpressionErrors(refDestructuringErrors, true)
+ }
+ if (oldParenAssign > -1) refDestructuringErrors.parenthesizedAssign = oldParenAssign
+ if (oldTrailingComma > -1) refDestructuringErrors.trailingComma = oldTrailingComma
+ return left
+}
+
+// Parse a ternary conditional (`?:`) operator.
+
+pp$3.parseMaybeConditional = function(noIn, refDestructuringErrors) {
+ var startPos = this.start, startLoc = this.startLoc
+ var expr = this.parseExprOps(noIn, refDestructuringErrors)
+ if (this.checkExpressionErrors(refDestructuringErrors)) return expr
+ if (this.eat(tt.question)) {
+ var node = this.startNodeAt(startPos, startLoc)
+ node.test = expr
+ node.consequent = this.parseMaybeAssign()
+ this.expect(tt.colon)
+ node.alternate = this.parseMaybeAssign(noIn)
+ return this.finishNode(node, "ConditionalExpression")
+ }
+ return expr
+}
+
+// Start the precedence parser.
+
+pp$3.parseExprOps = function(noIn, refDestructuringErrors) {
+ var startPos = this.start, startLoc = this.startLoc
+ var expr = this.parseMaybeUnary(refDestructuringErrors, false)
+ if (this.checkExpressionErrors(refDestructuringErrors)) return expr
+ return expr.start == startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, noIn)
+}
+
+// Parse binary operators with the operator precedence parsing
+// algorithm. `left` is the left-hand side of the operator.
+// `minPrec` provides context that allows the function to stop and
+// defer further parser to one of its callers when it encounters an
+// operator that has a lower precedence than the set it is parsing.
+
+pp$3.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, noIn) {
+ var prec = this.type.binop
+ if (prec != null && (!noIn || this.type !== tt._in)) {
+ if (prec > minPrec) {
+ var logical = this.type === tt.logicalOR || this.type === tt.logicalAND
+ var op = this.value
+ this.next()
+ var startPos = this.start, startLoc = this.startLoc
+ var right = this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn)
+ var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical)
+ return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn)
+ }
+ }
+ return left
+}
+
+pp$3.buildBinary = function(startPos, startLoc, left, right, op, logical) {
+ var node = this.startNodeAt(startPos, startLoc)
+ node.left = left
+ node.operator = op
+ node.right = right
+ return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression")
+}
+
+// Parse unary operators, both prefix and postfix.
+
+pp$3.parseMaybeUnary = function(refDestructuringErrors, sawUnary) {
+ var this$1 = this;
+
+ var startPos = this.start, startLoc = this.startLoc, expr
+ if (this.inAsync && this.isContextual("await")) {
+ expr = this.parseAwait(refDestructuringErrors)
+ sawUnary = true
+ } else if (this.type.prefix) {
+ var node = this.startNode(), update = this.type === tt.incDec
+ node.operator = this.value
+ node.prefix = true
+ this.next()
+ node.argument = this.parseMaybeUnary(null, true)
+ this.checkExpressionErrors(refDestructuringErrors, true)
+ if (update) this.checkLVal(node.argument)
+ else if (this.strict && node.operator === "delete" &&
+ node.argument.type === "Identifier")
+ this.raiseRecoverable(node.start, "Deleting local variable in strict mode")
+ else sawUnary = true
+ expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression")
+ } else {
+ expr = this.parseExprSubscripts(refDestructuringErrors)
+ if (this.checkExpressionErrors(refDestructuringErrors)) return expr
+ while (this.type.postfix && !this.canInsertSemicolon()) {
+ var node$1 = this$1.startNodeAt(startPos, startLoc)
+ node$1.operator = this$1.value
+ node$1.prefix = false
+ node$1.argument = expr
+ this$1.checkLVal(expr)
+ this$1.next()
+ expr = this$1.finishNode(node$1, "UpdateExpression")
+ }
+ }
+
+ if (!sawUnary && this.eat(tt.starstar))
+ return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false), "**", false)
+ else
+ return expr
+}
+
+// Parse call, dot, and `[]`-subscript expressions.
+
+pp$3.parseExprSubscripts = function(refDestructuringErrors) {
+ var startPos = this.start, startLoc = this.startLoc
+ var expr = this.parseExprAtom(refDestructuringErrors)
+ var skipArrowSubscripts = expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")"
+ if (this.checkExpressionErrors(refDestructuringErrors) || skipArrowSubscripts) return expr
+ var result = this.parseSubscripts(expr, startPos, startLoc)
+ if (refDestructuringErrors && result.type === "MemberExpression") {
+ if (refDestructuringErrors.parenthesizedAssign >= result.start) refDestructuringErrors.parenthesizedAssign = -1
+ if (refDestructuringErrors.parenthesizedBind >= result.start) refDestructuringErrors.parenthesizedBind = -1
+ }
+ return result
+}
+
+pp$3.parseSubscripts = function(base, startPos, startLoc, noCalls) {
+ var this$1 = this;
+
+ var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === "Identifier" && base.name === "async" &&
+ this.lastTokEnd == base.end && !this.canInsertSemicolon()
+ for (var computed;;) {
+ if ((computed = this$1.eat(tt.bracketL)) || this$1.eat(tt.dot)) {
+ var node = this$1.startNodeAt(startPos, startLoc)
+ node.object = base
+ node.property = computed ? this$1.parseExpression() : this$1.parseIdent(true)
+ node.computed = !!computed
+ if (computed) this$1.expect(tt.bracketR)
+ base = this$1.finishNode(node, "MemberExpression")
+ } else if (!noCalls && this$1.eat(tt.parenL)) {
+ var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this$1.yieldPos, oldAwaitPos = this$1.awaitPos
+ this$1.yieldPos = 0
+ this$1.awaitPos = 0
+ var exprList = this$1.parseExprList(tt.parenR, this$1.options.ecmaVersion >= 8, false, refDestructuringErrors)
+ if (maybeAsyncArrow && !this$1.canInsertSemicolon() && this$1.eat(tt.arrow)) {
+ this$1.checkPatternErrors(refDestructuringErrors, false)
+ this$1.checkYieldAwaitInDefaultParams()
+ this$1.yieldPos = oldYieldPos
+ this$1.awaitPos = oldAwaitPos
+ return this$1.parseArrowExpression(this$1.startNodeAt(startPos, startLoc), exprList, true)
+ }
+ this$1.checkExpressionErrors(refDestructuringErrors, true)
+ this$1.yieldPos = oldYieldPos || this$1.yieldPos
+ this$1.awaitPos = oldAwaitPos || this$1.awaitPos
+ var node$1 = this$1.startNodeAt(startPos, startLoc)
+ node$1.callee = base
+ node$1.arguments = exprList
+ base = this$1.finishNode(node$1, "CallExpression")
+ } else if (this$1.type === tt.backQuote) {
+ var node$2 = this$1.startNodeAt(startPos, startLoc)
+ node$2.tag = base
+ node$2.quasi = this$1.parseTemplate()
+ base = this$1.finishNode(node$2, "TaggedTemplateExpression")
+ } else {
+ return base
+ }
+ }
+}
+
+// Parse an atomic expression — either a single token that is an
+// expression, an expression started by a keyword like `function` or
+// `new`, or an expression wrapped in punctuation like `()`, `[]`,
+// or `{}`.
+
+pp$3.parseExprAtom = function(refDestructuringErrors) {
+ var node, canBeArrow = this.potentialArrowAt == this.start
+ switch (this.type) {
+ case tt._super:
+ if (!this.inFunction)
+ this.raise(this.start, "'super' outside of function or class")
+
+ case tt._this:
+ var type = this.type === tt._this ? "ThisExpression" : "Super"
+ node = this.startNode()
+ this.next()
+ return this.finishNode(node, type)
+
+ case tt.name:
+ var startPos = this.start, startLoc = this.startLoc
+ var id = this.parseIdent(this.type !== tt.name)
+ if (this.options.ecmaVersion >= 8 && id.name === "async" && !this.canInsertSemicolon() && this.eat(tt._function))
+ return this.parseFunction(this.startNodeAt(startPos, startLoc), false, false, true)
+ if (canBeArrow && !this.canInsertSemicolon()) {
+ if (this.eat(tt.arrow))
+ return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false)
+ if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === tt.name) {
+ id = this.parseIdent()
+ if (this.canInsertSemicolon() || !this.eat(tt.arrow))
+ this.unexpected()
+ return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true)
+ }
+ }
+ return id
+
+ case tt.regexp:
+ var value = this.value
+ node = this.parseLiteral(value.value)
+ node.regex = {pattern: value.pattern, flags: value.flags}
+ return node
+
+ case tt.num: case tt.string:
+ return this.parseLiteral(this.value)
+
+ case tt._null: case tt._true: case tt._false:
+ node = this.startNode()
+ node.value = this.type === tt._null ? null : this.type === tt._true
+ node.raw = this.type.keyword
+ this.next()
+ return this.finishNode(node, "Literal")
+
+ case tt.parenL:
+ var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow)
+ if (refDestructuringErrors) {
+ if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr))
+ refDestructuringErrors.parenthesizedAssign = start
+ if (refDestructuringErrors.parenthesizedBind < 0)
+ refDestructuringErrors.parenthesizedBind = start
+ }
+ return expr
+
+ case tt.bracketL:
+ node = this.startNode()
+ this.next()
+ node.elements = this.parseExprList(tt.bracketR, true, true, refDestructuringErrors)
+ return this.finishNode(node, "ArrayExpression")
+
+ case tt.braceL:
+ return this.parseObj(false, refDestructuringErrors)
+
+ case tt._function:
+ node = this.startNode()
+ this.next()
+ return this.parseFunction(node, false)
+
+ case tt._class:
+ return this.parseClass(this.startNode(), false)
+
+ case tt._new:
+ return this.parseNew()
+
+ case tt.backQuote:
+ return this.parseTemplate()
+
+ default:
+ this.unexpected()
+ }
+}
+
+pp$3.parseLiteral = function(value) {
+ var node = this.startNode()
+ node.value = value
+ node.raw = this.input.slice(this.start, this.end)
+ this.next()
+ return this.finishNode(node, "Literal")
+}
+
+pp$3.parseParenExpression = function() {
+ this.expect(tt.parenL)
+ var val = this.parseExpression()
+ this.expect(tt.parenR)
+ return val
+}
+
+pp$3.parseParenAndDistinguishExpression = function(canBeArrow) {
+ var this$1 = this;
+
+ var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8
+ if (this.options.ecmaVersion >= 6) {
+ this.next()
+
+ var innerStartPos = this.start, innerStartLoc = this.startLoc
+ var exprList = [], first = true, lastIsComma = false
+ var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart, innerParenStart
+ this.yieldPos = 0
+ this.awaitPos = 0
+ while (this.type !== tt.parenR) {
+ first ? first = false : this$1.expect(tt.comma)
+ if (allowTrailingComma && this$1.afterTrailingComma(tt.parenR, true)) {
+ lastIsComma = true
+ break
+ } else if (this$1.type === tt.ellipsis) {
+ spreadStart = this$1.start
+ exprList.push(this$1.parseParenItem(this$1.parseRest()))
+ if (this$1.type === tt.comma) this$1.raise(this$1.start, "Comma is not permitted after the rest element")
+ break
+ } else {
+ if (this$1.type === tt.parenL && !innerParenStart) {
+ innerParenStart = this$1.start
+ }
+ exprList.push(this$1.parseMaybeAssign(false, refDestructuringErrors, this$1.parseParenItem))
+ }
+ }
+ var innerEndPos = this.start, innerEndLoc = this.startLoc
+ this.expect(tt.parenR)
+
+ if (canBeArrow && !this.canInsertSemicolon() && this.eat(tt.arrow)) {
+ this.checkPatternErrors(refDestructuringErrors, false)
+ this.checkYieldAwaitInDefaultParams()
+ if (innerParenStart) this.unexpected(innerParenStart)
+ this.yieldPos = oldYieldPos
+ this.awaitPos = oldAwaitPos
+ return this.parseParenArrowList(startPos, startLoc, exprList)
+ }
+
+ if (!exprList.length || lastIsComma) this.unexpected(this.lastTokStart)
+ if (spreadStart) this.unexpected(spreadStart)
+ this.checkExpressionErrors(refDestructuringErrors, true)
+ this.yieldPos = oldYieldPos || this.yieldPos
+ this.awaitPos = oldAwaitPos || this.awaitPos
+
+ if (exprList.length > 1) {
+ val = this.startNodeAt(innerStartPos, innerStartLoc)
+ val.expressions = exprList
+ this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc)
+ } else {
+ val = exprList[0]
+ }
+ } else {
+ val = this.parseParenExpression()
+ }
+
+ if (this.options.preserveParens) {
+ var par = this.startNodeAt(startPos, startLoc)
+ par.expression = val
+ return this.finishNode(par, "ParenthesizedExpression")
+ } else {
+ return val
+ }
+}
+
+pp$3.parseParenItem = function(item) {
+ return item
+}
+
+pp$3.parseParenArrowList = function(startPos, startLoc, exprList) {
+ return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList)
+}
+
+// New's precedence is slightly tricky. It must allow its argument to
+// be a `[]` or dot subscript expression, but not a call — at least,
+// not without wrapping it in parentheses. Thus, it uses the noCalls
+// argument to parseSubscripts to prevent it from consuming the
+// argument list.
+
+var empty$1 = []
+
+pp$3.parseNew = function() {
+ var node = this.startNode()
+ var meta = this.parseIdent(true)
+ if (this.options.ecmaVersion >= 6 && this.eat(tt.dot)) {
+ node.meta = meta
+ node.property = this.parseIdent(true)
+ if (node.property.name !== "target")
+ this.raiseRecoverable(node.property.start, "The only valid meta property for new is new.target")
+ if (!this.inFunction)
+ this.raiseRecoverable(node.start, "new.target can only be used in functions")
+ return this.finishNode(node, "MetaProperty")
+ }
+ var startPos = this.start, startLoc = this.startLoc
+ node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true)
+ if (this.eat(tt.parenL)) node.arguments = this.parseExprList(tt.parenR, this.options.ecmaVersion >= 8, false)
+ else node.arguments = empty$1
+ return this.finishNode(node, "NewExpression")
+}
+
+// Parse template expression.
+
+pp$3.parseTemplateElement = function() {
+ var elem = this.startNode()
+ elem.value = {
+ raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"),
+ cooked: this.value
+ }
+ this.next()
+ elem.tail = this.type === tt.backQuote
+ return this.finishNode(elem, "TemplateElement")
+}
+
+pp$3.parseTemplate = function() {
+ var this$1 = this;
+
+ var node = this.startNode()
+ this.next()
+ node.expressions = []
+ var curElt = this.parseTemplateElement()
+ node.quasis = [curElt]
+ while (!curElt.tail) {
+ this$1.expect(tt.dollarBraceL)
+ node.expressions.push(this$1.parseExpression())
+ this$1.expect(tt.braceR)
+ node.quasis.push(curElt = this$1.parseTemplateElement())
+ }
+ this.next()
+ return this.finishNode(node, "TemplateLiteral")
+}
+
+// Parse an object literal or binding pattern.
+
+pp$3.parseObj = function(isPattern, refDestructuringErrors) {
+ var this$1 = this;
+
+ var node = this.startNode(), first = true, propHash = {}
+ node.properties = []
+ this.next()
+ while (!this.eat(tt.braceR)) {
+ if (!first) {
+ this$1.expect(tt.comma)
+ if (this$1.afterTrailingComma(tt.braceR)) break
+ } else first = false
+
+ var prop = this$1.startNode(), isGenerator, isAsync, startPos, startLoc
+ if (this$1.options.ecmaVersion >= 6) {
+ prop.method = false
+ prop.shorthand = false
+ if (isPattern || refDestructuringErrors) {
+ startPos = this$1.start
+ startLoc = this$1.startLoc
+ }
+ if (!isPattern)
+ isGenerator = this$1.eat(tt.star)
+ }
+ this$1.parsePropertyName(prop)
+ if (!isPattern && this$1.options.ecmaVersion >= 8 && !isGenerator && !prop.computed &&
+ prop.key.type === "Identifier" && prop.key.name === "async" && this$1.type !== tt.parenL &&
+ this$1.type !== tt.colon && !this$1.canInsertSemicolon()) {
+ isAsync = true
+ this$1.parsePropertyName(prop, refDestructuringErrors)
+ } else {
+ isAsync = false
+ }
+ this$1.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors)
+ this$1.checkPropClash(prop, propHash)
+ node.properties.push(this$1.finishNode(prop, "Property"))
+ }
+ return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression")
+}
+
+pp$3.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors) {
+ if ((isGenerator || isAsync) && this.type === tt.colon)
+ this.unexpected()
+
+ if (this.eat(tt.colon)) {
+ prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors)
+ prop.kind = "init"
+ } else if (this.options.ecmaVersion >= 6 && this.type === tt.parenL) {
+ if (isPattern) this.unexpected()
+ prop.kind = "init"
+ prop.method = true
+ prop.value = this.parseMethod(isGenerator, isAsync)
+ } else if (this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" &&
+ (prop.key.name === "get" || prop.key.name === "set") &&
+ (this.type != tt.comma && this.type != tt.braceR)) {
+ if (isGenerator || isAsync || isPattern) this.unexpected()
+ prop.kind = prop.key.name
+ this.parsePropertyName(prop)
+ prop.value = this.parseMethod(false)
+ var paramCount = prop.kind === "get" ? 0 : 1
+ if (prop.value.params.length !== paramCount) {
+ var start = prop.value.start
+ if (prop.kind === "get")
+ this.raiseRecoverable(start, "getter should have no params")
+ else
+ this.raiseRecoverable(start, "setter should have exactly one param")
+ } else {
+ if (prop.kind === "set" && prop.value.params[0].type === "RestElement")
+ this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params")
+ }
+ } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") {
+ if (this.keywords.test(prop.key.name) ||
+ (this.strict ? this.reservedWordsStrict : this.reservedWords).test(prop.key.name) ||
+ (this.inGenerator && prop.key.name == "yield") ||
+ (this.inAsync && prop.key.name == "await"))
+ this.raiseRecoverable(prop.key.start, "'" + prop.key.name + "' can not be used as shorthand property")
+ prop.kind = "init"
+ if (isPattern) {
+ prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key)
+ } else if (this.type === tt.eq && refDestructuringErrors) {
+ if (refDestructuringErrors.shorthandAssign < 0)
+ refDestructuringErrors.shorthandAssign = this.start
+ prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key)
+ } else {
+ prop.value = prop.key
+ }
+ prop.shorthand = true
+ } else this.unexpected()
+}
+
+pp$3.parsePropertyName = function(prop) {
+ if (this.options.ecmaVersion >= 6) {
+ if (this.eat(tt.bracketL)) {
+ prop.computed = true
+ prop.key = this.parseMaybeAssign()
+ this.expect(tt.bracketR)
+ return prop.key
+ } else {
+ prop.computed = false
+ }
+ }
+ return prop.key = this.type === tt.num || this.type === tt.string ? this.parseExprAtom() : this.parseIdent(true)
+}
+
+// Initialize empty function node.
+
+pp$3.initFunction = function(node) {
+ node.id = null
+ if (this.options.ecmaVersion >= 6) {
+ node.generator = false
+ node.expression = false
+ }
+ if (this.options.ecmaVersion >= 8)
+ node.async = false
+}
+
+// Parse object or class method.
+
+pp$3.parseMethod = function(isGenerator, isAsync) {
+ var node = this.startNode(), oldInGen = this.inGenerator, oldInAsync = this.inAsync,
+ oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldInFunc = this.inFunction
+
+ this.initFunction(node)
+ if (this.options.ecmaVersion >= 6)
+ node.generator = isGenerator
+ if (this.options.ecmaVersion >= 8)
+ node.async = !!isAsync
+
+ this.inGenerator = node.generator
+ this.inAsync = node.async
+ this.yieldPos = 0
+ this.awaitPos = 0
+ this.inFunction = true
+ this.enterFunctionScope()
+
+ this.expect(tt.parenL)
+ node.params = this.parseBindingList(tt.parenR, false, this.options.ecmaVersion >= 8)
+ this.checkYieldAwaitInDefaultParams()
+ this.parseFunctionBody(node, false)
+
+ this.inGenerator = oldInGen
+ this.inAsync = oldInAsync
+ this.yieldPos = oldYieldPos
+ this.awaitPos = oldAwaitPos
+ this.inFunction = oldInFunc
+ return this.finishNode(node, "FunctionExpression")
+}
+
+// Parse arrow function expression with given parameters.
+
+pp$3.parseArrowExpression = function(node, params, isAsync) {
+ var oldInGen = this.inGenerator, oldInAsync = this.inAsync,
+ oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldInFunc = this.inFunction
+
+ this.enterFunctionScope()
+ this.initFunction(node)
+ if (this.options.ecmaVersion >= 8)
+ node.async = !!isAsync
+
+ this.inGenerator = false
+ this.inAsync = node.async
+ this.yieldPos = 0
+ this.awaitPos = 0
+ this.inFunction = true
+
+ node.params = this.toAssignableList(params, true)
+ this.parseFunctionBody(node, true)
+
+ this.inGenerator = oldInGen
+ this.inAsync = oldInAsync
+ this.yieldPos = oldYieldPos
+ this.awaitPos = oldAwaitPos
+ this.inFunction = oldInFunc
+ return this.finishNode(node, "ArrowFunctionExpression")
+}
+
+// Parse function body and check parameters.
+
+pp$3.parseFunctionBody = function(node, isArrowFunction) {
+ var isExpression = isArrowFunction && this.type !== tt.braceL
+ var oldStrict = this.strict, useStrict = false
+
+ if (isExpression) {
+ node.body = this.parseMaybeAssign()
+ node.expression = true
+ this.checkParams(node, false)
+ } else {
+ var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params)
+ if (!oldStrict || nonSimple) {
+ useStrict = this.strictDirective(this.end)
+ // If this is a strict mode function, verify that argument names
+ // are not repeated, and it does not try to bind the words `eval`
+ // or `arguments`.
+ if (useStrict && nonSimple)
+ this.raiseRecoverable(node.start, "Illegal 'use strict' directive in function with non-simple parameter list")
+ }
+ // Start a new scope with regard to labels and the `inFunction`
+ // flag (restore them to their old value afterwards).
+ var oldLabels = this.labels
+ this.labels = []
+ if (useStrict) this.strict = true
+
+ // Add the params to varDeclaredNames to ensure that an error is thrown
+ // if a let/const declaration in the function clashes with one of the params.
+ this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && this.isSimpleParamList(node.params))
+ node.body = this.parseBlock(false)
+ node.expression = false
+ this.labels = oldLabels
+ }
+ this.exitFunctionScope()
+
+ if (this.strict && node.id) {
+ // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval'
+ this.checkLVal(node.id, "none")
+ }
+ this.strict = oldStrict
+}
+
+pp$3.isSimpleParamList = function(params) {
+ for (var i = 0; i < params.length; i++)
+ if (params[i].type !== "Identifier") return false
+ return true
+}
+
+// Checks function params for various disallowed patterns such as using "eval"
+// or "arguments" and duplicate parameters.
+
+pp$3.checkParams = function(node, allowDuplicates) {
+ var this$1 = this;
+
+ var nameHash = {}
+ for (var i = 0; i < node.params.length; i++) this$1.checkLVal(node.params[i], "var", allowDuplicates ? null : nameHash)
+}
+
+// Parses a comma-separated list of expressions, and returns them as
+// an array. `close` is the token type that ends the list, and
+// `allowEmpty` can be turned on to allow subsequent commas with
+// nothing in between them to be parsed as `null` (which is needed
+// for array literals).
+
+pp$3.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) {
+ var this$1 = this;
+
+ var elts = [], first = true
+ while (!this.eat(close)) {
+ if (!first) {
+ this$1.expect(tt.comma)
+ if (allowTrailingComma && this$1.afterTrailingComma(close)) break
+ } else first = false
+
+ var elt
+ if (allowEmpty && this$1.type === tt.comma)
+ elt = null
+ else if (this$1.type === tt.ellipsis) {
+ elt = this$1.parseSpread(refDestructuringErrors)
+ if (refDestructuringErrors && this$1.type === tt.comma && refDestructuringErrors.trailingComma < 0)
+ refDestructuringErrors.trailingComma = this$1.start
+ } else {
+ elt = this$1.parseMaybeAssign(false, refDestructuringErrors)
+ }
+ elts.push(elt)
+ }
+ return elts
+}
+
+// Parse the next token as an identifier. If `liberal` is true (used
+// when parsing properties), it will also convert keywords into
+// identifiers.
+
+pp$3.parseIdent = function(liberal) {
+ var node = this.startNode()
+ if (liberal && this.options.allowReserved == "never") liberal = false
+ if (this.type === tt.name) {
+ if (!liberal && (this.strict ? this.reservedWordsStrict : this.reservedWords).test(this.value) &&
+ (this.options.ecmaVersion >= 6 ||
+ this.input.slice(this.start, this.end).indexOf("\\") == -1))
+ this.raiseRecoverable(this.start, "The keyword '" + this.value + "' is reserved")
+ if (this.inGenerator && this.value === "yield")
+ this.raiseRecoverable(this.start, "Can not use 'yield' as identifier inside a generator")
+ if (this.inAsync && this.value === "await")
+ this.raiseRecoverable(this.start, "Can not use 'await' as identifier inside an async function")
+ node.name = this.value
+ } else if (liberal && this.type.keyword) {
+ node.name = this.type.keyword
+ } else {
+ this.unexpected()
+ }
+ this.next()
+ return this.finishNode(node, "Identifier")
+}
+
+// Parses yield expression inside generator.
+
+pp$3.parseYield = function() {
+ if (!this.yieldPos) this.yieldPos = this.start
+
+ var node = this.startNode()
+ this.next()
+ if (this.type == tt.semi || this.canInsertSemicolon() || (this.type != tt.star && !this.type.startsExpr)) {
+ node.delegate = false
+ node.argument = null
+ } else {
+ node.delegate = this.eat(tt.star)
+ node.argument = this.parseMaybeAssign()
+ }
+ return this.finishNode(node, "YieldExpression")
+}
+
+pp$3.parseAwait = function() {
+ if (!this.awaitPos) this.awaitPos = this.start
+
+ var node = this.startNode()
+ this.next()
+ node.argument = this.parseMaybeUnary(null, true)
+ return this.finishNode(node, "AwaitExpression")
+}
+
+var pp$4 = Parser.prototype
+
+// This function is used to raise exceptions on parse errors. It
+// takes an offset integer (into the current `input`) to indicate
+// the location of the error, attaches the position to the end
+// of the error message, and then raises a `SyntaxError` with that
+// message.
+
+pp$4.raise = function(pos, message) {
+ var loc = getLineInfo(this.input, pos)
+ message += " (" + loc.line + ":" + loc.column + ")"
+ var err = new SyntaxError(message)
+ err.pos = pos; err.loc = loc; err.raisedAt = this.pos
+ throw err
+}
+
+pp$4.raiseRecoverable = pp$4.raise
+
+pp$4.curPosition = function() {
+ if (this.options.locations) {
+ return new Position(this.curLine, this.pos - this.lineStart)
+ }
+}
+
+var pp$5 = Parser.prototype
+
+// Object.assign polyfill
+var assign = Object.assign || function(target) {
+ var sources = [], len = arguments.length - 1;
+ while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ];
+
+ for (var i = 0; i < sources.length; i++) {
+ var source = sources[i]
+ for (var key in source) {
+ if (has(source, key)) {
+ target[key] = source[key]
+ }
+ }
+ }
+ return target
+}
+
+// The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names.
+
+pp$5.enterFunctionScope = function() {
+ // var: a hash of var-declared names in the current lexical scope
+ // lexical: a hash of lexically-declared names in the current lexical scope
+ // childVar: a hash of var-declared names in all child lexical scopes of the current lexical scope (within the current function scope)
+ // parentLexical: a hash of lexically-declared names in all parent lexical scopes of the current lexical scope (within the current function scope)
+ this.scopeStack.push({var: {}, lexical: {}, childVar: {}, parentLexical: {}})
+}
+
+pp$5.exitFunctionScope = function() {
+ this.scopeStack.pop()
+}
+
+pp$5.enterLexicalScope = function() {
+ var parentScope = this.scopeStack[this.scopeStack.length - 1]
+ var childScope = {var: {}, lexical: {}, childVar: {}, parentLexical: {}}
+
+ this.scopeStack.push(childScope)
+ assign(childScope.parentLexical, parentScope.lexical, parentScope.parentLexical)
+}
+
+pp$5.exitLexicalScope = function() {
+ var childScope = this.scopeStack.pop()
+ var parentScope = this.scopeStack[this.scopeStack.length - 1]
+
+ assign(parentScope.childVar, childScope.var, childScope.childVar)
+}
+
+/**
+ * A name can be declared with `var` if there are no variables with the same name declared with `let`/`const`
+ * in the current lexical scope or any of the parent lexical scopes in this function.
+ */
+pp$5.canDeclareVarName = function(name) {
+ var currentScope = this.scopeStack[this.scopeStack.length - 1]
+
+ return !has(currentScope.lexical, name) && !has(currentScope.parentLexical, name)
+}
+
+/**
+ * A name can be declared with `let`/`const` if there are no variables with the same name declared with `let`/`const`
+ * in the current scope, and there are no variables with the same name declared with `var` in the current scope or in
+ * any child lexical scopes in this function.
+ */
+pp$5.canDeclareLexicalName = function(name) {
+ var currentScope = this.scopeStack[this.scopeStack.length - 1]
+
+ return !has(currentScope.lexical, name) && !has(currentScope.var, name) && !has(currentScope.childVar, name)
+}
+
+pp$5.declareVarName = function(name) {
+ this.scopeStack[this.scopeStack.length - 1].var[name] = true
+}
+
+pp$5.declareLexicalName = function(name) {
+ this.scopeStack[this.scopeStack.length - 1].lexical[name] = true
+}
+
+var Node = function Node(parser, pos, loc) {
+ this.type = ""
+ this.start = pos
+ this.end = 0
+ if (parser.options.locations)
+ this.loc = new SourceLocation(parser, loc)
+ if (parser.options.directSourceFile)
+ this.sourceFile = parser.options.directSourceFile
+ if (parser.options.ranges)
+ this.range = [pos, 0]
+};
+
+// Start an AST node, attaching a start offset.
+
+var pp$6 = Parser.prototype
+
+pp$6.startNode = function() {
+ return new Node(this, this.start, this.startLoc)
+}
+
+pp$6.startNodeAt = function(pos, loc) {
+ return new Node(this, pos, loc)
+}
+
+// Finish an AST node, adding `type` and `end` properties.
+
+function finishNodeAt(node, type, pos, loc) {
+ node.type = type
+ node.end = pos
+ if (this.options.locations)
+ node.loc.end = loc
+ if (this.options.ranges)
+ node.range[1] = pos
+ return node
+}
+
+pp$6.finishNode = function(node, type) {
+ return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc)
+}
+
+// Finish node at given position
+
+pp$6.finishNodeAt = function(node, type, pos, loc) {
+ return finishNodeAt.call(this, node, type, pos, loc)
+}
+
+// The algorithm used to determine whether a regexp can appear at a
+// given point in the program is loosely based on sweet.js' approach.
+// See https://github.com/mozilla/sweet.js/wiki/design
+
+var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) {
+ this.token = token
+ this.isExpr = !!isExpr
+ this.preserveSpace = !!preserveSpace
+ this.override = override
+ this.generator = !!generator
+};
+
+var types = {
+ b_stat: new TokContext("{", false),
+ b_expr: new TokContext("{", true),
+ b_tmpl: new TokContext("${", true),
+ p_stat: new TokContext("(", false),
+ p_expr: new TokContext("(", true),
+ q_tmpl: new TokContext("`", true, true, function (p) { return p.readTmplToken(); }),
+ f_expr: new TokContext("function", true),
+ f_expr_gen: new TokContext("function", true, false, null, true),
+ f_gen: new TokContext("function", false, false, null, true)
+}
+
+var pp$7 = Parser.prototype
+
+pp$7.initialContext = function() {
+ return [types.b_stat]
+}
+
+pp$7.braceIsBlock = function(prevType) {
+ if (prevType === tt.colon) {
+ var parent = this.curContext()
+ if (parent === types.b_stat || parent === types.b_expr)
+ return !parent.isExpr
+ }
+ if (prevType === tt._return)
+ return lineBreak.test(this.input.slice(this.lastTokEnd, this.start))
+ if (prevType === tt._else || prevType === tt.semi || prevType === tt.eof || prevType === tt.parenR || prevType == tt.arrow)
+ return true
+ if (prevType == tt.braceL)
+ return this.curContext() === types.b_stat
+ return !this.exprAllowed
+}
+
+pp$7.inGeneratorContext = function() {
+ var this$1 = this;
+
+ for (var i = this.context.length - 1; i >= 0; i--)
+ if (this$1.context[i].generator) return true
+ return false
+}
+
+pp$7.updateContext = function(prevType) {
+ var update, type = this.type
+ if (type.keyword && prevType == tt.dot)
+ this.exprAllowed = false
+ else if (update = type.updateContext)
+ update.call(this, prevType)
+ else
+ this.exprAllowed = type.beforeExpr
+}
+
+// Token-specific context update code
+
+tt.parenR.updateContext = tt.braceR.updateContext = function() {
+ if (this.context.length == 1) {
+ this.exprAllowed = true
+ return
+ }
+ var out = this.context.pop(), cur
+ if (out === types.b_stat && (cur = this.curContext()) && cur.token === "function") {
+ this.context.pop()
+ this.exprAllowed = false
+ } else if (out === types.b_tmpl) {
+ this.exprAllowed = true
+ } else {
+ this.exprAllowed = !out.isExpr
+ }
+}
+
+tt.braceL.updateContext = function(prevType) {
+ this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr)
+ this.exprAllowed = true
+}
+
+tt.dollarBraceL.updateContext = function() {
+ this.context.push(types.b_tmpl)
+ this.exprAllowed = true
+}
+
+tt.parenL.updateContext = function(prevType) {
+ var statementParens = prevType === tt._if || prevType === tt._for || prevType === tt._with || prevType === tt._while
+ this.context.push(statementParens ? types.p_stat : types.p_expr)
+ this.exprAllowed = true
+}
+
+tt.incDec.updateContext = function() {
+ // tokExprAllowed stays unchanged
+}
+
+tt._function.updateContext = function(prevType) {
+ if (prevType.beforeExpr && prevType !== tt.semi && prevType !== tt._else &&
+ !((prevType === tt.colon || prevType === tt.braceL) && this.curContext() === types.b_stat))
+ this.context.push(types.f_expr)
+ this.exprAllowed = false
+}
+
+tt.backQuote.updateContext = function() {
+ if (this.curContext() === types.q_tmpl)
+ this.context.pop()
+ else
+ this.context.push(types.q_tmpl)
+ this.exprAllowed = false
+}
+
+tt.star.updateContext = function(prevType) {
+ if (prevType == tt._function) {
+ if (this.curContext() === types.f_expr)
+ this.context[this.context.length - 1] = types.f_expr_gen
+ else
+ this.context.push(types.f_gen)
+ }
+ this.exprAllowed = true
+}
+
+tt.name.updateContext = function(prevType) {
+ var allowed = false
+ if (this.options.ecmaVersion >= 6) {
+ if (this.value == "of" && !this.exprAllowed ||
+ this.value == "yield" && this.inGeneratorContext())
+ allowed = true
+ }
+ this.exprAllowed = allowed
+}
+
+// Object type used to represent tokens. Note that normally, tokens
+// simply exist as properties on the parser object. This is only
+// used for the onToken callback and the external tokenizer.
+
+var Token = function Token(p) {
+ this.type = p.type
+ this.value = p.value
+ this.start = p.start
+ this.end = p.end
+ if (p.options.locations)
+ this.loc = new SourceLocation(p, p.startLoc, p.endLoc)
+ if (p.options.ranges)
+ this.range = [p.start, p.end]
+};
+
+// ## Tokenizer
+
+var pp$8 = Parser.prototype
+
+// Are we running under Rhino?
+var isRhino = typeof Packages == "object" && Object.prototype.toString.call(Packages) == "[object JavaPackage]"
+
+// Move to the next token
+
+pp$8.next = function() {
+ if (this.options.onToken)
+ this.options.onToken(new Token(this))
+
+ this.lastTokEnd = this.end
+ this.lastTokStart = this.start
+ this.lastTokEndLoc = this.endLoc
+ this.lastTokStartLoc = this.startLoc
+ this.nextToken()
+}
+
+pp$8.getToken = function() {
+ this.next()
+ return new Token(this)
+}
+
+// If we're in an ES6 environment, make parsers iterable
+if (typeof Symbol !== "undefined")
+ pp$8[Symbol.iterator] = function() {
+ var this$1 = this;
+
+ return {
+ next: function () {
+ var token = this$1.getToken()
+ return {
+ done: token.type === tt.eof,
+ value: token
+ }
+ }
+ }
+ }
+
+// Toggle strict mode. Re-reads the next number or string to please
+// pedantic tests (`"use strict"; 010;` should fail).
+
+pp$8.curContext = function() {
+ return this.context[this.context.length - 1]
+}
+
+// Read a single token, updating the parser object's token-related
+// properties.
+
+pp$8.nextToken = function() {
+ var curContext = this.curContext()
+ if (!curContext || !curContext.preserveSpace) this.skipSpace()
+
+ this.start = this.pos
+ if (this.options.locations) this.startLoc = this.curPosition()
+ if (this.pos >= this.input.length) return this.finishToken(tt.eof)
+
+ if (curContext.override) return curContext.override(this)
+ else this.readToken(this.fullCharCodeAtPos())
+}
+
+pp$8.readToken = function(code) {
+ // Identifier or keyword. '\uXXXX' sequences are allowed in
+ // identifiers, so '\' also dispatches to that.
+ if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\' */)
+ return this.readWord()
+
+ return this.getTokenFromCode(code)
+}
+
+pp$8.fullCharCodeAtPos = function() {
+ var code = this.input.charCodeAt(this.pos)
+ if (code <= 0xd7ff || code >= 0xe000) return code
+ var next = this.input.charCodeAt(this.pos + 1)
+ return (code << 10) + next - 0x35fdc00
+}
+
+pp$8.skipBlockComment = function() {
+ var this$1 = this;
+
+ var startLoc = this.options.onComment && this.curPosition()
+ var start = this.pos, end = this.input.indexOf("*/", this.pos += 2)
+ if (end === -1) this.raise(this.pos - 2, "Unterminated comment")
+ this.pos = end + 2
+ if (this.options.locations) {
+ lineBreakG.lastIndex = start
+ var match
+ while ((match = lineBreakG.exec(this.input)) && match.index < this.pos) {
+ ++this$1.curLine
+ this$1.lineStart = match.index + match[0].length
+ }
+ }
+ if (this.options.onComment)
+ this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos,
+ startLoc, this.curPosition())
+}
+
+pp$8.skipLineComment = function(startSkip) {
+ var this$1 = this;
+
+ var start = this.pos
+ var startLoc = this.options.onComment && this.curPosition()
+ var ch = this.input.charCodeAt(this.pos += startSkip)
+ while (this.pos < this.input.length && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) {
+ ++this$1.pos
+ ch = this$1.input.charCodeAt(this$1.pos)
+ }
+ if (this.options.onComment)
+ this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos,
+ startLoc, this.curPosition())
+}
+
+// Called at the start of the parse and after every token. Skips
+// whitespace and comments, and.
+
+pp$8.skipSpace = function() {
+ var this$1 = this;
+
+ loop: while (this.pos < this.input.length) {
+ var ch = this$1.input.charCodeAt(this$1.pos)
+ switch (ch) {
+ case 32: case 160: // ' '
+ ++this$1.pos
+ break
+ case 13:
+ if (this$1.input.charCodeAt(this$1.pos + 1) === 10) {
+ ++this$1.pos
+ }
+ case 10: case 8232: case 8233:
+ ++this$1.pos
+ if (this$1.options.locations) {
+ ++this$1.curLine
+ this$1.lineStart = this$1.pos
+ }
+ break
+ case 47: // '/'
+ switch (this$1.input.charCodeAt(this$1.pos + 1)) {
+ case 42: // '*'
+ this$1.skipBlockComment()
+ break
+ case 47:
+ this$1.skipLineComment(2)
+ break
+ default:
+ break loop
+ }
+ break
+ default:
+ if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {
+ ++this$1.pos
+ } else {
+ break loop
+ }
+ }
+ }
+}
+
+// Called at the end of every token. Sets `end`, `val`, and
+// maintains `context` and `exprAllowed`, and skips the space after
+// the token, so that the next one's `start` will point at the
+// right position.
+
+pp$8.finishToken = function(type, val) {
+ this.end = this.pos
+ if (this.options.locations) this.endLoc = this.curPosition()
+ var prevType = this.type
+ this.type = type
+ this.value = val
+
+ this.updateContext(prevType)
+}
+
+// ### Token reading
+
+// This is the function that is called to fetch the next token. It
+// is somewhat obscure, because it works in character codes rather
+// than characters, and because operator parsing has been inlined
+// into it.
+//
+// All in the name of speed.
+//
+pp$8.readToken_dot = function() {
+ var next = this.input.charCodeAt(this.pos + 1)
+ if (next >= 48 && next <= 57) return this.readNumber(true)
+ var next2 = this.input.charCodeAt(this.pos + 2)
+ if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.'
+ this.pos += 3
+ return this.finishToken(tt.ellipsis)
+ } else {
+ ++this.pos
+ return this.finishToken(tt.dot)
+ }
+}
+
+pp$8.readToken_slash = function() { // '/'
+ var next = this.input.charCodeAt(this.pos + 1)
+ if (this.exprAllowed) { ++this.pos; return this.readRegexp() }
+ if (next === 61) return this.finishOp(tt.assign, 2)
+ return this.finishOp(tt.slash, 1)
+}
+
+pp$8.readToken_mult_modulo_exp = function(code) { // '%*'
+ var next = this.input.charCodeAt(this.pos + 1)
+ var size = 1
+ var tokentype = code === 42 ? tt.star : tt.modulo
+
+ // exponentiation operator ** and **=
+ if (this.options.ecmaVersion >= 7 && next === 42) {
+ ++size
+ tokentype = tt.starstar
+ next = this.input.charCodeAt(this.pos + 2)
+ }
+
+ if (next === 61) return this.finishOp(tt.assign, size + 1)
+ return this.finishOp(tokentype, size)
+}
+
+pp$8.readToken_pipe_amp = function(code) { // '|&'
+ var next = this.input.charCodeAt(this.pos + 1)
+ if (next === code) return this.finishOp(code === 124 ? tt.logicalOR : tt.logicalAND, 2)
+ if (next === 61) return this.finishOp(tt.assign, 2)
+ return this.finishOp(code === 124 ? tt.bitwiseOR : tt.bitwiseAND, 1)
+}
+
+pp$8.readToken_caret = function() { // '^'
+ var next = this.input.charCodeAt(this.pos + 1)
+ if (next === 61) return this.finishOp(tt.assign, 2)
+ return this.finishOp(tt.bitwiseXOR, 1)
+}
+
+pp$8.readToken_plus_min = function(code) { // '+-'
+ var next = this.input.charCodeAt(this.pos + 1)
+ if (next === code) {
+ if (next == 45 && this.input.charCodeAt(this.pos + 2) == 62 &&
+ lineBreak.test(this.input.slice(this.lastTokEnd, this.pos))) {
+ // A `-->` line comment
+ this.skipLineComment(3)
+ this.skipSpace()
+ return this.nextToken()
+ }
+ return this.finishOp(tt.incDec, 2)
+ }
+ if (next === 61) return this.finishOp(tt.assign, 2)
+ return this.finishOp(tt.plusMin, 1)
+}
+
+pp$8.readToken_lt_gt = function(code) { // '<>'
+ var next = this.input.charCodeAt(this.pos + 1)
+ var size = 1
+ if (next === code) {
+ size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2
+ if (this.input.charCodeAt(this.pos + size) === 61) return this.finishOp(tt.assign, size + 1)
+ return this.finishOp(tt.bitShift, size)
+ }
+ if (next == 33 && code == 60 && this.input.charCodeAt(this.pos + 2) == 45 &&
+ this.input.charCodeAt(this.pos + 3) == 45) {
+ if (this.inModule) this.unexpected()
+ // `0;)if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}if(0>position)return this;1===list.length?(list.length=0,delete this._events[type]):list.splice(position,1),this._events.removeListener&&this.emit(\"removeListener\",type,listener)}return this},EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[type]&&delete this._events[type],this;if(0===arguments.length){for(key in this._events)\"removeListener\"!==key&&this.removeAllListeners(key);return this.removeAllListeners(\"removeListener\"),this._events={},this\n}if(listeners=this._events[type],isFunction(listeners))this.removeListener(type,listeners);else for(;listeners.length;)this.removeListener(type,listeners[listeners.length-1]);return delete this._events[type],this},EventEmitter.prototype.listeners=function(type){var ret;return ret=this._events&&this._events[type]?isFunction(this._events[type])?[this._events[type]]:this._events[type].slice():[]},EventEmitter.listenerCount=function(emitter,type){var ret;return ret=emitter._events&&emitter._events[type]?isFunction(emitter._events[type])?1:emitter._events[type].length:0}},{}],\"/node_modules/jshint/data/ascii-identifier-data.js\":[function(_dereq_,module){for(var identifierStartTable=[],i=0;128>i;i++)identifierStartTable[i]=36===i||i>=65&&90>=i||95===i||i>=97&&122>=i;for(var identifierPartTable=[],i=0;128>i;i++)identifierPartTable[i]=identifierStartTable[i]||i>=48&&57>=i;module.exports={asciiIdentifierStartTable:identifierStartTable,asciiIdentifierPartTable:identifierPartTable}},{}],\"/node_modules/jshint/lodash.js\":[function(_dereq_,module,exports){(function(global){(function(){function baseFindIndex(array,predicate,fromRight){for(var length=array.length,index=fromRight?length:-1;fromRight?index--:length>++index;)if(predicate(array[index],index,array))return index;return-1}function baseIndexOf(array,value,fromIndex){if(value!==value)return indexOfNaN(array,fromIndex);for(var index=fromIndex-1,length=array.length;length>++index;)if(array[index]===value)return index;return-1}function baseIsFunction(value){return\"function\"==typeof value||!1}function baseToString(value){return\"string\"==typeof value?value:null==value?\"\":value+\"\"}function indexOfNaN(array,fromIndex,fromRight){for(var length=array.length,index=fromIndex+(fromRight?0:-1);fromRight?index--:length>++index;){var other=array[index];if(other!==other)return index}return-1}function isObjectLike(value){return!!value&&\"object\"==typeof value}function lodash(){}function arrayCopy(source,array){var index=-1,length=source.length;for(array||(array=Array(length));length>++index;)array[index]=source[index];return array}function arrayEach(array,iteratee){for(var index=-1,length=array.length;length>++index&&iteratee(array[index],index,array)!==!1;);return array}function arrayFilter(array,predicate){for(var index=-1,length=array.length,resIndex=-1,result=[];length>++index;){var value=array[index];predicate(value,index,array)&&(result[++resIndex]=value)}return result}function arrayMap(array,iteratee){for(var index=-1,length=array.length,result=Array(length);length>++index;)result[index]=iteratee(array[index],index,array);return result}function arrayMax(array){for(var index=-1,length=array.length,result=NEGATIVE_INFINITY;length>++index;){var value=array[index];value>result&&(result=value)}return result}function arraySome(array,predicate){for(var index=-1,length=array.length;length>++index;)if(predicate(array[index],index,array))return!0;return!1}function assignWith(object,source,customizer){var props=keys(source);push.apply(props,getSymbols(source));for(var index=-1,length=props.length;length>++index;){var key=props[index],value=object[key],result=customizer(value,source[key],key,object,source);(result===result?result===value:value!==value)&&(value!==undefined||key in object)||(object[key]=result)}return object}function baseCopy(source,props,object){object||(object={});for(var index=-1,length=props.length;length>++index;){var key=props[index];object[key]=source[key]}return object}function baseCallback(func,thisArg,argCount){var type=typeof func;return\"function\"==type?thisArg===undefined?func:bindCallback(func,thisArg,argCount):null==func?identity:\"object\"==type?baseMatches(func):thisArg===undefined?property(func):baseMatchesProperty(func,thisArg)}function baseClone(value,isDeep,customizer,key,object,stackA,stackB){var result;if(customizer&&(result=object?customizer(value,key,object):customizer(value)),result!==undefined)return result;if(!isObject(value))return value;var isArr=isArray(value);if(isArr){if(result=initCloneArray(value),!isDeep)return arrayCopy(value,result)}else{var tag=objToString.call(value),isFunc=tag==funcTag;if(tag!=objectTag&&tag!=argsTag&&(!isFunc||object))return cloneableTags[tag]?initCloneByTag(value,tag,isDeep):object?value:{};if(result=initCloneObject(isFunc?{}:value),!isDeep)return baseAssign(result,value)}stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==value)return stackB[length];return stackA.push(value),stackB.push(result),(isArr?arrayEach:baseForOwn)(value,function(subValue,key){result[key]=baseClone(subValue,isDeep,customizer,key,value,stackA,stackB)}),result}function baseFilter(collection,predicate){var result=[];return baseEach(collection,function(value,index,collection){predicate(value,index,collection)&&result.push(value)}),result}function baseForIn(object,iteratee){return baseFor(object,iteratee,keysIn)}function baseForOwn(object,iteratee){return baseFor(object,iteratee,keys)}function baseGet(object,path,pathKey){if(null!=object){pathKey!==undefined&&pathKey in toObject(object)&&(path=[pathKey]);for(var index=-1,length=path.length;null!=object&&length>++index;)var result=object=object[path[index]];return result}}function baseIsEqual(value,other,customizer,isLoose,stackA,stackB){if(value===other)return 0!==value||1/value==1/other;var valType=typeof value,othType=typeof other;return\"function\"!=valType&&\"object\"!=valType&&\"function\"!=othType&&\"object\"!=othType||null==value||null==other?value!==value&&other!==other:baseIsEqualDeep(value,other,baseIsEqual,customizer,isLoose,stackA,stackB)}function baseIsEqualDeep(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=arrayTag,othTag=arrayTag;objIsArr||(objTag=objToString.call(object),objTag==argsTag?objTag=objectTag:objTag!=objectTag&&(objIsArr=isTypedArray(object))),othIsArr||(othTag=objToString.call(other),othTag==argsTag?othTag=objectTag:othTag!=objectTag&&(othIsArr=isTypedArray(other)));var objIsObj=objTag==objectTag,othIsObj=othTag==objectTag,isSameTag=objTag==othTag;if(isSameTag&&!objIsArr&&!objIsObj)return equalByTag(object,other,objTag);if(!isLoose){var valWrapped=objIsObj&&hasOwnProperty.call(object,\"__wrapped__\"),othWrapped=othIsObj&&hasOwnProperty.call(other,\"__wrapped__\");if(valWrapped||othWrapped)return equalFunc(valWrapped?object.value():object,othWrapped?other.value():other,customizer,isLoose,stackA,stackB)}if(!isSameTag)return!1;stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==object)return stackB[length]==other;stackA.push(object),stackB.push(other);var result=(objIsArr?equalArrays:equalObjects)(object,other,equalFunc,customizer,isLoose,stackA,stackB);return stackA.pop(),stackB.pop(),result}function baseIsMatch(object,props,values,strictCompareFlags,customizer){for(var index=-1,length=props.length,noCustomizer=!customizer;length>++index;)if(noCustomizer&&strictCompareFlags[index]?values[index]!==object[props[index]]:!(props[index]in object))return!1;for(index=-1;length>++index;){var key=props[index],objValue=object[key],srcValue=values[index];if(noCustomizer&&strictCompareFlags[index])var result=objValue!==undefined||key in object;else result=customizer?customizer(objValue,srcValue,key):undefined,result===undefined&&(result=baseIsEqual(srcValue,objValue,customizer,!0));if(!result)return!1}return!0}function baseMatches(source){var props=keys(source),length=props.length;if(!length)return constant(!0);if(1==length){var key=props[0],value=source[key];if(isStrictComparable(value))return function(object){return null==object?!1:object[key]===value&&(value!==undefined||key in toObject(object))}}for(var values=Array(length),strictCompareFlags=Array(length);length--;)value=source[props[length]],values[length]=value,strictCompareFlags[length]=isStrictComparable(value);return function(object){return null!=object&&baseIsMatch(toObject(object),props,values,strictCompareFlags)}}function baseMatchesProperty(path,value){var isArr=isArray(path),isCommon=isKey(path)&&isStrictComparable(value),pathKey=path+\"\";return path=toPath(path),function(object){if(null==object)return!1;var key=pathKey;if(object=toObject(object),!(!isArr&&isCommon||key in object)){if(object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),null==object)return!1;key=last(path),object=toObject(object)}return object[key]===value?value!==undefined||key in object:baseIsEqual(value,object[key],null,!0)}}function baseMerge(object,source,customizer,stackA,stackB){if(!isObject(object))return object;var isSrcArr=isLength(source.length)&&(isArray(source)||isTypedArray(source));if(!isSrcArr){var props=keys(source);push.apply(props,getSymbols(source))}return arrayEach(props||source,function(srcValue,key){if(props&&(key=srcValue,srcValue=source[key]),isObjectLike(srcValue))stackA||(stackA=[]),stackB||(stackB=[]),baseMergeDeep(object,source,key,baseMerge,customizer,stackA,stackB);else{var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue),!isSrcArr&&result===undefined||!isCommon&&(result===result?result===value:value!==value)||(object[key]=result)}}),object}function baseMergeDeep(object,source,key,mergeFunc,customizer,stackA,stackB){for(var length=stackA.length,srcValue=source[key];length--;)if(stackA[length]==srcValue)return object[key]=stackB[length],undefined;var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue,isLength(srcValue.length)&&(isArray(srcValue)||isTypedArray(srcValue))?result=isArray(value)?value:getLength(value)?arrayCopy(value):[]:isPlainObject(srcValue)||isArguments(srcValue)?result=isArguments(value)?toPlainObject(value):isPlainObject(value)?value:{}:isCommon=!1),stackA.push(srcValue),stackB.push(result),isCommon?object[key]=mergeFunc(result,srcValue,customizer,stackA,stackB):(result===result?result!==value:value===value)&&(object[key]=result)}function baseProperty(key){return function(object){return null==object?undefined:object[key]}}function basePropertyDeep(path){var pathKey=path+\"\";return path=toPath(path),function(object){return baseGet(object,path,pathKey)}}function baseSlice(array,start,end){var index=-1,length=array.length;start=null==start?0:+start||0,0>start&&(start=-start>length?0:length+start),end=end===undefined||end>length?length:+end||0,0>end&&(end+=length),length=start>end?0:end-start>>>0,start>>>=0;for(var result=Array(length);length>++index;)result[index]=array[index+start];return result}function baseSome(collection,predicate){var result;return baseEach(collection,function(value,index,collection){return result=predicate(value,index,collection),!result}),!!result}function baseValues(object,props){for(var index=-1,length=props.length,result=Array(length);length>++index;)result[index]=object[props[index]];return result}function binaryIndex(array,value,retHighest){var low=0,high=array?array.length:low;if(\"number\"==typeof value&&value===value&&HALF_MAX_ARRAY_LENGTH>=high){for(;high>low;){var mid=low+high>>>1,computed=array[mid];(retHighest?value>=computed:value>computed)?low=mid+1:high=mid}return high}return binaryIndexBy(array,value,identity,retHighest)}function binaryIndexBy(array,value,iteratee,retHighest){value=iteratee(value);for(var low=0,high=array?array.length:0,valIsNaN=value!==value,valIsUndef=value===undefined;high>low;){var mid=floor((low+high)/2),computed=iteratee(array[mid]),isReflexive=computed===computed;if(valIsNaN)var setLow=isReflexive||retHighest;else setLow=valIsUndef?isReflexive&&(retHighest||computed!==undefined):retHighest?value>=computed:value>computed;setLow?low=mid+1:high=mid}return nativeMin(high,MAX_ARRAY_INDEX)}function bindCallback(func,thisArg,argCount){if(\"function\"!=typeof func)return identity;if(thisArg===undefined)return func;switch(argCount){case 1:return function(value){return func.call(thisArg,value)};case 3:return function(value,index,collection){return func.call(thisArg,value,index,collection)};case 4:return function(accumulator,value,index,collection){return func.call(thisArg,accumulator,value,index,collection)};case 5:return function(value,other,key,object,source){return func.call(thisArg,value,other,key,object,source)}}return function(){return func.apply(thisArg,arguments)}}function bufferClone(buffer){return bufferSlice.call(buffer,0)}function createAssigner(assigner){return restParam(function(object,sources){var index=-1,length=null==object?0:sources.length,customizer=length>2&&sources[length-2],guard=length>2&&sources[2],thisArg=length>1&&sources[length-1];for(\"function\"==typeof customizer?(customizer=bindCallback(customizer,thisArg,5),length-=2):(customizer=\"function\"==typeof thisArg?thisArg:null,length-=customizer?1:0),guard&&isIterateeCall(sources[0],sources[1],guard)&&(customizer=3>length?null:customizer,length=1);length>++index;){var source=sources[index];source&&assigner(object,source,customizer)}return object})}function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){var length=collection?getLength(collection):0;if(!isLength(length))return eachFunc(collection,iteratee);for(var index=fromRight?length:-1,iterable=toObject(collection);(fromRight?index--:length>++index)&&iteratee(iterable[index],index,iterable)!==!1;);return collection}}function createBaseFor(fromRight){return function(object,iteratee,keysFunc){for(var iterable=toObject(object),props=keysFunc(object),length=props.length,index=fromRight?length:-1;fromRight?index--:length>++index;){var key=props[index];if(iteratee(iterable[key],key,iterable)===!1)break}return object}}function createFindIndex(fromRight){return function(array,predicate,thisArg){return array&&array.length?(predicate=getCallback(predicate,thisArg,3),baseFindIndex(array,predicate,fromRight)):-1}}function createForEach(arrayFunc,eachFunc){return function(collection,iteratee,thisArg){return\"function\"==typeof iteratee&&thisArg===undefined&&isArray(collection)?arrayFunc(collection,iteratee):eachFunc(collection,bindCallback(iteratee,thisArg,3))}}function equalArrays(array,other,equalFunc,customizer,isLoose,stackA,stackB){var index=-1,arrLength=array.length,othLength=other.length,result=!0;if(arrLength!=othLength&&!(isLoose&&othLength>arrLength))return!1;for(;result&&arrLength>++index;){var arrValue=array[index],othValue=other[index];if(result=undefined,customizer&&(result=isLoose?customizer(othValue,arrValue,index):customizer(arrValue,othValue,index)),result===undefined)if(isLoose)for(var othIndex=othLength;othIndex--&&(othValue=other[othIndex],!(result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB))););else result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB)}return!!result}function equalByTag(object,other,tag){switch(tag){case boolTag:case dateTag:return+object==+other;case errorTag:return object.name==other.name&&object.message==other.message;case numberTag:return object!=+object?other!=+other:0==object?1/object==1/other:object==+other;case regexpTag:case stringTag:return object==other+\"\"}return!1}function equalObjects(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objProps=keys(object),objLength=objProps.length,othProps=keys(other),othLength=othProps.length;if(objLength!=othLength&&!isLoose)return!1;for(var skipCtor=isLoose,index=-1;objLength>++index;){var key=objProps[index],result=isLoose?key in other:hasOwnProperty.call(other,key);if(result){var objValue=object[key],othValue=other[key];result=undefined,customizer&&(result=isLoose?customizer(othValue,objValue,key):customizer(objValue,othValue,key)),result===undefined&&(result=objValue&&objValue===othValue||equalFunc(objValue,othValue,customizer,isLoose,stackA,stackB))}if(!result)return!1;skipCtor||(skipCtor=\"constructor\"==key)}if(!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;if(objCtor!=othCtor&&\"constructor\"in object&&\"constructor\"in other&&!(\"function\"==typeof objCtor&&objCtor instanceof objCtor&&\"function\"==typeof othCtor&&othCtor instanceof othCtor))return!1}return!0}function getCallback(func,thisArg,argCount){var result=lodash.callback||callback;return result=result===callback?baseCallback:result,argCount?result(func,thisArg,argCount):result}function getIndexOf(collection,target,fromIndex){var result=lodash.indexOf||indexOf;return result=result===indexOf?baseIndexOf:result,collection?result(collection,target,fromIndex):result}function initCloneArray(array){var length=array.length,result=new array.constructor(length);return length&&\"string\"==typeof array[0]&&hasOwnProperty.call(array,\"index\")&&(result.index=array.index,result.input=array.input),result}function initCloneObject(object){var Ctor=object.constructor;return\"function\"==typeof Ctor&&Ctor instanceof Ctor||(Ctor=Object),new Ctor}function initCloneByTag(object,tag,isDeep){var Ctor=object.constructor;switch(tag){case arrayBufferTag:return bufferClone(object);case boolTag:case dateTag:return new Ctor(+object);case float32Tag:case float64Tag:case int8Tag:case int16Tag:case int32Tag:case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:var buffer=object.buffer;return new Ctor(isDeep?bufferClone(buffer):buffer,object.byteOffset,object.length);case numberTag:case stringTag:return new Ctor(object);case regexpTag:var result=new Ctor(object.source,reFlags.exec(object));result.lastIndex=object.lastIndex}return result}function isIndex(value,length){return value=+value,length=null==length?MAX_SAFE_INTEGER:length,value>-1&&0==value%1&&length>value}function isIterateeCall(value,index,object){if(!isObject(object))return!1;var type=typeof index;if(\"number\"==type)var length=getLength(object),prereq=isLength(length)&&isIndex(index,length);else prereq=\"string\"==type&&index in object;if(prereq){var other=object[index];return value===value?value===other:other!==other}return!1}function isKey(value,object){var type=typeof value;if(\"string\"==type&&reIsPlainProp.test(value)||\"number\"==type)return!0;if(isArray(value))return!1;var result=!reIsDeepProp.test(value);return result||null!=object&&value in toObject(object)}function isLength(value){return\"number\"==typeof value&&value>-1&&0==value%1&&MAX_SAFE_INTEGER>=value}function isStrictComparable(value){return value===value&&(0===value?1/value>0:!isObject(value))}function shimIsPlainObject(value){var Ctor;if(lodash.support,!isObjectLike(value)||objToString.call(value)!=objectTag||!hasOwnProperty.call(value,\"constructor\")&&(Ctor=value.constructor,\"function\"==typeof Ctor&&!(Ctor instanceof Ctor)))return!1;var result;return baseForIn(value,function(subValue,key){result=key}),result===undefined||hasOwnProperty.call(value,result)}function shimKeys(object){for(var props=keysIn(object),propsLength=props.length,length=propsLength&&object.length,support=lodash.support,allowIndexes=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object)),index=-1,result=[];propsLength>++index;){var key=props[index];(allowIndexes&&isIndex(key,length)||hasOwnProperty.call(object,key))&&result.push(key)}return result}function toObject(value){return isObject(value)?value:Object(value)}function toPath(value){if(isArray(value))return value;var result=[];return baseToString(value).replace(rePropName,function(match,number,quote,string){result.push(quote?string.replace(reEscapeChar,\"$1\"):number||match)}),result}function indexOf(array,value,fromIndex){var length=array?array.length:0;if(!length)return-1;if(\"number\"==typeof fromIndex)fromIndex=0>fromIndex?nativeMax(length+fromIndex,0):fromIndex;else if(fromIndex){var index=binaryIndex(array,value),other=array[index];return(value===value?value===other:other!==other)?index:-1}return baseIndexOf(array,value,fromIndex||0)}function last(array){var length=array?array.length:0;return length?array[length-1]:undefined}function slice(array,start,end){var length=array?array.length:0;return length?(end&&\"number\"!=typeof end&&isIterateeCall(array,start,end)&&(start=0,end=length),baseSlice(array,start,end)):[]}function unzip(array){for(var index=-1,length=(array&&array.length&&arrayMax(arrayMap(array,getLength)))>>>0,result=Array(length);length>++index;)result[index]=arrayMap(array,baseProperty(index));return result}function includes(collection,target,fromIndex,guard){var length=collection?getLength(collection):0;return isLength(length)||(collection=values(collection),length=collection.length),length?(fromIndex=\"number\"!=typeof fromIndex||guard&&isIterateeCall(target,fromIndex,guard)?0:0>fromIndex?nativeMax(length+fromIndex,0):fromIndex||0,\"string\"==typeof collection||!isArray(collection)&&isString(collection)?length>fromIndex&&collection.indexOf(target,fromIndex)>-1:getIndexOf(collection,target,fromIndex)>-1):!1}function reject(collection,predicate,thisArg){var func=isArray(collection)?arrayFilter:baseFilter;return predicate=getCallback(predicate,thisArg,3),func(collection,function(value,index,collection){return!predicate(value,index,collection)})}function some(collection,predicate,thisArg){var func=isArray(collection)?arraySome:baseSome;return thisArg&&isIterateeCall(collection,predicate,thisArg)&&(predicate=null),(\"function\"!=typeof predicate||thisArg!==undefined)&&(predicate=getCallback(predicate,thisArg,3)),func(collection,predicate)}function restParam(func,start){if(\"function\"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return start=nativeMax(start===undefined?func.length-1:+start||0,0),function(){for(var args=arguments,index=-1,length=nativeMax(args.length-start,0),rest=Array(length);length>++index;)rest[index]=args[start+index];switch(start){case 0:return func.call(this,rest);case 1:return func.call(this,args[0],rest);case 2:return func.call(this,args[0],args[1],rest)}var otherArgs=Array(start+1);for(index=-1;start>++index;)otherArgs[index]=args[index];return otherArgs[start]=rest,func.apply(this,otherArgs)}}function clone(value,isDeep,customizer,thisArg){return isDeep&&\"boolean\"!=typeof isDeep&&isIterateeCall(value,isDeep,customizer)?isDeep=!1:\"function\"==typeof isDeep&&(thisArg=customizer,customizer=isDeep,isDeep=!1),customizer=\"function\"==typeof customizer&&bindCallback(customizer,thisArg,1),baseClone(value,isDeep,customizer)}function isArguments(value){var length=isObjectLike(value)?value.length:undefined;return isLength(length)&&objToString.call(value)==argsTag}function isEmpty(value){if(null==value)return!0;var length=getLength(value);return isLength(length)&&(isArray(value)||isString(value)||isArguments(value)||isObjectLike(value)&&isFunction(value.splice))?!length:!keys(value).length}function isObject(value){var type=typeof value;return\"function\"==type||!!value&&\"object\"==type}function isNative(value){return null==value?!1:objToString.call(value)==funcTag?reIsNative.test(fnToString.call(value)):isObjectLike(value)&&reIsHostCtor.test(value)}function isNumber(value){return\"number\"==typeof value||isObjectLike(value)&&objToString.call(value)==numberTag}function isString(value){return\"string\"==typeof value||isObjectLike(value)&&objToString.call(value)==stringTag}function isTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[objToString.call(value)]}function toPlainObject(value){return baseCopy(value,keysIn(value))}function has(object,path){if(null==object)return!1;var result=hasOwnProperty.call(object,path);return result||isKey(path)||(path=toPath(path),object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),path=last(path),result=null!=object&&hasOwnProperty.call(object,path)),result}function keysIn(object){if(null==object)return[];isObject(object)||(object=Object(object));var length=object.length;length=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object))&&length||0;for(var Ctor=object.constructor,index=-1,isProto=\"function\"==typeof Ctor&&Ctor.prototype===object,result=Array(length),skipIndexes=length>0;length>++index;)result[index]=index+\"\";for(var key in object)skipIndexes&&isIndex(key,length)||\"constructor\"==key&&(isProto||!hasOwnProperty.call(object,key))||result.push(key);return result}function values(object){return baseValues(object,keys(object))}function escapeRegExp(string){return string=baseToString(string),string&&reHasRegExpChars.test(string)?string.replace(reRegExpChars,\"\\\\$&\"):string}function callback(func,thisArg,guard){return guard&&isIterateeCall(func,thisArg,guard)&&(thisArg=null),baseCallback(func,thisArg)}function constant(value){return function(){return value}}function identity(value){return value}function property(path){return isKey(path)?baseProperty(path):basePropertyDeep(path)}var undefined,VERSION=\"3.7.0\",FUNC_ERROR_TEXT=\"Expected a function\",argsTag=\"[object Arguments]\",arrayTag=\"[object Array]\",boolTag=\"[object Boolean]\",dateTag=\"[object Date]\",errorTag=\"[object Error]\",funcTag=\"[object Function]\",mapTag=\"[object Map]\",numberTag=\"[object Number]\",objectTag=\"[object Object]\",regexpTag=\"[object RegExp]\",setTag=\"[object Set]\",stringTag=\"[object String]\",weakMapTag=\"[object WeakMap]\",arrayBufferTag=\"[object ArrayBuffer]\",float32Tag=\"[object Float32Array]\",float64Tag=\"[object Float64Array]\",int8Tag=\"[object Int8Array]\",int16Tag=\"[object Int16Array]\",int32Tag=\"[object Int32Array]\",uint8Tag=\"[object Uint8Array]\",uint8ClampedTag=\"[object Uint8ClampedArray]\",uint16Tag=\"[object Uint16Array]\",uint32Tag=\"[object Uint32Array]\",reIsDeepProp=/\\.|\\[(?:[^[\\]]+|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?)\\1\\]/,reIsPlainProp=/^\\w*$/,rePropName=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g,reRegExpChars=/[.*+?^${}()|[\\]\\/\\\\]/g,reHasRegExpChars=RegExp(reRegExpChars.source),reEscapeChar=/\\\\(\\\\)?/g,reFlags=/\\w*$/,reIsHostCtor=/^\\[object .+?Constructor\\]$/,typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[stringTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=!0,cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[mapTag]=cloneableTags[setTag]=cloneableTags[weakMapTag]=!1;var objectTypes={\"function\":!0,object:!0},freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports,freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module,freeGlobal=freeExports&&freeModule&&\"object\"==typeof global&&global&&global.Object&&global,freeSelf=objectTypes[typeof self]&&self&&self.Object&&self,freeWindow=objectTypes[typeof window]&&window&&window.Object&&window,moduleExports=freeModule&&freeModule.exports===freeExports&&freeExports,root=freeGlobal||freeWindow!==(this&&this.window)&&freeWindow||freeSelf||this,arrayProto=Array.prototype,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp(\"^\"+escapeRegExp(objToString).replace(/toString|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),ArrayBuffer=isNative(ArrayBuffer=root.ArrayBuffer)&&ArrayBuffer,bufferSlice=isNative(bufferSlice=ArrayBuffer&&new ArrayBuffer(0).slice)&&bufferSlice,floor=Math.floor,getOwnPropertySymbols=isNative(getOwnPropertySymbols=Object.getOwnPropertySymbols)&&getOwnPropertySymbols,getPrototypeOf=isNative(getPrototypeOf=Object.getPrototypeOf)&&getPrototypeOf,push=arrayProto.push,preventExtensions=isNative(Object.preventExtensions=Object.preventExtensions)&&preventExtensions,propertyIsEnumerable=objectProto.propertyIsEnumerable,Uint8Array=isNative(Uint8Array=root.Uint8Array)&&Uint8Array,Float64Array=function(){try{var func=isNative(func=root.Float64Array)&&func,result=new func(new ArrayBuffer(10),0,1)&&func}catch(e){}return result}(),nativeAssign=function(){var object={1:0},func=preventExtensions&&isNative(func=Object.assign)&&func;try{func(preventExtensions(object),\"xo\")}catch(e){}return!object[1]&&func}(),nativeIsArray=isNative(nativeIsArray=Array.isArray)&&nativeIsArray,nativeKeys=isNative(nativeKeys=Object.keys)&&nativeKeys,nativeMax=Math.max,nativeMin=Math.min,NEGATIVE_INFINITY=Number.NEGATIVE_INFINITY,MAX_ARRAY_LENGTH=Math.pow(2,32)-1,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1,FLOAT64_BYTES_PER_ELEMENT=Float64Array?Float64Array.BYTES_PER_ELEMENT:0,MAX_SAFE_INTEGER=Math.pow(2,53)-1,support=lodash.support={};(function(x){var Ctor=function(){this.x=x},props=[];Ctor.prototype={valueOf:x,y:x};for(var key in new Ctor)props.push(key);support.funcDecomp=/\\bthis\\b/.test(function(){return this}),support.funcNames=\"string\"==typeof Function.name;try{support.nonEnumArgs=!propertyIsEnumerable.call(arguments,1)}catch(e){support.nonEnumArgs=!0}})(1,0);var baseAssign=nativeAssign||function(object,source){return null==source?object:baseCopy(source,getSymbols(source),baseCopy(source,keys(source),object))},baseEach=createBaseEach(baseForOwn),baseFor=createBaseFor();bufferSlice||(bufferClone=ArrayBuffer&&Uint8Array?function(buffer){var byteLength=buffer.byteLength,floatLength=Float64Array?floor(byteLength/FLOAT64_BYTES_PER_ELEMENT):0,offset=floatLength*FLOAT64_BYTES_PER_ELEMENT,result=new ArrayBuffer(byteLength);if(floatLength){var view=new Float64Array(result,0,floatLength);view.set(new Float64Array(buffer,0,floatLength))}return byteLength!=offset&&(view=new Uint8Array(result,offset),view.set(new Uint8Array(buffer,offset))),result}:constant(null));var getLength=baseProperty(\"length\"),getSymbols=getOwnPropertySymbols?function(object){return getOwnPropertySymbols(toObject(object))}:constant([]),findLastIndex=createFindIndex(!0),zip=restParam(unzip),forEach=createForEach(arrayEach,baseEach),isArray=nativeIsArray||function(value){return isObjectLike(value)&&isLength(value.length)&&objToString.call(value)==arrayTag},isFunction=baseIsFunction(/x/)||Uint8Array&&!baseIsFunction(Uint8Array)?function(value){return objToString.call(value)==funcTag}:baseIsFunction,isPlainObject=getPrototypeOf?function(value){if(!value||objToString.call(value)!=objectTag)return!1;var valueOf=value.valueOf,objProto=isNative(valueOf)&&(objProto=getPrototypeOf(valueOf))&&getPrototypeOf(objProto);return objProto?value==objProto||getPrototypeOf(value)==objProto:shimIsPlainObject(value)}:shimIsPlainObject,assign=createAssigner(function(object,source,customizer){return customizer?assignWith(object,source,customizer):baseAssign(object,source)}),keys=nativeKeys?function(object){if(object)var Ctor=object.constructor,length=object.length;return\"function\"==typeof Ctor&&Ctor.prototype===object||\"function\"!=typeof object&&isLength(length)?shimKeys(object):isObject(object)?nativeKeys(object):[]}:shimKeys,merge=createAssigner(baseMerge);lodash.assign=assign,lodash.callback=callback,lodash.constant=constant,lodash.forEach=forEach,lodash.keys=keys,lodash.keysIn=keysIn,lodash.merge=merge,lodash.property=property,lodash.reject=reject,lodash.restParam=restParam,lodash.slice=slice,lodash.toPlainObject=toPlainObject,lodash.unzip=unzip,lodash.values=values,lodash.zip=zip,lodash.each=forEach,lodash.extend=assign,lodash.iteratee=callback,lodash.clone=clone,lodash.escapeRegExp=escapeRegExp,lodash.findLastIndex=findLastIndex,lodash.has=has,lodash.identity=identity,lodash.includes=includes,lodash.indexOf=indexOf,lodash.isArguments=isArguments,lodash.isArray=isArray,lodash.isEmpty=isEmpty,lodash.isFunction=isFunction,lodash.isNative=isNative,lodash.isNumber=isNumber,lodash.isObject=isObject,lodash.isPlainObject=isPlainObject,lodash.isString=isString,lodash.isTypedArray=isTypedArray,lodash.last=last,lodash.some=some,lodash.any=some,lodash.contains=includes,lodash.include=includes,lodash.VERSION=VERSION,freeExports&&freeModule?moduleExports?(freeModule.exports=lodash)._=lodash:freeExports._=lodash:root._=lodash\n}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],\"/node_modules/jshint/src/jshint.js\":[function(_dereq_,module,exports){var _=_dereq_(\"../lodash\"),events=_dereq_(\"events\"),vars=_dereq_(\"./vars.js\"),messages=_dereq_(\"./messages.js\"),Lexer=_dereq_(\"./lex.js\").Lexer,reg=_dereq_(\"./reg.js\"),state=_dereq_(\"./state.js\").state,style=_dereq_(\"./style.js\"),options=_dereq_(\"./options.js\"),scopeManager=_dereq_(\"./scope-manager.js\"),JSHINT=function(){\"use strict\";function checkOption(name,t){return name=name.trim(),/^[+-]W\\d{3}$/g.test(name)?!0:-1!==options.validNames.indexOf(name)||\"jslint\"===t.type||_.has(options.removed,name)?!0:(error(\"E001\",t,name),!1)}function isString(obj){return\"[object String]\"===Object.prototype.toString.call(obj)}function isIdentifier(tkn,value){return tkn?tkn.identifier&&tkn.value===value?!0:!1:!1}function isReserved(token){if(!token.reserved)return!1;var meta=token.meta;if(meta&&meta.isFutureReservedWord&&state.inES5()){if(!meta.es5)return!1;if(meta.strictOnly&&!state.option.strict&&!state.isStrict())return!1;if(token.isProperty)return!1}return!0}function supplant(str,data){return str.replace(/\\{([^{}]*)\\}/g,function(a,b){var r=data[b];return\"string\"==typeof r||\"number\"==typeof r?r:a})}function combine(dest,src){Object.keys(src).forEach(function(name){_.has(JSHINT.blacklist,name)||(dest[name]=src[name])})}function processenforceall(){if(state.option.enforceall){for(var enforceopt in options.bool.enforcing)void 0!==state.option[enforceopt]||options.noenforceall[enforceopt]||(state.option[enforceopt]=!0);for(var relaxopt in options.bool.relaxing)void 0===state.option[relaxopt]&&(state.option[relaxopt]=!1)}}function assume(){processenforceall(),state.option.esversion||state.option.moz||(state.option.esversion=state.option.es3?3:state.option.esnext?6:5),state.inES5()&&combine(predefined,vars.ecmaIdentifiers[5]),state.inES6()&&combine(predefined,vars.ecmaIdentifiers[6]),state.option.module&&(state.option.strict===!0&&(state.option.strict=\"global\"),state.inES6()||warning(\"W134\",state.tokens.next,\"module\",6)),state.option.couch&&combine(predefined,vars.couch),state.option.qunit&&combine(predefined,vars.qunit),state.option.rhino&&combine(predefined,vars.rhino),state.option.shelljs&&(combine(predefined,vars.shelljs),combine(predefined,vars.node)),state.option.typed&&combine(predefined,vars.typed),state.option.phantom&&(combine(predefined,vars.phantom),state.option.strict===!0&&(state.option.strict=\"global\")),state.option.prototypejs&&combine(predefined,vars.prototypejs),state.option.node&&(combine(predefined,vars.node),combine(predefined,vars.typed),state.option.strict===!0&&(state.option.strict=\"global\")),state.option.devel&&combine(predefined,vars.devel),state.option.dojo&&combine(predefined,vars.dojo),state.option.browser&&(combine(predefined,vars.browser),combine(predefined,vars.typed)),state.option.browserify&&(combine(predefined,vars.browser),combine(predefined,vars.typed),combine(predefined,vars.browserify),state.option.strict===!0&&(state.option.strict=\"global\")),state.option.nonstandard&&combine(predefined,vars.nonstandard),state.option.jasmine&&combine(predefined,vars.jasmine),state.option.jquery&&combine(predefined,vars.jquery),state.option.mootools&&combine(predefined,vars.mootools),state.option.worker&&combine(predefined,vars.worker),state.option.wsh&&combine(predefined,vars.wsh),state.option.globalstrict&&state.option.strict!==!1&&(state.option.strict=\"global\"),state.option.yui&&combine(predefined,vars.yui),state.option.mocha&&combine(predefined,vars.mocha)}function quit(code,line,chr){var percentage=Math.floor(100*(line/state.lines.length)),message=messages.errors[code].desc;throw{name:\"JSHintError\",line:line,character:chr,message:message+\" (\"+percentage+\"% scanned).\",raw:message,code:code}}function removeIgnoredMessages(){var ignored=state.ignoredLines;_.isEmpty(ignored)||(JSHINT.errors=_.reject(JSHINT.errors,function(err){return ignored[err.line]}))}function warning(code,t,a,b,c,d){var ch,l,w,msg;if(/^W\\d{3}$/.test(code)){if(state.ignored[code])return;msg=messages.warnings[code]}else/E\\d{3}/.test(code)?msg=messages.errors[code]:/I\\d{3}/.test(code)&&(msg=messages.info[code]);return t=t||state.tokens.next||{},\"(end)\"===t.id&&(t=state.tokens.curr),l=t.line||0,ch=t.from||0,w={id:\"(error)\",raw:msg.desc,code:msg.code,evidence:state.lines[l-1]||\"\",line:l,character:ch,scope:JSHINT.scope,a:a,b:b,c:c,d:d},w.reason=supplant(msg.desc,w),JSHINT.errors.push(w),removeIgnoredMessages(),JSHINT.errors.length>=state.option.maxerr&&quit(\"E043\",l,ch),w}function warningAt(m,l,ch,a,b,c,d){return warning(m,{line:l,from:ch},a,b,c,d)}function error(m,t,a,b,c,d){warning(m,t,a,b,c,d)}function errorAt(m,l,ch,a,b,c,d){return error(m,{line:l,from:ch},a,b,c,d)}function addInternalSrc(elem,src){var i;return i={id:\"(internal)\",elem:elem,value:src},JSHINT.internals.push(i),i}function doOption(){var nt=state.tokens.next,body=nt.body.match(/(-\\s+)?[^\\s,:]+(?:\\s*:\\s*(-\\s+)?[^\\s,]+)?/g)||[],predef={};if(\"globals\"===nt.type){body.forEach(function(g,idx){g=g.split(\":\");var key=(g[0]||\"\").trim(),val=(g[1]||\"\").trim();if(\"-\"===key||!key.length){if(idx>0&&idx===body.length-1)return;return error(\"E002\",nt),void 0}\"-\"===key.charAt(0)?(key=key.slice(1),val=!1,JSHINT.blacklist[key]=key,delete predefined[key]):predef[key]=\"true\"===val}),combine(predefined,predef);for(var key in predef)_.has(predef,key)&&(declared[key]=nt)}\"exported\"===nt.type&&body.forEach(function(e,idx){if(!e.length){if(idx>0&&idx===body.length-1)return;return error(\"E002\",nt),void 0}state.funct[\"(scope)\"].addExported(e)}),\"members\"===nt.type&&(membersOnly=membersOnly||{},body.forEach(function(m){var ch1=m.charAt(0),ch2=m.charAt(m.length-1);ch1!==ch2||'\"'!==ch1&&\"'\"!==ch1||(m=m.substr(1,m.length-2).replace('\\\\\"','\"')),membersOnly[m]=!1}));var numvals=[\"maxstatements\",\"maxparams\",\"maxdepth\",\"maxcomplexity\",\"maxerr\",\"maxlen\",\"indent\"];(\"jshint\"===nt.type||\"jslint\"===nt.type)&&(body.forEach(function(g){g=g.split(\":\");var key=(g[0]||\"\").trim(),val=(g[1]||\"\").trim();if(checkOption(key,nt))if(numvals.indexOf(key)>=0)if(\"false\"!==val){if(val=+val,\"number\"!=typeof val||!isFinite(val)||0>=val||Math.floor(val)!==val)return error(\"E032\",nt,g[1].trim()),void 0;state.option[key]=val}else state.option[key]=\"indent\"===key?4:!1;else{if(\"validthis\"===key)return state.funct[\"(global)\"]?void error(\"E009\"):\"true\"!==val&&\"false\"!==val?void error(\"E002\",nt):(state.option.validthis=\"true\"===val,void 0);if(\"quotmark\"!==key)if(\"shadow\"!==key)if(\"unused\"!==key)if(\"latedef\"!==key)if(\"ignore\"!==key)if(\"strict\"!==key){\"module\"===key&&(hasParsedCode(state.funct)||error(\"E055\",state.tokens.next,\"module\"));var esversions={es3:3,es5:5,esnext:6};if(!_.has(esversions,key)){if(\"esversion\"===key){switch(val){case\"5\":state.inES5(!0)&&warning(\"I003\");case\"3\":case\"6\":state.option.moz=!1,state.option.esversion=+val;break;case\"2015\":state.option.moz=!1,state.option.esversion=6;break;default:error(\"E002\",nt)}return hasParsedCode(state.funct)||error(\"E055\",state.tokens.next,\"esversion\"),void 0}var match=/^([+-])(W\\d{3})$/g.exec(key);if(match)return state.ignored[match[2]]=\"-\"===match[1],void 0;var tn;return\"true\"===val||\"false\"===val?(\"jslint\"===nt.type?(tn=options.renamed[key]||key,state.option[tn]=\"true\"===val,void 0!==options.inverted[tn]&&(state.option[tn]=!state.option[tn])):state.option[key]=\"true\"===val,\"newcap\"===key&&(state.option[\"(explicitNewcap)\"]=!0),void 0):(error(\"E002\",nt),void 0)}switch(val){case\"true\":state.option.moz=!1,state.option.esversion=esversions[key];break;case\"false\":state.option.moz||(state.option.esversion=5);break;default:error(\"E002\",nt)}}else switch(val){case\"true\":state.option.strict=!0;break;case\"false\":state.option.strict=!1;break;case\"func\":case\"global\":case\"implied\":state.option.strict=val;break;default:error(\"E002\",nt)}else switch(val){case\"line\":state.ignoredLines[nt.line]=!0,removeIgnoredMessages();break;default:error(\"E002\",nt)}else switch(val){case\"true\":state.option.latedef=!0;break;case\"false\":state.option.latedef=!1;break;case\"nofunc\":state.option.latedef=\"nofunc\";break;default:error(\"E002\",nt)}else switch(val){case\"true\":state.option.unused=!0;break;case\"false\":state.option.unused=!1;break;case\"vars\":case\"strict\":state.option.unused=val;break;default:error(\"E002\",nt)}else switch(val){case\"true\":state.option.shadow=!0;break;case\"outer\":state.option.shadow=\"outer\";break;case\"false\":case\"inner\":state.option.shadow=\"inner\";break;default:error(\"E002\",nt)}else switch(val){case\"true\":case\"false\":state.option.quotmark=\"true\"===val;break;case\"double\":case\"single\":state.option.quotmark=val;break;default:error(\"E002\",nt)}}}),assume())}function peek(p){var t,i=p||0,j=lookahead.length;if(j>i)return lookahead[i];for(;i>=j;)t=lookahead[j],t||(t=lookahead[j]=lex.token()),j+=1;return t||\"(end)\"!==state.tokens.next.id?t:state.tokens.next}function peekIgnoreEOL(){var t,i=0;do t=peek(i++);while(\"(endline)\"===t.id);return t}function advance(id,t){switch(state.tokens.curr.id){case\"(number)\":\".\"===state.tokens.next.id&&warning(\"W005\",state.tokens.curr);break;case\"-\":(\"-\"===state.tokens.next.id||\"--\"===state.tokens.next.id)&&warning(\"W006\");break;case\"+\":(\"+\"===state.tokens.next.id||\"++\"===state.tokens.next.id)&&warning(\"W007\")}for(id&&state.tokens.next.id!==id&&(t?\"(end)\"===state.tokens.next.id?error(\"E019\",t,t.id):error(\"E020\",state.tokens.next,id,t.id,t.line,state.tokens.next.value):(\"(identifier)\"!==state.tokens.next.type||state.tokens.next.value!==id)&&warning(\"W116\",state.tokens.next,id,state.tokens.next.value)),state.tokens.prev=state.tokens.curr,state.tokens.curr=state.tokens.next;;){if(state.tokens.next=lookahead.shift()||lex.token(),state.tokens.next||quit(\"E041\",state.tokens.curr.line),\"(end)\"===state.tokens.next.id||\"(error)\"===state.tokens.next.id)return;if(state.tokens.next.check&&state.tokens.next.check(),state.tokens.next.isSpecial)\"falls through\"===state.tokens.next.type?state.tokens.curr.caseFallsThrough=!0:doOption();else if(\"(endline)\"!==state.tokens.next.id)break}}function isInfix(token){return token.infix||!token.identifier&&!token.template&&!!token.led}function isEndOfExpr(){var curr=state.tokens.curr,next=state.tokens.next;return\";\"===next.id||\"}\"===next.id||\":\"===next.id?!0:isInfix(next)===isInfix(curr)||\"yield\"===curr.id&&state.inMoz()?curr.line!==startLine(next):!1}function isBeginOfExpr(prev){return!prev.left&&\"unary\"!==prev.arity}function expression(rbp,initial){var left,isArray=!1,isObject=!1,isLetExpr=!1;state.nameStack.push(),initial||\"let\"!==state.tokens.next.value||\"(\"!==peek(0).value||(state.inMoz()||warning(\"W118\",state.tokens.next,\"let expressions\"),isLetExpr=!0,state.funct[\"(scope)\"].stack(),advance(\"let\"),advance(\"(\"),state.tokens.prev.fud(),advance(\")\")),\"(end)\"===state.tokens.next.id&&error(\"E006\",state.tokens.curr);var isDangerous=state.option.asi&&state.tokens.prev.line!==startLine(state.tokens.curr)&&_.contains([\"]\",\")\"],state.tokens.prev.id)&&_.contains([\"[\",\"(\"],state.tokens.curr.id);if(isDangerous&&warning(\"W014\",state.tokens.curr,state.tokens.curr.id),advance(),initial&&(state.funct[\"(verb)\"]=state.tokens.curr.value,state.tokens.curr.beginsStmt=!0),initial===!0&&state.tokens.curr.fud)left=state.tokens.curr.fud();else for(state.tokens.curr.nud?left=state.tokens.curr.nud():error(\"E030\",state.tokens.curr,state.tokens.curr.id);(state.tokens.next.lbp>rbp||\"(template)\"===state.tokens.next.type)&&!isEndOfExpr();)isArray=\"Array\"===state.tokens.curr.value,isObject=\"Object\"===state.tokens.curr.value,left&&(left.value||left.first&&left.first.value)&&(\"new\"!==left.value||left.first&&left.first.value&&\".\"===left.first.value)&&(isArray=!1,left.value!==state.tokens.curr.value&&(isObject=!1)),advance(),isArray&&\"(\"===state.tokens.curr.id&&\")\"===state.tokens.next.id&&warning(\"W009\",state.tokens.curr),isObject&&\"(\"===state.tokens.curr.id&&\")\"===state.tokens.next.id&&warning(\"W010\",state.tokens.curr),left&&state.tokens.curr.led?left=state.tokens.curr.led(left):error(\"E033\",state.tokens.curr,state.tokens.curr.id);return isLetExpr&&state.funct[\"(scope)\"].unstack(),state.nameStack.pop(),left}function startLine(token){return token.startLine||token.line}function nobreaknonadjacent(left,right){left=left||state.tokens.curr,right=right||state.tokens.next,state.option.laxbreak||left.line===startLine(right)||warning(\"W014\",right,right.value)}function nolinebreak(t){t=t||state.tokens.curr,t.line!==startLine(state.tokens.next)&&warning(\"E022\",t,t.value)}function nobreakcomma(left,right){left.line!==startLine(right)&&(state.option.laxcomma||(comma.first&&(warning(\"I001\"),comma.first=!1),warning(\"W014\",left,right.value)))}function comma(opts){if(opts=opts||{},opts.peek?nobreakcomma(state.tokens.prev,state.tokens.curr):(nobreakcomma(state.tokens.curr,state.tokens.next),advance(\",\")),state.tokens.next.identifier&&(!opts.property||!state.inES5()))switch(state.tokens.next.value){case\"break\":case\"case\":case\"catch\":case\"continue\":case\"default\":case\"do\":case\"else\":case\"finally\":case\"for\":case\"if\":case\"in\":case\"instanceof\":case\"return\":case\"switch\":case\"throw\":case\"try\":case\"var\":case\"let\":case\"while\":case\"with\":return error(\"E024\",state.tokens.next,state.tokens.next.value),!1}if(\"(punctuator)\"===state.tokens.next.type)switch(state.tokens.next.value){case\"}\":case\"]\":case\",\":if(opts.allowTrailing)return!0;case\")\":return error(\"E024\",state.tokens.next,state.tokens.next.value),!1}return!0}function symbol(s,p){var x=state.syntax[s];return x&&\"object\"==typeof x||(state.syntax[s]=x={id:s,lbp:p,value:s}),x}function delim(s){var x=symbol(s,0);return x.delim=!0,x}function stmt(s,f){var x=delim(s);return x.identifier=x.reserved=!0,x.fud=f,x}function blockstmt(s,f){var x=stmt(s,f);return x.block=!0,x}function reserveName(x){var c=x.id.charAt(0);return(c>=\"a\"&&\"z\">=c||c>=\"A\"&&\"Z\">=c)&&(x.identifier=x.reserved=!0),x}function prefix(s,f){var x=symbol(s,150);return reserveName(x),x.nud=\"function\"==typeof f?f:function(){return this.arity=\"unary\",this.right=expression(150),(\"++\"===this.id||\"--\"===this.id)&&(state.option.plusplus?warning(\"W016\",this,this.id):!this.right||this.right.identifier&&!isReserved(this.right)||\".\"===this.right.id||\"[\"===this.right.id||warning(\"W017\",this),this.right&&this.right.isMetaProperty?error(\"E031\",this):this.right&&this.right.identifier&&state.funct[\"(scope)\"].block.modify(this.right.value,this)),this},x}function type(s,f){var x=delim(s);return x.type=s,x.nud=f,x}function reserve(name,func){var x=type(name,func);return x.identifier=!0,x.reserved=!0,x}function FutureReservedWord(name,meta){var x=type(name,meta&&meta.nud||function(){return this});return meta=meta||{},meta.isFutureReservedWord=!0,x.value=name,x.identifier=!0,x.reserved=!0,x.meta=meta,x}function reservevar(s,v){return reserve(s,function(){return\"function\"==typeof v&&v(this),this})}function infix(s,f,p,w){var x=symbol(s,p);return reserveName(x),x.infix=!0,x.led=function(left){return w||nobreaknonadjacent(state.tokens.prev,state.tokens.curr),\"in\"!==s&&\"instanceof\"!==s||\"!\"!==left.id||warning(\"W018\",left,\"!\"),\"function\"==typeof f?f(left,this):(this.left=left,this.right=expression(p),this)},x}function application(s){var x=symbol(s,42);return x.led=function(left){return nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left,this.right=doFunction({type:\"arrow\",loneArg:left}),this},x}function relation(s,f){var x=symbol(s,100);return x.led=function(left){nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left;var right=this.right=expression(100);return isIdentifier(left,\"NaN\")||isIdentifier(right,\"NaN\")?warning(\"W019\",this):f&&f.apply(this,[left,right]),left&&right||quit(\"E041\",state.tokens.curr.line),\"!\"===left.id&&warning(\"W018\",left,\"!\"),\"!\"===right.id&&warning(\"W018\",right,\"!\"),this},x}function isPoorRelation(node){return node&&(\"(number)\"===node.type&&0===+node.value||\"(string)\"===node.type&&\"\"===node.value||\"null\"===node.type&&!state.option.eqnull||\"true\"===node.type||\"false\"===node.type||\"undefined\"===node.type)}function isTypoTypeof(left,right,state){var values;return state.option.notypeof?!1:left&&right?(values=state.inES6()?typeofValues.es6:typeofValues.es3,\"(identifier)\"===right.type&&\"typeof\"===right.value&&\"(string)\"===left.type?!_.contains(values,left.value):!1):!1}function isGlobalEval(left,state){var isGlobal=!1;return\"this\"===left.type&&null===state.funct[\"(context)\"]?isGlobal=!0:\"(identifier)\"===left.type&&(state.option.node&&\"global\"===left.value?isGlobal=!0:!state.option.browser||\"window\"!==left.value&&\"document\"!==left.value||(isGlobal=!0)),isGlobal}function findNativePrototype(left){function walkPrototype(obj){return\"object\"==typeof obj?\"prototype\"===obj.right?obj:walkPrototype(obj.left):void 0}function walkNative(obj){for(;!obj.identifier&&\"object\"==typeof obj.left;)obj=obj.left;return obj.identifier&&natives.indexOf(obj.value)>=0?obj.value:void 0}var natives=[\"Array\",\"ArrayBuffer\",\"Boolean\",\"Collator\",\"DataView\",\"Date\",\"DateTimeFormat\",\"Error\",\"EvalError\",\"Float32Array\",\"Float64Array\",\"Function\",\"Infinity\",\"Intl\",\"Int16Array\",\"Int32Array\",\"Int8Array\",\"Iterator\",\"Number\",\"NumberFormat\",\"Object\",\"RangeError\",\"ReferenceError\",\"RegExp\",\"StopIteration\",\"String\",\"SyntaxError\",\"TypeError\",\"Uint16Array\",\"Uint32Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"URIError\"],prototype=walkPrototype(left);return prototype?walkNative(prototype):void 0}function checkLeftSideAssign(left,assignToken,options){var allowDestructuring=options&&options.allowDestructuring;if(assignToken=assignToken||left,state.option.freeze){var nativeObject=findNativePrototype(left);nativeObject&&warning(\"W121\",left,nativeObject)}return left.identifier&&!left.isMetaProperty&&state.funct[\"(scope)\"].block.reassign(left.value,left),\".\"===left.id?((!left.left||\"arguments\"===left.left.value&&!state.isStrict())&&warning(\"E031\",assignToken),state.nameStack.set(state.tokens.prev),!0):\"{\"===left.id||\"[\"===left.id?(allowDestructuring&&state.tokens.curr.left.destructAssign?state.tokens.curr.left.destructAssign.forEach(function(t){t.id&&state.funct[\"(scope)\"].block.modify(t.id,t.token)}):\"{\"!==left.id&&left.left?\"arguments\"!==left.left.value||state.isStrict()||warning(\"E031\",assignToken):warning(\"E031\",assignToken),\"[\"===left.id&&state.nameStack.set(left.right),!0):left.isMetaProperty?(error(\"E031\",assignToken),!0):left.identifier&&!isReserved(left)?(\"exception\"===state.funct[\"(scope)\"].labeltype(left.value)&&warning(\"W022\",left),state.nameStack.set(left),!0):(left===state.syntax[\"function\"]&&warning(\"W023\",state.tokens.curr),!1)}function assignop(s,f,p){var x=infix(s,\"function\"==typeof f?f:function(left,that){return that.left=left,left&&checkLeftSideAssign(left,that,{allowDestructuring:!0})?(that.right=expression(10),that):(error(\"E031\",that),void 0)},p);return x.exps=!0,x.assign=!0,x}function bitwise(s,f,p){var x=symbol(s,p);return reserveName(x),x.led=\"function\"==typeof f?f:function(left){return state.option.bitwise&&warning(\"W016\",this,this.id),this.left=left,this.right=expression(p),this},x}function bitwiseassignop(s){return assignop(s,function(left,that){return state.option.bitwise&&warning(\"W016\",that,that.id),left&&checkLeftSideAssign(left,that)?(that.right=expression(10),that):(error(\"E031\",that),void 0)},20)}function suffix(s){var x=symbol(s,150);return x.led=function(left){return state.option.plusplus?warning(\"W016\",this,this.id):left.identifier&&!isReserved(left)||\".\"===left.id||\"[\"===left.id||warning(\"W017\",this),left.isMetaProperty?error(\"E031\",this):left&&left.identifier&&state.funct[\"(scope)\"].block.modify(left.value,left),this.left=left,this},x}function optionalidentifier(fnparam,prop,preserve){if(state.tokens.next.identifier){preserve||advance();var curr=state.tokens.curr,val=state.tokens.curr.value;return isReserved(curr)?prop&&state.inES5()?val:fnparam&&\"undefined\"===val?val:(warning(\"W024\",state.tokens.curr,state.tokens.curr.id),val):val}}function identifier(fnparam,prop){var i=optionalidentifier(fnparam,prop,!1);if(i)return i;if(\"...\"===state.tokens.next.value){if(state.inES6(!0)||warning(\"W119\",state.tokens.next,\"spread/rest operator\",\"6\"),advance(),checkPunctuator(state.tokens.next,\"...\"))for(warning(\"E024\",state.tokens.next,\"...\");checkPunctuator(state.tokens.next,\"...\");)advance();return state.tokens.next.identifier?identifier(fnparam,prop):(warning(\"E024\",state.tokens.curr,\"...\"),void 0)}error(\"E030\",state.tokens.next,state.tokens.next.value),\";\"!==state.tokens.next.id&&advance()}function reachable(controlToken){var t,i=0;if(\";\"===state.tokens.next.id&&!controlToken.inBracelessBlock)for(;;){do t=peek(i),i+=1;while(\"(end)\"!==t.id&&\"(comment)\"===t.id);if(t.reach)return;if(\"(endline)\"!==t.id){if(\"function\"===t.id){state.option.latedef===!0&&warning(\"W026\",t);break}warning(\"W027\",t,t.value,controlToken.value);break}}}function parseFinalSemicolon(){if(\";\"!==state.tokens.next.id){if(state.tokens.next.isUnclosed)return advance();var sameLine=startLine(state.tokens.next)===state.tokens.curr.line&&\"(end)\"!==state.tokens.next.id,blockEnd=checkPunctuator(state.tokens.next,\"}\");sameLine&&!blockEnd?errorAt(\"E058\",state.tokens.curr.line,state.tokens.curr.character):state.option.asi||(blockEnd&&!state.option.lastsemic||!sameLine)&&warningAt(\"W033\",state.tokens.curr.line,state.tokens.curr.character)}else advance(\";\")}function statement(){var r,i=indent,t=state.tokens.next,hasOwnScope=!1;if(\";\"===t.id)return advance(\";\"),void 0;var res=isReserved(t);if(res&&t.meta&&t.meta.isFutureReservedWord&&\":\"===peek().id&&(warning(\"W024\",t,t.id),res=!1),t.identifier&&!res&&\":\"===peek().id&&(advance(),advance(\":\"),hasOwnScope=!0,state.funct[\"(scope)\"].stack(),state.funct[\"(scope)\"].block.addBreakLabel(t.value,{token:state.tokens.curr}),state.tokens.next.labelled||\"{\"===state.tokens.next.value||warning(\"W028\",state.tokens.next,t.value,state.tokens.next.value),state.tokens.next.label=t.value,t=state.tokens.next),\"{\"===t.id){var iscase=\"case\"===state.funct[\"(verb)\"]&&\":\"===state.tokens.curr.value;return block(!0,!0,!1,!1,iscase),void 0}return r=expression(0,!0),!r||r.identifier&&\"function\"===r.value||\"(punctuator)\"===r.type&&r.left&&r.left.identifier&&\"function\"===r.left.value||state.isStrict()||\"global\"!==state.option.strict||warning(\"E007\"),t.block||(state.option.expr||r&&r.exps?state.option.nonew&&r&&r.left&&\"(\"===r.id&&\"new\"===r.left.id&&warning(\"W031\",t):warning(\"W030\",state.tokens.curr),parseFinalSemicolon()),indent=i,hasOwnScope&&state.funct[\"(scope)\"].unstack(),r}function statements(){for(var p,a=[];!state.tokens.next.reach&&\"(end)\"!==state.tokens.next.id;)\";\"===state.tokens.next.id?(p=peek(),(!p||\"(\"!==p.id&&\"[\"!==p.id)&&warning(\"W032\"),advance(\";\")):a.push(statement());return a}function directives(){for(var i,p,pn;\"(string)\"===state.tokens.next.id;){if(p=peek(0),\"(endline)\"===p.id){i=1;do pn=peek(i++);while(\"(endline)\"===pn.id);if(\";\"===pn.id)p=pn;else{if(\"[\"===pn.value||\".\"===pn.value)break;state.option.asi&&\"(\"!==pn.value||warning(\"W033\",state.tokens.next)}}else{if(\".\"===p.id||\"[\"===p.id)break;\";\"!==p.id&&warning(\"W033\",p)}advance();var directive=state.tokens.curr.value;(state.directive[directive]||\"use strict\"===directive&&\"implied\"===state.option.strict)&&warning(\"W034\",state.tokens.curr,directive),state.directive[directive]=!0,\";\"===p.id&&advance(\";\")}state.isStrict()&&(state.option[\"(explicitNewcap)\"]||(state.option.newcap=!0),state.option.undef=!0)}function block(ordinary,stmt,isfunc,isfatarrow,iscase){var a,m,t,line,d,b=inblock,old_indent=indent;inblock=ordinary,t=state.tokens.next;var metrics=state.funct[\"(metrics)\"];if(metrics.nestedBlockDepth+=1,metrics.verifyMaxNestedBlockDepthPerFunction(),\"{\"===state.tokens.next.id){if(advance(\"{\"),state.funct[\"(scope)\"].stack(),line=state.tokens.curr.line,\"}\"!==state.tokens.next.id){for(indent+=state.option.indent;!ordinary&&state.tokens.next.from>indent;)indent+=state.option.indent;if(isfunc){m={};for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);directives(),state.option.strict&&state.funct[\"(context)\"][\"(global)\"]&&(m[\"use strict\"]||state.isStrict()||warning(\"E007\"))}a=statements(),metrics.statementCount+=a.length,indent-=state.option.indent}advance(\"}\",t),isfunc&&(state.funct[\"(scope)\"].validateParams(),m&&(state.directive=m)),state.funct[\"(scope)\"].unstack(),indent=old_indent}else if(ordinary)state.funct[\"(noblockscopedvar)\"]=\"for\"!==state.tokens.next.id,state.funct[\"(scope)\"].stack(),(!stmt||state.option.curly)&&warning(\"W116\",state.tokens.next,\"{\",state.tokens.next.value),state.tokens.next.inBracelessBlock=!0,indent+=state.option.indent,a=[statement()],indent-=state.option.indent,state.funct[\"(scope)\"].unstack(),delete state.funct[\"(noblockscopedvar)\"];else if(isfunc){if(state.funct[\"(scope)\"].stack(),m={},!stmt||isfatarrow||state.inMoz()||error(\"W118\",state.tokens.curr,\"function closure expressions\"),!stmt)for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);expression(10),state.option.strict&&state.funct[\"(context)\"][\"(global)\"]&&(m[\"use strict\"]||state.isStrict()||warning(\"E007\")),state.funct[\"(scope)\"].unstack()}else error(\"E021\",state.tokens.next,\"{\",state.tokens.next.value);switch(state.funct[\"(verb)\"]){case\"break\":case\"continue\":case\"return\":case\"throw\":if(iscase)break;default:state.funct[\"(verb)\"]=null}return inblock=b,!ordinary||!state.option.noempty||a&&0!==a.length||warning(\"W035\",state.tokens.prev),metrics.nestedBlockDepth-=1,a}function countMember(m){membersOnly&&\"boolean\"!=typeof membersOnly[m]&&warning(\"W036\",state.tokens.curr,m),\"number\"==typeof member[m]?member[m]+=1:member[m]=1}function comprehensiveArrayExpression(){var res={};res.exps=!0,state.funct[\"(comparray)\"].stack();var reversed=!1;return\"for\"!==state.tokens.next.value&&(reversed=!0,state.inMoz()||warning(\"W116\",state.tokens.next,\"for\",state.tokens.next.value),state.funct[\"(comparray)\"].setState(\"use\"),res.right=expression(10)),advance(\"for\"),\"each\"===state.tokens.next.value&&(advance(\"each\"),state.inMoz()||warning(\"W118\",state.tokens.curr,\"for each\")),advance(\"(\"),state.funct[\"(comparray)\"].setState(\"define\"),res.left=expression(130),_.contains([\"in\",\"of\"],state.tokens.next.value)?advance():error(\"E045\",state.tokens.curr),state.funct[\"(comparray)\"].setState(\"generate\"),expression(10),advance(\")\"),\"if\"===state.tokens.next.value&&(advance(\"if\"),advance(\"(\"),state.funct[\"(comparray)\"].setState(\"filter\"),res.filter=expression(10),advance(\")\")),reversed||(state.funct[\"(comparray)\"].setState(\"use\"),res.right=expression(10)),advance(\"]\"),state.funct[\"(comparray)\"].unstack(),res}function isMethod(){return state.funct[\"(statement)\"]&&\"class\"===state.funct[\"(statement)\"].type||state.funct[\"(context)\"]&&\"class\"===state.funct[\"(context)\"][\"(verb)\"]}function isPropertyName(token){return token.identifier||\"(string)\"===token.id||\"(number)\"===token.id}function propertyName(preserveOrToken){var id,preserve=!0;return\"object\"==typeof preserveOrToken?id=preserveOrToken:(preserve=preserveOrToken,id=optionalidentifier(!1,!0,preserve)),id?\"object\"==typeof id&&(\"(string)\"===id.id||\"(identifier)\"===id.id?id=id.value:\"(number)\"===id.id&&(id=\"\"+id.value)):\"(string)\"===state.tokens.next.id?(id=state.tokens.next.value,preserve||advance()):\"(number)\"===state.tokens.next.id&&(id=\"\"+state.tokens.next.value,preserve||advance()),\"hasOwnProperty\"===id&&warning(\"W001\"),id}function functionparams(options){function addParam(addParamArgs){state.funct[\"(scope)\"].addParam.apply(state.funct[\"(scope)\"],addParamArgs)}var next,ident,t,paramsIds=[],tokens=[],pastDefault=!1,pastRest=!1,arity=0,loneArg=options&&options.loneArg;if(loneArg&&loneArg.identifier===!0)return state.funct[\"(scope)\"].addParam(loneArg.value,loneArg),{arity:1,params:[loneArg.value]};if(next=state.tokens.next,options&&options.parsedOpening||advance(\"(\"),\")\"===state.tokens.next.id)return advance(\")\"),void 0;for(;;){arity++;var currentParams=[];if(_.contains([\"{\",\"[\"],state.tokens.next.id)){tokens=destructuringPattern();for(t in tokens)t=tokens[t],t.id&&(paramsIds.push(t.id),currentParams.push([t.id,t.token]))}else if(checkPunctuator(state.tokens.next,\"...\")&&(pastRest=!0),ident=identifier(!0))paramsIds.push(ident),currentParams.push([ident,state.tokens.curr]);else for(;!checkPunctuators(state.tokens.next,[\",\",\")\"]);)advance();if(pastDefault&&\"=\"!==state.tokens.next.id&&error(\"W138\",state.tokens.current),\"=\"===state.tokens.next.id&&(state.inES6()||warning(\"W119\",state.tokens.next,\"default parameters\",\"6\"),advance(\"=\"),pastDefault=!0,expression(10)),currentParams.forEach(addParam),\",\"!==state.tokens.next.id)return advance(\")\",next),{arity:arity,params:paramsIds};pastRest&&warning(\"W131\",state.tokens.next),comma()}}function functor(name,token,overwrites){var funct={\"(name)\":name,\"(breakage)\":0,\"(loopage)\":0,\"(tokens)\":{},\"(properties)\":{},\"(catch)\":!1,\"(global)\":!1,\"(line)\":null,\"(character)\":null,\"(metrics)\":null,\"(statement)\":null,\"(context)\":null,\"(scope)\":null,\"(comparray)\":null,\"(generator)\":null,\"(arrow)\":null,\"(params)\":null};return token&&_.extend(funct,{\"(line)\":token.line,\"(character)\":token.character,\"(metrics)\":createMetrics(token)}),_.extend(funct,overwrites),funct[\"(context)\"]&&(funct[\"(scope)\"]=funct[\"(context)\"][\"(scope)\"],funct[\"(comparray)\"]=funct[\"(context)\"][\"(comparray)\"]),funct}function isFunctor(token){return\"(scope)\"in token}function hasParsedCode(funct){return funct[\"(global)\"]&&!funct[\"(verb)\"]}function doTemplateLiteral(left){function end(){if(state.tokens.curr.template&&state.tokens.curr.tail&&state.tokens.curr.context===ctx)return!0;var complete=state.tokens.next.template&&state.tokens.next.tail&&state.tokens.next.context===ctx;return complete&&advance(),complete||state.tokens.next.isUnclosed}var ctx=this.context,noSubst=this.noSubst,depth=this.depth;if(!noSubst)for(;!end();)!state.tokens.next.template||state.tokens.next.depth>depth?expression(0):advance();return{id:\"(template)\",type:\"(template)\",tag:left}}function doFunction(options){var f,token,name,statement,classExprBinding,isGenerator,isArrow,ignoreLoopFunc,oldOption=state.option,oldIgnored=state.ignored;options&&(name=options.name,statement=options.statement,classExprBinding=options.classExprBinding,isGenerator=\"generator\"===options.type,isArrow=\"arrow\"===options.type,ignoreLoopFunc=options.ignoreLoopFunc),state.option=Object.create(state.option),state.ignored=Object.create(state.ignored),state.funct=functor(name||state.nameStack.infer(),state.tokens.next,{\"(statement)\":statement,\"(context)\":state.funct,\"(arrow)\":isArrow,\"(generator)\":isGenerator}),f=state.funct,token=state.tokens.curr,token.funct=state.funct,functions.push(state.funct),state.funct[\"(scope)\"].stack(\"functionouter\");var internallyAccessibleName=name||classExprBinding;internallyAccessibleName&&state.funct[\"(scope)\"].block.add(internallyAccessibleName,classExprBinding?\"class\":\"function\",state.tokens.curr,!1),state.funct[\"(scope)\"].stack(\"functionparams\");var paramsInfo=functionparams(options);return paramsInfo?(state.funct[\"(params)\"]=paramsInfo.params,state.funct[\"(metrics)\"].arity=paramsInfo.arity,state.funct[\"(metrics)\"].verifyMaxParametersPerFunction()):state.funct[\"(metrics)\"].arity=0,isArrow&&(state.inES6(!0)||warning(\"W119\",state.tokens.curr,\"arrow function syntax (=>)\",\"6\"),options.loneArg||advance(\"=>\")),block(!1,!0,!0,isArrow),!state.option.noyield&&isGenerator&&\"yielded\"!==state.funct[\"(generator)\"]&&warning(\"W124\",state.tokens.curr),state.funct[\"(metrics)\"].verifyMaxStatementsPerFunction(),state.funct[\"(metrics)\"].verifyMaxComplexityPerFunction(),state.funct[\"(unusedOption)\"]=state.option.unused,state.option=oldOption,state.ignored=oldIgnored,state.funct[\"(last)\"]=state.tokens.curr.line,state.funct[\"(lastcharacter)\"]=state.tokens.curr.character,state.funct[\"(scope)\"].unstack(),state.funct[\"(scope)\"].unstack(),state.funct=state.funct[\"(context)\"],ignoreLoopFunc||state.option.loopfunc||!state.funct[\"(loopage)\"]||f[\"(isCapturing)\"]&&warning(\"W083\",token),f}function createMetrics(functionStartToken){return{statementCount:0,nestedBlockDepth:-1,ComplexityCount:1,arity:0,verifyMaxStatementsPerFunction:function(){state.option.maxstatements&&this.statementCount>state.option.maxstatements&&warning(\"W071\",functionStartToken,this.statementCount)\n},verifyMaxParametersPerFunction:function(){_.isNumber(state.option.maxparams)&&this.arity>state.option.maxparams&&warning(\"W072\",functionStartToken,this.arity)},verifyMaxNestedBlockDepthPerFunction:function(){state.option.maxdepth&&this.nestedBlockDepth>0&&this.nestedBlockDepth===state.option.maxdepth+1&&warning(\"W073\",null,this.nestedBlockDepth)},verifyMaxComplexityPerFunction:function(){var max=state.option.maxcomplexity,cc=this.ComplexityCount;max&&cc>max&&warning(\"W074\",functionStartToken,cc)}}}function increaseComplexityCount(){state.funct[\"(metrics)\"].ComplexityCount+=1}function checkCondAssignment(expr){var id,paren;switch(expr&&(id=expr.id,paren=expr.paren,\",\"===id&&(expr=expr.exprs[expr.exprs.length-1])&&(id=expr.id,paren=paren||expr.paren)),id){case\"=\":case\"+=\":case\"-=\":case\"*=\":case\"%=\":case\"&=\":case\"|=\":case\"^=\":case\"/=\":paren||state.option.boss||warning(\"W084\")}}function checkProperties(props){if(state.inES5())for(var name in props)props[name]&&props[name].setterToken&&!props[name].getterToken&&warning(\"W078\",props[name].setterToken)}function metaProperty(name,c){if(checkPunctuator(state.tokens.next,\".\")){var left=state.tokens.curr.id;advance(\".\");var id=identifier();return state.tokens.curr.isMetaProperty=!0,name!==id?error(\"E057\",state.tokens.prev,left,id):c(),state.tokens.curr}}function destructuringPattern(options){var isAssignment=options&&options.assignment;return state.inES6()||warning(\"W104\",state.tokens.curr,isAssignment?\"destructuring assignment\":\"destructuring binding\",\"6\"),destructuringPatternRecursive(options)}function destructuringPatternRecursive(options){var ids,identifiers=[],openingParsed=options&&options.openingParsed,isAssignment=options&&options.assignment,recursiveOptions=isAssignment?{assignment:isAssignment}:null,firstToken=openingParsed?state.tokens.curr:state.tokens.next,nextInnerDE=function(){var ident;if(checkPunctuators(state.tokens.next,[\"[\",\"{\"])){ids=destructuringPatternRecursive(recursiveOptions);for(var id in ids)id=ids[id],identifiers.push({id:id.id,token:id.token})}else if(checkPunctuator(state.tokens.next,\",\"))identifiers.push({id:null,token:state.tokens.curr});else{if(!checkPunctuator(state.tokens.next,\"(\")){var is_rest=checkPunctuator(state.tokens.next,\"...\");if(isAssignment){var identifierToken=is_rest?peek(0):state.tokens.next;identifierToken.identifier||warning(\"E030\",identifierToken,identifierToken.value);var assignTarget=expression(155);assignTarget&&(checkLeftSideAssign(assignTarget),assignTarget.identifier&&(ident=assignTarget.value))}else ident=identifier();return ident&&identifiers.push({id:ident,token:state.tokens.curr}),is_rest}advance(\"(\"),nextInnerDE(),advance(\")\")}return!1},assignmentProperty=function(){var id;checkPunctuator(state.tokens.next,\"[\")?(advance(\"[\"),expression(10),advance(\"]\"),advance(\":\"),nextInnerDE()):\"(string)\"===state.tokens.next.id||\"(number)\"===state.tokens.next.id?(advance(),advance(\":\"),nextInnerDE()):(id=identifier(),checkPunctuator(state.tokens.next,\":\")?(advance(\":\"),nextInnerDE()):id&&(isAssignment&&checkLeftSideAssign(state.tokens.curr),identifiers.push({id:id,token:state.tokens.curr})))};if(checkPunctuator(firstToken,\"[\")){openingParsed||advance(\"[\"),checkPunctuator(state.tokens.next,\"]\")&&warning(\"W137\",state.tokens.curr);for(var element_after_rest=!1;!checkPunctuator(state.tokens.next,\"]\");)nextInnerDE()&&!element_after_rest&&checkPunctuator(state.tokens.next,\",\")&&(warning(\"W130\",state.tokens.next),element_after_rest=!0),checkPunctuator(state.tokens.next,\"=\")&&(checkPunctuator(state.tokens.prev,\"...\")?advance(\"]\"):advance(\"=\"),\"undefined\"===state.tokens.next.id&&warning(\"W080\",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,\"]\")||advance(\",\");advance(\"]\")}else if(checkPunctuator(firstToken,\"{\")){for(openingParsed||advance(\"{\"),checkPunctuator(state.tokens.next,\"}\")&&warning(\"W137\",state.tokens.curr);!checkPunctuator(state.tokens.next,\"}\")&&(assignmentProperty(),checkPunctuator(state.tokens.next,\"=\")&&(advance(\"=\"),\"undefined\"===state.tokens.next.id&&warning(\"W080\",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,\"}\")||(advance(\",\"),!checkPunctuator(state.tokens.next,\"}\"))););advance(\"}\")}return identifiers}function destructuringPatternMatch(tokens,value){var first=value.first;first&&_.zip(tokens,Array.isArray(first)?first:[first]).forEach(function(val){var token=val[0],value=val[1];token&&value?token.first=value:token&&token.first&&!value&&warning(\"W080\",token.first,token.first.value)})}function blockVariableStatement(type,statement,context){var tokens,lone,value,letblock,prefix=context&&context.prefix,inexport=context&&context.inexport,isLet=\"let\"===type,isConst=\"const\"===type;for(state.inES6()||warning(\"W104\",state.tokens.curr,type,\"6\"),isLet&&\"(\"===state.tokens.next.value?(state.inMoz()||warning(\"W118\",state.tokens.next,\"let block\"),advance(\"(\"),state.funct[\"(scope)\"].stack(),letblock=!0):state.funct[\"(noblockscopedvar)\"]&&error(\"E048\",state.tokens.curr,isConst?\"Const\":\"Let\"),statement.first=[];;){var names=[];_.contains([\"{\",\"[\"],state.tokens.next.value)?(tokens=destructuringPattern(),lone=!1):(tokens=[{id:identifier(),token:state.tokens.curr}],lone=!0),!prefix&&isConst&&\"=\"!==state.tokens.next.id&&warning(\"E012\",state.tokens.curr,state.tokens.curr.value);for(var t in tokens)tokens.hasOwnProperty(t)&&(t=tokens[t],state.funct[\"(scope)\"].block.isGlobal()&&predefined[t.id]===!1&&warning(\"W079\",t.token,t.id),t.id&&!state.funct[\"(noblockscopedvar)\"]&&(state.funct[\"(scope)\"].addlabel(t.id,{type:type,token:t.token}),names.push(t.token),lone&&inexport&&state.funct[\"(scope)\"].setExported(t.token.value,t.token)));if(\"=\"===state.tokens.next.id&&(advance(\"=\"),prefix||\"undefined\"!==state.tokens.next.id||warning(\"W080\",state.tokens.prev,state.tokens.prev.value),!prefix&&\"=\"===peek(0).id&&state.tokens.next.identifier&&warning(\"W120\",state.tokens.next,state.tokens.next.value),value=expression(prefix?120:10),lone?tokens[0].first=value:destructuringPatternMatch(names,value)),statement.first=statement.first.concat(names),\",\"!==state.tokens.next.id)break;comma()}return letblock&&(advance(\")\"),block(!0,!0),statement.block=!0,state.funct[\"(scope)\"].unstack()),statement}function classdef(isStatement){return state.inES6()||warning(\"W104\",state.tokens.curr,\"class\",\"6\"),isStatement?(this.name=identifier(),state.funct[\"(scope)\"].addlabel(this.name,{type:\"class\",token:state.tokens.curr})):state.tokens.next.identifier&&\"extends\"!==state.tokens.next.value?(this.name=identifier(),this.namedExpr=!0):this.name=state.nameStack.infer(),classtail(this),this}function classtail(c){var wasInClassBody=state.inClassBody;\"extends\"===state.tokens.next.value&&(advance(\"extends\"),c.heritage=expression(10)),state.inClassBody=!0,advance(\"{\"),c.body=classbody(c),advance(\"}\"),state.inClassBody=wasInClassBody}function classbody(c){for(var name,isStatic,isGenerator,getset,computed,props=Object.create(null),staticProps=Object.create(null),i=0;\"}\"!==state.tokens.next.id;++i)if(name=state.tokens.next,isStatic=!1,isGenerator=!1,getset=null,\";\"!==name.id){if(\"*\"===name.id&&(isGenerator=!0,advance(\"*\"),name=state.tokens.next),\"[\"===name.id)name=computedPropertyName(),computed=!0;else{if(!isPropertyName(name)){warning(\"W052\",state.tokens.next,state.tokens.next.value||state.tokens.next.type),advance();continue}advance(),computed=!1,name.identifier&&\"static\"===name.value&&(checkPunctuator(state.tokens.next,\"*\")&&(isGenerator=!0,advance(\"*\")),(isPropertyName(state.tokens.next)||\"[\"===state.tokens.next.id)&&(computed=\"[\"===state.tokens.next.id,isStatic=!0,name=state.tokens.next,\"[\"===state.tokens.next.id?name=computedPropertyName():advance())),!name.identifier||\"get\"!==name.value&&\"set\"!==name.value||(isPropertyName(state.tokens.next)||\"[\"===state.tokens.next.id)&&(computed=\"[\"===state.tokens.next.id,getset=name,name=state.tokens.next,\"[\"===state.tokens.next.id?name=computedPropertyName():advance())}if(!checkPunctuator(state.tokens.next,\"(\")){for(error(\"E054\",state.tokens.next,state.tokens.next.value);\"}\"!==state.tokens.next.id&&!checkPunctuator(state.tokens.next,\"(\");)advance();\"(\"!==state.tokens.next.value&&doFunction({statement:c})}if(computed||(getset?saveAccessor(getset.value,isStatic?staticProps:props,name.value,name,!0,isStatic):(\"constructor\"===name.value?state.nameStack.set(c):state.nameStack.set(name),saveProperty(isStatic?staticProps:props,name.value,name,!0,isStatic))),getset&&\"constructor\"===name.value){var propDesc=\"get\"===getset.value?\"class getter method\":\"class setter method\";error(\"E049\",name,propDesc,\"constructor\")}else\"prototype\"===name.value&&error(\"E049\",name,\"class method\",\"prototype\");propertyName(name),doFunction({statement:c,type:isGenerator?\"generator\":null,classExprBinding:c.namedExpr?c.name:null})}else warning(\"W032\"),advance(\";\");checkProperties(props)}function saveProperty(props,name,tkn,isClass,isStatic){var msg=[\"key\",\"class method\",\"static class method\"];msg=msg[(isClass||!1)+(isStatic||!1)],tkn.identifier&&(name=tkn.value),props[name]&&\"__proto__\"!==name?warning(\"W075\",state.tokens.next,msg,name):props[name]=Object.create(null),props[name].basic=!0,props[name].basictkn=tkn}function saveAccessor(accessorType,props,name,tkn,isClass,isStatic){var flagName=\"get\"===accessorType?\"getterToken\":\"setterToken\",msg=\"\";isClass?(isStatic&&(msg+=\"static \"),msg+=accessorType+\"ter method\"):msg=\"key\",state.tokens.curr.accessorType=accessorType,state.nameStack.set(tkn),props[name]?(props[name].basic||props[name][flagName])&&\"__proto__\"!==name&&warning(\"W075\",state.tokens.next,msg,name):props[name]=Object.create(null),props[name][flagName]=tkn}function computedPropertyName(){advance(\"[\"),state.inES6()||warning(\"W119\",state.tokens.curr,\"computed property names\",\"6\");var value=expression(10);return advance(\"]\"),value}function checkPunctuators(token,values){return\"(punctuator)\"===token.type?_.contains(values,token.value):!1}function checkPunctuator(token,value){return\"(punctuator)\"===token.type&&token.value===value}function destructuringAssignOrJsonValue(){var block=lookupBlockType();block.notJson?(!state.inES6()&&block.isDestAssign&&warning(\"W104\",state.tokens.curr,\"destructuring assignment\",\"6\"),statements()):(state.option.laxbreak=!0,state.jsonMode=!0,jsonValue())}function jsonValue(){function jsonObject(){var o={},t=state.tokens.next;if(advance(\"{\"),\"}\"!==state.tokens.next.id)for(;;){if(\"(end)\"===state.tokens.next.id)error(\"E026\",state.tokens.next,t.line);else{if(\"}\"===state.tokens.next.id){warning(\"W094\",state.tokens.curr);break}\",\"===state.tokens.next.id?error(\"E028\",state.tokens.next):\"(string)\"!==state.tokens.next.id&&warning(\"W095\",state.tokens.next,state.tokens.next.value)}if(o[state.tokens.next.value]===!0?warning(\"W075\",state.tokens.next,\"key\",state.tokens.next.value):\"__proto__\"===state.tokens.next.value&&!state.option.proto||\"__iterator__\"===state.tokens.next.value&&!state.option.iterator?warning(\"W096\",state.tokens.next,state.tokens.next.value):o[state.tokens.next.value]=!0,advance(),advance(\":\"),jsonValue(),\",\"!==state.tokens.next.id)break;advance(\",\")}advance(\"}\")}function jsonArray(){var t=state.tokens.next;if(advance(\"[\"),\"]\"!==state.tokens.next.id)for(;;){if(\"(end)\"===state.tokens.next.id)error(\"E027\",state.tokens.next,t.line);else{if(\"]\"===state.tokens.next.id){warning(\"W094\",state.tokens.curr);break}\",\"===state.tokens.next.id&&error(\"E028\",state.tokens.next)}if(jsonValue(),\",\"!==state.tokens.next.id)break;advance(\",\")}advance(\"]\")}switch(state.tokens.next.id){case\"{\":jsonObject();break;case\"[\":jsonArray();break;case\"true\":case\"false\":case\"null\":case\"(number)\":case\"(string)\":advance();break;case\"-\":advance(\"-\"),advance(\"(number)\");break;default:error(\"E003\",state.tokens.next)}}var api,declared,functions,inblock,indent,lookahead,lex,member,membersOnly,predefined,stack,urls,bang={\"<\":!0,\"<=\":!0,\"==\":!0,\"===\":!0,\"!==\":!0,\"!=\":!0,\">\":!0,\">=\":!0,\"+\":!0,\"-\":!0,\"*\":!0,\"/\":!0,\"%\":!0},functionicity=[\"closure\",\"exception\",\"global\",\"label\",\"outer\",\"unused\",\"var\"],extraModules=[],emitter=new events.EventEmitter,typeofValues={};typeofValues.legacy=[\"xml\",\"unknown\"],typeofValues.es3=[\"undefined\",\"boolean\",\"number\",\"string\",\"function\",\"object\"],typeofValues.es3=typeofValues.es3.concat(typeofValues.legacy),typeofValues.es6=typeofValues.es3.concat(\"symbol\"),type(\"(number)\",function(){return this}),type(\"(string)\",function(){return this}),state.syntax[\"(identifier)\"]={type:\"(identifier)\",lbp:0,identifier:!0,nud:function(){var v=this.value;return\"=>\"===state.tokens.next.id?this:(state.funct[\"(comparray)\"].check(v)||state.funct[\"(scope)\"].block.use(v,state.tokens.curr),this)},led:function(){error(\"E033\",state.tokens.next,state.tokens.next.value)}};var baseTemplateSyntax={lbp:0,identifier:!1,template:!0};state.syntax[\"(template)\"]=_.extend({type:\"(template)\",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!1},baseTemplateSyntax),state.syntax[\"(template middle)\"]=_.extend({type:\"(template middle)\",middle:!0,noSubst:!1},baseTemplateSyntax),state.syntax[\"(template tail)\"]=_.extend({type:\"(template tail)\",tail:!0,noSubst:!1},baseTemplateSyntax),state.syntax[\"(no subst template)\"]=_.extend({type:\"(template)\",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!0,tail:!0},baseTemplateSyntax),type(\"(regexp)\",function(){return this}),delim(\"(endline)\"),delim(\"(begin)\"),delim(\"(end)\").reach=!0,delim(\"(error)\").reach=!0,delim(\"}\").reach=!0,delim(\")\"),delim(\"]\"),delim('\"').reach=!0,delim(\"'\").reach=!0,delim(\";\"),delim(\":\").reach=!0,delim(\"#\"),reserve(\"else\"),reserve(\"case\").reach=!0,reserve(\"catch\"),reserve(\"default\").reach=!0,reserve(\"finally\"),reservevar(\"arguments\",function(x){state.isStrict()&&state.funct[\"(global)\"]&&warning(\"E008\",x)}),reservevar(\"eval\"),reservevar(\"false\"),reservevar(\"Infinity\"),reservevar(\"null\"),reservevar(\"this\",function(x){state.isStrict()&&!isMethod()&&!state.option.validthis&&(state.funct[\"(statement)\"]&&state.funct[\"(name)\"].charAt(0)>\"Z\"||state.funct[\"(global)\"])&&warning(\"W040\",x)}),reservevar(\"true\"),reservevar(\"undefined\"),assignop(\"=\",\"assign\",20),assignop(\"+=\",\"assignadd\",20),assignop(\"-=\",\"assignsub\",20),assignop(\"*=\",\"assignmult\",20),assignop(\"/=\",\"assigndiv\",20).nud=function(){error(\"E014\")},assignop(\"%=\",\"assignmod\",20),bitwiseassignop(\"&=\"),bitwiseassignop(\"|=\"),bitwiseassignop(\"^=\"),bitwiseassignop(\"<<=\"),bitwiseassignop(\">>=\"),bitwiseassignop(\">>>=\"),infix(\",\",function(left,that){var expr;if(that.exprs=[left],state.option.nocomma&&warning(\"W127\"),!comma({peek:!0}))return that;for(;;){if(!(expr=expression(10)))break;if(that.exprs.push(expr),\",\"!==state.tokens.next.value||!comma())break}return that},10,!0),infix(\"?\",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(10),advance(\":\"),that[\"else\"]=expression(10),that},30);var orPrecendence=40;infix(\"||\",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(orPrecendence),that},orPrecendence),infix(\"&&\",\"and\",50),bitwise(\"|\",\"bitor\",70),bitwise(\"^\",\"bitxor\",80),bitwise(\"&\",\"bitand\",90),relation(\"==\",function(left,right){var eqnull=state.option.eqnull&&(\"null\"===(left&&left.value)||\"null\"===(right&&right.value));switch(!0){case!eqnull&&state.option.eqeqeq:this.from=this.character,warning(\"W116\",this,\"===\",\"==\");break;case isPoorRelation(left):warning(\"W041\",this,\"===\",left.value);break;case isPoorRelation(right):warning(\"W041\",this,\"===\",right.value);break;case isTypoTypeof(right,left,state):warning(\"W122\",this,right.value);break;case isTypoTypeof(left,right,state):warning(\"W122\",this,left.value)}return this}),relation(\"===\",function(left,right){return isTypoTypeof(right,left,state)?warning(\"W122\",this,right.value):isTypoTypeof(left,right,state)&&warning(\"W122\",this,left.value),this}),relation(\"!=\",function(left,right){var eqnull=state.option.eqnull&&(\"null\"===(left&&left.value)||\"null\"===(right&&right.value));return!eqnull&&state.option.eqeqeq?(this.from=this.character,warning(\"W116\",this,\"!==\",\"!=\")):isPoorRelation(left)?warning(\"W041\",this,\"!==\",left.value):isPoorRelation(right)?warning(\"W041\",this,\"!==\",right.value):isTypoTypeof(right,left,state)?warning(\"W122\",this,right.value):isTypoTypeof(left,right,state)&&warning(\"W122\",this,left.value),this}),relation(\"!==\",function(left,right){return isTypoTypeof(right,left,state)?warning(\"W122\",this,right.value):isTypoTypeof(left,right,state)&&warning(\"W122\",this,left.value),this}),relation(\"<\"),relation(\">\"),relation(\"<=\"),relation(\">=\"),bitwise(\"<<\",\"shiftleft\",120),bitwise(\">>\",\"shiftright\",120),bitwise(\">>>\",\"shiftrightunsigned\",120),infix(\"in\",\"in\",120),infix(\"instanceof\",\"instanceof\",120),infix(\"+\",function(left,that){var right;return that.left=left,that.right=right=expression(130),left&&right&&\"(string)\"===left.id&&\"(string)\"===right.id?(left.value+=right.value,left.character=right.character,!state.option.scripturl&®.javascriptURL.test(left.value)&&warning(\"W050\",left),left):that},130),prefix(\"+\",\"num\"),prefix(\"+++\",function(){return warning(\"W007\"),this.arity=\"unary\",this.right=expression(150),this}),infix(\"+++\",function(left){return warning(\"W007\"),this.left=left,this.right=expression(130),this},130),infix(\"-\",\"sub\",130),prefix(\"-\",\"neg\"),prefix(\"---\",function(){return warning(\"W006\"),this.arity=\"unary\",this.right=expression(150),this}),infix(\"---\",function(left){return warning(\"W006\"),this.left=left,this.right=expression(130),this},130),infix(\"*\",\"mult\",140),infix(\"/\",\"div\",140),infix(\"%\",\"mod\",140),suffix(\"++\"),prefix(\"++\",\"preinc\"),state.syntax[\"++\"].exps=!0,suffix(\"--\"),prefix(\"--\",\"predec\"),state.syntax[\"--\"].exps=!0,prefix(\"delete\",function(){var p=expression(10);return p?(\".\"!==p.id&&\"[\"!==p.id&&warning(\"W051\"),this.first=p,p.identifier&&!state.isStrict()&&(p.forgiveUndef=!0),this):this}).exps=!0,prefix(\"~\",function(){return state.option.bitwise&&warning(\"W016\",this,\"~\"),this.arity=\"unary\",this.right=expression(150),this}),prefix(\"...\",function(){return state.inES6(!0)||warning(\"W119\",this,\"spread/rest operator\",\"6\"),state.tokens.next.identifier||\"(string)\"===state.tokens.next.type||checkPunctuators(state.tokens.next,[\"[\",\"(\"])||error(\"E030\",state.tokens.next,state.tokens.next.value),expression(150),this}),prefix(\"!\",function(){return this.arity=\"unary\",this.right=expression(150),this.right||quit(\"E041\",this.line||0),bang[this.right.id]===!0&&warning(\"W018\",this,\"!\"),this}),prefix(\"typeof\",function(){var p=expression(150);return this.first=this.right=p,p||quit(\"E041\",this.line||0,this.character||0),p.identifier&&(p.forgiveUndef=!0),this}),prefix(\"new\",function(){var mp=metaProperty(\"target\",function(){state.inES6(!0)||warning(\"W119\",state.tokens.prev,\"new.target\",\"6\");for(var inFunction,c=state.funct;c&&(inFunction=!c[\"(global)\"],c[\"(arrow)\"]);)c=c[\"(context)\"];inFunction||warning(\"W136\",state.tokens.prev,\"new.target\")});if(mp)return mp;var i,c=expression(155);if(c&&\"function\"!==c.id)if(c.identifier)switch(c[\"new\"]=!0,c.value){case\"Number\":case\"String\":case\"Boolean\":case\"Math\":case\"JSON\":warning(\"W053\",state.tokens.prev,c.value);break;case\"Symbol\":state.inES6()&&warning(\"W053\",state.tokens.prev,c.value);break;case\"Function\":state.option.evil||warning(\"W054\");break;case\"Date\":case\"RegExp\":case\"this\":break;default:\"function\"!==c.id&&(i=c.value.substr(0,1),state.option.newcap&&(\"A\">i||i>\"Z\")&&!state.funct[\"(scope)\"].isPredefined(c.value)&&warning(\"W055\",state.tokens.curr))}else\".\"!==c.id&&\"[\"!==c.id&&\"(\"!==c.id&&warning(\"W056\",state.tokens.curr);else state.option.supernew||warning(\"W057\",this);return\"(\"===state.tokens.next.id||state.option.supernew||warning(\"W058\",state.tokens.curr,state.tokens.curr.value),this.first=this.right=c,this}),state.syntax[\"new\"].exps=!0,prefix(\"void\").exps=!0,infix(\".\",function(left,that){var m=identifier(!1,!0);return\"string\"==typeof m&&countMember(m),that.left=left,that.right=m,m&&\"hasOwnProperty\"===m&&\"=\"===state.tokens.next.value&&warning(\"W001\"),!left||\"arguments\"!==left.value||\"callee\"!==m&&\"caller\"!==m?state.option.evil||!left||\"document\"!==left.value||\"write\"!==m&&\"writeln\"!==m||warning(\"W060\",left):state.option.noarg?warning(\"W059\",left,m):state.isStrict()&&error(\"E008\"),state.option.evil||\"eval\"!==m&&\"execScript\"!==m||isGlobalEval(left,state)&&warning(\"W061\"),that},160,!0),infix(\"(\",function(left,that){state.option.immed&&left&&!left.immed&&\"function\"===left.id&&warning(\"W062\");var n=0,p=[];if(left&&\"(identifier)\"===left.type&&left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&-1===\"Array Number String Boolean Date Object Error Symbol\".indexOf(left.value)&&(\"Math\"===left.value?warning(\"W063\",left):state.option.newcap&&warning(\"W064\",left)),\")\"!==state.tokens.next.id)for(;p[p.length]=expression(10),n+=1,\",\"===state.tokens.next.id;)comma();return advance(\")\"),\"object\"==typeof left&&(state.inES5()||\"parseInt\"!==left.value||1!==n||warning(\"W065\",state.tokens.curr),state.option.evil||(\"eval\"===left.value||\"Function\"===left.value||\"execScript\"===left.value?(warning(\"W061\",left),p[0]&&\"(string)\"===[0].id&&addInternalSrc(left,p[0].value)):!p[0]||\"(string)\"!==p[0].id||\"setTimeout\"!==left.value&&\"setInterval\"!==left.value?!p[0]||\"(string)\"!==p[0].id||\".\"!==left.value||\"window\"!==left.left.value||\"setTimeout\"!==left.right&&\"setInterval\"!==left.right||(warning(\"W066\",left),addInternalSrc(left,p[0].value)):(warning(\"W066\",left),addInternalSrc(left,p[0].value))),left.identifier||\".\"===left.id||\"[\"===left.id||\"=>\"===left.id||\"(\"===left.id||\"&&\"===left.id||\"||\"===left.id||\"?\"===left.id||state.inES6()&&left[\"(name)\"]||warning(\"W067\",that)),that.left=left,that},155,!0).exps=!0,prefix(\"(\",function(){var pn1,ret,triggerFnExpr,first,last,pn=state.tokens.next,i=-1,parens=1,opening=state.tokens.curr,preceeding=state.tokens.prev,isNecessary=!state.option.singleGroups;do\"(\"===pn.value?parens+=1:\")\"===pn.value&&(parens-=1),i+=1,pn1=pn,pn=peek(i);while((0!==parens||\")\"!==pn1.value)&&\";\"!==pn.value&&\"(end)\"!==pn.type);if(\"function\"===state.tokens.next.id&&(triggerFnExpr=state.tokens.next.immed=!0),\"=>\"===pn.value)return doFunction({type:\"arrow\",parsedOpening:!0});var exprs=[];if(\")\"!==state.tokens.next.id)for(;exprs.push(expression(10)),\",\"===state.tokens.next.id;)state.option.nocomma&&warning(\"W127\"),comma();return advance(\")\",this),state.option.immed&&exprs[0]&&\"function\"===exprs[0].id&&\"(\"!==state.tokens.next.id&&\".\"!==state.tokens.next.id&&\"[\"!==state.tokens.next.id&&warning(\"W068\",this),exprs.length?(exprs.length>1?(ret=Object.create(state.syntax[\",\"]),ret.exprs=exprs,first=exprs[0],last=exprs[exprs.length-1],isNecessary||(isNecessary=preceeding.assign||preceeding.delim)):(ret=first=last=exprs[0],isNecessary||(isNecessary=opening.beginsStmt&&(\"{\"===ret.id||triggerFnExpr||isFunctor(ret))||triggerFnExpr&&(!isEndOfExpr()||\"}\"!==state.tokens.prev.id)||isFunctor(ret)&&!isEndOfExpr()||\"{\"===ret.id&&\"=>\"===preceeding.id||\"(number)\"===ret.type&&checkPunctuator(pn,\".\")&&/^\\d+$/.test(ret.value))),ret&&(!isNecessary&&(first.left||first.right||ret.exprs)&&(isNecessary=!isBeginOfExpr(preceeding)&&first.lbp<=preceeding.lbp||!isEndOfExpr()&&last.lbp
" +
+ "You gained:
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.hackingExpGained, 3) + " hacking exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.strExpGained, 3) + " str exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.defExpGained, 3) + " def exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.dexExpGained, 3) + " dex exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.agiExpGained, 3) + " agi exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.chaExpGained, 3) + " cha exp
");
+ return;
+ }
+ var facValue = totalValue * _src_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].faction_rep_mult *
+ _src_Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].InfiltrationRepValue * _src_BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].InfiltrationRep;
+ var moneyValue = totalValue * _src_Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].InfiltrationMoneyValue * _src_BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].InfiltrationMoney;
+ infiltrationSetText("You can sell the classified documents and secrets " +
+ "you stole from " + inst.companyName + " for $" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(moneyValue, 2) + " on the black market or you can give it " +
+ "to a faction to gain " + Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(facValue, 3) + " reputation with " +
+ "that faction.");
+ var selector = document.getElementById("infiltration-faction-select");
+ selector.innerHTML = "";
+ for (var i = 0; i < _src_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].factions.length; ++i) {
+ selector.innerHTML += "";
+ }
+
+ var sellButton = Object(_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-box-sell");
+ setTimeout(function() {
+ sellButton.addEventListener("click", function() {
+ _src_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].gainMoney(moneyValue);
+ Object(_DialogBox_js__WEBPACK_IMPORTED_MODULE_4__["dialogBoxCreate"])("You sold the classified information you stole from " + inst.companyName +
+ " for $" + moneyValue + " on the black market!
" +
+ "You gained:
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.hackingExpGained, 3) + " hacking exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.strExpGained, 3) + " str exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.defExpGained, 3) + " def exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.dexExpGained, 3) + " dex exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.agiExpGained, 3) + " agi exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.chaExpGained, 3) + " cha exp
");
+ infiltrationBoxClose();
+ return false;
+ });
+ }, 750);
+
+ var factionButton = Object(_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-box-faction");
+ setTimeout(function() {
+ factionButton.addEventListener("click", function() {
+ var facName = selector.options[selector.selectedIndex].value;
+ var faction = _src_Faction_js__WEBPACK_IMPORTED_MODULE_2__["Factions"][facName];
+ if (faction == null) {
+ Object(_DialogBox_js__WEBPACK_IMPORTED_MODULE_4__["dialogBoxCreate"])("Error finding faction. This is a bug please report to developer");
+ return false;
+ }
+ faction.playerReputation += facValue;
+ Object(_DialogBox_js__WEBPACK_IMPORTED_MODULE_4__["dialogBoxCreate"])("You gave the classified information you stole from " + inst.companyName +
+ " to " + facName + " and gained " + Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(facValue, 3) + " reputation with the faction.
" +
+ "You gained:
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.hackingExpGained, 3) + " hacking exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.strExpGained, 3) + " str exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.defExpGained, 3) + " def exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.dexExpGained, 3) + " dex exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.agiExpGained, 3) + " agi exp
" +
+ Object(_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_6__["formatNumber"])(inst.chaExpGained, 3) + " cha exp
");
+ infiltrationBoxClose();
+ return false;
+ });
+ }, 750);
+ infiltrationBoxOpen();
+}
+
+
+
+
+/***/ }),
+/* 116 */
+/*!*****************************!*\
+ !*** ./src/Infiltration.js ***!
+ \*****************************/
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "beginInfiltration", function() { return beginInfiltration; });
+/* harmony import */ var _BitNode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BitNode.js */ 15);
+/* harmony import */ var _Constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Constants.js */ 3);
+/* harmony import */ var _engine_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./engine.js */ 5);
+/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Player.js */ 0);
+/* harmony import */ var _utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/DialogBox.js */ 6);
+/* harmony import */ var _utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/HelperFunctions.js */ 1);
+/* harmony import */ var _utils_InfiltrationBox_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/InfiltrationBox.js */ 115);
+/* harmony import */ var _utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/StringHelperFunctions.js */ 2);
+
+
+
+
+
+
+
+
+
+/* Infiltration.js
+ *
+ * Kill
+ * Knockout (nonlethal)
+ * Stealth Knockout (nonlethal)
+ * Assassinate
+ *
+ * Hack Security
+ * Destroy Security
+ * Sneak past Security
+ *
+ * Pick the locked door
+ *
+ * Bribe security
+ *
+ * Escape
+ */
+
+let InfiltrationScenarios = {
+ Guards: "You see an armed security guard patrolling the area.",
+ TechOnly: "The area is equipped with a state-of-the-art security system: cameras, laser tripwires, and sentry turrets.",
+ TechOrLockedDoor: "The area is equipped with a state-of-the-art security system. There is a locked door on the side of the " +
+ "room that can be used to bypass security.",
+ Bots: "You see a few security bots patrolling the area.",
+}
+
+function InfiltrationInstance(companyName, startLevel, val, maxClearance, diff) {
+ this.companyName = companyName;
+ this.clearanceLevel = 0;
+ this.maxClearanceLevel = maxClearance;
+ this.securityLevel = startLevel;
+ this.difficulty = diff; //Affects how much security level increases. Represents a percentage
+ this.baseValue = val; //Base value of company secrets
+ this.secretsStolen = []; //Numbers representing value of stolen secrets
+
+ this.hackingExpGained = 0;
+ this.strExpGained = 0;
+ this.defExpGained = 0;
+ this.dexExpGained = 0;
+ this.agiExpGained = 0;
+ this.chaExpGained = 0;
+ this.intExpGained = 0;
+}
+
+InfiltrationInstance.prototype.gainHackingExp = function(amt) {
+ if (isNaN(amt)) {return;}
+ this.hackingExpGained += amt;
+}
+
+InfiltrationInstance.prototype.gainStrengthExp = function(amt) {
+ if (isNaN(amt)) {return;}
+ this.strExpGained += amt;
+}
+
+InfiltrationInstance.prototype.gainDefenseExp = function(amt) {
+ if (isNaN(amt)) {return;}
+ this.defExpGained += amt;
+}
+
+InfiltrationInstance.prototype.gainDexterityExp = function(amt) {
+ if (isNaN(amt)) {return;}
+ this.dexExpGained += amt;
+}
+
+InfiltrationInstance.prototype.gainAgilityExp = function(amt) {
+ if (isNaN(amt)) {return;}
+ this.agiExpGained += amt;
+}
+
+InfiltrationInstance.prototype.gainCharismaExp = function(amt) {
+ if (isNaN(amt)) {return;}
+ this.chaExpGained += amt;
+}
+
+InfiltrationInstance.prototype.gainIntelligenceExp = function(amt) {
+ if (isNaN(amt)) {return;}
+ this.intExpGained += amt;
+}
+
+function beginInfiltration(companyName, startLevel, val, maxClearance, diff) {
+ var inst = new InfiltrationInstance(companyName, startLevel, val, maxClearance, diff);
+ clearInfiltrationStatusText();
+ nextInfiltrationLevel(inst);
+}
+
+function endInfiltration(inst, success) {
+ if (success) {Object(_utils_InfiltrationBox_js__WEBPACK_IMPORTED_MODULE_6__["infiltrationBoxCreate"])(inst);}
+
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-kill");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-knockout");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-stealthknockout");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-assassinate");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-hacksecurity");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-destroysecurity");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-sneak");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-pickdoor");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-bribe");
+ Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-escape");
+
+ _engine_js__WEBPACK_IMPORTED_MODULE_2__["Engine"].loadWorldContent();
+}
+
+function nextInfiltrationLevel(inst) {
+ ++inst.clearanceLevel;
+ updateInfiltrationLevelText(inst);
+
+ //Buttons
+ var killButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-kill");
+ var knockoutButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-knockout");
+ var stealthKnockoutButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-stealthknockout");
+ var assassinateButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-assassinate");
+ var hackSecurityButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-hacksecurity");
+ var destroySecurityButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-destroysecurity");
+ var sneakButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-sneak");
+ var pickdoorButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-pickdoor");
+ var bribeButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-bribe");
+ var escapeButton = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["clearEventListeners"])("infiltration-escape");
+
+ killButton.style.display = "none";
+ knockoutButton.style.display = "none";
+ stealthKnockoutButton.style.display = "none";
+ assassinateButton.style.display = "none";
+ hackSecurityButton.style.display = "none";
+ destroySecurityButton.style.display = "none";
+ sneakButton.style.display = "none";
+ pickdoorButton.style.display = "none";
+ bribeButton.style.display = "none";
+ escapeButton.style.display = "none";
+
+ var rand = Object(_utils_HelperFunctions_js__WEBPACK_IMPORTED_MODULE_5__["getRandomInt"])(0, 5); //This needs to change if more scenarios are added
+ var scenario = null;
+ switch (rand) {
+ case 1:
+ scenario = InfiltrationScenarios.TechOnly;
+ hackSecurityButton.style.display = "block";
+ destroySecurityButton.style.display = "block";
+ sneakButton.style.display = "block";
+ escapeButton.style.display = "block";
+ break;
+ case 2:
+ scenario = InfiltrationScenarios.TechOrLockedDoor;
+ hackSecurityButton.style.display = "block";
+ destroySecurityButton.style.display = "block";
+ sneakButton.style.display = "block";
+ pickdoorButton.style.display = "block";
+ escapeButton.style.display = "block";
+ break;
+ case 3:
+ scenario = InfiltrationScenarios.Bots;
+ killButton.style.display = "block";
+ killButton.addEventListener("click", function() {
+ var res = attemptInfiltrationKill(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY killed the security bots! Unfortunately you alerted the " +
+ "rest of the facility's security. The facility's security " +
+ "level increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].karma -= 1;
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ var dmgTaken = Math.max(1, Math.round(1.5 * inst.securityLevel / _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].defense));
+ writeInfiltrationStatusText("You FAILED to kill the security bots. The bots fight back " +
+ "and raise the alarm! You take " + dmgTaken + " damage and " +
+ "the facility's security level increases by " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].takeDamage(dmgTaken)) {
+ endInfiltration(inst, false);
+ }
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ });
+ assassinateButton.style.display = "block";
+ assassinateButton.addEventListener("click", function() {
+ var res = attemptInfiltrationAssassinate(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY assassinated the security bots without being detected!");
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].karma -= 1;
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ writeInfiltrationStatusText("You FAILED to assassinate the security bots. The bots have not detected " +
+ "you but are now more alert for an intruder. The facility's security level " +
+ "has increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ });
+ hackSecurityButton.style.display = "block";
+ sneakButton.style.display = "block";
+ escapeButton.style.display = "block";
+ break;
+ default: //0, 4-5
+ scenario = InfiltrationScenarios.Guards;
+ killButton.style.display = "block";
+ killButton.addEventListener("click", function() {
+ var res = attemptInfiltrationKill(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY killed the security guard! Unfortunately you alerted the " +
+ "rest of the facility's security. The facility's security " +
+ "level has increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].karma -= 3;
+ ++_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].numPeopleKilled;
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ var dmgTaken = Math.max(1, Math.round(inst.securityLevel / _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].defense));
+ writeInfiltrationStatusText("You FAILED to kill the security guard. The guard fights back " +
+ "and raises the alarm! You take " + dmgTaken + " damage and " +
+ "the facility's security level has increased by " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].takeDamage(dmgTaken)) {
+ endInfiltration(inst, false);
+ }
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ });
+ knockoutButton.style.display = "block";
+ stealthKnockoutButton.style.display = "block";
+ assassinateButton.style.display = "block";
+ assassinateButton.addEventListener("click", function() {
+ var res = attemptInfiltrationAssassinate(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY assassinated the security guard without being detected!");
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].karma -= 3;
+ ++_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].numPeopleKilled;
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ writeInfiltrationStatusText("You FAILED to assassinate the security guard. The guard has not detected " +
+ "you but is now more alert for an intruder. The facility's security level " +
+ "has increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ });
+ sneakButton.style.display = "block";
+ bribeButton.style.display = "block";
+ escapeButton.style.display = "block";
+ break;
+ }
+
+ knockoutButton.addEventListener("click", function() {
+ var res = attemptInfiltrationKnockout(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY knocked out the security guard! " +
+ "Unfortunately you made a lot of noise and alerted other security.");
+ writeInfiltrationStatusText("The facility's security level increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ var dmgTaken = Math.max(1, Math.round(inst.securityLevel / _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].defense));
+ writeInfiltrationStatusText("You FAILED to knockout the security guard. The guard " +
+ "raises the alarm and fights back! You take " + dmgTaken + " damage and " +
+ "the facility's security level increases by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].takeDamage(dmgTaken)) {
+ endInfiltration(inst, false);
+ }
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ return false;
+ });
+
+ stealthKnockoutButton.addEventListener("click", function() {
+ var res = attemptInfiltrationStealthKnockout(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY knocked out the security guard without making " +
+ "any noise!");
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ var dmgTaken = Math.max(1, Math.round(inst.securityLevel / _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].defense));
+ writeInfiltrationStatusText("You FAILED to stealthily knockout the security guard. The guard " +
+ "raises the alarm and fights back! You take " + dmgTaken + " damage and " +
+ "the facility's security level increases by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].takeDamage(dmgTaken)) {
+ endInfiltration(inst, false);
+ }
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ return false;
+ });
+
+ hackSecurityButton.addEventListener("click", function() {
+ var res = attemptInfiltrationHack(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY hacked and disabled the security system!");
+ writeInfiltrationStatusText("The facility's security level increased by " + ((res[1]*100) - 100).toString() + "%");
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ writeInfiltrationStatusText("You FAILED to hack the security system. The facility's " +
+ "security level increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ return false;
+ });
+
+ destroySecurityButton.addEventListener("click", function() {
+ var res = attemptInfiltrationDestroySecurity(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY and violently destroy the security system!");
+ writeInfiltrationStatusText("The facility's security level increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ writeInfiltrationStatusText("You FAILED to destroy the security system. The facility's " +
+ "security level increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ return false;
+ });
+
+ sneakButton.addEventListener("click", function() {
+ var res = attemptInfiltrationSneak(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY sneak past the security undetected!");
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ writeInfiltrationStatusText("You FAILED and were detected while trying to sneak past security! The facility's " +
+ "security level increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ return false;
+ });
+
+ pickdoorButton.addEventListener("click", function() {
+ var res = attemptInfiltrationPickLockedDoor(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY pick the locked door!");
+ writeInfiltrationStatusText("The facility's security level increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ writeInfiltrationStatusText("You FAILED to pick the locked door. The facility's security level " +
+ "increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ return false;
+ });
+
+ bribeButton.addEventListener("click", function() {
+ var bribeAmt = _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].InfiltrationBribeBaseAmount * inst.clearanceLevel;
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].money.lt(bribeAmt)) {
+ writeInfiltrationStatusText("You do not have enough money to bribe the guard. " +
+ "You need $" + bribeAmt);
+ return false;
+ }
+ var res = attemptInfiltrationBribe(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY bribed a guard to let you through " +
+ "to the next clearance level for $" + bribeAmt);
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].loseMoney(bribeAmt);
+ endInfiltrationLevel(inst);
+ return false;
+ } else {
+ writeInfiltrationStatusText("You FAILED to bribe a guard! The guard is alerting " +
+ "other security guards about your presence! The facility's " +
+ "security level increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ return false;
+ });
+
+ escapeButton.addEventListener("click", function() {
+ var res = attemptInfiltrationEscape(inst);
+ if (res[0]) {
+ writeInfiltrationStatusText("You SUCCESSFULLY escape from the facility with the stolen classified " +
+ "documents and company secrets!");
+ endInfiltration(inst, true);
+ return false;
+ } else {
+ writeInfiltrationStatusText("You FAILED to escape from the facility. You took 1 damage. The facility's " +
+ "security level increased by " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])((res[1]*100)-100, 2).toString() + "%");
+ if (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].takeDamage(1)) {
+ endInfiltration(inst, false);
+ }
+ }
+ updateInfiltrationButtons(inst, scenario);
+ updateInfiltrationLevelText(inst);
+ return false;
+ });
+
+ updateInfiltrationButtons(inst, scenario);
+ writeInfiltrationStatusText("");
+ writeInfiltrationStatusText("You are now on clearance level " + inst.clearanceLevel + ".
" +
+ scenario);
+}
+
+
+function endInfiltrationLevel(inst) {
+ //Check if you gained any secrets
+ if (inst.clearanceLevel % 5 == 0) {
+ var baseSecretValue = inst.baseValue * inst.clearanceLevel / 2;
+ var secretValue = baseSecretValue * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].faction_rep_mult *
+ _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].InfiltrationRepValue * _BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].InfiltrationRep;
+ var secretMoneyValue = baseSecretValue * _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].InfiltrationMoneyValue *
+ _BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].InfiltrationMoney;
+ inst.secretsStolen.push(baseSecretValue);
+ Object(_utils_DialogBox_js__WEBPACK_IMPORTED_MODULE_4__["dialogBoxCreate"])("You found and stole a set of classified documents from the company. " +
+ "These classified secrets could probably be sold for money ($" +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(secretMoneyValue, 2) + "), or they " +
+ "could be given to factions for reputation (" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(secretValue, 3) + " rep)");
+ }
+
+ //Increase security level based on difficulty
+ inst.securityLevel *= (1 + (inst.difficulty / 100));
+ writeInfiltrationStatusText("You move on to the facility's next clearance level. This " +
+ "clearance level has " + inst.difficulty + "% higher security");
+
+ //If this is max level, force endInfiltration
+ if (inst.clearanceLevel >= inst.maxClearanceLevel) {
+ endInfiltration(inst, true);
+ } else {
+ nextInfiltrationLevel(inst);
+ }
+}
+
+function writeInfiltrationStatusText(txt) {
+ var statusTxt = document.getElementById("infiltration-status-text");
+ statusTxt.innerHTML += (txt + "
");
+ statusTxt.parentElement.scrollTop = statusTxt.scrollHeight;
+}
+
+function clearInfiltrationStatusText() {
+ document.getElementById("infiltration-status-text").innerHTML = "";
+}
+
+function updateInfiltrationLevelText(inst) {
+ var totalValue = 0;
+ var totalMoneyValue = 0;
+ for (var i = 0; i < inst.secretsStolen.length; ++i) {
+ totalValue += (inst.secretsStolen[i] * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].faction_rep_mult *
+ _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].InfiltrationRepValue * _BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].InfiltrationRep);
+ totalMoneyValue += inst.secretsStolen[i] * _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].InfiltrationMoneyValue *
+ _BitNode_js__WEBPACK_IMPORTED_MODULE_0__["BitNodeMultipliers"].InfiltrationMoney;
+ }
+
+ var expMultiplier = 2 * inst.clearanceLevel / inst.maxClearanceLevel;
+ document.getElementById("infiltration-level-text").innerHTML =
+ "Facility name: " + inst.companyName + "
" +
+ "Clearance Level: " + inst.clearanceLevel + "
" +
+ "Security Level: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(inst.securityLevel, 3) + "
" +
+ "Total reputation value of secrets stolen: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(totalValue, 3) + "
" +
+ "Total monetary value of secrets stolen: $" + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(totalMoneyValue, 2) + "
" +
+ "Hack exp gained: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(inst.hackingExpGained * expMultiplier, 3) + "
" +
+ "Str exp gained: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(inst.strExpGained * expMultiplier, 3) + "
" +
+ "Def exp gained: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(inst.defExpGained * expMultiplier, 3) + "
" +
+ "Dex exp gained: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(inst.dexExpGained * expMultiplier, 3) + "
" +
+ "Agi exp gained: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(inst.agiExpGained * expMultiplier, 3) + "
" +
+ "Cha exp gained: " + Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(inst.chaExpGained * expMultiplier, 3);
+}
+
+function updateInfiltrationButtons(inst, scenario) {
+ var killChance = getInfiltrationKillChance(inst);
+ var knockoutChance = getInfiltrationKnockoutChance(inst);
+ var stealthKnockoutChance = getInfiltrationStealthKnockoutChance(inst);
+ var assassinateChance = getInfiltrationAssassinateChance(inst);
+ var destroySecurityChance = getInfiltrationDestroySecurityChance(inst);
+ var hackChance = getInfiltrationHackChance(inst);
+ var sneakChance = getInfiltrationSneakChance(inst);
+ var lockpickChance = getInfiltrationPickLockedDoorChance(inst);
+ var bribeChance = getInfiltrationBribeChance(inst);
+ var escapeChance = getInfiltrationEscapeChance(inst);
+
+ document.getElementById("infiltration-escape").innerHTML = "Escape" +
+ "" +
+ "Attempt to escape the facility with the classified secrets and " +
+ "documents you have stolen. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(escapeChance*100, 2) + "% chance of success. If you fail, " +
+ "the security level will increase by 5%.";
+
+ switch(scenario) {
+ case InfiltrationScenarios.TechOrLockedDoor:
+ document.getElementById("infiltration-pickdoor").innerHTML = "Lockpick" +
+ "" +
+ "Attempt to pick the locked door. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(lockpickChance*100, 2) + "% chance of success. " +
+ "If you succeed, the security level will increased by 1%. If you fail, the " +
+ "security level will increase by 3%.";
+ case InfiltrationScenarios.TechOnly:
+ document.getElementById("infiltration-hacksecurity").innerHTML = "Hack" +
+ "" +
+ "Attempt to hack and disable the security system. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(hackChance*100, 2) + "% chance of success. " +
+ "If you succeed, the security level will increase by 3%. If you fail, " +
+ "the security level will increase by 5%.";
+
+ document.getElementById("infiltration-destroysecurity").innerHTML = "Destroy security" +
+ "" +
+ "Attempt to violently destroy the security system. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(destroySecurityChance*100, 2) + "% chance of success. " +
+ "If you succeed, the security level will increase by 5%. If you fail, the " +
+ "security level will increase by 10%. ";
+
+ document.getElementById("infiltration-sneak").innerHTML = "Sneak" +
+ "" +
+ "Attempt to sneak past the security system. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(sneakChance*100, 2) + "% chance of success. " +
+ "If you fail, the security level will increase by 8%. ";
+ break;
+ case InfiltrationScenarios.Bots:
+ document.getElementById("infiltration-kill").innerHTML = "Destroy bots" +
+ "" +
+ "Attempt to destroy the security bots through combat. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(killChance*100, 2) + "% chance of success. " +
+ "If you succeed, the security level will increase by 5%. If you fail, " +
+ "the security level will increase by 10%. ";
+
+ document.getElementById("infiltration-assassinate").innerHTML = "Assassinate bots" +
+ "" +
+ "Attempt to stealthily destroy the security bots through assassination. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(assassinateChance*100, 2) + "% chance of success. " +
+ "If you fail, the security level will increase by 10%. ";
+
+ document.getElementById("infiltration-hacksecurity").innerHTML = "Hack bots" +
+ "" +
+ "Attempt to disable the security bots by hacking them. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(hackChance*100, 2) + "% chance of success. " +
+ "If you succeed, the security level will increase by 3%. If you fail, " +
+ "the security level will increase by 5%. ";
+
+ document.getElementById("infiltration-sneak").innerHTML = "Sneak" +
+ "" +
+ "Attempt to sneak past the security bots. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(sneakChance*100, 2) + "% chance of success. " +
+ "If you fail, the security level will increase by 8%. ";
+ break;
+
+ case InfiltrationScenarios.Guards:
+ default:
+ document.getElementById("infiltration-kill").innerHTML = "Kill" +
+ "" +
+ "Attempt to kill the security guard. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(killChance*100, 2) + "% chance of success. " +
+ "If you succeed, the security level will increase by 5%. If you fail, " +
+ "the security level will decrease by 10%. ";
+
+ document.getElementById("infiltration-knockout").innerHTML = "Knockout" +
+ "" +
+ "Attempt to knockout the security guard. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(knockoutChance*100, 2) + "% chance of success. " +
+ "If you succeed, the security level will increase by 3%. If you fail, the " +
+ "security level will increase by 10%. ";
+
+ document.getElementById("infiltration-stealthknockout").innerHTML = "Stealth Knockout" +
+ "" +
+ "Attempt to stealthily knockout the security guard. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(stealthKnockoutChance*100, 2) + "% chance of success. " +
+ "If you fail, the security level will increase by 10%. ";
+
+ document.getElementById("infiltration-assassinate").innerHTML = "Assassinate" +
+ "" +
+ "Attempt to assassinate the security guard. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(assassinateChance*100, 2) + "% chance of success. " +
+ "If you fail, the security level will increase by 5%. ";
+
+ document.getElementById("infiltration-sneak").innerHTML = "Sneak" +
+ "" +
+ "Attempt to sneak past the security guard. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(sneakChance*100, 2) + "% chance of success. " +
+ "If you fail, the security level will increase by 8%. ";
+
+ document.getElementById("infiltration-bribe").innerHTML = "Bribe" +
+ "" +
+ "Attempt to bribe the security guard. You have a " +
+ Object(_utils_StringHelperFunctions_js__WEBPACK_IMPORTED_MODULE_7__["formatNumber"])(bribeChance*100, 2) + "% chance of success. " +
+ "If you fail, the security level will increase by 15%. ";
+ break;
+ }
+}
+
+let intWgt = _Constants_js__WEBPACK_IMPORTED_MODULE_1__["CONSTANTS"].IntelligenceInfiltrationWeight;
+
+//Kill
+//Success: 5%, Failure 10%, -Karma
+function attemptInfiltrationKill(inst) {
+ var chance = getInfiltrationKillChance(inst);
+ inst.gainStrengthExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].strength_exp_mult;
+ inst.gainDefenseExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].defense_exp_mult;
+ inst.gainDexterityExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity_exp_mult;
+ inst.gainAgilityExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility_exp_mult;
+ if (Math.random() <= chance) {
+ inst.securityLevel *= 1.05;
+ return [true, 1.05];
+ } else {
+ inst.securityLevel *= 1.1;
+ return [false, 1.1];
+ }
+}
+
+function getInfiltrationKillChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].strength +
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity +
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility) / (1.45 * lvl));
+}
+
+
+//Knockout
+//Success: 3%, Failure: 10%
+function attemptInfiltrationKnockout(inst) {
+ var chance = getInfiltrationKnockoutChance(inst);
+ inst.gainStrengthExp(inst.securityLevel / 80) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].strength_exp_mult;
+ inst.gainDefenseExp(inst.securityLevel / 80) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].defense_exp_mult;
+ inst.gainDexterityExp(inst.securityLevel / 80) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity_exp_mult;
+ inst.gainAgilityExp(inst.securityLevel / 80) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility_exp_mult;
+ if (Math.random() <= chance) {
+ inst.securityLevel *= 1.03;
+ return [true, 1.03];
+ } else {
+ inst.securityLevel *= 1.1;
+ return [false, 1.1];
+ }
+}
+
+function getInfiltrationKnockoutChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].strength +
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity +
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility) / (1.7 * lvl));
+}
+
+//Stealth knockout
+//Success: 0%, Failure: 10%
+function attemptInfiltrationStealthKnockout(inst) {
+ var chance = getInfiltrationStealthKnockoutChance(inst);
+ inst.gainStrengthExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].strength_exp_mult;
+ inst.gainDexterityExp(inst.securityLevel / 65) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity_exp_mult;
+ inst.gainAgilityExp(inst.securityLevel / 65) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility_exp_mult;
+ if (Math.random() <= chance) {
+ return [true, 1];
+ } else {
+ inst.securityLevel *= 1.1;
+ return [false, 1.1];
+ }
+}
+
+function getInfiltrationStealthKnockoutChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (0.55 * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].strength +
+ 2 * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity +
+ 2 * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].intelligence) / (3 * lvl));
+}
+
+//Assassination
+//Success: 0%, Failure: 5%, -Karma
+function attemptInfiltrationAssassinate(inst) {
+ var chance = getInfiltrationAssassinateChance(inst);
+ inst.gainStrengthExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].strength_exp_mult;
+ inst.gainDexterityExp(inst.securityLevel / 65) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity_exp_mult;
+ inst.gainAgilityExp(inst.securityLevel / 65) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility_exp_mult;
+ if (Math.random() <= chance) {
+ return [true, 1];
+ } else {
+ inst.securityLevel *= 1.05;
+ return [false, 1.05];
+ }
+}
+
+function getInfiltrationAssassinateChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity +
+ 0.5 * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].intelligence) / (2 * lvl));
+}
+
+
+//Destroy security
+//Success: 5%, Failure: 10%
+function attemptInfiltrationDestroySecurity(inst) {
+ var chance = getInfiltrationDestroySecurityChance(inst);
+ inst.gainStrengthExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].strength_exp_mult;
+ inst.gainDefenseExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].defense_exp_mult;
+ inst.gainDexterityExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity_exp_mult;
+ inst.gainAgilityExp(inst.securityLevel / 85) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility_exp_mult;
+ if (Math.random() <= chance) {
+ inst.securityLevel *= 1.05;
+ return [true, 1.05];
+ } else {
+ inst.securityLevel *= 1.1;
+ return [false, 1.1];
+ }
+
+}
+
+function getInfiltrationDestroySecurityChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].strength +
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity +
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility) / (2 * lvl));
+}
+
+
+//Hack security
+//Success: 3%, Failure: 5%
+function attemptInfiltrationHack(inst) {
+ var chance = getInfiltrationHackChance(inst);
+ inst.gainHackingExp(inst.securityLevel / 40) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_exp_mult;
+ inst.gainIntelligenceExp(inst.securityLevel / 690);
+ if (Math.random() <= chance) {
+ inst.securityLevel *= 1.03;
+ return [true, 1.03];
+ } else {
+ inst.securityLevel *= 1.05;
+ return [false, 1.05];
+ }
+
+}
+
+function getInfiltrationHackChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].hacking_skill +
+ (intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].intelligence)) / lvl);
+}
+
+//Sneak past security
+//Success: 0%, Failure: 8%
+function attemptInfiltrationSneak(inst) {
+ var chance = getInfiltrationSneakChance(inst);
+ inst.gainAgilityExp(inst.securityLevel / 40) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility_exp_mult;
+ if (Math.random() <= chance) {
+ return [true, 1];
+ } else {
+ inst.securityLevel *= 1.08;
+ return [false, 1.08];
+ }
+}
+
+function getInfiltrationSneakChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility +
+ 0.5 * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].intelligence) / (2 * lvl));
+}
+
+//Pick locked door
+//Success: 1%, Failure: 3%
+function attemptInfiltrationPickLockedDoor(inst) {
+ var chance = getInfiltrationPickLockedDoorChance(inst);
+ inst.gainDexterityExp(inst.securityLevel / 30) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity_exp_mult;
+ if (Math.random() <= chance) {
+ inst.securityLevel *= 1.01;
+ return [true, 1.01];
+ } else {
+ inst.securityLevel *= 1.03;
+ return [false, 1.03];
+ }
+}
+
+function getInfiltrationPickLockedDoorChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].intelligence) / lvl);
+}
+
+//Bribe
+//Success: 0%, Failure: 15%,
+function attemptInfiltrationBribe(inst) {
+ var chance = getInfiltrationBribeChance(inst);
+ inst.gainCharismaExp(inst.securityLevel / 10) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].charisma_exp_mult;
+ if (Math.random() <= chance) {
+ return [true, 1];
+ } else {
+ inst.securityLevel *= 1.15;
+ return [false, 1.15];
+ }
+}
+
+function getInfiltrationBribeChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (_Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].charisma) / lvl);
+}
+
+//Escape
+//Failure: 5%
+function attemptInfiltrationEscape(inst) {
+ var chance = getInfiltrationEscapeChance(inst);
+ inst.gainAgilityExp(inst.securityLevel / 35) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility_exp_mult;
+ inst.gainDexterityExp(inst.securityLevel / 35) * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity_exp_mult;
+ if (Math.random() <= chance) {
+ return [true, 1];
+ } else {
+ inst.securityLevel *= 1.05;
+ return [false, 1.05];
+ }
+}
+
+function getInfiltrationEscapeChance(inst) {
+ var lvl = inst.securityLevel;
+ return Math.min(0.95,
+ (2 * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].agility +
+ _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].dexterity +
+ intWgt * _Player_js__WEBPACK_IMPORTED_MODULE_3__["Player"].intelligence) / lvl);
+}
+
+
+
+
+/***/ }),
+/* 117 */
+/*!**********************************************!*\
+ !*** ./node_modules/file-saver/FileSaver.js ***!
+ \**********************************************/
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/* FileSaver.js
+ * A saveAs() FileSaver implementation.
+ * 1.3.2
+ * 2016-06-16 18:25:19
+ *
+ * By Eli Grey, http://eligrey.com
+ * License: MIT
+ * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
+ */
+
+/*global self */
+/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
+
+/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
+
+var saveAs = saveAs || (function(view) {
+ "use strict";
+ // IE <10 is explicitly unsupported
+ if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
+ return;
+ }
+ var
+ doc = view.document
+ // only get URL when necessary in case Blob.js hasn't overridden it yet
+ , get_URL = function() {
+ return view.URL || view.webkitURL || view;
+ }
+ , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
+ , can_use_save_link = "download" in save_link
+ , click = function(node) {
+ var event = new MouseEvent("click");
+ node.dispatchEvent(event);
+ }
+ , is_safari = /constructor/i.test(view.HTMLElement) || view.safari
+ , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
+ , throw_outside = function(ex) {
+ (view.setImmediate || view.setTimeout)(function() {
+ throw ex;
+ }, 0);
+ }
+ , force_saveable_type = "application/octet-stream"
+ // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
+ , arbitrary_revoke_timeout = 1000 * 40 // in ms
+ , revoke = function(file) {
+ var revoker = function() {
+ if (typeof file === "string") { // file is an object URL
+ get_URL().revokeObjectURL(file);
+ } else { // file is a File
+ file.remove();
+ }
+ };
+ setTimeout(revoker, arbitrary_revoke_timeout);
+ }
+ , dispatch = function(filesaver, event_types, event) {
+ event_types = [].concat(event_types);
+ var i = event_types.length;
+ while (i--) {
+ var listener = filesaver["on" + event_types[i]];
+ if (typeof listener === "function") {
+ try {
+ listener.call(filesaver, event || filesaver);
+ } catch (ex) {
+ throw_outside(ex);
+ }
+ }
+ }
+ }
+ , auto_bom = function(blob) {
+ // prepend BOM for UTF-8 XML and text/* types (including HTML)
+ // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
+ if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
+ return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
+ }
+ return blob;
+ }
+ , FileSaver = function(blob, name, no_auto_bom) {
+ if (!no_auto_bom) {
+ blob = auto_bom(blob);
+ }
+ // First try a.download, then web filesystem, then object URLs
+ var
+ filesaver = this
+ , type = blob.type
+ , force = type === force_saveable_type
+ , object_url
+ , dispatch_all = function() {
+ dispatch(filesaver, "writestart progress write writeend".split(" "));
+ }
+ // on any filesys errors revert to saving with object URLs
+ , fs_error = function() {
+ if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
+ // Safari doesn't allow downloading of blob urls
+ var reader = new FileReader();
+ reader.onloadend = function() {
+ var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
+ var popup = view.open(url, '_blank');
+ if(!popup) view.location.href = url;
+ url=undefined; // release reference before dispatching
+ filesaver.readyState = filesaver.DONE;
+ dispatch_all();
+ };
+ reader.readAsDataURL(blob);
+ filesaver.readyState = filesaver.INIT;
+ return;
+ }
+ // don't create more object URLs than needed
+ if (!object_url) {
+ object_url = get_URL().createObjectURL(blob);
+ }
+ if (force) {
+ view.location.href = object_url;
+ } else {
+ var opened = view.open(object_url, "_blank");
+ if (!opened) {
+ // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
+ view.location.href = object_url;
+ }
+ }
+ filesaver.readyState = filesaver.DONE;
+ dispatch_all();
+ revoke(object_url);
+ }
+ ;
+ filesaver.readyState = filesaver.INIT;
+
+ if (can_use_save_link) {
+ object_url = get_URL().createObjectURL(blob);
+ setTimeout(function() {
+ save_link.href = object_url;
+ save_link.download = name;
+ click(save_link);
+ dispatch_all();
+ revoke(object_url);
+ filesaver.readyState = filesaver.DONE;
+ });
+ return;
+ }
+
+ fs_error();
+ }
+ , FS_proto = FileSaver.prototype
+ , saveAs = function(blob, name, no_auto_bom) {
+ return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
+ }
+ ;
+ // IE 10+ (native saveAs)
+ if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
+ return function(blob, name, no_auto_bom) {
+ name = name || blob.name || "download";
+
+ if (!no_auto_bom) {
+ blob = auto_bom(blob);
+ }
+ return navigator.msSaveOrOpenBlob(blob, name);
+ };
+ }
+
+ FS_proto.abort = function(){};
+ FS_proto.readyState = FS_proto.INIT = 0;
+ FS_proto.WRITING = 1;
+ FS_proto.DONE = 2;
+
+ FS_proto.error =
+ FS_proto.onwritestart =
+ FS_proto.onprogress =
+ FS_proto.onwrite =
+ FS_proto.onabort =
+ FS_proto.onerror =
+ FS_proto.onwriteend =
+ null;
+
+ return saveAs;
+}(
+ typeof self !== "undefined" && self
+ || typeof window !== "undefined" && window
+ || this.content
+));
+// `self` is undefined in Firefox for Android content script context
+// while `this` is nsIContentFrameMessageManager
+// with an attribute `content` that corresponds to the window
+
+if (typeof module !== "undefined" && module.exports) {
+ module.exports.saveAs = saveAs;
+} else if (("function" !== "undefined" && __webpack_require__(/*! !webpack amd define */ 81) !== null) && (__webpack_require__(/*! !webpack amd options */ 127) !== null)) {
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+ return saveAs;
+ }).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+}
+
+
+/***/ }),
+/* 118 */
+/*!*****************************************!*\
+ !*** ./node_modules/jszip/lib/index.js ***!
+ \*****************************************/
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/**
+ * Representation a of zip file in js
+ * @constructor
+ */
+function JSZip() {
+ // if this constructor is used without `new`, it adds `new` before itself:
+ if(!(this instanceof JSZip)) {
+ return new JSZip();
+ }
+
+ if(arguments.length) {
+ throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
+ }
+
+ // object containing the files :
+ // {
+ // "folder/" : {...},
+ // "folder/data.txt" : {...}
+ // }
+ this.files = {};
+
+ this.comment = null;
+
+ // Where we are in the hierarchy
+ this.root = "";
+ this.clone = function() {
+ var newObj = new JSZip();
+ for (var i in this) {
+ if (typeof this[i] !== "function") {
+ newObj[i] = this[i];
+ }
+ }
+ return newObj;
+ };
+}
+JSZip.prototype = __webpack_require__(/*! ./object */ 178);
+JSZip.prototype.loadAsync = __webpack_require__(/*! ./load */ 132);
+JSZip.support = __webpack_require__(/*! ./support */ 50);
+JSZip.defaults = __webpack_require__(/*! ./defaults */ 98);
+
+// TODO find a better way to handle this version,
+// a require('package.json').version doesn't work with webpack, see #327
+JSZip.version = "3.1.5";
+
+JSZip.loadAsync = function (content, options) {
+ return new JSZip().loadAsync(content, options);
+};
+
+JSZip.external = __webpack_require__(/*! ./external */ 58);
+module.exports = JSZip;
+
+
+/***/ }),
+/* 119 */,
+/* 120 */,
+/* 121 */,
+/* 122 */,
+/* 123 */,
+/* 124 */,
+/* 125 */,
+/* 126 */
+/*!******************************************************!*\
+ !*** ./node_modules/bluebird/js/browser/bluebird.js ***!
+ \******************************************************/
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, global, setImmediate) {/* @preserve
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013-2017 Petka Antonov
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ */
+/**
+ * bluebird build version 3.5.1
+ * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
+*/
+!function(e){if(true)module.exports=e();else { var f; }}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o