@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
517 lines (430 loc) • 52.6 kB
JavaScript
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;
import { DEBUG } from '@glimmer/env';
import { assertGlobalContextWasSet } from '@glimmer/global-context';
import { createIteratorItemRef, UNDEFINED_REFERENCE } from '@glimmer/reference';
import { assert, LOCAL_LOGGER, Stack, unwrapHandle } from '@glimmer/util';
import { beginTrackFrame, endTrackFrame, resetTracking } from '@glimmer/validator';
import { $fp, $pc, $s0, $s1, $sp, $t0, $t1, $v0, isLowLevelRegister } from '@glimmer/vm';
import { associateDestroyableChild } from '@glimmer/destroyable';
import { BeginTrackFrameOpcode, EndTrackFrameOpcode, JumpIfNotModifiedOpcode } from '../compiled/opcodes/vm';
import { APPEND_OPCODES } from '../opcodes';
import { PartialScopeImpl } from '../scope';
import { ARGS, CONSTANTS, DESTROYABLE_STACK, HEAP, INNER_VM, REGISTERS, STACKS } from '../symbols';
import { VMArgumentsImpl } from './arguments';
import LowLevelVM from './low-level';
import RenderResultImpl from './render-result';
import EvaluationStackImpl from './stack';
import { ListBlockOpcode, ListItemOpcode, ResumableVMStateImpl, TryOpcode } from './update';
var Stacks = function Stacks() {
this.scope = new Stack();
this.dynamicScope = new Stack();
this.updating = new Stack();
this.cache = new Stack();
this.list = new 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 Stack();
this.s0 = null;
this.s1 = null;
this.t0 = null;
this.t1 = null;
this.v0 = null;
this.resume = initVM(this.context);
if (DEBUG) {
assertGlobalContextWasSet();
}
var evalStack = EvaluationStackImpl.restore(stack);
false && assert(typeof pc === 'number', 'pc is a number');
evalStack[REGISTERS][$pc] = pc;
evalStack[REGISTERS][$sp] = stack.length - 1;
evalStack[REGISTERS][$fp] = -1;
this[HEAP] = this.program.heap;
this[CONSTANTS] = this.program.constants;
this.elementStack = elementStack;
this[STACKS].scope.push(scope);
this[STACKS].dynamicScope.push(dynamicScope);
this[ARGS] = new VMArgumentsImpl();
this[INNER_VM] = new LowLevelVM(evalStack, this[HEAP], runtime.program, {
debugBefore: function debugBefore(opcode) {
return APPEND_OPCODES.debugBefore(_this, opcode);
},
debugAfter: function debugAfter(state) {
APPEND_OPCODES.debugAfter(_this, state);
}
}, evalStack[REGISTERS]);
this.destructor = {};
this[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 (isLowLevelRegister(register)) {
return this[INNER_VM].fetchRegister(register);
}
switch (register) {
case $s0:
return this.s0;
case $s1:
return this.s1;
case $t0:
return this.t0;
case $t1:
return this.t1;
case $v0:
return this.v0;
}
} // Load a value into a register
;
_proto.loadValue = function loadValue(register, value) {
if (isLowLevelRegister(register)) {
this[INNER_VM].loadRegister(register, value);
}
switch (register) {
case $s0:
this.s0 = value;
break;
case $s1:
this.s1 = value;
break;
case $t0:
this.t0 = value;
break;
case $t1:
this.t1 = value;
break;
case $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[INNER_VM].pushFrame();
} // Restore $ra, $sp and $fp
;
_proto.popFrame = function popFrame() {
this[INNER_VM].popFrame();
} // Jump to an address in `program`
;
_proto["goto"] = function goto(offset) {
this[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[INNER_VM].call(handle);
} // Put a specific `program` address in $ra
;
_proto.returnTo = function returnTo(offset) {
this[INNER_VM].returnTo(offset);
} // Return to the `program` address stored in $ra
;
_proto["return"] = function _return() {
this[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 = 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), PartialScopeImpl.root(UNDEFINED_REFERENCE, 0, owner), dynamicScope), treeBuilder);
vm.pushUpdating();
return vm;
};
_proto.compile = function compile(block) {
var handle = unwrapHandle(block.compile(this.context));
return handle;
};
_proto.captureState = function captureState(args, pc) {
if (pc === void 0) {
pc = this[INNER_VM].fetchRegister($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[INNER_VM].fetchRegister($pc);
}
return new ResumableVMStateImpl(this.captureState(args, pc), this.resume);
};
_proto.beginCacheGroup = function beginCacheGroup(name) {
var opcodes = this.updating();
var guard = new JumpIfNotModifiedOpcode();
opcodes.push(guard);
opcodes.push(new BeginTrackFrameOpcode(name));
this[STACKS].cache.push(guard);
beginTrackFrame(name);
};
_proto.commitCacheGroup = function commitCacheGroup() {
var opcodes = this.updating();
var guard = this[STACKS].cache.pop();
var tag = endTrackFrame();
opcodes.push(new 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 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 = createIteratorItemRef(value);
var memoRef = createIteratorItemRef(memo);
stack.push(valueRef);
stack.push(memoRef);
var state = this.capture(2);
var block = this.elements().pushUpdatableBlock();
var opcode = new 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[INNER_VM].target(offset);
var state = this.capture(0, addr);
var list = this.elements().pushBlockList(updating);
var opcode = new ListBlockOpcode(state, this.runtime, list, updating, iterableRef);
this[STACKS].list.push(opcode);
this.didEnter(opcode);
};
_proto.didEnter = function didEnter(opcode) {
this.associateDestroyable(opcode);
this[DESTROYABLE_STACK].push(opcode);
this.updateWith(opcode);
this.pushUpdating(opcode.children);
};
_proto.exit = function exit() {
this[DESTROYABLE_STACK].pop();
this.elements().popBlock();
this.popUpdating();
};
_proto.exitList = function exitList() {
this.exit();
this[STACKS].list.pop();
};
_proto.pushUpdating = function pushUpdating(list) {
if (list === void 0) {
list = [];
}
this[STACKS].updating.push(list);
};
_proto.popUpdating = function popUpdating() {
return this[STACKS].updating.pop();
};
_proto.updateWith = function updateWith(opcode) {
this.updating().push(opcode);
};
_proto.listBlock = function listBlock() {
return this[STACKS].list.current;
};
_proto.associateDestroyable = function associateDestroyable(child) {
var parent = this[DESTROYABLE_STACK].current;
associateDestroyableChild(parent, child);
};
_proto.tryUpdating = function tryUpdating() {
return this[STACKS].updating.current;
};
_proto.updating = function updating() {
return this[STACKS].updating.current;
};
_proto.elements = function elements() {
return this.elementStack;
};
_proto.scope = function scope() {
return this[STACKS].scope.current;
};
_proto.dynamicScope = function dynamicScope() {
return this[STACKS].dynamicScope.current;
};
_proto.pushChildScope = function pushChildScope() {
this[STACKS].scope.push(this.scope().child());
};
_proto.pushDynamicScope = function pushDynamicScope() {
var child = this.dynamicScope().child();
this[STACKS].dynamicScope.push(child);
return child;
};
_proto.pushRootScope = function pushRootScope(size, owner) {
var scope = PartialScopeImpl.sized(size, owner);
this[STACKS].scope.push(scope);
return scope;
};
_proto.pushScope = function pushScope(scope) {
this[STACKS].scope.push(scope);
};
_proto.popScope = function popScope() {
this[STACKS].scope.pop();
};
_proto.popDynamicScope = function popDynamicScope() {
this[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 (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" + resetTracking() + "\n\n");
}
}
} else {
return this._execute(initialize);
}
};
_proto._execute = function _execute(initialize) {
if (false
/* LOCAL_SHOULD_LOG */
) {
LOCAL_LOGGER.log("EXECUTING FROM " + this[INNER_VM].fetchRegister($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[INNER_VM].nextStatement();
var result;
if (opcode !== null) {
this[INNER_VM].evaluateOuter(opcode, this);
result = {
done: false,
value: null
};
} else {
// Unload the stack
this.stack.reset();
result = {
done: true,
value: new RenderResultImpl(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[INNER_VM].stack;
}
/* Registers */
}, {
key: "pc",
get: function get() {
return this[INNER_VM].fetchRegister($pc);
}
}, {
key: "program",
get: function get() {
return this.runtime.program;
}
}, {
key: "env",
get: function get() {
return this.runtime.env;
}
}]);
return VM;
}();
export { VM as default };
_a = STACKS, _b = 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2FwcGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxTQUFBLEtBQUEsUUFBQSxjQUFBO0FBQ0EsU0FBQSx5QkFBQSxRQUFBLHlCQUFBO0FBd0JBLFNBQUEscUJBQUEsRUFBQSxtQkFBQSxRQUFBLG9CQUFBO0FBT0EsU0FBQSxNQUFBLEVBQUEsWUFBQSxFQUFBLEtBQUEsRUFBQSxZQUFBLFFBQUEsZUFBQTtBQUNBLFNBQUEsZUFBQSxFQUFBLGFBQUEsRUFBQSxhQUFBLFFBQUEsb0JBQUE7QUFDQSxTQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsa0JBQUEsUUFBQSxhQUFBO0FBY0EsU0FBQSx5QkFBQSxRQUFBLHNCQUFBO0FBQ0EsU0FBQSxxQkFBQSxFQUFBLG1CQUFBLEVBQUEsdUJBQUEsUUFBQSx3QkFBQTtBQUtBLFNBQUEsY0FBQSxRQUFBLFlBQUE7QUFDQSxTQUFBLGdCQUFBLFFBQUEsVUFBQTtBQUNBLFNBQUEsSUFBQSxFQUFBLFNBQUEsRUFBQSxpQkFBQSxFQUFBLElBQUEsRUFBQSxRQUFBLEVBQUEsU0FBQSxFQUFBLE1BQUEsUUFBQSxZQUFBO0FBQ0EsU0FBQSxlQUFBLFFBQUEsYUFBQTtBQUVBLE9BQUEsVUFBQSxNQUFBLGFBQUE7QUFDQSxPQUFBLGdCQUFBLE1BQUEsaUJBQUE7QUFDQSxPQUFBLG1CQUFBLE1BQUEsU0FBQTtBQUNBLFNBQUEsZUFBQSxFQUFBLGNBQUEsRUFBQSxvQkFBQSxFQUFBLFNBQUEsUUFBQSxVQUFBOztJQWlGQSxNLEdBQUEsa0JBQUE7QUFDVyxPQUFBLEtBQUEsR0FBUSxJQUFSLEtBQVEsRUFBUjtBQUNBLE9BQUEsWUFBQSxHQUFlLElBQWYsS0FBZSxFQUFmO0FBQ0EsT0FBQSxRQUFBLEdBQVcsSUFBWCxL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QUFQLEtBQUE7QUFDRDtBQUVEOzs7O3dCQUVNO0FBQ0osYUFBTyxLQUFBLFFBQUEsRUFBQSxhQUFBLENBQVAsR0FBTyxDQUFQO0FBaEJtQjs7O3dCQStNVjtBQUNULGFBQU8sS0FBQSxPQUFBLENBQVAsT0FBQTtBQUNEOzs7d0JBRU07QUFDTCxhQUFPLEtBQUEsT0FBQSxDQUFQLEdBQUE7QUFDRDs7Ozs7O1NBck5XLEU7S0FDTSxNLEVBQU0sRUFBQSxHQUdOLGlCOztBQWtlcEIsU0FBQSxPQUFBLENBQUEsRUFBQSxFQUFBLEtBQUEsRUFBQSxZQUFBLEVBQXFFO0FBQ25FLFNBQU87QUFDTCxJQUFBLEVBREssRUFDTCxFQURLO0FBRUwsSUFBQSxLQUZLLEVBRUwsS0FGSztBQUdMLElBQUEsWUFISyxFQUdMLFlBSEs7QUFJTCxJQUFBLEtBQUssRUFBRTtBQUpGLEdBQVA7QUFNRDs7QUFxQkQsU0FBQSxNQUFBLENBQUEsT0FBQSxFQUFzRDtBQUNwRCxTQUFPLFVBQUEsT0FBQSxFQUFBLEtBQUEsRUFBQSxPQUFBO0FBQUEsV0FBNkIsSUFBQSxFQUFBLENBQUEsT0FBQSxFQUFBLEtBQUEsRUFBQSxPQUFBLEVBQXBDLE9BQW9DLENBQTdCO0FBQUEsR0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0R2xvYmFsQ29udGV4dFdhc1NldCB9IGZyb20gJ0BnbGltbWVyL2dsb2JhbC1jb250ZXh0JztcbmltcG9ydCB7XG4gIENvbXBpbGFibGVUZW1wbGF0ZSxcbiAgRGVzdHJveWFibGUsXG4gIER5bmFtaWNTY29wZSxcbiAgRWxlbWVudEJ1aWxkZXIsXG4gIEVudmlyb25tZW50LFxuICBPcHRpb24sXG4gIFBhcnRpYWxTY29wZSxcbiAgUmVuZGVyUmVzdWx0LFxuICBSaWNoSXRlcmF0b3JSZXN1bHQsXG4gIFJ1bnRpbWVDb25zdGFudHMsXG4gIFJ1bnRpbWVDb250ZXh0LFxuICBSdW50aW1lSGVhcCxcbiAgUnVudGltZVByb2dyYW0sXG4gIFNjb3BlLFxuICBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dCxcbiAgVk0gYXMgUHVibGljVk0sXG4gIFJlc29sdXRpb25UaW1lQ29uc3RhbnRzLFxuICBPd25lcixcbiAgVXBkYXRpbmdPcGNvZGUsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTE9DQUxfU0hPVUxEX0xPRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IFJ1bnRpbWVPcEltcGwgfSBmcm9tICdAZ2xpbW1lci9wcm9ncmFtJztcbmltcG9ydCB7XG4gIGNyZWF0ZUl0ZXJhdG9ySXRlbVJlZixcbiAgT3BhcXVlSXRlcmF0aW9uSXRlbSxcbiAgT3BhcXVlSXRlcmF0b3IsXG4gIFJlZmVyZW5jZSxcbiAgVU5ERUZJTkVEX1JFRkVSRU5DRSxcbn0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGFzc2VydCwgZXhwZWN0LCBMT0NBTF9MT0dHRVIsIFN0YWNrLCB1bndyYXBIYW5kbGUgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IGJlZ2luVHJhY2tGcmFtZSwgZW5kVHJhY2tGcmFtZSwgcmVzZXRUcmFja2luZyB9IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQge1xuICAkZnAsXG4gICRwYyxcbiAgJHMwLFxuICAkczEsXG4gICRzcCxcbiAgJHQwLFxuICAkdDEsXG4gICR2MCxcbiAgaXNMb3dMZXZlbFJlZ2lzdGVyLFxuICBNYWNoaW5lUmVnaXN0ZXIsXG4gIFJlZ2lzdGVyLFxuICBTeXNjYWxsUmVnaXN0ZXIsXG59IGZyb20gJ0BnbGltbWVyL3ZtJztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQgfSBmcm9tICdAZ2xpbW1lci9kZXN0cm95YWJsZSc7XG5pbXBvcnQge1xuICBCZWdpblRyYWNrRnJhbWVPcGNvZGUsXG4gIEVuZFRyYWNrRnJhbWVPcGNvZGUsXG4gIEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlLFxufSBmcm9tICcuLi9jb21waWxlZC9vcGNvZGVzL3ZtJztcbmltcG9ydCB7IEFQUEVORF9PUENPREVTLCBEZWJ1Z1N0YXRlIH0gZnJvbSAnLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBQYXJ0aWFsU2NvcGVJbXBsIH0gZnJvbSAnLi4vc2NvcGUnO1xuaW1wb3J0IHsgQVJHUywgQ09OU1RBTlRTLCBERVNUUk9ZQUJMRV9TVEFDSywgSEVBUCwgSU5ORVJfVk0sIFJFR0lTVEVSUywgU1RBQ0tTIH0gZnJvbSAnLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBWTUFyZ3VtZW50c0ltcGwgfSBmcm9tICcuL2FyZ3VtZW50cyc7XG5pbXBvcnQgeyBMaXZlQmxvY2tMaXN0IH0gZnJvbSAnLi9lbGVtZW50LWJ1aWxkZXInO1xuaW1wb3J0IExvd0xldmVsVk0gZnJvbSAnLi9sb3ctbGV2ZWwnO1xuaW1wb3J0IFJlbmRlclJlc3VsdEltcGwgZnJvbSAnLi9yZW5kZXItcmVzdWx0JztcbmltcG9ydCBFdmFsdWF0aW9uU3RhY2tJbXBsLCB7IEV2YWx1YXRpb25TdGFjayB9IGZyb20gJy4vc3RhY2snO1xuaW1wb3J0IHtcbiAgQmxvY2tPcGNvZGUsXG4gIExpc3RCbG9ja09wY29kZSxcbiAgTGlzdEl0ZW1PcGNvZGUsXG4gIFJlc3VtYWJsZVZNU3RhdGUsXG4gIFJlc3VtYWJsZVZNU3RhdGVJbXBsLFxuICBUcnlPcGNvZGUsXG4gIFZNU3RhdGUsXG59IGZyb20gJy4vdXBkYXRlJztcblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGludGVybmFsIG9wY29kZXMsIGFuZCBpcyBtb3JlIHN0YWJsZSB0aGFuXG4gKiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwcGVuZCBWTSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxWTSB7XG4gIHJlYWRvbmx5IFtDT05TVEFOVFNdOiBSdW50aW1lQ29uc3RhbnRzICYgUmVzb2x1dGlvblRpbWVDb25zdGFudHM7XG4gIHJlYWRvbmx5IFtBUkdTXTogVk1Bcmd1bWVudHNJbXBsO1xuXG4gIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnQ7XG4gIHJlYWRvbmx5IHN0YWNrOiBFdmFsdWF0aW9uU3RhY2s7XG4gIHJlYWRvbmx5IHJ1bnRpbWU6IFJ1bnRpbWVDb250ZXh0O1xuICByZWFkb25seSBjb250ZXh0OiBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dDtcblxuICBsb2FkVmFsdWUocmVnaXN0ZXI6IE1hY2hpbmVSZWdpc3RlciwgdmFsdWU6IG51bWJlcik6IHZvaWQ7XG4gIGxvYWRWYWx1ZShyZWdpc3RlcjogUmVnaXN0ZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgbG9hZFZhbHVlKHJlZ2lzdGVyOiBSZWdpc3RlciB8IE1hY2hpbmVSZWdpc3RlciwgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuXG4gIGZldGNoVmFsdWUocmVnaXN0ZXI6IE1hY2hpbmVSZWdpc3Rlci5yYSB8IE1hY2hpbmVSZWdpc3Rlci5wYyk6IG51bWJlcjtcbiAgLy8gVE9ETzogU29tZXRoaW5nIGJldHRlciB0aGFuIGEgdHlwZSBhc3NlcnRpb24/XG4gIGZldGNoVmFsdWU8VD4ocmVnaXN0ZXI6IFJlZ2lzdGVyKTogVDtcbiAgZmV0Y2hWYWx1ZShyZWdpc3RlcjogUmVnaXN0ZXIpOiB1bmtub3duO1xuXG4gIGxvYWQocmVnaXN0ZXI6IFJlZ2lzdGVyKTogdm9pZDtcbiAgZmV0Y2gocmVnaXN0ZXI6IFJlZ2lzdGVyKTogdm9pZDtcblxuICBjb21waWxlKGJsb2NrOiBDb21waWxhYmxlVGVtcGxhdGUpOiBudW1iZXI7XG5cbiAgc2NvcGUoKTogU2NvcGU7XG4gIGVsZW1lbnRzKCk6IEVsZW1lbnRCdWlsZGVyO1xuXG4gIGdldE93bmVyKCk6IE93bmVyO1xuICBnZXRTZWxmKCk6IFJlZmVyZW5jZTtcblxuICB1cGRhdGVXaXRoKG9wY29kZTogVXBkYXRpbmdPcGNvZGUpOiB2b2lkO1xuXG4gIGFzc29jaWF0ZURlc3Ryb3lhYmxlKGQ6IERlc3Ryb3lhYmxlKTogdm9pZDtcblxuICBiZWdpbkNhY2hlR3JvdXAobmFtZT86IHN0cmluZyk6IHZvaWQ7XG4gIGNvbW1pdENhY2hlR3JvdXAoKTogdm9pZDtcblxuICAvLy8gSXRlcmF0aW9uIC8vL1xuXG4gIGVudGVyTGlzdChpdGVyYWJsZVJlZjogUmVmZXJlbmNlPE9wYXF1ZUl0ZXJhdG9yPiwgb2Zmc2V0OiBudW1iZXIpOiB2b2lkO1xuICBleGl0TGlzdCgpOiB2b2lkO1xuICBlbnRlckl0ZW0oaXRlbTogT3BhcXVlSXRlcmF0aW9uSXRlbSk6IExpc3RJdGVtT3Bjb2RlO1xuICByZWdpc3Rlckl0ZW0oaXRlbTogTGlzdEl0ZW1PcGNvZGUpOiB2b2lkO1xuXG4gIHB1c2hSb290U2NvcGUoc2l6ZTogbnVtYmVyLCBvd25lcjogT3duZXIpOiBQYXJ0aWFsU2NvcGU7XG4gIHB1c2hDaGlsZFNjb3BlKCk6IHZvaWQ7XG4gIHBvcFNjb3BlKCk6IHZvaWQ7XG4gIHB1c2hTY29wZShzY29wZTogU2NvcGUpOiB2b2lkO1xuXG4gIGR5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGU7XG4gIGJpbmREeW5hbWljU2NvcGUobmFtZXM6IHN0cmluZ1tdKTogdm9pZDtcbiAgcHVzaER5bmFtaWNTY29wZSgpOiB2b2lkO1xuICBwb3BEeW5hbWljU2NvcGUoKTogdm9pZDtcblxuICBlbnRlcihhcmdzOiBudW1iZXIpOiB2b2lkO1xuICBleGl0KCk6IHZvaWQ7XG5cbiAgZ290byhwYzogbnVtYmVyKTogdm9pZDtcbiAgY2FsbChoYW5kbGU6IG51bWJlcik6IHZvaWQ7XG4gIHB1c2hGcmFtZSgpOiB2b2lkO1xuXG4gIHJlZmVyZW5jZUZvclN5bWJvbChzeW1ib2w6IG51bWJlcik6IFJlZmVyZW5jZTtcblxuICBleGVjdXRlKGluaXRpYWxpemU/OiAodm06IHRoaXMpID0+IHZvaWQpOiBSZW5kZXJSZXN1bHQ7XG4gIHB1c2hVcGRhdGluZyhsaXN0PzogVXBkYXRpbmdPcGNvZGVbXSk6IHZvaWQ7XG4gIG5leHQoKTogUmljaEl0ZXJhdG9yUmVzdWx0PG51bGwsIFJlbmRlclJlc3VsdD47XG59XG5cbmNsYXNzIFN0YWNrcyB7XG4gIHJlYWRvbmx5IHNjb3BlID0gbmV3IFN0YWNrPFNjb3BlPigpO1xuICByZWFkb25seSBkeW5hbWljU2NvcGUgPSBuZXcgU3RhY2s8RHluYW1pY1Njb3BlPigpO1xuICByZWFkb25seSB1cGRhdGluZyA9IG5ldyBTdGFjazxVcGRhdGluZ09wY29kZVtdPigpO1xuICByZWFkb25seSBjYWNoZSA9IG5ldyBTdGFjazxKdW1wSWZOb3RNb2RpZmllZE9wY29kZT4oKTtcbiAgcmVhZG9ubHkgbGlzdCA9IG5ldyBTdGFjazxMaXN0QmxvY2tPcGNvZGU+KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZNIGltcGxlbWVudHMgUHVibGljVk0sIEludGVybmFsVk0ge1xuICBwcml2YXRlIHJlYWRvbmx5IFtTVEFDS1NdID0gbmV3IFN0YWNrcygpO1xuICBwcml2YXRlIHJlYWRvbmx5IFtIRUFQXTogUnVudGltZUhlYXA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJ1Y3Rvcjogb2JqZWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IFtERVNUUk9ZQUJMRV9TVEFDS10gPSBuZXcgU3RhY2s8b2JqZWN0PigpO1xuICByZWFkb25seSBbQ09OU1RBTlRTXTogUnVudGltZUNvbnN0YW50cyAmIFJlc29sdXRpb25UaW1lQ29uc3RhbnRzO1xuICByZWFkb25seSBbQVJHU106IFZNQXJndW1lbnRzSW1wbDtcbiAgcmVhZG9ubHkgW0lOTkVSX1ZNXTogTG93TGV2ZWxWTTtcblxuICBnZXQgc3RhY2soKTogRXZhbHVhdGlvblN0YWNrIHtcbiAgICByZXR1cm4gdGhpc1tJTk5FUl9WTV0uc3RhY2sgYXMgRXZhbHVhdGlvblN0YWNrO1xuICB9XG5cbiAgLyogUmVnaXN0ZXJzICovXG5cbiAgZ2V0IHBjKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXNbSU5ORVJfVk1dLmZldGNoUmVnaXN0ZXIoJHBjKTtcbiAgfVxuXG4gIHB1YmxpYyBzMDogdW5rbm93biA9IG51bGw7XG4gIHB1YmxpYyBzMTogdW5rbm93biA9IG51bGw7XG4gIHB1YmxpYyB0MDogdW5rbm93biA9IG51bGw7XG4gIHB1YmxpYyB0MTogdW5rbm93biA9IG51bGw7XG4gIHB1YmxpYyB2MDogdW5rbm93biA9IG51bGw7XG5cbiAgLy8gRmV0Y2ggYSB2YWx1ZSBmcm9tIGEgcmVnaXN0ZXIgb250byB0aGUgc3RhY2tcbiAgZmV0Y2gocmVnaXN0ZXI6IFN5c2NhbGxSZWdpc3Rlcik6IHZvaWQge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuZmV0Y2hWYWx1ZShyZWdpc3Rlcik7XG5cbiAgICB0aGlzLnN0YWNrLnB1c2godmFsdWUpO1xuICB9XG5cbiAgLy8gTG9hZCBhIHZhbHVlIGZyb20gdGhlIHN0YWNrIGludG8gYSByZWdpc3RlclxuICBsb2FkKHJlZ2lzdGVyOiBTeXNjYWxsUmVnaXN0ZXIpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnN0YWNrLnBvcCgpO1xuXG4gICAgdGhpcy5sb2FkVmFsdWUocmVnaXN0ZXIsIHZhbHVlKTtcbiAgfVxuXG4gIC8vIEZldGNoIGEgdmFsdWUgZnJvbSBhIHJlZ2lzdGVyXG4gIGZldGNoVmFsdWUocmVnaXN0ZXI6IE1hY2hpbmVSZWdpc3Rlcik6IG51bWJlcjtcbiAgZmV0Y2hWYWx1ZTxUPihyZWdpc3RlcjogUmVnaXN0ZXIpOiBUO1xuICBmZXRjaFZhbHVlKHJlZ2lzdGVyOiBSZWdpc3RlciB8IE1hY2hpbmVSZWdpc3Rlcik6IHVua25vd24ge1xuICAgIGlmIChpc0xvd0xldmVsUmVnaXN0ZXIocmVnaXN0ZXIpKSB7XG4gICAgICByZXR1cm4gdGhpc1tJTk5FUl9WTV0uZmV0Y2hSZWdpc3RlcihyZWdpc3Rlcik7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZWdpc3Rlcikge1xuICAgICAgY2FzZSAkczA6XG4gICAgICAgIHJldHVybiB0aGlzLnMwO1xuICAgICAgY2FzZSAkczE6XG4gICAgICAgIHJldHVybiB0aGlzLnMxO1xuICAgICAgY2FzZSAkdDA6XG4gICAgICAgIHJldHVybiB0aGlzLnQwO1xuICAgICAgY2FzZSAkdDE6XG4gICAgICAgIHJldHVybiB0aGlzLnQxO1xuICAgICAgY2FzZSAkdjA6XG4gICAgICAgIHJldHVybiB0aGlzLnYwO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgYSB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXJcblxuICBsb2FkVmFsdWU8VD4ocmVnaXN0ZXI6IFJlZ2lzdGVyIHwgTWFjaGluZVJlZ2lzdGVyLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIGlmIChpc0xvd0xldmVsUmVnaXN0ZXIocmVnaXN0ZXIpKSB7XG4gICAgICB0aGlzW0lOTkVSX1ZNXS5sb2FkUmVnaXN0ZXIocmVnaXN0ZXIsICh2YWx1ZSBhcyBhbnkpIGFzIG51bWJlcik7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZWdpc3Rlcikge1xuICAgICAgY2FzZSAkczA6XG4gICAgICAgIHRoaXMuczAgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICRzMTpcbiAgICAgICAgdGhpcy5zMSA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJHQwOlxuICAgICAgICB0aGlzLnQwID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAkdDE6XG4gICAgICAgIHRoaXMudDEgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICR2MDpcbiAgICAgICAgdGhpcy52MCA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZWQgdG8gSW5uZXJcbiAgICovXG5cbiAgLy8gU3RhcnQgYSBuZXcgZnJhbWUgYW5kIHNhdmUgJHJhIGFuZCAkZnAgb24gdGhlIHN0YWNrXG4gIHB1c2hGcmFtZSgpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5wdXNoRnJhbWUoKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgJHJhLCAkc3AgYW5kICRmcFxuICBwb3BGcmFtZSgpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5wb3BGcmFtZSgpO1xuICB9XG5cbiAgLy8gSnVtcCB0byBhbiBhZGRyZXNzIGluIGBwcm9ncmFtYFxuICBnb3RvKG9mZnNldDogbnVtYmVyKSB7XG4gICAgdGhpc1tJTk5FUl9WTV0uZ290byhvZmZzZXQpO1xuICB9XG5cbiAgLy8gU2F2ZSAkcGMgaW50byAkcmEsIHRoZW4ganVtcCB0byBhIG5ldyBhZGRyZXNzIGluIGBwcm9ncmFtYCAoamFsIGluIE1JUFMpXG4gIGNhbGwoaGFuZGxlOiBudW1iZXIpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5jYWxsKGhhbmRsZSk7XG4gIH1cblxuICAvLyBQdXQgYSBzcGVjaWZpYyBgcHJvZ3JhbWAgYWRkcmVzcyBpbiAkcmFcbiAgcmV0dXJuVG8ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5yZXR1cm5UbyhvZmZzZXQpO1xuICB9XG5cbiAgLy8gUmV0dXJuIHRvIHRoZSBgcHJvZ3JhbWAgYWRkcmVzcyBzdG9yZWQgaW4gJHJhXG4gIHJldHVybigpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5yZXR1cm4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgb2YgbWlncmF0ZWQuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHJ1bnRpbWU6IFJ1bnRpbWVDb250ZXh0LFxuICAgIHsgcGMsIHNjb3BlLCBkeW5hbWljU2NvcGUsIHN0YWNrIH06IFZNU3RhdGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50U3RhY2s6IEVsZW1lbnRCdWlsZGVyLFxuICAgIHJlYWRvbmx5IGNvbnRleHQ6IENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0XG4gICkge1xuICAgIGlmIChERUJVRykge1xuICAgICAgYXNzZXJ0R2xvYmFsQ29udGV4dFdhc1NldCEoKTtcbiAgICB9XG5cbiAgICBsZXQgZXZhbFN0YWNrID0gRXZhbHVhdGlvblN0YWNrSW1wbC5yZXN0b3JlKHN0YWNrKTtcblxuICAgIGFzc2VydCh0eXBlb2YgcGMgPT09ICdudW1iZXInLCAncGMgaXMgYSBudW1iZXInKTtcblxuICAgIGV2YWxTdGFja1tSRUdJU1RFUlNdWyRwY10gPSBwYztcbiAgICBldmFsU3RhY2tbUkVHSVNURVJTXVskc3BdID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICBldmFsU3RhY2tbUkVHSVNURVJTXVskZnBdID0gLTE7XG5cbiAgICB0aGlzW0hFQVBdID0gdGhpcy5wcm9ncmFtLmhlYXA7XG4gICAgdGhpc1tDT05TVEFOVFNdID0gdGhpcy5wcm9ncmFtLmNvbnN0YW50cztcbiAgICB0aGlzLmVsZW1lbnRTdGFjayA9IGVsZW1lbnRTdGFjaztcbiAgICB0aGlzW1NUQUNLU10uc2NvcGUucHVzaChzY29wZSk7XG4gICAgdGhpc1tTVEFDS1NdLmR5bmFtaWNTY29wZS5wdXNoKGR5bmFtaWNTY29wZSk7XG4gICAgdGhpc1tBUkdTXSA9IG5ldyBWTUFyZ3VtZW50c0ltcGwoKTtcbiAgICB0aGlzW0lOTkVSX1ZNXSA9IG5ldyBMb3dMZXZlbFZNKFxuICAgICAgZXZhbFN0YWNrLFxuICAgICAgdGhpc1tIRUFQXSxcbiAgICAgIHJ1bnRpbWUucHJvZ3JhbSxcbiAgICAgIHtcbiAgICAgICAgZGVidWdCZWZvcmU6IChvcGNvZGU6IFJ1bnRpbWVPcEltcGwpOiBEZWJ1Z1N0YXRlID0+IHtcbiAgICAgICAgICByZXR1cm4gQVBQRU5EX09QQ09ERVMuZGVidWdCZWZvcmUodGhpcywgb3Bjb2RlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBkZWJ1Z0FmdGVyOiAoc3RhdGU6IERlYnVnU3RhdGUpOiB2b2lkID0+IHtcbiAgICAgICAgICBBUFBFTkRfT1BDT0RFUy5kZWJ1Z0FmdGVyKHRoaXMsIHN0YXRlKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBldmFsU3RhY2tbUkVHSVNURVJTXVxuICAgICk7XG5cbiAgICB0aGlzLmRlc3RydWN0b3IgPSB7fTtcbiAgICB0aGlzW0RFU1RST1lBQkxFX1NUQUNLXS5wdXNoKHRoaXMuZGVzdHJ1Y3Rvcik7XG4gIH1cblxuICBzdGF0aWMgaW5pdGlhbChcbiAgICBydW50aW1lOiBSdW50aW1lQ29udGV4dCxcbiAgICBjb250ZXh0OiBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dCxcbiAgICB7IGhhbmRsZSwgc2VsZiwgZHluYW1pY1Njb3BlLCB0cmVlQnVpbGRlciwgbnVtU3ltYm9scywgb3duZXIgfTogSW5pdE9wdGlvbnNcbiAgKSB7XG4gICAgbGV0IHNjb3BlID0gUGFydGlhbFNjb3BlSW1wbC5yb290KHNlbGYsIG51bVN5bWJvbHMsIG93bmVyKTtcbiAgICBsZXQgc3RhdGUgPSB2bVN0YXRlKHJ1bnRpbWUucHJvZ3JhbS5oZWFwLmdldGFkZHIoaGFuZGxlKSwgc2NvcGUsIGR5bmFtaWNTY29wZSk7XG4gICAgbGV0IHZtID0gaW5pdFZNKGNvbnRleHQpKHJ1bnRpbWUsIHN0YXRlLCB0cmVlQnVpbGRlcik7XG4gICAgdm0ucHVzaFVwZGF0aW5nKCk7XG4gICAgcmV0dXJuIHZtO1xuICB9XG5cbiAgc3RhdGljIGVtcHR5KFxuICAgIHJ1bnRpbWU6IFJ1bnRpbWVDb250ZXh0LFxuICAgIHsgaGFuZGxlLCB0cmVlQnVpbGRlciwgZHluYW1pY1Njb3BlLCBvd25lciB9OiBNaW5pbWFsSW5pdE9wdGlvbnMsXG4gICAgY29udGV4dDogQ29tcGlsZVRpbWVDb21waWxhdGlvbkNvbnRleHRcbiAgKSB7XG4gICAgbGV0IHZtID0gaW5pdFZNKGNvbnRleHQpKFxuICAgICAgcnVudGltZSxcbiAgICAgIHZtU3RhdGUoXG4gICAgICAgIHJ1bnRpbWUucHJvZ3JhbS5oZWFwLmdldGFkZHIoaGFuZGxlKSxcbiAgICAgICAgUGFydGlhbFNjb3BlSW1wbC5yb290KFVOREVGSU5FRF9SRUZFUkVOQ0UsIDAsIG93bmVyKSxcbiAgICAgICAgZHluYW1pY1Njb3BlXG4gICAgICApLFxuICAgICAgdHJlZUJ1aWxkZXJcbiAgICApO1xuICAgIHZtLnB1c2hVcGRhdGluZygpO1xuICAgIHJldHVybiB2bTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdW1lOiBWbUluaXRDYWxsYmFjayA9IGluaXRWTSh0aGlzLmNvbnRleHQpO1xuXG4gIGNvbXBpbGUoYmxvY2s6IENvbXBpbGFibGVUZW1wbGF0ZSk6IG51bWJlciB7XG4gICAgbGV0IGhhbmRsZSA9IHVud3JhcEhhbmRsZShibG9jay5jb21waWxlKHRoaXMuY29udGV4dCkpO1xuXG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfVxuXG4gIGdldCBwcm9ncmFtKCk6IFJ1bnRpbWVQcm9ncmFtIHtcbiAgICByZXR1cm4gdGhpcy5ydW50aW1lLnByb2dyYW07XG4gIH1cblxuICBnZXQgZW52KCk6IEVudmlyb25tZW50IHtcbiAgICByZXR1cm4gdGhpcy5ydW50aW1lLmVudjtcbiAgfVxuXG4gIGNhcHR1cmVTdGF0ZShhcmdzOiBudW1iZXIsIHBjID0gdGhpc1tJTk5FUl9WTV0uZmV0Y2hSZWdpc3RlcigkcGMpKTogVk1TdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBjLFxuICAgICAgc2NvcGU6IHRoaXMuc2NvcGUoKSxcbiAgICAgIGR5bmFtaWNTY29wZTogdGhpcy5keW5hbWljU2NvcGUoKSxcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLmNhcHR1cmUoYXJncyksXG4gICAgfTtcbiAgfVxuXG4gIGNhcHR1cmUoYXJnczogbnVtYmVyLCBwYyA9IHRoaXNbSU5ORVJfVk1dLmZldGNoUmVnaXN0ZXIoJHBjKSk6IFJlc3VtYWJsZVZNU3RhdGUge1xuICAgIHJldHVybiBuZXcgUmVzdW1hYmxlVk1TdGF0ZUltcGwodGhpcy5jYXB0dXJlU3RhdGUoYXJncywgcGMpLCB0aGlzLnJlc3VtZSk7XG4gIH1cblxuICBiZWdpbkNhY2hlR3JvdXAobmFtZT86IHN0cmluZykge1xuICAgIGxldCBvcGNvZGVzID0gdGhpcy51cGRhdGluZygpO1xuICAgIGxldCBndWFyZCA9IG5ldyBKdW1wSWZOb3RNb2RpZmllZE9wY29kZSgpO1xuXG4gICAgb3Bjb2Rlcy5wdXNoKGd1YXJkKTtcbiAgICBvcGNvZGVzLnB1c2gobmV3IEJlZ2luVHJhY2tGcmFtZU9wY29kZShuYW1lKSk7XG4gICAgdGhpc1tTVEFDS1NdLmNhY2hlLnB1c2goZ3VhcmQpO1xuXG4gICAgYmVnaW5UcmFja0ZyYW1lKG5hbWUpO1xuICB9XG5cbiAgY29tbWl0Q2FjaGVHcm91cCgpIHtcbiAgICBsZXQgb3Bjb2RlcyA9IHRoaXMudXBkYXRpbmcoKTtcbiAgICBsZXQgZ3VhcmQgPSBleHBlY3QodGhpc1tTVEFDS1NdLmNhY2hlLnBvcCgpLCAnVk0gQlVHOiBFeHBlY3RlZCBhIGNhY2hlIGdyb3VwJyk7XG5cbiAgICBsZXQgdGFnID0gZW5kVHJhY2tGcmFtZSgpO1xuICAgIG9wY29kZXMucHVzaChuZXcgRW5kVHJhY2tGcmFtZU9wY29kZShndWFyZCkpO1xuXG4gICAgZ3VhcmQuZmluYWxpemUodGFnLCBvcGNvZGVzLmxlbmd0aCk7XG4gIH1cblxuICBlbnRlcihhcmdzOiBudW1iZXIpIHtcbiAgICBsZXQgdXBkYXRpbmc6IFVwZGF0aW5nT3Bjb2RlW10gPSBbXTtcblxuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2FwdHVyZShhcmdzKTtcbiAgICBsZXQgYmxvY2sgPSB0aGlzLmVsZW1lbnRzKCkucHVzaFVwZGF0YWJsZUJsb2NrKCk7XG5cbiAgICBsZXQgdHJ5T3Bjb2RlID0gbmV3IFRyeU9wY29kZShzdGF0ZSwgdGhpcy5ydW50aW1lLCBibG9jaywgdXBkYXRpbmcpO1xuXG4gICAgdGhpcy5kaWRFbnRlcih0cnlPcGNvZGUpO1xuICB9XG5cbiAgZW50ZXJJdGVtKHsga2V5LCB2YWx1ZSwgbWVtbyB9OiBPcGFxdWVJdGVyYXRpb25JdGVtKTogTGlzdEl0ZW1PcGNvZGUge1xuICAgIGxldCB7IHN0YWNrIH0gPSB0aGlzO1xuXG4gICAgbGV0IHZhbHVlUmVmID0gY3JlYXRlSXRlcmF0b3JJdGVtUmVmKHZhbHVlKTtcbiAgICBsZXQgbWVtb1JlZiA9IGNyZWF0ZUl0ZXJhdG9ySXRlbVJlZihtZW1vKTtcblxuICAgIHN0YWNrLnB1c2godmFsdWVSZWYpO1xuICAgIHN0YWNrLnB1c2gobWVtb1JlZik7XG5cbiAgICBsZXQgc3RhdGUgPSB0aGlzLmNhcHR1cmUoMik7XG4gICAgbGV0IGJsb2NrID0gdGhpcy5lbGVtZW50cygpLnB1c2hVcGRhdGFibGVCbG9jaygpO1xuXG4gICAgbGV0IG9wY29kZSA9IG5ldyBMaXN0SXRlbU9wY29kZShzdGF0ZSwgdGhpcy5ydW50aW1lLCBibG9jaywga2V5LCBtZW1vUmVmLCB2YWx1ZVJlZik7XG4gICAgdGhpcy5kaWRFbnRlcihvcGNvZGUpO1xuXG4gICAgcmV0dXJuIG9wY29kZTtcbiAgfVxuXG4gIHJlZ2lzdGVySXRlbShvcGNvZGU6IExpc3RJdGVtT3Bjb2RlKSB7XG4gICAgdGhpcy5saXN0QmxvY2soKS5pbml0aWFsaXplQ2hpbGQob3Bjb2RlKTtcbiAgfVxuXG4gIGVudGVyTGlzdChpdGVyYWJsZVJlZjogUmVmZXJlbmNlPE9wYXF1ZUl0ZXJhdG9yPiwgb2Zmc2V0OiBudW1iZXIpIHtcbiAgICBsZXQgdXBkYXRpbmc6IExpc3RJdGVtT3Bjb2RlW10gPSBbXTtcblxuICAgIGxldCBhZGRyID0gdGhpc1tJTk5FUl9WTV0udGFyZ2V0KG9mZnNldCk7XG4gICAgbGV0IHN0YXRlID0gdGhpcy5jYXB0dXJlKDAsIGFkZHIpO1xuICAgIGxldCBsaXN0ID0gdGhpcy5lbGVtZW50cygpLnB1c2hCbG9ja0xpc3QodXBkYXRpbmcpIGFzIExpdmVCbG9ja0xpc3Q7XG5cbiAgICBsZXQgb3Bjb2RlID0gbmV3IExpc3RCbG9ja09wY29kZShzdGF0ZSwgdGhpcy5ydW50aW1lLCBsaXN0LCB1cGRhdGluZywgaXRlcmFibGVSZWYpO1xuXG4gICAgdGhpc1tTVEFDS1NdLmxpc3QucHVzaChvcGNvZGUpO1xuXG4gICAgdGhpcy5kaWRFbnRlcihvcGNvZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaWRFbnRlcihvcGNvZGU6IEJsb2NrT3Bjb2RlKSB7XG4gICAgdGhpcy5hc3NvY2lhdGVEZXN0cm95YWJsZShvcGNvZGUpO1xuICAgIHRoaXNbREVTVFJPWUFCTEVfU1RBQ0tdLnB1c2gob3Bjb2RlKTtcbiAgICB0aGlzLnVwZGF0ZVdpdGgob3Bjb2RlKTtcbiAgICB0aGlzLnB1c2hVcGRhdGluZyhvcGNvZGUuY2hpbGRyZW4pO1xuICB9XG5cbiAgZXhpdCgpIHtcbiAgICB0aGlzW0RFU1RST1lBQkxFX1NUQUNLXS5wb3AoKTtcbiAgICB0aGlzLmVsZW1lbnRzKCkucG9wQmxvY2soKTtcbiAgICB0aGlzLnBvcFVwZGF0aW5nKCk7XG4gIH1cblxuICBleGl0TGlzdCgpIHtcbiAgICB0aGlzLmV4aXQoKTtcbiAgICB0aGlzW1NUQUNLU10ubGlzdC5wb3AoKTtcbiAgfVxuXG4gIHB1c2hVcGRhdGluZyhsaXN0OiBVcGRhdGluZ09wY29kZVtdID0gW10pOiB2b2lkIHtcbiAgICB0aGlzW1NUQUNLU10udXBkYXRpbmcucHVzaChsaXN0KTtcbiAgfVxuXG4gIHBvcFVwZGF0aW5nKCk6IFVwZGF0aW5nT3Bjb2RlW10ge1xuICAgIHJldHVybiBleHBlY3QodGhpc1tTVEFDS1NdLnVwZGF0aW5nLnBvcCgpLCBcImNhbid0IHBvcCBhbiBlbXB0eSBzdGFja1wiKTtcbiAgfVxuXG4gIHVwZGF0ZVdpdGgob3Bjb2RlOiBVcGRhdGluZ09wY29kZSkge1xuICAgIHRoaXMudXBkYXRpbmcoKS5wdXNoKG9wY29kZSk7XG4gIH1cblxuICBsaXN0QmxvY2soKTogTGlzdEJsb2NrT3Bjb2RlIHtcbiAgICByZXR1cm4gZXhwZWN0KHRoaXNbU1RBQ0tTXS5saXN0LmN1cnJlbnQsICdleHBlY3RlZCBhIGxpc3QgYmxvY2snKTtcbiAgfVxuXG4gIGFzc29jaWF0ZURlc3Ryb3lhYmxlKGNoaWxkOiBEZXN0cm95YWJsZSk6IHZvaWQge1xuICAgIGxldCBwYXJlbnQgPSBleHBlY3QodGhpc1tERVNUUk9ZQUJMRV9TVEFDS10uY3VycmVudCwgJ0V4cGVjdGVkIGRlc3RydWN0b3IgcGFyZW50Jyk7XG4gICAgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZChwYXJlbnQsIGNoaWxkKTtcbiAgfVxuXG4gIHRyeVVwZGF0aW5nKCk6IE9wdGlvbjxVcGRhdGluZ09wY29kZVtdPiB7XG4gICAgcmV0dXJuIHRoaXNbU1RBQ0tTXS51cGRhdGluZy5jdXJyZW50O1xuICB9XG5cbiAgdXBkYXRpbmcoKTogVXBkYXRpbmdPcGNvZGVbXSB7XG4gICAgcmV0dXJuIGV4cGVjdChcbiAgICAgIHRoaXNbU1RBQ0tTXS51cGRhdGluZy5jdXJyZW50LFxuICAgICAgJ2V4cGVjdGVkIHVwZGF0aW5nIG9wY29kZSBvbiB0aGUgdXBkYXRpbmcgb3Bjb2RlIHN0YWNrJ1xuICAgICk7XG4gIH1cblxuICBlbGVtZW50cygpOiBFbGVtZW50QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFN0YWNrO1xuICB9XG5cbiAgc2NvcGUoKTogU2NvcGUge1xuICAgIHJldHVybiBleHBlY3QodGhpc1tTVEFDS1NdLnNjb3BlLmN1cnJlbnQsICdleHBlY3RlZCBzY29wZSBvbiB0aGUgc2NvcGUgc3RhY2snKTtcbiAgfVxuXG4gIGR5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGUge1xuICAgIHJldHVybiBleHBlY3QoXG4gICAgICB0aGlzW1NUQUNLU10uZHluYW1pY1Njb3BlLmN1cnJlbnQsXG4gICAgICAnZXhwZWN0ZWQgZHluYW1pYyBzY29wZSBvbiB0aGUgZHluYW1pYyBzY29wZSBzdGFjaydcbiAgICApO1xuICB9XG5cbiAgcHVzaENoaWxkU2NvcGUoKSB7XG4gICAgdGhpc1tTVEFDS1NdLnNjb3BlLnB1c2godGhpcy5zY29wZSgpLmNoaWxkKCkpO1xuICB9XG5cbiAgcHVzaER5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGUge1xuICAgIGxldCBjaGlsZCA9IHRoaXMuZHluYW1pY1Njb3BlKCkuY2hpbGQoKTtcbiAgICB0aGlzW1NUQUNLU10uZHluYW1pY1Njb3BlLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHB1c2hSb290U2NvcGUoc2l6ZTogbnVtYmVyLCBvd25lcjogT3duZXIpOiBQYXJ0aWFsU2NvcGUge1xuICAgIGxldCBzY29wZSA9IFBhcnRpYWxTY29wZUltcGwuc2l6ZWQoc2l6ZSwgb3duZXIpO1xuICAgIHRoaXNbU1RBQ0tTXS5zY29wZS5wdXNoKHNjb3BlKTtcbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cblxuICBwdXNoU2NvcGUoc2NvcGU6IFNjb3BlKSB7XG4gICAgdGhpc1tTVEFDS1NdLnNjb3BlLnB1c2goc2NvcGUpO1xuICB9XG5cbiAgcG9wU2NvcGUoKSB7XG4gICAgdGhpc1tTVEFDS1NdLnNjb3BlLnBvcCgpO1xuICB9XG5cbiAgcG9wRHluYW1pY1Njb3BlKCkge1xuICAgIHRoaXNbU1RBQ0tTXS5keW5hbWljU2NvcGUucG9wKCk7XG4gIH1cblxuICAvLy8gU0NPUEUgSEVMUEVSU1xuXG4gIGdldE93bmVyKCk6IE93bmVyIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZSgpLm93bmVyO1xuICB9XG5cbiAgZ2V0U2VsZigpOiBSZWZlcmVuY2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGUoKS5nZXRTZWxmKCk7XG4gIH1cblxuICByZWZlcmVuY2VGb3JTeW1ib2woc3ltYm9sOiBudW1iZXIpOiBSZWZlcmVuY2Uge1xuICAgIHJldHVybiB0aGlzLnNjb3BlKCkuZ2V0U3ltYm9sKHN5bWJvbCk7XG4gIH1cblxuICAvLy8gRVhFQ1VUSU9OXG5cbiAgZXhlY3V0ZShpbml0aWFsaXplPzogKHZtOiB0aGlzKSA9PiB2b2lkKTogUmVuZGVyUmVzdWx0IHtcbiAgICBpZiAoREVCVUcpIHtcbiAgICAgIGxldCBoYXNFcnJvcmVkID0gdHJ1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX2V4ZWN1dGUoaW5pdGlhbGl6ZSk7XG5cbiAgICAgICAgLy8gdXNpbmcgYSBib29sZWFuIGhlcmUgdG8gYXZvaWQgYnJlYWtpbmcgZXJnb25vbWljcyBvZiBcInBhdXNlIG9uIHVuY2F1Z2h0IGV4Y2VwdGlvbnNcIlxuICAgICAgICAvLyB3aGljaCB3b3VsZCBoYXBwZW4gd2l0aCBhIGBjYXRjaGAgKyBgdGhyb3dgXG4gICAgICAgIGhhc0Vycm9yZWQgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoaGFzRXJyb3JlZCkge1xuICAgICAgICAgIC8vIElmIGFueSBleGlzdGluZyBibG9ja3MgYXJlIG9wZW4sIGR1ZSB0byBhbiBlcnJvciBvciBzb21ldGhpbmcgbGlrZVxuICAgICAgICAgIC8vIHRoYXQsIHdlIG5lZWQgdG8gY2xvc2UgdGhlbSBhbGwgYW5kIGNsZWFuIHRoaW5ncyB1cCBwcm9wZXJseS5cbiAgICAgICAgICBsZXQgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzKCk7XG5cbiAgICAgICAgICB3aGlsZSAoZWxlbWVudHMuaGFzQmxvY2tzKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wb3BCbG9jaygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgXFxuXFxuRXJyb3Igb2NjdXJyZWQ6XFxuXFxuJHtyZXNldFRyYWNraW5nKCl9XFxuXFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGUoaW5pdGlhbGl6ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXhlY3V0ZShpbml0aWFsaXplPzogKHZtOiB0aGlzKSA9PiB2b2lkKTogUmVuZGVyUmVzdWx0IHtcbiAgICBp