UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

367 lines (366 loc) 69.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ts_utils_1 = require("@neo-one/ts-utils"); const utils_1 = require("@neo-one/utils"); const typescript_1 = tslib_1.__importDefault(require("typescript")); const builtins_1 = require("../builtins"); const types_1 = require("../helper/types"); const NodeCompiler_1 = require("../NodeCompiler"); class BinaryExpressionCompiler extends NodeCompiler_1.NodeCompiler { constructor() { super(...arguments); this.kind = typescript_1.default.SyntaxKind.BinaryExpression; } visitNode(sb, expr, options) { const kind = ts_utils_1.tsUtils.expression.getOperatorToken(expr).kind; switch (kind) { case typescript_1.default.SyntaxKind.EqualsToken: case typescript_1.default.SyntaxKind.PlusEqualsToken: case typescript_1.default.SyntaxKind.MinusEqualsToken: case typescript_1.default.SyntaxKind.AsteriskAsteriskEqualsToken: case typescript_1.default.SyntaxKind.AsteriskEqualsToken: case typescript_1.default.SyntaxKind.SlashEqualsToken: case typescript_1.default.SyntaxKind.PercentEqualsToken: case typescript_1.default.SyntaxKind.AmpersandEqualsToken: case typescript_1.default.SyntaxKind.BarEqualsToken: case typescript_1.default.SyntaxKind.CaretEqualsToken: case typescript_1.default.SyntaxKind.LessThanLessThanEqualsToken: case typescript_1.default.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: case typescript_1.default.SyntaxKind.GreaterThanGreaterThanEqualsToken: this.visitAssignmentOperator(sb, kind, expr, options); break; case typescript_1.default.SyntaxKind.AsteriskToken: case typescript_1.default.SyntaxKind.SlashToken: case typescript_1.default.SyntaxKind.PercentToken: case typescript_1.default.SyntaxKind.PlusToken: case typescript_1.default.SyntaxKind.MinusToken: case typescript_1.default.SyntaxKind.GreaterThanGreaterThanToken: case typescript_1.default.SyntaxKind.LessThanLessThanToken: case typescript_1.default.SyntaxKind.LessThanToken: case typescript_1.default.SyntaxKind.LessThanEqualsToken: case typescript_1.default.SyntaxKind.GreaterThanToken: case typescript_1.default.SyntaxKind.GreaterThanEqualsToken: case typescript_1.default.SyntaxKind.ExclamationEqualsToken: case typescript_1.default.SyntaxKind.EqualsEqualsToken: case typescript_1.default.SyntaxKind.AmpersandToken: case typescript_1.default.SyntaxKind.BarToken: case typescript_1.default.SyntaxKind.CaretToken: case typescript_1.default.SyntaxKind.GreaterThanGreaterThanGreaterThanToken: case typescript_1.default.SyntaxKind.InKeyword: case typescript_1.default.SyntaxKind.InstanceOfKeyword: case typescript_1.default.SyntaxKind.CommaToken: case typescript_1.default.SyntaxKind.AsteriskAsteriskToken: case typescript_1.default.SyntaxKind.EqualsEqualsEqualsToken: case typescript_1.default.SyntaxKind.ExclamationEqualsEqualsToken: this.visitExpressionOperator(sb, kind, expr, options); break; case typescript_1.default.SyntaxKind.AmpersandAmpersandToken: case typescript_1.default.SyntaxKind.BarBarToken: this.visitLogicalExpressionOperator(sb, kind, expr, options); break; default: utils_1.utils.assertNever(kind); } } visitAssignmentOperator(sb, kind, expr, options) { const left = ts_utils_1.tsUtils.expression.getLeft(expr); const right = ts_utils_1.tsUtils.expression.getRight(expr); const token = ts_utils_1.tsUtils.expression.getOperatorToken(expr); const pushValueOptions = sb.pushValueOptions(options); switch (kind) { case typescript_1.default.SyntaxKind.EqualsToken: sb.visit(right, pushValueOptions); break; case typescript_1.default.SyntaxKind.PlusEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.PlusToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.MinusEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.MinusToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.AsteriskAsteriskEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.AsteriskAsteriskToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.AsteriskEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.AsteriskToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.SlashEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.SlashToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.PercentEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.PercentToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.AmpersandEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.AmpersandToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.BarEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.BarToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.CaretEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.CaretToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.LessThanLessThanEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.LessThanLessThanToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.GreaterThanGreaterThanGreaterThanToken, left, right, pushValueOptions); break; case typescript_1.default.SyntaxKind.GreaterThanGreaterThanEqualsToken: this.visitExpressionOperatorBase(sb, token, typescript_1.default.SyntaxKind.GreaterThanGreaterThanToken, left, right, pushValueOptions); break; default: utils_1.utils.assertNever(kind); } types_1.handleTypeAssignment(sb.context, right, left); sb.visit(ts_utils_1.tsUtils.expression.getLeft(expr), sb.setValueOptions(options)); } visitExpressionOperator(sb, kind, expr, options) { this.visitExpressionOperatorBase(sb, ts_utils_1.tsUtils.expression.getOperatorToken(expr), kind, ts_utils_1.tsUtils.expression.getLeft(expr), ts_utils_1.tsUtils.expression.getRight(expr), options); } visitLogicalExpressionOperator(sb, kind, expr, options) { this.visitLogicalExpressionOperatorBase(sb, ts_utils_1.tsUtils.expression.getOperatorToken(expr), kind, ts_utils_1.tsUtils.expression.getLeft(expr), ts_utils_1.tsUtils.expression.getRight(expr), options); } visitExpressionOperatorBase(sb, node, kind, left, right, optionsIn) { const options = sb.pushValueOptions(optionsIn); const leftType = sb.context.analysis.getType(left); const rightType = sb.context.analysis.getType(right); const visit = (leftHelper, rightHelper) => { sb.visit(left, options); sb.emitHelper(left, options, leftHelper({ type: leftType })); sb.visit(right, options); sb.emitHelper(right, options, (rightHelper === undefined ? leftHelper : rightHelper)({ type: rightType })); }; const visitNumeric = () => visit(sb.helpers.toNumber); const isBinaryNumeric = leftType !== undefined && ts_utils_1.tsUtils.type_.isOnlyNumberish(leftType) && rightType !== undefined && ts_utils_1.tsUtils.type_.isOnlyNumberish(rightType); switch (kind) { case typescript_1.default.SyntaxKind.AsteriskToken: visitNumeric(); sb.emitOp(node, 'MUL'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.SlashToken: visitNumeric(); sb.emitOp(node, 'DIV'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.PercentToken: visitNumeric(); sb.emitOp(node, 'MOD'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.PlusToken: if (isBinaryNumeric) { visitNumeric(); sb.emitOp(node, 'ADD'); sb.emitHelper(node, options, sb.helpers.wrapNumber); } else if (leftType !== undefined && ts_utils_1.tsUtils.type_.isOnlyStringish(leftType) && rightType !== undefined && ts_utils_1.tsUtils.type_.isOnlyStringish(rightType)) { visit(() => sb.helpers.unwrapString); sb.emitOp(node, 'CAT'); sb.emitHelper(node, options, sb.helpers.wrapString); } else if (leftType !== undefined && ts_utils_1.tsUtils.type_.isOnlyStringish(leftType)) { visit(() => sb.helpers.unwrapString, sb.helpers.toString); sb.emitOp(node, 'CAT'); sb.emitHelper(node, options, sb.helpers.wrapString); } else if (rightType !== undefined && ts_utils_1.tsUtils.type_.isOnlyStringish(rightType)) { visit(sb.helpers.toString, () => sb.helpers.unwrapString); sb.emitOp(node, 'CAT'); sb.emitHelper(node, options, sb.helpers.wrapString); } else { visit(sb.helpers.toPrimitive); sb.emitOp(node, 'SWAP'); sb.emitOp(node, 'TUCK'); sb.emitOp(node, 'OVER'); sb.emitHelper(node, options, sb.helpers.isString); sb.emitOp(node, 'SWAP'); sb.emitHelper(node, options, sb.helpers.isString); sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.emitOp(node, 'BOOLOR'); }, whenTrue: () => { sb.emitHelper(node, options, sb.helpers.toString({ type: sb.context.analysis.getType(right) })); sb.emitOp(node, 'SWAP'); sb.emitHelper(node, options, sb.helpers.toString({ type: sb.context.analysis.getType(left) })); sb.emitOp(node, 'SWAP'); sb.emitOp(node, 'CAT'); sb.emitHelper(node, options, sb.helpers.wrapString); }, whenFalse: () => { sb.emitHelper(node, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(right) })); sb.emitOp(node, 'SWAP'); sb.emitHelper(node, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(left) })); sb.emitOp(node, 'SWAP'); sb.emitOp(node, 'ADD'); sb.emitHelper(node, options, sb.helpers.wrapNumber); }, })); } break; case typescript_1.default.SyntaxKind.MinusToken: visitNumeric(); sb.emitOp(node, 'SUB'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.GreaterThanGreaterThanToken: visitNumeric(); sb.emitOp(node, 'SHR'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.GreaterThanGreaterThanGreaterThanToken: visitNumeric(); sb.emitOp(node, 'SHR'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.LessThanLessThanToken: visitNumeric(); sb.emitOp(node, 'SHL'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.LessThanToken: sb.emitHelper(node, options, sb.helpers.lessThan({ leftFirst: true, left, right })); sb.emitHelper(node, options, sb.helpers.wrapBoolean); break; case typescript_1.default.SyntaxKind.LessThanEqualsToken: sb.emitHelper(node, options, sb.helpers.lessThan({ leftFirst: false, left: right, right: left })); sb.emitOp(node, 'NOT'); sb.emitHelper(node, options, sb.helpers.wrapBoolean); break; case typescript_1.default.SyntaxKind.GreaterThanToken: sb.emitHelper(node, options, sb.helpers.lessThan({ leftFirst: false, left: right, right: left })); sb.emitHelper(node, options, sb.helpers.wrapBoolean); break; case typescript_1.default.SyntaxKind.GreaterThanEqualsToken: sb.emitHelper(node, options, sb.helpers.lessThan({ leftFirst: true, left, right })); sb.emitOp(node, 'NOT'); sb.emitHelper(node, options, sb.helpers.wrapBoolean); break; case typescript_1.default.SyntaxKind.ExclamationEqualsToken: sb.emitHelper(node, options, sb.helpers.equalsEquals({ left, right })); sb.emitOp(node, 'NOT'); sb.emitHelper(node, options, sb.helpers.wrapBoolean); break; case typescript_1.default.SyntaxKind.EqualsEqualsToken: sb.emitHelper(node, options, sb.helpers.equalsEquals({ left, right })); sb.emitHelper(node, options, sb.helpers.wrapBoolean); break; case typescript_1.default.SyntaxKind.AmpersandToken: visitNumeric(); sb.emitOp(node, 'AND'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.BarToken: visitNumeric(); sb.emitOp(node, 'OR'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.CaretToken: visitNumeric(); sb.emitOp(node, 'XOR'); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.InKeyword: sb.visit(right, options); sb.visit(left, options); sb.emitHelper(node, options, sb.helpers.inObjectProperty({ propType: leftType })); sb.emitHelper(node, options, sb.helpers.wrapBoolean); break; case typescript_1.default.SyntaxKind.InstanceOfKeyword: this.handleInstanceOf(sb, node, left, right, options); break; case typescript_1.default.SyntaxKind.CommaToken: sb.visit(left, options); sb.emitOp(node, 'DROP'); sb.visit(right, options); break; case typescript_1.default.SyntaxKind.AsteriskAsteriskToken: visitNumeric(); sb.emitHelper(node, options, sb.helpers.exp); sb.emitHelper(node, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.EqualsEqualsEqualsToken: sb.visit(left, options); sb.visit(right, options); sb.emitHelper(node, options, sb.helpers.equalsEqualsEquals({ leftType, rightType })); sb.emitHelper(node, options, sb.helpers.wrapBoolean); break; case typescript_1.default.SyntaxKind.ExclamationEqualsEqualsToken: sb.visit(left, options); sb.visit(right, options); sb.emitHelper(node, options, sb.helpers.equalsEqualsEquals({ leftType, rightType })); sb.emitOp(node, 'NOT'); sb.emitHelper(node, options, sb.helpers.wrapBoolean); break; default: utils_1.utils.assertNever(kind); } if (!optionsIn.pushValue) { sb.emitOp(node, 'DROP'); return; } } visitLogicalExpressionOperatorBase(sb, node, kind, left, right, options) { switch (kind) { case typescript_1.default.SyntaxKind.AmpersandAmpersandToken: { sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.visit(left, sb.pushValueOptions(options)); if (options.pushValue) { sb.emitOp(left, 'DUP'); } sb.emitHelper(left, sb.pushValueOptions(options), sb.helpers.toBoolean({ type: sb.context.analysis.getType(left) })); }, whenTrue: () => { if (options.pushValue) { sb.emitOp(node, 'DROP'); } sb.visit(right, options); }, })); break; } case typescript_1.default.SyntaxKind.BarBarToken: { sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.visit(left, sb.pushValueOptions(options)); if (options.pushValue) { sb.emitOp(left, 'DUP'); } sb.emitHelper(left, sb.pushValueOptions(options), sb.helpers.toBoolean({ type: sb.context.analysis.getType(left) })); }, whenFalse: () => { if (options.pushValue) { sb.emitOp(node, 'DROP'); } sb.visit(right, options); }, })); break; } default: utils_1.utils.assertNever(kind); } } handleInstanceOf(sb, node, left, right, options) { const builtin = sb.context.builtins.getValue(right); if (builtin !== undefined && builtins_1.isBuiltinInstanceOf(builtin)) { builtin.emitInstanceOf(sb, left, options); return; } sb.visit(left, options); sb.visit(right, options); sb.emitHelper(node, options, sb.helpers.instanceof); sb.emitHelper(node, options, sb.helpers.wrapBoolean); } } exports.BinaryExpressionCompiler = BinaryExpressionCompiler; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJpbmFyeUV4cHJlc3Npb25Db21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnREFBNEM7QUFDNUMsMENBQXVDO0FBQ3ZDLG9FQUE0QjtBQUM1QiwwQ0FBa0Q7QUFFbEQsMkNBQTJFO0FBQzNFLGtEQUErQztBQUsvQyxNQUFhLHdCQUF5QixTQUFRLDJCQUFpQztJQUEvRTs7UUFDa0IsU0FBSSxHQUFHLG9CQUFFLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDO0lBd2Z4RCxDQUFDO0lBdGZRLFNBQVMsQ0FBQyxFQUFpQixFQUFFLElBQXlCLEVBQUUsT0FBcUI7UUFDbEYsTUFBTSxJQUFJLEdBQUcsa0JBQU8sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTVELFFBQVEsSUFBSSxFQUFFO1lBQ1osS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDL0IsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7WUFDbkMsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwQyxLQUFLLG9CQUFFLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDO1lBQy9DLEtBQUssb0JBQUUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwQyxLQUFLLG9CQUFFLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssb0JBQUUsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7WUFDbEMsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwQyxLQUFLLG9CQUFFLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDO1lBQy9DLEtBQUssb0JBQUUsQ0FBQyxV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RTtZQUN6RCxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFMUMsT0FBTztTQUNSO1FBR0QsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFeEIsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFekIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFcEQsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBemZELDREQXlmQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2V4cHJlc3Npb24vQmluYXJ5RXhwcmVzc2lvbkNvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnQG5lby1vbmUvdXRpbHMnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgaXNCdWlsdGluSW5zdGFuY2VPZiB9IGZyb20gJy4uL2J1aWx0aW5zJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL2hlbHBlcic7XG5pbXBvcnQgeyBoYW5kbGVUeXBlQXNzaWdubWVudCwgVHlwZWRIZWxwZXJPcHRpb25zIH0gZnJvbSAnLi4vaGVscGVyL3R5cGVzJztcbmltcG9ydCB7IE5vZGVDb21waWxlciB9IGZyb20gJy4uL05vZGVDb21waWxlcic7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vc2InO1xuaW1wb3J0IHsgVmlzaXRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG50eXBlIEV4cHJlc3Npb25PcGVyYXRvcktpbmQgPSB0cy5CaXR3aXNlT3BlcmF0b3JPckhpZ2hlciB8IHRzLlN5bnRheEtpbmQuQ29tbWFUb2tlbjtcbmV4cG9ydCBjbGFzcyBCaW5hcnlFeHByZXNzaW9uQ29tcGlsZXIgZXh0ZW5kcyBOb2RlQ29tcGlsZXI8dHMuQmluYXJ5RXhwcmVzc2lvbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9IHRzLlN5bnRheEtpbmQuQmluYXJ5RXhwcmVzc2lvbjtcblxuICBwdWJsaWMgdmlzaXROb2RlKHNiOiBTY3JpcHRCdWlsZGVyLCBleHByOiB0cy5CaW5hcnlFeHByZXNzaW9uLCBvcHRpb25zOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBraW5kID0gdHNVdGlscy5leHByZXNzaW9uLmdldE9wZXJhdG9yVG9rZW4oZXhwcikua2luZDtcblxuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkVxdWFsc1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLlBsdXNFcXVhbHNUb2tlbjpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5NaW51c0VxdWFsc1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkFzdGVyaXNrQXN0ZXJpc2tFcXVhbHNUb2tlbjpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5Bc3Rlcmlza0VxdWFsc1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLlNsYXNoRXF1YWxzVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuUGVyY2VudEVxdWFsc1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkFtcGVyc2FuZEVxdWFsc1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkJhckVxdWFsc1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkNhcmV0RXF1YWxzVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuTGVzc1RoYW5MZXNzVGhhbkVxdWFsc1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkdyZWF0ZXJUaGFuR3JlYXRlclRoYW5HcmVhdGVyVGhhbkVxdWFsc1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkdyZWF0ZXJUaGFuR3JlYXRlclRoYW5FcXVhbHNUb2tlbjpcbiAgICAgICAgdGhpcy52aXNpdEFzc2lnbm1lbnRPcGVyYXRvcihzYiwga2luZCwgZXhwciwgb3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkFzdGVyaXNrVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU2xhc2hUb2tlbjpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5QZXJjZW50VG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuUGx1c1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk1pbnVzVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuR3JlYXRlclRoYW5HcmVhdGVyVGhhblRva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkxlc3NUaGFuTGVzc1RoYW5Ub2tlbjpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5MZXNzVGhhblRva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkxlc3NUaGFuRXF1YWxzVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuR3JlYXRlclRoYW5Ub2tlbjpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5HcmVhdGVyVGhhbkVxdWFsc1Rva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkV4Y2xhbWF0aW9uRXF1YWxzVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuRXF1YWxzRXF1YWxzVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuQW1wZXJzYW5kVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuQmFyVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuQ2FyZXRUb2tlbjpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5HcmVhdGVyVGhhbkdyZWF0ZXJUaGFuR3JlYXRlclRoYW5Ub2tlbjpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbktleXdvcmQ6XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW5zdGFuY2VPZktleXdvcmQ6XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuQ29tbWFUb2tlbjpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5Bc3Rlcmlza0FzdGVyaXNrVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuRXF1YWxzRXF1YWxzRXF1YWxzVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuRXhjbGFtYXRpb25FcXVhbHNFcXVhbHNUb2tlbjpcbiAgICAgICAgdGhpcy52aXNpdEV4cHJlc3Npb25PcGVyYXRvcihzYiwga2luZCwgZXhwciwgb3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkFtcGVyc2FuZEFtcGVyc2FuZFRva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkJhckJhclRva2VuOlxuICAgICAgICB0aGlzLnZpc2l0TG9naWNhbEV4cHJlc3Npb25PcGVyYXRvcihzYiwga2luZCwgZXhwciwgb3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHV0aWxzLmFzc2VydE5ldmVyKGtpbmQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRBc3NpZ25tZW50T3BlcmF0b3IoXG4gICAgc2I6IFNjcmlwdEJ1aWxkZXIsXG4gICAga2luZDogdHMuQXNzaWdubWVudE9wZXJhdG9yLFxuICAgIGV4cHI6IHRzLkJpbmFyeUV4cHJlc3Npb24sXG4gICAgb3B0aW9uczogVmlzaXRPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBsZWZ0ID0gdHNVdGlscy5leHByZXNzaW9uLmdldExlZnQoZXhwcik7XG4gICAgY29uc3QgcmlnaHQgPSB0c1V0aWxzLmV4cHJlc3Npb24uZ2V0UmlnaHQoZXhwcik7XG4gICAgY29uc3QgdG9rZW4gPSB0c1V0aWxzLmV4cHJlc3Npb24uZ2V0T3BlcmF0b3JUb2tlbihleHByKTtcbiAgICBjb25zdCBwdXNoVmFsdWVPcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5FcXVhbHNUb2tlbjpcbiAgICAgICAgc2IudmlzaXQocmlnaHQsIHB1c2hWYWx1ZU9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5QbHVzRXF1YWxzVG9rZW46XG4gICAgICAgIHRoaXMudmlzaXRFeHByZXNzaW9uT3BlcmF0b3JCYXNlKHNiLCB0b2tlbiwgdHMuU3ludGF4S2luZC5QbHVzVG9rZW4sIGxlZnQsIHJpZ2h0LCBwdXNoVmFsdWVPcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuTWludXNFcXVhbHNUb2tlbjpcbiAgICAgICAgdGhpcy52aXNpdEV4cHJlc3Npb25PcGVyYXRvckJhc2Uoc2IsIHRva2VuLCB0cy5TeW50YXhLaW5kLk1pbnVzVG9rZW4sIGxlZnQsIHJpZ2h0LCBwdXNoVmFsdWVPcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXN0ZXJpc2tBc3Rlcmlza0VxdWFsc1Rva2VuOlxuICAgICAgICAvLyBTS0lQUEVEIFRlc3Q6IFVuc3VwcG9ydGVkXG4gICAgICAgIHRoaXMudmlzaXRFeHByZXNzaW9uT3BlcmF0b3JCYXNlKHNiLCB0b2tlbiwgdHMuU3ludGF4S2luZC5Bc3Rlcmlza0FzdGVyaXNrVG9rZW4sIGxlZnQsIHJpZ2h0LCBwdXNoVmFsdWVPcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXN0ZXJpc2tFcXVhbHNUb2tlbjpcbiAgICAgICAgdGhpcy52aXNpdEV4cHJlc3Npb25PcGVyYXRvckJhc2Uoc2IsIHRva2VuLCB0cy5TeW50YXhLaW5kLkFzdGVyaXNrVG9rZW4sIGxlZnQsIHJpZ2h0LCBwdXNoVmFsdWVPcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU2xhc2hFcXVhbHNUb2tlbjpcbiAgICAgICAgdGhpcy52aXNpdEV4cHJlc3Npb25PcGVyYXRvckJhc2Uoc2IsIHRva2VuLCB0cy5TeW50YXhLaW5kLlNsYXNoVG9rZW4sIGxlZnQsIHJpZ2h0LCBwdXNoVmFsdWVPcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuUGVyY2VudEVxdWFsc1Rva2VuOlxuICAgICAgICB0aGlzLnZpc2l0RXhwcmVzc2lvbk9wZXJhdG9yQmFzZShzYiwgdG9rZW4sIHRzLlN5bnRheEtpbmQuUGVyY2VudFRva2VuLCBsZWZ0LCByaWdodCwgcHVzaFZhbHVlT3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkFtcGVyc2FuZEVxdWFsc1Rva2VuOlxuICAgICAgICB0aGlzLnZpc2l0RXhwcmVzc2lvbk9wZXJhdG9yQmFzZShzYiwgdG9rZW4sIHRzLlN5bnRheEtpbmQuQW1wZXJzYW5kVG9rZW4