@glimmer/compiler
Version:
410 lines (330 loc) • 35.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _util = require("@glimmer/util");
var _utils = require("./utils");
function _createForOfIteratorHelperLoose(o, allowArrayLike) {
var it;
if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
if (it) o = it;
var i = 0;
return function () {
if (i >= o.length) return {
done: true
};
return {
done: false,
value: o[i++]
};
};
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
it = o[Symbol.iterator]();
return it.next.bind(it);
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++) {
arr2[i] = arr[i];
}
return arr2;
}
var WireFormatDebugger = /*#__PURE__*/function () {
function WireFormatDebugger(_ref) {
var _statements = _ref[0],
symbols = _ref[1],
_hasEval = _ref[2],
upvars = _ref[3];
this.upvars = upvars;
this.symbols = symbols;
}
var _proto = WireFormatDebugger.prototype;
_proto.format = function format(program) {
var out = [];
for (var _iterator = _createForOfIteratorHelperLoose(program[0]), _step; !(_step = _iterator()).done;) {
var statement = _step.value;
out.push(this.formatOpcode(statement));
}
return out;
};
_proto.formatOpcode = function formatOpcode(opcode) {
if (Array.isArray(opcode)) {
switch (opcode[0]) {
case 1
/* Append */
:
return ['append', this.formatOpcode(opcode[1])];
case 2
/* TrustingAppend */
:
return ['trusting-append', this.formatOpcode(opcode[1])];
case 6
/* Block */
:
return ['block', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3]), this.formatBlocks(opcode[4])];
case 40
/* InElement */
:
return ['in-element', opcode[1], this.formatOpcode(opcode[2]), opcode[3] ? this.formatOpcode(opcode[3]) : undefined];
case 10
/* OpenElement */
:
return ['open-element', (0, _utils.inflateTagName)(opcode[1])];
case 11
/* OpenElementWithSplat */
:
return ['open-element-with-splat', (0, _utils.inflateTagName)(opcode[1])];
case 13
/* CloseElement */
:
return ['close-element'];
case 12
/* FlushElement */
:
return ['flush-element'];
case 14
/* StaticAttr */
:
return ['static-attr', (0, _utils.inflateAttrName)(opcode[1]), opcode[2], opcode[3]];
case 24
/* StaticComponentAttr */
:
return ['static-component-attr', (0, _utils.inflateAttrName)(opcode[1]), opcode[2], opcode[3]];
case 15
/* DynamicAttr */
:
return ['dynamic-attr', (0, _utils.inflateAttrName)(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]];
case 16
/* ComponentAttr */
:
return ['component-attr', (0, _utils.inflateAttrName)(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]];
case 17
/* AttrSplat */
:
return ['attr-splat'];
case 18
/* Yield */
:
return ['yield', opcode[1], this.formatParams(opcode[2])];
case 20
/* DynamicArg */
:
return ['dynamic-arg', opcode[1], this.formatOpcode(opcode[2])];
case 21
/* StaticArg */
:
return ['static-arg', opcode[1], this.formatOpcode(opcode[2])];
case 22
/* TrustingDynamicAttr */
:
return ['trusting-dynamic-attr', (0, _utils.inflateAttrName)(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]];
case 23
/* TrustingComponentAttr */
:
return ['trusting-component-attr', (0, _utils.inflateAttrName)(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]];
case 26
/* Debugger */
:
return ['debugger', opcode[1]];
case 3
/* Comment */
:
return ['comment', opcode[1]];
case 4
/* Modifier */
:
return ['modifier', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3])];
case 8
/* Component */
:
return ['component', this.formatOpcode(opcode[1]), this.formatElementParams(opcode[2]), this.formatHash(opcode[3]), this.formatBlocks(opcode[4])];
case 48
/* HasBlock */
:
return ['has-block', this.formatOpcode(opcode[1])];
case 49
/* HasBlockParams */
:
return ['has-block-params', this.formatOpcode(opcode[1])];
case 50
/* Curry */
:
return ['curry', this.formatOpcode(opcode[1]), this.formatCurryType(opcode[2]), this.formatParams(opcode[3]), this.formatHash(opcode[4])];
case 27
/* Undefined */
:
return ['undefined'];
case 28
/* Call */
:
return ['call', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3])];
case 29
/* Concat */
:
return ['concat', this.formatParams(opcode[1])];
case 31
/* GetStrictFree */
:
return ['get-strict-free', this.upvars[opcode[1]], opcode[2]];
case 34
/* GetFreeAsComponentOrHelperHeadOrThisFallback */
:
return ['GetFreeAsComponentOrHelperHeadOrThisFallback', this.upvars[opcode[1]], opcode[2]];
case 35
/* GetFreeAsComponentOrHelperHead */
:
return ['GetFreeAsComponentOrHelperHead', this.upvars[opcode[1]], opcode[2]];
case 36
/* GetFreeAsHelperHeadOrThisFallback */
:
return ['GetFreeAsHelperHeadOrThisFallback', this.upvars[opcode[1]], opcode[2]];
case 99
/* GetFreeAsDeprecatedHelperHeadOrThisFallback */
:
return ['GetFreeAsDeprecatedHelperHeadOrThisFallback', this.upvars[opcode[1]]];
case 37
/* GetFreeAsHelperHead */
:
return ['GetFreeAsHelperHead', this.upvars[opcode[1]], opcode[2]];
case 39
/* GetFreeAsComponentHead */
:
return ['GetFreeAsComponentHead', this.upvars[opcode[1]], opcode[2]];
case 38
/* GetFreeAsModifierHead */
:
return ['GetFreeAsModifierHead', this.upvars[opcode[1]], opcode[2]];
case 30
/* GetSymbol */
:
{
if (opcode[1] === 0) {
return ['get-symbol', 'this', opcode[2]];
} else {
return ['get-symbol', this.symbols[opcode[1] - 1], opcode[2]];
}
}
case 32
/* GetTemplateSymbol */
:
{
return ['get-template-symbol', opcode[1], opcode[2]];
}
case 41
/* If */
:
return ['if', this.formatOpcode(opcode[1]), this.formatBlock(opcode[2]), opcode[3] ? this.formatBlock(opcode[3]) : null];
case 52
/* IfInline */
:
return ['if-inline'];
case 51
/* Not */
:
return ['not'];
case 42
/* Each */
:
return ['each', this.formatOpcode(opcode[1]), opcode[2] ? this.formatOpcode(opcode[2]) : null, this.formatBlock(opcode[3]), opcode[4] ? this.formatBlock(opcode[4]) : null];
case 43
/* With */
:
return ['with', this.formatOpcode(opcode[1]), this.formatBlock(opcode[2]), opcode[3] ? this.formatBlock(opcode[3]) : null];
case 44
/* Let */
:
return ['let', this.formatParams(opcode[1]), this.formatBlock(opcode[2])];
case 54
/* Log */
:
return ['log', this.formatParams(opcode[1])];
case 45
/* WithDynamicVars */
:
return ['-with-dynamic-vars', this.formatHash(opcode[1]), this.formatBlock(opcode[2])];
case 53
/* GetDynamicVar */
:
return ['-get-dynamic-vars', this.formatOpcode(opcode[1])];
case 46
/* InvokeComponent */
:
return ['component', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3]), this.formatBlocks(opcode[4])];
}
} else {
return opcode;
}
};
_proto.formatCurryType = function formatCurryType(value) {
switch (value) {
case 0
/* Component */
:
return 'component';
case 1
/* Helper */
:
return 'helper';
case 2
/* Modifier */
:
return 'modifier';
default:
throw (0, _util.exhausted)(value);
}
};
_proto.formatElementParams = function formatElementParams(opcodes) {
var _this = this;
if (opcodes === null) return null;
return opcodes.map(function (o) {
return _this.formatOpcode(o);
});
};
_proto.formatParams = function formatParams(opcodes) {
var _this2 = this;
if (opcodes === null) return null;
return opcodes.map(function (o) {
return _this2.formatOpcode(o);
});
};
_proto.formatHash = function formatHash(hash) {
var _this3 = this;
if (hash === null) return null;
return hash[0].reduce(function (accum, key, index) {
accum[key] = _this3.formatOpcode(hash[1][index]);
return accum;
}, (0, _util.dict)());
};
_proto.formatBlocks = function formatBlocks(blocks) {
var _this4 = this;
if (blocks === null) return null;
return blocks[0].reduce(function (accum, key, index) {
accum[key] = _this4.formatBlock(blocks[1][index]);
return accum;
}, (0, _util.dict)());
};
_proto.formatBlock = function formatBlock(block) {
var _this5 = this;
return {
statements: block[0].map(function (s) {
return _this5.formatOpcode(s);
}),
parameters: block[1]
};
};
return WireFormatDebugger;
}();
exports.default = WireFormatDebugger;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi93aXJlLWZvcm1hdC1kZWJ1Zy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBUUE7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFYyxrQjtBQUlaLFdBQUEsa0JBQUEsQ0FBQSxJQUFBLEVBQTZFO0FBQUEsUUFBakUsV0FBaUUsR0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBO0FBQUEsUUFBakUsT0FBaUUsR0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBO0FBQUEsUUFBakUsUUFBaUUsR0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBO0FBQUEsUUFBN0UsTUFBNkUsR0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBO0FBQzNFLFNBQUEsTUFBQSxHQUFBLE1BQUE7QUFDQSxTQUFBLE9BQUEsR0FBQSxPQUFBO0FBQ0Q7Ozs7U0FFRCxNLEdBQUEsU0FBQSxNQUFBLENBQUEsT0FBQSxFQUF1QztBQUNyQyxRQUFJLEdBQUcsR0FBUCxFQUFBOztBQUVBLFNBQUEsSUFBQSxTQUFBLEdBQUEsK0JBQUEsQ0FBc0IsT0FBTyxDQUE3QixDQUE2QixDQUE3QixDQUFBLEVBQUEsS0FBQSxFQUFBLENBQUEsQ0FBQSxLQUFBLEdBQUEsU0FBQSxFQUFBLEVBQUEsSUFBQSxHQUFrQztBQUFBLFVBQWxDLFNBQWtDLEdBQUEsS0FBQSxDQUFBLEtBQUE7QUFDaEMsTUFBQSxHQUFHLENBQUgsSUFBQSxDQUFTLEtBQUEsWUFBQSxDQUFULFNBQVMsQ0FBVDtBQUNEOztBQUVELFdBQUEsR0FBQTs7O1NBR0YsWSxHQUFBLFNBQUEsWUFBQSxDQUFBLE1BQUEsRUFBc0M7QUFDcEMsUUFBSSxLQUFLLENBQUwsT0FBQSxDQUFKLE1BQUksQ0FBSixFQUEyQjtBQUN6QixjQUFRLE1BQU0sQ0FBZCxDQUFjLENBQWQ7QUFDRSxhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENB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Q0FBUDtBQURwQixPQUNPLENBRFA7QUFFTCxNQUFBLFVBQVUsRUFBRSxLQUFLLENBQUEsQ0FBQTtBQUZaLEtBQVAiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDdXJyaWVkVHlwZSxcbiAgT3B0aW9uLFxuICBTZXJpYWxpemVkSW5saW5lQmxvY2ssXG4gIFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrLFxuICBTZXhwT3Bjb2RlcyBhcyBPcCxcbiAgV2lyZUZvcm1hdCxcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBkaWN0LCBleGhhdXN0ZWQgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgaW5mbGF0ZUF0dHJOYW1lLCBpbmZsYXRlVGFnTmFtZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaXJlRm9ybWF0RGVidWdnZXIge1xuICBwcml2YXRlIHVwdmFyczogc3RyaW5nW107XG4gIHByaXZhdGUgc3ltYm9sczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoW19zdGF0ZW1lbnRzLCBzeW1ib2xzLCBfaGFzRXZhbCwgdXB2YXJzXTogU2VyaWFsaXplZFRlbXBsYXRlQmxvY2spIHtcbiAgICB0aGlzLnVwdmFycyA9IHVwdmFycztcbiAgICB0aGlzLnN5bWJvbHMgPSBzeW1ib2xzO1xuICB9XG5cbiAgZm9ybWF0KHByb2dyYW06IFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrKTogdW5rbm93biB7XG4gICAgbGV0IG91dCA9IFtdO1xuXG4gICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIHByb2dyYW1bMF0pIHtcbiAgICAgIG91dC5wdXNoKHRoaXMuZm9ybWF0T3Bjb2RlKHN0YXRlbWVudCkpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmb3JtYXRPcGNvZGUob3Bjb2RlOiBXaXJlRm9ybWF0LlN5bnRheCk6IHVua25vd24ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wY29kZSkpIHtcbiAgICAgIHN3aXRjaCAob3Bjb2RlWzBdKSB7XG4gICAgICAgIGNhc2UgT3AuQXBwZW5kOlxuICAgICAgICAgIHJldHVybiBbJ2FwcGVuZCcsIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSldO1xuICAgICAgICBjYXNlIE9wLlRydXN0aW5nQXBwZW5kOlxuICAgICAgICAgIHJldHVybiBbJ3RydXN0aW5nLWFwcGVuZCcsIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuQmxvY2s6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdibG9jaycsXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0SGFzaChvcGNvZGVbM10pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRCbG9ja3Mob3Bjb2RlWzRdKSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuSW5FbGVtZW50OlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnaW4tZWxlbWVudCcsXG4gICAgICAgICAgICBvcGNvZGVbMV0sXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMl0pLFxuICAgICAgICAgICAgb3Bjb2RlWzNdID8gdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzNdKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuT3BlbkVsZW1lbnQ6XG4gICAgICAgICAgcmV0dXJuIFsnb3Blbi1lbGVtZW50JywgaW5mbGF0ZVRhZ05hbWUob3Bjb2RlWzFdKV07XG5cbiAgICAgICAgY2FzZSBPcC5PcGVuRWxlbWVudFdpdGhTcGxhdDpcbiAgICAgICAgICByZXR1cm4gWydvcGVuLWVsZW1lbnQtd2l0aC1zcGxhdCcsIGluZmxhdGVUYWdOYW1lKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuQ2xvc2VFbGVtZW50OlxuICAgICAgICAgIHJldHVybiBbJ2Nsb3NlLWVsZW1lbnQnXTtcblxuICAgICAgICBjYXNlIE9wLkZsdXNoRWxlbWVudDpcbiAgICAgICAgICByZXR1cm4gWydmbHVzaC1lbGVtZW50J107XG5cbiAgICAgICAgY2FzZSBPcC5TdGF0aWNBdHRyOlxuICAgICAgICAgIHJldHVybiBbJ3N0YXRpYy1hdHRyJywgaW5mbGF0ZUF0dHJOYW1lKG9wY29kZVsxXSksIG9wY29kZVsyXSwgb3Bjb2RlWzNdXTtcblxuICAgICAgICBjYXNlIE9wLlN0YXRpY0NvbXBvbmVudEF0dHI6XG4gICAgICAgICAgcmV0dXJuIFsnc3RhdGljLWNvbXBvbmVudC1hdHRyJywgaW5mbGF0ZUF0dHJOYW1lKG9wY29kZVsxXSksIG9wY29kZVsyXSwgb3Bjb2RlWzNdXTtcblxuICAgICAgICBjYXNlIE9wLkR5bmFtaWNBdHRyOlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnZHluYW1pYy1hdHRyJyxcbiAgICAgICAgICAgIGluZmxhdGVBdHRyTmFtZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIG9wY29kZVszXSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuQ29tcG9uZW50QXR0cjpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2NvbXBvbmVudC1hdHRyJyxcbiAgICAgICAgICAgIGluZmxhdGVBdHRyTmFtZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIG9wY29kZVszXSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuQXR0clNwbGF0OlxuICAgICAgICAgIHJldHVybiBbJ2F0dHItc3BsYXQnXTtcblxuICAgICAgICBjYXNlIE9wLllpZWxkOlxuICAgICAgICAgIHJldHVybiBbJ3lpZWxkJywgb3Bjb2RlWzFdLCB0aGlzLmZvcm1hdFBhcmFtcyhvcGNvZGVbMl0pXTtcblxuICAgICAgICBjYXNlIE9wLkR5bmFtaWNBcmc6XG4gICAgICAgICAgcmV0dXJuIFsnZHluYW1pYy1hcmcnLCBvcGNvZGVbMV0sIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSldO1xuXG4gICAgICAgIGNhc2UgT3AuU3RhdGljQXJnOlxuICAgICAgICAgIHJldHVybiBbJ3N0YXRpYy1hcmcnLCBvcGNvZGVbMV0sIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSldO1xuXG4gICAgICAgIGNhc2UgT3AuVHJ1c3RpbmdEeW5hbWljQXR0cjpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3RydXN0aW5nLWR5bmFtaWMtYXR0cicsXG4gICAgICAgICAgICBpbmZsYXRlQXR0ck5hbWUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10sXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLlRydXN0aW5nQ29tcG9uZW50QXR0cjpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3RydXN0aW5nLWNvbXBvbmVudC1hdHRyJyxcbiAgICAgICAgICAgIGluZmxhdGVBdHRyTmFtZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIG9wY29kZVszXSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuRGVidWdnZXI6XG4gICAgICAgICAgcmV0dXJuIFsnZGVidWdnZXInLCBvcGNvZGVbMV1dO1xuXG4gICAgICAgIGNhc2UgT3AuQ29tbWVudDpcbiAgICAgICAgICByZXR1cm4gWydjb21tZW50Jywgb3Bjb2RlWzFdXTtcblxuICAgICAgICBjYXNlIE9wLk1vZGlmaWVyOlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnbW9kaWZpZXInLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVsyXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzNdKSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuQ29tcG9uZW50OlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnY29tcG9uZW50JyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEVsZW1lbnRQYXJhbXMob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0SGFzaChvcGNvZGVbM10pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRCbG9ja3Mob3Bjb2RlWzRdKSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuSGFzQmxvY2s6XG4gICAgICAgICAgcmV0dXJuIFsnaGFzLWJsb2NrJywgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKV07XG5cbiAgICAgICAgY2FzZSBPcC5IYXNCbG9ja1BhcmFtczpcbiAgICAgICAgICByZXR1cm4gWydoYXMtYmxvY2stcGFyYW1zJywgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKV07XG5cbiAgICAgICAgY2FzZSBPcC5DdXJyeTpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2N1cnJ5JyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEN1cnJ5VHlwZShvcGNvZGVbMl0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzNdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0SGFzaChvcGNvZGVbNF0pLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgY2FzZSBPcC5VbmRlZmluZWQ6XG4gICAgICAgICAgcmV0dXJuIFsndW5kZWZpbmVkJ107XG5cbiAgICAgICAgY2FzZSBPcC5DYWxsOlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnY2FsbCcsXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0SGFzaChvcGNvZGVbM10pLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgY2FzZSBPcC5Db25jYXQ6XG4gICAgICAgICAgcmV0dXJuIFsnY29uY2F0JywgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzFdIGFzIFdpcmVGb3JtYXQuQ29yZS5QYXJhbXMpXTtcblxuICAgICAgICBjYXNlIE9wLkdldFN0cmljdEZyZWU6XG4gICAgICAgICAgcmV0dXJuIFsnZ2V0LXN0cmljdC1mcmVlJywgdGhpcy51cHZhcnNbb3Bjb2RlWzFdXSwgb3Bjb2RlWzJdXTtcblxuICAgICAgICBjYXNlIE9wLkdldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrOlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnR2V0RnJlZUFzQ29tcG9uZW50T3JIZWxwZXJIZWFkT3JUaGlzRmFsbGJhY2snLFxuICAgICAgICAgICAgdGhpcy51cHZhcnNbb3Bjb2RlWzFdXSxcbiAgICAgICAgICAgIG9wY29kZVsyXSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuR2V0RnJlZUFzQ29tcG9uZW50T3JIZWxwZXJIZWFkOlxuICAgICAgICAgIHJldHVybiBbJ0dldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZCcsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRGcmVlQXNIZWxwZXJIZWFkT3JUaGlzRmFsbGJhY2s6XG4gICAgICAgICAgcmV0dXJuIFsnR2V0RnJlZUFzSGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrJywgdGhpcy51cHZhcnNbb3Bjb2RlWzFdXSwgb3Bjb2RlWzJdXTtcblxuICAgICAgICBjYXNlIE9wLkdldEZyZWVBc0RlcHJlY2F0ZWRIZWxwZXJIZWFkT3JUaGlzRmFsbGJhY2s6XG4gICAgICAgICAgcmV0dXJuIFsnR2V0RnJlZUFzRGVwcmVjYXRlZEhlbHBlckhlYWRPclRoaXNGYWxsYmFjaycsIHRoaXMudXB2YXJzW29wY29kZVsxXV1dO1xuXG4gICAgICAgIGNhc2UgT3AuR2V0RnJlZUFzSGVscGVySGVhZDpcbiAgICAgICAgICByZXR1cm4gWydHZXRGcmVlQXNIZWxwZXJIZWFkJywgdGhpcy51cHZhcnNbb3Bjb2RlWzFdXSwgb3Bjb2RlWzJdXTtcblxuICAgICAgICBjYXNlIE9wLkdldEZyZWVBc0NvbXBvbmVudEhlYWQ6XG4gICAgICAgICAgcmV0dXJuIFsnR2V0RnJlZUFzQ29tcG9uZW50SGVhZCcsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRGcmVlQXNNb2RpZmllckhlYWQ6XG4gICAgICAgICAgcmV0dXJuIFsnR2V0RnJlZUFzTW9kaWZpZXJIZWFkJywgdGhpcy51cHZhcnNbb3Bjb2RlWzFdXSwgb3Bjb2RlWzJdXTtcblxuICAgICAgICBjYXNlIE9wLkdldFN5bWJvbDoge1xuICAgICAgICAgIGlmIChvcGNvZGVbMV0gPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2dldC1zeW1ib2wnLCAndGhpcycsIG9wY29kZVsyXV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2dldC1zeW1ib2wnLCB0aGlzLnN5bWJvbHNbb3Bjb2RlWzFdIC0gMV0sIG9wY29kZVsyXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBPcC5HZXRUZW1wbGF0ZVN5bWJvbDoge1xuICAgICAgICAgIHJldHVybiBbJ2dldC10ZW1wbGF0ZS1zeW1ib2wnLCBvcGNvZGVbMV0sIG9wY29kZVsyXV07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIE9wLklmOlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnaWYnLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2sob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIG9wY29kZVszXSA/IHRoaXMuZm9ybWF0QmxvY2sob3Bjb2RlWzNdKSA6IG51bGwsXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLklmSW5saW5lOlxuICAgICAgICAgIHJldHVybiBbJ2lmLWlubGluZSddO1xuXG4gICAgICAgIGNhc2UgT3AuTm90OlxuICAgICAgICAgIHJldHVybiBbJ25vdCddO1xuXG4gICAgICAgIGNhc2UgT3AuRWFjaDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2VhY2gnLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIG9wY29kZVsyXSA/IHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSkgOiBudWxsLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRCbG9jayhvcGNvZGVbM10pLFxuICAgICAgICAgICAgb3Bjb2RlWzRdID8gdGhpcy5mb3JtYXRCbG9jayhvcGNvZGVbNF0pIDogbnVsbCxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuV2l0aDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3dpdGgnLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2sob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIG9wY29kZVszXSA/IHRoaXMuZm9ybWF0QmxvY2sob3Bjb2RlWzNdKSA6IG51bGwsXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkxldDpcbiAgICAgICAgICByZXR1cm4gWydsZXQnLCB0aGlzLmZvcm1hdFBhcmFtcyhvcGNvZGVbMV0pLCB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVsyXSldO1xuXG4gICAgICAgIGNhc2UgT3AuTG9nOlxuICAgICAgICAgIHJldHVybiBbJ2xvZycsIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuV2l0aER5bmFtaWNWYXJzOlxuICAgICAgICAgIHJldHVybiBbJy13aXRoLWR5bmFtaWMtdmFycycsIHRoaXMuZm9ybWF0SGFzaChvcGNvZGVbMV0pLCB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVsyXSldO1xuXG4gICAgICAgIGNhc2UgT3AuR2V0RHluYW1pY1ZhcjpcbiAgICAgICAgICByZXR1cm4gWyctZ2V0LWR5bmFtaWMtdmFycycsIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuSW52b2tlQ29tcG9uZW50OlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnY29tcG9uZW50JyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdFBhcmFtcyhvcGNvZGVbMl0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRIYXNoKG9wY29kZVszXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEJsb2NrcyhvcGNvZGVbNF0pLFxuICAgICAgICAgIF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcGNvZGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDdXJyeVR5cGUodmFsdWU6IEN1cnJpZWRUeXBlKSB7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBDdXJyaWVkVHlwZS5Db21wb25lbnQ6XG4gICAgICAgIHJldHVybiAnY29tcG9uZW50JztcbiAgICAgIGNhc2UgQ3VycmllZFR5cGUuSGVscGVyOlxuICAgICAgICByZXR1cm4gJ2hlbHBlcic7XG4gICAgICBjYXNlIEN1cnJpZWRUeXBlLk1vZGlmaWVyOlxuICAgICAgICByZXR1cm4gJ21vZGlmaWVyJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IGV4aGF1c3RlZCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRFbGVtZW50UGFyYW1zKG9wY29kZXM6IE9wdGlvbjxXaXJlRm9ybWF0LkVsZW1lbnRQYXJhbWV0ZXJbXT4pOiBPcHRpb248dW5rbm93bltdPiB7XG4gICAgaWYgKG9wY29kZXMgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBvcGNvZGVzLm1hcCgobykgPT4gdGhpcy5mb3JtYXRPcGNvZGUobykpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQYXJhbXMob3Bjb2RlczogT3B0aW9uPFdpcmVGb3JtYXQuRXhwcmVzc2lvbltdPik6IE9wdGlvbjx1bmtub3duW10+IHtcbiAgICBpZiAob3Bjb2RlcyA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG9wY29kZXMubWFwKChvKSA9PiB0aGlzLmZvcm1hdE9wY29kZShvKSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEhhc2goaGFzaDogV2lyZUZvcm1hdC5Db3JlLkhhc2gpOiBPcHRpb248b2JqZWN0PiB7XG4gICAgaWYgKGhhc2ggPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGhhc2hbMF0ucmVkdWNlKChhY2N1bSwga2V5LCBpbmRleCkgPT4ge1xuICAgICAgYWNjdW1ba2V5XSA9IHRoaXMuZm9ybWF0T3Bjb2RlKGhhc2hbMV1baW5kZXhdKTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBkaWN0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRCbG9ja3MoYmxvY2tzOiBXaXJlRm9ybWF0LkNvcmUuQmxvY2tzKTogT3B0aW9uPG9iamVjdD4ge1xuICAgIGlmIChibG9ja3MgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGJsb2Nrc1swXS5yZWR1Y2UoKGFjY3VtLCBrZXksIGluZGV4KSA9PiB7XG4gICAgICBhY2N1bVtrZXldID0gdGhpcy5mb3JtYXRCbG9jayhibG9ja3NbMV1baW5kZXhdKTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBkaWN0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRCbG9jayhibG9jazogU2VyaWFsaXplZElubGluZUJsb2NrKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGVtZW50czogYmxvY2tbMF0ubWFwKChzKSA9PiB0aGlzLmZvcm1hdE9wY29kZShzKSksXG4gICAgICBwYXJhbWV0ZXJzOiBibG9ja1sxXSxcbiAgICB9O1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9