From ce2391cb2fbfe9577ecedb119ec2cdc165c9fa13 Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Sat, 19 Nov 2016 19:53:25 +0300 Subject: [PATCH 1/6] 0.8.1 --- dist/index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dist/index.js b/dist/index.js index 48c1c2c0..4640d2aa 100644 --- a/dist/index.js +++ b/dist/index.js @@ -88,7 +88,7 @@ module.exports = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 89); +/******/ return __webpack_require__(__webpack_require__.s = 87); /******/ }) /************************************************************************/ /******/ ([ @@ -4431,9 +4431,7 @@ module.exports = require("fs"); module.exports = require("mkdirp"); /***/ }, -/* 87 */, -/* 88 */, -/* 89 */ +/* 87 */ /***/ function(module, exports, __webpack_require__) { "use strict"; From 430b905b2de825abec5f5bd9dc50fd8357ef05e3 Mon Sep 17 00:00:00 2001 From: Pavel Dranichnikov Date: Mon, 21 Nov 2016 19:01:21 +0300 Subject: [PATCH 2/6] Fixed a typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d77f5fe..5780b86e 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ Following options available for the JS Obfuscator: stringArray: true, stringArrayEncoding: false, stringArrayThreshold: 0.8, - unicdeEscapeSequence: true + unicodeEscapeSequence: true } ``` From 8f3441a4f90a7a5f980cb60a12dc9fa50cf3d670 Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Mon, 21 Nov 2016 22:05:49 +0300 Subject: [PATCH 3/6] `seed` option and `IE8` fix --- CHANGELOG.md | 5 ++ README.md | 6 ++ dist/index.js | 84 ++++++++++++------- package.json | 2 +- src/JavaScriptObfuscatorInternal.ts | 7 ++ src/Utils.ts | 49 +++++++++-- src/cli/JavaScriptObfuscatorCLI.ts | 1 + .../DebugProtectionFunctionNode.ts | 5 +- .../NodeCallsControllerFunctionNode.ts | 11 ++- .../SelfDefendingUnicodeNode.ts | 4 +- .../StringArrayCallsWrapper.ts | 4 +- .../StringArrayRotateFunctionNode.ts | 4 +- src/enums/JSFuck.ts | 2 - src/interfaces/IObfuscatorOptions.d.ts | 1 + src/interfaces/IOptions.d.ts | 1 + src/node-groups/StringArrayNodesGroup.ts | 5 +- .../replacers/StringLiteralReplacer.ts | 2 +- src/node/NodeAppender.ts | 5 +- src/options/Options.ts | 6 ++ src/preset-options/DefaultPreset.ts | 1 + src/preset-options/NoCustomNodesPreset.ts | 1 + .../DebugProtectionFunctionTemplate.ts | 4 +- .../JavaScriptObfuscator.spec.ts | 36 ++++++++ 23 files changed, 187 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a2ef345..5ca99c3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ Change Log === +v0.8.1 +--- +* New option `seed` sets seed for random generator. This is useful for creating repeatable results. +* IE8 runtime error fix. + v0.8.1 --- * `disableConsoleOutput` option now replaces `console.xxx` functions on empty function instead of infinity loop. diff --git a/README.md b/README.md index 3d77f5fe..800938d2 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ Following options available for the JS Obfuscator: disableConsoleOutput: true, reservedNames: [], rotateStringArray: true, + seed: 0, selfDefending: true, sourceMap: false, sourceMapBaseUrl: '', @@ -148,6 +149,7 @@ Following options available for the JS Obfuscator: --disableConsoleOutput --reservedNames (comma separated) --rotateStringArray + --seed --selfDefending --sourceMap --sourceMapBaseUrl @@ -218,6 +220,10 @@ Shift the `stringArray` array by a fixed and random (generated at the code obfus This option is recommended if your original source code isn't small, as the helper function can attract attention. +### `seed` +Type: `number` Default: `0` + +This option sets seed for random generator. This is useful for creating repeatable results. ### `selfDefending` Type: `boolean` Default: `true` diff --git a/dist/index.js b/dist/index.js index 48c1c2c0..c632712d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -88,7 +88,7 @@ module.exports = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 89); +/******/ return __webpack_require__(__webpack_require__.s = 88); /******/ }) /************************************************************************/ /******/ ([ @@ -167,11 +167,32 @@ var Utils = function () { domain = domain.split(':')[0]; return domain; } + }, { + key: 'getRandomFloat', + value: function getRandomFloat(min, max) { + return Utils.getRandomGenerator().floating({ + min: min, + max: max, + fixed: 7 + }); + } }, { key: 'getRandomGenerator', value: function getRandomGenerator() { + var randomGenerator = Utils.randomGenerator; + if (!randomGenerator) { + throw new Error('`randomGenerator` static property is undefined'); + } return Utils.randomGenerator; } + }, { + key: 'getRandomInteger', + value: function getRandomInteger(min, max) { + return Utils.getRandomGenerator().integer({ + min: min, + max: max + }); + } }, { key: 'getRandomVariableName', value: function getRandomVariableName() { @@ -180,10 +201,7 @@ var Utils = function () { var rangeMinInteger = 10000, rangeMaxInteger = 99999999, prefix = '_0x'; - return '' + prefix + Utils.decToHex(Utils.getRandomGenerator().integer({ - min: rangeMinInteger, - max: rangeMaxInteger - })).substr(0, length); + return '' + prefix + Utils.decToHex(Utils.getRandomInteger(rangeMinInteger, rangeMaxInteger)).substr(0, length); } }, { key: 'hideString', @@ -196,7 +214,7 @@ var Utils = function () { i2 = -1, result = ''; while (i1 < s1.length || i2 < s2.length) { - if (Math.random() < 0.5 && i2 < s2.length) { + if (Utils.getRandomFloat(0, 1) < 0.5 && i2 < s2.length) { result += s2.charAt(++i2); } else { result += s1.charAt(++i1); @@ -245,6 +263,11 @@ var Utils = function () { } return result; } + }, { + key: 'setRandomGenerator', + value: function setRandomGenerator(randomGenerator) { + Utils.randomGenerator = randomGenerator; + } }, { key: 'strEnumify', value: function strEnumify(obj) { @@ -640,10 +663,7 @@ var NodeAppender = function () { }, { key: 'getRandomStackTraceIndex', value: function getRandomStackTraceIndex(stackTraceRootLength) { - return Utils_1.Utils.getRandomGenerator().integer({ - min: 0, - max: Math.max(0, Math.round(stackTraceRootLength - 1)) - }); + return Utils_1.Utils.getRandomInteger(0, Math.max(0, Math.round(stackTraceRootLength - 1))); } }, { key: 'insertNodeAtIndex', @@ -1003,6 +1023,7 @@ exports.NO_CUSTOM_NODES_PRESET = Object.freeze({ domainLock: [], reservedNames: [], rotateStringArray: false, + seed: 0, selfDefending: false, sourceMap: false, sourceMapBaseUrl: '', @@ -1070,7 +1091,9 @@ var NodeCallsControllerFunctionNode = function (_AbstractCustomNode_) { if (this.appendState === AppendState_1.AppendState.AfterObfuscation) { return NodeUtils_1.NodeUtils.convertCodeToStructure(JavaScriptObfuscator_1.JavaScriptObfuscator.obfuscate(SingleNodeCallControllerTemplate_1.SingleNodeCallControllerTemplate().formatUnicorn({ singleNodeCallControllerFunctionName: this.callsControllerFunctionName - }), NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET).getObfuscatedCode()); + }), Object.assign({}, NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET, { + seed: this.options.seed + })).getObfuscatedCode()); } return NodeUtils_1.NodeUtils.convertCodeToStructure(SingleNodeCallControllerTemplate_1.SingleNodeCallControllerTemplate().formatUnicorn({ singleNodeCallControllerFunctionName: this.callsControllerFunctionName @@ -1127,7 +1150,7 @@ var StringLiteralReplacer = function (_AbstractReplacer_1$A) { _createClass(StringLiteralReplacer, [{ key: 'replace', value: function replace(nodeValue) { - var replaceWithStringArrayFlag = nodeValue.length >= StringLiteralReplacer.minimumLengthForStringArray && Math.random() <= this.options.stringArrayThreshold; + var replaceWithStringArrayFlag = nodeValue.length >= StringLiteralReplacer.minimumLengthForStringArray && Utils_1.Utils.getRandomFloat(0, 1) <= this.options.stringArrayThreshold; if (this.options.stringArray && replaceWithStringArrayFlag) { return this.replaceStringLiteralWithStringArrayCall(nodeValue); } @@ -1233,7 +1256,6 @@ exports.ObfuscationResult = ObfuscationResult; "use strict"; exports.JSFuck = { - Window: '[]["filter"]["constructor"]("return this")()', False: '![]', True: '!![]', a: '(false+"")[1]', @@ -1349,6 +1371,7 @@ exports.DEFAULT_PRESET = Object.freeze({ domainLock: [], reservedNames: [], rotateStringArray: true, + seed: 0, selfDefending: true, sourceMap: false, sourceMapBaseUrl: '', @@ -1391,10 +1414,12 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var esprima = __webpack_require__(24); var escodegen = __webpack_require__(13); +var chance_1 = __webpack_require__(82); var ObfuscationResult_1 = __webpack_require__(20); var Obfuscator_1 = __webpack_require__(28); var Options_1 = __webpack_require__(57); var SourceMapCorrector_1 = __webpack_require__(29); +var Utils_1 = __webpack_require__(0); var JavaScriptObfuscatorInternal = function () { function JavaScriptObfuscatorInternal(sourceCode) { @@ -1417,6 +1442,9 @@ var JavaScriptObfuscatorInternal = function () { var astTree = esprima.parse(this.sourceCode, { loc: true }); + if (this.options.seed !== 0) { + Utils_1.Utils.setRandomGenerator(new chance_1.Chance(this.options.seed)); + } astTree = new Obfuscator_1.Obfuscator(this.options).obfuscateNode(astTree); this.generatorOutput = JavaScriptObfuscatorInternal.generateCode(this.sourceCode, astTree, this.options); } @@ -1842,7 +1870,7 @@ var JavaScriptObfuscatorCLI = function () { return val.split(','); }).option('--reservedNames ', 'Disable obfuscation of variable names, function names and names of function parameters that match the passed RegExp patterns (comma separated)', function (val) { return val.split(','); - }).option('--rotateStringArray ', 'Disable rotation of unicode array values during obfuscation', JavaScriptObfuscatorCLI.parseBoolean).option('--selfDefending ', 'Disables self-defending for obfuscated code', JavaScriptObfuscatorCLI.parseBoolean).option('--sourceMap ', 'Enables source map generation', JavaScriptObfuscatorCLI.parseBoolean).option('--sourceMapBaseUrl ', 'Sets base url to the source map import url when `--sourceMapMode=separate`').option('--sourceMapFileName ', 'Sets file name for output source map when `--sourceMapMode=separate`').option('--sourceMapMode [inline, separate]', 'Specify source map output mode', JavaScriptObfuscatorCLI.parseSourceMapMode).option('--stringArray ', 'Disables gathering of all literal strings into an array and replacing every literal string with an array call', JavaScriptObfuscatorCLI.parseBoolean).option('--stringArrayEncoding [true, false, base64, rc4]', 'Encodes all strings in strings array using base64 or rc4 (this option can slow down your code speed', JavaScriptObfuscatorCLI.parseStringArrayEncoding).option('--stringArrayThreshold ', 'The probability that the literal string will be inserted into stringArray (Default: 0.8, Min: 0, Max: 1)', parseFloat).option('--unicodeEscapeSequence ', 'Allows to enable/disable string conversion to unicode escape sequence', JavaScriptObfuscatorCLI.parseBoolean).parse(this.rawArguments); + }).option('--rotateStringArray ', 'Disable rotation of unicode array values during obfuscation', JavaScriptObfuscatorCLI.parseBoolean).option('--seed ', 'Sets seed for random generator. This is useful for creating repeatable results.', parseFloat).option('--selfDefending ', 'Disables self-defending for obfuscated code', JavaScriptObfuscatorCLI.parseBoolean).option('--sourceMap ', 'Enables source map generation', JavaScriptObfuscatorCLI.parseBoolean).option('--sourceMapBaseUrl ', 'Sets base url to the source map import url when `--sourceMapMode=separate`').option('--sourceMapFileName ', 'Sets file name for output source map when `--sourceMapMode=separate`').option('--sourceMapMode [inline, separate]', 'Specify source map output mode', JavaScriptObfuscatorCLI.parseSourceMapMode).option('--stringArray ', 'Disables gathering of all literal strings into an array and replacing every literal string with an array call', JavaScriptObfuscatorCLI.parseBoolean).option('--stringArrayEncoding [true, false, base64, rc4]', 'Encodes all strings in strings array using base64 or rc4 (this option can slow down your code speed', JavaScriptObfuscatorCLI.parseStringArrayEncoding).option('--stringArrayThreshold ', 'The probability that the literal string will be inserted into stringArray (Default: 0.8, Min: 0, Max: 1)', parseFloat).option('--unicodeEscapeSequence ', 'Allows to enable/disable string conversion to unicode escape sequence', JavaScriptObfuscatorCLI.parseBoolean).parse(this.rawArguments); this.commands.on('--help', function () { console.log(' Examples:\n'); console.log(' %> javascript-obfuscator in.js --compact true --selfDefending false'); @@ -2131,10 +2159,7 @@ var DebugProtectionFunctionNode = function (_AbstractCustomNode_) { key: 'appendNode', value: function appendNode(blockScopeNode) { var programBodyLength = blockScopeNode.body.length, - randomIndex = Utils_1.Utils.getRandomGenerator().integer({ - min: 0, - max: programBodyLength - }); + randomIndex = Utils_1.Utils.getRandomInteger(0, programBodyLength); NodeAppender_1.NodeAppender.insertNodeAtIndex(blockScopeNode, this.getNode(), randomIndex); } }, { @@ -2273,7 +2298,9 @@ var SelfDefendingUnicodeNode = function (_AbstractCustomNode_) { return NodeUtils_1.NodeUtils.convertCodeToStructure(JavaScriptObfuscator_1.JavaScriptObfuscator.obfuscate(SelfDefendingTemplate_1.SelfDefendingTemplate().formatUnicorn({ selfDefendingFunctionName: Utils_1.Utils.getRandomVariableName(), singleNodeCallControllerFunctionName: this.callsControllerFunctionName - }), NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET).getObfuscatedCode()); + }), Object.assign({}, NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET, { + seed: this.options.seed + })).getObfuscatedCode()); } }]); @@ -2385,7 +2412,9 @@ var StringArrayCallsWrapper = function (_AbstractCustomNode_) { decodeNodeTemplate: decodeNodeTemplate, stringArrayCallsWrapperName: this.stringArrayCallsWrapperName, stringArrayName: this.stringArrayName - }), NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET).getObfuscatedCode()); + }), Object.assign({}, NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET, { + seed: this.options.seed + })).getObfuscatedCode()); } }]); @@ -2557,7 +2586,9 @@ var StringArrayRotateFunctionNode = function (_AbstractCustomNode_) { stringArrayName: this.stringArrayName, stringArrayRotateValue: Utils_1.Utils.decToHex(this.stringArrayRotateValue), whileFunctionName: whileFunctionName - }), NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET).getObfuscatedCode()); + }), Object.assign({}, NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET, { + seed: this.options.seed + })).getObfuscatedCode()); } }]); @@ -2805,10 +2836,7 @@ var StringArrayNodesGroup = function (_AbstractNodesGroup_) { return; } if (this.options.rotateStringArray) { - this.stringArrayRotateValue = Utils_1.Utils.getRandomGenerator().integer({ - min: 100, - max: 500 - }); + this.stringArrayRotateValue = Utils_1.Utils.getRandomInteger(100, 500); } else { this.stringArrayRotateValue = 0; } @@ -3593,6 +3621,7 @@ __decorate([class_validator_1.IsArray(), class_validator_1.ArrayUnique(), class_ each: true }), __metadata('design:type', Array)], Options.prototype, "reservedNames", void 0); __decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "rotateStringArray", void 0); +__decorate([class_validator_1.IsNumber(), __metadata('design:type', Number)], Options.prototype, "seed", void 0); __decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "selfDefending", void 0); __decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "sourceMap", void 0); __decorate([class_validator_1.IsString(), class_validator_1.ValidateIf(function (options) { @@ -4271,7 +4300,7 @@ exports.DebugProtectionFunctionIntervalTemplate = DebugProtectionFunctionInterva var Utils_1 = __webpack_require__(0); function DebugProtectionFunctionTemplate() { - return '\n var {debugProtectionFunctionName} = function () {\n function debuggerProtection (counter) {\n if ((\'\' + counter / counter)[\'length\'] !== 1 || counter % 20 === 0) {\n (function () {}.constructor(\'debugger\')());\n } else {\n [].filter.constructor(' + Utils_1.Utils.stringToJSFuck('debugger') + ')();\n }\n \n debuggerProtection(++counter);\n }\n \n try {\n debuggerProtection(0);\n } catch (y) {}\n };\n '; + return '\n var {debugProtectionFunctionName} = function () {\n function debuggerProtection (counter) {\n if ((\'\' + counter / counter)[\'length\'] !== 1 || counter % 20 === 0) {\n (function () {}.constructor(' + Utils_1.Utils.stringToJSFuck('debugger') + ')());\n } else {\n (function () {}.constructor(' + Utils_1.Utils.stringToJSFuck('debugger') + ')());\n }\n \n debuggerProtection(++counter);\n }\n \n try {\n debuggerProtection(0);\n } catch (y) {}\n };\n '; } exports.DebugProtectionFunctionTemplate = DebugProtectionFunctionTemplate; @@ -4432,8 +4461,7 @@ module.exports = require("mkdirp"); /***/ }, /* 87 */, -/* 88 */, -/* 89 */ +/* 88 */ /***/ function(module, exports, __webpack_require__) { "use strict"; diff --git a/package.json b/package.json index 09a4eeeb..5639b725 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "javascript-obfuscator", - "version": "0.8.1", + "version": "0.8.2", "description": "JavaScript obfuscator", "keywords": [ "obfuscator", diff --git a/src/JavaScriptObfuscatorInternal.ts b/src/JavaScriptObfuscatorInternal.ts index 4c32e958..216ff93a 100644 --- a/src/JavaScriptObfuscatorInternal.ts +++ b/src/JavaScriptObfuscatorInternal.ts @@ -2,6 +2,8 @@ import * as esprima from 'esprima'; import * as escodegen from 'escodegen'; import * as ESTree from 'estree'; +import { Chance } from 'chance'; + import { IObfuscatorOptions } from './interfaces/IObfuscatorOptions'; import { IGeneratorOutput } from './interfaces/IGeneratorOutput'; import { IObfuscationResult } from './interfaces/IObfuscationResult'; @@ -11,6 +13,7 @@ import { ObfuscationResult } from './ObfuscationResult'; import { Obfuscator } from './Obfuscator'; import { Options } from './options/Options'; import { SourceMapCorrector } from './SourceMapCorrector'; +import { Utils } from './Utils'; export class JavaScriptObfuscatorInternal { /** @@ -91,6 +94,10 @@ export class JavaScriptObfuscatorInternal { loc: true }); + if (this.options.seed !== 0) { + Utils.setRandomGenerator(new Chance(this.options.seed)); + } + astTree = new Obfuscator(this.options).obfuscateNode(astTree); this.generatorOutput = JavaScriptObfuscatorInternal.generateCode(this.sourceCode, astTree, this.options); diff --git a/src/Utils.ts b/src/Utils.ts index 02d14e1c..45bdf93f 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -4,9 +4,9 @@ import { JSFuck } from './enums/JSFuck'; export class Utils { /** - * @type {Chance.Chance} + * @type {Chance.Chance | Chance.SeededChance} */ - private static randomGenerator: Chance.Chance = new Chance(); + private static randomGenerator: Chance.Chance | Chance.SeededChance = new Chance(); /** * @param array @@ -99,13 +99,44 @@ export class Utils { return domain; } + /** + * @param min + * @param max + * @returns {number} + */ + public static getRandomFloat (min: number, max: number): number { + return Utils.getRandomGenerator().floating({ + min: min, + max: max, + fixed: 7 + }); + } + /** * @returns {Chance.Chance} */ public static getRandomGenerator (): Chance.Chance { + const randomGenerator: Chance.Chance = Utils.randomGenerator; + + if (!randomGenerator) { + throw new Error(`\`randomGenerator\` static property is undefined`); + } + return Utils.randomGenerator; } + /** + * @param min + * @param max + * @returns {number} + */ + public static getRandomInteger (min: number, max: number): number { + return Utils.getRandomGenerator().integer({ + min: min, + max: max + }); + } + /** * @param length * @returns {string} @@ -117,10 +148,7 @@ export class Utils { return `${prefix}${( Utils.decToHex( - Utils.getRandomGenerator().integer({ - min: rangeMinInteger, - max: rangeMaxInteger - }) + Utils.getRandomInteger(rangeMinInteger, rangeMaxInteger) ) ).substr(0, length)}`; } @@ -140,7 +168,7 @@ export class Utils { result: string = ''; while (i1 < s1.length || i2 < s2.length) { - if (Math.random() < 0.5 && i2 < s2.length) { + if (Utils.getRandomFloat(0, 1) < 0.5 && i2 < s2.length) { result += s2.charAt(++i2); } else { result += s1.charAt(++i1); @@ -213,6 +241,13 @@ export class Utils { return result; } + /** + * @param randomGenerator + */ + public static setRandomGenerator (randomGenerator: Chance.Chance | Chance.SeededChance): void { + Utils.randomGenerator = randomGenerator; + } + /** * @param obj * @returns {T} diff --git a/src/cli/JavaScriptObfuscatorCLI.ts b/src/cli/JavaScriptObfuscatorCLI.ts index 6776daba..163d47bf 100644 --- a/src/cli/JavaScriptObfuscatorCLI.ts +++ b/src/cli/JavaScriptObfuscatorCLI.ts @@ -151,6 +151,7 @@ export class JavaScriptObfuscatorCLI { .option('--domainLock ', 'Blocks the execution of the code in domains that do not match the passed RegExp patterns (comma separated)', (val: string) => val.split(',')) .option('--reservedNames ', 'Disable obfuscation of variable names, function names and names of function parameters that match the passed RegExp patterns (comma separated)', (val: string) => val.split(',')) .option('--rotateStringArray ', 'Disable rotation of unicode array values during obfuscation', JavaScriptObfuscatorCLI.parseBoolean) + .option('--seed ', 'Sets seed for random generator. This is useful for creating repeatable results.', parseFloat) .option('--selfDefending ', 'Disables self-defending for obfuscated code', JavaScriptObfuscatorCLI.parseBoolean) .option('--sourceMap ', 'Enables source map generation', JavaScriptObfuscatorCLI.parseBoolean) .option('--sourceMapBaseUrl ', 'Sets base url to the source map import url when `--sourceMapMode=separate`') diff --git a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts index e5444285..4a2b0b7f 100644 --- a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts +++ b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts @@ -40,10 +40,7 @@ export class DebugProtectionFunctionNode extends AbstractCustomNode { */ public appendNode (blockScopeNode: TNodeWithBlockStatement): void { let programBodyLength: number = blockScopeNode.body.length, - randomIndex: number = Utils.getRandomGenerator().integer({ - min: 0, - max: programBodyLength - }); + randomIndex: number = Utils.getRandomInteger(0, programBodyLength); NodeAppender.insertNodeAtIndex(blockScopeNode, this.getNode(), randomIndex); } diff --git a/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts b/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts index 338d4122..09db5591 100644 --- a/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts +++ b/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts @@ -79,9 +79,14 @@ export class NodeCallsControllerFunctionNode extends AbstractCustomNode { protected getNodeStructure (): TStatement[] { if (this.appendState === AppendState.AfterObfuscation) { return NodeUtils.convertCodeToStructure( - JavaScriptObfuscator.obfuscate(SingleNodeCallControllerTemplate().formatUnicorn({ - singleNodeCallControllerFunctionName: this.callsControllerFunctionName - }), NO_CUSTOM_NODES_PRESET).getObfuscatedCode() + JavaScriptObfuscator.obfuscate( + SingleNodeCallControllerTemplate().formatUnicorn({ + singleNodeCallControllerFunctionName: this.callsControllerFunctionName + }), + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + seed: this.options.seed + }) + ).getObfuscatedCode() ); } diff --git a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts index 0562a13e..c90dae5b 100644 --- a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts +++ b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts @@ -78,7 +78,9 @@ export class SelfDefendingUnicodeNode extends AbstractCustomNode { selfDefendingFunctionName: Utils.getRandomVariableName(), singleNodeCallControllerFunctionName: this.callsControllerFunctionName }), - NO_CUSTOM_NODES_PRESET + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + seed: this.options.seed + }) ).getObfuscatedCode() ); } diff --git a/src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts b/src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts index 849dfab5..3d1b0ab5 100644 --- a/src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts +++ b/src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts @@ -139,7 +139,9 @@ export class StringArrayCallsWrapper extends AbstractCustomNode { stringArrayCallsWrapperName: this.stringArrayCallsWrapperName, stringArrayName: this.stringArrayName }), - NO_CUSTOM_NODES_PRESET + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + seed: this.options.seed + }) ).getObfuscatedCode() ); } diff --git a/src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts b/src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts index 9f00be66..822e07a2 100644 --- a/src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts +++ b/src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts @@ -103,7 +103,9 @@ export class StringArrayRotateFunctionNode extends AbstractCustomNode { stringArrayRotateValue: Utils.decToHex(this.stringArrayRotateValue), whileFunctionName }), - NO_CUSTOM_NODES_PRESET + Object.assign({}, NO_CUSTOM_NODES_PRESET, { + seed: this.options.seed + }) ).getObfuscatedCode() ); } diff --git a/src/enums/JSFuck.ts b/src/enums/JSFuck.ts index f211463f..6fe31a6c 100644 --- a/src/enums/JSFuck.ts +++ b/src/enums/JSFuck.ts @@ -1,6 +1,4 @@ export const JSFuck: any = { - Window: '[]["filter"]["constructor"]("return this")()', - False: '![]', True: '!![]', diff --git a/src/interfaces/IObfuscatorOptions.d.ts b/src/interfaces/IObfuscatorOptions.d.ts index eef2e4b1..e305307b 100644 --- a/src/interfaces/IObfuscatorOptions.d.ts +++ b/src/interfaces/IObfuscatorOptions.d.ts @@ -9,6 +9,7 @@ export interface IObfuscatorOptions { domainLock?: string[]; reservedNames?: string[]; rotateStringArray?: boolean; + seed?: number; selfDefending?: boolean; sourceMap?: boolean; sourceMapBaseUrl?: string; diff --git a/src/interfaces/IOptions.d.ts b/src/interfaces/IOptions.d.ts index 14757a3b..1e499157 100644 --- a/src/interfaces/IOptions.d.ts +++ b/src/interfaces/IOptions.d.ts @@ -9,6 +9,7 @@ export interface IOptions { readonly domainLock: string[]; readonly reservedNames: string[]; readonly rotateStringArray: boolean; + readonly seed: number; readonly selfDefending: boolean; readonly sourceMap: boolean; readonly sourceMapBaseUrl: string; diff --git a/src/node-groups/StringArrayNodesGroup.ts b/src/node-groups/StringArrayNodesGroup.ts index 242e084c..3cb42f68 100644 --- a/src/node-groups/StringArrayNodesGroup.ts +++ b/src/node-groups/StringArrayNodesGroup.ts @@ -40,10 +40,7 @@ export class StringArrayNodesGroup extends AbstractNodesGroup { } if (this.options.rotateStringArray) { - this.stringArrayRotateValue = Utils.getRandomGenerator().integer({ - min: 100, - max: 500 - }); + this.stringArrayRotateValue = Utils.getRandomInteger(100, 500); } else { this.stringArrayRotateValue = 0; } diff --git a/src/node-obfuscators/replacers/StringLiteralReplacer.ts b/src/node-obfuscators/replacers/StringLiteralReplacer.ts index 266337b4..118e3bfc 100644 --- a/src/node-obfuscators/replacers/StringLiteralReplacer.ts +++ b/src/node-obfuscators/replacers/StringLiteralReplacer.ts @@ -27,7 +27,7 @@ export class StringLiteralReplacer extends AbstractReplacer { public replace (nodeValue: string): string { const replaceWithStringArrayFlag: boolean = ( nodeValue.length >= StringLiteralReplacer.minimumLengthForStringArray - && Math.random() <= this.options.stringArrayThreshold + && Utils.getRandomFloat(0, 1) <= this.options.stringArrayThreshold ); if (this.options.stringArray && replaceWithStringArrayFlag) { diff --git a/src/node/NodeAppender.ts b/src/node/NodeAppender.ts index b5abe4a6..af01e760 100644 --- a/src/node/NodeAppender.ts +++ b/src/node/NodeAppender.ts @@ -101,10 +101,7 @@ export class NodeAppender { * @param stackTraceRootLength */ public static getRandomStackTraceIndex (stackTraceRootLength: number): number { - return Utils.getRandomGenerator().integer({ - min: 0, - max: Math.max(0, Math.round(stackTraceRootLength - 1)) - }); + return Utils.getRandomInteger(0, Math.max(0, Math.round(stackTraceRootLength - 1))); } /** diff --git a/src/options/Options.ts b/src/options/Options.ts index 49eec25d..20ad89a2 100644 --- a/src/options/Options.ts +++ b/src/options/Options.ts @@ -85,6 +85,12 @@ export class Options implements IOptions { @IsBoolean() public readonly rotateStringArray: boolean; + /** + * @type {number} + */ + @IsNumber() + public readonly seed: number; + /** * @type {boolean} */ diff --git a/src/preset-options/DefaultPreset.ts b/src/preset-options/DefaultPreset.ts index 1d6a5fe1..3f0a4d04 100644 --- a/src/preset-options/DefaultPreset.ts +++ b/src/preset-options/DefaultPreset.ts @@ -10,6 +10,7 @@ export const DEFAULT_PRESET: IObfuscatorOptions = Object.freeze({ domainLock: [], reservedNames: [], rotateStringArray: true, + seed: 0, selfDefending: true, sourceMap: false, sourceMapBaseUrl: '', diff --git a/src/preset-options/NoCustomNodesPreset.ts b/src/preset-options/NoCustomNodesPreset.ts index f8f000a3..b5bcffac 100644 --- a/src/preset-options/NoCustomNodesPreset.ts +++ b/src/preset-options/NoCustomNodesPreset.ts @@ -10,6 +10,7 @@ export const NO_CUSTOM_NODES_PRESET: IObfuscatorOptions = Object.freeze({ domainLock: [], reservedNames: [], rotateStringArray: false, + seed: 0, selfDefending: false, sourceMap: false, sourceMapBaseUrl: '', diff --git a/src/templates/custom-nodes/debug-protection-nodes/debug-protection-function-node/DebugProtectionFunctionTemplate.ts b/src/templates/custom-nodes/debug-protection-nodes/debug-protection-function-node/DebugProtectionFunctionTemplate.ts index 4a8627a3..e62251c6 100644 --- a/src/templates/custom-nodes/debug-protection-nodes/debug-protection-function-node/DebugProtectionFunctionTemplate.ts +++ b/src/templates/custom-nodes/debug-protection-nodes/debug-protection-function-node/DebugProtectionFunctionTemplate.ts @@ -8,9 +8,9 @@ export function DebugProtectionFunctionTemplate (): string { var {debugProtectionFunctionName} = function () { function debuggerProtection (counter) { if (('' + counter / counter)['length'] !== 1 || counter % 20 === 0) { - (function () {}.constructor('debugger')()); + (function () {}.constructor(${Utils.stringToJSFuck('debugger')})()); } else { - [].filter.constructor(${Utils.stringToJSFuck('debugger')})(); + (function () {}.constructor(${Utils.stringToJSFuck('debugger')})()); } debuggerProtection(++counter); diff --git a/test/functional-tests/JavaScriptObfuscator.spec.ts b/test/functional-tests/JavaScriptObfuscator.spec.ts index 1ee8cb00..4dc1f763 100644 --- a/test/functional-tests/JavaScriptObfuscator.spec.ts +++ b/test/functional-tests/JavaScriptObfuscator.spec.ts @@ -3,6 +3,7 @@ import { IObfuscationResult } from '../../src/interfaces/IObfuscationResult'; import { JavaScriptObfuscator } from '../../src/JavaScriptObfuscator'; import { NO_CUSTOM_NODES_PRESET } from '../../src/preset-options/NoCustomNodesPreset'; +import { readFileAsString } from '../helpers/readFileAsString'; const assert: Chai.AssertStatic = require('chai').assert; @@ -125,5 +126,40 @@ describe('JavaScriptObfuscator', () => { assert.match(obfuscatedCode2, pattern1); assert.match(obfuscatedCode2, pattern2); }); + + it('should returns same code every time with same `seed`', () => { + const code: string = readFileAsString('./test/fixtures/sample.js'); + const seed: number = 12345; + + const obfuscationResult1: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, { seed: seed } + ); + const obfuscationResult2: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, { seed: seed } + ); + + assert.equal(obfuscationResult1.getObfuscatedCode(), obfuscationResult2.getObfuscatedCode()); + }); + + it('should returns different code with different `seed` option value', () => { + const code: string = readFileAsString('./test/fixtures/sample.js'); + + const obfuscationResult1: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, { seed: 12345 } + ); + const obfuscationResult2: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, { seed: 12346 } + ); + + const obfuscationResult3: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, { seed: 0 } + ); + const obfuscationResult4: IObfuscationResult = JavaScriptObfuscator.obfuscate( + code, { seed: 0 } + ); + + assert.notEqual(obfuscationResult1.getObfuscatedCode(), obfuscationResult2.getObfuscatedCode()); + assert.notEqual(obfuscationResult3.getObfuscatedCode(), obfuscationResult4.getObfuscatedCode()); + }); }); }); From 0de42bb2658feabcaca946f5e0dda300988bf763 Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Mon, 21 Nov 2016 22:25:31 +0300 Subject: [PATCH 4/6] 0.8.2 release --- dist/index.js | 255 +++++++++++++++++++++++++------------------------- 1 file changed, 127 insertions(+), 128 deletions(-) diff --git a/dist/index.js b/dist/index.js index c632712d..84f15dd6 100644 --- a/dist/index.js +++ b/dist/index.js @@ -88,7 +88,7 @@ module.exports = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 88); +/******/ return __webpack_require__(__webpack_require__.s = 87); /******/ }) /************************************************************************/ /******/ ([ @@ -102,7 +102,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var chance_1 = __webpack_require__(82); +var chance_1 = __webpack_require__(24); var JSFuck_1 = __webpack_require__(21); var Utils = function () { @@ -318,7 +318,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var escodegen = __webpack_require__(13); -var esprima = __webpack_require__(24); +var esprima = __webpack_require__(25); var estraverse = __webpack_require__(4); var NodeType_1 = __webpack_require__(6); var Node_1 = __webpack_require__(2); @@ -843,8 +843,8 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var JavaScriptObfuscatorCLI_1 = __webpack_require__(32); -var JavaScriptObfuscatorInternal_1 = __webpack_require__(27); +var JavaScriptObfuscatorCLI_1 = __webpack_require__(33); +var JavaScriptObfuscatorInternal_1 = __webpack_require__(28); var JavaScriptObfuscator = function () { function JavaScriptObfuscator() { @@ -1052,7 +1052,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" __webpack_require__(9); var AppendState_1 = __webpack_require__(3); -var SingleNodeCallControllerTemplate_1 = __webpack_require__(66); +var SingleNodeCallControllerTemplate_1 = __webpack_require__(67); var NoCustomNodesPreset_1 = __webpack_require__(16); var AbstractCustomNode_1 = __webpack_require__(7); var JavaScriptObfuscator_1 = __webpack_require__(10); @@ -1387,22 +1387,28 @@ exports.DEFAULT_PRESET = Object.freeze({ /* 24 */ /***/ function(module, exports) { -module.exports = require("esprima"); +module.exports = require("chance"); /***/ }, /* 25 */ /***/ function(module, exports) { -module.exports = require("path"); +module.exports = require("esprima"); /***/ }, /* 26 */ /***/ function(module, exports) { -module.exports = require("babel-polyfill"); +module.exports = require("path"); /***/ }, /* 27 */ +/***/ function(module, exports) { + +module.exports = require("babel-polyfill"); + +/***/ }, +/* 28 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1412,13 +1418,13 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var esprima = __webpack_require__(24); +var esprima = __webpack_require__(25); var escodegen = __webpack_require__(13); -var chance_1 = __webpack_require__(82); +var chance_1 = __webpack_require__(24); var ObfuscationResult_1 = __webpack_require__(20); -var Obfuscator_1 = __webpack_require__(28); -var Options_1 = __webpack_require__(57); -var SourceMapCorrector_1 = __webpack_require__(29); +var Obfuscator_1 = __webpack_require__(29); +var Options_1 = __webpack_require__(58); +var SourceMapCorrector_1 = __webpack_require__(30); var Utils_1 = __webpack_require__(0); var JavaScriptObfuscatorInternal = function () { @@ -1475,7 +1481,7 @@ JavaScriptObfuscatorInternal.escodegenParams = { exports.JavaScriptObfuscatorInternal = JavaScriptObfuscatorInternal; /***/ }, -/* 28 */ +/* 29 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1490,23 +1496,23 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var estraverse = __webpack_require__(4); var AppendState_1 = __webpack_require__(3); var NodeType_1 = __webpack_require__(6); -var CatchClauseObfuscator_1 = __webpack_require__(47); -var ConsoleOutputNodesGroup_1 = __webpack_require__(42); -var DebugProtectionNodesGroup_1 = __webpack_require__(43); -var DomainLockNodesGroup_1 = __webpack_require__(44); -var FunctionDeclarationObfuscator_1 = __webpack_require__(48); -var FunctionObfuscator_1 = __webpack_require__(49); -var LabeledStatementObfuscator_1 = __webpack_require__(50); -var LiteralObfuscator_1 = __webpack_require__(51); -var MemberExpressionObfuscator_1 = __webpack_require__(52); -var MethodDefinitionObfuscator_1 = __webpack_require__(53); +var CatchClauseObfuscator_1 = __webpack_require__(48); +var ConsoleOutputNodesGroup_1 = __webpack_require__(43); +var DebugProtectionNodesGroup_1 = __webpack_require__(44); +var DomainLockNodesGroup_1 = __webpack_require__(45); +var FunctionDeclarationObfuscator_1 = __webpack_require__(49); +var FunctionObfuscator_1 = __webpack_require__(50); +var LabeledStatementObfuscator_1 = __webpack_require__(51); +var LiteralObfuscator_1 = __webpack_require__(52); +var MemberExpressionObfuscator_1 = __webpack_require__(53); +var MethodDefinitionObfuscator_1 = __webpack_require__(54); var Node_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); -var ObjectExpressionObfuscator_1 = __webpack_require__(54); -var SelfDefendingNodesGroup_1 = __webpack_require__(45); -var StackTraceAnalyzer_1 = __webpack_require__(60); -var StringArrayNodesGroup_1 = __webpack_require__(46); -var VariableDeclarationObfuscator_1 = __webpack_require__(55); +var ObjectExpressionObfuscator_1 = __webpack_require__(55); +var SelfDefendingNodesGroup_1 = __webpack_require__(46); +var StackTraceAnalyzer_1 = __webpack_require__(61); +var StringArrayNodesGroup_1 = __webpack_require__(47); +var VariableDeclarationObfuscator_1 = __webpack_require__(56); var Obfuscator = function () { function Obfuscator(options) { @@ -1597,7 +1603,7 @@ Obfuscator.nodeObfuscators = new Map([[NodeType_1.NodeType.ArrowFunctionExpressi exports.Obfuscator = Obfuscator; /***/ }, -/* 29 */ +/* 30 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1655,7 +1661,7 @@ var SourceMapCorrector = function () { exports.SourceMapCorrector = SourceMapCorrector; /***/ }, -/* 30 */ +/* 31 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1714,7 +1720,7 @@ var StringArray = function () { exports.StringArray = StringArray; /***/ }, -/* 31 */ +/* 32 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1726,7 +1732,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var fs = __webpack_require__(85); var mkdirp = __webpack_require__(86); -var path = __webpack_require__(25); +var path = __webpack_require__(26); var Utils_1 = __webpack_require__(0); var CLIUtils = function () { @@ -1806,7 +1812,7 @@ CLIUtils.encoding = 'utf8'; exports.CLIUtils = CLIUtils; /***/ }, -/* 32 */ +/* 33 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1817,11 +1823,11 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var commander = __webpack_require__(84); -var path = __webpack_require__(25); +var path = __webpack_require__(26); var SourceMapMode_1 = __webpack_require__(14); var StringArrayEncoding_1 = __webpack_require__(18); var DefaultPreset_1 = __webpack_require__(23); -var CLIUtils_1 = __webpack_require__(31); +var CLIUtils_1 = __webpack_require__(32); var JavaScriptObfuscator_1 = __webpack_require__(10); var Utils_1 = __webpack_require__(0); @@ -1954,7 +1960,7 @@ var JavaScriptObfuscatorCLI = function () { exports.JavaScriptObfuscatorCLI = JavaScriptObfuscatorCLI; /***/ }, -/* 33 */ +/* 34 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1970,7 +1976,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" __webpack_require__(9); var AppendState_1 = __webpack_require__(3); -var ConsoleOutputDisableExpressionTemplate_1 = __webpack_require__(67); +var ConsoleOutputDisableExpressionTemplate_1 = __webpack_require__(68); var AbstractCustomNode_1 = __webpack_require__(7); var NodeAppender_1 = __webpack_require__(5); var NodeUtils_1 = __webpack_require__(1); @@ -2012,7 +2018,7 @@ var ConsoleOutputDisableExpressionNode = function (_AbstractCustomNode_) { exports.ConsoleOutputDisableExpressionNode = ConsoleOutputDisableExpressionNode; /***/ }, -/* 34 */ +/* 35 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2028,7 +2034,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" __webpack_require__(9); var AppendState_1 = __webpack_require__(3); -var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(68); +var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(69); var AbstractCustomNode_1 = __webpack_require__(7); var NodeAppender_1 = __webpack_require__(5); var NodeUtils_1 = __webpack_require__(1); @@ -2066,7 +2072,7 @@ var DebugProtectionFunctionCallNode = function (_AbstractCustomNode_) { exports.DebugProtectionFunctionCallNode = DebugProtectionFunctionCallNode; /***/ }, -/* 35 */ +/* 36 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2082,7 +2088,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" __webpack_require__(9); var AppendState_1 = __webpack_require__(3); -var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(69); +var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(70); var AbstractCustomNode_1 = __webpack_require__(7); var NodeAppender_1 = __webpack_require__(5); var NodeUtils_1 = __webpack_require__(1); @@ -2120,7 +2126,7 @@ var DebugProtectionFunctionIntervalNode = function (_AbstractCustomNode_) { exports.DebugProtectionFunctionIntervalNode = DebugProtectionFunctionIntervalNode; /***/ }, -/* 36 */ +/* 37 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2136,7 +2142,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" __webpack_require__(9); var AppendState_1 = __webpack_require__(3); -var DebugProtectionFunctionTemplate_1 = __webpack_require__(70); +var DebugProtectionFunctionTemplate_1 = __webpack_require__(71); var AbstractCustomNode_1 = __webpack_require__(7); var NodeAppender_1 = __webpack_require__(5); var NodeUtils_1 = __webpack_require__(1); @@ -2182,7 +2188,7 @@ var DebugProtectionFunctionNode = function (_AbstractCustomNode_) { exports.DebugProtectionFunctionNode = DebugProtectionFunctionNode; /***/ }, -/* 37 */ +/* 38 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2200,7 +2206,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" __webpack_require__(9); var AppendState_1 = __webpack_require__(3); -var DomainLockNodeTemplate_1 = __webpack_require__(71); +var DomainLockNodeTemplate_1 = __webpack_require__(72); var AbstractCustomNode_1 = __webpack_require__(7); var NodeAppender_1 = __webpack_require__(5); var NodeUtils_1 = __webpack_require__(1); @@ -2249,7 +2255,7 @@ var DomainLockNode = function (_AbstractCustomNode_) { exports.DomainLockNode = DomainLockNode; /***/ }, -/* 38 */ +/* 39 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2265,7 +2271,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var AppendState_1 = __webpack_require__(3); var NoCustomNodesPreset_1 = __webpack_require__(16); -var SelfDefendingTemplate_1 = __webpack_require__(72); +var SelfDefendingTemplate_1 = __webpack_require__(73); var AbstractCustomNode_1 = __webpack_require__(7); var NodeAppender_1 = __webpack_require__(5); var JavaScriptObfuscator_1 = __webpack_require__(10); @@ -2310,7 +2316,7 @@ var SelfDefendingUnicodeNode = function (_AbstractCustomNode_) { exports.SelfDefendingUnicodeNode = SelfDefendingUnicodeNode; /***/ }, -/* 39 */ +/* 40 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2330,12 +2336,12 @@ __webpack_require__(9); var AppendState_1 = __webpack_require__(3); var StringArrayEncoding_1 = __webpack_require__(18); var NoCustomNodesPreset_1 = __webpack_require__(16); -var AtobTemplate_1 = __webpack_require__(64); -var Rc4Template_1 = __webpack_require__(65); -var SelfDefendingTemplate_1 = __webpack_require__(73); -var StringArrayBase64DecodeNodeTemplate_1 = __webpack_require__(74); -var StringArrayCallsWrapperTemplate_1 = __webpack_require__(75); -var StringArrayRC4DecodeNodeTemplate_1 = __webpack_require__(76); +var AtobTemplate_1 = __webpack_require__(65); +var Rc4Template_1 = __webpack_require__(66); +var SelfDefendingTemplate_1 = __webpack_require__(74); +var StringArrayBase64DecodeNodeTemplate_1 = __webpack_require__(75); +var StringArrayCallsWrapperTemplate_1 = __webpack_require__(76); +var StringArrayRC4DecodeNodeTemplate_1 = __webpack_require__(77); var AbstractCustomNode_1 = __webpack_require__(7); var JavaScriptObfuscator_1 = __webpack_require__(10); var NodeAppender_1 = __webpack_require__(5); @@ -2424,7 +2430,7 @@ var StringArrayCallsWrapper = function (_AbstractCustomNode_) { exports.StringArrayCallsWrapper = StringArrayCallsWrapper; /***/ }, -/* 40 */ +/* 41 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2442,7 +2448,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" __webpack_require__(9); var AppendState_1 = __webpack_require__(3); -var StringArrayTemplate_1 = __webpack_require__(77); +var StringArrayTemplate_1 = __webpack_require__(78); var AbstractCustomNode_1 = __webpack_require__(7); var NodeAppender_1 = __webpack_require__(5); var NodeUtils_1 = __webpack_require__(1); @@ -2511,7 +2517,7 @@ StringArrayNode.ARRAY_RANDOM_LENGTH = 4; exports.StringArrayNode = StringArrayNode; /***/ }, -/* 41 */ +/* 42 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2530,8 +2536,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" __webpack_require__(9); var AppendState_1 = __webpack_require__(3); var NoCustomNodesPreset_1 = __webpack_require__(16); -var SelfDefendingTemplate_1 = __webpack_require__(78); -var StringArrayRotateFunctionTemplate_1 = __webpack_require__(79); +var SelfDefendingTemplate_1 = __webpack_require__(79); +var StringArrayRotateFunctionTemplate_1 = __webpack_require__(80); var AbstractCustomNode_1 = __webpack_require__(7); var JavaScriptObfuscator_1 = __webpack_require__(10); var NodeAppender_1 = __webpack_require__(5); @@ -2598,7 +2604,7 @@ var StringArrayRotateFunctionNode = function (_AbstractCustomNode_) { exports.StringArrayRotateFunctionNode = StringArrayRotateFunctionNode; /***/ }, -/* 42 */ +/* 43 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2612,7 +2618,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var ConsoleOutputDisableExpressionNode_1 = __webpack_require__(33); +var ConsoleOutputDisableExpressionNode_1 = __webpack_require__(34); var NodeCallsControllerFunctionNode_1 = __webpack_require__(17); var AbstractNodesGroup_1 = __webpack_require__(11); var NodeAppender_1 = __webpack_require__(5); @@ -2645,7 +2651,7 @@ var ConsoleOutputNodesGroup = function (_AbstractNodesGroup_) { exports.ConsoleOutputNodesGroup = ConsoleOutputNodesGroup; /***/ }, -/* 43 */ +/* 44 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2659,9 +2665,9 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var DebugProtectionFunctionCallNode_1 = __webpack_require__(34); -var DebugProtectionFunctionIntervalNode_1 = __webpack_require__(35); -var DebugProtectionFunctionNode_1 = __webpack_require__(36); +var DebugProtectionFunctionCallNode_1 = __webpack_require__(35); +var DebugProtectionFunctionIntervalNode_1 = __webpack_require__(36); +var DebugProtectionFunctionNode_1 = __webpack_require__(37); var AbstractNodesGroup_1 = __webpack_require__(11); var Utils_1 = __webpack_require__(0); @@ -2695,7 +2701,7 @@ var DebugProtectionNodesGroup = function (_AbstractNodesGroup_) { exports.DebugProtectionNodesGroup = DebugProtectionNodesGroup; /***/ }, -/* 44 */ +/* 45 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2709,7 +2715,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var DomainLockNode_1 = __webpack_require__(37); +var DomainLockNode_1 = __webpack_require__(38); var NodeCallsControllerFunctionNode_1 = __webpack_require__(17); var AbstractNodesGroup_1 = __webpack_require__(11); var NodeAppender_1 = __webpack_require__(5); @@ -2742,7 +2748,7 @@ var DomainLockNodesGroup = function (_AbstractNodesGroup_) { exports.DomainLockNodesGroup = DomainLockNodesGroup; /***/ }, -/* 45 */ +/* 46 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2758,7 +2764,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var AppendState_1 = __webpack_require__(3); var NodeCallsControllerFunctionNode_1 = __webpack_require__(17); -var SelfDefendingUnicodeNode_1 = __webpack_require__(38); +var SelfDefendingUnicodeNode_1 = __webpack_require__(39); var AbstractNodesGroup_1 = __webpack_require__(11); var NodeAppender_1 = __webpack_require__(5); var Utils_1 = __webpack_require__(0); @@ -2793,7 +2799,7 @@ var SelfDefendingNodesGroup = function (_AbstractNodesGroup_) { exports.SelfDefendingNodesGroup = SelfDefendingNodesGroup; /***/ }, -/* 46 */ +/* 47 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2808,11 +2814,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var AppendState_1 = __webpack_require__(3); -var StringArrayCallsWrapper_1 = __webpack_require__(39); -var StringArrayNode_1 = __webpack_require__(40); -var StringArrayRotateFunctionNode_1 = __webpack_require__(41); +var StringArrayCallsWrapper_1 = __webpack_require__(40); +var StringArrayNode_1 = __webpack_require__(41); +var StringArrayRotateFunctionNode_1 = __webpack_require__(42); var AbstractNodesGroup_1 = __webpack_require__(11); -var StringArray_1 = __webpack_require__(30); +var StringArray_1 = __webpack_require__(31); var Utils_1 = __webpack_require__(0); var StringArrayNodesGroup = function (_AbstractNodesGroup_) { @@ -2856,7 +2862,7 @@ var StringArrayNodesGroup = function (_AbstractNodesGroup_) { exports.StringArrayNodesGroup = StringArrayNodesGroup; /***/ }, -/* 47 */ +/* 48 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2927,7 +2933,7 @@ var CatchClauseObfuscator = function (_AbstractNodeObfuscat) { exports.CatchClauseObfuscator = CatchClauseObfuscator; /***/ }, -/* 48 */ +/* 49 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3002,7 +3008,7 @@ var FunctionDeclarationObfuscator = function (_AbstractNodeObfuscat) { exports.FunctionDeclarationObfuscator = FunctionDeclarationObfuscator; /***/ }, -/* 49 */ +/* 50 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3083,7 +3089,7 @@ var FunctionObfuscator = function (_AbstractNodeObfuscat) { exports.FunctionObfuscator = FunctionObfuscator; /***/ }, -/* 50 */ +/* 51 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3154,7 +3160,7 @@ var LabeledStatementObfuscator = function (_AbstractNodeObfuscat) { exports.LabeledStatementObfuscator = LabeledStatementObfuscator; /***/ }, -/* 51 */ +/* 52 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3172,7 +3178,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var escodegen = __webpack_require__(13); var AbstractNodeObfuscator_1 = __webpack_require__(8); -var BooleanLiteralReplacer_1 = __webpack_require__(56); +var BooleanLiteralReplacer_1 = __webpack_require__(57); var Node_1 = __webpack_require__(2); var NumberLiteralReplacer_1 = __webpack_require__(22); var StringLiteralReplacer_1 = __webpack_require__(19); @@ -3219,7 +3225,7 @@ var LiteralObfuscator = function (_AbstractNodeObfuscat) { exports.LiteralObfuscator = LiteralObfuscator; /***/ }, -/* 52 */ +/* 53 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3304,7 +3310,7 @@ var MemberExpressionObfuscator = function (_AbstractNodeObfuscat) { exports.MemberExpressionObfuscator = MemberExpressionObfuscator; /***/ }, -/* 53 */ +/* 54 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3363,7 +3369,7 @@ MethodDefinitionObfuscator.ignoredNames = ['constructor']; exports.MethodDefinitionObfuscator = MethodDefinitionObfuscator; /***/ }, -/* 54 */ +/* 55 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3449,7 +3455,7 @@ var ObjectExpressionObfuscator = function (_AbstractNodeObfuscat) { exports.ObjectExpressionObfuscator = ObjectExpressionObfuscator; /***/ }, -/* 55 */ +/* 56 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3527,7 +3533,7 @@ var VariableDeclarationObfuscator = function (_AbstractNodeObfuscat) { exports.VariableDeclarationObfuscator = VariableDeclarationObfuscator; /***/ }, -/* 56 */ +/* 57 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3566,7 +3572,7 @@ var BooleanLiteralReplacer = function (_AbstractReplacer_1$A) { exports.BooleanLiteralReplacer = BooleanLiteralReplacer; /***/ }, -/* 57 */ +/* 58 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3588,11 +3594,11 @@ var __metadata = undefined && undefined.__metadata || function (k, v) { if ((typeof Reflect === "undefined" ? "undefined" : _typeof(Reflect)) === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var class_validator_1 = __webpack_require__(83); -var TSourceMapMode_1 = __webpack_require__(80); -var TStringArrayEncoding_1 = __webpack_require__(81); +var TSourceMapMode_1 = __webpack_require__(81); +var TStringArrayEncoding_1 = __webpack_require__(82); var DefaultPreset_1 = __webpack_require__(23); -var OptionsNormalizer_1 = __webpack_require__(58); -var ValidationErrorsFormatter_1 = __webpack_require__(59); +var OptionsNormalizer_1 = __webpack_require__(59); +var ValidationErrorsFormatter_1 = __webpack_require__(60); var Options = function Options(obfuscatorOptions) { _classCallCheck(this, Options); @@ -3640,7 +3646,7 @@ exports.Options = Options; var _a, _b; /***/ }, -/* 58 */ +/* 59 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3807,7 +3813,7 @@ OptionsNormalizer.normalizerRules = [OptionsNormalizer.domainLockRule, OptionsNo exports.OptionsNormalizer = OptionsNormalizer; /***/ }, -/* 59 */ +/* 60 */ /***/ function(module, exports) { "use strict"; @@ -3874,7 +3880,7 @@ var ValidationErrorsFormatter = function () { exports.ValidationErrorsFormatter = ValidationErrorsFormatter; /***/ }, -/* 60 */ +/* 61 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3886,9 +3892,9 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var estraverse = __webpack_require__(4); var NodeType_1 = __webpack_require__(6); -var FunctionDeclarationCalleeDataExtractor_1 = __webpack_require__(61); -var FunctionExpressionCalleeDataExtractor_1 = __webpack_require__(62); -var ObjectExpressionCalleeDataExtractor_1 = __webpack_require__(63); +var FunctionDeclarationCalleeDataExtractor_1 = __webpack_require__(62); +var FunctionExpressionCalleeDataExtractor_1 = __webpack_require__(63); +var ObjectExpressionCalleeDataExtractor_1 = __webpack_require__(64); var Node_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); @@ -3967,7 +3973,7 @@ StackTraceAnalyzer.limitThreshold = 0.002; exports.StackTraceAnalyzer = StackTraceAnalyzer; /***/ }, -/* 61 */ +/* 62 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4026,7 +4032,7 @@ var FunctionDeclarationCalleeDataExtractor = function () { exports.FunctionDeclarationCalleeDataExtractor = FunctionDeclarationCalleeDataExtractor; /***/ }, -/* 62 */ +/* 63 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4088,7 +4094,7 @@ var FunctionExpressionCalleeDataExtractor = function () { exports.FunctionExpressionCalleeDataExtractor = FunctionExpressionCalleeDataExtractor; /***/ }, -/* 63 */ +/* 64 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4220,7 +4226,7 @@ var ObjectExpressionCalleeDataExtractor = function () { exports.ObjectExpressionCalleeDataExtractor = ObjectExpressionCalleeDataExtractor; /***/ }, -/* 64 */ +/* 65 */ /***/ function(module, exports) { "use strict"; @@ -4232,7 +4238,7 @@ function AtobTemplate() { exports.AtobTemplate = AtobTemplate; /***/ }, -/* 65 */ +/* 66 */ /***/ function(module, exports) { "use strict"; @@ -4244,7 +4250,7 @@ function Rc4Template() { exports.Rc4Template = Rc4Template; /***/ }, -/* 66 */ +/* 67 */ /***/ function(module, exports) { "use strict"; @@ -4256,7 +4262,7 @@ function SingleNodeCallControllerTemplate() { exports.SingleNodeCallControllerTemplate = SingleNodeCallControllerTemplate; /***/ }, -/* 67 */ +/* 68 */ /***/ function(module, exports) { "use strict"; @@ -4268,7 +4274,7 @@ function ConsoleOutputDisableExpressionTemplate() { exports.ConsoleOutputDisableExpressionTemplate = ConsoleOutputDisableExpressionTemplate; /***/ }, -/* 68 */ +/* 69 */ /***/ function(module, exports) { "use strict"; @@ -4280,7 +4286,7 @@ function DebugProtectionFunctionCallTemplate() { exports.DebugProtectionFunctionCallTemplate = DebugProtectionFunctionCallTemplate; /***/ }, -/* 69 */ +/* 70 */ /***/ function(module, exports) { "use strict"; @@ -4292,7 +4298,7 @@ function DebugProtectionFunctionIntervalTemplate() { exports.DebugProtectionFunctionIntervalTemplate = DebugProtectionFunctionIntervalTemplate; /***/ }, -/* 70 */ +/* 71 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4305,7 +4311,7 @@ function DebugProtectionFunctionTemplate() { exports.DebugProtectionFunctionTemplate = DebugProtectionFunctionTemplate; /***/ }, -/* 71 */ +/* 72 */ /***/ function(module, exports) { "use strict"; @@ -4317,7 +4323,7 @@ function DomainLockNodeTemplate() { exports.DomainLockNodeTemplate = DomainLockNodeTemplate; /***/ }, -/* 72 */ +/* 73 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4330,7 +4336,7 @@ function SelfDefendingTemplate() { exports.SelfDefendingTemplate = SelfDefendingTemplate; /***/ }, -/* 73 */ +/* 74 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4343,7 +4349,7 @@ function SelfDefendingTemplate() { exports.SelfDefendingTemplate = SelfDefendingTemplate; /***/ }, -/* 74 */ +/* 75 */ /***/ function(module, exports) { "use strict"; @@ -4355,7 +4361,7 @@ function StringArrayBase64DecodeNodeTemplate() { exports.StringArrayBase64DecodeNodeTemplate = StringArrayBase64DecodeNodeTemplate; /***/ }, -/* 75 */ +/* 76 */ /***/ function(module, exports) { "use strict"; @@ -4367,7 +4373,7 @@ function StringArrayCallsWrapperTemplate() { exports.StringArrayCallsWrapperTemplate = StringArrayCallsWrapperTemplate; /***/ }, -/* 76 */ +/* 77 */ /***/ function(module, exports) { "use strict"; @@ -4379,7 +4385,7 @@ function StringArrayRc4DecodeNodeTemplate() { exports.StringArrayRc4DecodeNodeTemplate = StringArrayRc4DecodeNodeTemplate; /***/ }, -/* 77 */ +/* 78 */ /***/ function(module, exports) { "use strict"; @@ -4391,7 +4397,7 @@ function StringArrayTemplate() { exports.StringArrayTemplate = StringArrayTemplate; /***/ }, -/* 78 */ +/* 79 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4404,7 +4410,7 @@ function SelfDefendingTemplate() { exports.SelfDefendingTemplate = SelfDefendingTemplate; /***/ }, -/* 79 */ +/* 80 */ /***/ function(module, exports) { "use strict"; @@ -4415,13 +4421,6 @@ function StringArrayRotateFunctionTemplate() { } exports.StringArrayRotateFunctionTemplate = StringArrayRotateFunctionTemplate; -/***/ }, -/* 80 */ -/***/ function(module, exports) { - -"use strict"; -"use strict"; - /***/ }, /* 81 */ /***/ function(module, exports) { @@ -4433,7 +4432,8 @@ exports.StringArrayRotateFunctionTemplate = StringArrayRotateFunctionTemplate; /* 82 */ /***/ function(module, exports) { -module.exports = require("chance"); +"use strict"; +"use strict"; /***/ }, /* 83 */ @@ -4460,8 +4460,7 @@ module.exports = require("fs"); module.exports = require("mkdirp"); /***/ }, -/* 87 */, -/* 88 */ +/* 87 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4469,7 +4468,7 @@ module.exports = require("mkdirp"); var JavaScriptObfuscator_1 = __webpack_require__(10); if (!global._babelPolyfill) { - __webpack_require__(26); + __webpack_require__(27); } module.exports = JavaScriptObfuscator_1.JavaScriptObfuscator; From bcbaa3ea76e72bcf81bf517588ae9ea35f88bff9 Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Mon, 21 Nov 2016 22:32:01 +0300 Subject: [PATCH 5/6] readme update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 0b8ed085..986b7c35 100644 --- a/README.md +++ b/README.md @@ -225,6 +225,8 @@ Type: `number` Default: `0` This option sets seed for random generator. This is useful for creating repeatable results. +If seed is `0` - random generator will work without seed. + ### `selfDefending` Type: `boolean` Default: `true` From 775d78844563334acc81d88ddf5b48b6bc06714c Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Mon, 21 Nov 2016 22:33:10 +0300 Subject: [PATCH 6/6] changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ca99c3d..c67995fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ Change Log === -v0.8.1 +v0.8.2 --- * New option `seed` sets seed for random generator. This is useful for creating repeatable results. * IE8 runtime error fix.