@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
324 lines (269 loc) • 30.9 kB
JavaScript
;
var _reference = require("@glimmer/reference");
var _vm = require("@glimmer/vm");
var _opcodes = require("../../opcodes");
var _concat = require("../expressions/concat");
var _destroyable = require("@glimmer/destroyable");
var _util = require("@glimmer/util");
var _globalContext = require("@glimmer/global-context");
var _symbols = require("../../symbols");
var _env = require("@glimmer/env");
var _curryValue = _interopRequireDefault(require("../../references/curry-value"));
var _curriedValue = require("../../curried-value");
var _arguments = require("../../vm/arguments");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_opcodes.APPEND_OPCODES.add(77
/* Curry */
, (vm, {
op1: type,
op2: _isStrict
}) => {
let stack = vm.stack;
let definition = stack.pop();
let capturedArgs = stack.pop();
let owner = vm.getOwner();
let resolver = vm.runtime.resolver;
let isStrict = false;
if (_env.DEBUG) {
// strict check only happens in DEBUG builds, no reason to load it otherwise
isStrict = vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(_isStrict));
}
vm.loadValue(_vm.$v0, (0, _curryValue.default)(type, definition, owner, capturedArgs, resolver, isStrict));
});
_opcodes.APPEND_OPCODES.add(107
/* DynamicHelper */
, vm => {
let stack = vm.stack;
let ref = stack.pop();
let args = stack.pop().capture();
let helperRef;
let initialOwner = vm.getOwner();
let helperInstanceRef = (0, _reference.createComputeRef)(() => {
if (helperRef !== undefined) {
(0, _destroyable.destroy)(helperRef);
}
let definition = (0, _reference.valueForRef)(ref);
if ((0, _curriedValue.isCurriedType)(definition, 1
/* Helper */
)) {
let {
definition: resolvedDef,
owner,
positional,
named
} = (0, _curriedValue.resolveCurriedValue)(definition);
let helper = resolveHelper(vm[_symbols.CONSTANTS], resolvedDef, ref);
if (named !== undefined) {
args.named = (0, _util.assign)({}, ...named, args.named);
}
if (positional !== undefined) {
args.positional = positional.concat(args.positional);
}
helperRef = helper(args, owner);
(0, _destroyable.associateDestroyableChild)(helperInstanceRef, helperRef);
} else if ((0, _util.isObject)(definition)) {
let helper = resolveHelper(vm[_symbols.CONSTANTS], definition, ref);
helperRef = helper(args, initialOwner);
if ((0, _destroyable._hasDestroyableChildren)(helperRef)) {
(0, _destroyable.associateDestroyableChild)(helperInstanceRef, helperRef);
}
} else {
helperRef = _reference.UNDEFINED_REFERENCE;
}
});
let helperValueRef = (0, _reference.createComputeRef)(() => {
(0, _reference.valueForRef)(helperInstanceRef);
return (0, _reference.valueForRef)(helperRef);
});
vm.associateDestroyable(helperInstanceRef);
vm.loadValue(_vm.$v0, helperValueRef);
});
function resolveHelper(constants, definition, ref) {
let handle = constants.helper(definition, null, true);
if (_env.DEBUG && handle === null) {
throw new Error(`Expected a dynamic helper definition, but received an object or function that did not have a helper manager associated with it. The dynamic invocation was \`{{${ref.debugLabel}}}\` or \`(${ref.debugLabel})\`, and the incorrect definition is the value at the path \`${ref.debugLabel}\`, which was: ${(0, _util.debugToString)(definition)}`);
}
return constants.getValue(handle);
}
_opcodes.APPEND_OPCODES.add(16
/* Helper */
, (vm, {
op1: handle
}) => {
let stack = vm.stack;
let helper = vm[_symbols.CONSTANTS].getValue(handle);
let args = stack.pop();
let value = helper(args.capture(), vm.getOwner(), vm.dynamicScope());
if ((0, _destroyable._hasDestroyableChildren)(value)) {
vm.associateDestroyable(value);
}
vm.loadValue(_vm.$v0, value);
});
_opcodes.APPEND_OPCODES.add(21
/* GetVariable */
, (vm, {
op1: symbol
}) => {
let expr = vm.referenceForSymbol(symbol);
vm.stack.push(expr);
});
_opcodes.APPEND_OPCODES.add(19
/* SetVariable */
, (vm, {
op1: symbol
}) => {
let expr = vm.stack.pop();
vm.scope().bindSymbol(symbol, expr);
});
_opcodes.APPEND_OPCODES.add(20
/* SetBlock */
, (vm, {
op1: symbol
}) => {
let handle = vm.stack.pop();
let scope = vm.stack.pop();
let table = vm.stack.pop();
vm.scope().bindBlock(symbol, [handle, scope, table]);
});
_opcodes.APPEND_OPCODES.add(102
/* ResolveMaybeLocal */
, (vm, {
op1: _name
}) => {
let name = vm[_symbols.CONSTANTS].getValue(_name);
let locals = vm.scope().getPartialMap();
let ref = locals[name];
if (ref === undefined) {
ref = (0, _reference.childRefFor)(vm.getSelf(), name);
}
vm.stack.push(ref);
});
_opcodes.APPEND_OPCODES.add(37
/* RootScope */
, (vm, {
op1: symbols
}) => {
vm.pushRootScope(symbols, vm.getOwner());
});
_opcodes.APPEND_OPCODES.add(22
/* GetProperty */
, (vm, {
op1: _key
}) => {
let key = vm[_symbols.CONSTANTS].getValue(_key);
let expr = vm.stack.pop();
vm.stack.push((0, _reference.childRefFor)(expr, key));
});
_opcodes.APPEND_OPCODES.add(23
/* GetBlock */
, (vm, {
op1: _block
}) => {
let {
stack
} = vm;
let block = vm.scope().getBlock(_block);
stack.push(block);
});
_opcodes.APPEND_OPCODES.add(24
/* SpreadBlock */
, vm => {
let {
stack
} = vm;
let block = stack.pop();
if (block && !isUndefinedReference(block)) {
let [handleOrCompilable, scope, table] = block;
stack.push(table);
stack.push(scope);
stack.push(handleOrCompilable);
} else {
stack.push(null);
stack.push(null);
stack.push(null);
}
});
function isUndefinedReference(input) {
false && (0, _util.assert)(Array.isArray(input) || input === _reference.UNDEFINED_REFERENCE, 'a reference other than UNDEFINED_REFERENCE is illegal here');
return input === _reference.UNDEFINED_REFERENCE;
}
_opcodes.APPEND_OPCODES.add(25
/* HasBlock */
, vm => {
let {
stack
} = vm;
let block = stack.pop();
if (block && !isUndefinedReference(block)) {
stack.push(_reference.TRUE_REFERENCE);
} else {
stack.push(_reference.FALSE_REFERENCE);
}
});
_opcodes.APPEND_OPCODES.add(26
/* HasBlockParams */
, vm => {
// FIXME(mmun): should only need to push the symbol table
let block = vm.stack.pop();
let scope = vm.stack.pop();
let table = vm.stack.pop();
let hasBlockParams = table && table.parameters.length;
vm.stack.push(hasBlockParams ? _reference.TRUE_REFERENCE : _reference.FALSE_REFERENCE);
});
_opcodes.APPEND_OPCODES.add(27
/* Concat */
, (vm, {
op1: count
}) => {
let out = new Array(count);
for (let i = count; i > 0; i--) {
let offset = i - 1;
out[offset] = vm.stack.pop();
}
vm.stack.push((0, _concat.createConcatRef)(out));
});
_opcodes.APPEND_OPCODES.add(109
/* IfInline */
, vm => {
let condition = vm.stack.pop();
let truthy = vm.stack.pop();
let falsy = vm.stack.pop();
vm.stack.push((0, _reference.createComputeRef)(() => {
if ((0, _globalContext.toBool)((0, _reference.valueForRef)(condition)) === true) {
return (0, _reference.valueForRef)(truthy);
} else {
return (0, _reference.valueForRef)(falsy);
}
}));
});
_opcodes.APPEND_OPCODES.add(110
/* Not */
, vm => {
let ref = vm.stack.pop();
vm.stack.push((0, _reference.createComputeRef)(() => {
return !(0, _globalContext.toBool)((0, _reference.valueForRef)(ref));
}));
});
_opcodes.APPEND_OPCODES.add(111
/* GetDynamicVar */
, vm => {
let scope = vm.dynamicScope();
let stack = vm.stack;
let nameRef = stack.pop();
stack.push((0, _reference.createComputeRef)(() => {
let name = String((0, _reference.valueForRef)(nameRef));
return (0, _reference.valueForRef)(scope.get(name));
}));
});
_opcodes.APPEND_OPCODES.add(112
/* Log */
, vm => {
let {
positional
} = vm.stack.pop().capture();
vm.loadValue(_vm.$v0, (0, _reference.createComputeRef)(() => {
// eslint-disable-next-line no-console
console.log(...(0, _arguments.reifyPositional)(positional));
}));
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZXhwcmVzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFZQTs7QUFTQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFtQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFJQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBNkIsQ0FBQSxFQUFBLEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBTCxJQUFBO0FBQWEsRUFBQSxHQUFHLEVBQUU7QUFBbEIsQ0FBTCxLQUFzQztBQUNqRSxNQUFJLEtBQUssR0FBRyxFQUFFLENBQWQsS0FBQTtBQUVBLE1BQUksVUFBVSxHQUFTLEtBQUssQ0FBNUIsR0FBdUIsRUFBdkI7QUFDQSxNQUFJLFlBQVksR0FBUyxLQUFLLENBQTlCLEdBQXlCLEVBQXpCO0FBRUEsTUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFkLFFBQVksRUFBWjtBQUNBLE1BQUksUUFBUSxHQUFHLEVBQUUsQ0FBRixPQUFBLENBQWYsUUFBQTtBQUVBLE1BQUksUUFBUSxHQUFaLEtBQUE7O0FBRUEsTUFBQSxVQUFBLEVBQVc7QUFDVDtBQUNBLElBQUEsUUFBUSxHQUFHLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUFnQyx3QkFBM0MsU0FBMkMsQ0FBaEMsQ0FBWDtBQUNEOztBQUVELEVBQUEsRUFBRSxDQUFGLFNBQUEsQ0FBQSxPQUFBLEVBRUUseUJBQWMsSUFBZCxFQUFjLFVBQWQsRUFBYyxLQUFkLEVBQWMsWUFBZCxFQUFjLFFBQWQsRUFGRixRQUVFLENBRkY7QUFoQkYsQ0FBQTs7QUFzQkEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQXNDLEVBQUQsSUFBTztBQUMxQyxNQUFJLEtBQUssR0FBRyxFQUFFLENBQWQsS0FBQTtBQUNBLE1BQUksR0FBRyxHQUFTLEtBQUssQ0FBckIsR0FBZ0IsRUFBaEI7QUFDQSxNQUFJLElBQUksR0FBUyxLQUFLLENBQVgsR0FBTSxHQUFqQixPQUFpQixFQUFqQjtBQUVBLE1BQUEsU0FBQTtBQUNBLE1BQUksWUFBWSxHQUFVLEVBQUUsQ0FBNUIsUUFBMEIsRUFBMUI7QUFFQSxNQUFJLGlCQUFpQixHQUFHLGlDQUFpQixNQUFLO0FBQzVDLFFBQUksU0FBUyxLQUFiLFNBQUEsRUFBNkI7QUFDM0IsZ0NBQUEsU0FBQTtBQUNEOztBQUVELFFBQUksVUFBVSxHQUFHLDRCQUFqQixHQUFpQixDQUFqQjs7QUFFQSxRQUFJLGlDQUFhLFVBQWIsRUFBd0I7QUFBQTtBQUF4QixLQUFKLEVBQW1EO0FBQ2pELFVBQUk7QUFBRSxRQUFBLFVBQVUsRUFBWixXQUFBO0FBQUEsUUFBQSxLQUFBO0FBQUEsUUFBQSxVQUFBO0FBQThDLFFBQUE7QUFBOUMsVUFBd0QsdUNBQTVELFVBQTRELENBQTVEO0FBRUEsVUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBSCxrQkFBRyxDQUFILEVBQUEsV0FBQSxFQUExQixHQUEwQixDQUExQjs7QUFFQSxVQUFJLEtBQUssS0FBVCxTQUFBLEVBQXlCO0FBQ3ZCLFFBQUEsSUFBSSxDQUFKLEtBQUEsR0FBYSxrQkFBTSxFQUFOLEVBQVcsR0FBTCxLQUFOLEVBQXFCLElBQUksQ0FBdEMsS0FBYSxDQUFiO0FBQ0Q7O0FBRUQsVUFBSSxVQUFVLEtBQWQsU0FBQSxFQUE4QjtBQUM1QixRQUFBLElBQUksQ0FBSixVQUFBLEdBQWtCLFVBQVUsQ0FBVixNQUFBLENBQWtCLElBQUksQ0FBeEMsVUFBa0IsQ0FBbEI7QUFDRDs7QUFFRCxNQUFBLFNBQVMsR0FBRyxNQUFNLENBQUEsSUFBQSxFQUFsQixLQUFrQixDQUFsQjtBQUVBLGtEQUF5QixpQkFBekIsRUFBQSxTQUFBO0FBZkYsS0FBQSxNQWdCTyxJQUFJLG9CQUFKLFVBQUksQ0FBSixFQUEwQjtBQUMvQixVQUFJLE1BQU0sR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFILGtCQUFHLENBQUgsRUFBQSxVQUFBLEVBQTFCLEdBQTBCLENBQTFCO0FBQ0EsTUFBQSxTQUFTLEdBQUcsTUFBTSxDQUFBLElBQUEsRUFBbEIsWUFBa0IsQ0FBbEI7O0FBRUEsVUFBSSwwQ0FBSixTQUFJLENBQUosRUFBd0M7QUFDdEMsb0RBQXlCLGlCQUF6QixFQUFBLFNBQUE7QUFDRDtBQU5JLEtBQUEsTUFPQTtBQUNMLE1BQUEsU0FBUyxHQUFULDhCQUFBO0FBQ0Q7QUFoQ0gsR0FBd0IsQ0FBeEI7QUFtQ0EsTUFBSSxjQUFjLEdBQUcsaUNBQWlCLE1BQUs7QUFDekMsZ0NBQUEsaUJBQUE7QUFDQSxXQUFPLDRCQUFQLFNBQU8sQ0FBUDtBQUZGLEdBQXFCLENBQXJCO0FBS0EsRUFBQSxFQUFFLENBQUYsb0JBQUEsQ0FBQSxpQkFBQTtBQUNBLEVBQUEsRUFBRSxDQUFGLFNBQUEsQ0FBQSxPQUFBLEVBQUEsY0FBQTtBQWpERixDQUFBOztBQW9EQSxTQUFBLGFBQUEsQ0FBQSxTQUFBLEVBQUEsVUFBQSxFQUFBLEdBQUEsRUFHZ0I7QUFFZCxNQUFJLE1BQU0sR0FBRyxTQUFTLENBQVQsTUFBQSxDQUFBLFVBQUEsRUFBQSxJQUFBLEVBQWIsSUFBYSxDQUFiOztBQUVBLE1BQUksY0FBUyxNQUFNLEtBQW5CLElBQUEsRUFBOEI7QUFDNUIsVUFBTSxJQUFBLEtBQUEsQ0FDSixrS0FDRSxHQUFHLENBQUMsVUFDTixjQUFjLEdBQUcsQ0FBQyxVQUFVLGdFQUMxQixHQUFHLENBQUMsVUFDTixrQkFBa0IseUJBQWMsVUFBZCxDQUxwQixFQUFNLENBQU47QUFPRDs7QUFFRCxTQUFPLFNBQVMsQ0FBVCxRQUFBLENBQVAsTUFBTyxDQUFQO0FBQ0Q7O0FBRUQsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQThCLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXdCO0FBQ3BELE1BQUksS0FBSyxHQUFHLEVBQUUsQ0FBZCxLQUFBOztBQUNBLE1BQUksTUFBTSxHQUFTLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUFuQixNQUFtQixDQUFuQjs7QUFDQSxNQUFJLElBQUksR0FBUyxLQUFLLENBQXRCLEdBQWlCLEVBQWpCO0FBQ0EsTUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBTCxPQUFDLEVBQUQsRUFBaUIsRUFBRSxDQUFuQixRQUFpQixFQUFqQixFQUFnQyxFQUFFLENBQXBELFlBQWtELEVBQWhDLENBQWxCOztBQUVBLE1BQUksMENBQUosS0FBSSxDQUFKLEVBQW9DO0FBQ2xDLElBQUEsRUFBRSxDQUFGLG9CQUFBLENBQUEsS0FBQTtBQUNEOztBQUVELEVBQUEsRUFBRSxDQUFGLFNBQUEsQ0FBQSxPQUFBLEVBQUEsS0FBQTtBQVZGLENBQUE7O0FBYUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQW1DLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXdCO0FBQ3pELE1BQUksSUFBSSxHQUFHLEVBQUUsQ0FBRixrQkFBQSxDQUFYLE1BQVcsQ0FBWDtBQUVBLEVBQUEsRUFBRSxDQUFGLEtBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQTtBQUhGLENBQUE7O0FBTUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQW1DLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXdCO0FBQ3pELE1BQUksSUFBSSxHQUFTLEVBQUUsQ0FBRixLQUFBLENBQWpCLEdBQWlCLEVBQWpCO0FBQ0EsRUFBQSxFQUFFLENBQUYsS0FBQSxHQUFBLFVBQUEsQ0FBQSxNQUFBLEVBQUEsSUFBQTtBQUZGLENBQUE7O0FBS0Esd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQWdDLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXdCO0FBQ3RELE1BQUksTUFBTSxHQUFTLEVBQUUsQ0FBRixLQUFBLENBQW5CLEdBQW1CLEVBQW5CO0FBQ0EsTUFBSSxLQUFLLEdBQVMsRUFBRSxDQUFGLEtBQUEsQ0FBbEIsR0FBa0IsRUFBbEI7QUFDQSxNQUFJLEtBQUssR0FBUyxFQUFFLENBQUYsS0FBQSxDQUFsQixHQUFrQixFQUFsQjtBQUVBLEVBQUEsRUFBRSxDQUFGLEtBQUEsR0FBQSxTQUFBLENBQUEsTUFBQSxFQUE2QixDQUFBLE1BQUEsRUFBQSxLQUFBLEVBQTdCLEtBQTZCLENBQTdCO0FBTEYsQ0FBQTs7QUFRQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBeUMsQ0FBQSxFQUFBLEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBRTtBQUFQLENBQUwsS0FBdUI7QUFDOUQsTUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFGLGtCQUFFLENBQUYsQ0FBQSxRQUFBLENBQVgsS0FBVyxDQUFYOztBQUNBLE1BQUksTUFBTSxHQUFHLEVBQUUsQ0FBRixLQUFBLEdBQWIsYUFBYSxFQUFiO0FBRUEsTUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFoQixJQUFnQixDQUFoQjs7QUFDQSxNQUFJLEdBQUcsS0FBUCxTQUFBLEVBQXVCO0FBQ3JCLElBQUEsR0FBRyxHQUFHLDRCQUFZLEVBQUUsQ0FBSCxPQUFDLEVBQVosRUFBTixJQUFNLENBQU47QUFDRDs7QUFFRCxFQUFBLEVBQUUsQ0FBRixLQUFBLENBQUEsSUFBQSxDQUFBLEdBQUE7QUFURixDQUFBOztBQVlBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFpQyxDQUFBLEVBQUEsRUFBSztBQUFFLEVBQUEsR0FBRyxFQUFFO0FBQVAsQ0FBTCxLQUF5QjtBQUN4RCxFQUFBLEVBQUUsQ0FBRixhQUFBLENBQUEsT0FBQSxFQUEwQixFQUFFLENBQTVCLFFBQTBCLEVBQTFCO0FBREYsQ0FBQTs7QUFJQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBbUMsQ0FBQSxFQUFBLEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBRTtBQUFQLENBQUwsS0FBc0I7QUFDdkQsTUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFGLGtCQUFFLENBQUYsQ0FBQSxRQUFBLENBQVYsSUFBVSxDQUFWOztBQUNBLE1BQUksSUFBSSxHQUFTLEVBQUUsQ0FBRixLQUFBLENBQWpCLEdBQWlCLEVBQWpCO0FBQ0EsRUFBQSxFQUFFLENBQUYsS0FBQSxDQUFBLElBQUEsQ0FBYyw0QkFBVyxJQUFYLEVBQWQsR0FBYyxDQUFkO0FBSEYsQ0FBQTs7QUFNQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBZ0MsQ0FBQSxFQUFBLEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBRTtBQUFQLENBQUwsS0FBd0I7QUFDdEQsTUFBSTtBQUFFLElBQUE7QUFBRixNQUFKLEVBQUE7QUFDQSxNQUFJLEtBQUssR0FBRyxFQUFFLENBQUYsS0FBQSxHQUFBLFFBQUEsQ0FBWixNQUFZLENBQVo7QUFFQSxFQUFBLEtBQUssQ0FBTCxJQUFBLENBQUEsS0FBQTtBQUpGLENBQUE7O0FBT0Esd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQW9DLEVBQUQsSUFBTztBQUN4QyxNQUFJO0FBQUUsSUFBQTtBQUFGLE1BQUosRUFBQTtBQUNBLE1BQUksS0FBSyxHQUFTLEtBQUssQ0FBdkIsR0FBa0IsRUFBbEI7O0FBRUEsTUFBSSxLQUFLLElBQUksQ0FBQyxvQkFBb0IsQ0FBbEMsS0FBa0MsQ0FBbEMsRUFBMkM7QUFDekMsUUFBSSxDQUFBLGtCQUFBLEVBQUEsS0FBQSxFQUFBLEtBQUEsSUFBSixLQUFBO0FBRUEsSUFBQSxLQUFLLENBQUwsSUFBQSxDQUFBLEtBQUE7QUFDQSxJQUFBLEtBQUssQ0FBTCxJQUFBLENBQUEsS0FBQTtBQUNBLElBQUEsS0FBSyxDQUFMLElBQUEsQ0FBQSxrQkFBQTtBQUxGLEdBQUEsTUFNTztBQUNMLElBQUEsS0FBSyxDQUFMLElBQUEsQ0FBQSxJQUFBO0FBQ0EsSUFBQSxLQUFLLENBQUwsSUFBQSxDQUFBLElBQUE7QUFDQSxJQUFBLEtBQUssQ0FBTCxJQUFBLENBQUEsSUFBQTtBQUNEO0FBZEgsQ0FBQTs7QUFpQkEsU0FBQSxvQkFBQSxDQUFBLEtBQUEsRUFBMkQ7QUFBQSxXQUN6RCxrQkFDRSxLQUFLLENBQUwsT0FBQSxDQUFBLEtBQUEsS0FBd0IsS0FBSyxLQUR6Qiw4QkFBTixFQUR5RCw0REFDekQsQ0FEeUQ7QUFLekQsU0FBTyxLQUFLLEtBQVosOEJBQUE7QUFDRDs7QUFFRCx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBaUMsRUFBRCxJQUFPO0FBQ3JDLE1BQUk7QUFBRSxJQUFBO0FBQUYsTUFBSixFQUFBO0FBQ0EsTUFBSSxLQUFLLEdBQVMsS0FBSyxDQUF2QixHQUFrQixFQUFsQjs7QUFFQSxNQUFJLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFsQyxLQUFrQyxDQUFsQyxFQUEyQztBQUN6QyxJQUFBLEtBQUssQ0FBTCxJQUFBLENBQUEseUJBQUE7QUFERixHQUFBLE1BRU87QUFDTCxJQUFBLEtBQUssQ0FBTCxJQUFBLENBQUEsMEJBQUE7QUFDRDtBQVJILENBQUE7O0FBV0Esd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQXVDLEVBQUQsSUFBTztBQUMzQztBQUNBLE1BQUksS0FBSyxHQUFHLEVBQUUsQ0FBRixLQUFBLENBQVosR0FBWSxFQUFaO0FBQ0EsTUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFGLEtBQUEsQ0FBWixHQUFZLEVBQVo7QUFJQSxNQUFJLEtBQUssR0FBUyxFQUFFLENBQUYsS0FBQSxDQUFsQixHQUFrQixFQUFsQjtBQUVBLE1BQUksY0FBYyxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUwsVUFBQSxDQUE5QixNQUFBO0FBQ0EsRUFBQSxFQUFFLENBQUYsS0FBQSxDQUFBLElBQUEsQ0FBYyxjQUFjLEdBQUEseUJBQUEsR0FBNUIsMEJBQUE7QUFWRixDQUFBOztBQWFBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUE4QixDQUFBLEVBQUEsRUFBSztBQUFFLEVBQUEsR0FBRyxFQUFFO0FBQVAsQ0FBTCxLQUF1QjtBQUNuRCxNQUFJLEdBQUcsR0FBOEIsSUFBQSxLQUFBLENBQXJDLEtBQXFDLENBQXJDOztBQUVBLE9BQUssSUFBSSxDQUFDLEdBQVYsS0FBQSxFQUFvQixDQUFDLEdBQXJCLENBQUEsRUFBMkIsQ0FBM0IsRUFBQSxFQUFnQztBQUM5QixRQUFJLE1BQU0sR0FBRyxDQUFDLEdBQWQsQ0FBQTtBQUNBLElBQUEsR0FBRyxDQUFILE1BQUcsQ0FBSCxHQUFvQixFQUFFLENBQUYsS0FBQSxDQUFwQixHQUFvQixFQUFwQjtBQUNEOztBQUVELEVBQUEsRUFBRSxDQUFGLEtBQUEsQ0FBQSxJQUFBLENBQWMsNkJBQWQsR0FBYyxDQUFkO0FBUkYsQ0FBQTs7QUFXQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBaUMsRUFBRCxJQUFPO0FBQ3JDLE1BQUksU0FBUyxHQUFTLEVBQUUsQ0FBRixLQUFBLENBQXRCLEdBQXNCLEVBQXRCO0FBQ0EsTUFBSSxNQUFNLEdBQVMsRUFBRSxDQUFGLEtBQUEsQ0FBbkIsR0FBbUIsRUFBbkI7QUFDQSxNQUFJLEtBQUssR0FBUyxFQUFFLENBQUYsS0FBQSxDQUFsQixHQUFrQixFQUFsQjtBQUVBLEVBQUEsRUFBRSxDQUFGLEtBQUEsQ0FBQSxJQUFBLENBQ0UsaUNBQWlCLE1BQUs7QUFDcEIsUUFBSSwyQkFBTyw0QkFBUCxTQUFPLENBQVAsTUFBSixJQUFBLEVBQTZDO0FBQzNDLGFBQU8sNEJBQVAsTUFBTyxDQUFQO0FBREYsS0FBQSxNQUVPO0FBQ0wsYUFBTyw0QkFBUCxLQUFPLENBQVA7QUFDRDtBQU5MLEdBQ0UsQ0FERjtBQUxGLENBQUE7O0FBZ0JBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUE0QixFQUFELElBQU87QUFDaEMsTUFBSSxHQUFHLEdBQVMsRUFBRSxDQUFGLEtBQUEsQ0FBaEIsR0FBZ0IsRUFBaEI7QUFFQSxFQUFBLEVBQUUsQ0FBRixLQUFBLENBQUEsSUFBQSxDQUNFLGlDQUFpQixNQUFLO0FBQ3BCLFdBQU8sQ0FBQywyQkFBTyw0QkFBZixHQUFlLENBQVAsQ0FBUjtBQUZKLEdBQ0UsQ0FERjtBQUhGLENBQUE7O0FBVUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQXNDLEVBQUQsSUFBTztBQUMxQyxNQUFJLEtBQUssR0FBRyxFQUFFLENBQWQsWUFBWSxFQUFaO0FBQ0EsTUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFkLEtBQUE7QUFDQSxNQUFJLE9BQU8sR0FBUyxLQUFLLENBQXpCLEdBQW9CLEVBQXBCO0FBRUEsRUFBQSxLQUFLLENBQUwsSUFBQSxDQUNFLGlDQUFpQixNQUFLO0FBQ3BCLFFBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyw0QkFBbEIsT0FBa0IsQ0FBRCxDQUFqQjtBQUNBLFdBQU8sNEJBQVksS0FBSyxDQUFMLEdBQUEsQ0FBbkIsSUFBbUIsQ0FBWixDQUFQO0FBSEosR0FDRSxDQURGO0FBTEYsQ0FBQTs7QUFhQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBNEIsRUFBRCxJQUFPO0FBQ2hDLE1BQUk7QUFBRSxJQUFBO0FBQUYsTUFBdUIsRUFBRSxDQUFGLEtBQUEsQ0FBTixHQUFNLEdBQTNCLE9BQTJCLEVBQTNCO0FBRUEsRUFBQSxFQUFFLENBQUYsU0FBQSxDQUFBLE9BQUEsRUFFRSxpQ0FBaUIsTUFBSztBQUNwQjtBQUNBLElBQUEsT0FBTyxDQUFQLEdBQUEsQ0FBWSxHQUFHLGdDQUFmLFVBQWUsQ0FBZjtBQUpKLEdBRUUsQ0FGRjtBQUhGLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMsXG4gIEN1cnJpZWRUeXBlLFxuICBIZWxwZXIsXG4gIEhlbHBlckRlZmluaXRpb25TdGF0ZSxcbiAgT3AsXG4gIE93bmVyLFxuICBSZXNvbHV0aW9uVGltZUNvbnN0YW50cyxcbiAgUnVudGltZUNvbnN0YW50cyxcbiAgU2NvcGVCbG9jayxcbiAgVk0gYXMgUHVibGljVk0sXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgUmVmZXJlbmNlLFxuICBjaGlsZFJlZkZvcixcbiAgVU5ERUZJTkVEX1JFRkVSRU5DRSxcbiAgVFJVRV9SRUZFUkVOQ0UsXG4gIEZBTFNFX1JFRkVSRU5DRSxcbiAgdmFsdWVGb3JSZWYsXG4gIGNyZWF0ZUNvbXB1dGVSZWYsXG59IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQgeyAkdjAgfSBmcm9tICdAZ2xpbW1lci92bSc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUyB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgY3JlYXRlQ29uY2F0UmVmIH0gZnJvbSAnLi4vZXhwcmVzc2lvbnMvY29uY2F0JztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQsIGRlc3Ryb3ksIF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuIH0gZnJvbSAnQGdsaW1tZXIvZGVzdHJveWFibGUnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NpZ24sIGRlYnVnVG9TdHJpbmcsIGRlY29kZUhhbmRsZSwgaXNPYmplY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IHRvQm9vbCB9IGZyb20gJ0BnbGltbWVyL2dsb2JhbC1jb250ZXh0JztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBDaGVja09wdGlvbixcbiAgQ2hlY2tIYW5kbGUsXG4gIENoZWNrQmxvY2tTeW1ib2xUYWJsZSxcbiAgQ2hlY2tPcixcbiAgQ2hlY2tNYXliZSxcbn0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHtcbiAgQ2hlY2tBcmd1bWVudHMsXG4gIENoZWNrUmVmZXJlbmNlLFxuICBDaGVja0NvbXBpbGFibGVCbG9jayxcbiAgQ2hlY2tTY29wZSxcbiAgQ2hlY2tIZWxwZXIsXG4gIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlLFxuICBDaGVja1Njb3BlQmxvY2ssXG4gIENoZWNrQ2FwdHVyZWRBcmd1bWVudHMsXG59IGZyb20gJy4vLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IGNyZWF0ZUN1cnJ5UmVmIGZyb20gJy4uLy4uL3JlZmVyZW5jZXMvY3VycnktdmFsdWUnO1xuaW1wb3J0IHsgaXNDdXJyaWVkVHlwZSwgcmVzb2x2ZUN1cnJpZWRWYWx1ZSB9IGZyb20gJy4uLy4uL2N1cnJpZWQtdmFsdWUnO1xuaW1wb3J0IHsgcmVpZnlQb3NpdGlvbmFsIH0gZnJvbSAnLi4vLi4vdm0vYXJndW1lbnRzJztcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gKHZtOiBQdWJsaWNWTSkgPT4gUmVmZXJlbmNlPFQ+O1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ3VycnksICh2bSwgeyBvcDE6IHR5cGUsIG9wMjogX2lzU3RyaWN0IH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG5cbiAgbGV0IGRlZmluaXRpb24gPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgY2FwdHVyZWRBcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQ2FwdHVyZWRBcmd1bWVudHMpO1xuXG4gIGxldCBvd25lciA9IHZtLmdldE93bmVyKCk7XG4gIGxldCByZXNvbHZlciA9IHZtLnJ1bnRpbWUucmVzb2x2ZXI7XG5cbiAgbGV0IGlzU3RyaWN0ID0gZmFsc2U7XG5cbiAgaWYgKERFQlVHKSB7XG4gICAgLy8gc3RyaWN0IGNoZWNrIG9ubHkgaGFwcGVucyBpbiBERUJVRyBidWlsZHMsIG5vIHJlYXNvbiB0byBsb2FkIGl0IG90aGVyd2lzZVxuICAgIGlzU3RyaWN0ID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxib29sZWFuPihkZWNvZGVIYW5kbGUoX2lzU3RyaWN0KSk7XG4gIH1cblxuICB2bS5sb2FkVmFsdWUoXG4gICAgJHYwLFxuICAgIGNyZWF0ZUN1cnJ5UmVmKHR5cGUgYXMgQ3VycmllZFR5cGUsIGRlZmluaXRpb24sIG93bmVyLCBjYXB0dXJlZEFyZ3MsIHJlc29sdmVyLCBpc1N0cmljdClcbiAgKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRHluYW1pY0hlbHBlciwgKHZtKSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgcmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tBcmd1bWVudHMpLmNhcHR1cmUoKTtcblxuICBsZXQgaGVscGVyUmVmOiBSZWZlcmVuY2U7XG4gIGxldCBpbml0aWFsT3duZXI6IE93bmVyID0gdm0uZ2V0T3duZXIoKTtcblxuICBsZXQgaGVscGVySW5zdGFuY2VSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICBpZiAoaGVscGVyUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3Ryb3koaGVscGVyUmVmKTtcbiAgICB9XG5cbiAgICBsZXQgZGVmaW5pdGlvbiA9IHZhbHVlRm9yUmVmKHJlZik7XG5cbiAgICBpZiAoaXNDdXJyaWVkVHlwZShkZWZpbml0aW9uLCBDdXJyaWVkVHlwZS5IZWxwZXIpKSB7XG4gICAgICBsZXQgeyBkZWZpbml0aW9uOiByZXNvbHZlZERlZiwgb3duZXIsIHBvc2l0aW9uYWwsIG5hbWVkIH0gPSByZXNvbHZlQ3VycmllZFZhbHVlKGRlZmluaXRpb24pO1xuXG4gICAgICBsZXQgaGVscGVyID0gcmVzb2x2ZUhlbHBlcih2bVtDT05TVEFOVFNdLCByZXNvbHZlZERlZiwgcmVmKTtcblxuICAgICAgaWYgKG5hbWVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncy5uYW1lZCA9IGFzc2lnbih7fSwgLi4ubmFtZWQsIGFyZ3MubmFtZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MucG9zaXRpb25hbCA9IHBvc2l0aW9uYWwuY29uY2F0KGFyZ3MucG9zaXRpb25hbCkgYXMgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzO1xuICAgICAgfVxuXG4gICAgICBoZWxwZXJSZWYgPSBoZWxwZXIoYXJncywgb3duZXIpO1xuXG4gICAgICBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkKGhlbHBlckluc3RhbmNlUmVmLCBoZWxwZXJSZWYpO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGVmaW5pdGlvbikpIHtcbiAgICAgIGxldCBoZWxwZXIgPSByZXNvbHZlSGVscGVyKHZtW0NPTlNUQU5UU10sIGRlZmluaXRpb24sIHJlZik7XG4gICAgICBoZWxwZXJSZWYgPSBoZWxwZXIoYXJncywgaW5pdGlhbE93bmVyKTtcblxuICAgICAgaWYgKF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuKGhlbHBlclJlZikpIHtcbiAgICAgICAgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZChoZWxwZXJJbnN0YW5jZVJlZiwgaGVscGVyUmVmKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVscGVyUmVmID0gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCBoZWxwZXJWYWx1ZVJlZiA9IGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgIHZhbHVlRm9yUmVmKGhlbHBlckluc3RhbmNlUmVmKTtcbiAgICByZXR1cm4gdmFsdWVGb3JSZWYoaGVscGVyUmVmKTtcbiAgfSk7XG5cbiAgdm0uYXNzb2NpYXRlRGVzdHJveWFibGUoaGVscGVySW5zdGFuY2VSZWYpO1xuICB2bS5sb2FkVmFsdWUoJHYwLCBoZWxwZXJWYWx1ZVJlZik7XG59KTtcblxuZnVuY3Rpb24gcmVzb2x2ZUhlbHBlcihcbiAgY29uc3RhbnRzOiBSdW50aW1lQ29uc3RhbnRzICYgUmVzb2x1dGlvblRpbWVDb25zdGFudHMsXG4gIGRlZmluaXRpb246IEhlbHBlckRlZmluaXRpb25TdGF0ZSxcbiAgcmVmOiBSZWZlcmVuY2Vcbik6IEhlbHBlciB7XG4gIGxldCBoYW5kbGUgPSBjb25zdGFudHMuaGVscGVyKGRlZmluaXRpb24sIG51bGwsIHRydWUpITtcblxuICBpZiAoREVCVUcgJiYgaGFuZGxlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV4cGVjdGVkIGEgZHluYW1pYyBoZWxwZXIgZGVmaW5pdGlvbiwgYnV0IHJlY2VpdmVkIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRpZCBub3QgaGF2ZSBhIGhlbHBlciBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhlIGR5bmFtaWMgaW52b2NhdGlvbiB3YXMgXFxge3ske1xuICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgfX19XFxgIG9yIFxcYCgke3JlZi5kZWJ1Z0xhYmVsfSlcXGAsIGFuZCB0aGUgaW5jb3JyZWN0IGRlZmluaXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBwYXRoIFxcYCR7XG4gICAgICAgIHJlZi5kZWJ1Z0xhYmVsXG4gICAgICB9XFxgLCB3aGljaCB3YXM6ICR7ZGVidWdUb1N0cmluZyEoZGVmaW5pdGlvbil9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29uc3RhbnRzLmdldFZhbHVlKGhhbmRsZSk7XG59XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5IZWxwZXIsICh2bSwgeyBvcDE6IGhhbmRsZSB9KSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgaGVscGVyID0gY2hlY2sodm1bQ09OU1RBTlRTXS5nZXRWYWx1ZShoYW5kbGUpLCBDaGVja0hlbHBlcik7XG4gIGxldCBhcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQXJndW1lbnRzKTtcbiAgbGV0IHZhbHVlID0gaGVscGVyKGFyZ3MuY2FwdHVyZSgpLCB2bS5nZXRPd25lcigpLCB2bS5keW5hbWljU2NvcGUoKSk7XG5cbiAgaWYgKF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuKHZhbHVlKSkge1xuICAgIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKHZhbHVlKTtcbiAgfVxuXG4gIHZtLmxvYWRWYWx1ZSgkdjAsIHZhbHVlKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0VmFyaWFibGUsICh2bSwgeyBvcDE6IHN5bWJvbCB9KSA9PiB7XG4gIGxldCBleHByID0gdm0ucmVmZXJlbmNlRm9yU3ltYm9sKHN5bWJvbCk7XG5cbiAgdm0uc3RhY2sucHVzaChleHByKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuU2V0VmFyaWFibGUsICh2bSwgeyBvcDE6IHN5bWJvbCB9KSA9PiB7XG4gIGxldCBleHByID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgdm0uc2NvcGUoKS5iaW5kU3ltYm9sKHN5bWJvbCwgZXhwcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlNldEJsb2NrLCAodm0sIHsgb3AxOiBzeW1ib2wgfSkgPT4ge1xuICBsZXQgaGFuZGxlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrQ29tcGlsYWJsZUJsb2NrKTtcbiAgbGV0IHNjb3BlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrU2NvcGUpO1xuICBsZXQgdGFibGUgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tCbG9ja1N5bWJvbFRhYmxlKTtcblxuICB2bS5zY29wZSgpLmJpbmRCbG9jayhzeW1ib2wsIFtoYW5kbGUsIHNjb3BlLCB0YWJsZV0pO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5SZXNvbHZlTWF5YmVMb2NhbCwgKHZtLCB7IG9wMTogX25hbWUgfSkgPT4ge1xuICBsZXQgbmFtZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZSk7XG4gIGxldCBsb2NhbHMgPSB2bS5zY29wZSgpLmdldFBhcnRpYWxNYXAoKSE7XG5cbiAgbGV0IHJlZiA9IGxvY2Fsc1tuYW1lXTtcbiAgaWYgKHJlZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVmID0gY2hpbGRSZWZGb3Iodm0uZ2V0U2VsZigpLCBuYW1lKTtcbiAgfVxuXG4gIHZtLnN0YWNrLnB1c2gocmVmKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUm9vdFNjb3BlLCAodm0sIHsgb3AxOiBzeW1ib2xzIH0pID0+IHtcbiAgdm0ucHVzaFJvb3RTY29wZShzeW1ib2xzLCB2bS5nZXRPd25lcigpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0UHJvcGVydHksICh2bSwgeyBvcDE6IF9rZXkgfSkgPT4ge1xuICBsZXQga2V5ID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9rZXkpO1xuICBsZXQgZXhwciA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIHZtLnN0YWNrLnB1c2goY2hpbGRSZWZGb3IoZXhwciwga2V5KSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkdldEJsb2NrLCAodm0sIHsgb3AxOiBfYmxvY2sgfSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCBibG9jayA9IHZtLnNjb3BlKCkuZ2V0QmxvY2soX2Jsb2NrKTtcblxuICBzdGFjay5wdXNoKGJsb2NrKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuU3ByZWFkQmxvY2ssICh2bSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCBibG9jayA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja09wdGlvbihDaGVja09yKENoZWNrU2NvcGVCbG9jaywgQ2hlY2tVbmRlZmluZWRSZWZlcmVuY2UpKSk7XG5cbiAgaWYgKGJsb2NrICYmICFpc1VuZGVmaW5lZFJlZmVyZW5jZShibG9jaykpIHtcbiAgICBsZXQgW2hhbmRsZU9yQ29tcGlsYWJsZSwgc2NvcGUsIHRhYmxlXSA9IGJsb2NrO1xuXG4gICAgc3RhY2sucHVzaCh0YWJsZSk7XG4gICAgc3RhY2sucHVzaChzY29wZSk7XG4gICAgc3RhY2sucHVzaChoYW5kbGVPckNvbXBpbGFibGUpO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgc3RhY2sucHVzaChudWxsKTtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWRSZWZlcmVuY2UoaW5wdXQ6IFNjb3BlQmxvY2sgfCBSZWZlcmVuY2UpOiBpbnB1dCBpcyBSZWZlcmVuY2Uge1xuICBhc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShpbnB1dCkgfHwgaW5wdXQgPT09IFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gICAgJ2EgcmVmZXJlbmNlIG90aGVyIHRoYW4gVU5ERUZJTkVEX1JFRkVSRU5DRSBpcyBpbGxlZ2FsIGhlcmUnXG4gICk7XG4gIHJldHVybiBpbnB1dCA9PT0gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbn1cblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkhhc0Jsb2NrLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuICBsZXQgYmxvY2sgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tPcihDaGVja1Njb3BlQmxvY2ssIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlKSkpO1xuXG4gIGlmIChibG9jayAmJiAhaXNVbmRlZmluZWRSZWZlcmVuY2UoYmxvY2spKSB7XG4gICAgc3RhY2sucHVzaChUUlVFX1JFRkVSRU5DRSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhY2sucHVzaChGQUxTRV9SRUZFUkVOQ0UpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkhhc0Jsb2NrUGFyYW1zLCAodm0pID0+IHtcbiAgLy8gRklYTUUobW11bik6IHNob3VsZCBvbmx5IG5lZWQgdG8gcHVzaCB0aGUgc3ltYm9sIHRhYmxlXG4gIGxldCBibG9jayA9IHZtLnN0YWNrLnBvcCgpO1xuICBsZXQgc2NvcGUgPSB2bS5zdGFjay5wb3AoKTtcblxuICBjaGVjayhibG9jaywgQ2hlY2tNYXliZShDaGVja09yKENoZWNrSGFuZGxlLCBDaGVja0NvbXBpbGFibGVCbG9jaykpKTtcbiAgY2hlY2soc2NvcGUsIENoZWNrTWF5YmUoQ2hlY2tTY29wZSkpO1xuICBsZXQgdGFibGUgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tNYXliZShDaGVja0Jsb2NrU3ltYm9sVGFibGUpKTtcblxuICBsZXQgaGFzQmxvY2tQYXJhbXMgPSB0YWJsZSAmJiB0YWJsZS5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgdm0uc3RhY2sucHVzaChoYXNCbG9ja1BhcmFtcyA/IFRSVUVfUkVGRVJFTkNFIDogRkFMU0VfUkVGRVJFTkNFKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29uY2F0LCAodm0sIHsgb3AxOiBjb3VudCB9KSA9PiB7XG4gIGxldCBvdXQ6IEFycmF5PFJlZmVyZW5jZTx1bmtub3duPj4gPSBuZXcgQXJyYXkoY291bnQpO1xuXG4gIGZvciAobGV0IGkgPSBjb3VudDsgaSA+IDA7IGktLSkge1xuICAgIGxldCBvZmZzZXQgPSBpIC0gMTtcbiAgICBvdXRbb2Zmc2V0XSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIH1cblxuICB2bS5zdGFjay5wdXNoKGNyZWF0ZUNvbmNhdFJlZihvdXQpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSWZJbmxpbmUsICh2bSkgPT4ge1xuICBsZXQgY29uZGl0aW9uID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IHRydXRoeSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCBmYWxzeSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgdm0uc3RhY2sucHVzaChcbiAgICBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGlmICh0b0Jvb2wodmFsdWVGb3JSZWYoY29uZGl0aW9uKSkgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRm9yUmVmKHRydXRoeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWVGb3JSZWYoZmFsc3kpO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLk5vdCwgKHZtKSA9PiB7XG4gIGxldCByZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHZtLnN0YWNrLnB1c2goXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICByZXR1cm4gIXRvQm9vbCh2YWx1ZUZvclJlZihyZWYpKTtcbiAgICB9KVxuICApO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5HZXREeW5hbWljVmFyLCAodm0pID0+IHtcbiAgbGV0IHNjb3BlID0gdm0uZHluYW1pY1Njb3BlKCk7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgbmFtZVJlZiA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgc3RhY2sucHVzaChcbiAgICBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGxldCBuYW1lID0gU3RyaW5nKHZhbHVlRm9yUmVmKG5hbWVSZWYpKTtcbiAgICAgIHJldHVybiB2YWx1ZUZvclJlZihzY29wZS5nZXQobmFtZSkpO1xuICAgIH0pXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkxvZywgKHZtKSA9PiB7XG4gIGxldCB7IHBvc2l0aW9uYWwgfSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cykuY2FwdHVyZSgpO1xuXG4gIHZtLmxvYWRWYWx1ZShcbiAgICAkdjAsXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coLi4ucmVpZnlQb3NpdGlvbmFsKHBvc2l0aW9uYWwpKTtcbiAgICB9KVxuICApO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9