@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
348 lines (313 loc) • 30.3 kB
JavaScript
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 */
, function (vm) {
return vm.pushChildScope();
});
APPEND_OPCODES.add(40
/* PopScope */
, function (vm) {
return vm.popScope();
});
APPEND_OPCODES.add(59
/* PushDynamicScope */
, function (vm) {
return vm.pushDynamicScope();
});
APPEND_OPCODES.add(60
/* PopDynamicScope */
, function (vm) {
return vm.popDynamicScope();
});
APPEND_OPCODES.add(28
/* Constant */
, function (vm, _ref) {
var other = _ref.op1;
vm.stack.push(vm[CONSTANTS].getValue(decodeHandle(other)));
});
APPEND_OPCODES.add(29
/* ConstantReference */
, function (vm, _ref2) {
var other = _ref2.op1;
vm.stack.push(createConstRef(vm[CONSTANTS].getValue(decodeHandle(other)), false));
});
APPEND_OPCODES.add(30
/* Primitive */
, function (vm, _ref3) {
var primitive = _ref3.op1;
var stack = vm.stack;
if (isHandle(primitive)) {
// it is a handle which does not already exist on the stack
var 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 */
, function (vm) {
var stack = vm.stack;
var value = stack.pop();
var 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 */
, function (vm, _ref4) {
var register = _ref4.op1,
offset = _ref4.op2;
var position = vm.fetchValue(register) - offset;
vm.stack.dup(position);
});
APPEND_OPCODES.add(34
/* Pop */
, function (vm, _ref5) {
var count = _ref5.op1;
vm.stack.pop(count);
});
APPEND_OPCODES.add(35
/* Load */
, function (vm, _ref6) {
var register = _ref6.op1;
vm.load(register);
});
APPEND_OPCODES.add(36
/* Fetch */
, function (vm, _ref7) {
var register = _ref7.op1;
vm.fetch(register);
});
APPEND_OPCODES.add(58
/* BindDynamicScope */
, function (vm, _ref8) {
var _names = _ref8.op1;
var names = vm[CONSTANTS].getArray(_names);
vm.bindDynamicScope(names);
});
APPEND_OPCODES.add(69
/* Enter */
, function (vm, _ref9) {
var args = _ref9.op1;
vm.enter(args);
});
APPEND_OPCODES.add(70
/* Exit */
, function (vm) {
vm.exit();
});
APPEND_OPCODES.add(63
/* PushSymbolTable */
, function (vm, _ref10) {
var _table = _ref10.op1;
var stack = vm.stack;
stack.push(vm[CONSTANTS].getValue(_table));
});
APPEND_OPCODES.add(62
/* PushBlockScope */
, function (vm) {
var stack = vm.stack;
stack.push(vm.scope());
});
APPEND_OPCODES.add(61
/* CompileBlock */
, function (vm) {
var stack = vm.stack;
var block = stack.pop();
if (block) {
stack.push(vm.compile(block));
} else {
stack.push(null);
}
});
APPEND_OPCODES.add(64
/* InvokeYield */
, function (vm) {
var stack = vm.stack;
var handle = stack.pop();
var scope = stack.pop();
var table = stack.pop();
false && assert(table === null || table && typeof table === 'object' && Array.isArray(table.parameters), stackAssert('Option<BlockSymbolTable>', table));
var 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;
}
var invokingScope = scope; // If necessary, create a child scope
{
var locals = table.parameters;
var localsCount = locals.length;
if (localsCount > 0) {
invokingScope = invokingScope.child();
for (var 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 */
, function (vm, _ref11) {
var target = _ref11.op1;
var reference = vm.stack.pop();
var 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 */
, function (vm, _ref12) {
var target = _ref12.op1;
var reference = vm.stack.pop();
var 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 */
, function (vm, _ref13) {
var target = _ref13.op1,
comparison = _ref13.op2;
var other = vm.stack.peek();
if (other === comparison) {
vm["goto"](target);
}
});
APPEND_OPCODES.add(68
/* AssertSame */
, function (vm) {
var reference = vm.stack.peek();
if (isConstRef(reference) === false) {
vm.updateWith(new Assert(reference));
}
});
APPEND_OPCODES.add(71
/* ToBoolean */
, function (vm) {
var stack = vm.stack;
var valueRef = stack.pop();
stack.push(createComputeRef(function () {
return toBool(valueForRef(valueRef));
}));
});
export var Assert = /*#__PURE__*/function () {
function Assert(ref) {
this.ref = ref;
this.last = valueForRef(ref);
}
var _proto = Assert.prototype;
_proto.evaluate = function evaluate(vm) {
var last = this.last,
ref = this.ref;
var current = valueForRef(ref);
if (last !== current) {
vm["throw"]();
}
};
return Assert;
}();
export var AssertFilter = /*#__PURE__*/function () {
function AssertFilter(ref, filter) {
this.ref = ref;
this.filter = filter;
this.last = filter(valueForRef(ref));
}
var _proto2 = AssertFilter.prototype;
_proto2.evaluate = function evaluate(vm) {
var last = this.last,
ref = this.ref,
filter = this.filter;
var current = filter(valueForRef(ref));
if (last !== current) {
vm["throw"]();
}
};
return AssertFilter;
}();
export var JumpIfNotModifiedOpcode = /*#__PURE__*/function () {
function JumpIfNotModifiedOpcode() {
this.tag = CONSTANT_TAG;
this.lastRevision = INITIAL;
}
var _proto3 = JumpIfNotModifiedOpcode.prototype;
_proto3.finalize = function finalize(tag, target) {
this.target = target;
this.didModify(tag);
};
_proto3.evaluate = function evaluate(vm) {
var tag = this.tag,
target = this.target,
lastRevision = this.lastRevision;
if (!vm.alwaysRevalidate && validateTag(tag, lastRevision)) {
consumeTag(tag);
vm["goto"](target);
}
};
_proto3.didModify = function didModify(tag) {
this.tag = tag;
this.lastRevision = valueForTag(this.tag);
consumeTag(tag);
};
return JumpIfNotModifiedOpcode;
}();
export var BeginTrackFrameOpcode = /*#__PURE__*/function () {
function BeginTrackFrameOpcode(debugLabel) {
this.debugLabel = debugLabel;
}
var _proto4 = BeginTrackFrameOpcode.prototype;
_proto4.evaluate = function evaluate() {
beginTrackFrame(this.debugLabel);
};
return BeginTrackFrameOpcode;
}();
export var EndTrackFrameOpcode = /*#__PURE__*/function () {
function EndTrackFrameOpcode(target) {
this.target = target;
}
var _proto5 = EndTrackFrameOpcode.prototype;
_proto5.evaluate = function evaluate() {
var tag = endTrackFrame();
this.target.didModify(tag);
};
return EndTrackFrameOpcode;
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBQSxNQUFBLFFBQUEseUJBQUE7QUFFQSxTQUFBLFdBQUEsRUFBQSxVQUFBLEVBQUEsa0JBQUEsRUFBQSxtQkFBQSxFQUFBLGNBQUEsRUFBQSxjQUFBLEVBQUEsZUFBQSxFQUFBLGdCQUFBLEVBQUEsY0FBQSxRQUFBLG9CQUFBO0FBWUEsU0FBQSxZQUFBLEVBQUEsV0FBQSxFQUFBLFdBQUEsRUFBQSxPQUFBLEVBQUEsZUFBQSxFQUFBLGFBQUEsRUFBQSxVQUFBLFFBQUEsb0JBQUE7QUFXQSxTQUFBLE1BQUEsRUFBQSxZQUFBLEVBQUEsZUFBQSxFQUFBLFFBQUEsUUFBQSxlQUFBO0FBVUEsU0FBQSxXQUFBLFFBQUEsVUFBQTtBQUNBLFNBQUEsY0FBQSxRQUFBLGVBQUE7QUFJQSxTQUFBLFNBQUEsUUFBQSxlQUFBO0FBR0EsY0FBYyxDQUFkLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFtQyxVQUFBLEVBQUQ7QUFBQSxTQUFRLEVBQUUsQ0FBNUMsY0FBMEMsRUFBUjtBQUFBLENBQWxDO0FBRUEsY0FBYyxDQUFkLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFpQyxVQUFBLEVBQUQ7QUFBQSxTQUFRLEVBQUUsQ0FBMUMsUUFBd0MsRUFBUjtBQUFBLENBQWhDO0FBRUEsY0FBYyxDQUFkLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUF5QyxVQUFBLEVBQUQ7QUFBQSxTQUFRLEVBQUUsQ0FBbEQsZ0JBQWdELEVBQVI7QUFBQSxDQUF4QztBQUVBLGNBQWMsQ0FBZCxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBd0MsVUFBQSxFQUFEO0FBQUEsU0FBUSxFQUFFLENBQWpELGVBQStDLEVBQVI7QUFBQSxDQUF2QztBQUVBLGNBQWMsQ0FBZCxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBZ0Ms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QSxVQUFVLENBQVYsR0FBVSxDQUFWO0FBQ0QsR0F2Qkg7O0FBQUE7QUFBQTtBQTBCQSxXQUFNLHFCQUFOO0FBQ0UsaUNBQUEsVUFBQSxFQUF1QztBQUFuQixTQUFBLFVBQUEsR0FBQSxVQUFBO0FBQXVCOztBQUQ3Qzs7QUFBQSxVQUdFLFFBSEYsR0FHRSxvQkFBUTtBQUNOLElBQUEsZUFBZSxDQUFDLEtBQWhCLFVBQWUsQ0FBZjtBQUNELEdBTEg7O0FBQUE7QUFBQTtBQVFBLFdBQU0sbUJBQU47QUFDRSwrQkFBQSxNQUFBLEVBQW1EO0FBQS9CLFNBQUEsTUFBQSxHQUFBLE1BQUE7QUFBbUM7O0FBRHpEOztBQUFBLFVBR0UsUUFIRixHQUdFLG9CQUFRO0FBQ04sUUFBSSxHQUFHLEdBQUcsYUFBVixFQUFBO0FBQ0EsU0FBQSxNQUFBLENBQUEsU0FBQSxDQUFBLEdBQUE7QUFDRCxHQU5IOztBQUFBO0FBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0Jvb2wgfSBmcm9tICdAZ2xpbW1lci9nbG9iYWwtY29udGV4dCc7XG5pbXBvcnQgeyBDb21waWxhYmxlVGVtcGxhdGUsIE9wdGlvbiwgT3AsIFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBSZWZlcmVuY2UsXG4gIHZhbHVlRm9yUmVmLFxuICBpc0NvbnN0UmVmLFxuICBjcmVhdGVQcmltaXRpdmVSZWYsXG4gIFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gIE5VTExfUkVGRVJFTkNFLFxuICBUUlVFX1JFRkVSRU5DRSxcbiAgRkFMU0VfUkVGRVJFTkNFLFxuICBjcmVhdGVDb21wdXRlUmVmLFxuICBjcmVhdGVDb25zdFJlZixcbn0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7XG4gIENPTlNUQU5UX1RBRyxcbiAgUmV2aXNpb24sXG4gIFRhZyxcbiAgdmFsdWVGb3JUYWcsXG4gIHZhbGlkYXRlVGFnLFxuICBJTklUSUFMLFxuICBiZWdpblRyYWNrRnJhbWUsXG4gIGVuZFRyYWNrRnJhbWUsXG4gIGNvbnN1bWVUYWcsXG59IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyBhc3NlcnQsIGRlY29kZUhhbmRsZSwgZGVjb2RlSW1tZWRpYXRlLCBleHBlY3QsIGlzSGFuZGxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQge1xuICBDaGVja051bWJlcixcbiAgY2hlY2ssXG4gIENoZWNrSW5zdGFuY2VvZixcbiAgQ2hlY2tPcHRpb24sXG4gIENoZWNrQmxvY2tTeW1ib2xUYWJsZSxcbiAgQ2hlY2tIYW5kbGUsXG4gIENoZWNrUHJpbWl0aXZlLFxufSBmcm9tICdAZ2xpbW1lci9kZWJ1Zyc7XG5pbXBvcnQgeyBzdGFja0Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IEFQUEVORF9PUENPREVTIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBVcGRhdGluZ1ZNIH0gZnJvbSAnLi4vLi4vdm0nO1xuaW1wb3J0IHsgVk1Bcmd1bWVudHNJbXBsIH0gZnJvbSAnLi4vLi4vdm0vYXJndW1lbnRzJztcbmltcG9ydCB7IENoZWNrUmVmZXJlbmNlLCBDaGVja1Njb3BlIH0gZnJvbSAnLi8tZGVidWctc3RyaXAnO1xuaW1wb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBJbnRlcm5hbFZNIH0gZnJvbSAnLi4vLi4vdm0vYXBwZW5kJztcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNoaWxkU2NvcGUsICh2bSkgPT4gdm0ucHVzaENoaWxkU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3BTY29wZSwgKHZtKSA9PiB2bS5wb3BTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hEeW5hbWljU2NvcGUsICh2bSkgPT4gdm0ucHVzaER5bmFtaWNTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcER5bmFtaWNTY29wZSwgKHZtKSA9PiB2bS5wb3BEeW5hbWljU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudCwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudFJlZmVyZW5jZSwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKGNyZWF0ZUNvbnN0UmVmKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSksIGZhbHNlKSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlByaW1pdGl2ZSwgKHZtLCB7IG9wMTogcHJpbWl0aXZlIH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG5cbiAgaWYgKGlzSGFuZGxlKHByaW1pdGl2ZSkpIHtcbiAgICAvLyBpdCBpcyBhIGhhbmRsZSB3aGljaCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSBzdGFja1xuICAgIGxldCB2YWx1ZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKHByaW1pdGl2ZSkpO1xuICAgIHN0YWNrLnB1c2godmFsdWUgYXMgb2JqZWN0KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpcyBhbHJlYWR5IGFuIGVuY29kZWQgaW1tZWRpYXRlIG9yIHByaW1pdGl2ZSBoYW5kbGVcbiAgICBzdGFjay5wdXNoKGRlY29kZUltbWVkaWF0ZShwcmltaXRpdmUpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QcmltaXRpdmVSZWZlcmVuY2UsICh2bSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IHZhbHVlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUHJpbWl0aXZlKTtcbiAgbGV0IHJlZjtcblxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJlZiA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZWYgPSBOVUxMX1JFRkVSRU5DRTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJlZiA9IFRSVUVfUkVGRVJFTkNFO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIHJlZiA9IEZBTFNFX1JFRkVSRU5DRTtcbiAgfSBlbHNlIHtcbiAgICByZWYgPSBjcmVhdGVQcmltaXRpdmVSZWYodmFsdWUpO1xuICB9XG5cbiAgc3RhY2sucHVzaChyZWYpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5EdXAsICh2bSwgeyBvcDE6IHJlZ2lzdGVyLCBvcDI6IG9mZnNldCB9KSA9PiB7XG4gIGxldCBwb3NpdGlvbiA9IGNoZWNrKHZtLmZldGNoVmFsdWUocmVnaXN0ZXIpLCBDaGVja051bWJlcikgLSBvZmZzZXQ7XG4gIHZtLnN0YWNrLmR1cChwb3NpdGlvbik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcCwgKHZtLCB7IG9wMTogY291bnQgfSkgPT4ge1xuICB2bS5zdGFjay5wb3AoY291bnQpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Mb2FkLCAodm0sIHsgb3AxOiByZWdpc3RlciB9KSA9PiB7XG4gIHZtLmxvYWQocmVnaXN0ZXIpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5GZXRjaCwgKHZtLCB7IG9wMTogcmVnaXN0ZXIgfSkgPT4ge1xuICB2bS5mZXRjaChyZWdpc3Rlcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkJpbmREeW5hbWljU2NvcGUsICh2bSwgeyBvcDE6IF9uYW1lcyB9KSA9PiB7XG4gIGxldCBuYW1lcyA9IHZtW0NPTlNUQU5UU10uZ2V0QXJyYXk8c3RyaW5nPihfbmFtZXMpO1xuICB2bS5iaW5kRHluYW1pY1Njb3BlKG5hbWVzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRW50ZXIsICh2bSwgeyBvcDE6IGFyZ3MgfSkgPT4ge1xuICB2bS5lbnRlcihhcmdzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRXhpdCwgKHZtKSA9PiB7XG4gIHZtLmV4aXQoKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHVzaFN5bWJvbFRhYmxlLCAodm0sIHsgb3AxOiBfdGFibGUgfSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgc3RhY2sucHVzaCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKF90YWJsZSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QdXNoQmxvY2tTY29wZSwgKHZtKSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBzdGFjay5wdXNoKHZtLnNjb3BlKCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db21waWxlQmxvY2ssICh2bTogSW50ZXJuYWxWTSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IGJsb2NrID0gc3RhY2sucG9wPE9wdGlvbjxDb21waWxhYmxlVGVtcGxhdGU+IHwgMD4oKTtcblxuICBpZiAoYmxvY2spIHtcbiAgICBzdGFjay5wdXNoKHZtLmNvbXBpbGUoYmxvY2spKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkludm9rZVlpZWxkLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuXG4gIGxldCBoYW5kbGUgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tIYW5kbGUpKTtcbiAgbGV0IHNjb3BlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrU2NvcGUpKTtcbiAgbGV0IHRhYmxlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrQmxvY2tTeW1ib2xUYWJsZSkpO1xuXG4gIGFzc2VydChcbiAgICB0YWJsZSA9PT0gbnVsbCB8fCAodGFibGUgJiYgdHlwZW9mIHRhYmxlID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHRhYmxlLnBhcmFtZXRlcnMpKSxcbiAgICBzdGFja0Fzc2VydCgnT3B0aW9uPEJsb2NrU3ltYm9sVGFibGU+JywgdGFibGUpXG4gICk7XG5cbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tJbnN0YW5jZW9mKFZNQXJndW1lbnRzSW1wbCkpO1xuXG4gIGlmICh0YWJsZSA9PT0gbnVsbCkge1xuICAgIC8vIFRvIGJhbGFuY2UgdGhlIHBvcHtGcmFtZSxTY29wZX1cbiAgICB2bS5wdXNoRnJhbWUoKTtcbiAgICB2bS5wdXNoU2NvcGUoc2NvcGUgPz8gdm0uc2NvcGUoKSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaW52b2tpbmdTY29wZSA9IGV4cGVjdChzY29wZSwgJ0JVRzogZXhwZWN0ZWQgc2NvcGUnKTtcblxuICAvLyBJZiBuZWNlc3NhcnksIGNyZWF0ZSBhIGNoaWxkIHNjb3BlXG4gIHtcbiAgICBsZXQgbG9jYWxzID0gdGFibGUucGFyYW1ldGVycztcbiAgICBsZXQgbG9jYWxzQ291bnQgPSBsb2NhbHMubGVuZ3RoO1xuXG4gICAgaWYgKGxvY2Fsc0NvdW50ID4gMCkge1xuICAgICAgaW52b2tpbmdTY29wZSA9IGludm9raW5nU2NvcGUuY2hpbGQoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbHNDb3VudDsgaSsrKSB7XG4gICAgICAgIGludm9raW5nU2NvcGUuYmluZFN5bWJvbChsb2NhbHMhW2ldLCBhcmdzLmF0KGkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2bS5wdXNoRnJhbWUoKTtcbiAgdm0ucHVzaFNjb3BlKGludm9raW5nU2NvcGUpO1xuICB2bS5jYWxsKGhhbmRsZSEpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5KdW1wSWYsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuXG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkp1bXBVbmxlc3MsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG5cbiAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQocmVmZXJlbmNlKSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSnVtcEVxLCAodm0sIHsgb3AxOiB0YXJnZXQsIG9wMjogY29tcGFyaXNvbiB9KSA9PiB7XG4gIGxldCBvdGhlciA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tOdW1iZXIpO1xuXG4gIGlmIChvdGhlciA9PT0gY29tcGFyaXNvbikge1xuICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Bc3NlcnRTYW1lLCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkgPT09IGZhbHNlKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlRvQm9vbGVhbiwgKHZtKSA9PiB7XG4gIGxldCB7IHN0YWNrIH0gPSB2bTtcbiAgbGV0IHZhbHVlUmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBzdGFjay5wdXNoKGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4gdG9Cb29sKHZhbHVlRm9yUmVmKHZhbHVlUmVmKSkpKTtcbn0pO1xuXG5leHBvcnQgY2xhc3MgQXNzZXJ0IGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIGxhc3Q6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IFJlZmVyZW5jZSkge1xuICAgIHRoaXMubGFzdCA9IHZhbHVlRm9yUmVmKHJlZik7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IGxhc3QsIHJlZiB9ID0gdGhpcztcbiAgICBsZXQgY3VycmVudCA9IHZhbHVlRm9yUmVmKHJlZik7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2VydEZpbHRlcjxULCBVPiBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSBsYXN0OiBVO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBSZWZlcmVuY2U8VD4sIHByaXZhdGUgZmlsdGVyOiAoZnJvbTogVCkgPT4gVSkge1xuICAgIHRoaXMubGFzdCA9IGZpbHRlcih2YWx1ZUZvclJlZihyZWYpKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgbGV0IHsgbGFzdCwgcmVmLCBmaWx0ZXIgfSA9IHRoaXM7XG4gICAgbGV0IGN1cnJlbnQgPSBmaWx0ZXIodmFsdWVGb3JSZWYocmVmKSk7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIHRhZzogVGFnID0gQ09OU1RBTlRfVEFHO1xuICBwcml2YXRlIGxhc3RSZXZpc2lvbjogUmV2aXNpb24gPSBJTklUSUFMO1xuICBwcml2YXRlIHRhcmdldD86IG51bWJlcjtcblxuICBmaW5hbGl6ZSh0YWc6IFRhZywgdGFyZ2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLmRpZE1vZGlmeSh0YWcpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyB0YWcsIHRhcmdldCwgbGFzdFJldmlzaW9uIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF2bS5hbHdheXNSZXZhbGlkYXRlICYmIHZhbGlkYXRlVGFnKHRhZywgbGFzdFJldmlzaW9uKSkge1xuICAgICAgY29uc3VtZVRhZyh0YWcpO1xuICAgICAgdm0uZ290byhleHBlY3QodGFyZ2V0LCAnVk0gQlVHOiBUYXJnZXQgbXVzdCBiZSBzZXQgYmVmb3JlIGF0dGVtcHRpbmcgdG8ganVtcCcpKTtcbiAgICB9XG4gIH1cblxuICBkaWRNb2RpZnkodGFnOiBUYWcpIHtcbiAgICB0aGlzLnRhZyA9IHRhZztcbiAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHZhbHVlRm9yVGFnKHRoaXMudGFnKTtcbiAgICBjb25zdW1lVGFnKHRhZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJlZ2luVHJhY2tGcmFtZU9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWJ1Z0xhYmVsPzogc3RyaW5nKSB7fVxuXG4gIGV2YWx1YXRlKCkge1xuICAgIGJlZ2luVHJhY2tGcmFtZSh0aGlzLmRlYnVnTGFiZWwpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmRUcmFja0ZyYW1lT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcmdldDogSnVtcElmTm90TW9kaWZpZWRPcGNvZGUpIHt9XG5cbiAgZXZhbHVhdGUoKSB7XG4gICAgbGV0IHRhZyA9IGVuZFRyYWNrRnJhbWUoKTtcbiAgICB0aGlzLnRhcmdldC5kaWRNb2RpZnkodGFnKTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==