UNPKG

ember-legacy-class-transform

Version:
333 lines (330 loc) 48.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdatingOpcode = exports.AbstractOpcode = exports.APPEND_OPCODES = exports.AppendOpcodes = exports.Register = undefined; exports.debugSlice = debugSlice; exports.inspect = inspect; var _util = require("@glimmer/util"); /** * Registers * * For the most part, these follows MIPS naming conventions, however the * register numbers are different. */ var Register = exports.Register = undefined; (function (Register) { // $0 or $pc (program counter): pointer into `program` for the next insturction; -1 means exit Register[Register["pc"] = 0] = "pc"; // $1 or $ra (return address): pointer into `program` for the return Register[Register["ra"] = 1] = "ra"; // $2 or $fp (frame pointer): pointer into the `evalStack` for the base of the stack Register[Register["fp"] = 2] = "fp"; // $3 or $sp (stack pointer): pointer into the `evalStack` for the top of the stack Register[Register["sp"] = 3] = "sp"; // $4-$5 or $s0-$s1 (saved): callee saved general-purpose registers Register[Register["s0"] = 4] = "s0"; Register[Register["s1"] = 5] = "s1"; // $6-$7 or $t0-$t1 (temporaries): caller saved general-purpose registers Register[Register["t0"] = 6] = "t0"; Register[Register["t1"] = 7] = "t1"; })(Register || (exports.Register = Register = {})); function debugSlice(env, start, end) { if (!false && false) { /* tslint:disable:no-console */ let { program } = env; let { constants } = program; // console is not available in IE9 if (typeof console === 'undefined') { return; } // IE10 does not have `console.group` if (typeof console.group !== 'function') { return; } console.group(`%c${start}:${end}`, 'color: #999'); for (let i = start; i < end; i = i + 4) { let { type, op1, op2, op3 } = program.opcode(i); let [name, params] = debug(constants, type, op1, op2, op3); console.log(`${i}. ${logOpcode(name, params)}`); } console.groupEnd(); /* tslint:enable:no-console */ } } function logOpcode(type, params) { if (!false && false) { let out = type; if (params) { let args = Object.keys(params).map(p => ` ${p}=${json(params[p])}`).join(''); out += args; } return `(${out})`; } } function json(param) { if (typeof param === 'function') { return '<function>'; } let string; try { string = JSON.stringify(param); } catch (e) { return '<cannot generate JSON>'; } if (string === undefined) { return 'undefined'; } let debug = JSON.parse(string); if (typeof debug === 'object' && debug !== null && debug.GlimmerDebug !== undefined) { return debug.GlimmerDebug; } return string; } function debug(c, op, op1, op2, op3) { if (!false && false) { switch (op) { case 0 /* Bug */: throw (0, _util.unreachable)(); case 1 /* Helper */: return ['Helper', { helper: c.getFunction(op1) }]; case 2 /* Function */: return ['Function', { function: c.getFunction(op1) }]; case 4 /* SetVariable */: return ['SetVariable', { symbol: op1 }]; case 5 /* GetVariable */: return ['GetVariable', { symbol: op1 }]; case 6 /* GetProperty */: return ['GetProperty', { key: c.getString(op1) }]; case 7 /* PushBlock */: return ['PushBlock', { block: c.getBlock(op1) }]; case 8 /* GetBlock */: return ['GetBlock', { symbol: op1 }]; case 9 /* HasBlock */: return ['HasBlock', { block: op1 }]; case 10 /* HasBlockParams */: return ['HasBlockParams', { block: op1 }]; case 11 /* Concat */: return ['Concat', { size: op1 }]; case 12 /* Immediate */: return ['Immediate', { value: op1 }]; case 13 /* Constant */: return ['Constant', { value: c.getOther(op1) }]; case 14 /* PrimitiveReference */: return ['PrimitiveReference', { primitive: op1 }]; case 15 /* Dup */: return ['Dup', { register: Register[op1], offset: op2 }]; case 16 /* Pop */: return ['Pop', { count: op1 }]; case 17 /* Load */: return ['Load', { register: Register[op1] }]; case 18 /* Fetch */: return ['Fetch', { register: Register[op1] }]; /// PRELUDE & EXIT case 19 /* RootScope */: return ['RootScope', { symbols: op1, bindCallerScope: !!op2 }]; case 20 /* ChildScope */: return ['ChildScope', {}]; case 21 /* PopScope */: return ['PopScope', {}]; case 22 /* Return */: return ['Return', {}]; case 23 /* ReturnTo */: return ['ReturnTo', { offset: op1 }]; /// HTML case 24 /* Text */: return ['Text', { text: c.getString(op1) }]; case 25 /* Comment */: return ['Comment', { comment: c.getString(op1) }]; case 26 /* DynamicContent */: return ['DynamicContent', { value: c.getOther(op1) }]; case 27 /* OpenElement */: return ['OpenElement', { tag: c.getString(op1) }]; case 28 /* OpenElementWithOperations */: return ['OpenElementWithOperations', { tag: c.getString(op1) }]; case 29 /* OpenDynamicElement */: return ['OpenDynamicElement', {}]; case 30 /* StaticAttr */: return ['StaticAttr', { name: c.getString(op1), value: c.getString(op2), namespace: op3 ? c.getString(op3) : null }]; case 31 /* DynamicAttr */: return ['DynamicAttr', { name: c.getString(op1), trusting: !!op2 }]; case 32 /* DynamicAttrNS */: return ['DynamicAttrNS', { name: c.getString(op1), ns: c.getString(op2), trusting: !!op2 }]; case 33 /* FlushElement */: return ['FlushElement', {}]; case 34 /* CloseElement */: return ['CloseElement', {}]; /// MODIFIER case 35 /* Modifier */: return ['Modifier', {}]; /// WORMHOLE case 36 /* PushRemoteElement */: return ['PushRemoteElement', {}]; case 37 /* PopRemoteElement */: return ['PopRemoteElement', {}]; /// DYNAMIC SCOPE case 38 /* BindDynamicScope */: return ['BindDynamicScope', {}]; case 39 /* PushDynamicScope */: return ['PushDynamicScope', {}]; case 40 /* PopDynamicScope */: return ['PopDynamicScope', {}]; /// VM case 41 /* CompileDynamicBlock */: return ['CompileDynamicBlock', {}]; case 42 /* InvokeStatic */: return ['InvokeStatic', { block: c.getBlock(op1) }]; case 43 /* InvokeDynamic */: return ['InvokeDynamic', { invoker: c.getOther(op1) }]; case 44 /* Jump */: return ['Jump', { to: op1 }]; case 45 /* JumpIf */: return ['JumpIf', { to: op1 }]; case 46 /* JumpUnless */: return ['JumpUnless', { to: op1 }]; case 47 /* PushFrame */: return ['PushFrame', {}]; case 48 /* PopFrame */: return ['PopFrame', {}]; case 49 /* Enter */: return ['Enter', { args: op1 }]; case 50 /* Exit */: return ['Exit', {}]; case 51 /* Test */: return ['ToBoolean', {}]; /// LISTS case 52 /* EnterList */: return ['EnterList', { start: op1 }]; case 53 /* ExitList */: return ['ExitList', {}]; case 54 /* PutIterator */: return ['PutIterator', {}]; case 55 /* Iterate */: return ['Iterate', { end: op1 }]; /// COMPONENTS case 56 /* PushComponentManager */: return ['PushComponentManager', { definition: c.getOther(op1) }]; case 57 /* PushDynamicComponentManager */: return ['PushDynamicComponentManager', {}]; case 58 /* PushArgs */: return ['PushArgs', { synthetic: !!op2 }]; case 59 /* PrepareArgs */: return ['PrepareArgs', { state: Register[op1] }]; case 60 /* CreateComponent */: return ['CreateComponent', { flags: op1, state: Register[op2] }]; case 61 /* RegisterComponentDestructor */: return ['RegisterComponentDestructor', {}]; case 62 /* PushComponentOperations */: return ['PushComponentOperations', {}]; case 63 /* GetComponentSelf */: return ['GetComponentSelf', { state: Register[op1] }]; case 64 /* GetComponentLayout */: return ['GetComponentLayout', { state: Register[op1] }]; case 65 /* BeginComponentTransaction */: return ['BeginComponentTransaction', {}]; case 66 /* CommitComponentTransaction */: return ['CommitComponentTransaction', {}]; case 67 /* DidCreateElement */: return ['DidCreateElement', { state: Register[op1] }]; case 68 /* DidRenderLayout */: return ['DidRenderLayout', {}]; /// PARTIALS case 69 /* GetPartialTemplate */: return ['CompilePartial', {}]; case 70 /* ResolveMaybeLocal */: return ['ResolveMaybeLocal', { name: c.getString(op1) }]; /// DEBUGGER case 71 /* Debugger */: return ['Debugger', { symbols: c.getOther(op1), evalInfo: c.getArray(op2) }]; /// STATEMENTS case 72 /* Size */: throw (0, _util.unreachable)(); } throw (0, _util.unreachable)(); } return ['', {}]; } class AppendOpcodes { constructor() { this.evaluateOpcode = (0, _util.fillNulls)(72 /* Size */).slice(); } add(name, evaluate) { this.evaluateOpcode[name] = evaluate; } evaluate(vm, opcode, type) { let func = this.evaluateOpcode[type]; if (!false && false) { /* tslint:disable */ let [name, params] = debug(vm.constants, opcode.type, opcode.op1, opcode.op2, opcode.op3); console.log(`${(0, _util.typePos)(vm['pc'])}. ${logOpcode(name, params)}`); // console.log(...debug(vm.constants, type, opcode.op1, opcode.op2, opcode.op3)); /* tslint:enable */ } func(vm, opcode); if (!false && false) { /* tslint:disable */ console.log('%c -> pc: %d, ra: %d, fp: %d, sp: %d, s0: %O, s1: %O, t0: %O, t1: %O', 'color: orange', vm['pc'], vm['ra'], vm['fp'], vm['sp'], vm['s0'], vm['s1'], vm['t0'], vm['t1']); console.log('%c -> eval stack', 'color: red', vm.stack.toArray()); console.log('%c -> scope', 'color: green', vm.scope()['slots'].map(s => s && s['value'] ? s['value']() : s)); console.log('%c -> elements', 'color: blue', vm.elements()['elementStack'].toArray()); /* tslint:enable */ } } } exports.AppendOpcodes = AppendOpcodes; const APPEND_OPCODES = exports.APPEND_OPCODES = new AppendOpcodes(); class AbstractOpcode { constructor() { (0, _util.initializeGuid)(this); } toJSON() { return { guid: this._guid, type: this.type }; } } exports.AbstractOpcode = AbstractOpcode; class UpdatingOpcode extends AbstractOpcode { constructor() { super(...arguments); this.next = null; this.prev = null; } } exports.UpdatingOpcode = UpdatingOpcode; function inspect(opcodes) { let buffer = []; opcodes.forEach((opcode, i) => { _inspect(opcode.toJSON(), buffer, 0, i); }); return buffer.join(''); } function _inspect(opcode, buffer, level, index) { let indentation = []; for (let i = 0; i < level; i++) { indentation.push(' '); } buffer.push(...indentation); buffer.push(`${index}. ${opcode.type}`); if (opcode.args || opcode.details) { buffer.push('('); if (opcode.args) { buffer.push(opcode.args.join(', ')); } if (opcode.details) { let keys = Object.keys(opcode.details); if (keys.length) { if (opcode.args && opcode.args.length) { buffer.push(', '); } buffer.push(keys.map(key => `${key}=${opcode.details && opcode.details[key]}`).join(', ')); } } buffer.push(')'); } buffer.push('\n'); if (opcode.children && opcode.children.length) { for (let i = 0; i < opcode.children.length; i++) { _inspect(opcode.children[i], buffer, level + 1, i); } } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9vcGNvZGVzLmpzIl0sIm5hbWVzIjpbImRlYnVnU2xpY2UiLCJpbnNwZWN0IiwiUmVnaXN0ZXIiLCJlbnYiLCJzdGFydCIsImVuZCIsInByb2dyYW0iLCJjb25zdGFudHMiLCJjb25zb2xlIiwiZ3JvdXAiLCJpIiwidHlwZSIsIm9wMSIsIm9wMiIsIm9wMyIsIm9wY29kZSIsIm5hbWUiLCJwYXJhbXMiLCJkZWJ1ZyIsImxvZyIsImxvZ09wY29kZSIsImdyb3VwRW5kIiwib3V0IiwiYXJncyIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJwIiwianNvbiIsImpvaW4iLCJwYXJhbSIsInN0cmluZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwidW5kZWZpbmVkIiwicGFyc2UiLCJHbGltbWVyRGVidWciLCJjIiwib3AiLCJoZWxwZXIiLCJnZXRGdW5jdGlvbiIsImZ1bmN0aW9uIiwic3ltYm9sIiwia2V5IiwiZ2V0U3RyaW5nIiwiYmxvY2siLCJnZXRCbG9jayIsInNpemUiLCJ2YWx1ZSIsImdldE90aGVyIiwicHJpbWl0aXZlIiwicmVnaXN0ZXIiLCJvZmZzZXQiLCJjb3VudCIsInN5bWJvbHMiLCJiaW5kQ2FsbGVyU2NvcGUiLCJ0ZXh0IiwiY29tbWVudCIsInRhZyIsIm5hbWVzcGFjZSIsInRydXN0aW5nIiwibnMiLCJpbnZva2VyIiwidG8iLCJkZWZpbml0aW9uIiwic3ludGhldGljIiwic3RhdGUiLCJmbGFncyIsImV2YWxJbmZvIiwiZ2V0QXJyYXkiLCJBcHBlbmRPcGNvZGVzIiwiY29uc3RydWN0b3IiLCJldmFsdWF0ZU9wY29kZSIsInNsaWNlIiwiYWRkIiwiZXZhbHVhdGUiLCJ2bSIsImZ1bmMiLCJzdGFjayIsInRvQXJyYXkiLCJzY29wZSIsInMiLCJlbGVtZW50cyIsIkFQUEVORF9PUENPREVTIiwiQWJzdHJhY3RPcGNvZGUiLCJ0b0pTT04iLCJndWlkIiwiX2d1aWQiLCJVcGRhdGluZ09wY29kZSIsImFyZ3VtZW50cyIsIm5leHQiLCJwcmV2Iiwib3Bjb2RlcyIsImJ1ZmZlciIsImZvckVhY2giLCJfaW5zcGVjdCIsImxldmVsIiwiaW5kZXgiLCJpbmRlbnRhdGlvbiIsInB1c2giLCJkZXRhaWxzIiwibGVuZ3RoIiwiY2hpbGRyZW4iXSwibWFwcGluZ3MiOiI7Ozs7OztRQXlCZ0JBLFUsR0FBQUEsVTtRQWtRQUMsTyxHQUFBQSxPOztBQTNSaEI7O0FBRUE7Ozs7OztBQU1PLElBQUlDLHVDQUFKO0FBQ1AsQ0FBQyxVQUFVQSxRQUFWLEVBQW9CO0FBQ2pCO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBQSxhQUFTQSxTQUFTLElBQVQsSUFBaUIsQ0FBMUIsSUFBK0IsSUFBL0I7QUFDQTtBQUNBQSxhQUFTQSxTQUFTLElBQVQsSUFBaUIsQ0FBMUIsSUFBK0IsSUFBL0I7QUFDQUEsYUFBU0EsU0FBUyxJQUFULElBQWlCLENBQTFCLElBQStCLElBQS9CO0FBQ0gsQ0FmRCxFQWVHQSxxQkFoQlFBLFFBZ0JSLEdBQWFBLFdBQVcsRUFBeEIsQ0FmSDtBQWdCTyxTQUFTRixVQUFULENBQW9CRyxHQUFwQixFQUF5QkMsS0FBekIsRUFBZ0NDLEdBQWhDLEVBQXFDO0FBQ3hDLFFBQUksQ0FBQyxLQUFELElBQVUsS0FBZCxFQUFxQjtBQUNqQjtBQUNBLFlBQUksRUFBRUMsT0FBRixLQUFjSCxHQUFsQjtBQUNBLFlBQUksRUFBRUksU0FBRixLQUFnQkQsT0FBcEI7QUFDQTtBQUNBLFlBQUksT0FBT0UsT0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNoQztB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Y2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbml0aWFsaXplR3VpZCwgZmlsbE51bGxzLCB1bnJlYWNoYWJsZSwgdHlwZVBvcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG4vKipcbiAqIFJlZ2lzdGVyc1xuICpcbiAqIEZvciB0aGUgbW9zdCBwYXJ0LCB0aGVzZSBmb2xsb3dzIE1JUFMgbmFtaW5nIGNvbnZlbnRpb25zLCBob3dldmVyIHRoZVxuICogcmVnaXN0ZXIgbnVtYmVycyBhcmUgZGlmZmVyZW50LlxuICovXG5leHBvcnQgdmFyIFJlZ2lzdGVyO1xuKGZ1bmN0aW9uIChSZWdpc3Rlcikge1xuICAgIC8vICQwIG9yICRwYyAocHJvZ3JhbSBjb3VudGVyKTogcG9pbnRlciBpbnRvIGBwcm9ncmFtYCBmb3IgdGhlIG5leHQgaW5zdHVyY3Rpb247IC0xIG1lYW5zIGV4aXRcbiAgICBSZWdpc3RlcltSZWdpc3RlcltcInBjXCJdID0gMF0gPSBcInBjXCI7XG4gICAgLy8gJDEgb3IgJHJhIChyZXR1cm4gYWRkcmVzcyk6IHBvaW50ZXIgaW50byBgcHJvZ3JhbWAgZm9yIHRoZSByZXR1cm5cbiAgICBSZWdpc3RlcltSZWdpc3RlcltcInJhXCJdID0gMV0gPSBcInJhXCI7XG4gICAgLy8gJDIgb3IgJGZwIChmcmFtZSBwb2ludGVyKTogcG9pbnRlciBpbnRvIHRoZSBgZXZhbFN0YWNrYCBmb3IgdGhlIGJhc2Ugb2YgdGhlIHN0YWNrXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJmcFwiXSA9IDJdID0gXCJmcFwiO1xuICAgIC8vICQzIG9yICRzcCAoc3RhY2sgcG9pbnRlcik6IHBvaW50ZXIgaW50byB0aGUgYGV2YWxTdGFja2AgZm9yIHRoZSB0b3Agb2YgdGhlIHN0YWNrXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJzcFwiXSA9IDNdID0gXCJzcFwiO1xuICAgIC8vICQ0LSQ1IG9yICRzMC0kczEgKHNhdmVkKTogY2FsbGVlIHNhdmVkIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnNcbiAgICBSZWdpc3RlcltSZWdpc3RlcltcInMwXCJdID0gNF0gPSBcInMwXCI7XG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJzMVwiXSA9IDVdID0gXCJzMVwiO1xuICAgIC8vICQ2LSQ3IG9yICR0MC0kdDEgKHRlbXBvcmFyaWVzKTogY2FsbGVyIHNhdmVkIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnNcbiAgICBSZWdpc3RlcltSZWdpc3RlcltcInQwXCJdID0gNl0gPSBcInQwXCI7XG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJ0MVwiXSA9IDddID0gXCJ0MVwiO1xufSkoUmVnaXN0ZXIgfHwgKFJlZ2lzdGVyID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z1NsaWNlKGVudiwgc3RhcnQsIGVuZCkge1xuICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGU6bm8tY29uc29sZSAqL1xuICAgICAgICBsZXQgeyBwcm9ncmFtIH0gPSBlbnY7XG4gICAgICAgIGxldCB7IGNvbnN0YW50cyB9ID0gcHJvZ3JhbTtcbiAgICAgICAgLy8gY29uc29sZSBpcyBub3QgYXZhaWxhYmxlIGluIElFOVxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSUUxMCBkb2VzIG5vdCBoYXZlIGBjb25zb2xlLmdyb3VwYFxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUuZ3JvdXAgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmdyb3VwKGAlYyR7c3RhcnR9OiR7ZW5kfWAsICdjb2xvcjogIzk5OScpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgPSBpICsgNCkge1xuICAgICAgICAgICAgbGV0IHsgdHlwZSwgb3AxLCBvcDIsIG9wMyB9ID0gcHJvZ3JhbS5vcGNvZGUoaSk7XG4gICAgICAgICAgICBsZXQgW25hbWUsIHBhcmFtc10gPSBkZWJ1Zyhjb25zdGFudHMsIHR5cGUsIG9wMSwgb3AyLCBvcDMpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7aX0uICR7bG9nT3Bjb2RlKG5hbWUsIHBhcmFtcyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAvKiB0c2xpbnQ6ZW5hYmxlOm5vLWNvbnNvbGUgKi9cbiAgICB9XG59XG5mdW5jdGlvbiBsb2dPcGNvZGUodHlwZSwgcGFyYW1zKSB7XG4gICAgaWYgKCFmYWxzZSAmJiBmYWxzZSkge1xuICAgICAgICBsZXQgb3V0ID0gdHlwZTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgbGV0IGFyZ3MgPSBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcChwID0+IGAgJHtwfT0ke2pzb24ocGFyYW1zW3BdKX1gKS5qb2luKCcnKTtcbiAgICAgICAgICAgIG91dCArPSBhcmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgKCR7b3V0fSlgO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGpzb24ocGFyYW0pIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAnPGZ1bmN0aW9uPic7XG4gICAgfVxuICAgIGxldCBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgICAgc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocGFyYW0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuICc8Y2Fubm90IGdlbmVyYXRlIEpTT04+JztcbiAgICB9XG4gICAgaWYgKHN0cmluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgbGV0IGRlYnVnID0gSlNPTi5wYXJzZShzdHJpbmcpO1xuICAgIGlmICh0eXBlb2YgZGVidWcgPT09ICdvYmplY3QnICYmIGRlYnVnICE9PSBudWxsICYmIGRlYnVnLkdsaW1tZXJEZWJ1ZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBkZWJ1Zy5HbGltbWVyRGVidWc7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmc7XG59XG5mdW5jdGlvbiBkZWJ1ZyhjLCBvcCwgb3AxLCBvcDIsIG9wMykge1xuICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgICAgICAgY2FzZSAwIC8qIEJ1ZyAqLzpcbiAgICAgICAgICAgICAgICB0aHJvdyB1bnJlYWNoYWJsZSgpO1xuICAgICAgICAgICAgY2FzZSAxIC8qIEhlbHBlciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydIZWxwZXInLCB7IGhlbHBlcjogYy5nZXRGdW5jdGlvbihvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSAyIC8qIEZ1bmN0aW9uICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0Z1bmN0aW9uJywgeyBmdW5jdGlvbjogYy5nZXRGdW5jdGlvbihvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSA0IC8qIFNldFZhcmlhYmxlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1NldFZhcmlhYmxlJywgeyBzeW1ib2w6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNSAvKiBHZXRWYXJpYWJsZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydHZXRWYXJpYWJsZScsIHsgc3ltYm9sOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDYgLyogR2V0UHJvcGVydHkgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnR2V0UHJvcGVydHknLCB7IGtleTogYy5nZXRTdHJpbmcob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgNyAvKiBQdXNoQmxvY2sgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaEJsb2NrJywgeyBibG9jazogYy5nZXRCbG9jayhvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSA4IC8qIEdldEJsb2NrICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0dldEJsb2NrJywgeyBzeW1ib2w6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgOSAvKiBIYXNCbG9jayAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydIYXNCbG9jaycsIHsgYmxvY2s6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgMTAgLyogSGFzQmxvY2tQYXJhbXMgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSGFzQmxvY2tQYXJhbXMnLCB7IGJsb2NrOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDExIC8qIENvbmNhdCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDb25jYXQnLCB7IHNpemU6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgMTIgLyogSW1tZWRpYXRlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0ltbWVkaWF0ZScsIHsgdmFsdWU6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgMTMgLyogQ29uc3RhbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29uc3RhbnQnLCB7IHZhbHVlOiBjLmdldE90aGVyKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDE0IC8qIFByaW1pdGl2ZVJlZmVyZW5jZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQcmltaXRpdmVSZWZlcmVuY2UnLCB7IHByaW1pdGl2ZTogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSAxNSAvKiBEdXAgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRHVwJywgeyByZWdpc3RlcjogUmVnaXN0ZXJbb3AxXSwgb2Zmc2V0OiBvcDIgfV07XG4gICAgICAgICAgICBjYXNlIDE2IC8qIFBvcCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQb3AnLCB7IGNvdW50OiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDE3IC8qIExvYWQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnTG9hZCcsIHsgcmVnaXN0ZXI6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICBjYXNlIDE4IC8qIEZldGNoICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0ZldGNoJywgeyByZWdpc3RlcjogUmVnaXN0ZXJbb3AxXSB9XTtcbiAgICAgICAgICAgIC8vLyBQUkVMVURFICYgRVhJVFxuICAgICAgICAgICAgY2FzZSAxOSAvKiBSb290U2NvcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUm9vdFNjb3BlJywgeyBzeW1ib2xzOiBvcDEsIGJpbmRDYWxsZXJTY29wZTogISFvcDIgfV07XG4gICAgICAgICAgICBjYXNlIDIwIC8qIENoaWxkU2NvcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ2hpbGRTY29wZScsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgMjEgLyogUG9wU2NvcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wU2NvcGUnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDIyIC8qIFJldHVybiAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydSZXR1cm4nLCB7fV07XG4gICAgICAgICAgICBjYXNlIDIzIC8qIFJldHVyblRvICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1JldHVyblRvJywgeyBvZmZzZXQ6IG9wMSB9XTtcbiAgICAgICAgICAgIC8vLyBIVE1MXG4gICAgICAgICAgICBjYXNlIDI0IC8qIFRleHQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnVGV4dCcsIHsgdGV4dDogYy5nZXRTdHJpbmcob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgMjUgLyogQ29tbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDb21tZW50JywgeyBjb21tZW50OiBjLmdldFN0cmluZyhvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSAyNiAvKiBEeW5hbWljQ29udGVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydEeW5hbWljQ29udGVudCcsIHsgdmFsdWU6IGMuZ2V0T3RoZXIob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgMjcgLyogT3BlbkVsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnT3BlbkVsZW1lbnQnLCB7IHRhZzogYy5nZXRTdHJpbmcob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgMjggLyogT3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydPcGVuRWxlbWVudFdpdGhPcGVyYXRpb25zJywgeyB0YWc6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI5IC8qIE9wZW5EeW5hbWljRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydPcGVuRHluYW1pY0VsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDMwIC8qIFN0YXRpY0F0dHIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnU3RhdGljQXR0cicsIHsgbmFtZTogYy5nZXRTdHJpbmcob3AxKSwgdmFsdWU6IGMuZ2V0U3RyaW5nKG9wMiksIG5hbWVzcGFjZTogb3AzID8gYy5nZXRTdHJpbmcob3AzKSA6IG51bGwgfV07XG4gICAgICAgICAgICBjYXNlIDMxIC8qIER5bmFtaWNBdHRyICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0R5bmFtaWNBdHRyJywgeyBuYW1lOiBjLmdldFN0cmluZyhvcDEpLCB0cnVzdGluZzogISFvcDIgfV07XG4gICAgICAgICAgICBjYXNlIDMyIC8qIER5bmFtaWNBdHRyTlMgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRHluYW1pY0F0dHJOUycsIHsgbmFtZTogYy5nZXRTdHJpbmcob3AxKSwgbnM6IGMuZ2V0U3RyaW5nKG9wMiksIHRydXN0aW5nOiAhIW9wMiB9XTtcbiAgICAgICAgICAgIGNhc2UgMzMgLyogRmx1c2hFbGVtZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0ZsdXNoRWxlbWVudCcsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgMzQgLyogQ2xvc2VFbGVtZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0Nsb3NlRWxlbWVudCcsIHt9XTtcbiAgICAgICAgICAgIC8vLyBNT0RJRklFUlxuICAgICAgICAgICAgY2FzZSAzNSAvKiBNb2RpZmllciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydNb2RpZmllcicsIHt9XTtcbiAgICAgICAgICAgIC8vLyBXT1JNSE9MRVxuICAgICAgICAgICAgY2FzZSAzNiAvKiBQdXNoUmVtb3RlRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoUmVtb3RlRWxlbWVudCcsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgMzcgLyogUG9wUmVtb3RlRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQb3BSZW1vdGVFbGVtZW50Jywge31dO1xuICAgICAgICAgICAgLy8vIERZTkFNSUMgU0NPUEVcbiAgICAgICAgICAgIGNhc2UgMzggLyogQmluZER5bmFtaWNTY29wZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydCaW5kRHluYW1pY1Njb3BlJywge31dO1xuICAgICAgICAgICAgY2FzZSAzOSAvKiBQdXNoRHluYW1pY1Njb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1B1c2hEeW5hbWljU2NvcGUnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDQwIC8qIFBvcER5bmFtaWNTY29wZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQb3BEeW5hbWljU2NvcGUnLCB7fV07XG4gICAgICAgICAgICAvLy8gVk1cbiAgICAgICAgICAgIGNhc2UgNDEgLyogQ29tcGlsZUR5bmFtaWNCbG9jayAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDb21waWxlRHluYW1pY0Jsb2NrJywge31dO1xuICAgICAgICAgICAgY2FzZSA0MiAvKiBJbnZva2VTdGF0aWMgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSW52b2tlU3RhdGljJywgeyBibG9jazogYy5nZXRCbG9jayhvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSA0MyAvKiBJbnZva2VEeW5hbWljICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0ludm9rZUR5bmFtaWMnLCB7IGludm9rZXI6IGMuZ2V0T3RoZXIob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDQgLyogSnVtcCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydKdW1wJywgeyB0bzogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA0NSAvKiBKdW1wSWYgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSnVtcElmJywgeyB0bzogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA0NiAvKiBKdW1wVW5sZXNzICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0p1bXBVbmxlc3MnLCB7IHRvOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDQ3IC8qIFB1c2hGcmFtZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoRnJhbWUnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDQ4IC8qIFBvcEZyYW1lICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1BvcEZyYW1lJywge31dO1xuICAgICAgICAgICAgY2FzZSA0OSAvKiBFbnRlciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydFbnRlcicsIHsgYXJnczogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA1MCAvKiBFeGl0ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0V4aXQnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDUxIC8qIFRlc3QgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnVG9Cb29sZWFuJywge31dO1xuICAgICAgICAgICAgLy8vIExJU1RTXG4gICAgICAgICAgICBjYXNlIDUyIC8qIEVudGVyTGlzdCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydFbnRlckxpc3QnLCB7IHN0YXJ0OiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDUzIC8qIEV4aXRMaXN0ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0V4aXRMaXN0Jywge31dO1xuICAgICAgICAgICAgY2FzZSA1NCAvKiBQdXRJdGVyYXRvciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXRJdGVyYXRvcicsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNTUgLyogSXRlcmF0ZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydJdGVyYXRlJywgeyBlbmQ6IG9wMSB9XTtcbiAgICAgICAgICAgIC8vLyBDT01QT05FTlRTXG4gICAgICAgICAgICBjYXNlIDU2IC8qIFB1c2hDb21wb25lbnRNYW5hZ2VyICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1B1c2hDb21wb25lbnRNYW5hZ2VyJywgeyBkZWZpbml0aW9uOiBjLmdldE90aGVyKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDU3IC8qIFB1c2hEeW5hbWljQ29tcG9uZW50TWFuYWdlciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXInLCB7fV07XG4gICAgICAgICAgICBjYXNlIDU4IC8qIFB1c2hBcmdzICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1B1c2hBcmdzJywgeyBzeW50aGV0aWM6ICEhb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSA1OSAvKiBQcmVwYXJlQXJncyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQcmVwYXJlQXJncycsIHsgc3RhdGU6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICBjYXNlIDYwIC8qIENyZWF0ZUNvbXBvbmVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDcmVhdGVDb21wb25lbnQnLCB7IGZsYWdzOiBvcDEsIHN0YXRlOiBSZWdpc3RlcltvcDJdIH1dO1xuICAgICAgICAgICAgY2FzZSA2MSAvKiBSZWdpc3RlckNvbXBvbmVudERlc3RydWN0b3IgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUmVnaXN0ZXJDb21wb25lbnREZXN0cnVjdG9yJywge31dO1xuICAgICAgICAgICAgY2FzZSA2MiAvKiBQdXNoQ29tcG9uZW50T3BlcmF0aW9ucyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoQ29tcG9uZW50T3BlcmF0aW9ucycsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNjMgLyogR2V0Q29tcG9uZW50U2VsZiAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydHZXRDb21wb25lbnRTZWxmJywgeyBzdGF0ZTogUmVnaXN0ZXJbb3AxXSB9XTtcbiAgICAgICAgICAgIGNhc2UgNjQgLyogR2V0Q29tcG9uZW50TGF5b3V0ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0dldENvbXBvbmVudExheW91dCcsIHsgc3RhdGU6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICBjYXNlIDY1IC8qIEJlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24gKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQmVnaW5Db21wb25lbnRUcmFuc2FjdGlvbicsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNjYgLyogQ29tbWl0Q29tcG9uZW50VHJhbnNhY3Rpb24gKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29tbWl0Q29tcG9uZW50VHJhbnNhY3Rpb24nLCB7fV07XG4gICAgICAgICAgICBjYXNlIDY3IC8qIERpZENyZWF0ZUVsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRGlkQ3JlYXRlRWxlbWVudCcsIHsgc3RhdGU6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICBjYXNlIDY4IC8qIERpZFJlbmRlckxheW91dCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydEaWRSZW5kZXJMYXlvdXQnLCB7fV07XG4gICAgICAgICAgICAvLy8gUEFSVElBTFNcbiAgICAgICAgICAgIGNhc2UgNjkgLyogR2V0UGFydGlhbFRlbXBsYXRlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NvbXBpbGVQYXJ0aWFsJywge31dO1xuICAgICAgICAgICAgY2FzZSA3MCAvKiBSZXNvbHZlTWF5YmVMb2NhbCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydSZXNvbHZlTWF5YmVMb2NhbCcsIHsgbmFtZTogYy5nZXRTdHJpbmcob3AxKSB9XTtcbiAgICAgICAgICAgIC8vLyBERUJVR0dFUlxuICAgICAgICAgICAgY2FzZSA3MSAvKiBEZWJ1Z2dlciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydEZWJ1Z2dlcicsIHsgc3ltYm9sczogYy5nZXRPdGhlcihvcDEpLCBldmFsSW5mbzogYy5nZXRBcnJheShvcDIpIH1dO1xuICAgICAgICAgICAgLy8vIFNUQVRFTUVOVFNcbiAgICAgICAgICAgIGNhc2UgNzIgLyogU2l6ZSAqLzpcbiAgICAgICAgICAgICAgICB0aHJvdyB1bnJlYWNoYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHVucmVhY2hhYmxlKCk7XG4gICAgfVxuICAgIHJldHVybiBbJycsIHt9XTtcbn1cbmV4cG9ydCBjbGFzcyBBcHBlbmRPcGNvZGVzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZU9wY29kZSA9IGZpbGxOdWxscyg3MiAvKiBTaXplICovKS5zbGljZSgpO1xuICAgIH1cbiAgICBhZGQobmFtZSwgZXZhbHVhdGUpIHtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZU9wY29kZVtuYW1lXSA9IGV2YWx1YXRlO1xuICAgIH1cbiAgICBldmFsdWF0ZSh2bSwgb3Bjb2RlLCB0eXBlKSB7XG4gICAgICAgIGxldCBmdW5jID0gdGhpcy5ldmFsdWF0ZU9wY29kZVt0eXBlXTtcbiAgICAgICAgaWYgKCFmYWxzZSAmJiBmYWxzZSkge1xuICAgICAgICAgICAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgICAgICAgICAgIGxldCBbbmFtZSwgcGFyYW1zXSA9IGRlYnVnKHZtLmNvbnN0YW50cywgb3Bjb2RlLnR5cGUsIG9wY29kZS5vcDEsIG9wY29kZS5vcDIsIG9wY29kZS5vcDMpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7dHlwZVBvcyh2bVsncGMnXSl9LiAke2xvZ09wY29kZShuYW1lLCBwYXJhbXMpfWApO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coLi4uZGVidWcodm0uY29uc3RhbnRzLCB0eXBlLCBvcGNvZGUub3AxLCBvcGNvZGUub3AyLCBvcGNvZGUub3AzKSk7XG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZW5hYmxlICovXG4gICAgICAgIH1cbiAgICAgICAgZnVuYyh2bSwgb3Bjb2RlKTtcbiAgICAgICAgaWYgKCFmYWxzZSAmJiBmYWxzZSkge1xuICAgICAgICAgICAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyAtPiBwYzogJWQsIHJhOiAlZCwgZnA6ICVkLCBzcDogJWQsIHMwOiAlTywgczE6ICVPLCB0MDogJU8sIHQxOiAlTycsICdjb2xvcjogb3JhbmdlJywgdm1bJ3BjJ10sIHZtWydyYSddLCB2bVsnZnAnXSwgdm1bJ3NwJ10sIHZtWydzMCddLCB2bVsnczEnXSwgdm1bJ3QwJ10sIHZtWyd0MSddKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyAtPiBldmFsIHN0YWNrJywgJ2NvbG9yOiByZWQnLCB2bS5zdGFjay50b0FycmF5KCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJyVjIC0+IHNjb3BlJywgJ2NvbG9yOiBncmVlbicsIHZtLnNjb3BlKClbJ3Nsb3RzJ10ubWFwKHMgPT4gcyAmJiBzWyd2YWx1ZSddID8gc1sndmFsdWUnXSgpIDogcykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJyVjIC0+IGVsZW1lbnRzJywgJ2NvbG9yOiBibHVlJywgdm0uZWxlbWVudHMoKVsnZWxlbWVudFN0YWNrJ10udG9BcnJheSgpKTtcbiAgICAgICAgICAgIC8qIHRzbGludDplbmFibGUgKi9cbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBBUFBFTkRfT1BDT0RFUyA9IG5ldyBBcHBlbmRPcGNvZGVzKCk7XG5leHBvcnQgY2xhc3MgQWJzdHJhY3RPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBpbml0aWFsaXplR3VpZCh0aGlzKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyBndWlkOiB0aGlzLl9ndWlkLCB0eXBlOiB0aGlzLnR5cGUgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVXBkYXRpbmdPcGNvZGUgZXh0ZW5kcyBBYnN0cmFjdE9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMucHJldiA9IG51bGw7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGluc3BlY3Qob3Bjb2Rlcykge1xuICAgIGxldCBidWZmZXIgPSBbXTtcbiAgICBvcGNvZGVzLmZvckVhY2goKG9wY29kZSwgaSkgPT4ge1xuICAgICAgICBfaW5zcGVjdChvcGNvZGUudG9KU09OKCksIGJ1ZmZlciwgMCwgaSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKCcnKTtcbn1cbmZ1bmN0aW9uIF9pbnNwZWN0KG9wY29kZSwgYnVmZmVyLCBsZXZlbCwgaW5kZXgpIHtcbiAgICBsZXQgaW5kZW50YXRpb24gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxldmVsOyBpKyspIHtcbiAgICAgICAgaW5kZW50YXRpb24ucHVzaCgnICAnKTtcbiAgICB9XG4gICAgYnVmZmVyLnB1c2goLi4uaW5kZW50YXRpb24pO1xuICAgIGJ1ZmZlci5wdXNoKGAke2luZGV4fS4gJHtvcGNvZGUudHlwZX1gKTtcbiAgICBpZiAob3Bjb2RlLmFyZ3MgfHwgb3Bjb2RlLmRldGFpbHMpIHtcbiAgICAgICAgYnVmZmVyLnB1c2goJygnKTtcbiAgICAgICAgaWYgKG9wY29kZS5hcmdzKSB7XG4gICAgICAgICAgICBidWZmZXIucHVzaChvcGNvZGUuYXJncy5qb2luKCcsICcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3Bjb2RlLmRldGFpbHMpIHtcbiAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMob3Bjb2RlLmRldGFpbHMpO1xuICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wY29kZS5hcmdzICYmIG9wY29kZS5hcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIucHVzaCgnLCAnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goa2V5cy5tYXAoa2V5ID0+IGAke2tleX09JHtvcGNvZGUuZGV0YWlscyAmJiBvcGNvZGUuZGV0YWlsc1trZXldfWApLmpvaW4oJywgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlci5wdXNoKCcpJyk7XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKCdcXG4nKTtcbiAgICBpZiAob3Bjb2RlLmNoaWxkcmVuICYmIG9wY29kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcGNvZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIF9pbnNwZWN0KG9wY29kZS5jaGlsZHJlbltpXSwgYnVmZmVyLCBsZXZlbCArIDEsIGkpO1xuICAgICAgICB9XG4gICAgfVxufSJdfQ==