@glimmer/compiler
Version:
157 lines (131 loc) • 16.2 kB
JavaScript
import { ASTv2 } from '@glimmer/syntax';
import { OptionalList } from '../../../shared/list';
import { Ok, Result, ResultArray } from '../../../shared/result';
import * as mir from '../../2-encoding/mir';
import { BLOCK_KEYWORDS } from '../keywords';
import { APPEND_KEYWORDS } from '../keywords/append';
import { ClassifiedElement, hasDynamicFeatures } from './element/classified';
import { ClassifiedComponent } from './element/component';
import { ClassifiedSimpleElement } from './element/simple-element';
import { VISIT_EXPRS } from './expressions';
var NormalizationStatements = /*#__PURE__*/function () {
function NormalizationStatements() {}
var _proto = NormalizationStatements.prototype;
_proto.visitList = function visitList(nodes, state) {
return new ResultArray(nodes.map(function (e) {
return VISIT_STMTS.visit(e, state);
})).toOptionalList().mapOk(function (list) {
return list.filter(function (s) {
return s !== null;
});
});
};
_proto.visit = function visit(node, state) {
switch (node.type) {
case 'GlimmerComment':
return Ok(null);
case 'AppendContent':
return this.AppendContent(node, state);
case 'HtmlText':
return Ok(this.TextNode(node));
case 'HtmlComment':
return Ok(this.HtmlComment(node));
case 'InvokeBlock':
return this.InvokeBlock(node, state);
case 'InvokeComponent':
return this.Component(node, state);
case 'SimpleElement':
return this.SimpleElement(node, state);
}
};
_proto.InvokeBlock = function InvokeBlock(node, state) {
var _this = this;
var translated = BLOCK_KEYWORDS.translate(node, state);
if (translated !== null) {
return translated;
}
var head = VISIT_EXPRS.visit(node.callee, state);
var args = VISIT_EXPRS.Args(node.args, state);
return Result.all(head, args).andThen(function (_ref) {
var head = _ref[0],
args = _ref[1];
return _this.NamedBlocks(node.blocks, state).mapOk(function (blocks) {
return new mir.InvokeBlock({
loc: node.loc,
head: head,
args: args,
blocks: blocks
});
});
});
};
_proto.NamedBlocks = function NamedBlocks(blocks, state) {
var _this2 = this;
var list = new ResultArray(blocks.blocks.map(function (b) {
return _this2.NamedBlock(b, state);
}));
return list.toArray().mapOk(function (list) {
return new mir.NamedBlocks({
loc: blocks.loc,
blocks: OptionalList(list)
});
});
};
_proto.NamedBlock = function NamedBlock(named, state) {
var body = state.visitBlock(named.block);
return body.mapOk(function (body) {
return new mir.NamedBlock({
loc: named.loc,
name: named.name,
body: body.toArray(),
scope: named.block.scope
});
});
};
_proto.SimpleElement = function SimpleElement(element, state) {
return new ClassifiedElement(element, new ClassifiedSimpleElement(element.tag, element, hasDynamicFeatures(element)), state).toStatement();
};
_proto.Component = function Component(component, state) {
return VISIT_EXPRS.visit(component.callee, state).andThen(function (callee) {
return new ClassifiedElement(component, new ClassifiedComponent(callee, component), state).toStatement();
});
};
_proto.AppendContent = function AppendContent(append, state) {
var translated = APPEND_KEYWORDS.translate(append, state);
if (translated !== null) {
return translated;
}
var value = VISIT_EXPRS.visit(append.value, state);
return value.mapOk(function (value) {
if (append.trusting) {
return new mir.AppendTrustedHTML({
loc: append.loc,
html: value
});
} else {
return new mir.AppendTextNode({
loc: append.loc,
text: value
});
}
});
};
_proto.TextNode = function TextNode(text) {
return new mir.AppendTextNode({
loc: text.loc,
text: new ASTv2.LiteralExpression({
loc: text.loc,
value: text.chars
})
});
};
_proto.HtmlComment = function HtmlComment(comment) {
return new mir.AppendComment({
loc: comment.loc,
value: comment.text
});
};
return NormalizationStatements;
}();
export var VISIT_STMTS = new NormalizationStatements();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL3Zpc2l0b3JzL3N0YXRlbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBQSxLQUFBLFFBQUEsaUJBQUE7QUFFQSxTQUFBLFlBQUEsUUFBQSxzQkFBQTtBQUNBLFNBQUEsRUFBQSxFQUFBLE1BQUEsRUFBQSxXQUFBLFFBQUEsd0JBQUE7QUFDQSxPQUFPLEtBQVAsR0FBQSxNQUFBLHNCQUFBO0FBRUEsU0FBQSxjQUFBLFFBQUEsYUFBQTtBQUNBLFNBQUEsZUFBQSxRQUFBLG9CQUFBO0FBQ0EsU0FBQSxpQkFBQSxFQUFBLGtCQUFBLFFBQUEsc0JBQUE7QUFDQSxTQUFBLG1CQUFBLFFBQUEscUJBQUE7QUFDQSxTQUFBLHVCQUFBLFFBQUEsMEJBQUE7QUFDQSxTQUFBLFdBQUEsUUFBQSxlQUFBOztJQUVBLHVCOzs7OztTQUNFLFMsR0FBQSxtQkFBUyxLQUFULEVBQVMsS0FBVCxFQUUyQjtBQUV6QixXQUFPLElBQUEsV0FBQSxDQUFnQixLQUFLLENBQUwsR0FBQSxDQUFXLFVBQUEsQ0FBRDtBQUFBLGFBQU8sV0FBVyxDQUFYLEtBQUEsQ0FBQSxDQUFBLEVBQWpDLEtBQWlDLENBQVA7QUFBQSxLQUFWLENBQWhCLEVBQUEsY0FBQSxHQUFBLEtBQUEsQ0FFRyxVQUFBLElBQUQ7QUFBQSxhQUFVLElBQUksQ0FBSixNQUFBLENBQWEsVUFBQSxDQUFEO0FBQUEsZUFBaUQsQ0FBQyxLQUZqRixJQUUrQjtBQUFBLE9BQVosQ0FBVjtBQUFBLEtBRkYsQ0FBUDtBQUdELEc7O1NBRUQsSyxHQUFBLGVBQUssSUFBTCxFQUFLLEtBQUwsRUFBd0Q7QUFDdEQsWUFBUSxJQUFJLENBQVosSUFBQTtBQUNFLFdBQUEsZ0JBQUE7QUFDRSxlQUFPLEVBQUUsQ0FBVCxJQUFTLENBQVQ7O0FBQ0YsV0FBQSxlQUFBO0FBQ0UsZUFBTyxLQUFBLGFBQUEsQ0FBQSxJQUFBLEVBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsVUFBQTtBQUNFLGVBQU8sRUFBRSxDQUFDLEtBQUEsUUFBQSxDQUFWLElBQVUsQ0FBRCxDQUFUOztBQUNGLFdBQUEsYUFBQTtBQUNFLGVBQU8sRUFBRSxDQUFDLEtBQUEsV0FBQSxDQUFWLElBQVUsQ0FBRCxDQUFUOztBQUNGLFdBQUEsYUFBQTtBQUNFLGVBQU8sS0FBQSxXQUFBLENBQUEsSUFBQSxFQUFQLEtBQU8sQ0FBUDs7QUFDRixXQUFBLGlCQUFBO0FBQ0UsZUFBTyxLQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsZUFBQTtBQUNFLGVBQU8sS0FBQSxhQUFBLENBQUEsSUFBQSxFQUFQLEtBQU8sQ0FBUDtBQWRKO0FBZ0JELEc7O1NBRUQsVyxHQUFBLHFCQUFXLElBQVgsRUFBVyxLQUFYLEVBQThEO0FBQUE7O0FBQzVELFFBQUksVUFBVSxHQUFHLGNBQWMsQ0FBZCxTQUFBLENBQUEsSUFBQSxFQUFqQixLQUFpQixDQUFqQjs7QUFFQSxRQUFJLFVBQVUsS0FBZCxJQUFBLEVBQXlCO0FBQ3ZCLGFBQUEsVUFBQTtBQUNEOztBQUVELFFBQUksSUFBSSxHQUFHLFdBQVcsQ0FBWCxLQUFBLENBQWtCLElBQUksQ0FBdEIsTUFBQSxFQUFYLEtBQVcsQ0FBWDtBQUNBLFFBQUksSUFBSSxHQUFHLFdBQVcsQ0FBWCxJQUFBLENBQWlCLElBQUksQ0FBckIsSUFBQSxFQUFYLEtBQVcsQ0FBWDtBQUVBLFdBQU8sTUFBTSxDQUFOLEdBQUEsQ0FBQSxJQUFBLEVBQUEsSUFBQSxFQUFBLE9BQUEsQ0FBK0I7QUFBQSxVQUFDLElBQUQ7QUFBQSxVQUFBLElBQUE7QUFBQSxhQUNwQyxLQUFBLENBQUEsV0FBQSxDQUFpQixJQUFJLENBQXJCLE1BQUEsRUFBQSxLQUFBLEVBQUEsS0FBQSxDQUNHLFVBQUEsTUFBRDtBQUFBLGVBQ0UsSUFBSSxHQUFHLENBQVAsV0FBQSxDQUFvQjtBQUNsQixVQUFBLEdBQUcsRUFBRSxJQUFJLENBRFMsR0FBQTtBQUVsQixVQUFBLElBRmtCLEVBRWxCLElBRmtCO0FBR2xCLFVBQUEsSUFIa0IsRUFHbEIsSUFIa0I7QUFJbEIsVUFBQSxNQUFBLEVBQUE7QUFKa0IsU0FBcEIsQ0FERjtBQUFBLE9BREYsQ0FEb0M7QUFBQSxLQUEvQixDQUFQO0FBV0QsRzs7U0FFRCxXLEdBQUEscUJBQVcsTUFBWCxFQUFXLEtBQVgsRUFBZ0U7QUFBQTs7QUFDOUQsUUFBSSxJQUFJLEdBQUcsSUFBQSxXQUFBLENBQWdCLE1BQU0sQ0FBTixNQUFBLENBQUEsR0FBQSxDQUFtQixVQUFBLENBQUQ7QUFBQSxhQUFPLE1BQUEsQ0FBQSxVQUFBLENBQUEsQ0FBQSxFQUFwRCxLQUFvRCxDQUFQO0FBQUEsS0FBbEIsQ0FBaEIsQ0FBWDtBQUVBLFdBQU8sSUFBSSxDQUFKLE9BQUEsR0FBQSxLQUFBLENBRUcsVUFBQSxJQUFEO0FBQUEsYUFBVSxJQUFJLEdBQUcsQ0FBUCxXQUFBLENBQW9CO0FBQUUsUUFBQSxHQUFHLEVBQUUsTUFBTSxDQUFiLEdBQUE7QUFBbUIsUUFBQSxNQUFNLEVBQUUsWUFBWSxDQUFBLElBQUE7QUFBdkMsT0FBcEIsQ0FBVjtBQUFBLEtBRkYsQ0FBUDtBQUdELEc7O1NBRUQsVSxHQUFBLG9CQUFVLEtBQVYsRUFBVSxLQUFWLEVBQTZEO0FBQzNELFFBQUksSUFBSSxHQUFHLEtBQUssQ0FBTCxVQUFBLENBQWlCLEtBQUssQ0FBakMsS0FBVyxDQUFYO0FBRUEsV0FBTyxJQUFJLENBQUosS0FBQSxDQUFZLFVBQUEsSUFBRCxFQUFTO0FBQ3pCLGFBQU8sSUFBSSxHQUFHLENBQVAsVUFBQSxDQUFtQjtBQUN4QixRQUFBLEdBQUcsRUFBRSxLQUFLLENBRGMsR0FBQTtBQUV4QixRQUFBLElBQUksRUFBRSxLQUFLLENBRmEsSUFBQTtBQUd4QixRQUFBLElBQUksRUFBRSxJQUFJLENBSGMsT0FHbEIsRUFIa0I7QUFJeEIsUUFBQSxLQUFLLEVBQUUsS0FBSyxDQUFMLEtBQUEsQ0FBWTtBQUpLLE9BQW5CLENBQVA7QUFERixLQUFPLENBQVA7QUFRRCxHOztTQUVELGEsR0FBQSx1QkFBYSxPQUFiLEVBQWEsS0FBYixFQUFxRTtBQUNuRSxXQUFPLElBQUEsaUJBQUEsQ0FBQSxPQUFBLEVBRUwsSUFBQSx1QkFBQSxDQUE0QixPQUFPLENBQW5DLEdBQUEsRUFBQSxPQUFBLEVBQWtELGtCQUFrQixDQUYvRCxPQUUrRCxDQUFwRSxDQUZLLEVBQUEsS0FBQSxFQUFQLFdBQU8sRUFBUDtBQUtELEc7O1NBRUQsUyxHQUFBLG1CQUFTLFNBQVQsRUFBUyxLQUFULEVBQXFFO0FBQ25FLFdBQU8sV0FBVyxDQUFYLEtBQUEsQ0FBa0IsU0FBUyxDQUEzQixNQUFBLEVBQUEsS0FBQSxFQUFBLE9BQUEsQ0FBb0QsVUFBQSxNQUFEO0FBQUEsYUFDeEQsSUFBQSxpQkFBQSxDQUFBLFNBQUEsRUFFRSxJQUFBLG1CQUFBLENBQUEsTUFBQSxFQUZGLFNBRUUsQ0FGRixFQUFBLEtBQUEsRUFERixXQUNFLEVBRHdEO0FBQUEsS0FBbkQsQ0FBUDtBQU9ELEc7O1NBRUQsYSxHQUFBLHVCQUFhLE1BQWIsRUFBYSxLQUFiLEVBQW9FO0FBQ2xFLFFBQUksVUFBVSxHQUFHLGVBQWUsQ0FBZixTQUFBLENBQUEsTUFBQSxFQUFqQixLQUFpQixDQUFqQjs7QUFFQSxRQUFJLFVBQVUsS0FBZCxJQUFBLEVBQXlCO0FBQ3ZCLGFBQUEsVUFBQTtBQUNEOztBQUVELFFBQUksS0FBSyxHQUFHLFdBQVcsQ0FBWCxLQUFBLENBQWtCLE1BQU0sQ0FBeEIsS0FBQSxFQUFaLEtBQVksQ0FBWjtBQUVBLFdBQU8sS0FBSyxDQUFMLEtBQUEsQ0FBYSxVQUFBLEtBQUQsRUFBVTtBQUMzQixVQUFJLE1BQU0sQ0FBVixRQUFBLEVBQXFCO0FBQ25CLGVBQU8sSUFBSSxHQUFHLENBQVAsaUJBQUEsQ0FBMEI7QUFDL0IsVUFBQSxHQUFHLEVBQUUsTUFBTSxDQURvQixHQUFBO0FBRS9CLFVBQUEsSUFBSSxFQUFFO0FBRnlCLFNBQTFCLENBQVA7QUFERixPQUFBLE1BS087QUFDTCxlQUFPLElBQUksR0FBRyxDQUFQLGNBQUEsQ0FBdUI7QUFDNUIsVUFBQSxHQUFHLEVBQUUsTUFBTSxDQURpQixHQUFBO0FBRTVCLFVBQUEsSUFBSSxFQUFFO0FBRnNCLFNBQXZCLENBQVA7QUFJRDtBQVhILEtBQU8sQ0FBUDtBQWFELEc7O1NBRUQsUSxHQUFBLGtCQUFRLElBQVIsRUFBNkI7QUFDM0IsV0FBTyxJQUFJLEdBQUcsQ0FBUCxjQUFBLENBQXVCO0FBQzVCLE1BQUEsR0FBRyxFQUFFLElBQUksQ0FEbUIsR0FBQTtBQUU1QixNQUFBLElBQUksRUFBRSxJQUFJLEtBQUssQ0FBVCxpQkFBQSxDQUE0QjtBQUFFLFFBQUEsR0FBRyxFQUFFLElBQUksQ0FBWCxHQUFBO0FBQWlCLFFBQUEsS0FBSyxFQUFFLElBQUksQ0FBQztBQUE3QixPQUE1QjtBQUZzQixLQUF2QixDQUFQO0FBSUQsRzs7U0FFRCxXLEdBQUEscUJBQVcsT0FBWCxFQUFzQztBQUNwQyxXQUFPLElBQUksR0FBRyxDQUFQLGFBQUEsQ0FBc0I7QUFDM0IsTUFBQSxHQUFHLEVBQUUsT0FBTyxDQURlLEdBQUE7QUFFM0IsTUFBQSxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBRlksS0FBdEIsQ0FBUDtBQUlELEc7Ozs7O0FBR0gsT0FBTyxJQUFNLFdBQVcsR0FBRyxJQUFwQix1QkFBb0IsRUFBcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBU1R2MiB9IGZyb20gJ0BnbGltbWVyL3N5bnRheCc7XG5cbmltcG9ydCB7IE9wdGlvbmFsTGlzdCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9saXN0JztcbmltcG9ydCB7IE9rLCBSZXN1bHQsIFJlc3VsdEFycmF5IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3Jlc3VsdCc7XG5pbXBvcnQgKiBhcyBtaXIgZnJvbSAnLi4vLi4vMi1lbmNvZGluZy9taXInO1xuaW1wb3J0IHsgTm9ybWFsaXphdGlvblN0YXRlIH0gZnJvbSAnLi4vY29udGV4dCc7XG5pbXBvcnQgeyBCTE9DS19LRVlXT1JEUyB9IGZyb20gJy4uL2tleXdvcmRzJztcbmltcG9ydCB7IEFQUEVORF9LRVlXT1JEUyB9IGZyb20gJy4uL2tleXdvcmRzL2FwcGVuZCc7XG5pbXBvcnQgeyBDbGFzc2lmaWVkRWxlbWVudCwgaGFzRHluYW1pY0ZlYXR1cmVzIH0gZnJvbSAnLi9lbGVtZW50L2NsYXNzaWZpZWQnO1xuaW1wb3J0IHsgQ2xhc3NpZmllZENvbXBvbmVudCB9IGZyb20gJy4vZWxlbWVudC9jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2xhc3NpZmllZFNpbXBsZUVsZW1lbnQgfSBmcm9tICcuL2VsZW1lbnQvc2ltcGxlLWVsZW1lbnQnO1xuaW1wb3J0IHsgVklTSVRfRVhQUlMgfSBmcm9tICcuL2V4cHJlc3Npb25zJztcblxuY2xhc3MgTm9ybWFsaXphdGlvblN0YXRlbWVudHMge1xuICB2aXNpdExpc3QoXG4gICAgbm9kZXM6IHJlYWRvbmx5IEFTVHYyLkNvbnRlbnROb2RlW10sXG4gICAgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZVxuICApOiBSZXN1bHQ8T3B0aW9uYWxMaXN0PG1pci5TdGF0ZW1lbnQ+PiB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHRBcnJheShub2Rlcy5tYXAoKGUpID0+IFZJU0lUX1NUTVRTLnZpc2l0KGUsIHN0YXRlKSkpXG4gICAgICAudG9PcHRpb25hbExpc3QoKVxuICAgICAgLm1hcE9rKChsaXN0KSA9PiBsaXN0LmZpbHRlcigoczogbWlyLlN0YXRlbWVudCB8IG51bGwpOiBzIGlzIG1pci5TdGF0ZW1lbnQgPT4gcyAhPT0gbnVsbCkpO1xuICB9XG5cbiAgdmlzaXQobm9kZTogQVNUdjIuQ29udGVudE5vZGUsIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUpOiBSZXN1bHQ8bWlyLlN0YXRlbWVudCB8IG51bGw+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnR2xpbW1lckNvbW1lbnQnOlxuICAgICAgICByZXR1cm4gT2sobnVsbCk7XG4gICAgICBjYXNlICdBcHBlbmRDb250ZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQXBwZW5kQ29udGVudChub2RlLCBzdGF0ZSk7XG4gICAgICBjYXNlICdIdG1sVGV4dCc6XG4gICAgICAgIHJldHVybiBPayh0aGlzLlRleHROb2RlKG5vZGUpKTtcbiAgICAgIGNhc2UgJ0h0bWxDb21tZW50JzpcbiAgICAgICAgcmV0dXJuIE9rKHRoaXMuSHRtbENvbW1lbnQobm9kZSkpO1xuICAgICAgY2FzZSAnSW52b2tlQmxvY2snOlxuICAgICAgICByZXR1cm4gdGhpcy5JbnZva2VCbG9jayhub2RlLCBzdGF0ZSk7XG4gICAgICBjYXNlICdJbnZva2VDb21wb25lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5Db21wb25lbnQobm9kZSwgc3RhdGUpO1xuICAgICAgY2FzZSAnU2ltcGxlRWxlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLlNpbXBsZUVsZW1lbnQobm9kZSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuXG4gIEludm9rZUJsb2NrKG5vZGU6IEFTVHYyLkludm9rZUJsb2NrLCBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlKTogUmVzdWx0PG1pci5TdGF0ZW1lbnQ+IHtcbiAgICBsZXQgdHJhbnNsYXRlZCA9IEJMT0NLX0tFWVdPUkRTLnRyYW5zbGF0ZShub2RlLCBzdGF0ZSk7XG5cbiAgICBpZiAodHJhbnNsYXRlZCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7XG4gICAgfVxuXG4gICAgbGV0IGhlYWQgPSBWSVNJVF9FWFBSUy52aXNpdChub2RlLmNhbGxlZSwgc3RhdGUpO1xuICAgIGxldCBhcmdzID0gVklTSVRfRVhQUlMuQXJncyhub2RlLmFyZ3MsIHN0YXRlKTtcblxuICAgIHJldHVybiBSZXN1bHQuYWxsKGhlYWQsIGFyZ3MpLmFuZFRoZW4oKFtoZWFkLCBhcmdzXSkgPT5cbiAgICAgIHRoaXMuTmFtZWRCbG9ja3Mobm9kZS5ibG9ja3MsIHN0YXRlKS5tYXBPayhcbiAgICAgICAgKGJsb2NrcykgPT5cbiAgICAgICAgICBuZXcgbWlyLkludm9rZUJsb2NrKHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBOYW1lZEJsb2NrcyhibG9ja3M6IEFTVHYyLk5hbWVkQmxvY2tzLCBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlKTogUmVzdWx0PG1pci5OYW1lZEJsb2Nrcz4ge1xuICAgIGxldCBsaXN0ID0gbmV3IFJlc3VsdEFycmF5KGJsb2Nrcy5ibG9ja3MubWFwKChiKSA9PiB0aGlzLk5hbWVkQmxvY2soYiwgc3RhdGUpKSk7XG5cbiAgICByZXR1cm4gbGlzdFxuICAgICAgLnRvQXJyYXkoKVxuICAgICAgLm1hcE9rKChsaXN0KSA9PiBuZXcgbWlyLk5hbWVkQmxvY2tzKHsgbG9jOiBibG9ja3MubG9jLCBibG9ja3M6IE9wdGlvbmFsTGlzdChsaXN0KSB9KSk7XG4gIH1cblxuICBOYW1lZEJsb2NrKG5hbWVkOiBBU1R2Mi5OYW1lZEJsb2NrLCBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlKTogUmVzdWx0PG1pci5OYW1lZEJsb2NrPiB7XG4gICAgbGV0IGJvZHkgPSBzdGF0ZS52aXNpdEJsb2NrKG5hbWVkLmJsb2NrKTtcblxuICAgIHJldHVybiBib2R5Lm1hcE9rKChib2R5KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IG1pci5OYW1lZEJsb2NrKHtcbiAgICAgICAgbG9jOiBuYW1lZC5sb2MsXG4gICAgICAgIG5hbWU6IG5hbWVkLm5hbWUsXG4gICAgICAgIGJvZHk6IGJvZHkudG9BcnJheSgpLFxuICAgICAgICBzY29wZTogbmFtZWQuYmxvY2suc2NvcGUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIFNpbXBsZUVsZW1lbnQoZWxlbWVudDogQVNUdjIuU2ltcGxlRWxlbWVudCwgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSk6IFJlc3VsdDxtaXIuU3RhdGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBDbGFzc2lmaWVkRWxlbWVudChcbiAgICAgIGVsZW1lbnQsXG4gICAgICBuZXcgQ2xhc3NpZmllZFNpbXBsZUVsZW1lbnQoZWxlbWVudC50YWcsIGVsZW1lbnQsIGhhc0R5bmFtaWNGZWF0dXJlcyhlbGVtZW50KSksXG4gICAgICBzdGF0ZVxuICAgICkudG9TdGF0ZW1lbnQoKTtcbiAgfVxuXG4gIENvbXBvbmVudChjb21wb25lbnQ6IEFTVHYyLkludm9rZUNvbXBvbmVudCwgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSk6IFJlc3VsdDxtaXIuU3RhdGVtZW50PiB7XG4gICAgcmV0dXJuIFZJU0lUX0VYUFJTLnZpc2l0KGNvbXBvbmVudC5jYWxsZWUsIHN0YXRlKS5hbmRUaGVuKChjYWxsZWUpID0+XG4gICAgICBuZXcgQ2xhc3NpZmllZEVsZW1lbnQoXG4gICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgbmV3IENsYXNzaWZpZWRDb21wb25lbnQoY2FsbGVlLCBjb21wb25lbnQpLFxuICAgICAgICBzdGF0ZVxuICAgICAgKS50b1N0YXRlbWVudCgpXG4gICAgKTtcbiAgfVxuXG4gIEFwcGVuZENvbnRlbnQoYXBwZW5kOiBBU1R2Mi5BcHBlbmRDb250ZW50LCBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlKTogUmVzdWx0PG1pci5TdGF0ZW1lbnQ+IHtcbiAgICBsZXQgdHJhbnNsYXRlZCA9IEFQUEVORF9LRVlXT1JEUy50cmFuc2xhdGUoYXBwZW5kLCBzdGF0ZSk7XG5cbiAgICBpZiAodHJhbnNsYXRlZCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gVklTSVRfRVhQUlMudmlzaXQoYXBwZW5kLnZhbHVlLCBzdGF0ZSk7XG5cbiAgICByZXR1cm4gdmFsdWUubWFwT2soKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoYXBwZW5kLnRydXN0aW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgbWlyLkFwcGVuZFRydXN0ZWRIVE1MKHtcbiAgICAgICAgICBsb2M6IGFwcGVuZC5sb2MsXG4gICAgICAgICAgaHRtbDogdmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBtaXIuQXBwZW5kVGV4dE5vZGUoe1xuICAgICAgICAgIGxvYzogYXBwZW5kLmxvYyxcbiAgICAgICAgICB0ZXh0OiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBUZXh0Tm9kZSh0ZXh0OiBBU1R2Mi5IdG1sVGV4dCk6IG1pci5TdGF0ZW1lbnQge1xuICAgIHJldHVybiBuZXcgbWlyLkFwcGVuZFRleHROb2RlKHtcbiAgICAgIGxvYzogdGV4dC5sb2MsXG4gICAgICB0ZXh0OiBuZXcgQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24oeyBsb2M6IHRleHQubG9jLCB2YWx1ZTogdGV4dC5jaGFycyB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIEh0bWxDb21tZW50KGNvbW1lbnQ6IEFTVHYyLkh0bWxDb21tZW50KTogbWlyLlN0YXRlbWVudCB7XG4gICAgcmV0dXJuIG5ldyBtaXIuQXBwZW5kQ29tbWVudCh7XG4gICAgICBsb2M6IGNvbW1lbnQubG9jLFxuICAgICAgdmFsdWU6IGNvbW1lbnQudGV4dCxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVklTSVRfU1RNVFMgPSBuZXcgTm9ybWFsaXphdGlvblN0YXRlbWVudHMoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=