UNPKG

@cute-dw/core

Version:

This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need

313 lines 48.8 kB
import * as t from './t'; import { parseExpression } from '@babel/parser'; import { Functions } from './Functions'; import { Strings } from '../Strings'; // | "ObjectProperty"; export class CodeBlock { /** * @constructor * @param input String expression to evaluate * @param bindContext Allow to bind a context object to the `this` keyword in the object's methods (if defined) */ constructor(input, bindContext = true) { this._error = null; this._expr = null; this._ast = null; this._bindContext = false; this._objFunc = new Map(); this._handlers = { BinaryExpression: (ast, context, environment) => { switch (ast.operator) { case '+': return this.evaluate(ast.left, context, environment) + this.evaluate(ast.right, context, environment); case '-': return this.evaluate(ast.left, context, environment) - this.evaluate(ast.right, context, environment); case '**': /*+ Exponent */ return Math.pow(this.evaluate(ast.left, context, environment), this.evaluate(ast.right, context, environment)); case '*': return this.evaluate(ast.left, context, environment) * this.evaluate(ast.right, context, environment); case '/': return this.evaluate(ast.left, context, environment) / this.evaluate(ast.right, context, environment); case '%': /* modules */ return this.evaluate(ast.left, context, environment) % this.evaluate(ast.right, context, environment); case '??': /* if (null || undefined, exp2, exp1) */ return this.evaluate(ast.left, context, environment) ?? this.evaluate(ast.right, context, environment); case '===': return this.evaluate(ast.left, context, environment) === this.evaluate(ast.right, context, environment); case '==': return this.evaluate(ast.left, context, environment) == this.evaluate(ast.right, context, environment); case '!==': return this.evaluate(ast.left, context, environment) !== this.evaluate(ast.right, context, environment); case '!=': return this.evaluate(ast.left, context, environment) != this.evaluate(ast.right, context, environment); case '>': return this.evaluate(ast.left, context, environment) > this.evaluate(ast.right, context, environment); case '>=': return this.evaluate(ast.left, context, environment) >= this.evaluate(ast.right, context, environment); case '<': return this.evaluate(ast.left, context, environment) < this.evaluate(ast.right, context, environment); case '<=': return this.evaluate(ast.left, context, environment) <= this.evaluate(ast.right, context, environment); case 'in': { var right = this.evaluate(ast.right, context, environment); if (!right) return false; if (typeof right === 'object' && right instanceof Array) { return right.indexOf(this.evaluate(ast.left, context, environment)) !== -1; } return false; } case '&': return this.evaluate(ast.left, context, environment) & this.evaluate(ast.right, context, environment); case '|': return this.evaluate(ast.left, context, environment) | this.evaluate(ast.right, context, environment); case '^': return this.evaluate(ast.left, context, environment) ^ this.evaluate(ast.right, context, environment); case '>>>': return this.evaluate(ast.left, context, environment) >> this.evaluate(ast.right, context, environment); case '>>': return this.evaluate(ast.left, context, environment) >> this.evaluate(ast.right, context, environment); case '<<': return this.evaluate(ast.left, context, environment) << this.evaluate(ast.right, context, environment); default: throw new SyntaxError(`Unknown binary expression: ${ast.operator}`); } }, ConditionalExpression: (ast, context, environment) => { return this.evaluate(ast.test, context, environment) ? this.evaluate(ast.consequent, context, environment) : this.evaluate(ast.alternate, context, environment); }, LogicalExpression: (ast, context, environment) => { switch (ast.operator) { case '&&': /* AND */ return this.evaluate(ast.left, context, environment) && this.evaluate(ast.right, context, environment); case '||': /* OR */ return this.evaluate(ast.left, context, environment) || this.evaluate(ast.right, context, environment); case '??': /* ?? */ return this.evaluate(ast.left, context, environment) ?? this.evaluate(ast.right, context, environment); default: throw new SyntaxError(`Unknown logical expression: ${ast.operator}`); } }, UnaryExpression: (ast, context, environment) => { switch (ast.operator) { case '!': return !this.evaluate(ast.argument, context, environment); case '-': return -this.evaluate(ast.argument, context, environment); case '+': /* converts to Number */ return +this.evaluate(ast.argument, context, environment); case '~': /* bits invertion */ return ~this.evaluate(ast.argument, context, environment); case 'typeof': /* */ return typeof this.evaluate(ast.argument, context, environment); case 'void': /* */ return void this.evaluate(ast.argument, context, environment); default: throw new SyntaxError(`Unknown unary expression: ${ast.operator}`); } }, Identifier: (ast, context, environment) => { switch (ast.name) { case 'undefined': return undefined; //case 'null': // return null; default: return context[ast.name]; } // throw new Error("Unknown identifier"); }, CallExpression: (ast, context, environment) => { if (!t.isV8IntrinsicIdentifier(ast.callee) && t.isIdentifier(ast.callee)) { let func; if (typeof (context[ast.callee.name]) === "function") { func = context[ast.callee.name]; } else { func = this.getFunction(ast.callee.name) || Functions.getFunction(ast.callee.name); } if (func) { return this.callFunc(func, ast.arguments, context, environment); } throw new SyntaxError(`Function '${ast.callee.name}' did not be resigtered.`); /* var self = this; var args = ast.arguments.map(function (arg:any) { return self.evaluate(arg, context); }); return func.call.apply(func,[null, ...args]); */ } throw new SyntaxError(`Unknown call expression: ${ast.callee.name}`); }, MemberExpression: (ast, context, environment) => { var obj = this.evaluate(ast.object, context, environment); if (!obj) return undefined; if (t.isIdentifier(ast.property)) { return this.evaluate(ast.property, obj, environment); } if (t.isMemberExpression(ast.property)) { return obj[this.evaluate(ast.property, context, environment)]; } if (t.isNumericLiteral(ast.property) || t.isStringLiteral(ast.property)) { return obj[ast.property.value]; } if ((t.isBinaryExpression(ast.property) || t.isLogicalExpression(ast.property)) && typeof obj.filter === 'function') { let self = this; return obj.filter(function (item) { return self.evaluate(ast.property, { context: context, __scope: item }, environment); }); } throw new SyntaxError(`Unknown member expression: ${ast.property}`); }, ThisExpression: (ast, context, environment) => { return context.__scope; }, NumericLiteral: (ast) => { return ast.value; }, BigIntLiteral: (ast) => { /* es2020 return BigInt(ast.value); */ return ast.value; }, StringLiteral: (ast) => { return ast.value; }, BooleanLiteral: (ast) => { return ast.value; }, NullLiteral: (ast) => { return null; }, RegExpLiteral: (ast) => { return new RegExp(ast.value); }, ArrayExpression: (ast, context, environment) => { let self = this; return ast.elements.map(function (elem) { return self.evaluate(elem, context, environment); }); }, ObjectExpression: (ast, context, environment) => { let obj = {}; let len = ast.properties.length; let name; let val; let child; for (let i = 0; i < len; i++) { child = ast.properties[i]; if (t.isObjectProperty(child)) { if (t.isIdentifier(child.key)) { name = child.key.name; } else { name = this.evaluate(child.key, context, environment); } val = this.evaluate(child.value, context, environment); obj[name] = val; } } return obj; } }; try { this._bindContext = bindContext ?? true; if (typeof input === "string") { this._expr = Strings.trimAll(input); this._ast = parseExpression(this._expr || "undefined"); } } catch (err) { this._error = `Parser error: ${err}\nExpression: ${input}`; } } /** * @readonly */ get error() { return this._error; } /** * @readonly */ get expression() { return this._expr; } /** * @readonly */ get bindContext() { return this._bindContext; } /** * Evaluates expression on specified context object * @param {Object} context Any object on which you want to evaluate expression. If context is not specified only Global/Window properties enabled. * @param {any} environment Any additional options * @returns Result of evaluation */ eval(context = {}, environment) { // {} - global context if (this.error) { throw this.error; } let res = undefined; if (this._ast && context) { res = this.evaluate(this._ast, context, environment); } return res; } /** * Registers function that will be understandable in the expression * @param name Function name * @param func Function object */ registerFunction(name, func) { name = name.trim().toUpperCase(); this._objFunc.set(name, func); } /** * Registers named function that will be understandable in the expression * @param func Function object */ registerNamedFunction(func) { if (func) { let name = func.name.toUpperCase(); this._objFunc.set(name, func); } } /** * Gets function object by its name. * @param name The case insensitive name of the function. * @returns Function object if it was registered, else undefined */ getFunction(name) { name = (name.trim()).toUpperCase(); return this._objFunc.get(name); } /** * Evaluate expression that was set in constructor * @param ast * @param context * @returns {*} * * @ignore */ evaluate(ast, context, environment) { //return this.Handlers[ast.type as keyof typeof Handlers](ast, context); return this._handlers[ast.type](ast, context, environment); } /** * * @param func * @param astArgs * @param context * @returns */ callFunc(func, astArgs, context, environment) { let thisArg = undefined; if (this.bindContext) { thisArg = context; } let args = astArgs.map((arg) => { return this.evaluate(arg, context, environment); }); return func.bind(thisArg)(...args); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29kZUJsb2NrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3V0ZS1jb3JlL3NyYy9saWIvdXRpbC9ldmFsdWF0b3IvQ29kZUJsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBa0JyQyx1QkFBdUI7QUFHdkIsTUFBTSxPQUFPLFNBQVM7SUFNcEI7Ozs7T0FJRztJQUNILFlBQVksS0FBb0IsRUFBRSxjQUF1QixJQUFJO1FBVnJELFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBQzdCLFVBQUssR0FBa0IsSUFBSSxDQUFDO1FBQzVCLFNBQUksR0FBZSxJQUFJLENBQUM7UUFDeEIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsYUFBUSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBeUd2QyxjQUFTLEdBQUc7WUFDbEIsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFRLEVBQUUsT0FBWSxFQUFFLFdBQWlCLEVBQUUsRUFBRTtnQkFDOUQsUUFBUSxHQUFHLENBQUMsUUFBUSxFQUFFO29CQUNwQixLQUFLLEdBQUc7d0JBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQ3hHLEtBQUssR0FBRzt3QkFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLEdB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LENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDbEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0NBc05GIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdCBmcm9tICcuL3QnO1xyXG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24gfSBmcm9tICdAYmFiZWwvcGFyc2VyJztcclxuaW1wb3J0IHsgRnVuY3Rpb25zIH0gZnJvbSAnLi9GdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBTdHJpbmdzIH0gZnJvbSAnLi4vU3RyaW5ncyc7XHJcblxyXG50eXBlIEV4cHJlc3Npb25UeXBlID1cclxuICBcIkJpbmFyeUV4cHJlc3Npb25cIlxyXG4gIHwgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIlxyXG4gIHwgXCJMb2dpY2FsRXhwcmVzc2lvblwiXHJcbiAgfCBcIlVuYXJ5RXhwcmVzc2lvblwiXHJcbiAgfCBcIklkZW50aWZpZXJcIlxyXG4gIHwgXCJDYWxsRXhwcmVzc2lvblwiXHJcbiAgfCBcIk1lbWJlckV4cHJlc3Npb25cIlxyXG4gIHwgXCJUaGlzRXhwcmVzc2lvblwiXHJcbiAgfCBcIk51bWVyaWNMaXRlcmFsXCJcclxuICB8IFwiQmlnSW50TGl0ZXJhbFwiXHJcbiAgfCBcIlN0cmluZ0xpdGVyYWxcIlxyXG4gIHwgXCJCb29sZWFuTGl0ZXJhbFwiXHJcbiAgfCBcIk51bGxMaXRlcmFsXCJcclxuICB8IFwiQXJyYXlFeHByZXNzaW9uXCJcclxuICB8IFwiT2JqZWN0RXhwcmVzc2lvblwiO1xyXG4vLyAgfCBcIk9iamVjdFByb3BlcnR5XCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIENvZGVCbG9jayB7XHJcbiAgcHJpdmF0ZSBfZXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2V4cHI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2FzdDogYW55IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfYmluZENvbnRleHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9vYmpGdW5jID0gbmV3IE1hcDxzdHJpbmcsIEZ1bmN0aW9uPigpO1xyXG4gIC8qKlxyXG4gICAqIEBjb25zdHJ1Y3RvclxyXG4gICAqIEBwYXJhbSBpbnB1dCAgIFN0cmluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlXHJcbiAgICogQHBhcmFtIGJpbmRDb250ZXh0IEFsbG93IHRvIGJpbmQgYSBjb250ZXh0IG9iamVjdCB0byB0aGUgYHRoaXNgIGtleXdvcmQgaW4gdGhlIG9iamVjdCdzIG1ldGhvZHMgKGlmIGRlZmluZWQpXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoaW5wdXQ6IHN0cmluZyB8IG51bGwsIGJpbmRDb250ZXh0OiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5fYmluZENvbnRleHQgPSBiaW5kQ29udGV4dCA/PyB0cnVlO1xyXG5cclxuICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIHRoaXMuX2V4cHIgPSBTdHJpbmdzLnRyaW1BbGwoaW5wdXQpIGFzIHN0cmluZztcclxuICAgICAgICB0aGlzLl9hc3QgPSBwYXJzZUV4cHJlc3Npb24odGhpcy5fZXhwciB8fCBcInVuZGVmaW5lZFwiKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgICAgdGhpcy5fZXJyb3IgPSBgUGFyc2VyIGVycm9yOiAke2Vycn1cXG5FeHByZXNzaW9uOiAke2lucHV0fWA7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEByZWFkb25seVxyXG4gICAqL1xyXG4gIGdldCBlcnJvcigpOiBzdHJpbmcgfCBudWxsIHsgcmV0dXJuIHRoaXMuX2Vycm9yOyB9XHJcbiAgLyoqXHJcbiAgICogQHJlYWRvbmx5XHJcbiAgICovXHJcbiAgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHwgbnVsbCB7IHJldHVybiB0aGlzLl9leHByOyB9XHJcbiAgLyoqXHJcbiAgICogQHJlYWRvbmx5XHJcbiAgICovXHJcbiAgZ2V0IGJpbmRDb250ZXh0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fYmluZENvbnRleHQ7IH1cclxuICAvKipcclxuICAgKiBFdmFsdWF0ZXMgZXhwcmVzc2lvbiBvbiBzcGVjaWZpZWQgY29udGV4dCBvYmplY3RcclxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCAgICBBbnkgb2JqZWN0IG9uIHdoaWNoIHlvdSB3YW50IHRvIGV2YWx1YXRlIGV4cHJlc3Npb24uIElmIGNvbnRleHQgaXMgbm90IHNwZWNpZmllZCBvbmx5IEdsb2JhbC9XaW5kb3cgcHJvcGVydGllcyBlbmFibGVkLlxyXG4gICAqIEBwYXJhbSB7YW55fSBlbnZpcm9ubWVudCAgIEFueSBhZGRpdGlvbmFsIG9wdGlvbnNcclxuICAgKiBAcmV0dXJucyBSZXN1bHQgb2YgZXZhbHVhdGlvblxyXG4gICAqL1xyXG4gIGV2YWwoY29udGV4dDogT2JqZWN0ID0ge30sIGVudmlyb25tZW50PzogYW55KTogYW55IHtcclxuICAgIC8vIHt9IC0gZ2xvYmFsIGNvbnRleHRcclxuICAgIGlmICh0aGlzLmVycm9yKSB7XHJcbiAgICAgIHRocm93IHRoaXMuZXJyb3I7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzOiBhbnkgPSB1bmRlZmluZWQ7XHJcbiAgICBpZiAodGhpcy5fYXN0ICYmIGNvbnRleHQpIHtcclxuICAgICAgcmVzID0gdGhpcy5ldmFsdWF0ZSh0aGlzLl9hc3QsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVycyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdW5kZXJzdGFuZGFibGUgaW4gdGhlIGV4cHJlc3Npb25cclxuICAgKiBAcGFyYW0gbmFtZSBGdW5jdGlvbiBuYW1lXHJcbiAgICogQHBhcmFtIGZ1bmMgRnVuY3Rpb24gb2JqZWN0XHJcbiAgICovXHJcbiAgcmVnaXN0ZXJGdW5jdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICBuYW1lID0gbmFtZS50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgIHRoaXMuX29iakZ1bmMuc2V0KG5hbWUsIGZ1bmMpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZWdpc3RlcnMgbmFtZWQgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVuZGVyc3RhbmRhYmxlIGluIHRoZSBleHByZXNzaW9uXHJcbiAgICogQHBhcmFtIGZ1bmMgRnVuY3Rpb24gb2JqZWN0XHJcbiAgICovXHJcbiAgcmVnaXN0ZXJOYW1lZEZ1bmN0aW9uKGZ1bmM6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoZnVuYykge1xyXG4gICAgICBsZXQgbmFtZSA9IGZ1bmMubmFtZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICB0aGlzLl9vYmpGdW5jLnNldChuYW1lLCBmdW5jKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyBmdW5jdGlvbiBvYmplY3QgYnkgaXRzIG5hbWUuXHJcbiAgICogQHBhcmFtIG5hbWUgVGhlIGNhc2UgaW5zZW5zaXRpdmUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXHJcbiAgICogQHJldHVybnMgRnVuY3Rpb24gb2JqZWN0IGlmIGl0IHdhcyByZWdpc3RlcmVkLCBlbHNlIHVuZGVmaW5lZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RnVuY3Rpb24obmFtZTogc3RyaW5nKTogRnVuY3Rpb24gfCB1bmRlZmluZWQge1xyXG4gICAgbmFtZSA9IChuYW1lLnRyaW0oKSkudG9VcHBlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLl9vYmpGdW5jLmdldChuYW1lKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRXZhbHVhdGUgZXhwcmVzc2lvbiB0aGF0IHdhcyBzZXQgaW4gY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gYXN0XHJcbiAgICogQHBhcmFtIGNvbnRleHRcclxuICAgKiBAcmV0dXJucyB7Kn1cclxuICAgKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZXZhbHVhdGUoYXN0OiBhbnksIGNvbnRleHQ6IGFueSwgZW52aXJvbm1lbnQ/OiBhbnkpOiBhbnkge1xyXG4gICAgLy9yZXR1cm4gdGhpcy5IYW5kbGVyc1thc3QudHlwZSBhcyBrZXlvZiB0eXBlb2YgSGFuZGxlcnNdKGFzdCwgY29udGV4dCk7XHJcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlcnNbYXN0LnR5cGUgYXMgRXhwcmVzc2lvblR5cGVdKGFzdCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBmdW5jXHJcbiAgICogQHBhcmFtIGFzdEFyZ3NcclxuICAgKiBAcGFyYW0gY29udGV4dFxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGNhbGxGdW5jKGZ1bmM6IEZ1bmN0aW9uLCBhc3RBcmdzOiBhbnlbXSwgY29udGV4dDogYW55LCBlbnZpcm9ubWVudD86IGFueSkge1xyXG4gICAgbGV0IHRoaXNBcmcgPSB1bmRlZmluZWQ7XHJcbiAgICBpZiAodGhpcy5iaW5kQ29udGV4dCkge1xyXG4gICAgICB0aGlzQXJnID0gY29udGV4dDtcclxuICAgIH1cclxuICAgIGxldCBhcmdzID0gYXN0QXJncy5tYXAoKGFyZzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGFyZywgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVuYy5iaW5kKHRoaXNBcmcpKC4uLmFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlcnMgPSB7XHJcbiAgICBCaW5hcnlFeHByZXNzaW9uOiAoYXN0OiBhbnksIGNvbnRleHQ6IGFueSwgZW52aXJvbm1lbnQ/OiBhbnkpID0+IHtcclxuICAgICAgc3dpdGNoIChhc3Qub3BlcmF0b3IpIHtcclxuICAgICAgICBjYXNlICcrJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGFzdC5sZWZ0LCBjb250ZXh0LCBlbnZpcm9ubWVudCkgKyB0aGlzLmV2YWx1YXRlKGFzdC5yaWdodCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGNhc2UgJy0nOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoYXN0LmxlZnQsIGNvbnRleHQsIGVudmlyb25tZW50KSAtIHRoaXMuZXZhbHVhdGUoYXN0LnJpZ2h0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAnKionOiAgLyorIEV4cG9uZW50ICovXHJcbiAgICAgICAgICByZXR1cm4gTWF0aC5wb3codGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpLCB0aGlzLmV2YWx1YXRlKGFzdC5yaWdodCwgY29udGV4dCwgZW52aXJvbm1lbnQpKTtcclxuICAgICAgICBjYXNlICcqJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGFzdC5sZWZ0LCBjb250ZXh0LCBlbnZpcm9ubWVudCkgKiB0aGlzLmV2YWx1YXRlKGFzdC5yaWdodCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGNhc2UgJy8nOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoYXN0LmxlZnQsIGNvbnRleHQsIGVudmlyb25tZW50KSAvIHRoaXMuZXZhbHVhdGUoYXN0LnJpZ2h0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAnJSc6ICAgLyogbW9kdWxlcyAqL1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoYXN0LmxlZnQsIGNvbnRleHQsIGVudmlyb25tZW50KSAlIHRoaXMuZXZhbHVhdGUoYXN0LnJpZ2h0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAnPz8nOiAgLyogaWYgKG51bGwgfHwgdW5kZWZpbmVkLCBleHAyLCBleHAxKSAqL1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoYXN0LmxlZnQsIGNvbnRleHQsIGVudmlyb25tZW50KSA/PyB0aGlzLmV2YWx1YXRlKGFzdC5yaWdodCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGNhc2UgJz09PSc6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpID09PSB0aGlzLmV2YWx1YXRlKGFzdC5yaWdodCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGNhc2UgJz09JzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGFzdC5sZWZ0LCBjb250ZXh0LCBlbnZpcm9ubWVudCkgPT0gdGhpcy5ldmFsdWF0ZShhc3QucmlnaHQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBjYXNlICchPT0nOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoYXN0LmxlZnQsIGNvbnRleHQsIGVudmlyb25tZW50KSAhPT0gdGhpcy5ldmFsdWF0ZShhc3QucmlnaHQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBjYXNlICchPSc6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpICE9IHRoaXMuZXZhbHVhdGUoYXN0LnJpZ2h0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAnPic6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpID4gdGhpcy5ldmFsdWF0ZShhc3QucmlnaHQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBjYXNlICc+PSc6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpID49IHRoaXMuZXZhbHVhdGUoYXN0LnJpZ2h0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAnPCc6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpIDwgdGhpcy5ldmFsdWF0ZShhc3QucmlnaHQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBjYXNlICc8PSc6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpIDw9IHRoaXMuZXZhbHVhdGUoYXN0LnJpZ2h0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAnaW4nOiB7XHJcbiAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmV2YWx1YXRlKGFzdC5yaWdodCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgICAgaWYgKCFyaWdodClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiByaWdodCA9PT0gJ29iamVjdCcgJiYgcmlnaHQgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmlnaHQuaW5kZXhPZih0aGlzLmV2YWx1YXRlKGFzdC5sZWZ0LCBjb250ZXh0LCBlbnZpcm9ubWVudCkpICE9PSAtMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSAnJic6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpICYgdGhpcy5ldmFsdWF0ZShhc3QucmlnaHQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBjYXNlICd8JzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGFzdC5sZWZ0LCBjb250ZXh0LCBlbnZpcm9ubWVudCkgfCB0aGlzLmV2YWx1YXRlKGFzdC5yaWdodCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGNhc2UgJ14nOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoYXN0LmxlZnQsIGNvbnRleHQsIGVudmlyb25tZW50KSBeIHRoaXMuZXZhbHVhdGUoYXN0LnJpZ2h0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAnPj4+JzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGFzdC5sZWZ0LCBjb250ZXh0LCBlbnZpcm9ubWVudCkgPj4gdGhpcy5ldmFsdWF0ZShhc3QucmlnaHQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBjYXNlICc+Pic6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpID4+IHRoaXMuZXZhbHVhdGUoYXN0LnJpZ2h0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAnPDwnOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoYXN0LmxlZnQsIGNvbnRleHQsIGVudmlyb25tZW50KSA8PCB0aGlzLmV2YWx1YXRlKGFzdC5yaWdodCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVua25vd24gYmluYXJ5IGV4cHJlc3Npb246ICR7YXN0Lm9wZXJhdG9yfWApO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogKGFzdDogYW55LCBjb250ZXh0OiBhbnksIGVudmlyb25tZW50PzogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGFzdC50ZXN0LCBjb250ZXh0LCBlbnZpcm9ubWVudCkgPyB0aGlzLmV2YWx1YXRlKGFzdC5jb25zZXF1ZW50LCBjb250ZXh0LCBlbnZpcm9ubWVudCkgOiB0aGlzLmV2YWx1YXRlKGFzdC5hbHRlcm5hdGUsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgTG9naWNhbEV4cHJlc3Npb246IChhc3Q6IGFueSwgY29udGV4dDogYW55LCBlbnZpcm9ubWVudD86IGFueSkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKGFzdC5vcGVyYXRvcikge1xyXG4gICAgICAgIGNhc2UgJyYmJzogIC8qIEFORCAqL1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoYXN0LmxlZnQsIGNvbnRleHQsIGVudmlyb25tZW50KSAmJiB0aGlzLmV2YWx1YXRlKGFzdC5yaWdodCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGNhc2UgJ3x8JzogIC8qIE9SICovXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShhc3QubGVmdCwgY29udGV4dCwgZW52aXJvbm1lbnQpIHx8IHRoaXMuZXZhbHVhdGUoYXN0LnJpZ2h0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAnPz8nOiAgLyogPz8gKi9cclxuICAgICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGFzdC5sZWZ0LCBjb250ZXh0LCBlbnZpcm9ubWVudCkgPz8gdGhpcy5ldmFsdWF0ZShhc3QucmlnaHQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmtub3duIGxvZ2ljYWwgZXhwcmVzc2lvbjogJHthc3Qub3BlcmF0b3J9YCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgVW5hcnlFeHByZXNzaW9uOiAoYXN0OiBhbnksIGNvbnRleHQ6IGFueSwgZW52aXJvbm1lbnQ/OiBhbnkpID0+IHtcclxuICAgICAgc3dpdGNoIChhc3Qub3BlcmF0b3IpIHtcclxuICAgICAgICBjYXNlICchJzpcclxuICAgICAgICAgIHJldHVybiAhdGhpcy5ldmFsdWF0ZShhc3QuYXJndW1lbnQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBjYXNlICctJzpcclxuICAgICAgICAgIHJldHVybiAtdGhpcy5ldmFsdWF0ZShhc3QuYXJndW1lbnQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBjYXNlICcrJzogICAvKiBjb252ZXJ0cyB0byBOdW1iZXIgKi9cclxuICAgICAgICAgIHJldHVybiArdGhpcy5ldmFsdWF0ZShhc3QuYXJndW1lbnQsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICBjYXNlICd+JzogICAvKiBiaXRzIGludmVydGlvbiAqL1xyXG4gICAgICAgICAgcmV0dXJuIH50aGlzLmV2YWx1YXRlKGFzdC5hcmd1bWVudCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGNhc2UgJ3R5cGVvZic6ICAgLyogICovXHJcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuZXZhbHVhdGUoYXN0LmFyZ3VtZW50LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgY2FzZSAndm9pZCc6ICAgLyogICovXHJcbiAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmV2YWx1YXRlKGFzdC5hcmd1bWVudCwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVua25vd24gdW5hcnkgZXhwcmVzc2lvbjogJHthc3Qub3BlcmF0b3J9YCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgSWRlbnRpZmllcjogKGFzdDogYW55LCBjb250ZXh0OiBhbnksIGVudmlyb25tZW50PzogYW55KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoYXN0Lm5hbWUpIHtcclxuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAvL2Nhc2UgJ251bGwnOlxyXG4gICAgICAgIC8vICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICByZXR1cm4gY29udGV4dFthc3QubmFtZV07XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBpZGVudGlmaWVyXCIpO1xyXG4gICAgfSxcclxuXHJcbiAgICBDYWxsRXhwcmVzc2lvbjogKGFzdDogYW55LCBjb250ZXh0OiBhbnksIGVudmlyb25tZW50PzogYW55KSA9PiB7XHJcbiAgICAgIGlmICghdC5pc1Y4SW50cmluc2ljSWRlbnRpZmllcihhc3QuY2FsbGVlKSAmJiB0LmlzSWRlbnRpZmllcihhc3QuY2FsbGVlKSkge1xyXG4gICAgICAgIGxldCBmdW5jOiBGdW5jdGlvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiAoY29udGV4dFthc3QuY2FsbGVlLm5hbWVdKSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICBmdW5jID0gY29udGV4dFthc3QuY2FsbGVlLm5hbWVdIGFzIEZ1bmN0aW9uO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmdW5jID0gdGhpcy5nZXRGdW5jdGlvbihhc3QuY2FsbGVlLm5hbWUpIHx8XHJcbiAgICAgICAgICAgIEZ1bmN0aW9ucy5nZXRGdW5jdGlvbihhc3QuY2FsbGVlLm5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZ1bmMpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmNhbGxGdW5jKGZ1bmMsIGFzdC5hcmd1bWVudHMsIGNvbnRleHQsIGVudmlyb25tZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBGdW5jdGlvbiAnJHthc3QuY2FsbGVlLm5hbWV9JyBkaWQgbm90IGJlIHJlc2lndGVyZWQuYCk7XHJcbiAgICAgICAgLypcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBhc3QuYXJndW1lbnRzLm1hcChmdW5jdGlvbiAoYXJnOmFueSkge1xyXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5ldmFsdWF0ZShhcmcsIGNvbnRleHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwuYXBwbHkoZnVuYyxbbnVsbCwgLi4uYXJnc10pO1xyXG4gICAgICAgICovXHJcbiAgICAgIH1cclxuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmtub3duIGNhbGwgZXhwcmVzc2lvbjogJHthc3QuY2FsbGVlLm5hbWV9YCk7XHJcbiAgICB9LFxyXG5cclxuICAgIE1lbWJlckV4cHJlc3Npb246IChhc3Q6IGFueSwgY29udGV4dDogYW55LCBlbnZpcm9ubWVudD86IGFueSkgPT4ge1xyXG4gICAgICB2YXIgb2JqID0gdGhpcy5ldmFsdWF0ZShhc3Qub2JqZWN0LCBjb250ZXh0LCBlbnZpcm9ubWVudCk7XHJcbiAgICAgIGlmICghb2JqKVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIGlmICh0LmlzSWRlbnRpZmllcihhc3QucHJvcGVydHkpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoYXN0LnByb3BlcnR5LCBvYmosIGVudmlyb25tZW50KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodC5pc01lbWJlckV4cHJlc3Npb24oYXN0LnByb3BlcnR5KSkge1xyXG4gICAgICAgIHJldHVybiBvYmpbdGhpcy5ldmFsdWF0ZShhc3QucHJvcGVydHksIGNvbnRleHQsIGVudmlyb25tZW50KV07XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHQuaXNOdW1lcmljTGl0ZXJhbChhc3QucHJvcGVydHkpIHx8IHQuaXNTdHJpbmdMaXRlcmFsKGFzdC5wcm9wZXJ0eSkpIHtcclxuICAgICAgICByZXR1cm4gb2JqW2FzdC5wcm9wZXJ0eS52YWx1ZV07XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCh0LmlzQmluYXJ5RXhwcmVzc2lvbihhc3QucHJvcGVydHkpIHx8IHQuaXNMb2dpY2FsRXhwcmVzc2lvbihhc3QucHJvcGVydHkpKSAmJiB0eXBlb2Ygb2JqLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gb2JqLmZpbHRlcihmdW5jdGlvbiAoaXRlbTogYW55KSB7IHJldHVybiBzZWxmLmV2YWx1YXRlKGFzdC5wcm9wZXJ0eSwgeyBjb250ZXh0OiBjb250ZXh0LCBfX3Njb3BlOiBpdGVtIH0sIGVudmlyb25tZW50KTsgfSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmtub3duIG1lbWJlciBleHByZXNzaW9uOiAke2FzdC5wcm9wZXJ0eX1gKTtcclxuICAgIH0sXHJcblxyXG4gICAgVGhpc0V4cHJlc3Npb246IChhc3Q6IGFueSwgY29udGV4dDogYW55LCBlbnZpcm9ubWVudD86IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gY29udGV4dC5fX3Njb3BlO1xyXG4gICAgfSxcclxuXHJcbiAgICBOdW1lcmljTGl0ZXJhbDogKGFzdDogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBhc3QudmFsdWU7XHJcbiAgICB9LFxyXG4gICAgQmlnSW50TGl0ZXJhbDogKGFzdDogYW55KSA9PiB7XHJcbiAgICAgIC8qIGVzMjAyMFxyXG4gICAgICAgIHJldHVybiBCaWdJbnQoYXN0LnZhbHVlKTtcclxuICAgICAgKi9cclxuICAgICAgcmV0dXJuIGFzdC52YWx1ZTtcclxuICAgIH0sXHJcbiAgICBTdHJpbmdMaXRlcmFsOiAoYXN0OiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGFzdC52YWx1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgQm9vbGVhbkxpdGVyYWw6IChhc3Q6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gYXN0LnZhbHVlO1xyXG4gICAgfSxcclxuXHJcbiAgICBOdWxsTGl0ZXJhbDogKGFzdDogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICBSZWdFeHBMaXRlcmFsOiAoYXN0OiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYXN0LnZhbHVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgQXJyYXlFeHByZXNzaW9uOiAoYXN0OiBhbnksIGNvbnRleHQ6IGFueSwgZW52aXJvbm1lbnQ/OiBhbnkpID0+IHtcclxuICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICByZXR1cm4gYXN0LmVsZW1lbnRzLm1hcChmdW5jdGlvbiAoZWxlbTogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGYuZXZhbHVhdGUoZWxlbSwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgT2JqZWN0RXhwcmVzc2lvbjogKGFzdDogYW55LCBjb250ZXh0OiBhbnksIGVudmlyb25tZW50PzogYW55KSA9PiB7XHJcbiAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgICBsZXQgbGVuOiBudW1iZXIgPSBhc3QucHJvcGVydGllcy5sZW5ndGg7XHJcbiAgICAgIGxldCBuYW1lOiBzdHJpbmc7XHJcbiAgICAgIGxldCB2YWw7XHJcbiAgICAgIGxldCBjaGlsZDtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGNoaWxkID0gYXN0LnByb3BlcnRpZXNbaV07XHJcbiAgICAgICAgaWYgKHQuaXNPYmplY3RQcm9wZXJ0eShjaGlsZCkpIHtcclxuICAgICAgICAgIGlmICh0LmlzSWRlbnRpZmllcihjaGlsZC5rZXkpKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBjaGlsZC5rZXkubmFtZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSB0aGlzLmV2YWx1YXRlKGNoaWxkLmtleSwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFsID0gdGhpcy5ldmFsdWF0ZShjaGlsZC52YWx1ZSwgY29udGV4dCwgZW52aXJvbm1lbnQpO1xyXG4gICAgICAgICAgb2JqW25hbWVdID0gdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=