PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-test/dist/src/bitgo/lib

Просмотр файла: test_bitgo.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestBitGo = void 0;
//
// BitGo object augmented for testing
//
// Copyright 2014, BitGo, Inc.  All Rights Reserved.
//
const BigNumber = require('bignumber.js');
require("should");
require("should-http");
const nock = require("nock");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_api_1 = require("@bitgo/sdk-api");
nock.enableNetConnect();
const originalFetchConstants = sdk_api_1.BitGoAPI.prototype.fetchConstants;
class TestBitGo {
    static decorate(_bitgo, args) {
        // eslint-disable-next-line @typescript-eslint/no-empty-function
        const BitGo = function () { };
        BitGo.prototype = _bitgo.prototype;
        TestBitGo.TEST_USER = 'tester@bitgo.com';
        if (process.env.BITGOJS_TEST_PASSWORD) {
            TestBitGo.TEST_PASSWORD = process.env.BITGOJS_TEST_PASSWORD;
        }
        else {
            // Test accounts are locked internally to prevent tampering
            // Contact support@bitgo.com for further help on how to fix this
            throw new Error('Need to set BITGOJS_TEST_PASSWORD env variable - please see the developer setup docs.');
        }
        TestBitGo.TEST_SHARED_KEY_USER = 'shared_key_test@bitgo.com';
        TestBitGo.TEST_SHARED_KEY_PASSWORD = TestBitGo.TEST_PASSWORD;
        // used for testing multiple approvers
        TestBitGo.TEST_THIRD_USER = 'third_user_test@bitgo.com';
        TestBitGo.TEST_THIRD_PASSWORD = TestBitGo.TEST_PASSWORD;
        // account with a known total balance. Don't spend or receive coins
        // from any wallet in this account. Known total balance across
        // all TLTC wallets in this account is exactly 9999586400
        TestBitGo.TEST_KNOWN_BALANCE_USER = 'tyler+test-get-total-balances@bitgo.com';
        TestBitGo.TEST_KNOWN_BALANCE_PASSWORD = TestBitGo.TEST_PASSWORD;
        TestBitGo.TEST_KNOWN_BALANCE = 9999586400;
        TestBitGo.TEST_ENTERPRISE_CREATION_USER = 'enterprisecreator@bitgo.com';
        TestBitGo.TEST_ENTERPRISE_CREATION_PASSWORD = TestBitGo.TEST_PASSWORD;
        TestBitGo.OFC_TEST_USER = 'tester+employee@bitgo.com';
        TestBitGo.OFC_TEST_PASSWORD = TestBitGo.TEST_PASSWORD;
        TestBitGo.TEST_CLIENTID = 'test';
        TestBitGo.TEST_CLIENTSECRET = 'testclientsecret';
        // These auth tokens are modified in the db to expire in 2018 on both test & dev
        TestBitGo.TEST_AUTHCODE = '37454416ba13e1be9fdc39cfc207df7f7a7f0953';
        TestBitGo.TEST_ACCESSTOKEN = '4cb440e353b5415e350a1e799bb1ad820fef4ead';
        TestBitGo.TEST_ACCESSTOKEN_SHAREDUSER = '4cb440e353b5415e350a1e799bb1ad820fef4eax';
        TestBitGo.TEST_REFRESHTOKEN = '8519fcc7787d9d6971ed89a757e3309a72ddedc8';
        TestBitGo.TRAVEL_RULE_TXID = '33447753455651508cfd099c9ebe0db6a2243ccba4766319621fbce56db7f135';
        TestBitGo.TEST_WALLET_REGROUP_PASSCODE = 'test security fanout & coalesce';
        BitGo.prototype.initializeTestVars = function () {
            if (this.getEnv() === 'dev' || this.getEnv() === 'local') {
                TestBitGo.TEST_USERID = '54d3e3a4b08fa6dc0a0002c07f8a9f86';
                TestBitGo.TEST_SHARED_KEY_USERID = '54d418de4ea11d050b0006186d08ea5c';
                TestBitGo.TEST_THIRD_USERID = '57056ad593eae8ca0c51e3cee62022cb';
                TestBitGo.TEST_USER_ECDH_XPUB =
                    'xpub661MyMwAqRbcF31yYvTH5DbmabEMXVvx1o1p73sZmvEDHM8bhUiZzNQA4gfyDtKarpGz7NPH6Wub8YCqXnUbP8ZMA3Ad8LfwHsBWhWEeJqu';
                TestBitGo.TEST_WALLET1_PASSCODE = 'iVWeATjqLS1jJShrPpETti0b';
                TestBitGo.TEST_WALLET1_XPUB =
                    'xpub661MyMwAqRbcFgsE3Zg66E8prHy7aohb9wSiZRN9vQA4fp6n1dpXDyRLPT4YnhBTPwkhtDGqR3ynB4tJUenw9WTPhRWwZ3cpqkQrGzXTcFM';
                TestBitGo.TEST_WALLET1_ADDRESS = '2N1vk5Qm6vGPB8SAZUjEQ8Gac6v71EmxgaG';
                TestBitGo.TEST_WALLET1_ADDRESS2 = '2MxCHzAYyK9RgLGUWymw9Jhhtt19VqUtCej';
                TestBitGo.TEST_WALLET2_PASSCODE = 'j0XVTJiTgsMCogKRoHIDzGbz';
                TestBitGo.TEST_WALLET2_ADDRESS = '2MtZAqJWLBCmtjYQ7WftcXY1fdMjEv8vERZ';
                TestBitGo.TEST_WALLET3_PASSCODE = 'CVKzHuutdMgtlgFFWpb4oO5k';
                TestBitGo.TEST_WALLET3_ADDRESS = '2NE4bZSitUxoRLFg4U6qHkjrCXWNAvQBDo5';
                TestBitGo.TEST_WALLET3_ADDRESS2 = '2NFFt4H2vP54WwWjrUVLh7ksF4t6mabCGsh';
                TestBitGo.TEST_WALLET3_ADDRESS3 = '2NG8HA7qya4pbwbg25NF1SY6nEjM6apT1hF';
                // webhooks
                TestBitGo.TEST_WEBHOOK_TRANSACTION_SIMULATION_ID = '57f3ee68a2cece1770402dbe7d84c368';
                // wallet for testing unspents regrouping (fanout & consolidate/coalesce)
                TestBitGo.TEST_WALLET_REGROUP_ADDRESS = '2MuVshMLfZaXfF6q7af47ZFUtZGGpnyZuLu';
                // v2 variables
                TestBitGo.V2 = {};
                TestBitGo.V2.TEST_USERID = '585caccd5573b0a8416a745ed58d8cb4';
                TestBitGo.V2.TEST_WALLET1_PASSCODE = 'iVWeATjqLS1jJShrPpETti0b';
                TestBitGo.V2.TEST_WALLET1_XPUB =
                    'xpub661MyMwAqRbcGicVM5K5UnocWoFt3Yh1RZKzSEHPPARhyMf9w7DVqM3PgBgiVW5NHRp8UteqhMoQb17rCQsLbmGXuPx43MKskyB31R97p3G';
                TestBitGo.V2.TEST_WALLET1_ID = '585cc5335573b0a8416aadb1fce63ce3';
                TestBitGo.V2.OFC_TEST_WALLET_ID = '5cbe3223311315fc7c96ce087f32dbdd';
                TestBitGo.V2.TEST_RECOVERY_PASSCODE = 'oPXkPN5Q0c8i44i0';
            }
            else {
                TestBitGo.TEST_USERID = '543c11ed356d00cb7600000b98794503';
                TestBitGo.TEST_SHARED_KEY_USERID = '549d0ee835aec81206004c082757570f';
                TestBitGo.TEST_THIRD_USERID = '57049b9a194a115a06da21fb9731fb71';
                TestBitGo.TEST_USER_ECDH_XPUB =
                    'xpub661MyMwAqRbcFkiN8QJXCytQqPyDPW1cfnuG6RGCVFnVyiSQL1b6ZS2iiVJHH7UZYwLbN2ayWsaRVhnBFKYvLz956PTRH2SuuurpEcNGLKv';
                TestBitGo.TEST_WALLET1_PASSCODE = 'test wallet #1 security';
                TestBitGo.TEST_WALLET1_XPUB =
                    'xpub661MyMwAqRbcGU7FnXMKSHMwbWxARxYJUpKD1CoMJP6vonLT9bZZaWYq7A7tKPXmDFFXTKigT7VHMnbtEnjCmxQ1E93ZJe6HDKwxWD28M6f';
                TestBitGo.TEST_WALLET1_ADDRESS = '2MtepahRn4qTihhTvUuGTYUyUBkQZzaVBG3';
                TestBitGo.TEST_WALLET1_ADDRESS2 = '2MxKo9RHNZHoPwmvnb5k8ytDJ6Shd1DHnsV';
                TestBitGo.TEST_WALLET2_PASSCODE = 'test wallet #2 security';
                TestBitGo.TEST_WALLET2_ADDRESS = '2MvpZhq6zUu3UARdJKZH7TTfqHJ3Ec1YAjv';
                TestBitGo.TEST_WALLET3_PASSCODE = 'test wallet #3 security';
                // webhooks
                TestBitGo.TEST_WEBHOOK_TRANSACTION_SIMULATION_ID = '5797f78b651fc971062eb851ea09672d';
                TestBitGo.TEST_WEBHOOK_PENDING_APPROVAL_SIMULATION_ID = '5824b5075f7944a8069d863dccf25598';
                // shared amongst 3 users (TEST_USER, TEST_SHARED_KEY_USER, and TEST_THIRD_USER)
                TestBitGo.TEST_WALLETMULTAPPROVERS_ADDRESS = '2NF7pK1pDEUXrWmqXxCT4fjPtQrsK6XNvUy';
                TestBitGo.TEST_WALLETMULTAPPROVERS_PASSCODE = TestBitGo.TEST_PASSWORD;
                // TEST_WALLET_3 is a KRS wallet
                TestBitGo.TEST_WALLET3_ADDRESS = '2MyKoaanySBPCA2Br7dGvaZEgEGp7YRZvif';
                TestBitGo.TEST_WALLET3_ADDRESS2 = '2N11YQ5mb73CDhupX8peKqb3xFdD9kr78Wf';
                TestBitGo.TEST_WALLET3_ADDRESS3 = '2N1Tt75MNKFHRBE68HXHB7FSmLpmGCQDuJC';
                TestBitGo.TEST_ENTERPRISE = '5578ebc76eb47487743b903166e6543a';
                TestBitGo.TEST_ENTERPRISE_2 = '57057916c03b4a5d0644e2ad94a9e070';
                TestBitGo.TEST_SHARED_WALLET_ADDRESS = '2MsMfeYWNWYwB3fzfMBfuSZb7jkcGnTjW42';
                TestBitGo.TEST_SHARED_WALLET_CHANGE_ADDRESS = '2MsUevsM5ncvgrrqUoJ7qYd7Ks9VCN3uhHM';
                TestBitGo.TEST_WALLET_PENDING_APPROVAL_ID = '56eaf3bdcc4635bb0529843a0dcf860b';
                TestBitGo.TEST_ENTERPRISE_PENDING_APPROVAL_ID = '5824d5b5acf14ea106e4f2efd588c053';
                // wallet for testing unspents regrouping (fanout & consolidate/coalesce)
                TestBitGo.TEST_WALLET_REGROUP_ADDRESS = '2MuVshMLfZaXfF6q7af47ZFUtZGGpnyZuLu';
                // v2 variables
                TestBitGo.V2 = {};
                TestBitGo.V2.TEST_USERID = '543c11ed356d00cb7600000b98794503';
                TestBitGo.V2.TEST_WALLET1_PASSCODE = 'iVWeATjqLS1jJShrPpETti0b';
                TestBitGo.V2.TEST_WALLET1_XPUB =
                    'xpub661MyMwAqRbcFWFN9gpFpnSVy6bF3kMZAkSXtu3ZYKPgq2KUVo1xEMnMXDcavwDJ4zH57iUHVfEGVK7dEgo7ufKRzTkeWYSBDuye5g7w4pe';
                TestBitGo.V2.TEST_WALLET1_ID = '593f1ece99d37c23080a557283edcc89';
                TestBitGo.V2.TEST_WALLET1_ADDRESS = '2N3qLG4VMpkoRZN4Ft9PC5sgpGKvm7AV32A';
                // this wallet will do consolidate and fannout together, so the number of unspents can be known
                TestBitGo.V2.TEST_WALLET2_UNSPENTS_LABEL = 'Test Wallet 2 Unspents';
                TestBitGo.V2.TEST_WALLET2_UNSPENTS_PASSCODE = 'NXh65HxeZpzFqzW2n868';
                TestBitGo.V2.TEST_WALLET2_UNSPENTS_XPUB =
                    'xpub661MyMwAqRbcFeeMZtyLiqECMeek7QD6X9NLX2ydBN2DutiBQqLw8nsMnnL9hk3CSWGXZgW1PLV96opu8NzuXwJjK57PuNBqe85jSN6Abm6';
                TestBitGo.V2.TEST_WALLET2_UNSPENTS_ID = '5a1341e7c8421dc90710673b3166bbd5';
                TestBitGo.V2.TEST_SWEEP1_LABEL = 'Sweep 1';
                TestBitGo.V2.TEST_SWEEP1_PASSCODE = 'T8n6S4AzktsDwCqvaE4692895YkjRT';
                TestBitGo.V2.TEST_SWEEP1_XPUB =
                    'xpub661MyMwAqRbcFWJ1ZxzvmKm4QCkrgYQLbTGzLgxzKFcGkyQfCjugENuamFmF3WwLHRvP8zWQi16kU8SuTqyMYFhvJcg1U1w8AT1AHKa25sY';
                TestBitGo.V2.TEST_SWEEP1_ID = '5a836a7e7cb43ca807371f123ab3a907';
                TestBitGo.V2.TEST_SWEEP1_ADDRESS = '2N1rGQUpCRV797cSbT3hr34zayyNqS263g9';
                TestBitGo.V2.TEST_SWEEP2_LABEL = 'Sweep 2';
                TestBitGo.V2.TEST_SWEEP2_PASSCODE = 'bMY8jrF06pV2dxzRK42dGZqrmmURS7';
                TestBitGo.V2.TEST_SWEEP2_XPUB =
                    'xpub661MyMwAqRbcFhBDq1dbwu51qrNQra923FnujGPxCBaHd2geU6AYZhviMo8jWj3cvwM7Aj2T79CtKqErP37K1vwYSAYgMmFaHiVdJgHJ1nk';
                TestBitGo.V2.TEST_SWEEP2_ID = '5a836b5e1c0d699a07d42029ccd65836';
                TestBitGo.V2.TEST_SWEEP2_ADDRESS = '2NGV9ChhafuXNK9iFW6L6CKru5bFkMxZjNX';
                TestBitGo.V2.TEST_ETH_WALLET_ID = '598f606cd8fc24710d2ebadb1d9459bb';
                TestBitGo.V2.TEST_ETH_WALLET_PASSPHRASE = 'moon';
                TestBitGo.V2.TEST_ETH_WALLET_FIRST_ADDRESS = '0xdf07117705a9f8dc4c2a78de66b7f1797dba9d4e';
                TestBitGo.V2.TEST_ETH2_WALLET_ID = '6245df06b0c50d0008e0b2acea0b1f0e';
                TestBitGo.V2.TEST_ETH2_WALLET_PASSPHRASE = 'Eth2OnMoon!';
                TestBitGo.V2.TEST_BCH_WALLET_ID = '6148987267660d00069dd844af297a2b';
                TestBitGo.V2.TEST_BCH_WALLET_PASSPHRASE = 'BchOnMoon4';
                TestBitGo.V2.TEST_BCH_WALLET_CASH_ADDRESS = 'bchtest:pr3zp43qxu8ztudephsvyafxj2zfznw5v5wh85sg54';
                TestBitGo.V2.TEST_KEYCHAIN_CHANGE_PW_USER = 'update_pw_tester@bitgo.com';
                TestBitGo.V2.TEST_KEYCHAIN_CHANGE_PW_PASSWORD = TestBitGo.TEST_PASSWORD;
                // Contract address for Potatoken
                TestBitGo.V2.TEST_ERC20_TOKEN_ADDRESS = '0x06d22e6fa60fda26b6ca28f73d2d4a81bd9aa2de';
                TestBitGo.V2.TEST_ERC20_TOKEN_RECIPIENT = '0x52c8B29Ab8B0a49a01c2b75f8e7f11B23e0e3782';
                // Contract address for tdai token
                TestBitGo.V2.TEST_TDAI_TOKEN_ADDRESS = '0x4f96fe3b7a6cf9725f59d353f723c1bdb64ca6aa';
                TestBitGo.V2.TEST_RECOVERY_PASSCODE = 'oPXkPN5Q0c8i44i0';
                // webhooks
                TestBitGo.V2.TEST_WEBHOOK_TRANSFER_SIMULATION_ID = '59b7041619dd52cd0737a4cbf39dbd44';
                TestBitGo.V2.OFC_TEST_WALLET_ID = '5cbe3563afc275b40369e096073b8a16';
                // Algo wallet for non participating key reg transaction
                TestBitGo.V2.TEST_ALGO_WALLET_ID = '602566f550a05c0006fe13a03b57141f';
            }
            TestBitGo.TEST_FEE_SINGLE_KEY_WIF = 'cRVQ6cbUyGHVvByPKF9GnEhaB4HUBFgLQ2jVX1kbQARHaTaD7WJ2';
            TestBitGo.TEST_FEE_SINGLE_KEY_ADDRESS = 'mibJ4uJc9f1fbMeaUXNuWqsB1JgNMcTZK7';
        };
        //
        // testUserOTP
        // Get an OTP code for the test user.
        //
        BitGo.prototype.testUserOTP = function () {
            return '0000000';
        };
        //
        // authenticateTestUser
        // Authenticate the test user.
        //
        BitGo.prototype.authenticateTestUser = async function (otp) {
            const response = await this.authenticate({
                username: TestBitGo.TEST_USER,
                password: TestBitGo.TEST_PASSWORD,
                otp: otp,
            });
            response.should.have.property('access_token');
            response.should.have.property('user');
        };
        BitGo.prototype.authenticateSharingTestUser = async function (otp) {
            const response = await this.authenticate({
                username: TestBitGo.TEST_SHARED_KEY_USER,
                password: TestBitGo.TEST_SHARED_KEY_PASSWORD,
                otp: otp,
            });
            response.should.have.property('access_token');
            response.should.have.property('user');
        };
        BitGo.prototype.authenticateKnownBalanceTestUser = async function (otp) {
            const response = await this.authenticate({
                username: TestBitGo.TEST_KNOWN_BALANCE_USER,
                password: TestBitGo.TEST_KNOWN_BALANCE_PASSWORD,
                otp: otp,
            });
            response.should.have.property('access_token');
            response.should.have.property('user');
        };
        BitGo.prototype.authenticateEnterpriseCreatorTestUser = async function (otp) {
            const response = await this.authenticate({
                username: TestBitGo.TEST_ENTERPRISE_CREATION_USER,
                password: TestBitGo.TEST_ENTERPRISE_CREATION_PASSWORD,
                otp: otp,
            });
            response.should.have.property('access_token');
            response.should.have.property('user');
        };
        BitGo.prototype.authenticateChangePWTestUser = async function (otp) {
            const params = {
                username: TestBitGo.V2.TEST_KEYCHAIN_CHANGE_PW_USER,
                password: TestBitGo.V2.TEST_KEYCHAIN_CHANGE_PW_PASSWORD,
                otp: otp,
            };
            let alternatePassword = `${params.password}_new`;
            let response;
            try {
                response = await this.authenticate(params);
            }
            catch (e) {
                if (e.message !== 'invalid_grant') {
                    throw new Error(e);
                }
                params.password = alternatePassword;
                alternatePassword = TestBitGo.V2.TEST_KEYCHAIN_CHANGE_PW_PASSWORD;
                response = await this.authenticate(params);
            }
            response.should.have.property('access_token');
            response.should.have.property('user');
            return { password: params.password, alternatePassword };
        };
        BitGo.prototype.authenticateOfcTestUser = async function (otp) {
            const response = await this.authenticate({
                username: TestBitGo.OFC_TEST_USER,
                password: TestBitGo.OFC_TEST_PASSWORD,
                otp: otp,
            });
            response.should.have.property('access_token');
            response.should.have.property('user');
        };
        BitGo.prototype.checkFunded = async function () {
            // We are testing both BTC and ETH funds here, to make sure that
            // we don't spend for already 'failed' test runs (e.g., spending ETH when we don't have enough BTC)
            // Test we have enough ETH
            await this.authenticateTestUser(this.testUserOTP());
            const testWalletId = TestBitGo.V2.TEST_ETH_WALLET_ID;
            const { htethWallet, tbtcWallet, unspentWallet, sweep1Wallet } = await (0, sdk_core_1.promiseProps)({
                htethWallet: this.coin('hteth').wallets().get({ id: testWalletId }),
                tbtcWallet: this.coin('tbtc').wallets().getWallet({ id: TestBitGo.V2.TEST_WALLET1_ID }),
                unspentWallet: this.coin('tbtc').wallets().getWallet({ id: TestBitGo.V2.TEST_WALLET2_UNSPENTS_ID }),
                sweep1Wallet: this.coin('tbtc').wallets().getWallet({ id: TestBitGo.V2.TEST_SWEEP1_ID }),
            });
            const spendableBalance = htethWallet.spendableBalanceString;
            let balance = new BigNumber(spendableBalance);
            // Check our balance is over 60000 (we spend 50000, add some cushion)
            if (balance.lt(60000)) {
                throw new Error(`The HTETH wallet ${testWalletId} does not have enough funds to run the test suite. The current balance is ${balance}. Please fund this wallet!`);
            }
            // Check we have enough in the wallet to run test suite
            tbtcWallet.should.have.property('spendableBalanceString');
            balance = new BigNumber(tbtcWallet.spendableBalanceString());
            // Check our balance is over 0.05 tBTC (we spend 0.04, add some cushion)
            let minimumBalance = 0.05 * 1e8;
            if (balance.lt(minimumBalance)) {
                throw new Error(`The TBTC wallet ${tbtcWallet.id()} does not have enough funds to run the test suite. The current balance is ${balance}. Please fund this wallet!`);
            }
            // Check we have enough in the wallet to run test suite
            unspentWallet.should.have.property('spendableBalanceString');
            balance = new BigNumber(unspentWallet.spendableBalanceString());
            // Check our balance is over 0.05 tBTC (we spend 0.04, add some cushion)
            minimumBalance = 0.05 * 1e8;
            if (balance.lt(minimumBalance)) {
                throw new Error(`The TBTC wallet ${unspentWallet.id()} does not have enough funds to run the test suite. The current balance is ${balance}. Please fund this wallet!`);
            }
            // Check we have enough in the wallet to run test suite
            sweep1Wallet.should.have.property('spendableBalanceString');
            balance = new BigNumber(sweep1Wallet.spendableBalanceString());
            // Since we will lose our unspents value to fees, make sure there is a large enough balance to continue
            minimumBalance = 0.05 * 1e8;
            if (balance.lt(minimumBalance)) {
                throw new Error(`The TBTC wallet ${sweep1Wallet.id()} does not have enough funds to run the test suite. The current balance is ${balance}. Please fund this wallet!`);
            }
        };
        BitGo.prototype.nockEthWallet = function () {
            const walletData = {
                id: '598f606cd8fc24710d2ebadb1d9459bb',
                users: [
                    {
                        user: '543c11ed356d00cb7600000b98794503',
                        permissions: [Object],
                    },
                ],
                coin: 'hteth',
                label: 'my test ether wallet',
                m: 2,
                n: 3,
                keys: [
                    '598f606cd8fc24710d2ebad89dce86c2',
                    '598f606cc8e43aef09fcb785221d9dd2',
                    '5935d59cf660764331bafcade1855fd7',
                ],
                tags: ['598f606cd8fc24710d2ebadb1d9459bb'],
                disableTransactionNotifications: false,
                freeze: {},
                deleted: false,
                approvalsRequired: 1,
                isCold: false,
                coinSpecific: {
                    deployedInBlock: false,
                    deployTxHash: '0x413ed27a9cdd341a4742baff13984e9d4ee262ec0edbca92b9872fb4e18f5106',
                    lastChainIndex: { 0: 701, 1: -1 },
                    baseAddress: '0xdf07117705a9f8dc4c2a78de66b7f1797dba9d4e',
                    pendingChainInitialization: false,
                    creationFailure: [],
                },
                admin: {
                    policy: {
                        id: '598f606cd8fc24710d2ebadda4b955fb',
                        version: 0,
                        date: '2017-08-12T20:09:16.472Z',
                        rules: [],
                    },
                },
                clientFlags: [],
                allowBackupKeySigning: false,
                balanceString: '10000000000000000000',
                confirmedBalanceString: '10000000000000000000',
                spendableBalanceString: '10000000000000000000',
                receiveAddress: {
                    id: '5a8453c23fd075b907574338a878f4fb',
                    address: '0xa7f9ca5c1268b0082db1833d30f33d3cfd4286d8',
                    chain: 0,
                    index: 701,
                    coin: 'hteth',
                    lastNonce: 0,
                    wallet: '598f606cd8fc24710d2ebadb1d9459bb',
                    coinSpecific: {
                        nonce: -1,
                        updateTime: '2018-02-14T15:20:34.188Z',
                        txCount: 0,
                        pendingChainInitialization: false,
                        creationFailure: [],
                    },
                },
                pendingApprovals: [],
            };
            const wallet = new sdk_core_1.Wallet(this, this.coin('hteth'), walletData);
            // Nock calls to platform for building transactions and getting user key
            // Should be OK to persist these since they are wallet specific data reads
            nock(this._baseUrl)
                .persist()
                .filteringRequestBody(() => '*')
                .post(`/api/v2/hteth/wallet/${wallet.id()}/tx/build`, '*')
                .reply(200, {
                gasLimit: 500000,
                gasPrice: 20000000000,
                nextContractSequenceId: 101,
            })
                .get(`/api/v2/hteth/key/${wallet.keyIds()[sdk_core_1.KeyIndices.USER]}`)
                .reply(200, {
                id: '598f606cd8fc24710d2ebad89dce86c2',
                users: ['543c11ed356d00cb7600000b98794503'],
                pub: 'xpub661MyMwAqRbcFXDcWD2vxuebcT1ZpTF4Vke6qmMW8yzddwNYpAPjvYEEL5jLfyYXW2fuxtAxY8TgjPUJLcf1C8qz9N6VgZxArKX4EwB8rH5',
                ethAddress: '0x26a163ba9739529720c0914c583865dec0d37278',
                encryptedPrv: '{"iv":"15FsbDVI1zG9OggD8YX+Hg==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"hHbNH3Sz/aU=","ct":"WoNVKz7afiRxXI2w/YkzMdMyoQg/B15u1Q8aQgi96jJZ9wk6TIaSEc6bXFH3AHzD9MdJCWJQUpRhoQc/rgytcn69scPTjKeeyVMElGCxZdFVS/psQcNE+lue3//2Zlxj+6t1NkvYO+8yAezSMRBK5OdftXEjNQI="}',
            });
            const params = {
                module: 'account',
                action: 'tokenbalance',
                contractaddress: TestBitGo.V2.TEST_ERC20_TOKEN_ADDRESS,
                address: TestBitGo.V2.TEST_ETH_WALLET_FIRST_ADDRESS,
                tag: 'latest',
            };
            if (sdk_core_1.common.Environments[this.getEnv()].etherscanApiToken) {
                params.apikey = sdk_core_1.common.Environments[this.getEnv()].etherscanApiToken;
            }
            // Nock tokens stuck on the wallet
            nock('https://api-holesky.etherscan.io')
                .get('/api')
                .query(params)
                .reply(200, { status: '1', message: 'OK', result: '2400' });
            return wallet;
        };
        BitGo.prototype.safeRegister = function (coin, coinConstructor) {
            if (this.register) {
                try {
                    this.register(coin, coinConstructor);
                }
                catch (_) { }
            }
            else {
                throw new Error('Function register does not exist');
            }
        };
        sdk_api_1.BitGoAPI.prototype.fetchConstants = function () {
            nock(this._baseUrl)
                .get('/api/v1/client/constants')
                .reply(200, {
                ttl: 3600,
                constants: {
                    mpc: {
                        bitgoPublicKey: '-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n\r\nxk8EYqEU5hMFK4EEAAoCAwQDdbAIZrsblEXIavyg2go6p9oG0SqWTgFsdHTc\r\nBhqdIS/WjQ8pj75q+vLqFtV9hlImYGInsIWh97fsigzB2owyzRhoc20gPGhz\r\nbUB0ZXN0LmJpdGdvLmNvbT7ChAQTEwgAFQUCYqEU5wILCQIVCAIWAAIbAwIe\r\nAQAhCRCJNRsIDGunexYhBHRL5D/8nRM3opQnXok1GwgMa6d7tg8A/24A9awq\r\nSCJx7RddiUzFHcKhVvvo3R5N7bHaOGP3TP79AP0TavF2WzhUXmZSjt3IK23O\r\n7/aknbijVeq52ghbWb1SwsJ1BBATCAAGBQJioRTnACEJEAWuA35KJgtgFiEE\r\nZttLPR0KcYvjgvJCBa4DfkomC2BsrwD/Z+43zOw+WpfPHxe+ypyVog5fnOKl\r\nXwleH6zDvqUWmWkA/iaHC6ullYkSG4Mv68k6qbtgR/pms/X7rkfa0QQFJy5p\r\nzlMEYqEU5hIFK4EEAAoCAwSsLqmfonjMF3o0nZ5JHvLpmfTA1RIVDsAEoRON\r\ntZA6rAA23pGl6s3Iyt4/fX9Adzoh3EElOjMsgi8Aj3dFpuqiAwEIB8J4BBgT\r\nCAAJBQJioRTnAhsMACEJEIk1GwgMa6d7FiEEdEvkP/ydEzeilCdeiTUbCAxr\r\np3vM7AD9GPp6HhYNEh2VVCDtFSt14Bni5FVM5icpVDo6w9ibvWAA/2Ti3Jv4\r\nIhIxl81/wqAgqigIblrz6vjtagr9/ykXQCW3\r\n=skCo\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n',
                        bitgoNitroPublicKey: '-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n\r\nxk8EYqEU5hMFK4EEAAoCAwQDdbAIZrsblEXIavyg2go6p9oG0SqWTgFsdHTc\r\nBhqdIS/WjQ8pj75q+vLqFtV9hlImYGInsIWh97fsigzB2owyzRhoc20gPGhz\r\nbUB0ZXN0LmJpdGdvLmNvbT7ChAQTEwgAFQUCYqEU5wILCQIVCAIWAAIbAwIe\r\nAQAhCRCJNRsIDGunexYhBHRL5D/8nRM3opQnXok1GwgMa6d7tg8A/24A9awq\r\nSCJx7RddiUzFHcKhVvvo3R5N7bHaOGP3TP79AP0TavF2WzhUXmZSjt3IK23O\r\n7/aknbijVeq52ghbWb1SwsJ1BBATCAAGBQJioRTnACEJEAWuA35KJgtgFiEE\r\nZttLPR0KcYvjgvJCBa4DfkomC2BsrwD/Z+43zOw+WpfPHxe+ypyVog5fnOKl\r\nXwleH6zDvqUWmWkA/iaHC6ullYkSG4Mv68k6qbtgR/pms/X7rkfa0QQFJy5p\r\nzlMEYqEU5hIFK4EEAAoCAwSsLqmfonjMF3o0nZ5JHvLpmfTA1RIVDsAEoRON\r\ntZA6rAA23pGl6s3Iyt4/fX9Adzoh3EElOjMsgi8Aj3dFpuqiAwEIB8J4BBgT\r\nCAAJBQJioRTnAhsMACEJEIk1GwgMa6d7FiEEdEvkP/ydEzeilCdeiTUbCAxr\r\np3vM7AD9GPp6HhYNEh2VVCDtFSt14Bni5FVM5icpVDo6w9ibvWAA/2Ti3Jv4\r\nIhIxl81/wqAgqigIblrz6vjtagr9/ykXQCW3\r\n=skCo\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n',
                    },
                },
            });
            // force client constants reload
            sdk_api_1.BitGoAPI['_constants'] = undefined;
            return originalFetchConstants.apply(this, arguments);
        };
        return new _bitgo(args);
    }
}
exports.TestBitGo = TestBitGo;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9iaXRnby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9saWIvdGVzdF9iaXRnby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxFQUFFO0FBQ0YscUNBQXFDO0FBQ3JDLEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUNGLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyxrQkFBZ0I7QUFDaEIsdUJBQXFCO0FBRXJCLDZCQUE2QjtBQUM3Qiw4Q0FBNEY7QUFFNUYsNENBQTJEO0FBRTNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0FBbUJ4QixNQUFNLHNCQUFzQixHQUFHLGtCQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztBQUVqRSxNQUFhLFNBQVM7SUF3RnBCLE1BQU0sQ0FBQyxRQUFRLENBQ2IsTUFBUyxFQUNULElBQXNCO1FBRXRCLGdFQUFnRTtRQUNoRSxNQUFNLEtBQUssR0FBTSxjQUFhLENBQWlCLENBQUM7UUFDaEQsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBRW5DLFNBQVMsQ0FBQyxTQUFTLEdBQUcsa0JBQWtCLENBQUM7UUFFekMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDdEMsU0FBUyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQzlELENBQUM7YUFBTSxDQUFDO1lBQ04sMkRBQTJEO1lBQzNELGdFQUFnRTtZQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDM0csQ0FBQztRQUVELFNBQVMsQ0FBQyxvQkFBb0IsR0FBRywyQkFBMkIsQ0FBQztRQUM3RCxTQUFTLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQztRQUU3RCxzQ0FBc0M7UUFDdEMsU0FBUyxDQUFD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Q0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHO1lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2lCQUNoQixHQUFHLENBQUMsMEJBQTBCLENBQUM7aUJBQy9CLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsU0FBUyxFQUFFO29CQUNULEdBQUcsRUFBRTt3QkFDSCxjQUFjLEVBQ1oscTRCQUFxNEI7d0JBQ3Y0QixtQkFBbUIsRUFDakIscTRCQUFxNEI7cUJBQ3g0QjtpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVMLGdDQUFnQztZQUNoQyxrQkFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUVuQyxPQUFPLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBZ0IsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQztRQUVGLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFNLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBM2pCRCw4QkEyakJDIiwic291cmNlc0NvbnRlbnQiOlsiLy9cbi8vIEJpdEdvIG9iamVjdCBhdWdtZW50ZWQgZm9yIHRlc3Rpbmdcbi8vXG4vLyBDb3B5cmlnaHQgMjAxNCwgQml0R28sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuY29uc3QgQmlnTnVtYmVyID0gcmVxdWlyZSgnYmlnbnVtYmVyLmpzJyk7XG5cbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCAnc2hvdWxkLWh0dHAnO1xuXG5pbXBvcnQgKiBhcyBub2NrIGZyb20gJ25vY2snO1xuaW1wb3J0IHsgQ29pbkNvbnN0cnVjdG9yLCBjb21tb24sIEtleUluZGljZXMsIHByb21pc2VQcm9wcywgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgQml0R29BUElPcHRpb25zLCBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcblxubm9jay5lbmFibGVOZXRDb25uZWN0KCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdGFibGVCRyB7XG4gIG5ldyAoYXJnczogQml0R29BUElPcHRpb25zKTogQml0R29BUEk7XG4gIGluaXRpYWxpemVUZXN0VmFyczogKCkgPT4gdm9pZDtcbiAgdGVzdFVzZXJPVFA6ICgpID0+IHN0cmluZztcbiAgYXV0aGVudGljYXRlVGVzdFVzZXI6IChvdHA6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgYXV0aGVudGljYXRlU2hhcmluZ1Rlc3RVc2VyOiAob3RwOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIGF1dGhlbnRpY2F0ZUtub3duQmFsYW5jZVRlc3RVc2VyOiAob3RwOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIGF1dGhlbnRpY2F0ZUVudGVycHJpc2VDcmVhdG9yVGVzdFVzZXI6IChvdHA6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgYXV0aGVudGljYXRlQ2hhbmdlUFdUZXN0VXNlcjogKG90cDogc3RyaW5nKSA9PiBQcm9taXNlPHsgcGFzc3dvcmQ6IHN0cmluZzsgYWx0ZXJuYXRlUGFzc3dvcmQ6IHN0cmluZyB9PjtcbiAgYXV0aGVudGljYXRlT2ZjVGVzdFVzZXI6IChvdHA6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgY2hlY2tGdW5kZWQ6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIG5vY2tFdGhXYWxsZXQ6ICgpID0+IFdhbGxldDtcbiAgc2FmZVJlZ2lzdGVyOiAoY29pbjogc3RyaW5nLCBjb2luQ29uc3RydWN0b3I6IENvaW5Db25zdHJ1Y3RvcikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgVGVzdEJpdEdvQVBJID0gVGVzdGFibGVCRyAmIEJpdEdvQVBJO1xuXG5jb25zdCBvcmlnaW5hbEZldGNoQ29uc3RhbnRzID0gQml0R29BUEkucHJvdG90eXBlLmZldGNoQ29uc3RhbnRzO1xuXG5leHBvcnQgY2xhc3MgVGVzdEJpdEdvIHtcbiAgc3RhdGljIFRFU1RfQUNDRVNTVE9LRU46IHN0cmluZztcbiAgc3RhdGljIFRFU1RfQUNDRVNTVE9LRU5fU0hBUkVEVVNFUjogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9BVVRIQ09ERTogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9DTElFTlRJRDogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9DTElFTlRTRUNSRVQ6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfRU5URVJQUklTRTogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9FTlRFUlBSSVNFXzI6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfRU5URVJQUklTRV9DUkVBVElPTl9QQVNTV09SRDogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9FTlRFUlBSSVNFX0NSRUFUSU9OX1VTRVI6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfRU5URVJQUklTRV9QRU5ESU5HX0FQUFJPVkFMX0lEOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX0ZFRV9TSU5HTEVfS0VZX0FERFJFU1M6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfRkVFX1NJTkdMRV9LRVlfV0lGOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX0tOT1dOX0JBTEFOQ0U6IG51bWJlcjtcbiAgc3RhdGljIFRFU1RfS05PV05fQkFMQU5DRV9QQVNTV09SRDogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9LTk9XTl9CQUxBTkNFX1VTRVI6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfUEFTU1dPUkQ6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfUkVGUkVTSFRPS0VOOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1NIQVJFRF9LRVlfUEFTU1dPUkQ6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfU0hBUkVEX0tFWV9VU0VSOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1NIQVJFRF9LRVlfVVNFUklEOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1NIQVJFRF9XQUxMRVRfQUREUkVTUzogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9TSEFSRURfV0FMTEVUX0NIQU5HRV9BRERSRVNTOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1RISVJEX1BBU1NXT1JEOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1RISVJEX1VTRVI6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfVEhJUkRfVVNFUklEOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1VTRVI6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfVVNFUl9FQ0RIX1hQVUI6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfVVNFUklEOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1dBTExFVF9QRU5ESU5HX0FQUFJPVkFMX0lEOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1dBTExFVF9SRUdST1VQX0FERFJFU1M6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfV0FMTEVUX1JFR1JPVVBfUEFTU0NPREU6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfV0FMTEVUMV9BRERSRVNTOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1dBTExFVDFfQUREUkVTUzI6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfV0FMTEVUMV9QQVNTQ09ERTogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9XQUxMRVQxX1hQVUI6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfV0FMTEVUMl9BRERSRVNTOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1dBTExFVDJfUEFTU0NPREU6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfV0FMTEVUM19BRERSRVNTOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1dBTExFVDNfQUREUkVTUzI6IHN0cmluZztcbiAgc3RhdGljIFRFU1RfV0FMTEVUM19BRERSRVNTMzogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9XQUxMRVQzX1BBU1NDT0RFOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1dBTExFVE1VTFRBUFBST1ZFUlNfQUREUkVTUzogc3RyaW5nO1xuICBzdGF0aWMgVEVTVF9XQUxMRVRNVUxUQVBQUk9WRVJTX1BBU1NDT0RFOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1dFQkhPT0tfUEVORElOR19BUFBST1ZBTF9TSU1VTEFUSU9OX0lEOiBzdHJpbmc7XG4gIHN0YXRpYyBURVNUX1dFQkhPT0tfVFJBTlNBQ1RJT05fU0lNVUxBVElPTl9JRDogc3RyaW5nO1xuICBzdGF0aWMgT0ZDX1RFU1RfVVNFUjogc3RyaW5nO1xuICBzdGF0aWMgT0ZDX1RFU1RfUEFTU1dPUkQ6IHN0cmluZztcbiAgc3RhdGljIFRSQVZFTF9SVUxFX1RYSUQ6IHN0cmluZztcbiAgc3RhdGljIFYyOiBQYXJ0aWFsPHtcbiAgICBPRkNfVEVTVF9XQUxMRVRfSUQ6IHN0cmluZztcbiAgICBURVNUX0FMR09fV0FMTEVUX0lEOiBzdHJpbmc7XG4gICAgVEVTVF9CQ0hfV0FMTEVUX0NBU0hfQUREUkVTUzogc3RyaW5nO1xuICAgIFRFU1RfQkNIX1dBTExFVF9JRDogc3RyaW5nO1xuICAgIFRFU1RfQkNIX1dBTExFVF9QQVNTUEhSQVNFOiBzdHJpbmc7XG4gICAgVEVTVF9FUkMyMF9UT0tFTl9BRERSRVNTOiBzdHJpbmc7XG4gICAgVEVTVF9FUkMyMF9UT0tFTl9SRUNJUElFTlQ6IHN0cmluZztcbiAgICBURVNUX0VUSF9XQUxMRVRfRklSU1RfQUREUkVTUzogc3RyaW5nO1xuICAgIFRFU1RfRVRIX1dBTExFVF9JRDogc3RyaW5nO1xuICAgIFRFU1RfRVRIX1dBTExFVF9QQVNTUEhSQVNFOiBzdHJpbmc7XG4gICAgVEVTVF9FVEgyX1dBTExFVF9JRDogc3RyaW5nO1xuICAgIFRFU1RfRVRIMl9XQUxMRVRfUEFTU1BIUkFTRTogc3RyaW5nO1xuICAgIFRFU1RfS0VZQ0hBSU5fQ0hBTkdFX1BXX1BBU1NXT1JEOiBzdHJpbmc7XG4gICAgVEVTVF9LRVlDSEFJTl9DSEFOR0VfUFdfVVNFUjogc3RyaW5nO1xuICAgIFRFU1RfUkVDT1ZFUllfUEFTU0NPREU6IHN0cmluZztcbiAgICBURVNUX1NXRUVQMV9BRERSRVNTOiBzdHJpbmc7XG4gICAgVEVTVF9TV0VFUDFfSUQ6IHN0cmluZztcbiAgICBURVNUX1NXRUVQMV9MQUJFTDogc3RyaW5nO1xuICAgIFRFU1RfU1dFRVAxX1BBU1NDT0RFOiBzdHJpbmc7XG4gICAgVEVTVF9TV0VFUDFfWFBVQjogc3RyaW5nO1xuICAgIFRFU1RfU1dFRVAyX0FERFJFU1M6IHN0cmluZztcbiAgICBURVNUX1NXRUVQMl9JRDogc3RyaW5nO1xuICAgIFRFU1RfU1dFRVAyX0xBQkVMOiBzdHJpbmc7XG4gICAgVEVTVF9TV0VFUDJfUEFTU0NPREU6IHN0cmluZztcbiAgICBURVNUX1NXRUVQMl9YUFVCOiBzdHJpbmc7XG4gICAgVEVTVF9UREFJX1RPS0VOX0FERFJFU1M6IHN0cmluZztcbiAgICBURVNUX1VTRVJJRDogc3RyaW5nO1xuICAgIFRFU1RfV0FMTEVUMV9BRERSRVNTOiBzdHJpbmc7XG4gICAgVEVTVF9XQUxMRVQxX0lEOiBzdHJpbmc7XG4gICAgVEVTVF9XQUxMRVQxX1BBU1NDT0RFOiBzdHJpbmc7XG4gICAgVEVTVF9XQUxMRVQxX1hQVUI6IHN0cmluZztcbiAgICBURVNUX1dBTExFVDJfVU5TUEVOVFNfSUQ6IHN0cmluZztcbiAgICBURVNUX1dBTExFVDJfVU5TUEVOVFNfTEFCRUw6IHN0cmluZztcbiAgICBURVNUX1dBTExFVDJfVU5TUEVOVFNfUEFTU0NPREU6IHN0cmluZztcbiAgICBURVNUX1dBTExFVDJfVU5TUEVOVFNfWFBVQjogc3RyaW5nO1xuICAgIFRFU1RfV0VCSE9PS19UUkFOU0ZFUl9TSU1VTEFUSU9OX0lEOiBzdHJpbmc7XG4gIH0+O1xuXG4gIHN0YXRpYyBkZWNvcmF0ZTxUIGV4dGVuZHMgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogSW5zdGFuY2VUeXBlPFQ+IH0sIFUgZXh0ZW5kcyBUZXN0YWJsZUJHICYgSW5zdGFuY2VUeXBlPFQ+PihcbiAgICBfYml0Z286IFQsXG4gICAgYXJncz86IEJpdEdvQVBJT3B0aW9uc1xuICApOiBVIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgY29uc3QgQml0R286IFUgPSBmdW5jdGlvbiAoKSB7fSBhcyB1bmtub3duIGFzIFU7XG4gICAgQml0R28ucHJvdG90eXBlID0gX2JpdGdvLnByb3RvdHlwZTtcblxuICAgIFRlc3RCaXRHby5URVNUX1VTRVIgPSAndGVzdGVyQGJpdGdvLmNvbSc7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuQklUR09KU19URVNUX1BBU1NXT1JEKSB7XG4gICAgICBUZXN0Qml0R28uVEVTVF9QQVNTV09SRCA9IHByb2Nlc3MuZW52LkJJVEdPSlNfVEVTVF9QQVNTV09SRDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGVzdCBhY2NvdW50cyBhcmUgbG9ja2VkIGludGVybmFsbHkgdG8gcHJldmVudCB0YW1wZXJpbmdcbiAgICAgIC8vIENvbnRhY3Qgc3VwcG9ydEBiaXRnby5jb20gZm9yIGZ1cnRoZXIgaGVscCBvbiBob3cgdG8gZml4IHRoaXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCB0byBzZXQgQklUR09KU19URVNUX1BBU1NXT1JEIGVudiB2YXJpYWJsZSAtIHBsZWFzZSBzZWUgdGhlIGRldmVsb3BlciBzZXR1cCBkb2NzLicpO1xuICAgIH1cblxuICAgIFRlc3RCaXRHby5URVNUX1NIQVJFRF9LRVlfVVNFUiA9ICdzaGFyZWRfa2V5X3Rlc3RAYml0Z28uY29tJztcbiAgICBUZXN0Qml0R28uVEVTVF9TSEFSRURfS0VZX1BBU1NXT1JEID0gVGVzdEJpdEdvLlRFU1RfUEFTU1dPUkQ7XG5cbiAgICAvLyB1c2VkIGZvciB0ZXN0aW5nIG11bHRpcGxlIGFwcHJvdmVyc1xuICAgIFRlc3RCaXRHby5URVNUX1RISVJEX1VTRVIgPSAndGhpcmRfdXNlcl90ZXN0QGJpdGdvLmNvbSc7XG4gICAgVGVzdEJpdEdvLlRFU1RfVEhJUkRfUEFTU1dPUkQgPSBUZXN0Qml0R28uVEVTVF9QQVNTV09SRDtcblxuICAgIC8vIGFjY291bnQgd2l0aCBhIGtub3duIHRvdGFsIGJhbGFuY2UuIERvbid0IHNwZW5kIG9yIHJlY2VpdmUgY29pbnNcbiAgICAvLyBmcm9tIGFueSB3YWxsZXQgaW4gdGhpcyBhY2NvdW50LiBLbm93biB0b3RhbCBiYWxhbmNlIGFjcm9zc1xuICAgIC8vIGFsbCBUTFRDIHdhbGxldHMgaW4gdGhpcyBhY2NvdW50IGlzIGV4YWN0bHkgOTk5OTU4NjQwMFxuICAgIFRlc3RCaXRHby5URVNUX0tOT1dOX0JBTEFOQ0VfVVNFUiA9ICd0eWxlcit0ZXN0LWdldC10b3RhbC1iYWxhbmNlc0BiaXRnby5jb20nO1xuICAgIFRlc3RCaXRHby5URVNUX0tOT1dOX0JBTEFOQ0VfUEFTU1dPUkQgPSBUZXN0Qml0R28uVEVTVF9QQVNTV09SRDtcbiAgICBUZXN0Qml0R28uVEVTVF9LTk9XTl9CQUxBTkNFID0gOTk5OTU4NjQwMDtcblxuICAgIFRlc3RCaXRHby5URVNUX0VOVEVSUFJJU0VfQ1JFQVRJT05fVVNFUiA9ICdlbnRlcnByaXNlY3JlYXRvckBiaXRnby5jb20nO1xuICAgIFRlc3RCaXRHby5URVNUX0VOVEVSUFJJU0VfQ1JFQVRJT05fUEFTU1dPUkQgPSBUZXN0Qml0R28uVEVTVF9QQVNTV09SRDtcblxuICAgIFRlc3RCaXRHby5PRkNfVEVTVF9VU0VSID0gJ3Rlc3RlcitlbXBsb3llZUBiaXRnby5jb20nO1xuICAgIFRlc3RCaXRHby5PRkNfVEVTVF9QQVNTV09SRCA9IFRlc3RCaXRHby5URVNUX1BBU1NXT1JEO1xuXG4gICAgVGVzdEJpdEdvLlRFU1RfQ0xJRU5USUQgPSAndGVzdCc7XG4gICAgVGVzdEJpdEdvLlRFU1RfQ0xJRU5UU0VDUkVUID0gJ3Rlc3RjbGllbnRzZWNyZXQnO1xuXG4gICAgLy8gVGhlc2UgYXV0aCB0b2tlbnMgYXJlIG1vZGlmaWVkIGluIHRoZSBkYiB0byBleHBpcmUgaW4gMjAxOCBvbiBib3RoIHRlc3QgJiBkZXZcbiAgICBUZXN0Qml0R28uVEVTVF9BVVRIQ09ERSA9ICczNzQ1NDQxNmJhMTNlMWJlOWZkYzM5Y2ZjMjA3ZGY3ZjdhN2YwOTUzJztcbiAgICBUZXN0Qml0R28uVEVTVF9BQ0NFU1NUT0tFTiA9ICc0Y2I0NDBlMzUzYjU0MTVlMzUwYTFlNzk5YmIxYWQ4MjBmZWY0ZWFkJztcbiAgICBUZXN0Qml0R28uVEVTVF9BQ0NFU1NUT0tFTl9TSEFSRURVU0VSID0gJzRjYjQ0MGUzNTNiNTQxNWUzNTBhMWU3OTliYjFhZDgyMGZlZjRlYXgnO1xuICAgIFRlc3RCaXRHby5URVNUX1JFRlJFU0hUT0tFTiA9ICc4NTE5ZmNjNzc4N2Q5ZDY5NzFlZDg5YTc1N2UzMzA5YTcyZGRlZGM4JztcblxuICAgIFRlc3RCaXRHby5UUkFWRUxfUlVMRV9UWElEID0gJzMzNDQ3NzUzNDU1NjUxNTA4Y2ZkMDk5YzllYmUwZGI2YTIyNDNjY2JhNDc2NjMxOTYyMWZiY2U1NmRiN2YxMzUnO1xuXG4gICAgVGVzdEJpdEdvLlRFU1RfV0FMTEVUX1JFR1JPVVBfUEFTU0NPREUgPSAndGVzdCBzZWN1cml0eSBmYW5vdXQgJiBjb2FsZXNjZSc7XG5cbiAgICBCaXRHby5wcm90b3R5cGUuaW5pdGlhbGl6ZVRlc3RWYXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuZ2V0RW52KCkgPT09ICdkZXYnIHx8IHRoaXMuZ2V0RW52KCkgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfVVNFUklEID0gJzU0ZDNlM2E0YjA4ZmE2ZGMwYTAwMDJjMDdmOGE5Zjg2JztcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfU0hBUkVEX0tFWV9VU0VSSUQgPSAnNTRkNDE4ZGU0ZWExMWQwNTBiMDAwNjE4NmQwOGVhNWMnO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9USElSRF9VU0VSSUQgPSAnNTcwNTZhZDU5M2VhZThjYTBjNTFlM2NlZTYyMDIyY2InO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9VU0VSX0VDREhfWFBVQiA9XG4gICAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGMzF5WXZUSDVEYm1hYkVNWFZ2eDFvMXA3M3NabXZFREhNOGJoVWlaek5RQTRnZnlEdEthcnBHejdOUEg2V3ViOFlDcVhuVWJQOFpNQTNBZDhMZndIc0JXaFdFZUpxdSc7XG5cbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfV0FMTEVUMV9QQVNTQ09ERSA9ICdpVldlQVRqcUxTMWpKU2hyUHBFVHRpMGInO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVQxX1hQVUIgPVxuICAgICAgICAgICd4cHViNjYxTXlNd0FxUmJjRmdzRTNaZzY2RThwckh5N2FvaGI5d1NpWlJOOXZRQTRmcDZuMWRwWER5UkxQVDRZbmhCVFB3a2h0REdxUjN5bkI0dEpVZW53OVdUUGhSV3daM2NwcWtRckd6WFRjRk0nO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVQxX0FERFJFU1MgPSAnMk4xdms1UW02dkdQQjhTQVpVakVROEdhYzZ2NzFFbXhnYUcnO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVQxX0FERFJFU1MyID0gJzJNeENIekFZeUs5UmdMR1VXeW13OUpoaHR0MTlWcVV0Q2VqJztcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfV0FMTEVUMl9QQVNTQ09ERSA9ICdqMFhWVEppVGdzTUNvZ0tSb0hJRHpHYnonO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVQyX0FERFJFU1MgPSAnMk10WkFxSldMQkNtdGpZUTdXZnRjWFkxZmRNakV2OHZFUlonO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVQzX1BBU1NDT0RFID0gJ0NWS3pIdXV0ZE1ndGxnRkZXcGI0b081ayc7XG4gICAgICAgIFRlc3RCaXRHby5URVNUX1dBTExFVDNfQUREUkVTUyA9ICcyTkU0YlpTaXRVeG9STEZnNFU2cUhranJDWFdOQXZRQkRvNSc7XG4gICAgICAgIFRlc3RCaXRHby5URVNUX1dBTExFVDNfQUREUkVTUzIgPSAnMk5GRnQ0SDJ2UDU0V3dXanJVVkxoN2tzRjR0Nm1hYkNHc2gnO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVQzX0FERFJFU1MzID0gJzJORzhIQTdxeWE0cGJ3YmcyNU5GMVNZNm5Fak02YXBUMWhGJztcblxuICAgICAgICAvLyB3ZWJob29rc1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XRUJIT09LX1RSQU5TQUNUSU9OX1NJTVVMQVRJT05fSUQgPSAnNTdmM2VlNjhhMmNlY2UxNzcwNDAyZGJlN2Q4NGMzNjgnO1xuXG4gICAgICAgIC8vIHdhbGxldCBmb3IgdGVzdGluZyB1bnNwZW50cyByZWdyb3VwaW5nIChmYW5vdXQgJiBjb25zb2xpZGF0ZS9jb2FsZXNjZSlcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfV0FMTEVUX1JFR1JPVVBfQUREUkVTUyA9ICcyTXVWc2hNTGZaYVhmRjZxN2FmNDdaRlV0WkdHcG55WnVMdSc7XG5cbiAgICAgICAgLy8gdjIgdmFyaWFibGVzXG4gICAgICAgIFRlc3RCaXRHby5WMiA9IHt9O1xuICAgICAgICBUZXN0Qml0R28uVjIuVEVTVF9VU0VSSUQgPSAnNTg1Y2FjY2Q1NTczYjBhODQxNmE3NDVlZDU4ZDhjYjQnO1xuICAgICAgICBUZXN0Qml0R28uVjIuVEVTVF9XQUxMRVQxX1BBU1NDT0RFID0gJ2lWV2VBVGpxTFMxakpTaHJQcEVUdGkwYic7XG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1dBTExFVDFfWFBVQiA9XG4gICAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNHaWNWTTVLNVVub2NXb0Z0M1loMVJaS3pTRUhQUEFSaHlNZjl3N0RWcU0zUGdCZ2lWVzVOSFJwOFV0ZXFoTW9RYjE3ckNRc0xibUdYdVB4NDNNS3NreUIzMVI5N3AzRyc7XG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1dBTExFVDFfSUQgPSAnNTg1Y2M1MzM1NTczYjBhODQxNmFhZGIxZmNlNjNjZTMnO1xuICAgICAgICBUZXN0Qml0R28uVjIuT0ZDX1RFU1RfV0FMTEVUX0lEID0gJzVjYmUzMjIzMzExMzE1ZmM3Yzk2Y2UwODdmMzJkYmRkJztcblxuICAgICAgICBUZXN0Qml0R28uVjIuVEVTVF9SRUNPVkVSWV9QQVNTQ09ERSA9ICdvUFhrUE41UTBjOGk0NGkwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFRlc3RCaXRHby5URVNUX1VTRVJJRCA9ICc1NDNjMTFlZDM1NmQwMGNiNzYwMDAwMGI5ODc5NDUwMyc7XG4gICAgICAgIFRlc3RCaXRHby5URVNUX1NIQVJFRF9LRVlfVVNFUklEID0gJzU0OWQwZWU4MzVhZWM4MTIwNjAwNGMwODI3NTc1NzBmJztcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfVEhJUkRfVVNFUklEID0gJzU3MDQ5YjlhMTk0YTExNWEwNmRhMjFmYjk3MzFmYjcxJztcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfVVNFUl9FQ0RIX1hQVUIgPVxuICAgICAgICAgICd4cHViNjYxTXlNd0FxUmJjRmtpTjhRSlhDeXRRcVB5RFBXMWNmbnVHNlJHQ1ZGblZ5aVNRTDFiNlpTMmlpVkpISDdVWll3TGJOMmF5V3NhUlZobkJGS1l2THo5NTZQVFJIMlN1dXVycEVjTkdMS3YnO1xuXG4gICAgICAgIFRlc3RCaXRHby5URVNUX1dBTExFVDFfUEFTU0NPREUgPSAndGVzdCB3YWxsZXQgIzEgc2VjdXJpdHknO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVQxX1hQVUIgPVxuICAgICAgICAgICd4cHViNjYxTXlNd0FxUmJjR1U3Rm5YTUtTSE13Yld4QVJ4WUpVcEtEMUNvTUpQNnZvbkxUOWJaWmFXWXE3QTd0S1BYbURGRlhUS2lnVDdWSE1uYnRFbmpDbXhRMUU5M1pKZTZIREt3eFdEMjhNNmYnO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVQxX0FERFJFU1MgPSAnMk10ZXBhaFJuNHFUaWhoVHZVdUdUWVV5VUJrUVp6YVZCRzMnO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVQxX0FERFJFU1MyID0gJzJNeEtvOVJITlpIb1B3bXZuYjVrOHl0REo2U2hkMURIbnNWJztcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfV0FMTEVUMl9QQVNTQ09ERSA9ICd0ZXN0IHdhbGxldCAjMiBzZWN1cml0eSc7XG4gICAgICAgIFRlc3RCaXRHby5URVNUX1dBTExFVDJfQUREUkVTUyA9ICcyTXZwWmhxNnpVdTNVQVJkSktaSDdUVGZxSEozRWMxWUFqdic7XG4gICAgICAgIFRlc3RCaXRHby5URVNUX1dBTExFVDNfUEFTU0NPREUgPSAndGVzdCB3YWxsZXQgIzMgc2VjdXJpdHknO1xuXG4gICAgICAgIC8vIHdlYmhvb2tzXG4gICAgICAgIFRlc3RCaXRHby5URVNUX1dFQkhPT0tfVFJBTlNBQ1RJT05fU0lNVUxBVElPTl9JRCA9ICc1Nzk3Zjc4YjY1MWZjOTcxMDYyZWI4NTFlYTA5NjcyZCc7XG4gICAgICAgIFRlc3RCaXRHby5URVNUX1dFQkhPT0tfUEVORElOR19BUFBST1ZBTF9TSU1VTEFUSU9OX0lEID0gJzU4MjRiNTA3NWY3OTQ0YTgwNjlkODYzZGNjZjI1NTk4JztcblxuICAgICAgICAvLyBzaGFyZWQgYW1vbmdzdCAzIHVzZXJzIChURVNUX1VTRVIsIFRFU1RfU0hBUkVEX0tFWV9VU0VSLCBhbmQgVEVTVF9USElSRF9VU0VSKVxuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVRNVUxUQVBQUk9WRVJTX0FERFJFU1MgPSAnMk5GN3BLMXBERVVYcldtcVh4Q1Q0ZmpQdFFyc0s2WE52VXknO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9XQUxMRVRNVUxUQVBQUk9WRVJTX1BBU1NDT0RFID0gVGVzdEJpdEdvLlRFU1RfUEFTU1dPUkQ7XG5cbiAgICAgICAgLy8gVEVTVF9XQUxMRVRfMyBpcyBhIEtSUyB3YWxsZXRcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfV0FMTEVUM19BRERSRVNTID0gJzJNeUtvYWFueVNCUENBMkJyN2RHdmFaRWdFR3A3WVJadmlmJztcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfV0FMTEVUM19BRERSRVNTMiA9ICcyTjExWVE1bWI3M0NEaHVwWDhwZUtxYjN4RmREOWtyNzhXZic7XG4gICAgICAgIFRlc3RCaXRHby5URVNUX1dBTExFVDNfQUREUkVTUzMgPSAnMk4xVHQ3NU1OS0ZIUkJFNjhIWEhCN0ZTbUxwbUdDUUR1SkMnO1xuXG4gICAgICAgIFRlc3RCaXRHby5URVNUX0VOVEVSUFJJU0UgPSAnNTU3OGViYzc2ZWI0NzQ4Nzc0M2I5MDMxNjZlNjU0M2EnO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9FTlRFUlBSSVNFXzIgPSAnNTcwNTc5MTZjMDNiNGE1ZDA2NDRlMmFkOTRhOWUwNzAnO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9TSEFSRURfV0FMTEVUX0FERFJFU1MgPSAnMk1zTWZlWVdOV1l3QjNmemZNQmZ1U1piN2prY0duVGpXNDInO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9TSEFSRURfV0FMTEVUX0NIQU5HRV9BRERSRVNTID0gJzJNc1VldnNNNW5jdmdycnFVb0o3cVlkN0tzOVZDTjN1aEhNJztcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfV0FMTEVUX1BFTkRJTkdfQVBQUk9WQUxfSUQgPSAnNTZlYWYzYmRjYzQ2MzViYjA1Mjk4NDNhMGRjZjg2MGInO1xuICAgICAgICBUZXN0Qml0R28uVEVTVF9FTlRFUlBSSVNFX1BFTkRJTkdfQVBQUk9WQUxfSUQgPSAnNTgyNGQ1YjVhY2YxNGVhMTA2ZTRmMmVmZDU4OGMwNTMnO1xuXG4gICAgICAgIC8vIHdhbGxldCBmb3IgdGVzdGluZyB1bnNwZW50cyByZWdyb3VwaW5nIChmYW5vdXQgJiBjb25zb2xpZGF0ZS9jb2FsZXNjZSlcbiAgICAgICAgVGVzdEJpdEdvLlRFU1RfV0FMTEVUX1JFR1JPVVBfQUREUkVTUyA9ICcyTXVWc2hNTGZaYVhmRjZxN2FmNDdaRlV0WkdHcG55WnVMdSc7XG5cbiAgICAgICAgLy8gdjIgdmFyaWFibGVzXG4gICAgICAgIFRlc3RCaXRHby5WMiA9IHt9O1xuICAgICAgICBUZXN0Qml0R28uVjIuVEVTVF9VU0VSSUQgPSAnNTQzYzExZWQzNTZkMDBjYjc2MDAwMDBiOTg3OTQ1MDMnO1xuXG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1dBTExFVDFfUEFTU0NPREUgPSAnaVZXZUFUanFMUzFqSlNoclBwRVR0aTBiJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfV0FMTEVUMV9YUFVCID1cbiAgICAgICAgICAneHB1YjY2MU15TXdBcVJiY0ZXRk45Z3BGcG5TVnk2YkYza01aQWtTWHR1M1pZS1BncTJLVVZvMXhFTW5NWERjYXZ3REo0ekg1N2lVSFZmRUdWSzdkRWdvN3VmS1J6VGtlV1lTQkR1eWU1Zzd3NHBlJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfV0FMTEVUMV9JRCA9ICc1OTNmMWVjZTk5ZDM3YzIzMDgwYTU1NzI4M2VkY2M4OSc7XG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1dBTExFVDFfQUREUkVTUyA9ICcyTjNxTEc0Vk1wa29SWk40RnQ5UEM1c2dwR0t2bTdBVjMyQSc7XG5cbiAgICAgICAgLy8gdGhpcyB3YWxsZXQgd2lsbCBkbyBjb25zb2xpZGF0ZSBhbmQgZmFubm91dCB0b2dldGhlciwgc28gdGhlIG51bWJlciBvZiB1bnNwZW50cyBjYW4gYmUga25vd25cbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfV0FMTEVUMl9VTlNQRU5UU19MQUJFTCA9ICdUZXN0IFdhbGxldCAyIFVuc3BlbnRzJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfV0FMTEVUMl9VTlNQRU5UU19QQVNTQ09ERSA9ICdOWGg2NUh4ZVpwekZxelcybjg2OCc7XG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1dBTExFVDJfVU5TUEVOVFNfWFBVQiA9XG4gICAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGZWVNWnR5TGlxRUNNZWVrN1FENlg5TkxYMnlkQk4yRHV0aUJRcUx3OG5zTW5uTDloazNDU1dHWFpnVzFQTFY5Nm9wdThOenVYd0pqSzU3UHVOQnFlODVqU042QWJtNic7XG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1dBTExFVDJfVU5TUEVOVFNfSUQgPSAnNWExMzQxZTdjODQyMWRjOTA3MTA2NzNiMzE2NmJiZDUnO1xuXG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1NXRUVQMV9MQUJFTCA9ICdTd2VlcCAxJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfU1dFRVAxX1BBU1NDT0RFID0gJ1Q4bjZTNEF6a3RzRHdDcXZhRTQ2OTI4OTVZa2pSVCc7XG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1NXRUVQMV9YUFVCID1cbiAgICAgICAgICAneHB1YjY2MU15TXdBcVJiY0ZXSjFaeHp2bUttNFFDa3JnWVFMYlRHekxneHpLRmNHa3lRZkNqdWdFTnVhbUZtRjNXd0xIUnZQOHpXUWkxNmtVOFN1VHF5TVlGaHZKY2cxVTF3OEFUMUFIS2EyNXNZJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfU1dFRVAxX0lEID0gJzVhODM2YTdlN2NiNDNjYTgwNzM3MWYxMjNhYjNhOTA3JztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfU1dFRVAxX0FERFJFU1MgPSAnMk4xckdRVXBDUlY3OTdjU2JUM2hyMzR6YXl5TnFTMjYzZzknO1xuXG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1NXRUVQMl9MQUJFTCA9ICdTd2VlcCAyJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfU1dFRVAyX1BBU1NDT0RFID0gJ2JNWThqckYwNnBWMmR4elJLNDJkR1pxcm1tVVJTNyc7XG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX1NXRUVQMl9YUFVCID1cbiAgICAgICAgICAneHB1YjY2MU15TXdBcVJiY0ZoQkRxMWRid3U1MXFyTlFyYTkyM0ZudWpHUHhDQmFIZDJnZVU2QVlaaHZpTW84aldqM2N2d003QWoyVDc5Q3RLcUVyUDM3SzF2d1lTQVlnTW1GYUhpVmRKZ0hKMW5rJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfU1dFRVAyX0lEID0gJzVhODM2YjVlMWMwZDY5OWEwN2Q0MjAyOWNjZDY1ODM2JztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfU1dFRVAyX0FERFJFU1MgPSAnMk5HVjlDaGhhZnVYTks5aUZXNkw2Q0tydTViRmtNeFpqTlgnO1xuXG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX0VUSF9XQUxMRVRfSUQgPSAnNTk4ZjYwNmNkOGZjMjQ3MTBkMmViYWRiMWQ5NDU5YmInO1xuICAgICAgICBUZXN0Qml0R28uVjIuVEVTVF9FVEhfV0FMTEVUX1BBU1NQSFJBU0UgPSAnbW9vbic7XG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX0VUSF9XQUxMRVRfRklSU1RfQUREUkVTUyA9ICcweGRmMDcxMTc3MDVhOWY4ZGM0YzJhNzhkZTY2YjdmMTc5N2RiYTlkNGUnO1xuXG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX0VUSDJfV0FMTEVUX0lEID0gJzYyNDVkZjA2YjBjNTBkMDAwOGUwYjJhY2VhMGIxZjBlJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfRVRIMl9XQUxMRVRfUEFTU1BIUkFTRSA9ICdFdGgyT25Nb29uISc7XG5cbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfQkNIX1dBTExFVF9JRCA9ICc2MTQ4OTg3MjY3NjYwZDAwMDY5ZGQ4NDRhZjI5N2EyYic7XG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX0JDSF9XQUxMRVRfUEFTU1BIUkFTRSA9ICdCY2hPbk1vb240JztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfQkNIX1dBTExFVF9DQVNIX0FERFJFU1MgPSAnYmNodGVzdDpwcjN6cDQzcXh1OHp0dWRlcGhzdnlhZnhqMnpmem53NXY1d2g4NXNnNTQnO1xuXG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX0tFWUNIQUlOX0NIQU5HRV9QV19VU0VSID0gJ3VwZGF0ZV9wd190ZXN0ZXJAYml0Z28uY29tJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfS0VZQ0hBSU5fQ0hBTkdFX1BXX1BBU1NXT1JEID0gVGVzdEJpdEdvLlRFU1RfUEFTU1dPUkQ7XG5cbiAgICAgICAgLy8gQ29udHJhY3QgYWRkcmVzcyBmb3IgUG90YXRva2VuXG4gICAgICAgIFRlc3RCaXRHby5WMi5URVNUX0VSQzIwX1RPS0VOX0FERFJFU1MgPSAnMHgwNmQyMmU2ZmE2MGZkYTI2YjZjYTI4ZjczZDJkNGE4MWJkOWFhMmRlJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfRVJDMjBfVE9LRU5fUkVDSVBJRU5UID0gJzB4NTJjOEIyOUFiOEIwYTQ5YTAxYzJiNzVmOGU3ZjExQjIzZTBlMzc4Mic7XG5cbiAgICAgICAgLy8gQ29udHJhY3QgYWRkcmVzcyBmb3IgdGRhaSB0b2tlblxuICAgICAgICBUZXN0Qml0R28uVjIuVEVTVF9UREFJX1RPS0VOX0FERFJFU1MgPSAnMHg0Zjk2ZmUzYjdhNmNmOTcyNWY1OWQzNTNmNzIzYzFiZGI2NGNhNmFhJztcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfUkVDT1ZFUllfUEFTU0NPREUgPSAnb1BYa1BONVEwYzhpNDRpMCc7XG5cbiAgICAgICAgLy8gd2ViaG9va3NcbiAgICAgICAgVGVzdEJpdEdvLlYyLlRFU1RfV0VCSE9PS19UUkFOU0ZFUl9TSU1VTEFUSU9OX0lEID0gJzU5YjcwNDE2MTlkZDUyY2QwNzM3YTRjYmYzOWRiZDQ0JztcblxuICAgICAgICBUZXN0Qml0R28uVjIuT0ZDX1RFU1RfV0FMTEVUX0lEID0gJzVjYmUzNTYzYWZjMjc1YjQwMzY5ZTA5NjA3M2I4YTE2JztcblxuICAgICAgICAvLyBBbGdvIHdhbGxldCBmb3Igbm9uIHBhcnRpY2lwYXRpbmcga2V5IHJlZyB0cmFuc2FjdGlvblxuICAgICAgICBUZXN0Qml0R28uVjIuVEVTVF9BTEdPX1dBTExFVF9JRCA9ICc2MDI1NjZmNTUwYTA1YzAwMDZmZTEzYTAzYjU3MTQxZic7XG4gICAgICB9XG5cbiAgICAgIFRlc3RCaXRHby5URVNUX0ZFRV9TSU5HTEVfS0VZX1dJRiA9ICdjUlZRNmNiVXlHSFZ2QnlQS0Y5R25FaGFCNEhVQkZnTFEyalZYMWtiUUFSSGFUYUQ3V0oyJztcbiAgICAgIFRlc3RCaXRHby5URVNUX0ZFRV9TSU5HTEVfS0VZX0FERFJFU1MgPSAnbWliSjR1SmM5ZjFmYk1lYVVYTnVXcXNCMUpnTk1jVFpLNyc7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gdGVzdFVzZXJPVFBcbiAgICAvLyBHZXQgYW4gT1RQIGNvZGUgZm9yIHRoZSB0ZXN0IHVzZXIuXG4gICAgLy9cbiAgICBCaXRHby5wcm90b3R5cGUudGVzdFVzZXJPVFAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJzAwMDAwMDAnO1xuICAgIH07XG5cbiAgICAvL1xuICAgIC8vIGF1dGhlbnRpY2F0ZVRlc3RVc2VyXG4gICAgLy8gQXV0aGVudGljYXRlIHRoZSB0ZXN0IHVzZXIuXG4gICAgLy9cbiAgICBCaXRHby5wcm90b3R5cGUuYXV0aGVudGljYXRlVGVzdFVzZXIgPSBhc3luYyBmdW5jdGlvbiAob3RwKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKHtcbiAgICAgICAgdXNlcm5hbWU6IFRlc3RCaXRHby5URVNUX1VTRVIsXG4gICAgICAgIHBhc3N3b3JkOiBUZXN0Qml0R28uVEVTVF9QQVNTV09SRCxcbiAgICAgICAgb3RwOiBvdHAsXG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdhY2Nlc3NfdG9rZW4nKTtcbiAgICAgIHJlc3BvbnNlLnNob3VsZC5oYXZlLnByb3BlcnR5KCd1c2VyJyk7XG4gICAgfTtcblxuICAgIEJpdEdvLnByb3RvdHlwZS5hdXRoZW50aWNhdGVTaGFyaW5nVGVzdFVzZXIgPSBhc3luYyBmdW5jdGlvbiAob3RwKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKHtcbiAgICAgICAgdXNlcm5hbWU6IFRlc3RCaXRHby5URVNUX1NIQVJFRF9LRVlfVVNFUixcbiAgICAgICAgcGFzc3dvcmQ6IFRlc3RCaXRHby5URVNUX1NIQVJFRF9LRVlfUEFTU1dPUkQsXG4gICAgICAgIG90cDogb3RwLFxuICAgICAgfSk7XG4gICAgICByZXNwb25zZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYWNjZXNzX3Rva2VuJyk7XG4gICAgICByZXNwb25zZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndXNlcicpO1xuICAgIH07XG5cbiAgICBCaXRHby5wcm90b3R5cGUuYXV0aGVudGljYXRlS25vd25CYWxhbmNlVGVzdFVzZXIgPSBhc3luYyBmdW5jdGlvbiAob3RwKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKHtcbiAgICAgICAgdXNlcm5hbWU6IFRlc3RCaXRHby5URVNUX0tOT1dOX0JBTEFOQ0VfVVNFUixcbiAgICAgICAgcGFzc3dvcmQ6IFRlc3RCaXRHby5URVNUX0tOT1dOX0JBTEFOQ0VfUEFTU1dPUkQsXG4gICAgICAgIG90cDogb3RwLFxuICAgICAgfSk7XG4gICAgICByZXNwb25zZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYWNjZXNzX3Rva2VuJyk7XG4gICAgICByZXNwb25zZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndXNlcicpO1xuICAgIH07XG5cbiAgICBCaXRHby5wcm90b3R5cGUuYXV0aGVudGljYXRlRW50ZXJwcmlzZUNyZWF0b3JUZXN0VXNlciA9IGFzeW5jIGZ1bmN0aW9uIChvdHApIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoe1xuICAgICAgICB1c2VybmFtZTogVGVzdEJpdEdvLlRFU1RfRU5URVJQUklTRV9DUkVBVElPTl9VU0VSLFxuICAgICAgICBwYXNzd29yZDogVGVzdEJpdEdvLlRFU1RfRU5URVJQUklTRV9DUkVBVElPTl9QQVNTV09SRCxcbiAgICAgICAgb3RwOiBvdHAsXG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdhY2Nlc3NfdG9rZW4nKTtcbiAgICAgIHJlc3BvbnNlLnNob3VsZC5oYXZlLnByb3BlcnR5KCd1c2VyJyk7XG4gICAgfTtcblxuICAgIEJpdEdvLnByb3RvdHlwZS5hdXRoZW50aWNhdGVDaGFuZ2VQV1Rlc3RVc2VyID0gYXN5bmMgZnVuY3Rpb24gKG90cCkge1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICB1c2VybmFtZTogVGVzdEJpdEdvLlYyLlRFU1RfS0VZQ0hBSU5fQ0hBTkdFX1BXX1VTRVIsXG4gICAgICAgIHBhc3N3b3JkOiBUZXN0Qml0R28uVjIuVEVTVF9LRVlDSEFJTl9DSEFOR0VfUFdfUEFTU1dPUkQsXG4gICAgICAgIG90cDogb3RwLFxuICAgICAgfTtcbiAgICAgIGxldCBhbHRlcm5hdGVQYXNzd29yZCA9IGAke3BhcmFtcy5wYXNzd29yZH1fbmV3YDtcbiAgICAgIGxldCByZXNwb25zZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShwYXJhbXMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZS5tZXNzYWdlICE9PSAnaW52YWxpZF9ncmFudCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1zLnBhc3N3b3JkID0gYWx0ZXJuYXRlUGFzc3dvcmQ7XG4gICAgICAgIGFsdGVybmF0ZVBhc3N3b3JkID0gVGVzdEJpdEdvLlYyLlRFU1RfS0VZQ0hBSU5fQ0hBTkdFX1BXX1BBU1NXT1JEIGFzIHN0cmluZztcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShwYXJhbXMpO1xuICAgICAgfVxuICAgICAgcmVzcG9uc2Uuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FjY2Vzc190b2tlbicpO1xuICAgICAgcmVzcG9uc2Uuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3VzZXInKTtcblxuICAgICAgcmV0dXJuIHsgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzd29yZCwgYWx0ZXJuYXRlUGFzc3dvcmQgfTtcbiAgICB9O1xuXG4gICAgQml0R28ucHJvdG90eXBlLmF1dGhlbnRpY2F0ZU9mY1Rlc3RVc2VyID0gYXN5bmMgZnVuY3Rpb24gKG90cCkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZSh7XG4gICAgICAgIHVzZXJuYW1lOiBUZXN0Qml0R28uT0ZDX1RFU1RfVVNFUixcbiAgICAgICAgcGFzc3dvcmQ6IFRlc3RCaXRHby5PRkNfVEVTVF9QQVNTV09SRCxcbiAgICAgICAgb3RwOiBvdHAsXG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdhY2Nlc3NfdG9rZW4nKTtcbiAgICAgIHJlc3BvbnNlLnNob3VsZC5oYXZlLnByb3BlcnR5KCd1c2VyJyk7XG4gICAgfTtcblxuICAgIEJpdEdvLnByb3RvdHlwZS5jaGVja0Z1bmRlZCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFdlIGFyZSB0ZXN0aW5nIGJvdGggQlRDIGFuZCBFVEggZnVuZHMgaGVyZSwgdG8gbWFrZSBzdXJlIHRoYXRcbiAgICAgIC8vIHdlIGRvbid0IHNwZW5kIGZvciBhbHJlYWR5ICdmYWlsZWQnIHRlc3QgcnVucyAoZS5nLiwgc3BlbmRpbmcgRVRIIHdoZW4gd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggQlRDKVxuXG4gICAgICAvLyBUZXN0IHdlIGhhdmUgZW5vdWdoIEVUSFxuICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGVUZXN0VXNlcih0aGlzLnRlc3RVc2VyT1RQKCkpO1xuICAgICAgY29uc3QgdGVzdFdhbGxldElkID0gVGVzdEJpdEdvLlYyLlRFU1RfRVRIX1dBTExFVF9JRDtcblxuICAgICAgY29uc3QgeyBodGV0aFdhbGxldCwgdGJ0Y1dhbGxldCwgdW5zcGVudFdhbGxldCwgc3dlZXAxV2FsbGV0IH06IGFueSA9IGF3YWl0IHByb21pc2VQcm9wcyh7XG4gICAgICAgIGh0ZXRoV2FsbGV0OiB0aGlzLmNvaW4oJ2h0ZXRoJykud2FsbGV0cygpLmdldCh7IGlkOiB0ZXN0V2FsbGV0SWQgfSksXG4gICAgICAgIHRidGNXYWxsZXQ6IHRoaXMuY29pbigndGJ0YycpLndhbGxldHMoKS5nZXRXYWxsZXQoeyBpZDogVGVzdEJpdEdvLlYyLlRFU1RfV0FMTEVUMV9JRCB9KSxcbiAgICAgICAgdW5zcGVudFdhbGxldDogdGhpcy5jb2luKCd0YnRjJykud2FsbGV0cygpLmdldFdhbGxldCh7IGlkOiBUZXN0Qml0R28uVjIuVEVTVF9XQUxMRVQyX1VOU1BFTlRTX0lEIH0pLFxuICAgICAgICBzd2VlcDFXYWxsZXQ6IHRoaXMuY29pbigndGJ0YycpLndhbGxldHMoKS5nZXRXYWxsZXQoeyBpZDogVGVzdEJpdEdvLlYyLlRFU1RfU1dFRVAxX0lEIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNwZW5kYWJsZUJhbGFuY2UgPSBodGV0aFdhbGxldC5zcGVuZGFibGVCYWxhbmNlU3RyaW5nO1xuXG4gICAgICBsZXQgYmFsYW5jZSA9IG5ldyBCaWdOdW1iZXIoc3BlbmRhYmxlQmFsYW5jZSk7XG5cbiAgICAgIC8vIENoZWNrIG91ciBiYWxhbmNlIGlzIG92ZXIgNjAwMDAgKHdlIHNwZW5kIDUwMDAwLCBhZGQgc29tZSBjdXNoaW9uKVxuICAgICAgaWYgKGJhbGFuY2UubHQoNjAwMDApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIEhURVRIIHdhbGxldCAke3Rlc3RXYWxsZXRJZH0gZG9lcyBub3QgaGF2ZSBlbm91Z2ggZnVuZHMgdG8gcnVuIHRoZSB0ZXN0IHN1aXRlLiBUaGUgY3VycmVudCBiYWxhbmNlIGlzICR7YmFsYW5jZX0uIFBsZWFzZSBmdW5kIHRoaXMgd2FsbGV0IWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgd2UgaGF2ZSBlbm91Z2ggaW4gdGhlIHdhbGxldCB0byBydW4gdGVzdCBzdWl0ZVxuICAgICAgdGJ0Y1dhbGxldC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnc3BlbmRhYmxlQmFsYW5jZVN0cmluZycpO1xuICAgICAgYmFsYW5jZSA9IG5ldyBCaWdOdW1iZXIodGJ0Y1dhbGxldC5zcGVuZGFibGVCYWxhbmNlU3RyaW5nKCkpO1xuXG4gICAgICAvLyBDaGVjayBvdXIgYmFsYW5jZSBpcyBvdmVyIDAuMDUgdEJUQyAod2Ugc3BlbmQgMC4wNCwgYWRkIHNvbWUgY3VzaGlvbilcbiAgICAgIGxldCBtaW5pbXVtQmFsYW5jZSA9IDAuMDUgKiAxZTg7XG4gICAgICBpZiAoYmFsYW5jZS5sdChtaW5pbXVtQmFsYW5jZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgVEJUQyB3YWxsZXQgJHt0YnRjV2FsbGV0LmlkKCl9IGRvZXMgbm90IGhhdmUgZW5vdWdoIGZ1bmRzIHRvIHJ1biB0aGUgdGVzdCBzdWl0ZS4gVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyAke2JhbGFuY2V9LiBQbGVhc2UgZnVuZCB0aGlzIHdhbGxldCFgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHdlIGhhdmUgZW5vdWdoIGluIHRoZSB3YWxsZXQgdG8gcnVuIHRlc3Qgc3VpdGVcbiAgICAgIHVuc3BlbnRXYWxsZXQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3NwZW5kYWJsZUJhbGFuY2VTdHJpbmcnKTtcbiAgICAgIGJhbGFuY2UgPSBuZXcgQmlnTnVtYmVyKHVuc3BlbnRXYWxsZXQuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpKTtcblxuICAgICAgLy8gQ2hlY2sgb3VyIGJhbGFuY2UgaXMgb3ZlciAwLjA1IHRCVEMgKHdlIHNwZW5kIDAuMDQsIGFkZCBzb21lIGN1c2hpb24pXG4gICAgICBtaW5pbXVtQmFsYW5jZSA9IDAuMDUgKiAxZTg7XG4gICAgICBpZiAoYmFsYW5jZS5sdChtaW5pbXVtQmFsYW5jZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgVEJUQyB3YWxsZXQgJHt1bnNwZW50V2FsbGV0LmlkKCl9IGRvZXMgbm90IGhhdmUgZW5vdWdoIGZ1bmRzIHRvIHJ1biB0aGUgdGVzdCBzdWl0ZS4gVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyAke2JhbGFuY2V9LiBQbGVhc2UgZnVuZCB0aGlzIHdhbGxldCFgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHdlIGhhdmUgZW5vdWdoIGluIHRoZSB3YWxsZXQgdG8gcnVuIHRlc3Qgc3VpdGVcbiAgICAgIHN3ZWVwMVdhbGxldC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnc3BlbmRhYmxlQmFsYW5jZVN0cmluZycpO1xuICAgICAgYmFsYW5jZSA9IG5ldyBCaWdOdW1iZXIoc3dlZXAxV2FsbGV0LnNwZW5kYWJsZUJhbGFuY2VTdHJpbmcoKSk7XG5cbiAgICAgIC8vIFNpbmNlIHdlIHdpbGwgbG9zZSBvdXIgdW5zcGVudHMgdmFsdWUgdG8gZmVlcywgbWFrZSBzdXJlIHRoZXJlIGlzIGEgbGFyZ2UgZW5vdWdoIGJhbGFuY2UgdG8gY29udGludWVcbiAgICAgIG1pbmltdW1CYWxhbmNlID0gMC4wNSAqIDFlODtcblxuICAgICAgaWYgKGJhbGFuY2UubHQobWluaW11bUJhbGFuY2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIFRCVEMgd2FsbGV0ICR7c3dlZXAxV2FsbGV0LmlkKCl9IGRvZXMgbm90IGhhdmUgZW5vdWdoIGZ1bmRzIHRvIHJ1biB0aGUgdGVzdCBzdWl0ZS4gVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyAke2JhbGFuY2V9LiBQbGVhc2UgZnVuZCB0aGlzIHdhbGxldCFgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIEJpdEdvLnByb3RvdHlwZS5ub2NrRXRoV2FsbGV0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgICAgaWQ6ICc1OThmNjA2Y2Q4ZmMyNDcxMGQyZWJhZGIxZDk0NTliYicsXG4gICAgICAgIHVzZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlcjogJzU0M2MxMWVkMzU2ZDAwY2I3NjAwMDAwYjk4Nzk0NTAzJyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbT2JqZWN0XSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBjb2luOiAnaHRldGgnLFxuICAgICAgICBsYWJlbDogJ215IHRlc3QgZXRoZXIgd2FsbGV0JyxcbiAgICAgICAgbTogMixcbiAgICAgICAgbjogMyxcbiAgICAgICAga2V5czogW1xuICAgICAgICAgICc1OThmNjA2Y2Q4ZmMyNDcxMGQyZWJhZDg5ZGNlODZjMicsXG4gICAgICAgICAgJzU5OGY2MDZjYzhlNDNhZWYwOWZjYjc4NTIyMWQ5ZGQyJyxcbiAgICAgICAgICAnNTkzNWQ1OWNmNjYwNzY0MzMxYmFmY2FkZTE4NTVmZDcnLFxuICAgICAgICBdLFxuICAgICAgICB0YWdzOiBbJzU5OGY2MDZjZDhmYzI0NzEwZDJlYmFkYjFkOTQ1OWJiJ10sXG4gICAgICAgIGRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnM6IGZhbHNlLFxuICAgICAgICBmcmVlemU6IHt9LFxuICAgICAgICBkZWxldGVkOiBmYWxzZSxcbiAgICAgICAgYXBwcm92YWxzUmVxdWlyZWQ6IDEsXG4gICAgICAgIGlzQ29sZDogZmFsc2UsXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIGRlcGxveWVkSW5CbG9jazogZmFsc2UsXG4gICAgICAgICAgZGVwbG95VHhIYXNoOiAnMHg0MTNlZDI3YTljZGQzNDFhNDc0MmJhZmYxMzk4NGU5ZDRlZTI2MmVjMGVkYmNhOTJiOTg3MmZiNGUxOGY1MTA2JyxcbiAgICAgICAgICBsYXN0Q2hhaW5JbmRleDogeyAwOiA3MDEsIDE6IC0xIH0sXG4gICAgICAgICAgYmFzZUFkZHJlc3M6ICcweGRmMDcxMTc3MDVhOWY4ZGM0YzJhNzhkZTY2YjdmMTc5N2RiYTlkNGUnLFxuICAgICAgICAgIHBlbmRpbmdDaGFpbkluaXRpYWxpemF0aW9uOiBmYWxzZSxcbiAgICAgICAgICBjcmVhdGlvbkZhaWx1cmU6IFtdLFxuICAgICAgICB9LFxuICAgICAgICBhZG1pbjoge1xuICAgICAgICAgIHBvbGljeToge1xuICAgICAgICAgICAgaWQ6ICc1OThmNjA2Y2Q4ZmMyNDcxMGQyZWJhZGRhNGI5NTVmYicsXG4gICAgICAgICAgICB2ZXJzaW9uOiAwLFxuICAgICAgICAgICAgZGF0ZTogJzIwMTctMDgtMTJUMjA6MDk6MTYuNDcyWicsXG4gICAgICAgICAgICBydWxlczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgY2xpZW50RmxhZ3M6IFtdLFxuICAgICAgICBhbGxvd0JhY2t1cEtleVNpZ25pbmc6IGZhbHNlLFxuICAgICAgICBiYWxhbmNlU3RyaW5nOiAnMTAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICBjb25maXJtZWRCYWxhbmNlU3RyaW5nOiAnMTAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nOiAnMTAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICByZWNlaXZlQWRkcmVzczoge1xuICAgICAgICAgIGlkOiAnNWE4NDUzYzIzZmQwNzViOTA3NTc0MzM4YTg3OGY0ZmInLFxuICAgICAgICAgIGFkZHJlc3M6ICcweGE3ZjljYTVjMTI2OGIwMDgyZGIxODMzZDMwZjMzZDNjZmQ0Mjg2ZDgnLFxuICAgICAgICAgIGNoYWluOiAwLFxuICAgICAgICAgIGluZGV4OiA3MDEsXG4gICAgICAgICAgY29pbjogJ2h0ZXRoJyxcbiAgICAgICAgICBsYXN0Tm9uY2U6IDAsXG4gICAgICAgICAgd2FsbGV0OiAnNTk4ZjYwNmNkOGZjMjQ3MTBkMmViYWRiMWQ5NDU5YmInLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgbm9uY2U6IC0xLFxuICAgICAgICAgICAgdXBkYXRlVGltZTogJzIwMTgtMDItMTRUMTU6MjA6MzQuMTg4WicsXG4gICAgICAgICAgICB0eENvdW50OiAwLFxuICAgICAgICAgICAgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb246IGZhbHNlLFxuICAgICAgICAgICAgY3JlYXRpb25GYWlsdXJlOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwZW5kaW5nQXBwcm92YWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQodGhpcywgdGhpcy5jb2luKCdodGV0aCcpLCB3YWxsZXREYXRhKTtcblxuICAgICAgLy8gTm9jayBjYWxscyB0byBwbGF0Zm9ybSBmb3IgYnVpbGRpbmcgdHJhbnNhY3Rpb25zIGFuZCBnZXR0aW5nIHVzZXIga2V5XG4gICAgICAvLyBTaG91bGQgYmUgT0sgdG8gcGVyc2lzdCB0aGVzZSBzaW5jZSB0aGV5IGFyZSB3YWxsZXQgc3BlY2lmaWMgZGF0YSByZWFkc1xuICAgICAgbm9jayh0aGlzLl9iYXNlVXJsKVxuICAgICAgICAucGVyc2lzdCgpXG4gICAgICAgIC5maWx0ZXJpbmdSZXF1ZXN0Qm9keSgoKSA9PiAnKicpXG4gICAgICAgIC5wb3N0KGAvYXBpL3YyL2h0ZXRoL3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9idWlsZGAsICcqJylcbiAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgICAgZ2FzUHJpY2U6IDIwMDAwMDAwMDAwLFxuICAgICAgICAgIG5leHRDb250cmFjdFNlcXVlbmNlSWQ6IDEwMSxcbiAgICAgICAgfSlcbiAgICAgICAgLmdldChgL2FwaS92Mi9odGV0aC9rZXkvJHt3YWxsZXQua2V5SWRzKClbS2V5SW5kaWNlcy5VU0VSXX1gKVxuICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAgaWQ6ICc1OThmNjA2Y2Q4ZmMyNDcxMGQyZWJhZDg5ZGNlODZjMicsXG4gICAgICAgICAgdXNlcnM6IFsnNTQzYzExZWQzNTZkMDBjYjc2MDAwMDBiOTg3OTQ1MDMnXSxcbiAgICAgICAgICBwdWI6ICd4cHViNjYxTXlNd0FxUmJjRlhEY1dEMnZ4dWViY1QxWnBURjRWa2U2cW1NVzh5emRkd05ZcEFQanZZRUVMNWpMZnlZWFcyZnV4dEF4WThUZ2pQVUpMY2YxQzhxejlONlZnWnhBcktYNEV3QjhySDUnLFxuICAgICAgICAgIGV0aEFkZHJlc3M6ICcweDI2YTE2M2JhOTczOTUyOTcyMGMwOTE0YzU4Mzg2NWRlYzBkMzcyNzgnLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjpcbiAgICAgICAgICAgICd7XCJpdlwiOlwiMTVGc2JEVkkxekc5T2dnRDhZWCtIZz09XCIsXCJ2XCI6MSxcIml0ZXJcIjoxMDAwMCxcImtzXCI6MjU2LFwidHNcIjo2NCxcIm1vZGVcIjpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcImhIYk5IM1N6L2FVPVwiLFwiY3RcIjpcIldvTlZLejdhZmlSeFhJMncvWWt6TWRNeW9RZy9CMTV1MVE4YVFnaTk2akpaOXdrNlRJYVNFYzZiWEZIM0FIekQ5TWRKQ1dKUVVwUmhvUWMvcmd5dGNuNjlzY1BUaktlZXlWTUVsR0N4WmRGVlMvcHNRY05FK2x1ZTMvLzJabHhqKzZ0MU5rdllPKzh5QWV6U01SQks1T2RmdFhFak5RST1cIn0nLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICd0b2tlbmJhbGFuY2UnLFxuICAgICAgICBjb250cmFjdGFkZHJlc3M6IFRlc3RCaXRHby5WMi5URVNUX0VSQzIwX1RPS0VOX0FERFJFU1MsXG4gICAgICAgIGFkZHJlc3M6IFRlc3RCaXRHby5WMi5URVNUX0VUSF9XQUxMRVRfRklSU1RfQUREUkVTUyxcbiAgICAgICAgdGFnOiAnbGF0ZXN0JyxcbiAgICAgIH07XG4gICAgICBpZiAoY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5ldGhlcnNjYW5BcGlUb2tlbikge1xuICAgICAgICBwYXJhbXMuYXBpa2V5ID0gY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5ldGhlcnNjYW5BcGlUb2tlbjtcbiAgICAgIH1cblxuICAgICAgLy8gTm9jayB0b2tlbnMgc3R1Y2sgb24gdGhlIHdhbGxldFxuICAgICAgbm9jaygnaHR0cHM6Ly9hcGktaG9sZXNreS5ldGhlcnNjYW4uaW8nKVxuICAgICAgICAuZ2V0KCcvYXBpJylcbiAgICAgICAgLnF1ZXJ5KHBhcmFtcylcbiAgICAgICAgLnJlcGx5KDIwMCwgeyBzdGF0dXM6ICcxJywgbWVzc2FnZTogJ09LJywgcmVzdWx0OiAnMjQwMCcgfSk7XG5cbiAgICAgIHJldHVybiB3YWxsZXQ7XG4gICAgfTtcblxuICAgIEJpdEdvLnByb3RvdHlwZS5zYWZlUmVnaXN0ZXIgPSBmdW5jdGlvbiAoY29pbiwgY29pbkNvbnN0cnVjdG9yKSB7XG4gICAgICBpZiAodGhpcy5yZWdpc3Rlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXIoY29pbiwgY29pbkNvbnN0cnVjdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gcmVnaXN0ZXIgZG9lcyBub3QgZXhpc3QnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgQml0R29BUEkucHJvdG90eXBlLmZldGNoQ29uc3RhbnRzID0gZnVuY3Rpb24gKHRoaXM6IGFueSkge1xuICAgICAgbm9jayh0aGlzLl9iYXNlVXJsKVxuICAgICAgICAuZ2V0KCcvYXBpL3YxL2NsaWVudC9jb25zdGFudHMnKVxuICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAgdHRsOiAzNjAwLFxuICAgICAgICAgIGNvbnN0YW50czoge1xuICAgICAgICAgICAgbXBjOiB7XG4gICAgICAgICAgICAgIGJpdGdvUHVibGljS2V5OlxuICAgICAgICAgICAgICAgICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXHJcXG5cXHJcXG54azhFWXFFVTVoTUZLNEVFQUFvQ0F3UURkYkFJWnJzYmxFWElhdnlnMmdvNnA5b0cwU3FXVGdGc2RIVGNcXHJcXG5CaHFkSVMvV2pROHBqNzVxK3ZMcUZ0VjlobEltWUdJbnNJV2g5N2ZzaWd6QjJvd3l6UmhvYzIwZ1BHaHpcXHJcXG5iVUIwWlhOMExtSnBkR2R2TG1OdmJUN0NoQVFURXdnQUZRVUNZcUVVNXdJTENRSVZDQUlXQUFJYkF3SWVcXHJcXG5BUUFoQ1JDSk5Sc0lER3VuZXhZaEJIUkw1RC84blJNM29wUW5Yb2sxR3dnTWE2ZDd0ZzhBLzI0QTlhd3FcXHJcXG5TQ0p4N1JkZGlVekZIY0toVnZ2bzNSNU43YkhhT0dQM1RQNzlBUDBUYXZGMld6aFVYbVpTanQzSUsyM09cXHJcXG43L2FrbmJpalZlcTUyZ2hiV2IxU3dzSjFCQkFUQ0FBR0JRSmlvUlRuQUNFSkVBV3VBMzVLSmd0Z0ZpRUVcXHJcXG5adHRMUFIwS2NZdmpndkpDQmE0RGZrb21DMkJzcndEL1orNDN6T3crV3BmUEh4ZSt5cHlWb2c1Zm5PS2xcXHJcXG5Yd2xlSDZ6RHZxVVdtV2tBL2lhSEM2dWxsWWtTRzRNdjY4azZxYnRnUi9wbXMvWDdya2ZhMFFRRkp5NXBcXHJcXG56bE1FWXFFVTVoSUZLNEVFQUFvQ0F3U3NMcW1mb25qTUYzbzBuWjVKSHZMcG1mVEExUklWRHNBRW9ST05cXHJcXG50WkE2ckFBMjNwR2w2czNJeXQ0L2ZYOUFkem9oM0VFbE9qTXNnaThBajNkRnB1cWlBd0VJQjhKNEJCZ1RcXHJcXG5DQUFKQlFKaW9SVG5BaHNNQUNFSkVJazFHd2dNYTZkN0ZpRUVkRXZrUC95ZEV6ZWlsQ2RlaVRVYkNBeHJcXHJcXG5wM3ZNN0FEOUdQcDZIaFlORWgyVlZDRHRGU3QxNEJuaTVGVk01aWNwVkRvNnc5aWJ2V0FBLzJUaTNKdjRcXHJcXG5JaEl4bDgxL3dxQWdxaWdJYmxyejZ2anRhZ3I5L3lrWFFDVzNcXHJcXG49c2tDb1xcclxcbi0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXHJcXG4nLFxuICAgICAgICAgICAgICBiaXRnb05pdHJvUHVibGljS2V5OlxuICAgICAgICAgICAgICAgICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXHJcXG5cXHJcXG54azhFWXFFVTVoTUZLNEVFQUFvQ0F3UURkYkFJWnJzYmxFWElhdnlnMmdvNnA5b0cwU3FXVGdGc2RIVGNcXHJcXG5CaHFkSVMvV2pROHBqNzVxK3ZMcUZ0VjlobEltWUdJbnNJV2g5N2ZzaWd6QjJvd3l6UmhvYzIwZ1BHaHpcXHJcXG5iVUIwWlhOMExtSnBkR2R2TG1OdmJUN0NoQVFURXdnQUZRVUNZcUVVNXdJTENRSVZDQUlXQUFJYkF3SWVcXHJcXG5BUUFoQ1JDSk5Sc0lER3VuZXhZaEJIUkw1RC84blJNM29wUW5Yb2sxR3dnTWE2ZDd0ZzhBLzI0QTlhd3FcXHJcXG5TQ0p4N1JkZGlVekZIY0toVnZ2bzNSNU43YkhhT0dQM1RQNzlBUDBUYXZGMld6aFVYbVpTanQzSUsyM09cXHJcXG43L2FrbmJpalZlcTUyZ2hiV2IxU3dzSjFCQkFUQ0FBR0JRSmlvUlRuQUNFSkVBV3VBMzVLSmd0Z0ZpRUVcXHJcXG5adHRMUFIwS2NZdmpndkpDQmE0RGZrb21DMkJzcndEL1orNDN6T3crV3BmUEh4ZSt5cHlWb2c1Zm5PS2xcXHJcXG5Yd2xlSDZ6RHZxVVdtV2tBL2lhSEM2dWxsWWtTRzRNdjY4azZxYnRnUi9wbXMvWDdya2ZhMFFRRkp5NXBcXHJcXG56bE1FWXFFVTVoSUZLNEVFQUFvQ0F3U3NMcW1mb25qTUYzbzBuWjVKSHZMcG1mVEExUklWRHNBRW9ST05cXHJcXG50WkE2ckFBMjNwR2w2czNJeXQ0L2ZYOUFkem9oM0VFbE9qTXNnaThBajNkRnB1cWlBd0VJQjhKNEJCZ1RcXHJcXG5DQUFKQlFKaW9SVG5BaHNNQUNFSkVJazFHd2dNYTZkN0ZpRUVkRXZrUC95ZEV6ZWlsQ2RlaVRVYkNBeHJcXHJcXG5wM3ZNN0FEOUdQcDZIaFlORWgyVlZDRHRGU3QxNEJuaTVGVk01aWNwVkRvNnc5aWJ2V0FBLzJUaTNKdjRcXHJcXG5JaEl4bDgxL3dxQWdxaWdJYmxyejZ2anRhZ3I5L3lrWFFDVzNcXHJcXG49c2tDb1xcclxcbi0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXHJcXG4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgLy8gZm9yY2UgY2xpZW50IGNvbnN0YW50cyByZWxvYWRcbiAgICAgIEJpdEdvQVBJWydfY29uc3RhbnRzJ10gPSB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbEZldGNoQ29uc3RhbnRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyBhcyBhbnkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IF9iaXRnbyhhcmdzKSBhcyBVO1xuICB9XG59XG4iXX0=

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


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