@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
214 lines (169 loc) • 21.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.runtimeContext = runtimeContext;
exports.inTransaction = inTransaction;
exports.default = exports.EnvironmentImpl = exports.TRANSACTION = void 0;
var _env = require("@glimmer/env");
var _util = require("@glimmer/util");
var _validator = require("@glimmer/validator");
var _helper = require("./dom/helper");
var _program = require("@glimmer/program");
var _debugRenderTree = _interopRequireDefault(require("./debug-render-tree"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _a;
const TRANSACTION = (0, _util.symbol)('TRANSACTION');
exports.TRANSACTION = TRANSACTION;
class TransactionImpl {
constructor() {
this.scheduledInstallModifiers = [];
this.scheduledUpdateModifiers = [];
this.createdComponents = [];
this.updatedComponents = [];
}
didCreate(component) {
this.createdComponents.push(component);
}
didUpdate(component) {
this.updatedComponents.push(component);
}
scheduleInstallModifier(modifier) {
this.scheduledInstallModifiers.push(modifier);
}
scheduleUpdateModifier(modifier) {
this.scheduledUpdateModifiers.push(modifier);
}
commit() {
let {
createdComponents,
updatedComponents
} = this;
for (let i = 0; i < createdComponents.length; i++) {
let {
manager,
state
} = createdComponents[i];
manager.didCreate(state);
}
for (let i = 0; i < updatedComponents.length; i++) {
let {
manager,
state
} = updatedComponents[i];
manager.didUpdate(state);
}
let {
scheduledInstallModifiers,
scheduledUpdateModifiers
} = this; // Prevent a transpilation issue we guard against in Ember, the
// throw-if-closure-required issue
let manager, state;
for (let i = 0; i < scheduledInstallModifiers.length; i++) {
let modifier = scheduledInstallModifiers[i];
manager = modifier.manager;
state = modifier.state;
let modifierTag = manager.getTag(state);
if (modifierTag !== null) {
let tag = (0, _validator.track)( // eslint-disable-next-line no-loop-func
() => manager.install(state), _env.DEBUG && `- While rendering:\n (instance of a \`${modifier.definition.resolvedName || manager.getDebugName(modifier.definition.state)}\` modifier)`);
(0, _validator.updateTag)(modifierTag, tag);
} else {
manager.install(state);
}
}
for (let i = 0; i < scheduledUpdateModifiers.length; i++) {
let modifier = scheduledUpdateModifiers[i];
manager = modifier.manager;
state = modifier.state;
let modifierTag = manager.getTag(state);
if (modifierTag !== null) {
let tag = (0, _validator.track)( // eslint-disable-next-line no-loop-func
() => manager.update(state), _env.DEBUG && `- While rendering:\n (instance of a \`${modifier.definition.resolvedName || manager.getDebugName(modifier.definition.state)}\` modifier)`);
(0, _validator.updateTag)(modifierTag, tag);
} else {
manager.update(state);
}
}
}
}
class EnvironmentImpl {
constructor(options, delegate) {
this.delegate = delegate;
this[_a] = null; // Delegate methods and values
this.isInteractive = this.delegate.isInteractive;
this.debugRenderTree = this.delegate.enableDebugTooling ? new _debugRenderTree.default() : undefined;
if (options.appendOperations) {
this.appendOperations = options.appendOperations;
this.updateOperations = options.updateOperations;
} else if (options.document) {
this.appendOperations = new _helper.DOMTreeConstruction(options.document);
this.updateOperations = new _helper.DOMChangesImpl(options.document);
} else if (_env.DEBUG) {
throw new Error('you must pass document or appendOperations to a new runtime');
}
}
getAppendOperations() {
return this.appendOperations;
}
getDOM() {
return this.updateOperations;
}
begin() {
var _b;
false && (0, _util.assert)(!this[TRANSACTION], 'A glimmer transaction was begun, but one already exists. You may have a nested transaction, possibly caused by an earlier runtime exception while rendering. Please check your console for the stack trace of any prior exceptions.');
(_b = this.debugRenderTree) === null || _b === void 0 ? void 0 : _b.begin();
this[TRANSACTION] = new TransactionImpl();
}
get transaction() {
return this[TRANSACTION];
}
didCreate(component) {
this.transaction.didCreate(component);
}
didUpdate(component) {
this.transaction.didUpdate(component);
}
scheduleInstallModifier(modifier) {
if (this.isInteractive) {
this.transaction.scheduleInstallModifier(modifier);
}
}
scheduleUpdateModifier(modifier) {
if (this.isInteractive) {
this.transaction.scheduleUpdateModifier(modifier);
}
}
commit() {
var _b;
let transaction = this.transaction;
this[TRANSACTION] = null;
transaction.commit();
(_b = this.debugRenderTree) === null || _b === void 0 ? void 0 : _b.commit();
this.delegate.onTransactionCommit();
}
}
exports.EnvironmentImpl = EnvironmentImpl;
_a = TRANSACTION;
function runtimeContext(options, delegate, artifacts, resolver) {
return {
env: new EnvironmentImpl(options, delegate),
program: new _program.RuntimeProgramImpl(artifacts.constants, artifacts.heap),
resolver: resolver
};
}
function inTransaction(env, cb) {
if (!env[TRANSACTION]) {
env.begin();
try {
cb();
} finally {
env.commit();
}
} else {
cb();
}
}
var _default = EnvironmentImpl;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQWlCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRU8sTUFBTSxXQUFXLEdBQXNCLGtCQUF2QyxhQUF1QyxDQUF2Qzs7O0FBRVAsTUFBQSxlQUFBLENBQXFCO0FBQXJCLEVBQUEsV0FBQSxHQUFBO0FBQ1MsU0FBQSx5QkFBQSxHQUFBLEVBQUE7QUFDQSxTQUFBLHdCQUFBLEdBQUEsRUFBQTtBQUNBLFNBQUEsaUJBQUEsR0FBQSxFQUFBO0FBQ0EsU0FBQSxpQkFBQSxHQUFBLEVBQUE7QUFpRlI7O0FBL0VDLEVBQUEsU0FBUyxDQUFBLFNBQUEsRUFBdUM7QUFDOUMsU0FBQSxpQkFBQSxDQUFBLElBQUEsQ0FBQSxTQUFBO0FBQ0Q7O0FBRUQsRUFBQSxTQUFTLENBQUEsU0FBQSxFQUF1QztBQUM5QyxTQUFBLGlCQUFBLENBQUEsSUFBQSxDQUFBLFNBQUE7QUFDRDs7QUFFRCxFQUFBLHVCQUF1QixDQUFBLFFBQUEsRUFBMkI7QUFDaEQsU0FBQSx5QkFBQSxDQUFBLElBQUEsQ0FBQSxRQUFBO0FBQ0Q7O0FBRUQsRUFBQSxzQkFBc0IsQ0FBQSxRQUFBLEVBQTJCO0FBQy9DLFNBQUEsd0JBQUEsQ0FBQSxJQUFBLENBQUEsUUFBQTtBQUNEOztBQUVELEVBQUEsTUFBTSxHQUFBO0FBQ0osUUFBSTtBQUFBLE1BQUEsaUJBQUE7QUFBcUIsTUFBQTtBQUFyQixRQUFKLElBQUE7O0FBRUEsU0FBSyxJQUFJLENBQUMsR0FBVixDQUFBLEVBQWdCLENBQUMsR0FBRyxpQkFBaUIsQ0FBckMsTUFBQSxFQUE4QyxDQUE5QyxFQUFBLEVBQW1EO0FBQ2pELFVBQUk7QUFBQSxRQUFBLE9BQUE7QUFBVyxRQUFBO0FBQVgsVUFBcUIsaUJBQWlCLENBQTFDLENBQTBDLENBQTFDO0FBQ0EsTUFBQSxPQUFP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IEVudmlyb25tZW50LFxuICBFbnZpcm9ubWVudE9wdGlvbnMsXG4gIEdsaW1tZXJUcmVlQ2hhbmdlcyxcbiAgR2xpbW1lclRyZWVDb25zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblN5bWJvbCxcbiAgUnVudGltZUNvbnRleHQsXG4gIFJ1bnRpbWVSZXNvbHZlcixcbiAgT3B0aW9uLFxuICBSdW50aW1lQXJ0aWZhY3RzLFxuICBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUsXG4gIE1vZGlmaWVySW5zdGFuY2UsXG4gIEludGVybmFsTW9kaWZpZXJNYW5hZ2VyLFxuICBNb2RpZmllckluc3RhbmNlU3RhdGUsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0LCBleHBlY3QsIHN5bWJvbCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgdHJhY2ssIHVwZGF0ZVRhZyB9IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyBET01DaGFuZ2VzSW1wbCwgRE9NVHJlZUNvbnN0cnVjdGlvbiB9IGZyb20gJy4vZG9tL2hlbHBlcic7XG5pbXBvcnQgeyBSdW50aW1lUHJvZ3JhbUltcGwgfSBmcm9tICdAZ2xpbW1lci9wcm9ncmFtJztcbmltcG9ydCBEZWJ1Z1JlbmRlclRyZWUgZnJvbSAnLi9kZWJ1Zy1yZW5kZXItdHJlZSc7XG5cbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTjogVHJhbnNhY3Rpb25TeW1ib2wgPSBzeW1ib2woJ1RSQU5TQUNUSU9OJyk7XG5cbmNsYXNzIFRyYW5zYWN0aW9uSW1wbCBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uIHtcbiAgcHVibGljIHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnM6IE1vZGlmaWVySW5zdGFuY2VbXSA9IFtdO1xuICBwdWJsaWMgc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzOiBNb2RpZmllckluc3RhbmNlW10gPSBbXTtcbiAgcHVibGljIGNyZWF0ZWRDb21wb25lbnRzOiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGVbXSA9IFtdO1xuICBwdWJsaWMgdXBkYXRlZENvbXBvbmVudHM6IENvbXBvbmVudEluc3RhbmNlV2l0aENyZWF0ZVtdID0gW107XG5cbiAgZGlkQ3JlYXRlKGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2VXaXRoQ3JlYXRlKSB7XG4gICAgdGhpcy5jcmVhdGVkQ29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gIH1cblxuICBkaWRVcGRhdGUoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUpIHtcbiAgICB0aGlzLnVwZGF0ZWRDb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgfVxuXG4gIHNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgdGhpcy5zY2hlZHVsZWRJbnN0YWxsTW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgc2NoZWR1bGVVcGRhdGVNb2RpZmllcihtb2RpZmllcjogTW9kaWZpZXJJbnN0YW5jZSkge1xuICAgIHRoaXMuc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgY29tbWl0KCkge1xuICAgIGxldCB7IGNyZWF0ZWRDb21wb25lbnRzLCB1cGRhdGVkQ29tcG9uZW50cyB9ID0gdGhpcztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3JlYXRlZENvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB7IG1hbmFnZXIsIHN0YXRlIH0gPSBjcmVhdGVkQ29tcG9uZW50c1tpXTtcbiAgICAgIG1hbmFnZXIuZGlkQ3JlYXRlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVwZGF0ZWRDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgeyBtYW5hZ2VyLCBzdGF0ZSB9ID0gdXBkYXRlZENvbXBvbmVudHNbaV07XG4gICAgICBtYW5hZ2VyLmRpZFVwZGF0ZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgbGV0IHsgc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVycywgc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzIH0gPSB0aGlzO1xuXG4gICAgLy8gUHJldmVudCBhIHRyYW5zcGlsYXRpb24gaXNzdWUgd2UgZ3VhcmQgYWdhaW5zdCBpbiBFbWJlciwgdGhlXG4gICAgLy8gdGhyb3ctaWYtY2xvc3VyZS1yZXF1aXJlZCBpc3N1ZVxuICAgIGxldCBtYW5hZ2VyOiBJbnRlcm5hbE1vZGlmaWVyTWFuYWdlciwgc3RhdGU6IE1vZGlmaWVySW5zdGFuY2VTdGF0ZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG1vZGlmaWVyID0gc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVyc1tpXTtcbiAgICAgIG1hbmFnZXIgPSBtb2RpZmllci5tYW5hZ2VyO1xuICAgICAgc3RhdGUgPSBtb2RpZmllci5zdGF0ZTtcblxuICAgICAgbGV0IG1vZGlmaWVyVGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gICAgICBpZiAobW9kaWZpZXJUYWcgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRyYWNrKFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgICAgICAoKSA9PiBtYW5hZ2VyLmluc3RhbGwoc3RhdGUpLFxuICAgICAgICAgIERFQlVHICYmXG4gICAgICAgICAgICBgLSBXaGlsZSByZW5kZXJpbmc6XFxuICAoaW5zdGFuY2Ugb2YgYSBcXGAke1xuICAgICAgICAgICAgICBtb2RpZmllci5kZWZpbml0aW9uLnJlc29sdmVkTmFtZSB8fCBtYW5hZ2VyLmdldERlYnVnTmFtZShtb2RpZmllci5kZWZpbml0aW9uLnN0YXRlKVxuICAgICAgICAgICAgfVxcYCBtb2RpZmllcilgXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZVRhZyhtb2RpZmllclRhZywgdGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hbmFnZXIuaW5zdGFsbChzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlZHVsZWRVcGRhdGVNb2RpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBtb2RpZmllciA9IHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVyc1tpXTtcbiAgICAgIG1hbmFnZXIgPSBtb2RpZmllci5tYW5hZ2VyO1xuICAgICAgc3RhdGUgPSBtb2RpZmllci5zdGF0ZTtcblxuICAgICAgbGV0IG1vZGlmaWVyVGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gICAgICBpZiAobW9kaWZpZXJUYWcgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRyYWNrKFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgICAgICAoKSA9PiBtYW5hZ2VyLnVwZGF0ZShzdGF0ZSksXG4gICAgICAgICAgREVCVUcgJiZcbiAgICAgICAgICAgIGAtIFdoaWxlIHJlbmRlcmluZzpcXG4gIChpbnN0YW5jZSBvZiBhIFxcYCR7XG4gICAgICAgICAgICAgIG1vZGlmaWVyLmRlZmluaXRpb24ucmVzb2x2ZWROYW1lIHx8IG1hbmFnZXIuZ2V0RGVidWdOYW1lKG1vZGlmaWVyLmRlZmluaXRpb24uc3RhdGUpXG4gICAgICAgICAgICB9XFxgIG1vZGlmaWVyKWBcbiAgICAgICAgKTtcbiAgICAgICAgdXBkYXRlVGFnKG1vZGlmaWVyVGFnLCB0YWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFuYWdlci51cGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnRJbXBsIGltcGxlbWVudHMgRW52aXJvbm1lbnQge1xuICBbVFJBTlNBQ1RJT05dOiBPcHRpb248VHJhbnNhY3Rpb25JbXBsPiA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGFwcGVuZE9wZXJhdGlvbnMhOiBHbGltbWVyVHJlZUNvbnN0cnVjdGlvbjtcbiAgcHJvdGVjdGVkIHVwZGF0ZU9wZXJhdGlvbnM/OiBHbGltbWVyVHJlZUNoYW5nZXM7XG5cbiAgLy8gRGVsZWdhdGUgbWV0aG9kcyBhbmQgdmFsdWVzXG4gIHB1YmxpYyBpc0ludGVyYWN0aXZlID0gdGhpcy5kZWxlZ2F0ZS5pc0ludGVyYWN0aXZlO1xuXG4gIGRlYnVnUmVuZGVyVHJlZSA9IHRoaXMuZGVsZWdhdGUuZW5hYmxlRGVidWdUb29saW5nID8gbmV3IERlYnVnUmVuZGVyVHJlZSgpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9ucywgcHJpdmF0ZSBkZWxlZ2F0ZTogRW52aXJvbm1lbnREZWxlZ2F0ZSkge1xuICAgIGlmIChvcHRpb25zLmFwcGVuZE9wZXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuYXBwZW5kT3BlcmF0aW9ucyA9IG9wdGlvbnMuYXBwZW5kT3BlcmF0aW9ucztcbiAgICAgIHRoaXMudXBkYXRlT3BlcmF0aW9ucyA9IG9wdGlvbnMudXBkYXRlT3BlcmF0aW9ucztcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZG9jdW1lbnQpIHtcbiAgICAgIHRoaXMuYXBwZW5kT3BlcmF0aW9ucyA9IG5ldyBET01UcmVlQ29uc3RydWN0aW9uKG9wdGlvbnMuZG9jdW1lbnQpO1xuICAgICAgdGhpcy51cGRhdGVPcGVyYXRpb25zID0gbmV3IERPTUNoYW5nZXNJbXBsKG9wdGlvbnMuZG9jdW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoREVCVUcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigneW91IG11c3QgcGFzcyBkb2N1bWVudCBvciBhcHBlbmRPcGVyYXRpb25zIHRvIGEgbmV3IHJ1bnRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBnZXRBcHBlbmRPcGVyYXRpb25zKCk6IEdsaW1tZXJUcmVlQ29uc3RydWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRPcGVyYXRpb25zO1xuICB9XG5cbiAgZ2V0RE9NKCk6IEdsaW1tZXJUcmVlQ2hhbmdlcyB7XG4gICAgcmV0dXJuIGV4cGVjdChcbiAgICAgIHRoaXMudXBkYXRlT3BlcmF0aW9ucyxcbiAgICAgICdBdHRlbXB0ZWQgdG8gZ2V0IERPTSB1cGRhdGVPcGVyYXRpb25zLCBidXQgdGhleSB3ZXJlIG5vdCBwcm92aWRlZCBieSB0aGUgZW52aXJvbm1lbnQuIFlvdSBtYXkgYmUgYXR0ZW1wdGluZyB0byByZXJlbmRlciBpbiBhbiBlbnZpcm9ubWVudCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IHJlcmVuZGVyaW5nLCBzdWNoIGFzIFNTUi4nXG4gICAgKTtcbiAgfVxuXG4gIGJlZ2luKCkge1xuICAgIGFzc2VydChcbiAgICAgICF0aGlzW1RSQU5TQUNUSU9OXSxcbiAgICAgICdBIGdsaW1tZXIgdHJhbnNhY3Rpb24gd2FzIGJlZ3VuLCBidXQgb25lIGFscmVhZHkgZXhpc3RzLiBZb3UgbWF5IGhhdmUgYSBuZXN0ZWQgdHJhbnNhY3Rpb24sIHBvc3NpYmx5IGNhdXNlZCBieSBhbiBlYXJsaWVyIHJ1bnRpbWUgZXhjZXB0aW9uIHdoaWxlIHJlbmRlcmluZy4gUGxlYXNlIGNoZWNrIHlvdXIgY29uc29sZSBmb3IgdGhlIHN0YWNrIHRyYWNlIG9mIGFueSBwcmlvciBleGNlcHRpb25zLidcbiAgICApO1xuXG4gICAgdGhpcy5kZWJ1Z1JlbmRlclRyZWU/LmJlZ2luKCk7XG5cbiAgICB0aGlzW1RSQU5TQUNUSU9OXSA9IG5ldyBUcmFuc2FjdGlvbkltcGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uSW1wbCB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzW1RSQU5TQUNUSU9OXSEsICdtdXN0IGJlIGluIGEgdHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIGRpZENyZWF0ZShjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlV2l0aENyZWF0ZSkge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uZGlkQ3JlYXRlKGNvbXBvbmVudCk7XG4gIH1cblxuICBkaWRVcGRhdGUoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUpIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLmRpZFVwZGF0ZShjb21wb25lbnQpO1xuICB9XG5cbiAgc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobW9kaWZpZXI6IE1vZGlmaWVySW5zdGFuY2UpIHtcbiAgICBpZiAodGhpcy5pc0ludGVyYWN0aXZlKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLnNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyKTtcbiAgICB9XG4gIH1cblxuICBzY2hlZHVsZVVwZGF0ZU1vZGlmaWVyKG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcmFjdGl2ZSkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zY2hlZHVsZVVwZGF0ZU1vZGlmaWVyKG1vZGlmaWVyKTtcbiAgICB9XG4gIH1cblxuICBjb21taXQoKSB7XG4gICAgbGV0IHRyYW5zYWN0aW9uID0gdGhpcy50cmFuc2FjdGlvbjtcbiAgICB0aGlzW1RSQU5TQUNUSU9OXSA9IG51bGw7XG4gICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7XG5cbiAgICB0aGlzLmRlYnVnUmVuZGVyVHJlZT8uY29tbWl0KCk7XG5cbiAgICB0aGlzLmRlbGVnYXRlLm9uVHJhbnNhY3Rpb25Db21taXQoKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50RGVsZWdhdGUge1xuICAvKipcbiAgICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIHRoZSBlbnZpcm9ubWVudCBpcyBpbnRlcmFjdGl2ZSAoZS5nLiBTU1IgaXMgbm90XG4gICAqIGludGVyYWN0aXZlKS4gSW50ZXJhY3RpdmUgZW52aXJvbm1lbnRzIHNjaGVkdWxlIG1vZGlmaWVycywgYW1vbmcgb3RoZXIgdGhpbmdzLlxuICAgKi9cbiAgaXNJbnRlcmFjdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlZCB0byBlbmFibGUgZGVidWcgdG9vbGluZ1xuICAgKi9cbiAgZW5hYmxlRGVidWdUb29saW5nOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhbiBlbnZpcm9ubWVudCB0cmFuc2FjdGlvbiBjb21taXRzXG4gICAqL1xuICBvblRyYW5zYWN0aW9uQ29tbWl0OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVudGltZUNvbnRleHQoXG4gIG9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9ucyxcbiAgZGVsZWdhdGU6IEVudmlyb25tZW50RGVsZWdhdGUsXG4gIGFydGlmYWN0czogUnVudGltZUFydGlmYWN0cyxcbiAgcmVzb2x2ZXI6IFJ1bnRpbWVSZXNvbHZlclxuKTogUnVudGltZUNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGVudjogbmV3IEVudmlyb25tZW50SW1wbChvcHRpb25zLCBkZWxlZ2F0ZSksXG4gICAgcHJvZ3JhbTogbmV3IFJ1bnRpbWVQcm9ncmFtSW1wbChhcnRpZmFjdHMuY29uc3RhbnRzLCBhcnRpZmFjdHMuaGVhcCksXG4gICAgcmVzb2x2ZXI6IHJlc29sdmVyLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5UcmFuc2FjdGlvbihlbnY6IEVudmlyb25tZW50LCBjYjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAoIWVudltUUkFOU0FDVElPTl0pIHtcbiAgICBlbnYuYmVnaW4oKTtcbiAgICB0cnkge1xuICAgICAgY2IoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW52LmNvbW1pdCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYigpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVudmlyb25tZW50SW1wbDtcbiJdLCJzb3VyY2VSb290IjoiIn0=