UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

346 lines (316 loc) 28.8 kB
import { toBool } from '@glimmer/global-context'; import { valueForRef, isConstRef, createPrimitiveRef, UNDEFINED_REFERENCE, NULL_REFERENCE, TRUE_REFERENCE, FALSE_REFERENCE, createComputeRef, createConstRef } from '@glimmer/reference'; import { CONSTANT_TAG, valueForTag, validateTag, INITIAL, beginTrackFrame, endTrackFrame, consumeTag } from '@glimmer/validator'; import { assert, decodeHandle, decodeImmediate, isHandle } from '@glimmer/util'; import { stackAssert } from './assert'; import { APPEND_OPCODES } from '../../opcodes'; import { CONSTANTS } from '../../symbols'; APPEND_OPCODES.add(39 /* ChildScope */ , vm => vm.pushChildScope()); APPEND_OPCODES.add(40 /* PopScope */ , vm => vm.popScope()); APPEND_OPCODES.add(59 /* PushDynamicScope */ , vm => vm.pushDynamicScope()); APPEND_OPCODES.add(60 /* PopDynamicScope */ , vm => vm.popDynamicScope()); APPEND_OPCODES.add(28 /* Constant */ , (vm, { op1: other }) => { vm.stack.push(vm[CONSTANTS].getValue(decodeHandle(other))); }); APPEND_OPCODES.add(29 /* ConstantReference */ , (vm, { op1: other }) => { vm.stack.push(createConstRef(vm[CONSTANTS].getValue(decodeHandle(other)), false)); }); APPEND_OPCODES.add(30 /* Primitive */ , (vm, { op1: primitive }) => { let stack = vm.stack; if (isHandle(primitive)) { // it is a handle which does not already exist on the stack let value = vm[CONSTANTS].getValue(decodeHandle(primitive)); stack.push(value); } else { // is already an encoded immediate or primitive handle stack.push(decodeImmediate(primitive)); } }); APPEND_OPCODES.add(31 /* PrimitiveReference */ , vm => { let stack = vm.stack; let value = stack.pop(); let ref; if (value === undefined) { ref = UNDEFINED_REFERENCE; } else if (value === null) { ref = NULL_REFERENCE; } else if (value === true) { ref = TRUE_REFERENCE; } else if (value === false) { ref = FALSE_REFERENCE; } else { ref = createPrimitiveRef(value); } stack.push(ref); }); APPEND_OPCODES.add(33 /* Dup */ , (vm, { op1: register, op2: offset }) => { let position = vm.fetchValue(register) - offset; vm.stack.dup(position); }); APPEND_OPCODES.add(34 /* Pop */ , (vm, { op1: count }) => { vm.stack.pop(count); }); APPEND_OPCODES.add(35 /* Load */ , (vm, { op1: register }) => { vm.load(register); }); APPEND_OPCODES.add(36 /* Fetch */ , (vm, { op1: register }) => { vm.fetch(register); }); APPEND_OPCODES.add(58 /* BindDynamicScope */ , (vm, { op1: _names }) => { let names = vm[CONSTANTS].getArray(_names); vm.bindDynamicScope(names); }); APPEND_OPCODES.add(69 /* Enter */ , (vm, { op1: args }) => { vm.enter(args); }); APPEND_OPCODES.add(70 /* Exit */ , vm => { vm.exit(); }); APPEND_OPCODES.add(63 /* PushSymbolTable */ , (vm, { op1: _table }) => { let stack = vm.stack; stack.push(vm[CONSTANTS].getValue(_table)); }); APPEND_OPCODES.add(62 /* PushBlockScope */ , vm => { let stack = vm.stack; stack.push(vm.scope()); }); APPEND_OPCODES.add(61 /* CompileBlock */ , vm => { let stack = vm.stack; let block = stack.pop(); if (block) { stack.push(vm.compile(block)); } else { stack.push(null); } }); APPEND_OPCODES.add(64 /* InvokeYield */ , vm => { let { stack } = vm; let handle = stack.pop(); let scope = stack.pop(); let table = stack.pop(); (false && assert(table === null || table && typeof table === 'object' && Array.isArray(table.parameters), stackAssert('Option<BlockSymbolTable>', table))); let args = stack.pop(); if (table === null) { // To balance the pop{Frame,Scope} vm.pushFrame(); vm.pushScope(scope !== null && scope !== void 0 ? scope : vm.scope()); return; } let invokingScope = scope; // If necessary, create a child scope { let locals = table.parameters; let localsCount = locals.length; if (localsCount > 0) { invokingScope = invokingScope.child(); for (let i = 0; i < localsCount; i++) { invokingScope.bindSymbol(locals[i], args.at(i)); } } } vm.pushFrame(); vm.pushScope(invokingScope); vm.call(handle); }); APPEND_OPCODES.add(65 /* JumpIf */ , (vm, { op1: target }) => { let reference = vm.stack.pop(); let value = Boolean(valueForRef(reference)); if (isConstRef(reference)) { if (value === true) { vm.goto(target); } } else { if (value === true) { vm.goto(target); } vm.updateWith(new Assert(reference)); } }); APPEND_OPCODES.add(66 /* JumpUnless */ , (vm, { op1: target }) => { let reference = vm.stack.pop(); let value = Boolean(valueForRef(reference)); if (isConstRef(reference)) { if (value === false) { vm.goto(target); } } else { if (value === false) { vm.goto(target); } vm.updateWith(new Assert(reference)); } }); APPEND_OPCODES.add(67 /* JumpEq */ , (vm, { op1: target, op2: comparison }) => { let other = vm.stack.peek(); if (other === comparison) { vm.goto(target); } }); APPEND_OPCODES.add(68 /* AssertSame */ , vm => { let reference = vm.stack.peek(); if (isConstRef(reference) === false) { vm.updateWith(new Assert(reference)); } }); APPEND_OPCODES.add(71 /* ToBoolean */ , vm => { let { stack } = vm; let valueRef = stack.pop(); stack.push(createComputeRef(() => toBool(valueForRef(valueRef)))); }); export class Assert { constructor(ref) { this.ref = ref; this.last = valueForRef(ref); } evaluate(vm) { let { last, ref } = this; let current = valueForRef(ref); if (last !== current) { vm.throw(); } } } export class AssertFilter { constructor(ref, filter) { this.ref = ref; this.filter = filter; this.last = filter(valueForRef(ref)); } evaluate(vm) { let { last, ref, filter } = this; let current = filter(valueForRef(ref)); if (last !== current) { vm.throw(); } } } export class JumpIfNotModifiedOpcode { constructor() { this.tag = CONSTANT_TAG; this.lastRevision = INITIAL; } finalize(tag, target) { this.target = target; this.didModify(tag); } evaluate(vm) { let { tag, target, lastRevision } = this; if (!vm.alwaysRevalidate && validateTag(tag, lastRevision)) { consumeTag(tag); vm.goto(target); } } didModify(tag) { this.tag = tag; this.lastRevision = valueForTag(this.tag); consumeTag(tag); } } export class BeginTrackFrameOpcode { constructor(debugLabel) { this.debugLabel = debugLabel; } evaluate() { beginTrackFrame(this.debugLabel); } } export class EndTrackFrameOpcode { constructor(target) { this.target = target; } evaluate() { let tag = endTrackFrame(); this.target.didModify(tag); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxNQUFULFFBQXVCLHlCQUF2QjtBQUVBLFNBRUUsV0FGRixFQUdFLFVBSEYsRUFJRSxrQkFKRixFQUtFLG1CQUxGLEVBTUUsY0FORixFQU9FLGNBUEYsRUFRRSxlQVJGLEVBU0UsZ0JBVEYsRUFVRSxjQVZGLFFBV08sb0JBWFA7QUFZQSxTQUNFLFlBREYsRUFJRSxXQUpGLEVBS0UsV0FMRixFQU1FLE9BTkYsRUFPRSxlQVBGLEVBUUUsYUFSRixFQVNFLFVBVEYsUUFVTyxvQkFWUDtBQVdBLFNBQVMsTUFBVCxFQUFpQixZQUFqQixFQUErQixlQUEvQixFQUF3RCxRQUF4RCxRQUF3RSxlQUF4RTtBQVVBLFNBQVMsV0FBVCxRQUE0QixVQUE1QjtBQUNBLFNBQVMsY0FBVCxRQUErQixlQUEvQjtBQUlBLFNBQVMsU0FBVCxRQUEwQixlQUExQjtBQUdBLGNBQWMsQ0FBQyxHQUFmLENBQWtCO0FBQUE7QUFBbEIsRUFBbUMsRUFBRCxJQUFRLEVBQUUsQ0FBQyxjQUFILEVBQTFDO0FBRUEsY0FBYyxDQUFDLEdBQWYsQ0FBa0I7QUFBQTtBQUFsQixFQUFpQyxFQUFELElBQVEsRUFBRSxDQUFDLFFBQUgsRUFBeEM7QUFFQSxjQUFjLENBQUMsR0FBZixDQUFrQjtBQUFBO0FBQWxCLEVBQXlDLEVBQUQsSUFBUSxFQUFFLENBQUMsZ0JBQUgsRUFBaEQ7QUFFQSxjQUFjLENBQUMsR0FBZixDQUFrQjtBQUFBO0FBQWxCLEVBQXdDLEVBQUQsSUFBUSxFQUFFLENBQUMsZUFBSCxFQUEvQztBQUVBLGNBQWMsQ0FBQyxHQUFmLENBQWtCO0FBQUE7QUFBbEIsRUFBZ0MsQ0FBQyxFQUFELEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBRTtBQUFQLENBQUwsS0FBdUI7QUFDckQsRUFBQSxFQUFFLENBQUMs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QU4sQ0FBZjtBQUNEOztBQUwrQjtBQVFsQyxPQUFNLE1BQU8sbUJBQVAsQ0FBMEI7QUFDOUIsRUFBQSxXQUFBLENBQW9CLE1BQXBCLEVBQW1EO0FBQS9CLFNBQUEsTUFBQSxHQUFBLE1BQUE7QUFBbUM7O0FBRXZELEVBQUEsUUFBUSxHQUFBO0FBQ04sUUFBSSxHQUFHLEdBQUcsYUFBYSxFQUF2QjtBQUNBLFNBQUssTUFBTCxDQUFZLFNBQVosQ0FBc0IsR0FBdEI7QUFDRDs7QUFONkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0Jvb2wgfSBmcm9tICdAZ2xpbW1lci9nbG9iYWwtY29udGV4dCc7XG5pbXBvcnQgeyBDb21waWxhYmxlVGVtcGxhdGUsIE9wdGlvbiwgT3AsIFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBSZWZlcmVuY2UsXG4gIHZhbHVlRm9yUmVmLFxuICBpc0NvbnN0UmVmLFxuICBjcmVhdGVQcmltaXRpdmVSZWYsXG4gIFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gIE5VTExfUkVGRVJFTkNFLFxuICBUUlVFX1JFRkVSRU5DRSxcbiAgRkFMU0VfUkVGRVJFTkNFLFxuICBjcmVhdGVDb21wdXRlUmVmLFxuICBjcmVhdGVDb25zdFJlZixcbn0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7XG4gIENPTlNUQU5UX1RBRyxcbiAgUmV2aXNpb24sXG4gIFRhZyxcbiAgdmFsdWVGb3JUYWcsXG4gIHZhbGlkYXRlVGFnLFxuICBJTklUSUFMLFxuICBiZWdpblRyYWNrRnJhbWUsXG4gIGVuZFRyYWNrRnJhbWUsXG4gIGNvbnN1bWVUYWcsXG59IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyBhc3NlcnQsIGRlY29kZUhhbmRsZSwgZGVjb2RlSW1tZWRpYXRlLCBleHBlY3QsIGlzSGFuZGxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQge1xuICBDaGVja051bWJlcixcbiAgY2hlY2ssXG4gIENoZWNrSW5zdGFuY2VvZixcbiAgQ2hlY2tPcHRpb24sXG4gIENoZWNrQmxvY2tTeW1ib2xUYWJsZSxcbiAgQ2hlY2tIYW5kbGUsXG4gIENoZWNrUHJpbWl0aXZlLFxufSBmcm9tICdAZ2xpbW1lci9kZWJ1Zyc7XG5pbXBvcnQgeyBzdGFja0Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IEFQUEVORF9PUENPREVTIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBVcGRhdGluZ1ZNIH0gZnJvbSAnLi4vLi4vdm0nO1xuaW1wb3J0IHsgVk1Bcmd1bWVudHNJbXBsIH0gZnJvbSAnLi4vLi4vdm0vYXJndW1lbnRzJztcbmltcG9ydCB7IENoZWNrUmVmZXJlbmNlLCBDaGVja1Njb3BlIH0gZnJvbSAnLi8tZGVidWctc3RyaXAnO1xuaW1wb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBJbnRlcm5hbFZNIH0gZnJvbSAnLi4vLi4vdm0vYXBwZW5kJztcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNoaWxkU2NvcGUsICh2bSkgPT4gdm0ucHVzaENoaWxkU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3BTY29wZSwgKHZtKSA9PiB2bS5wb3BTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hEeW5hbWljU2NvcGUsICh2bSkgPT4gdm0ucHVzaER5bmFtaWNTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcER5bmFtaWNTY29wZSwgKHZtKSA9PiB2bS5wb3BEeW5hbWljU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudCwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudFJlZmVyZW5jZSwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKGNyZWF0ZUNvbnN0UmVmKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSksIGZhbHNlKSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlByaW1pdGl2ZSwgKHZtLCB7IG9wMTogcHJpbWl0aXZlIH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG5cbiAgaWYgKGlzSGFuZGxlKHByaW1pdGl2ZSkpIHtcbiAgICAvLyBpdCBpcyBhIGhhbmRsZSB3aGljaCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSBzdGFja1xuICAgIGxldCB2YWx1ZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKHByaW1pdGl2ZSkpO1xuICAgIHN0YWNrLnB1c2godmFsdWUgYXMgb2JqZWN0KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpcyBhbHJlYWR5IGFuIGVuY29kZWQgaW1tZWRpYXRlIG9yIHByaW1pdGl2ZSBoYW5kbGVcbiAgICBzdGFjay5wdXNoKGRlY29kZUltbWVkaWF0ZShwcmltaXRpdmUpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QcmltaXRpdmVSZWZlcmVuY2UsICh2bSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IHZhbHVlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUHJpbWl0aXZlKTtcbiAgbGV0IHJlZjtcblxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJlZiA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZWYgPSBOVUxMX1JFRkVSRU5DRTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJlZiA9IFRSVUVfUkVGRVJFTkNFO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIHJlZiA9IEZBTFNFX1JFRkVSRU5DRTtcbiAgfSBlbHNlIHtcbiAgICByZWYgPSBjcmVhdGVQcmltaXRpdmVSZWYodmFsdWUpO1xuICB9XG5cbiAgc3RhY2sucHVzaChyZWYpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5EdXAsICh2bSwgeyBvcDE6IHJlZ2lzdGVyLCBvcDI6IG9mZnNldCB9KSA9PiB7XG4gIGxldCBwb3NpdGlvbiA9IGNoZWNrKHZtLmZldGNoVmFsdWUocmVnaXN0ZXIpLCBDaGVja051bWJlcikgLSBvZmZzZXQ7XG4gIHZtLnN0YWNrLmR1cChwb3NpdGlvbik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcCwgKHZtLCB7IG9wMTogY291bnQgfSkgPT4ge1xuICB2bS5zdGFjay5wb3AoY291bnQpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Mb2FkLCAodm0sIHsgb3AxOiByZWdpc3RlciB9KSA9PiB7XG4gIHZtLmxvYWQocmVnaXN0ZXIpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5GZXRjaCwgKHZtLCB7IG9wMTogcmVnaXN0ZXIgfSkgPT4ge1xuICB2bS5mZXRjaChyZWdpc3Rlcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkJpbmREeW5hbWljU2NvcGUsICh2bSwgeyBvcDE6IF9uYW1lcyB9KSA9PiB7XG4gIGxldCBuYW1lcyA9IHZtW0NPTlNUQU5UU10uZ2V0QXJyYXk8c3RyaW5nPihfbmFtZXMpO1xuICB2bS5iaW5kRHluYW1pY1Njb3BlKG5hbWVzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRW50ZXIsICh2bSwgeyBvcDE6IGFyZ3MgfSkgPT4ge1xuICB2bS5lbnRlcihhcmdzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRXhpdCwgKHZtKSA9PiB7XG4gIHZtLmV4aXQoKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHVzaFN5bWJvbFRhYmxlLCAodm0sIHsgb3AxOiBfdGFibGUgfSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgc3RhY2sucHVzaCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKF90YWJsZSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QdXNoQmxvY2tTY29wZSwgKHZtKSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBzdGFjay5wdXNoKHZtLnNjb3BlKCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db21waWxlQmxvY2ssICh2bTogSW50ZXJuYWxWTSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IGJsb2NrID0gc3RhY2sucG9wPE9wdGlvbjxDb21waWxhYmxlVGVtcGxhdGU+IHwgMD4oKTtcblxuICBpZiAoYmxvY2spIHtcbiAgICBzdGFjay5wdXNoKHZtLmNvbXBpbGUoYmxvY2spKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkludm9rZVlpZWxkLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuXG4gIGxldCBoYW5kbGUgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tIYW5kbGUpKTtcbiAgbGV0IHNjb3BlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrU2NvcGUpKTtcbiAgbGV0IHRhYmxlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrQmxvY2tTeW1ib2xUYWJsZSkpO1xuXG4gIGFzc2VydChcbiAgICB0YWJsZSA9PT0gbnVsbCB8fCAodGFibGUgJiYgdHlwZW9mIHRhYmxlID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHRhYmxlLnBhcmFtZXRlcnMpKSxcbiAgICBzdGFja0Fzc2VydCgnT3B0aW9uPEJsb2NrU3ltYm9sVGFibGU+JywgdGFibGUpXG4gICk7XG5cbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tJbnN0YW5jZW9mKFZNQXJndW1lbnRzSW1wbCkpO1xuXG4gIGlmICh0YWJsZSA9PT0gbnVsbCkge1xuICAgIC8vIFRvIGJhbGFuY2UgdGhlIHBvcHtGcmFtZSxTY29wZX1cbiAgICB2bS5wdXNoRnJhbWUoKTtcbiAgICB2bS5wdXNoU2NvcGUoc2NvcGUgPz8gdm0uc2NvcGUoKSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaW52b2tpbmdTY29wZSA9IGV4cGVjdChzY29wZSwgJ0JVRzogZXhwZWN0ZWQgc2NvcGUnKTtcblxuICAvLyBJZiBuZWNlc3NhcnksIGNyZWF0ZSBhIGNoaWxkIHNjb3BlXG4gIHtcbiAgICBsZXQgbG9jYWxzID0gdGFibGUucGFyYW1ldGVycztcbiAgICBsZXQgbG9jYWxzQ291bnQgPSBsb2NhbHMubGVuZ3RoO1xuXG4gICAgaWYgKGxvY2Fsc0NvdW50ID4gMCkge1xuICAgICAgaW52b2tpbmdTY29wZSA9IGludm9raW5nU2NvcGUuY2hpbGQoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbHNDb3VudDsgaSsrKSB7XG4gICAgICAgIGludm9raW5nU2NvcGUuYmluZFN5bWJvbChsb2NhbHMhW2ldLCBhcmdzLmF0KGkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2bS5wdXNoRnJhbWUoKTtcbiAgdm0ucHVzaFNjb3BlKGludm9raW5nU2NvcGUpO1xuICB2bS5jYWxsKGhhbmRsZSEpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5KdW1wSWYsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuXG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkp1bXBVbmxlc3MsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG5cbiAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQocmVmZXJlbmNlKSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSnVtcEVxLCAodm0sIHsgb3AxOiB0YXJnZXQsIG9wMjogY29tcGFyaXNvbiB9KSA9PiB7XG4gIGxldCBvdGhlciA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tOdW1iZXIpO1xuXG4gIGlmIChvdGhlciA9PT0gY29tcGFyaXNvbikge1xuICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Bc3NlcnRTYW1lLCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkgPT09IGZhbHNlKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlRvQm9vbGVhbiwgKHZtKSA9PiB7XG4gIGxldCB7IHN0YWNrIH0gPSB2bTtcbiAgbGV0IHZhbHVlUmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBzdGFjay5wdXNoKGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4gdG9Cb29sKHZhbHVlRm9yUmVmKHZhbHVlUmVmKSkpKTtcbn0pO1xuXG5leHBvcnQgY2xhc3MgQXNzZXJ0IGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIGxhc3Q6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IFJlZmVyZW5jZSkge1xuICAgIHRoaXMubGFzdCA9IHZhbHVlRm9yUmVmKHJlZik7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IGxhc3QsIHJlZiB9ID0gdGhpcztcbiAgICBsZXQgY3VycmVudCA9IHZhbHVlRm9yUmVmKHJlZik7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2VydEZpbHRlcjxULCBVPiBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSBsYXN0OiBVO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBSZWZlcmVuY2U8VD4sIHByaXZhdGUgZmlsdGVyOiAoZnJvbTogVCkgPT4gVSkge1xuICAgIHRoaXMubGFzdCA9IGZpbHRlcih2YWx1ZUZvclJlZihyZWYpKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgbGV0IHsgbGFzdCwgcmVmLCBmaWx0ZXIgfSA9IHRoaXM7XG4gICAgbGV0IGN1cnJlbnQgPSBmaWx0ZXIodmFsdWVGb3JSZWYocmVmKSk7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIHRhZzogVGFnID0gQ09OU1RBTlRfVEFHO1xuICBwcml2YXRlIGxhc3RSZXZpc2lvbjogUmV2aXNpb24gPSBJTklUSUFMO1xuICBwcml2YXRlIHRhcmdldD86IG51bWJlcjtcblxuICBmaW5hbGl6ZSh0YWc6IFRhZywgdGFyZ2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLmRpZE1vZGlmeSh0YWcpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyB0YWcsIHRhcmdldCwgbGFzdFJldmlzaW9uIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF2bS5hbHdheXNSZXZhbGlkYXRlICYmIHZhbGlkYXRlVGFnKHRhZywgbGFzdFJldmlzaW9uKSkge1xuICAgICAgY29uc3VtZVRhZyh0YWcpO1xuICAgICAgdm0uZ290byhleHBlY3QodGFyZ2V0LCAnVk0gQlVHOiBUYXJnZXQgbXVzdCBiZSBzZXQgYmVmb3JlIGF0dGVtcHRpbmcgdG8ganVtcCcpKTtcbiAgICB9XG4gIH1cblxuICBkaWRNb2RpZnkodGFnOiBUYWcpIHtcbiAgICB0aGlzLnRhZyA9IHRhZztcbiAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHZhbHVlRm9yVGFnKHRoaXMudGFnKTtcbiAgICBjb25zdW1lVGFnKHRhZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJlZ2luVHJhY2tGcmFtZU9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWJ1Z0xhYmVsPzogc3RyaW5nKSB7fVxuXG4gIGV2YWx1YXRlKCkge1xuICAgIGJlZ2luVHJhY2tGcmFtZSh0aGlzLmRlYnVnTGFiZWwpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmRUcmFja0ZyYW1lT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcmdldDogSnVtcElmTm90TW9kaWZpZWRPcGNvZGUpIHt9XG5cbiAgZXZhbHVhdGUoKSB7XG4gICAgbGV0IHRhZyA9IGVuZFRyYWNrRnJhbWUoKTtcbiAgICB0aGlzLnRhcmdldC5kaWRNb2RpZnkodGFnKTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==