@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
578 lines (447 loc) • 53.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _env = require("@glimmer/env");
var _globalContext = require("@glimmer/global-context");
var _reference = require("@glimmer/reference");
var _util = require("@glimmer/util");
var _validator = require("@glimmer/validator");
var _vm = require("@glimmer/vm");
var _destroyable = require("@glimmer/destroyable");
var _vm2 = require("../compiled/opcodes/vm");
var _opcodes = require("../opcodes");
var _scope = require("../scope");
var _symbols = require("../symbols");
var _arguments = require("./arguments");
var _lowLevel = _interopRequireDefault(require("./low-level"));
var _renderResult = _interopRequireDefault(require("./render-result"));
var _stack = _interopRequireDefault(require("./stack"));
var _update = require("./update");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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;
}
var _a, _b;
var Stacks = function Stacks() {
this.scope = new _util.Stack();
this.dynamicScope = new _util.Stack();
this.updating = new _util.Stack();
this.cache = new _util.Stack();
this.list = new _util.Stack();
};
var VM = /*#__PURE__*/function () {
/**
* End of migrated.
*/
function VM(runtime, _ref, elementStack, context) {
var _this = this;
var pc = _ref.pc,
scope = _ref.scope,
dynamicScope = _ref.dynamicScope,
stack = _ref.stack;
this.runtime = runtime;
this.elementStack = elementStack;
this.context = context;
this[_a] = new Stacks();
this[_b] = new _util.Stack();
this.s0 = null;
this.s1 = null;
this.t0 = null;
this.t1 = null;
this.v0 = null;
this.resume = initVM(this.context);
if (_env.DEBUG) {
(0, _globalContext.assertGlobalContextWasSet)();
}
var evalStack = _stack.default.restore(stack);
false && (0, _util.assert)(typeof pc === 'number', 'pc is a number');
evalStack[_symbols.REGISTERS][_vm.$pc] = pc;
evalStack[_symbols.REGISTERS][_vm.$sp] = stack.length - 1;
evalStack[_symbols.REGISTERS][_vm.$fp] = -1;
this[_symbols.HEAP] = this.program.heap;
this[_symbols.CONSTANTS] = this.program.constants;
this.elementStack = elementStack;
this[_symbols.STACKS].scope.push(scope);
this[_symbols.STACKS].dynamicScope.push(dynamicScope);
this[_symbols.ARGS] = new _arguments.VMArgumentsImpl();
this[_symbols.INNER_VM] = new _lowLevel.default(evalStack, this[_symbols.HEAP], runtime.program, {
debugBefore: function debugBefore(opcode) {
return _opcodes.APPEND_OPCODES.debugBefore(_this, opcode);
},
debugAfter: function debugAfter(state) {
_opcodes.APPEND_OPCODES.debugAfter(_this, state);
}
}, evalStack[_symbols.REGISTERS]);
this.destructor = {};
this[_symbols.DESTROYABLE_STACK].push(this.destructor);
}
var _proto = VM.prototype; // Fetch a value from a register onto the stack
_proto.fetch = function fetch(register) {
var value = this.fetchValue(register);
this.stack.push(value);
} // Load a value from the stack into a register
;
_proto.load = function load(register) {
var value = this.stack.pop();
this.loadValue(register, value);
};
_proto.fetchValue = function fetchValue(register) {
if ((0, _vm.isLowLevelRegister)(register)) {
return this[_symbols.INNER_VM].fetchRegister(register);
}
switch (register) {
case _vm.$s0:
return this.s0;
case _vm.$s1:
return this.s1;
case _vm.$t0:
return this.t0;
case _vm.$t1:
return this.t1;
case _vm.$v0:
return this.v0;
}
} // Load a value into a register
;
_proto.loadValue = function loadValue(register, value) {
if ((0, _vm.isLowLevelRegister)(register)) {
this[_symbols.INNER_VM].loadRegister(register, value);
}
switch (register) {
case _vm.$s0:
this.s0 = value;
break;
case _vm.$s1:
this.s1 = value;
break;
case _vm.$t0:
this.t0 = value;
break;
case _vm.$t1:
this.t1 = value;
break;
case _vm.$v0:
this.v0 = value;
break;
}
}
/**
* Migrated to Inner
*/
// Start a new frame and save $ra and $fp on the stack
;
_proto.pushFrame = function pushFrame() {
this[_symbols.INNER_VM].pushFrame();
} // Restore $ra, $sp and $fp
;
_proto.popFrame = function popFrame() {
this[_symbols.INNER_VM].popFrame();
} // Jump to an address in `program`
;
_proto["goto"] = function goto(offset) {
this[_symbols.INNER_VM]["goto"](offset);
} // Save $pc into $ra, then jump to a new address in `program` (jal in MIPS)
;
_proto.call = function call(handle) {
this[_symbols.INNER_VM].call(handle);
} // Put a specific `program` address in $ra
;
_proto.returnTo = function returnTo(offset) {
this[_symbols.INNER_VM].returnTo(offset);
} // Return to the `program` address stored in $ra
;
_proto["return"] = function _return() {
this[_symbols.INNER_VM]["return"]();
};
VM.initial = function initial(runtime, context, _ref2) {
var handle = _ref2.handle,
self = _ref2.self,
dynamicScope = _ref2.dynamicScope,
treeBuilder = _ref2.treeBuilder,
numSymbols = _ref2.numSymbols,
owner = _ref2.owner;
var scope = _scope.PartialScopeImpl.root(self, numSymbols, owner);
var state = vmState(runtime.program.heap.getaddr(handle), scope, dynamicScope);
var vm = initVM(context)(runtime, state, treeBuilder);
vm.pushUpdating();
return vm;
};
VM.empty = function empty(runtime, _ref3, context) {
var handle = _ref3.handle,
treeBuilder = _ref3.treeBuilder,
dynamicScope = _ref3.dynamicScope,
owner = _ref3.owner;
var vm = initVM(context)(runtime, vmState(runtime.program.heap.getaddr(handle), _scope.PartialScopeImpl.root(_reference.UNDEFINED_REFERENCE, 0, owner), dynamicScope), treeBuilder);
vm.pushUpdating();
return vm;
};
_proto.compile = function compile(block) {
var handle = (0, _util.unwrapHandle)(block.compile(this.context));
return handle;
};
_proto.captureState = function captureState(args, pc) {
if (pc === void 0) {
pc = this[_symbols.INNER_VM].fetchRegister(_vm.$pc);
}
return {
pc: pc,
scope: this.scope(),
dynamicScope: this.dynamicScope(),
stack: this.stack.capture(args)
};
};
_proto.capture = function capture(args, pc) {
if (pc === void 0) {
pc = this[_symbols.INNER_VM].fetchRegister(_vm.$pc);
}
return new _update.ResumableVMStateImpl(this.captureState(args, pc), this.resume);
};
_proto.beginCacheGroup = function beginCacheGroup(name) {
var opcodes = this.updating();
var guard = new _vm2.JumpIfNotModifiedOpcode();
opcodes.push(guard);
opcodes.push(new _vm2.BeginTrackFrameOpcode(name));
this[_symbols.STACKS].cache.push(guard);
(0, _validator.beginTrackFrame)(name);
};
_proto.commitCacheGroup = function commitCacheGroup() {
var opcodes = this.updating();
var guard = this[_symbols.STACKS].cache.pop();
var tag = (0, _validator.endTrackFrame)();
opcodes.push(new _vm2.EndTrackFrameOpcode(guard));
guard.finalize(tag, opcodes.length);
};
_proto.enter = function enter(args) {
var updating = [];
var state = this.capture(args);
var block = this.elements().pushUpdatableBlock();
var tryOpcode = new _update.TryOpcode(state, this.runtime, block, updating);
this.didEnter(tryOpcode);
};
_proto.enterItem = function enterItem(_ref4) {
var key = _ref4.key,
value = _ref4.value,
memo = _ref4.memo;
var stack = this.stack;
var valueRef = (0, _reference.createIteratorItemRef)(value);
var memoRef = (0, _reference.createIteratorItemRef)(memo);
stack.push(valueRef);
stack.push(memoRef);
var state = this.capture(2);
var block = this.elements().pushUpdatableBlock();
var opcode = new _update.ListItemOpcode(state, this.runtime, block, key, memoRef, valueRef);
this.didEnter(opcode);
return opcode;
};
_proto.registerItem = function registerItem(opcode) {
this.listBlock().initializeChild(opcode);
};
_proto.enterList = function enterList(iterableRef, offset) {
var updating = [];
var addr = this[_symbols.INNER_VM].target(offset);
var state = this.capture(0, addr);
var list = this.elements().pushBlockList(updating);
var opcode = new _update.ListBlockOpcode(state, this.runtime, list, updating, iterableRef);
this[_symbols.STACKS].list.push(opcode);
this.didEnter(opcode);
};
_proto.didEnter = function didEnter(opcode) {
this.associateDestroyable(opcode);
this[_symbols.DESTROYABLE_STACK].push(opcode);
this.updateWith(opcode);
this.pushUpdating(opcode.children);
};
_proto.exit = function exit() {
this[_symbols.DESTROYABLE_STACK].pop();
this.elements().popBlock();
this.popUpdating();
};
_proto.exitList = function exitList() {
this.exit();
this[_symbols.STACKS].list.pop();
};
_proto.pushUpdating = function pushUpdating(list) {
if (list === void 0) {
list = [];
}
this[_symbols.STACKS].updating.push(list);
};
_proto.popUpdating = function popUpdating() {
return this[_symbols.STACKS].updating.pop();
};
_proto.updateWith = function updateWith(opcode) {
this.updating().push(opcode);
};
_proto.listBlock = function listBlock() {
return this[_symbols.STACKS].list.current;
};
_proto.associateDestroyable = function associateDestroyable(child) {
var parent = this[_symbols.DESTROYABLE_STACK].current;
(0, _destroyable.associateDestroyableChild)(parent, child);
};
_proto.tryUpdating = function tryUpdating() {
return this[_symbols.STACKS].updating.current;
};
_proto.updating = function updating() {
return this[_symbols.STACKS].updating.current;
};
_proto.elements = function elements() {
return this.elementStack;
};
_proto.scope = function scope() {
return this[_symbols.STACKS].scope.current;
};
_proto.dynamicScope = function dynamicScope() {
return this[_symbols.STACKS].dynamicScope.current;
};
_proto.pushChildScope = function pushChildScope() {
this[_symbols.STACKS].scope.push(this.scope().child());
};
_proto.pushDynamicScope = function pushDynamicScope() {
var child = this.dynamicScope().child();
this[_symbols.STACKS].dynamicScope.push(child);
return child;
};
_proto.pushRootScope = function pushRootScope(size, owner) {
var scope = _scope.PartialScopeImpl.sized(size, owner);
this[_symbols.STACKS].scope.push(scope);
return scope;
};
_proto.pushScope = function pushScope(scope) {
this[_symbols.STACKS].scope.push(scope);
};
_proto.popScope = function popScope() {
this[_symbols.STACKS].scope.pop();
};
_proto.popDynamicScope = function popDynamicScope() {
this[_symbols.STACKS].dynamicScope.pop();
} /// SCOPE HELPERS
;
_proto.getOwner = function getOwner() {
return this.scope().owner;
};
_proto.getSelf = function getSelf() {
return this.scope().getSelf();
};
_proto.referenceForSymbol = function referenceForSymbol(symbol) {
return this.scope().getSymbol(symbol);
} /// EXECUTION
;
_proto.execute = function execute(initialize) {
if (_env.DEBUG) {
var hasErrored = true;
try {
var value = this._execute(initialize); // using a boolean here to avoid breaking ergonomics of "pause on uncaught exceptions"
// which would happen with a `catch` + `throw`
hasErrored = false;
return value;
} finally {
if (hasErrored) {
// If any existing blocks are open, due to an error or something like
// that, we need to close them all and clean things up properly.
var elements = this.elements();
while (elements.hasBlocks) {
elements.popBlock();
} // eslint-disable-next-line no-console
console.error("\n\nError occurred:\n\n" + (0, _validator.resetTracking)() + "\n\n");
}
}
} else {
return this._execute(initialize);
}
};
_proto._execute = function _execute(initialize) {
if (false
/* LOCAL_SHOULD_LOG */
) {
_util.LOCAL_LOGGER.log("EXECUTING FROM " + this[_symbols.INNER_VM].fetchRegister(_vm.$pc));
}
if (initialize) initialize(this);
var result;
while (true) {
result = this.next();
if (result.done) break;
}
return result.value;
};
_proto.next = function next() {
var env = this.env,
elementStack = this.elementStack;
var opcode = this[_symbols.INNER_VM].nextStatement();
var result;
if (opcode !== null) {
this[_symbols.INNER_VM].evaluateOuter(opcode, this);
result = {
done: false,
value: null
};
} else {
// Unload the stack
this.stack.reset();
result = {
done: true,
value: new _renderResult.default(env, this.popUpdating(), elementStack.popBlock(), this.destructor)
};
}
return result;
};
_proto.bindDynamicScope = function bindDynamicScope(names) {
var scope = this.dynamicScope();
for (var i = names.length - 1; i >= 0; i--) {
var name = names[i];
scope.set(name, this.stack.pop());
}
};
_createClass(VM, [{
key: "stack",
get: function get() {
return this[_symbols.INNER_VM].stack;
}
/* Registers */
}, {
key: "pc",
get: function get() {
return this[_symbols.INNER_VM].fetchRegister(_vm.$pc);
}
}, {
key: "program",
get: function get() {
return this.runtime.program;
}
}, {
key: "env",
get: function get() {
return this.runtime.env;
}
}]);
return VM;
}();
exports.default = VM;
_a = _symbols.STACKS, _b = _symbols.DESTROYABLE_STACK;
function vmState(pc, scope, dynamicScope) {
return {
pc: pc,
scope: scope,
dynamicScope: dynamicScope,
stack: []
};
}
function initVM(context) {
return function (runtime, state, builder) {
return new VM(runtime, state, builder, context);
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2FwcGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBd0JBOztBQU9BOztBQUNBOztBQUNBOztBQWNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBaUZBLE0sR0FBQSxTQUFBLE1BQUEsR0FBQTtBQUNXLE9BQUEsS0FBQSxHQUFRLElBQVIsV0FBUSxFQUFSO0FBQ0EsT0FBQSxZQUFBLEdBQWUsSUFBZixXQUFlLEVBQWY7QUFDQSxPQUFBLFFBQUEsR0FBVyxJQUFYLFdBQVcsRUFBWDtBQUNBLE9BQUEsS0FBQSxHQUFRLElBQVIsV0FBUSxFQUFSO0FBQ0EsT0FBQSxJQUFBLEdBQU8sSUFBUCxXQUFPLEVBQVA7OztJQUdHLEU7QUF5SFo7OztBQUlBLFdBQUEsRUFBQSxDQUFBLE9BQUEsRUFBQSxJQUFBLEVBQUEsWUFBQSxFQUFBLE9BQUEsRUFJaUQ7QUFBQSxRQUFBLEtBQUEsR0FBQSxJQUFBOztBQUFBLFFBRi9DLEVBRStDLEdBQUEsSUFBQSxDQUYvQyxFQUUrQztBQUFBLFFBRi9DLEtBRStDLEdBQUEsSUFBQSxDQUYvQyxLQUUrQztBQUFBLFFBRi9DLFlBRStDLEdBQUEsSUFBQSxDQUYvQyxZQUUrQztBQUFBLFFBRnBCLEtBRW9CLEdBQUEsSUFBQSxDQUZwQixLQUVvQjtBQUh0QyxTQUFBLE9BQUEsR0FBQSxPQUFBO0FBRVEsU0FBQSxZQUFBLEdBQUEsWUFBQTtBQUNSLFNBQUEsT0FBQSxHQUFBLE9BQUE7QUFoSU0sU0FBQSxFQUFBLElBQVcsSUFBWCxNQUFXLEVBQVg7QUFHQSxTQUFBLEVBQUEsSUFBc0IsSUFBdEIsV0FBc0IsRUFBdEI7QUFlVixTQUFBLEVBQUEsR0FBQSxJQUFBO0FBQ0EsU0FBQSxFQUFBLEdBQUEsSUFBQTtBQUNB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cEIsU0FBQSxPQUFBLENBQUEsRUFBQSxFQUFBLEtBQUEsRUFBQSxZQUFBLEVBQXFFO0FBQ25FLFNBQU87QUFDTCxJQUFBLEVBREssRUFBQSxFQUFBO0FBRUwsSUFBQSxLQUZLLEVBQUEsS0FBQTtBQUdMLElBQUEsWUFISyxFQUFBLFlBQUE7QUFJTCxJQUFBLEtBQUssRUFBRTtBQUpGLEdBQVA7QUFNRDs7QUFxQkQsU0FBQSxNQUFBLENBQUEsT0FBQSxFQUFzRDtBQUNwRCxTQUFPLFVBQUEsT0FBQSxFQUFBLEtBQUEsRUFBQSxPQUFBLEVBQUE7QUFBQSxXQUE2QixJQUFBLEVBQUEsQ0FBQSxPQUFBLEVBQUEsS0FBQSxFQUFBLE9BQUEsRUFBcEMsT0FBb0MsQ0FBN0I7QUFBUCxHQUFBO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgeyBhc3NlcnRHbG9iYWxDb250ZXh0V2FzU2V0IH0gZnJvbSAnQGdsaW1tZXIvZ2xvYmFsLWNvbnRleHQnO1xuaW1wb3J0IHtcbiAgQ29tcGlsYWJsZVRlbXBsYXRlLFxuICBEZXN0cm95YWJsZSxcbiAgRHluYW1pY1Njb3BlLFxuICBFbGVtZW50QnVpbGRlcixcbiAgRW52aXJvbm1lbnQsXG4gIE9wdGlvbixcbiAgUGFydGlhbFNjb3BlLFxuICBSZW5kZXJSZXN1bHQsXG4gIFJpY2hJdGVyYXRvclJlc3VsdCxcbiAgUnVudGltZUNvbnN0YW50cyxcbiAgUnVudGltZUNvbnRleHQsXG4gIFJ1bnRpbWVIZWFwLFxuICBSdW50aW1lUHJvZ3JhbSxcbiAgU2NvcGUsXG4gIENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0LFxuICBWTSBhcyBQdWJsaWNWTSxcbiAgUmVzb2x1dGlvblRpbWVDb25zdGFudHMsXG4gIE93bmVyLFxuICBVcGRhdGluZ09wY29kZSxcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMT0NBTF9TSE9VTERfTE9HIH0gZnJvbSAnQGdsaW1tZXIvbG9jYWwtZGVidWctZmxhZ3MnO1xuaW1wb3J0IHsgUnVudGltZU9wSW1wbCB9IGZyb20gJ0BnbGltbWVyL3Byb2dyYW0nO1xuaW1wb3J0IHtcbiAgY3JlYXRlSXRlcmF0b3JJdGVtUmVmLFxuICBPcGFxdWVJdGVyYXRpb25JdGVtLFxuICBPcGFxdWVJdGVyYXRvcixcbiAgUmVmZXJlbmNlLFxuICBVTkRFRklORURfUkVGRVJFTkNFLFxufSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgYXNzZXJ0LCBleHBlY3QsIExPQ0FMX0xPR0dFUiwgU3RhY2ssIHVud3JhcEhhbmRsZSB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgYmVnaW5UcmFja0ZyYW1lLCBlbmRUcmFja0ZyYW1lLCByZXNldFRyYWNraW5nIH0gZnJvbSAnQGdsaW1tZXIvdmFsaWRhdG9yJztcbmltcG9ydCB7XG4gICRmcCxcbiAgJHBjLFxuICAkczAsXG4gICRzMSxcbiAgJHNwLFxuICAkdDAsXG4gICR0MSxcbiAgJHYwLFxuICBpc0xvd0xldmVsUmVnaXN0ZXIsXG4gIE1hY2hpbmVSZWdpc3RlcixcbiAgUmVnaXN0ZXIsXG4gIFN5c2NhbGxSZWdpc3Rlcixcbn0gZnJvbSAnQGdsaW1tZXIvdm0nO1xuaW1wb3J0IHsgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZCB9IGZyb20gJ0BnbGltbWVyL2Rlc3Ryb3lhYmxlJztcbmltcG9ydCB7XG4gIEJlZ2luVHJhY2tGcmFtZU9wY29kZSxcbiAgRW5kVHJhY2tGcmFtZU9wY29kZSxcbiAgSnVtcElmTm90TW9kaWZpZWRPcGNvZGUsXG59IGZyb20gJy4uL2NvbXBpbGVkL29wY29kZXMvdm0nO1xuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMsIERlYnVnU3RhdGUgfSBmcm9tICcuLi9vcGNvZGVzJztcbmltcG9ydCB7IFBhcnRpYWxTY29wZUltcGwgfSBmcm9tICcuLi9zY29wZSc7XG5pbXBvcnQgeyBBUkdTLCBDT05TVEFOVFMsIERFU1RST1lBQkxFX1NUQUNLLCBIRUFQLCBJTk5FUl9WTSwgUkVHSVNURVJTLCBTVEFDS1MgfSBmcm9tICcuLi9zeW1ib2xzJztcbmltcG9ydCB7IFZNQXJndW1lbnRzSW1wbCB9IGZyb20gJy4vYXJndW1lbnRzJztcbmltcG9ydCB7IExpdmVCbG9ja0xpc3QgfSBmcm9tICcuL2VsZW1lbnQtYnVpbGRlcic7XG5pbXBvcnQgTG93TGV2ZWxWTSBmcm9tICcuL2xvdy1sZXZlbCc7XG5pbXBvcnQgUmVuZGVyUmVzdWx0SW1wbCBmcm9tICcuL3JlbmRlci1yZXN1bHQnO1xuaW1wb3J0IEV2YWx1YXRpb25TdGFja0ltcGwsIHsgRXZhbHVhdGlvblN0YWNrIH0gZnJvbSAnLi9zdGFjayc7XG5pbXBvcnQge1xuICBCbG9ja09wY29kZSxcbiAgTGlzdEJsb2NrT3Bjb2RlLFxuICBMaXN0SXRlbU9wY29kZSxcbiAgUmVzdW1hYmxlVk1TdGF0ZSxcbiAgUmVzdW1hYmxlVk1TdGF0ZUltcGwsXG4gIFRyeU9wY29kZSxcbiAgVk1TdGF0ZSxcbn0gZnJvbSAnLi91cGRhdGUnO1xuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaW50ZXJuYWwgb3Bjb2RlcywgYW5kIGlzIG1vcmUgc3RhYmxlIHRoYW5cbiAqIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBwZW5kIFZNIGl0c2VsZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcm5hbFZNIHtcbiAgcmVhZG9ubHkgW0NPTlNUQU5UU106IFJ1bnRpbWVDb25zdGFudHMgJiBSZXNvbHV0aW9uVGltZUNvbnN0YW50cztcbiAgcmVhZG9ubHkgW0FSR1NdOiBWTUFyZ3VtZW50c0ltcGw7XG5cbiAgcmVhZG9ubHkgZW52OiBFbnZpcm9ubWVudDtcbiAgcmVhZG9ubHkgc3RhY2s6IEV2YWx1YXRpb25TdGFjaztcbiAgcmVhZG9ubHkgcnVudGltZTogUnVudGltZUNvbnRleHQ7XG4gIHJlYWRvbmx5IGNvbnRleHQ6IENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0O1xuXG4gIGxvYWRWYWx1ZShyZWdpc3RlcjogTWFjaGluZVJlZ2lzdGVyLCB2YWx1ZTogbnVtYmVyKTogdm9pZDtcbiAgbG9hZFZhbHVlKHJlZ2lzdGVyOiBSZWdpc3RlciwgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBsb2FkVmFsdWUocmVnaXN0ZXI6IFJlZ2lzdGVyIHwgTWFjaGluZVJlZ2lzdGVyLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG5cbiAgZmV0Y2hWYWx1ZShyZWdpc3RlcjogTWFjaGluZVJlZ2lzdGVyLnJhIHwgTWFjaGluZVJlZ2lzdGVyLnBjKTogbnVtYmVyO1xuICAvLyBUT0RPOiBTb21ldGhpbmcgYmV0dGVyIHRoYW4gYSB0eXBlIGFzc2VydGlvbj9cbiAgZmV0Y2hWYWx1ZTxUPihyZWdpc3RlcjogUmVnaXN0ZXIpOiBUO1xuICBmZXRjaFZhbHVlKHJlZ2lzdGVyOiBSZWdpc3Rlcik6IHVua25vd247XG5cbiAgbG9hZChyZWdpc3RlcjogUmVnaXN0ZXIpOiB2b2lkO1xuICBmZXRjaChyZWdpc3RlcjogUmVnaXN0ZXIpOiB2b2lkO1xuXG4gIGNvbXBpbGUoYmxvY2s6IENvbXBpbGFibGVUZW1wbGF0ZSk6IG51bWJlcjtcblxuICBzY29wZSgpOiBTY29wZTtcbiAgZWxlbWVudHMoKTogRWxlbWVudEJ1aWxkZXI7XG5cbiAgZ2V0T3duZXIoKTogT3duZXI7XG4gIGdldFNlbGYoKTogUmVmZXJlbmNlO1xuXG4gIHVwZGF0ZVdpdGgob3Bjb2RlOiBVcGRhdGluZ09wY29kZSk6IHZvaWQ7XG5cbiAgYXNzb2NpYXRlRGVzdHJveWFibGUoZDogRGVzdHJveWFibGUpOiB2b2lkO1xuXG4gIGJlZ2luQ2FjaGVHcm91cChuYW1lPzogc3RyaW5nKTogdm9pZDtcbiAgY29tbWl0Q2FjaGVHcm91cCgpOiB2b2lkO1xuXG4gIC8vLyBJdGVyYXRpb24gLy8vXG5cbiAgZW50ZXJMaXN0KGl0ZXJhYmxlUmVmOiBSZWZlcmVuY2U8T3BhcXVlSXRlcmF0b3I+LCBvZmZzZXQ6IG51bWJlcik6IHZvaWQ7XG4gIGV4aXRMaXN0KCk6IHZvaWQ7XG4gIGVudGVySXRlbShpdGVtOiBPcGFxdWVJdGVyYXRpb25JdGVtKTogTGlzdEl0ZW1PcGNvZGU7XG4gIHJlZ2lzdGVySXRlbShpdGVtOiBMaXN0SXRlbU9wY29kZSk6IHZvaWQ7XG5cbiAgcHVzaFJvb3RTY29wZShzaXplOiBudW1iZXIsIG93bmVyOiBPd25lcik6IFBhcnRpYWxTY29wZTtcbiAgcHVzaENoaWxkU2NvcGUoKTogdm9pZDtcbiAgcG9wU2NvcGUoKTogdm9pZDtcbiAgcHVzaFNjb3BlKHNjb3BlOiBTY29wZSk6IHZvaWQ7XG5cbiAgZHluYW1pY1Njb3BlKCk6IER5bmFtaWNTY29wZTtcbiAgYmluZER5bmFtaWNTY29wZShuYW1lczogc3RyaW5nW10pOiB2b2lkO1xuICBwdXNoRHluYW1pY1Njb3BlKCk6IHZvaWQ7XG4gIHBvcER5bmFtaWNTY29wZSgpOiB2b2lkO1xuXG4gIGVudGVyKGFyZ3M6IG51bWJlcik6IHZvaWQ7XG4gIGV4aXQoKTogdm9pZDtcblxuICBnb3RvKHBjOiBudW1iZXIpOiB2b2lkO1xuICBjYWxsKGhhbmRsZTogbnVtYmVyKTogdm9pZDtcbiAgcHVzaEZyYW1lKCk6IHZvaWQ7XG5cbiAgcmVmZXJlbmNlRm9yU3ltYm9sKHN5bWJvbDogbnVtYmVyKTogUmVmZXJlbmNlO1xuXG4gIGV4ZWN1dGUoaW5pdGlhbGl6ZT86ICh2bTogdGhpcykgPT4gdm9pZCk6IFJlbmRlclJlc3VsdDtcbiAgcHVzaFVwZGF0aW5nKGxpc3Q/OiBVcGRhdGluZ09wY29kZVtdKTogdm9pZDtcbiAgbmV4dCgpOiBSaWNoSXRlcmF0b3JSZXN1bHQ8bnVsbCwgUmVuZGVyUmVzdWx0Pjtcbn1cblxuY2xhc3MgU3RhY2tzIHtcbiAgcmVhZG9ubHkgc2NvcGUgPSBuZXcgU3RhY2s8U2NvcGU+KCk7XG4gIHJlYWRvbmx5IGR5bmFtaWNTY29wZSA9IG5ldyBTdGFjazxEeW5hbWljU2NvcGU+KCk7XG4gIHJlYWRvbmx5IHVwZGF0aW5nID0gbmV3IFN0YWNrPFVwZGF0aW5nT3Bjb2RlW10+KCk7XG4gIHJlYWRvbmx5IGNhY2hlID0gbmV3IFN0YWNrPEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlPigpO1xuICByZWFkb25seSBsaXN0ID0gbmV3IFN0YWNrPExpc3RCbG9ja09wY29kZT4oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVk0gaW1wbGVtZW50cyBQdWJsaWNWTSwgSW50ZXJuYWxWTSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgW1NUQUNLU10gPSBuZXcgU3RhY2tzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgW0hFQVBdOiBSdW50aW1lSGVhcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cnVjdG9yOiBvYmplY3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgW0RFU1RST1lBQkxFX1NUQUNLXSA9IG5ldyBTdGFjazxvYmplY3Q+KCk7XG4gIHJlYWRvbmx5IFtDT05TVEFOVFNdOiBSdW50aW1lQ29uc3RhbnRzICYgUmVzb2x1dGlvblRpbWVDb25zdGFudHM7XG4gIHJlYWRvbmx5IFtBUkdTXTogVk1Bcmd1bWVudHNJbXBsO1xuICByZWFkb25seSBbSU5ORVJfVk1dOiBMb3dMZXZlbFZNO1xuXG4gIGdldCBzdGFjaygpOiBFdmFsdWF0aW9uU3RhY2sge1xuICAgIHJldHVybiB0aGlzW0lOTkVSX1ZNXS5zdGFjayBhcyBFdmFsdWF0aW9uU3RhY2s7XG4gIH1cblxuICAvKiBSZWdpc3RlcnMgKi9cblxuICBnZXQgcGMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpc1tJTk5FUl9WTV0uZmV0Y2hSZWdpc3RlcigkcGMpO1xuICB9XG5cbiAgcHVibGljIHMwOiB1bmtub3duID0gbnVsbDtcbiAgcHVibGljIHMxOiB1bmtub3duID0gbnVsbDtcbiAgcHVibGljIHQwOiB1bmtub3duID0gbnVsbDtcbiAgcHVibGljIHQxOiB1bmtub3duID0gbnVsbDtcbiAgcHVibGljIHYwOiB1bmtub3duID0gbnVsbDtcblxuICAvLyBGZXRjaCBhIHZhbHVlIGZyb20gYSByZWdpc3RlciBvbnRvIHRoZSBzdGFja1xuICBmZXRjaChyZWdpc3RlcjogU3lzY2FsbFJlZ2lzdGVyKTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5mZXRjaFZhbHVlKHJlZ2lzdGVyKTtcblxuICAgIHRoaXMuc3RhY2sucHVzaCh2YWx1ZSk7XG4gIH1cblxuICAvLyBMb2FkIGEgdmFsdWUgZnJvbSB0aGUgc3RhY2sgaW50byBhIHJlZ2lzdGVyXG4gIGxvYWQocmVnaXN0ZXI6IFN5c2NhbGxSZWdpc3Rlcikge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuc3RhY2sucG9wKCk7XG5cbiAgICB0aGlzLmxvYWRWYWx1ZShyZWdpc3RlciwgdmFsdWUpO1xuICB9XG5cbiAgLy8gRmV0Y2ggYSB2YWx1ZSBmcm9tIGEgcmVnaXN0ZXJcbiAgZmV0Y2hWYWx1ZShyZWdpc3RlcjogTWFjaGluZVJlZ2lzdGVyKTogbnVtYmVyO1xuICBmZXRjaFZhbHVlPFQ+KHJlZ2lzdGVyOiBSZWdpc3Rlcik6IFQ7XG4gIGZldGNoVmFsdWUocmVnaXN0ZXI6IFJlZ2lzdGVyIHwgTWFjaGluZVJlZ2lzdGVyKTogdW5rbm93biB7XG4gICAgaWYgKGlzTG93TGV2ZWxSZWdpc3RlcihyZWdpc3RlcikpIHtcbiAgICAgIHJldHVybiB0aGlzW0lOTkVSX1ZNXS5mZXRjaFJlZ2lzdGVyKHJlZ2lzdGVyKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlZ2lzdGVyKSB7XG4gICAgICBjYXNlICRzMDpcbiAgICAgICAgcmV0dXJuIHRoaXMuczA7XG4gICAgICBjYXNlICRzMTpcbiAgICAgICAgcmV0dXJuIHRoaXMuczE7XG4gICAgICBjYXNlICR0MDpcbiAgICAgICAgcmV0dXJuIHRoaXMudDA7XG4gICAgICBjYXNlICR0MTpcbiAgICAgICAgcmV0dXJuIHRoaXMudDE7XG4gICAgICBjYXNlICR2MDpcbiAgICAgICAgcmV0dXJuIHRoaXMudjA7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBhIHZhbHVlIGludG8gYSByZWdpc3RlclxuXG4gIGxvYWRWYWx1ZTxUPihyZWdpc3RlcjogUmVnaXN0ZXIgfCBNYWNoaW5lUmVnaXN0ZXIsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKGlzTG93TGV2ZWxSZWdpc3RlcihyZWdpc3RlcikpIHtcbiAgICAgIHRoaXNbSU5ORVJfVk1dLmxvYWRSZWdpc3RlcihyZWdpc3RlciwgKHZhbHVlIGFzIGFueSkgYXMgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlZ2lzdGVyKSB7XG4gICAgICBjYXNlICRzMDpcbiAgICAgICAgdGhpcy5zMCA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJHMxOlxuICAgICAgICB0aGlzLnMxID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAkdDA6XG4gICAgICAgIHRoaXMudDAgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICR0MTpcbiAgICAgICAgdGhpcy50MSA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJHYwOlxuICAgICAgICB0aGlzLnYwID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNaWdyYXRlZCB0byBJbm5lclxuICAgKi9cblxuICAvLyBTdGFydCBhIG5ldyBmcmFtZSBhbmQgc2F2ZSAkcmEgYW5kICRmcCBvbiB0aGUgc3RhY2tcbiAgcHVzaEZyYW1lKCkge1xuICAgIHRoaXNbSU5ORVJfVk1dLnB1c2hGcmFtZSgpO1xuICB9XG5cbiAgLy8gUmVzdG9yZSAkcmEsICRzcCBhbmQgJGZwXG4gIHBvcEZyYW1lKCkge1xuICAgIHRoaXNbSU5ORVJfVk1dLnBvcEZyYW1lKCk7XG4gIH1cblxuICAvLyBKdW1wIHRvIGFuIGFkZHJlc3MgaW4gYHByb2dyYW1gXG4gIGdvdG8ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5nb3RvKG9mZnNldCk7XG4gIH1cblxuICAvLyBTYXZlICRwYyBpbnRvICRyYSwgdGhlbiBqdW1wIHRvIGEgbmV3IGFkZHJlc3MgaW4gYHByb2dyYW1gIChqYWwgaW4gTUlQUylcbiAgY2FsbChoYW5kbGU6IG51bWJlcikge1xuICAgIHRoaXNbSU5ORVJfVk1dLmNhbGwoaGFuZGxlKTtcbiAgfVxuXG4gIC8vIFB1dCBhIHNwZWNpZmljIGBwcm9ncmFtYCBhZGRyZXNzIGluICRyYVxuICByZXR1cm5UbyhvZmZzZXQ6IG51bWJlcikge1xuICAgIHRoaXNbSU5ORVJfVk1dLnJldHVyblRvKG9mZnNldCk7XG4gIH1cblxuICAvLyBSZXR1cm4gdG8gdGhlIGBwcm9ncmFtYCBhZGRyZXNzIHN0b3JlZCBpbiAkcmFcbiAgcmV0dXJuKCkge1xuICAgIHRoaXNbSU5ORVJfVk1dLnJldHVybigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCBvZiBtaWdyYXRlZC5cbiAgICovXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgcnVudGltZTogUnVudGltZUNvbnRleHQsXG4gICAgeyBwYywgc2NvcGUsIGR5bmFtaWNTY29wZSwgc3RhY2sgfTogVk1TdGF0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRTdGFjazogRWxlbWVudEJ1aWxkZXIsXG4gICAgcmVhZG9ubHkgY29udGV4dDogQ29tcGlsZVRpbWVDb21waWxhdGlvbkNvbnRleHRcbiAgKSB7XG4gICAgaWYgKERFQlVHKSB7XG4gICAgICBhc3NlcnRHbG9iYWxDb250ZXh0V2FzU2V0ISgpO1xuICAgIH1cblxuICAgIGxldCBldmFsU3RhY2sgPSBFdmFsdWF0aW9uU3RhY2tJbXBsLnJlc3RvcmUoc3RhY2spO1xuXG4gICAgYXNzZXJ0KHR5cGVvZiBwYyA9PT0gJ251bWJlcicsICdwYyBpcyBhIG51bWJlcicpO1xuXG4gICAgZXZhbFN0YWNrW1JFR0lTVEVSU11bJHBjXSA9IHBjO1xuICAgIGV2YWxTdGFja1tSRUdJU1RFUlNdWyRzcF0gPSBzdGFjay5sZW5ndGggLSAxO1xuICAgIGV2YWxTdGFja1tSRUdJU1RFUlNdWyRmcF0gPSAtMTtcblxuICAgIHRoaXNbSEVBUF0gPSB0aGlzLnByb2dyYW0uaGVhcDtcbiAgICB0aGlzW0NPTlNUQU5UU10gPSB0aGlzLnByb2dyYW0uY29uc3RhbnRzO1xuICAgIHRoaXMuZWxlbWVudFN0YWNrID0gZWxlbWVudFN0YWNrO1xuICAgIHRoaXNbU1RBQ0tTXS5zY29wZS5wdXNoKHNjb3BlKTtcbiAgICB0aGlzW1NUQUNLU10uZHluYW1pY1Njb3BlLnB1c2goZHluYW1pY1Njb3BlKTtcbiAgICB0aGlzW0FSR1NdID0gbmV3IFZNQXJndW1lbnRzSW1wbCgpO1xuICAgIHRoaXNbSU5ORVJfVk1dID0gbmV3IExvd0xldmVsVk0oXG4gICAgICBldmFsU3RhY2ssXG4gICAgICB0aGlzW0hFQVBdLFxuICAgICAgcnVudGltZS5wcm9ncmFtLFxuICAgICAge1xuICAgICAgICBkZWJ1Z0JlZm9yZTogKG9wY29kZTogUnVudGltZU9wSW1wbCk6IERlYnVnU3RhdGUgPT4ge1xuICAgICAgICAgIHJldHVybiBBUFBFTkRfT1BDT0RFUy5kZWJ1Z0JlZm9yZSh0aGlzLCBvcGNvZGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRlYnVnQWZ0ZXI6IChzdGF0ZTogRGVidWdTdGF0ZSk6IHZvaWQgPT4ge1xuICAgICAgICAgIEFQUEVORF9PUENPREVTLmRlYnVnQWZ0ZXIodGhpcywgc3RhdGUpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGV2YWxTdGFja1tSRUdJU1RFUlNdXG4gICAgKTtcblxuICAgIHRoaXMuZGVzdHJ1Y3RvciA9IHt9O1xuICAgIHRoaXNbREVTVFJPWUFCTEVfU1RBQ0tdLnB1c2godGhpcy5kZXN0cnVjdG9yKTtcbiAgfVxuXG4gIHN0YXRpYyBpbml0aWFsKFxuICAgIHJ1bnRpbWU6IFJ1bnRpbWVDb250ZXh0LFxuICAgIGNvbnRleHQ6IENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0LFxuICAgIHsgaGFuZGxlLCBzZWxmLCBkeW5hbWljU2NvcGUsIHRyZWVCdWlsZGVyLCBudW1TeW1ib2xzLCBvd25lciB9OiBJbml0T3B0aW9uc1xuICApIHtcbiAgICBsZXQgc2NvcGUgPSBQYXJ0aWFsU2NvcGVJbXBsLnJvb3Qoc2VsZiwgbnVtU3ltYm9scywgb3duZXIpO1xuICAgIGxldCBzdGF0ZSA9IHZtU3RhdGUocnVudGltZS5wcm9ncmFtLmhlYXAuZ2V0YWRkcihoYW5kbGUpLCBzY29wZSwgZHluYW1pY1Njb3BlKTtcbiAgICBsZXQgdm0gPSBpbml0Vk0oY29udGV4dCkocnVudGltZSwgc3RhdGUsIHRyZWVCdWlsZGVyKTtcbiAgICB2bS5wdXNoVXBkYXRpbmcoKTtcbiAgICByZXR1cm4gdm07XG4gIH1cblxuICBzdGF0aWMgZW1wdHkoXG4gICAgcnVudGltZTogUnVudGltZUNvbnRleHQsXG4gICAgeyBoYW5kbGUsIHRyZWVCdWlsZGVyLCBkeW5hbWljU2NvcGUsIG93bmVyIH06IE1pbmltYWxJbml0T3B0aW9ucyxcbiAgICBjb250ZXh0OiBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dFxuICApIHtcbiAgICBsZXQgdm0gPSBpbml0Vk0oY29udGV4dCkoXG4gICAgICBydW50aW1lLFxuICAgICAgdm1TdGF0ZShcbiAgICAgICAgcnVudGltZS5wcm9ncmFtLmhlYXAuZ2V0YWRkcihoYW5kbGUpLFxuICAgICAgICBQYXJ0aWFsU2NvcGVJbXBsLnJvb3QoVU5ERUZJTkVEX1JFRkVSRU5DRSwgMCwgb3duZXIpLFxuICAgICAgICBkeW5hbWljU2NvcGVcbiAgICAgICksXG4gICAgICB0cmVlQnVpbGRlclxuICAgICk7XG4gICAgdm0ucHVzaFVwZGF0aW5nKCk7XG4gICAgcmV0dXJuIHZtO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN1bWU6IFZtSW5pdENhbGxiYWNrID0gaW5pdFZNKHRoaXMuY29udGV4dCk7XG5cbiAgY29tcGlsZShibG9jazogQ29tcGlsYWJsZVRlbXBsYXRlKTogbnVtYmVyIHtcbiAgICBsZXQgaGFuZGxlID0gdW53cmFwSGFuZGxlKGJsb2NrLmNvbXBpbGUodGhpcy5jb250ZXh0KSk7XG5cbiAgICByZXR1cm4gaGFuZGxlO1xuICB9XG5cbiAgZ2V0IHByb2dyYW0oKTogUnVudGltZVByb2dyYW0ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWUucHJvZ3JhbTtcbiAgfVxuXG4gIGdldCBlbnYoKTogRW52aXJvbm1lbnQge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWUuZW52O1xuICB9XG5cbiAgY2FwdHVyZVN0YXRlKGFyZ3M6IG51bWJlciwgcGMgPSB0aGlzW0lOTkVSX1ZNXS5mZXRjaFJlZ2lzdGVyKCRwYykpOiBWTVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGMsXG4gICAgICBzY29wZTogdGhpcy5zY29wZSgpLFxuICAgICAgZHluYW1pY1Njb3BlOiB0aGlzLmR5bmFtaWNTY29wZSgpLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2suY2FwdHVyZShhcmdzKSxcbiAgICB9O1xuICB9XG5cbiAgY2FwdHVyZShhcmdzOiBudW1iZXIsIHBjID0gdGhpc1tJTk5FUl9WTV0uZmV0Y2hSZWdpc3RlcigkcGMpKTogUmVzdW1hYmxlVk1TdGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bWFibGVWTVN0YXRlSW1wbCh0aGlzLmNhcHR1cmVTdGF0ZShhcmdzLCBwYyksIHRoaXMucmVzdW1lKTtcbiAgfVxuXG4gIGJlZ2luQ2FjaGVHcm91cChuYW1lPzogc3RyaW5nKSB7XG4gICAgbGV0IG9wY29kZXMgPSB0aGlzLnVwZGF0aW5nKCk7XG4gICAgbGV0IGd1YXJkID0gbmV3IEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlKCk7XG5cbiAgICBvcGNvZGVzLnB1c2goZ3VhcmQpO1xuICAgIG9wY29kZXMucHVzaChuZXcgQmVnaW5UcmFja0ZyYW1lT3Bjb2RlKG5hbWUpKTtcbiAgICB0aGlzW1NUQUNLU10uY2FjaGUucHVzaChndWFyZCk7XG5cbiAgICBiZWdpblRyYWNrRnJhbWUobmFtZSk7XG4gIH1cblxuICBjb21taXRDYWNoZUdyb3VwKCkge1xuICAgIGxldCBvcGNvZGVzID0gdGhpcy51cGRhdGluZygpO1xuICAgIGxldCBndWFyZCA9IGV4cGVjdCh0aGlzW1NUQUNLU10uY2FjaGUucG9wKCksICdWTSBCVUc6IEV4cGVjdGVkIGEgY2FjaGUgZ3JvdXAnKTtcblxuICAgIGxldCB0YWcgPSBlbmRUcmFja0ZyYW1lKCk7XG4gICAgb3Bjb2Rlcy5wdXNoKG5ldyBFbmRUcmFja0ZyYW1lT3Bjb2RlKGd1YXJkKSk7XG5cbiAgICBndWFyZC5maW5hbGl6ZSh0YWcsIG9wY29kZXMubGVuZ3RoKTtcbiAgfVxuXG4gIGVudGVyKGFyZ3M6IG51bWJlcikge1xuICAgIGxldCB1cGRhdGluZzogVXBkYXRpbmdPcGNvZGVbXSA9IFtdO1xuXG4gICAgbGV0IHN0YXRlID0gdGhpcy5jYXB0dXJlKGFyZ3MpO1xuICAgIGxldCBibG9jayA9IHRoaXMuZWxlbWVudHMoKS5wdXNoVXBkYXRhYmxlQmxvY2soKTtcblxuICAgIGxldCB0cnlPcGNvZGUgPSBuZXcgVHJ5T3Bjb2RlKHN0YXRlLCB0aGlzLnJ1bnRpbWUsIGJsb2NrLCB1cGRhdGluZyk7XG5cbiAgICB0aGlzLmRpZEVudGVyKHRyeU9wY29kZSk7XG4gIH1cblxuICBlbnRlckl0ZW0oeyBrZXksIHZhbHVlLCBtZW1vIH06IE9wYXF1ZUl0ZXJhdGlvbkl0ZW0pOiBMaXN0SXRlbU9wY29kZSB7XG4gICAgbGV0IHsgc3RhY2sgfSA9IHRoaXM7XG5cbiAgICBsZXQgdmFsdWVSZWYgPSBjcmVhdGVJdGVyYXRvckl0ZW1SZWYodmFsdWUpO1xuICAgIGxldCBtZW1vUmVmID0gY3JlYXRlSXRlcmF0b3JJdGVtUmVmKG1lbW8pO1xuXG4gICAgc3RhY2sucHVzaCh2YWx1ZVJlZik7XG4gICAgc3RhY2sucHVzaChtZW1vUmVmKTtcblxuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2FwdHVyZSgyKTtcbiAgICBsZXQgYmxvY2sgPSB0aGlzLmVsZW1lbnRzKCkucHVzaFVwZGF0YWJsZUJsb2NrKCk7XG5cbiAgICBsZXQgb3Bjb2RlID0gbmV3IExpc3RJdGVtT3Bjb2RlKHN0YXRlLCB0aGlzLnJ1bnRpbWUsIGJsb2NrLCBrZXksIG1lbW9SZWYsIHZhbHVlUmVmKTtcbiAgICB0aGlzLmRpZEVudGVyKG9wY29kZSk7XG5cbiAgICByZXR1cm4gb3Bjb2RlO1xuICB9XG5cbiAgcmVnaXN0ZXJJdGVtKG9wY29kZTogTGlzdEl0ZW1PcGNvZGUpIHtcbiAgICB0aGlzLmxpc3RCbG9jaygpLmluaXRpYWxpemVDaGlsZChvcGNvZGUpO1xuICB9XG5cbiAgZW50ZXJMaXN0KGl0ZXJhYmxlUmVmOiBSZWZlcmVuY2U8T3BhcXVlSXRlcmF0b3I+LCBvZmZzZXQ6IG51bWJlcikge1xuICAgIGxldCB1cGRhdGluZzogTGlzdEl0ZW1PcGNvZGVbXSA9IFtdO1xuXG4gICAgbGV0IGFkZHIgPSB0aGlzW0lOTkVSX1ZNXS50YXJnZXQob2Zmc2V0KTtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLmNhcHR1cmUoMCwgYWRkcik7XG4gICAgbGV0IGxpc3QgPSB0aGlzLmVsZW1lbnRzKCkucHVzaEJsb2NrTGlzdCh1cGRhdGluZykgYXMgTGl2ZUJsb2NrTGlzdDtcblxuICAgIGxldCBvcGNvZGUgPSBuZXcgTGlzdEJsb2NrT3Bjb2RlKHN0YXRlLCB0aGlzLnJ1bnRpbWUsIGxpc3QsIHVwZGF0aW5nLCBpdGVyYWJsZVJlZik7XG5cbiAgICB0aGlzW1NUQUNLU10ubGlzdC5wdXNoKG9wY29kZSk7XG5cbiAgICB0aGlzLmRpZEVudGVyKG9wY29kZSk7XG4gIH1cblxuICBwcml2YXRlIGRpZEVudGVyKG9wY29kZTogQmxvY2tPcGNvZGUpIHtcbiAgICB0aGlzLmFzc29jaWF0ZURlc3Ryb3lhYmxlKG9wY29kZSk7XG4gICAgdGhpc1tERVNUUk9ZQUJMRV9TVEFDS10ucHVzaChvcGNvZGUpO1xuICAgIHRoaXMudXBkYXRlV2l0aChvcGNvZGUpO1xuICAgIHRoaXMucHVzaFVwZGF0aW5nKG9wY29kZS5jaGlsZHJlbik7XG4gIH1cblxuICBleGl0KCkge1xuICAgIHRoaXNbREVTVFJPWUFCTEVfU1RBQ0tdLnBvcCgpO1xuICAgIHRoaXMuZWxlbWVudHMoKS5wb3BCbG9jaygpO1xuICAgIHRoaXMucG9wVXBkYXRpbmcoKTtcbiAgfVxuXG4gIGV4aXRMaXN0KCkge1xuICAgIHRoaXMuZXhpdCgpO1xuICAgIHRoaXNbU1RBQ0tTXS5saXN0LnBvcCgpO1xuICB9XG5cbiAgcHVzaFVwZGF0aW5nKGxpc3Q6IFVwZGF0aW5nT3Bjb2RlW10gPSBbXSk6IHZvaWQge1xuICAgIHRoaXNbU1RBQ0tTXS51cGRhdGluZy5wdXNoKGxpc3QpO1xuICB9XG5cbiAgcG9wVXBkYXRpbmcoKTogVXBkYXRpbmdPcGNvZGVbXSB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzW1NUQUNLU10udXBkYXRpbmcucG9wKCksIFwiY2FuJ3QgcG9wIGFuIGVtcHR5IHN0YWNrXCIpO1xuICB9XG5cbiAgdXBkYXRlV2l0aChvcGNvZGU6IFVwZGF0aW5nT3Bjb2RlKSB7XG4gICAgdGhpcy51cGRhdGluZygpLnB1c2gob3Bjb2RlKTtcbiAgfVxuXG4gIGxpc3RCbG9jaygpOiBMaXN0QmxvY2tPcGNvZGUge1xuICAgIHJldHVybiBleHBlY3QodGhpc1tTVEFDS1NdLmxpc3QuY3VycmVudCwgJ2V4cGVjdGVkIGEgbGlzdCBibG9jaycpO1xuICB9XG5cbiAgYXNzb2NpYXRlRGVzdHJveWFibGUoY2hpbGQ6IERlc3Ryb3lhYmxlKTogdm9pZCB7XG4gICAgbGV0IHBhcmVudCA9IGV4cGVjdCh0aGlzW0RFU1RST1lBQkxFX1NUQUNLXS5jdXJyZW50LCAnRXhwZWN0ZWQgZGVzdHJ1Y3RvciBwYXJlbnQnKTtcbiAgICBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkKHBhcmVudCwgY2hpbGQpO1xuICB9XG5cbiAgdHJ5VXBkYXRpbmcoKTogT3B0aW9uPFVwZGF0aW5nT3Bjb2RlW10+IHtcbiAgICByZXR1cm4gdGhpc1tTVEFDS1NdLnVwZGF0aW5nLmN1cnJlbnQ7XG4gIH1cblxuICB1cGRhdGluZygpOiBVcGRhdGluZ09wY29kZVtdIHtcbiAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgdGhpc1tTVEFDS1NdLnVwZGF0aW5nLmN1cnJlbnQsXG4gICAgICAnZXhwZWN0ZWQgdXBkYXRpbmcgb3Bjb2RlIG9uIHRoZSB1cGRhdGluZyBvcGNvZGUgc3RhY2snXG4gICAgKTtcbiAgfVxuXG4gIGVsZW1lbnRzKCk6IEVsZW1lbnRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50U3RhY2s7XG4gIH1cblxuICBzY29wZSgpOiBTY29wZSB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzW1NUQUNLU10uc2NvcGUuY3VycmVudCwgJ2V4cGVjdGVkIHNjb3BlIG9uIHRoZSBzY29wZSBzdGFjaycpO1xuICB9XG5cbiAgZHluYW1pY1Njb3BlKCk6IER5bmFtaWNTY29wZSB7XG4gICAgcmV0dXJuIGV4cGVjdChcbiAgICAgIHRoaXNbU1RBQ0tTXS5keW5hbWljU2NvcGUuY3VycmVudCxcbiAgICAgICdleHBlY3RlZCBkeW5hbWljIHNjb3BlIG9uIHRoZSBkeW5hbWljIHNjb3BlIHN0YWNrJ1xuICAgICk7XG4gIH1cblxuICBwdXNoQ2hpbGRTY29wZSgpIHtcbiAgICB0aGlzW1NUQUNLU10uc2NvcGUucHVzaCh0aGlzLnNjb3BlKCkuY2hpbGQoKSk7XG4gIH1cblxuICBwdXNoRHluYW1pY1Njb3BlKCk6IER5bmFtaWNTY29wZSB7XG4gICAgbGV0IGNoaWxkID0gdGhpcy5keW5hbWljU2NvcGUoKS5jaGlsZCgpO1xuICAgIHRoaXNbU1RBQ0tTXS5keW5hbWljU2NvcGUucHVzaChjaGlsZCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHVzaFJvb3RTY29wZShzaXplOiBudW1iZXIsIG93bmVyOiBPd25lcik6IFBhcnRpYWxTY29wZSB7XG4gICAgbGV0IHNjb3BlID0gUGFydGlhbFNjb3BlSW1wbC5zaXplZChzaXplLCBvd25lcik7XG4gICAgdGhpc1tTVEFDS1NdLnNjb3BlLnB1c2goc2NvcGUpO1xuICAgIHJldHVybiBzY29wZTtcbiAgfVxuXG4gIHB1c2hTY29wZShzY29wZTogU2NvcGUpIHtcbiAgICB0aGlzW1NUQUNLU10uc2NvcGUucHVzaChzY29wZSk7XG4gIH1cblxuICBwb3BTY29wZSgpIHtcbiAgICB0aGlzW1NUQUNLU10uc2NvcGUucG9wKCk7XG4gIH1cblxuICBwb3BEeW5hbWljU2NvcGUoKSB7XG4gICAgdGhpc1tTVEFDS1NdLmR5bmFtaWNTY29wZS5wb3AoKTtcbiAgfVxuXG4gIC8vLyBTQ09QRSBIRUxQRVJTXG5cbiAgZ2V0T3duZXIoKTogT3duZXIge1xuICAgIHJldHVybiB0aGlzLnNjb3BlKCkub3duZXI7XG4gIH1cblxuICBnZXRTZWxmKCk6IFJlZmVyZW5jZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zY29wZSgpLmdldFNlbGYoKTtcbiAgfVxuXG4gIHJlZmVyZW5jZUZvclN5bWJvbChzeW1ib2w6IG51bWJlcik6IFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGUoKS5nZXRTeW1ib2woc3ltYm9sKTtcbiAgfVxuXG4gIC8vLyBFWEVDVVRJT05cblxuICBleGVjdXRlKGluaXRpYWxpemU/OiAodm06IHRoaXMpID0+IHZvaWQpOiBSZW5kZXJSZXN1bHQge1xuICAgIGlmIChERUJVRykge1xuICAgICAgbGV0IGhhc0Vycm9yZWQgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5fZXhlY3V0ZShpbml0aWFsaXplKTtcblxuICAgICAgICAvLyB1c2luZyBhIGJvb2xlYW4gaGVyZSB0byBhdm9pZCBicmVha2luZyBlcmdvbm9taWNzIG9mIFwicGF1c2Ugb24gdW5jYXVnaHQgZXhjZXB0aW9uc1wiXG4gICAgICAgIC8vIHdoaWNoIHdvdWxkIGhhcHBlbiB3aXRoIGEgYGNhdGNoYCArIGB0aHJvd2BcbiAgICAgICAgaGFzRXJyb3JlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChoYXNFcnJvcmVkKSB7XG4gICAgICAgICAgLy8gSWYgYW55IGV4aXN0aW5nIGJsb2NrcyBhcmUgb3BlbiwgZHVlIHRvIGFuIGVycm9yIG9yIHNvbWV0aGluZyBsaWtlXG4gICAgICAgICAgLy8gdGhhdCwgd2UgbmVlZCB0byBjbG9zZSB0aGVtIGFsbCBhbmQgY2xlYW4gdGhpbmdzIHVwIHByb3Blcmx5LlxuICAgICAgICAgIGxldCBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHMoKTtcblxuICAgIC