PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-atom/dist/test/unit/transactionBuilder

Просмотр файла: transferBuilder.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 axios_1 = __importDefault(require("axios"));
const should_1 = __importDefault(require("should"));
const src_1 = require("../../../src");
const testData = __importStar(require("../../resources/atom"));
const getBuilderFactory_1 = require("../getBuilderFactory");
describe('Atom Transfer Builder', () => {
    const factory = (0, getBuilderFactory_1.getBuilderFactory)('tatom');
    const testTx = testData.TEST_SEND_TX;
    const testTxWithMemo = testData.TEST_TX_WITH_MEMO;
    it('should build a Transfer tx with signature', async function () {
        const txBuilder = factory.getTransferBuilder();
        txBuilder.sequence(testTx.sequence);
        txBuilder.gasBudget(testTx.gasBudget);
        txBuilder.messages([testTx.sendMessage.value]);
        txBuilder.publicKey((0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)));
        txBuilder.addSignature({ pub: (0, encoding_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.Send);
        should_1.default.deepEqual(json.gasBudget, testTx.gasBudget);
        should_1.default.deepEqual(json.sendMessages, [testTx.sendMessage]);
        should_1.default.deepEqual(json.publicKey, (0, encoding_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: testData.TEST_SEND_TX.sender,
                value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                coin: 'tatom',
            },
        ]);
        should_1.default.deepEqual(tx.outputs, [
            {
                address: testData.TEST_SEND_TX.sendMessage.value.toAddress,
                value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                coin: 'tatom',
            },
        ]);
    });
    it('should build a Transfer tx with signature and memo', async function () {
        const txBuilder = factory.getTransferBuilder();
        txBuilder.sequence(testTxWithMemo.sequence);
        txBuilder.gasBudget(testTxWithMemo.gasBudget);
        txBuilder.messages([testTxWithMemo.sendMessage.value]);
        txBuilder.publicKey((0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTxWithMemo.pubKey)));
        txBuilder.memo(testTxWithMemo.memo);
        txBuilder.addSignature({ pub: (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTxWithMemo.pubKey)) }, Buffer.from(testTxWithMemo.signature, 'base64'));
        const tx = await txBuilder.build();
        const json = await (await txBuilder.build()).toJson();
        should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
        should_1.default.deepEqual(json.gasBudget, testTxWithMemo.gasBudget);
        should_1.default.deepEqual(json.sendMessages, [testTxWithMemo.sendMessage]);
        should_1.default.deepEqual(json.publicKey, (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTxWithMemo.pubKey)));
        should_1.default.deepEqual(json.sequence, testTxWithMemo.sequence);
        should_1.default.equal(json.memo, testTxWithMemo.memo);
        const rawTx = tx.toBroadcastFormat();
        should_1.default.equal(rawTx, testTxWithMemo.signedTxBase64);
        should_1.default.deepEqual(tx.inputs, [
            {
                address: testTxWithMemo.sendMessage.value.fromAddress,
                value: testTxWithMemo.sendMessage.value.amount[0].amount,
                coin: 'tatom',
            },
        ]);
        should_1.default.deepEqual(tx.outputs, [
            {
                address: testTxWithMemo.sendMessage.value.toAddress,
                value: testTxWithMemo.sendMessage.value.amount[0].amount,
                coin: 'tatom',
            },
        ]);
    });
    it('should build a Transfer tx without signature', async function () {
        const txBuilder = factory.getTransferBuilder();
        txBuilder.sequence(testTx.sequence);
        txBuilder.gasBudget(testTx.gasBudget);
        txBuilder.messages([testTx.sendMessage.value]);
        txBuilder.publicKey((0, encoding_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.Send);
        should_1.default.deepEqual(json.gasBudget, testTx.gasBudget);
        should_1.default.deepEqual(json.sendMessages, [testTx.sendMessage]);
        should_1.default.deepEqual(json.publicKey, (0, encoding_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: testData.TEST_SEND_TX.sender,
                value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                coin: 'tatom',
            },
        ]);
        should_1.default.deepEqual(tx.outputs, [
            {
                address: testData.TEST_SEND_TX.sendMessage.value.toAddress,
                value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                coin: 'tatom',
            },
        ]);
    });
    it('should sign a Transfer tx', async function () {
        const txBuilder = factory.getTransferBuilder();
        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, encoding_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.Send);
        should_1.default.deepEqual(json.gasBudget, testTx.gasBudget);
        should_1.default.deepEqual(json.sendMessages, [testTx.sendMessage]);
        should_1.default.deepEqual(json.publicKey, (0, encoding_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, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx.signature)));
        should_1.default.equal(rawTx, testTx.signedTxBase64);
        should_1.default.deepEqual(tx.inputs, [
            {
                address: testData.TEST_SEND_TX.sender,
                value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                coin: 'tatom',
            },
        ]);
        should_1.default.deepEqual(tx.outputs, [
            {
                address: testData.TEST_SEND_TX.sendMessage.value.toAddress,
                value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                coin: 'tatom',
            },
        ]);
    });
    it('should build a sendMany Transfer tx', async function () {
        const testSendManyTx = testData.TEST_SEND_MANY_TX;
        const txBuilder = factory.getTransferBuilder();
        txBuilder.sequence(testSendManyTx.sequence);
        txBuilder.gasBudget(testSendManyTx.gasBudget);
        txBuilder.messages(testSendManyTx.sendMessages.map((msg) => msg.value));
        txBuilder.publicKey((0, encoding_1.toHex)((0, encoding_1.fromBase64)(testSendManyTx.pubKey)));
        txBuilder.chainId(testSendManyTx.chainId);
        txBuilder.accountNumber(testSendManyTx.accountNumber);
        txBuilder.memo(testSendManyTx.memo);
        txBuilder.addSignature({ pub: (0, encoding_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.Send);
        should_1.default.deepEqual(json.gasBudget, testSendManyTx.gasBudget);
        should_1.default.deepEqual(json.sendMessages, testSendManyTx.sendMessages);
        should_1.default.deepEqual(json.publicKey, (0, encoding_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.fromAddress,
                value: msg.value.amount[0].amount,
                coin: 'tatom',
            };
        }));
        should_1.default.deepEqual(tx.outputs, testSendManyTx.sendMessages.map((msg) => {
            return {
                address: msg.value.toAddress,
                value: msg.value.amount[0].amount,
                coin: 'tatom',
            };
        }));
        should_1.default.equal(tx.id, testSendManyTx.hash);
        const rawTx = tx.toBroadcastFormat();
        should_1.default.equal(rawTx, testSendManyTx.signedTxBase64);
    });
    xit('should submit a send transaction', async () => {
        const keyPair = new src_1.KeyPair({ prv: (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx.privateKey)) });
        const axiosConfig = {
            headers: {
                'Content-Type': 'application/cbor',
            },
            timeout: 10000,
        };
        const txBuilder = factory.getTransferBuilder();
        txBuilder.sequence(9);
        txBuilder.gasBudget(testTx.gasBudget);
        txBuilder.messages([testTx.sendMessage.value]);
        txBuilder.accountNumber(testTx.accountNumber);
        txBuilder.chainId(testTx.chainId);
        txBuilder.sign({ key: keyPair.getKeys().prv });
        const tx = await txBuilder.build();
        const serializedTx = tx.toBroadcastFormat();
        try {
            const res = await axios_1.default.post('https://rest.sentry-01.theta-testnet.polypore.xyz/cosmos/tx/v1beta1/txs', {
                mode: 'BROADCAST_MODE_BLOCK',
                tx_bytes: serializedTx,
            }, axiosConfig);
            console.log(res);
        }
        catch (err) {
            console.log(err);
        }
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBa0Q7QUFDbEQsK0NBQXFEO0FBQ3JELGtEQUEwQjtBQUMxQixvREFBNEI7QUFDNUIsc0NBQXVDO0FBQ3ZDLCtEQUFpRDtBQUNqRCw0REFBeUQ7QUFFekQsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDckMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0lBQ2xELEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLO1FBQ25ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDL0MsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFBLGdCQUFLLEVBQUMsSUFBQSxxQkFBVSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFBLGdCQUFLLEVBQUMsSUFBQSxxQkFBVSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FB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c0JBQXNCO2dCQUM1QixRQUFRLEVBQUUsWUFBWTthQUN2QixFQUNELFdBQVcsQ0FDWixDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCwgdG9IZXggfSBmcm9tICdAY29zbWpzL2VuY29kaW5nJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9hdG9tJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuXG5kZXNjcmliZSgnQXRvbSBUcmFuc2ZlciBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3RhdG9tJyk7XG4gIGNvbnN0IHRlc3RUeCA9IHRlc3REYXRhLlRFU1RfU0VORF9UWDtcbiAgY29uc3QgdGVzdFR4V2l0aE1lbW8gPSB0ZXN0RGF0YS5URVNUX1RYX1dJVEhfTUVNTztcbiAgaXQoJ3Nob3VsZCBidWlsZCBhIFRyYW5zZmVyIHR4IHdpdGggc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlcXVlbmNlKHRlc3RUeC5zZXF1ZW5jZSk7XG4gICAgdHhCdWlsZGVyLmdhc0J1ZGdldCh0ZXN0VHguZ2FzQnVkZ2V0KTtcbiAgICB0eEJ1aWxkZXIubWVzc2FnZXMoW3Rlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZV0pO1xuICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgucHViS2V5KSkpO1xuICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnB1YktleSkpIH0sIEJ1ZmZlci5mcm9tKHRlc3RUeC5zaWduYXR1cmUsICdiYXNlNjQnKSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdFR4Lmdhc0J1ZGdldCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlbmRNZXNzYWdlcywgW3Rlc3RUeC5zZW5kTWVzc2FnZV0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnB1YktleSkpKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3RUeC5zZXF1ZW5jZSk7XG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdFR4LnNpZ25lZFR4QmFzZTY0KTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZGVyLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXRvbScsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUudG9BZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXRvbScsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgVHJhbnNmZXIgdHggd2l0aCBzaWduYXR1cmUgYW5kIG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2VxdWVuY2UodGVzdFR4V2l0aE1lbW8uc2VxdWVuY2UpO1xuICAgIHR4QnVpbGRlci5nYXNCdWRnZXQodGVzdFR4V2l0aE1lbW8uZ2FzQnVkZ2V0KTtcbiAgICB0eEJ1aWxkZXIubWVzc2FnZXMoW3Rlc3RUeFdpdGhNZW1vLnNlbmRNZXNzYWdlLnZhbHVlXSk7XG4gICAgdHhCdWlsZGVyLnB1YmxpY0tleSh0b0hleChmcm9tQmFzZTY0KHRlc3RUeFdpdGhNZW1vLnB1YktleSkpKTtcbiAgICB0eEJ1aWxkZXIubWVtbyh0ZXN0VHhXaXRoTWVtby5tZW1vKTtcbiAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKFxuICAgICAgeyBwdWI6IHRvSGV4KGZyb21CYXNlNjQodGVzdFR4V2l0aE1lbW8ucHViS2V5KSkgfSxcbiAgICAgIEJ1ZmZlci5mcm9tKHRlc3RUeFdpdGhNZW1vLnNpZ25hdHVyZSwgJ2Jhc2U2NCcpXG4gICAgKTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkudG9Kc29uKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0VHhXaXRoTWVtby5nYXNCdWRnZXQpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZW5kTWVzc2FnZXMsIFt0ZXN0VHhXaXRoTWVtby5zZW5kTWVzc2FnZV0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4V2l0aE1lbW8ucHViS2V5KSkpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdFR4V2l0aE1lbW8uc2VxdWVuY2UpO1xuICAgIHNob3VsZC5lcXVhbChqc29uLm1lbW8sIHRlc3RUeFdpdGhNZW1vLm1lbW8pO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3RUeFdpdGhNZW1vLnNpZ25lZFR4QmFzZTY0KTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0VHhXaXRoTWVtby5zZW5kTWVzc2FnZS52YWx1ZS5mcm9tQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3RUeFdpdGhNZW1vLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXRvbScsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0VHhXaXRoTWVtby5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0VHhXaXRoTWVtby5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndGF0b20nLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIFRyYW5zZmVyIHR4IHdpdGhvdXQgc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlcXVlbmNlKHRlc3RUeC5zZXF1ZW5jZSk7XG4gICAgdHhCdWlsZGVyLmdhc0J1ZGdldCh0ZXN0VHguZ2FzQnVkZ2V0KTtcbiAgICB0eEJ1aWxkZXIubWVzc2FnZXMoW3Rlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZV0pO1xuICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgucHViS2V5KSkpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkudG9Kc29uKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0VHguZ2FzQnVkZ2V0KTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VuZE1lc3NhZ2VzLCBbdGVzdFR4LnNlbmRNZXNzYWdlXSk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnB1YmxpY0tleSwgdG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgucHViS2V5KSkpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdFR4LnNlcXVlbmNlKTtcbiAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwodHguaW5wdXRzLCBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kZXIsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhdG9tJyxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhdG9tJyxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2lnbiBhIFRyYW5zZmVyIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlcXVlbmNlKHRlc3RUeC5zZXF1ZW5jZSk7XG4gICAgdHhCdWlsZGVyLmdhc0J1ZGdldCh0ZXN0VHguZ2FzQnVkZ2V0KTtcbiAgICB0eEJ1aWxkZXIubWVzc2FnZXMoW3Rlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZV0pO1xuICAgIHR4QnVpbGRlci5hY2NvdW50TnVtYmVyKHRlc3RUeC5hY2NvdW50TnVtYmVyKTtcbiAgICB0eEJ1aWxkZXIuY2hhaW5JZCh0ZXN0VHguY2hhaW5JZCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnByaXZhdGVLZXkpKSB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdFR4Lmdhc0J1ZGdldCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlbmRNZXNzYWdlcywgW3Rlc3RUeC5zZW5kTWVzc2FnZV0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnB1YktleSkpKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3RUeC5zZXF1ZW5jZSk7XG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNob3VsZC5lcXVhbCh0eC5zaWduYXR1cmVbMF0sIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnNpZ25hdHVyZSkpKTtcbiAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3RUeC5zaWduZWRUeEJhc2U2NCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pbnB1dHMsIFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRlcixcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndGF0b20nLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4Lm91dHB1dHMsIFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndGF0b20nLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIHNlbmRNYW55IFRyYW5zZmVyIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRlc3RTZW5kTWFueVR4ID0gdGVzdERhdGEuVEVTVF9TRU5EX01BTllfVFg7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2VxdWVuY2UodGVzdFNlbmRNYW55VHguc2VxdWVuY2UpO1xuICAgIHR4QnVpbGRlci5nYXNCdWRnZXQodGVzdFNlbmRNYW55VHguZ2FzQnVkZ2V0KTtcbiAgICB0eEJ1aWxkZXIubWVzc2FnZXModGVzdFNlbmRNYW55VHguc2VuZE1lc3NhZ2VzLm1hcCgobXNnKSA9PiBtc2cudmFsdWUpKTtcbiAgICB0eEJ1aWxkZXIucHVibGljS2V5KHRvSGV4KGZyb21CYXNlNjQodGVzdFNlbmRNYW55VHgucHViS2V5KSkpO1xuICAgIHR4QnVpbGRlci5jaGFpbklkKHRlc3RTZW5kTWFueVR4LmNoYWluSWQpO1xuICAgIHR4QnVpbGRlci5hY2NvdW50TnVtYmVyKHRlc3RTZW5kTWFueVR4LmFjY291bnROdW1iZXIpO1xuICAgIHR4QnVpbGRlci5tZW1vKHRlc3RTZW5kTWFueVR4Lm1lbW8pO1xuICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoXG4gICAgICB7IHB1YjogdG9IZXgoZnJvbUJhc2U2NCh0ZXN0U2VuZE1hbnlUeC5wdWJLZXkpKSB9LFxuICAgICAgQnVmZmVyLmZyb20odGVzdFNlbmRNYW55VHguc2lnbmF0dXJlLCAnYmFzZTY0JylcbiAgICApO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKS50b0pzb24oKTtcbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3RTZW5kTWFueVR4Lmdhc0J1ZGdldCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlbmRNZXNzYWdlcywgdGVzdFNlbmRNYW55VHguc2VuZE1lc3NhZ2VzKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24ucHVibGljS2V5LCB0b0hleChmcm9tQmFzZTY0KHRlc3RTZW5kTWFueVR4LnB1YktleSkpKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3RTZW5kTWFueVR4LnNlcXVlbmNlKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgdHguaW5wdXRzLFxuICAgICAgdGVzdFNlbmRNYW55VHguc2VuZE1lc3NhZ2VzLm1hcCgobXNnKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkcmVzczogbXNnLnZhbHVlLmZyb21BZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiBtc2cudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGF0b20nLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICB0eC5vdXRwdXRzLFxuICAgICAgdGVzdFNlbmRNYW55VHguc2VuZE1lc3NhZ2VzLm1hcCgobXNnKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkcmVzczogbXNnLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZTogbXNnLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3RhdG9tJyxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBzaG91bGQuZXF1YWwodHguaWQsIHRlc3RTZW5kTWFueVR4Lmhhc2gpO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3RTZW5kTWFueVR4LnNpZ25lZFR4QmFzZTY0KTtcbiAgfSk7XG5cbiAgeGl0KCdzaG91bGQgc3VibWl0IGEgc2VuZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnByaXZhdGVLZXkpKSB9KTtcbiAgICBjb25zdCBheGlvc0NvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9jYm9yJyxcbiAgICAgIH0sXG4gICAgICB0aW1lb3V0OiAxMDAwMCxcbiAgICB9O1xuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2VxdWVuY2UoOSk7XG4gICAgdHhCdWlsZGVyLmdhc0J1ZGdldCh0ZXN0VHguZ2FzQnVkZ2V0KTtcbiAgICB0eEJ1aWxkZXIubWVzc2FnZXMoW3Rlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZV0pO1xuICAgIHR4QnVpbGRlci5hY2NvdW50TnVtYmVyKHRlc3RUeC5hY2NvdW50TnVtYmVyKTtcbiAgICB0eEJ1aWxkZXIuY2hhaW5JZCh0ZXN0VHguY2hhaW5JZCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICAgICAgJ2h0dHBzOi8vcmVzdC5zZW50cnktMDEudGhldGEtdGVzdG5ldC5wb2x5cG9yZS54eXovY29zbW9zL3R4L3YxYmV0YTEvdHhzJyxcbiAgICAgICAge1xuICAgICAgICAgIG1vZGU6ICdCUk9BRENBU1RfTU9ERV9CTE9DSycsXG4gICAgICAgICAgdHhfYnl0ZXM6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgfSxcbiAgICAgICAgYXhpb3NDb25maWdcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iXX0=

Выполнить команду


Для локальной разработки. Не используйте в интернете!