UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

501 lines (413 loc) 45.6 kB
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } import { DEBUG } from '@glimmer/env'; import { createDebugAliasRef, UNDEFINED_REFERENCE, valueForRef } from '@glimmer/reference'; import { dict, emptyArray, EMPTY_STRING_ARRAY } from '@glimmer/util'; import { CONSTANT_TAG } from '@glimmer/validator'; import { $sp } from '@glimmer/vm'; import { REGISTERS } from '../symbols'; /* The calling convention is: * 0-N block arguments at the bottom * 0-N positional arguments next (left-to-right) * 0-N named arguments next */ export var VMArgumentsImpl = /*#__PURE__*/function () { function VMArgumentsImpl() { this.stack = null; this.positional = new PositionalArgumentsImpl(); this.named = new NamedArgumentsImpl(); this.blocks = new BlockArgumentsImpl(); } var _proto = VMArgumentsImpl.prototype; _proto.empty = function empty(stack) { var base = stack[REGISTERS][$sp] + 1; this.named.empty(stack, base); this.positional.empty(stack, base); this.blocks.empty(stack, base); return this; }; _proto.setup = function setup(stack, names, blockNames, positionalCount, atNames) { this.stack = stack; /* | ... | blocks | positional | named | | ... | b0 b1 | p0 p1 p2 p3 | n0 n1 | index | ... | 4/5/6 7/8/9 | 10 11 12 13 | 14 15 | ^ ^ ^ ^ bbase pbase nbase sp */ var named = this.named; var namedCount = names.length; var namedBase = stack[REGISTERS][$sp] - namedCount + 1; named.setup(stack, namedBase, namedCount, names, atNames); var positional = this.positional; var positionalBase = namedBase - positionalCount; positional.setup(stack, positionalBase, positionalCount); var blocks = this.blocks; var blocksCount = blockNames.length; var blocksBase = positionalBase - blocksCount * 3; blocks.setup(stack, blocksBase, blocksCount, blockNames); }; _proto.at = function at(pos) { return this.positional.at(pos); }; _proto.realloc = function realloc(offset) { var stack = this.stack; if (offset > 0 && stack !== null) { var positional = this.positional, named = this.named; var newBase = positional.base + offset; var length = positional.length + named.length; for (var i = length - 1; i >= 0; i--) { stack.copy(i + positional.base, i + newBase); } positional.base += offset; named.base += offset; stack[REGISTERS][$sp] += offset; } }; _proto.capture = function capture() { var positional = this.positional.length === 0 ? EMPTY_POSITIONAL : this.positional.capture(); var named = this.named.length === 0 ? EMPTY_NAMED : this.named.capture(); return { named: named, positional: positional }; }; _proto.clear = function clear() { var stack = this.stack, length = this.length; if (length > 0 && stack !== null) stack.pop(length); }; _createClass(VMArgumentsImpl, [{ key: "base", get: function get() { return this.blocks.base; } }, { key: "length", get: function get() { return this.positional.length + this.named.length + this.blocks.length * 3; } }]); return VMArgumentsImpl; }(); var EMPTY_REFERENCES = emptyArray(); export var PositionalArgumentsImpl = /*#__PURE__*/function () { function PositionalArgumentsImpl() { this.base = 0; this.length = 0; this.stack = null; this._references = null; } var _proto2 = PositionalArgumentsImpl.prototype; _proto2.empty = function empty(stack, base) { this.stack = stack; this.base = base; this.length = 0; this._references = EMPTY_REFERENCES; }; _proto2.setup = function setup(stack, base, length) { this.stack = stack; this.base = base; this.length = length; if (length === 0) { this._references = EMPTY_REFERENCES; } else { this._references = null; } }; _proto2.at = function at(position) { var base = this.base, length = this.length, stack = this.stack; if (position < 0 || position >= length) { return UNDEFINED_REFERENCE; } return stack.get(position, base); }; _proto2.capture = function capture() { return this.references; }; _proto2.prepend = function prepend(other) { var additions = other.length; if (additions > 0) { var base = this.base, length = this.length, stack = this.stack; this.base = base = base - additions; this.length = length + additions; for (var i = 0; i < additions; i++) { stack.set(other[i], i, base); } this._references = null; } }; _createClass(PositionalArgumentsImpl, [{ key: "references", get: function get() { var references = this._references; if (!references) { var stack = this.stack, base = this.base, length = this.length; references = this._references = stack.slice(base, base + length); } return references; } }]); return PositionalArgumentsImpl; }(); export var NamedArgumentsImpl = /*#__PURE__*/function () { function NamedArgumentsImpl() { this.base = 0; this.length = 0; this._references = null; this._names = EMPTY_STRING_ARRAY; this._atNames = EMPTY_STRING_ARRAY; } var _proto3 = NamedArgumentsImpl.prototype; _proto3.empty = function empty(stack, base) { this.stack = stack; this.base = base; this.length = 0; this._references = EMPTY_REFERENCES; this._names = EMPTY_STRING_ARRAY; this._atNames = EMPTY_STRING_ARRAY; }; _proto3.setup = function setup(stack, base, length, names, atNames) { this.stack = stack; this.base = base; this.length = length; if (length === 0) { this._references = EMPTY_REFERENCES; this._names = EMPTY_STRING_ARRAY; this._atNames = EMPTY_STRING_ARRAY; } else { this._references = null; if (atNames) { this._names = null; this._atNames = names; } else { this._names = names; this._atNames = null; } } }; _proto3.has = function has(name) { return this.names.indexOf(name) !== -1; }; _proto3.get = function get(name, atNames) { if (atNames === void 0) { atNames = false; } var base = this.base, stack = this.stack; var names = atNames ? this.atNames : this.names; var idx = names.indexOf(name); if (idx === -1) { return UNDEFINED_REFERENCE; } var ref = stack.get(idx, base); if (DEBUG) { return createDebugAliasRef(atNames ? name : "@" + name, ref); } else { return ref; } }; _proto3.capture = function capture() { var names = this.names, references = this.references; var map = dict(); for (var i = 0; i < names.length; i++) { var name = names[i]; if (DEBUG) { map[name] = createDebugAliasRef("@" + name, references[i]); } else { map[name] = references[i]; } } return map; }; _proto3.merge = function merge(other) { var keys = Object.keys(other); if (keys.length > 0) { var names = this.names, length = this.length, stack = this.stack; var newNames = names.slice(); for (var i = 0; i < keys.length; i++) { var name = keys[i]; var idx = newNames.indexOf(name); if (idx === -1) { length = newNames.push(name); stack.push(other[name]); } } this.length = length; this._references = null; this._names = newNames; this._atNames = null; } }; _proto3.toSyntheticName = function toSyntheticName(name) { return name.slice(1); }; _proto3.toAtName = function toAtName(name) { return "@" + name; }; _createClass(NamedArgumentsImpl, [{ key: "names", get: function get() { var names = this._names; if (!names) { names = this._names = this._atNames.map(this.toSyntheticName); } return names; } }, { key: "atNames", get: function get() { var atNames = this._atNames; if (!atNames) { atNames = this._atNames = this._names.map(this.toAtName); } return atNames; } }, { key: "references", get: function get() { var references = this._references; if (!references) { var base = this.base, length = this.length, stack = this.stack; references = this._references = stack.slice(base, base + length); } return references; } }]); return NamedArgumentsImpl; }(); function toSymbolName(name) { return "&" + name; } var EMPTY_BLOCK_VALUES = emptyArray(); export var BlockArgumentsImpl = /*#__PURE__*/function () { function BlockArgumentsImpl() { this.internalValues = null; this._symbolNames = null; this.internalTag = null; this.names = EMPTY_STRING_ARRAY; this.length = 0; this.base = 0; } var _proto4 = BlockArgumentsImpl.prototype; _proto4.empty = function empty(stack, base) { this.stack = stack; this.names = EMPTY_STRING_ARRAY; this.base = base; this.length = 0; this._symbolNames = null; this.internalTag = CONSTANT_TAG; this.internalValues = EMPTY_BLOCK_VALUES; }; _proto4.setup = function setup(stack, base, length, names) { this.stack = stack; this.names = names; this.base = base; this.length = length; this._symbolNames = null; if (length === 0) { this.internalTag = CONSTANT_TAG; this.internalValues = EMPTY_BLOCK_VALUES; } else { this.internalTag = null; this.internalValues = null; } }; _proto4.has = function has(name) { return this.names.indexOf(name) !== -1; }; _proto4.get = function get(name) { var idx = this.names.indexOf(name); if (idx === -1) { return null; } var base = this.base, stack = this.stack; var table = stack.get(idx * 3, base); var scope = stack.get(idx * 3 + 1, base); var handle = stack.get(idx * 3 + 2, base); return handle === null ? null : [handle, scope, table]; }; _proto4.capture = function capture() { return new CapturedBlockArgumentsImpl(this.names, this.values); }; _createClass(BlockArgumentsImpl, [{ key: "values", get: function get() { var values = this.internalValues; if (!values) { var base = this.base, length = this.length, stack = this.stack; values = this.internalValues = stack.slice(base, base + length * 3); } return values; } }, { key: "symbolNames", get: function get() { var symbolNames = this._symbolNames; if (symbolNames === null) { symbolNames = this._symbolNames = this.names.map(toSymbolName); } return symbolNames; } }]); return BlockArgumentsImpl; }(); var CapturedBlockArgumentsImpl = /*#__PURE__*/function () { function CapturedBlockArgumentsImpl(names, values) { this.names = names; this.values = values; this.length = names.length; } var _proto5 = CapturedBlockArgumentsImpl.prototype; _proto5.has = function has(name) { return this.names.indexOf(name) !== -1; }; _proto5.get = function get(name) { var idx = this.names.indexOf(name); if (idx === -1) return null; return [this.values[idx * 3 + 2], this.values[idx * 3 + 1], this.values[idx * 3]]; }; return CapturedBlockArgumentsImpl; }(); export function createCapturedArgs(named, positional) { return { named: named, positional: positional }; } export function reifyNamed(named) { var reified = dict(); for (var key in named) { reified[key] = valueForRef(named[key]); } return reified; } export function reifyPositional(positional) { return positional.map(valueForRef); } export function reifyArgs(args) { return { named: reifyNamed(args.named), positional: reifyPositional(args.positional) }; } export var EMPTY_NAMED = Object.freeze(Object.create(null)); export var EMPTY_POSITIONAL = EMPTY_REFERENCES; export var EMPTY_ARGS = createCapturedArgs(EMPTY_NAMED, EMPTY_POSITIONAL); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2FyZ3VtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsU0FBQSxLQUFBLFFBQUEsY0FBQTtBQWtCQSxTQUFBLG1CQUFBLEVBQUEsbUJBQUEsRUFBQSxXQUFBLFFBQUEsb0JBQUE7QUFNQSxTQUFBLElBQUEsRUFBQSxVQUFBLEVBQUEsa0JBQUEsUUFBQSxlQUFBO0FBQ0EsU0FBQSxZQUFBLFFBQUEsb0JBQUE7QUFDQSxTQUFBLEdBQUEsUUFBQSxhQUFBO0FBRUEsU0FBQSxTQUFBLFFBQUEsWUFBQTtBQUdBOzs7Ozs7OztBQVFBLFdBQU0sZUFBTjtBQUFBLDZCQUFBO0FBQ1UsU0FBQSxLQUFBLEdBQUEsSUFBQTtBQUNELFNBQUEsVUFBQSxHQUFhLElBQWIsdUJBQWEsRUFBYjtBQUNBLFNBQUEsS0FBQSxHQUFRLElBQVIsa0JBQVEsRUFBUjtBQUNBLFNBQUEsTUFBQSxHQUFTLElBQVQsa0JBQVMsRUFBVDtBQXVGUjs7QUEzRkQ7O0FBQUEsU0FNRSxLQU5GLEdBTUUsZUFBSyxLQUFMLEVBQTRCO0FBQzFCLFFBQUksSUFBSSxHQUFHLEtBQUssQ0FBTCxTQUFLLENBQUwsQ0FBQSxHQUFBLElBQVgsQ0FBQTtBQUVBLFNBQUEsS0FBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUEsSUFBQTtBQUNBLFNBQUEsVUFBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUEsSUFBQTtBQUNBLFNBQUEsTUFBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUEsSUFBQTtBQUVBLFdBQUEsSUFBQTtBQUNELEdBZEg7O0FBQUEsU0FnQkUsS0FoQkYsR0FnQkUsZUFBSyxLQUFMLEVBQUssS0FBTCxFQUFLLFVBQUwsRUFBSyxlQUFMLEVBQUssT0FBTCxFQUtrQjtBQUVoQixTQUFBLEtBQUEsR0FBQSxLQUFBO0FBRUE7Ozs7Ozs7O0FBUUEsUUFBSSxLQUFLLEdBQUcsS0FBWixLQUFB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S0FBQSxFQUFBLFVBQUEsRUFBNEU7QUFDaEYsU0FBTztBQUNMLElBQUEsS0FESyxFQUNMLEtBREs7QUFFTCxJQUFBLFVBQUEsRUFBQTtBQUZLLEdBQVA7QUFJRDtBQUVELE9BQU0sU0FBQSxVQUFBLENBQUEsS0FBQSxFQUFrRDtBQUN0RCxNQUFJLE9BQU8sR0FBRyxJQUFkLEVBQUE7O0FBRUEsT0FBSyxJQUFMLEdBQUEsSUFBQSxLQUFBLEVBQXVCO0FBQ3JCLElBQUEsT0FBTyxDQUFQLEdBQU8sQ0FBUCxHQUFlLFdBQVcsQ0FBQyxLQUFLLENBQWhDLEdBQWdDLENBQU4sQ0FBMUI7QUFDRDs7QUFFRCxTQUFBLE9BQUE7QUFDRDtBQUVELE9BQU0sU0FBQSxlQUFBLENBQUEsVUFBQSxFQUFpRTtBQUNyRSxTQUFPLFVBQVUsQ0FBVixHQUFBLENBQVAsV0FBTyxDQUFQO0FBQ0Q7QUFFRCxPQUFNLFNBQUEsU0FBQSxDQUFBLElBQUEsRUFBMkM7QUFDL0MsU0FBTztBQUNMLElBQUEsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBRGpCLEtBQ1ksQ0FEWjtBQUVMLElBQUEsVUFBVSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUwsVUFBQTtBQUZ0QixHQUFQO0FBSUQ7QUFFRCxPQUFPLElBQU0sV0FBVyxHQUFHLE1BQU0sQ0FBTixNQUFBLENBQWMsTUFBTSxDQUFOLE1BQUEsQ0FBbEMsSUFBa0MsQ0FBZCxDQUFwQjtBQUNQLE9BQU8sSUFBTSxnQkFBZ0IsR0FBdEIsZ0JBQUE7QUFDUCxPQUFPLElBQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFBLFdBQUEsRUFBckMsZ0JBQXFDLENBQXJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2hlY2ssIENoZWNrQmxvY2tTeW1ib2xUYWJsZSwgQ2hlY2tIYW5kbGUsIENoZWNrT3B0aW9uLCBDaGVja09yIH0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IHtcbiAgQmxvY2tBcmd1bWVudHMsXG4gIEJsb2NrU3ltYm9sVGFibGUsXG4gIEJsb2NrVmFsdWUsXG4gIENhcHR1cmVkQXJndW1lbnRzLFxuICBDYXB0dXJlZEJsb2NrQXJndW1lbnRzLFxuICBDYXB0dXJlZE5hbWVkQXJndW1lbnRzLFxuICBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMsXG4gIENvbXBpbGFibGVCbG9jayxcbiAgRGljdCxcbiAgTmFtZWRBcmd1bWVudHMsXG4gIE9wdGlvbixcbiAgUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgU2NvcGUsXG4gIFNjb3BlQmxvY2ssXG4gIFZNQXJndW1lbnRzLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIGNyZWF0ZURlYnVnQWxpYXNSZWYsXG4gIFJlZmVyZW5jZSxcbiAgVU5ERUZJTkVEX1JFRkVSRU5DRSxcbiAgdmFsdWVGb3JSZWYsXG59IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQgeyBkaWN0LCBlbXB0eUFycmF5LCBFTVBUWV9TVFJJTkdfQVJSQVkgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IENPTlNUQU5UX1RBRywgVGFnIH0gZnJvbSAnQGdsaW1tZXIvdmFsaWRhdG9yJztcbmltcG9ydCB7ICRzcCB9IGZyb20gJ0BnbGltbWVyL3ZtJztcbmltcG9ydCB7IENoZWNrQ29tcGlsYWJsZUJsb2NrLCBDaGVja1JlZmVyZW5jZSwgQ2hlY2tTY29wZSB9IGZyb20gJy4uL2NvbXBpbGVkL29wY29kZXMvLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IFJFR0lTVEVSUyB9IGZyb20gJy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgRXZhbHVhdGlvblN0YWNrIH0gZnJvbSAnLi9zdGFjayc7XG5cbi8qXG4gIFRoZSBjYWxsaW5nIGNvbnZlbnRpb24gaXM6XG5cbiAgKiAwLU4gYmxvY2sgYXJndW1lbnRzIGF0IHRoZSBib3R0b21cbiAgKiAwLU4gcG9zaXRpb25hbCBhcmd1bWVudHMgbmV4dCAobGVmdC10by1yaWdodClcbiAgKiAwLU4gbmFtZWQgYXJndW1lbnRzIG5leHRcbiovXG5cbmV4cG9ydCBjbGFzcyBWTUFyZ3VtZW50c0ltcGwgaW1wbGVtZW50cyBWTUFyZ3VtZW50cyB7XG4gIHByaXZhdGUgc3RhY2s6IE9wdGlvbjxFdmFsdWF0aW9uU3RhY2s+ID0gbnVsbDtcbiAgcHVibGljIHBvc2l0aW9uYWwgPSBuZXcgUG9zaXRpb25hbEFyZ3VtZW50c0ltcGwoKTtcbiAgcHVibGljIG5hbWVkID0gbmV3IE5hbWVkQXJndW1lbnRzSW1wbCgpO1xuICBwdWJsaWMgYmxvY2tzID0gbmV3IEJsb2NrQXJndW1lbnRzSW1wbCgpO1xuXG4gIGVtcHR5KHN0YWNrOiBFdmFsdWF0aW9uU3RhY2spOiB0aGlzIHtcbiAgICBsZXQgYmFzZSA9IHN0YWNrW1JFR0lTVEVSU11bJHNwXSArIDE7XG5cbiAgICB0aGlzLm5hbWVkLmVtcHR5KHN0YWNrLCBiYXNlKTtcbiAgICB0aGlzLnBvc2l0aW9uYWwuZW1wdHkoc3RhY2ssIGJhc2UpO1xuICAgIHRoaXMuYmxvY2tzLmVtcHR5KHN0YWNrLCBiYXNlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0dXAoXG4gICAgc3RhY2s6IEV2YWx1YXRpb25TdGFjayxcbiAgICBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgYmxvY2tOYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgcG9zaXRpb25hbENvdW50OiBudW1iZXIsXG4gICAgYXROYW1lczogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG5cbiAgICAvKlxuICAgICAgICAgICB8IC4uLiB8IGJsb2NrcyAgICAgIHwgcG9zaXRpb25hbCAgfCBuYW1lZCB8XG4gICAgICAgICAgIHwgLi4uIHwgYjAgICAgYjEgICAgfCBwMCBwMSBwMiBwMyB8IG4wIG4xIHxcbiAgICAgaW5kZXggfCAuLi4gfCA0LzUvNiA3LzgvOSB8IDEwIDExIDEyIDEzIHwgMTQgMTUgfFxuICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgXiAgICAgICAgICAgICBeICBeXG4gICAgICAgICAgICAgICAgIGJiYXNlICAgICAgICAgcGJhc2UgICAgICAgbmJhc2UgIHNwXG4gICAgKi9cblxuICAgIGxldCBuYW1lZCA9IHRoaXMubmFtZWQ7XG4gICAgbGV0IG5hbWVkQ291bnQgPSBuYW1lcy5sZW5ndGg7XG4gICAgbGV0IG5hbWVkQmFzZSA9IHN0YWNrW1JFR0lTVEVSU11bJHNwXSAtIG5hbWVkQ291bnQgKyAxO1xuXG4gICAgbmFtZWQuc2V0dXAoc3RhY2ssIG5hbWVkQmFzZSwgbmFtZWRDb3VudCwgbmFtZXMsIGF0TmFtZXMpO1xuXG4gICAgbGV0IHBvc2l0aW9uYWwgPSB0aGlzLnBvc2l0aW9uYWw7XG4gICAgbGV0IHBvc2l0aW9uYWxCYXNlID0gbmFtZWRCYXNlIC0gcG9zaXRpb25hbENvdW50O1xuXG4gICAgcG9zaXRpb25hbC5zZXR1cChzdGFjaywgcG9zaXRpb25hbEJhc2UsIHBvc2l0aW9uYWxDb3VudCk7XG5cbiAgICBsZXQgYmxvY2tzID0gdGhpcy5ibG9ja3M7XG4gICAgbGV0IGJsb2Nrc0NvdW50ID0gYmxvY2tOYW1lcy5sZW5ndGg7XG4gICAgbGV0IGJsb2Nrc0Jhc2UgPSBwb3NpdGlvbmFsQmFzZSAtIGJsb2Nrc0NvdW50ICogMztcblxuICAgIGJsb2Nrcy5zZXR1cChzdGFjaywgYmxvY2tzQmFzZSwgYmxvY2tzQ291bnQsIGJsb2NrTmFtZXMpO1xuICB9XG5cbiAgZ2V0IGJhc2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja3MuYmFzZTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbmFsLmxlbmd0aCArIHRoaXMubmFtZWQubGVuZ3RoICsgdGhpcy5ibG9ja3MubGVuZ3RoICogMztcbiAgfVxuXG4gIGF0KHBvczogbnVtYmVyKTogUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbmFsLmF0KHBvcyk7XG4gIH1cblxuICByZWFsbG9jKG9mZnNldDogbnVtYmVyKSB7XG4gICAgbGV0IHsgc3RhY2sgfSA9IHRoaXM7XG4gICAgaWYgKG9mZnNldCA+IDAgJiYgc3RhY2sgIT09IG51bGwpIHtcbiAgICAgIGxldCB7IHBvc2l0aW9uYWwsIG5hbWVkIH0gPSB0aGlzO1xuICAgICAgbGV0IG5ld0Jhc2UgPSBwb3NpdGlvbmFsLmJhc2UgKyBvZmZzZXQ7XG4gICAgICBsZXQgbGVuZ3RoID0gcG9zaXRpb25hbC5sZW5ndGggKyBuYW1lZC5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBzdGFjay5jb3B5KGkgKyBwb3NpdGlvbmFsLmJhc2UsIGkgKyBuZXdCYXNlKTtcbiAgICAgIH1cblxuICAgICAgcG9zaXRpb25hbC5iYXNlICs9IG9mZnNldDtcbiAgICAgIG5hbWVkLmJhc2UgKz0gb2Zmc2V0O1xuICAgICAgc3RhY2tbUkVHSVNURVJTXVskc3BdICs9IG9mZnNldDtcbiAgICB9XG4gIH1cblxuICBjYXB0dXJlKCk6IENhcHR1cmVkQXJndW1lbnRzIHtcbiAgICBsZXQgcG9zaXRpb25hbCA9IHRoaXMucG9zaXRpb25hbC5sZW5ndGggPT09IDAgPyBFTVBUWV9QT1NJVElPTkFMIDogdGhpcy5wb3NpdGlvbmFsLmNhcHR1cmUoKTtcbiAgICBsZXQgbmFtZWQgPSB0aGlzLm5hbWVkLmxlbmd0aCA9PT0gMCA/IEVNUFRZX05BTUVEIDogdGhpcy5uYW1lZC5jYXB0dXJlKCk7XG5cbiAgICByZXR1cm4geyBuYW1lZCwgcG9zaXRpb25hbCB9IGFzIENhcHR1cmVkQXJndW1lbnRzO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgbGV0IHsgc3RhY2ssIGxlbmd0aCB9ID0gdGhpcztcbiAgICBpZiAobGVuZ3RoID4gMCAmJiBzdGFjayAhPT0gbnVsbCkgc3RhY2sucG9wKGxlbmd0aCk7XG4gIH1cbn1cblxuY29uc3QgRU1QVFlfUkVGRVJFTkNFUyA9IGVtcHR5QXJyYXk8UmVmZXJlbmNlPigpO1xuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25hbEFyZ3VtZW50c0ltcGwgaW1wbGVtZW50cyBQb3NpdGlvbmFsQXJndW1lbnRzIHtcbiAgcHVibGljIGJhc2UgPSAwO1xuICBwdWJsaWMgbGVuZ3RoID0gMDtcblxuICBwcml2YXRlIHN0YWNrOiBFdmFsdWF0aW9uU3RhY2sgPSBudWxsIGFzIGFueTtcblxuICBwcml2YXRlIF9yZWZlcmVuY2VzOiBPcHRpb248cmVhZG9ubHkgUmVmZXJlbmNlW10+ID0gbnVsbDtcblxuICBlbXB0eShzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICB0aGlzLl9yZWZlcmVuY2VzID0gRU1QVFlfUkVGRVJFTkNFUztcbiAgfVxuXG4gIHNldHVwKHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssIGJhc2U6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBFTVBUWV9SRUZFUkVOQ0VTO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhdChwb3NpdGlvbjogbnVtYmVyKTogUmVmZXJlbmNlIHtcbiAgICBsZXQgeyBiYXNlLCBsZW5ndGgsIHN0YWNrIH0gPSB0aGlzO1xuXG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBVTkRFRklORURfUkVGRVJFTkNFO1xuICAgIH1cblxuICAgIHJldHVybiBjaGVjayhzdGFjay5nZXQocG9zaXRpb24sIGJhc2UpLCBDaGVja1JlZmVyZW5jZSk7XG4gIH1cblxuICBjYXB0dXJlKCk6IENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cyB7XG4gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlcyBhcyBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHM7XG4gIH1cblxuICBwcmVwZW5kKG90aGVyOiBSZWZlcmVuY2VbXSkge1xuICAgIGxldCBhZGRpdGlvbnMgPSBvdGhlci5sZW5ndGg7XG5cbiAgICBpZiAoYWRkaXRpb25zID4gMCkge1xuICAgICAgbGV0IHsgYmFzZSwgbGVuZ3RoLCBzdGFjayB9ID0gdGhpcztcblxuICAgICAgdGhpcy5iYXNlID0gYmFzZSA9IGJhc2UgLSBhZGRpdGlvbnM7XG4gICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aCArIGFkZGl0aW9ucztcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRpdGlvbnM7IGkrKykge1xuICAgICAgICBzdGFjay5zZXQob3RoZXJbaV0sIGksIGJhc2UpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCByZWZlcmVuY2VzKCk6IHJlYWRvbmx5IFJlZmVyZW5jZVtdIHtcbiAgICBsZXQgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXM7XG5cbiAgICBpZiAoIXJlZmVyZW5jZXMpIHtcbiAgICAgIGxldCB7IHN0YWNrLCBiYXNlLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICByZWZlcmVuY2VzID0gdGhpcy5fcmVmZXJlbmNlcyA9IHN0YWNrLnNsaWNlPFJlZmVyZW5jZT4oYmFzZSwgYmFzZSArIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5hbWVkQXJndW1lbnRzSW1wbCBpbXBsZW1lbnRzIE5hbWVkQXJndW1lbnRzIHtcbiAgcHVibGljIGJhc2UgPSAwO1xuICBwdWJsaWMgbGVuZ3RoID0gMDtcblxuICBwcml2YXRlIHN0YWNrITogRXZhbHVhdGlvblN0YWNrO1xuXG4gIHByaXZhdGUgX3JlZmVyZW5jZXM6IE9wdGlvbjxyZWFkb25seSBSZWZlcmVuY2VbXT4gPSBudWxsO1xuXG4gIHByaXZhdGUgX25hbWVzOiBPcHRpb248cmVhZG9ubHkgc3RyaW5nW10+ID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICBwcml2YXRlIF9hdE5hbWVzOiBPcHRpb248cmVhZG9ubHkgc3RyaW5nW10+ID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuXG4gIGVtcHR5KHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssIGJhc2U6IG51bWJlcikge1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBFTVBUWV9SRUZFUkVOQ0VTO1xuICAgIHRoaXMuX25hbWVzID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICAgIHRoaXMuX2F0TmFtZXMgPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG4gIH1cblxuICBzZXR1cChcbiAgICBzdGFjazogRXZhbHVhdGlvblN0YWNrLFxuICAgIGJhc2U6IG51bWJlcixcbiAgICBsZW5ndGg6IG51bWJlcixcbiAgICBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgYXROYW1lczogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBFTVBUWV9SRUZFUkVOQ0VTO1xuICAgICAgdGhpcy5fbmFtZXMgPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG4gICAgICB0aGlzLl9hdE5hbWVzID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcblxuICAgICAgaWYgKGF0TmFtZXMpIHtcbiAgICAgICAgdGhpcy5fbmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9hdE5hbWVzID0gbmFtZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9uYW1lcyA9IG5hbWVzO1xuICAgICAgICB0aGlzLl9hdE5hbWVzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgbmFtZXMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIGxldCBuYW1lcyA9IHRoaXMuX25hbWVzO1xuXG4gICAgaWYgKCFuYW1lcykge1xuICAgICAgbmFtZXMgPSB0aGlzLl9uYW1lcyA9IHRoaXMuX2F0TmFtZXMhLm1hcCh0aGlzLnRvU3ludGhldGljTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVzITtcbiAgfVxuXG4gIGdldCBhdE5hbWVzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICBsZXQgYXROYW1lcyA9IHRoaXMuX2F0TmFtZXM7XG5cbiAgICBpZiAoIWF0TmFtZXMpIHtcbiAgICAgIGF0TmFtZXMgPSB0aGlzLl9hdE5hbWVzID0gdGhpcy5fbmFtZXMhLm1hcCh0aGlzLnRvQXROYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXROYW1lcyE7XG4gIH1cblxuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nLCBhdE5hbWVzID0gZmFsc2UpOiBSZWZlcmVuY2Uge1xuICAgIGxldCB7IGJhc2UsIHN0YWNrIH0gPSB0aGlzO1xuXG4gICAgbGV0IG5hbWVzID0gYXROYW1lcyA/IHRoaXMuYXROYW1lcyA6IHRoaXMubmFtZXM7XG5cbiAgICBsZXQgaWR4ID0gbmFtZXMuaW5kZXhPZihuYW1lKTtcblxuICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICByZXR1cm4gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICB9XG5cbiAgICBsZXQgcmVmID0gc3RhY2suZ2V0PFJlZmVyZW5jZT4oaWR4LCBiYXNlKTtcblxuICAgIGlmIChERUJVRykge1xuICAgICAgcmV0dXJuIGNyZWF0ZURlYnVnQWxpYXNSZWYhKGF0TmFtZXMgPyBuYW1lIDogYEAke25hbWV9YCwgcmVmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9XG4gIH1cblxuICBjYXB0dXJlKCk6IENhcHR1cmVkTmFtZWRBcmd1bWVudHMge1xuICAgIGxldCB7IG5hbWVzLCByZWZlcmVuY2VzIH0gPSB0aGlzO1xuICAgIGxldCBtYXAgPSBkaWN0PFJlZmVyZW5jZT4oKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBuYW1lID0gbmFtZXNbaV07XG5cbiAgICAgIGlmIChERUJVRykge1xuICAgICAgICBtYXBbbmFtZV0gPSBjcmVhdGVEZWJ1Z0FsaWFzUmVmIShgQCR7bmFtZX1gLCByZWZlcmVuY2VzW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcFtuYW1lXSA9IHJlZmVyZW5jZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcCBhcyBDYXB0dXJlZE5hbWVkQXJndW1lbnRzO1xuICB9XG5cbiAgbWVyZ2Uob3RoZXI6IFJlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT4pIHtcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG90aGVyKTtcblxuICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCB7IG5hbWVzLCBsZW5ndGgsIHN0YWNrIH0gPSB0aGlzO1xuICAgICAgbGV0IG5ld05hbWVzID0gbmFtZXMuc2xpY2UoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBuYW1lID0ga2V5c1tpXTtcbiAgICAgICAgbGV0IGlkeCA9IG5ld05hbWVzLmluZGV4T2YobmFtZSk7XG5cbiAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICBsZW5ndGggPSBuZXdOYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgICAgIHN0YWNrLnB1c2gob3RoZXJbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG4gICAgICB0aGlzLl9uYW1lcyA9IG5ld05hbWVzO1xuICAgICAgdGhpcy5fYXROYW1lcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcmVmZXJlbmNlcygpOiByZWFkb25seSBSZWZlcmVuY2VbXSB7XG4gICAgbGV0IHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzO1xuXG4gICAgaWYgKCFyZWZlcmVuY2VzKSB7XG4gICAgICBsZXQgeyBiYXNlLCBsZW5ndGgsIHN0YWNrIH0gPSB0aGlzO1xuICAgICAgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXMgPSBzdGFjay5zbGljZTxSZWZlcmVuY2U+KGJhc2UsIGJhc2UgKyBsZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiByZWZlcmVuY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1N5bnRoZXRpY05hbWUodGhpczogdm9pZCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZS5zbGljZSgxKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9BdE5hbWUodGhpczogdm9pZCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEAke25hbWV9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1N5bWJvbE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAmJHtuYW1lfWA7XG59XG5cbmNvbnN0IEVNUFRZX0JMT0NLX1ZBTFVFUyA9IGVtcHR5QXJyYXk8QmxvY2tWYWx1ZT4oKTtcblxuZXhwb3J0IGNsYXNzIEJsb2NrQXJndW1lbnRzSW1wbCBpbXBsZW1lbnRzIEJsb2NrQXJndW1lbnRzIHtcbiAgcHJpdmF0ZSBzdGFjayE6IEV2YWx1YXRpb25TdGFjaztcbiAgcHJpdmF0ZSBpbnRlcm5hbFZhbHVlczogT3B0aW9uPHJlYWRvbmx5IEJsb2NrVmFsdWVbXT4gPSBudWxsO1xuICBwcml2YXRlIF9zeW1ib2xOYW1lczogT3B0aW9uPHJlYWRvbmx5IHN0cmluZ1tdPiA9IG51bGw7XG5cbiAgcHVibGljIGludGVybmFsVGFnOiBPcHRpb248VGFnPiA9IG51bGw7XG4gIHB1YmxpYyBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10gPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG5cbiAgcHVibGljIGxlbmd0aCA9IDA7XG4gIHB1YmxpYyBiYXNlID0gMDtcblxuICBlbXB0eShzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5uYW1lcyA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9zeW1ib2xOYW1lcyA9IG51bGw7XG5cbiAgICB0aGlzLmludGVybmFsVGFnID0gQ09OU1RBTlRfVEFHO1xuICAgIHRoaXMuaW50ZXJuYWxWYWx1ZXMgPSBFTVBUWV9CTE9DS19WQUxVRVM7XG4gIH1cblxuICBzZXR1cChzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5uYW1lcyA9IG5hbWVzO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgdGhpcy5fc3ltYm9sTmFtZXMgPSBudWxsO1xuXG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pbnRlcm5hbFRhZyA9IENPTlNUQU5UX1RBRztcbiAgICAgIHRoaXMuaW50ZXJuYWxWYWx1ZXMgPSBFTVBUWV9CTE9DS19WQUxVRVM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxUYWcgPSBudWxsO1xuICAgICAgdGhpcy5pbnRlcm5hbFZhbHVlcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZhbHVlcygpOiByZWFkb25seSBCbG9ja1ZhbHVlW10ge1xuICAgIGxldCB2YWx1ZXMgPSB0aGlzLmludGVybmFsVmFsdWVzO1xuXG4gICAgaWYgKCF2YWx1ZXMpIHtcbiAgICAgIGxldCB7IGJhc2UsIGxlbmd0aCwgc3RhY2sgfSA9IHRoaXM7XG4gICAgICB2YWx1ZXMgPSB0aGlzLmludGVybmFsVmFsdWVzID0gc3RhY2suc2xpY2U8QmxvY2tWYWx1ZT4oYmFzZSwgYmFzZSArIGxlbmd0aCAqIDMpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMhLmluZGV4T2YobmFtZSkgIT09IC0xO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IE9wdGlvbjxTY29wZUJsb2NrPiB7XG4gICAgbGV0IGlkeCA9IHRoaXMubmFtZXMhLmluZGV4T2YobmFtZSk7XG5cbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHsgYmFzZSwgc3RhY2sgfSA9IHRoaXM7XG5cbiAgICBsZXQgdGFibGUgPSBjaGVjayhzdGFjay5nZXQoaWR4ICogMywgYmFzZSksIENoZWNrT3B0aW9uKENoZWNrQmxvY2tTeW1ib2xUYWJsZSkpO1xuICAgIGxldCBzY29wZSA9IGNoZWNrKHN0YWNrLmdldChpZHggKiAzICsgMSwgYmFzZSksIENoZWNrT3B0aW9uKENoZWNrU2NvcGUpKTtcbiAgICBsZXQgaGFuZGxlID0gY2hlY2soXG4gICAgICBzdGFjay5nZXQoaWR4ICogMyArIDIsIGJhc2UpLFxuICAgICAgQ2hlY2tPcHRpb24oQ2hlY2tPcihDaGVja0hhbmRsZSwgQ2hlY2tDb21waWxhYmxlQmxvY2spKVxuICAgICk7XG5cbiAgICByZXR1cm4gaGFuZGxlID09PSBudWxsID8gbnVsbCA6IChbaGFuZGxlLCBzY29wZSEsIHRhYmxlIV0gYXMgU2NvcGVCbG9jayk7XG4gIH1cblxuICBjYXB0dXJlKCk6IENhcHR1cmVkQmxvY2tBcmd1bWVudHMge1xuICAgIHJldHVybiBuZXcgQ2FwdHVyZWRCbG9ja0FyZ3VtZW50c0ltcGwodGhpcy5uYW1lcywgdGhpcy52YWx1ZXMpO1xuICB9XG5cbiAgZ2V0IHN5bWJvbE5hbWVzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICBsZXQgc3ltYm9sTmFtZXMgPSB0aGlzLl9zeW1ib2xOYW1lcztcblxuICAgIGlmIChzeW1ib2xOYW1lcyA9PT0gbnVsbCkge1xuICAgICAgc3ltYm9sTmFtZXMgPSB0aGlzLl9zeW1ib2xOYW1lcyA9IHRoaXMubmFtZXMubWFwKHRvU3ltYm9sTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN5bWJvbE5hbWVzO1xuICB9XG59XG5cbmNsYXNzIENhcHR1cmVkQmxvY2tBcmd1bWVudHNJbXBsIGltcGxlbWVudHMgQ2FwdHVyZWRCbG9ja0FyZ3VtZW50cyB7XG4gIHB1YmxpYyBsZW5ndGg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBwdWJsaWMgdmFsdWVzOiByZWFkb25seSBPcHRpb248QmxvY2tWYWx1ZT5bXSkge1xuICAgIHRoaXMubGVuZ3RoID0gbmFtZXMubGVuZ3RoO1xuICB9XG5cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLmluZGV4T2YobmFtZSkgIT09IC0xO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IE9wdGlvbjxTY29wZUJsb2NrPiB7XG4gICAgbGV0IGlkeCA9IHRoaXMubmFtZXMuaW5kZXhPZihuYW1lKTtcblxuICAgIGlmIChpZHggPT09IC0xKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBbXG4gICAgICB0aGlzLnZhbHVlc1tpZHggKiAzICsgMl0gYXMgQ29tcGlsYWJsZUJsb2NrLFxuICAgICAgdGhpcy52YWx1ZXNbaWR4ICogMyArIDFdIGFzIFNjb3BlLFxuICAgICAgdGhpcy52YWx1ZXNbaWR4ICogM10gYXMgQmxvY2tTeW1ib2xUYWJsZSxcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYXB0dXJlZEFyZ3MobmFtZWQ6IERpY3Q8UmVmZXJlbmNlPiwgcG9zaXRpb25hbDogUmVmZXJlbmNlW10pIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lZCxcbiAgICBwb3NpdGlvbmFsLFxuICB9IGFzIENhcHR1cmVkQXJndW1lbnRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVpZnlOYW1lZChuYW1lZDogQ2FwdHVyZWROYW1lZEFyZ3VtZW50cykge1xuICBsZXQgcmVpZmllZCA9IGRpY3QoKTtcblxuICBmb3IgKGxldCBrZXkgaW4gbmFtZWQpIHtcbiAgICByZWlmaWVkW2tleV0gPSB2YWx1ZUZvclJlZihuYW1lZFtrZXldKTtcbiAgfVxuXG4gIHJldHVybiByZWlmaWVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVpZnlQb3NpdGlvbmFsKHBvc2l0aW9uYWw6IENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cykge1xuICByZXR1cm4gcG9zaXRpb25hbC5tYXAodmFsdWVGb3JSZWYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVpZnlBcmdzKGFyZ3M6IENhcHR1cmVkQXJndW1lbnRzKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZWQ6IHJlaWZ5TmFtZWQoYXJncy5uYW1lZCksXG4gICAgcG9zaXRpb25hbDogcmVpZnlQb3NpdGlvbmFsKGFyZ3MucG9zaXRpb25hbCksXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBFTVBUWV9OQU1FRCA9IE9iamVjdC5mcmVlemUoT2JqZWN0LmNyZWF0ZShudWxsKSkgYXMgQ2FwdHVyZWROYW1lZEFyZ3VtZW50cztcbmV4cG9ydCBjb25zdCBFTVBUWV9QT1NJVElPTkFMID0gRU1QVFlfUkVGRVJFTkNFUyBhcyBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHM7XG5leHBvcnQgY29uc3QgRU1QVFlfQVJHUyA9IGNyZWF0ZUNhcHR1cmVkQXJncyhFTVBUWV9OQU1FRCwgRU1QVFlfUE9TSVRJT05BTCk7XG4iXSwic291cmNlUm9vdCI6IiJ9