ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
333 lines (330 loc) • 48.3 kB
JavaScript
"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==