PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-avaxc/dist/test/unit/transactionBuilder
Просмотр файла: transfer.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
const testData = __importStar(require("../../resources/avaxc"));
const sdk_core_1 = require("@bitgo/sdk-core");
const getBuilder_1 = require("../getBuilder");
describe('Avax C-Chain Transfer Transaction', function () {
let txBuilder;
const contractAddress = testData.TEST_ACCOUNT.ethAddress;
const initTxBuilder = () => {
txBuilder = (0, getBuilder_1.getBuilder)('tavaxc');
txBuilder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
txBuilder.counter(1);
txBuilder.type(sdk_core_1.TransactionType.Send);
txBuilder.contract(contractAddress);
};
it('Should build transfer tx', async function () {
initTxBuilder();
txBuilder
.transfer()
.amount('100000000000000000') // This represents 0.1 Avax = 0.1 Ether
.contractSequenceId(1)
.expirationTime(50000)
.to(testData.TEST_ACCOUNT_2.ethAddress)
.key(testData.OWNER_2.ethKey);
txBuilder.sign({ key: testData.OWNER_1.ethKey });
const tx = await txBuilder.build();
const txJson = tx.toJson();
should_1.default.exists(txJson.chainId);
should_1.default.exists(txJson.from);
should_1.default.exists(txJson.to);
txJson.nonce.should.equals(1);
txJson.from?.should.equals(testData.OWNER_1.ethAddress);
txJson.chainId?.should.equals('0xa869');
txJson.gasLimit.should.equals('7000000');
txJson._type.should.equals(sdk_coin_eth_1.ETHTransactionType.LEGACY);
txJson.gasPrice.should.equals('280000000000');
});
it('Should build with counter 0 if not manually defined', async function () {
const builder = (0, getBuilder_1.getBuilder)('tavaxc');
builder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
builder.type(sdk_core_1.TransactionType.Send);
builder.contract(testData.TEST_ACCOUNT.ethAddress);
builder
.transfer()
.amount('100000000000000000') // This represents 0.1 Avax = 0.1 Ether
.contractSequenceId(1)
.expirationTime(50000)
.to(testData.TEST_ACCOUNT_2.ethAddress)
.key(testData.OWNER_2.ethKey);
builder.sign({ key: testData.OWNER_1.ethKey });
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.exists(txJson.chainId);
should_1.default.exists(txJson.from);
should_1.default.exists(txJson.to);
txJson.nonce.should.equals(0);
txJson.from.should.equals(testData.OWNER_1.ethAddress);
txJson.chainId.should.equals('0xa869');
txJson.gasLimit.should.equals('7000000');
txJson._type.should.equals(sdk_coin_eth_1.ETHTransactionType.LEGACY);
txJson.gasPrice.should.equals('280000000000');
});
it('Should build transfer with default type', async function () {
const builder = (0, getBuilder_1.getBuilder)('tavaxc');
builder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
builder.counter(1);
builder.contract(testData.TEST_ACCOUNT.ethAddress);
builder
.transfer()
.amount('100000000000000000') // This represents 0.1 Avax = 0.1 Ether
.contractSequenceId(1)
.expirationTime(50000)
.to(testData.TEST_ACCOUNT_2.ethAddress)
.key(testData.OWNER_2.ethKey);
builder.sign({ key: testData.OWNER_1.ethKey });
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.exists(txJson.chainId);
should_1.default.exists(txJson.from);
should_1.default.exists(txJson.to);
txJson.nonce.should.equals(1);
txJson.from?.should.equals(testData.OWNER_1.ethAddress);
txJson.chainId?.should.equals('0xa869');
txJson.gasLimit.should.equals('7000000');
txJson._type.should.equals(sdk_coin_eth_1.ETHTransactionType.LEGACY);
txJson.gasPrice.should.equals('280000000000');
});
it('Should create transfer object if not created or return it if already initialized', async function () {
const builder = (0, getBuilder_1.getBuilder)('tavaxc');
builder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
builder.counter(1);
builder.contract(testData.TEST_ACCOUNT.ethAddress);
builder.type(sdk_core_1.TransactionType.Send);
const transferObj = builder.transfer().amount('5000').contractSequenceId(2).to(testData.TEST_ACCOUNT_2.ethAddress);
const transferObj2 = builder.transfer();
should_1.default.deepEqual(transferObj2, transferObj);
});
it('Should fail building transfer tx without fee', async function () {
const builder = (0, getBuilder_1.getBuilder)('tavaxc');
builder.counter(1);
builder.type(sdk_core_1.TransactionType.Send);
builder.contract(testData.TEST_ACCOUNT.ethAddress);
builder
.transfer()
.amount('100000000000000000') // This represents 0.1 Avax = 0.1 Ether
.contractSequenceId(1)
.expirationTime(50000)
.to(testData.TEST_ACCOUNT_2.ethAddress)
.key(testData.OWNER_2.ethKey);
builder.sign({ key: testData.OWNER_1.ethKey });
builder.build().should.be.rejectedWith('Invalid transaction: missing fee');
});
it('Should fail getting transfer object with non-send type', async function () {
const builder = (0, getBuilder_1.getBuilder)('tavaxc');
builder.fee({
fee: '280000000000',
gasLimit: '7000000',
});
builder.counter(1);
builder.contract(testData.TEST_ACCOUNT.ethAddress);
builder.type(sdk_core_1.TransactionType.WalletInitialization);
assert_1.default.throws(() => builder.transfer(), (e) => e.message === 'Transfers can only be set for send transactions');
});
it('Should build unsigned transfer with final v', async function () {
initTxBuilder();
txBuilder
.transfer()
.amount('100000000000000000') // This represents 0.1 Avax = 0.1 Ether
.contractSequenceId(1)
.expirationTime(50000)
.to(testData.TEST_ACCOUNT_2.ethAddress)
.key(testData.OWNER_2.ethKey);
const tx = await txBuilder.build();
const txJson = tx.toJson();
should_1.default.exists(txJson.chainId);
should_1.default.exists(txJson.to);
txJson.nonce.should.equals(1);
should_1.default.equal(txJson.chainId, '0xa869');
txJson.gasLimit.should.equals('7000000');
should_1.default.equal(txJson.gasPrice, '280000000000');
should_1.default.equal(txJson.v, '0x0150f5');
});
it('Should build fee market transaction', async function () {
initTxBuilder();
txBuilder.fee({
fee: '280000000000',
eip1559: {
maxPriorityFeePerGas: '5',
maxFeePerGas: '30',
},
gasLimit: '7000000',
});
txBuilder
.transfer()
.amount('100000000000000000') // This represents 0.1 Avax = 0.1 Ether
.contractSequenceId(1)
.expirationTime(50000)
.to(testData.TEST_ACCOUNT_2.ethAddress)
.key(testData.OWNER_2.ethKey);
const tx = await txBuilder.build();
const txJson = tx.toJson();
txJson._type.should.equals(sdk_coin_eth_1.ETHTransactionType.EIP1559);
should_1.default.exists(txJson.chainId);
should_1.default.exists(txJson.to);
txJson.nonce.should.equals(1);
should_1.default.equal(txJson.chainId, '0xa869');
txJson.gasLimit.should.equals('7000000');
should_1.default.equal(txJson.maxPriorityFeePerGas, '5');
should_1.default.equal(txJson.maxFeePerGas, '30');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3RyYW5zZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUc1QixzREFBaUU7QUFDakUsZ0VBQWtEO0FBQ2xELDhDQUFrRDtBQUNsRCw4Q0FBMkM7QUFFM0MsUUFBUSxDQUFDLG1DQUFtQyxFQUFFO0lBQzVDLElBQUksU0FBNkIsQ0FBQztJQUNsQyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztJQUN6RCxNQUFNLGFBQWEsR0FBRyxHQUFTLEVBQUU7UUFDL0IsU0FBUyxHQUFHLElBQUEsdUJBQVUsRUFBQyxRQUFRLENBQXVCLENBQUM7UUFDdkQsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUNaLEdBQUcsRUFBRSxjQUFjO1lBQ25CLFFBQVEsRUFBRSxTQUFTO1NBQ3BCLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0lBRUYsRUFBRSxDQUFDLDBCQUEwQixFQUFFLEtBQUs7UUFDbEMsYUFBYSxFQUFFLENBQUM7UUFDaEIsU0FBUzthQUNOLFFBQVEsRUFBRTthQUNWLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLHVDQUF1QzthQUNwRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7YUFDckIsY0FBYyxDQUFDLEtBQUssQ0FBQzthQUNyQixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7YUFDdEMsR0FBRyxDQUFD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SyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUNBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLGdCQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcblxuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IEVUSFRyYW5zYWN0aW9uVHlwZSwgVHhEYXRhIH0gZnJvbSAnQGJpdGdvL3Nkay1jb2luLWV0aCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvYXZheGMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGdldEJ1aWxkZXIgfSBmcm9tICcuLi9nZXRCdWlsZGVyJztcblxuZGVzY3JpYmUoJ0F2YXggQy1DaGFpbiBUcmFuc2ZlciBUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyO1xuICBjb25zdCBjb250cmFjdEFkZHJlc3MgPSB0ZXN0RGF0YS5URVNUX0FDQ09VTlQuZXRoQWRkcmVzcztcbiAgY29uc3QgaW5pdFR4QnVpbGRlciA9ICgpOiB2b2lkID0+IHtcbiAgICB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gIH07XG5cbiAgaXQoJ1Nob3VsZCBidWlsZCB0cmFuc2ZlciB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBpbml0VHhCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAudHJhbnNmZXIoKVxuICAgICAgLmFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwJykgLy8gVGhpcyByZXByZXNlbnRzIDAuMSBBdmF4ID0gMC4xIEV0aGVyXG4gICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKDEpXG4gICAgICAuZXhwaXJhdGlvblRpbWUoNTAwMDApXG4gICAgICAudG8odGVzdERhdGEuVEVTVF9BQ0NPVU5UXzIuZXRoQWRkcmVzcylcbiAgICAgIC5rZXkodGVzdERhdGEuT1dORVJfMi5ldGhLZXkpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5PV05FUl8xLmV0aEtleSB9KTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uOiBUeERhdGEgPSB0eC50b0pzb24oKTtcblxuICAgIHNob3VsZC5leGlzdHModHhKc29uLmNoYWluSWQpO1xuICAgIHNob3VsZC5leGlzdHModHhKc29uLmZyb20pO1xuICAgIHNob3VsZC5leGlzdHModHhKc29uLnRvKTtcbiAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFscygxKTtcbiAgICB0eEpzb24uZnJvbT8uc2hvdWxkLmVxdWFscyh0ZXN0RGF0YS5PV05FUl8xLmV0aEFkZHJlc3MpO1xuICAgIHR4SnNvbi5jaGFpbklkPy5zaG91bGQuZXF1YWxzKCcweGE4NjknKTtcbiAgICB0eEpzb24uZ2FzTGltaXQuc2hvdWxkLmVxdWFscygnNzAwMDAwMCcpO1xuICAgIHR4SnNvbi5fdHlwZS5zaG91bGQuZXF1YWxzKEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1kpO1xuICAgIHR4SnNvbi5nYXNQcmljZSEuc2hvdWxkLmVxdWFscygnMjgwMDAwMDAwMDAwJyk7XG4gIH0pO1xuXG4gIGl0KCdTaG91bGQgYnVpbGQgd2l0aCBjb3VudGVyIDAgaWYgbm90IG1hbnVhbGx5IGRlZmluZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RhdmF4YycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICBidWlsZGVyLmZlZSh7XG4gICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICB9KTtcbiAgICBidWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIGJ1aWxkZXIuY29udHJhY3QodGVzdERhdGEuVEVTVF9BQ0NPVU5ULmV0aEFkZHJlc3MpO1xuICAgIGJ1aWxkZXJcbiAgICAgIC50cmFuc2ZlcigpXG4gICAgICAuYW1vdW50KCcxMDAwMDAwMDAwMDAwMDAwMDAnKSAvLyBUaGlzIHJlcHJlc2VudHMgMC4xIEF2YXggPSAwLjEgRXRoZXJcbiAgICAgIC5jb250cmFjdFNlcXVlbmNlSWQoMSlcbiAgICAgIC5leHBpcmF0aW9uVGltZSg1MDAwMClcbiAgICAgIC50byh0ZXN0RGF0YS5URVNUX0FDQ09VTlRfMi5ldGhBZGRyZXNzKVxuICAgICAgLmtleSh0ZXN0RGF0YS5PV05FUl8yLmV0aEtleSk7XG4gICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5PV05FUl8xLmV0aEtleSB9KTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXG4gICAgY29uc3QgdHhKc29uOiBUeERhdGEgPSB0eC50b0pzb24oKTtcblxuICAgIHNob3VsZC5leGlzdHModHhKc29uLmNoYWluSWQpO1xuICAgIHNob3VsZC5leGlzdHModHhKc29uLmZyb20pO1xuICAgIHNob3VsZC5leGlzdHModHhKc29uLnRvKTtcbiAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFscygwKTtcbiAgICB0eEpzb24uZnJvbSEuc2hvdWxkLmVxdWFscyh0ZXN0RGF0YS5PV05FUl8xLmV0aEFkZHJlc3MpO1xuICAgIHR4SnNvbi5jaGFpbklkIS5zaG91bGQuZXF1YWxzKCcweGE4NjknKTtcbiAgICB0eEpzb24uZ2FzTGltaXQuc2hvdWxkLmVxdWFscygnNzAwMDAwMCcpO1xuICAgIHR4SnNvbi5fdHlwZS5zaG91bGQuZXF1YWxzKEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1kpO1xuICAgIHR4SnNvbi5nYXNQcmljZSEuc2hvdWxkLmVxdWFscygnMjgwMDAwMDAwMDAwJyk7XG4gIH0pO1xuXG4gIGl0KCdTaG91bGQgYnVpbGQgdHJhbnNmZXIgd2l0aCBkZWZhdWx0IHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RhdmF4YycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICBidWlsZGVyLmZlZSh7XG4gICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICB9KTtcbiAgICBidWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgYnVpbGRlci5jb250cmFjdCh0ZXN0RGF0YS5URVNUX0FDQ09VTlQuZXRoQWRkcmVzcyk7XG4gICAgYnVpbGRlclxuICAgICAgLnRyYW5zZmVyKClcbiAgICAgIC5hbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMCcpIC8vIFRoaXMgcmVwcmVzZW50cyAwLjEgQXZheCA9IDAuMSBFdGhlclxuICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZCgxKVxuICAgICAgLmV4cGlyYXRpb25UaW1lKDUwMDAwKVxuICAgICAgLnRvKHRlc3REYXRhLlRFU1RfQUNDT1VOVF8yLmV0aEFkZHJlc3MpXG4gICAgICAua2V5KHRlc3REYXRhLk9XTkVSXzIuZXRoS2V5KTtcbiAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLk9XTkVSXzEuZXRoS2V5IH0pO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uOiBUeERhdGEgPSB0eC50b0pzb24oKTtcblxuICAgIHNob3VsZC5leGlzdHModHhKc29uLmNoYWluSWQpO1xuICAgIHNob3VsZC5leGlzdHModHhKc29uLmZyb20pO1xuICAgIHNob3VsZC5leGlzdHModHhKc29uLnRvKTtcbiAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFscygxKTtcbiAgICB0eEpzb24uZnJvbT8uc2hvdWxkLmVxdWFscyh0ZXN0RGF0YS5PV05FUl8xLmV0aEFkZHJlc3MpO1xuICAgIHR4SnNvbi5jaGFpbklkPy5zaG91bGQuZXF1YWxzKCcweGE4NjknKTtcbiAgICB0eEpzb24uZ2FzTGltaXQuc2hvdWxkLmVxdWFscygnNzAwMDAwMCcpO1xuICAgIHR4SnNvbi5fdHlwZS5zaG91bGQuZXF1YWxzKEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1kpO1xuICAgIHR4SnNvbi5nYXNQcmljZSEuc2hvdWxkLmVxdWFscygnMjgwMDAwMDAwMDAwJyk7XG4gIH0pO1xuXG4gIGl0KCdTaG91bGQgY3JlYXRlIHRyYW5zZmVyIG9iamVjdCBpZiBub3QgY3JlYXRlZCBvciByZXR1cm4gaXQgaWYgYWxyZWFkeSBpbml0aWFsaXplZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBidWlsZGVyID0gZ2V0QnVpbGRlcigndGF2YXhjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIGJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzI4MDAwMDAwMDAwMCcsXG4gICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgIH0pO1xuICAgIGJ1aWxkZXIuY291bnRlcigxKTtcbiAgICBidWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLlRFU1RfQUNDT1VOVC5ldGhBZGRyZXNzKTtcbiAgICBidWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIGNvbnN0IHRyYW5zZmVyT2JqID0gYnVpbGRlci50cmFuc2ZlcigpLmFtb3VudCgnNTAwMCcpLmNvbnRyYWN0U2VxdWVuY2VJZCgyKS50byh0ZXN0RGF0YS5URVNUX0FDQ09VTlRfMi5ldGhBZGRyZXNzKTtcbiAgICBjb25zdCB0cmFuc2Zlck9iajIgPSBidWlsZGVyLnRyYW5zZmVyKCk7XG5cbiAgICBzaG91bGQuZGVlcEVxdWFsKHRyYW5zZmVyT2JqMiwgdHJhbnNmZXJPYmopO1xuICB9KTtcblxuICBpdCgnU2hvdWxkIGZhaWwgYnVpbGRpbmcgdHJhbnNmZXIgdHggd2l0aG91dCBmZWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RhdmF4YycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICBidWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgYnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBidWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLlRFU1RfQUNDT1VOVC5ldGhBZGRyZXNzKTtcbiAgICBidWlsZGVyXG4gICAgICAudHJhbnNmZXIoKVxuICAgICAgLmFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwJykgLy8gVGhpcyByZXByZXNlbnRzIDAuMSBBdmF4ID0gMC4xIEV0aGVyXG4gICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKDEpXG4gICAgICAuZXhwaXJhdGlvblRpbWUoNTAwMDApXG4gICAgICAudG8odGVzdERhdGEuVEVTVF9BQ0NPVU5UXzIuZXRoQWRkcmVzcylcbiAgICAgIC5rZXkodGVzdERhdGEuT1dORVJfMi5ldGhLZXkpO1xuICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuT1dORVJfMS5ldGhLZXkgfSk7XG5cbiAgICBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBmZWUnKTtcbiAgfSk7XG5cbiAgaXQoJ1Nob3VsZCBmYWlsIGdldHRpbmcgdHJhbnNmZXIgb2JqZWN0IHdpdGggbm9uLXNlbmQgdHlwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBidWlsZGVyID0gZ2V0QnVpbGRlcigndGF2YXhjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIGJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzI4MDAwMDAwMDAwMCcsXG4gICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgIH0pO1xuICAgIGJ1aWxkZXIuY291bnRlcigxKTtcbiAgICBidWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLlRFU1RfQUNDT1VOVC5ldGhBZGRyZXNzKTtcbiAgICBidWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gYnVpbGRlci50cmFuc2ZlcigpLFxuICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVHJhbnNmZXJzIGNhbiBvbmx5IGJlIHNldCBmb3Igc2VuZCB0cmFuc2FjdGlvbnMnXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ1Nob3VsZCBidWlsZCB1bnNpZ25lZCB0cmFuc2ZlciB3aXRoIGZpbmFsIHYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgaW5pdFR4QnVpbGRlcigpO1xuICAgIHR4QnVpbGRlclxuICAgICAgLnRyYW5zZmVyKClcbiAgICAgIC5hbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMCcpIC8vIFRoaXMgcmVwcmVzZW50cyAwLjEgQXZheCA9IDAuMSBFdGhlclxuICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZCgxKVxuICAgICAgLmV4cGlyYXRpb25UaW1lKDUwMDAwKVxuICAgICAgLnRvKHRlc3REYXRhLlRFU1RfQUNDT1VOVF8yLmV0aEFkZHJlc3MpXG4gICAgICAua2V5KHRlc3REYXRhLk9XTkVSXzIuZXRoS2V5KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbjogVHhEYXRhID0gdHgudG9Kc29uKCk7XG5cbiAgICBzaG91bGQuZXhpc3RzKHR4SnNvbi5jaGFpbklkKTtcbiAgICBzaG91bGQuZXhpc3RzKHR4SnNvbi50byk7XG4gICAgdHhKc29uLm5vbmNlLnNob3VsZC5lcXVhbHMoMSk7XG4gICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5jaGFpbklkLCAnMHhhODY5Jyk7XG4gICAgdHhKc29uLmdhc0xpbWl0LnNob3VsZC5lcXVhbHMoJzcwMDAwMDAnKTtcbiAgICBzaG91bGQuZXF1YWwodHhKc29uLmdhc1ByaWNlLCAnMjgwMDAwMDAwMDAwJyk7XG4gICAgc2hvdWxkLmVxdWFsKHR4SnNvbi52LCAnMHgwMTUwZjUnKTtcbiAgfSk7XG5cbiAgaXQoJ1Nob3VsZCBidWlsZCBmZWUgbWFya2V0IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGluaXRUeEJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzI4MDAwMDAwMDAwMCcsXG4gICAgICBlaXAxNTU5OiB7XG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiAnNScsXG4gICAgICAgIG1heEZlZVBlckdhczogJzMwJyxcbiAgICAgIH0sXG4gICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgIH0pO1xuICAgIHR4QnVpbGRlclxuICAgICAgLnRyYW5zZmVyKClcbiAgICAgIC5hbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMCcpIC8vIFRoaXMgcmVwcmVzZW50cyAwLjEgQXZheCA9IDAuMSBFdGhlclxuICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZCgxKVxuICAgICAgLmV4cGlyYXRpb25UaW1lKDUwMDAwKVxuICAgICAgLnRvKHRlc3REYXRhLlRFU1RfQUNDT1VOVF8yLmV0aEFkZHJlc3MpXG4gICAgICAua2V5KHRlc3REYXRhLk9XTkVSXzIuZXRoS2V5KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbjogVHhEYXRhID0gdHgudG9Kc29uKCk7XG5cbiAgICB0eEpzb24uX3R5cGUuc2hvdWxkLmVxdWFscyhFVEhUcmFuc2FjdGlvblR5cGUuRUlQMTU1OSk7XG4gICAgc2hvdWxkLmV4aXN0cyh0eEpzb24uY2hhaW5JZCk7XG4gICAgc2hvdWxkLmV4aXN0cyh0eEpzb24udG8pO1xuICAgIHR4SnNvbi5ub25jZS5zaG91bGQuZXF1YWxzKDEpO1xuICAgIHNob3VsZC5lcXVhbCh0eEpzb24uY2hhaW5JZCwgJzB4YTg2OScpO1xuICAgIHR4SnNvbi5nYXNMaW1pdC5zaG91bGQuZXF1YWxzKCc3MDAwMDAwJyk7XG4gICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5tYXhQcmlvcml0eUZlZVBlckdhcywgJzUnKTtcbiAgICBzaG91bGQuZXF1YWwodHhKc29uLm1heEZlZVBlckdhcywgJzMwJyk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!