UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

289 lines (267 loc) 31 kB
import { childRefFor, UNDEFINED_REFERENCE, TRUE_REFERENCE, FALSE_REFERENCE, valueForRef, createComputeRef } from '@glimmer/reference'; import { $v0 } from '@glimmer/vm'; import { APPEND_OPCODES } from '../../opcodes'; import { createConcatRef } from '../expressions/concat'; import { associateDestroyableChild, destroy, _hasDestroyableChildren } from '@glimmer/destroyable'; import { assert, assign, debugToString, decodeHandle, isObject } from '@glimmer/util'; import { toBool } from '@glimmer/global-context'; import { CONSTANTS } from '../../symbols'; import { DEBUG } from '@glimmer/env'; import createCurryRef from '../../references/curry-value'; import { isCurriedType, resolveCurriedValue } from '../../curried-value'; import { reifyPositional } from '../../vm/arguments'; 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 (DEBUG) { // strict check only happens in DEBUG builds, no reason to load it otherwise isStrict = vm[CONSTANTS].getValue(decodeHandle(_isStrict)); } vm.loadValue($v0, createCurryRef(type, definition, owner, capturedArgs, resolver, isStrict)); }); 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 = createComputeRef(() => { if (helperRef !== undefined) { destroy(helperRef); } let definition = valueForRef(ref); if (isCurriedType(definition, 1 /* Helper */ )) { let { definition: resolvedDef, owner, positional, named } = resolveCurriedValue(definition); let helper = resolveHelper(vm[CONSTANTS], resolvedDef, ref); if (named !== undefined) { args.named = assign({}, ...named, args.named); } if (positional !== undefined) { args.positional = positional.concat(args.positional); } helperRef = helper(args, owner); associateDestroyableChild(helperInstanceRef, helperRef); } else if (isObject(definition)) { let helper = resolveHelper(vm[CONSTANTS], definition, ref); helperRef = helper(args, initialOwner); if (_hasDestroyableChildren(helperRef)) { associateDestroyableChild(helperInstanceRef, helperRef); } } else { helperRef = UNDEFINED_REFERENCE; } }); let helperValueRef = createComputeRef(() => { valueForRef(helperInstanceRef); return valueForRef(helperRef); }); vm.associateDestroyable(helperInstanceRef); vm.loadValue($v0, helperValueRef); }); function resolveHelper(constants, definition, ref) { let handle = constants.helper(definition, null, true); if (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: ${debugToString(definition)}`); } return constants.getValue(handle); } APPEND_OPCODES.add(16 /* Helper */ , (vm, { op1: handle }) => { let stack = vm.stack; let helper = vm[CONSTANTS].getValue(handle); let args = stack.pop(); let value = helper(args.capture(), vm.getOwner(), vm.dynamicScope()); if (_hasDestroyableChildren(value)) { vm.associateDestroyable(value); } vm.loadValue($v0, value); }); APPEND_OPCODES.add(21 /* GetVariable */ , (vm, { op1: symbol }) => { let expr = vm.referenceForSymbol(symbol); vm.stack.push(expr); }); APPEND_OPCODES.add(19 /* SetVariable */ , (vm, { op1: symbol }) => { let expr = vm.stack.pop(); vm.scope().bindSymbol(symbol, expr); }); 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]); }); APPEND_OPCODES.add(102 /* ResolveMaybeLocal */ , (vm, { op1: _name }) => { let name = vm[CONSTANTS].getValue(_name); let locals = vm.scope().getPartialMap(); let ref = locals[name]; if (ref === undefined) { ref = childRefFor(vm.getSelf(), name); } vm.stack.push(ref); }); APPEND_OPCODES.add(37 /* RootScope */ , (vm, { op1: symbols }) => { vm.pushRootScope(symbols, vm.getOwner()); }); APPEND_OPCODES.add(22 /* GetProperty */ , (vm, { op1: _key }) => { let key = vm[CONSTANTS].getValue(_key); let expr = vm.stack.pop(); vm.stack.push(childRefFor(expr, key)); }); APPEND_OPCODES.add(23 /* GetBlock */ , (vm, { op1: _block }) => { let { stack } = vm; let block = vm.scope().getBlock(_block); stack.push(block); }); 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 && assert(Array.isArray(input) || input === UNDEFINED_REFERENCE, 'a reference other than UNDEFINED_REFERENCE is illegal here')); return input === UNDEFINED_REFERENCE; } APPEND_OPCODES.add(25 /* HasBlock */ , vm => { let { stack } = vm; let block = stack.pop(); if (block && !isUndefinedReference(block)) { stack.push(TRUE_REFERENCE); } else { stack.push(FALSE_REFERENCE); } }); 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 ? TRUE_REFERENCE : FALSE_REFERENCE); }); 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(createConcatRef(out)); }); APPEND_OPCODES.add(109 /* IfInline */ , vm => { let condition = vm.stack.pop(); let truthy = vm.stack.pop(); let falsy = vm.stack.pop(); vm.stack.push(createComputeRef(() => { if (toBool(valueForRef(condition)) === true) { return valueForRef(truthy); } else { return valueForRef(falsy); } })); }); APPEND_OPCODES.add(110 /* Not */ , vm => { let ref = vm.stack.pop(); vm.stack.push(createComputeRef(() => { return !toBool(valueForRef(ref)); })); }); APPEND_OPCODES.add(111 /* GetDynamicVar */ , vm => { let scope = vm.dynamicScope(); let stack = vm.stack; let nameRef = stack.pop(); stack.push(createComputeRef(() => { let name = String(valueForRef(nameRef)); return valueForRef(scope.get(name)); })); }); APPEND_OPCODES.add(112 /* Log */ , vm => { let { positional } = vm.stack.pop().capture(); vm.loadValue($v0, createComputeRef(() => { // eslint-disable-next-line no-console console.log(...reifyPositional(positional)); })); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZXhwcmVzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBWUEsU0FFRSxXQUZGLEVBR0UsbUJBSEYsRUFJRSxjQUpGLEVBS0UsZUFMRixFQU1FLFdBTkYsRUFPRSxnQkFQRixRQVFPLG9CQVJQO0FBU0EsU0FBUyxHQUFULFFBQW9CLGFBQXBCO0FBQ0EsU0FBUyxjQUFULFFBQStCLGVBQS9CO0FBQ0EsU0FBUyxlQUFULFFBQWdDLHVCQUFoQztBQUNBLFNBQVMseUJBQVQsRUFBb0MsT0FBcEMsRUFBNkMsdUJBQTdDLFFBQTRFLHNCQUE1RTtBQUNBLFNBQVMsTUFBVCxFQUFpQixNQUFqQixFQUF5QixhQUF6QixFQUF3QyxZQUF4QyxFQUFzRCxRQUF0RCxRQUFzRSxlQUF0RTtBQUNBLFNBQVMsTUFBVCxRQUF1Qix5QkFBdkI7QUFtQkEsU0FBUyxTQUFULFFBQTBCLGVBQTFCO0FBQ0EsU0FBUyxLQUFULFFBQXNCLGNBQXRCO0FBQ0EsT0FBTyxjQUFQLE1BQTJCLDhCQUEzQjtBQUNBLFNBQVMsYUFBVCxFQUF3QixtQkFBeEIsUUFBbUQscUJBQW5EO0FBQ0EsU0FBUyxlQUFULFFBQWdDLG9CQUFoQztBQUlBLGNBQWMsQ0FBQyxHQUFmLENBQWtCO0FBQUE7QUFBbEIsRUFBNkIsQ0FBQyxFQUFELEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBRSxJQUFQO0FBQWEsRUFBQSxHQUFHLEVBQUU7QUFBbEIsQ0FBTCxLQUFzQztBQUNqRSxNQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBZjtBQUVBLE1BQUksVUFBVSxHQUFTLEtBQUssQ0FBQyxHQUFOLEVBQXZCO0FBQ0EsTUFBSSxZQUFZLEdBQVMsS0FBSyxDQUFDLEdBQU4sRUFBekI7QUFFQSxNQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBSCxFQUFaO0FBQ0EsTUFBSSxRQUFRLEdBQUcsRUFB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LEdBQU4sQ0FBVSxJQUFWLENBQUQsQ0FBbEI7QUFDRCxHQUhlLENBRGxCO0FBTUQsQ0FYRDtBQWFBLGNBQWMsQ0FBQyxHQUFmLENBQWtCO0FBQUE7QUFBbEIsRUFBNEIsRUFBRCxJQUFPO0FBQ2hDLE1BQUk7QUFBRSxJQUFBO0FBQUYsTUFBdUIsRUFBRSxDQUFDLEtBQUgsQ0FBUyxHQUFULEVBQU4sQ0FBc0MsT0FBdEMsRUFBckI7QUFFQSxFQUFBLEVBQUUsQ0FBQyxTQUFILENBQ0UsR0FERixFQUVFLGdCQUFnQixDQUFDLE1BQUs7QUFDcEI7QUFDQSxJQUFBLE9BQU8sQ0FBQyxHQUFSLENBQVksR0FBRyxlQUFlLENBQUMsVUFBRCxDQUE5QjtBQUNELEdBSGUsQ0FGbEI7QUFPRCxDQVZEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzLFxuICBDdXJyaWVkVHlwZSxcbiAgSGVscGVyLFxuICBIZWxwZXJEZWZpbml0aW9uU3RhdGUsXG4gIE9wLFxuICBPd25lcixcbiAgUmVzb2x1dGlvblRpbWVDb25zdGFudHMsXG4gIFJ1bnRpbWVDb25zdGFudHMsXG4gIFNjb3BlQmxvY2ssXG4gIFZNIGFzIFB1YmxpY1ZNLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIFJlZmVyZW5jZSxcbiAgY2hpbGRSZWZGb3IsXG4gIFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gIFRSVUVfUkVGRVJFTkNFLFxuICBGQUxTRV9SRUZFUkVOQ0UsXG4gIHZhbHVlRm9yUmVmLFxuICBjcmVhdGVDb21wdXRlUmVmLFxufSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgJHYwIH0gZnJvbSAnQGdsaW1tZXIvdm0nO1xuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IGNyZWF0ZUNvbmNhdFJlZiB9IGZyb20gJy4uL2V4cHJlc3Npb25zL2NvbmNhdCc7XG5pbXBvcnQgeyBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkLCBkZXN0cm95LCBfaGFzRGVzdHJveWFibGVDaGlsZHJlbiB9IGZyb20gJ0BnbGltbWVyL2Rlc3Ryb3lhYmxlJztcbmltcG9ydCB7IGFzc2VydCwgYXNzaWduLCBkZWJ1Z1RvU3RyaW5nLCBkZWNvZGVIYW5kbGUsIGlzT2JqZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyB0b0Jvb2wgfSBmcm9tICdAZ2xpbW1lci9nbG9iYWwtY29udGV4dCc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgQ2hlY2tPcHRpb24sXG4gIENoZWNrSGFuZGxlLFxuICBDaGVja0Jsb2NrU3ltYm9sVGFibGUsXG4gIENoZWNrT3IsXG4gIENoZWNrTWF5YmUsXG59IGZyb20gJ0BnbGltbWVyL2RlYnVnJztcbmltcG9ydCB7XG4gIENoZWNrQXJndW1lbnRzLFxuICBDaGVja1JlZmVyZW5jZSxcbiAgQ2hlY2tDb21waWxhYmxlQmxvY2ssXG4gIENoZWNrU2NvcGUsXG4gIENoZWNrSGVscGVyLFxuICBDaGVja1VuZGVmaW5lZFJlZmVyZW5jZSxcbiAgQ2hlY2tTY29wZUJsb2NrLFxuICBDaGVja0NhcHR1cmVkQXJndW1lbnRzLFxufSBmcm9tICcuLy1kZWJ1Zy1zdHJpcCc7XG5pbXBvcnQgeyBDT05TVEFOVFMgfSBmcm9tICcuLi8uLi9zeW1ib2xzJztcbmltcG9ydCB7IERFQlVHIH0gZnJvbSAnQGdsaW1tZXIvZW52JztcbmltcG9ydCBjcmVhdGVDdXJyeVJlZiBmcm9tICcuLi8uLi9yZWZlcmVuY2VzL2N1cnJ5LXZhbHVlJztcbmltcG9ydCB7IGlzQ3VycmllZFR5cGUsIHJlc29sdmVDdXJyaWVkVmFsdWUgfSBmcm9tICcuLi8uLi9jdXJyaWVkLXZhbHVlJztcbmltcG9ydCB7IHJlaWZ5UG9zaXRpb25hbCB9IGZyb20gJy4uLy4uL3ZtL2FyZ3VtZW50cyc7XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uRXhwcmVzc2lvbjxUPiA9ICh2bTogUHVibGljVk0pID0+IFJlZmVyZW5jZTxUPjtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkN1cnJ5LCAodm0sIHsgb3AxOiB0eXBlLCBvcDI6IF9pc1N0cmljdCB9KSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuXG4gIGxldCBkZWZpbml0aW9uID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGNhcHR1cmVkQXJncyA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja0NhcHR1cmVkQXJndW1lbnRzKTtcblxuICBsZXQgb3duZXIgPSB2bS5nZXRPd25lcigpO1xuICBsZXQgcmVzb2x2ZXIgPSB2bS5ydW50aW1lLnJlc29sdmVyO1xuXG4gIGxldCBpc1N0cmljdCA9IGZhbHNlO1xuXG4gIGlmIChERUJVRykge1xuICAgIC8vIHN0cmljdCBjaGVjayBvbmx5IGhhcHBlbnMgaW4gREVCVUcgYnVpbGRzLCBubyByZWFzb24gdG8gbG9hZCBpdCBvdGhlcndpc2VcbiAgICBpc1N0cmljdCA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8Ym9vbGVhbj4oZGVjb2RlSGFuZGxlKF9pc1N0cmljdCkpO1xuICB9XG5cbiAgdm0ubG9hZFZhbHVlKFxuICAgICR2MCxcbiAgICBjcmVhdGVDdXJyeVJlZih0eXBlIGFzIEN1cnJpZWRUeXBlLCBkZWZpbml0aW9uLCBvd25lciwgY2FwdHVyZWRBcmdzLCByZXNvbHZlciwgaXNTdHJpY3QpXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkR5bmFtaWNIZWxwZXIsICh2bSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IHJlZiA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCBhcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQXJndW1lbnRzKS5jYXB0dXJlKCk7XG5cbiAgbGV0IGhlbHBlclJlZjogUmVmZXJlbmNlO1xuICBsZXQgaW5pdGlhbE93bmVyOiBPd25lciA9IHZtLmdldE93bmVyKCk7XG5cbiAgbGV0IGhlbHBlckluc3RhbmNlUmVmID0gY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgaWYgKGhlbHBlclJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0cm95KGhlbHBlclJlZik7XG4gICAgfVxuXG4gICAgbGV0IGRlZmluaXRpb24gPSB2YWx1ZUZvclJlZihyZWYpO1xuXG4gICAgaWYgKGlzQ3VycmllZFR5cGUoZGVmaW5pdGlvbiwgQ3VycmllZFR5cGUuSGVscGVyKSkge1xuICAgICAgbGV0IHsgZGVmaW5pdGlvbjogcmVzb2x2ZWREZWYsIG93bmVyLCBwb3NpdGlvbmFsLCBuYW1lZCB9ID0gcmVzb2x2ZUN1cnJpZWRWYWx1ZShkZWZpbml0aW9uKTtcblxuICAgICAgbGV0IGhlbHBlciA9IHJlc29sdmVIZWxwZXIodm1bQ09OU1RBTlRTXSwgcmVzb2x2ZWREZWYsIHJlZik7XG5cbiAgICAgIGlmIChuYW1lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MubmFtZWQgPSBhc3NpZ24oe30sIC4uLm5hbWVkLCBhcmdzLm5hbWVkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhcmdzLnBvc2l0aW9uYWwgPSBwb3NpdGlvbmFsLmNvbmNhdChhcmdzLnBvc2l0aW9uYWwpIGFzIENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cztcbiAgICAgIH1cblxuICAgICAgaGVscGVyUmVmID0gaGVscGVyKGFyZ3MsIG93bmVyKTtcblxuICAgICAgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZChoZWxwZXJJbnN0YW5jZVJlZiwgaGVscGVyUmVmKTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICBsZXQgaGVscGVyID0gcmVzb2x2ZUhlbHBlcih2bVtDT05TVEFOVFNdLCBkZWZpbml0aW9uLCByZWYpO1xuICAgICAgaGVscGVyUmVmID0gaGVscGVyKGFyZ3MsIGluaXRpYWxPd25lcik7XG5cbiAgICAgIGlmIChfaGFzRGVzdHJveWFibGVDaGlsZHJlbihoZWxwZXJSZWYpKSB7XG4gICAgICAgIGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQoaGVscGVySW5zdGFuY2VSZWYsIGhlbHBlclJlZik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlbHBlclJlZiA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgfVxuICB9KTtcblxuICBsZXQgaGVscGVyVmFsdWVSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICB2YWx1ZUZvclJlZihoZWxwZXJJbnN0YW5jZVJlZik7XG4gICAgcmV0dXJuIHZhbHVlRm9yUmVmKGhlbHBlclJlZik7XG4gIH0pO1xuXG4gIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKGhlbHBlckluc3RhbmNlUmVmKTtcbiAgdm0ubG9hZFZhbHVlKCR2MCwgaGVscGVyVmFsdWVSZWYpO1xufSk7XG5cbmZ1bmN0aW9uIHJlc29sdmVIZWxwZXIoXG4gIGNvbnN0YW50czogUnVudGltZUNvbnN0YW50cyAmIFJlc29sdXRpb25UaW1lQ29uc3RhbnRzLFxuICBkZWZpbml0aW9uOiBIZWxwZXJEZWZpbml0aW9uU3RhdGUsXG4gIHJlZjogUmVmZXJlbmNlXG4pOiBIZWxwZXIge1xuICBsZXQgaGFuZGxlID0gY29uc3RhbnRzLmhlbHBlcihkZWZpbml0aW9uLCBudWxsLCB0cnVlKSE7XG5cbiAgaWYgKERFQlVHICYmIGhhbmRsZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFeHBlY3RlZCBhIGR5bmFtaWMgaGVscGVyIGRlZmluaXRpb24sIGJ1dCByZWNlaXZlZCBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkaWQgbm90IGhhdmUgYSBoZWxwZXIgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggaXQuIFRoZSBkeW5hbWljIGludm9jYXRpb24gd2FzIFxcYHt7JHtcbiAgICAgICAgcmVmLmRlYnVnTGFiZWxcbiAgICAgIH19fVxcYCBvciBcXGAoJHtyZWYuZGVidWdMYWJlbH0pXFxgLCBhbmQgdGhlIGluY29ycmVjdCBkZWZpbml0aW9uIGlzIHRoZSB2YWx1ZSBhdCB0aGUgcGF0aCBcXGAke1xuICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgfVxcYCwgd2hpY2ggd2FzOiAke2RlYnVnVG9TdHJpbmchKGRlZmluaXRpb24pfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNvbnN0YW50cy5nZXRWYWx1ZShoYW5kbGUpO1xufVxuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSGVscGVyLCAodm0sIHsgb3AxOiBoYW5kbGUgfSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IGhlbHBlciA9IGNoZWNrKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoaGFuZGxlKSwgQ2hlY2tIZWxwZXIpO1xuICBsZXQgYXJncyA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cyk7XG4gIGxldCB2YWx1ZSA9IGhlbHBlcihhcmdzLmNhcHR1cmUoKSwgdm0uZ2V0T3duZXIoKSwgdm0uZHluYW1pY1Njb3BlKCkpO1xuXG4gIGlmIChfaGFzRGVzdHJveWFibGVDaGlsZHJlbih2YWx1ZSkpIHtcbiAgICB2bS5hc3NvY2lhdGVEZXN0cm95YWJsZSh2YWx1ZSk7XG4gIH1cblxuICB2bS5sb2FkVmFsdWUoJHYwLCB2YWx1ZSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkdldFZhcmlhYmxlLCAodm0sIHsgb3AxOiBzeW1ib2wgfSkgPT4ge1xuICBsZXQgZXhwciA9IHZtLnJlZmVyZW5jZUZvclN5bWJvbChzeW1ib2wpO1xuXG4gIHZtLnN0YWNrLnB1c2goZXhwcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlNldFZhcmlhYmxlLCAodm0sIHsgb3AxOiBzeW1ib2wgfSkgPT4ge1xuICBsZXQgZXhwciA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIHZtLnNjb3BlKCkuYmluZFN5bWJvbChzeW1ib2wsIGV4cHIpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5TZXRCbG9jaywgKHZtLCB7IG9wMTogc3ltYm9sIH0pID0+IHtcbiAgbGV0IGhhbmRsZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja0NvbXBpbGFibGVCbG9jayk7XG4gIGxldCBzY29wZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1Njb3BlKTtcbiAgbGV0IHRhYmxlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrQmxvY2tTeW1ib2xUYWJsZSk7XG5cbiAgdm0uc2NvcGUoKS5iaW5kQmxvY2soc3ltYm9sLCBbaGFuZGxlLCBzY29wZSwgdGFibGVdKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUmVzb2x2ZU1heWJlTG9jYWwsICh2bSwgeyBvcDE6IF9uYW1lIH0pID0+IHtcbiAgbGV0IG5hbWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWUpO1xuICBsZXQgbG9jYWxzID0gdm0uc2NvcGUoKS5nZXRQYXJ0aWFsTWFwKCkhO1xuXG4gIGxldCByZWYgPSBsb2NhbHNbbmFtZV07XG4gIGlmIChyZWYgPT09IHVuZGVmaW5lZCkge1xuICAgIHJlZiA9IGNoaWxkUmVmRm9yKHZtLmdldFNlbGYoKSwgbmFtZSk7XG4gIH1cblxuICB2bS5zdGFjay5wdXNoKHJlZik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlJvb3RTY29wZSwgKHZtLCB7IG9wMTogc3ltYm9scyB9KSA9PiB7XG4gIHZtLnB1c2hSb290U2NvcGUoc3ltYm9scywgdm0uZ2V0T3duZXIoKSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkdldFByb3BlcnR5LCAodm0sIHsgb3AxOiBfa2V5IH0pID0+IHtcbiAgbGV0IGtleSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfa2V5KTtcbiAgbGV0IGV4cHIgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICB2bS5zdGFjay5wdXNoKGNoaWxkUmVmRm9yKGV4cHIsIGtleSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5HZXRCbG9jaywgKHZtLCB7IG9wMTogX2Jsb2NrIH0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuICBsZXQgYmxvY2sgPSB2bS5zY29wZSgpLmdldEJsb2NrKF9ibG9jayk7XG5cbiAgc3RhY2sucHVzaChibG9jayk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlNwcmVhZEJsb2NrLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuICBsZXQgYmxvY2sgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tPcihDaGVja1Njb3BlQmxvY2ssIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlKSkpO1xuXG4gIGlmIChibG9jayAmJiAhaXNVbmRlZmluZWRSZWZlcmVuY2UoYmxvY2spKSB7XG4gICAgbGV0IFtoYW5kbGVPckNvbXBpbGFibGUsIHNjb3BlLCB0YWJsZV0gPSBibG9jaztcblxuICAgIHN0YWNrLnB1c2godGFibGUpO1xuICAgIHN0YWNrLnB1c2goc2NvcGUpO1xuICAgIHN0YWNrLnB1c2goaGFuZGxlT3JDb21waWxhYmxlKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgc3RhY2sucHVzaChudWxsKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkUmVmZXJlbmNlKGlucHV0OiBTY29wZUJsb2NrIHwgUmVmZXJlbmNlKTogaW5wdXQgaXMgUmVmZXJlbmNlIHtcbiAgYXNzZXJ0KFxuICAgIEFycmF5LmlzQXJyYXkoaW5wdXQpIHx8IGlucHV0ID09PSBVTkRFRklORURfUkVGRVJFTkNFLFxuICAgICdhIHJlZmVyZW5jZSBvdGhlciB0aGFuIFVOREVGSU5FRF9SRUZFUkVOQ0UgaXMgaWxsZWdhbCBoZXJlJ1xuICApO1xuICByZXR1cm4gaW5wdXQgPT09IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG59XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5IYXNCbG9jaywgKHZtKSA9PiB7XG4gIGxldCB7IHN0YWNrIH0gPSB2bTtcbiAgbGV0IGJsb2NrID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrT3IoQ2hlY2tTY29wZUJsb2NrLCBDaGVja1VuZGVmaW5lZFJlZmVyZW5jZSkpKTtcblxuICBpZiAoYmxvY2sgJiYgIWlzVW5kZWZpbmVkUmVmZXJlbmNlKGJsb2NrKSkge1xuICAgIHN0YWNrLnB1c2goVFJVRV9SRUZFUkVOQ0UpO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2goRkFMU0VfUkVGRVJFTkNFKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5IYXNCbG9ja1BhcmFtcywgKHZtKSA9PiB7XG4gIC8vIEZJWE1FKG1tdW4pOiBzaG91bGQgb25seSBuZWVkIHRvIHB1c2ggdGhlIHN5bWJvbCB0YWJsZVxuICBsZXQgYmxvY2sgPSB2bS5zdGFjay5wb3AoKTtcbiAgbGV0IHNjb3BlID0gdm0uc3RhY2sucG9wKCk7XG5cbiAgY2hlY2soYmxvY2ssIENoZWNrTWF5YmUoQ2hlY2tPcihDaGVja0hhbmRsZSwgQ2hlY2tDb21waWxhYmxlQmxvY2spKSk7XG4gIGNoZWNrKHNjb3BlLCBDaGVja01heWJlKENoZWNrU2NvcGUpKTtcbiAgbGV0IHRhYmxlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrTWF5YmUoQ2hlY2tCbG9ja1N5bWJvbFRhYmxlKSk7XG5cbiAgbGV0IGhhc0Jsb2NrUGFyYW1zID0gdGFibGUgJiYgdGFibGUucGFyYW1ldGVycy5sZW5ndGg7XG4gIHZtLnN0YWNrLnB1c2goaGFzQmxvY2tQYXJhbXMgPyBUUlVFX1JFRkVSRU5DRSA6IEZBTFNFX1JFRkVSRU5DRSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNvbmNhdCwgKHZtLCB7IG9wMTogY291bnQgfSkgPT4ge1xuICBsZXQgb3V0OiBBcnJheTxSZWZlcmVuY2U8dW5rbm93bj4+ID0gbmV3IEFycmF5KGNvdW50KTtcblxuICBmb3IgKGxldCBpID0gY291bnQ7IGkgPiAwOyBpLS0pIHtcbiAgICBsZXQgb2Zmc2V0ID0gaSAtIDE7XG4gICAgb3V0W29mZnNldF0gPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICB9XG5cbiAgdm0uc3RhY2sucHVzaChjcmVhdGVDb25jYXRSZWYob3V0KSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLklmSW5saW5lLCAodm0pID0+IHtcbiAgbGV0IGNvbmRpdGlvbiA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCB0cnV0aHkgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgZmFsc3kgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHZtLnN0YWNrLnB1c2goXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICBpZiAodG9Cb29sKHZhbHVlRm9yUmVmKGNvbmRpdGlvbikpID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUZvclJlZih0cnV0aHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRm9yUmVmKGZhbHN5KTtcbiAgICAgIH1cbiAgICB9KVxuICApO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Ob3QsICh2bSkgPT4ge1xuICBsZXQgcmVmID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICB2bS5zdGFjay5wdXNoKFxuICAgIGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgICAgcmV0dXJuICF0b0Jvb2wodmFsdWVGb3JSZWYocmVmKSk7XG4gICAgfSlcbiAgKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0RHluYW1pY1ZhciwgKHZtKSA9PiB7XG4gIGxldCBzY29wZSA9IHZtLmR5bmFtaWNTY29wZSgpO1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IG5hbWVSZWYgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHN0YWNrLnB1c2goXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICBsZXQgbmFtZSA9IFN0cmluZyh2YWx1ZUZvclJlZihuYW1lUmVmKSk7XG4gICAgICByZXR1cm4gdmFsdWVGb3JSZWYoc2NvcGUuZ2V0KG5hbWUpKTtcbiAgICB9KVxuICApO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Mb2csICh2bSkgPT4ge1xuICBsZXQgeyBwb3NpdGlvbmFsIH0gPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tBcmd1bWVudHMpLmNhcHR1cmUoKTtcblxuICB2bS5sb2FkVmFsdWUoXG4gICAgJHYwLFxuICAgIGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKC4uLnJlaWZ5UG9zaXRpb25hbChwb3NpdGlvbmFsKSk7XG4gICAgfSlcbiAgKTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==