UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

324 lines (269 loc) 30.9 kB
"use strict"; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZXhwcmVzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFZQTs7QUFTQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFtQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFJQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBNkIsQ0FBQSxFQUFBLEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBTCxJQUFBO0FBQWEsRUFBQSxHQUFHLEVBQUU7QUFBbEIsQ0FBTCxLQUFzQztBQUNqRSxNQUFJLEtBQUssR0FBRyxFQUFFLENBQWQsS0FBQTtBQUVBLE1BQUksVUFBVSxHQUFTLEtBQUssQ0FBNUIsR0FBdUIsRUFBdkI7QUFDQSxNQUFJLFlBQVksR0FBUyxLQUFLLENBQTlCLEdBQXlCLEVBQXpCO0FBRUEsTUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFkLFFBQVksRUFBWjtBQUNBLE1BQUksUUFBUSxHQUFHLEVBQUUsQ0FBRixPQUFBLENBQWYsUUFBQTtBQUVBLE1BQUksUUFBUSxHQUFaLEtBQUE7O0FBRUEsTUFBQSxVQUFBLEVBQVc7QUFDVDtBQUNBLElBQUEsUUFBUSxHQUFHLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUFnQyx3QkFBM0MsU0FBMkMsQ0FBaEMsQ0FBWDtBQUNEOztBQUVELEVBQUEsRUFBRSxDQUFGLFNBQUEsQ0FBQSxPQUFBLEVBRUUseUJBQWMsSUFBZCxFQUFjLFVBQWQsRUFBYyxLQUFkLEVBQWMsWUFBZCxFQUFjLFFBQWQsRUFGRixRQUVFLENBRkY7QUFoQkYsQ0FBQTs7QUFzQkEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQXNDLEVBQUQsSUFBTztBQUMxQyxNQUFJLEtBQUssR0FBRyxFQUFFLENBQWQsS0FBQTtBQUNBLE1BQUksR0FBRyxHQUFTLEtBQUssQ0FB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QXNDLEVBQUQsSUFBTztBQUMxQyxNQUFJLEtBQUssR0FBRyxFQUFFLENBQWQsWUFBWSxFQUFaO0FBQ0EsTUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFkLEtBQUE7QUFDQSxNQUFJLE9BQU8sR0FBUyxLQUFLLENBQXpCLEdBQW9CLEVBQXBCO0FBRUEsRUFBQSxLQUFLLENBQUwsSUFBQSxDQUNFLGlDQUFpQixNQUFLO0FBQ3BCLFFBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyw0QkFBbEIsT0FBa0IsQ0FBRCxDQUFqQjtBQUNBLFdBQU8sNEJBQVksS0FBSyxDQUFMLEdBQUEsQ0FBbkIsSUFBbUIsQ0FBWixDQUFQO0FBSEosR0FDRSxDQURGO0FBTEYsQ0FBQTs7QUFhQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBNEIsRUFBRCxJQUFPO0FBQ2hDLE1BQUk7QUFBRSxJQUFBO0FBQUYsTUFBdUIsRUFBRSxDQUFGLEtBQUEsQ0FBTixHQUFNLEdBQTNCLE9BQTJCLEVBQTNCO0FBRUEsRUFBQSxFQUFFLENBQUYsU0FBQSxDQUFBLE9BQUEsRUFFRSxpQ0FBaUIsTUFBSztBQUNwQjtBQUNBLElBQUEsT0FBTyxDQUFQLEdBQUEsQ0FBWSxHQUFHLGdDQUFmLFVBQWUsQ0FBZjtBQUpKLEdBRUUsQ0FGRjtBQUhGLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMsXG4gIEN1cnJpZWRUeXBlLFxuICBIZWxwZXIsXG4gIEhlbHBlckRlZmluaXRpb25TdGF0ZSxcbiAgT3AsXG4gIE93bmVyLFxuICBSZXNvbHV0aW9uVGltZUNvbnN0YW50cyxcbiAgUnVudGltZUNvbnN0YW50cyxcbiAgU2NvcGVCbG9jayxcbiAgVk0gYXMgUHVibGljVk0sXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgUmVmZXJlbmNlLFxuICBjaGlsZFJlZkZvcixcbiAgVU5ERUZJTkVEX1JFRkVSRU5DRSxcbiAgVFJVRV9SRUZFUkVOQ0UsXG4gIEZBTFNFX1JFRkVSRU5DRSxcbiAgdmFsdWVGb3JSZWYsXG4gIGNyZWF0ZUNvbXB1dGVSZWYsXG59IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQgeyAkdjAgfSBmcm9tICdAZ2xpbW1lci92bSc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUyB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgY3JlYXRlQ29uY2F0UmVmIH0gZnJvbSAnLi4vZXhwcmVzc2lvbnMvY29uY2F0JztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQsIGRlc3Ryb3ksIF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuIH0gZnJvbSAnQGdsaW1tZXIvZGVzdHJveWFibGUnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NpZ24sIGRlYnVnVG9TdHJpbmcsIGRlY29kZUhhbmRsZSwgaXNPYmplY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IHRvQm9vbCB9IGZyb20gJ0BnbGltbWVyL2dsb2JhbC1jb250ZXh0JztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBDaGVja09wdGlvbixcbiAgQ2hlY2tIYW5kbGUsXG4gIENoZWNrQmxvY2tTeW1ib2xUYWJsZSxcbiAgQ2hlY2tPcixcbiAgQ2hlY2tNYXliZSxcbn0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHtcbiAgQ2hlY2tBcmd1bWVudHMsXG4gIENoZWNrUmVmZXJlbmNlLFxuICBDaGVja0NvbXBpbGFibGVCbG9jayxcbiAgQ2hlY2tTY29wZSxcbiAgQ2hlY2tIZWxwZXIsXG4gIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlLFxuICBDaGVja1Njb3BlQmxvY2ssXG4gIENoZWNrQ2FwdHVyZWRBcmd1bWVudHMsXG59IGZyb20gJy4vLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IGNyZWF0ZUN1cnJ5UmVmIGZyb20gJy4uLy4uL3JlZmVyZW5jZXMvY3VycnktdmFsdWUnO1xuaW1wb3J0IHsgaXNDdXJyaWVkVHlwZSwgcmVzb2x2ZUN1cnJpZWRWYWx1ZSB9IGZyb20gJy4uLy4uL2N1cnJpZWQtdmFsdWUnO1xuaW1wb3J0IHsgcmVpZnlQb3NpdGlvbmFsIH0gZnJvbSAnLi4vLi4vdm0vYXJndW1lbnRzJztcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gKHZtOiBQdWJsaWNWTSkgPT4gUmVmZXJlbmNlPFQ+O1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ3VycnksICh2bSwgeyBvcDE6IHR5cGUsIG9wMjogX2lzU3RyaWN0IH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG5cbiAgbGV0IGRlZmluaXRpb24gPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgY2FwdHVyZWRBcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQ2FwdHVyZWRBcmd1bWVudHMpO1xuXG4gIGxldCBvd25lciA9IHZtLmdldE93bmVyKCk7XG4gIGxldCByZXNvbHZlciA9IHZtLnJ1bnRpbWUucmVzb2x2ZXI7XG5cbiAgbGV0IGlzU3RyaWN0ID0gZmFsc2U7XG5cbiAgaWYgKERFQlVHKSB7XG4gICAgLy8gc3RyaWN0IGNoZWNrIG9ubHkgaGFwcGVucyBpbiBERUJVRyBidWlsZHMsIG5vIHJlYXNvbiB0byBsb2FkIGl0IG90aGVyd2lzZVxuICAgIGlzU3RyaWN0ID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxib29sZWFuPihkZWNvZGVIYW5kbGUoX2lzU3RyaWN0KSk7XG4gIH1cblxuICB2bS5sb2FkVmFsdWUoXG4gICAgJHYwLFxuICAgIGNyZWF0ZUN1cnJ5UmVmKHR5cGUgYXMgQ3VycmllZFR5cGUsIGRlZmluaXRpb24sIG93bmVyLCBjYXB0dXJlZEFyZ3MsIHJlc29sdmVyLCBpc1N0cmljdClcbiAgKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRHluYW1pY0hlbHBlciwgKHZtKSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgcmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tBcmd1bWVudHMpLmNhcHR1cmUoKTtcblxuICBsZXQgaGVscGVyUmVmOiBSZWZlcmVuY2U7XG4gIGxldCBpbml0aWFsT3duZXI6IE93bmVyID0gdm0uZ2V0T3duZXIoKTtcblxuICBsZXQgaGVscGVySW5zdGFuY2VSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICBpZiAoaGVscGVyUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3Ryb3koaGVscGVyUmVmKTtcbiAgICB9XG5cbiAgICBsZXQgZGVmaW5pdGlvbiA9IHZhbHVlRm9yUmVmKHJlZik7XG5cbiAgICBpZiAoaXNDdXJyaWVkVHlwZShkZWZpbml0aW9uLCBDdXJyaWVkVHlwZS5IZWxwZXIpKSB7XG4gICAgICBsZXQgeyBkZWZpbml0aW9uOiByZXNvbHZlZERlZiwgb3duZXIsIHBvc2l0aW9uYWwsIG5hbWVkIH0gPSByZXNvbHZlQ3VycmllZFZhbHVlKGRlZmluaXRpb24pO1xuXG4gICAgICBsZXQgaGVscGVyID0gcmVzb2x2ZUhlbHBlcih2bVtDT05TVEFOVFNdLCByZXNvbHZlZERlZiwgcmVmKTtcblxuICAgICAgaWYgKG5hbWVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncy5uYW1lZCA9IGFzc2lnbih7fSwgLi4ubmFtZWQsIGFyZ3MubmFtZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MucG9zaXRpb25hbCA9IHBvc2l0aW9uYWwuY29uY2F0KGFyZ3MucG9zaXRpb25hbCkgYXMgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzO1xuICAgICAgfVxuXG4gICAgICBoZWxwZXJSZWYgPSBoZWxwZXIoYXJncywgb3duZXIpO1xuXG4gICAgICBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkKGhlbHBlckluc3RhbmNlUmVmLCBoZWxwZXJSZWYpO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGVmaW5pdGlvbikpIHtcbiAgICAgIGxldCBoZWxwZXIgPSByZXNvbHZlSGVscGVyKHZtW0NPTlNUQU5UU10sIGRlZmluaXRpb24sIHJlZik7XG4gICAgICBoZWxwZXJSZWYgPSBoZWxwZXIoYXJncywgaW5pdGlhbE93bmVyKTtcblxuICAgICAgaWYgKF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuKGhlbHBlclJlZikpIHtcbiAgICAgICAgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZChoZWxwZXJJbnN0YW5jZVJlZiwgaGVscGVyUmVmKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVscGVyUmVmID0gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCBoZWxwZXJWYWx1ZVJlZiA9IGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgIHZhbHVlRm9yUmVmKGhlbHBlckluc3RhbmNlUmVmKTtcbiAgICByZXR1cm4gdmFsdWVGb3JSZWYoaGVscGVyUmVmKTtcbiAgfSk7XG5cbiAgdm0uYXNzb2NpYXRlRGVzdHJveWFibGUoaGVscGVySW5zdGFuY2VSZWYpO1xuICB2bS5sb2FkVmFsdWUoJHYwLCBoZWxwZXJWYWx1ZVJlZik7XG59KTtcblxuZnVuY3Rpb24gcmVzb2x2ZUhlbHBlcihcbiAgY29uc3RhbnRzOiBSdW50aW1lQ29uc3RhbnRzICYgUmVzb2x1dGlvblRpbWVDb25zdGFudHMsXG4gIGRlZmluaXRpb246IEhlbHBlckRlZmluaXRpb25TdGF0ZSxcbiAgcmVmOiBSZWZlcmVuY2Vcbik6IEhlbHBlciB7XG4gIGxldCBoYW5kbGUgPSBjb25zdGFudHMuaGVscGVyKGRlZmluaXRpb24sIG51bGwsIHRydWUpITtcblxuICBpZiAoREVCVUcgJiYgaGFuZGxlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV4cGVjdGVkIGEgZHluYW1pYyBoZWxwZXIgZGVmaW5pdGlvbiwgYnV0IHJlY2VpdmVkIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRpZCBub3QgaGF2ZSBhIGhlbHBlciBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhlIGR5bmFtaWMgaW52b2NhdGlvbiB3YXMgXFxge3ske1xuICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgfX19XFxgIG9yIFxcYCgke3JlZi5kZWJ1Z0xhYmVsfSlcXGAsIGFuZCB0aGUgaW5jb3JyZWN0IGRlZmluaXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBwYXRoIFxcYCR7XG4gICAgICAgIHJlZi5kZWJ1Z0xhYmVsXG4gICAgICB9XFxgLCB3aGljaCB3YXM6ICR7ZGVidWdUb1N0cmluZyEoZGVmaW5pdGlvbil9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29uc3RhbnRzLmdldFZhbHVlKGhhbmRsZSk7XG59XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5IZWxwZXIsICh2bSwgeyBvcDE6IGhhbmRsZSB9KSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgaGVscGVyID0gY2hlY2sodm1bQ09OU1RBTlRTXS5nZXRWYWx1ZShoYW5kbGUpLCBDaGVja0hlbHBlcik7XG4gIGxldCBhcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQXJndW1lbnRzKTtcbiAgbGV0IHZhbHVlID0gaGVscGVyKGFyZ3MuY2FwdHVyZSgpLCB2bS5nZXRPd25lcigpLCB2bS5keW5hbWljU2NvcGUoKSk7XG5cbiAgaWYgKF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuKHZhbHVlKSkge1xuICAgIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKHZhbHVlKTtcbiAgfVxuXG4gIHZtLmxvYWRWYWx1ZSgkdjAsIHZhbHVlKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0VmFyaWFibGUsICh2bSwgeyBvcDE6IHN5bWJvbCB9KSA9PiB7XG4gIGxldCBleHByID0gdm0ucmVmZXJlbmNlRm9yU3ltYm9sKHN5bWJvbCk7XG5cbiAgdm0uc3RhY2sucHVzaChleHByKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuU2V0VmFyaWFibGUsICh2bSwgeyBvcDE6IHN5bWJvbCB9KSA9PiB7XG4gIGxldCBleHByID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgdm0uc2NvcGUoKS5iaW5kU3ltYm9sKHN5bWJvbCwgZXhwcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlNldEJsb2NrLCAodm0sIHsgb3AxOiBzeW1ib2wgfSkgPT4ge1xuICBsZXQgaGFuZGxlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrQ29tcGlsYWJsZUJsb2NrKTtcbiAgbGV0IHNjb3BlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrU2NvcGUpO1xuICBsZXQgdGFibGUgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tCbG9ja1N5bWJvbFRhYmxlKTtcblxuICB2bS5zY29wZSgpLmJpbmRCbG9jayhzeW1ib2wsIFtoYW5kbGUsIHNjb3BlLCB0YWJsZV0pO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5SZXNvbHZlTWF5YmVMb2NhbCwgKHZtLCB7IG9wMTogX25hbWUgfSkgPT4ge1xuICBsZXQgbmFtZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZSk7XG4gIGxldCBsb2NhbHMgPSB2bS5zY29wZSgpLmdldFBhcnRpYWxNYXAoKSE7XG5cbiAgbGV0IHJlZiA9IGxvY2Fsc1tuYW1lXTtcbiAgaWYgKHJlZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVmID0gY2hpbGRSZWZGb3Iodm0uZ2V0U2VsZigpLCBuYW1lKTtcbiAgfVxuXG4gIHZtLnN0YWNrLnB1c2gocmVmKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUm9vdFNjb3BlLCAodm0sIHsgb3AxOiBzeW1ib2xzIH0pID0+IHtcbiAgdm0ucHVzaFJvb3RTY29wZShzeW1ib2xzLCB2bS5nZXRPd25lcigpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0UHJvcGVydHksICh2bSwgeyBvcDE6IF9rZXkgfSkgPT4ge1xuICBsZXQga2V5ID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9rZXkpO1xuICBsZXQgZXhwciA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIHZtLnN0YWNrLnB1c2goY2hpbGRSZWZGb3IoZXhwciwga2V5KSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkdldEJsb2NrLCAodm0sIHsgb3AxOiBfYmxvY2sgfSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCBibG9jayA9IHZtLnNjb3BlKCkuZ2V0QmxvY2soX2Jsb2NrKTtcblxuICBzdGFjay5wdXNoKGJsb2NrKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuU3ByZWFkQmxvY2ssICh2bSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCBibG9jayA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja09wdGlvbihDaGVja09yKENoZWNrU2NvcGVCbG9jaywgQ2hlY2tVbmRlZmluZWRSZWZlcmVuY2UpKSk7XG5cbiAgaWYgKGJsb2NrICYmICFpc1VuZGVmaW5lZFJlZmVyZW5jZShibG9jaykpIHtcbiAgICBsZXQgW2hhbmRsZU9yQ29tcGlsYWJsZSwgc2NvcGUsIHRhYmxlXSA9IGJsb2NrO1xuXG4gICAgc3RhY2sucHVzaCh0YWJsZSk7XG4gICAgc3RhY2sucHVzaChzY29wZSk7XG4gICAgc3RhY2sucHVzaChoYW5kbGVPckNvbXBpbGFibGUpO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgc3RhY2sucHVzaChudWxsKTtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWRSZWZlcmVuY2UoaW5wdXQ6IFNjb3BlQmxvY2sgfCBSZWZlcmVuY2UpOiBpbnB1dCBpcyBSZWZlcmVuY2Uge1xuICBhc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShpbnB1dCkgfHwgaW5wdXQgPT09IFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gICAgJ2EgcmVmZXJlbmNlIG90aGVyIHRoYW4gVU5ERUZJTkVEX1JFRkVSRU5DRSBpcyBpbGxlZ2FsIGhlcmUnXG4gICk7XG4gIHJldHVybiBpbnB1dCA9PT0gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbn1cblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkhhc0Jsb2NrLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuICBsZXQgYmxvY2sgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tPcihDaGVja1Njb3BlQmxvY2ssIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlKSkpO1xuXG4gIGlmIChibG9jayAmJiAhaXNVbmRlZmluZWRSZWZlcmVuY2UoYmxvY2spKSB7XG4gICAgc3RhY2sucHVzaChUUlVFX1JFRkVSRU5DRSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhY2sucHVzaChGQUxTRV9SRUZFUkVOQ0UpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkhhc0Jsb2NrUGFyYW1zLCAodm0pID0+IHtcbiAgLy8gRklYTUUobW11bik6IHNob3VsZCBvbmx5IG5lZWQgdG8gcHVzaCB0aGUgc3ltYm9sIHRhYmxlXG4gIGxldCBibG9jayA9IHZtLnN0YWNrLnBvcCgpO1xuICBsZXQgc2NvcGUgPSB2bS5zdGFjay5wb3AoKTtcblxuICBjaGVjayhibG9jaywgQ2hlY2tNYXliZShDaGVja09yKENoZWNrSGFuZGxlLCBDaGVja0NvbXBpbGFibGVCbG9jaykpKTtcbiAgY2hlY2soc2NvcGUsIENoZWNrTWF5YmUoQ2hlY2tTY29wZSkpO1xuICBsZXQgdGFibGUgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tNYXliZShDaGVja0Jsb2NrU3ltYm9sVGFibGUpKTtcblxuICBsZXQgaGFzQmxvY2tQYXJhbXMgPSB0YWJsZSAmJiB0YWJsZS5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgdm0uc3RhY2sucHVzaChoYXNCbG9ja1BhcmFtcyA/IFRSVUVfUkVGRVJFTkNFIDogRkFMU0VfUkVGRVJFTkNFKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29uY2F0LCAodm0sIHsgb3AxOiBjb3VudCB9KSA9PiB7XG4gIGxldCBvdXQ6IEFycmF5PFJlZmVyZW5jZTx1bmtub3duPj4gPSBuZXcgQXJyYXkoY291bnQpO1xuXG4gIGZvciAobGV0IGkgPSBjb3VudDsgaSA+IDA7IGktLSkge1xuICAgIGxldCBvZmZzZXQgPSBpIC0gMTtcbiAgICBvdXRbb2Zmc2V0XSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIH1cblxuICB2bS5zdGFjay5wdXNoKGNyZWF0ZUNvbmNhdFJlZihvdXQpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSWZJbmxpbmUsICh2bSkgPT4ge1xuICBsZXQgY29uZGl0aW9uID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IHRydXRoeSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCBmYWxzeSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgdm0uc3RhY2sucHVzaChcbiAgICBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGlmICh0b0Jvb2wodmFsdWVGb3JSZWYoY29uZGl0aW9uKSkgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRm9yUmVmKHRydXRoeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWVGb3JSZWYoZmFsc3kpO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLk5vdCwgKHZtKSA9PiB7XG4gIGxldCByZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHZtLnN0YWNrLnB1c2goXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICByZXR1cm4gIXRvQm9vbCh2YWx1ZUZvclJlZihyZWYpKTtcbiAgICB9KVxuICApO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5HZXREeW5hbWljVmFyLCAodm0pID0+IHtcbiAgbGV0IHNjb3BlID0gdm0uZHluYW1pY1Njb3BlKCk7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgbmFtZVJlZiA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgc3RhY2sucHVzaChcbiAgICBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGxldCBuYW1lID0gU3RyaW5nKHZhbHVlRm9yUmVmKG5hbWVSZWYpKTtcbiAgICAgIHJldHVybiB2YWx1ZUZvclJlZihzY29wZS5nZXQobmFtZSkpO1xuICAgIH0pXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkxvZywgKHZtKSA9PiB7XG4gIGxldCB7IHBvc2l0aW9uYWwgfSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cykuY2FwdHVyZSgpO1xuXG4gIHZtLmxvYWRWYWx1ZShcbiAgICAkdjAsXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coLi4ucmVpZnlQb3NpdGlvbmFsKHBvc2l0aW9uYWwpKTtcbiAgICB9KVxuICApO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9