ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
295 lines (291 loc) • 34.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Template = exports.ComponentBlock = exports.TemplateBlock = exports.InlineBlock = exports.Block = undefined;
var _util = require("@glimmer/util");
var _wireFormat = require("@glimmer/wire-format");
class Block {
constructor() {
this.statements = [];
}
push(statement) {
this.statements.push(statement);
}
}
exports.Block = Block;
class InlineBlock extends Block {
constructor(table) {
super();
this.table = table;
}
toJSON() {
return {
statements: this.statements,
parameters: this.table.slots
};
}
}
exports.InlineBlock = InlineBlock;
class TemplateBlock extends Block {
constructor(symbolTable) {
super();
this.symbolTable = symbolTable;
this.type = "template";
this.yields = new _util.DictSet();
this.named = new _util.DictSet();
this.blocks = [];
this.hasEval = false;
}
push(statement) {
this.statements.push(statement);
}
toJSON() {
return {
symbols: this.symbolTable.symbols,
statements: this.statements,
hasEval: this.hasEval
};
}
}
exports.TemplateBlock = TemplateBlock;
class ComponentBlock extends Block {
constructor(table) {
super();
this.table = table;
this.attributes = [];
this.arguments = [];
this.inParams = true;
this.positionals = [];
}
push(statement) {
if (this.inParams) {
if (_wireFormat.Statements.isFlushElement(statement)) {
this.inParams = false;
} else if (_wireFormat.Statements.isArgument(statement)) {
this.arguments.push(statement);
} else if (_wireFormat.Statements.isAttribute(statement)) {
this.attributes.push(statement);
} else if (_wireFormat.Statements.isModifier(statement)) {
throw new Error('Compile Error: Element modifiers are not allowed in components');
} else {
throw new Error('Compile Error: only parameters allowed before flush-element');
}
} else {
this.statements.push(statement);
}
}
toJSON() {
let args = this.arguments;
let keys = args.map(arg => arg[1]);
let values = args.map(arg => arg[2]);
return [this.attributes, [keys, values], {
statements: this.statements,
parameters: this.table.slots
}];
}
}
exports.ComponentBlock = ComponentBlock;
class Template {
constructor(symbols, meta) {
this.meta = meta;
this.block = new TemplateBlock(symbols);
}
toJSON() {
return {
block: this.block.toJSON(),
meta: this.meta
};
}
}
exports.Template = Template;
class JavaScriptCompiler {
constructor(opcodes, symbols, meta) {
this.blocks = new _util.Stack();
this.values = [];
this.opcodes = opcodes;
this.template = new Template(symbols, meta);
}
static process(opcodes, symbols, meta) {
let compiler = new JavaScriptCompiler(opcodes, symbols, meta);
return compiler.process();
}
get currentBlock() {
return (0, _util.expect)(this.blocks.current, 'Expected a block on the stack');
}
process() {
this.opcodes.forEach(([opcode, ...args]) => {
if (!this[opcode]) {
throw new Error(`unimplemented ${opcode} on JavaScriptCompiler`);
}
this[opcode](...args);
});
return this.template;
}
/// Nesting
startBlock([program]) {
let block = new InlineBlock(program['symbols']);
this.blocks.push(block);
}
endBlock() {
let { template, blocks } = this;
let block = blocks.pop();
template.block.blocks.push(block.toJSON());
}
startProgram() {
this.blocks.push(this.template.block);
}
endProgram() {}
/// Statements
text(content) {
this.push([_wireFormat.Ops.Text, content]);
}
append(trusted) {
this.push([_wireFormat.Ops.Append, this.popValue(), trusted]);
}
comment(value) {
this.push([_wireFormat.Ops.Comment, value]);
}
modifier(name) {
let params = this.popValue();
let hash = this.popValue();
this.push([_wireFormat.Ops.Modifier, name, params, hash]);
}
block(name, template, inverse) {
let params = this.popValue();
let hash = this.popValue();
let blocks = this.template.block.blocks;
(0, _util.assert)(typeof template !== 'number' || blocks[template] !== null, 'missing block in the compiler');
(0, _util.assert)(typeof inverse !== 'number' || blocks[inverse] !== null, 'missing block in the compiler');
this.push([_wireFormat.Ops.Block, name, params, hash, blocks[template], blocks[inverse]]);
}
openElement(element) {
let tag = element.tag;
if (tag.indexOf('-') !== -1) {
this.startComponent(element);
} else if (element.blockParams.length > 0) {
throw new Error(`Compile Error: <${element.tag}> is not a component and doesn't support block parameters`);
} else {
this.push([_wireFormat.Ops.OpenElement, tag]);
}
}
flushElement() {
this.push([_wireFormat.Ops.FlushElement]);
}
closeElement(element) {
let tag = element.tag;
if (tag.indexOf('-') !== -1) {
let [attrs, args, block] = this.endComponent();
this.push([_wireFormat.Ops.Component, tag, attrs, args, block]);
} else {
this.push([_wireFormat.Ops.CloseElement]);
}
}
staticAttr(name, namespace) {
let value = this.popValue();
this.push([_wireFormat.Ops.StaticAttr, name, value, namespace]);
}
dynamicAttr(name, namespace) {
let value = this.popValue();
this.push([_wireFormat.Ops.DynamicAttr, name, value, namespace]);
}
trustingAttr(name, namespace) {
let value = this.popValue();
this.push([_wireFormat.Ops.TrustingAttr, name, value, namespace]);
}
staticArg(name) {
let value = this.popValue();
this.push([_wireFormat.Ops.StaticArg, name, value]);
}
dynamicArg(name) {
let value = this.popValue();
this.push([_wireFormat.Ops.DynamicArg, name, value]);
}
yield(to) {
let params = this.popValue();
this.push([_wireFormat.Ops.Yield, to, params]);
}
debugger(evalInfo) {
this.push([_wireFormat.Ops.Debugger, evalInfo]);
this.template.block.hasEval = true;
}
hasBlock(name) {
this.pushValue([_wireFormat.Ops.HasBlock, name]);
}
hasBlockParams(name) {
this.pushValue([_wireFormat.Ops.HasBlockParams, name]);
}
partial(evalInfo) {
let params = this.popValue();
this.push([_wireFormat.Ops.Partial, params[0], evalInfo]);
this.template.block.hasEval = true;
}
/// Expressions
literal(value) {
if (value === undefined) {
this.pushValue([_wireFormat.Ops.Undefined]);
} else {
this.pushValue(value);
}
}
unknown(name) {
this.pushValue([_wireFormat.Ops.Unknown, name]);
}
get(head, path) {
this.pushValue([_wireFormat.Ops.Get, head, path]);
}
maybeLocal(path) {
this.pushValue([_wireFormat.Ops.MaybeLocal, path]);
}
concat() {
this.pushValue([_wireFormat.Ops.Concat, this.popValue()]);
}
helper(name) {
let params = this.popValue();
let hash = this.popValue();
this.pushValue([_wireFormat.Ops.Helper, name, params, hash]);
}
/// Stack Management Opcodes
startComponent(element) {
let component = new ComponentBlock(element['symbols']);
this.blocks.push(component);
}
endComponent() {
let component = this.blocks.pop();
(0, _util.assert)(component instanceof ComponentBlock, "Compiler bug: endComponent() should end a component");
return component.toJSON();
}
prepareArray(size) {
let values = [];
for (let i = 0; i < size; i++) {
values.push(this.popValue());
}
this.pushValue(values);
}
prepareObject(size) {
(0, _util.assert)(this.values.length >= size, `Expected ${size} values on the stack, found ${this.values.length}`);
let keys = new Array(size);
let values = new Array(size);
for (let i = 0; i < size; i++) {
keys[i] = this.popValue();
values[i] = this.popValue();
}
this.pushValue([keys, values]);
}
/// Utilities
push(args) {
while (args[args.length - 1] === null) {
args.pop();
}
this.currentBlock.push(args);
}
pushValue(val) {
this.values.push(val);
}
popValue() {
(0, _util.assert)(this.values.length, "No expression found on stack");
return this.values.pop();
}
}
exports.default = JavaScriptCompiler;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9qYXZhc2NyaXB0LWNvbXBpbGVyLmpzIl0sIm5hbWVzIjpbIkJsb2NrIiwiY29uc3RydWN0b3IiLCJzdGF0ZW1lbnRzIiwicHVzaCIsInN0YXRlbWVudCIsIklubGluZUJsb2NrIiwidGFibGUiLCJ0b0pTT04iLCJwYXJhbWV0ZXJzIiwic2xvdHMiLCJUZW1wbGF0ZUJsb2NrIiwic3ltYm9sVGFibGUiLCJ0eXBlIiwieWllbGRzIiwibmFtZWQiLCJibG9ja3MiLCJoYXNFdmFsIiwic3ltYm9scyIsIkNvbXBvbmVudEJsb2NrIiwiYXR0cmlidXRlcyIsImFyZ3VtZW50cyIsImluUGFyYW1zIiwicG9zaXRpb25hbHMiLCJpc0ZsdXNoRWxlbWVudCIsImlzQXJndW1lbnQiLCJpc0F0dHJpYnV0ZSIsImlzTW9kaWZpZXIiLCJFcnJvciIsImFyZ3MiLCJrZXlzIiwibWFwIiwiYXJnIiwidmFsdWVzIiwiVGVtcGxhdGUiLCJtZXRhIiwiYmxvY2siLCJKYXZhU2NyaXB0Q29tcGlsZXIiLCJvcGNvZGVzIiwidGVtcGxhdGUiLCJwcm9jZXNzIiwiY29tcGlsZXIiLCJjdXJyZW50QmxvY2siLCJjdXJyZW50IiwiZm9yRWFjaCIsIm9wY29kZSIsInN0YXJ0QmxvY2siLCJwcm9ncmFtIiwiZW5kQmxvY2siLCJwb3AiLCJzdGFydFByb2dyYW0iLCJlbmRQcm9ncmFtIiwidGV4dCIsImNvbnRlbnQiLCJUZXh0IiwiYXBwZW5kIiwidHJ1c3RlZCIsIkFwcGVuZCIsInBvcFZhbHVlIiwiY29tbWVudCIsInZhbHVlIiwiQ29tbWVudCIsIm1vZGlmaWVyIiwibmFtZSIsInBhcmFtcyIsImhhc2giLCJNb2RpZmllciIsImludmVyc2UiLCJvcGVuRWxlbWVudCIsImVsZW1lbnQiLCJ0YWciLCJpbmRleE9mIiwic3RhcnRDb21wb25lbnQiLCJibG9ja1BhcmFtcyIsImxlbmd0aCIsIk9wZW5FbGVtZW50IiwiZmx1c2hFbGVtZW50IiwiRmx1c2hFbGVtZW50IiwiY2xvc2VFbGVtZW50IiwiYXR0cnMiLCJlbmRDb21wb25lbnQiLCJDb21wb25lbnQiLCJDbG9zZUVsZW1lbnQiLCJzdGF0aWNBdHRyIiwibmFtZXNwYWNlIiwiU3RhdGljQXR0ciIsImR5bmFtaWNBdHRyIiwiRHluYW1pY0F0dHIiLCJ0cnVzdGluZ0F0dHIiLCJUcnVzdGluZ0F0dHIiLCJzdGF0aWNBcmciLCJTdGF0aWNBcmciLCJkeW5hbWljQXJnIiwiRHluYW1pY0FyZyIsInlpZWxkIiwidG8iLCJZaWVsZCIsImRlYnVnZ2VyIiwiZXZhbEluZm8iLCJEZWJ1Z2dlciIsImhhc0Jsb2NrIiwicHVzaFZhbHVlIiwiSGFzQmxvY2siLCJoYXNCbG9ja1BhcmFtcyIsIkhhc0Jsb2NrUGFyYW1zIiwicGFydGlhbCIsIlBhcnRpYWwiLCJsaXRlcmFsIiwidW5kZWZpbmVkIiwiVW5kZWZpbmVkIiwidW5rbm93biIsIlVua25vd24iLCJnZXQiLCJoZWFkIiwicGF0aCIsIkdldCIsIm1heWJlTG9jYWwiLCJNYXliZUxvY2FsIiwiY29uY2F0IiwiQ29uY2F0IiwiaGVscGVyIiwiSGVscGVyIiwiY29tcG9uZW50IiwicHJlcGFyZUFycmF5Iiwic2l6ZSIsImkiLCJwcmVwYXJlT2JqZWN0IiwiQXJyYXkiLCJ2YWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQTs7QUFDTyxNQUFNQSxLQUFOLENBQVk7QUFDZkMsa0JBQWM7QUFDVixhQUFLQyxVQUFMLEdBQWtCLEVBQWxCO0FBQ0g7QUFDREMsU0FBS0MsU0FBTCxFQUFnQjtBQUNaLGFBQUtGLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCQyxTQUFyQjtBQUNIO0FBTmM7UUFBTkosSyxHQUFBQSxLO0FBUU4sTUFBTUssV0FBTixTQUEwQkwsS0FBMUIsQ0FBZ0M7QUFDbkNDLGdCQUFZSyxLQUFaLEVBQW1CO0FBQ2Y7QUFDQSxhQUFLQSxLQUFMLEdBQWFBLEtBQWI7QUFDSDtBQUNEQyxhQUFTO0FBQ0wsZUFBTztBQUNITCx3QkFBWSxLQUFLQSxVQURkO0FBRUhNLHdCQUFZLEtBQUtG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Q0g7QUFDRCxhQUFLMkMsU0FBTCxDQUFlcEUsTUFBZjtBQUNIO0FBQ0Q2RixrQkFBY0YsSUFBZCxFQUFvQjtBQUNoQiwwQkFBTyxLQUFLM0YsTUFBTCxDQUFZeUMsTUFBWixJQUFzQmtELElBQTdCLEVBQW9DLFlBQVdBLElBQUssK0JBQThCLEtBQUszRixNQUFMLENBQVl5QyxNQUFPLEVBQXJHO0FBQ0EsWUFBSTVDLE9BQU8sSUFBSWlHLEtBQUosQ0FBVUgsSUFBVixDQUFYO0FBQ0EsWUFBSTNGLFNBQVMsSUFBSThGLEtBQUosQ0FBVUgsSUFBVixDQUFiO0FBQ0EsYUFBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlELElBQXBCLEVBQTBCQyxHQUExQixFQUErQjtBQUMzQi9GLGlCQUFLK0YsQ0FBTCxJQUFVLEtBQUtuRSxRQUFMLEVBQVY7QUFDQXpCLG1CQUFPNEYsQ0FBUCxJQUFZLEtBQUtuRSxRQUFMLEVBQVo7QUFDSDtBQUNELGFBQUsyQyxTQUFMLENBQWUsQ0FBQ3ZFLElBQUQsRUFBT0csTUFBUCxDQUFmO0FBQ0g7QUFDRDtBQUNBN0IsU0FBS3lCLElBQUwsRUFBVztBQUNQLGVBQU9BLEtBQUtBLEtBQUs2QyxNQUFMLEdBQWMsQ0FBbkIsTUFBMEIsSUFBakMsRUFBdUM7QUFDbkM3QyxpQkFBS29CLEdBQUw7QUFDSDtBQUNELGFBQUtQLFlBQUwsQ0FBa0J0QyxJQUFsQixDQUF1QnlCLElBQXZCO0FBQ0g7QUFDRHdFLGNBQVUyQixHQUFWLEVBQWU7QUFDWCxhQUFLL0YsTUFBTCxDQUFZN0IsSUFBWixDQUFpQjRILEdBQWpCO0FBQ0g7QUFDRHRFLGVBQVc7QUFDUCwwQkFBTyxLQUFLekIsTUFBTCxDQUFZeUMsTUFBbkIsRUFBMkIsOEJBQTNCO0FBQ0EsZUFBTyxLQUFLekMsTUFBTCxDQUFZZ0IsR0FBWixFQUFQO0FBQ0g7QUExTG1DO2tCQUFuQlosa0IiLCJmaWxlIjoibGliL2phdmFzY3JpcHQtY29tcGlsZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tIFwiQGdsaW1tZXIvdXRpbFwiO1xuaW1wb3J0IHsgU3RhY2ssIERpY3RTZXQsIGV4cGVjdCB9IGZyb20gXCJAZ2xpbW1lci91dGlsXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnRzLCBPcHMgfSBmcm9tICdAZ2xpbW1lci93aXJlLWZvcm1hdCc7XG5leHBvcnQgY2xhc3MgQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMgPSBbXTtcbiAgICB9XG4gICAgcHVzaChzdGF0ZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgSW5saW5lQmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiB0aGlzLnN0YXRlbWVudHMsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLnRhYmxlLnNsb3RzXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3Ioc3ltYm9sVGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zeW1ib2xUYWJsZSA9IHN5bWJvbFRhYmxlO1xuICAgICAgICB0aGlzLnR5cGUgPSBcInRlbXBsYXRlXCI7XG4gICAgICAgIHRoaXMueWllbGRzID0gbmV3IERpY3RTZXQoKTtcbiAgICAgICAgdGhpcy5uYW1lZCA9IG5ldyBEaWN0U2V0KCk7XG4gICAgICAgIHRoaXMuYmxvY2tzID0gW107XG4gICAgICAgIHRoaXMuaGFzRXZhbCA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoKHN0YXRlbWVudCkge1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzeW1ib2xzOiB0aGlzLnN5bWJvbFRhYmxlLnN5bWJvbHMsXG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiB0aGlzLnN0YXRlbWVudHMsXG4gICAgICAgICAgICBoYXNFdmFsOiB0aGlzLmhhc0V2YWxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29tcG9uZW50QmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5pblBhcmFtcyA9IHRydWU7XG4gICAgICAgIHRoaXMucG9zaXRpb25hbHMgPSBbXTtcbiAgICB9XG4gICAgcHVzaChzdGF0ZW1lbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5QYXJhbXMpIHtcbiAgICAgICAgICAgIGlmIChTdGF0ZW1lbnRzLmlzRmx1c2hFbGVtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluUGFyYW1zID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFN0YXRlbWVudHMuaXNBcmd1bWVudChzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmd1bWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChTdGF0ZW1lbnRzLmlzQXR0cmlidXRlKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChTdGF0ZW1lbnRzLmlzTW9kaWZpZXIoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcGlsZSBFcnJvcjogRWxlbWVudCBtb2RpZmllcnMgYXJlIG5vdCBhbGxvd2VkIGluIGNvbXBvbmVudHMnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21waWxlIEVycm9yOiBvbmx5IHBhcmFtZXRlcnMgYWxsb3dlZCBiZWZvcmUgZmx1c2gtZWxlbWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBhcmdzID0gdGhpcy5hcmd1bWVudHM7XG4gICAgICAgIGxldCBrZXlzID0gYXJncy5tYXAoYXJnID0+IGFyZ1sxXSk7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBhcmdzLm1hcChhcmcgPT4gYXJnWzJdKTtcbiAgICAgICAgcmV0dXJuIFt0aGlzLmF0dHJpYnV0ZXMsIFtrZXlzLCB2YWx1ZXNdLCB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiB0aGlzLnN0YXRlbWVudHMsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLnRhYmxlLnNsb3RzXG4gICAgICAgIH1dO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioc3ltYm9scywgbWV0YSkge1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgICAgICB0aGlzLmJsb2NrID0gbmV3IFRlbXBsYXRlQmxvY2soc3ltYm9scyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJsb2NrOiB0aGlzLmJsb2NrLnRvSlNPTigpLFxuICAgICAgICAgICAgbWV0YTogdGhpcy5tZXRhXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdENvbXBpbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcGNvZGVzLCBzeW1ib2xzLCBtZXRhKSB7XG4gICAgICAgIHRoaXMuYmxvY2tzID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMudmFsdWVzID0gW107XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IG9wY29kZXM7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoc3ltYm9scywgbWV0YSk7XG4gICAgfVxuICAgIHN0YXRpYyBwcm9jZXNzKG9wY29kZXMsIHN5bWJvbHMsIG1ldGEpIHtcbiAgICAgICAgbGV0IGNvbXBpbGVyID0gbmV3IEphdmFTY3JpcHRDb21waWxlcihvcGNvZGVzLCBzeW1ib2xzLCBtZXRhKTtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVyLnByb2Nlc3MoKTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRCbG9jaygpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdCh0aGlzLmJsb2Nrcy5jdXJyZW50LCAnRXhwZWN0ZWQgYSBibG9jayBvbiB0aGUgc3RhY2snKTtcbiAgICB9XG4gICAgcHJvY2VzcygpIHtcbiAgICAgICAgdGhpcy5vcGNvZGVzLmZvckVhY2goKFtvcGNvZGUsIC4uLmFyZ3NdKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXNbb3Bjb2RlXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5pbXBsZW1lbnRlZCAke29wY29kZX0gb24gSmF2YVNjcmlwdENvbXBpbGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzW29wY29kZV0oLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZTtcbiAgICB9XG4gICAgLy8vIE5lc3RpbmdcbiAgICBzdGFydEJsb2NrKFtwcm9ncmFtXSkge1xuICAgICAgICBsZXQgYmxvY2sgPSBuZXcgSW5saW5lQmxvY2socHJvZ3JhbVsnc3ltYm9scyddKTtcbiAgICAgICAgdGhpcy5ibG9ja3MucHVzaChibG9jayk7XG4gICAgfVxuICAgIGVuZEJsb2NrKCkge1xuICAgICAgICBsZXQgeyB0ZW1wbGF0ZSwgYmxvY2tzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgYmxvY2sgPSBibG9ja3MucG9wKCk7XG4gICAgICAgIHRlbXBsYXRlLmJsb2NrLmJsb2Nrcy5wdXNoKGJsb2NrLnRvSlNPTigpKTtcbiAgICB9XG4gICAgc3RhcnRQcm9ncmFtKCkge1xuICAgICAgICB0aGlzLmJsb2Nrcy5wdXNoKHRoaXMudGVtcGxhdGUuYmxvY2spO1xuICAgIH1cbiAgICBlbmRQcm9ncmFtKCkge31cbiAgICAvLy8gU3RhdGVtZW50c1xuICAgIHRleHQoY29udGVudCkge1xuICAgICAgICB0aGlzLnB1c2goW09wcy5UZXh0LCBjb250ZW50XSk7XG4gICAgfVxuICAgIGFwcGVuZCh0cnVzdGVkKSB7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLkFwcGVuZCwgdGhpcy5wb3BWYWx1ZSgpLCB0cnVzdGVkXSk7XG4gICAgfVxuICAgIGNvbW1lbnQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuQ29tbWVudCwgdmFsdWVdKTtcbiAgICB9XG4gICAgbW9kaWZpZXIobmFtZSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuTW9kaWZpZXIsIG5hbWUsIHBhcmFtcywgaGFzaF0pO1xuICAgIH1cbiAgICBibG9jayhuYW1lLCB0ZW1wbGF0ZSwgaW52ZXJzZSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgbGV0IGJsb2NrcyA9IHRoaXMudGVtcGxhdGUuYmxvY2suYmxvY2tzO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHRlbXBsYXRlICE9PSAnbnVtYmVyJyB8fCBibG9ja3NbdGVtcGxhdGVdICE9PSBudWxsLCAnbWlzc2luZyBibG9jayBpbiB0aGUgY29tcGlsZXInKTtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiBpbnZlcnNlICE9PSAnbnVtYmVyJyB8fCBibG9ja3NbaW52ZXJzZV0gIT09IG51bGwsICdtaXNzaW5nIGJsb2NrIGluIHRoZSBjb21waWxlcicpO1xuICAgICAgICB0aGlzLnB1c2goW09wcy5CbG9jaywgbmFtZSwgcGFyYW1zLCBoYXNoLCBibG9ja3NbdGVtcGxhdGVdLCBibG9ja3NbaW52ZXJzZV1dKTtcbiAgICB9XG4gICAgb3BlbkVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgdGFnID0gZWxlbWVudC50YWc7XG4gICAgICAgIGlmICh0YWcuaW5kZXhPZignLScpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbXBvbmVudChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmJsb2NrUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcGlsZSBFcnJvcjogPCR7ZWxlbWVudC50YWd9PiBpcyBub3QgYSBjb21wb25lbnQgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBibG9jayBwYXJhbWV0ZXJzYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goW09wcy5PcGVuRWxlbWVudCwgdGFnXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmx1c2hFbGVtZW50KCkge1xuICAgICAgICB0aGlzLnB1c2goW09wcy5GbHVzaEVsZW1lbnRdKTtcbiAgICB9XG4gICAgY2xvc2VFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHRhZyA9IGVsZW1lbnQudGFnO1xuICAgICAgICBpZiAodGFnLmluZGV4T2YoJy0nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBbYXR0cnMsIGFyZ3MsIGJsb2NrXSA9IHRoaXMuZW5kQ29tcG9uZW50KCk7XG4gICAgICAgICAgICB0aGlzLnB1c2goW09wcy5Db21wb25lbnQsIHRhZywgYXR0cnMsIGFyZ3MsIGJsb2NrXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goW09wcy5DbG9zZUVsZW1lbnRdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWNBdHRyKG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLlN0YXRpY0F0dHIsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2VdKTtcbiAgICB9XG4gICAgZHluYW1pY0F0dHIobmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRHluYW1pY0F0dHIsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2VdKTtcbiAgICB9XG4gICAgdHJ1c3RpbmdBdHRyKG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLlRydXN0aW5nQXR0ciwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZV0pO1xuICAgIH1cbiAgICBzdGF0aWNBcmcobmFtZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLlN0YXRpY0FyZywgbmFtZSwgdmFsdWVdKTtcbiAgICB9XG4gICAgZHluYW1pY0FyZyhuYW1lKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRHluYW1pY0FyZywgbmFtZSwgdmFsdWVdKTtcbiAgICB9XG4gICAgeWllbGQodG8pIHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuWWllbGQsIHRvLCBwYXJhbXNdKTtcbiAgICB9XG4gICAgZGVidWdnZXIoZXZhbEluZm8pIHtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRGVidWdnZXIsIGV2YWxJbmZvXSk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUuYmxvY2suaGFzRXZhbCA9IHRydWU7XG4gICAgfVxuICAgIGhhc0Jsb2NrKG5hbWUpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5IYXNCbG9jaywgbmFtZV0pO1xuICAgIH1cbiAgICBoYXNCbG9ja1BhcmFtcyhuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuSGFzQmxvY2tQYXJhbXMsIG5hbWVdKTtcbiAgICB9XG4gICAgcGFydGlhbChldmFsSW5mbykge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICB0aGlzLnB1c2goW09wcy5QYXJ0aWFsLCBwYXJhbXNbMF0sIGV2YWxJbmZvXSk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUuYmxvY2suaGFzRXZhbCA9IHRydWU7XG4gICAgfVxuICAgIC8vLyBFeHByZXNzaW9uc1xuICAgIGxpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuVW5kZWZpbmVkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdW5rbm93bihuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuVW5rbm93biwgbmFtZV0pO1xuICAgIH1cbiAgICBnZXQoaGVhZCwgcGF0aCkge1xuICAgICAgICB0aGlzLnB1c2hWYWx1ZShbT3BzLkdldCwgaGVhZCwgcGF0aF0pO1xuICAgIH1cbiAgICBtYXliZUxvY2FsKHBhdGgpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5NYXliZUxvY2FsLCBwYXRoXSk7XG4gICAgfVxuICAgIGNvbmNhdCgpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5Db25jYXQsIHRoaXMucG9wVmFsdWUoKV0pO1xuICAgIH1cbiAgICBoZWxwZXIobmFtZSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5IZWxwZXIsIG5hbWUsIHBhcmFtcywgaGFzaF0pO1xuICAgIH1cbiAgICAvLy8gU3RhY2sgTWFuYWdlbWVudCBPcGNvZGVzXG4gICAgc3RhcnRDb21wb25lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudEJsb2NrKGVsZW1lbnRbJ3N5bWJvbHMnXSk7XG4gICAgICAgIHRoaXMuYmxvY2tzLnB1c2goY29tcG9uZW50KTtcbiAgICB9XG4gICAgZW5kQ29tcG9uZW50KCkge1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5ibG9ja3MucG9wKCk7XG4gICAgICAgIGFzc2VydChjb21wb25lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRCbG9jaywgXCJDb21waWxlciBidWc6IGVuZENvbXBvbmVudCgpIHNob3VsZCBlbmQgYSBjb21wb25lbnRcIik7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudG9KU09OKCk7XG4gICAgfVxuICAgIHByZXBhcmVBcnJheShzaXplKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHRoaXMucG9wVmFsdWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoVmFsdWUodmFsdWVzKTtcbiAgICB9XG4gICAgcHJlcGFyZU9iamVjdChzaXplKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLnZhbHVlcy5sZW5ndGggPj0gc2l6ZSwgYEV4cGVjdGVkICR7c2l6ZX0gdmFsdWVzIG9uIHRoZSBzdGFjaywgZm91bmQgJHt0aGlzLnZhbHVlcy5sZW5ndGh9YCk7XG4gICAgICAgIGxldCBrZXlzID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgICBsZXQgdmFsdWVzID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAga2V5c1tpXSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hWYWx1ZShba2V5cywgdmFsdWVzXSk7XG4gICAgfVxuICAgIC8vLyBVdGlsaXRpZXNcbiAgICBwdXNoKGFyZ3MpIHtcbiAgICAgICAgd2hpbGUgKGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRCbG9jay5wdXNoKGFyZ3MpO1xuICAgIH1cbiAgICBwdXNoVmFsdWUodmFsKSB7XG4gICAgICAgIHRoaXMudmFsdWVzLnB1c2godmFsKTtcbiAgICB9XG4gICAgcG9wVmFsdWUoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLnZhbHVlcy5sZW5ndGgsIFwiTm8gZXhwcmVzc2lvbiBmb3VuZCBvbiBzdGFja1wiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzLnBvcCgpO1xuICAgIH1cbn0iXX0=