ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
434 lines (350 loc) • 39.2 kB
JavaScript
"use strict";
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");
var _createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
}return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
}();
function _defaults(obj, defaults) {
var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
Object.defineProperty(obj, key, value);
}
}return obj;
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && (typeof call === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Block = exports.Block = function () {
function Block() {
_classCallCheck(this, Block);
this.statements = [];
}
Block.prototype.push = function push(statement) {
this.statements.push(statement);
};
return Block;
}();
var InlineBlock = exports.InlineBlock = function (_Block) {
_inherits(InlineBlock, _Block);
function InlineBlock(table) {
_classCallCheck(this, InlineBlock);
var _this = _possibleConstructorReturn(this, _Block.call(this));
_this.table = table;
return _this;
}
InlineBlock.prototype.toJSON = function toJSON() {
return {
statements: this.statements,
parameters: this.table.slots
};
};
return InlineBlock;
}(Block);
var TemplateBlock = exports.TemplateBlock = function (_Block2) {
_inherits(TemplateBlock, _Block2);
function TemplateBlock(symbolTable) {
_classCallCheck(this, TemplateBlock);
var _this2 = _possibleConstructorReturn(this, _Block2.call(this));
_this2.symbolTable = symbolTable;
_this2.type = "template";
_this2.yields = new _util.DictSet();
_this2.named = new _util.DictSet();
_this2.blocks = [];
_this2.hasEval = false;
return _this2;
}
TemplateBlock.prototype.push = function push(statement) {
this.statements.push(statement);
};
TemplateBlock.prototype.toJSON = function toJSON() {
return {
symbols: this.symbolTable.symbols,
statements: this.statements,
hasEval: this.hasEval
};
};
return TemplateBlock;
}(Block);
var ComponentBlock = exports.ComponentBlock = function (_Block3) {
_inherits(ComponentBlock, _Block3);
function ComponentBlock(table) {
_classCallCheck(this, ComponentBlock);
var _this3 = _possibleConstructorReturn(this, _Block3.call(this));
_this3.table = table;
_this3.attributes = [];
_this3.arguments = [];
_this3.inParams = true;
_this3.positionals = [];
return _this3;
}
ComponentBlock.prototype.push = function 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);
}
};
ComponentBlock.prototype.toJSON = function toJSON() {
var args = this.arguments;
var keys = args.map(function (arg) {
return arg[1];
});
var values = args.map(function (arg) {
return arg[2];
});
return [this.attributes, [keys, values], {
statements: this.statements,
parameters: this.table.slots
}];
};
return ComponentBlock;
}(Block);
var Template = exports.Template = function () {
function Template(symbols, meta) {
_classCallCheck(this, Template);
this.meta = meta;
this.block = new TemplateBlock(symbols);
}
Template.prototype.toJSON = function toJSON() {
return {
block: this.block.toJSON(),
meta: this.meta
};
};
return Template;
}();
var JavaScriptCompiler = function () {
function JavaScriptCompiler(opcodes, symbols, meta) {
_classCallCheck(this, JavaScriptCompiler);
this.blocks = new _util.Stack();
this.values = [];
this.opcodes = opcodes;
this.template = new Template(symbols, meta);
}
JavaScriptCompiler.process = function process(opcodes, symbols, meta) {
var compiler = new JavaScriptCompiler(opcodes, symbols, meta);
return compiler.process();
};
JavaScriptCompiler.prototype.process = function process() {
var _this4 = this;
this.opcodes.forEach(function (_ref) {
var opcode = _ref[0],
args = _ref.slice(1);
if (!_this4[opcode]) {
throw new Error("unimplemented " + opcode + " on JavaScriptCompiler");
}
_this4[opcode].apply(_this4, args);
});
return this.template;
};
/// Nesting
JavaScriptCompiler.prototype.startBlock = function startBlock(_ref2) {
var program = _ref2[0];
var block = new InlineBlock(program['symbols']);
this.blocks.push(block);
};
JavaScriptCompiler.prototype.endBlock = function endBlock() {
var template = this.template,
blocks = this.blocks;
var block = blocks.pop();
template.block.blocks.push(block.toJSON());
};
JavaScriptCompiler.prototype.startProgram = function startProgram() {
this.blocks.push(this.template.block);
};
JavaScriptCompiler.prototype.endProgram = function endProgram() {};
/// Statements
JavaScriptCompiler.prototype.text = function text(content) {
this.push([_wireFormat.Ops.Text, content]);
};
JavaScriptCompiler.prototype.append = function append(trusted) {
this.push([_wireFormat.Ops.Append, this.popValue(), trusted]);
};
JavaScriptCompiler.prototype.comment = function comment(value) {
this.push([_wireFormat.Ops.Comment, value]);
};
JavaScriptCompiler.prototype.modifier = function modifier(name) {
var params = this.popValue();
var hash = this.popValue();
this.push([_wireFormat.Ops.Modifier, name, params, hash]);
};
JavaScriptCompiler.prototype.block = function block(name, template, inverse) {
var params = this.popValue();
var hash = this.popValue();
var 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]]);
};
JavaScriptCompiler.prototype.openElement = function openElement(element) {
var 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]);
}
};
JavaScriptCompiler.prototype.flushElement = function flushElement() {
this.push([_wireFormat.Ops.FlushElement]);
};
JavaScriptCompiler.prototype.closeElement = function closeElement(element) {
var tag = element.tag;
if (tag.indexOf('-') !== -1) {
var _endComponent = this.endComponent(),
attrs = _endComponent[0],
args = _endComponent[1],
block = _endComponent[2];
this.push([_wireFormat.Ops.Component, tag, attrs, args, block]);
} else {
this.push([_wireFormat.Ops.CloseElement]);
}
};
JavaScriptCompiler.prototype.staticAttr = function staticAttr(name, namespace) {
var value = this.popValue();
this.push([_wireFormat.Ops.StaticAttr, name, value, namespace]);
};
JavaScriptCompiler.prototype.dynamicAttr = function dynamicAttr(name, namespace) {
var value = this.popValue();
this.push([_wireFormat.Ops.DynamicAttr, name, value, namespace]);
};
JavaScriptCompiler.prototype.trustingAttr = function trustingAttr(name, namespace) {
var value = this.popValue();
this.push([_wireFormat.Ops.TrustingAttr, name, value, namespace]);
};
JavaScriptCompiler.prototype.staticArg = function staticArg(name) {
var value = this.popValue();
this.push([_wireFormat.Ops.StaticArg, name, value]);
};
JavaScriptCompiler.prototype.dynamicArg = function dynamicArg(name) {
var value = this.popValue();
this.push([_wireFormat.Ops.DynamicArg, name, value]);
};
JavaScriptCompiler.prototype.yield = function _yield(to) {
var params = this.popValue();
this.push([_wireFormat.Ops.Yield, to, params]);
};
JavaScriptCompiler.prototype.debugger = function _debugger(evalInfo) {
this.push([_wireFormat.Ops.Debugger, evalInfo]);
this.template.block.hasEval = true;
};
JavaScriptCompiler.prototype.hasBlock = function hasBlock(name) {
this.pushValue([_wireFormat.Ops.HasBlock, name]);
};
JavaScriptCompiler.prototype.hasBlockParams = function hasBlockParams(name) {
this.pushValue([_wireFormat.Ops.HasBlockParams, name]);
};
JavaScriptCompiler.prototype.partial = function partial(evalInfo) {
var params = this.popValue();
this.push([_wireFormat.Ops.Partial, params[0], evalInfo]);
this.template.block.hasEval = true;
};
/// Expressions
JavaScriptCompiler.prototype.literal = function literal(value) {
if (value === undefined) {
this.pushValue([_wireFormat.Ops.Undefined]);
} else {
this.pushValue(value);
}
};
JavaScriptCompiler.prototype.unknown = function unknown(name) {
this.pushValue([_wireFormat.Ops.Unknown, name]);
};
JavaScriptCompiler.prototype.get = function get(head, path) {
this.pushValue([_wireFormat.Ops.Get, head, path]);
};
JavaScriptCompiler.prototype.maybeLocal = function maybeLocal(path) {
this.pushValue([_wireFormat.Ops.MaybeLocal, path]);
};
JavaScriptCompiler.prototype.concat = function concat() {
this.pushValue([_wireFormat.Ops.Concat, this.popValue()]);
};
JavaScriptCompiler.prototype.helper = function helper(name) {
var params = this.popValue();
var hash = this.popValue();
this.pushValue([_wireFormat.Ops.Helper, name, params, hash]);
};
/// Stack Management Opcodes
JavaScriptCompiler.prototype.startComponent = function startComponent(element) {
var component = new ComponentBlock(element['symbols']);
this.blocks.push(component);
};
JavaScriptCompiler.prototype.endComponent = function endComponent() {
var component = this.blocks.pop();
(0, _util.assert)(component instanceof ComponentBlock, "Compiler bug: endComponent() should end a component");
return component.toJSON();
};
JavaScriptCompiler.prototype.prepareArray = function prepareArray(size) {
var values = [];
for (var i = 0; i < size; i++) {
values.push(this.popValue());
}
this.pushValue(values);
};
JavaScriptCompiler.prototype.prepareObject = function prepareObject(size) {
(0, _util.assert)(this.values.length >= size, "Expected " + size + " values on the stack, found " + this.values.length);
var keys = new Array(size);
var values = new Array(size);
for (var i = 0; i < size; i++) {
keys[i] = this.popValue();
values[i] = this.popValue();
}
this.pushValue([keys, values]);
};
/// Utilities
JavaScriptCompiler.prototype.push = function push(args) {
while (args[args.length - 1] === null) {
args.pop();
}
this.currentBlock.push(args);
};
JavaScriptCompiler.prototype.pushValue = function pushValue(val) {
this.values.push(val);
};
JavaScriptCompiler.prototype.popValue = function popValue() {
(0, _util.assert)(this.values.length, "No expression found on stack");
return this.values.pop();
};
_createClass(JavaScriptCompiler, [{
key: "currentBlock",
get: function () {
return this.blocks.current;
}
}]);
return JavaScriptCompiler;
}();
exports.default = JavaScriptCompiler;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9qYXZhc2NyaXB0LWNvbXBpbGVyLmpzIl0sIm5hbWVzIjpbImFzc2VydCIsIlN0YWNrIiwiRGljdFNldCIsIlN0YXRlbWVudHMiLCJPcHMiLCJCbG9jayIsInN0YXRlbWVudHMiLCJwdXNoIiwic3RhdGVtZW50IiwiSW5saW5lQmxvY2siLCJ0YWJsZSIsInRvSlNPTiIsInBhcmFtZXRlcnMiLCJzbG90cyIsIlRlbXBsYXRlQmxvY2siLCJzeW1ib2xUYWJsZSIsInR5cGUiLCJ5aWVsZHMiLCJuYW1lZCIsImJsb2NrcyIsImhhc0V2YWwiLCJzeW1ib2xzIiwiQ29tcG9uZW50QmxvY2siLCJhdHRyaWJ1dGVzIiwiYXJndW1lbnRzIiwiaW5QYXJhbXMiLCJwb3NpdGlvbmFscyIsImlzRmx1c2hFbGVtZW50IiwiaXNBcmd1bWVudCIsImlzQXR0cmlidXRlIiwiaXNNb2RpZmllciIsIkVycm9yIiwiYXJncyIsImtleXMiLCJtYXAiLCJhcmciLCJ2YWx1ZXMiLCJUZW1wbGF0ZSIsIm1ldGEiLCJibG9jayIsIkphdmFTY3JpcHRDb21waWxlciIsIm9wY29kZXMiLCJ0ZW1wbGF0ZSIsInByb2Nlc3MiLCJjb21waWxlciIsImZvckVhY2giLCJvcGNvZGUiLCJzdGFydEJsb2NrIiwicHJvZ3JhbSIsImVuZEJsb2NrIiwicG9wIiwic3RhcnRQcm9ncmFtIiwiZW5kUHJvZ3JhbSIsInRleHQiLCJjb250ZW50IiwiVGV4dCIsImFwcGVuZCIsInRydXN0ZWQiLCJBcHBlbmQiLCJwb3BWYWx1ZSIsImNvbW1lbnQiLCJ2YWx1ZSIsIkNvbW1lbnQiLCJtb2RpZmllciIsIm5hbWUiLCJwYXJhbXMiLCJoYXNoIiwiTW9kaWZpZXIiLCJpbnZlcnNlIiwib3BlbkVsZW1lbnQiLCJlbGVtZW50IiwidGFnIiwiaW5kZXhPZiIsInN0YXJ0Q29tcG9uZW50IiwiYmxvY2tQYXJhbXMiLCJsZW5ndGgiLCJPcGVuRWxlbWVudCIsImZsdXNoRWxlbWVudCIsIkZsdXNoRWxlbWVudCIsImNsb3NlRWxlbWVudCIsImVuZENvbXBvbmVudCIsImF0dHJzIiwiQ29tcG9uZW50IiwiQ2xvc2VFbGVtZW50Iiwic3RhdGljQXR0ciIsIm5hbWVzcGFjZSIsIlN0YXRpY0F0dHIiLCJkeW5hbWljQXR0ciIsIkR5bmFtaWNBdHRyIiwidHJ1c3RpbmdBdHRyIiwiVHJ1c3RpbmdBdHRyIiwic3RhdGljQXJnIiwiU3RhdGljQXJnIiwiZHluYW1pY0FyZyIsIkR5bmFtaWNBcmciLCJ5aWVsZCIsInRvIiwiWWllbGQiLCJkZWJ1Z2dlciIsImV2YWxJbmZvIiwiRGVidWdnZXIiLCJoYXNCbG9jayIsInB1c2hWYWx1ZSIsIkhhc0Jsb2NrIiwiaGFzQmxvY2tQYXJhbXMiLCJIYXNCbG9ja1BhcmFtcyIsInBhcnRpYWwiLCJQYXJ0aWFsIiwibGl0ZXJhbCIsInVuZGVmaW5lZCIsIlVuZGVmaW5lZCIsInVua25vd24iLCJVbmtub3duIiwiZ2V0IiwiaGVhZCIsInBhdGgiLCJHZXQiLCJtYXliZUxvY2FsIiwiTWF5YmVMb2NhbCIsImNvbmNhdCIsIkNvbmNhdCIsImhlbHBlciIsIkhlbHBlciIsImNvbXBvbmVudCIsInByZXBhcmVBcnJheSIsInNpemUiLCJpIiwicHJlcGFyZU9iamVjdCIsIkFycmF5IiwiY3VycmVudEJsb2NrIiwidmFsIiwiY3VycmVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLEFBQVMsQUFBYyxBQUN2QixBQUFTLEFBQU8sQUFBdUI7O0FBQ3ZDLEFBQVMsQUFBWSxBQUFXLEFBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLEFBQWEsb0NBQ1Q7cUJBQWM7OEJBQ1Y7O2FBQUEsQUFBSyxhQUFMLEFBQWtCLEFBQ3JCO0FBSEw7O29CQUFBLEFBSUkscUJBSkosQUFJUyxXQUFXLEFBQ1o7YUFBQSxBQUFLLFdBQUwsQUFBZ0IsS0FBaEIsQUFBcUIsQUFDeEI7QUFOTDs7V0FBQTtBQVFBO0lBQUEsQUFBYSxzREFBYjsyQkFDSTs7eUJBQUEsQUFBWSxPQUFPOzhCQUFBOztxREFDZixZQURlLEFBRWY7O2NBQUEsQUFBSyxRQUZVLEFBRWYsQUFBYTtlQUNoQjtBQUpMOzswQkFBQSxBQUtJLDJCQUFTLEFBQ0w7O3dCQUNnQixLQURULEFBQ2MsQUFDakI7d0JBQVksS0FBQSxBQUFLLE1BRnJCLEFBQU8sQUFFb0IsQUFFOUI7QUFKVSxBQUNIO0FBUFo7O1dBQUE7RUFBQSxBQUFpQyxBQVlqQztJQUFBLEFBQWEsMkRBQWI7NkJBQ0k7OzJCQUFBLEFBQVksYUFBYTs4QkFBQTs7c0RBQ3JCLGFBRHFCLEFBRXJCOztlQUFBLEFBQUssY0FBTCxBQUFtQixBQUNuQjtlQUFBLEFBQUssT0FBTCxBQUFZLEFBQ1o7ZUFBQSxBQUFLLFNBQUwsQUFBYyxBQUFJLEFBQ2xCO2VBQUEsQUFBSyxRQUFMLEFBQWEsQUFBSSxBQUNqQjtlQUFBLEFBQUssU0FBTCxBQUFjLEFBQ2Q7ZUFBQSxBQUFLLFVBUGdCLEFBT3JCLEFBQWU7ZUFDbEI7QUFUTDs7NEJBQUEsQUFVSSxxQkFWSixBQVVTLFdBQVcsQUFDWjthQUFBLEFBQUssV0FBTCxBQUFnQixLQUFoQixBQUFxQixBQUN4QjtBQVpMOzs0QkFBQSxBQWFJLDJCQUFTLEFBQ0w7O3FCQUNhLEtBQUEsQUFBSyxZQURYLEFBQ3VCLEFBQzFCO3dCQUFZLEtBRlQsQUFFYyxBQUNqQjtxQkFBUyxLQUhiLEFBQU8sQUFHVyxBQUVyQjtBQUxVLEFBQ0g7QUFmWjs7V0FBQTtFQUFBLEFBQW1DLEFBcUJuQztJQUFBLEFBQWEsNkRBQWI7OEJBQ0k7OzRCQUFBLEFBQVksT0FBTzs4QkFBQTs7c0RBQ2YsYUFEZSxBQUVmOztlQUFBLEFBQUssUUFBTCxBQUFhLEFBQ2I7ZUFBQSxBQUFLLGFBQUwsQUFBa0IsQUFDbEI7ZUFBQSxBQUFLLFlBQUwsQUFBaUIsQUFDakI7ZUFBQSxBQUFLLFdBQUwsQUFBZ0IsQUFDaEI7ZUFBQSxBQUFLLGNBTlUsQUFNZixBQUFtQjtlQUN0QjtBQVJMOzs2QkFBQSxBQVNJLHFCQVRKLEFBU1MsV0FBVyxBQUNaO1lBQUksS0FBSixBQUFTLFVBQVUsQUFDZjtnQkFBSSx1QkFBQSxBQUFXLGVBQWYsQUFBSSxBQUEwQixZQUFZLEFBQ3RDO3FCQUFBLEFBQUssV0FBTCxBQUFnQixBQUNuQjtBQUZELHVCQUVXLHVCQUFBLEFBQVcsV0FBZixBQUFJLEFBQXNCLFlBQVksQUFDekM7cUJBQUEsQUFBSyxVQUFMLEFBQWUsS0FBZixBQUFvQixBQUN2QjtBQUZNLGFBQUEsVUFFSSx1QkFBQSxBQUFXLFlBQWYsQUFBSSxBQUF1QixZQUFZLEFBQzFDO3FCQUFBLEFBQUssV0FBTCxBQUFnQixLQUFoQixBQUFxQixBQUN4QjtBQUZNLGFBQUEsVUFFSSx1QkFBQSxBQUFXLFdBQWYsQUFBSSxBQUFzQixZQUFZLEFBQ3pDO3NCQUFNLElBQUEsQUFBSSxNQUFWLEFBQU0sQUFBVSxBQUNuQjtBQUZNLGFBQUEsTUFFQSxBQUNIO3NCQUFNLElBQUEsQUFBSSxNQUFWLEFBQU0sQUFBVSxBQUNuQjtBQUNKO0FBWkQsZUFZTyxBQUNIO2lCQUFBLEFBQUssV0FBTCxBQUFnQixLQUFoQixBQUFxQixBQUN4QjtBQUNKO0FBekJMOzs2QkFBQSxBQTBCSSwyQkFBUyxBQUNMO1lBQUksT0FBTyxLQUFYLEFBQWdCLEFBQ2hCO1lBQUksWUFBTyxBQUFLLElBQUksZUFBQTttQkFBTyxJQUFQLEFBQU8sQUFBSTtBQUEvQixBQUFXLEFBQ1gsU0FEVztZQUNQLGNBQVMsQUFBSyxJQUFJLGVBQUE7bUJBQU8sSUFBUCxBQUFPLEFBQUk7QUFBakMsQUFBYSxBQUNiLFNBRGE7Z0JBQ0wsS0FBRCxBQUFNLFlBQVksQ0FBQSxBQUFDLE1BQW5CLEFBQWtCLEFBQU87d0JBQ2hCLEtBRHlCLEFBQ3BCLEFBQ2pCO3dCQUFZLEtBQUEsQUFBSyxNQUZyQixBQUFPLEFBQWtDLEFBRWQsQUFFOUI7QUFKNEMsQUFDckMsU0FERztBQTlCZjs7V0FBQTtFQUFBLEFBQW9DLEFBb0NwQztJQUFBLEFBQWEsMENBQ1Q7c0JBQUEsQUFBWSxTQUFaLEFBQXFCLE1BQU07OEJBQ3ZCOzthQUFBLEFBQUssT0FBTCxBQUFZLEFBQ1o7YUFBQSxBQUFLLFFBQVEsSUFBQSxBQUFJLGNBQWpCLEFBQWEsQUFBa0IsQUFDbEM7QUFKTDs7dUJBQUEsQUFLSSwyQkFBUyxBQUNMOzttQkFDVyxLQUFBLEFBQUssTUFEVCxBQUNJLEFBQVcsQUFDbEI7a0JBQU0sS0FGVixBQUFPLEFBRVEsQUFFbEI7QUFKVSxBQUNIO0FBUFo7O1dBQUE7OztJLEFBWXFCLGlDQUNqQjtnQ0FBQSxBQUFZLFNBQVosQUFBcUIsU0FBckIsQUFBOEIsTUFBTTs4QkFDaEM7O2FBQUEsQUFBSyxTQUFMLEFBQWMsQUFBSSxBQUNsQjthQUFBLEFBQUssU0FBTCxBQUFjLEFBQ2Q7YUFBQSxBQUFLLFVBQUwsQUFBZSxBQUNmO2FBQUEsQUFBSyxXQUFXLElBQUEsQUFBSSxTQUFKLEFBQWEsU0FBN0IsQUFBZ0IsQUFBc0IsQUFDekM7Ozt1QkFDTSxBLDJCLEFBQVEsUyxBQUFTLFMsQUFBUyxNQUFNLEFBQ25DO1lBQUksV0FBVyxJQUFBLEFBQUksbUJBQUosQUFBdUIsU0FBdkIsQUFBZ0MsU0FBL0MsQUFBZSxBQUF5QyxBQUN4RDtlQUFPLFNBQVAsQUFBTyxBQUFTLEFBQ25CO0E7O2lDQUlELEEsNkJBQVU7cUJBQ047O2FBQUEsQUFBSyxRQUFMLEFBQWEsUUFBUSxnQkFBdUI7Z0JBQXJCLEFBQXFCLGNBQUE7Z0JBQVYsQUFBVSxrQkFDeEM7O2dCQUFJLENBQUMsT0FBTCxBQUFLLEFBQUssU0FBUyxBQUNmO3NCQUFNLElBQUEsQUFBSSx5QkFBSixBQUEyQixTQUFqQyxBQUNIO0FBQ0Q7bUJBQUEsQUFBSyxzQkFBTCxBQUFnQixBQUNuQjtBQUxELEFBTUE7ZUFBTyxLQUFQLEFBQVksQUFDZjtBLEFBQ0Q7Ozs7aUMsQUFDQSx3Q0FBc0I7WUFBVixBQUFVLGdCQUNsQjs7WUFBSSxRQUFRLElBQUEsQUFBSSxZQUFZLFFBQTVCLEFBQVksQUFBZ0IsQUFBUSxBQUNwQzthQUFBLEFBQUssT0FBTCxBQUFZLEtBQVosQUFBaUIsQUFDcEI7QTs7aUMsQUFDRCwrQkFBVztZQUFBLEFBQ0QsV0FEQyxBQUNvQixLQURwQixBQUNEO1lBREMsQUFDUyxTQURULEFBQ29CLEtBRHBCLEFBQ1MsQUFDaEI7O1lBQUksUUFBUSxPQUFaLEFBQVksQUFBTyxBQUNuQjtpQkFBQSxBQUFTLE1BQVQsQUFBZSxPQUFmLEFBQXNCLEtBQUssTUFBM0IsQUFBMkIsQUFBTSxBQUNwQztBOztpQyxBQUNELHVDQUFlLEFBQ1g7YUFBQSxBQUFLLE9BQUwsQUFBWSxLQUFLLEtBQUEsQUFBSyxTQUF0QixBQUErQixBQUNsQztBOztpQyxBQUNELG1DQUFhLEFBQUUsQ0FDZixBOzs7O2lDLEFBQ0EscUIsQUFBSyxTQUFTLEFBQ1Y7YUFBQSxBQUFLLEtBQUssQ0FBQyxnQkFBRCxBQUFLLE1BQWYsQUFBVSxBQUFXLEFBQ3hCO0E7O2lDQUNELEEseUIsQUFBTyxTQUFTLEFBQ1o7YUFBQSxBQUFLLEtBQUssQ0FBQyxnQkFBRCxBQUFLLFFBQVEsS0FBYixBQUFhLEFBQUssWUFBNUIsQUFBVSxBQUE4QixBQUMzQztBOztpQ0FDRCxBLDJCQUFRLEEsT0FBTyxBQUNYO2FBQUEsQUFBSyxLQUFLLENBQUMsZ0JBQUQsQUFBSyxTQUFmLEFBQVUsQUFBYyxBQUMzQjtBOztpQ0FDRCxBLDZCQUFTLEEsTUFBTSxBQUNYO1lBQUksU0FBUyxLQUFiLEFBQWEsQUFBSyxBQUNsQjtZQUFJLE9BQU8sS0FBWCxBQUFXLEFBQUssQUFDaEI7YUFBQSxBQUFLLEtBQUssQ0FBQyxnQkFBRCxBQUFLLFVBQUwsQUFBZSxNQUFmLEFBQXFCLFFBQS9CLEFBQVUsQUFBNkIsQUFDMUM7QTs7aUNBQ0QsQSx1QixBQUFNLE0sQUFBTSxVQUFVLEEsU0FBUyxBQUMzQjtZQUFJLFNBQVMsS0FBYixBQUFhLEFBQUssQUFDbEI7WUFBSSxPQUFPLEtBQVgsQUFBVyxBQUFLLEFBQ2hCO1lBQUksU0FBUyxLQUFBLEFBQUssU0FBTCxBQUFjLE1BQTNCLEFBQWlDLEFBQ2pDOzBCQUFPLE9BQUEsQUFBTyxhQUFQLEFBQW9CLFlBQVksT0FBQSxBQUFPLGNBQTlDLEFBQTRELE1BQTVELEFBQWtFLEFBQ2xFOzBCQUFPLE9BQUEsQUFBTyxZQUFQLEFBQW1CLFlBQVksT0FBQSxBQUFPLGFBQTdDLEFBQTBELE1BQTFELEFBQWdFLEFBQ2hFO2FBQUEsQUFBSyxLQUFLLENBQUMsZ0JBQUQsQUFBSyxPQUFMLEFBQVksTUFBWixBQUFrQixRQUFsQixBQUEwQixNQUFNLE9BQWhDLEFBQWdDLEFBQU8sV0FBVyxPQUE1RCxBQUFVLEFBQWtELEFBQU8sQUFDdEU7QTs7aUMsQUFDRCxtQyxBQUFZLFNBQVMsQUFDakI7WUFBSSxNQUFNLFFBQVYsQUFBa0IsQUFDbEI7WUFBSSxJQUFBLEFBQUksUUFBSixBQUFZLFNBQVMsQ0FBekIsQUFBMEIsR0FBRyxBQUN6QjtpQkFBQSxBQUFLLGVBQUwsQUFBb0IsQUFDdkI7QUFGRCxtQkFFVyxRQUFBLEFBQVEsWUFBUixBQUFvQixTQUF4QixBQUFpQyxHQUFHLEFBQ3ZDO2tCQUFNLElBQUEsQUFBSSwyQkFBeUIsUUFBN0IsQUFBcUMsTUFBM0MsQUFDSDtBQUZNLFNBQUEsTUFFQSxBQUNIO2lCQUFBLEFBQUssS0FBSyxDQUFDLGdCQUFELEFBQUssYUFBZixBQUFVLEFBQWtCLEFBQy9CO0FBQ0o7QTs7aUMsQUFDRCx1Q0FBZSxBQUNYO2FBQUEsQUFBSyxLQUFLLENBQUMsZ0JBQVgsQUFBVSxBQUFLLEFBQ2xCO0E7O2lDLEFBQ0QscUNBQWEsQSxTQUFTLEFBQ2xCO1lBQUksTUFBTSxRQUFWLEFBQWtCLEFBQ2xCO1lBQUksSUFBQSxBQUFJLFFBQUosQUFBWSxTQUFTLENBQXpCLEFBQTBCLEdBQUc7Z0NBQ0UsS0FERixBQUNFLEFBQUs7Z0JBRFAsQUFDcEIsc0JBRG9CO2dCQUFBLEFBQ2IscUJBRGE7Z0JBQUEsQUFDUCxzQkFDbEI7O2lCQUFBLEFBQUssS0FBSyxDQUFDLGdCQUFELEFBQUssV0FBTCxBQUFnQixLQUFoQixBQUFxQixPQUFyQixBQUE0QixNQUF0QyxBQUFVLEFBQWtDLEFBQy9DO0FBSEQsZUFHTyxBQUNIO2lCQUFBLEFBQUssS0FBSyxDQUFDLGdCQUFYLEFBQVUsQUFBSyxBQUNsQjtBQUNKO0E7O2lDQUNELEEsaUMsQUFBVyxNLEFBQU0sV0FBVyxBQUN4QjtZQUFJLFFBQVEsS0FBWixBQUFZLEFBQUssQUFDakI7YUFBQSxBQUFLLEtBQUssQ0FBQyxnQkFBRCxBQUFLLFlBQUwsQUFBaUIsTUFBakIsQUFBdUIsT0FBakMsQUFBVSxBQUE4QixBQUMzQztBOztpQyxBQUNELG1DLEFBQVksTSxBQUFNLFdBQVcsQUFDekI7WUFBSSxRQUFRLEtBQVosQUFBWSxBQUFLLEFBQ2pCO2FBQUEsQUFBSyxLQUFLLENBQUMsZ0JBQUQsQUFBSyxhQUFMLEFBQWtCLE1BQWxCLEFBQXdCLE9BQWxDLEFBQVUsQUFBK0IsQUFDNUM7QTs7aUNBQ0QsQSxxQ0FBYSxBLE1BQU0sQSxXQUFXLEFBQzFCO1lBQUksUUFBUSxLQUFaLEFBQVksQUFBSyxBQUNqQjthQUFBLEFBQUssS0FBSyxDQUFDLGdCQUFELEFBQUssY0FBTCxBQUFtQixNQUFuQixBQUF5QixPQUFuQyxBQUFVLEFBQWdDLEFBQzdDO0E7O2lDLEFBQ0QsK0JBQVUsQSxNQUFNLEFBQ1o7WUFBSSxRQUFRLEtBQVosQUFBWSxBQUFLLEFBQ2pCO2FBQUEsQUFBSyxLQUFLLENBQUMsZ0JBQUQsQUFBSyxXQUFMLEFBQWdCLE1BQTFCLEFBQVUsQUFBc0IsQUFDbkM7QTs7aUNBQ0QsQSxpQyxBQUFXLE1BQU0sQUFDYjtZQUFJLFFBQVEsS0FBWixBQUFZLEFBQUssQUFDakI7YUFBQSxBQUFLLEtBQUssQ0FBQyxnQkFBRCxBQUFLLFlBQUwsQUFBaUIsTUFBM0IsQUFBVSxBQUF1QixBQUNwQztBOztpQ0FDRCxBLHdCQUFNLEEsSUFBSSxBQUNOO1lBQUksU0FBUyxLQUFiLEFBQWEsQUFBSyxBQUNsQjthQUFBLEFBQUssS0FBSyxDQUFDLGdCQUFELEFBQUssT0FBTCxBQUFZLElBQXRCLEFBQVUsQUFBZ0IsQUFDN0I7QTs7aUNBQ0QsQSw4QixBQUFTLFVBQVUsQUFDZjthQUFBLEFBQUssS0FBSyxDQUFDLGdCQUFELEFBQUssVUFBZixBQUFVLEFBQWUsQUFDekI7YUFBQSxBQUFLLFNBQUwsQUFBYyxNQUFkLEFBQW9CLFVBQXBCLEFBQThCLEFBQ2pDO0E7O2lDQUNELEEsNkJBQVMsQSxNQUFNLEFBQ1g7YUFBQSxBQUFLLFVBQVUsQ0FBQyxnQkFBRCxBQUFLLFVBQXBCLEFBQWUsQUFBZSxBQUNqQztBOztpQ0FDRCxBLHlDQUFlLEEsTUFBTSxBQUNqQjthQUFBLEFBQUssVUFBVSxDQUFDLGdCQUFELEFBQUssZ0JBQXBCLEFBQWUsQUFBcUIsQUFDdkM7QTs7aUNBQ0QsQSwyQkFBUSxBLFVBQVUsQUFDZDtZQUFJLFNBQVMsS0FBYixBQUFhLEFBQUssQUFDbEI7YUFBQSxBQUFLLEtBQUssQ0FBQyxnQkFBRCxBQUFLLFNBQVMsT0FBZCxBQUFjLEFBQU8sSUFBL0IsQUFBVSxBQUF5QixBQUNuQzthQUFBLEFBQUssU0FBTCxBQUFjLE1BQWQsQUFBb0IsVUFBcEIsQUFBOEIsQUFDakM7QUFDRCxBOzs7O2lDLEFBQ0EsMkIsQUFBUSxPQUFPLEFBQ1g7WUFBSSxVQUFKLEFBQWMsV0FBVyxBQUNyQjtpQkFBQSxBQUFLLFVBQVUsQ0FBQyxnQkFBaEIsQUFBZSxBQUFLLEFBQ3ZCO0FBRkQsZUFFTyxBQUNIO2lCQUFBLEFBQUssVUFBTCxBQUFlLEFBQ2xCO0FBQ0o7QTs7aUMsQUFDRCwyQkFBUSxBLE1BQU0sQUFDVjthQUFBLEFBQUssVUFBVSxDQUFDLGdCQUFELEFBQUssU0FBcEIsQUFBZSxBQUFjLEFBQ2hDO0E7O2lDLEFBQ0QsbUJBQUksQSxNLEFBQU0sTUFBTSxBQUNaO2FBQUEsQUFBSyxVQUFVLENBQUMsZ0JBQUQsQUFBSyxLQUFMLEFBQVUsTUFBekIsQUFBZSxBQUFnQixBQUNsQztBOztpQ0FDRCxBLGlDQUFXLEEsTUFBTSxBQUNiO2FBQUEsQUFBSyxVQUFVLENBQUMsZ0JBQUQsQUFBSyxZQUFwQixBQUFlLEFBQWlCLEFBQ25DO0E7O2lDLEFBQ0QsMkJBQVMsQUFDTDthQUFBLEFBQUssVUFBVSxDQUFDLGdCQUFELEFBQUssUUFBUSxLQUE1QixBQUFlLEFBQWEsQUFBSyxBQUNwQztBOztpQyxBQUNELHlCLEFBQU8sTUFBTSxBQUNUO1lBQUksU0FBUyxLQUFiLEFBQWEsQUFBSyxBQUNsQjtZQUFJLE9BQU8sS0FBWCxBQUFXLEFBQUssQUFDaEI7YUFBQSxBQUFLLFVBQVUsQ0FBQyxnQkFBRCxBQUFLLFFBQUwsQUFBYSxNQUFiLEFBQW1CLFFBQWxDLEFBQWUsQUFBMkIsQUFDN0M7QSxBQUNEOzs7O2lDQUNBLEEseUMsQUFBZSxTQUFTLEFBQ3BCO1lBQUksWUFBWSxJQUFBLEFBQUksZUFBZSxRQUFuQyxBQUFnQixBQUFtQixBQUFRLEFBQzNDO2FBQUEsQUFBSyxPQUFMLEFBQVksS0FBWixBQUFpQixBQUNwQjtBOztpQyxBQUNELHVDQUFlLEFBQ1g7WUFBSSxZQUFZLEtBQUEsQUFBSyxPQUFyQixBQUFnQixBQUFZLEFBQzVCOzBCQUFPLHFCQUFQLEFBQTRCLGdCQUE1QixBQUE0QyxBQUM1QztlQUFPLFVBQVAsQUFBTyxBQUFVLEFBQ3BCO0E7O2lDLEFBQ0QscUMsQUFBYSxNQUFNLEFBQ2Y7WUFBSSxTQUFKLEFBQWEsQUFDYjthQUFLLElBQUksSUFBVCxBQUFhLEdBQUcsSUFBaEIsQUFBb0IsTUFBcEIsQUFBMEIsS0FBSyxBQUMzQjttQkFBQSxBQUFPLEtBQUssS0FBWixBQUFZLEFBQUssQUFDcEI7QUFDRDthQUFBLEFBQUssVUFBTCxBQUFlLEFBQ2xCO0E7O2lDQUNELEEsdUNBQWMsQSxNQUFNLEFBQ2hCOzBCQUFPLEtBQUEsQUFBSyxPQUFMLEFBQVksVUFBbkIsQUFBNkIsb0JBQTdCLEFBQStDLHdDQUFtQyxLQUFBLEFBQUssT0FBdkYsQUFBOEYsQUFDOUY7WUFBSSxPQUFPLElBQUEsQUFBSSxNQUFmLEFBQVcsQUFBVSxBQUNyQjtZQUFJLFNBQVMsSUFBQSxBQUFJLE1BQWpCLEFBQWEsQUFBVSxBQUN2QjthQUFLLElBQUksSUFBVCxBQUFhLEdBQUcsSUFBaEIsQUFBb0IsTUFBcEIsQUFBMEIsS0FBSyxBQUMzQjtpQkFBQSxBQUFLLEtBQUssS0FBVixBQUFVLEFBQUssQUFDZjttQkFBQSxBQUFPLEtBQUssS0FBWixBQUFZLEFBQUssQUFDcEI7QUFDRDthQUFBLEFBQUssVUFBVSxDQUFBLEFBQUMsTUFBaEIsQUFBZSxBQUFPLEFBQ3pCO0EsQUFDRDs7OztpQ0FDQSxBLHFCQUFLLEEsTUFBTSxBQUNQO2VBQU8sS0FBSyxLQUFBLEFBQUssU0FBVixBQUFtQixPQUExQixBQUFpQyxNQUFNLEFBQ25DO2lCQUFBLEFBQUssQUFDUjtBQUNEO2FBQUEsQUFBSyxhQUFMLEFBQWtCLEtBQWxCLEFBQXVCLEFBQzFCO0E7O2lDQUNELEEsK0JBQVUsQSxLQUFLLEFBQ1g7YUFBQSxBQUFLLE9BQUwsQUFBWSxLQUFaLEFBQWlCLEFBQ3BCO0E7O2lDQUNELEEsK0JBQVcsQUFDUDswQkFBTyxLQUFBLEFBQUssT0FBWixBQUFtQixRQUFuQixBQUEyQixBQUMzQjtlQUFPLEtBQUEsQUFBSyxPQUFaLEFBQU8sQUFBWSxBQUN0QjtBOzs7O3lCQS9La0IsQUFDZjttQkFBYyxLQUFBLEFBQUssT0FBbkIsQUFBMEIsQUFDN0I7Ozs7Ozs7a0JBYmdCLEEiLCJmaWxlIjoibGliL2phdmFzY3JpcHQtY29tcGlsZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tIFwiQGdsaW1tZXIvdXRpbFwiO1xuaW1wb3J0IHsgU3RhY2ssIERpY3RTZXQsIGV4cGVjdCB9IGZyb20gXCJAZ2xpbW1lci91dGlsXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnRzLCBPcHMgfSBmcm9tICdAZ2xpbW1lci93aXJlLWZvcm1hdCc7XG5leHBvcnQgY2xhc3MgQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMgPSBbXTtcbiAgICB9XG4gICAgcHVzaChzdGF0ZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgSW5saW5lQmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiB0aGlzLnN0YXRlbWVudHMsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLnRhYmxlLnNsb3RzXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3Ioc3ltYm9sVGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zeW1ib2xUYWJsZSA9IHN5bWJvbFRhYmxlO1xuICAgICAgICB0aGlzLnR5cGUgPSBcInRlbXBsYXRlXCI7XG4gICAgICAgIHRoaXMueWllbGRzID0gbmV3IERpY3RTZXQoKTtcbiAgICAgICAgdGhpcy5uYW1lZCA9IG5ldyBEaWN0U2V0KCk7XG4gICAgICAgIHRoaXMuYmxvY2tzID0gW107XG4gICAgICAgIHRoaXMuaGFzRXZhbCA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoKHN0YXRlbWVudCkge1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzeW1ib2xzOiB0aGlzLnN5bWJvbFRhYmxlLnN5bWJvbHMsXG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiB0aGlzLnN0YXRlbWVudHMsXG4gICAgICAgICAgICBoYXNFdmFsOiB0aGlzLmhhc0V2YWxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29tcG9uZW50QmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5pblBhcmFtcyA9IHRydWU7XG4gICAgICAgIHRoaXMucG9zaXRpb25hbHMgPSBbXTtcbiAgICB9XG4gICAgcHVzaChzdGF0ZW1lbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5QYXJhbXMpIHtcbiAgICAgICAgICAgIGlmIChTdGF0ZW1lbnRzLmlzRmx1c2hFbGVtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluUGFyYW1zID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFN0YXRlbWVudHMuaXNBcmd1bWVudChzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmd1bWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChTdGF0ZW1lbnRzLmlzQXR0cmlidXRlKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChTdGF0ZW1lbnRzLmlzTW9kaWZpZXIoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcGlsZSBFcnJvcjogRWxlbWVudCBtb2RpZmllcnMgYXJlIG5vdCBhbGxvd2VkIGluIGNvbXBvbmVudHMnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21waWxlIEVycm9yOiBvbmx5IHBhcmFtZXRlcnMgYWxsb3dlZCBiZWZvcmUgZmx1c2gtZWxlbWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBhcmdzID0gdGhpcy5hcmd1bWVudHM7XG4gICAgICAgIGxldCBrZXlzID0gYXJncy5tYXAoYXJnID0+IGFyZ1sxXSk7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBhcmdzLm1hcChhcmcgPT4gYXJnWzJdKTtcbiAgICAgICAgcmV0dXJuIFt0aGlzLmF0dHJpYnV0ZXMsIFtrZXlzLCB2YWx1ZXNdLCB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiB0aGlzLnN0YXRlbWVudHMsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLnRhYmxlLnNsb3RzXG4gICAgICAgIH1dO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioc3ltYm9scywgbWV0YSkge1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgICAgICB0aGlzLmJsb2NrID0gbmV3IFRlbXBsYXRlQmxvY2soc3ltYm9scyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJsb2NrOiB0aGlzLmJsb2NrLnRvSlNPTigpLFxuICAgICAgICAgICAgbWV0YTogdGhpcy5tZXRhXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdENvbXBpbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcGNvZGVzLCBzeW1ib2xzLCBtZXRhKSB7XG4gICAgICAgIHRoaXMuYmxvY2tzID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMudmFsdWVzID0gW107XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IG9wY29kZXM7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoc3ltYm9scywgbWV0YSk7XG4gICAgfVxuICAgIHN0YXRpYyBwcm9jZXNzKG9wY29kZXMsIHN5bWJvbHMsIG1ldGEpIHtcbiAgICAgICAgbGV0IGNvbXBpbGVyID0gbmV3IEphdmFTY3JpcHRDb21waWxlcihvcGNvZGVzLCBzeW1ib2xzLCBtZXRhKTtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVyLnByb2Nlc3MoKTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRCbG9jaygpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdCh0aGlzLmJsb2Nrcy5jdXJyZW50LCAnRXhwZWN0ZWQgYSBibG9jayBvbiB0aGUgc3RhY2snKTtcbiAgICB9XG4gICAgcHJvY2VzcygpIHtcbiAgICAgICAgdGhpcy5vcGNvZGVzLmZvckVhY2goKFtvcGNvZGUsIC4uLmFyZ3NdKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXNbb3Bjb2RlXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5pbXBsZW1lbnRlZCAke29wY29kZX0gb24gSmF2YVNjcmlwdENvbXBpbGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzW29wY29kZV0oLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZTtcbiAgICB9XG4gICAgLy8vIE5lc3RpbmdcbiAgICBzdGFydEJsb2NrKFtwcm9ncmFtXSkge1xuICAgICAgICBsZXQgYmxvY2sgPSBuZXcgSW5saW5lQmxvY2socHJvZ3JhbVsnc3ltYm9scyddKTtcbiAgICAgICAgdGhpcy5ibG9ja3MucHVzaChibG9jayk7XG4gICAgfVxuICAgIGVuZEJsb2NrKCkge1xuICAgICAgICBsZXQgeyB0ZW1wbGF0ZSwgYmxvY2tzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgYmxvY2sgPSBibG9ja3MucG9wKCk7XG4gICAgICAgIHRlbXBsYXRlLmJsb2NrLmJsb2Nrcy5wdXNoKGJsb2NrLnRvSlNPTigpKTtcbiAgICB9XG4gICAgc3RhcnRQcm9ncmFtKCkge1xuICAgICAgICB0aGlzLmJsb2Nrcy5wdXNoKHRoaXMudGVtcGxhdGUuYmxvY2spO1xuICAgIH1cbiAgICBlbmRQcm9ncmFtKCkge31cbiAgICAvLy8gU3RhdGVtZW50c1xuICAgIHRleHQoY29udGVudCkge1xuICAgICAgICB0aGlzLnB1c2goW09wcy5UZXh0LCBjb250ZW50XSk7XG4gICAgfVxuICAgIGFwcGVuZCh0cnVzdGVkKSB7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLkFwcGVuZCwgdGhpcy5wb3BWYWx1ZSgpLCB0cnVzdGVkXSk7XG4gICAgfVxuICAgIGNvbW1lbnQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuQ29tbWVudCwgdmFsdWVdKTtcbiAgICB9XG4gICAgbW9kaWZpZXIobmFtZSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuTW9kaWZpZXIsIG5hbWUsIHBhcmFtcywgaGFzaF0pO1xuICAgIH1cbiAgICBibG9jayhuYW1lLCB0ZW1wbGF0ZSwgaW52ZXJzZSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgbGV0IGJsb2NrcyA9IHRoaXMudGVtcGxhdGUuYmxvY2suYmxvY2tzO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHRlbXBsYXRlICE9PSAnbnVtYmVyJyB8fCBibG9ja3NbdGVtcGxhdGVdICE9PSBudWxsLCAnbWlzc2luZyBibG9jayBpbiB0aGUgY29tcGlsZXInKTtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiBpbnZlcnNlICE9PSAnbnVtYmVyJyB8fCBibG9ja3NbaW52ZXJzZV0gIT09IG51bGwsICdtaXNzaW5nIGJsb2NrIGluIHRoZSBjb21waWxlcicpO1xuICAgICAgICB0aGlzLnB1c2goW09wcy5CbG9jaywgbmFtZSwgcGFyYW1zLCBoYXNoLCBibG9ja3NbdGVtcGxhdGVdLCBibG9ja3NbaW52ZXJzZV1dKTtcbiAgICB9XG4gICAgb3BlbkVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgdGFnID0gZWxlbWVudC50YWc7XG4gICAgICAgIGlmICh0YWcuaW5kZXhPZignLScpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbXBvbmVudChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmJsb2NrUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcGlsZSBFcnJvcjogPCR7ZWxlbWVudC50YWd9PiBpcyBub3QgYSBjb21wb25lbnQgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBibG9jayBwYXJhbWV0ZXJzYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goW09wcy5PcGVuRWxlbWVudCwgdGFnXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmx1c2hFbGVtZW50KCkge1xuICAgICAgICB0aGlzLnB1c2goW09wcy5GbHVzaEVsZW1lbnRdKTtcbiAgICB9XG4gICAgY2xvc2VFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHRhZyA9IGVsZW1lbnQudGFnO1xuICAgICAgICBpZiAodGFnLmluZGV4T2YoJy0nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBbYXR0cnMsIGFyZ3MsIGJsb2NrXSA9IHRoaXMuZW5kQ29tcG9uZW50KCk7XG4gICAgICAgICAgICB0aGlzLnB1c2goW09wcy5Db21wb25lbnQsIHRhZywgYXR0cnMsIGFyZ3MsIGJsb2NrXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goW09wcy5DbG9zZUVsZW1lbnRdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWNBdHRyKG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLlN0YXRpY0F0dHIsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2VdKTtcbiAgICB9XG4gICAgZHluYW1pY0F0dHIobmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRHluYW1pY0F0dHIsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2VdKTtcbiAgICB9XG4gICAgdHJ1c3RpbmdBdHRyKG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLlRydXN0aW5nQXR0ciwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZV0pO1xuICAgIH1cbiAgICBzdGF0aWNBcmcobmFtZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLlN0YXRpY0FyZywgbmFtZSwgdmFsdWVdKTtcbiAgICB9XG4gICAgZHluYW1pY0FyZyhuYW1lKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRHluYW1pY0FyZywgbmFtZSwgdmFsdWVdKTtcbiAgICB9XG4gICAgeWllbGQodG8pIHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuWWllbGQsIHRvLCBwYXJhbXNdKTtcbiAgICB9XG4gICAgZGVidWdnZXIoZXZhbEluZm8pIHtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRGVidWdnZXIsIGV2YWxJbmZvXSk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUuYmxvY2suaGFzRXZhbCA9IHRydWU7XG4gICAgfVxuICAgIGhhc0Jsb2NrKG5hbWUpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5IYXNCbG9jaywgbmFtZV0pO1xuICAgIH1cbiAgICBoYXNCbG9ja1BhcmFtcyhuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuSGFzQmxvY2tQYXJhbXMsIG5hbWVdKTtcbiAgICB9XG4gICAgcGFydGlhbChldmFsSW5mbykge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICB0aGlzLnB1c2goW09wcy5QYXJ0aWFsLCBwYXJhbXNbMF0sIGV2YWxJbmZvXSk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUuYmxvY2suaGFzRXZhbCA9IHRydWU7XG4gICAgfVxuICAgIC8vLyBFeHByZXNzaW9uc1xuICAgIGxpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuVW5kZWZpbmVkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdW5rbm93bihuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuVW5rbm93biwgbmFtZV0pO1xuICAgIH1cbiAgICBnZXQoaGVhZCwgcGF0aCkge1xuICAgICAgICB0aGlzLnB1c2hWYWx1ZShbT3BzLkdldCwgaGVhZCwgcGF0aF0pO1xuICAgIH1cbiAgICBtYXliZUxvY2FsKHBhdGgpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5NYXliZUxvY2FsLCBwYXRoXSk7XG4gICAgfVxuICAgIGNvbmNhdCgpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5Db25jYXQsIHRoaXMucG9wVmFsdWUoKV0pO1xuICAgIH1cbiAgICBoZWxwZXIobmFtZSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5IZWxwZXIsIG5hbWUsIHBhcmFtcywgaGFzaF0pO1xuICAgIH1cbiAgICAvLy8gU3RhY2sgTWFuYWdlbWVudCBPcGNvZGVzXG4gICAgc3RhcnRDb21wb25lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudEJsb2NrKGVsZW1lbnRbJ3N5bWJvbHMnXSk7XG4gICAgICAgIHRoaXMuYmxvY2tzLnB1c2goY29tcG9uZW50KTtcbiAgICB9XG4gICAgZW5kQ29tcG9uZW50KCkge1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5ibG9ja3MucG9wKCk7XG4gICAgICAgIGFzc2VydChjb21wb25lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRCbG9jaywgXCJDb21waWxlciBidWc6IGVuZENvbXBvbmVudCgpIHNob3VsZCBlbmQgYSBjb21wb25lbnRcIik7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudG9KU09OKCk7XG4gICAgfVxuICAgIHByZXBhcmVBcnJheShzaXplKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHRoaXMucG9wVmFsdWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoVmFsdWUodmFsdWVzKTtcbiAgICB9XG4gICAgcHJlcGFyZU9iamVjdChzaXplKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLnZhbHVlcy5sZW5ndGggPj0gc2l6ZSwgYEV4cGVjdGVkICR7c2l6ZX0gdmFsdWVzIG9uIHRoZSBzdGFjaywgZm91bmQgJHt0aGlzLnZhbHVlcy5sZW5ndGh9YCk7XG4gICAgICAgIGxldCBrZXlzID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgICBsZXQgdmFsdWVzID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAga2V5c1tpXSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hWYWx1ZShba2V5cywgdmFsdWVzXSk7XG4gICAgfVxuICAgIC8vLyBVdGlsaXRpZXNcbiAgICBwdXNoKGFyZ3MpIHtcbiAgICAgICAgd2hpbGUgKGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRCbG9jay5wdXNoKGFyZ3MpO1xuICAgIH1cbiAgICBwdXNoVmFsdWUodmFsKSB7XG4gICAgICAgIHRoaXMudmFsdWVzLnB1c2godmFsKTtcbiAgICB9XG4gICAgcG9wVmFsdWUoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLnZhbHVlcy5sZW5ndGgsIFwiTm8gZXhwcmVzc2lvbiBmb3VuZCBvbiBzdGFja1wiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzLnBvcCgpO1xuICAgIH1cbn0iXX0=