UNPKG

ember-legacy-class-transform

Version:
455 lines (374 loc) 45 kB
var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import { populateBuiltins as _populateBuiltins } from './syntax/functions'; import { Constants } from './environment/constants'; import { UNDEFINED_REFERENCE, ConditionalReference } from './references'; import { defaultManagers } from './dom/attribute-managers'; import { assert, ensureGuid } from '@glimmer/util'; export var Scope = function () { function Scope( // the 0th slot is `self` slots, callerScope, // named arguments and blocks passed to a layout that uses eval evalScope, // locals in scope when the partial was invoked partialMap) { _classCallCheck(this, Scope); this.slots = slots; this.callerScope = callerScope; this.evalScope = evalScope; this.partialMap = partialMap; } Scope.root = function root(self) { var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var refs = new Array(size + 1); for (var i = 0; i <= size; i++) { refs[i] = UNDEFINED_REFERENCE; } return new Scope(refs, null, null, null).init({ self: self }); }; Scope.sized = function sized() { var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var refs = new Array(size + 1); for (var i = 0; i <= size; i++) { refs[i] = UNDEFINED_REFERENCE; } return new Scope(refs, null, null, null); }; Scope.prototype.init = function init(_ref) { var self = _ref.self; this.slots[0] = self; return this; }; Scope.prototype.getSelf = function getSelf() { return this.get(0); }; Scope.prototype.getSymbol = function getSymbol(symbol) { return this.get(symbol); }; Scope.prototype.getBlock = function getBlock(symbol) { return this.get(symbol); }; Scope.prototype.getEvalScope = function getEvalScope() { return this.evalScope; }; Scope.prototype.getPartialMap = function getPartialMap() { return this.partialMap; }; Scope.prototype.bind = function bind(symbol, value) { this.set(symbol, value); }; Scope.prototype.bindSelf = function bindSelf(self) { this.set(0, self); }; Scope.prototype.bindSymbol = function bindSymbol(symbol, value) { this.set(symbol, value); }; Scope.prototype.bindBlock = function bindBlock(symbol, value) { this.set(symbol, value); }; Scope.prototype.bindEvalScope = function bindEvalScope(map) { this.evalScope = map; }; Scope.prototype.bindPartialMap = function bindPartialMap(map) { this.partialMap = map; }; Scope.prototype.bindCallerScope = function bindCallerScope(scope) { this.callerScope = scope; }; Scope.prototype.getCallerScope = function getCallerScope() { return this.callerScope; }; Scope.prototype.child = function child() { return new Scope(this.slots.slice(), this.callerScope, this.evalScope, this.partialMap); }; Scope.prototype.get = function get(index) { if (index >= this.slots.length) { throw new RangeError('BUG: cannot get $' + index + ' from scope; length=' + this.slots.length); } return this.slots[index]; }; Scope.prototype.set = function set(index, value) { if (index >= this.slots.length) { throw new RangeError('BUG: cannot get $' + index + ' from scope; length=' + this.slots.length); } this.slots[index] = value; }; return Scope; }(); var Transaction = function () { function Transaction() { _classCallCheck(this, Transaction); this.scheduledInstallManagers = []; this.scheduledInstallModifiers = []; this.scheduledUpdateModifierManagers = []; this.scheduledUpdateModifiers = []; this.createdComponents = []; this.createdManagers = []; this.updatedComponents = []; this.updatedManagers = []; this.destructors = []; } Transaction.prototype.didCreate = function didCreate(component, manager) { this.createdComponents.push(component); this.createdManagers.push(manager); }; Transaction.prototype.didUpdate = function didUpdate(component, manager) { this.updatedComponents.push(component); this.updatedManagers.push(manager); }; Transaction.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) { this.scheduledInstallManagers.push(manager); this.scheduledInstallModifiers.push(modifier); }; Transaction.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) { this.scheduledUpdateModifierManagers.push(manager); this.scheduledUpdateModifiers.push(modifier); }; Transaction.prototype.didDestroy = function didDestroy(d) { this.destructors.push(d); }; Transaction.prototype.commit = function commit() { var createdComponents = this.createdComponents, createdManagers = this.createdManagers; for (var i = 0; i < createdComponents.length; i++) { var component = createdComponents[i]; var manager = createdManagers[i]; manager.didCreate(component); } var updatedComponents = this.updatedComponents, updatedManagers = this.updatedManagers; for (var _i = 0; _i < updatedComponents.length; _i++) { var _component = updatedComponents[_i]; var _manager = updatedManagers[_i]; _manager.didUpdate(_component); } var destructors = this.destructors; for (var _i2 = 0; _i2 < destructors.length; _i2++) { destructors[_i2].destroy(); } var scheduledInstallManagers = this.scheduledInstallManagers, scheduledInstallModifiers = this.scheduledInstallModifiers; for (var _i3 = 0; _i3 < scheduledInstallManagers.length; _i3++) { var _manager2 = scheduledInstallManagers[_i3]; var modifier = scheduledInstallModifiers[_i3]; _manager2.install(modifier); } var scheduledUpdateModifierManagers = this.scheduledUpdateModifierManagers, scheduledUpdateModifiers = this.scheduledUpdateModifiers; for (var _i4 = 0; _i4 < scheduledUpdateModifierManagers.length; _i4++) { var _manager3 = scheduledUpdateModifierManagers[_i4]; var _modifier = scheduledUpdateModifiers[_i4]; _manager3.update(_modifier); } }; return Transaction; }(); export var Opcode = function () { function Opcode(heap) { _classCallCheck(this, Opcode); this.heap = heap; this.offset = 0; } _createClass(Opcode, [{ key: 'type', get: function () { return this.heap.getbyaddr(this.offset); } }, { key: 'op1', get: function () { return this.heap.getbyaddr(this.offset + 1); } }, { key: 'op2', get: function () { return this.heap.getbyaddr(this.offset + 2); } }, { key: 'op3', get: function () { return this.heap.getbyaddr(this.offset + 3); } }]); return Opcode; }(); var TableSlotState; (function (TableSlotState) { TableSlotState[TableSlotState["Allocated"] = 0] = "Allocated"; TableSlotState[TableSlotState["Freed"] = 1] = "Freed"; TableSlotState[TableSlotState["Purged"] = 2] = "Purged"; TableSlotState[TableSlotState["Pointer"] = 3] = "Pointer"; })(TableSlotState || (TableSlotState = {})); export var Heap = function () { function Heap() { _classCallCheck(this, Heap); this.heap = []; this.offset = 0; this.handle = 0; /** * layout: * * - pointer into heap * - size * - freed (0 or 1) */ this.table = []; } Heap.prototype.push = function push(item) { this.heap[this.offset++] = item; }; Heap.prototype.getbyaddr = function getbyaddr(address) { return this.heap[address]; }; Heap.prototype.setbyaddr = function setbyaddr(address, value) { this.heap[address] = value; }; Heap.prototype.malloc = function malloc() { this.table.push(this.offset, 0, 0); var handle = this.handle; this.handle += 3; return handle; }; Heap.prototype.finishMalloc = function finishMalloc(handle) { var start = this.table[handle]; var finish = this.offset; this.table[handle + 1] = finish - start; }; Heap.prototype.size = function size() { return this.offset; }; // It is illegal to close over this address, as compaction // may move it. However, it is legal to use this address // multiple times between compactions. Heap.prototype.getaddr = function getaddr(handle) { return this.table[handle]; }; Heap.prototype.gethandle = function gethandle(address) { this.table.push(address, 0, TableSlotState.Pointer); var handle = this.handle; this.handle += 3; return handle; }; Heap.prototype.sizeof = function sizeof(handle) { if (false) { return this.table[handle + 1]; } return -1; }; Heap.prototype.free = function free(handle) { this.table[handle + 2] = 1; }; Heap.prototype.compact = function compact() { var compactedSize = 0; var table = this.table, length = this.table.length, heap = this.heap; for (var i = 0; i < length; i += 3) { var offset = table[i]; var size = table[i + 1]; var state = table[i + 2]; if (state === TableSlotState.Purged) { continue; } else if (state === TableSlotState.Freed) { // transition to "already freed" // a good improvement would be to reuse // these slots table[i + 2] = 2; compactedSize += size; } else if (state === TableSlotState.Allocated) { for (var j = offset; j <= i + size; j++) { heap[j - compactedSize] = heap[j]; } table[i] = offset - compactedSize; } else if (state === TableSlotState.Pointer) { table[i] = offset - compactedSize; } } this.offset = this.offset - compactedSize; }; return Heap; }(); export var Program = function () { function Program() { _classCallCheck(this, Program); this.heap = new Heap(); this._opcode = new Opcode(this.heap); this.constants = new Constants(); } Program.prototype.opcode = function opcode(offset) { this._opcode.offset = offset; return this._opcode; }; return Program; }(); export var Environment = function () { function Environment(_ref2) { var appendOperations = _ref2.appendOperations, updateOperations = _ref2.updateOperations; _classCallCheck(this, Environment); this._macros = null; this._transaction = null; this.program = new Program(); this.appendOperations = appendOperations; this.updateOperations = updateOperations; } Environment.prototype.toConditionalReference = function toConditionalReference(reference) { return new ConditionalReference(reference); }; Environment.prototype.getAppendOperations = function getAppendOperations() { return this.appendOperations; }; Environment.prototype.getDOM = function getDOM() { return this.updateOperations; }; Environment.prototype.getIdentity = function getIdentity(object) { return ensureGuid(object) + ''; }; Environment.prototype.begin = function begin() { assert(!this._transaction, 'a glimmer transaction was begun, but one already exists. You may have a nested transaction'); this._transaction = new Transaction(); }; Environment.prototype.didCreate = function didCreate(component, manager) { this.transaction.didCreate(component, manager); }; Environment.prototype.didUpdate = function didUpdate(component, manager) { this.transaction.didUpdate(component, manager); }; Environment.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) { this.transaction.scheduleInstallModifier(modifier, manager); }; Environment.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) { this.transaction.scheduleUpdateModifier(modifier, manager); }; Environment.prototype.didDestroy = function didDestroy(d) { this.transaction.didDestroy(d); }; Environment.prototype.commit = function commit() { var transaction = this.transaction; this._transaction = null; transaction.commit(); }; Environment.prototype.attributeFor = function attributeFor(element, attr, isTrusting, namespace) { return defaultManagers(element, attr, isTrusting, namespace === undefined ? null : namespace); }; Environment.prototype.macros = function macros() { var macros = this._macros; if (!macros) { this._macros = macros = this.populateBuiltins(); } return macros; }; Environment.prototype.populateBuiltins = function populateBuiltins() { return _populateBuiltins(); }; _createClass(Environment, [{ key: 'transaction', get: function () { return this._transaction; } }]); return Environment; }(); export default Environment; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9lbnZpcm9ubWVudC5qcyJdLCJuYW1lcyI6WyJwb3B1bGF0ZUJ1aWx0aW5zIiwiQ29uc3RhbnRzIiwiVU5ERUZJTkVEX1JFRkVSRU5DRSIsIkNvbmRpdGlvbmFsUmVmZXJlbmNlIiwiZGVmYXVsdE1hbmFnZXJzIiwiYXNzZXJ0IiwiZW5zdXJlR3VpZCIsIlNjb3BlIiwic2xvdHMiLCJjYWxsZXJTY29wZSIsImV2YWxTY29wZSIsInBhcnRpYWxNYXAiLCJyb290Iiwic2VsZiIsInNpemUiLCJyZWZzIiwiQXJyYXkiLCJpIiwiaW5pdCIsInNpemVkIiwiZ2V0U2VsZiIsImdldCIsImdldFN5bWJvbCIsInN5bWJvbCIsImdldEJsb2NrIiwiZ2V0RXZhbFNjb3BlIiwiZ2V0UGFydGlhbE1hcCIsImJpbmQiLCJ2YWx1ZSIsInNldCIsImJpbmRTZWxmIiwiYmluZFN5bWJvbCIsImJpbmRCbG9jayIsImJpbmRFdmFsU2NvcGUiLCJtYXAiLCJiaW5kUGFydGlhbE1hcCIsImJpbmRDYWxsZXJTY29wZSIsInNjb3BlIiwiZ2V0Q2FsbGVyU2NvcGUiLCJjaGlsZCIsInNsaWNlIiwiaW5kZXgiLCJsZW5ndGgiLCJSYW5nZUVycm9yIiwiVHJhbnNhY3Rpb24iLCJzY2hlZHVsZWRJbnN0YWxsTWFuYWdlcnMiLCJzY2hlZHVsZWRJbnN0YWxsTW9kaWZpZXJzIiwic2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJNYW5hZ2VycyIsInNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVycyIsImNyZWF0ZWRDb21wb25lbnRzIiwiY3JlYXRlZE1hbmFnZXJzIiwidXBkYXRlZENvbXBvbmVudHMiLCJ1cGRhdGVkTWFuYWdlcnMiLCJkZXN0cnVjdG9ycyIsImRpZENyZWF0ZSIsImNvbXBvbmVudCIsIm1hbmFnZXIiLCJwdXNoIiwiZGlkVXBkYXRlIiwic2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIiLCJtb2RpZmllciIsInNjaGVkdWxlVXBkYXRlTW9kaWZpZXIiLCJkaWREZXN0cm95IiwiZCIsImNvbW1pdCIsImRlc3Ryb3kiLCJpbnN0YWxsIiwidXBkYXRlIiwiT3Bjb2RlIiwiaGVhcCIsIm9mZnNldCIsImdldGJ5YWRkciIsIlRhYmxlU2xvdFN0YXRlIiwiSGVhcCIsImhhbmRsZSIsInRhYmxlIiwiaXRlbSIsImFkZHJlc3MiLCJzZXRieWFkZHIiLCJtYWxsb2MiLCJmaW5pc2hNYWxsb2MiLCJzdGFydCIsImZpbmlzaCIsImdldGFkZHIiLCJnZXRoYW5kbGUiLCJQb2ludGVyIiwic2l6ZW9mIiwiZnJlZSIsImNvbXBhY3QiLCJjb21wYWN0ZWRTaXplIiwic3RhdGUiLCJQdXJnZWQiLCJGcmVlZCIsIkFsbG9jYXRlZCIsImoiLCJQcm9ncmFtIiwiX29wY29kZSIsImNvbnN0YW50cyIsIm9wY29kZSIsIkVudmlyb25tZW50IiwiYXBwZW5kT3BlcmF0aW9ucyIsInVwZGF0ZU9wZXJhdGlvbnMiLCJfbWFjcm9zIiwiX3RyYW5zYWN0aW9uIiwicHJvZ3JhbSIsInRvQ29uZGl0aW9uYWxSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJnZXRBcHBlbmRPcGVyYXRpb25zIiwiZ2V0RE9NIiwiZ2V0SWRlbnRpdHkiLCJvYmplY3QiLCJiZWdpbiIsInRyYW5zYWN0aW9uIiwiYXR0cmlidXRlRm9yIiwiZWxlbWVudCIsImF0dHIiLCJpc1RydXN0aW5nIiwibmFtZXNwYWNlIiwidW5kZWZpbmVkIiwibWFjcm9zIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsU0FBU0EscUNBQVQsUUFBaUMsb0JBQWpDO0FBQ0EsU0FBU0MsU0FBVCxRQUEwQix5QkFBMUI7QUFDQSxTQUFTQyxtQkFBVCxFQUE4QkMsb0JBQTlCLFFBQTBELGNBQTFEO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQywwQkFBaEM7QUFDQSxTQUFTQyxNQUFULEVBQWlCQyxVQUFqQixRQUEyQyxlQUEzQzs7QUFFQSxXQUFhQyxLQUFiO0FBQ0k7QUFDQTtBQUNBQyxTQUZBLEVBRU9DLFdBRlA7QUFHQTtBQUNBQyxhQUpBO0FBS0E7QUFDQUMsY0FOQSxFQU1ZO0FBQUE7O0FB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SDtBQUNELGVBQU91SCxNQUFQO0FBQ0gsS0F4REw7O0FBQUEsMEJBeURJdkgsZ0JBekRKLCtCQXlEdUI7QUFDZixlQUFPQSxtQkFBUDtBQUNILEtBM0RMOztBQUFBO0FBQUE7QUFBQSx5QkF3QnNCO0FBQ2QsbUJBQWMsS0FBS3VHLFlBQW5CO0FBQ0g7QUExQkw7O0FBQUE7QUFBQTtBQTZEQSxlQUFlSixXQUFmIiwiZmlsZSI6ImxpYi9lbnZpcm9ubWVudC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBvcHVsYXRlQnVpbHRpbnMgfSBmcm9tICcuL3N5bnRheC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi9lbnZpcm9ubWVudC9jb25zdGFudHMnO1xuaW1wb3J0IHsgVU5ERUZJTkVEX1JFRkVSRU5DRSwgQ29uZGl0aW9uYWxSZWZlcmVuY2UgfSBmcm9tICcuL3JlZmVyZW5jZXMnO1xuaW1wb3J0IHsgZGVmYXVsdE1hbmFnZXJzIH0gZnJvbSAnLi9kb20vYXR0cmlidXRlLW1hbmFnZXJzJztcbmltcG9ydCB7IGFzc2VydCwgZW5zdXJlR3VpZCwgZXhwZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBTY29wZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gdGhlIDB0aCBzbG90IGlzIGBzZWxmYFxuICAgIHNsb3RzLCBjYWxsZXJTY29wZSxcbiAgICAvLyBuYW1lZCBhcmd1bWVudHMgYW5kIGJsb2NrcyBwYXNzZWQgdG8gYSBsYXlvdXQgdGhhdCB1c2VzIGV2YWxcbiAgICBldmFsU2NvcGUsXG4gICAgLy8gbG9jYWxzIGluIHNjb3BlIHdoZW4gdGhlIHBhcnRpYWwgd2FzIGludm9rZWRcbiAgICBwYXJ0aWFsTWFwKSB7XG4gICAgICAgIHRoaXMuc2xvdHMgPSBzbG90cztcbiAgICAgICAgdGhpcy5jYWxsZXJTY29wZSA9IGNhbGxlclNjb3BlO1xuICAgICAgICB0aGlzLmV2YWxTY29wZSA9IGV2YWxTY29wZTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWFwID0gcGFydGlhbE1hcDtcbiAgICB9XG4gICAgc3RhdGljIHJvb3Qoc2VsZiwgc2l6ZSA9IDApIHtcbiAgICAgICAgbGV0IHJlZnMgPSBuZXcgQXJyYXkoc2l6ZSArIDEpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIHJlZnNbaV0gPSBVTkRFRklORURfUkVGRVJFTkNFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU2NvcGUocmVmcywgbnVsbCwgbnVsbCwgbnVsbCkuaW5pdCh7IHNlbGYgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBzaXplZChzaXplID0gMCkge1xuICAgICAgICBsZXQgcmVmcyA9IG5ldyBBcnJheShzaXplICsgMSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNpemU7IGkrKykge1xuICAgICAgICAgICAgcmVmc1tpXSA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTY29wZShyZWZzLCBudWxsLCBudWxsLCBudWxsKTtcbiAgICB9XG4gICAgaW5pdCh7IHNlbGYgfSkge1xuICAgICAgICB0aGlzLnNsb3RzWzBdID0gc2VsZjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldFNlbGYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgwKTtcbiAgICB9XG4gICAgZ2V0U3ltYm9sKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoc3ltYm9sKTtcbiAgICB9XG4gICAgZ2V0QmxvY2soc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChzeW1ib2wpO1xuICAgIH1cbiAgICBnZXRFdmFsU2NvcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWxTY29wZTtcbiAgICB9XG4gICAgZ2V0UGFydGlhbE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1hcDtcbiAgICB9XG4gICAgYmluZChzeW1ib2wsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0KHN5bWJvbCwgdmFsdWUpO1xuICAgIH1cbiAgICBiaW5kU2VsZihzZWxmKSB7XG4gICAgICAgIHRoaXMuc2V0KDAsIHNlbGYpO1xuICAgIH1cbiAgICBiaW5kU3ltYm9sKHN5bWJvbCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXQoc3ltYm9sLCB2YWx1ZSk7XG4gICAgfVxuICAgIGJpbmRCbG9jayhzeW1ib2wsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0KHN5bWJvbCwgdmFsdWUpO1xuICAgIH1cbiAgICBiaW5kRXZhbFNjb3BlKG1hcCkge1xuICAgICAgICB0aGlzLmV2YWxTY29wZSA9IG1hcDtcbiAgICB9XG4gICAgYmluZFBhcnRpYWxNYXAobWFwKSB7XG4gICAgICAgIHRoaXMucGFydGlhbE1hcCA9IG1hcDtcbiAgICB9XG4gICAgYmluZENhbGxlclNjb3BlKHNjb3BlKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyU2NvcGUgPSBzY29wZTtcbiAgICB9XG4gICAgZ2V0Q2FsbGVyU2NvcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxlclNjb3BlO1xuICAgIH1cbiAgICBjaGlsZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY29wZSh0aGlzLnNsb3RzLnNsaWNlKCksIHRoaXMuY2FsbGVyU2NvcGUsIHRoaXMuZXZhbFNjb3BlLCB0aGlzLnBhcnRpYWxNYXApO1xuICAgIH1cbiAgICBnZXQoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMuc2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQlVHOiBjYW5ub3QgZ2V0ICQke2luZGV4fSBmcm9tIHNjb3BlOyBsZW5ndGg9JHt0aGlzLnNsb3RzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zbG90c1tpbmRleF07XG4gICAgfVxuICAgIHNldChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMuc2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQlVHOiBjYW5ub3QgZ2V0ICQke2luZGV4fSBmcm9tIHNjb3BlOyBsZW5ndGg9JHt0aGlzLnNsb3RzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNsb3RzW2luZGV4XSA9IHZhbHVlO1xuICAgIH1cbn1cbmNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWRJbnN0YWxsTWFuYWdlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWRJbnN0YWxsTW9kaWZpZXJzID0gW107XG4gICAgICAgIHRoaXMuc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJNYW5hZ2VycyA9IFtdO1xuICAgICAgICB0aGlzLnNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVycyA9IFtdO1xuICAgICAgICB0aGlzLmNyZWF0ZWRDb21wb25lbnRzID0gW107XG4gICAgICAgIHRoaXMuY3JlYXRlZE1hbmFnZXJzID0gW107XG4gICAgICAgIHRoaXMudXBkYXRlZENvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgdGhpcy51cGRhdGVkTWFuYWdlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5kZXN0cnVjdG9ycyA9IFtdO1xuICAgIH1cbiAgICBkaWRDcmVhdGUoY29tcG9uZW50LCBtYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlZENvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICB0aGlzLmNyZWF0ZWRNYW5hZ2Vycy5wdXNoKG1hbmFnZXIpO1xuICAgIH1cbiAgICBkaWRVcGRhdGUoY29tcG9uZW50LCBtYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlZENvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZWRNYW5hZ2Vycy5wdXNoKG1hbmFnZXIpO1xuICAgIH1cbiAgICBzY2hlZHVsZUluc3RhbGxNb2RpZmllcihtb2RpZmllciwgbWFuYWdlcikge1xuICAgICAgICB0aGlzLnNjaGVkdWxlZEluc3RhbGxNYW5hZ2Vycy5wdXNoKG1hbmFnZXIpO1xuICAgICAgICB0aGlzLnNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgfVxuICAgIHNjaGVkdWxlVXBkYXRlTW9kaWZpZXIobW9kaWZpZXIsIG1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWRVcGRhdGVNb2RpZmllck1hbmFnZXJzLnB1c2gobWFuYWdlcik7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgIH1cbiAgICBkaWREZXN0cm95KGQpIHtcbiAgICAgICAgdGhpcy5kZXN0cnVjdG9ycy5wdXNoKGQpO1xuICAgIH1cbiAgICBjb21taXQoKSB7XG4gICAgICAgIGxldCB7IGNyZWF0ZWRDb21wb25lbnRzLCBjcmVhdGVkTWFuYWdlcnMgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3JlYXRlZENvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjb21wb25lbnQgPSBjcmVhdGVkQ29tcG9uZW50c1tpXTtcbiAgICAgICAgICAgIGxldCBtYW5hZ2VyID0gY3JlYXRlZE1hbmFnZXJzW2ldO1xuICAgICAgICAgICAgbWFuYWdlci5kaWRDcmVhdGUoY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyB1cGRhdGVkQ29tcG9uZW50cywgdXBkYXRlZE1hbmFnZXJzIH0gPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVwZGF0ZWRDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdXBkYXRlZENvbXBvbmVudHNbaV07XG4gICAgICAgICAgICBsZXQgbWFuYWdlciA9IHVwZGF0ZWRNYW5hZ2Vyc1tpXTtcbiAgICAgICAgICAgIG1hbmFnZXIuZGlkVXBkYXRlKGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgZGVzdHJ1Y3RvcnMgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRlc3RydWN0b3JzW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBzY2hlZHVsZWRJbnN0YWxsTWFuYWdlcnMsIHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnMgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZWR1bGVkSW5zdGFsbE1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFuYWdlciA9IHNjaGVkdWxlZEluc3RhbGxNYW5hZ2Vyc1tpXTtcbiAgICAgICAgICAgIGxldCBtb2RpZmllciA9IHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnNbaV07XG4gICAgICAgICAgICBtYW5hZ2VyLmluc3RhbGwobW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVyTWFuYWdlcnMsIHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVycyB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlZHVsZWRVcGRhdGVNb2RpZmllck1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFuYWdlciA9IHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVyTWFuYWdlcnNbaV07XG4gICAgICAgICAgICBsZXQgbW9kaWZpZXIgPSBzY2hlZHVsZWRVcGRhdGVNb2RpZmllcnNbaV07XG4gICAgICAgICAgICBtYW5hZ2VyLnVwZGF0ZShtb2RpZmllcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihoZWFwKSB7XG4gICAgICAgIHRoaXMuaGVhcCA9IGhlYXA7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXAuZ2V0YnlhZGRyKHRoaXMub2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IG9wMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5nZXRieWFkZHIodGhpcy5vZmZzZXQgKyAxKTtcbiAgICB9XG4gICAgZ2V0IG9wMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5nZXRieWFkZHIodGhpcy5vZmZzZXQgKyAyKTtcbiAgICB9XG4gICAgZ2V0IG9wMygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5nZXRieWFkZHIodGhpcy5vZmZzZXQgKyAzKTtcbiAgICB9XG59XG52YXIgVGFibGVTbG90U3RhdGU7XG4oZnVuY3Rpb24gKFRhYmxlU2xvdFN0YXRlKSB7XG4gICAgVGFibGVTbG90U3RhdGVbVGFibGVTbG90U3RhdGVbXCJBbGxvY2F0ZWRcIl0gPSAwXSA9IFwiQWxsb2NhdGVkXCI7XG4gICAgVGFibGVTbG90U3RhdGVbVGFibGVTbG90U3RhdGVbXCJGcmVlZFwiXSA9IDFdID0gXCJGcmVlZFwiO1xuICAgIFRhYmxlU2xvdFN0YXRlW1RhYmxlU2xvdFN0YXRlW1wiUHVyZ2VkXCJdID0gMl0gPSBcIlB1cmdlZFwiO1xuICAgIFRhYmxlU2xvdFN0YXRlW1RhYmxlU2xvdFN0YXRlW1wiUG9pbnRlclwiXSA9IDNdID0gXCJQb2ludGVyXCI7XG59KShUYWJsZVNsb3RTdGF0ZSB8fCAoVGFibGVTbG90U3RhdGUgPSB7fSkpO1xuZXhwb3J0IGNsYXNzIEhlYXAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhlYXAgPSBbXTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsYXlvdXQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIC0gcG9pbnRlciBpbnRvIGhlYXBcbiAgICAgICAgICogLSBzaXplXG4gICAgICAgICAqIC0gZnJlZWQgKDAgb3IgMSlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFibGUgPSBbXTtcbiAgICB9XG4gICAgcHVzaChpdGVtKSB7XG4gICAgICAgIHRoaXMuaGVhcFt0aGlzLm9mZnNldCsrXSA9IGl0ZW07XG4gICAgfVxuICAgIGdldGJ5YWRkcihhZGRyZXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXBbYWRkcmVzc107XG4gICAgfVxuICAgIHNldGJ5YWRkcihhZGRyZXNzLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmhlYXBbYWRkcmVzc10gPSB2YWx1ZTtcbiAgICB9XG4gICAgbWFsbG9jKCkge1xuICAgICAgICB0aGlzLnRhYmxlLnB1c2godGhpcy5vZmZzZXQsIDAsIDApO1xuICAgICAgICBsZXQgaGFuZGxlID0gdGhpcy5oYW5kbGU7XG4gICAgICAgIHRoaXMuaGFuZGxlICs9IDM7XG4gICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfVxuICAgIGZpbmlzaE1hbGxvYyhoYW5kbGUpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy50YWJsZVtoYW5kbGVdO1xuICAgICAgICBsZXQgZmluaXNoID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIHRoaXMudGFibGVbaGFuZGxlICsgMV0gPSBmaW5pc2ggLSBzdGFydDtcbiAgICB9XG4gICAgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xuICAgIH1cbiAgICAvLyBJdCBpcyBpbGxlZ2FsIHRvIGNsb3NlIG92ZXIgdGhpcyBhZGRyZXNzLCBhcyBjb21wYWN0aW9uXG4gICAgLy8gbWF5IG1vdmUgaXQuIEhvd2V2ZXIsIGl0IGlzIGxlZ2FsIHRvIHVzZSB0aGlzIGFkZHJlc3NcbiAgICAvLyBtdWx0aXBsZSB0aW1lcyBiZXR3ZWVuIGNvbXBhY3Rpb25zLlxuICAgIGdldGFkZHIoaGFuZGxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlW2hhbmRsZV07XG4gICAgfVxuICAgIGdldGhhbmRsZShhZGRyZXNzKSB7XG4gICAgICAgIHRoaXMudGFibGUucHVzaChhZGRyZXNzLCAwLCBUYWJsZVNsb3RTdGF0ZS5Qb2ludGVyKTtcbiAgICAgICAgbGV0IGhhbmRsZSA9IHRoaXMuaGFuZGxlO1xuICAgICAgICB0aGlzLmhhbmRsZSArPSAzO1xuICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgIH1cbiAgICBzaXplb2YoaGFuZGxlKSB7XG4gICAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFibGVbaGFuZGxlICsgMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBmcmVlKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnRhYmxlW2hhbmRsZSArIDJdID0gMTtcbiAgICB9XG4gICAgY29tcGFjdCgpIHtcbiAgICAgICAgbGV0IGNvbXBhY3RlZFNpemUgPSAwO1xuICAgICAgICBsZXQgeyB0YWJsZSwgdGFibGU6IHsgbGVuZ3RoIH0sIGhlYXAgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSB0YWJsZVtpXTtcbiAgICAgICAgICAgIGxldCBzaXplID0gdGFibGVbaSArIDFdO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGFibGVbaSArIDJdO1xuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBUYWJsZVNsb3RTdGF0ZS5QdXJnZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFRhYmxlU2xvdFN0YXRlLkZyZWVkKSB7XG4gICAgICAgICAgICAgICAgLy8gdHJhbnNpdGlvbiB0byBcImFscmVhZHkgZnJlZWRcIlxuICAgICAgICAgICAgICAgIC8vIGEgZ29vZCBpbXByb3ZlbWVudCB3b3VsZCBiZSB0byByZXVzZVxuICAgICAgICAgICAgICAgIC8vIHRoZXNlIHNsb3RzXG4gICAgICAgICAgICAgICAgdGFibGVbaSArIDJdID0gMjtcbiAgICAgICAgICAgICAgICBjb21wYWN0ZWRTaXplICs9IHNpemU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBUYWJsZVNsb3RTdGF0ZS5BbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gb2Zmc2V0OyBqIDw9IGkgKyBzaXplOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhcFtqIC0gY29tcGFjdGVkU2l6ZV0gPSBoZWFwW2pdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YWJsZVtpXSA9IG9mZnNldCAtIGNvbXBhY3RlZFNpemU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBUYWJsZVNsb3RTdGF0ZS5Qb2ludGVyKSB7XG4gICAgICAgICAgICAgICAgdGFibGVbaV0gPSBvZmZzZXQgLSBjb21wYWN0ZWRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5vZmZzZXQgLSBjb21wYWN0ZWRTaXplO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBQcm9ncmFtIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oZWFwID0gbmV3IEhlYXAoKTtcbiAgICAgICAgdGhpcy5fb3Bjb2RlID0gbmV3IE9wY29kZSh0aGlzLmhlYXApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cyA9IG5ldyBDb25zdGFudHMoKTtcbiAgICB9XG4gICAgb3Bjb2RlKG9mZnNldCkge1xuICAgICAgICB0aGlzLl9vcGNvZGUub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICByZXR1cm4gdGhpcy5fb3Bjb2RlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCB7XG4gICAgY29uc3RydWN0b3IoeyBhcHBlbmRPcGVyYXRpb25zLCB1cGRhdGVPcGVyYXRpb25zIH0pIHtcbiAgICAgICAgdGhpcy5fbWFjcm9zID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBuZXcgUHJvZ3JhbSgpO1xuICAgICAgICB0aGlzLmFwcGVuZE9wZXJhdGlvbnMgPSBhcHBlbmRPcGVyYXRpb25zO1xuICAgICAgICB0aGlzLnVwZGF0ZU9wZXJhdGlvbnMgPSB1cGRhdGVPcGVyYXRpb25zO1xuICAgIH1cbiAgICB0b0NvbmRpdGlvbmFsUmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsUmVmZXJlbmNlKHJlZmVyZW5jZSk7XG4gICAgfVxuICAgIGdldEFwcGVuZE9wZXJhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGVuZE9wZXJhdGlvbnM7XG4gICAgfVxuICAgIGdldERPTSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlT3BlcmF0aW9ucztcbiAgICB9XG4gICAgZ2V0SWRlbnRpdHkob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBlbnN1cmVHdWlkKG9iamVjdCkgKyAnJztcbiAgICB9XG4gICAgYmVnaW4oKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5fdHJhbnNhY3Rpb24sICdhIGdsaW1tZXIgdHJhbnNhY3Rpb24gd2FzIGJlZ3VuLCBidXQgb25lIGFscmVhZHkgZXhpc3RzLiBZb3UgbWF5IGhhdmUgYSBuZXN0ZWQgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgICB9XG4gICAgZ2V0IHRyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMuX3RyYW5zYWN0aW9uLCAnbXVzdCBiZSBpbiBhIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGRpZENyZWF0ZShjb21wb25lbnQsIG1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5kaWRDcmVhdGUoY29tcG9uZW50LCBtYW5hZ2VyKTtcbiAgICB9XG4gICAgZGlkVXBkYXRlKGNvbXBvbmVudCwgbWFuYWdlcikge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLmRpZFVwZGF0ZShjb21wb25lbnQsIG1hbmFnZXIpO1xuICAgIH1cbiAgICBzY2hlZHVsZUluc3RhbGxNb2RpZmllcihtb2RpZmllciwgbWFuYWdlcikge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLnNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyLCBtYW5hZ2VyKTtcbiAgICB9XG4gICAgc2NoZWR1bGVVcGRhdGVNb2RpZmllcihtb2RpZmllciwgbWFuYWdlcikge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLnNjaGVkdWxlVXBkYXRlTW9kaWZpZXIobW9kaWZpZXIsIG1hbmFnZXIpO1xuICAgIH1cbiAgICBkaWREZXN0cm95KGQpIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5kaWREZXN0cm95KGQpO1xuICAgIH1cbiAgICBjb21taXQoKSB7XG4gICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb247XG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gbnVsbDtcbiAgICAgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7XG4gICAgfVxuICAgIGF0dHJpYnV0ZUZvcihlbGVtZW50LCBhdHRyLCBpc1RydXN0aW5nLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYW5hZ2VycyhlbGVtZW50LCBhdHRyLCBpc1RydXN0aW5nLCBuYW1lc3BhY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBuYW1lc3BhY2UpO1xuICAgIH1cbiAgICBtYWNyb3MoKSB7XG4gICAgICAgIGxldCBtYWNyb3MgPSB0aGlzLl9tYWNyb3M7XG4gICAgICAgIGlmICghbWFjcm9zKSB7XG4gICAgICAgICAgICB0aGlzLl9tYWNyb3MgPSBtYWNyb3MgPSB0aGlzLnBvcHVsYXRlQnVpbHRpbnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFjcm9zO1xuICAgIH1cbiAgICBwb3B1bGF0ZUJ1aWx0aW5zKCkge1xuICAgICAgICByZXR1cm4gcG9wdWxhdGVCdWlsdGlucygpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEVudmlyb25tZW50OyJdfQ==