@glimmer/compiler
Version:
367 lines (306 loc) • 29 kB
JavaScript
import { exhausted, LOCAL_LOGGER } from '@glimmer/util';
import { deflateAttrName, deflateTagName } from '../../utils';
import { EXPR } from './expressions';
class WireStatements {
constructor(statements) {
this.statements = statements;
}
toArray() {
return this.statements;
}
}
export class ContentEncoder {
list(statements) {
let out = [];
for (let statement of statements) {
let result = CONTENT.content(statement);
if (result && result instanceof WireStatements) {
out.push(...result.toArray());
} else {
out.push(result);
}
}
return out;
}
content(stmt) {
if (false
/* LOCAL_SHOULD_LOG */
) {
LOCAL_LOGGER.log(`encoding`, stmt);
}
return this.visitContent(stmt);
}
visitContent(stmt) {
switch (stmt.type) {
case 'Debugger':
return [26
/* Debugger */
, stmt.scope.getEvalInfo()];
case 'AppendComment':
return this.AppendComment(stmt);
case 'AppendTextNode':
return this.AppendTextNode(stmt);
case 'AppendTrustedHTML':
return this.AppendTrustedHTML(stmt);
case 'Yield':
return this.Yield(stmt);
case 'Component':
return this.Component(stmt);
case 'SimpleElement':
return this.SimpleElement(stmt);
case 'InElement':
return this.InElement(stmt);
case 'InvokeBlock':
return this.InvokeBlock(stmt);
case 'If':
return this.If(stmt);
case 'Each':
return this.Each(stmt);
case 'With':
return this.With(stmt);
case 'Let':
return this.Let(stmt);
case 'WithDynamicVars':
return this.WithDynamicVars(stmt);
case 'InvokeComponent':
return this.InvokeComponent(stmt);
default:
return exhausted(stmt);
}
}
Yield({
to,
positional
}) {
return [18
/* Yield */
, to, EXPR.Positional(positional)];
}
InElement({
guid,
insertBefore,
destination,
block
}) {
let wireBlock = CONTENT.NamedBlock(block)[1]; // let guid = args.guid;
let wireDestination = EXPR.expr(destination);
let wireInsertBefore = EXPR.expr(insertBefore);
if (wireInsertBefore === undefined) {
return [40
/* InElement */
, wireBlock, guid, wireDestination];
} else {
return [40
/* InElement */
, wireBlock, guid, wireDestination, wireInsertBefore];
}
}
InvokeBlock({
head,
args,
blocks
}) {
return [6
/* Block */
, EXPR.expr(head), ...EXPR.Args(args), CONTENT.NamedBlocks(blocks)];
}
AppendTrustedHTML({
html
}) {
return [2
/* TrustingAppend */
, EXPR.expr(html)];
}
AppendTextNode({
text
}) {
return [1
/* Append */
, EXPR.expr(text)];
}
AppendComment({
value
}) {
return [3
/* Comment */
, value.chars];
}
SimpleElement({
tag,
params,
body,
dynamicFeatures
}) {
let op = dynamicFeatures ? 11
/* OpenElementWithSplat */
: 10
/* OpenElement */
;
return new WireStatements([[op, deflateTagName(tag.chars)], ...CONTENT.ElementParameters(params).toArray(), [12
/* FlushElement */
], ...CONTENT.list(body), [13
/* CloseElement */
]]);
}
Component({
tag,
params,
args,
blocks
}) {
let wireTag = EXPR.expr(tag);
let wirePositional = CONTENT.ElementParameters(params);
let wireNamed = EXPR.NamedArguments(args);
let wireNamedBlocks = CONTENT.NamedBlocks(blocks);
return [8
/* Component */
, wireTag, wirePositional.toPresentArray(), wireNamed, wireNamedBlocks];
}
ElementParameters({
body
}) {
return body.map(p => CONTENT.ElementParameter(p));
}
ElementParameter(param) {
switch (param.type) {
case 'SplatAttr':
return [17
/* AttrSplat */
, param.symbol];
case 'DynamicAttr':
return [dynamicAttrOp(param.kind), ...dynamicAttr(param)];
case 'StaticAttr':
return [staticAttrOp(param.kind), ...staticAttr(param)];
case 'Modifier':
return [4
/* Modifier */
, EXPR.expr(param.callee), ...EXPR.Args(param.args)];
}
}
NamedBlocks({
blocks
}) {
let names = [];
let serializedBlocks = [];
for (let block of blocks.toArray()) {
let [name, serializedBlock] = CONTENT.NamedBlock(block);
names.push(name);
serializedBlocks.push(serializedBlock);
}
return names.length > 0 ? [names, serializedBlocks] : null;
}
NamedBlock({
name,
body,
scope
}) {
let nameChars = name.chars;
if (nameChars === 'inverse') {
nameChars = 'else';
}
return [nameChars, [CONTENT.list(body), scope.slots]];
}
If({
condition,
block,
inverse
}) {
return [41
/* If */
, EXPR.expr(condition), CONTENT.NamedBlock(block)[1], inverse ? CONTENT.NamedBlock(inverse)[1] : null];
}
Each({
value,
key,
block,
inverse
}) {
return [42
/* Each */
, EXPR.expr(value), key ? EXPR.expr(key) : null, CONTENT.NamedBlock(block)[1], inverse ? CONTENT.NamedBlock(inverse)[1] : null];
}
With({
value,
block,
inverse
}) {
return [43
/* With */
, EXPR.expr(value), CONTENT.NamedBlock(block)[1], inverse ? CONTENT.NamedBlock(inverse)[1] : null];
}
Let({
positional,
block
}) {
return [44
/* Let */
, EXPR.Positional(positional), CONTENT.NamedBlock(block)[1]];
}
WithDynamicVars({
named,
block
}) {
return [45
/* WithDynamicVars */
, EXPR.NamedArguments(named), CONTENT.NamedBlock(block)[1]];
}
InvokeComponent({
definition,
args,
blocks
}) {
return [46
/* InvokeComponent */
, EXPR.expr(definition), EXPR.Positional(args.positional), EXPR.NamedArguments(args.named), blocks ? CONTENT.NamedBlocks(blocks) : null];
}
}
export const CONTENT = new ContentEncoder();
function staticAttr({
name,
value,
namespace
}) {
let out = [deflateAttrName(name.chars), value.chars];
if (namespace) {
out.push(namespace);
}
return out;
}
function dynamicAttr({
name,
value,
namespace
}) {
let out = [deflateAttrName(name.chars), EXPR.expr(value)];
if (namespace) {
out.push(namespace);
}
return out;
}
function staticAttrOp(kind) {
if (kind.component) {
return 24
/* StaticComponentAttr */
;
} else {
return 14
/* StaticAttr */
;
}
}
function dynamicAttrOp(kind) {
if (kind.component) {
return kind.trusting ? 23
/* TrustingComponentAttr */
: 16
/* ComponentAttr */
;
} else {
return kind.trusting ? 22
/* TrustingDynamicAttr */
: 15
/* DynamicAttr */
;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMi1lbmNvZGluZy9jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLFNBQVMsU0FBVCxFQUFvQixZQUFwQixRQUF3QyxlQUF4QztBQUdBLFNBQVMsZUFBVCxFQUEwQixjQUExQixRQUFnRCxhQUFoRDtBQUNBLFNBQVMsSUFBVCxRQUFxQixlQUFyQjs7QUFHQSxNQUFNLGNBQU4sQ0FBb0I7QUFDbEIsRUFBQSxXQUFBLENBQW9CLFVBQXBCLEVBQTRDO0FBQXhCLFNBQUEsVUFBQSxHQUFBLFVBQUE7QUFBNEI7O0FBRWhELEVBQUEsT0FBTyxHQUFBO0FBQ0wsV0FBTyxLQUFLLFVBQVo7QUFDRDs7QUFMaUI7O0FBUXBCLE9BQU0sTUFBTyxjQUFQLENBQXFCO0FBQ3pCLEVBQUEsSUFBSSxDQUFDLFVBQUQsRUFBNEI7QUFDOUIsUUFBSSxHQUFHLEdBQTJCLEVBQWxDOztBQUVBLFNBQUssSUFBSSxTQUFULElBQXNCLFVBQXRCLEVBQWtDO0FBQ2hDLFVBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFSLENBQWdCLFNBQWhCLENBQWI7O0FBRUEsVUFBSSxNQUFNLElBQUksTUFBTSxZQUFZLGNBQWhDLEVBQWdEO0FBQzlDLFFBQUEsR0FBRyxDQUFDLElBQUosQ0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFQLEVBQVo7QUFDRCxPQUZELE1BRU87QUFDTCxRQUFBLEdBQUcsQ0FBQyxJQUFKLENBQVMsTUFBVDtBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxHQUFQO0FBQ0Q7O0FBRUQsRUFBQSxPQUFPLENBQUMsSUFBRCxFQUFvQjtBQUN6QjtBQUFBO0FBQUEsTUFBc0I7QUFDcEIsTUFBQSxZQUFZLENBQUMsR0FBYixDQUFpQixVQUFqQixFQUE2QixJQUE3QjtBQUNEOztBQUVELFdBQU8sS0FBSyxZQUFMLENBQWtCLElBQWxCLENBQVA7QUFDRDs7QUFFTyxFQUFBLFlB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LElBQXRCLEVBQWtEO0FBQ2hELE1BQUksSUFBSSxDQUFDLFNBQVQsRUFBb0I7QUFDbEIsV0FBQTtBQUFBO0FBQUE7QUFDRCxHQUZELE1BRU87QUFDTCxhQUFBO0FBQUE7QUFBQTtBQUNEO0FBQ0Y7O0FBRUQsU0FBUyxhQUFULENBQ0UsSUFERixFQUNvQjtBQU1sQixNQUFJLElBQUksQ0FBQyxTQUFULEVBQW9CO0FBQ2xCLFdBQU8sSUFBSSxDQUFDLFFBQUwsR0FBZTtBQUFBO0FBQWYsTUFBbUQ7QUFBQTtBQUExRDtBQUNELEdBRkQsTUFFTztBQUNMLFdBQU8sSUFBSSxDQUFDLFFBQUwsR0FBZTtBQUFBO0FBQWYsTUFBaUQ7QUFBQTtBQUF4RDtBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXhwT3Bjb2RlcywgV2VsbEtub3duQXR0ck5hbWUsIFdpcmVGb3JtYXQgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExPQ0FMX1NIT1VMRF9MT0cgfSBmcm9tICdAZ2xpbW1lci9sb2NhbC1kZWJ1Zy1mbGFncyc7XG5pbXBvcnQgeyBleGhhdXN0ZWQsIExPQ0FMX0xPR0dFUiB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBPcHRpb25hbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvbGlzdCc7XG5pbXBvcnQgeyBkZWZsYXRlQXR0ck5hbWUsIGRlZmxhdGVUYWdOYW1lIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRVhQUiB9IGZyb20gJy4vZXhwcmVzc2lvbnMnO1xuaW1wb3J0ICogYXMgbWlyIGZyb20gJy4vbWlyJztcblxuY2xhc3MgV2lyZVN0YXRlbWVudHM8UyBleHRlbmRzIFdpcmVGb3JtYXQuU3RhdGVtZW50ID0gV2lyZUZvcm1hdC5TdGF0ZW1lbnQ+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdGF0ZW1lbnRzOiByZWFkb25seSBTW10pIHt9XG5cbiAgdG9BcnJheSgpOiByZWFkb25seSBTW10ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudHM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnRlbnRFbmNvZGVyIHtcbiAgbGlzdChzdGF0ZW1lbnRzOiBtaXIuU3RhdGVtZW50W10pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgICBsZXQgb3V0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgbGV0IHJlc3VsdCA9IENPTlRFTlQuY29udGVudChzdGF0ZW1lbnQpO1xuXG4gICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFdpcmVTdGF0ZW1lbnRzKSB7XG4gICAgICAgIG91dC5wdXNoKC4uLnJlc3VsdC50b0FycmF5KCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0LnB1c2gocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgY29udGVudChzdG10OiBtaXIuU3RhdGVtZW50KTogV2lyZUZvcm1hdC5TdGF0ZW1lbnQgfCBXaXJlU3RhdGVtZW50cyB7XG4gICAgaWYgKExPQ0FMX1NIT1VMRF9MT0cpIHtcbiAgICAgIExPQ0FMX0xPR0dFUi5sb2coYGVuY29kaW5nYCwgc3RtdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmlzaXRDb250ZW50KHN0bXQpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdENvbnRlbnQoc3RtdDogbWlyLlN0YXRlbWVudCk6IFdpcmVGb3JtYXQuU3RhdGVtZW50IHwgV2lyZVN0YXRlbWVudHMge1xuICAgIHN3aXRjaCAoc3RtdC50eXBlKSB7XG4gICAgICBjYXNlICdEZWJ1Z2dlcic6XG4gICAgICAgIHJldHVybiBbU2V4cE9wY29kZXMuRGVidWdnZXIsIHN0bXQuc2NvcGUuZ2V0RXZhbEluZm8oKV07XG4gICAgICBjYXNlICdBcHBlbmRDb21tZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQXBwZW5kQ29tbWVudChzdG10KTtcbiAgICAgIGNhc2UgJ0FwcGVuZFRleHROb2RlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQXBwZW5kVGV4dE5vZGUoc3RtdCk7XG4gICAgICBjYXNlICdBcHBlbmRUcnVzdGVkSFRNTCc6XG4gICAgICAgIHJldHVybiB0aGlzLkFwcGVuZFRydXN0ZWRIVE1MKHN0bXQpO1xuICAgICAgY2FzZSAnWWllbGQnOlxuICAgICAgICByZXR1cm4gdGhpcy5ZaWVsZChzdG10KTtcbiAgICAgIGNhc2UgJ0NvbXBvbmVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLkNvbXBvbmVudChzdG10KTtcbiAgICAgIGNhc2UgJ1NpbXBsZUVsZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5TaW1wbGVFbGVtZW50KHN0bXQpO1xuICAgICAgY2FzZSAnSW5FbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuSW5FbGVtZW50KHN0bXQpO1xuICAgICAgY2FzZSAnSW52b2tlQmxvY2snOlxuICAgICAgICByZXR1cm4gdGhpcy5JbnZva2VCbG9jayhzdG10KTtcbiAgICAgIGNhc2UgJ0lmJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuSWYoc3RtdCk7XG4gICAgICBjYXNlICdFYWNoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuRWFjaChzdG10KTtcbiAgICAgIGNhc2UgJ1dpdGgnOlxuICAgICAgICByZXR1cm4gdGhpcy5XaXRoKHN0bXQpO1xuICAgICAgY2FzZSAnTGV0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuTGV0KHN0bXQpO1xuICAgICAgY2FzZSAnV2l0aER5bmFtaWNWYXJzJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuV2l0aER5bmFtaWNWYXJzKHN0bXQpO1xuICAgICAgY2FzZSAnSW52b2tlQ29tcG9uZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuSW52b2tlQ29tcG9uZW50KHN0bXQpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGV4aGF1c3RlZChzdG10KTtcbiAgICB9XG4gIH1cblxuICBZaWVsZCh7IHRvLCBwb3NpdGlvbmFsIH06IG1pci5ZaWVsZCk6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5ZaWVsZCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5ZaWVsZCwgdG8sIEVYUFIuUG9zaXRpb25hbChwb3NpdGlvbmFsKV07XG4gIH1cblxuICBJbkVsZW1lbnQoe1xuICAgIGd1aWQsXG4gICAgaW5zZXJ0QmVmb3JlLFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIGJsb2NrLFxuICB9OiBtaXIuSW5FbGVtZW50KTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkluRWxlbWVudCB7XG4gICAgbGV0IHdpcmVCbG9jayA9IENPTlRFTlQuTmFtZWRCbG9jayhibG9jaylbMV07XG4gICAgLy8gbGV0IGd1aWQgPSBhcmdzLmd1aWQ7XG4gICAgbGV0IHdpcmVEZXN0aW5hdGlvbiA9IEVYUFIuZXhwcihkZXN0aW5hdGlvbik7XG4gICAgbGV0IHdpcmVJbnNlcnRCZWZvcmUgPSBFWFBSLmV4cHIoaW5zZXJ0QmVmb3JlKTtcblxuICAgIGlmICh3aXJlSW5zZXJ0QmVmb3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbU2V4cE9wY29kZXMuSW5FbGVtZW50LCB3aXJlQmxvY2ssIGd1aWQsIHdpcmVEZXN0aW5hdGlvbl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbU2V4cE9wY29kZXMuSW5FbGVtZW50LCB3aXJlQmxvY2ssIGd1aWQsIHdpcmVEZXN0aW5hdGlvbiwgd2lyZUluc2VydEJlZm9yZV07XG4gICAgfVxuICB9XG5cbiAgSW52b2tlQmxvY2soeyBoZWFkLCBhcmdzLCBibG9ja3MgfTogbWlyLkludm9rZUJsb2NrKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkJsb2NrIHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLkJsb2NrLCBFWFBSLmV4cHIoaGVhZCksIC4uLkVYUFIuQXJncyhhcmdzKSwgQ09OVEVOVC5OYW1lZEJsb2NrcyhibG9ja3MpXTtcbiAgfVxuXG4gIEFwcGVuZFRydXN0ZWRIVE1MKHsgaHRtbCB9OiBtaXIuQXBwZW5kVHJ1c3RlZEhUTUwpOiBXaXJlRm9ybWF0LlN0YXRlbWVudHMuVHJ1c3RpbmdBcHBlbmQge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuVHJ1c3RpbmdBcHBlbmQsIEVYUFIuZXhwcihodG1sKV07XG4gIH1cblxuICBBcHBlbmRUZXh0Tm9kZSh7IHRleHQgfTogbWlyLkFwcGVuZFRleHROb2RlKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkFwcGVuZCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5BcHBlbmQsIEVYUFIuZXhwcih0ZXh0KV07XG4gIH1cblxuICBBcHBlbmRDb21tZW50KHsgdmFsdWUgfTogbWlyLkFwcGVuZENvbW1lbnQpOiBXaXJlRm9ybWF0LlN0YXRlbWVudHMuQ29tbWVudCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5Db21tZW50LCB2YWx1ZS5jaGFyc107XG4gIH1cblxuICBTaW1wbGVFbGVtZW50KHsgdGFnLCBwYXJhbXMsIGJvZHksIGR5bmFtaWNGZWF0dXJlcyB9OiBtaXIuU2ltcGxlRWxlbWVudCk6IFdpcmVTdGF0ZW1lbnRzIHtcbiAgICBsZXQgb3AgPSBkeW5hbWljRmVhdHVyZXMgPyBTZXhwT3Bjb2Rlcy5PcGVuRWxlbWVudFdpdGhTcGxhdCA6IFNleHBPcGNvZGVzLk9wZW5FbGVtZW50O1xuICAgIHJldHVybiBuZXcgV2lyZVN0YXRlbWVudHM8V2lyZUZvcm1hdC5TdGF0ZW1lbnQgfCBXaXJlRm9ybWF0LkVsZW1lbnRQYXJhbWV0ZXI+KFtcbiAgICAgIFtvcCwgZGVmbGF0ZVRhZ05hbWUodGFnLmNoYXJzKV0sXG4gICAgICAuLi5DT05URU5ULkVsZW1lbnRQYXJhbWV0ZXJzKHBhcmFtcykudG9BcnJheSgpLFxuICAgICAgW1NleHBPcGNvZGVzLkZsdXNoRWxlbWVudF0sXG4gICAgICAuLi5DT05URU5ULmxpc3QoYm9keSksXG4gICAgICBbU2V4cE9wY29kZXMuQ2xvc2VFbGVtZW50XSxcbiAgICBdKTtcbiAgfVxuXG4gIENvbXBvbmVudCh7IHRhZywgcGFyYW1zLCBhcmdzLCBibG9ja3MgfTogbWlyLkNvbXBvbmVudCk6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5Db21wb25lbnQge1xuICAgIGxldCB3aXJlVGFnID0gRVhQUi5leHByKHRhZyk7XG4gICAgbGV0IHdpcmVQb3NpdGlvbmFsID0gQ09OVEVOVC5FbGVtZW50UGFyYW1ldGVycyhwYXJhbXMpO1xuICAgIGxldCB3aXJlTmFtZWQgPSBFWFBSLk5hbWVkQXJndW1lbnRzKGFyZ3MpO1xuXG4gICAgbGV0IHdpcmVOYW1lZEJsb2NrcyA9IENPTlRFTlQuTmFtZWRCbG9ja3MoYmxvY2tzKTtcblxuICAgIHJldHVybiBbXG4gICAgICBTZXhwT3Bjb2Rlcy5Db21wb25lbnQsXG4gICAgICB3aXJlVGFnLFxuICAgICAgd2lyZVBvc2l0aW9uYWwudG9QcmVzZW50QXJyYXkoKSxcbiAgICAgIHdpcmVOYW1lZCxcbiAgICAgIHdpcmVOYW1lZEJsb2NrcyxcbiAgICBdO1xuICB9XG5cbiAgRWxlbWVudFBhcmFtZXRlcnMoeyBib2R5IH06IG1pci5FbGVtZW50UGFyYW1ldGVycyk6IE9wdGlvbmFsTGlzdDxXaXJlRm9ybWF0LkVsZW1lbnRQYXJhbWV0ZXI+IHtcbiAgICByZXR1cm4gYm9keS5tYXAoKHApID0+IENPTlRFTlQuRWxlbWVudFBhcmFtZXRlcihwKSk7XG4gIH1cblxuICBFbGVtZW50UGFyYW1ldGVyKHBhcmFtOiBtaXIuRWxlbWVudFBhcmFtZXRlcik6IFdpcmVGb3JtYXQuRWxlbWVudFBhcmFtZXRlciB7XG4gICAgc3dpdGNoIChwYXJhbS50eXBlKSB7XG4gICAgICBjYXNlICdTcGxhdEF0dHInOlxuICAgICAgICByZXR1cm4gW1NleHBPcGNvZGVzLkF0dHJTcGxhdCwgcGFyYW0uc3ltYm9sXTtcbiAgICAgIGNhc2UgJ0R5bmFtaWNBdHRyJzpcbiAgICAgICAgcmV0dXJuIFtkeW5hbWljQXR0ck9wKHBhcmFtLmtpbmQpLCAuLi5keW5hbWljQXR0cihwYXJhbSldO1xuICAgICAgY2FzZSAnU3RhdGljQXR0cic6XG4gICAgICAgIHJldHVybiBbc3RhdGljQXR0ck9wKHBhcmFtLmtpbmQpLCAuLi5zdGF0aWNBdHRyKHBhcmFtKV07XG4gICAgICBjYXNlICdNb2RpZmllcic6XG4gICAgICAgIHJldHVybiBbU2V4cE9wY29kZXMuTW9kaWZpZXIsIEVYUFIuZXhwcihwYXJhbS5jYWxsZWUpLCAuLi5FWFBSLkFyZ3MocGFyYW0uYXJncyldO1xuICAgIH1cbiAgfVxuXG4gIE5hbWVkQmxvY2tzKHsgYmxvY2tzIH06IG1pci5OYW1lZEJsb2Nrcyk6IFdpcmVGb3JtYXQuQ29yZS5CbG9ja3Mge1xuICAgIGxldCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc2VyaWFsaXplZEJsb2NrczogV2lyZUZvcm1hdC5TZXJpYWxpemVkSW5saW5lQmxvY2tbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgYmxvY2sgb2YgYmxvY2tzLnRvQXJyYXkoKSkge1xuICAgICAgbGV0IFtuYW1lLCBzZXJpYWxpemVkQmxvY2tdID0gQ09OVEVOVC5OYW1lZEJsb2NrKGJsb2NrKTtcblxuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHNlcmlhbGl6ZWRCbG9ja3MucHVzaChzZXJpYWxpemVkQmxvY2spO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lcy5sZW5ndGggPiAwID8gW25hbWVzLCBzZXJpYWxpemVkQmxvY2tzXSA6IG51bGw7XG4gIH1cblxuICBOYW1lZEJsb2NrKHsgbmFtZSwgYm9keSwgc2NvcGUgfTogbWlyLk5hbWVkQmxvY2spOiBXaXJlRm9ybWF0LkNvcmUuTmFtZWRCbG9jayB7XG4gICAgbGV0IG5hbWVDaGFycyA9IG5hbWUuY2hhcnM7XG4gICAgaWYgKG5hbWVDaGFycyA9PT0gJ2ludmVyc2UnKSB7XG4gICAgICBuYW1lQ2hhcnMgPSAnZWxzZSc7XG4gICAgfVxuICAgIHJldHVybiBbbmFtZUNoYXJzLCBbQ09OVEVOVC5saXN0KGJvZHkpLCBzY29wZS5zbG90c11dO1xuICB9XG5cbiAgSWYoeyBjb25kaXRpb24sIGJsb2NrLCBpbnZlcnNlIH06IG1pci5JZik6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5JZiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFNleHBPcGNvZGVzLklmLFxuICAgICAgRVhQUi5leHByKGNvbmRpdGlvbiksXG4gICAgICBDT05URU5ULk5hbWVkQmxvY2soYmxvY2spWzFdLFxuICAgICAgaW52ZXJzZSA/IENPTlRFTlQuTmFtZWRCbG9jayhpbnZlcnNlKVsxXSA6IG51bGwsXG4gICAgXTtcbiAgfVxuXG4gIEVhY2goeyB2YWx1ZSwga2V5LCBibG9jaywgaW52ZXJzZSB9OiBtaXIuRWFjaCk6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5FYWNoIHtcbiAgICByZXR1cm4gW1xuICAgICAgU2V4cE9wY29kZXMuRWFjaCxcbiAgICAgIEVYUFIuZXhwcih2YWx1ZSksXG4gICAgICBrZXkgPyBFWFBSLmV4cHIoa2V5KSA6IG51bGwsXG4gICAgICBDT05URU5ULk5hbWVkQmxvY2soYmxvY2spWzFdLFxuICAgICAgaW52ZXJzZSA/IENPTlRFTlQuTmFtZWRCbG9jayhpbnZlcnNlKVsxXSA6IG51bGwsXG4gICAgXTtcbiAgfVxuXG4gIFdpdGgoeyB2YWx1ZSwgYmxvY2ssIGludmVyc2UgfTogbWlyLldpdGgpOiBXaXJlRm9ybWF0LlN0YXRlbWVudHMuV2l0aCB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFNleHBPcGNvZGVzLldpdGgsXG4gICAgICBFWFBSLmV4cHIodmFsdWUpLFxuICAgICAgQ09OVEVOVC5OYW1lZEJsb2NrKGJsb2NrKVsxXSxcbiAgICAgIGludmVyc2UgPyBDT05URU5ULk5hbWVkQmxvY2soaW52ZXJzZSlbMV0gOiBudWxsLFxuICAgIF07XG4gIH1cblxuICBMZXQoeyBwb3NpdGlvbmFsLCBibG9jayB9OiBtaXIuTGV0KTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkxldCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5MZXQsIEVYUFIuUG9zaXRpb25hbChwb3NpdGlvbmFsKSwgQ09OVEVOVC5OYW1lZEJsb2NrKGJsb2NrKVsxXV07XG4gIH1cblxuICBXaXRoRHluYW1pY1ZhcnMoeyBuYW1lZCwgYmxvY2sgfTogbWlyLldpdGhEeW5hbWljVmFycyk6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5XaXRoRHluYW1pY1ZhcnMge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuV2l0aER5bmFtaWNWYXJzLCBFWFBSLk5hbWVkQXJndW1lbnRzKG5hbWVkKSwgQ09OVEVOVC5OYW1lZEJsb2NrKGJsb2NrKVsxXV07XG4gIH1cblxuICBJbnZva2VDb21wb25lbnQoe1xuICAgIGRlZmluaXRpb24sXG4gICAgYXJncyxcbiAgICBibG9ja3MsXG4gIH06IG1pci5JbnZva2VDb21wb25lbnQpOiBXaXJlRm9ybWF0LlN0YXRlbWVudHMuSW52b2tlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gW1xuICAgICAgU2V4cE9wY29kZXMuSW52b2tlQ29tcG9uZW50LFxuICAgICAgRVhQUi5leHByKGRlZmluaXRpb24pLFxuICAgICAgRVhQUi5Qb3NpdGlvbmFsKGFyZ3MucG9zaXRpb25hbCksXG4gICAgICBFWFBSLk5hbWVkQXJndW1lbnRzKGFyZ3MubmFtZWQpLFxuICAgICAgYmxvY2tzID8gQ09OVEVOVC5OYW1lZEJsb2NrcyhibG9ja3MpIDogbnVsbCxcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDT05URU5UID0gbmV3IENvbnRlbnRFbmNvZGVyKCk7XG5cbmV4cG9ydCB0eXBlIFN0YXRpY0F0dHJBcmdzID0gW25hbWU6IHN0cmluZyB8IFdlbGxLbm93bkF0dHJOYW1lLCB2YWx1ZTogc3RyaW5nLCBuYW1lc3BhY2U/OiBzdHJpbmddO1xuXG5mdW5jdGlvbiBzdGF0aWNBdHRyKHsgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSB9OiBtaXIuU3RhdGljQXR0cik6IFN0YXRpY0F0dHJBcmdzIHtcbiAgbGV0IG91dDogU3RhdGljQXR0ckFyZ3MgPSBbZGVmbGF0ZUF0dHJOYW1lKG5hbWUuY2hhcnMpLCB2YWx1ZS5jaGFyc107XG5cbiAgaWYgKG5hbWVzcGFjZSkge1xuICAgIG91dC5wdXNoKG5hbWVzcGFjZSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgdHlwZSBEeW5hbWljQXR0ckFyZ3MgPSBbXG4gIG5hbWU6IHN0cmluZyB8IFdlbGxLbm93bkF0dHJOYW1lLFxuICB2YWx1ZTogV2lyZUZvcm1hdC5FeHByZXNzaW9uLFxuICBuYW1lc3BhY2U/OiBzdHJpbmdcbl07XG5cbmZ1bmN0aW9uIGR5bmFtaWNBdHRyKHsgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSB9OiBtaXIuRHluYW1pY0F0dHIpOiBEeW5hbWljQXR0ckFyZ3Mge1xuICBsZXQgb3V0OiBEeW5hbWljQXR0ckFyZ3MgPSBbZGVmbGF0ZUF0dHJOYW1lKG5hbWUuY2hhcnMpLCBFWFBSLmV4cHIodmFsdWUpXTtcblxuICBpZiAobmFtZXNwYWNlKSB7XG4gICAgb3V0LnB1c2gobmFtZXNwYWNlKTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHN0YXRpY0F0dHJPcChraW5kOiB7XG4gIGNvbXBvbmVudDogYm9vbGVhbjtcbn0pOiBTZXhwT3Bjb2Rlcy5TdGF0aWNBdHRyIHwgU2V4cE9wY29kZXMuU3RhdGljQ29tcG9uZW50QXR0cjtcbmZ1bmN0aW9uIHN0YXRpY0F0dHJPcChraW5kOiB7IGNvbXBvbmVudDogYm9vbGVhbiB9KTogV2lyZUZvcm1hdC5BdHRyT3Age1xuICBpZiAoa2luZC5jb21wb25lbnQpIHtcbiAgICByZXR1cm4gU2V4cE9wY29kZXMuU3RhdGljQ29tcG9uZW50QXR0cjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gU2V4cE9wY29kZXMuU3RhdGljQXR0cjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkeW5hbWljQXR0ck9wKFxuICBraW5kOiBtaXIuQXR0cktpbmRcbik6XG4gIHwgU2V4cE9wY29kZXMuVHJ1c3RpbmdDb21wb25lbnRBdHRyXG4gIHwgU2V4cE9wY29kZXMuVHJ1c3RpbmdEeW5hbWljQXR0clxuICB8IFNleHBPcGNvZGVzLkNvbXBvbmVudEF0dHJcbiAgfCBTZXhwT3Bjb2Rlcy5EeW5hbWljQXR0ciB7XG4gIGlmIChraW5kLmNvbXBvbmVudCkge1xuICAgIHJldHVybiBraW5kLnRydXN0aW5nID8gU2V4cE9wY29kZXMuVHJ1c3RpbmdDb21wb25lbnRBdHRyIDogU2V4cE9wY29kZXMuQ29tcG9uZW50QXR0cjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ga2luZC50cnVzdGluZyA/IFNleHBPcGNvZGVzLlRydXN0aW5nRHluYW1pY0F0dHIgOiBTZXhwT3Bjb2Rlcy5EeW5hbWljQXR0cjtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==