PHP WebShell

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

Просмотр файла: walletInitialization.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_core_1 = require("@bitgo/sdk-core");
const getBuilder_1 = require("../getBuilder");
const testData = __importStar(require("../../resources/celo"));
describe('Celo Transaction builder for wallet initialization', () => {
    let txBuilder;
    const initTxBuilder = () => {
        txBuilder = (0, getBuilder_1.getBuilder)('tcelo');
        txBuilder.fee({
            fee: '1000000000',
            gasLimit: '12100000',
        });
        txBuilder.counter(2);
        txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
        txBuilder.owner(testData.KEYPAIR_PRV.getAddress());
        txBuilder.owner('0xBa8eA9C3729686d7DB120efCfC81cD020C8DC1CB');
        txBuilder.owner('0x2fa96fca36dd9d646AC8a4e0C19b4D3a0Dc7e456');
    };
    describe('should build ', () => {
        it('an init transaction', async () => {
            initTxBuilder();
            txBuilder.sign({ key: testData.KEYPAIR_PRV.getKeys().prv });
            const tx = await txBuilder.build(); // should build and sign
            tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
            const txJson = tx.toJson();
            txJson.gasLimit.should.equal('12100000');
            txJson.gasPrice.should.equal('1000000000');
            should_1.default.equal(txJson.nonce, 2);
            should_1.default.equal(txJson.chainId, 44787);
            should_1.default.equal(tx.toBroadcastFormat(), testData.TX_BROADCAST);
            should_1.default.equal(txJson.from, testData.KEYPAIR_PRV.getAddress());
        });
        it('an init transaction with nonce 0', async () => {
            initTxBuilder();
            txBuilder.counter(0);
            txBuilder.sign({ key: testData.KEYPAIR_PRV.getKeys().prv });
            const tx = await txBuilder.build(); // should build and sign
            tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
            const txJson = tx.toJson();
            txJson.gasLimit.should.equal('12100000');
            txJson.gasPrice.should.equal('1000000000');
            should_1.default.equal(txJson.nonce, 0);
            should_1.default.equal(txJson.chainId, 44787);
            should_1.default.equal(txJson.from, testData.KEYPAIR_PRV.getAddress());
        });
        it('unsigned transaction without final v', async () => {
            initTxBuilder();
            txBuilder.counter(0);
            const tx = await txBuilder.build();
            tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
            const txJson = tx.toJson();
            txJson.gasLimit.should.equal('12100000');
            txJson.gasPrice.should.equal('1000000000');
            should_1.default.equal(txJson.nonce, 0);
            should_1.default.equal(txJson.chainId, 44787);
            // Celo has disable final v and it has chain id as v value.
            should_1.default.equal(txJson.v, 0x015e09);
        });
        it('an init transaction from an unsigned serialized one', async () => {
            initTxBuilder();
            const tx = await txBuilder.build();
            const serialized = tx.toBroadcastFormat();
            // now rebuild from the signed serialized tx and make sure it stays the same
            const newTxBuilder = (0, getBuilder_1.getBuilder)('tcelo');
            newTxBuilder.from(serialized);
            newTxBuilder.sign({ key: testData.KEYPAIR_PRV.getKeys().prv });
            const signedTx = await newTxBuilder.build();
            should_1.default.equal(signedTx.toJson().chainId, 44787);
            should_1.default.equal(signedTx.toBroadcastFormat(), testData.TX_BROADCAST);
        });
        it('a signed init transaction from serialized', async () => {
            const newTxBuilder = (0, getBuilder_1.getBuilder)('tcelo');
            newTxBuilder.from(testData.TX_BROADCAST);
            const newTx = await newTxBuilder.build();
            should_1.default.equal(newTx.toBroadcastFormat(), testData.TX_BROADCAST);
        });
        it('correct transaction id', async () => {
            const newTxBuilder = (0, getBuilder_1.getBuilder)('tcelo');
            newTxBuilder.from(testData.TEST_WALLET_CREATION);
            const newTx = await newTxBuilder.build();
            should_1.default.equal(newTx.toJson().id, '0x3b6cdb03cc92aae90ae067ec71e27f17ff879e9c6499ab682212bab367628a9c');
        });
    });
    describe('Should validate ', () => {
        it('a raw transaction', async () => {
            const builder = (0, getBuilder_1.getBuilder)('tcelo');
            should_1.default.doesNotThrow(() => builder.from(testData.TX_BROADCAST));
            should_1.default.doesNotThrow(() => builder.from(testData.TX_JSON));
            assert_1.default.throws(() => builder.from('0x00001000'), /There was error in decoding the hex string/);
            assert_1.default.throws(() => builder.from(''), /Raw transaction is empty/);
            assert_1.default.throws(() => builder.from('pqrs'), /There was error in parsing the JSON string/);
            assert_1.default.throws(() => builder.from(1234), /Transaction is not a hex string or stringified json/);
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3dhbGxldEluaXRpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1Qiw4Q0FBa0Q7QUFDbEQsOENBQTJDO0FBRTNDLCtEQUFpRDtBQUVqRCxRQUFRLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFO0lBQ2xFLElBQUksU0FBNkIsQ0FBQztJQUNsQyxNQUFNLGFBQWEsR0FBRyxHQUFTLEVBQUU7UUFDL0IsU0FBUyxHQUFHLElBQUEsdUJBQVUsRUFBQyxPQUFPLENBQXVCLENBQUM7UUFDdEQsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUNaLEdBQUcsRUFBRSxZQUFZO1lBQ2pCLFFBQVEsRUFBRSxVQUFVO1NBQ3JCLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDckQsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDbkQsU0FBUyxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzlELFNBQVMsQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUNoRSxDQUFDLENBQUM7SUFFRixRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtRQUM3QixFQUFFLENBQUMscUJBQXFCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkMsYUFBYSxFQUFFLENBQUM7WUFDaEIsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMs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QUMsWUFBWSxDQUFDLEVBQUUsNENBQTRDLENBQUMsQ0FBQztZQUM5RixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLENBQUM7WUFDbEUsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ3hGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUscURBQXFELENBQUMsQ0FBQztRQUNqRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uL2dldEJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9jZWxvJztcblxuZGVzY3JpYmUoJ0NlbG8gVHJhbnNhY3Rpb24gYnVpbGRlciBmb3Igd2FsbGV0IGluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICBsZXQgdHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gIGNvbnN0IGluaXRUeEJ1aWxkZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcigndGNlbG8nKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICBmZWU6ICcxMDAwMDAwMDAwJyxcbiAgICAgIGdhc0xpbWl0OiAnMTIxMDAwMDAnLFxuICAgIH0pO1xuICAgIHR4QnVpbGRlci5jb3VudGVyKDIpO1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgdHhCdWlsZGVyLm93bmVyKHRlc3REYXRhLktFWVBBSVJfUFJWLmdldEFkZHJlc3MoKSk7XG4gICAgdHhCdWlsZGVyLm93bmVyKCcweEJhOGVBOUMzNzI5Njg2ZDdEQjEyMGVmQ2ZDODFjRDAyMEM4REMxQ0InKTtcbiAgICB0eEJ1aWxkZXIub3duZXIoJzB4MmZhOTZmY2EzNmRkOWQ2NDZBQzhhNGUwQzE5YjREM2EwRGM3ZTQ1NicpO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgJywgKCkgPT4ge1xuICAgIGl0KCdhbiBpbml0IHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLktFWVBBSVJfUFJWLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpOyAvLyBzaG91bGQgYnVpbGQgYW5kIHNpZ25cblxuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmdhc0xpbWl0LnNob3VsZC5lcXVhbCgnMTIxMDAwMDAnKTtcbiAgICAgIHR4SnNvbi5nYXNQcmljZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ubm9uY2UsIDIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5jaGFpbklkLCA0NDc4Nyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuVFhfQlJPQURDQVNUKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgdGVzdERhdGEuS0VZUEFJUl9QUlYuZ2V0QWRkcmVzcygpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBpbml0IHRyYW5zYWN0aW9uIHdpdGggbm9uY2UgMCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDApO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLktFWVBBSVJfUFJWLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpOyAvLyBzaG91bGQgYnVpbGQgYW5kIHNpZ25cblxuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmdhc0xpbWl0LnNob3VsZC5lcXVhbCgnMTIxMDAwMDAnKTtcbiAgICAgIHR4SnNvbi5nYXNQcmljZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ubm9uY2UsIDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5jaGFpbklkLCA0NDc4Nyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sIHRlc3REYXRhLktFWVBBSVJfUFJWLmdldEFkZHJlc3MoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgndW5zaWduZWQgdHJhbnNhY3Rpb24gd2l0aG91dCBmaW5hbCB2JywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmdhc0xpbWl0LnNob3VsZC5lcXVhbCgnMTIxMDAwMDAnKTtcbiAgICAgIHR4SnNvbi5nYXNQcmljZS5zaG91bGQuZXF1YWwoJzEwMDAwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ubm9uY2UsIDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5jaGFpbklkLCA0NDc4Nyk7XG4gICAgICAvLyBDZWxvIGhhcyBkaXNhYmxlIGZpbmFsIHYgYW5kIGl0IGhhcyBjaGFpbiBpZCBhcyB2IHZhbHVlLlxuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi52LCAweDAxNWUwOSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gaW5pdCB0cmFuc2FjdGlvbiBmcm9tIGFuIHVuc2lnbmVkIHNlcmlhbGl6ZWQgb25lJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW5pdFR4QnVpbGRlcigpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBub3cgcmVidWlsZCBmcm9tIHRoZSBzaWduZWQgc2VyaWFsaXplZCB0eCBhbmQgbWFrZSBzdXJlIGl0IHN0YXlzIHRoZSBzYW1lXG4gICAgICBjb25zdCBuZXdUeEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0Y2VsbycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIG5ld1R4QnVpbGRlci5mcm9tKHNlcmlhbGl6ZWQpO1xuICAgICAgbmV3VHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLktFWVBBSVJfUFJWLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IG5ld1R4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnRvSnNvbigpLmNoYWluSWQsIDQ0Nzg3KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5UWF9CUk9BRENBU1QpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2lnbmVkIGluaXQgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbmV3VHhCdWlsZGVyID0gZ2V0QnVpbGRlcigndGNlbG8nKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICBuZXdUeEJ1aWxkZXIuZnJvbSh0ZXN0RGF0YS5UWF9CUk9BRENBU1QpO1xuICAgICAgY29uc3QgbmV3VHggPSBhd2FpdCBuZXdUeEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChuZXdUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5UWF9CUk9BRENBU1QpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3QgdHJhbnNhY3Rpb24gaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBuZXdUeEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0Y2VsbycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIG5ld1R4QnVpbGRlci5mcm9tKHRlc3REYXRhLlRFU1RfV0FMTEVUX0NSRUFUSU9OKTtcbiAgICAgIGNvbnN0IG5ld1R4ID0gYXdhaXQgbmV3VHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3VHgudG9Kc29uKCkuaWQsICcweDNiNmNkYjAzY2M5MmFhZTkwYWUwNjdlYzcxZTI3ZjE3ZmY4NzllOWM2NDk5YWI2ODIyMTJiYWIzNjc2MjhhOWMnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Nob3VsZCB2YWxpZGF0ZSAnLCAoKSA9PiB7XG4gICAgaXQoJ2EgcmF3IHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RjZWxvJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmZyb20odGVzdERhdGEuVFhfQlJPQURDQVNUKSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZnJvbSh0ZXN0RGF0YS5UWF9KU09OKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuZnJvbSgnMHgwMDAwMTAwMCcpLCAvVGhlcmUgd2FzIGVycm9yIGluIGRlY29kaW5nIHRoZSBoZXggc3RyaW5nLyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuZnJvbSgnJyksIC9SYXcgdHJhbnNhY3Rpb24gaXMgZW1wdHkvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5mcm9tKCdwcXJzJyksIC9UaGVyZSB3YXMgZXJyb3IgaW4gcGFyc2luZyB0aGUgSlNPTiBzdHJpbmcvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5mcm9tKDEyMzQpLCAvVHJhbnNhY3Rpb24gaXMgbm90IGEgaGV4IHN0cmluZyBvciBzdHJpbmdpZmllZCBqc29uLyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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