@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
389 lines (315 loc) • 34.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UpdateDynamicAttributeOpcode = exports.UpdateDynamicModifierOpcode = exports.UpdateModifierOpcode = void 0;
var _reference = require("@glimmer/reference");
var _validator = require("@glimmer/validator");
var _vm = require("@glimmer/vm");
var _opcodes = require("../../opcodes");
var _vm2 = require("./vm");
var _symbols = require("../../symbols");
var _util = require("@glimmer/util");
var _curriedValue = require("../../curried-value");
var _env = require("@glimmer/env");
var _destroyable = require("@glimmer/destroyable");
_opcodes.APPEND_OPCODES.add(41
/* Text */
, (vm, {
op1: text
}) => {
vm.elements().appendText(vm[_symbols.CONSTANTS].getValue(text));
});
_opcodes.APPEND_OPCODES.add(42
/* Comment */
, (vm, {
op1: text
}) => {
vm.elements().appendComment(vm[_symbols.CONSTANTS].getValue(text));
});
_opcodes.APPEND_OPCODES.add(48
/* OpenElement */
, (vm, {
op1: tag
}) => {
vm.elements().openElement(vm[_symbols.CONSTANTS].getValue(tag));
});
_opcodes.APPEND_OPCODES.add(49
/* OpenDynamicElement */
, vm => {
let tagName = (0, _reference.valueForRef)(vm.stack.pop());
vm.elements().openElement(tagName);
});
_opcodes.APPEND_OPCODES.add(50
/* PushRemoteElement */
, vm => {
let elementRef = vm.stack.pop();
let insertBeforeRef = vm.stack.pop();
let guidRef = vm.stack.pop();
let element = (0, _reference.valueForRef)(elementRef);
let insertBefore = (0, _reference.valueForRef)(insertBeforeRef);
let guid = (0, _reference.valueForRef)(guidRef);
if (!(0, _reference.isConstRef)(elementRef)) {
vm.updateWith(new _vm2.Assert(elementRef));
}
if (insertBefore !== undefined && !(0, _reference.isConstRef)(insertBeforeRef)) {
vm.updateWith(new _vm2.Assert(insertBeforeRef));
}
let block = vm.elements().pushRemoteElement(element, guid, insertBefore);
if (block) vm.associateDestroyable(block);
});
_opcodes.APPEND_OPCODES.add(56
/* PopRemoteElement */
, vm => {
vm.elements().popRemoteElement();
});
_opcodes.APPEND_OPCODES.add(54
/* FlushElement */
, vm => {
let operations = vm.fetchValue(_vm.$t0);
let modifiers = null;
if (operations) {
modifiers = operations.flush(vm);
vm.loadValue(_vm.$t0, null);
}
vm.elements().flushElement(modifiers);
});
_opcodes.APPEND_OPCODES.add(55
/* CloseElement */
, vm => {
let modifiers = vm.elements().closeElement();
if (modifiers) {
modifiers.forEach(modifier => {
vm.env.scheduleInstallModifier(modifier);
let {
manager,
state
} = modifier;
let d = manager.getDestroyable(state);
if (d) {
vm.associateDestroyable(d);
}
});
}
});
_opcodes.APPEND_OPCODES.add(57
/* Modifier */
, (vm, {
op1: handle
}) => {
if (vm.env.isInteractive === false) {
return;
}
let owner = vm.getOwner();
let args = vm.stack.pop();
let definition = vm[_symbols.CONSTANTS].getValue(handle);
let {
manager
} = definition;
let {
constructing
} = vm.elements();
let state = manager.create(owner, constructing, definition.state, args.capture());
let instance = {
manager,
state,
definition
};
let operations = vm.fetchValue(_vm.$t0);
operations.addModifier(instance);
let tag = manager.getTag(state);
if (tag !== null) {
(0, _validator.consumeTag)(tag);
return vm.updateWith(new UpdateModifierOpcode(tag, instance));
}
});
_opcodes.APPEND_OPCODES.add(108
/* DynamicModifier */
, vm => {
if (vm.env.isInteractive === false) {
return;
}
let {
stack,
[_symbols.CONSTANTS]: constants
} = vm;
let ref = stack.pop();
let args = stack.pop().capture();
let {
constructing
} = vm.elements();
let initialOwner = vm.getOwner();
let instanceRef = (0, _reference.createComputeRef)(() => {
let value = (0, _reference.valueForRef)(ref);
let owner;
if (!(0, _util.isObject)(value)) {
return;
}
let hostDefinition;
if ((0, _curriedValue.isCurriedType)(value, 2
/* Modifier */
)) {
let {
definition: resolvedDefinition,
owner: curriedOwner,
positional,
named
} = (0, _curriedValue.resolveCurriedValue)(value);
hostDefinition = resolvedDefinition;
owner = curriedOwner;
if (positional !== undefined) {
args.positional = positional.concat(args.positional);
}
if (named !== undefined) {
args.named = (0, _util.assign)({}, ...named, args.named);
}
} else {
hostDefinition = value;
owner = initialOwner;
}
let handle = constants.modifier(hostDefinition, null, true);
if (_env.DEBUG && handle === null) {
throw new Error(`Expected a dynamic modifier definition, but received an object or function that did not have a modifier manager associated with it. The dynamic invocation was \`{{${ref.debugLabel}}}\`, and the incorrect definition is the value at the path \`${ref.debugLabel}\`, which was: ${(0, _util.debugToString)(hostDefinition)}`);
}
let definition = constants.getValue(handle);
let {
manager
} = definition;
let state = manager.create(owner, constructing, definition.state, args);
return {
manager,
state,
definition
};
});
let instance = (0, _reference.valueForRef)(instanceRef);
let tag = null;
if (instance !== undefined) {
let operations = vm.fetchValue(_vm.$t0);
operations.addModifier(instance);
tag = instance.manager.getTag(instance.state);
if (tag !== null) {
(0, _validator.consumeTag)(tag);
}
}
if (!(0, _reference.isConstRef)(ref) || tag) {
return vm.updateWith(new UpdateDynamicModifierOpcode(tag, instance, instanceRef));
}
});
class UpdateModifierOpcode {
constructor(tag, modifier) {
this.tag = tag;
this.modifier = modifier;
this.lastUpdated = (0, _validator.valueForTag)(tag);
}
evaluate(vm) {
let {
modifier,
tag,
lastUpdated
} = this;
(0, _validator.consumeTag)(tag);
if (!(0, _validator.validateTag)(tag, lastUpdated)) {
vm.env.scheduleUpdateModifier(modifier);
this.lastUpdated = (0, _validator.valueForTag)(tag);
}
}
}
exports.UpdateModifierOpcode = UpdateModifierOpcode;
class UpdateDynamicModifierOpcode {
constructor(tag, instance, instanceRef) {
this.tag = tag;
this.instance = instance;
this.instanceRef = instanceRef;
this.lastUpdated = (0, _validator.valueForTag)(tag !== null && tag !== void 0 ? tag : _validator.CURRENT_TAG);
}
evaluate(vm) {
let {
tag,
lastUpdated,
instance,
instanceRef
} = this;
let newInstance = (0, _reference.valueForRef)(instanceRef);
if (newInstance !== instance) {
if (instance !== undefined) {
let destroyable = instance.manager.getDestroyable(instance.state);
if (destroyable !== null) {
(0, _destroyable.destroy)(destroyable);
}
}
if (newInstance !== undefined) {
let {
manager,
state
} = newInstance;
let destroyable = manager.getDestroyable(state);
if (destroyable !== null) {
(0, _destroyable.associateDestroyableChild)(this, destroyable);
}
tag = manager.getTag(state);
if (tag !== null) {
this.lastUpdated = (0, _validator.valueForTag)(tag);
}
this.tag = tag;
vm.env.scheduleInstallModifier(newInstance);
}
this.instance = newInstance;
} else if (tag !== null && !(0, _validator.validateTag)(tag, lastUpdated)) {
vm.env.scheduleUpdateModifier(instance);
this.lastUpdated = (0, _validator.valueForTag)(tag);
}
if (tag !== null) {
(0, _validator.consumeTag)(tag);
}
}
}
exports.UpdateDynamicModifierOpcode = UpdateDynamicModifierOpcode;
_opcodes.APPEND_OPCODES.add(51
/* StaticAttr */
, (vm, {
op1: _name,
op2: _value,
op3: _namespace
}) => {
let name = vm[_symbols.CONSTANTS].getValue(_name);
let value = vm[_symbols.CONSTANTS].getValue(_value);
let namespace = _namespace ? vm[_symbols.CONSTANTS].getValue(_namespace) : null;
vm.elements().setStaticAttribute(name, value, namespace);
});
_opcodes.APPEND_OPCODES.add(52
/* DynamicAttr */
, (vm, {
op1: _name,
op2: _trusting,
op3: _namespace
}) => {
let name = vm[_symbols.CONSTANTS].getValue(_name);
let trusting = vm[_symbols.CONSTANTS].getValue(_trusting);
let reference = vm.stack.pop();
let value = (0, _reference.valueForRef)(reference);
let namespace = _namespace ? vm[_symbols.CONSTANTS].getValue(_namespace) : null;
let attribute = vm.elements().setDynamicAttribute(name, value, trusting, namespace);
if (!(0, _reference.isConstRef)(reference)) {
vm.updateWith(new UpdateDynamicAttributeOpcode(reference, attribute, vm.env));
}
});
class UpdateDynamicAttributeOpcode {
constructor(reference, attribute, env) {
let initialized = false;
this.updateRef = (0, _reference.createComputeRef)(() => {
let value = (0, _reference.valueForRef)(reference);
if (initialized === true) {
attribute.update(value, env);
} else {
initialized = true;
}
});
(0, _reference.valueForRef)(this.updateRef);
}
evaluate() {
(0, _reference.valueForRef)(this.updateRef);
}
}
exports.UpdateDynamicAttributeOpcode = UpdateDynamicAttributeOpcode;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUE2QkE7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQTRCLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXNCO0FBQ2hELEVBQUEsRUFBRSxDQUFGLFFBQUEsR0FBQSxVQUFBLENBQXlCLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUF6QixJQUF5QixDQUF6QjtBQURGLENBQUE7O0FBSUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQStCLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXNCO0FBQ25ELEVBQUEsRUFBRSxDQUFGLFFBQUEsR0FBQSxhQUFBLENBQTRCLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUE1QixJQUE0QixDQUE1QjtBQURGLENBQUE7O0FBSUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQW1DLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXFCO0FBQ3RELEVBQUEsRUFBRSxDQUFGLFFBQUEsR0FBQSxXQUFBLENBQTBCLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUExQixHQUEwQixDQUExQjtBQURGLENBQUE7O0FBSUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQTJDLEVBQUQsSUFBTztBQUMvQyxNQUFJLE9BQU8sR0FBUyw0QkFBa0IsRUFBRSxDQUFGLEtBQUEsQ0FBdEMsR0FBc0MsRUFBbEIsQ0FBcEI7QUFDQSxFQUFBLEVBQUUsQ0FB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O0FBWEgsQ0FBQTs7QUFjTSxNQUFBLDRCQUFBLENBQW1DO0FBR3ZDLEVBQUEsV0FBQSxDQUFBLFNBQUEsRUFBQSxTQUFBLEVBQUEsR0FBQSxFQUF3RjtBQUN0RixRQUFJLFdBQVcsR0FBZixLQUFBO0FBRUEsU0FBQSxTQUFBLEdBQWlCLGlDQUFpQixNQUFLO0FBQ3JDLFVBQUksS0FBSyxHQUFHLDRCQUFaLFNBQVksQ0FBWjs7QUFFQSxVQUFJLFdBQVcsS0FBZixJQUFBLEVBQTBCO0FBQ3hCLFFBQUEsU0FBUyxDQUFULE1BQUEsQ0FBQSxLQUFBLEVBQUEsR0FBQTtBQURGLE9BQUEsTUFFTztBQUNMLFFBQUEsV0FBVyxHQUFYLElBQUE7QUFDRDtBQVBILEtBQWlCLENBQWpCO0FBVUEsZ0NBQVksS0FBWixTQUFBO0FBQ0Q7O0FBRUQsRUFBQSxRQUFRLEdBQUE7QUFDTixnQ0FBWSxLQUFaLFNBQUE7QUFDRDs7QUFyQnNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVmZXJlbmNlLCB2YWx1ZUZvclJlZiwgaXNDb25zdFJlZiwgY3JlYXRlQ29tcHV0ZVJlZiB9IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQge1xuICBSZXZpc2lvbixcbiAgVGFnLFxuICB2YWx1ZUZvclRhZyxcbiAgdmFsaWRhdGVUYWcsXG4gIGNvbnN1bWVUYWcsXG4gIENVUlJFTlRfVEFHLFxufSBmcm9tICdAZ2xpbW1lci92YWxpZGF0b3InO1xuaW1wb3J0IHtcbiAgY2hlY2ssXG4gIENoZWNrU3RyaW5nLFxuICBDaGVja0VsZW1lbnQsXG4gIENoZWNrT3B0aW9uLFxuICBDaGVja05vZGUsXG4gIENoZWNrTWF5YmUsXG59IGZyb20gJ0BnbGltbWVyL2RlYnVnJztcbmltcG9ydCB7XG4gIE9wLFxuICBPcHRpb24sXG4gIE1vZGlmaWVyRGVmaW5pdGlvbixcbiAgTW9kaWZpZXJJbnN0YW5jZSxcbiAgT3duZXIsXG4gIENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgQ3VycmllZFR5cGUsXG4gIE1vZGlmaWVyRGVmaW5pdGlvblN0YXRlLFxuICBFbnZpcm9ubWVudCxcbiAgVXBkYXRpbmdWTSxcbiAgVXBkYXRpbmdPcGNvZGUsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgJHQwIH0gZnJvbSAnQGdsaW1tZXIvdm0nO1xuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IEFzc2VydCB9IGZyb20gJy4vdm0nO1xuaW1wb3J0IHsgRHluYW1pY0F0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL3ZtL2F0dHJpYnV0ZXMvZHluYW1pYyc7XG5pbXBvcnQgeyBDaGVja1JlZmVyZW5jZSwgQ2hlY2tBcmd1bWVudHMsIENoZWNrT3BlcmF0aW9ucyB9IGZyb20gJy4vLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgYXNzaWduLCBkZWJ1Z1RvU3RyaW5nLCBleHBlY3QsIGlzT2JqZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBDdXJyaWVkVmFsdWUsIGlzQ3VycmllZFR5cGUsIHJlc29sdmVDdXJyaWVkVmFsdWUgfSBmcm9tICcuLi8uLi9jdXJyaWVkLXZhbHVlJztcbmltcG9ydCB7IERFQlVHIH0gZnJvbSAnQGdsaW1tZXIvZW52JztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQsIGRlc3Ryb3kgfSBmcm9tICdAZ2xpbW1lci9kZXN0cm95YWJsZSc7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5UZXh0LCAodm0sIHsgb3AxOiB0ZXh0IH0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5hcHBlbmRUZXh0KHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUodGV4dCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db21tZW50LCAodm0sIHsgb3AxOiB0ZXh0IH0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5hcHBlbmRDb21tZW50KHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUodGV4dCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5PcGVuRWxlbWVudCwgKHZtLCB7IG9wMTogdGFnIH0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5vcGVuRWxlbWVudCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKHRhZykpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5PcGVuRHluYW1pY0VsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgdGFnTmFtZSA9IGNoZWNrKHZhbHVlRm9yUmVmKGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSkpLCBDaGVja1N0cmluZyk7XG4gIHZtLmVsZW1lbnRzKCkub3BlbkVsZW1lbnQodGFnTmFtZSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hSZW1vdGVFbGVtZW50LCAodm0pID0+IHtcbiAgbGV0IGVsZW1lbnRSZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgaW5zZXJ0QmVmb3JlUmVmID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGd1aWRSZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIGxldCBlbGVtZW50ID0gY2hlY2sodmFsdWVGb3JSZWYoZWxlbWVudFJlZiksIENoZWNrRWxlbWVudCk7XG4gIGxldCBpbnNlcnRCZWZvcmUgPSBjaGVjayh2YWx1ZUZvclJlZihpbnNlcnRCZWZvcmVSZWYpLCBDaGVja01heWJlKENoZWNrT3B0aW9uKENoZWNrTm9kZSkpKTtcbiAgbGV0IGd1aWQgPSB2YWx1ZUZvclJlZihndWlkUmVmKSBhcyBzdHJpbmc7XG5cbiAgaWYgKCFpc0NvbnN0UmVmKGVsZW1lbnRSZWYpKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KGVsZW1lbnRSZWYpKTtcbiAgfVxuXG4gIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCAmJiAhaXNDb25zdFJlZihpbnNlcnRCZWZvcmVSZWYpKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KGluc2VydEJlZm9yZVJlZikpO1xuICB9XG5cbiAgbGV0IGJsb2NrID0gdm0uZWxlbWVudHMoKS5wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBndWlkLCBpbnNlcnRCZWZvcmUpO1xuICBpZiAoYmxvY2spIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKGJsb2NrKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUG9wUmVtb3RlRWxlbWVudCwgKHZtKSA9PiB7XG4gIHZtLmVsZW1lbnRzKCkucG9wUmVtb3RlRWxlbWVudCgpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5GbHVzaEVsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgb3BlcmF0aW9ucyA9IGNoZWNrKHZtLmZldGNoVmFsdWUoJHQwKSwgQ2hlY2tPcGVyYXRpb25zKTtcbiAgbGV0IG1vZGlmaWVyczogT3B0aW9uPE1vZGlmaWVySW5zdGFuY2VbXT4gPSBudWxsO1xuXG4gIGlmIChvcGVyYXRpb25zKSB7XG4gICAgbW9kaWZpZXJzID0gb3BlcmF0aW9ucy5mbHVzaCh2bSk7XG4gICAgdm0ubG9hZFZhbHVlKCR0MCwgbnVsbCk7XG4gIH1cblxuICB2bS5lbGVtZW50cygpLmZsdXNoRWxlbWVudChtb2RpZmllcnMpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5DbG9zZUVsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgbW9kaWZpZXJzID0gdm0uZWxlbWVudHMoKS5jbG9zZUVsZW1lbnQoKTtcblxuICBpZiAobW9kaWZpZXJzKSB7XG4gICAgbW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XG4gICAgICB2bS5lbnYuc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobW9kaWZpZXIpO1xuICAgICAgbGV0IHsgbWFuYWdlciwgc3RhdGUgfSA9IG1vZGlmaWVyO1xuICAgICAgbGV0IGQgPSBtYW5hZ2VyLmdldERlc3Ryb3lhYmxlKHN0YXRlKTtcblxuICAgICAgaWYgKGQpIHtcbiAgICAgICAgdm0uYXNzb2NpYXRlRGVzdHJveWFibGUoZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuTW9kaWZpZXIsICh2bSwgeyBvcDE6IGhhbmRsZSB9KSA9PiB7XG4gIGlmICh2bS5lbnYuaXNJbnRlcmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgb3duZXIgPSB2bS5nZXRPd25lcigpO1xuICBsZXQgYXJncyA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cyk7XG4gIGxldCBkZWZpbml0aW9uID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxNb2RpZmllckRlZmluaXRpb24+KGhhbmRsZSk7XG5cbiAgbGV0IHsgbWFuYWdlciB9ID0gZGVmaW5pdGlvbjtcblxuICBsZXQgeyBjb25zdHJ1Y3RpbmcgfSA9IHZtLmVsZW1lbnRzKCk7XG5cbiAgbGV0IHN0YXRlID0gbWFuYWdlci5jcmVhdGUoXG4gICAgb3duZXIsXG4gICAgZXhwZWN0KGNvbnN0cnVjdGluZywgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIHRoZSBlbGVtZW50IGl0IGFwcGxpZXMgdG8nKSxcbiAgICBkZWZpbml0aW9uLnN0YXRlLFxuICAgIGFyZ3MuY2FwdHVyZSgpXG4gICk7XG5cbiAgbGV0IGluc3RhbmNlOiBNb2RpZmllckluc3RhbmNlID0ge1xuICAgIG1hbmFnZXIsXG4gICAgc3RhdGUsXG4gICAgZGVmaW5pdGlvbixcbiAgfTtcblxuICBsZXQgb3BlcmF0aW9ucyA9IGV4cGVjdChcbiAgICBjaGVjayh2bS5mZXRjaFZhbHVlKCR0MCksIENoZWNrT3BlcmF0aW9ucyksXG4gICAgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIG9wZXJhdGlvbnMgdG8gYXBwZW5kIHRvJ1xuICApO1xuXG4gIG9wZXJhdGlvbnMuYWRkTW9kaWZpZXIoaW5zdGFuY2UpO1xuXG4gIGxldCB0YWcgPSBtYW5hZ2VyLmdldFRhZyhzdGF0ZSk7XG5cbiAgaWYgKHRhZyAhPT0gbnVsbCkge1xuICAgIGNvbnN1bWVUYWcodGFnKTtcbiAgICByZXR1cm4gdm0udXBkYXRlV2l0aChuZXcgVXBkYXRlTW9kaWZpZXJPcGNvZGUodGFnLCBpbnN0YW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkR5bmFtaWNNb2RpZmllciwgKHZtKSA9PiB7XG4gIGlmICh2bS5lbnYuaXNJbnRlcmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgeyBzdGFjaywgW0NPTlNUQU5UU106IGNvbnN0YW50cyB9ID0gdm07XG4gIGxldCByZWYgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgYXJncyA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cykuY2FwdHVyZSgpO1xuICBsZXQgeyBjb25zdHJ1Y3RpbmcgfSA9IHZtLmVsZW1lbnRzKCk7XG4gIGxldCBpbml0aWFsT3duZXIgPSB2bS5nZXRPd25lcigpO1xuXG4gIGxldCBpbnN0YW5jZVJlZiA9IGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IHZhbHVlRm9yUmVmKHJlZik7XG4gICAgbGV0IG93bmVyOiBPd25lcjtcblxuICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGhvc3REZWZpbml0aW9uOiBDdXJyaWVkVmFsdWUgfCBNb2RpZmllckRlZmluaXRpb25TdGF0ZTtcblxuICAgIGlmIChpc0N1cnJpZWRUeXBlKHZhbHVlLCBDdXJyaWVkVHlwZS5Nb2RpZmllcikpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIGRlZmluaXRpb246IHJlc29sdmVkRGVmaW5pdGlvbixcbiAgICAgICAgb3duZXI6IGN1cnJpZWRPd25lcixcbiAgICAgICAgcG9zaXRpb25hbCxcbiAgICAgICAgbmFtZWQsXG4gICAgICB9ID0gcmVzb2x2ZUN1cnJpZWRWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhvc3REZWZpbml0aW9uID0gcmVzb2x2ZWREZWZpbml0aW9uO1xuICAgICAgb3duZXIgPSBjdXJyaWVkT3duZXI7XG5cbiAgICAgIGlmIChwb3NpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncy5wb3NpdGlvbmFsID0gcG9zaXRpb25hbC5jb25jYXQoYXJncy5wb3NpdGlvbmFsKSBhcyBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHM7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MubmFtZWQgPSBhc3NpZ24oe30sIC4uLm5hbWVkLCBhcmdzLm5hbWVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaG9zdERlZmluaXRpb24gPSB2YWx1ZTtcbiAgICAgIG93bmVyID0gaW5pdGlhbE93bmVyO1xuICAgIH1cblxuICAgIGxldCBoYW5kbGUgPSBjb25zdGFudHMubW9kaWZpZXIoaG9zdERlZmluaXRpb24sIG51bGwsIHRydWUpO1xuXG4gICAgaWYgKERFQlVHICYmIGhhbmRsZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgYSBkeW5hbWljIG1vZGlmaWVyIGRlZmluaXRpb24sIGJ1dCByZWNlaXZlZCBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkaWQgbm90IGhhdmUgYSBtb2RpZmllciBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhlIGR5bmFtaWMgaW52b2NhdGlvbiB3YXMgXFxge3ske1xuICAgICAgICAgIHJlZi5kZWJ1Z0xhYmVsXG4gICAgICAgIH19fVxcYCwgYW5kIHRoZSBpbmNvcnJlY3QgZGVmaW5pdGlvbiBpcyB0aGUgdmFsdWUgYXQgdGhlIHBhdGggXFxgJHtcbiAgICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgICB9XFxgLCB3aGljaCB3YXM6ICR7ZGVidWdUb1N0cmluZyEoaG9zdERlZmluaXRpb24pfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGRlZmluaXRpb24gPSBjb25zdGFudHMuZ2V0VmFsdWU8TW9kaWZpZXJEZWZpbml0aW9uPihcbiAgICAgIGV4cGVjdChoYW5kbGUsICdCVUc6IG1vZGlmaWVyIGhhbmRsZSBleHBlY3RlZCcpXG4gICAgKTtcblxuICAgIGxldCB7IG1hbmFnZXIgfSA9IGRlZmluaXRpb247XG5cbiAgICBsZXQgc3RhdGUgPSBtYW5hZ2VyLmNyZWF0ZShcbiAgICAgIG93bmVyLFxuICAgICAgZXhwZWN0KGNvbnN0cnVjdGluZywgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIHRoZSBlbGVtZW50IGl0IGFwcGxpZXMgdG8nKSxcbiAgICAgIGRlZmluaXRpb24uc3RhdGUsXG4gICAgICBhcmdzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBtYW5hZ2VyLFxuICAgICAgc3RhdGUsXG4gICAgICBkZWZpbml0aW9uLFxuICAgIH07XG4gIH0pO1xuXG4gIGxldCBpbnN0YW5jZSA9IHZhbHVlRm9yUmVmKGluc3RhbmNlUmVmKTtcbiAgbGV0IHRhZyA9IG51bGw7XG5cbiAgaWYgKGluc3RhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb3BlcmF0aW9ucyA9IGV4cGVjdChcbiAgICAgIGNoZWNrKHZtLmZldGNoVmFsdWUoJHQwKSwgQ2hlY2tPcGVyYXRpb25zKSxcbiAgICAgICdCVUc6IEVsZW1lbnRNb2RpZmllciBjb3VsZCBub3QgZmluZCBvcGVyYXRpb25zIHRvIGFwcGVuZCB0bydcbiAgICApO1xuXG4gICAgb3BlcmF0aW9ucy5hZGRNb2RpZmllcihpbnN0YW5jZSk7XG5cbiAgICB0YWcgPSBpbnN0YW5jZS5tYW5hZ2VyLmdldFRhZyhpbnN0YW5jZS5zdGF0ZSk7XG5cbiAgICBpZiAodGFnICE9PSBudWxsKSB7XG4gICAgICBjb25zdW1lVGFnKHRhZyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc0NvbnN0UmVmKHJlZikgfHwgdGFnKSB7XG4gICAgcmV0dXJuIHZtLnVwZGF0ZVdpdGgobmV3IFVwZGF0ZUR5bmFtaWNNb2RpZmllck9wY29kZSh0YWcsIGluc3RhbmNlLCBpbnN0YW5jZVJlZikpO1xuICB9XG59KTtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZU1vZGlmaWVyT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIGxhc3RVcGRhdGVkOiBSZXZpc2lvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhZzogVGFnLCBwcml2YXRlIG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgdGhpcy5sYXN0VXBkYXRlZCA9IHZhbHVlRm9yVGFnKHRhZyk7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IG1vZGlmaWVyLCB0YWcsIGxhc3RVcGRhdGVkIH0gPSB0aGlzO1xuXG4gICAgY29uc3VtZVRhZyh0YWcpO1xuXG4gICAgaWYgKCF2YWxpZGF0ZVRhZyh0YWcsIGxhc3RVcGRhdGVkKSkge1xuICAgICAgdm0uZW52LnNjaGVkdWxlVXBkYXRlTW9kaWZpZXIobW9kaWZpZXIpO1xuICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IHZhbHVlRm9yVGFnKHRhZyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVEeW5hbWljTW9kaWZpZXJPcGNvZGUgaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIHByaXZhdGUgbGFzdFVwZGF0ZWQ6IFJldmlzaW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGFnOiBUYWcgfCBudWxsLFxuICAgIHByaXZhdGUgaW5zdGFuY2U6IE1vZGlmaWVySW5zdGFuY2UgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBpbnN0YW5jZVJlZjogUmVmZXJlbmNlPE1vZGlmaWVySW5zdGFuY2UgfCB1bmRlZmluZWQ+XG4gICkge1xuICAgIHRoaXMubGFzdFVwZGF0ZWQgPSB2YWx1ZUZvclRhZyh0YWcgPz8gQ1VSUkVOVF9UQUcpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyB0YWcsIGxhc3RVcGRhdGVkLCBpbnN0YW5jZSwgaW5zdGFuY2VSZWYgfSA9IHRoaXM7XG5cbiAgICBsZXQgbmV3SW5zdGFuY2UgPSB2YWx1ZUZvclJlZihpbnN0YW5jZVJlZik7XG5cbiAgICBpZiAobmV3SW5zdGFuY2UgIT09IGluc3RhbmNlKSB7XG4gICAgICBpZiAoaW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgZGVzdHJveWFibGUgPSBpbnN0YW5jZS5tYW5hZ2VyLmdldERlc3Ryb3lhYmxlKGluc3RhbmNlLnN0YXRlKTtcblxuICAgICAgICBpZiAoZGVzdHJveWFibGUgIT09IG51bGwpIHtcbiAgICAgICAgICBkZXN0cm95KGRlc3Ryb3lhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV3SW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgeyBtYW5hZ2VyLCBzdGF0ZSB9ID0gbmV3SW5zdGFuY2U7XG4gICAgICAgIGxldCBkZXN0cm95YWJsZSA9IG1hbmFnZXIuZ2V0RGVzdHJveWFibGUoc3RhdGUpO1xuXG4gICAgICAgIGlmIChkZXN0cm95YWJsZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQodGhpcywgZGVzdHJveWFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gICAgICAgIGlmICh0YWcgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxhc3RVcGRhdGVkID0gdmFsdWVGb3JUYWcodGFnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICB2bS5lbnYuc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobmV3SW5zdGFuY2UhKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ld0luc3RhbmNlO1xuICAgIH0gZWxzZSBpZiAodGFnICE9PSBudWxsICYmICF2YWxpZGF0ZVRhZyh0YWcsIGxhc3RVcGRhdGVkKSkge1xuICAgICAgdm0uZW52LnNjaGVkdWxlVXBkYXRlTW9kaWZpZXIoaW5zdGFuY2UhKTtcbiAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSB2YWx1ZUZvclRhZyh0YWcpO1xuICAgIH1cblxuICAgIGlmICh0YWcgIT09IG51bGwpIHtcbiAgICAgIGNvbnN1bWVUYWcodGFnKTtcbiAgICB9XG4gIH1cbn1cblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlN0YXRpY0F0dHIsICh2bSwgeyBvcDE6IF9uYW1lLCBvcDI6IF92YWx1ZSwgb3AzOiBfbmFtZXNwYWNlIH0pID0+IHtcbiAgbGV0IG5hbWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWUpO1xuICBsZXQgdmFsdWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX3ZhbHVlKTtcbiAgbGV0IG5hbWVzcGFjZSA9IF9uYW1lc3BhY2UgPyB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWVzcGFjZSkgOiBudWxsO1xuXG4gIHZtLmVsZW1lbnRzKCkuc2V0U3RhdGljQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5EeW5hbWljQXR0ciwgKHZtLCB7IG9wMTogX25hbWUsIG9wMjogX3RydXN0aW5nLCBvcDM6IF9uYW1lc3BhY2UgfSkgPT4ge1xuICBsZXQgbmFtZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZSk7XG4gIGxldCB0cnVzdGluZyA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8Ym9vbGVhbj4oX3RydXN0aW5nKTtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCB2YWx1ZSA9IHZhbHVlRm9yUmVmKHJlZmVyZW5jZSk7XG4gIGxldCBuYW1lc3BhY2UgPSBfbmFtZXNwYWNlID8gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9uYW1lc3BhY2UpIDogbnVsbDtcblxuICBsZXQgYXR0cmlidXRlID0gdm0uZWxlbWVudHMoKS5zZXREeW5hbWljQXR0cmlidXRlKG5hbWUsIHZhbHVlLCB0cnVzdGluZywgbmFtZXNwYWNlKTtcblxuICBpZiAoIWlzQ29uc3RSZWYocmVmZXJlbmNlKSkge1xuICAgIHZtLnVwZGF0ZVdpdGgobmV3IFVwZGF0ZUR5bmFtaWNBdHRyaWJ1dGVPcGNvZGUocmVmZXJlbmNlLCBhdHRyaWJ1dGUsIHZtLmVudikpO1xuICB9XG59KTtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUR5bmFtaWNBdHRyaWJ1dGVPcGNvZGUgaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIHByaXZhdGUgdXBkYXRlUmVmOiBSZWZlcmVuY2U7XG5cbiAgY29uc3RydWN0b3IocmVmZXJlbmNlOiBSZWZlcmVuY2U8dW5rbm93bj4sIGF0dHJpYnV0ZTogRHluYW1pY0F0dHJpYnV0ZSwgZW52OiBFbnZpcm9ubWVudCkge1xuICAgIGxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgdGhpcy51cGRhdGVSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IHZhbHVlRm9yUmVmKHJlZmVyZW5jZSk7XG5cbiAgICAgIGlmIChpbml0aWFsaXplZCA9PT0gdHJ1ZSkge1xuICAgICAgICBhdHRyaWJ1dGUudXBkYXRlKHZhbHVlLCBlbnYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFsdWVGb3JSZWYodGhpcy51cGRhdGVSZWYpO1xuICB9XG5cbiAgZXZhbHVhdGUoKSB7XG4gICAgdmFsdWVGb3JSZWYodGhpcy51cGRhdGVSZWYpO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9