babel-plugin-ember-template-compilation
Version:
Babel implementation of Ember's low-level template-compilation API
185 lines (184 loc) • 29.6 kB
JavaScript
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _JSUtils_instances, _JSUtils_babel, _JSUtils_state, _JSUtils_template, _JSUtils_addedBinding, _JSUtils_importer, _JSUtils_emitStatement, _JSUtils_parseExpression, _ExpressionContext_importer, _ExpressionContext_target;
import { astNodeHasBinding } from './hbs-utils.js';
// This exists to give AST plugins a controlled interface for influencing the
// surrounding Javascript scope
export class JSUtils {
constructor(babel, state, template, addedBinding, importer) {
_JSUtils_instances.add(this);
_JSUtils_babel.set(this, void 0);
_JSUtils_state.set(this, void 0);
_JSUtils_template.set(this, void 0);
_JSUtils_addedBinding.set(this, void 0);
_JSUtils_importer.set(this, void 0);
__classPrivateFieldSet(this, _JSUtils_babel, babel, "f");
__classPrivateFieldSet(this, _JSUtils_state, state, "f");
__classPrivateFieldSet(this, _JSUtils_template, template, "f");
__classPrivateFieldSet(this, _JSUtils_addedBinding, addedBinding, "f");
__classPrivateFieldSet(this, _JSUtils_importer, importer, "f");
if (!__classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath) {
let target;
for (let statement of __classPrivateFieldGet(this, _JSUtils_state, "f").program.get('body')) {
if (!statement.isImportDeclaration()) {
break;
}
target = statement;
}
if (target) {
__classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath = target;
}
}
}
/**
* Create a new binding that you can use in your template, initialized with
* the given Javascript expression.
*
* @param { Expression } expression A javascript expression whose value will
* initialize your new binding. See docs on the Expression type for details.
* @param target The location within your template where the binding will be
* used. This matters so we can avoid naming collisions.
* @param opts.nameHint Optionally, provide a descriptive name for your new
* binding. We will mangle this name as needed to avoid collisions, but
* picking a good name here can aid in debugging.
*
* @return The name you can use in your template to access the binding.
*/
bindExpression(expression, target, opts) {
let name = unusedNameLike(opts?.nameHint ?? 'a', (candidate) => __classPrivateFieldGet(this, _JSUtils_template, "f").scope.hasBinding(candidate) || astNodeHasBinding(target, candidate));
let t = __classPrivateFieldGet(this, _JSUtils_babel, "f").types;
let declaration = __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_emitStatement).call(this, t.variableDeclaration('let', [
t.variableDeclarator(t.identifier(name), __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_parseExpression).call(this, __classPrivateFieldGet(this, _JSUtils_state, "f").program, expression)),
]));
declaration.scope.registerBinding('let', declaration.get('declarations.0'));
__classPrivateFieldGet(this, _JSUtils_addedBinding, "f").call(this, name);
return name;
}
/**
* Gain access to an imported value within your template.
*
* @param moduleSpecifier The path to import from.
* @param exportedName The named export you wish to access, or "default" for
* the default export, or "*" for the namespace export.
* @param target The location within your template where the binding will be
* used. This matters so we can avoid naming collisions.
* @param opts.nameHint Optionally, provide a descriptive name for your new
* binding. We will mangle this name as needed to avoid collisions, but
* picking a good name here can aid in debugging.
*
* @return The name you can use in your template to access the imported value.
*/
bindImport(moduleSpecifier, exportedName, target, opts) {
// This will discover or create the local name for accessing the given import.
let importedIdentifier = __classPrivateFieldGet(this, _JSUtils_importer, "f").import(__classPrivateFieldGet(this, _JSUtils_template, "f"), moduleSpecifier, exportedName, opts?.nameHint);
// Simple base case: the JS name that's available is also unused at our spot
// in HBS, so just use it.
if (!astNodeHasBinding(target, importedIdentifier.name)) {
__classPrivateFieldGet(this, _JSUtils_addedBinding, "f").call(this, importedIdentifier.name);
return importedIdentifier.name;
}
// The importedIdentifier that we have in Javascript is not usable within
// our HBS because it's shadowed by a block param. So we will introduce a
// second name via a variable declaration.
//
// The reason we don't force the import itself to have this name is that
// we might be re-using an existing import, and we don't want to go
// rewriting all of its callsites that are unrelated to us.
let identifier = unusedNameLike(importedIdentifier.name, (candidate) => __classPrivateFieldGet(this, _JSUtils_template, "f").scope.hasBinding(candidate) || astNodeHasBinding(target, candidate));
let t = __classPrivateFieldGet(this, _JSUtils_babel, "f").types;
let declaration = __classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_emitStatement).call(this, t.variableDeclaration('let', [
t.variableDeclarator(t.identifier(identifier), importedIdentifier),
]));
declaration.scope.registerBinding('let', declaration.get('declarations.0'));
__classPrivateFieldGet(this, _JSUtils_addedBinding, "f").call(this, identifier);
return identifier;
}
/**
* Add an import statement purely for side effect.
*
* @param moduleSpecifier the module to import
*/
importForSideEffect(moduleSpecifier) {
__classPrivateFieldGet(this, _JSUtils_importer, "f").importForSideEffect(moduleSpecifier);
}
/**
* Emit a javascript expresison for side-effect. This only accepts
* expressions, not statements, because you should not introduce new bindings.
* To introduce a binding see bindExpression or bindImport instead.
*
* @param { Expression } expression A javascript expression whose value will
* initialize your new binding. See docs on the Expression type below for
* details.
*/
emitExpression(expression) {
let t = __classPrivateFieldGet(this, _JSUtils_babel, "f").types;
__classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_emitStatement).call(this, t.expressionStatement(__classPrivateFieldGet(this, _JSUtils_instances, "m", _JSUtils_parseExpression).call(this, __classPrivateFieldGet(this, _JSUtils_state, "f").program, expression)));
}
}
_JSUtils_babel = new WeakMap(), _JSUtils_state = new WeakMap(), _JSUtils_template = new WeakMap(), _JSUtils_addedBinding = new WeakMap(), _JSUtils_importer = new WeakMap(), _JSUtils_instances = new WeakSet(), _JSUtils_emitStatement = function _JSUtils_emitStatement(statement) {
if (__classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath) {
__classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath = __classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath.insertAfter(statement)[0];
}
else {
__classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath = __classPrivateFieldGet(this, _JSUtils_state, "f").program.unshiftContainer('body', statement)[0];
}
return __classPrivateFieldGet(this, _JSUtils_state, "f").lastInsertedPath;
}, _JSUtils_parseExpression = function _JSUtils_parseExpression(target, expression) {
let expressionString;
if (typeof expression === 'string') {
expressionString = expression;
}
else {
expressionString = expression(new ExpressionContext(__classPrivateFieldGet(this, _JSUtils_importer, "f"), target));
}
return __classPrivateFieldGet(this, _JSUtils_babel, "f").template.expression.ast(expressionString);
};
function unusedNameLike(desiredName, isUsed) {
let candidate = desiredName;
let counter = 0;
while (isUsed(candidate)) {
candidate = `${desiredName}${counter++}`;
}
return candidate;
}
/**
* Allows you to construct an expression that relies on imported values.
*/
class ExpressionContext {
constructor(importer, target) {
_ExpressionContext_importer.set(this, void 0);
_ExpressionContext_target.set(this, void 0);
__classPrivateFieldSet(this, _ExpressionContext_importer, importer, "f");
__classPrivateFieldSet(this, _ExpressionContext_target, target, "f");
}
/**
* Find or create a local binding for the given import.
*
* @param moduleSpecifier The path to import from.
* @param exportedName The named export you wish to access, or "default" for
* the default export, or "*" for the namespace export.
* @param nameHint Optionally, provide a descriptive name for your new
* binding. We will mangle this name as needed to avoid collisions, but
* picking a good name here can aid in debugging.
* @return the local identifier for the imported value
*/
import(moduleSpecifier, exportedName, nameHint) {
// this method in babel-import-util is the lower-level one that doesn't try
// to create valid references for us. It's our responsibility to do so. But
// that's OK here, because we have the same responsibility for every
// scope-bag identifier, not just the imported ones, and it will be easier
// to handle them all at once.
return __classPrivateFieldGet(this, _ExpressionContext_importer, "f").import(__classPrivateFieldGet(this, _ExpressionContext_target, "f"), moduleSpecifier, exportedName, nameHint).name;
}
}
_ExpressionContext_importer = new WeakMap(), _ExpressionContext_target = new WeakMap();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvanMtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBS0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPbkQsNkVBQTZFO0FBQzdFLCtCQUErQjtBQUMvQixNQUFNLE9BQU8sT0FBTztJQU9sQixZQUNFLEtBQW1CLEVBQ25CLEtBQVksRUFDWixRQUFnQyxFQUNoQyxZQUFvQyxFQUNwQyxRQUFvQjs7UUFYdEIsaUNBQXFCO1FBQ3JCLGlDQUFjO1FBQ2Qsb0NBQWtDO1FBQ2xDLHdDQUFzQztRQUN0QyxvQ0FBc0I7UUFTcEIsdUJBQUEsSUFBSSxrQkFBVSxLQUFLLE1BQUEsQ0FBQztRQUNwQix1QkFBQSxJQUFJLGtCQUFVLEtBQUssTUFBQSxDQUFDO1FBQ3BCLHVCQUFBLElBQUkscUJBQWEsUUFBUSxNQUFBLENBQUM7UUFDMUIsdUJBQUEsSUFBSSx5QkFBaUIsWUFBWSxNQUFBLENBQUM7UUFDbEMsdUJBQUEsSUFBSSxxQkFBYSxRQUFRLE1BQUEsQ0FBQztRQUUxQixJQUFJLENBQUMsdUJBQUEsSUFBSSxzQkFBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDbEMsSUFBSSxNQUF5QyxDQUFDO1lBQzlDLEtBQUssSUFBSSxTQUFTLElBQUksdUJBQUEsSUFBSSxzQkFBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7b0JBQ3JDLE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQ3JCLENBQUM7WUFDRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLHVCQUFBLElBQUksc0JBQU8sQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7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ZSB7IHR5cGVzIGFzIHQgfSBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgdHlwZSAqIGFzIEJhYmVsIGZyb20gJ0BiYWJlbC9jb3JlJztcbmltcG9ydCB0eXBlIHsgTm9kZVBhdGggfSBmcm9tICdAYmFiZWwvdHJhdmVyc2UnO1xuaW1wb3J0IHR5cGUgeyBBU1RQbHVnaW5CdWlsZGVyLCBBU1RQbHVnaW5FbnZpcm9ubWVudCwgQVNUdjEsIFdhbGtlclBhdGggfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuaW1wb3J0IHR5cGUgeyBJbXBvcnRVdGlsIH0gZnJvbSAnYmFiZWwtaW1wb3J0LXV0aWwnO1xuaW1wb3J0IHsgYXN0Tm9kZUhhc0JpbmRpbmcgfSBmcm9tICcuL2hicy11dGlscy5qcyc7XG5cbmludGVyZmFjZSBTdGF0ZSB7XG4gIHByb2dyYW06IE5vZGVQYXRoPEJhYmVsLnR5cGVzLlByb2dyYW0+O1xuICBsYXN0SW5zZXJ0ZWRQYXRoOiBOb2RlUGF0aDxCYWJlbC50eXBlcy5TdGF0ZW1lbnQ+IHwgdW5kZWZpbmVkO1xufVxuXG4vLyBUaGlzIGV4aXN0cyB0byBnaXZlIEFTVCBwbHVnaW5zIGEgY29udHJvbGxlZCBpbnRlcmZhY2UgZm9yIGluZmx1ZW5jaW5nIHRoZVxuLy8gc3Vycm91bmRpbmcgSmF2YXNjcmlwdCBzY29wZVxuZXhwb3J0IGNsYXNzIEpTVXRpbHMge1xuICAjYmFiZWw6IHR5cGVvZiBCYWJlbDtcbiAgI3N0YXRlOiBTdGF0ZTtcbiAgI3RlbXBsYXRlOiBOb2RlUGF0aDx0LkV4cHJlc3Npb24+O1xuICAjYWRkZWRCaW5kaW5nOiAobmFtZTogc3RyaW5nKSA9PiB2b2lkO1xuICAjaW1wb3J0ZXI6IEltcG9ydFV0aWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFiZWw6IHR5cGVvZiBCYWJlbCxcbiAgICBzdGF0ZTogU3RhdGUsXG4gICAgdGVtcGxhdGU6IE5vZGVQYXRoPHQuRXhwcmVzc2lvbj4sXG4gICAgYWRkZWRCaW5kaW5nOiAobmFtZTogc3RyaW5nKSA9PiB2b2lkLFxuICAgIGltcG9ydGVyOiBJbXBvcnRVdGlsXG4gICkge1xuICAgIHRoaXMuI2JhYmVsID0gYmFiZWw7XG4gICAgdGhpcy4jc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLiN0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMuI2FkZGVkQmluZGluZyA9IGFkZGVkQmluZGluZztcbiAgICB0aGlzLiNpbXBvcnRlciA9IGltcG9ydGVyO1xuXG4gICAgaWYgKCF0aGlzLiNzdGF0ZS5sYXN0SW5zZXJ0ZWRQYXRoKSB7XG4gICAgICBsZXQgdGFyZ2V0OiBOb2RlUGF0aDx0LlN0YXRlbWVudD4gfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2YgdGhpcy4jc3RhdGUucHJvZ3JhbS5nZXQoJ2JvZHknKSkge1xuICAgICAgICBpZiAoIXN0YXRlbWVudC5pc0ltcG9ydERlY2xhcmF0aW9uKCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBzdGF0ZW1lbnQ7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuI3N0YXRlLmxhc3RJbnNlcnRlZFBhdGggPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBiaW5kaW5nIHRoYXQgeW91IGNhbiB1c2UgaW4geW91ciB0ZW1wbGF0ZSwgaW5pdGlhbGl6ZWQgd2l0aFxuICAgKiB0aGUgZ2l2ZW4gSmF2YXNjcmlwdCBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyBFeHByZXNzaW9uIH0gZXhwcmVzc2lvbiBBIGphdmFzY3JpcHQgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSB3aWxsXG4gICAqIGluaXRpYWxpemUgeW91ciBuZXcgYmluZGluZy4gU2VlIGRvY3Mgb24gdGhlIEV4cHJlc3Npb24gdHlwZSBmb3IgZGV0YWlscy5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgbG9jYXRpb24gd2l0aGluIHlvdXIgdGVtcGxhdGUgd2hlcmUgdGhlIGJpbmRpbmcgd2lsbCBiZVxuICAgKiB1c2VkLiBUaGlzIG1hdHRlcnMgc28gd2UgY2FuIGF2b2lkIG5hbWluZyBjb2xsaXNpb25zLlxuICAgKiBAcGFyYW0gb3B0cy5uYW1lSGludCBPcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgeW91ciBuZXdcbiAgICogYmluZGluZy4gV2Ugd2lsbCBtYW5nbGUgdGhpcyBuYW1lIGFzIG5lZWRlZCB0byBhdm9pZCBjb2xsaXNpb25zLCBidXRcbiAgICogcGlja2luZyBhIGdvb2QgbmFtZSBoZXJlIGNhbiBhaWQgaW4gZGVidWdnaW5nLlxuICAgKlxuICAgKiBAcmV0dXJuIFRoZSBuYW1lIHlvdSBjYW4gdXNlIGluIHlvdXIgdGVtcGxhdGUgdG8gYWNjZXNzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgYmluZEV4cHJlc3Npb24oXG4gICAgZXhwcmVzc2lvbjogRXhwcmVzc2lvbixcbiAgICB0YXJnZXQ6IFdhbGtlclBhdGg8QVNUdjEuTm9kZT4sXG4gICAgb3B0cz86IHsgbmFtZUhpbnQ/OiBzdHJpbmcgfVxuICApOiBzdHJpbmcge1xuICAgIGxldCBuYW1lID0gdW51c2VkTmFtZUxpa2UoXG4gICAgICBvcHRzPy5uYW1lSGludCA/PyAnYScsXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICB0aGlzLiN0ZW1wbGF0ZS5zY29wZS5oYXNCaW5kaW5nKGNhbmRpZGF0ZSkgfHwgYXN0Tm9kZUhhc0JpbmRpbmcodGFyZ2V0LCBjYW5kaWRhdGUpXG4gICAgKTtcbiAgICBsZXQgdCA9IHRoaXMuI2JhYmVsLnR5cGVzO1xuICAgIGxldCBkZWNsYXJhdGlvbjogTm9kZVBhdGg8dC5WYXJpYWJsZURlY2xhcmF0aW9uPiA9IHRoaXMuI2VtaXRTdGF0ZW1lbnQoXG4gICAgICB0LnZhcmlhYmxlRGVjbGFyYXRpb24oJ2xldCcsIFtcbiAgICAgICAgdC52YXJpYWJsZURlY2xhcmF0b3IoXG4gICAgICAgICAgdC5pZGVudGlmaWVyKG5hbWUpLFxuICAgICAgICAgIHRoaXMuI3BhcnNlRXhwcmVzc2lvbih0aGlzLiNzdGF0ZS5wcm9ncmFtLCBleHByZXNzaW9uKVxuICAgICAgICApLFxuICAgICAgXSlcbiAgICApO1xuICAgIGRlY2xhcmF0aW9uLnNjb3BlLnJlZ2lzdGVyQmluZGluZygnbGV0JywgZGVjbGFyYXRpb24uZ2V0KCdkZWNsYXJhdGlvbnMuMCcpIGFzIE5vZGVQYXRoKTtcbiAgICB0aGlzLiNhZGRlZEJpbmRpbmcobmFtZSk7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAjZW1pdFN0YXRlbWVudDxUIGV4dGVuZHMgdC5TdGF0ZW1lbnQ+KHN0YXRlbWVudDogVCk6IE5vZGVQYXRoPFQ+IHtcbiAgICBpZiAodGhpcy4jc3RhdGUubGFzdEluc2VydGVkUGF0aCkge1xuICAgICAgdGhpcy4jc3RhdGUubGFzdEluc2VydGVkUGF0aCA9IHRoaXMuI3N0YXRlLmxhc3RJbnNlcnRlZFBhdGguaW5zZXJ0QWZ0ZXIoc3RhdGVtZW50KVswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jc3RhdGUubGFzdEluc2VydGVkUGF0aCA9IHRoaXMuI3N0YXRlLnByb2dyYW0udW5zaGlmdENvbnRhaW5lcignYm9keScsIHN0YXRlbWVudClbMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNzdGF0ZS5sYXN0SW5zZXJ0ZWRQYXRoIGFzIE5vZGVQYXRoPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIEdhaW4gYWNjZXNzIHRvIGFuIGltcG9ydGVkIHZhbHVlIHdpdGhpbiB5b3VyIHRlbXBsYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kdWxlU3BlY2lmaWVyIFRoZSBwYXRoIHRvIGltcG9ydCBmcm9tLlxuICAgKiBAcGFyYW0gZXhwb3J0ZWROYW1lIFRoZSBuYW1lZCBleHBvcnQgeW91IHdpc2ggdG8gYWNjZXNzLCBvciBcImRlZmF1bHRcIiBmb3JcbiAgICogdGhlIGRlZmF1bHQgZXhwb3J0LCBvciBcIipcIiBmb3IgdGhlIG5hbWVzcGFjZSBleHBvcnQuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIGxvY2F0aW9uIHdpdGhpbiB5b3VyIHRlbXBsYXRlIHdoZXJlIHRoZSBiaW5kaW5nIHdpbGwgYmVcbiAgICogdXNlZC4gVGhpcyBtYXR0ZXJzIHNvIHdlIGNhbiBhdm9pZCBuYW1pbmcgY29sbGlzaW9ucy5cbiAgICogQHBhcmFtIG9wdHMubmFtZUhpbnQgT3B0aW9uYWxseSwgcHJvdmlkZSBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHlvdXIgbmV3XG4gICAqIGJpbmRpbmcuIFdlIHdpbGwgbWFuZ2xlIHRoaXMgbmFtZSBhcyBuZWVkZWQgdG8gYXZvaWQgY29sbGlzaW9ucywgYnV0XG4gICAqIHBpY2tpbmcgYSBnb29kIG5hbWUgaGVyZSBjYW4gYWlkIGluIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHJldHVybiBUaGUgbmFtZSB5b3UgY2FuIHVzZSBpbiB5b3VyIHRlbXBsYXRlIHRvIGFjY2VzcyB0aGUgaW1wb3J0ZWQgdmFsdWUuXG4gICAqL1xuICBiaW5kSW1wb3J0KFxuICAgIG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLFxuICAgIGV4cG9ydGVkTmFtZTogc3RyaW5nLFxuICAgIHRhcmdldDogV2Fsa2VyUGF0aDxBU1R2MS5Ob2RlPixcbiAgICBvcHRzPzogeyBuYW1lSGludD86IHN0cmluZyB9XG4gICk6IHN0cmluZyB7XG4gICAgLy8gVGhpcyB3aWxsIGRpc2NvdmVyIG9yIGNyZWF0ZSB0aGUgbG9jYWwgbmFtZSBmb3IgYWNjZXNzaW5nIHRoZSBnaXZlbiBpbXBvcnQuXG4gICAgbGV0IGltcG9ydGVkSWRlbnRpZmllciA9IHRoaXMuI2ltcG9ydGVyLmltcG9ydChcbiAgICAgIHRoaXMuI3RlbXBsYXRlLFxuICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgZXhwb3J0ZWROYW1lLFxuICAgICAgb3B0cz8ubmFtZUhpbnRcbiAgICApO1xuXG4gICAgLy8gU2ltcGxlIGJhc2UgY2FzZTogdGhlIEpTIG5hbWUgdGhhdCdzIGF2YWlsYWJsZSBpcyBhbHNvIHVudXNlZCBhdCBvdXIgc3BvdFxuICAgIC8vIGluIEhCUywgc28ganVzdCB1c2UgaXQuXG4gICAgaWYgKCFhc3ROb2RlSGFzQmluZGluZyh0YXJnZXQsIGltcG9ydGVkSWRlbnRpZmllci5uYW1lKSkge1xuICAgICAgdGhpcy4jYWRkZWRCaW5kaW5nKGltcG9ydGVkSWRlbnRpZmllci5uYW1lKTtcbiAgICAgIHJldHVybiBpbXBvcnRlZElkZW50aWZpZXIubmFtZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgaW1wb3J0ZWRJZGVudGlmaWVyIHRoYXQgd2UgaGF2ZSBpbiBKYXZhc2NyaXB0IGlzIG5vdCB1c2FibGUgd2l0aGluXG4gICAgLy8gb3VyIEhCUyBiZWNhdXNlIGl0J3Mgc2hhZG93ZWQgYnkgYSBibG9jayBwYXJhbS4gU28gd2Ugd2lsbCBpbnRyb2R1Y2UgYVxuICAgIC8vIHNlY29uZCBuYW1lIHZpYSBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLlxuICAgIC8vXG4gICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBmb3JjZSB0aGUgaW1wb3J0IGl0c2VsZiB0byBoYXZlIHRoaXMgbmFtZSBpcyB0aGF0XG4gICAgLy8gd2UgbWlnaHQgYmUgcmUtdXNpbmcgYW4gZXhpc3RpbmcgaW1wb3J0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBnb1xuICAgIC8vIHJld3JpdGluZyBhbGwgb2YgaXRzIGNhbGxzaXRlcyB0aGF0IGFyZSB1bnJlbGF0ZWQgdG8gdXMuXG4gICAgbGV0IGlkZW50aWZpZXIgPSB1bnVzZWROYW1lTGlrZShcbiAgICAgIGltcG9ydGVkSWRlbnRpZmllci5uYW1lLFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgdGhpcy4jdGVtcGxhdGUuc2NvcGUuaGFzQmluZGluZyhjYW5kaWRhdGUpIHx8IGFzdE5vZGVIYXNCaW5kaW5nKHRhcmdldCwgY2FuZGlkYXRlKVxuICAgICk7XG4gICAgbGV0IHQgPSB0aGlzLiNiYWJlbC50eXBlcztcbiAgICBsZXQgZGVjbGFyYXRpb24gPSB0aGlzLiNlbWl0U3RhdGVtZW50KFxuICAgICAgdC52YXJpYWJsZURlY2xhcmF0aW9uKCdsZXQnLCBbXG4gICAgICAgIHQudmFyaWFibGVEZWNsYXJhdG9yKHQuaWRlbnRpZmllcihpZGVudGlmaWVyKSwgaW1wb3J0ZWRJZGVudGlmaWVyKSxcbiAgICAgIF0pXG4gICAgKTtcbiAgICBkZWNsYXJhdGlvbi5zY29wZS5yZWdpc3RlckJpbmRpbmcoJ2xldCcsIGRlY2xhcmF0aW9uLmdldCgnZGVjbGFyYXRpb25zLjAnKSBhcyBOb2RlUGF0aCk7XG5cbiAgICB0aGlzLiNhZGRlZEJpbmRpbmcoaWRlbnRpZmllcik7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGltcG9ydCBzdGF0ZW1lbnQgcHVyZWx5IGZvciBzaWRlIGVmZmVjdC5cbiAgICpcbiAgICogQHBhcmFtIG1vZHVsZVNwZWNpZmllciB0aGUgbW9kdWxlIHRvIGltcG9ydFxuICAgKi9cbiAgaW1wb3J0Rm9yU2lkZUVmZmVjdChtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuI2ltcG9ydGVyLmltcG9ydEZvclNpZGVFZmZlY3QobW9kdWxlU3BlY2lmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGEgamF2YXNjcmlwdCBleHByZXNpc29uIGZvciBzaWRlLWVmZmVjdC4gVGhpcyBvbmx5IGFjY2VwdHNcbiAgICogZXhwcmVzc2lvbnMsIG5vdCBzdGF0ZW1lbnRzLCBiZWNhdXNlIHlvdSBzaG91bGQgbm90IGludHJvZHVjZSBuZXcgYmluZGluZ3MuXG4gICAqIFRvIGludHJvZHVjZSBhIGJpbmRpbmcgc2VlIGJpbmRFeHByZXNzaW9uIG9yIGJpbmRJbXBvcnQgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHsgRXhwcmVzc2lvbiB9IGV4cHJlc3Npb24gQSBqYXZhc2NyaXB0IGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgd2lsbFxuICAgKiBpbml0aWFsaXplIHlvdXIgbmV3IGJpbmRpbmcuIFNlZSBkb2NzIG9uIHRoZSBFeHByZXNzaW9uIHR5cGUgYmVsb3cgZm9yXG4gICAqIGRldGFpbHMuXG4gICAqL1xuICBlbWl0RXhwcmVzc2lvbihleHByZXNzaW9uOiBFeHByZXNzaW9uKTogdm9pZCB7XG4gICAgbGV0IHQgPSB0aGlzLiNiYWJlbC50eXBlcztcbiAgICB0aGlzLiNlbWl0U3RhdGVtZW50KFxuICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KHRoaXMuI3BhcnNlRXhwcmVzc2lvbih0aGlzLiNzdGF0ZS5wcm9ncmFtLCBleHByZXNzaW9uKSlcbiAgICApO1xuICB9XG5cbiAgI3BhcnNlRXhwcmVzc2lvbih0YXJnZXQ6IE5vZGVQYXRoPHQuTm9kZT4sIGV4cHJlc3Npb246IEV4cHJlc3Npb24pOiB0LkV4cHJlc3Npb24ge1xuICAgIGxldCBleHByZXNzaW9uU3RyaW5nOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBleHByZXNzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgZXhwcmVzc2lvblN0cmluZyA9IGV4cHJlc3Npb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cHJlc3Npb25TdHJpbmcgPSBleHByZXNzaW9uKG5ldyBFeHByZXNzaW9uQ29udGV4dCh0aGlzLiNpbXBvcnRlciwgdGFyZ2V0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2JhYmVsLnRlbXBsYXRlLmV4cHJlc3Npb24uYXN0KGV4cHJlc3Npb25TdHJpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVudXNlZE5hbWVMaWtlKGRlc2lyZWROYW1lOiBzdHJpbmcsIGlzVXNlZDogKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbik6IHN0cmluZyB7XG4gIGxldCBjYW5kaWRhdGUgPSBkZXNpcmVkTmFtZTtcbiAgbGV0IGNvdW50ZXIgPSAwO1xuICB3aGlsZSAoaXNVc2VkKGNhbmRpZGF0ZSkpIHtcbiAgICBjYW5kaWRhdGUgPSBgJHtkZXNpcmVkTmFtZX0ke2NvdW50ZXIrK31gO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGU7XG59XG5cbi8qKlxuICogVGhpcyBleHRlbmRzIEdsaW1tZXIncyBBU1RQbHVnaW5FbnZpcm9ubWVudCB0eXBlIHRvIHB1dCBvdXIganN1dGlscyBpbnRvIG1ldGFcbiAqL1xuZXhwb3J0IHR5cGUgV2l0aEpTVXRpbHM8VCBleHRlbmRzIHsgbWV0YT86IG9iamVjdCB9PiA9IHtcbiAgbWV0YTogVFsnbWV0YSddICYgeyBqc3V0aWxzOiBKU1V0aWxzIH07XG59ICYgVDtcblxuZXhwb3J0IHR5cGUgRXh0ZW5kZWRQbHVnaW5CdWlsZGVyID0gQVNUUGx1Z2luQnVpbGRlcjxXaXRoSlNVdGlsczxBU1RQbHVnaW5FbnZpcm9ubWVudD4+O1xuXG4vKipcbiAqIEFsbG93cyB5b3UgdG8gY29uc3RydWN0IGFuIGV4cHJlc3Npb24gdGhhdCByZWxpZXMgb24gaW1wb3J0ZWQgdmFsdWVzLlxuICovXG5jbGFzcyBFeHByZXNzaW9uQ29udGV4dCB7XG4gICNpbXBvcnRlcjogSW1wb3J0VXRpbDtcbiAgI3RhcmdldDogTm9kZVBhdGg8dC5Ob2RlPjtcblxuICBjb25zdHJ1Y3RvcihpbXBvcnRlcjogSW1wb3J0VXRpbCwgdGFyZ2V0OiBOb2RlUGF0aDx0Lk5vZGU+KSB7XG4gICAgdGhpcy4jaW1wb3J0ZXIgPSBpbXBvcnRlcjtcbiAgICB0aGlzLiN0YXJnZXQgPSB0YXJnZXQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBvciBjcmVhdGUgYSBsb2NhbCBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gaW1wb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gbW9kdWxlU3BlY2lmaWVyIFRoZSBwYXRoIHRvIGltcG9ydCBmcm9tLlxuICAgKiBAcGFyYW0gZXhwb3J0ZWROYW1lIFRoZSBuYW1lZCBleHBvcnQgeW91IHdpc2ggdG8gYWNjZXNzLCBvciBcImRlZmF1bHRcIiBmb3JcbiAgICogdGhlIGRlZmF1bHQgZXhwb3J0LCBvciBcIipcIiBmb3IgdGhlIG5hbWVzcGFjZSBleHBvcnQuXG4gICAqIEBwYXJhbSBuYW1lSGludCBPcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgeW91ciBuZXdcbiAgICogYmluZGluZy4gV2Ugd2lsbCBtYW5nbGUgdGhpcyBuYW1lIGFzIG5lZWRlZCB0byBhdm9pZCBjb2xsaXNpb25zLCBidXRcbiAgICogcGlja2luZyBhIGdvb2QgbmFtZSBoZXJlIGNhbiBhaWQgaW4gZGVidWdnaW5nLlxuXG4gICAqIEByZXR1cm4gdGhlIGxvY2FsIGlkZW50aWZpZXIgZm9yIHRoZSBpbXBvcnRlZCB2YWx1ZVxuICAgKi9cbiAgaW1wb3J0KG1vZHVsZVNwZWNpZmllcjogc3RyaW5nLCBleHBvcnRlZE5hbWU6IHN0cmluZywgbmFtZUhpbnQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIHRoaXMgbWV0aG9kIGluIGJhYmVsLWltcG9ydC11dGlsIGlzIHRoZSBsb3dlci1sZXZlbCBvbmUgdGhhdCBkb2Vzbid0IHRyeVxuICAgIC8vIHRvIGNyZWF0ZSB2YWxpZCByZWZlcmVuY2VzIGZvciB1cy4gSXQncyBvdXIgcmVzcG9uc2liaWxpdHkgdG8gZG8gc28uIEJ1dFxuICAgIC8vIHRoYXQncyBPSyBoZXJlLCBiZWNhdXNlIHdlIGhhdmUgdGhlIHNhbWUgcmVzcG9uc2liaWxpdHkgZm9yIGV2ZXJ5XG4gICAgLy8gc2NvcGUtYmFnIGlkZW50aWZpZXIsIG5vdCBqdXN0IHRoZSBpbXBvcnRlZCBvbmVzLCBhbmQgaXQgd2lsbCBiZSBlYXNpZXJcbiAgICAvLyB0byBoYW5kbGUgdGhlbSBhbGwgYXQgb25jZS5cbiAgICByZXR1cm4gdGhpcy4jaW1wb3J0ZXIuaW1wb3J0KHRoaXMuI3RhcmdldCwgbW9kdWxlU3BlY2lmaWVyLCBleHBvcnRlZE5hbWUsIG5hbWVIaW50KS5uYW1lO1xuICB9XG59XG5cbi8qKlxuICogWW91IGNhbiBwYXNzIGEgSmF2YXNjcmlwdCBleHByZXNzaW9uIGFzIGEgc3RyaW5nIGxpa2U6XG4gKlxuICogICBcIm5ldyBEYXRlKClcIlxuICpcbiAqIE9yIGFzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3RyaW5nOlxuICpcbiAqICAgKCkgPT4gXCJuZXcgRGF0ZSgpXCJcbiAqXG4gKiBXaGVuIHlvdSB1c2UgYSBmdW5jdGlvbiwgaXQgY2FuIHVzZSBpbXBvcnRlZCB2YWx1ZXM6XG4gKlxuICogICAoY29udGV4dCkgPT4gYG5ldyAke2NvbnRleHQuaW1wb3J0KFwibHV4b25cIiwgXCJEYXRlVGltZVwiKX0oKWBcbiAqXG4gKi9cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb24gPSBzdHJpbmcgfCAoKGNvbnRleHQ6IEV4cHJlc3Npb25Db250ZXh0KSA9PiBzdHJpbmcpO1xuIl19