ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
652 lines (521 loc) • 66.5 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 _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"); } }
import { dict, EMPTY_ARRAY, fillNulls, Stack, typePos } from '@glimmer/util';
import { ComponentBuilder } from '../../compiler';
import { Register } from '../../opcodes';
import { expr, InvokeDynamicLayout } from '../../syntax/functions';
import RawInlineBlock from '../../syntax/raw-block';
import { IsComponentDefinitionReference } from '../opcodes/content';
import * as content from './content';
import * as vm from './vm';
var Labels = function () {
function Labels() {
_classCallCheck(this, Labels);
this.labels = dict();
this.targets = [];
}
Labels.prototype.label = function label(name, index) {
this.labels[name] = index;
};
Labels.prototype.target = function target(at, Target, _target) {
this.targets.push({ at: at, Target: Target, target: _target });
};
Labels.prototype.patch = function patch(program) {
var targets = this.targets,
labels = this.labels;
for (var i = 0; i < targets.length; i++) {
var _targets$i = targets[i],
at = _targets$i.at,
target = _targets$i.target;
var goto = labels[target] - at;
program.heap.setbyaddr(at + 1, goto);
}
};
return Labels;
}();
var BasicOpcodeBuilder = function () {
function BasicOpcodeBuilder(env, meta, program) {
_classCallCheck(this, BasicOpcodeBuilder);
this.env = env;
this.meta = meta;
this.program = program;
this.labelsStack = new Stack();
this.constants = program.constants;
this.heap = program.heap;
this.start = this.heap.malloc();
}
BasicOpcodeBuilder.prototype.upvars = function upvars(count) {
return fillNulls(count);
};
BasicOpcodeBuilder.prototype.reserve = function reserve(name) {
this.push(name, 0, 0, 0);
};
BasicOpcodeBuilder.prototype.push = function push(name) {
var op1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var op2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var op3 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
this.heap.push(name);
this.heap.push(op1);
this.heap.push(op2);
this.heap.push(op3);
};
BasicOpcodeBuilder.prototype.finalize = function finalize() {
this.push(22 /* Return */);
this.heap.finishMalloc(this.start);
return this.start;
};
// args
BasicOpcodeBuilder.prototype.pushArgs = function pushArgs(synthetic) {
this.push(58 /* PushArgs */, synthetic === true ? 1 : 0);
};
// helpers
BasicOpcodeBuilder.prototype.startLabels = function startLabels() {
this.labelsStack.push(new Labels());
};
BasicOpcodeBuilder.prototype.stopLabels = function stopLabels() {
var label = this.labelsStack.pop();
label.patch(this.program);
};
// components
BasicOpcodeBuilder.prototype.pushComponentManager = function pushComponentManager(definition) {
this.push(56 /* PushComponentManager */, this.other(definition));
};
BasicOpcodeBuilder.prototype.pushDynamicComponentManager = function pushDynamicComponentManager() {
this.push(57 /* PushDynamicComponentManager */);
};
BasicOpcodeBuilder.prototype.prepareArgs = function prepareArgs(state) {
this.push(59 /* PrepareArgs */, state);
};
BasicOpcodeBuilder.prototype.createComponent = function createComponent(state, hasDefault, hasInverse) {
var flag = (hasDefault === true ? 1 : 0) | (hasInverse === true ? 1 : 0) << 1;
this.push(60 /* CreateComponent */, flag, state);
};
BasicOpcodeBuilder.prototype.registerComponentDestructor = function registerComponentDestructor(state) {
this.push(61 /* RegisterComponentDestructor */, state);
};
BasicOpcodeBuilder.prototype.beginComponentTransaction = function beginComponentTransaction() {
this.push(65 /* BeginComponentTransaction */);
};
BasicOpcodeBuilder.prototype.commitComponentTransaction = function commitComponentTransaction() {
this.push(66 /* CommitComponentTransaction */);
};
BasicOpcodeBuilder.prototype.pushComponentOperations = function pushComponentOperations() {
this.push(62 /* PushComponentOperations */);
};
BasicOpcodeBuilder.prototype.getComponentSelf = function getComponentSelf(state) {
this.push(63 /* GetComponentSelf */, state);
};
BasicOpcodeBuilder.prototype.getComponentLayout = function getComponentLayout(state) {
this.push(64 /* GetComponentLayout */, state);
};
BasicOpcodeBuilder.prototype.didCreateElement = function didCreateElement(state) {
this.push(67 /* DidCreateElement */, state);
};
BasicOpcodeBuilder.prototype.didRenderLayout = function didRenderLayout(state) {
this.push(68 /* DidRenderLayout */, state);
};
// partial
BasicOpcodeBuilder.prototype.getPartialTemplate = function getPartialTemplate() {
this.push(69 /* GetPartialTemplate */);
};
BasicOpcodeBuilder.prototype.resolveMaybeLocal = function resolveMaybeLocal(name) {
this.push(70 /* ResolveMaybeLocal */, this.string(name));
};
// debugger
BasicOpcodeBuilder.prototype.debugger = function _debugger(symbols, evalInfo) {
this.push(71 /* Debugger */, this.constants.other(symbols), this.constants.array(evalInfo));
};
// content
BasicOpcodeBuilder.prototype.dynamicContent = function dynamicContent(Opcode) {
this.push(26 /* DynamicContent */, this.other(Opcode));
};
BasicOpcodeBuilder.prototype.cautiousAppend = function cautiousAppend() {
this.dynamicContent(new content.OptimizedCautiousAppendOpcode());
};
BasicOpcodeBuilder.prototype.trustingAppend = function trustingAppend() {
this.dynamicContent(new content.OptimizedTrustingAppendOpcode());
};
// dom
BasicOpcodeBuilder.prototype.text = function text(_text) {
this.push(24 /* Text */, this.constants.string(_text));
};
BasicOpcodeBuilder.prototype.openPrimitiveElement = function openPrimitiveElement(tag) {
this.push(27 /* OpenElement */, this.constants.string(tag));
};
BasicOpcodeBuilder.prototype.openElementWithOperations = function openElementWithOperations(tag) {
this.push(28 /* OpenElementWithOperations */, this.constants.string(tag));
};
BasicOpcodeBuilder.prototype.openDynamicElement = function openDynamicElement() {
this.push(29 /* OpenDynamicElement */);
};
BasicOpcodeBuilder.prototype.flushElement = function flushElement() {
this.push(33 /* FlushElement */);
};
BasicOpcodeBuilder.prototype.closeElement = function closeElement() {
this.push(34 /* CloseElement */);
};
BasicOpcodeBuilder.prototype.staticAttr = function staticAttr(_name, _namespace, _value) {
var name = this.constants.string(_name);
var namespace = _namespace ? this.constants.string(_namespace) : 0;
var value = this.constants.string(_value);
this.push(30 /* StaticAttr */, name, value, namespace);
};
BasicOpcodeBuilder.prototype.dynamicAttrNS = function dynamicAttrNS(_name, _namespace, trusting) {
var name = this.constants.string(_name);
var namespace = this.constants.string(_namespace);
this.push(32 /* DynamicAttrNS */, name, namespace, trusting === true ? 1 : 0);
};
BasicOpcodeBuilder.prototype.dynamicAttr = function dynamicAttr(_name, trusting) {
var name = this.constants.string(_name);
this.push(31 /* DynamicAttr */, name, trusting === true ? 1 : 0);
};
BasicOpcodeBuilder.prototype.comment = function comment(_comment) {
var comment = this.constants.string(_comment);
this.push(25 /* Comment */, comment);
};
BasicOpcodeBuilder.prototype.modifier = function modifier(_definition) {
this.push(35 /* Modifier */, this.other(_definition));
};
// lists
BasicOpcodeBuilder.prototype.putIterator = function putIterator() {
this.push(54 /* PutIterator */);
};
BasicOpcodeBuilder.prototype.enterList = function enterList(start) {
this.reserve(52 /* EnterList */);
this.labels.target(this.pos, 52 /* EnterList */, start);
};
BasicOpcodeBuilder.prototype.exitList = function exitList() {
this.push(53 /* ExitList */);
};
BasicOpcodeBuilder.prototype.iterate = function iterate(breaks) {
this.reserve(55 /* Iterate */);
this.labels.target(this.pos, 55 /* Iterate */, breaks);
};
// expressions
BasicOpcodeBuilder.prototype.setVariable = function setVariable(symbol) {
this.push(4 /* SetVariable */, symbol);
};
BasicOpcodeBuilder.prototype.getVariable = function getVariable(symbol) {
this.push(5 /* GetVariable */, symbol);
};
BasicOpcodeBuilder.prototype.getProperty = function getProperty(key) {
this.push(6 /* GetProperty */, this.string(key));
};
BasicOpcodeBuilder.prototype.getBlock = function getBlock(symbol) {
this.push(8 /* GetBlock */, symbol);
};
BasicOpcodeBuilder.prototype.hasBlock = function hasBlock(symbol) {
this.push(9 /* HasBlock */, symbol);
};
BasicOpcodeBuilder.prototype.hasBlockParams = function hasBlockParams(symbol) {
this.push(10 /* HasBlockParams */, symbol);
};
BasicOpcodeBuilder.prototype.concat = function concat(size) {
this.push(11 /* Concat */, size);
};
BasicOpcodeBuilder.prototype.function = function _function(f) {
this.push(2 /* Function */, this.func(f));
};
BasicOpcodeBuilder.prototype.load = function load(register) {
this.push(17 /* Load */, register);
};
BasicOpcodeBuilder.prototype.fetch = function fetch(register) {
this.push(18 /* Fetch */, register);
};
BasicOpcodeBuilder.prototype.dup = function dup() {
var register = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Register.sp;
var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return this.push(15 /* Dup */, register, offset);
};
BasicOpcodeBuilder.prototype.pop = function pop() {
var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
return this.push(16 /* Pop */, count);
};
// vm
BasicOpcodeBuilder.prototype.pushRemoteElement = function pushRemoteElement() {
this.push(36 /* PushRemoteElement */);
};
BasicOpcodeBuilder.prototype.popRemoteElement = function popRemoteElement() {
this.push(37 /* PopRemoteElement */);
};
BasicOpcodeBuilder.prototype.label = function label(name) {
this.labels.label(name, this.nextPos);
};
BasicOpcodeBuilder.prototype.pushRootScope = function pushRootScope(symbols, bindCallerScope) {
this.push(19 /* RootScope */, symbols, bindCallerScope ? 1 : 0);
};
BasicOpcodeBuilder.prototype.pushChildScope = function pushChildScope() {
this.push(20 /* ChildScope */);
};
BasicOpcodeBuilder.prototype.popScope = function popScope() {
this.push(21 /* PopScope */);
};
BasicOpcodeBuilder.prototype.returnTo = function returnTo(label) {
this.reserve(23 /* ReturnTo */);
this.labels.target(this.pos, 23 /* ReturnTo */, label);
};
BasicOpcodeBuilder.prototype.pushDynamicScope = function pushDynamicScope() {
this.push(39 /* PushDynamicScope */);
};
BasicOpcodeBuilder.prototype.popDynamicScope = function popDynamicScope() {
this.push(40 /* PopDynamicScope */);
};
BasicOpcodeBuilder.prototype.pushImmediate = function pushImmediate(value) {
this.push(13 /* Constant */, this.other(value));
};
BasicOpcodeBuilder.prototype.primitive = function primitive(_primitive) {
var flag = 0;
var primitive = void 0;
switch (typeof _primitive) {
case 'number':
if (_primitive % 1 === 0 && _primitive > 0) {
primitive = _primitive;
} else {
primitive = this.float(_primitive);
flag = 1;
}
break;
case 'string':
primitive = this.string(_primitive);
flag = 2;
break;
case 'boolean':
primitive = _primitive | 0;
flag = 3;
break;
case 'object':
// assume null
primitive = 2;
flag = 3;
break;
case 'undefined':
primitive = 3;
flag = 3;
break;
default:
throw new Error('Invalid primitive passed to pushPrimitive');
}
this.push(14 /* PrimitiveReference */, flag << 30 | primitive);
};
BasicOpcodeBuilder.prototype.helper = function helper(func) {
this.push(1 /* Helper */, this.func(func));
};
BasicOpcodeBuilder.prototype.pushBlock = function pushBlock(block) {
this.push(7 /* PushBlock */, this.block(block));
};
BasicOpcodeBuilder.prototype.bindDynamicScope = function bindDynamicScope(_names) {
this.push(38 /* BindDynamicScope */, this.names(_names));
};
BasicOpcodeBuilder.prototype.enter = function enter(args) {
this.push(49 /* Enter */, args);
};
BasicOpcodeBuilder.prototype.exit = function exit() {
this.push(50 /* Exit */);
};
BasicOpcodeBuilder.prototype.return = function _return() {
this.push(22 /* Return */);
};
BasicOpcodeBuilder.prototype.pushFrame = function pushFrame() {
this.push(47 /* PushFrame */);
};
BasicOpcodeBuilder.prototype.popFrame = function popFrame() {
this.push(48 /* PopFrame */);
};
BasicOpcodeBuilder.prototype.compileDynamicBlock = function compileDynamicBlock() {
this.push(41 /* CompileDynamicBlock */);
};
BasicOpcodeBuilder.prototype.invokeDynamic = function invokeDynamic(invoker) {
this.push(43 /* InvokeDynamic */, this.other(invoker));
};
BasicOpcodeBuilder.prototype.invokeStatic = function invokeStatic(block) {
var callerCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var parameters = block.symbolTable.parameters;
var calleeCount = parameters.length;
var count = Math.min(callerCount, calleeCount);
this.pushFrame();
if (count) {
this.pushChildScope();
for (var i = 0; i < count; i++) {
this.dup(Register.fp, callerCount - i);
this.setVariable(parameters[i]);
}
}
var _block = this.constants.block(block);
this.push(42 /* InvokeStatic */, _block);
if (count) {
this.popScope();
}
this.popFrame();
};
BasicOpcodeBuilder.prototype.test = function test(testFunc) {
var _func = void 0;
if (testFunc === 'const') {
_func = vm.ConstTest;
} else if (testFunc === 'simple') {
_func = vm.SimpleTest;
} else if (testFunc === 'environment') {
_func = vm.EnvironmentTest;
} else if (typeof testFunc === 'function') {
_func = testFunc;
} else {
throw new Error('unreachable');
}
var func = this.constants.function(_func);
this.push(51 /* Test */, func);
};
BasicOpcodeBuilder.prototype.jump = function jump(target) {
this.reserve(44 /* Jump */);
this.labels.target(this.pos, 44 /* Jump */, target);
};
BasicOpcodeBuilder.prototype.jumpIf = function jumpIf(target) {
this.reserve(45 /* JumpIf */);
this.labels.target(this.pos, 45 /* JumpIf */, target);
};
BasicOpcodeBuilder.prototype.jumpUnless = function jumpUnless(target) {
this.reserve(46 /* JumpUnless */);
this.labels.target(this.pos, 46 /* JumpUnless */, target);
};
BasicOpcodeBuilder.prototype.string = function string(_string) {
return this.constants.string(_string);
};
BasicOpcodeBuilder.prototype.float = function float(num) {
return this.constants.float(num);
};
BasicOpcodeBuilder.prototype.names = function names(_names) {
var names = [];
for (var i = 0; i < _names.length; i++) {
var n = _names[i];
names[i] = this.constants.string(n);
}
return this.constants.array(names);
};
BasicOpcodeBuilder.prototype.symbols = function symbols(_symbols) {
return this.constants.array(_symbols);
};
BasicOpcodeBuilder.prototype.other = function other(value) {
return this.constants.other(value);
};
BasicOpcodeBuilder.prototype.block = function block(_block2) {
return _block2 ? this.constants.block(_block2) : 0;
};
BasicOpcodeBuilder.prototype.func = function func(_func2) {
return this.constants.function(_func2);
};
_createClass(BasicOpcodeBuilder, [{
key: 'pos',
get: function () {
return typePos(this.heap.size());
}
}, {
key: 'nextPos',
get: function () {
return this.heap.size();
}
}, {
key: 'labels',
get: function () {
return this.labelsStack.current;
}
}]);
return BasicOpcodeBuilder;
}();
export { BasicOpcodeBuilder };
function isCompilableExpression(expr) {
return typeof expr === 'object' && expr !== null && typeof expr.compile === 'function';
}
var OpcodeBuilder = function (_BasicOpcodeBuilder) {
_inherits(OpcodeBuilder, _BasicOpcodeBuilder);
function OpcodeBuilder(env, meta) {
var program = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : env.program;
_classCallCheck(this, OpcodeBuilder);
var _this = _possibleConstructorReturn(this, _BasicOpcodeBuilder.call(this, env, meta, program));
_this.component = new ComponentBuilder(_this);
return _this;
}
OpcodeBuilder.prototype.compileArgs = function compileArgs(params, hash, synthetic) {
var positional = 0;
if (params) {
for (var i = 0; i < params.length; i++) {
expr(params[i], this);
}
positional = params.length;
}
this.pushImmediate(positional);
var names = EMPTY_ARRAY;
if (hash) {
names = hash[0];
var val = hash[1];
for (var _i = 0; _i < val.length; _i++) {
expr(val[_i], this);
}
}
this.pushImmediate(names);
this.pushArgs(synthetic);
};
OpcodeBuilder.prototype.compile = function compile(expr) {
if (isCompilableExpression(expr)) {
return expr.compile(this);
} else {
return expr;
}
};
OpcodeBuilder.prototype.guardedAppend = function guardedAppend(expression, trusting) {
this.startLabels();
this.pushFrame();
this.returnTo('END');
expr(expression, this);
this.dup();
this.test(function (reference) {
return IsComponentDefinitionReference.create(reference);
});
this.enter(2);
this.jumpUnless('ELSE');
this.pushDynamicComponentManager();
this.invokeComponent(null, null, null, null, null);
this.exit();
this.return();
this.label('ELSE');
if (trusting) {
this.trustingAppend();
} else {
this.cautiousAppend();
}
this.exit();
this.return();
this.label('END');
this.popFrame();
this.stopLabels();
};
OpcodeBuilder.prototype.invokeComponent = function invokeComponent(attrs, params, hash, block) {
var inverse = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
this.fetch(Register.s0);
this.dup(Register.sp, 1);
this.load(Register.s0);
this.pushBlock(block);
this.pushBlock(inverse);
this.compileArgs(params, hash, false);
this.prepareArgs(Register.s0);
this.beginComponentTransaction();
this.pushDynamicScope();
this.createComponent(Register.s0, block !== null, inverse !== null);
this.registerComponentDestructor(Register.s0);
this.getComponentSelf(Register.s0);
this.getComponentLayout(Register.s0);
this.invokeDynamic(new InvokeDynamicLayout(attrs && attrs.scan()));
this.popFrame();
this.popScope();
this.popDynamicScope();
this.commitComponentTransaction();
this.load(Register.s0);
};
OpcodeBuilder.prototype.template = function template(block) {
if (!block) return null;
return new RawInlineBlock(this.meta, block.statements, block.parameters);
};
return OpcodeBuilder;
}(BasicOpcodeBuilder);
export default OpcodeBuilder;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXIuanMiXSwibmFtZXMiOlsiZGljdCIsIkVNUFRZX0FSUkFZIiwiZmlsbE51bGxzIiwiU3RhY2siLCJ0eXBlUG9zIiwiQ29tcG9uZW50QnVpbGRlciIsIlJlZ2lzdGVyIiwiZXhwciIsIkludm9rZUR5bmFtaWNMYXlvdXQiLCJSYXdJbmxpbmVCbG9jayIsIklzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSIsImNvbnRlbnQiLCJ2bSIsIkxhYmVscyIsImxhYmVscyIsInRhcmdldHMiLCJsYWJlbCIsIm5hbWUiLCJpbmRleCIsInRhcmdldCIsImF0IiwiVGFyZ2V0IiwicHVzaCIsInBhdGNoIiwicHJvZ3JhbSIsImkiLCJsZW5ndGgiLCJnb3RvIiwiaGVhcCIsInNldGJ5YWRkciIsIkJhc2ljT3Bjb2RlQnVpbGRlciIsImVudiIsIm1ldGEiLCJsYWJlbHNTdGFjayIsImNvbnN0YW50cyIsInN0YXJ0IiwibWFsbG9jIiwidXB2YXJzIiwiY291bnQiLCJyZXNlcnZlIiwib3AxIiwib3AyIiwib3AzIiwiZmluYWxpemUiLCJmaW5pc2hNYWxsb2MiLCJwdXNoQXJncyIsInN5bnRoZXRpYyIsInN0YXJ0TGFiZWxzIiwic3RvcExhYmVscyIsInBvcCIsInB1c2hDb21wb25lbnRNYW5hZ2VyIiwiZGVmaW5pdGlvbiIsIm90aGVyIiwicHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyIiwicHJlcGFyZUFyZ3MiLCJzdGF0ZSIsImNyZWF0ZUNvbXBvbmVudCIsImhhc0RlZmF1bHQiLCJoYXNJbnZlcnNlIiwiZmxhZyIsInJlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvciIsImJlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24iLCJjb21taXRDb21wb25lbnRUcmFuc2FjdGlvbiIsInB1c2hDb21wb25lbnRPcGVyYXRpb25zIiwiZ2V0Q29tcG9uZW50U2VsZiIsImdldENvbXBvbmVudExheW91dCIsImRpZENyZWF0ZUVsZW1lbnQiLCJkaWRSZW5kZXJMYXlvdXQiLCJnZXRQYXJ0aWFsVGVtcGxhdGUiLCJyZXNvbHZlTWF5YmVMb2NhbCIsInN0cmluZyIsImRlYnVnZ2VyIiwic3ltYm9scyIsImV2YWxJbmZvIiwiYXJyYXkiLCJkeW5hbWljQ29udGVudCIsIk9wY29kZSIsImNhdXRpb3VzQXBwZW5kIiwiT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGUiLCJ0cnVzdGluZ0FwcGVuZCIsIk9wdGltaXplZFRydXN0aW5nQXBwZW5kT3Bjb2RlIiwidGV4dCIsIm9wZW5QcmltaXRpdmVFbGVtZW50IiwidGFnIiwib3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucyIsIm9wZW5EeW5hbWljRWxlbWVudCIsImZsdXNoRWxlbWVudCIsImNsb3NlRWxlbWVudCIsInN0YXRpY0F0dHIiLCJfbmFtZSIsIl9uYW1lc3BhY2UiLCJfdmFsdWUiLCJuYW1lc3BhY2UiLCJ2YWx1ZSIsImR5bmFtaWNBdHRyTlMiLCJ0cnVzdGluZyIsImR5bmFtaWNBdHRyIiwiY29tbWVudCIsIl9jb21tZW50IiwibW9kaWZpZXIiLCJfZGVmaW5pdGlvbiIsInB1dEl0ZXJhdG9yIiwiZW50ZXJMaXN0IiwicG9zIiwiZXhpdExpc3QiLCJpdGVyYXRlIiwiYnJlYWtzIiwic2V0VmFyaWFibGUiLCJzeW1ib2wiLCJnZXRWYXJpYWJsZSIsImdldFByb3BlcnR5Iiwia2V5IiwiZ2V0QmxvY2siLCJoYXNCbG9jayIsImhhc0Jsb2NrUGFyYW1zIiwiY29uY2F0Iiwic2l6ZSIsImZ1bmN0aW9uIiwiZiIsImZ1bmMiLCJsb2FkIiwicmVnaXN0ZXIiLCJmZXRjaCIsImR1cCIsInNwIiwib2Zmc2V0IiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwibmV4dFBvcyIsInB1c2hSb290U2NvcGUiLCJiaW5kQ2FsbGVyU2NvcGUiLCJwdXNoQ2hpbGRTY29wZSIsInBvcFNjb3BlIiwicmV0dXJuVG8iLCJwdXNoRHluYW1pY1Njb3BlIiwicG9wRHluYW1pY1Njb3BlIiwicHVzaEltbWVkaWF0ZSIsInByaW1pdGl2ZSIsIl9wcmltaXRpdmUiLCJmbG9hdCIsIkVycm9yIiwiaGVscGVyIiwicHVzaEJsb2NrIiwiYmxvY2siLCJiaW5kRHluYW1pY1Njb3BlIiwiX25hbWVzIiwibmFtZXMiLCJlbnRlciIsImFyZ3MiLCJleGl0IiwicmV0dXJuIiwicHVzaEZyYW1lIiwicG9wRnJhbWUiLCJjb21waWxlRHluYW1pY0Jsb2NrIiwiaW52b2tlRHluYW1pYyIsImludm9rZXIiLCJpbnZva2VTdGF0aWMiLCJjYWxsZXJDb3VudCIsInBhcmFtZXRlcnMiLCJzeW1ib2xUYWJsZSIsImNhbGxlZUNvdW50IiwiTWF0aCIsIm1pbiIsImZwIiwiX2Jsb2NrIiwidGVzdCIsInRlc3RGdW5jIiwiX2Z1bmMiLCJDb25zdFRlc3QiLCJTaW1wbGVUZXN0IiwiRW52aXJvbm1lbnRUZXN0IiwianVtcCIsImp1bXBJZiIsImp1bXBVbmxlc3MiLCJfc3RyaW5nIiwibnVtIiwibiIsImN1cnJlbnQiLCJpc0NvbXBpbGFibGVFeHByZXNzaW9uIiwiY29tcGlsZSIsIk9wY29kZUJ1aWxkZXIiLCJjb21wb25lbnQiLCJjb21waWxlQXJncyIsInBhcmFtcyIsImhhc2giLCJwb3NpdGlvbmFsIiwidmFsIiwiZ3VhcmRlZEFwcGVuZCIsImV4cHJlc3Npb24iLCJjcmVhdGUiLCJyZWZlcmVuY2UiLCJpbnZva2VDb21wb25lbnQiLCJhdHRycyIsImludmVyc2UiLCJzMCIsInNjYW4iLCJ0ZW1wbGF0ZSIsInN0YXRlbWVudHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxTQUFTQSxJQUFULEVBQWVDLFdBQWYsRUFBb0NDLFNBQXBDLEVBQStDQyxLQUEvQyxFQUFzREMsT0FBdEQsUUFBcUUsZUFBckU7QUFDQSxTQUFTQyxnQkFBVCxRQUFpQyxnQkFBakM7QUFDQSxTQUFTQyxRQUFULFFBQXlCLGVBQXpCO0FBQ0EsU0FBU0MsSUFBVCxFQUFlQyxtQkFBZixRQUEwQyx3QkFBMUM7QUFDQSxPQUFPQyxjQUFQ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ci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpY3QsIEVNUFRZX0FSUkFZLCBleHBlY3QsIGZpbGxOdWxscywgU3RhY2ssIHR5cGVQb3MgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IENvbXBvbmVudEJ1aWxkZXIgfSBmcm9tICcuLi8uLi9jb21waWxlcic7XG5pbXBvcnQgeyBSZWdpc3RlciB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgZXhwciwgSW52b2tlRHluYW1pY0xheW91dCB9IGZyb20gJy4uLy4uL3N5bnRheC9mdW5jdGlvbnMnO1xuaW1wb3J0IFJhd0lubGluZUJsb2NrIGZyb20gJy4uLy4uL3N5bnRheC9yYXctYmxvY2snO1xuaW1wb3J0IHsgSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlIH0gZnJvbSAnLi4vb3Bjb2Rlcy9jb250ZW50JztcbmltcG9ydCAqIGFzIGNvbnRlbnQgZnJvbSAnLi9jb250ZW50JztcbmltcG9ydCAqIGFzIHZtIGZyb20gJy4vdm0nO1xuY2xhc3MgTGFiZWxzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5sYWJlbHMgPSBkaWN0KCk7XG4gICAgICAgIHRoaXMudGFyZ2V0cyA9IFtdO1xuICAgIH1cbiAgICBsYWJlbChuYW1lLCBpbmRleCkge1xuICAgICAgICB0aGlzLmxhYmVsc1tuYW1lXSA9IGluZGV4O1xuICAgIH1cbiAgICB0YXJnZXQoYXQsIFRhcmdldCwgdGFyZ2V0KSB7XG4gICAgICAgIHRoaXMudGFyZ2V0cy5wdXNoKHsgYXQsIFRhcmdldCwgdGFyZ2V0IH0pO1xuICAgIH1cbiAgICBwYXRjaChwcm9ncmFtKSB7XG4gICAgICAgIGxldCB7IHRhcmdldHMsIGxhYmVscyB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyBhdCwgdGFyZ2V0IH0gPSB0YXJnZXRzW2ldO1xuICAgICAgICAgICAgbGV0IGdvdG8gPSBsYWJlbHNbdGFyZ2V0XSAtIGF0O1xuICAgICAgICAgICAgcHJvZ3JhbS5oZWFwLnNldGJ5YWRkcihhdCArIDEsIGdvdG8pO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEJhc2ljT3Bjb2RlQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoZW52LCBtZXRhLCBwcm9ncmFtKSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICB0aGlzLmxhYmVsc1N0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzID0gcHJvZ3JhbS5jb25zdGFudHM7XG4gICAgICAgIHRoaXMuaGVhcCA9IHByb2dyYW0uaGVhcDtcbiAgICAgICAgdGhpcy5zdGFydCA9IHRoaXMuaGVhcC5tYWxsb2MoKTtcbiAgICB9XG4gICAgZ2V0IHBvcygpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVQb3ModGhpcy5oZWFwLnNpemUoKSk7XG4gICAgfVxuICAgIGdldCBuZXh0UG9zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFwLnNpemUoKTtcbiAgICB9XG4gICAgdXB2YXJzKGNvdW50KSB7XG4gICAgICAgIHJldHVybiBmaWxsTnVsbHMoY291bnQpO1xuICAgIH1cbiAgICByZXNlcnZlKG5hbWUpIHtcbiAgICAgICAgdGhpcy5wdXNoKG5hbWUsIDAsIDAsIDApO1xuICAgIH1cbiAgICBwdXNoKG5hbWUsIG9wMSA9IDAsIG9wMiA9IDAsIG9wMyA9IDApIHtcbiAgICAgICAgdGhpcy5oZWFwLnB1c2gobmFtZSk7XG4gICAgICAgIHRoaXMuaGVhcC5wdXNoKG9wMSk7XG4gICAgICAgIHRoaXMuaGVhcC5wdXNoKG9wMik7XG4gICAgICAgIHRoaXMuaGVhcC5wdXNoKG9wMyk7XG4gICAgfVxuICAgIGZpbmFsaXplKCkge1xuICAgICAgICB0aGlzLnB1c2goMjIgLyogUmV0dXJuICovKTtcbiAgICAgICAgdGhpcy5oZWFwLmZpbmlzaE1hbGxvYyh0aGlzLnN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQ7XG4gICAgfVxuICAgIC8vIGFyZ3NcbiAgICBwdXNoQXJncyhzeW50aGV0aWMpIHtcbiAgICAgICAgdGhpcy5wdXNoKDU4IC8qIFB1c2hBcmdzICovLCBzeW50aGV0aWMgPT09IHRydWUgPyAxIDogMCk7XG4gICAgfVxuICAgIC8vIGhlbHBlcnNcbiAgICBnZXQgbGFiZWxzKCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMubGFiZWxzU3RhY2suY3VycmVudCwgJ2J1Zzogbm90IGluIGEgbGFiZWwgc3RhY2snKTtcbiAgICB9XG4gICAgc3RhcnRMYWJlbHMoKSB7XG4gICAgICAgIHRoaXMubGFiZWxzU3RhY2sucHVzaChuZXcgTGFiZWxzKCkpO1xuICAgIH1cbiAgICBzdG9wTGFiZWxzKCkge1xuICAgICAgICBsZXQgbGFiZWwgPSBleHBlY3QodGhpcy5sYWJlbHNTdGFjay5wb3AoKSwgJ3VuYmFsYW5jZWQgcHVzaCBhbmQgcG9wIGxhYmVscycpO1xuICAgICAgICBsYWJlbC5wYXRjaCh0aGlzLnByb2dyYW0pO1xuICAgIH1cbiAgICAvLyBjb21wb25lbnRzXG4gICAgcHVzaENvbXBvbmVudE1hbmFnZXIoZGVmaW5pdGlvbikge1xuICAgICAgICB0aGlzLnB1c2goNTYgLyogUHVzaENvbXBvbmVudE1hbmFnZXIgKi8sIHRoaXMub3RoZXIoZGVmaW5pdGlvbikpO1xuICAgIH1cbiAgICBwdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXIoKSB7XG4gICAgICAgIHRoaXMucHVzaCg1NyAvKiBQdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXIgKi8pO1xuICAgIH1cbiAgICBwcmVwYXJlQXJncyhzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNTkgLyogUHJlcGFyZUFyZ3MgKi8sIHN0YXRlKTtcbiAgICB9XG4gICAgY3JlYXRlQ29tcG9uZW50KHN0YXRlLCBoYXNEZWZhdWx0LCBoYXNJbnZlcnNlKSB7XG4gICAgICAgIGxldCBmbGFnID0gKGhhc0RlZmF1bHQgPT09IHRydWUgPyAxIDogMCkgfCAoaGFzSW52ZXJzZSA9PT0gdHJ1ZSA/IDEgOiAwKSA8PCAxO1xuICAgICAgICB0aGlzLnB1c2goNjAgLyogQ3JlYXRlQ29tcG9uZW50ICovLCBmbGFnLCBzdGF0ZSk7XG4gICAgfVxuICAgIHJlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNjEgLyogUmVnaXN0ZXJDb21wb25lbnREZXN0cnVjdG9yICovLCBzdGF0ZSk7XG4gICAgfVxuICAgIGJlZ