@glimmer/compiler
Version:
576 lines (567 loc) • 68.8 kB
JavaScript
import { dict, assertNever } from '@glimmer/util';
export var VariableKind;
(function (VariableKind) {
VariableKind["Local"] = "Local";
VariableKind["Free"] = "Free";
VariableKind["Arg"] = "Arg";
VariableKind["Block"] = "Block";
VariableKind["This"] = "This";
})(VariableKind || (VariableKind = {}));
export function normalizeStatement(statement) {
if (Array.isArray(statement)) {
if (statementIsExpression(statement)) {
return normalizeAppendExpression(statement, "AppendSingleId" /* AppendSingleId */);
} else if (isSugaryArrayStatement(statement)) {
return normalizeSugaryArrayStatement(statement);
} else {
return normalizeVerboseStatement(statement);
}
} else if (typeof statement === 'string') {
return {
kind: "AppendPath" /* AppendPath */
, path: normalizeDottedPath(statement),
trusted: false
};
} else {
throw assertNever(statement);
}
}
function isSugaryArrayStatement(statement) {
if (Array.isArray(statement) && typeof statement[0] === 'string') {
switch (statement[0][0]) {
case '(':
case '#':
case '<':
return true;
default:
return false;
}
}
return false;
}
export function normalizeSugaryArrayStatement(statement) {
var name = statement[0];
switch (name[0]) {
case '(':
{
var params = null;
var hash = null;
if (statement.length === 3) {
params = normalizeParams(statement[1]);
hash = normalizeHash(statement[2]);
} else if (statement.length === 2) {
if (Array.isArray(statement[1])) {
params = normalizeParams(statement[1]);
} else {
hash = normalizeHash(statement[1]);
}
}
return {
kind: "Call" /* Call */
, path: normalizeCallHead(name),
params: params,
hash: hash,
trusted: false
};
}
case '#':
{
var _normalizeBuilderBloc = normalizeBuilderBlockStatement(statement),
path = _normalizeBuilderBloc.head,
_params = _normalizeBuilderBloc.params,
_hash = _normalizeBuilderBloc.hash,
blocks = _normalizeBuilderBloc.blocks,
blockParams = _normalizeBuilderBloc.blockParams;
return {
kind: "Block" /* Block */
, path: path,
params: _params,
hash: _hash,
blocks: blocks,
blockParams: blockParams
};
}
case '<':
{
var attrs = dict();
var block = [];
if (statement.length === 3) {
attrs = normalizeAttrs(statement[1]);
block = normalizeBlock(statement[2]);
} else if (statement.length === 2) {
if (Array.isArray(statement[1])) {
block = normalizeBlock(statement[1]);
} else {
attrs = normalizeAttrs(statement[1]);
}
}
return {
kind: "Element" /* Element */
, name: extractElement(name),
attrs: attrs,
block: block
};
}
default:
throw new Error("Unreachable " + JSON.stringify(statement) + " in normalizeSugaryArrayStatement");
}
}
function normalizeVerboseStatement(statement) {
switch (statement[0]) {
case 0 /* Literal */:
{
return {
kind: "Literal" /* Literal */
, value: statement[1]
};
}
case 2 /* Append */:
{
return normalizeAppendExpression(statement[1], "AppendSingleId" /* AppendSingleId */, statement[2]);
}
case 3 /* Modifier */:
{
return {
kind: "Modifier" /* Modifier */
, params: normalizeParams(statement[1]),
hash: normalizeHash(statement[2])
};
}
case 4 /* DynamicComponent */:
{
return {
kind: "DynamicComponent" /* DynamicComponent */
, expr: normalizeExpression(statement[1]),
hash: normalizeHash(statement[2]),
block: normalizeBlock(statement[3])
};
}
case 1 /* Comment */:
{
return {
kind: "Comment" /* Comment */
, value: statement[1]
};
}
}
}
function extractBlockHead(name) {
var result = name.match(/^#(.*)$/);
if (result === null) {
throw new Error("Unexpected missing # in block head");
}
return normalizeDottedPath(result[1]);
}
function normalizeCallHead(name) {
var result = name.match(/^\((.*)\)$/);
if (result === null) {
throw new Error("Unexpected missing () in call head");
}
return normalizeDottedPath(result[1]);
}
function normalizePath(head) {
var tail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var pathHead = normalizePathHead(head);
return {
variable: pathHead,
tail: tail
};
}
function normalizeDottedPathExpression(whole) {
return { type: "Get" /* Get */, path: normalizeDottedPath(whole) };
}
function normalizeDottedPath(whole) {
var _normalizePathHead = normalizePathHead(whole),
kind = _normalizePathHead.kind,
rest = _normalizePathHead.name;
var _rest$split = rest.split('.'),
name = _rest$split[0],
tail = _rest$split.slice(1);
return {
variable: {
kind: kind,
name: name
},
tail: tail
};
}
export function normalizePathHead(whole) {
var kind = void 0;
var name = void 0;
if (whole.match(/^this(\.|$)/)) {
return {
kind: VariableKind.This,
name: whole
};
}
switch (whole[0]) {
case '^':
kind = VariableKind.Free;
name = whole.slice(1);
break;
case '@':
kind = VariableKind.Arg;
name = whole.slice(1);
break;
case '&':
kind = VariableKind.Block;
name = whole.slice(1);
break;
default:
kind = VariableKind.Local;
name = whole;
}
return { kind: kind, name: name };
}
export function normalizeBuilderBlockStatement(statement) {
var head = statement[0];
var blocks = dict();
var params = null;
var hash = null;
var blockParams = null;
if (statement.length === 2) {
blocks = normalizeBlocks(statement[1]);
} else if (statement.length === 3) {
if (Array.isArray(statement[1])) {
params = normalizeParams(statement[1]);
} else {
var _normalizeBlockHash = normalizeBlockHash(statement[1]);
hash = _normalizeBlockHash.hash;
blockParams = _normalizeBlockHash.blockParams;
}
blocks = normalizeBlocks(statement[2]);
} else if (statement.length === 4) {
params = normalizeParams(statement[1]);
var _normalizeBlockHash2 = normalizeBlockHash(statement[2]);
hash = _normalizeBlockHash2.hash;
blockParams = _normalizeBlockHash2.blockParams;
blocks = normalizeBlocks(statement[3]);
}
return {
head: extractBlockHead(head),
params: params,
hash: hash,
blockParams: blockParams,
blocks: blocks
};
}
function normalizeBlockHash(hash) {
if (hash === null) {
return { hash: null, blockParams: null };
}
var out = null;
var blockParams = null;
entries(hash, function (key, value) {
if (key === 'as') {
blockParams = Array.isArray(value) ? value : [value];
} else {
out = out || dict();
out[key] = normalizeExpression(value);
}
});
return { hash: out, blockParams: blockParams };
}
export function entries(dict, callback) {
Object.keys(dict).forEach(function (key) {
var value = dict[key];
callback(key, value);
});
}
function normalizeBlocks(value) {
if (Array.isArray(value)) {
return { default: normalizeBlock(value) };
} else {
return mapObject(value, normalizeBlock);
}
}
function normalizeBlock(block) {
return block.map(function (s) {
return normalizeStatement(s);
});
}
function normalizeAttrs(attrs) {
return mapObject(attrs, function (a) {
return normalizeAttr(a).expr;
});
}
function normalizeAttr(attr) {
if (attr === 'splat') {
return { expr: "Splat" /* Splat */, trusted: false };
} else {
var expr = normalizeExpression(attr);
return { expr: expr, trusted: false };
}
}
function mapObject(object, callback) {
var out = dict();
Object.keys(object).forEach(function (k) {
out[k] = callback(object[k], k);
});
return out;
}
export function isElement(input) {
var match = input[0].match(/^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/);
return !!match && !!match[1];
}
export function extractElement(input) {
var match = input.match(/^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/);
return match ? match[1] : null;
}
export function extractAngleInvocation(input) {
var match = input[0].match(/^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/);
return match ? match[1] : null;
}
export function isAngleInvocation(input) {
// TODO: Paths
var match = input[0].match(/^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/);
return !!match && !!match[1];
}
export function isBlock(input) {
// TODO: Paths
var match = input[0].match(/^#[^]?([a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)$/);
return !!match && !!match[1];
}
export function normalizeAppendExpression(expression, _context) {
var forceTrusted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
if (expression === null || expression === undefined) {
return {
expr: {
type: "Literal" /* Literal */
, value: expression
},
kind: "AppendExpr" /* AppendExpr */
, trusted: true
};
} else if (Array.isArray(expression)) {
switch (expression[0]) {
case 0 /* Literal */:
return {
expr: { type: "Literal" /* Literal */, value: expression[1] },
kind: "AppendExpr" /* AppendExpr */
, trusted: true
};
case 5 /* Get */:
{
var path = normalizePath(expression[1], expression[2]);
var expr = { type: "Get" /* Get */, path: path };
if (path.tail.length === 0) {
return { path: path, kind: "AppendPath" /* AppendPath */, trusted: forceTrusted };
} else {
return { expr: expr, kind: "AppendExpr" /* AppendExpr */, trusted: forceTrusted };
}
}
case 6 /* Concat */:
{
var _expr = {
type: "Concat" /* Concat */
, params: normalizeParams(expression.slice(1))
};
return {
expr: _expr,
kind: "AppendExpr" /* AppendExpr */
, trusted: forceTrusted
};
}
case 7 /* HasBlock */:
return {
expr: {
type: "HasBlock" /* HasBlock */
, name: expression[1]
},
kind: "AppendExpr" /* AppendExpr */
, trusted: forceTrusted
};
case 8 /* HasBlockParams */:
return {
expr: {
type: "HasBlockParams" /* HasBlockParams */
, name: expression[1]
},
kind: "AppendExpr" /* AppendExpr */
, trusted: forceTrusted
};
default:
{
if (isBuilderCallExpression(expression)) {
return {
expr: normalizeCallExpression(expression),
kind: "AppendExpr" /* AppendExpr */
, trusted: forceTrusted
};
} else {
throw new Error("Unexpected array in expression position (wasn't a tuple expression and " + expression[0] + " isn't wrapped in parens, so it isn't a call): " + JSON.stringify(expression));
}
}
// BuilderCallExpression
}
} else if (typeof expression !== 'object') {
switch (typeof expression) {
case 'string':
{
var _expr2 = normalizeDottedPathExpression(expression);
if (_expr2.path.tail.length === 0) {
return {
path: _expr2.path,
kind: "AppendPath" /* AppendPath */
, trusted: forceTrusted
};
} else {
return {
expr: _expr2,
kind: "AppendExpr" /* AppendExpr */
, trusted: forceTrusted
};
}
}
case 'boolean':
case 'number':
return {
expr: { type: "Literal" /* Literal */, value: expression },
kind: "AppendExpr" /* AppendExpr */
, trusted: true
};
default:
throw assertNever(expression);
}
} else {
throw assertNever(expression);
}
}
export function normalizeExpression(expression) {
if (expression === null || expression === undefined) {
return {
type: "Literal" /* Literal */
, value: expression
};
} else if (Array.isArray(expression)) {
switch (expression[0]) {
case 0 /* Literal */:
return { type: "Literal" /* Literal */, value: expression[1] };
case 5 /* Get */:
{
var path = normalizePath(expression[1], expression[2]);
var expr = { type: "Get" /* Get */, path: path };
return expr;
}
case 6 /* Concat */:
{
var _expr3 = {
type: "Concat" /* Concat */
, params: normalizeParams(expression.slice(1))
};
return _expr3;
}
case 7 /* HasBlock */:
return {
type: "HasBlock" /* HasBlock */
, name: expression[1]
};
case 8 /* HasBlockParams */:
return {
type: "HasBlockParams" /* HasBlockParams */
, name: expression[1]
};
default:
{
if (isBuilderCallExpression(expression)) {
return normalizeCallExpression(expression);
} else {
throw new Error("Unexpected array in expression position (wasn't a tuple expression and " + expression[0] + " isn't wrapped in parens, so it isn't a call): " + JSON.stringify(expression));
}
}
// BuilderCallExpression
}
} else if (typeof expression !== 'object') {
switch (typeof expression) {
case 'string':
{
return normalizeDottedPathExpression(expression);
}
case 'boolean':
case 'number':
return { type: "Literal" /* Literal */, value: expression };
default:
throw assertNever(expression);
}
} else {
throw assertNever(expression);
}
}
export function isBuilderExpression(expr) {
return Array.isArray(expr);
}
export function isTupleBuilderExpression(expr) {
return Array.isArray(expr) && typeof expr[0] === 'string' && expr[0][0] !== '(';
}
export function isLiteral(expr) {
return Array.isArray(expr) && expr[0] === 'literal';
}
export function statementIsExpression(statement) {
if (!Array.isArray(statement)) {
return false;
}
var name = statement[0];
if (typeof name === 'number') {
switch (name) {
case 0 /* Literal */:
case 5 /* Get */:
case 6 /* Concat */:
case 7 /* HasBlock */:
case 8 /* HasBlockParams */:
return true;
default:
return false;
}
}
if (name[0] === '(') {
return true;
}
return false;
}
export function isBuilderCallExpression(value) {
return typeof value[0] === 'string' && value[0][0] === '(';
}
export function normalizeParams(input) {
return input.map(normalizeExpression);
}
export function normalizeHash(input) {
if (input === null) return null;
return mapObject(input, normalizeExpression);
}
export function normalizeCallExpression(expr) {
switch (expr.length) {
case 1:
return {
type: "Call" /* Call */
, path: normalizeCallHead(expr[0]),
params: null,
hash: null
};
case 2:
{
if (Array.isArray(expr[1])) {
return {
type: "Call" /* Call */
, path: normalizeCallHead(expr[0]),
params: normalizeParams(expr[1]),
hash: null
};
} else {
return {
type: "Call" /* Call */
, path: normalizeCallHead(expr[0]),
params: null,
hash: normalizeHash(expr[1])
};
}
}
case 3:
return {
type: "Call" /* Call */
, path: normalizeCallHead(expr[0]),
params: normalizeParams(expr[1]),
hash: normalizeHash(expr[2])
};
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyLWludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxTQUFBLElBQUEsRUFBQSxXQUFBLFFBQUEsZUFBQTtBQXdDQSxPQUFBLElBQUEsWUFBQTtBQUFBLENBQUEsVUFBQSxZQUFBLEVBQXdCO0FBQ3RCLGlCQUFBLE9BQUEsSUFBQSxPQUFBO0FBQ0EsaUJBQUEsTUFBQSxJQUFBLE1BQUE7QUFDQSxpQkFBQSxLQUFBLElBQUEsS0FBQTtBQUNBLGlCQUFBLE9BQUEsSUFBQSxPQUFBO0FBQ0EsaUJBQUEsTUFBQSxJQUFBLE1BQUE7QUFMRixDQUFBLEVBQVksaUJBQUEsZUFBWixFQUFZLENBQVo7QUFnRUEsT0FBTSxTQUFBLGtCQUFBLENBQUEsU0FBQSxFQUF3RDtBQUM1RCxRQUFJLE1BQUEsT0FBQSxDQUFKLFNBQUksQ0FBSixFQUE4QjtBQUM1QixZQUFJLHNCQUFKLFNBQUksQ0FBSixFQUFzQztBQUNwQyxtQkFBTywwQkFBQSxTQUFBLEVBQUEsZ0JBQUEsQ0FBUCxvQkFBTyxDQUFQO0FBREYsU0FBQSxNQUVPLElBQUksdUJBQUosU0FBSSxDQUFKLEVBQXVDO0FBQzVDLG1CQUFPLDhCQUFQLFNBQU8sQ0FBUDtBQURLLFNBQUEsTUFFQTtBQUNMLG1CQUFPLDBCQUFQLFNBQU8sQ0FBUDtBQUNEO0FBUEgsS0FBQSxNQVFPLElBQUksT0FBQSxTQUFBLEtBQUosUUFBQSxFQUFtQztBQUN4QyxlQUFPO0FBQ0wsa0JBREssWUFBQSxDQUNEO0FBREMsY0FFTCxNQUFNLG9CQUZELFNBRUMsQ0FGRDtBQUdMLHFCQUFTO0FBSEosU0FBUDtBQURLLEtBQUEsTUFNQTtBQUNMLGNBQU0sWUFBTixTQUFNLENBQU47QUFDRDtBQUNGO0FBRUQsU0FBQSxzQkFBQSxDQUFBLFNBQUEsRUFBMkQ7QUFDekQsUUFBSSxNQUFBLE9BQUEsQ0FBQSxTQUFBLEtBQTRCLE9BQU8sVUFB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QUFNO0FBSkQscUJBQVA7QUFERixpQkFBQSxNQU9PO0FBQ0wsMkJBQU87QUFDTCw4QkFESyxNQUFBLENBQ0Q7QUFEQywwQkFFTCxNQUFNLGtCQUFrQixLQUZuQixDQUVtQixDQUFsQixDQUZEO0FBR0wsZ0NBSEssSUFBQTtBQUlMLDhCQUFNLGNBQWMsS0FBZCxDQUFjLENBQWQ7QUFKRCxxQkFBUDtBQU1EO0FBQ0Y7QUFFRCxhQUFBLENBQUE7QUFDRSxtQkFBTztBQUNMLHNCQURLLE1BQUEsQ0FDRDtBQURDLGtCQUVMLE1BQU0sa0JBQWtCLEtBRm5CLENBRW1CLENBQWxCLENBRkQ7QUFHTCx3QkFBUSxnQkFBZ0IsS0FIbkIsQ0FHbUIsQ0FBaEIsQ0FISDtBQUlMLHNCQUFNLGNBQWMsS0FBZCxDQUFjLENBQWQ7QUFKRCxhQUFQO0FBM0JKO0FBa0NEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgT3B0aW9uLCBFeHByZXNzaW9uQ29udGV4dCB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZGljdCwgYXNzZXJ0TmV2ZXIsIGV4cGVjdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5leHBvcnQgdHlwZSBCdWlsZGVyUGFyYW1zID0gQnVpbGRlckV4cHJlc3Npb25bXTtcbmV4cG9ydCB0eXBlIEJ1aWxkZXJIYXNoID0gT3B0aW9uPERpY3Q8QnVpbGRlckV4cHJlc3Npb24+PjtcbmV4cG9ydCB0eXBlIEJ1aWxkZXJCbG9ja0hhc2ggPSBCdWlsZGVySGFzaCB8IHsgYXM6IHN0cmluZyB8IHN0cmluZ1tdIH07XG5leHBvcnQgdHlwZSBCdWlsZGVyQmxvY2tzID0gRGljdDxCdWlsZGVyQmxvY2s+O1xuZXhwb3J0IHR5cGUgQnVpbGRlckF0dHJzID0gRGljdDxCdWlsZGVyQXR0cj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZFBhcmFtcyBleHRlbmRzIFJlY3Vyc2l2ZTxyZWFkb25seSBOb3JtYWxpemVkRXhwcmVzc2lvbltdPiB7fVxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVkSGFzaCBleHRlbmRzIFJlY3Vyc2l2ZTxEaWN0PE5vcm1hbGl6ZWRFeHByZXNzaW9uPj4ge31cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZEJsb2NrIGV4dGVuZHMgUmVjdXJzaXZlPE5vcm1hbGl6ZWRTdGF0ZW1lbnRbXT4ge31cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZEJsb2NrcyBleHRlbmRzIFJlY3Vyc2l2ZTxEaWN0PE5vcm1hbGl6ZWRCbG9jaz4+IHt9XG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRBdHRycyBleHRlbmRzIFJlY3Vyc2l2ZTxEaWN0PE5vcm1hbGl6ZWRBdHRyPj4ge31cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRBdHRyID0gSGVhZEtpbmQuU3BsYXQgfCBOb3JtYWxpemVkRXhwcmVzc2lvbjtcblxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVkRWxlbWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgYXR0cnM6IE9wdGlvbjxOb3JtYWxpemVkQXR0cnM+O1xuICBibG9jazogT3B0aW9uPE5vcm1hbGl6ZWRCbG9jaz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZEFuZ2xlSW52b2NhdGlvbiB7XG4gIGhlYWQ6IE5vcm1hbGl6ZWRFeHByZXNzaW9uO1xuICBhdHRyczogT3B0aW9uPE5vcm1hbGl6ZWRBdHRycz47XG4gIGJsb2NrOiBPcHRpb248Tm9ybWFsaXplZEJsb2NrPjtcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gSGVhZEtpbmQge1xuICBCbG9jayA9ICdCbG9jaycsXG4gIENhbGwgPSAnQ2FsbCcsXG4gIEVsZW1lbnQgPSAnRWxlbWVudCcsXG4gIEFwcGVuZFBhdGggPSAnQXBwZW5kUGF0aCcsXG4gIEFwcGVuZEV4cHIgPSAnQXBwZW5kRXhwcicsXG4gIExpdGVyYWwgPSAnTGl0ZXJhbCcsXG4gIE1vZGlmaWVyID0gJ01vZGlmaWVyJyxcbiAgRHluYW1pY0NvbXBvbmVudCA9ICdEeW5hbWljQ29tcG9uZW50JyxcbiAgQ29tbWVudCA9ICdDb21tZW50JyxcbiAgU3BsYXQgPSAnU3BsYXQnLFxufVxuXG5leHBvcnQgZW51bSBWYXJpYWJsZUtpbmQge1xuICBMb2NhbCA9ICdMb2NhbCcsXG4gIEZyZWUgPSAnRnJlZScsXG4gIEFyZyA9ICdBcmcnLFxuICBCbG9jayA9ICdCbG9jaycsXG4gIFRoaXMgPSAnVGhpcycsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGUge1xuICBraW5kOiBWYXJpYWJsZUtpbmQ7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXRoIHtcbiAgdmFyaWFibGU6IFZhcmlhYmxlO1xuICB0YWlsOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBlbmRFeHByIHtcbiAga2luZDogSGVhZEtpbmQuQXBwZW5kRXhwcjtcbiAgZXhwcjogTm9ybWFsaXplZEV4cHJlc3Npb247XG4gIHRydXN0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwZW5kUGF0aCB7XG4gIGtpbmQ6IEhlYWRLaW5kLkFwcGVuZFBhdGg7XG4gIHBhdGg6IFBhdGg7XG4gIHRydXN0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRTdGF0ZW1lbnQgPVxuICB8IHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkNhbGw7XG4gICAgICBwYXRoOiBQYXRoO1xuICAgICAgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz47XG4gICAgICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICAgICAgdHJ1c3RlZDogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogSGVhZEtpbmQuQmxvY2s7XG4gICAgICBwYXRoOiBQYXRoO1xuICAgICAgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz47XG4gICAgICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICAgICAgYmxvY2tQYXJhbXM6IE9wdGlvbjxzdHJpbmdbXT47XG4gICAgICBibG9ja3M6IE5vcm1hbGl6ZWRCbG9ja3M7XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkVsZW1lbnQ7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBhdHRyczogTm9ybWFsaXplZEF0dHJzO1xuICAgICAgYmxvY2s6IE5vcm1hbGl6ZWRCbG9jaztcbiAgICB9XG4gIHwgeyBraW5kOiBIZWFkS2luZC5Db21tZW50OyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6IEhlYWRLaW5kLkxpdGVyYWw7IHZhbHVlOiBzdHJpbmcgfVxuICB8IEFwcGVuZFBhdGhcbiAgfCBBcHBlbmRFeHByXG4gIHwgeyBraW5kOiBIZWFkS2luZC5Nb2RpZmllcjsgcGFyYW1zOiBOb3JtYWxpemVkUGFyYW1zOyBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+IH1cbiAgfCB7XG4gICAgICBraW5kOiBIZWFkS2luZC5EeW5hbWljQ29tcG9uZW50O1xuICAgICAgZXhwcjogTm9ybWFsaXplZEV4cHJlc3Npb247XG4gICAgICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICAgICAgYmxvY2s6IE5vcm1hbGl6ZWRCbG9jaztcbiAgICB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3RhdGVtZW50KHN0YXRlbWVudDogQnVpbGRlclN0YXRlbWVudCk6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQge1xuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnQpKSB7XG4gICAgaWYgKHN0YXRlbWVudElzRXhwcmVzc2lvbihzdGF0ZW1lbnQpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQXBwZW5kRXhwcmVzc2lvbihzdGF0ZW1lbnQsIEV4cHJlc3Npb25Db250ZXh0LkFwcGVuZFNpbmdsZUlkKTtcbiAgICB9IGVsc2UgaWYgKGlzU3VnYXJ5QXJyYXlTdGF0ZW1lbnQoc3RhdGVtZW50KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVN1Z2FyeUFycmF5U3RhdGVtZW50KHN0YXRlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVWZXJib3NlU3RhdGVtZW50KHN0YXRlbWVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzdGF0ZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkFwcGVuZFBhdGgsXG4gICAgICBwYXRoOiBub3JtYWxpemVEb3R0ZWRQYXRoKHN0YXRlbWVudCksXG4gICAgICB0cnVzdGVkOiBmYWxzZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHRocm93IGFzc2VydE5ldmVyKHN0YXRlbWVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTdWdhcnlBcnJheVN0YXRlbWVudChzdGF0ZW1lbnQ6IEJ1aWxkZXJTdGF0ZW1lbnQpOiBzdGF0ZW1lbnQgaXMgU3VnYXJ5QXJyYXlTdGF0ZW1lbnQge1xuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnQpICYmIHR5cGVvZiBzdGF0ZW1lbnRbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgc3dpdGNoIChzdGF0ZW1lbnRbMF1bMF0pIHtcbiAgICAgIGNhc2UgJygnOlxuICAgICAgY2FzZSAnIyc6XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgdHlwZSBTdWdhcnlBcnJheVN0YXRlbWVudCA9IEJ1aWxkZXJDYWxsRXhwcmVzc2lvbiB8IEJ1aWxkZXJFbGVtZW50IHwgQnVpbGRlckJsb2NrU3RhdGVtZW50O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3VnYXJ5QXJyYXlTdGF0ZW1lbnQoXG4gIHN0YXRlbWVudDogU3VnYXJ5QXJyYXlTdGF0ZW1lbnRcbik6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQge1xuICBsZXQgbmFtZSA9IHN0YXRlbWVudFswXTtcblxuICBzd2l0Y2ggKG5hbWVbMF0pIHtcbiAgICBjYXNlICcoJzoge1xuICAgICAgbGV0IHBhcmFtczogT3B0aW9uPE5vcm1hbGl6ZWRQYXJhbXM+ID0gbnVsbDtcbiAgICAgIGxldCBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+ID0gbnVsbDtcblxuICAgICAgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcGFyYW1zID0gbm9ybWFsaXplUGFyYW1zKHN0YXRlbWVudFsxXSBhcyBQYXJhbXMpO1xuICAgICAgICBoYXNoID0gbm9ybWFsaXplSGFzaChzdGF0ZW1lbnRbMl0gYXMgSGFzaCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVtZW50WzFdKSkge1xuICAgICAgICAgIHBhcmFtcyA9IG5vcm1hbGl6ZVBhcmFtcyhzdGF0ZW1lbnRbMV0gYXMgUGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNoID0gbm9ybWFsaXplSGFzaChzdGF0ZW1lbnRbMV0gYXMgSGFzaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuQ2FsbCxcbiAgICAgICAgcGF0aDogbm9ybWFsaXplQ2FsbEhlYWQobmFtZSksXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgdHJ1c3RlZDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJyMnOiB7XG4gICAgICBsZXQgeyBoZWFkOiBwYXRoLCBwYXJhbXMsIGhhc2gsIGJsb2NrcywgYmxvY2tQYXJhbXMgfSA9IG5vcm1hbGl6ZUJ1aWxkZXJCbG9ja1N0YXRlbWVudChcbiAgICAgICAgc3RhdGVtZW50IGFzIEJ1aWxkZXJCbG9ja1N0YXRlbWVudFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuQmxvY2ssXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgYmxvY2tzLFxuICAgICAgICBibG9ja1BhcmFtcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnPCc6IHtcbiAgICAgIGxldCBhdHRyczogTm9ybWFsaXplZEF0dHJzID0gZGljdCgpO1xuICAgICAgbGV0IGJsb2NrOiBOb3JtYWxpemVkQmxvY2sgPSBbXTtcblxuICAgICAgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgYXR0cnMgPSBub3JtYWxpemVBdHRycyhzdGF0ZW1lbnRbMV0gYXMgQnVpbGRlckF0dHJzKTtcbiAgICAgICAgYmxvY2sgPSBub3JtYWxpemVCbG9jayhzdGF0ZW1lbnRbMl0gYXMgQnVpbGRlckJsb2NrKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnRbMV0pKSB7XG4gICAgICAgICAgYmxvY2sgPSBub3JtYWxpemVCbG9jayhzdGF0ZW1lbnRbMV0gYXMgQnVpbGRlckJsb2NrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRycyA9IG5vcm1hbGl6ZUF0dHJzKHN0YXRlbWVudFsxXSBhcyBCdWlsZGVyQXR0cnMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLkVsZW1lbnQsXG4gICAgICAgIG5hbWU6IGV4cGVjdChleHRyYWN0RWxlbWVudChuYW1lKSwgYEJVRzogZXhwZWN0ZWQgJHtuYW1lfSB0byBsb29rIGxpa2UgYSB0YWcgbmFtZWApLFxuICAgICAgICBhdHRycyxcbiAgICAgICAgYmxvY2ssXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVhY2hhYmxlICR7SlNPTi5zdHJpbmdpZnkoc3RhdGVtZW50KX0gaW4gbm9ybWFsaXplU3VnYXJ5QXJyYXlTdGF0ZW1lbnRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWZXJib3NlU3RhdGVtZW50KHN0YXRlbWVudDogVmVyYm9zZVN0YXRlbWVudCk6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQge1xuICBzd2l0Y2ggKHN0YXRlbWVudFswXSkge1xuICAgIGNhc2UgQnVpbGRlci5MaXRlcmFsOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5MaXRlcmFsLFxuICAgICAgICB2YWx1ZTogc3RhdGVtZW50WzFdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIEJ1aWxkZXIuQXBwZW5kOiB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQXBwZW5kRXhwcmVzc2lvbihcbiAgICAgICAgc3RhdGVtZW50WzFdLFxuICAgICAgICBFeHByZXNzaW9uQ29udGV4dC5BcHBlbmRTaW5nbGVJZCxcbiAgICAgICAgc3RhdGVtZW50WzJdXG4gICAgICApO1xuICAgIH1cblxuICAgIGNhc2UgQnVpbGRlci5Nb2RpZmllcjoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuTW9kaWZpZXIsXG4gICAgICAgIHBhcmFtczogbm9ybWFsaXplUGFyYW1zKHN0YXRlbWVudFsxXSksXG4gICAgICAgIGhhc2g6IG5vcm1hbGl6ZUhhc2goc3RhdGVtZW50WzJdKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSBCdWlsZGVyLkR5bmFtaWNDb21wb25lbnQ6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLkR5bmFtaWNDb21wb25lbnQsXG4gICAgICAgIGV4cHI6IG5vcm1hbGl6ZUV4cHJlc3Npb24oc3RhdGVtZW50WzFdKSxcbiAgICAgICAgaGFzaDogbm9ybWFsaXplSGFzaChzdGF0ZW1lbnRbMl0pLFxuICAgICAgICBibG9jazogbm9ybWFsaXplQmxvY2soc3RhdGVtZW50WzNdKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSBCdWlsZGVyLkNvbW1lbnQ6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLkNvbW1lbnQsXG4gICAgICAgIHZhbHVlOiBzdGF0ZW1lbnRbMV0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0QmxvY2tIZWFkKG5hbWU6IHN0cmluZyk6IFBhdGgge1xuICBsZXQgcmVzdWx0ID0gbmFtZS5tYXRjaCgvXiMoLiopJC8pO1xuXG4gIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgbWlzc2luZyAjIGluIGJsb2NrIGhlYWRgKTtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVEb3R0ZWRQYXRoKHJlc3VsdFsxXSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNhbGxIZWFkKG5hbWU6IHN0cmluZyk6IFBhdGgge1xuICBsZXQgcmVzdWx0ID0gbmFtZS5tYXRjaCgvXlxcKCguKilcXCkkLyk7XG5cbiAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBtaXNzaW5nICgpIGluIGNhbGwgaGVhZGApO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZURvdHRlZFBhdGgocmVzdWx0WzFdKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChoZWFkOiBzdHJpbmcsIHRhaWw6IHN0cmluZ1tdID0gW10pOiBQYXRoIHtcbiAgbGV0IHBhdGhIZWFkID0gbm9ybWFsaXplUGF0aEhlYWQoaGVhZCk7XG5cbiAgcmV0dXJuIHtcbiAgICB2YXJpYWJsZTogcGF0aEhlYWQsXG4gICAgdGFpbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRG90dGVkUGF0aEV4cHJlc3Npb24od2hvbGU6IHN0cmluZyk6IHsgdHlwZTogRXhwcmVzc2lvbktpbmQuR2V0OyBwYXRoOiBQYXRoIH0ge1xuICByZXR1cm4geyB0eXBlOiBFeHByZXNzaW9uS2luZC5HZXQsIHBhdGg6IG5vcm1hbGl6ZURvdHRlZFBhdGgod2hvbGUpIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURvdHRlZFBhdGgod2hvbGU6IHN0cmluZyk6IFBhdGgge1xuICBsZXQgeyBraW5kLCBuYW1lOiByZXN0IH0gPSBub3JtYWxpemVQYXRoSGVhZCh3aG9sZSk7XG5cbiAgbGV0IFtuYW1lLCAuLi50YWlsXSA9IHJlc3Quc3BsaXQoJy4nKTtcblxuICByZXR1cm4ge1xuICAgIHZhcmlhYmxlOiB7XG4gICAgICBraW5kLFxuICAgICAgbmFtZSxcbiAgICB9LFxuICAgIHRhaWwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQYXRoSGVhZCh3aG9sZTogc3RyaW5nKTogVmFyaWFibGUge1xuICBsZXQga2luZDogVmFyaWFibGVLaW5kO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuXG4gIGlmICh3aG9sZS5tYXRjaCgvXnRoaXMoXFwufCQpLykpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogVmFyaWFibGVLaW5kLlRoaXMsXG4gICAgICBuYW1lOiB3aG9sZSxcbiAgICB9O1xuICB9XG5cbiAgc3dpdGNoICh3aG9sZVswXSkge1xuICAgIGNhc2UgJ14nOlxuICAgICAga2luZCA9IFZhcmlhYmxlS2luZC5GcmVlO1xuICAgICAgbmFtZSA9IHdob2xlLnNsaWNlKDEpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdAJzpcbiAgICAgIGtpbmQgPSBWYXJpYWJsZUtpbmQuQXJnO1xuICAgICAgbmFtZSA9IHdob2xlLnNsaWNlKDEpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICcmJzpcbiAgICAgIGtpbmQgPSBWYXJpYWJsZUtpbmQuQmxvY2s7XG4gICAgICBuYW1lID0gd2hvbGUuc2xpY2UoMSk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBraW5kID0gVmFyaWFibGVLaW5kLkxvY2FsO1xuICAgICAgbmFtZSA9IHdob2xlO1xuICB9XG5cbiAgcmV0dXJuIHsga2luZCwgbmFtZSB9O1xufVxuXG5leHBvcnQgdHlwZSBCdWlsZGVyQmxvY2tTdGF0ZW1lbnQgPVxuICB8IFtzdHJpbmcsIEJ1aWxkZXJCbG9jayB8IEJ1aWxkZXJCbG9ja3NdXG4gIHwgW3N0cmluZywgQnVpbGRlclBhcmFtcyB8IEJ1aWxkZXJCbG9ja0hhc2gsIEJ1aWxkZXJCbG9jayB8IEJ1aWxkZXJCbG9ja3NdXG4gIHwgW3N0cmluZywgQnVpbGRlclBhcmFtcywgQnVpbGRlckJsb2NrSGFzaCwgQnVpbGRlckJsb2NrIHwgQnVpbGRlckJsb2Nrc107XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZEJ1aWxkZXJCbG9ja1N0YXRlbWVudCB7XG4gIGhlYWQ6IFBhdGg7XG4gIHBhcmFtczogT3B0aW9uPE5vcm1hbGl6ZWRQYXJhbXM+O1xuICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICBibG9ja1BhcmFtczogT3B0aW9uPHN0cmluZ1tdPjtcbiAgYmxvY2tzOiBOb3JtYWxpemVkQmxvY2tzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVpbGRlckJsb2NrU3RhdGVtZW50KFxuICBzdGF0ZW1lbnQ6IEJ1aWxkZXJCbG9ja1N0YXRlbWVudFxuKTogTm9ybWFsaXplZEJ1aWxkZXJCbG9ja1N0YXRlbWVudCB7XG4gIGxldCBoZWFkID0gc3RhdGVtZW50WzBdO1xuICBsZXQgYmxvY2tzOiBOb3JtYWxpemVkQmxvY2tzID0gZGljdCgpO1xuICBsZXQgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz4gPSBudWxsO1xuICBsZXQgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPiA9IG51bGw7XG4gIGxldCBibG9ja1BhcmFtczogT3B0aW9uPHN0cmluZ1tdPiA9IG51bGw7XG5cbiAgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDIpIHtcbiAgICBibG9ja3MgPSBub3JtYWxpemVCbG9ja3Moc3RhdGVtZW50WzFdKTtcbiAgfSBlbHNlIGlmIChzdGF0ZW1lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVtZW50WzFdKSkge1xuICAgICAgcGFyYW1zID0gbm9ybWFsaXplUGFyYW1zKHN0YXRlbWVudFsxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IGhhc2gsIGJsb2NrUGFyYW1zIH0gPSBub3JtYWxpemVCbG9ja0hhc2goc3RhdGVtZW50WzFdKSk7XG4gICAgfVxuXG4gICAgYmxvY2tzID0gbm9ybWFsaXplQmxvY2tzKHN0YXRlbWVudFsyXSk7XG4gIH0gZWxzZSBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gNCkge1xuICAgIHBhcmFtcyA9IG5vcm1hbGl6ZVBhcmFtcyhzdGF0ZW1lbnRbMV0pO1xuICAgICh7IGhhc2gsIGJsb2NrUGFyYW1zIH0gPSBub3JtYWxpemVCbG9ja0hhc2goc3RhdGVtZW50W