UNPKG

ember-legacy-class-transform

Version:
834 lines (766 loc) 91.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.INLINES = exports.Inlines = exports.BLOCKS = exports.Blocks = exports.PartialInvoker = exports.InvokeDynamicLayout = exports.ATTRS_BLOCK = undefined; exports.expr = expr; exports.compileList = compileList; exports.populateBuiltins = populateBuiltins; exports.compileStatement = compileStatement; exports.compileStatements = compileStatements; var _reference = require('@glimmer/reference'); var _util = require('@glimmer/util'); var _wireFormat = require('@glimmer/wire-format'); var WireFormat = _interopRequireWildcard(_wireFormat); var _builder = require('../compiled/opcodes/builder'); var _builder2 = _interopRequireDefault(_builder); var _opcodes = require('../opcodes'); var _clientSide = require('../syntax/client-side'); var ClientSide = _interopRequireWildcard(_clientSide); var _rawBlock = require('./raw-block'); var _rawBlock2 = _interopRequireDefault(_rawBlock); 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Ops = WireFormat.Ops; var ATTRS_BLOCK = exports.ATTRS_BLOCK = '&attrs'; var Compilers = function () { function Compilers() { var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; _classCallCheck(this, Compilers); this.offset = offset; this.names = (0, _util.dict)(); this.funcs = []; } Compilers.prototype.add = function add(name, func) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; }; Compilers.prototype.compile = function compile(sexp, builder) { var name = sexp[this.offset]; var index = this.names[name]; var func = this.funcs[index]; (0, _util.assert)(!!func, 'expected an implementation for ' + (this.offset === 0 ? Ops[sexp[0]] : ClientSide.Ops[sexp[1]])); func(sexp, builder); }; return Compilers; }(); var STATEMENTS = new Compilers(); var CLIENT_SIDE = new Compilers(1); STATEMENTS.add(Ops.Text, function (sexp, builder) { builder.text(sexp[1]); }); STATEMENTS.add(Ops.Comment, function (sexp, builder) { builder.comment(sexp[1]); }); STATEMENTS.add(Ops.CloseElement, function (_sexp, builder) { builder.closeElement(); }); STATEMENTS.add(Ops.FlushElement, function (_sexp, builder) { builder.flushElement(); }); STATEMENTS.add(Ops.Modifier, function (sexp, builder) { var env = builder.env, meta = builder.meta; var name = sexp[1], params = sexp[2], hash = sexp[3]; if (env.hasModifier(name, meta.templateMeta)) { builder.compileArgs(params, hash, true); builder.modifier(env.lookupModifier(name, meta.templateMeta)); } else { throw new Error('Compile Error ' + name + ' is not a modifier: Helpers may not be used in the element form.'); } }); STATEMENTS.add(Ops.StaticAttr, function (sexp, builder) { var name = sexp[1], value = sexp[2], namespace = sexp[3]; builder.staticAttr(name, namespace, value); }); STATEMENTS.add(Ops.DynamicAttr, function (sexp, builder) { dynamicAttr(sexp, false, builder); }); STATEMENTS.add(Ops.TrustingAttr, function (sexp, builder) { dynamicAttr(sexp, true, builder); }); function dynamicAttr(sexp, trusting, builder) { var name = sexp[1], value = sexp[2], namespace = sexp[3]; expr(value, builder); if (namespace) { builder.dynamicAttrNS(name, namespace, trusting); } else { builder.dynamicAttr(name, trusting); } } STATEMENTS.add(Ops.OpenElement, function (sexp, builder) { builder.openPrimitiveElement(sexp[1]); }); CLIENT_SIDE.add(ClientSide.Ops.OpenComponentElement, function (sexp, builder) { builder.pushComponentOperations(); builder.openElementWithOperations(sexp[2]); }); CLIENT_SIDE.add(ClientSide.Ops.DidCreateElement, function (_sexp, builder) { builder.didCreateElement(_opcodes.Register.s0); }); CLIENT_SIDE.add(ClientSide.Ops.DidRenderLayout, function (_sexp, builder) { builder.didRenderLayout(_opcodes.Register.s0); }); STATEMENTS.add(Ops.Append, function (sexp, builder) { var value = sexp[1], trusting = sexp[2]; var _builder$env$macros = builder.env.macros(), inlines = _builder$env$macros.inlines; var returned = inlines.compile(sexp, builder) || value; if (returned === true) return; var isGet = E.isGet(value); var isMaybeLocal = E.isMaybeLocal(value); if (trusting) { builder.guardedAppend(value, true); } else { if (isGet || isMaybeLocal) { builder.guardedAppend(value, false); } else { expr(value, builder); builder.cautiousAppend(); } } }); STATEMENTS.add(Ops.Block, function (sexp, builder) { var name = sexp[1], params = sexp[2], hash = sexp[3], _template = sexp[4], _inverse = sexp[5]; var template = builder.template(_template); var inverse = builder.template(_inverse); var templateBlock = template && template.scan(); var inverseBlock = inverse && inverse.scan(); var _builder$env$macros2 = builder.env.macros(), blocks = _builder$env$macros2.blocks; blocks.compile(name, params, hash, templateBlock, inverseBlock, builder); }); var InvokeDynamicLayout = exports.InvokeDynamicLayout = function () { function InvokeDynamicLayout(attrs) { _classCallCheck(this, InvokeDynamicLayout); this.attrs = attrs; } InvokeDynamicLayout.prototype.invoke = function invoke(vm, layout) { var _layout$symbolTable = layout.symbolTable, symbols = _layout$symbolTable.symbols, hasEval = _layout$symbolTable.hasEval; var stack = vm.stack; var scope = vm.pushRootScope(symbols.length + 1, true); scope.bindSelf(stack.pop()); scope.bindBlock(symbols.indexOf(ATTRS_BLOCK) + 1, this.attrs); var lookup = null; var $eval = -1; if (hasEval) { $eval = symbols.indexOf('$eval') + 1; lookup = (0, _util.dict)(); } var callerNames = stack.pop(); for (var i = callerNames.length - 1; i >= 0; i--) { var symbol = symbols.indexOf(callerNames[i]); var value = stack.pop(); if (symbol !== -1) scope.bindSymbol(symbol + 1, value); if (hasEval) lookup[callerNames[i]] = value; } var numPositionalArgs = stack.pop(); (0, _util.assert)(typeof numPositionalArgs === 'number', '[BUG] Incorrect value of positional argument count found during invoke-dynamic-layout.'); // Currently we don't support accessing positional args in templates, so just throw them away stack.pop(numPositionalArgs); var inverseSymbol = symbols.indexOf('&inverse'); var inverse = stack.pop(); if (inverseSymbol !== -1) { scope.bindBlock(inverseSymbol + 1, inverse); } if (lookup) lookup['&inverse'] = inverse; var defaultSymbol = symbols.indexOf('&default'); var defaultBlock = stack.pop(); if (defaultSymbol !== -1) { scope.bindBlock(defaultSymbol + 1, defaultBlock); } if (lookup) lookup['&default'] = defaultBlock; if (lookup) scope.bindEvalScope(lookup); vm.pushFrame(); vm.call(layout.handle); }; InvokeDynamicLayout.prototype.toJSON = function toJSON() { return { GlimmerDebug: '<invoke-dynamic-layout>' }; }; return InvokeDynamicLayout; }(); STATEMENTS.add(Ops.Component, function (sexp, builder) { var tag = sexp[1], attrs = sexp[2], args = sexp[3], block = sexp[4]; if (builder.env.hasComponentDefinition(tag, builder.meta.templateMeta)) { var child = builder.template(block); var attrsBlock = new _rawBlock2.default(builder.meta, attrs, _util.EMPTY_ARRAY); var definition = builder.env.getComponentDefinition(tag, builder.meta.templateMeta); builder.pushComponentManager(definition); builder.invokeComponent(attrsBlock, null, args, child && child.scan()); } else if (block && block.parameters.length) { throw new Error('Compile Error: Cannot find component ' + tag); } else { builder.openPrimitiveElement(tag); for (var i = 0; i < attrs.length; i++) { STATEMENTS.compile(attrs[i], builder); } builder.flushElement(); if (block) { var stmts = block.statements; for (var _i = 0; _i < stmts.length; _i++) { STATEMENTS.compile(stmts[_i], builder); } } builder.closeElement(); } }); var PartialInvoker = exports.PartialInvoker = function () { function PartialInvoker(outerSymbols, evalInfo) { _classCallCheck(this, PartialInvoker); this.outerSymbols = outerSymbols; this.evalInfo = evalInfo; } PartialInvoker.prototype.invoke = function invoke(vm, _partial) { var partial = _partial; var partialSymbols = partial.symbolTable.symbols; var outerScope = vm.scope(); var partialScope = vm.pushRootScope(partialSymbols.length, false); partialScope.bindCallerScope(outerScope.getCallerScope()); partialScope.bindEvalScope(outerScope.getEvalScope()); partialScope.bindSelf(outerScope.getSelf()); var evalInfo = this.evalInfo, outerSymbols = this.outerSymbols; var locals = (0, _util.dict)(); for (var i = 0; i < evalInfo.length; i++) { var slot = evalInfo[i]; var name = outerSymbols[slot - 1]; var ref = outerScope.getSymbol(slot); locals[name] = ref; } var evalScope = outerScope.getEvalScope(); for (var _i2 = 0; _i2 < partialSymbols.length; _i2++) { var _name = partialSymbols[_i2]; var symbol = _i2 + 1; var value = evalScope[_name]; if (value !== undefined) partialScope.bind(symbol, value); } partialScope.bindPartialMap(locals); vm.pushFrame(); vm.call(partial.handle); }; return PartialInvoker; }(); STATEMENTS.add(Ops.Partial, function (sexp, builder) { var name = sexp[1], evalInfo = sexp[2]; var _builder$meta = builder.meta, templateMeta = _builder$meta.templateMeta, symbols = _builder$meta.symbols; function helper(vm, args) { var env = vm.env; var nameRef = args.positional.at(0); return (0, _reference.map)(nameRef, function (n) { if (typeof n === 'string' && n) { if (!env.hasPartial(n, templateMeta)) { throw new Error('Could not find a partial named "' + n + '"'); } return env.lookupPartial(n, templateMeta); } else if (n) { throw new Error('Could not find a partial named "' + String(n) + '"'); } else { return null; } }); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); expr(name, builder); builder.pushImmediate(1); builder.pushImmediate(_util.EMPTY_ARRAY); builder.pushArgs(true); builder.helper(helper); builder.dup(); builder.test('simple'); builder.enter(2); builder.jumpUnless('ELSE'); builder.getPartialTemplate(); builder.compileDynamicBlock(); builder.invokeDynamic(new PartialInvoker(symbols, evalInfo)); builder.popScope(); builder.popFrame(); builder.label('ELSE'); builder.exit(); builder.return(); builder.label('END'); builder.popFrame(); builder.stopLabels(); }); var InvokeDynamicYield = function () { function InvokeDynamicYield(callerCount) { _classCallCheck(this, InvokeDynamicYield); this.callerCount = callerCount; } InvokeDynamicYield.prototype.invoke = function invoke(vm, block) { var callerCount = this.callerCount; var stack = vm.stack; if (!block) { // To balance the pop{Frame,Scope} vm.pushFrame(); vm.pushCallerScope(); return; } var table = block.symbolTable; var locals = table.parameters; // always present in inline blocks var calleeCount = locals ? locals.length : 0; var count = Math.min(callerCount, calleeCount); vm.pushFrame(); vm.pushCallerScope(calleeCount > 0); var scope = vm.scope(); for (var i = 0; i < count; i++) { scope.bindSymbol(locals[i], stack.fromBase(callerCount - i)); } vm.call(block.handle); }; InvokeDynamicYield.prototype.toJSON = function toJSON() { return { GlimmerDebug: '<invoke-dynamic-yield caller-count=' + this.callerCount + '>' }; }; return InvokeDynamicYield; }(); STATEMENTS.add(Ops.Yield, function (sexp, builder) { var to = sexp[1], params = sexp[2]; var count = compileList(params, builder); builder.getBlock(to); builder.compileDynamicBlock(); builder.invokeDynamic(new InvokeDynamicYield(count)); builder.popScope(); builder.popFrame(); if (count) { builder.pop(count); } }); STATEMENTS.add(Ops.Debugger, function (sexp, builder) { var evalInfo = sexp[1]; builder.debugger(builder.meta.symbols, evalInfo); }); STATEMENTS.add(Ops.ClientSideStatement, function (sexp, builder) { CLIENT_SIDE.compile(sexp, builder); }); var EXPRESSIONS = new Compilers(); var CLIENT_SIDE_EXPRS = new Compilers(1); var E = WireFormat.Expressions; function expr(expression, builder) { if (Array.isArray(expression)) { EXPRESSIONS.compile(expression, builder); } else { builder.primitive(expression); } } EXPRESSIONS.add(Ops.Unknown, function (sexp, builder) { var name = sexp[1]; if (builder.env.hasHelper(name, builder.meta.templateMeta)) { EXPRESSIONS.compile([Ops.Helper, name, _util.EMPTY_ARRAY, null], builder); } else if (builder.meta.asPartial) { builder.resolveMaybeLocal(name); } else { builder.getVariable(0); builder.getProperty(name); } }); EXPRESSIONS.add(Ops.Concat, function (sexp, builder) { var parts = sexp[1]; for (var i = 0; i < parts.length; i++) { expr(parts[i], builder); } builder.concat(parts.length); }); CLIENT_SIDE_EXPRS.add(ClientSide.Ops.FunctionExpression, function (sexp, builder) { builder.function(sexp[2]); }); EXPRESSIONS.add(Ops.Helper, function (sexp, builder) { var env = builder.env, meta = builder.meta; var name = sexp[1], params = sexp[2], hash = sexp[3]; if (env.hasHelper(name, meta.templateMeta)) { builder.compileArgs(params, hash, true); builder.helper(env.lookupHelper(name, meta.templateMeta)); } else { throw new Error('Compile Error: ' + name + ' is not a helper'); } }); EXPRESSIONS.add(Ops.Get, function (sexp, builder) { var head = sexp[1], path = sexp[2]; builder.getVariable(head); for (var i = 0; i < path.length; i++) { builder.getProperty(path[i]); } }); EXPRESSIONS.add(Ops.MaybeLocal, function (sexp, builder) { var path = sexp[1]; if (builder.meta.asPartial) { var head = path[0]; path = path.slice(1); builder.resolveMaybeLocal(head); } else { builder.getVariable(0); } for (var i = 0; i < path.length; i++) { builder.getProperty(path[i]); } }); EXPRESSIONS.add(Ops.Undefined, function (_sexp, builder) { return builder.primitive(undefined); }); EXPRESSIONS.add(Ops.HasBlock, function (sexp, builder) { builder.hasBlock(sexp[1]); }); EXPRESSIONS.add(Ops.HasBlockParams, function (sexp, builder) { builder.hasBlockParams(sexp[1]); }); EXPRESSIONS.add(Ops.ClientSideExpression, function (sexp, builder) { CLIENT_SIDE_EXPRS.compile(sexp, builder); }); function compileList(params, builder) { if (!params) return 0; for (var i = 0; i < params.length; i++) { expr(params[i], builder); } return params.length; } var Blocks = exports.Blocks = function () { function Blocks() { _classCallCheck(this, Blocks); this.names = (0, _util.dict)(); this.funcs = []; } Blocks.prototype.add = function add(name, func) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; }; Blocks.prototype.addMissing = function addMissing(func) { this.missing = func; }; Blocks.prototype.compile = function compile(name, params, hash, template, inverse, builder) { var index = this.names[name]; if (index === undefined) { (0, _util.assert)(!!this.missing, name + ' not found, and no catch-all block handler was registered'); var func = this.missing; var handled = func(name, params, hash, template, inverse, builder); (0, _util.assert)(!!handled, name + ' not found, and the catch-all block handler didn\'t handle it'); } else { var _func = this.funcs[index]; _func(params, hash, template, inverse, builder); } }; return Blocks; }(); var BLOCKS = exports.BLOCKS = new Blocks(); var Inlines = exports.Inlines = function () { function Inlines() { _classCallCheck(this, Inlines); this.names = (0, _util.dict)(); this.funcs = []; } Inlines.prototype.add = function add(name, func) { this.funcs.push(func); this.names[name] = this.funcs.length - 1; }; Inlines.prototype.addMissing = function addMissing(func) { this.missing = func; }; Inlines.prototype.compile = function compile(sexp, builder) { var value = sexp[1]; // TODO: Fix this so that expression macros can return // things like components, so that {{component foo}} // is the same as {{(component foo)}} if (!Array.isArray(value)) return ['expr', value]; var name = void 0; var params = void 0; var hash = void 0; if (value[0] === Ops.Helper) { name = value[1]; params = value[2]; hash = value[3]; } else if (value[0] === Ops.Unknown) { name = value[1]; params = hash = null; } else { return ['expr', value]; } var index = this.names[name]; if (index === undefined && this.missing) { var func = this.missing; var returned = func(name, params, hash, builder); return returned === false ? ['expr', value] : returned; } else if (index !== undefined) { var _func2 = this.funcs[index]; var _returned = _func2(name, params, hash, builder); return _returned === false ? ['expr', value] : _returned; } else { return ['expr', value]; } }; return Inlines; }(); var INLINES = exports.INLINES = new Inlines(); populateBuiltins(BLOCKS, INLINES); function populateBuiltins() { var blocks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Blocks(); var inlines = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Inlines(); blocks.add('if', function (params, _hash, template, inverse, builder) { // PutArgs // Test(Environment) // Enter(BEGIN, END) // BEGIN: Noop // JumpUnless(ELSE) // Evaluate(default) // Jump(END) // ELSE: Noop // Evalulate(inverse) // END: Noop // Exit if (!params || params.length !== 1) { throw new Error('SYNTAX ERROR: #if requires a single argument'); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); expr(params[0], builder); builder.test('environment'); builder.enter(1); builder.jumpUnless('ELSE'); builder.invokeStatic(template); if (inverse) { builder.jump('EXIT'); builder.label('ELSE'); builder.invokeStatic(inverse); builder.label('EXIT'); builder.exit(); builder.return(); } else { builder.label('ELSE'); builder.exit(); builder.return(); } builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('unless', function (params, _hash, template, inverse, builder) { // PutArgs // Test(Environment) // Enter(BEGIN, END) // BEGIN: Noop // JumpUnless(ELSE) // Evaluate(default) // Jump(END) // ELSE: Noop // Evalulate(inverse) // END: Noop // Exit if (!params || params.length !== 1) { throw new Error('SYNTAX ERROR: #unless requires a single argument'); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); expr(params[0], builder); builder.test('environment'); builder.enter(1); builder.jumpIf('ELSE'); builder.invokeStatic(template); if (inverse) { builder.jump('EXIT'); builder.label('ELSE'); builder.invokeStatic(inverse); builder.label('EXIT'); builder.exit(); builder.return(); } else { builder.label('ELSE'); builder.exit(); builder.return(); } builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('with', function (params, _hash, template, inverse, builder) { // PutArgs // Test(Environment) // Enter(BEGIN, END) // BEGIN: Noop // JumpUnless(ELSE) // Evaluate(default) // Jump(END) // ELSE: Noop // Evalulate(inverse) // END: Noop // Exit if (!params || params.length !== 1) { throw new Error('SYNTAX ERROR: #with requires a single argument'); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); expr(params[0], builder); builder.dup(); builder.test('environment'); builder.enter(2); builder.jumpUnless('ELSE'); builder.invokeStatic(template, 1); if (inverse) { builder.jump('EXIT'); builder.label('ELSE'); builder.invokeStatic(inverse); builder.label('EXIT'); builder.exit(); builder.return(); } else { builder.label('ELSE'); builder.exit(); builder.return(); } builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('each', function (params, hash, template, inverse, builder) { // Enter(BEGIN, END) // BEGIN: Noop // PutArgs // PutIterable // JumpUnless(ELSE) // EnterList(BEGIN2, END2) // ITER: Noop // NextIter(BREAK) // BEGIN2: Noop // PushChildScope // Evaluate(default) // PopScope // END2: Noop // Exit // Jump(ITER) // BREAK: Noop // ExitList // Jump(END) // ELSE: Noop // Evalulate(inverse) // END: Noop // Exit builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); if (hash && hash[0][0] === 'key') { expr(hash[1][0], builder); } else { builder.primitive(null); } expr(params[0], builder); builder.enter(2); builder.putIterator(); builder.jumpUnless('ELSE'); builder.pushFrame(); builder.returnTo('ITER'); builder.dup(_opcodes.Register.fp, 1); builder.enterList('BODY'); builder.label('ITER'); builder.iterate('BREAK'); builder.label('BODY'); builder.invokeStatic(template, 2); builder.pop(2); builder.exit(); builder.return(); builder.label('BREAK'); builder.exitList(); builder.popFrame(); if (inverse) { builder.jump('EXIT'); builder.label('ELSE'); builder.invokeStatic(inverse); builder.label('EXIT'); builder.exit(); builder.return(); } else { builder.label('ELSE'); builder.exit(); builder.return(); } builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('-in-element', function (params, hash, template, _inverse, builder) { if (!params || params.length !== 1) { throw new Error('SYNTAX ERROR: #-in-element requires a single argument'); } builder.startLabels(); builder.pushFrame(); builder.returnTo('END'); if (hash && hash[0].length) { var keys = hash[0], values = hash[1]; if (keys.length === 1 && keys[0] === 'nextSibling') { expr(values[0], builder); } else { throw new Error('SYNTAX ERROR: #-in-element does not take a `' + keys[0] + '` option'); } } else { expr(null, builder); } expr(params[0], builder); builder.dup(); builder.test('simple'); builder.enter(3); builder.jumpUnless('ELSE'); builder.pushRemoteElement(); builder.invokeStatic(template); builder.popRemoteElement(); builder.label('ELSE'); builder.exit(); builder.return(); builder.label('END'); builder.popFrame(); builder.stopLabels(); }); blocks.add('-with-dynamic-vars', function (_params, hash, template, _inverse, builder) { if (hash) { var names = hash[0], expressions = hash[1]; compileList(expressions, builder); builder.pushDynamicScope(); builder.bindDynamicScope(names); builder.invokeStatic(template); builder.popDynamicScope(); } else { builder.invokeStatic(template); } }); return { blocks: blocks, inlines: inlines }; } function compileStatement(statement, builder) { STATEMENTS.compile(statement, builder); } function compileStatements(statements, meta, env) { var b = new _builder2.default(env, meta); for (var i = 0; i < statements.length; i++) { compileStatement(statements[i], b); } return b; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zeW50YXgvZnVuY3Rpb25zLmpzIl0sIm5hbWVzIjpbIm1hcCIsImFzc2VydCIsImRpY3QiLCJFTVBUWV9BUlJBWSIsIldpcmVGb3JtYXQiLCJPcGNvZGVCdWlsZGVyIiwiUmVnaXN0ZXIiLCJDbGllbnRTaWRlIiwiUmF3SW5saW5lQmxvY2siLCJPcHMiLCJBVFRSU19CTE9DSyIsIkNvbXBpbGVycyIsIm9mZnNldCIsIm5hbWVzIiwiZnVuY3MiLCJhZGQiLCJuYW1lIiwiZnVuYyIsInB1c2giLCJsZW5ndGgiLCJjb21waWxlIiwic2V4cCIsImJ1aWxkZXIiLCJpbmRleCIsIlNUQVRFTUVOVFMiLCJDTElFTlRfU0lERSIsIlRleHQiLCJ0ZXh0IiwiQ29tbWVudCIsImNvbW1lbnQiLCJDbG9zZUVsZW1lbnQiLCJfc2V4cCIsImNsb3NlRWxlbWVudCIsIkZsdXNoRWxlbWVudCIsImZsdXNoRWxlbWVudCIsIk1vZGlmaWVyIiwiZW52IiwibWV0YSIsInBhcmFtcyIsImhhc2giLCJoYXNNb2RpZmllciIsInRlbXBsYXRlTWV0YSIsImNvbXBpbGVBcmdzIiwibW9kaWZpZXIiLCJsb29rdXBNb2RpZmllciIsIkVycm9yIiwiU3RhdGljQXR0ciIsInZhbHVlIiwibmFtZXNwYWNlIiwic3RhdGljQXR0ciIsIkR5bmFtaWNBdHRyIiwiZHluYW1pY0F0dHIiLCJUcnVzdGluZ0F0dHIiLCJ0cnVzdGluZyIsImV4cHIiLCJkeW5hbWljQXR0ck5TIiwiT3BlbkVsZW1lbnQiLCJvcGVuUHJpbWl0aXZlRWxlbWVudCIsIk9wZW5Db21wb25lbnRFbGVtZW50IiwicHVzaENvbXBvbmVudE9wZXJhdGlvbnMiLCJvcGVuRWxlbWVudFdpdGhPcGVyYXRpb25zIiwiRGlkQ3JlYXRlRWxlbWVudCIsImRpZENyZWF0ZUVsZW1lbnQiLCJzMCIsIkRpZFJlbmRlckxheW91dCIsImRpZFJlbmRlckxheW91dCIsIkFwcGVuZCIsIm1hY3JvcyIsImlubGluZXMiLCJyZXR1cm5lZCIsImlzR2V0IiwiRSIsImlzTWF5YmVMb2NhbCIsImd1YXJkZWRBcHBlbmQiLCJjYXV0aW91c0FwcGVuZCIsIkJsb2NrIiwiX3RlbXBsYXRlIiwiX2ludmVyc2UiLCJ0ZW1wbGF0ZSIsImludmVyc2UiLCJ0ZW1wbGF0ZUJsb2NrIiwic2NhbiIsImludmVyc2VCbG9jayIsImJsb2NrcyIsIkludm9rZUR5bmFtaWNMYXlvdXQiLCJhdHRycyIsImludm9rZSIsInZtIiwibGF5b3V0Iiwic3ltYm9sVGFibGUiLCJzeW1ib2xzIiwiaGFzRXZhbCIsInN0YWNrIiwic2NvcGUiLCJwdXNoUm9vdFNjb3BlIiwiYmluZFNlbGYiLCJwb3AiLCJiaW5kQmxvY2siLCJpbmRleE9mIiwibG9va3VwIiwiJGV2YWwiLCJjYWxsZXJOYW1lcyIsImkiLCJzeW1ib2wiLCJiaW5kU3ltYm9sIiwibnVtUG9zaXRpb25hbEFyZ3MiLCJpbnZlcnNlU3ltYm9sIiwiZGVmYXVsdFN5bWJvbCIsImRlZmF1bHRCbG9jayIsImJpbmRFdmFsU2NvcGUiLCJwdXNoRnJhbWUiLCJjYWxsIiwiaGFuZGxlIiwidG9KU09OIiwiR2xpbW1lckRlYnVnIiwiQ29tcG9uZW50IiwidGFnIiwiYXJncyIsImJsb2NrIiwiaGFzQ29tcG9uZW50RGVmaW5pdGlvbiIsImNoaWxkIiwiYXR0cnNCbG9jayIsImRlZmluaXRpb24iLCJnZXRDb21wb25lbnREZWZpbml0aW9uIiwicHVzaENvbXBvbmVudE1hbmFnZXIiLCJpbnZva2VDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwic3RtdHMiLCJzdGF0ZW1lbnRzIiwiUGFydGlhbEludm9rZXIiLCJvdXRlclN5bWJvbHMiLCJldmFsSW5mbyIsIl9wYXJ0aWFsIiwicGFydGlhbCIsInBhcnRpYWxTeW1ib2xzIiwib3V0ZXJTY29wZSIsInBhcnRpYWxTY29wZSIsImJpbmRDYWxsZXJTY29wZSIsImdldENhbGxlclNjb3BlIiwiZ2V0RXZhbFNjb3BlIiwiZ2V0U2VsZiIsImxvY2FscyIsInNsb3QiLCJyZWYiLCJnZXRTeW1ib2wiLCJldmFsU2NvcGUiLCJ1bmRlZmluZWQiLCJiaW5kIiwiYmluZFBhcnRpYWxNYXAiLCJQYXJ0aWFsIiwiaGVscGVyIiwibmFtZVJlZiIsInBvc2l0aW9uYWwiLCJhdCIsIm4iLCJoYXNQYXJ0aWFsIiwibG9va3VwUGFydGlhbCIsIlN0cmluZyIsInN0YXJ0TGFiZWxzIiwicmV0dXJuVG8iLCJwdXNoSW1tZWRpYXRlIiwicHVzaEFyZ3MiLCJkdXAiLCJ0ZXN0IiwiZW50ZXIiLCJqdW1wVW5sZXNzIiwiZ2V0UGFydGlhbFRlbXBsYXRlIiwiY29tcGlsZUR5bmFtaWNCbG9jayIsImludm9rZUR5bmFtaWMiLCJwb3BTY29wZSIsInBvcEZyYW1lIiwibGFiZWwiLCJleGl0IiwicmV0dXJuIiwic3RvcExhYmVscyIsIkludm9rZUR5bmFtaWNZaWVsZCIsImNhbGxlckNvdW50IiwicHVzaENhbGxlclNjb3BlIiwidGFibGUiLCJjYWxsZWVDb3VudCIsImNvdW50IiwiTWF0aCIsIm1pbiIsImZyb21CYXNlIiwiWWllbGQiLCJ0byIsImNvbXBpbGVMaXN0IiwiZ2V0QmxvY2siLCJEZWJ1Z2dlciIsImRlYnVnZ2VyIiwiQ2xpZW50U2lkZVN0YXRlbWVudCIsIkVYUFJFU1NJT05TIiwiQ0xJRU5UX1NJREVfRVhQUlMiLCJFeHByZXNzaW9ucyIsImV4cHJlc3Npb24iLCJBcnJheSIsImlzQXJyYXkiLCJwcmltaXRpdmUiLCJVbmtub3duIiwiaGFzSGVscGVyIiwiSGVscGVyIiwiYXNQYXJ0aWFsIiwicmVzb2x2ZU1heWJlTG9jYWwiLCJnZXRWYXJpYWJsZSIsImdldFByb3BlcnR5IiwiQ29uY2F0IiwicGFydHMiLCJjb25jYXQiLCJGdW5jdGlvbkV4cHJlc3Npb24iLCJmdW5jdGlvbiIsImxvb2t1cEhlbHBlciIsIkdldCIsImhlYWQiLCJwYXRoIiwiTWF5YmVMb2NhbCIsInNsaWNlIiwiVW5kZWZpbmVkIiwiSGFzQmxvY2siLCJoYXNCbG9jayIsIkhhc0Jsb2NrUGFyYW1zIiwiaGFzQmxvY2tQYXJhbXMiLCJDbGllbnRTaWRlRXhwcmVzc2lvbiIsIkJsb2NrcyIsImFkZE1pc3NpbmciLCJtaXNzaW5nIiwiaGFuZGxlZCIsIkJMT0NLUyIsIklubGluZXMiLCJJTkxJTkVTIiwicG9wdWxhdGVCdWlsdGlucyIsIl9oYXNoIiwiaW52b2tlU3RhdGljIiwianVtcCIsImp1bXBJZiIsInB1dEl0ZXJhdG9yIiwiZnAiLCJlbnRlckxpc3QiLCJpdGVyYXRlIiwiZXhpdExpc3QiLCJrZXlzIiwidmFsdWVzIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiX3BhcmFtcyIsImV4cHJlc3Npb25zIiwicHVzaER5bmFtaWNTY29wZSIsImJpbmREeW5hbWljU2NvcGUiLCJwb3BEeW5hbWljU2NvcGUiLCJjb21waWxlU3RhdGVtZW50Iiwic3RhdGVtZW50IiwiY29tcGlsZVN0YXRlbWVudHMiLCJiIl0sIm1hcHBpbmdzIjoiOzs7Ozs7UUFxVE8sQUFBUztRQXNFVCxBQUFTO1FBZ0ZULEFBQVM7UUFzT1QsQUFBUztRQUdULEFBQVM7O0FBcHJCaEIsQUFBUyxBQUFXOztBQUNwQixBQUFTLEFBQVEsQUFBTSxBQUEyQjs7QUFDbEQsQUFBTzs7SUFBUCxBQUFZLEFBQWdCOztBQUM1QixBQUFPLEFBQW1COzs7O0FBQzFCLEFBQVMsQUFBZ0I7O0FBQ3pCLEFBQU87O0lBQVAsQUFBWSxBQUFnQjs7QUFDNUIsQUFBTyxBQUFvQjs7Ozs7Ozs7Ozs7Ozs7QUFDM0IsSUFBSSxNQUFNLFdBQVYsQUFBcUIsQUFDckI7QUFBTyxJQUFNLG9DQUFOLEFBQW9COztJLEFBQ3JCLHdCQUNGO3lCQUF3QjtZQUFaLEFBQVksNkVBQUgsQUFBRzs7OEJBQ3BCOzthQUFBLEFBQUssU0FBTCxBQUFjLEFBQ2Q7YUFBQSxBQUFLLFFBQUwsQUFBYSxBQUNiO2FBQUEsQUFBSyxRQUFMLEFBQWEsQUFDaEI7Ozt3QixBQUNELG1CLEFBQUksTSxBQUFNLE1BQU0sQUFDWjthQUFBLEFBQUssTUFBTCxBQUFXLEtBQVgsQUFBZ0IsQUFDaEI7YUFBQSxBQUFL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