ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
447 lines (358 loc) • 41.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.EvaluationStack = undefined;
var _opcodes = require("../opcodes");
var _environment = require("../environment");
var _util = require("@glimmer/util");
var _reference = require("@glimmer/reference");
var _vm = require("../compiled/opcodes/vm");
var _update = require("./update");
var _renderResult = require("./render-result");
var _renderResult2 = _interopRequireDefault(_renderResult);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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");
}
}
var EvaluationStack = exports.EvaluationStack = function () {
function EvaluationStack(stack, fp, sp) {
_classCallCheck(this, EvaluationStack);
this.stack = stack;
this.fp = fp;
this.sp = sp;
if (false) {
Object.seal(this);
}
}
EvaluationStack.empty = function empty() {
return new this([], 0, -1);
};
EvaluationStack.restore = function restore(snapshot) {
return new this(snapshot.slice(), 0, snapshot.length - 1);
};
EvaluationStack.prototype.isEmpty = function isEmpty() {
return this.sp === -1;
};
EvaluationStack.prototype.push = function push(value) {
this.stack[++this.sp] = value;
};
EvaluationStack.prototype.dup = function dup() {
var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.sp;
this.push(this.stack[position]);
};
EvaluationStack.prototype.pop = function pop() {
var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
var top = this.stack[this.sp];
this.sp -= n;
return top;
};
EvaluationStack.prototype.peek = function peek() {
return this.stack[this.sp];
};
EvaluationStack.prototype.fromBase = function fromBase(offset) {
return this.stack[this.fp - offset];
};
EvaluationStack.prototype.fromTop = function fromTop(offset) {
return this.stack[this.sp - offset];
};
EvaluationStack.prototype.capture = function capture(items) {
var end = this.sp + 1;
var start = end - items;
return this.stack.slice(start, end);
};
EvaluationStack.prototype.reset = function reset() {
this.stack.length = 0;
};
EvaluationStack.prototype.toArray = function toArray() {
return this.stack.slice(this.fp, this.sp + 1);
};
return EvaluationStack;
}();
var VM = function () {
function VM(env, scope, dynamicScope, elementStack) {
_classCallCheck(this, VM);
this.env = env;
this.elementStack = elementStack;
this.dynamicScopeStack = new _util.Stack();
this.scopeStack = new _util.Stack();
this.updatingOpcodeStack = new _util.Stack();
this.cacheGroups = new _util.Stack();
this.listBlockStack = new _util.Stack();
this.stack = EvaluationStack.empty();
/* Registers */
this.pc = -1;
this.ra = -1;
this.s0 = null;
this.s1 = null;
this.t0 = null;
this.t1 = null;
this.env = env;
this.heap = env.program.heap;
this.constants = env.program.constants;
this.elementStack = elementStack;
this.scopeStack.push(scope);
this.dynamicScopeStack.push(dynamicScope);
}
// Fetch a value from a register onto the stack
VM.prototype.fetch = function fetch(register) {
this.stack.push(this[_opcodes.Register[register]]);
};
// Load a value from the stack into a register
VM.prototype.load = function load(register) {
this[_opcodes.Register[register]] = this.stack.pop();
};
// Fetch a value from a register
VM.prototype.fetchValue = function fetchValue(register) {
return this[_opcodes.Register[register]];
};
// Load a value into a register
VM.prototype.loadValue = function loadValue(register, value) {
this[_opcodes.Register[register]] = value;
};
// Start a new frame and save $ra and $fp on the stack
VM.prototype.pushFrame = function pushFrame() {
this.stack.push(this.ra);
this.stack.push(this.fp);
this.fp = this.sp - 1;
};
// Restore $ra, $sp and $fp
VM.prototype.popFrame = function popFrame() {
this.sp = this.fp - 1;
this.ra = this.stack.fromBase(0);
this.fp = this.stack.fromBase(-1);
};
// Jump to an address in `program`
VM.prototype.goto = function goto(offset) {
this.pc = (0, _util.typePos)(this.pc + offset);
};
// Save $pc into $ra, then jump to a new address in `program` (jal in MIPS)
VM.prototype.call = function call(handle) {
var pc = this.heap.getaddr(handle);
this.ra = this.pc;
this.pc = pc;
};
// Put a specific `program` address in $ra
VM.prototype.returnTo = function returnTo(offset) {
this.ra = (0, _util.typePos)(this.pc + offset);
};
// Return to the `program` address stored in $ra
VM.prototype.return = function _return() {
this.pc = this.ra;
};
VM.initial = function initial(env, self, dynamicScope, elementStack, program) {
var scope = _environment.Scope.root(self, program.symbolTable.symbols.length);
var vm = new VM(env, scope, dynamicScope, elementStack);
vm.pc = vm.heap.getaddr(program.handle);
vm.updatingOpcodeStack.push(new _util.LinkedList());
return vm;
};
VM.prototype.capture = function capture(args) {
return {
dynamicScope: this.dynamicScope(),
env: this.env,
scope: this.scope(),
stack: this.stack.capture(args)
};
};
VM.prototype.beginCacheGroup = function beginCacheGroup() {
this.cacheGroups.push(this.updating().tail());
};
VM.prototype.commitCacheGroup = function commitCacheGroup() {
// JumpIfNotModified(END)
// (head)
// (....)
// (tail)
// DidModify
// END: Noop
var END = new _vm.LabelOpcode("END");
var opcodes = this.updating();
var marker = this.cacheGroups.pop();
var head = marker ? opcodes.nextNode(marker) : opcodes.head();
var tail = opcodes.tail();
var tag = (0, _reference.combineSlice)(new _util.ListSlice(head, tail));
var guard = new _vm.JumpIfNotModifiedOpcode(tag, END);
opcodes.insertBefore(guard, head);
opcodes.append(new _vm.DidModifyOpcode(guard));
opcodes.append(END);
};
VM.prototype.enter = function enter(args) {
var updating = new _util.LinkedList();
var state = this.capture(args);
var tracker = this.elements().pushUpdatableBlock();
var tryOpcode = new _update.TryOpcode(this.heap.gethandle(this.pc), state, tracker, updating);
this.didEnter(tryOpcode);
};
VM.prototype.iterate = function iterate(memo, value) {
var stack = this.stack;
stack.push(value);
stack.push(memo);
var state = this.capture(2);
var tracker = this.elements().pushUpdatableBlock();
// let ip = this.ip;
// this.ip = end + 4;
// this.frames.push(ip);
return new _update.TryOpcode(this.heap.gethandle(this.pc), state, tracker, new _util.LinkedList());
};
VM.prototype.enterItem = function enterItem(key, opcode) {
this.listBlock().map[key] = opcode;
this.didEnter(opcode);
};
VM.prototype.enterList = function enterList(relativeStart) {
var updating = new _util.LinkedList();
var state = this.capture(0);
var tracker = this.elements().pushBlockList(updating);
var artifacts = this.stack.peek().artifacts;
var start = this.heap.gethandle((0, _util.typePos)(this.pc + relativeStart));
var opcode = new _update.ListBlockOpcode(start, state, tracker, updating, artifacts);
this.listBlockStack.push(opcode);
this.didEnter(opcode);
};
VM.prototype.didEnter = function didEnter(opcode) {
this.updateWith(opcode);
this.updatingOpcodeStack.push(opcode.children);
};
VM.prototype.exit = function exit() {
this.elements().popBlock();
this.updatingOpcodeStack.pop();
var parent = this.updating().tail();
parent.didInitializeChildren();
};
VM.prototype.exitList = function exitList() {
this.exit();
this.listBlockStack.pop();
};
VM.prototype.updateWith = function updateWith(opcode) {
this.updating().append(opcode);
};
VM.prototype.listBlock = function listBlock() {
return this.listBlockStack.current;
};
VM.prototype.updating = function updating() {
return this.updatingOpcodeStack.current;
};
VM.prototype.elements = function elements() {
return this.elementStack;
};
VM.prototype.scope = function scope() {
return this.scopeStack.current;
};
VM.prototype.dynamicScope = function dynamicScope() {
return this.dynamicScopeStack.current;
};
VM.prototype.pushChildScope = function pushChildScope() {
this.scopeStack.push(this.scope().child());
};
VM.prototype.pushCallerScope = function pushCallerScope() {
var childScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var callerScope = this.scope().getCallerScope();
this.scopeStack.push(childScope ? callerScope.child() : callerScope);
};
VM.prototype.pushDynamicScope = function pushDynamicScope() {
var child = this.dynamicScope().child();
this.dynamicScopeStack.push(child);
return child;
};
VM.prototype.pushRootScope = function pushRootScope(size, bindCaller) {
var scope = _environment.Scope.sized(size);
if (bindCaller) scope.bindCallerScope(this.scope());
this.scopeStack.push(scope);
return scope;
};
VM.prototype.popScope = function popScope() {
this.scopeStack.pop();
};
VM.prototype.popDynamicScope = function popDynamicScope() {
this.dynamicScopeStack.pop();
};
VM.prototype.newDestroyable = function newDestroyable(d) {
this.elements().newDestroyable(d);
};
/// SCOPE HELPERS
VM.prototype.getSelf = function getSelf() {
return this.scope().getSelf();
};
VM.prototype.referenceForSymbol = function referenceForSymbol(symbol) {
return this.scope().getSymbol(symbol);
};
/// EXECUTION
VM.prototype.execute = function execute(start, initialize) {
this.pc = this.heap.getaddr(start);
if (initialize) initialize(this);
var result = void 0;
while (true) {
result = this.next();
if (result.done) break;
}
return result.value;
};
VM.prototype.next = function next() {
var env = this.env,
updatingOpcodeStack = this.updatingOpcodeStack,
elementStack = this.elementStack;
var opcode = this.nextStatement(env);
var result = void 0;
if (opcode !== null) {
_opcodes.APPEND_OPCODES.evaluate(this, opcode, opcode.type);
result = { done: false, value: null };
} else {
// Unload the stack
this.stack.reset();
result = {
done: true,
value: new _renderResult2.default(env, updatingOpcodeStack.pop(), elementStack.popBlock())
};
}
return result;
};
VM.prototype.nextStatement = function nextStatement(env) {
var pc = this.pc;
if (pc === -1) {
return null;
}
var program = env.program;
this.pc += 4;
return program.opcode(pc);
};
VM.prototype.evaluateOpcode = function evaluateOpcode(opcode) {
_opcodes.APPEND_OPCODES.evaluate(this, opcode, opcode.type);
};
VM.prototype.bindDynamicScope = function bindDynamicScope(names) {
var scope = this.dynamicScope();
for (var i = names.length - 1; i >= 0; i--) {
var name = this.constants.getString(names[i]);
scope.set(name, this.stack.pop());
}
};
_createClass(VM, [{
key: 'fp',
get: function () {
return this.stack.fp;
},
set: function (fp) {
this.stack.fp = fp;
}
}, {
key: 'sp',
get: function () {
return this.stack.sp;
},
set: function (sp) {
this.stack.sp = sp;
}
}]);
return VM;
}();
exports.default = VM;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92bS9hcHBlbmQuanMiXSwibmFtZXMiOlsiUmVnaXN0ZXIiLCJTY29wZSIsIlN0YWNrIiwiTGlua2VkTGlzdCIsIkxpc3RTbGljZSIsInR5cGVQb3MiLCJjb21iaW5lU2xpY2UiLCJMYWJlbE9wY29kZSIsIkp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlIiwiRGlkTW9kaWZ5T3Bjb2RlIiwiTGlzdEJsb2NrT3Bjb2RlIiwiVHJ5T3Bjb2RlIiwiUmVuZGVyUmVzdWx0IiwiQVBQRU5EX09QQ09ERVMiLCJFdmFsdWF0aW9uU3RhY2siLCJzdGFjayIsImZwIiwic3AiLCJPYmplY3QiLCJzZWFsIiwiZW1wdHkiLCJyZXN0b3JlIiwic25hcHNob3QiLCJzbGljZSIsImxlbmd0aCIsImlzRW1wdHkiLCJwdXNoIiwidmFsdWUiLCJkdXAiLCJwb3NpdGlvbiIsInBvcCIsIm4iLCJ0b3AiLCJwZWVrIiwiZnJvbUJhc2UiLCJvZmZzZXQiLCJmcm9tVG9wIiwiY2FwdHVyZSIsIml0ZW1zIiwiZW5kIiwic3RhcnQiLCJyZXNldCIsInRvQXJyYXkiLCJWTSIsImVudiIsInNjb3BlIiwiZHluYW1pY1Njb3BlIiwiZWxlbWVudFN0YWNrIiwiZHluYW1pY1Njb3BlU3RhY2siLCJzY29wZVN0YWNrIiwidXBkYXRpbmdPcGNvZGVTdGFjayIsImNhY2hlR3JvdXBzIiwibGlzdEJsb2NrU3RhY2siLCJwYyIsInJhIiwiczAiLCJzMSIsInQwIiwidDEiLCJoZWFwIiwicHJvZ3JhbSIsImNvbnN0YW50cyIsImZldGNoIiwicmVnaXN0ZXIiLCJsb2FkIiwiZmV0Y2hWYWx1ZSIsImxvYWRWYWx1ZSIsInB1c2hGcmFtZSIsInBvcEZyYW1lIiwiZ290byIsImNhbGwiLCJoYW5kbGUiLCJnZXRhZGRyIiwicmV0dXJuVG8iLCJyZXR1cm4iLCJpbml0aWFsIiwic2VsZiIsInJvb3QiLCJzeW1ib2xUYWJsZSIsInN5bWJvbHMiLCJ2bSIsImFyZ3MiLCJiZWdpbkNhY2hlR3JvdXAiLCJ1cGRhdGluZyIsInRhaWwiLCJjb21taXRDYWNoZUdyb3VwIiwiRU5EIiwib3Bjb2RlcyIsIm1hcmtlciIsImhlYWQiLCJuZXh0Tm9kZSIsInRhZyIsImd1YXJkIiwiaW5zZXJ0QmVmb3JlIiwiYXBwZW5kIiwiZW50ZXIiLCJzdGF0ZSIsInRyYWNrZXIiLCJlbGVtZW50cyIsInB1c2hVcGRhdGFibGVCbG9jayIsInRyeU9wY29kZSIsImdldGhhbmRsZSIsImRpZEVudGVyIiwiaXRlcmF0ZSIsIm1lbW8iLCJlbnRlckl0ZW0iLCJrZXkiLCJvcGNvZGUiLCJsaXN0QmxvY2siLCJtYXAiLCJlbnRlckxpc3QiLCJyZWxhdGl2ZVN0YXJ0IiwicHVzaEJsb2NrTGlzdCIsImFydGlmYWN0cyIsInVwZGF0ZVdpdGgiLCJjaGlsZHJlbiIsImV4aXQiLCJwb3BCbG9jayIsInBhcmVudCIsImRpZEluaXRpYWxpemVDaGlsZHJlbiIsImV4aXRMaXN0IiwiY3VycmVudCIsInB1c2hDaGlsZFNjb3BlIiwiY2hpbGQiLCJwdXNoQ2FsbGVyU2NvcGUiLCJjaGlsZFNjb3BlIiwiY2FsbGVyU2NvcGUiLCJnZXRDYWxsZXJTY29wZSIsInB1c2hEeW5hbWljU2NvcGUiLCJwdXNoUm9vdFNjb3BlIiwic2l6ZSIsImJpbmRDYWxsZXIiLCJzaXplZCIsImJpbmRDYWxsZXJTY29wZSIsInBvcFNjb3BlIiwicG9wRHluYW1pY1Njb3BlIiwibmV3RGVzdHJveWFibGUiLCJkIiwiZ2V0U2VsZiIsInJlZmVyZW5jZUZvclN5bWJvbCIsInN5bWJvbCIsImdldFN5bWJvbCIsImV4ZWN1dGUiLCJpbml0aWFsaXplIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJuZXh0U3RhdGVtZW50IiwiZXZhbHVhdGUiLCJ0eXBlIiwiZXZhbHVhdGVPcGNvZGUiLCJiaW5kRHluYW1pY1Njb3BlIiwibmFtZXMiLCJpIiwibmFtZSIsImdldFN0cmluZyIsInNldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLEFBQVMsQUFBZ0I7O0FBQ3pCLEFBQVMsQUFBYTs7QUFDdEIs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QUE2QyxBQUNoRDtBOztpQkFDRCxBLDZDQUFpQixBLE9BQU8sQUFDcEI7WUFBSSxRQUFRLEtBQVosQUFBWSxBQUFLLEFBQ2pCO2FBQUssSUFBSSxJQUFJLE1BQUEsQUFBTSxTQUFuQixBQUE0QixHQUFHLEtBQS9CLEFBQW9DLEdBQXBDLEFBQXVDLEtBQUssQUFDeEM7Z0JBQUksT0FBTyxLQUFBLEFBQUssVUFBTCxBQUFlLFVBQVUsTUFBcEMsQUFBVyxBQUF5QixBQUFNLEFBQzFDO2tCQUFBLEFBQU0sSUFBTixBQUFVLE1BQU0sS0FBQSxBQUFLLE1BQXJCLEFBQWdCLEFBQVcsQUFDOUI7QUFDSjtBOzs7O3lCQTlPUSxBQUNMO21CQUFPLEtBQUEsQUFBSyxNQUFaLEFBQWtCLEFBQ3JCO0E7dUJBQ00sQSxJQUFJLEFBQ1A7aUJBQUEsQUFBSyxNQUFMLEFBQVcsS0FBWCxBQUFnQixBQUNuQjs7Ozt5QkFDUSxBQUNMO21CQUFPLEtBQUEsQUFBSyxNQUFaLEFBQWtCLEFBQ3JCO0E7dUIsQUFDTSxJQUFJLEFBQ1A7aUJBQUEsQUFBSyxNQUFMLEFBQVcsS0FBWCxBQUFnQixBQUNuQjs7Ozs7OztrQkFuQ2dCLEEiLCJmaWxlIjoibGliL3ZtL2FwcGVuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlZ2lzdGVyIH0gZnJvbSAnLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJy4uL2Vudmlyb25tZW50JztcbmltcG9ydCB7IFN0YWNrLCBMaW5rZWRMaXN0LCBMaXN0U2xpY2UsIGV4cGVjdCwgdHlwZVBvcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgY29tYmluZVNsaWNlIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IExhYmVsT3Bjb2RlLCBKdW1wSWZOb3RNb2RpZmllZE9wY29kZSwgRGlkTW9kaWZ5T3Bjb2RlIH0gZnJvbSAnLi4vY29tcGlsZWQvb3Bjb2Rlcy92bSc7XG5pbXBvcnQgeyBMaXN0QmxvY2tPcGNvZGUsIFRyeU9wY29kZSB9IGZyb20gJy4vdXBkYXRlJztcbmltcG9ydCBSZW5kZXJSZXN1bHQgZnJvbSAnLi9yZW5kZXItcmVzdWx0JztcblxuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMgfSBmcm9tICcuLi9vcGNvZGVzJztcbmV4cG9ydCBjbGFzcyBFdmFsdWF0aW9uU3RhY2sge1xuICAgIGNvbnN0cnVjdG9yKHN0YWNrLCBmcCwgc3ApIHtcbiAgICAgICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgICAgICB0aGlzLmZwID0gZnA7XG4gICAgICAgIHRoaXMuc3AgPSBzcDtcbiAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBPYmplY3Quc2VhbCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZW1wdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcyhbXSwgMCwgLTEpO1xuICAgIH1cbiAgICBzdGF0aWMgcmVzdG9yZShzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoc25hcHNob3Quc2xpY2UoKSwgMCwgc25hcHNob3QubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwID09PSAtMTtcbiAgICB9XG4gICAgcHVzaCh2YWx1ZSkge1xuICAgICAgICB0aGlzLnN0YWNrWysrdGhpcy5zcF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgZHVwKHBvc2l0aW9uID0gdGhpcy5zcCkge1xuICAgICAgICB0aGlzLnB1c2godGhpcy5zdGFja1twb3NpdGlvbl0pO1xuICAgIH1cbiAgICBwb3AobiA9IDEpIHtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMuc3RhY2tbdGhpcy5zcF07XG4gICAgICAgIHRoaXMuc3AgLT0gbjtcbiAgICAgICAgcmV0dXJuIHRvcDtcbiAgICB9XG4gICAgcGVlaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zcF07XG4gICAgfVxuICAgIGZyb21CYXNlKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFja1t0aGlzLmZwIC0gb2Zmc2V0XTtcbiAgICB9XG4gICAgZnJvbVRvcChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zcCAtIG9mZnNldF07XG4gICAgfVxuICAgIGNhcHR1cmUoaXRlbXMpIHtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuc3AgKyAxO1xuICAgICAgICBsZXQgc3RhcnQgPSBlbmQgLSBpdGVtcztcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2suc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrLnNsaWNlKHRoaXMuZnAsIHRoaXMuc3AgKyAxKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWTSB7XG4gICAgY29uc3RydWN0b3IoZW52LCBzY29wZSwgZHluYW1pY1Njb3BlLCBlbGVtZW50U3RhY2spIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuZWxlbWVudFN0YWNrID0gZWxlbWVudFN0YWNrO1xuICAgICAgICB0aGlzLmR5bmFtaWNTY29wZVN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMuc2NvcGVTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLnVwZGF0aW5nT3Bjb2RlU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICAgICAgdGhpcy5jYWNoZUdyb3VwcyA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLmxpc3RCbG9ja1N0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBFdmFsdWF0aW9uU3RhY2suZW1wdHkoKTtcbiAgICAgICAgLyogUmVnaXN0ZXJzICovXG4gICAgICAgIHRoaXMucGMgPSAtMTtcbiAgICAgICAgdGhpcy5yYSA9IC0xO1xuICAgICAgICB0aGlzLnMwID0gbnVsbDtcbiAgICAgICAgdGhpcy5zMSA9IG51bGw7XG4gICAgICAgIHRoaXMudDAgPSBudWxsO1xuICAgICAgICB0aGlzLnQxID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuaGVhcCA9IGVudi5wcm9ncmFtLmhlYXA7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzID0gZW52LnByb2dyYW0uY29uc3RhbnRzO1xuICAgICAgICB0aGlzLmVsZW1lbnRTdGFjayA9IGVsZW1lbnRTdGFjaztcbiAgICAgICAgdGhpcy5zY29wZVN0YWNrLnB1c2goc2NvcGUpO1xuICAgICAgICB0aGlzLmR5bmFtaWNTY29wZVN0YWNrLnB1c2goZHluYW1pY1Njb3BlKTtcbiAgICB9XG4gICAgZ2V0IGZwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFjay5mcDtcbiAgICB9XG4gICAgc2V0IGZwKGZwKSB7XG4gICAgICAgIHRoaXMuc3RhY2suZnAgPSBmcDtcbiAgICB9XG4gICAgZ2V0IHNwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFjay5zcDtcbiAgICB9XG4gICAgc2V0IHNwKHNwKSB7XG4gICAgICAgIHRoaXMuc3RhY2suc3AgPSBzcDtcbiAgICB9XG4gICAgLy8gRmV0Y2ggYSB2YWx1ZSBmcm9tIGEgcmVnaXN0ZXIgb250byB0aGUgc3RhY2tcbiAgICBmZXRjaChyZWdpc3Rlcikge1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpc1tSZWdpc3RlcltyZWdpc3Rlcl1dKTtcbiAgICB9XG4gICAgLy8gTG9hZCBhIHZhbHVlIGZyb20gdGhlIHN0YWNrIGludG8gYSByZWdpc3RlclxuICAgIGxvYWQocmVnaXN0ZXIpIHtcbiAgICAgICAgdGhpc1tSZWdpc3RlcltyZWdpc3Rlcl1dID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICB9XG4gICAgLy8gRmV0Y2ggYSB2YWx1ZSBmcm9tIGEgcmVnaXN0ZXJcbiAgICBmZXRjaFZhbHVlKHJlZ2lzdGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzW1JlZ2lzdGVyW3JlZ2lzdGVyXV07XG4gICAgfVxuICAgIC8vIExvYWQgYSB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXJcbiAgICBsb2FkVmFsdWUocmVnaXN0ZXIsIHZhbHVlKSB7XG4gICAgICAgIHRoaXNbUmVnaXN0ZXJbcmVnaXN0ZXJdXSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBTdGFydCBhIG5ldyBmcmFtZSBhbmQgc2F2ZSAkcmEgYW5kICRmcCBvbiB0aGUgc3RhY2tcbiAgICBwdXNoRnJhbWUoKSB7XG4gICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLnJhKTtcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuZnApO1xuICAgICAgICB0aGlzLmZwID0gdGhpcy5zcCAtIDE7XG4gICAgfVxuICAgIC8vIFJlc3RvcmUgJHJhLCAkc3AgYW5kICRmcFxuICAgIHBvcEZyYW1lKCkge1xuICAgICAgICB0aGlzLnNwID0gdGhpcy5mcCAtIDE7XG4gICAgICAgIHRoaXMucmEgPSB0aGlzLnN0YWNrLmZyb21CYXNlKDApO1xuICAgICAgICB0aGlzLmZwID0gdGhpcy5zdGFjay5mcm9tQmFzZSgtMSk7XG4gICAgfVxuICAgIC8vIEp1bXAgdG8gYW4gYWRkcmVzcyBpbiBgcHJvZ3JhbWBcbiAgICBnb3RvKG9mZnNldCkge1xuICAgICAgICB0aGlzLnBjID0gdHlwZVBvcyh0aGlzLnBjICsgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gU2F2ZSAkcGMgaW50byAkcmEsIHRoZW4ganVtcCB0byBhIG5ldyBhZGRyZXNzIGluIGBwcm9ncmFtYCAoamFsIGluIE1JUFMpXG4gICAgY2FsbChoYW5kbGUpIHtcbiAgICAgICAgbGV0IHBjID0gdGhpcy5oZWFwLmdldGFkZHIoaGFuZGxlKTtcbiAgICAgICAgdGhpcy5yYSA9IHRoaXMucGM7XG4gICAgICAgIHRoaXMucGMgPSBwYztcbiAgICB9XG4gICAgLy8gUHV0IGEgc3BlY2lmaWMgYHByb2dyYW1gIGFkZHJlc3MgaW4gJHJhXG4gICAgcmV0dXJuVG8ob2Zmc2V0KSB7XG4gICAgICAgIHRoaXMucmEgPSB0eXBlUG9zKHRoaXMucGMgKyBvZmZzZXQpO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdG8gdGhlIGBwcm9ncmFtYCBhZGRyZXNzIHN0b3JlZCBpbiAkcmFcbiAgICByZXR1cm4oKSB7XG4gICAgICAgIHRoaXMucGMgPSB0aGlzLnJhO1xuICAgIH1cbiAgICBzdGF0aWMgaW5pdGlhbChlbnYsIHNlbGYsIGR5bmFtaWNTY29wZSwgZWxlbWVudFN0YWNrLCBwcm9ncmFtKSB7XG4gICAgICAgIGxldCBzY29wZSA9IFNjb3BlLnJvb3Qoc2VsZiwgcHJvZ3JhbS5zeW1ib2xUYWJsZS5zeW1ib2xzLmxlbmd0aCk7XG4gICAgICAgIGxldCB2bSA9IG5ldyBWTShlbnYsIHNjb3BlLCBkeW5hbWljU2NvcGUsIGVsZW1lbnRTdGFjayk7XG4gICAgICAgIHZtLnBjID0gdm0uaGVhcC5nZXRhZGRyKHByb2dyYW0uaGFuZGxlKTtcbiAgICAgICAgdm0udXBkYXRpbmdPcGNvZGVTdGFjay5wdXNoKG5ldyBMaW5rZWRMaXN0KCkpO1xuICAgICAgICByZXR1cm4gdm07XG4gICAgfVxuICAgIGNhcHR1cmUoYXJncykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHluYW1pY1Njb3BlOiB0aGlzLmR5bmFtaWNTY29wZSgpLFxuICAgICAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgICAgIHNjb3BlOiB0aGlzLnNjb3BlKCksXG4gICAgICAgICAgICBzdGFjazogdGhpcy5zdGFjay5jYXB0dXJlKGFyZ3MpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGJlZ2luQ2FjaGVHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jYWNoZUdyb3Vwcy5wdXNoKHRoaXMudXBkYXRpbmcoKS50YWlsKCkpO1xuICAgIH1cbiAgICBjb21taXRDYWNoZUdyb3VwKCkge1xuICAgICAgICAvLyAgICAgICAgSnVtcElmTm90TW9kaWZpZWQoRU5EKVxuICAgICAgICAvLyAgICAgICAgKGhlYWQpXG4gICAgICAgIC8vICAgICAgICAoLi4uLilcbiAgICAgICAgLy8gICAgICAgICh0YWlsKVxuICAgICAgICAvLyAgICAgICAgRGlkTW9kaWZ5XG4gICAgICAgIC8vIEVORDogICBOb29wXG4gICAgICAgIGxldCBFTkQgPSBuZXcgTGFiZWxPcGNvZGUoXCJFTkRcIik7XG4gICAgICAgIGxldCBvcGNvZGVzID0gdGhpcy51cGRhdGluZygpO1xuICAgICAgICBsZXQgbWFya2VyID0gdGhpcy5jYWNoZUdyb3Vwcy5wb3AoKTtcbiAgICAgICAgbGV0IGhlYWQgPSBtYXJrZXIgPyBvcGNvZGVzLm5leHROb2RlKG1hcmtlcikgOiBvcGNvZGVzLmhlYWQoKTtcbiAgICAgICAgbGV0IHRhaWwgPSBvcGNvZGVzLnRhaWwoKTtcbiAgICAgICAgbGV0IHRhZyA9IGNvbWJpbmVTbGljZShuZXcgTGlzdFNsaWNlKGhlYWQsIHRhaWwpKTtcbiAgICAgICAgbGV0IGd1YXJkID0gbmV3IEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlKHRhZywgRU5EKTtcbiAgICAgICAgb3Bjb2Rlcy5pbnNlcnRCZWZvcmUoZ3VhcmQsIGhlYWQpO1xuICAgICAgICBvcGNvZGVzLmFwcGVuZChuZXcgRGlkTW9kaWZ5T3Bjb2RlKGd1YXJkKSk7XG4gICAgICAgIG9wY29kZXMuYXBwZW5kKEVORCk7XG4gICAgfVxuICAgIGVudGVyKGFyZ3MpIHtcbiAgICAgICAgbGV0IHVwZGF0aW5nID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5jYXB0dXJlKGFyZ3MpO1xuICAgICAgICBsZXQgdHJhY2tlciA9IHRoaXMuZWxlbWVudHMoKS5wdXNoVXBkYXRhYmxlQmxvY2soKTtcbiAgICAgICAgbGV0IHRyeU9wY29kZSA9IG5ldyBUcnlPcGNvZGUodGhpcy5oZWFwLmdldGhhbmRsZSh0aGlzLnBjKSwgc3RhdGUsIHRyYWNrZXIsIHVwZGF0aW5nKTtcbiAgICAgICAgdGhpcy5kaWRFbnRlcih0cnlPcGNvZGUpO1xuICAgIH1cbiAgICBpdGVyYXRlKG1lbW8sIHZhbHVlKSB7XG4gICAgICAgIGxldCBzdGFjayA9IHRoaXMuc3RhY2s7XG4gICAgICAgIHN0YWNrLnB1c2godmFsdWUpO1xuICAgICAgICBzdGFjay5wdXNoKG1lbW8pO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmNhcHR1cmUoMik7XG4gICAgICAgIGxldCB0cmFja2VyID0gdGhpcy5lbGVtZW50cygpLnB1c2hVcGRhdGFibGVCbG9jaygpO1xuICAgICAgICAvLyBsZXQgaXAgPSB0aGlzLmlwO1xuICAgICAgICAvLyB0aGlzLmlwID0gZW5kICsgNDtcbiAgICAgICAgLy8gdGhpcy5mcmFtZXMucHVzaChpcCk7XG4gICAgICAgIHJldHVybiBuZXcgVHJ5T3Bjb2RlKHRoaXMuaGVhcC5nZXRoYW5kbGUodGhpcy5wYyksIHN0YXRlLCB0cmFja2VyLCBuZXcgTGlua2VkTGlzdCgpKTtcbiAgICB9XG4gICAgZW50ZXJJdGVtKGtleSwgb3Bjb2RlKSB7XG4gICAgICAgIHRoaXMubGlzdEJsb2NrKCkubWFwW2tleV0gPSBvcGNvZGU7XG4gICAgICAgIHRoaXMuZGlkRW50ZXIob3Bjb2RlKTtcbiAgICB9XG4gICAgZW50ZXJMaXN0KHJlbGF0aXZlU3RhcnQpIHtcbiAgICAgICAgbGV0IHVwZGF0aW5nID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5jYXB0dXJlKDApO1xuICAgICAgICBsZXQgdHJhY2tlciA9IHRoaXMuZWxlbWVudHMoKS5wdXNoQmxvY2tMaXN0KHVwZGF0aW5nKTtcbiAgICAgICAgbGV0IGFydGlmYWN0cyA9IHRoaXMuc3RhY2sucGVlaygpLmFydGlmYWN0cztcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5oZWFwLmdldGhhbmRsZSh0eXBlUG9zKHRoaXMucGMgKyByZWxhdGl2ZVN0YXJ0KSk7XG4gICAgICAgIGxldCBvcGNvZGUgPSBuZXcgTGlzdEJsb2NrT3Bjb2RlKHN0YXJ0LCBzdGF0ZSwgdHJhY2tlciwgdXBkYXRpbmcsIGFydGlmYWN0cyk7XG4gICAgICAgIHRoaXMubGlzdEJsb2NrU3RhY2sucHVzaChvcGNvZGUpO1xuICAgICAgICB0aGlzLmRpZEVudGVyKG9wY29kZSk7XG4gICAgfVxuICAgIGRpZEVudGVyKG9wY29kZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVdpdGgob3Bjb2RlKTtcbiAgICAgICAgdGhpcy51cGRhdGluZ09wY29kZVN0YWNrLnB1c2gob3Bjb2RlLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgZXhpdCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50cygpLnBvcEJsb2NrKCk7XG4gICAgICAgIHRoaXMudXBkYXRpbmdPcGNvZGVTdGFjay5wb3AoKTtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMudXBkYXRpbmcoKS50YWlsKCk7XG4gICAgICAgIHBhcmVudC5kaWRJbml0aWFsaXplQ2hpbGRyZW4oKTtcbiAgICB9XG4gICAgZXhpdExpc3QoKSB7XG4gICAgICAgIHRoaXMuZXhpdCgpO1xuICAgICAgICB0aGlzLmxpc3RCbG9ja1N0YWNrLnBvcCgpO1xuICAgIH1cbiAgICB1cGRhdGVXaXRoKG9wY29kZSkge1xuICAgICAgICB0aGlzLnVwZGF0aW5nKCkuYXBwZW5kKG9wY29kZSk7XG4gICAgfVxuICAgIGxpc3RCbG9jaygpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdCh0aGlzLmxpc3RCbG9ja1N0YWNrLmN1cnJlbnQsICdleHBlY3RlZCBhIGxpc3QgYmxvY2snKTtcbiAgICB9XG4gICAgdXBkYXRpbmcoKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy51cGRhdGluZ09wY29kZVN0YWNrLmN1cnJlbnQsICdleHBlY3RlZCB1cGRhdGluZyBvcGNvZGUgb24gdGhlIHVwZGF0aW5nIG9wY29kZSBzdGFjaycpO1xuICAgIH1cbiAgICBlbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFN0YWNrO1xuICAgIH1cbiAgICBzY29wZSgpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdCh0aGlzLnNjb3BlU3RhY2suY3VycmVudCwgJ2V4cGVjdGVkIHNjb3BlIG9uIHRoZSBzY29wZSBzdGFjaycpO1xuICAgIH1cbiAgICBkeW5hbWljU2NvcGUoKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5keW5hbWljU2NvcGVTdGFjay5jdXJyZW50LCAnZXhwZWN0ZWQgZHluYW1pYyBzY29wZSBvbiB0aGUgZHluYW1pYyBzY29wZSBzdGFjaycpO1xuICAgIH1cbiAgICBwdXNoQ2hpbGRTY29wZSgpIHtcbiAgICAgICAgdGhpcy5zY29wZVN0YWNrLnB1c2godGhpcy5zY29wZSgpLmNoaWxkKCkpO1xuICAgIH1cbiAgICBwdXNoQ2FsbGVyU2NvcGUoY2hpbGRTY29wZSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBjYWxsZXJTY29wZSA9IGV4cGVjdCh0aGlzLnNjb3BlKCkuZ2V0Q2FsbGVyU2NvcGUoKSwgJ3B1c2hDYWxsZXJTY29wZSBpcyBjYWxsZWQgd2hlbiBhIGNhbGxlciBzY29wZSBpcyBwcmVzZW50Jyk7XG4gICAgICAgIHRoaXMuc2NvcGVTdGFjay5wdXNoKGNoaWxkU2NvcGUgPyBjYWxsZXJTY29wZS5jaGlsZCgpIDogY2FsbGVyU2NvcGUpO1xuICAgIH1cbiAgICBwdXNoRHluYW1pY1Njb3BlKCkge1xuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmR5bmFtaWNTY29wZSgpLmNoaWxkKCk7XG4gICAgICAgIHRoaXMuZHluYW1pY1Njb3BlU3RhY2sucHVzaChjaGlsZCk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG4gICAgcHVzaFJvb3RTY29wZShzaXplLCBiaW5kQ2FsbGVyKSB7XG4gICAgICAgIGxldCBzY29wZSA9IFNjb3BlLnNpemVkKHNpemUpO1xuICAgICAgICBpZiAoYmluZENhbGxlcikgc2NvcGUuYmluZENhbGxlclNjb3BlKHRoaXMuc2NvcGUoKSk7XG4gICAgICAgIHRoaXMuc2NvcGVTdGFjay5wdXNoKHNjb3BlKTtcbiAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH1cbiAgICBwb3BTY29wZSgpIHtcbiAgICAgICAgdGhpcy5zY29wZVN0YWNrLnBvcCgpO1xuICAgIH1cbiAgICBwb3BEeW5hbWljU2NvcGUoKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1Njb3BlU3RhY2sucG9wKCk7XG4gICAgfVxuICAgIG5ld0Rlc3Ryb3lhYmxlKGQpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50cygpLm5ld0Rlc3Ryb3lhYmxlKGQpO1xuICAgIH1cbiAgICAvLy8gU0NPUEUgSEVMUEVSU1xuICAgIGdldFNlbGYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlKCkuZ2V0U2VsZigpO1xuICAgIH1cbiAgICByZWZlcmVuY2VGb3JTeW1ib2woc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlKCkuZ2V0U3ltYm9sKHN5bWJvbCk7XG4gICAgfVxuICAgIC8vLyBFWEVDVVRJT05cbiAgICBleGVjdXRlKHN0YXJ0LCBpbml0aWFsaXplKSB7XG4gICAgICAgIHRoaXMucGMgPSB0aGlzLmhlYXAuZ2V0YWRkcihzdGFydCk7XG4gICAgICAgIGlmIChpbml0aWFsaXplKSBpbml0aWFsaXplKHRoaXMpO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGxldCB7IGVudiwgdXBkYXRpbmdPcGNvZGVTdGFjaywgZWxlbWVudFN0YWNrIH0gPSB0aGlzO1xuICAgICAgICBsZXQgb3Bjb2RlID0gdGhpcy5uZXh0U3RhdGVtZW50KGVudik7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGlmIChvcGNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIEFQUEVORF9PUENPREVTLmV2YWx1YXRlKHRoaXMsIG9wY29kZSwgb3Bjb2RlLnR5cGUpO1xuICAgICAgICAgICAgcmVzdWx0ID0geyBkb25lOiBmYWxzZSwgdmFsdWU6IG51bGwgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVubG9hZCB0aGUgc3RhY2tcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucmVzZXQoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgUmVuZGVyUmVzdWx0KGVudiwgZXhwZWN0KHVwZGF0aW5nT3Bjb2RlU3RhY2sucG9wKCksICd0aGVyZSBzaG91bGQgYmUgYSBmaW5hbCB1cGRhdGluZyBvcGNvZGUgc3RhY2snKSwgZWxlbWVudFN0YWNrLnBvcEJsb2NrKCkpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIG5leHRTdGF0ZW1lbnQoZW52KSB7XG4gICAgICAgIGxldCB7IHBjIH0gPSB0aGlzO1xuICAgICAgICBpZiAocGMgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJvZ3JhbSA9IGVudi5wcm9ncmFtO1xuICAgICAgICB0aGlzLnBjICs9IDQ7XG4gICAgICAgIHJldHVybiBwcm9ncmFtLm9wY29kZShwYyk7XG4gICAgfVxuICAgIGV2YWx1YXRlT3Bjb2RlKG9wY29kZSkge1xuICAgICAgICBBUFBFTkRfT1BDT0RFUy5ldmFsdWF0ZSh0aGlzLCBvcGNvZGUsIG9wY29kZS50eXBlKTtcbiAgICB9XG4gICAgYmluZER5bmFtaWNTY29wZShuYW1lcykge1xuICAgICAgICBsZXQgc2NvcGUgPSB0aGlzLmR5bmFtaWNTY29wZSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gbmFtZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5jb25zdGFudHMuZ2V0U3RyaW5nKG5hbWVzW2ldKTtcbiAgICAgICAgICAgIHNjb3BlLnNldChuYW1lLCB0aGlzLnN0YWNrLnBvcCgpKTtcbiAgICAgICAgfVxuICAgIH1cbn0iXX0=