shift-spidermonkey-converter
Version:
convert ASTs between Shift and SpiderMonkey formats
943 lines (903 loc) • 102 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /**
* Copyright 2014 Shape Security, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License")
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// convert Shift AST format to SpiderMonkey AST format
var _cookTemplateString = require("./cook-template-string");
var _cookTemplateString2 = _interopRequireDefault(_cookTemplateString);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError("Cannot destructure undefined"); }
var SpiderMonkeyConverter = {
convert: function convert(ast) {
if (ast == null) {
return null;
}
return this["convert" + ast.type](ast);
},
// bindings
convertBindingWithDefault: function convertBindingWithDefault(node) {
return {
type: "AssignmentPattern",
left: this.convert(node.binding),
right: this.convert(node.init)
};
},
convertBindingIdentifier: function convertBindingIdentifier(node) {
return this.createIdentifier(node.name);
},
convertArrayBinding: function convertArrayBinding(node) {
var _this = this;
var elts = node.elements.map(function (v) {
if (v == null) return v;
if (v.type === "BindingWithDefault") {
return {
type: "AssignmentPattern",
left: _this.convert(v.binding),
right: _this.convert(v.init)
};
}
return _this.convert(v);
});
if (node.restElement) elts.push({
type: "RestElement",
argument: this.convert(node.restElement)
});
return { type: "ArrayPattern", elements: elts };
},
convertObjectBinding: function convertObjectBinding(node) {
return {
type: "ObjectPattern",
properties: node.properties.map(this.convert.bind(this))
};
},
convertBindingPropertyIdentifier: function convertBindingPropertyIdentifier(node) {
var key = this.convert(node.binding);
var value = !node.init ? key : {
type: "AssignmentPattern",
left: key,
right: this.convert(node.init)
};
return {
type: "Property",
kind: "init",
method: false,
computed: false,
shorthand: true,
key: key,
value: value
};
},
convertBindingPropertyProperty: function convertBindingPropertyProperty(node) {
return {
type: "Property",
kind: "init",
computed: false,
method: false,
shorthand: false,
key: this.convert(node.name),
value: this.convert(node.binding)
};
},
// classes
convertClassExpression: function convertClassExpression(node) {
var expression = this.convertClassDeclaration(node);
expression.type = "ClassExpression";
return expression;
},
convertClassDeclaration: function convertClassDeclaration(node) {
return {
type: "ClassDeclaration",
id: this.convert(node.name),
superClass: this.convert(node.super),
body: {
type: "ClassBody",
body: node.elements.map(this.convert.bind(this))
}
};
},
convertClassElement: function convertClassElement(node) {
var m = node.method;
var key = this.convertPropertyName(m.name);
var computed = m.name.type === "ComputedPropertyName";
switch (m.type) {
case "Method":
{
var _convertFormalParamet = this.convertFormalParameters(m),
_convertFormalParamet2 = _slicedToArray(_convertFormalParamet, 2),
params = _convertFormalParamet2[0],
defaults = _convertFormalParamet2[1];
return {
type: "MethodDefinition",
key: key,
computed: computed,
kind: m.name.value === "constructor" ? "constructor" : "method",
static: node.isStatic,
value: {
type: "FunctionExpression",
id: null,
params: params,
defaults: defaults,
generator: m.isGenerator,
expression: false,
body: this.convert(m.body)
}
};
}
case "Getter":
return {
type: "MethodDefinition",
key: key,
computed: computed,
kind: "get",
static: node.isStatic,
value: {
type: "FunctionExpression",
id: null,
params: [],
defaults: [],
generator: false,
expression: false,
body: this.convert(m.body)
}
};
case "Setter":
{
var _convertFormalParamet3 = this.convertFormalParameters({ params: { items: [m.param] } }),
_convertFormalParamet4 = _slicedToArray(_convertFormalParamet3, 2),
_params = _convertFormalParamet4[0],
_defaults = _convertFormalParamet4[1]; // mocking a FormalParameters object
return {
type: "MethodDefinition",
key: key,
computed: computed,
kind: "set",
static: node.isStatic,
value: {
type: "FunctionExpression",
id: null,
params: _params,
defaults: _defaults,
generator: false,
expression: false,
body: this.convert(m.body)
}
};
}
}
},
// modules
convertModule: function convertModule(node) {
return {
type: "Program",
body: node.items.map(this.convert.bind(this)),
sourceType: "module"
};
},
convertImport: function convertImport(node) {
var specifiers = node.namedImports.map(this.convert.bind(this));
if (node.defaultBinding) specifiers.unshift({
type: "ImportDefaultSpecifier",
local: this.convert(node.defaultBinding)
});
return {
type: "ImportDeclaration",
source: {
type: "Literal",
value: node.moduleSpecifier
},
specifiers: specifiers
};
},
convertImportNamespace: function convertImportNamespace(node) {
var specifiers = [{
type: "ImportNamespaceSpecifier",
local: this.convert(node.namespaceBinding)
}];
if (node.defaultBinding != null) {
specifiers.unshift({
type: "ImportDefaultSpecifier",
local: this.convert(node.defaultBinding)
});
}
return {
type: "ImportDeclaration",
source: {
type: "Literal",
value: node.moduleSpecifier
},
specifiers: specifiers
};
},
convertImportSpecifier: function convertImportSpecifier(node) {
return {
type: "ImportSpecifier",
local: this.convert(node.binding),
imported: this.createIdentifier(node.name)
};
},
convertExportAllFrom: function convertExportAllFrom(node) {
return {
type: "ExportAllDeclaration",
source: {
type: "Literal",
value: node.moduleSpecifier
}
};
},
convertExportFrom: function convertExportFrom(node) {
return {
type: "ExportNamedDeclaration",
declaration: null,
source: node.moduleSpecifier == null ? null : {
type: "Literal",
value: node.moduleSpecifier
},
specifiers: node.namedExports.map(this.convert.bind(this))
};
},
convertExport: function convertExport(node) {
return {
type: "ExportNamedDeclaration",
declaration: this.convert(node.declaration),
specifiers: [],
source: null
};
},
convertExportDefault: function convertExportDefault(node) {
return {
type: "ExportDefaultDeclaration",
declaration: this.convert(node.body)
};
},
convertExportSpecifier: function convertExportSpecifier(node) {
return {
type: "ExportSpecifier",
exported: this.createIdentifier(node.exportedName),
local: this.createIdentifier(node.name != null ? node.name : node.exportedName)
};
},
// property definition
convertMethod: function convertMethod(node) {
var _convertFormalParamet5 = this.convertFormalParameters(node),
_convertFormalParamet6 = _slicedToArray(_convertFormalParamet5, 2),
params = _convertFormalParamet6[0],
defaults = _convertFormalParamet6[1];
return {
type: "Property",
key: this.convert(node.name),
computed: node.name.type === "ComputedPropertyName",
kind: "init",
method: true,
shorthand: false,
value: {
type: "FunctionExpression",
id: null,
params: params,
defaults: defaults,
generator: node.isGenerator,
expression: false,
body: this.convertFunctionBody(node.body)
}
};
},
convertGetter: function convertGetter(node) {
return {
type: "Property",
key: this.convert(node.name),
computed: node.name.type === "ComputedPropertyName",
value: {
type: "FunctionExpression",
id: null,
params: [],
defaults: [],
body: this.convertFunctionBody(node.body),
generator: false,
expression: false
},
method: false,
shorthand: false,
kind: "get"
};
},
convertSetter: function convertSetter(node) {
var _convertFormalParamet7 = this.convertFormalParameters({ params: { items: [node.param] } }),
_convertFormalParamet8 = _slicedToArray(_convertFormalParamet7, 2),
params = _convertFormalParamet8[0],
defaults = _convertFormalParamet8[1]; // mocking a FormalParameters object
return {
type: "Property",
key: this.convert(node.name),
computed: node.name.type === "ComputedPropertyName",
value: {
type: "FunctionExpression",
id: null,
params: params,
defaults: defaults,
body: this.convertFunctionBody(node.body),
generator: false,
expression: false
},
method: false,
shorthand: false,
kind: "set"
};
},
convertDataProperty: function convertDataProperty(node) {
return {
type: "Property",
key: this.convert(node.name),
value: this.convert(node.expression),
kind: "init",
computed: node.name.type === "ComputedPropertyName",
method: false,
shorthand: false
};
},
convertShorthandProperty: function convertShorthandProperty(node) {
return {
type: "Property",
shorthand: true,
kind: "init",
method: false,
computed: false,
key: this.createIdentifier(node.name),
value: this.createIdentifier(node.name)
};
},
convertComputedPropertyName: function convertComputedPropertyName(node) {
return this.convert(node.expression);
},
convertStaticPropertyName: function convertStaticPropertyName(node) {
return {
type: "Literal",
value: node.value
};
},
// literals
convertLiteralBooleanExpression: function convertLiteralBooleanExpression(node) {
return {
type: "Literal",
value: node.value
};
},
convertLiteralInfinityExpression: function convertLiteralInfinityExpression() {
return {
type: "Literal",
value: 1 / 0
};
},
convertLiteralNullExpression: function convertLiteralNullExpression() {
return {
type: "Literal",
value: null
};
},
convertLiteralNumericExpression: function convertLiteralNumericExpression(node) {
return {
type: "Literal",
value: parseFloat(node.value)
};
},
convertLiteralRegExpExpression: function convertLiteralRegExpExpression(node) {
var value = void 0;
try {
value = RegExp(node.pattern, node.flags);
} catch (_ref) {
_objectDestructuringEmpty(_ref);
value = null;
}
return {
type: "Literal",
value: value,
regex: {
pattern: node.pattern,
flags: node.flags
}
};
},
convertLiteralStringExpression: function convertLiteralStringExpression(node) {
return {
type: "Literal",
value: node.value
};
},
// other expressions
convertArrayExpression: function convertArrayExpression(node) {
return {
type: "ArrayExpression",
elements: node.elements.map(this.convert.bind(this))
};
},
convertArrowExpression: function convertArrowExpression(node) {
var _convertFormalParamet9 = this.convertFormalParameters(node),
_convertFormalParamet10 = _slicedToArray(_convertFormalParamet9, 2),
params = _convertFormalParamet10[0],
defaults = _convertFormalParamet10[1],
body = this.convert(node.body);
return {
type: "ArrowFunctionExpression",
id: null,
generator: false,
expression: body.type !== "BlockStatement",
params: params,
defaults: defaults,
body: this.convert(node.body)
};
},
convertAssignmentExpression: function convertAssignmentExpression(node) {
return {
type: "AssignmentExpression",
operator: "=",
left: this.convert(node.binding),
right: this.convert(node.expression)
};
},
convertBinaryExpression: function convertBinaryExpression(node) {
if (node.operator === ",") {
return {
type: "SequenceExpression",
expressions: this.convertSequenceExpressionToArray(node)
};
}
return {
type: node.operator === "||" || node.operator === "&&" ? "LogicalExpression" : "BinaryExpression",
operator: node.operator,
left: this.convert(node.left),
right: this.convert(node.right)
};
},
convertCallExpression: function convertCallExpression(node) {
return {
type: "CallExpression",
callee: this.convert(node.callee),
arguments: node.arguments.map(this.convert.bind(this))
};
},
convertCompoundAssignmentExpression: function convertCompoundAssignmentExpression(node) {
return {
type: "AssignmentExpression",
operator: node.operator,
left: this.convert(node.binding),
right: this.convert(node.expression)
};
},
convertComputedMemberExpression: function convertComputedMemberExpression(node) {
return {
type: "MemberExpression",
object: this.convert(node.object),
property: this.convert(node.expression),
computed: true
};
},
convertConditionalExpression: function convertConditionalExpression(node) {
return {
type: "ConditionalExpression",
test: this.convert(node.test),
alternate: this.convert(node.alternate),
consequent: this.convert(node.consequent)
};
},
convertFunctionExpression: function convertFunctionExpression(node) {
var _convertFormalParamet11 = this.convertFormalParameters(node),
_convertFormalParamet12 = _slicedToArray(_convertFormalParamet11, 2),
params = _convertFormalParamet12[0],
defaults = _convertFormalParamet12[1];
return {
type: "FunctionExpression",
id: this.convert(node.name),
params: params,
defaults: defaults,
body: this.convert(node.body),
generator: node.isGenerator,
expression: false
};
},
convertIdentifierExpression: function convertIdentifierExpression(node) {
return this.createIdentifier(node.name);
},
convertNewExpression: function convertNewExpression(node) {
return {
type: "NewExpression",
callee: this.convert(node.callee),
arguments: node.arguments.map(this.convert.bind(this))
};
},
convertNewTargetExpression: function convertNewTargetExpression() {
return {
type: "MetaProperty",
meta: "new",
property: "target"
};
},
convertObjectExpression: function convertObjectExpression(node) {
return {
type: "ObjectExpression",
properties: node.properties.map(this.convert.bind(this))
};
},
convertUnaryExpression: function convertUnaryExpression(node) {
return {
type: "UnaryExpression",
operator: node.operator,
argument: this.convert(node.operand),
prefix: true
};
},
convertStaticMemberExpression: function convertStaticMemberExpression(node) {
return {
type: "MemberExpression",
object: this.convert(node.object),
property: this.createIdentifier(node.property),
computed: false
};
},
convertTemplateExpression: function convertTemplateExpression(node) {
var _this2 = this;
var quasis = [],
expressions = [];
node.elements.forEach(function (v, i) {
if (i % 2 === 0) quasis.push(_this2.convert(v));else expressions.push(_this2.convert(v));
});
quasis[quasis.length - 1].tail = true;
if (node.tag != null) {
return {
type: "TaggedTemplateExpression",
tag: this.convert(node.tag),
quasi: {
type: "TemplateLiteral",
quasis: quasis,
expressions: expressions
}
};
}
return {
type: "TemplateLiteral",
quasis: quasis,
expressions: expressions
};
},
convertThisExpression: function convertThisExpression() {
return {
type: "ThisExpression"
};
},
convertUpdateExpression: function convertUpdateExpression(node) {
return {
type: "UpdateExpression",
prefix: node.isPrefix,
operator: node.operator,
argument: this.convert(node.operand)
};
},
convertYieldExpression: function convertYieldExpression(node) {
return {
type: "YieldExpression",
argument: this.convert(node.expression),
delegate: false
};
},
convertYieldGeneratorExpression: function convertYieldGeneratorExpression(node) {
var expr = this.convertYieldExpression(node);
expr.delegate = true;
return expr;
},
// other statements
convertBlockStatement: function convertBlockStatement(node) {
return this.convertBlock(node.block);
},
convertBreakStatement: function convertBreakStatement(node) {
return {
type: "BreakStatement",
label: node.label ? this.createIdentifier(node.label) : null
};
},
convertContinueStatement: function convertContinueStatement(node) {
return {
type: "ContinueStatement",
label: node.label ? this.createIdentifier(node.label) : null
};
},
convertDebuggerStatement: function convertDebuggerStatement() {
return {
type: "DebuggerStatement"
};
},
convertDoWhileStatement: function convertDoWhileStatement(node) {
return {
type: "DoWhileStatement",
test: this.convert(node.test),
body: this.convert(node.body)
};
},
convertEmptyStatement: function convertEmptyStatement() {
return {
type: "EmptyStatement"
};
},
convertExpressionStatement: function convertExpressionStatement(node) {
return {
type: "ExpressionStatement",
expression: this.convert(node.expression)
};
},
convertForInStatement: function convertForInStatement(node) {
return {
type: "ForInStatement",
left: this.convert(node.left),
right: this.convert(node.right),
body: this.convert(node.body)
};
},
convertForOfStatement: function convertForOfStatement(node) {
return {
type: "ForOfStatement",
left: this.convert(node.left),
right: this.convert(node.right),
body: this.convert(node.body)
};
},
convertForStatement: function convertForStatement(node) {
return {
type: "ForStatement",
init: this.convert(node.init),
test: this.convert(node.test),
update: this.convert(node.update),
body: this.convert(node.body)
};
},
convertIfStatement: function convertIfStatement(node) {
return {
type: "IfStatement",
test: this.convert(node.test),
consequent: this.convert(node.consequent),
alternate: this.convert(node.alternate)
};
},
convertLabeledStatement: function convertLabeledStatement(node) {
return {
type: "LabeledStatement",
label: this.createIdentifier(node.label),
body: this.convert(node.body)
};
},
convertReturnStatement: function convertReturnStatement(node) {
return {
type: "ReturnStatement",
argument: this.convert(node.expression)
};
},
convertSwitchStatement: function convertSwitchStatement(node) {
return {
type: "SwitchStatement",
discriminant: this.convert(node.discriminant),
cases: node.cases.map(this.convert.bind(this))
};
},
convertSwitchStatementWithDefault: function convertSwitchStatementWithDefault(node) {
return {
type: "SwitchStatement",
discriminant: this.convert(node.discriminant),
cases: node.preDefaultCases.map(this.convert.bind(this)).concat(this.convert(node.defaultCase)).concat(node.postDefaultCases.map(this.convert.bind(this)))
};
},
convertThrowStatement: function convertThrowStatement(node) {
return {
type: "ThrowStatement",
argument: this.convert(node.expression)
};
},
convertTryCatchStatement: function convertTryCatchStatement(node) {
var catchClause = this.convert(node.catchClause);
return {
type: "TryStatement",
block: this.convertBlock(node.body),
handler: catchClause,
finalizer: null
};
},
convertTryFinallyStatement: function convertTryFinallyStatement(node) {
var catchClause = this.convert(node.catchClause);
return {
type: "TryStatement",
block: this.convertBlock(node.body),
handler: catchClause,
finalizer: this.convert(node.finalizer)
};
},
convertVariableDeclarationStatement: function convertVariableDeclarationStatement(node) {
return this.convert(node.declaration);
},
convertWhileStatement: function convertWhileStatement(node) {
return {
type: "WhileStatement",
test: this.convert(node.test),
body: this.convert(node.body)
};
},
convertWithStatement: function convertWithStatement(node) {
return {
type: "WithStatement",
object: this.convert(node.object),
body: this.convert(node.body)
};
},
// other nodes
convertBlock: function convertBlock(node) {
return {
type: "BlockStatement",
body: node.statements.map(this.convert.bind(this))
};
},
convertCatchClause: function convertCatchClause(node) {
return {
type: "CatchClause",
param: this.convert(node.binding),
body: this.convert(node.body)
};
},
convertDirective: function convertDirective(node) {
return {
type: "ExpressionStatement",
expression: {
type: "Literal",
value: node.rawValue
},
directive: node.rawValue
};
},
convertFormalParameters: function convertFormalParameters(node) {
var _this3 = this;
var ps = node.params;
var params = [],
defaults = [];
if (ps.items.length > 0) {
var hasDefaultBindings = false;
ps.items.forEach(function (v) {
if (v.type === "BindingWithDefault") {
hasDefaultBindings = true;
params.push(_this3.convert(v.binding));
defaults.push(_this3.convert(v.init));
} else {
params.push(_this3.convert(v));
defaults.push(null);
}
});
if (ps.rest != null) {
params.push({ type: "RestElement", argument: this.convert(ps.rest) });
defaults.push(null);
}
if (!hasDefaultBindings) {
defaults = [];
}
}
return [params, defaults];
},
convertFunctionBody: function convertFunctionBody(node) {
var directives = node.directives ? node.directives.map(this.convert.bind(this)) : [],
statements = node.statements ? node.statements.map(this.convert.bind(this)) : [];
return {
type: "BlockStatement",
body: directives.concat(statements)
};
},
convertFunctionDeclaration: function convertFunctionDeclaration(node) {
var _convertFormalParamet13 = this.convertFormalParameters(node),
_convertFormalParamet14 = _slicedToArray(_convertFormalParamet13, 2),
params = _convertFormalParamet14[0],
defaults = _convertFormalParamet14[1];
return {
type: "FunctionDeclaration",
id: this.convert(node.name),
params: params,
defaults: defaults,
body: this.convert(node.body),
generator: node.isGenerator,
expression: false
};
},
convertScript: function convertScript(node) {
var directives = node.directives.map(this.convert.bind(this)),
statements = node.statements.map(this.convert.bind(this));
return {
type: "Program",
body: directives.concat(statements),
sourceType: "script"
};
},
convertSpreadElement: function convertSpreadElement(node) {
return {
type: "SpreadElement",
argument: this.convert(node.expression)
};
},
convertSuper: function convertSuper() {
return {
type: "Super"
};
},
convertSwitchCase: function convertSwitchCase(node) {
return {
type: "SwitchCase",
test: this.convert(node.test),
consequent: node.consequent.map(this.convert.bind(this))
};
},
convertSwitchDefault: function convertSwitchDefault(node) {
return {
type: "SwitchCase",
test: null,
consequent: node.consequent.map(this.convert.bind(this))
};
},
convertTemplateElement: function convertTemplateElement(node) {
return {
type: "TemplateElement",
value: {
raw: node.rawValue,
cooked: (0, _cookTemplateString2.default)(node.rawValue)
},
tail: false
};
},
convertVariableDeclaration: function convertVariableDeclaration(node) {
return {
type: "VariableDeclaration",
declarations: node.declarators.map(this.convert.bind(this)),
kind: node.kind
};
},
convertVariableDeclarator: function convertVariableDeclarator(node) {
return {
type: "VariableDeclarator",
id: this.convert(node.binding),
init: this.convert(node.init)
};
},
// auxiliary methods
convertPropertyName: function convertPropertyName(node) {
switch (node.type) {
case "StaticPropertyName":
return this.convertStaticPropertyName(node);
case "ComputedPropertyName":
return this.convertComputedPropertyName(node);
case "ShorthandProperty":
return this.convertShorthandProperty(node);
}
},
convertSequenceExpressionToArray: function convertSequenceExpressionToArray(node) {
var array = [];
if (node.left.type === "BinaryExpression" && node.left.operator === ",") {
array = this.convertSequenceExpressionToArray(node.left);
} else {
array = [this.convert(node.left)];
}
array.push(this.convert(node.right));
return array;
},
createIdentifier: function createIdentifier(name) {
return {
type: "Identifier",
name: name
};
},
convertIdentifier: function convertIdentifier(node) {
return this.createIdentifier(node.name);
}
};
exports.default = SpiderMonkeyConverter;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90by1zcGlkZXJtb25rZXkuanMiXSwibmFtZXMiOlsiU3BpZGVyTW9ua2V5Q29udmVydGVyIiwiY29udmVydCIsImFzdCIsInR5cGUiLCJjb252ZXJ0QmluZGluZ1dpdGhEZWZhdWx0Iiwibm9kZSIsImxlZnQiLCJiaW5kaW5nIiwicmlnaHQiLCJpbml0IiwiY29udmVydEJpbmRpbmdJZGVudGlmaWVyIiwiY3JlYXRlSWRlbnRpZmllciIsIm5hbWUiLCJjb252ZXJ0QXJyYXlCaW5kaW5nIiwiZWx0cyIsImVsZW1lbnRzIiwibWFwIiwidiIsInJlc3RFbGVtZW50IiwicHVzaCIsImFyZ3VtZW50IiwiY29udmVydE9iamVjdEJpbmRpbmciLCJwcm9wZXJ0aWVzIiwiYmluZCIsImNvbnZlcnRCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyIiwia2V5IiwidmFsdWUiLCJraW5kIiwibWV0aG9kIiwiY29tcHV0ZWQiLCJzaG9ydGhhbmQiLCJjb252ZXJ0QmluZGluZ1Byb3BlcnR5UHJvcGVydHkiLCJjb252ZXJ0Q2xhc3NFeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImNvbnZlcnRDbGFzc0RlY2xhcmF0aW9uIiwiaWQiLCJzdXBlckNsYXNzIiwic3VwZXIiLCJib2R5IiwiY29udmVydENsYXNzRWxlbWVudCIsIm0iLCJjb252ZXJ0UHJvcGVydHlOYW1lIiwiY29udmVydEZvcm1hbFBhcmFtZXRlcnMiLCJwYXJhbXMiLCJkZWZhdWx0cyIsInN0YXRpYyIsImlzU3RhdGljIiwiZ2VuZXJhdG9yIiwiaXNHZW5lcmF0b3IiLCJpdGVtcyIsInBhcmFtIiwiY29udmVydE1vZHVsZSIsInNvdXJjZVR5cGUiLCJjb252ZXJ0SW1wb3J0Iiwic3BlY2lmaWVycyIsIm5hbWVkSW1wb3J0cyIsImRlZmF1bHRCaW5kaW5nIiwidW5zaGlmdCIsImxvY2FsIiwic291cmNlIiwibW9kdWxlU3BlY2lmaWVyIiwiY29udmVydEltcG9ydE5hbWVzcGFjZSIsIm5hbWVzcGFjZUJpbmRpbmciLCJjb252ZXJ0SW1wb3J0U3BlY2lmaWVyIiwiaW1wb3J0ZWQiLCJjb252ZXJ0RXhwb3J0QWxsRnJvbSIsImNvbnZlcnRFeHBvcnRGcm9tIiwiZGVjbGFyYXRpb24iLCJuYW1lZEV4cG9ydHMiLCJjb252ZXJ0RXhwb3J0IiwiY29udmVydEV4cG9ydERlZmF1bHQiLCJjb252ZXJ0RXhwb3J0U3BlY2lmaWVyIiwiZXhwb3J0ZWQiLCJleHBvcnRlZE5hbWUiLCJjb252ZXJ0TWV0aG9kIiwiY29udmVydEZ1bmN0aW9uQm9keSIsImNvbnZlcnRHZXR0ZXIiLCJjb252ZXJ0U2V0dGVyIiwiY29udmVydERhdGFQcm9wZXJ0eSIsImNvbnZlcnRTaG9ydGhhbmRQcm9wZXJ0eSIsImNvbnZlcnRDb21wdXRlZFByb3BlcnR5TmFtZSIsImNvbnZlcnRTdGF0aWNQcm9wZXJ0eU5hbWUiLCJjb252ZXJ0TGl0ZXJhbEJvb2xlYW5FeHByZXNzaW9uIiwiY29udmVydExpdGVyYWxJbmZpbml0eUV4cHJlc3Npb24iLCJjb252ZXJ0TGl0ZXJhbE51bGxFeHByZXNzaW9uIiwiY29udmVydExpdGVyYWxOdW1lcmljRXhwcmVzc2lvbiIsInBhcnNlRmxvYXQiLCJjb252ZXJ0TGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb24iLCJSZWdFeHAiLCJwYXR0ZXJuIiwiZmxhZ3MiLCJyZWdleCIsImNvbnZlcnRMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbiIsImNvbnZlcnRBcnJheUV4cHJlc3Npb24iLCJjb252ZXJ0QXJyb3dFeHByZXNzaW9uIiwiY29udmVydEFzc2lnbm1lbnRFeHByZXNzaW9uIiwib3BlcmF0b3IiLCJjb252ZXJ0QmluYXJ5RXhwcmVzc2lvbiIsImV4cHJlc3Npb25zIiwiY29udmVydFNlcXVlbmNlRXhwcmVzc2lvblRvQXJyYXkiLCJjb252ZXJ0Q2FsbEV4cHJlc3Npb24iLCJjYWxsZWUiLCJhcmd1bWVudHMiLCJjb252ZXJ0Q29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvbiIsImNvbnZlcnRDb21wdXRlZE1lbWJlckV4cHJlc3Npb24iLCJvYmplY3QiLCJwcm9wZXJ0eSIsImNvbnZlcnRDb25kaXRpb25hbEV4cHJlc3Npb24iLCJ0ZXN0IiwiYWx0ZXJuYXRlIiwiY29uc2VxdWVudCIsImNvbnZlcnRGdW5jdGlvbkV4cHJlc3Npb24iLCJjb252ZXJ0SWRlbnRpZmllckV4cHJlc3Npb24iLCJjb252ZXJ0TmV3RXhwcmVzc2lvbiIsImNvbnZlcnROZXdUYXJnZXRFeHByZXNzaW9uIiwibWV0YSIsImNvbnZlcnRPYmplY3RFeHByZXNzaW9uIiwiY29udmVydFVuYXJ5RXhwcmVzc2lvbiIsIm9wZXJhbmQiLCJwcmVmaXgiLCJjb252ZXJ0U3RhdGljTWVtYmVyRXhwcmVzc2lvbiIsImNvbnZlcnRUZW1wbGF0ZUV4cHJlc3Npb24iLCJxdWFzaXMiLCJmb3JFYWNoIiwiaSIsImxlbmd0aCIsInRhaWwiLCJ0YWciLCJxdWFzaSIsImNvbnZlcnRUaGlzRXhwcmVzc2lvbiIsImNvbnZlcnRVcGRhdGVFeHByZXNzaW9uIiwiaXNQcmVmaXgiLCJjb252ZXJ0WWllbGRFeHByZXNzaW9uIiwiZGVsZWdhdGUiLCJjb252ZXJ0WWllbGRHZW5lcmF0b3JFeHByZXNzaW9uIiwiZXhwciIsImNvbnZlcnRCbG9ja1N0YXRlbWVudCIsImNvbnZlcnRCbG9jayIsImJsb2NrIiwiY29udmVydEJyZWFrU3RhdGVtZW50IiwibGFiZWwiLCJjb252ZXJ0Q29udGludWVTdGF0ZW1lbnQiLCJjb252ZXJ0RGVidWdnZXJTdGF0ZW1lbnQiLCJjb252ZXJ0RG9XaGlsZVN0YXRlbWVudCIsImNvbnZlcnRFbXB0eVN0YXRlbWVudCIsImNvbnZlcnRFeHByZXNzaW9uU3RhdGVtZW50IiwiY29udmVydEZvckluU3RhdGVtZW50IiwiY29udmVydEZvck9mU3RhdGVtZW50IiwiY29udmVydEZvclN0YXRlbWVudCIsInVwZGF0ZSIsImNvbnZlcnRJZlN0YXRlbWVudCIsImNvbnZlcnRMYWJlbGVkU3RhdGVtZW50IiwiY29udmVydFJldHVyblN0YXRlbWVudCIsImNvbnZlcnRTd2l0Y2hTdGF0ZW1lbnQiLCJkaXNjcmltaW5hbnQiLCJjYXNlcyIsImNvbnZlcnRTd2l0Y2hTdGF0ZW1lbnRXaXRoRGVmYXVsdCIsInByZURlZmF1bHRDYXNlcyIsImNvbmNhdCIsImRlZmF1bHRDYXNlIiwicG9zdERlZmF1bHRDYXNlcyIsImNvbnZlcnRUaHJvd1N0YXRlbWVudCIsImNvbnZlcnRUcnlDYXRjaFN0YXRlbWVudCIsImNhdGNoQ2xhdXNlIiwiaGFuZGxlciIsImZpbmFsaXplciIsImNvbnZlcnRUcnlGaW5hbGx5U3RhdGVtZW50IiwiY29udmVydFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCJjb252ZXJ0V2hpbGVTdGF0ZW1lbnQiLCJjb252ZXJ0V2l0aFN0YXRlbWVudCIsInN0YXRlbWVudHMiLCJjb252ZXJ0Q2F0Y2hDbGF1c2UiLCJjb252ZXJ0RGlyZWN0aXZlIiwicmF3VmFsdWUiLCJkaXJlY3RpdmUiLCJwcyIsImhhc0RlZmF1bHRCaW5kaW5ncyIsInJlc3QiLCJkaXJlY3RpdmVzIiwiY29udmVydEZ1bmN0aW9uRGVjbGFyYXRpb24iLCJjb252ZXJ0U2NyaXB0IiwiY29udmVydFNwcmVhZEVsZW1lbnQiLCJjb252ZXJ0U3VwZXIiLCJjb252ZXJ0U3dpdGNoQ2FzZSIsImNvbnZlcnRTd2l0Y2hEZWZhdWx0IiwiY29udmVydFRlbXBsYXRlRWxlbWVudCIsInJhdyIsImNvb2tlZCIsImNvbnZlcnRWYXJpYWJsZURlY2xhcmF0aW9uIiwiZGVjbGFyYXRpb25zIiwiZGVjbGFyYXRvcnMiLCJjb252ZXJ0VmFyaWFibGVEZWNsYXJhdG9yIiwiYXJyYXkiLCJjb252ZXJ0SWRlbnRpZmllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3lwQkFBQTs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTs7QUFFQTs7Ozs7Ozs7QUFFQSxJQUFNQSx3QkFBd0I7QUFDNUJDLFNBRDRCLG1CQUNwQkMsR0FEb0IsRUFDZjtBQUNYLFFBQUlBLE9BQU8sSUFBWCxFQUFpQjtBQUNmLGFBQU8sSUFBUDtBQUNE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