ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
289 lines (249 loc) • 28.8 kB
JavaScript
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import { CompiledDynamicTemplate } from './compiled/blocks';
import { Ops } from '@glimmer/wire-format';
import { Register, debugSlice } from './opcodes';
import { ATTRS_BLOCK, compileStatement } from './syntax/functions';
import * as ClientSide from './syntax/client-side';
import { expr } from './syntax/functions';
import OpcodeBuilderDSL from './compiled/opcodes/builder';
export function compileLayout(compilable, env) {
var builder = new ComponentLayoutBuilder(env);
compilable.compile(builder);
return builder.compile();
}
var ComponentLayoutBuilder = function () {
function ComponentLayoutBuilder(env) {
_classCallCheck(this, ComponentLayoutBuilder);
this.env = env;
}
ComponentLayoutBuilder.prototype.wrapLayout = function wrapLayout(layout) {
this.inner = new WrappedBuilder(this.env, layout);
};
ComponentLayoutBuilder.prototype.fromLayout = function fromLayout(componentName, layout) {
this.inner = new UnwrappedBuilder(this.env, componentName, layout);
};
ComponentLayoutBuilder.prototype.compile = function compile() {
return this.inner.compile();
};
_createClass(ComponentLayoutBuilder, [{
key: 'tag',
get: function () {
return this.inner.tag;
}
}, {
key: 'attrs',
get: function () {
return this.inner.attrs;
}
}]);
return ComponentLayoutBuilder;
}();
var WrappedBuilder = function () {
function WrappedBuilder(env, layout) {
_classCallCheck(this, WrappedBuilder);
this.env = env;
this.layout = layout;
this.tag = new ComponentTagBuilder();
this.attrs = new ComponentAttrsBuilder();
}
WrappedBuilder.prototype.compile = function compile() {
//========DYNAMIC
// PutValue(TagExpr)
// Test
// JumpUnless(BODY)
// OpenDynamicPrimitiveElement
// DidCreateElement
// ...attr statements...
// FlushElement
// BODY: Noop
// ...body statements...
// PutValue(TagExpr)
// Test
// JumpUnless(END)
// CloseElement
// END: Noop
// DidRenderLayout
// Exit
//
//========STATIC
// OpenPrimitiveElementOpcode
// DidCreateElement
// ...attr statements...
// FlushElement
// ...body statements...
// CloseElement
// DidRenderLayout
// Exit
var env = this.env,
layout = this.layout;
var meta = { templateMeta: layout.meta, symbols: layout.symbols, asPartial: false };
var dynamicTag = this.tag.getDynamic();
var staticTag = this.tag.getStatic();
var b = builder(env, meta);
b.startLabels();
if (dynamicTag) {
b.fetch(Register.s1);
expr(dynamicTag, b);
b.dup();
b.load(Register.s1);
b.test('simple');
b.jumpUnless('BODY');
b.fetch(Register.s1);
b.pushComponentOperations();
b.openDynamicElement();
} else if (staticTag) {
b.pushComponentOperations();
b.openElementWithOperations(staticTag);
}
if (dynamicTag || staticTag) {
b.didCreateElement(Register.s0);
var attrs = this.attrs.buffer;
for (var i = 0; i < attrs.length; i++) {
compileStatement(attrs[i], b);
}
b.flushElement();
}
b.label('BODY');
b.invokeStatic(layout.asBlock());
if (dynamicTag) {
b.fetch(Register.s1);
b.test('simple');
b.jumpUnless('END');
b.closeElement();
} else if (staticTag) {
b.closeElement();
}
b.label('END');
b.didRenderLayout(Register.s0);
if (dynamicTag) {
b.load(Register.s1);
}
b.stopLabels();
var start = b.start;
var end = b.finalize();
if (false) {
debugSlice(env, env.program.heap.getaddr(start), env.program.heap.getaddr(end));
}
return new CompiledDynamicTemplate(start, {
meta: meta,
hasEval: layout.hasEval,
symbols: layout.symbols.concat([ATTRS_BLOCK])
});
};
return WrappedBuilder;
}();
var UnwrappedBuilder = function () {
function UnwrappedBuilder(env, componentName, layout) {
_classCallCheck(this, UnwrappedBuilder);
this.env = env;
this.componentName = componentName;
this.layout = layout;
this.attrs = new ComponentAttrsBuilder();
}
UnwrappedBuilder.prototype.compile = function compile() {
var env = this.env,
layout = this.layout;
return layout.asLayout(this.componentName, this.attrs.buffer).compileDynamic(env);
};
_createClass(UnwrappedBuilder, [{
key: 'tag',
get: function () {
throw new Error('BUG: Cannot call `tag` on an UnwrappedBuilder');
}
}]);
return UnwrappedBuilder;
}();
var ComponentTagBuilder = function () {
function ComponentTagBuilder() {
_classCallCheck(this, ComponentTagBuilder);
this.isDynamic = null;
this.isStatic = null;
this.staticTagName = null;
this.dynamicTagName = null;
}
ComponentTagBuilder.prototype.getDynamic = function getDynamic() {
if (this.isDynamic) {
return this.dynamicTagName;
}
};
ComponentTagBuilder.prototype.getStatic = function getStatic() {
if (this.isStatic) {
return this.staticTagName;
}
};
ComponentTagBuilder.prototype.static = function _static(tagName) {
this.isStatic = true;
this.staticTagName = tagName;
};
ComponentTagBuilder.prototype.dynamic = function dynamic(tagName) {
this.isDynamic = true;
this.dynamicTagName = [Ops.ClientSideExpression, ClientSide.Ops.FunctionExpression, tagName];
};
return ComponentTagBuilder;
}();
var ComponentAttrsBuilder = function () {
function ComponentAttrsBuilder() {
_classCallCheck(this, ComponentAttrsBuilder);
this.buffer = [];
}
ComponentAttrsBuilder.prototype.static = function _static(name, value) {
this.buffer.push([Ops.StaticAttr, name, value, null]);
};
ComponentAttrsBuilder.prototype.dynamic = function dynamic(name, value) {
this.buffer.push([Ops.DynamicAttr, name, [Ops.ClientSideExpression, ClientSide.Ops.FunctionExpression, value], null]);
};
return ComponentAttrsBuilder;
}();
export var ComponentBuilder = function () {
function ComponentBuilder(builder) {
_classCallCheck(this, ComponentBuilder);
this.builder = builder;
this.env = builder.env;
}
ComponentBuilder.prototype.static = function _static(definition, args) {
var params = args[0],
hash = args[1],
_default = args[2],
inverse = args[3];
var builder = this.builder;
builder.pushComponentManager(definition);
builder.invokeComponent(null, params, hash, _default, inverse);
};
ComponentBuilder.prototype.dynamic = function dynamic(definitionArgs, getDefinition, args) {
var params = args[0],
hash = args[1],
block = args[2],
inverse = args[3];
var builder = this.builder;
if (!definitionArgs || definitionArgs.length === 0) {
throw new Error("Dynamic syntax without an argument");
}
var meta = this.builder.meta.templateMeta;
function helper(vm, a) {
return getDefinition(vm, a, meta);
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
builder.compileArgs(definitionArgs[0], definitionArgs[1], true);
builder.helper(helper);
builder.dup();
builder.test('simple');
builder.enter(2);
builder.jumpUnless('ELSE');
builder.pushDynamicComponentManager();
builder.invokeComponent(null, params, hash, block, inverse);
builder.label('ELSE');
builder.exit();
builder.return();
builder.label('END');
builder.popFrame();
builder.stopLabels();
};
return ComponentBuilder;
}();
export function builder(env, meta) {
return new OpcodeBuilderDSL(env, meta);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlci5qcyJdLCJuYW1lcyI6WyJDb21waWxlZER5bmFtaWNUZW1wbGF0ZSIsIk9wcyIsIlJlZ2lzdGVyIiwiZGVidWdTbGljZSIsIkFUVFJTX0JMT0NLIiwiY29tcGlsZVN0YXRlbWVudCIsIkNsaWVudFNpZGUiLCJleHByIiwiT3Bjb2RlQnVpbGRlckRTTCIsImNvbXBpbGVMYXlvdXQiLCJjb21waWxhYmxlIiwiZW52IiwiYnVpbGRlciIsIkNvbXBvbmVudExheW91dEJ1aWxkZXIiLCJjb21waWxlIiwid3JhcExheW91dCIsImxheW91dCIsImlubmVyIiwiV3JhcHBlZEJ1aWxkZXIiLCJmcm9tTGF5b3V0IiwiY29tcG9uZW50TmFtZSIsIlVud3JhcHBlZEJ1aWxkZXIiLCJ0YWciLCJhdHRycyIsIkNvbXBvbmVudFRhZ0J1aWxkZXIiLCJDb21wb25lbnRBdHRyc0J1aWxkZXIiLCJtZXRhIiwidGVtcGxhdGVNZXRhIiwic3ltYm9scyIsImFzUGFydGlhbCIsImR5bmFtaWNUYWciLCJnZXREeW5hbWljIiwic3RhdGljVGFnIiwiZ2V0U3RhdGljIiwiYiIsInN0YXJ0TGFiZWxzIiwiZmV0Y2giLCJzMSIsImR1cCIsImxvYWQiLCJ0ZXN0IiwianVtcFVubGVzcyIsInB1c2hDb21wb25lbnRPcGVyYXRpb25zIiwib3BlbkR5bmFtaWNFbGVtZW50Iiwib3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucyIsImRpZENyZWF0ZUVsZW1lbnQiLCJzMCIsImJ1ZmZlciIsImkiLCJsZW5ndGgiLCJmbHVzaEVsZW1lbnQiLCJsYWJlbCIsImludm9rZVN0YXRpYyIsImFzQmxvY2siLCJjbG9zZUVsZW1lbnQiLCJkaWRSZW5kZXJMYXlvdXQiLCJzdG9wTGFiZWxzIiwic3RhcnQiLCJlbmQiLCJmaW5hbGl6ZSIsInByb2dyYW0iLCJoZWFwIiwiZ2V0YWRkciIsImhhc0V2YWwiLCJjb25jYXQiLCJhc0xheW91dCIsImNvbXBpbGVEeW5hbWljIiwiRXJyb3IiLCJpc0R5bmFtaWMiLCJpc1N0YXRpYyIsInN0YXRpY1RhZ05hbWUiLCJkeW5hbWljVGFnTmFtZSIsInN0YXRpYyIsInRhZ05hbWUiLCJkeW5hbWljIiwiQ2xpZW50U2lkZUV4cHJlc3Npb24iLCJGdW5jdGlvbkV4cHJlc3Npb24iLCJuYW1lIiwidmFsdWUiLCJwdXNoIiwiU3RhdGljQXR0ciIsIkR5bmFtaWNBdHRyIiwiQ29tcG9uZW50QnVpbGRlciIsImRlZmluaXRpb24iLCJhcmdzIiwicGFyYW1zIiwiaGFzaCIsIl9kZWZhdWx0IiwiaW52ZXJzZSIsInB1c2hDb21wb25lbnRNYW5hZ2VyIiwiaW52b2tlQ29tcG9uZW50IiwiZGVmaW5pdGlvbkFyZ3MiLCJnZXREZWZpbml0aW9uIiwiYmxvY2siLCJoZWxwZXIiLCJ2bSIsImEiLCJwdXNoRnJhbWUiLCJyZXR1cm5UbyIsImNvbXBpbGVBcmdzIiwiZW50ZXIiLCJwdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXIiLCJleGl0IiwicmV0dXJuIiwicG9wRnJhbWUiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxTQUFTQSx1QkFBVCxRQUF3QyxtQkFBeEM7QUFDQSxTQUFTQyxHQUFULFFBQW9CLHNCQUFwQjtBQUNBLFNBQVNDLFFBQVQsRUFBbUJDLFVBQW5CLFFBQXFDLFdBQXJDO0FBQ0EsU0FBU0MsV0FBVCxFQUFzQkMsZ0JBQXRCLFFBQThDLG9CQUE5QztBQUNBLE9BQU8sS0FBS0MsVUFBWixNQUE0QixzQkFBNUI7QUFDQSxTQUFTQyxJQUFULFFBQXFCLG9CQUFyQjtBQUNBLE9BQU9DLGdCQUFQLE1BQTZCLDRCQUE3Qjs7QUFFQSxPQUFPLFNBQVNDLGFBQVQsQ0FBdUJDLFVBQXZCLEVBQW1DQyxHQUFuQyxFQUF3QztBQUMzQyxRQUFJQyxVQUFVLElBQUlDLHNCQUFKLENBQTJCRixHQUEzQixDQUFkO0FBQ0FELGVBQVdJLE9BQVgsQ0FBbUJGLE9BQW5CO0FBQ0EsV0FBT0EsUUFBUUUsT0FBUixFQUFQO0FBQ0g7O0lBQ0tELHNCO0FBQ0Ysb0NBQVlGLEdBQVosRUFBaUI7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NUYsZ0JBQVE0QyxVQUFSO0FBQ0gsS0F0Q0w7O0FBQUE7QUFBQTtBQXdDQSxPQUFPLFNBQVM1QyxPQUFULENBQWlCRCxHQUFqQixFQUFzQmUsSUFBdEIsRUFBNEI7QUFDL0IsV0FBTyxJQUFJbEIsZ0JBQUosQ0FBcUJHLEdBQXJCLEVBQTBCZSxJQUExQixDQUFQO0FBQ0giLCJmaWxlIjoibGliL2NvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGlsZWREeW5hbWljVGVtcGxhdGUgfSBmcm9tICcuL2NvbXBpbGVkL2Jsb2Nrcyc7XG5pbXBvcnQgeyBPcHMgfSBmcm9tICdAZ2xpbW1lci93aXJlLWZvcm1hdCc7XG5pbXBvcnQgeyBSZWdpc3RlciwgZGVidWdTbGljZSB9IGZyb20gJy4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBBVFRSU19CTE9DSywgY29tcGlsZVN0YXRlbWVudCB9IGZyb20gJy4vc3ludGF4L2Z1bmN0aW9ucyc7XG5pbXBvcnQgKiBhcyBDbGllbnRTaWRlIGZyb20gJy4vc3ludGF4L2NsaWVudC1zaWRlJztcbmltcG9ydCB7IGV4cHIgfSBmcm9tICcuL3N5bnRheC9mdW5jdGlvbnMnO1xuaW1wb3J0IE9wY29kZUJ1aWxkZXJEU0wgZnJvbSAnLi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZUxheW91dChjb21waWxhYmxlLCBlbnYpIHtcbiAgICBsZXQgYnVpbGRlciA9IG5ldyBDb21wb25lbnRMYXlvdXRCdWlsZGVyKGVudik7XG4gICAgY29tcGlsYWJsZS5jb21waWxlKGJ1aWxkZXIpO1xuICAgIHJldHVybiBidWlsZGVyLmNvbXBpbGUoKTtcbn1cbmNsYXNzIENvbXBvbmVudExheW91dEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGVudikge1xuICAgICAgICB0aGlzLmVudiA9IGVudjtcbiAgICB9XG4gICAgd3JhcExheW91dChsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBXcmFwcGVkQnVpbGRlcih0aGlzLmVudiwgbGF5b3V0KTtcbiAgICB9XG4gICAgZnJvbUxheW91dChjb21wb25lbnROYW1lLCBsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBVbndyYXBwZWRCdWlsZGVyKHRoaXMuZW52LCBjb21wb25lbnROYW1lLCBsYXlvdXQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lci5jb21waWxlKCk7XG4gICAgfVxuICAgIGdldCB0YWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlubmVyLnRhZztcbiAgICB9XG4gICAgZ2V0IGF0dHJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lci5hdHRycztcbiAgICB9XG59XG5jbGFzcyBXcmFwcGVkQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoZW52LCBsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgICAgICB0aGlzLnRhZyA9IG5ldyBDb21wb25lbnRUYWdCdWlsZGVyKCk7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBuZXcgQ29tcG9uZW50QXR0cnNCdWlsZGVyKCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIC8vPT09PT09PT1EWU5BTUlDXG4gICAgICAgIC8vICAgICAgICBQdXRWYWx1ZShUYWdFeHByKVxuICAgICAgICAvLyAgICAgICAgVGVzdFxuICAgICAgICAvLyAgICAgICAgSnVtcFVubGVzcyhCT0RZKVxuICAgICAgICAvLyAgICAgICAgT3BlbkR5bmFtaWNQcmltaXRpdmVFbGVtZW50XG4gICAgICAgIC8vICAgICAgICBEaWRDcmVhdGVFbGVtZW50XG4gICAgICAgIC8vICAgICAgICAuLi5hdHRyIHN0YXRlbWVudHMuLi5cbiAgICAgICAgLy8gICAgICAgIEZsdXNoRWxlbWVudFxuICAgICAgICAvLyBCT0RZOiAgTm9vcFxuICAgICAgICAvLyAgICAgICAgLi4uYm9keSBzdGF0ZW1lbnRzLi4uXG4gICAgICAgIC8vICAgICAgICBQdXRWYWx1ZShUYWdFeHByKVxuICAgICAgICAvLyAgICAgICAgVGVzdFxuICAgICAgICAvLyAgICAgICAgSnVtcFVubGVzcyhFTkQpXG4gICAgICAgIC8vICAgICAgICBDbG9zZUVsZW1lbnRcbiAgICAgICAgLy8gRU5EOiAgIE5vb3BcbiAgICAgICAgLy8gICAgICAgIERpZFJlbmRlckxheW91dFxuICAgICAgICAvLyAgICAgICAgRXhpdFxuICAgICAgICAvL1xuICAgICAgICAvLz09PT09PT09U1RBVElDXG4gICAgICAgIC8vICAgICAgICBPcGVuUHJpbWl0aXZlRWxlbWVudE9wY29kZVxuICAgICAgICAvLyAgICAgICAgRGlkQ3JlYXRlRWxlbWVudFxuICAgICAgICAvLyAgICAgICAgLi4uYXR0ciBzdGF0ZW1lbnRzLi4uXG4gICAgICAgIC8vICAgICAgICBGbHVzaEVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgIC4uLmJvZHkgc3RhdGVtZW50cy4uLlxuICAgICAgICAvLyAgICAgICAgQ2xvc2VFbGVtZW50XG4gICAgICAgIC8vICAgICAgICBEaWRSZW5kZXJMYXlvdXRcbiAgICAgICAgLy8gICAgICAgIEV4aXRcbiAgICAgICAgbGV0IHsgZW52LCBsYXlvdXQgfSA9IHRoaXM7XG4gICAgICAgIGxldCBtZXRhID0geyB0ZW1wbGF0ZU1ldGE6IGxheW91dC5tZXRhLCBzeW1ib2xzOiBsYXlvdXQuc3ltYm9scywgYXNQYXJ0aWFsOiBmYWxzZSB9O1xuICAgICAgICBsZXQgZHluYW1pY1RhZyA9IHRoaXMudGFnLmdldER5bmFtaWMoKTtcbiAgICAgICAgbGV0IHN0YXRpY1RhZyA9IHRoaXMudGFnLmdldFN0YXRpYygpO1xuICAgICAgICBsZXQgYiA9IGJ1aWxkZXIoZW52LCBtZXRhKTtcbiAgICAgICAgYi5zdGFydExhYmVscygpO1xuICAgICAgICBpZiAoZHluYW1pY1RhZykge1xuICAgICAgICAgICAgYi5mZXRjaChSZWdpc3Rlci5zMSk7XG4gICAgICAgICAgICBleHByKGR5bmFtaWNUYWcsIGIpO1xuICAgICAgICAgICAgYi5kdXAoKTtcbiAgICAgICAgICAgIGIubG9hZChSZWdpc3Rlci5zMSk7XG4gICAgICAgICAgICBiLnRlc3QoJ3NpbXBsZScpO1xuICAgICAgICAgICAgYi5qdW1wVW5sZXNzKCdCT0RZJyk7XG4gICAgICAgICAgICBiLmZldGNoKFJlZ2lzdGVyLnMxKTtcbiAgICAgICAgICAgIGIucHVzaENvbXBvbmVudE9wZXJhdGlvbnMoKTtcbiAgICAgICAgICAgIGIub3BlbkR5bmFtaWNFbGVtZW50KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGljVGFnKSB7XG4gICAgICAgICAgICBiLnB1c2hDb21wb25lbnRPcGVyYXRpb25zKCk7XG4gICAgICAgICAgICBiLm9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMoc3RhdGljVGFnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHluYW1pY1RhZyB8fCBzdGF0aWNUYWcpIHtcbiAgICAgICAgICAgIGIuZGlkQ3JlYXRlRWxlbWVudChSZWdpc3Rlci5zMCk7XG4gICAgICAgICAgICBsZXQgYXR0cnMgPSB0aGlzLmF0dHJzLmJ1ZmZlcjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb21waWxlU3RhdGVtZW50KGF0dHJzW2ldLCBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIuZmx1c2hFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgYi5sYWJlbCgnQk9EWScpO1xuICAgICAgICBiLmludm9rZVN0YXRpYyhsYXlvdXQuYXNCbG9jaygpKTtcbiAgICAgICAgaWYgKGR5bmFtaWNUYWcpIHtcbiAgICAgICAgICAgIGIuZmV0Y2goUmVnaXN0ZXIuczEpO1xuICAgICAgICAgICAgYi50ZXN0KCdzaW1wbGUnKTtcbiAgICAgICAgICAgIGIuanVtcFVubGVzcygnRU5EJyk7XG4gICAgICAgICAgICBiLmNsb3NlRWxlbWVudCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRpY1RhZykge1xuICAgICAgICAgICAgYi5jbG9zZUVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBiLmxhYmVsKCdFTkQnKTtcbiAgICAgICAgYi5kaWRSZW5kZXJMYXlvdXQoUmVnaXN0ZXIuczApO1xuICAgICAgICBpZiAoZHluYW1pY1RhZykge1xuICAgICAgICAgICAgYi5sb2FkKFJlZ2lzdGVyLnMxKTtcbiAgICAgICAgfVxuICAgICAgICBiLnN0b3BMYWJlbHMoKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gYi5zdGFydDtcbiAgICAgICAgbGV0IGVuZCA9IGIuZmluYWxpemUoKTtcbiAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBkZWJ1Z1NsaWNlKGVudiwgZW52LnByb2dyYW0uaGVhcC5nZXRhZGRyKHN0YXJ0KSwgZW52LnByb2dyYW0uaGVhcC5nZXRhZGRyKGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29tcGlsZWREeW5hbWljVGVtcGxhdGUoc3RhcnQsIHtcbiAgICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgICBoYXNFdmFsOiBsYXlvdXQuaGFzRXZhbCxcbiAgICAgICAgICAgIHN5bWJvbHM6IGxheW91dC5zeW1ib2xzLmNvbmNhdChbQVRUUlNfQkxPQ0tdKVxuICAgICAgICB9KTtcbiAgICB9XG59XG5jbGFzcyBVbndyYXBwZWRCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYsIGNvbXBvbmVudE5hbWUsIGxheW91dCkge1xuICAgICAgICB0aGlzLmVudiA9IGVudjtcbiAgICAgICAgdGhpcy5jb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBuZXcgQ29tcG9uZW50QXR0cnNCdWlsZGVyKCk7XG4gICAgfVxuICAgIGdldCB0YWcoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQlVHOiBDYW5ub3QgY2FsbCBgdGFnYCBvbiBhbiBVbndyYXBwZWRCdWlsZGVyJyk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIGxldCB7IGVudiwgbGF5b3V0IH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gbGF5b3V0LmFzTGF5b3V0KHRoaXMuY29tcG9uZW50TmFtZSwgdGhpcy5hdHRycy5idWZmZXIpLmNvbXBpbGVEeW5hbWljKGVudik7XG4gICAgfVxufVxuY2xhc3MgQ29tcG9uZW50VGFnQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNEeW5hbWljID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc1N0YXRpYyA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGljVGFnTmFtZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZHluYW1pY1RhZ05hbWUgPSBudWxsO1xuICAgIH1cbiAgICBnZXREeW5hbWljKCkge1xuICAgICAgICBpZiAodGhpcy5pc0R5bmFtaWMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmR5bmFtaWNUYWdOYW1lO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFN0YXRpYygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRpY1RhZ05hbWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljKHRhZ05hbWUpIHtcbiAgICAgICAgdGhpcy5pc1N0YXRpYyA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhdGljVGFnTmFtZSA9IHRhZ05hbWU7XG4gICAgfVxuICAgIGR5bmFtaWModGFnTmFtZSkge1xuICAgICAgICB0aGlzLmlzRHluYW1pYyA9IHRydWU7XG4gICAgICAgIHRoaXMuZHluYW1pY1RhZ05hbWUgPSBbT3BzLkNsaWVudFNpZGVFeHByZXNzaW9uLCBDbGllbnRTaWRlLk9wcy5GdW5jdGlvbkV4cHJlc3Npb24sIHRhZ05hbWVdO1xuICAgIH1cbn1cbmNsYXNzIENvbXBvbmVudEF0dHJzQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgfVxuICAgIHN0YXRpYyhuYW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKFtPcHMuU3RhdGljQXR0ciwgbmFtZSwgdmFsdWUsIG51bGxdKTtcbiAgICB9XG4gICAgZHluYW1pYyhuYW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKFtPcHMuRHluYW1pY0F0dHIsIG5hbWUsIFtPcHMuQ2xpZW50U2lkZUV4cHJlc3Npb24sIENsaWVudFNpZGUuT3BzLkZ1bmN0aW9uRXhwcmVzc2lvbiwgdmFsdWVdLCBudWxsXSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGJ1aWxkZXIpIHtcbiAgICAgICAgdGhpcy5idWlsZGVyID0gYnVpbGRlcjtcbiAgICAgICAgdGhpcy5lbnYgPSBidWlsZGVyLmVudjtcbiAgICB9XG4gICAgc3RhdGljKGRlZmluaXRpb24sIGFyZ3MpIHtcbiAgICAgICAgbGV0IFtwYXJhbXMsIGhhc2gsIF9kZWZhdWx0LCBpbnZlcnNlXSA9IGFyZ3M7XG4gICAgICAgIGxldCB7IGJ1aWxkZXIgfSA9IHRoaXM7XG4gICAgICAgIGJ1aWxkZXIucHVzaENvbXBvbmVudE1hbmFnZXIoZGVmaW5pdGlvbik7XG4gICAgICAgIGJ1aWxkZXIuaW52b2tlQ29tcG9uZW50KG51bGwsIHBhcmFtcywgaGFzaCwgX2RlZmF1bHQsIGludmVyc2UpO1xuICAgIH1cbiAgICBkeW5hbWljKGRlZmluaXRpb25BcmdzLCBnZXREZWZpbml0aW9uLCBhcmdzKSB7XG4gICAgICAgIGxldCBbcGFyYW1zLCBoYXNoLCBibG9jaywgaW52ZXJzZV0gPSBhcmdzO1xuICAgICAgICBsZXQgeyBidWlsZGVyIH0gPSB0aGlzO1xuICAgICAgICBpZiAoIWRlZmluaXRpb25BcmdzIHx8IGRlZmluaXRpb25BcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHluYW1pYyBzeW50YXggd2l0aG91dCBhbiBhcmd1bWVudFwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWV0YSA9IHRoaXMuYnVpbGRlci5tZXRhLnRlbXBsYXRlTWV0YTtcbiAgICAgICAgZnVuY3Rpb24gaGVscGVyKHZtLCBhKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0RGVmaW5pdGlvbih2bSwgYSwgbWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci5zdGFydExhYmVscygpO1xuICAgICAgICBidWlsZGVyLnB1c2hGcmFtZSgpO1xuICAgICAgICBidWlsZGVyLnJldHVyblRvKCdFTkQnKTtcbiAgICAgICAgYnVpbGRlci5jb21waWxlQXJncyhkZWZpbml0aW9uQXJnc1swXSwgZGVmaW5pdGlvbkFyZ3NbMV0sIHRydWUpO1xuICAgICAgICBidWlsZGVyLmhlbHBlcihoZWxwZXIpO1xuICAgICAgICBidWlsZGVyLmR1cCgpO1xuICAgICAgICBidWlsZGVyLnRlc3QoJ3NpbXBsZScpO1xuICAgICAgICBidWlsZGVyLmVudGVyKDIpO1xuICAgICAgICBidWlsZGVyLmp1bXBVbmxlc3MoJ0VMU0UnKTtcbiAgICAgICAgYnVpbGRlci5wdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXIoKTtcbiAgICAgICAgYnVpbGRlci5pbnZva2VDb21wb25lbnQobnVsbCwgcGFyYW1zLCBoYXNoLCBibG9jaywgaW52ZXJzZSk7XG4gICAgICAgIGJ1aWxkZXIubGFiZWwoJ0VMU0UnKTtcbiAgICAgICAgYnVpbGRlci5leGl0KCk7XG4gICAgICAgIGJ1aWxkZXIucmV0dXJuKCk7XG4gICAgICAgIGJ1aWxkZXIubGFiZWwoJ0VORCcpO1xuICAgICAgICBidWlsZGVyLnBvcEZyYW1lKCk7XG4gICAgICAgIGJ1aWxkZXIuc3RvcExhYmVscygpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBidWlsZGVyKGVudiwgbWV0YSkge1xuICAgIHJldHVybiBuZXcgT3Bjb2RlQnVpbGRlckRTTChlbnYsIG1ldGEpO1xufSJdfQ==