PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-avaxc/dist/test/unit
Просмотр файла: util.js
"use strict";
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 statics_1 = require("@bitgo/statics");
const avaxc_1 = require("../resources/avaxc");
const utils_1 = require("../../src/lib/utils");
const getBuilder_1 = require("./getBuilder");
const sdk_core_1 = require("@bitgo/sdk-core");
const src_1 = require("../../src");
const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
describe('AVAX util library', () => {
describe('keys validations success cases', () => {
it('validate valid eth private key', () => {
should_1.default.equal((0, utils_1.isValidEthPrivateKey)(avaxc_1.TEST_ACCOUNT.ethPrivateKey), true);
});
it('validate valid eth public key', () => {
should_1.default.equal((0, utils_1.isValidEthPublicKey)(avaxc_1.TEST_ACCOUNT.ethUncompressedPublicKey), true);
});
it('validate valid eth address', () => {
should_1.default.equal((0, utils_1.isValidEthAddress)(avaxc_1.TEST_ACCOUNT.ethAddress), true);
});
});
describe('keys validations failure cases', () => {
it('validate empty eth private key', () => {
should_1.default.equal((0, utils_1.isValidEthPrivateKey)(''), false);
});
it('validate empty eth public key', () => {
should_1.default.equal((0, utils_1.isValidEthPublicKey)(''), false);
});
it('validate empty eth address', () => {
should_1.default.equal((0, utils_1.isValidEthAddress)(''), false);
});
it('validate eth private key too short', () => {
should_1.default.equal((0, utils_1.isValidEthPrivateKey)(avaxc_1.TEST_ACCOUNT.ethPrivateKey.slice(1)), false);
});
it('validate eth public key too short', () => {
should_1.default.equal((0, utils_1.isValidEthPublicKey)(avaxc_1.TEST_ACCOUNT.ethUncompressedPublicKey.slice(1)), false);
});
it('validate eth address too short', () => {
should_1.default.equal((0, utils_1.isValidEthAddress)(avaxc_1.TEST_ACCOUNT.ethAddress.slice(1)), false);
});
it('validate eth private key too long', () => {
should_1.default.equal((0, utils_1.isValidEthPrivateKey)(avaxc_1.TEST_ACCOUNT.ethPrivateKey + '00'), false);
});
it('validate eth public key too long', () => {
should_1.default.equal((0, utils_1.isValidEthPublicKey)(avaxc_1.TEST_ACCOUNT.ethUncompressedPublicKey + '00'), false);
});
it('validate eth address too long', () => {
should_1.default.equal((0, utils_1.isValidEthAddress)(avaxc_1.TEST_ACCOUNT.ethAddress + '00'), false);
});
});
describe('sign success cases', () => {
let txBuilder;
const contractAddress = avaxc_1.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);
txBuilder.transfer().amount('10000').to(avaxc_1.TEST_ACCOUNT_2.ethAddress).contractSequenceId(1);
};
beforeEach(() => {
initTxBuilder();
});
it('sign a valid txData with valid KeyPair', async () => {
const tx = await txBuilder.build();
const txData = tx.toJson();
should_1.default.not.exists(txData.r);
should_1.default.not.exists(txData.s);
should_1.default.equal(txData.v, '0x0150f5');
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
const signedTx = await (0, utils_1.sign)(txData, keyPair);
const txBuilder2 = (0, getBuilder_1.getBuilder)('tavaxc');
txBuilder2.from(signedTx);
const tx2 = await txBuilder2.build();
const tx2Data = tx2.toJson();
should_1.default.exists(tx2Data.r);
should_1.default.exists(tx2Data.s);
should_1.default.exists(tx2Data.v);
tx2Data.r.length.should.be.above(0);
tx2Data.s.length.should.be.above(0);
tx2Data.v.length.should.be.above(0);
});
it('sign txData with gasLimit set as number', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '1',
gasPrice: '0x0',
nonce: 1,
value: '0',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
});
it('sign txData with gasPrice set as number', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '0x1',
gasPrice: '1',
nonce: 1,
value: '0',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
});
it('sign txData with hex gasLimit and gasPrice values', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '0x1',
gasPrice: '0x1',
nonce: 1,
value: '0',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
});
it('sign txData with nonce zero', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '0x1',
gasPrice: '0x1',
nonce: 0,
value: '0',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
});
it('sign txData with value set as number', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '0x1',
gasPrice: '0x1',
nonce: 0,
value: '0',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
});
it('sign txData with value set as hex', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '0x1',
gasPrice: '0x1',
nonce: 0,
value: '0x0',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
});
});
describe('sign failure cases', () => {
it('sign txData with invalid gasLimit', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '',
gasPrice: '0x0',
nonce: 1,
value: '0',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
});
it('sign txData with invalid gasPrice', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '0x0',
gasPrice: '',
nonce: 1,
value: '0',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
});
it('sign txData with invalid nonce', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '0x0',
gasPrice: '0x0',
nonce: -1,
value: '0',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
});
it('sign txData with invalid value', async () => {
const txData = {
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
data: '',
gasLimit: '0x0',
gasPrice: '0x0',
nonce: 1,
value: '',
};
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
(0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
});
});
describe('network common configuration', () => {
it('getCommon for mainnet', () => {
const common = (0, utils_1.getCommon)(statics_1.NetworkType.MAINNET);
should_1.default.equal(common.chainName(), 'mainnet');
should_1.default.equal(common.hardfork(), 'london');
should_1.default.equal(common.chainIdBN().toString(), '43114');
should_1.default.equal(common.networkIdBN().toString(), '1');
});
it('getCommon for testnet', () => {
const common = (0, utils_1.getCommon)(statics_1.NetworkType.TESTNET);
should_1.default.equal(common.chainName(), 'fuji');
should_1.default.equal(common.hardfork(), 'london');
should_1.default.equal(common.chainIdBN().toString(), '43113');
should_1.default.equal(common.networkIdBN().toString(), '1');
});
it('getCommon for invalid network', () => {
assert_1.default.throws(() => (0, utils_1.getCommon)('invalidNetwork'), (e) => e.message === 'Missing network common configuration');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1Qiw0Q0FBNkM7QUFDN0MsOENBQWtFO0FBQ2xFLCtDQUFvSDtBQUVwSCw2Q0FBMEM7QUFDMUMsOENBQWtEO0FBQ2xELG1DQUF3RDtBQUN4RCxzREFBaUU7QUFFakUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7WUFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSw0QkFBb0IsRUFBQyxvQkFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtZQUN2QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLDJCQUFtQixFQUFDLG9CQUFZLENBQUMsd0JBQXdCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7WUFDcEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSx5QkFBaUIsRUFBQyxvQkFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7WUFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSw0QkFBb0IsRUFBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENB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RUFBQyxnQkFBK0IsQ0FBQyxFQUNoRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxzQ0FBc0MsQ0FDakUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IE5ldHdvcmtUeXBlIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVEVTVF9BQ0NPVU5ULCBURVNUX0FDQ09VTlRfMiB9IGZyb20gJy4uL3Jlc291cmNlcy9hdmF4Yyc7XG5pbXBvcnQgeyBpc1ZhbGlkRXRoQWRkcmVzcywgaXNWYWxpZEV0aFByaXZhdGVLZXksIGlzVmFsaWRFdGhQdWJsaWNLZXksIHNpZ24sIGdldENvbW1vbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5pbXBvcnQgeyBnZXRCdWlsZGVyIH0gZnJvbSAnLi9nZXRCdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBLZXlQYWlyLCBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgRVRIVHJhbnNhY3Rpb25UeXBlLCBUeERhdGEgfSBmcm9tICdAYml0Z28vc2RrLWNvaW4tZXRoJztcblxuZGVzY3JpYmUoJ0FWQVggdXRpbCBsaWJyYXJ5JywgKCkgPT4ge1xuICBkZXNjcmliZSgna2V5cyB2YWxpZGF0aW9ucyBzdWNjZXNzIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCd2YWxpZGF0ZSB2YWxpZCBldGggcHJpdmF0ZSBrZXknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFByaXZhdGVLZXkoVEVTVF9BQ0NPVU5ULmV0aFByaXZhdGVLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSB2YWxpZCBldGggcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoUHVibGljS2V5KFRFU1RfQUNDT1VOVC5ldGhVbmNvbXByZXNzZWRQdWJsaWNLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSB2YWxpZCBldGggYWRkcmVzcycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcyhURVNUX0FDQ09VTlQuZXRoQWRkcmVzcyksIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgna2V5cyB2YWxpZGF0aW9ucyBmYWlsdXJlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCd2YWxpZGF0ZSBlbXB0eSBldGggcHJpdmF0ZSBrZXknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFByaXZhdGVLZXkoJycpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZW1wdHkgZXRoIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFB1YmxpY0tleSgnJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBlbXB0eSBldGggYWRkcmVzcycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcygnJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBldGggcHJpdmF0ZSBrZXkgdG9vIHNob3J0JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKGlzVmFsaWRFdGhQcml2YXRlS2V5KFRFU1RfQUNDT1VOVC5ldGhQcml2YXRlS2V5LnNsaWNlKDEpKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCBwdWJsaWMga2V5IHRvbyBzaG9ydCcsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoUHVibGljS2V5KFRFU1RfQUNDT1VOVC5ldGhVbmNvbXByZXNzZWRQdWJsaWNLZXkuc2xpY2UoMSkpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIGFkZHJlc3MgdG9vIHNob3J0JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKGlzVmFsaWRFdGhBZGRyZXNzKFRFU1RfQUNDT1VOVC5ldGhBZGRyZXNzLnNsaWNlKDEpKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCBwcml2YXRlIGtleSB0b28gbG9uZycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoUHJpdmF0ZUtleShURVNUX0FDQ09VTlQuZXRoUHJpdmF0ZUtleSArICcwMCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIHB1YmxpYyBrZXkgdG9vIGxvbmcnLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFB1YmxpY0tleShURVNUX0FDQ09VTlQuZXRoVW5jb21wcmVzc2VkUHVibGljS2V5ICsgJzAwJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBldGggYWRkcmVzcyB0b28gbG9uZycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcyhURVNUX0FDQ09VTlQuZXRoQWRkcmVzcyArICcwMCcpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIHN1Y2Nlc3MgY2FzZXMnLCAoKSA9PiB7XG4gICAgbGV0IHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9IFRFU1RfQUNDT1VOVC5ldGhBZGRyZXNzO1xuICAgIGNvbnN0IGluaXRUeEJ1aWxkZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMjgwMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci50cmFuc2ZlcigpLmFtb3VudCgnMTAwMDAnKS50byhURVNUX0FDQ09VTlRfMi5ldGhBZGRyZXNzKS5jb250cmFjdFNlcXVlbmNlSWQoMSk7XG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW5pdFR4QnVpbGRlcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gYSB2YWxpZCB0eERhdGEgd2l0aCB2YWxpZCBLZXlQYWlyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQubm90LmV4aXN0cyh0eERhdGEucik7XG4gICAgICBzaG91bGQubm90LmV4aXN0cyh0eERhdGEucyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhEYXRhLnYsICcweDAxNTBmNScpO1xuXG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHNpZ24odHhEYXRhLCBrZXlQYWlyKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIyLmZyb20oc2lnbmVkVHgpO1xuICAgICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgY29uc3QgdHgyRGF0YSA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eDJEYXRhLnIpO1xuICAgICAgc2hvdWxkLmV4aXN0cyh0eDJEYXRhLnMpO1xuICAgICAgc2hvdWxkLmV4aXN0cyh0eDJEYXRhLnYpO1xuICAgICAgdHgyRGF0YS5yLmxlbmd0aC5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICB0eDJEYXRhLnMubGVuZ3RoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgIHR4MkRhdGEudi5sZW5ndGguc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggZ2FzTGltaXQgc2V0IGFzIG51bWJlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMScsXG4gICAgICAgIGdhc1ByaWNlOiAnMHgwJyxcbiAgICAgICAgbm9uY2U6IDEsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBURVNUX0FDQ09VTlRfMi5ldGhQcml2YXRlS2V5IH0pO1xuICAgICAgc2lnbih0eERhdGEsIGtleVBhaXIpLnNob3VsZC5iZS5mdWxmaWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduIHR4RGF0YSB3aXRoIGdhc1ByaWNlIHNldCBhcyBudW1iZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgICBnYXNMaW1pdDogJzB4MScsXG4gICAgICAgIGdhc1ByaWNlOiAnMScsXG4gICAgICAgIG5vbmNlOiAxLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUuZnVsZmlsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2lnbiB0eERhdGEgd2l0aCBoZXggZ2FzTGltaXQgYW5kIGdhc1ByaWNlIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMSxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggbm9uY2UgemVybycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMCxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggdmFsdWUgc2V0IGFzIG51bWJlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMCxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggdmFsdWUgc2V0IGFzIGhleCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMCxcbiAgICAgICAgdmFsdWU6ICcweDAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUuZnVsZmlsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIGZhaWx1cmUgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggaW52YWxpZCBnYXNMaW1pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDAnLFxuICAgICAgICBub25jZTogMSxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChuZXcgUmVnRXhwKCdDYW5ub3QgY29udmVydCBzdHJpbmcgdG8gYnVmZmVyLisnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2lnbiB0eERhdGEgd2l0aCBpbnZhbGlkIGdhc1ByaWNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhEYXRhOiBUeERhdGEgPSB7XG4gICAgICAgIF90eXBlOiBFVEhUcmFuc2FjdGlvblR5cGUuTEVHQUNZLFxuICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcweDAnLFxuICAgICAgICBnYXNQcmljZTogJycsXG4gICAgICAgIG5vbmNlOiAxLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKG5ldyBSZWdFeHAoJ0Nhbm5vdCBjb252ZXJ0IHN0cmluZyB0byBidWZmZXIuKycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduIHR4RGF0YSB3aXRoIGludmFsaWQgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgICBnYXNMaW1pdDogJzB4MCcsXG4gICAgICAgIGdhc1ByaWNlOiAnMHgwJyxcbiAgICAgICAgbm9uY2U6IC0xLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKG5ldyBSZWdFeHAoJ0Nhbm5vdCBjb252ZXJ0IHN0cmluZyB0byBidWZmZXIuKycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduIHR4RGF0YSB3aXRoIGludmFsaWQgdmFsdWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgICBnYXNMaW1pdDogJzB4MCcsXG4gICAgICAgIGdhc1ByaWNlOiAnMHgwJyxcbiAgICAgICAgbm9uY2U6IDEsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChuZXcgUmVnRXhwKCdDYW5ub3QgY29udmVydCBzdHJpbmcgdG8gYnVmZmVyLisnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCduZXR3b3JrIGNvbW1vbiBjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdnZXRDb21tb24gZm9yIG1haW5uZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21tb24gPSBnZXRDb21tb24oTmV0d29ya1R5cGUuTUFJTk5FVCk7XG4gICAgICBzaG91bGQuZXF1YWwoY29tbW9uLmNoYWluTmFtZSgpLCAnbWFpbm5ldCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5oYXJkZm9yaygpLCAnbG9uZG9uJyk7XG4gICAgICBzaG91bGQuZXF1YWwoY29tbW9uLmNoYWluSWRCTigpLnRvU3RyaW5nKCksICc0MzExNCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5uZXR3b3JrSWRCTigpLnRvU3RyaW5nKCksICcxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2V0Q29tbW9uIGZvciB0ZXN0bmV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tbW9uID0gZ2V0Q29tbW9uKE5ldHdvcmtUeXBlLlRFU1RORVQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5jaGFpbk5hbWUoKSwgJ2Z1amknKTtcbiAgICAgIHNob3VsZC5lcXVhbChjb21tb24uaGFyZGZvcmsoKSwgJ2xvbmRvbicpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5jaGFpbklkQk4oKS50b1N0cmluZygpLCAnNDMxMTMnKTtcbiAgICAgIHNob3VsZC5lcXVhbChjb21tb24ubmV0d29ya0lkQk4oKS50b1N0cmluZygpLCAnMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dldENvbW1vbiBmb3IgaW52YWxpZCBuZXR3b3JrJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gZ2V0Q29tbW9uKCdpbnZhbGlkTmV0d29yaycgYXMgTmV0d29ya1R5cGUpLFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdNaXNzaW5nIG5ldHdvcmsgY29tbW9uIGNvbmZpZ3VyYXRpb24nXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!