PHP WebShell

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

Просмотр файла: arbethToken.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 should = __importStar(require("should"));
const sdk_test_1 = require("@bitgo/sdk-test");
const nock_1 = __importDefault(require("nock"));
const abstract_eth_1 = require("@bitgo/abstract-eth");
const sdk_api_1 = require("@bitgo/sdk-api");
const src_1 = require("../../src");
const mockData = __importStar(require("../fixtures/arbeth"));
describe('Arbeth Token:', function () {
    let bitgo;
    let arbethTokenCoin;
    const baseUrl = 'https://api-sepolia.arbiscan.io';
    const tokenName = 'tarbeth:link';
    const walletContractAddress = '0xdf07117705a9f8dc4c2a78de66b7f1797dba9d4e';
    const tokenContractAddress = '0xe5b6c29411b3ad31c3613bba0145293fc9957256';
    const recipientAddress = '0xa9c34eb3d3631501de56d9cfc5363f9335cfcff6';
    before(function () {
        bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
        src_1.ArbethToken.createTokenConstructors().forEach(({ name, coinConstructor }) => {
            bitgo.safeRegister(name, coinConstructor);
        });
        bitgo.initializeTestVars();
        arbethTokenCoin = bitgo.coin(tokenName);
    });
    it('should return constants', function () {
        arbethTokenCoin.getChain().should.equal('tarbeth:link');
        arbethTokenCoin.getBaseChain().should.equal('tarbeth');
        arbethTokenCoin.getFullName().should.equal('Arbeth Token');
        arbethTokenCoin.getBaseFactor().should.equal(1e18);
        arbethTokenCoin.type.should.equal(tokenName);
        arbethTokenCoin.name.should.equal('Arbitrum Test LINK');
        arbethTokenCoin.coin.should.equal('tarbeth');
        arbethTokenCoin.network.should.equal('Testnet');
        arbethTokenCoin.decimalPlaces.should.equal(18);
    });
    it('should return same token by contract address', function () {
        const tokencoinBycontractAddress = bitgo.coin(arbethTokenCoin.tokenContractAddress);
        arbethTokenCoin.should.deepEqual(tokencoinBycontractAddress);
    });
    it('should generate an unsigned sweep', async function () {
        const userXpub = 'xpub661MyMwAqRbcEeTc8789MK5PUGEYiPG4F4V17n2Rd2LoTATA1XoCnJT5FAYAShQxSxtFjpo5NHmcWwTp2LiWGBMwpUcAA3HywhxivgYfq7q';
        const backupXpub = 'xpub661MyMwAqRbcFZX15xpZf4ERCGHiVSJm8r5C4yh1yXV2GrdZCUPYo4WQr6tN9oUywKXsgSHo7Risf9r22GH5joVD2hEEEhqnSCvK8qy11wW';
        const backupKeyAddress = '0x4f2c4830cc37f2785c646f89ded8a919219fa0e9';
        (0, nock_1.default)(baseUrl)
            .get('/api')
            .twice()
            .query(mockData.getTxListRequest(backupKeyAddress))
            .reply(200, mockData.getTxListResponse);
        (0, nock_1.default)(baseUrl)
            .get('/api')
            .query(mockData.getTokenBalanceRequest(tokenContractAddress, walletContractAddress))
            .reply(200, mockData.getTokenBalanceResponse);
        (0, nock_1.default)(baseUrl)
            .get('/api')
            .query(mockData.getBalanceRequest(backupKeyAddress))
            .reply(200, mockData.getBalanceResponse);
        (0, nock_1.default)(baseUrl).get('/api').query(mockData.getContractCallRequest).reply(200, mockData.getContractCallResponse);
        const transaction = (await arbethTokenCoin.recover({
            userKey: userXpub,
            backupKey: backupXpub,
            walletContractAddress: walletContractAddress,
            tokenContractAddress,
            recoveryDestination: recipientAddress,
            eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
            gasLimit: 8000000,
        }));
        should.exist(transaction);
        transaction.should.have.property('txHex');
        transaction.should.have.property('contractSequenceId');
        transaction.should.have.property('expireTime');
        transaction.should.have.property('gasLimit');
        transaction.gasLimit.should.equal('8000000');
        transaction.should.have.property('walletContractAddress');
        transaction.walletContractAddress.should.equal(walletContractAddress);
        transaction.should.have.property('recipients');
        const recipient = transaction.recipients[0];
        recipient.should.have.property('address');
        recipient.address.should.equal(recipientAddress);
        recipient.should.have.property('amount');
        recipient.amount.should.equal('9999999999999999948');
    });
    it('should construct a recovery transaction without BitGo', async function () {
        const backupKeyAddress = '0x6d22efdd634996248170c948e5726007fc251bb3';
        (0, nock_1.default)(baseUrl).get('/api').query(mockData.getTxListRequest(backupKeyAddress)).reply(200, mockData.getTxListResponse);
        (0, nock_1.default)(baseUrl)
            .get('/api')
            .query(mockData.getBalanceRequest(walletContractAddress))
            .reply(200, mockData.getBalanceResponse);
        (0, nock_1.default)(baseUrl)
            .get('/api')
            .query(mockData.getTokenBalanceRequest(tokenContractAddress, walletContractAddress))
            .reply(200, mockData.getTokenBalanceResponse);
        (0, nock_1.default)(baseUrl)
            .get('/api')
            .query(mockData.getBalanceRequest(backupKeyAddress))
            .reply(200, mockData.getBalanceResponse);
        (0, nock_1.default)(baseUrl).get('/api').query(mockData.getContractCallRequest).reply(200, mockData.getContractCallResponse);
        const transaction = (await arbethTokenCoin.recover({
            userKey: '{"iv":"VFZ3jvXhxo1Z+Yaf2MtZnA==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
                ':"ccm","adata":"","cipher":"aes","salt":"p+fkHuLa/8k=","ct":"hYG7pvljLIgCjZ\n' +
                '53PBlCde5KZRmlUKKHLtDMk+HJfuU46hW+x+C9WsIAO4gFPnTCvFVmQ8x7czCtcNFub5AO2otOG\n' +
                'OsX4GE2gXOEmCl1TpWwwNhm7yMUjGJUpgW6ZZgXSXdDitSKi4V/hk78SGSzjFOBSPYRa6I="}\n',
            backupKey: '{"iv":"AbsCtv1qwPIhOgyrCpNagA==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
                ':"ccm","adata":"","cipher":"aes","salt":"5vpUDBUlzm8=","ct":"PapYYCjBXRLUKA\n' +
                'JbOsB/EJ9B8fUmVQTxMPjUnQyAky12me9K66GiMEAxTD7kd6bYAQJuuTkATXKU7Bnf7vK9JxNOw\n' +
                'oji7HF9eFH0aD4/hX5SWFfHF2Qfi+TnXv6hVsMAoisDZs3/F67/ZUaDYR0ZsdrQ4Q/cLD0="}\n',
            walletContractAddress: walletContractAddress,
            tokenContractAddress,
            walletPassphrase: 'oPXkPN5Q0c8i44i0',
            recoveryDestination: recipientAddress,
            gasLimit: 500000,
        }));
        should.exist(transaction);
        transaction.should.have.property('tx');
        transaction.should.have.property('id');
        const decodedTx = abstract_eth_1.optionalDeps.EthTx.Transaction.fromSerializedTx(abstract_eth_1.optionalDeps.ethUtil.toBuffer(transaction.tx));
        decodedTx.should.have.property('gasPrice');
        decodedTx.should.have.property('nonce');
        decodedTx.should.have.property('to');
        decodedTx.data.toString('hex').should.startWith('0dcd7a6c');
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJiZXRoVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvYXJiZXRoVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsOENBQTBEO0FBQzFELGdEQUF3QjtBQUN4QixzREFBdUU7QUFDdkUsNENBQTBDO0FBRTFDLG1DQUF3QztBQUN4Qyw2REFBK0M7QUFFL0MsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUN4QixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxlQUFlLENBQUM7SUFDcEIsTUFBTSxPQUFPLEdBQUcsaUNBQWlDLENBQUM7SUFDbEQsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDO0lBQ2pDLE1BQU0scUJBQXFCLEdBQUcsNENBQTRDLENBQUM7SUFDM0UsTUFBTSxvQkFBb0IsR0FBRyw0Q0FBNEMsQ0FBQztJQUMxRSxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO0lBRXRFLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsaUJBQVcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUU7WUFDMUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixlQUFlLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5QkFBeUIsRUFBRTtRQUM1QixlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4RCxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzRCxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRCxlQUFlLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7UUFDakQsTUFBTSwwQkFBMEIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BGLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSztRQUMzQyxNQUFNLFFBQVEsR0FDWixpSEFBaUgsQ0FBQztRQUNwSCxNQUFNLFVBQVUsR0FDZCxpSEFBaUgsQ0FBQztRQUVwSCxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO1FBQ3RFLElBQUEsY0FBSSxFQUFDLE9BQU8sQ0FBQzthQUNWLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDWCxLQUFLLEVBQUU7YUFDUCxLQUFLLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDbEQsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxQyxJQUFBLGNBQUksRUFBQyxPQUFPLENBQUM7YUFDVixHQUFHLENBQUMsTUFBTSxDQUFDO2FBQ1gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2FBQ25GLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDaEQsSUFBQSxjQUFJLEVBQUMsT0FBTyxDQUFDO2FBQ1YsR0FBRyxDQUFDLE1BQU0sQ0FBQzthQUNYLEtBQUssQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzthQUNuRCxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNDLElBQUEsY0FBSSxFQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM5RyxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sZUFBZSxDQUFDLE9BQU8sQ0FBQztZQUNqRCxPQUFPLEVBQUUsUUFBUTtZQUNqQixTQUFTLEVBQUUsVUFBVTtZQUNyQixxQkFBcUIsRUFBRSxxQkFBcUI7WUFDNUMsb0JBQW9CO1lBQ3BCLG1CQUFtQixFQUFFLGdCQUFnQjtZQUNyQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRTtZQUN6RSxRQUFRLEVBQUUsT0FBTztTQUNsQixDQUFDLENBQXVCLENBQUM7UUFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQixXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDdkQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDMUQsV0FBVyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN0RSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0MsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEtBQUs7UUFDL0QsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztRQUN0RSxJQUFBLGNBQUksRUFBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNwSCxJQUFBLGNBQUksRUFBQyxPQUFPLENBQUM7YUFDVixHQUFHLENBQUMsTUFBTSxDQUFDO2FBQ1gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2FBQ3hELEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFM0MsSUFBQSxjQUFJLEVBQUMsT0FBTyxDQUFDO2FBQ1YsR0FBRyxDQUFDLE1BQU0sQ0FBQzthQUNYLEtBQUssQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLEVBQUUscUJBQXFCLENBQUMsQ0FBQzthQUNuRixLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2hELElBQUEsY0FBSSxFQUFDLE9BQU8sQ0FBQzthQUNWLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDWCxLQUFLLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDbkQsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzQyxJQUFBLGNBQUksRUFBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFOUcsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxPQUFPLENBQUM7WUFDakQsT0FBTyxFQUNMLCtFQUErRTtnQkFDL0UsK0VBQStFO2dCQUMvRSwrRUFBK0U7Z0JBQy9FLDZFQUE2RTtZQUMvRSxTQUFTLEVBQ1AsK0VBQStFO2dCQUMvRSwrRUFBK0U7Z0JBQy9FLCtFQUErRTtnQkFDL0UsNkVBQTZFO1lBRS9FLHFCQUFxQixFQUFFLHFCQUFxQjtZQUM1QyxvQkFBb0I7WUFDcEIsZ0JBQWdCLEVBQUUsa0JBQWtCO1lBQ3BDLG1CQUFtQixFQUFFLGdCQUFnQjtZQUNyQyxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQXVCLENBQUM7UUFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQixXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLDJCQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakgsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCB7IE9mZmxpbmVWYXVsdFR4SW5mbywgb3B0aW9uYWxEZXBzIH0gZnJvbSAnQGJpdGdvL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcblxuaW1wb3J0IHsgQXJiZXRoVG9rZW4gfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgbW9ja0RhdGEgZnJvbSAnLi4vZml4dHVyZXMvYXJiZXRoJztcblxuZGVzY3JpYmUoJ0FyYmV0aCBUb2tlbjonLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYXJiZXRoVG9rZW5Db2luO1xuICBjb25zdCBiYXNlVXJsID0gJ2h0dHBzOi8vYXBpLXNlcG9saWEuYXJiaXNjYW4uaW8nO1xuICBjb25zdCB0b2tlbk5hbWUgPSAndGFyYmV0aDpsaW5rJztcbiAgY29uc3Qgd2FsbGV0Q29udHJhY3RBZGRyZXNzID0gJzB4ZGYwNzExNzcwNWE5ZjhkYzRjMmE3OGRlNjZiN2YxNzk3ZGJhOWQ0ZSc7XG4gIGNvbnN0IHRva2VuQ29udHJhY3RBZGRyZXNzID0gJzB4ZTViNmMyOTQxMWIzYWQzMWMzNjEzYmJhMDE0NTI5M2ZjOTk1NzI1Nic7XG4gIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSAnMHhhOWMzNGViM2QzNjMxNTAxZGU1NmQ5Y2ZjNTM2M2Y5MzM1Y2ZjZmY2JztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIEFyYmV0aFRva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3JzKCkuZm9yRWFjaCgoeyBuYW1lLCBjb2luQ29uc3RydWN0b3IgfSkgPT4ge1xuICAgICAgYml0Z28uc2FmZVJlZ2lzdGVyKG5hbWUsIGNvaW5Db25zdHJ1Y3Rvcik7XG4gICAgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYXJiZXRoVG9rZW5Db2luID0gYml0Z28uY29pbih0b2tlbk5hbWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBjb25zdGFudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXJiZXRoVG9rZW5Db2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCd0YXJiZXRoOmxpbmsnKTtcbiAgICBhcmJldGhUb2tlbkNvaW4uZ2V0QmFzZUNoYWluKCkuc2hvdWxkLmVxdWFsKCd0YXJiZXRoJyk7XG4gICAgYXJiZXRoVG9rZW5Db2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdBcmJldGggVG9rZW4nKTtcbiAgICBhcmJldGhUb2tlbkNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcbiAgICBhcmJldGhUb2tlbkNvaW4udHlwZS5zaG91bGQuZXF1YWwodG9rZW5OYW1lKTtcbiAgICBhcmJldGhUb2tlbkNvaW4ubmFtZS5zaG91bGQuZXF1YWwoJ0FyYml0cnVtIFRlc3QgTElOSycpO1xuICAgIGFyYmV0aFRva2VuQ29pbi5jb2luLnNob3VsZC5lcXVhbCgndGFyYmV0aCcpO1xuICAgIGFyYmV0aFRva2VuQ29pbi5uZXR3b3JrLnNob3VsZC5lcXVhbCgnVGVzdG5ldCcpO1xuICAgIGFyYmV0aFRva2VuQ29pbi5kZWNpbWFsUGxhY2VzLnNob3VsZC5lcXVhbCgxOCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHNhbWUgdG9rZW4gYnkgY29udHJhY3QgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b2tlbmNvaW5CeWNvbnRyYWN0QWRkcmVzcyA9IGJpdGdvLmNvaW4oYXJiZXRoVG9rZW5Db2luLnRva2VuQ29udHJhY3RBZGRyZXNzKTtcbiAgICBhcmJldGhUb2tlbkNvaW4uc2hvdWxkLmRlZXBFcXVhbCh0b2tlbmNvaW5CeWNvbnRyYWN0QWRkcmVzcyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYW4gdW5zaWduZWQgc3dlZXAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdXNlclhwdWIgPVxuICAgICAgJ3hwdWI2NjFNeU13QXFSYmNFZVRjODc4OU1LNVBVR0VZaVBHNEY0VjE3bjJSZDJMb1RBVEExWG9DbkpUNUZBWUFTaFF4U3h0RmpwbzVOSG1jV3dUcDJMaVdHQk13cFVjQUEzSHl3aHhpdmdZZnE3cSc7XG4gICAgY29uc3QgYmFja3VwWHB1YiA9XG4gICAgICAneHB1YjY2MU15TXdBcVJiY0ZaWDE1eHBaZjRFUkNHSGlWU0ptOHI1QzR5aDF5WFYyR3JkWkNVUFlvNFdRcjZ0TjlvVXl3S1hzZ1NIbzdSaXNmOXIyMkdINWpvVkQyaEVFRWhxblNDdks4cXkxMXdXJztcblxuICAgIGNvbnN0IGJhY2t1cEtleUFkZHJlc3MgPSAnMHg0ZjJjNDgzMGNjMzdmMjc4NWM2NDZmODlkZWQ4YTkxOTIxOWZhMGU5JztcbiAgICBub2NrKGJhc2VVcmwpXG4gICAgICAuZ2V0KCcvYXBpJylcbiAgICAgIC50d2ljZSgpXG4gICAgICAucXVlcnkobW9ja0RhdGEuZ2V0VHhMaXN0UmVxdWVzdChiYWNrdXBLZXlBZGRyZXNzKSlcbiAgICAgIC5yZXBseSgyMDAsIG1vY2tEYXRhLmdldFR4TGlzdFJlc3BvbnNlKTtcbiAgICBub2NrKGJhc2VVcmwpXG4gICAgICAuZ2V0KCcvYXBpJylcbiAgICAgIC5xdWVyeShtb2NrRGF0YS5nZXRUb2tlbkJhbGFuY2VSZXF1ZXN0KHRva2VuQ29udHJhY3RBZGRyZXNzLCB3YWxsZXRDb250cmFjdEFkZHJlc3MpKVxuICAgICAgLnJlcGx5KDIwMCwgbW9ja0RhdGEuZ2V0VG9rZW5CYWxhbmNlUmVzcG9uc2UpO1xuICAgIG5vY2soYmFzZVVybClcbiAgICAgIC5nZXQoJy9hcGknKVxuICAgICAgLnF1ZXJ5KG1vY2tEYXRhLmdldEJhbGFuY2VSZXF1ZXN0KGJhY2t1cEtleUFkZHJlc3MpKVxuICAgICAgLnJlcGx5KDIwMCwgbW9ja0RhdGEuZ2V0QmFsYW5jZVJlc3BvbnNlKTtcbiAgICBub2NrKGJhc2VVcmwpLmdldCgnL2FwaScpLnF1ZXJ5KG1vY2tEYXRhLmdldENvbnRyYWN0Q2FsbFJlcXVlc3QpLnJlcGx5KDIwMCwgbW9ja0RhdGEuZ2V0Q29udHJhY3RDYWxsUmVzcG9uc2UpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gKGF3YWl0IGFyYmV0aFRva2VuQ29pbi5yZWNvdmVyKHtcbiAgICAgIHVzZXJLZXk6IHVzZXJYcHViLFxuICAgICAgYmFja3VwS2V5OiBiYWNrdXBYcHViLFxuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiB3YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjAwMDAwMDAwMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMDAwMDAwMDAwMCB9LFxuICAgICAgZ2FzTGltaXQ6IDgwMDAwMDAsXG4gICAgfSkpIGFzIE9mZmxpbmVWYXVsdFR4SW5mbztcbiAgICBzaG91bGQuZXhpc3QodHJhbnNhY3Rpb24pO1xuICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eEhleCcpO1xuICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb250cmFjdFNlcXVlbmNlSWQnKTtcbiAgICB0cmFuc2FjdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZXhwaXJlVGltZScpO1xuICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdnYXNMaW1pdCcpO1xuICAgIHRyYW5zYWN0aW9uLmdhc0xpbWl0LnNob3VsZC5lcXVhbCgnODAwMDAwMCcpO1xuICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3YWxsZXRDb250cmFjdEFkZHJlc3MnKTtcbiAgICB0cmFuc2FjdGlvbi53YWxsZXRDb250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKHdhbGxldENvbnRyYWN0QWRkcmVzcyk7XG4gICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3JlY2lwaWVudHMnKTtcbiAgICBjb25zdCByZWNpcGllbnQgPSB0cmFuc2FjdGlvbi5yZWNpcGllbnRzWzBdO1xuICAgIHJlY2lwaWVudC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYWRkcmVzcycpO1xuICAgIHJlY2lwaWVudC5hZGRyZXNzLnNob3VsZC5lcXVhbChyZWNpcGllbnRBZGRyZXNzKTtcbiAgICByZWNpcGllbnQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Ftb3VudCcpO1xuICAgIHJlY2lwaWVudC5hbW91bnQuc2hvdWxkLmVxdWFsKCc5OTk5OTk5OTk5OTk5OTk5OTQ4Jyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY29uc3RydWN0IGEgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBCaXRHbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiYWNrdXBLZXlBZGRyZXNzID0gJzB4NmQyMmVmZGQ2MzQ5OTYyNDgxNzBjOTQ4ZTU3MjYwMDdmYzI1MWJiMyc7XG4gICAgbm9jayhiYXNlVXJsKS5nZXQoJy9hcGknKS5xdWVyeShtb2NrRGF0YS5nZXRUeExpc3RSZXF1ZXN0KGJhY2t1cEtleUFkZHJlc3MpKS5yZXBseSgyMDAsIG1vY2tEYXRhLmdldFR4TGlzdFJlc3BvbnNlKTtcbiAgICBub2NrKGJhc2VVcmwpXG4gICAgICAuZ2V0KCcvYXBpJylcbiAgICAgIC5xdWVyeShtb2NrRGF0YS5nZXRCYWxhbmNlUmVxdWVzdCh3YWxsZXRDb250cmFjdEFkZHJlc3MpKVxuICAgICAgLnJlcGx5KDIwMCwgbW9ja0RhdGEuZ2V0QmFsYW5jZVJlc3BvbnNlKTtcblxuICAgIG5vY2soYmFzZVVybClcbiAgICAgIC5nZXQoJy9hcGknKVxuICAgICAgLnF1ZXJ5KG1vY2tEYXRhLmdldFRva2VuQmFsYW5jZVJlcXVlc3QodG9rZW5Db250cmFjdEFkZHJlc3MsIHdhbGxldENvbnRyYWN0QWRkcmVzcykpXG4gICAgICAucmVwbHkoMjAwLCBtb2NrRGF0YS5nZXRUb2tlbkJhbGFuY2VSZXNwb25zZSk7XG4gICAgbm9jayhiYXNlVXJsKVxuICAgICAgLmdldCgnL2FwaScpXG4gICAgICAucXVlcnkobW9ja0RhdGEuZ2V0QmFsYW5jZVJlcXVlc3QoYmFja3VwS2V5QWRkcmVzcykpXG4gICAgICAucmVwbHkoMjAwLCBtb2NrRGF0YS5nZXRCYWxhbmNlUmVzcG9uc2UpO1xuICAgIG5vY2soYmFzZVVybCkuZ2V0KCcvYXBpJykucXVlcnkobW9ja0RhdGEuZ2V0Q29udHJhY3RDYWxsUmVxdWVzdCkucmVwbHkoMjAwLCBtb2NrRGF0YS5nZXRDb250cmFjdENhbGxSZXNwb25zZSk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChhd2FpdCBhcmJldGhUb2tlbkNvaW4ucmVjb3Zlcih7XG4gICAgICB1c2VyS2V5OlxuICAgICAgICAne1wiaXZcIjpcIlZGWjNqdlhoeG8xWitZYWYyTXRabkE9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCJcXG4nICtcbiAgICAgICAgJzpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcInArZmtIdUxhLzhrPVwiLFwiY3RcIjpcImhZRzdwdmxqTElnQ2paXFxuJyArXG4gICAgICAgICc1M1BCbENkZTVLWlJtbFVLS0hMdERNaytISmZ1VTQ2aFcreCtDOVdzSUFPNGdGUG5UQ3ZGVm1ROHg3Y3pDdGNORnViNUFPMm90T0dcXG4nICtcbiAgICAgICAgJ09zWDRHRTJnWE9FbUNsMVRwV3d3TmhtN3lNVWpHSlVwZ1c2WlpnWFNYZERpdFNLaTRWL2hrNzhTR1N6akZPQlNQWVJhNkk9XCJ9XFxuJyxcbiAgICAgIGJhY2t1cEtleTpcbiAgICAgICAgJ3tcIml2XCI6XCJBYnNDdHYxcXdQSWhPZ3lyQ3BOYWdBPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiXFxuJyArXG4gICAgICAgICc6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCI1dnBVREJVbHptOD1cIixcImN0XCI6XCJQYXBZWUNqQlhSTFVLQVxcbicgK1xuICAgICAgICAnSmJPc0IvRUo5QjhmVW1WUVR4TVBqVW5ReUFreTEybWU5SzY2R2lNRUF4VEQ3a2Q2YllBUUp1dVRrQVRYS1U3Qm5mN3ZLOUp4Tk93XFxuJyArXG4gICAgICAgICdvamk3SEY5ZUZIMGFENC9oWDVTV0ZmSEYyUWZpK1RuWHY2aFZzTUFvaXNEWnMzL0Y2Ny9aVWFEWVIwWnNkclE0US9jTEQwPVwifVxcbicsXG5cbiAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogd2FsbGV0Q29udHJhY3RBZGRyZXNzLFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnb1BYa1BONVEwYzhpNDRpMCcsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICB9KSkgYXMgT2ZmbGluZVZhdWx0VHhJbmZvO1xuICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbik7XG4gICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG4gICAgdHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2lkJyk7XG4gICAgY29uc3QgZGVjb2RlZFR4ID0gb3B0aW9uYWxEZXBzLkV0aFR4LlRyYW5zYWN0aW9uLmZyb21TZXJpYWxpemVkVHgob3B0aW9uYWxEZXBzLmV0aFV0aWwudG9CdWZmZXIodHJhbnNhY3Rpb24udHgpKTtcbiAgICBkZWNvZGVkVHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ2dhc1ByaWNlJyk7XG4gICAgZGVjb2RlZFR4LnNob3VsZC5oYXZlLnByb3BlcnR5KCdub25jZScpO1xuICAgIGRlY29kZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndG8nKTtcbiAgICBkZWNvZGVkVHguZGF0YS50b1N0cmluZygnaGV4Jykuc2hvdWxkLnN0YXJ0V2l0aCgnMGRjZDdhNmMnKTtcbiAgfSk7XG59KTtcbiJdfQ==

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


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