PHP WebShell

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

Просмотр файла: transactionRecover.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_1 = __importDefault(require("should"));
const testData = __importStar(require("../../resources/icp"));
const getBuilderFactory_1 = require("../getBuilderFactory");
const sinon_1 = __importDefault(require("sinon"));
const sdk_test_1 = require("@bitgo/sdk-test");
const sdk_api_1 = require("@bitgo/sdk-api");
const nock_1 = __importDefault(require("nock"));
const index_1 = require("../../../src/index");
const iface_1 = require("../../../src/lib/iface");
const principal_1 = require("@dfinity/principal");
describe('ICP transaction recovery', async () => {
    let bitgo;
    let recoveryParams;
    let icp;
    let broadcastEndpoint;
    let broadcastResponse;
    let nodeUrl;
    let rosettaNodeUrl;
    let txBuilder;
    const factory = (0, getBuilderFactory_1.getBuilderFactory)('ticp');
    before(function () {
        bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
        bitgo.safeRegister('icp', index_1.Icp.createInstance);
        bitgo.initializeTestVars();
        recoveryParams = {
            userKey: testData.WRWRecovery.userKey,
            backupKey: testData.WRWRecovery.backupKey,
            walletPassphrase: testData.WRWRecovery.walletPassphrase,
            recoveryDestination: testData.Accounts.account2.address,
        };
        icp = bitgo.coin('icp');
        rosettaNodeUrl = icp.getRosettaNodeUrl();
        nodeUrl = icp.getPublicNodeUrl();
        const principal = principal_1.Principal.fromUint8Array(iface_1.LEDGER_CANISTER_ID);
        const canisterIdHex = principal.toText();
        broadcastEndpoint = `/api/v3/canister/${canisterIdHex}/call`;
        broadcastResponse = Buffer.from(testData.PublicNodeApiBroadcastResponse, 'hex');
    });
    afterEach(function () {
        recoveryParams = {
            userKey: testData.WRWRecovery.userKey,
            backupKey: testData.WRWRecovery.backupKey,
            walletPassphrase: testData.WRWRecovery.walletPassphrase,
            recoveryDestination: testData.Accounts.account2.address,
        };
        nock_1.default.cleanAll();
        sinon_1.default.restore();
    });
    it('should recover a transaction with default memo successfully', async () => {
        txBuilder = factory.getTransferBuilder();
        // Stub the getTransferBuilder to return our txBuilder
        //TODO need to have a better way for test cases WithDefault mocking these functions. TIcket: https://bitgoinc.atlassian.net/browse/WIN-5158
        sinon_1.default.stub(icp, 'getBuilderFactory').returns(factory);
        sinon_1.default.stub(factory, 'getTransferBuilder').returns(txBuilder);
        sinon_1.default.stub(icp, 'signatures').returns(testData.RecoverTransactionSignatureWithDefaultMemo);
        sinon_1.default.stub(txBuilder._utils, 'getMetaData').returns({
            metaData: testData.MetaDataWithDefaultMemo,
            ingressEndTime: testData.MetaDataWithDefaultMemo.ingress_end,
        });
        const body = testData.RecoverySignedTransactionWithDefaultMemo;
        (0, nock_1.default)(rosettaNodeUrl).post(`${iface_1.ACCOUNT_BALANCE_ENDPOINT}`).reply(200, testData.GetAccountBalanceResponse);
        (0, nock_1.default)(nodeUrl).post(broadcastEndpoint, body).reply(200, broadcastResponse);
        const txnId = await icp.recover(recoveryParams);
        txnId.should.be.a.String();
        should_1.default.equal(txnId, testData.TxnId);
    });
    it('should recover a transaction with memo successfully', async () => {
        txBuilder = factory.getTransferBuilder();
        // Stub the getTransferBuilder to return our txBuilder
        sinon_1.default.stub(icp, 'getBuilderFactory').returns(factory);
        sinon_1.default.stub(factory, 'getTransferBuilder').returns(txBuilder);
        sinon_1.default.stub(icp, 'signatures').returns(testData.RecoverTransactionSignatureWithMemo);
        sinon_1.default.stub(txBuilder._utils, 'getMetaData').returns({
            metaData: testData.MetaDataWithMemo,
            ingressEndTime: testData.MetaDataWithMemo.ingress_end,
        });
        const body = testData.RecoverySignedTransactionWithMemo;
        (0, nock_1.default)(rosettaNodeUrl).post(`${iface_1.ACCOUNT_BALANCE_ENDPOINT}`).reply(200, testData.GetAccountBalanceResponse);
        (0, nock_1.default)(nodeUrl).post(broadcastEndpoint, body).reply(200, broadcastResponse);
        recoveryParams.memo = testData.MetaDataWithMemo.memo;
        const txnId = await icp.recover(recoveryParams);
        txnId.should.be.a.String();
        should_1.default.equal(txnId, testData.TxnId);
    });
    it('should fail to recover if broadcast API fails', async () => {
        (0, nock_1.default)(rosettaNodeUrl).post(`${iface_1.ACCOUNT_BALANCE_ENDPOINT}`).reply(200, testData.GetAccountBalanceResponse);
        (0, nock_1.default)(nodeUrl).post(broadcastEndpoint).reply(500, 'Internal Server Error');
        recoveryParams.memo = 0;
        await icp
            .recover(recoveryParams)
            .should.rejectedWith('Transaction broadcast error: Request failed with status code 500');
    });
    it('should fail to recover txn if balance is low', async () => {
        testData.GetAccountBalanceResponse.balances[0].value = '0';
        (0, nock_1.default)(rosettaNodeUrl).post(`${iface_1.ACCOUNT_BALANCE_ENDPOINT}`).reply(200, testData.GetAccountBalanceResponse);
        (0, nock_1.default)(nodeUrl).post(broadcastEndpoint).reply(200, broadcastResponse);
        await icp.recover(recoveryParams).should.rejectedWith('Did not have enough funds to recover');
    });
    it('should fail to recover txn if userKey is not provided', async () => {
        (0, nock_1.default)(rosettaNodeUrl).post(`${iface_1.ACCOUNT_BALANCE_ENDPOINT}`).reply(200, testData.GetAccountBalanceResponse);
        recoveryParams.userKey = '';
        await icp.recover(recoveryParams).should.rejectedWith('missing userKey');
    });
    it('should fail to recover txn if backupKey is not provided', async () => {
        (0, nock_1.default)(rosettaNodeUrl).post(`${iface_1.ACCOUNT_BALANCE_ENDPOINT}`).reply(200, testData.GetAccountBalanceResponse);
        recoveryParams.backupKey = '';
        await icp.recover(recoveryParams).should.rejectedWith('missing backupKey');
    });
    it('should fail to recover txn if wallet passphrase is not provided', async () => {
        (0, nock_1.default)(rosettaNodeUrl).post(`${iface_1.ACCOUNT_BALANCE_ENDPOINT}`).reply(200, testData.GetAccountBalanceResponse);
        recoveryParams.walletPassphrase = '';
        await icp.recover(recoveryParams).should.rejectedWith('missing wallet passphrase');
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25SZWNvdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2FjdGlvblJlY292ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsOERBQWdEO0FBQ2hELDREQUF5RDtBQUN6RCxrREFBMEI7QUFDMUIsOENBQTRDO0FBQzVDLDRDQUEwQztBQUMxQyxnREFBd0I7QUFDeEIsOENBQXlDO0FBQ3pDLGtEQUF1RztBQUN2RyxrREFBK0M7QUFFL0MsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEtBQUssSUFBSSxFQUFFO0lBQzlDLElBQUksS0FBSyxDQUFDO0lBQ1YsSUFBSSxjQUErQixDQUFDO0lBQ3BDLElBQUksR0FBRyxDQUFDO0lBQ1IsSUFBSSxpQkFBeUIsQ0FBQztJQUM5QixJQUFJLGlCQUF5QixDQUFDO0lBQzlCLElBQUksT0FBZSxDQUFDO0lBQ3BCLElBQUksY0FBc0IsQ0FBQztJQUMzQixJQUFJLFNBQWMsQ0FBQztJQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFDLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsV0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLGNBQWMsR0FBRztZQUNmLE9BQU8sRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDckMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUztZQUN6QyxnQkFBZ0IsRUFB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QUFNLENBQUMsWUFBWSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDckYsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9pY3AnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuaW1wb3J0IG5vY2sgZnJvbSAnbm9jayc7XG5pbXBvcnQgeyBJY3AgfSBmcm9tICcuLi8uLi8uLi9zcmMvaW5kZXgnO1xuaW1wb3J0IHsgUmVjb3ZlcnlPcHRpb25zLCBBQ0NPVU5UX0JBTEFOQ0VfRU5EUE9JTlQsIExFREdFUl9DQU5JU1RFUl9JRCB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSAnQGRmaW5pdHkvcHJpbmNpcGFsJztcblxuZGVzY3JpYmUoJ0lDUCB0cmFuc2FjdGlvbiByZWNvdmVyeScsIGFzeW5jICgpID0+IHtcbiAgbGV0IGJpdGdvO1xuICBsZXQgcmVjb3ZlcnlQYXJhbXM6IFJlY292ZXJ5T3B0aW9ucztcbiAgbGV0IGljcDtcbiAgbGV0IGJyb2FkY2FzdEVuZHBvaW50OiBzdHJpbmc7XG4gIGxldCBicm9hZGNhc3RSZXNwb25zZTogQnVmZmVyO1xuICBsZXQgbm9kZVVybDogc3RyaW5nO1xuICBsZXQgcm9zZXR0YU5vZGVVcmw6IHN0cmluZztcbiAgbGV0IHR4QnVpbGRlcjogYW55O1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3RpY3AnKTtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcignaWNwJywgSWNwLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICByZWNvdmVyeVBhcmFtcyA9IHtcbiAgICAgIHVzZXJLZXk6IHRlc3REYXRhLldSV1JlY292ZXJ5LnVzZXJLZXksXG4gICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLldSV1JlY292ZXJ5LmJhY2t1cEtleSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHRlc3REYXRhLldSV1JlY292ZXJ5LndhbGxldFBhc3NwaHJhc2UsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5BY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLFxuICAgIH07XG5cbiAgICBpY3AgPSBiaXRnby5jb2luKCdpY3AnKTtcbiAgICByb3NldHRhTm9kZVVybCA9IGljcC5nZXRSb3NldHRhTm9kZVVybCgpO1xuICAgIG5vZGVVcmwgPSBpY3AuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IHByaW5jaXBhbCA9IFByaW5jaXBhbC5mcm9tVWludDhBcnJheShMRURHRVJfQ0FOSVNURVJfSUQpO1xuICAgIGNvbnN0IGNhbmlzdGVySWRIZXggPSBwcmluY2lwYWwudG9UZXh0KCk7XG4gICAgYnJvYWRjYXN0RW5kcG9pbnQgPSBgL2FwaS92My9jYW5pc3Rlci8ke2NhbmlzdGVySWRIZXh9L2NhbGxgO1xuICAgIGJyb2FkY2FzdFJlc3BvbnNlID0gQnVmZmVyLmZyb20odGVzdERhdGEuUHVibGljTm9kZUFwaUJyb2FkY2FzdFJlc3BvbnNlLCAnaGV4Jyk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgcmVjb3ZlcnlQYXJhbXMgPSB7XG4gICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5XUldSZWNvdmVyeS51c2VyS2V5LFxuICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5XUldSZWNvdmVyeS5iYWNrdXBLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS5XUldSZWNvdmVyeS53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEuQWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICB9O1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVjb3ZlciBhIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBtZW1vIHN1Y2Nlc3NmdWxseScsIGFzeW5jICgpID0+IHtcbiAgICB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuXG4gICAgLy8gU3R1YiB0aGUgZ2V0VHJhbnNmZXJCdWlsZGVyIHRvIHJldHVybiBvdXIgdHhCdWlsZGVyXG4gICAgLy9UT0RPIG5lZWQgdG8gaGF2ZSBhIGJldHRlciB3YXkgZm9yIHRlc3QgY2FzZXMgV2l0aERlZmF1bHQgbW9ja2luZyB0aGVzZSBmdW5jdGlvbnMuIFRJY2tldDogaHR0cHM6Ly9iaXRnb2luYy5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9XSU4tNTE1OFxuICAgIHNpbm9uLnN0dWIoaWNwLCAnZ2V0QnVpbGRlckZhY3RvcnknKS5yZXR1cm5zKGZhY3RvcnkpO1xuICAgIHNpbm9uLnN0dWIoZmFjdG9yeSwgJ2dldFRyYW5zZmVyQnVpbGRlcicpLnJldHVybnModHhCdWlsZGVyKTtcbiAgICBzaW5vbi5zdHViKGljcCwgJ3NpZ25hdHVyZXMnKS5yZXR1cm5zKHRlc3REYXRhLlJlY292ZXJUcmFuc2FjdGlvblNpZ25hdHVyZVdpdGhEZWZhdWx0TWVtbyk7XG5cbiAgICBzaW5vbi5zdHViKHR4QnVpbGRlci5fdXRpbHMsICdnZXRNZXRhRGF0YScpLnJldHVybnMoe1xuICAgICAgbWV0YURhdGE6IHRlc3REYXRhLk1ldGFEYXRhV2l0aERlZmF1bHRNZW1vLFxuICAgICAgaW5ncmVzc0VuZFRpbWU6IHRlc3REYXRhLk1ldGFEYXRhV2l0aERlZmF1bHRNZW1vLmluZ3Jlc3NfZW5kLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYm9keSA9IHRlc3REYXRhLlJlY292ZXJ5U2lnbmVkVHJhbnNhY3Rpb25XaXRoRGVmYXVsdE1lbW87XG4gICAgbm9jayhyb3NldHRhTm9kZVVybCkucG9zdChgJHtBQ0NPVU5UX0JBTEFOQ0VfRU5EUE9JTlR9YCkucmVwbHkoMjAwLCB0ZXN0RGF0YS5HZXRBY2NvdW50QmFsYW5jZVJlc3BvbnNlKTtcbiAgICBub2NrKG5vZGVVcmwpLnBvc3QoYnJvYWRjYXN0RW5kcG9pbnQsIGJvZHkpLnJlcGx5KDIwMCwgYnJvYWRjYXN0UmVzcG9uc2UpO1xuICAgIGNvbnN0IHR4bklkID0gYXdhaXQgaWNwLnJlY292ZXIocmVjb3ZlcnlQYXJhbXMpO1xuICAgIHR4bklkLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgIHNob3VsZC5lcXVhbCh0eG5JZCwgdGVzdERhdGEuVHhuSWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0cmFuc2FjdGlvbiB3aXRoIG1lbW8gc3VjY2Vzc2Z1bGx5JywgYXN5bmMgKCkgPT4ge1xuICAgIHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICAvLyBTdHViIHRoZSBnZXRUcmFuc2ZlckJ1aWxkZXIgdG8gcmV0dXJuIG91ciB0eEJ1aWxkZXJcbiAgICBzaW5vbi5zdHViKGljcCwgJ2dldEJ1aWxkZXJGYWN0b3J5JykucmV0dXJucyhmYWN0b3J5KTtcbiAgICBzaW5vbi5zdHViKGZhY3RvcnksICdnZXRUcmFuc2ZlckJ1aWxkZXInKS5yZXR1cm5zKHR4QnVpbGRlcik7XG4gICAgc2lub24uc3R1YihpY3AsICdzaWduYXR1cmVzJykucmV0dXJucyh0ZXN0RGF0YS5SZWNvdmVyVHJhbnNhY3Rpb25TaWduYXR1cmVXaXRoTWVtbyk7XG5cbiAgICBzaW5vbi5zdHViKHR4QnVpbGRlci5fdXRpbHMsICdnZXRNZXRhRGF0YScpLnJldHVybnMoe1xuICAgICAgbWV0YURhdGE6IHRlc3REYXRhLk1ldGFEYXRhV2l0aE1lbW8sXG4gICAgICBpbmdyZXNzRW5kVGltZTogdGVzdERhdGEuTWV0YURhdGFXaXRoTWVtby5pbmdyZXNzX2VuZCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGJvZHkgPSB0ZXN0RGF0YS5SZWNvdmVyeVNpZ25lZFRyYW5zYWN0aW9uV2l0aE1lbW87XG4gICAgbm9jayhyb3NldHRhTm9kZVVybCkucG9zdChgJHtBQ0NPVU5UX0JBTEFOQ0VfRU5EUE9JTlR9YCkucmVwbHkoMjAwLCB0ZXN0RGF0YS5HZXRBY2NvdW50QmFsYW5jZVJlc3BvbnNlKTtcbiAgICBub2NrKG5vZGVVcmwpLnBvc3QoYnJvYWRjYXN0RW5kcG9pbnQsIGJvZHkpLnJlcGx5KDIwMCwgYnJvYWRjYXN0UmVzcG9uc2UpO1xuICAgIHJlY292ZXJ5UGFyYW1zLm1lbW8gPSB0ZXN0RGF0YS5NZXRhRGF0YVdpdGhNZW1vLm1lbW87XG4gICAgY29uc3QgdHhuSWQgPSBhd2FpdCBpY3AucmVjb3ZlcihyZWNvdmVyeVBhcmFtcyk7XG4gICAgdHhuSWQuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4bklkLCB0ZXN0RGF0YS5UeG5JZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byByZWNvdmVyIGlmIGJyb2FkY2FzdCBBUEkgZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgbm9jayhyb3NldHRhTm9kZVVybCkucG9zdChgJHtBQ0NPVU5UX0JBTEFOQ0VfRU5EUE9JTlR9YCkucmVwbHkoMjAwLCB0ZXN0RGF0YS5HZXRBY2NvdW50QmFsYW5jZVJlc3BvbnNlKTtcbiAgICBub2NrKG5vZGVVcmwpLnBvc3QoYnJvYWRjYXN0RW5kcG9pbnQpLnJlcGx5KDUwMCwgJ0ludGVybmFsIFNlcnZlciBFcnJvcicpO1xuICAgIHJlY292ZXJ5UGFyYW1zLm1lbW8gPSAwO1xuICAgIGF3YWl0IGljcFxuICAgICAgLnJlY292ZXIocmVjb3ZlcnlQYXJhbXMpXG4gICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnVHJhbnNhY3Rpb24gYnJvYWRjYXN0IGVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDUwMCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gcmVjb3ZlciB0eG4gaWYgYmFsYW5jZSBpcyBsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgdGVzdERhdGEuR2V0QWNjb3VudEJhbGFuY2VSZXNwb25zZS5iYWxhbmNlc1swXS52YWx1ZSA9ICcwJztcbiAgICBub2NrKHJvc2V0dGFOb2RlVXJsKS5wb3N0KGAke0FDQ09VTlRfQkFMQU5DRV9FTkRQT0lOVH1gKS5yZXBseSgyMDAsIHRlc3REYXRhLkdldEFjY291bnRCYWxhbmNlUmVzcG9uc2UpO1xuICAgIG5vY2sobm9kZVVybCkucG9zdChicm9hZGNhc3RFbmRwb2ludCkucmVwbHkoMjAwLCBicm9hZGNhc3RSZXNwb25zZSk7XG4gICAgYXdhaXQgaWNwLnJlY292ZXIocmVjb3ZlcnlQYXJhbXMpLnNob3VsZC5yZWplY3RlZFdpdGgoJ0RpZCBub3QgaGF2ZSBlbm91Z2ggZnVuZHMgdG8gcmVjb3ZlcicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gcmVjb3ZlciB0eG4gaWYgdXNlcktleSBpcyBub3QgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgbm9jayhyb3NldHRhTm9kZVVybCkucG9zdChgJHtBQ0NPVU5UX0JBTEFOQ0VfRU5EUE9JTlR9YCkucmVwbHkoMjAwLCB0ZXN0RGF0YS5HZXRBY2NvdW50QmFsYW5jZVJlc3BvbnNlKTtcblxuICAgIHJlY292ZXJ5UGFyYW1zLnVzZXJLZXkgPSAnJztcbiAgICBhd2FpdCBpY3AucmVjb3ZlcihyZWNvdmVyeVBhcmFtcykuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyB1c2VyS2V5Jyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byByZWNvdmVyIHR4biBpZiBiYWNrdXBLZXkgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIG5vY2socm9zZXR0YU5vZGVVcmwpLnBvc3QoYCR7QUNDT1VOVF9CQUxBTkNFX0VORFBPSU5UfWApLnJlcGx5KDIwMCwgdGVzdERhdGEuR2V0QWNjb3VudEJhbGFuY2VSZXNwb25zZSk7XG5cbiAgICByZWNvdmVyeVBhcmFtcy5iYWNrdXBLZXkgPSAnJztcbiAgICBhd2FpdCBpY3AucmVjb3ZlcihyZWNvdmVyeVBhcmFtcykuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIHJlY292ZXIgdHhuIGlmIHdhbGxldCBwYXNzcGhyYXNlIGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICBub2NrKHJvc2V0dGFOb2RlVXJsKS5wb3N0KGAke0FDQ09VTlRfQkFMQU5DRV9FTkRQT0lOVH1gKS5yZXBseSgyMDAsIHRlc3REYXRhLkdldEFjY291bnRCYWxhbmNlUmVzcG9uc2UpO1xuXG4gICAgcmVjb3ZlcnlQYXJhbXMud2FsbGV0UGFzc3BocmFzZSA9ICcnO1xuICAgIGF3YWl0IGljcC5yZWNvdmVyKHJlY292ZXJ5UGFyYW1zKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdtaXNzaW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gIH0pO1xufSk7XG4iXX0=

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


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