ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
242 lines (230 loc) • 26.4 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ComponentBuilder = undefined;
exports.compileLayout = compileLayout;
exports.builder = builder;
var _blocks = require('./compiled/blocks');
var _wireFormat = require('@glimmer/wire-format');
var _opcodes = require('./opcodes');
var _functions = require('./syntax/functions');
var _clientSide = require('./syntax/client-side');
var ClientSide = _interopRequireWildcard(_clientSide);
var _builder = require('./compiled/opcodes/builder');
var _builder2 = _interopRequireDefault(_builder);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function compileLayout(compilable, env) {
let builder = new ComponentLayoutBuilder(env);
compilable.compile(builder);
return builder.compile();
}
class ComponentLayoutBuilder {
constructor(env) {
this.env = env;
}
wrapLayout(layout) {
this.inner = new WrappedBuilder(this.env, layout);
}
fromLayout(componentName, layout) {
this.inner = new UnwrappedBuilder(this.env, componentName, layout);
}
compile() {
return this.inner.compile();
}
get tag() {
return this.inner.tag;
}
get attrs() {
return this.inner.attrs;
}
}
class WrappedBuilder {
constructor(env, layout) {
this.env = env;
this.layout = layout;
this.tag = new ComponentTagBuilder();
this.attrs = new ComponentAttrsBuilder();
}
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
let { env, layout } = this;
let meta = { templateMeta: layout.meta, symbols: layout.symbols, asPartial: false };
let dynamicTag = this.tag.getDynamic();
let staticTag = this.tag.getStatic();
let b = builder(env, meta);
b.startLabels();
if (dynamicTag) {
b.fetch(_opcodes.Register.s1);
(0, _functions.expr)(dynamicTag, b);
b.dup();
b.load(_opcodes.Register.s1);
b.test('simple');
b.jumpUnless('BODY');
b.fetch(_opcodes.Register.s1);
b.pushComponentOperations();
b.openDynamicElement();
} else if (staticTag) {
b.pushComponentOperations();
b.openElementWithOperations(staticTag);
}
if (dynamicTag || staticTag) {
b.didCreateElement(_opcodes.Register.s0);
let attrs = this.attrs.buffer;
for (let i = 0; i < attrs.length; i++) {
(0, _functions.compileStatement)(attrs[i], b);
}
b.flushElement();
}
b.label('BODY');
b.invokeStatic(layout.asBlock());
if (dynamicTag) {
b.fetch(_opcodes.Register.s1);
b.test('simple');
b.jumpUnless('END');
b.closeElement();
} else if (staticTag) {
b.closeElement();
}
b.label('END');
b.didRenderLayout(_opcodes.Register.s0);
if (dynamicTag) {
b.load(_opcodes.Register.s1);
}
b.stopLabels();
let start = b.start;
let end = b.finalize();
if (false) {
(0, _opcodes.debugSlice)(env, env.program.heap.getaddr(start), env.program.heap.getaddr(end));
}
return new _blocks.CompiledDynamicTemplate(start, {
meta,
hasEval: layout.hasEval,
symbols: layout.symbols.concat([_functions.ATTRS_BLOCK])
});
}
}
class UnwrappedBuilder {
constructor(env, componentName, layout) {
this.env = env;
this.componentName = componentName;
this.layout = layout;
this.attrs = new ComponentAttrsBuilder();
}
get tag() {
throw new Error('BUG: Cannot call `tag` on an UnwrappedBuilder');
}
compile() {
let { env, layout } = this;
return layout.asLayout(this.componentName, this.attrs.buffer).compileDynamic(env);
}
}
class ComponentTagBuilder {
constructor() {
this.isDynamic = null;
this.isStatic = null;
this.staticTagName = null;
this.dynamicTagName = null;
}
getDynamic() {
if (this.isDynamic) {
return this.dynamicTagName;
}
}
getStatic() {
if (this.isStatic) {
return this.staticTagName;
}
}
static(tagName) {
this.isStatic = true;
this.staticTagName = tagName;
}
dynamic(tagName) {
this.isDynamic = true;
this.dynamicTagName = [_wireFormat.Ops.ClientSideExpression, ClientSide.Ops.FunctionExpression, tagName];
}
}
class ComponentAttrsBuilder {
constructor() {
this.buffer = [];
}
static(name, value) {
this.buffer.push([_wireFormat.Ops.StaticAttr, name, value, null]);
}
dynamic(name, value) {
this.buffer.push([_wireFormat.Ops.DynamicAttr, name, [_wireFormat.Ops.ClientSideExpression, ClientSide.Ops.FunctionExpression, value], null]);
}
}
class ComponentBuilder {
constructor(builder) {
this.builder = builder;
this.env = builder.env;
}
static(definition, args) {
let [params, hash, _default, inverse] = args;
let { builder } = this;
builder.pushComponentManager(definition);
builder.invokeComponent(null, params, hash, _default, inverse);
}
dynamic(definitionArgs, getDefinition, args) {
let [params, hash, block, inverse] = args;
let { builder } = this;
if (!definitionArgs || definitionArgs.length === 0) {
throw new Error("Dynamic syntax without an argument");
}
let 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();
}
}
exports.ComponentBuilder = ComponentBuilder;
function builder(env, meta) {
return new _builder2.default(env, meta);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlci5qcyJdLCJuYW1lcyI6WyJjb21waWxlTGF5b3V0IiwiYnVpbGRlciIsIkNsaWVudFNpZGUiLCJjb21waWxhYmxlIiwiZW52IiwiQ29tcG9uZW50TGF5b3V0QnVpbGRlciIsImNvbXBpbGUiLCJjb25zdHJ1Y3RvciIsIndyYXBMYXlvdXQiLCJsYXlvdXQiLCJpbm5lciIsIldyYXBwZWRCdWlsZGVyIiwiZnJvbUxheW91dCIsImNvbXBvbmVudE5hbWUiLCJVbndyYXBwZWRCdWlsZGVyIiwidGFnIiwiYXR0cnMiLCJDb21wb25lbnRUYWdCdWlsZGVyIiwiQ29tcG9uZW50QXR0cnNCdWlsZGVyIiwibWV0YSIsInRlbXBsYXRlTWV0YSIsInN5bWJvbHMiLCJhc1BhcnRpYWwiLCJkeW5hbWljVGFnIiwiZ2V0RHluYW1pYyIsInN0YXRpY1RhZyIsImdldFN0YXRpYyIsImIiLCJzdGFydExhYmVscyIsImZldGNoIiwiczEiLCJkdXAiLCJsb2FkIiwidGVzdCIsImp1bXBVbmxlc3MiLCJwdXNoQ29tcG9uZW50T3BlcmF0aW9ucyIsIm9wZW5EeW5hbWljRWxlbWVudCIsIm9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMiLCJkaWRDcmVhdGVFbGVtZW50IiwiczAiLCJidWZmZXIiLCJpIiwibGVuZ3RoIiwiZmx1c2hFbGVtZW50IiwibGFiZWwiLCJpbnZva2VTdGF0aWMiLCJhc0Jsb2NrIiwiY2xvc2VFbGVtZW50IiwiZGlkUmVuZGVyTGF5b3V0Iiwic3RvcExhYmVscyIsInN0YXJ0IiwiZW5kIiwiZmluYWxpemUiLCJwcm9ncmFtIiwiaGVhcCIsImdldGFkZHIiLCJoYXNFdmFsIiwiY29uY2F0IiwiRXJyb3IiLCJhc0xheW91dCIsImNvbXBpbGVEeW5hbWljIiwiaXNEeW5hbWljIiwiaXNTdGF0aWMiLCJzdGF0aWNUYWdOYW1lIiwiZHluYW1pY1RhZ05hbWUiLCJzdGF0aWMiLCJ0YWdOYW1lIiwiZHluYW1pYyIsIkNsaWVudFNpZGVFeHByZXNzaW9uIiwiT3BzIiwiRnVuY3Rpb25FeHByZXNzaW9uIiwibmFtZSIsInZhbHVlIiwicHVzaCIsIlN0YXRpY0F0dHIiLCJEeW5hbWljQXR0ciIsIkNvbXBvbmVudEJ1aWxkZXIiLCJkZWZpbml0aW9uIiwiYXJncyIsInBhcmFtcyIsImhhc2giLCJfZGVmYXVsdCIsImludmVyc2UiLCJwdXNoQ29tcG9uZW50TWFuYWdlciIsImludm9rZUNvbXBvbmVudCIsImRlZmluaXRpb25BcmdzIiwiZ2V0RGVmaW5pdGlvbiIsImJsb2NrIiwiaGVscGVyIiwidm0iLCJhIiwicHVzaEZyYW1lIiwicmV0dXJuVG8iLCJjb21waWxlQXJncyIsImVudGVyIiwicHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyIiwiZXhpdCIsInJldHVybiIsInBvcEZyYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7UUFRZ0JBLGEsR0FBQUEsYTtRQWdOQUMsTyxHQUFBQSxPOztBQXhOaEI7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0lBQVlDLFU7O0FBRVo7Ozs7Ozs7O0FBRU8sU0FBU0YsYUFBVCxDQUF1QkcsVUFBdkIsRUFBbUNDLEdBQW5DLEVBQXdDO0FBQzNDLFFBQUlILFVBQVUsSUFBSUksc0JBQUosQ0FBMkJELEdBQTNCLENBQWQ7QUFDQUQsZUFBV0csT0FBWCxDQUFtQkwsT0FBbkI7QUFDQSxXQUFPQSxRQUFRSyxPQUFSLEVBQVA7QUFDSDtBQUNELE1BQU1ELHNCQUFOLENBQTZCO0FBQ3pCRSxnQkFBWUgsR0FBWixFQUFpQjtBQUNiLGFBQUtBLEdBQUwsR0FBV0EsR0FBWDtBQUNIO0FBQ0RJLGVBQVdDLE1BQVgsRUFBbUI7QUFDZixhQUFLQyxLQUFMLEdBQWEsSUFBSUMsY0FBSixDQUFtQixLQUFLUCxHQUF4QixFQUE2QkssTUFBN0IsQ0FBYjtBQUNIO0FBQ0RHLGVBQVdDLGFBQVgsRUFBMEJKLE1BQTFCLEVBQWtDO0FBQzlCLGFBQUtDLEtBQUwsR0FBYSxJQUFJSSxnQkFBSixDQUFxQixLQUFLVixHQUExQixFQUErQlMsYUFBL0IsRUFB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QUFRNEYsV0FBUixDQUFvQlIsZUFBZSxDQUFmLENBQXBCLEVBQXVDQSxlQUFlLENBQWYsQ0FBdkMsRUFBMEQsSUFBMUQ7QUFDQXBGLGdCQUFRdUYsTUFBUixDQUFlQSxNQUFmO0FBQ0F2RixnQkFBUThCLEdBQVI7QUFDQTlCLGdCQUFRZ0MsSUFBUixDQUFhLFFBQWI7QUFDQWhDLGdCQUFRNkYsS0FBUixDQUFjLENBQWQ7QUFDQTdGLGdCQUFRaUMsVUFBUixDQUFtQixNQUFuQjtBQUNBakMsZ0JBQVE4RiwyQkFBUjtBQUNBOUYsZ0JBQVFtRixlQUFSLENBQXdCLElBQXhCLEVBQThCTCxNQUE5QixFQUFzQ0MsSUFBdEMsRUFBNENPLEtBQTVDLEVBQW1ETCxPQUFuRDtBQUNBakYsZ0JBQVEyQyxLQUFSLENBQWMsTUFBZDtBQUNBM0MsZ0JBQVErRixJQUFSO0FBQ0EvRixnQkFBUWdHLE1BQVI7QUFDQWhHLGdCQUFRMkMsS0FBUixDQUFjLEtBQWQ7QUFDQTNDLGdCQUFRaUcsUUFBUjtBQUNBakcsZ0JBQVFnRCxVQUFSO0FBQ0g7QUF0Q3lCO1FBQWpCMkIsZ0IsR0FBQUEsZ0I7QUF3Q04sU0FBUzNFLE9BQVQsQ0FBaUJHLEdBQWpCLEVBQXNCZSxJQUF0QixFQUE0QjtBQUMvQixXQUFPLHNCQUFxQmYsR0FBckIsRUFBMEJlLElBQTFCLENBQVA7QUFDSCIsImZpbGUiOiJsaWIvY29tcGlsZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21waWxlZER5bmFtaWNUZW1wbGF0ZSB9IGZyb20gJy4vY29tcGlsZWQvYmxvY2tzJztcbmltcG9ydCB7IE9wcyB9IGZyb20gJ0BnbGltbWVyL3dpcmUtZm9ybWF0JztcbmltcG9ydCB7IFJlZ2lzdGVyLCBkZWJ1Z1NsaWNlIH0gZnJvbSAnLi9vcGNvZGVzJztcbmltcG9ydCB7IEFUVFJTX0JMT0NLLCBjb21waWxlU3RhdGVtZW50IH0gZnJvbSAnLi9zeW50YXgvZnVuY3Rpb25zJztcbmltcG9ydCAqIGFzIENsaWVudFNpZGUgZnJvbSAnLi9zeW50YXgvY2xpZW50LXNpZGUnO1xuaW1wb3J0IHsgZXhwciB9IGZyb20gJy4vc3ludGF4L2Z1bmN0aW9ucyc7XG5pbXBvcnQgT3Bjb2RlQnVpbGRlckRTTCBmcm9tICcuL2NvbXBpbGVkL29wY29kZXMvYnVpbGRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlTGF5b3V0KGNvbXBpbGFibGUsIGVudikge1xuICAgIGxldCBidWlsZGVyID0gbmV3IENvbXBvbmVudExheW91dEJ1aWxkZXIoZW52KTtcbiAgICBjb21waWxhYmxlLmNvbXBpbGUoYnVpbGRlcik7XG4gICAgcmV0dXJuIGJ1aWxkZXIuY29tcGlsZSgpO1xufVxuY2xhc3MgQ29tcG9uZW50TGF5b3V0QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoZW52KSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgIH1cbiAgICB3cmFwTGF5b3V0KGxheW91dCkge1xuICAgICAgICB0aGlzLmlubmVyID0gbmV3IFdyYXBwZWRCdWlsZGVyKHRoaXMuZW52LCBsYXlvdXQpO1xuICAgIH1cbiAgICBmcm9tTGF5b3V0KGNvbXBvbmVudE5hbWUsIGxheW91dCkge1xuICAgICAgICB0aGlzLmlubmVyID0gbmV3IFVud3JhcHBlZEJ1aWxkZXIodGhpcy5lbnYsIGNvbXBvbmVudE5hbWUsIGxheW91dCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlubmVyLmNvbXBpbGUoKTtcbiAgICB9XG4gICAgZ2V0IHRhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXIudGFnO1xuICAgIH1cbiAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlubmVyLmF0dHJzO1xuICAgIH1cbn1cbmNsYXNzIFdyYXBwZWRCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYsIGxheW91dCkge1xuICAgICAgICB0aGlzLmVudiA9IGVudjtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMudGFnID0gbmV3IENvbXBvbmVudFRhZ0J1aWxkZXIoKTtcbiAgICAgICAgdGhpcy5hdHRycyA9IG5ldyBDb21wb25lbnRBdHRyc0J1aWxkZXIoKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgLy89PT09PT09PURZTkFNSUNcbiAgICAgICAgLy8gICAgICAgIFB1dFZhbHVlKFRhZ0V4cHIpXG4gICAgICAgIC8vICAgICAgICBUZXN0XG4gICAgICAgIC8vICAgICAgICBKdW1wVW5sZXNzKEJPRFkpXG4gICAgICAgIC8vICAgICAgICBPcGVuRHluYW1pY1ByaW1pdGl2ZUVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgIERpZENyZWF0ZUVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgIC4uLmF0dHIgc3RhdGVtZW50cy4uLlxuICAgICAgICAvLyAgICAgICAgRmx1c2hFbGVtZW50XG4gICAgICAgIC8vIEJPRFk6ICBOb29wXG4gICAgICAgIC8vICAgICAgICAuLi5ib2R5IHN0YXRlbWVudHMuLi5cbiAgICAgICAgLy8gICAgICAgIFB1dFZhbHVlKFRhZ0V4cHIpXG4gICAgICAgIC8vICAgICAgICBUZXN0XG4gICAgICAgIC8vICAgICAgICBKdW1wVW5sZXNzKEVORClcbiAgICAgICAgLy8gICAgICAgIENsb3NlRWxlbWVudFxuICAgICAgICAvLyBFTkQ6ICAgTm9vcFxuICAgICAgICAvLyAgICAgICAgRGlkUmVuZGVyTGF5b3V0XG4gICAgICAgIC8vICAgICAgICBFeGl0XG4gICAgICAgIC8vXG4gICAgICAgIC8vPT09PT09PT1TVEFUSUNcbiAgICAgICAgLy8gICAgICAgIE9wZW5QcmltaXRpdmVFbGVtZW50T3Bjb2RlXG4gICAgICAgIC8vICAgICAgICBEaWRDcmVhdGVFbGVtZW50XG4gICAgICAgIC8vICAgICAgICAuLi5hdHRyIHN0YXRlbWVudHMuLi5cbiAgICAgICAgLy8gICAgICAgIEZsdXNoRWxlbWVudFxuICAgICAgICAvLyAgICAgICAgLi4uYm9keSBzdGF0ZW1lbnRzLi4uXG4gICAgICAgIC8vICAgICAgICBDbG9zZUVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgIERpZFJlbmRlckxheW91dFxuICAgICAgICAvLyAgICAgICAgRXhpdFxuICAgICAgICBsZXQgeyBlbnYsIGxheW91dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IG1ldGEgPSB7IHRlbXBsYXRlTWV0YTogbGF5b3V0Lm1ldGEsIHN5bWJvbHM6IGxheW91dC5zeW1ib2xzLCBhc1BhcnRpYWw6IGZhbHNlIH07XG4gICAgICAgIGxldCBkeW5hbWljVGFnID0gdGhpcy50YWcuZ2V0RHluYW1pYygpO1xuICAgICAgICBsZXQgc3RhdGljVGFnID0gdGhpcy50YWcuZ2V0U3RhdGljKCk7XG4gICAgICAgIGxldCBiID0gYnVpbGRlcihlbnYsIG1ldGEpO1xuICAgICAgICBiLnN0YXJ0TGFiZWxzKCk7XG4gICAgICAgIGlmIChkeW5hbWljVGFnKSB7XG4gICAgICAgICAgICBiLmZldGNoKFJlZ2lzdGVyLnMxKTtcbiAgICAgICAgICAgIGV4cHIoZHluYW1pY1RhZywgYik7XG4gICAgICAgICAgICBiLmR1cCgpO1xuICAgICAgICAgICAgYi5sb2FkKFJlZ2lzdGVyLnMxKTtcbiAgICAgICAgICAgIGIudGVzdCgnc2ltcGxlJyk7XG4gICAgICAgICAgICBiLmp1bXBVbmxlc3MoJ0JPRFknKTtcbiAgICAgICAgICAgIGIuZmV0Y2goUmVnaXN0ZXIuczEpO1xuICAgICAgICAgICAgYi5wdXNoQ29tcG9uZW50T3BlcmF0aW9ucygpO1xuICAgICAgICAgICAgYi5vcGVuRHluYW1pY0VsZW1lbnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0aWNUYWcpIHtcbiAgICAgICAgICAgIGIucHVzaENvbXBvbmVudE9wZXJhdGlvbnMoKTtcbiAgICAgICAgICAgIGIub3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucyhzdGF0aWNUYWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkeW5hbWljVGFnIHx8IHN0YXRpY1RhZykge1xuICAgICAgICAgICAgYi5kaWRDcmVhdGVFbGVtZW50KFJlZ2lzdGVyLnMwKTtcbiAgICAgICAgICAgIGxldCBhdHRycyA9IHRoaXMuYXR0cnMuYnVmZmVyO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbXBpbGVTdGF0ZW1lbnQoYXR0cnNbaV0sIGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYi5mbHVzaEVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBiLmxhYmVsKCdCT0RZJyk7XG4gICAgICAgIGIuaW52b2tlU3RhdGljKGxheW91dC5hc0Jsb2NrKCkpO1xuICAgICAgICBpZiAoZHluYW1pY1RhZykge1xuICAgICAgICAgICAgYi5mZXRjaChSZWdpc3Rlci5zMSk7XG4gICAgICAgICAgICBiLnRlc3QoJ3NpbXBsZScpO1xuICAgICAgICAgICAgYi5qdW1wVW5sZXNzKCdFTkQnKTtcbiAgICAgICAgICAgIGIuY2xvc2VFbGVtZW50KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGljVGFnKSB7XG4gICAgICAgICAgICBiLmNsb3NlRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGIubGFiZWwoJ0VORCcpO1xuICAgICAgICBiLmRpZFJlbmRlckxheW91dChSZWdpc3Rlci5zMCk7XG4gICAgICAgIGlmIChkeW5hbWljVGFnKSB7XG4gICAgICAgICAgICBiLmxvYWQoUmVnaXN0ZXIuczEpO1xuICAgICAgICB9XG4gICAgICAgIGIuc3RvcExhYmVscygpO1xuICAgICAgICBsZXQgc3RhcnQgPSBiLnN0YXJ0O1xuICAgICAgICBsZXQgZW5kID0gYi5maW5hbGl6ZSgpO1xuICAgICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgICAgIGRlYnVnU2xpY2UoZW52LCBlbnYucHJvZ3JhbS5oZWFwLmdldGFkZHIoc3RhcnQpLCBlbnYucHJvZ3JhbS5oZWFwLmdldGFkZHIoZW5kKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlZER5bmFtaWNUZW1wbGF0ZShzdGFydCwge1xuICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgIGhhc0V2YWw6IGxheW91dC5oYXNFdmFsLFxuICAgICAgICAgICAgc3ltYm9sczogbGF5b3V0LnN5bWJvbHMuY29uY2F0KFtBVFRSU19CTE9DS10pXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNsYXNzIFVud3JhcHBlZEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGVudiwgY29tcG9uZW50TmFtZSwgbGF5b3V0KSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgICAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lO1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5hdHRycyA9IG5ldyBDb21wb25lbnRBdHRyc0J1aWxkZXIoKTtcbiAgICB9XG4gICAgZ2V0IHRhZygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCVUc6IENhbm5vdCBjYWxsIGB0YWdgIG9uIGFuIFVud3JhcHBlZEJ1aWxkZXInKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgbGV0IHsgZW52LCBsYXlvdXQgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBsYXlvdXQuYXNMYXlvdXQodGhpcy5jb21wb25lbnROYW1lLCB0aGlzLmF0dHJzLmJ1ZmZlcikuY29tcGlsZUR5bmFtaWMoZW52KTtcbiAgICB9XG59XG5jbGFzcyBDb21wb25lbnRUYWdCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pc0R5bmFtaWMgPSBudWxsO1xuICAgICAgICB0aGlzLmlzU3RhdGljID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0aWNUYWdOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5keW5hbWljVGFnTmFtZSA9IG51bGw7XG4gICAgfVxuICAgIGdldER5bmFtaWMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRHluYW1pYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZHluYW1pY1RhZ05hbWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U3RhdGljKCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0YXRpYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljVGFnTmFtZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWModGFnTmFtZSkge1xuICAgICAgICB0aGlzLmlzU3RhdGljID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGF0aWNUYWdOYW1lID0gdGFnTmFtZTtcbiAgICB9XG4gICAgZHluYW1pYyh0YWdOYW1lKSB7XG4gICAgICAgIHRoaXMuaXNEeW5hbWljID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5keW5hbWljVGFnTmFtZSA9IFtPcHMuQ2xpZW50U2lkZUV4cHJlc3Npb24sIENsaWVudFNpZGUuT3BzLkZ1bmN0aW9uRXhwcmVzc2lvbiwgdGFnTmFtZV07XG4gICAgfVxufVxuY2xhc3MgQ29tcG9uZW50QXR0cnNCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB9XG4gICAgc3RhdGljKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyLnB1c2goW09wcy5TdGF0aWNBdHRyLCBuYW1lLCB2YWx1ZSwgbnVsbF0pO1xuICAgIH1cbiAgICBkeW5hbWljKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyLnB1c2goW09wcy5EeW5hbWljQXR0ciwgbmFtZSwgW09wcy5DbGllbnRTaWRlRXhwcmVzc2lvbiwgQ2xpZW50U2lkZS5PcHMuRnVuY3Rpb25FeHByZXNzaW9uLCB2YWx1ZV0sIG51bGxdKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29tcG9uZW50QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoYnVpbGRlcikge1xuICAgICAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyO1xuICAgICAgICB0aGlzLmVudiA9IGJ1aWxkZXIuZW52O1xuICAgIH1cbiAgICBzdGF0aWMoZGVmaW5pdGlvbiwgYXJncykge1xuICAgICAgICBsZXQgW3BhcmFtcywgaGFzaCwgX2RlZmF1bHQsIGludmVyc2VdID0gYXJncztcbiAgICAgICAgbGV0IHsgYnVpbGRlciB9ID0gdGhpcztcbiAgICAgICAgYnVpbGRlci5wdXNoQ29tcG9uZW50TWFuYWdlcihkZWZpbml0aW9uKTtcbiAgICAgICAgYnVpbGRlci5pbnZva2VDb21wb25lbnQobnVsbCwgcGFyYW1zLCBoYXNoLCBfZGVmYXVsdCwgaW52ZXJzZSk7XG4gICAgfVxuICAgIGR5bmFtaWMoZGVmaW5pdGlvbkFyZ3MsIGdldERlZmluaXRpb24sIGFyZ3MpIHtcbiAgICAgICAgbGV0IFtwYXJhbXMsIGhhc2gsIGJsb2NrLCBpbnZlcnNlXSA9IGFyZ3M7XG4gICAgICAgIGxldCB7IGJ1aWxkZXIgfSA9IHRoaXM7XG4gICAgICAgIGlmICghZGVmaW5pdGlvbkFyZ3MgfHwgZGVmaW5pdGlvbkFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEeW5hbWljIHN5bnRheCB3aXRob3V0IGFuIGFyZ3VtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtZXRhID0gdGhpcy5idWlsZGVyLm1ldGEudGVtcGxhdGVNZXRhO1xuICAgICAgICBmdW5jdGlvbiBoZWxwZXIodm0sIGEpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXREZWZpbml0aW9uKHZtLCBhLCBtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZGVyLnN0YXJ0TGFiZWxzKCk7XG4gICAgICAgIGJ1aWxkZXIucHVzaEZyYW1lKCk7XG4gICAgICAgIGJ1aWxkZXIucmV0dXJuVG8oJ0VORCcpO1xuICAgICAgICBidWlsZGVyLmNvbXBpbGVBcmdzKGRlZmluaXRpb25BcmdzWzBdLCBkZWZpbml0aW9uQXJnc1sxXSwgdHJ1ZSk7XG4gICAgICAgIGJ1aWxkZXIuaGVscGVyKGhlbHBlcik7XG4gICAgICAgIGJ1aWxkZXIuZHVwKCk7XG4gICAgICAgIGJ1aWxkZXIudGVzdCgnc2ltcGxlJyk7XG4gICAgICAgIGJ1aWxkZXIuZW50ZXIoMik7XG4gICAgICAgIGJ1aWxkZXIuanVtcFVubGVzcygnRUxTRScpO1xuICAgICAgICBidWlsZGVyLnB1c2hEeW5hbWljQ29tcG9uZW50TWFuYWdlcigpO1xuICAgICAgICBidWlsZGVyLmludm9rZUNvbXBvbmVudChudWxsLCBwYXJhbXMsIGhhc2gsIGJsb2NrLCBpbnZlcnNlKTtcbiAgICAgICAgYnVpbGRlci5sYWJlbCgnRUxTRScpO1xuICAgICAgICBidWlsZGVyLmV4aXQoKTtcbiAgICAgICAgYnVpbGRlci5yZXR1cm4oKTtcbiAgICAgICAgYnVpbGRlci5sYWJlbCgnRU5EJyk7XG4gICAgICAgIGJ1aWxkZXIucG9wRnJhbWUoKTtcbiAgICAgICAgYnVpbGRlci5zdG9wTGFiZWxzKCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkZXIoZW52LCBtZXRhKSB7XG4gICAgcmV0dXJuIG5ldyBPcGNvZGVCdWlsZGVyRFNMKGVudiwgbWV0YSk7XG59Il19