PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-tia/dist/test/unit/transactionBuilder
Просмотр файла: StakingDeactivateBuilder.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 sdk_core_1 = require("@bitgo/sdk-core");
const encoding_1 = require("@cosmjs/encoding");
const should_1 = __importDefault(require("should"));
const testData = __importStar(require("../../resources/tia"));
const sdk_test_1 = require("@bitgo/sdk-test");
const sdk_api_1 = require("@bitgo/sdk-api");
const src_1 = require("../../../src");
describe('Tia Undelegate txn Builder', () => {
let bitgo;
let basecoin;
let factory;
let testTx;
before(function () {
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
bitgo.safeRegister('tia', src_1.Tia.createInstance);
bitgo.safeRegister('ttia', src_1.Ttia.createInstance);
bitgo.initializeTestVars();
basecoin = bitgo.coin('ttia');
factory = basecoin.getBuilder();
testTx = testData.TEST_UNDELEGATE_TX;
});
it('should build undelegate tx with signature', async function () {
const txBuilder = factory.getStakingDeactivateBuilder();
txBuilder.sequence(testTx.sequence);
txBuilder.gasBudget(testTx.gasBudget);
txBuilder.messages([testTx.sendMessage.value]);
txBuilder.addSignature({ pub: (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)) }, Buffer.from(testTx.signature, 'base64'));
const tx = await txBuilder.build();
const json = await (await txBuilder.build()).toJson();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingDeactivate);
should_1.default.deepEqual(json.gasBudget, testTx.gasBudget);
should_1.default.deepEqual(json.sendMessages, [testTx.sendMessage]);
should_1.default.deepEqual(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)));
should_1.default.deepEqual(json.sequence, testTx.sequence);
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testTx.signedTxBase64);
should_1.default.deepEqual(tx.inputs, [
{
address: testTx.delegator,
value: testTx.sendMessage.value.amount.amount,
coin: basecoin.getChain(),
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testTx.validator,
value: testTx.sendMessage.value.amount.amount,
coin: basecoin.getChain(),
},
]);
});
it('should build undelegate tx without signature', async function () {
const txBuilder = factory.getStakingDeactivateBuilder();
txBuilder.sequence(testTx.sequence);
txBuilder.gasBudget(testTx.gasBudget);
txBuilder.messages([testTx.sendMessage.value]);
txBuilder.publicKey((0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)));
const tx = await txBuilder.build();
const json = await (await txBuilder.build()).toJson();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingDeactivate);
should_1.default.deepEqual(json.gasBudget, testTx.gasBudget);
should_1.default.deepEqual(json.sendMessages, [testTx.sendMessage]);
should_1.default.deepEqual(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)));
should_1.default.deepEqual(json.sequence, testTx.sequence);
tx.toBroadcastFormat();
should_1.default.deepEqual(tx.inputs, [
{
address: testTx.delegator,
value: testTx.sendMessage.value.amount.amount,
coin: basecoin.getChain(),
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testTx.validator,
value: testTx.sendMessage.value.amount.amount,
coin: basecoin.getChain(),
},
]);
});
it('should sign undelegate tx', async function () {
const txBuilder = factory.getStakingDeactivateBuilder();
txBuilder.sequence(testTx.sequence);
txBuilder.gasBudget(testTx.gasBudget);
txBuilder.messages([testTx.sendMessage.value]);
txBuilder.accountNumber(testTx.accountNumber);
txBuilder.chainId(testTx.chainId);
txBuilder.sign({ key: (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testTx.privateKey)) });
const tx = await txBuilder.build();
const json = await (await txBuilder.build()).toJson();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingDeactivate);
should_1.default.deepEqual(json.gasBudget, testTx.gasBudget);
should_1.default.deepEqual(json.sendMessages, [testTx.sendMessage]);
should_1.default.deepEqual(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)));
should_1.default.deepEqual(json.sequence, testTx.sequence);
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(tx.signature[0], (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testTx.signature)));
should_1.default.equal(rawTx, testTx.signedTxBase64);
should_1.default.deepEqual(tx.inputs, [
{
address: testTx.delegator,
value: testTx.sendMessage.value.amount.amount,
coin: basecoin.getChain(),
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testTx.validator,
value: testTx.sendMessage.value.amount.amount,
coin: basecoin.getChain(),
},
]);
});
it('should build a sendMany unstake tx', async function () {
const testSendManyTx = testData.TEST_SEND_MANY_UNSTAKE_TX;
const txBuilder = factory.getStakingDeactivateBuilder();
txBuilder.sequence(testSendManyTx.sequence);
txBuilder.gasBudget(testSendManyTx.gasBudget);
txBuilder.messages(testSendManyTx.sendMessages.map((msg) => msg.value));
txBuilder.publicKey((0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testSendManyTx.pubKey)));
txBuilder.chainId(testSendManyTx.chainId);
txBuilder.accountNumber(testSendManyTx.accountNumber);
txBuilder.memo('');
txBuilder.addSignature({ pub: (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testSendManyTx.pubKey)) }, Buffer.from(testSendManyTx.signature, 'base64'));
const tx = await txBuilder.build();
const json = await (await txBuilder.build()).toJson();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingDeactivate);
should_1.default.deepEqual(json.gasBudget, testSendManyTx.gasBudget);
should_1.default.deepEqual(json.sendMessages, testSendManyTx.sendMessages);
should_1.default.deepEqual(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testSendManyTx.pubKey)));
should_1.default.deepEqual(json.sequence, testSendManyTx.sequence);
should_1.default.deepEqual(tx.inputs, testSendManyTx.sendMessages.map((msg) => {
return {
address: msg.value.delegatorAddress,
value: msg.value.amount.amount,
coin: 'ttia',
};
}));
should_1.default.deepEqual(tx.outputs, testSendManyTx.sendMessages.map((msg) => {
return {
address: msg.value.validatorAddress,
value: msg.value.amount.amount,
coin: 'ttia',
};
}));
should_1.default.equal(tx.id, testSendManyTx.hash);
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testSendManyTx.signedTxBase64);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9TdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBeUQ7QUFDekQsK0NBQThDO0FBQzlDLG9EQUE0QjtBQUU1Qiw4REFBZ0Q7QUFDaEQsOENBQTBEO0FBQzFELDRDQUEwQztBQUMxQyxzQ0FBeUM7QUFFekMsUUFBUSxDQUFDLDRCQUE0QixFQUFFLEdBQUcsRUFBRTtJQUMxQyxJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFDYixJQUFJLE9BQU8sQ0FBQztJQUNaLElBQUksTUFBTSxDQUFDO0lBQ1gsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLO1FBQ25ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxD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RSxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0hleCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGZyb21CYXNlNjQgfSBmcm9tICdAY29zbWpzL2VuY29kaW5nJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcblxuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3RpYSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IFRpYSwgVHRpYSB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdUaWEgVW5kZWxlZ2F0ZSB0eG4gQnVpbGRlcicsICgpID0+IHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjtcbiAgbGV0IGZhY3Rvcnk7XG4gIGxldCB0ZXN0VHg7XG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0aWEnLCBUaWEuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndHRpYScsIFR0aWEuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndHRpYScpO1xuICAgIGZhY3RvcnkgPSBiYXNlY29pbi5nZXRCdWlsZGVyKCk7XG4gICAgdGVzdFR4ID0gdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIHVuZGVsZWdhdGUgdHggd2l0aCBzaWduYXR1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2VxdWVuY2UodGVzdFR4LnNlcXVlbmNlKTtcbiAgICB0eEJ1aWxkZXIuZ2FzQnVkZ2V0KHRlc3RUeC5nYXNCdWRnZXQpO1xuICAgIHR4QnVpbGRlci5tZXNzYWdlcyhbdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlXSk7XG4gICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgucHViS2V5KSkgfSwgQnVmZmVyLmZyb20odGVzdFR4LnNpZ25hdHVyZSwgJ2Jhc2U2NCcpKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3RUeC5nYXNCdWRnZXQpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZW5kTWVzc2FnZXMsIFt0ZXN0VHguc2VuZE1lc3NhZ2VdKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24ucHVibGljS2V5LCB0b0hleChmcm9tQmFzZTY0KHRlc3RUeC5wdWJLZXkpKSk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0VHguc2VxdWVuY2UpO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3RUeC5zaWduZWRUeEJhc2U2NCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pbnB1dHMsIFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGVzdFR4LmRlbGVnYXRvcixcbiAgICAgICAgdmFsdWU6IHRlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnQuYW1vdW50LFxuICAgICAgICBjb2luOiBiYXNlY29pbi5nZXRDaGFpbigpLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4Lm91dHB1dHMsIFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGVzdFR4LnZhbGlkYXRvcixcbiAgICAgICAgdmFsdWU6IHRlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnQuYW1vdW50LFxuICAgICAgICBjb2luOiBiYXNlY29pbi5nZXRDaGFpbigpLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCB1bmRlbGVnYXRlIHR4IHdpdGhvdXQgc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlcXVlbmNlKHRlc3RUeC5zZXF1ZW5jZSk7XG4gICAgdHhCdWlsZGVyLmdhc0J1ZGdldCh0ZXN0VHguZ2FzQnVkZ2V0KTtcbiAgICB0eEJ1aWxkZXIubWVzc2FnZXMoW3Rlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZV0pO1xuICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgucHViS2V5KSkpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkudG9Kc29uKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdFR4Lmdhc0J1ZGdldCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlbmRNZXNzYWdlcywgW3Rlc3RUeC5zZW5kTWVzc2FnZV0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnB1YktleSkpKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3RUeC5zZXF1ZW5jZSk7XG4gICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0VHguZGVsZWdhdG9yLFxuICAgICAgICB2YWx1ZTogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgIGNvaW46IGJhc2Vjb2luLmdldENoYWluKCksXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0VHgudmFsaWRhdG9yLFxuICAgICAgICB2YWx1ZTogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgIGNvaW46IGJhc2Vjb2luLmdldENoYWluKCksXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNpZ24gdW5kZWxlZ2F0ZSB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zZXF1ZW5jZSh0ZXN0VHguc2VxdWVuY2UpO1xuICAgIHR4QnVpbGRlci5nYXNCdWRnZXQodGVzdFR4Lmdhc0J1ZGdldCk7XG4gICAgdHhCdWlsZGVyLm1lc3NhZ2VzKFt0ZXN0VHguc2VuZE1lc3NhZ2UudmFsdWVdKTtcbiAgICB0eEJ1aWxkZXIuYWNjb3VudE51bWJlcih0ZXN0VHguYWNjb3VudE51bWJlcik7XG4gICAgdHhCdWlsZGVyLmNoYWluSWQodGVzdFR4LmNoYWluSWQpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0b0hleChmcm9tQmFzZTY0KHRlc3RUeC5wcml2YXRlS2V5KSkgfSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKS50b0pzb24oKTtcbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0VHguZ2FzQnVkZ2V0KTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VuZE1lc3NhZ2VzLCBbdGVzdFR4LnNlbmRNZXNzYWdlXSk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnB1YmxpY0tleSwgdG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgucHViS2V5KSkpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdFR4LnNlcXVlbmNlKTtcbiAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnNpZ25hdHVyZVswXSwgdG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHguc2lnbmF0dXJlKSkpO1xuICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdFR4LnNpZ25lZFR4QmFzZTY0KTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0VHguZGVsZWdhdG9yLFxuICAgICAgICB2YWx1ZTogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgIGNvaW46IGJhc2Vjb2luLmdldENoYWluKCksXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0VHgudmFsaWRhdG9yLFxuICAgICAgICB2YWx1ZTogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgIGNvaW46IGJhc2Vjb2luLmdldENoYWluKCksXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2VuZE1hbnkgdW5zdGFrZSB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0ZXN0U2VuZE1hbnlUeCA9IHRlc3REYXRhLlRFU1RfU0VORF9NQU5ZX1VOU1RBS0VfVFg7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2VxdWVuY2UodGVzdFNlbmRNYW55VHguc2VxdWVuY2UpO1xuICAgIHR4QnVpbGRlci5nYXNCdWRnZXQodGVzdFNlbmRNYW55VHguZ2FzQnVkZ2V0KTtcbiAgICB0eEJ1aWxkZXIubWVzc2FnZXModGVzdFNlbmRNYW55VHguc2VuZE1lc3NhZ2VzLm1hcCgobXNnKSA9PiBtc2cudmFsdWUpKTtcbiAgICB0eEJ1aWxkZXIucHVibGljS2V5KHRvSGV4KGZyb21CYXNlNjQodGVzdFNlbmRNYW55VHgucHViS2V5KSkpO1xuICAgIHR4QnVpbGRlci5jaGFpbklkKHRlc3RTZW5kTWFueVR4LmNoYWluSWQpO1xuICAgIHR4QnVpbGRlci5hY2NvdW50TnVtYmVyKHRlc3RTZW5kTWFueVR4LmFjY291bnROdW1iZXIpO1xuICAgIHR4QnVpbGRlci5tZW1vKCcnKTtcbiAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKFxuICAgICAgeyBwdWI6IHRvSGV4KGZyb21CYXNlNjQodGVzdFNlbmRNYW55VHgucHViS2V5KSkgfSxcbiAgICAgIEJ1ZmZlci5mcm9tKHRlc3RTZW5kTWFueVR4LnNpZ25hdHVyZSwgJ2Jhc2U2NCcpXG4gICAgKTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkudG9Kc29uKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdFNlbmRNYW55VHguZ2FzQnVkZ2V0KTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VuZE1lc3NhZ2VzLCB0ZXN0U2VuZE1hbnlUeC5zZW5kTWVzc2FnZXMpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdFNlbmRNYW55VHgucHViS2V5KSkpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdFNlbmRNYW55VHguc2VxdWVuY2UpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICB0eC5pbnB1dHMsXG4gICAgICB0ZXN0U2VuZE1hbnlUeC5zZW5kTWVzc2FnZXMubWFwKChtc2cpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhZGRyZXNzOiBtc2cudmFsdWUuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZTogbXNnLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3R0aWEnLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICB0eC5vdXRwdXRzLFxuICAgICAgdGVzdFNlbmRNYW55VHguc2VuZE1lc3NhZ2VzLm1hcCgobXNnKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkcmVzczogbXNnLnZhbHVlLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgICAgdmFsdWU6IG1zZy52YWx1ZS5hbW91bnQuYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0dGlhJyxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBzaG91bGQuZXF1YWwodHguaWQsIHRlc3RTZW5kTWFueVR4Lmhhc2gpO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3RTZW5kTWFueVR4LnNpZ25lZFR4QmFzZTY0KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!