PHP WebShell

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

Просмотр файла: sui.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 sdk_test_1 = require("@bitgo/sdk-test");
const sdk_api_1 = require("@bitgo/sdk-api");
const src_1 = require("../../src");
const testData = __importStar(require("../resources/sui"));
const lodash_1 = __importDefault(require("lodash"));
const sinon_1 = __importDefault(require("sinon"));
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const assert_1 = __importDefault(require("assert"));
const iface_1 = require("../../src/lib/iface");
const getBuilderFactory_1 = require("./getBuilderFactory");
const sui_1 = require("../resources/sui");
const buffer_1 = require("buffer");
describe('SUI:', function () {
    let bitgo;
    let basecoin;
    let newTxPrebuild;
    let newTxParams;
    const txPrebuild = {
        txHex: buffer_1.Buffer.from(testData.TRANSFER, 'base64').toString('hex'),
        txInfo: {},
    };
    const txParams = {
        recipients: testData.recipients,
    };
    before(function () {
        bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
        bitgo.safeRegister('sui', src_1.Sui.createInstance);
        bitgo.safeRegister('tsui', src_1.Tsui.createInstance);
        bitgo.initializeTestVars();
        basecoin = bitgo.coin('tsui');
        newTxPrebuild = () => {
            return lodash_1.default.cloneDeep(txPrebuild);
        };
        newTxParams = () => {
            return lodash_1.default.cloneDeep(txParams);
        };
    });
    it('should return the right info', function () {
        const sui = bitgo.coin('sui');
        const tsui = bitgo.coin('tsui');
        sui.getChain().should.equal('sui');
        sui.getFamily().should.equal('sui');
        sui.getFullName().should.equal('Sui');
        sui.getBaseFactor().should.equal(1e9);
        tsui.getChain().should.equal('tsui');
        tsui.getFamily().should.equal('sui');
        tsui.getFullName().should.equal('Testnet Sui');
        tsui.getBaseFactor().should.equal(1e9);
    });
    describe('Verify transaction: ', () => {
        it('should succeed to verify transaction', async function () {
            const txPrebuild = newTxPrebuild();
            const txParams = newTxParams();
            const verification = {};
            const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
            isTransactionVerified.should.equal(true);
        });
        it('should succeed to verify transaction when recipients amount are numbers', async function () {
            const txPrebuild = newTxPrebuild();
            const txParamsWithNumberAmounts = newTxParams();
            txParamsWithNumberAmounts.recipients = txParamsWithNumberAmounts.recipients.map(({ address, amount }) => {
                return { address, amount: Number(amount) };
            });
            const verification = {};
            const isTransactionVerified = await basecoin.verifyTransaction({
                txParams: txParamsWithNumberAmounts,
                txPrebuild,
                verification,
            });
            isTransactionVerified.should.equal(true);
        });
        it('should fail to verify transaction with invalid param', async function () {
            const txPrebuild = {};
            const txParams = newTxParams();
            txParams.recipients = undefined;
            await basecoin
                .verifyTransaction({
                txParams,
                txPrebuild,
            })
                .should.rejectedWith('missing required tx prebuild property txHex');
        });
        it('should verify a split transaction', async function () {
            const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsui');
            const txBuilder = factory.getTransferBuilder();
            txBuilder.type(iface_1.SuiTransactionType.Transfer);
            txBuilder.sender(testData.sender.address);
            const amount = 1000000000;
            const recipients = new Array(100).fill({ address: testData.sender.address, amount: amount.toString() });
            txBuilder.send(recipients);
            txBuilder.gasData(testData.gasData);
            const tx = await txBuilder.build();
            const txPrebuild = {
                txHex: buffer_1.Buffer.from(tx.toBroadcastFormat(), 'base64').toString('hex'),
                txInfo: {},
            };
            const txParams = {
                recipients,
            };
            const verify = await basecoin.verifyTransaction({
                txParams,
                txPrebuild,
            });
            verify.should.equal(true);
        });
    });
    describe('Explain Transaction: ', () => {
        it('should explain a transfer transaction', async function () {
            const explainedTransaction = await basecoin.explainTransaction({
                txHex: buffer_1.Buffer.from(testData.TRANSFER, 'base64').toString('hex'),
            });
            explainedTransaction.should.deepEqual({
                displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
                id: 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR',
                outputs: [
                    {
                        address: testData.recipients[0].address,
                        amount: testData.recipients[0].amount,
                    },
                    {
                        address: testData.recipients[1].address,
                        amount: testData.recipients[1].amount,
                    },
                ],
                outputAmount: `${testData.AMOUNT * 2}`,
                changeOutputs: [],
                changeAmount: '0',
                fee: { fee: testData.gasData.budget.toString() },
                type: 0,
            });
        });
        it('should explain a split transfer transaction', async function () {
            const explainedTransaction = await basecoin.explainTransaction({
                txHex: '000065000800ca9a3b000000000020574895fe83b409b009e2e0433ad1823ec0d538af7fea52390a198bdfe7676f13000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000000800ca9a3b00000000c801020001010000010102000001010002000101020001010202000101000200010103000101020400010100020001010400010102060001010002000101050001010208000101000200010106000101020a000101000200010107000101020c000101000200010108000101020e000101000200010109000101021000010100020001010a000101021200010100020001010b000101021400010100020001010c000101021600010100020001010d000101021800010100020001010e000101021a00010100020001010f000101021c000101000200010110000101021e00010100020001011100010102200001010002000101120001010222000101000200010113000101022400010100020001011400010102260001010002000101150001010228000101000200010116000101022a000101000200010117000101022c000101000200010118000101022e000101000200010119000101023000010100020001011a000101023200010100020001011b000101023400010100020001011c000101023600010100020001011d000101023800010100020001011e000101023a00010100020001011f000101023c000101000200010120000101023e00010100020001012100010102400001010002000101220001010242000101000200010123000101024400010100020001012400010102460001010002000101250001010248000101000200010126000101024a000101000200010127000101024c000101000200010128000101024e000101000200010129000101025000010100020001012a000101025200010100020001012b000101025400010100020001012c000101025600010100020001012d000101025800010100020001012e000101025a00010100020001012f000101025c000101000200010130000101025e00010100020001013100010102600001010002000101320001010262000101000200010133000101026400010100020001013400010102660001010002000101350001010268000101000200010136000101026a000101000200010137000101026c000101000200010138000101026e000101000200010139000101027000010100020001013a000101027200010100020001013b000101027400010100020001013c000101027600010100020001013d000101027800010100020001013e000101027a00010100020001013f000101027c000101000200010140000101027e00010100020001014100010102800001010002000101420001010282000101000200010143000101028400010100020001014400010102860001010002000101450001010288000101000200010146000101028a000101000200010147000101028c000101000200010148000101028e000101000200010149000101029000010100020001014a000101029200010100020001014b000101029400010100020001014c000101029600010100020001014d000101029800010100020001014e000101029a00010100020001014f000101029c000101000200010150000101029e00010100020001015100010102a000010100020001015200010102a200010100020001015300010102a400010100020001015400010102a600010100020001015500010102a800010100020001015600010102aa00010100020001015700010102ac00010100020001015800010102ae00010100020001015900010102b000010100020001015a00010102b200010100020001015b00010102b400010100020001015c00010102b600010100020001015d00010102b800010100020001015e00010102ba00010100020001015f00010102bc00010100020001016000010102be00010100020001016100010102c000010100020001016200010102c200010100020001016300010102c400010100020001016400010102c600010100574895fe83b409b009e2e0433ad1823ec0d538af7fea52390a198bdfe7676f1303034f403ff9b73b5794b79a89ebbcd810331fea52878db0b4dc1a1c88f4c0dc5616000000000000002003caf7e677c72b241d61d00e600b6df25639c582987d0aa78ceea0b9953eac52a60b0e51f9ffa398f6ee1d3101d6c9efa13d1800e412d7e0832e2616f1793fd79ce91700000000002050435a49f0635bc2f2c3bbdce05a16b24faf0368edaa25c8fbce16ef62602da5cda44ae47f380f45d3cd4911880f4e9a24b52fe424683c66cf3c7769dd3ca22c1000000000000000200c78fa20236bb86871eacfe2b4f2158eaa68f4f4565d8cf9865ee9f279e4bd40574895fe83b409b009e2e0433ad1823ec0d538af7fea52390a198bdfe7676f13e80300000000000000e1f5050000000000',
            });
            explainedTransaction.outputs.length.should.equal(100);
        });
        it('should explain a staking transaction', async function () {
            const explainedTransaction = await basecoin.explainTransaction({
                txHex: buffer_1.Buffer.from(testData.ADD_STAKE, 'base64').toString('hex'),
            });
            explainedTransaction.should.deepEqual({
                displayOrder: [
                    'id',
                    'outputs',
                    'outputAmount',
                    'changeOutputs',
                    'changeAmount',
                    'fee',
                    'type',
                    'module',
                    'function',
                    'validatorAddress',
                ],
                id: 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh',
                outputs: [
                    {
                        address: testData.requestAddStake.validatorAddress,
                        amount: testData.requestAddStake.amount.toString(),
                    },
                ],
                outputAmount: testData.STAKING_AMOUNT.toString(),
                changeOutputs: [],
                changeAmount: '0',
                fee: { fee: testData.gasData.budget.toString() },
                type: 25,
            });
        });
        it('should fail to explain transaction with missing params', async function () {
            try {
                await basecoin.explainTransaction({});
            }
            catch (error) {
                should_1.default.equal(error.message, 'Invalid transaction');
            }
        });
        it('should fail to explain transaction with invalid params', async function () {
            try {
                await basecoin.explainTransaction({ txHex: 'randomString' });
            }
            catch (error) {
                should_1.default.equal(error.message, 'Invalid transaction');
            }
        });
    });
    describe('Parse Transactions: ', () => {
        const transferInputsResponse = [
            {
                address: testData.recipients[0].address,
                amount: new bignumber_js_1.default(testData.AMOUNT).plus(testData.AMOUNT).plus(testData.gasData.budget).toFixed(),
            },
        ];
        const transferOutputsResponse = [
            {
                address: testData.recipients[0].address,
                amount: testData.recipients[0].amount,
            },
            {
                address: testData.recipients[1].address,
                amount: testData.recipients[1].amount,
            },
        ];
        it('should parse a transfer transaction', async function () {
            const parsedTransaction = await basecoin.parseTransaction({
                txHex: buffer_1.Buffer.from(testData.TRANSFER, 'base64').toString('hex'),
            });
            parsedTransaction.should.deepEqual({
                inputs: transferInputsResponse,
                outputs: transferOutputsResponse,
                fee: new bignumber_js_1.default(20000000),
            });
        });
        it('should fail to parse a transfer transaction when explainTransaction response is undefined', async function () {
            const stub = sinon_1.default.stub(src_1.Sui.prototype, 'explainTransaction');
            stub.resolves(undefined);
            await basecoin.parseTransaction({ txHex: testData.TRANSFER }).should.be.rejectedWith('Invalid transaction');
            stub.restore();
        });
    });
    describe('Address Validation', () => {
        let keychains;
        let commonKeychain;
        before(function () {
            commonKeychain =
                '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781';
            keychains = [
                {
                    id: '6424c353eaf78d000766e95949868468',
                    source: 'user',
                    type: 'tss',
                    commonKeychain: '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781',
                    encryptedPrv: '{"iv":"cZd5i7L4RxtwrALW2rK7UA==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"5zgoH1Bd3Fw=","ct":"9vVlnXFRtrM9FVEo+d2chbGHlM9lFZemueBuAs3BIkPo33Fo7jzwwNK/kIWkEyg+NmEBd5IaqAS157nvvvwzzsmMWlQdUz9qbmXNv3pg987cXFR08exS+4uhwP1YNOjJTRvRNcO9ZqHb46d4fmyJ/yC9/susCge7r/EsbaN5C3afv1dzybuq912FwaQElZLYYp5BICudFOMZ9k0UDMfKM/PMDkH7WexoGHr9GKq/bgCH2B39TZZyHKU6Uy47lXep2s6h0DrMwHOrnmiL3DZjOj88Ynvphlzxuo4eOlD2UHia2+nvIaISYs29Pr0DAvREutchvcBpExj1kWWPv7hQYrv8F0NAdatsbWl3w+xKyfiMKo1USlrwyJviypGtQtXOJyw0XPN0rv2+L5lW8BbjpzHfYYN13fJTedlGTFhhkzVtbbPAKE02kx7zCJcjYaiexdSTsrDLScYNT9/Jhdt27KpsooehwVohLfSKz4vbFfRu2MPZw3/+c/hfiJNgtz6esWbnxGrcE8U2IwPYCaK+Ghk4DcqWNIni59RI5B5kAsQOToII40qPN510uTgxBSPO7q7MHgkxdd4CqBq+ojr9j0P7oao8E5Y+CBDJrojDoCh1oCCDW9vo2dXlVcD8SIbw7U/9AfvEbA4xyE/5md1M7CIwLnWs2Ynv0YtaKoqhdS9x6FmHlMDhN/DKHinrwmowtrTT82fOkpO5g9saSmgU7Qy3gLt8t+VwdEyeFeQUKRSyci8qgqXQaZIg4+aXgaSOnlCFMtmB8ekYxEhTY5uzRfrNgS4s1QeqFBpNtUF+Ydi297pbVXnJoXAN+SVWd80GCx+yI2dpVC89k3rOWK9WeyqlnzuLJWp2RIOB9cdW8GFv/fN+QAJpYeVxOE4+nZDsKnsj8nKcg9t4Dlx1G6gLM1/Vq9YxNLbuzuRC0asUYvdMnoMvszmpm++TxndYisgNYscpZSoz7wvcazJNEPfhPVjEkd6tUUuN4GM35H0DmKCUQNT+a6B6hmHlTZvjxiyGAg5bY59hdjvJ+22QduazlEEC6LI3HrA7uK0TpplWzS1tCIFvTMUhj65DEZmNJ2+ZY9bQ4vsMf+DRR3OOG4t+DMlNfjOd3zNv3QoY95BjfWpryFwPzDq7bCP67JDsoj7j2TY5FRSrRkD77H0Ewlux2cWfjRTwcMHcdQxxuV0OP0aNjGDjybFN"}',
                },
                {
                    id: '6424c353eaf78d000766e96137d4404b',
                    source: 'backup',
                    type: 'tss',
                    commonKeychain: '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781',
                    encryptedPrv: '{"iv":"vi0dPef/Rx7kG/pRySQi6Q==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"9efhQsiEvVs=","ct":"Gw6atvf6gxKzsjtl3xseipO3rAxp1mAz7Yu1ihFsi5/lf2vMZegApgZx+pyILFS9KKLHbNF3U6WgSYdrr2t4vzdLsXkH1WIxfHS+cd2C5N59yADZDnPJBT6pv/IRvaYelP0Ck3nIYQ2hSMm8op+VOWC/SzHeh7slYDqwEHTGan0Wigfvk1yRd7CCJTaEAomnc/4eFi2NY3X3gt/3opy9IAgknnwUFohn96EWpEQ0F6pbzH/Z8VF6gF+DUcrrByAxExUPnHQZiFk3YHU/vVV4FxBU/mVAE8xBsBn5ul5e5SUMPfc7TBuJWv4BByTNg9xDShF/91Yx2nbfUm5d9QmM8lpKgzzQvcK8POAPk87gRCuKnsGh5vNS0UppkHc+ocfzRQlGA6jze7QyyQO0rMj5Ly8kWjwk2vISvKYHYS1NR7VU549UIXo7NXjatunKSc3+IreoRUHIshiaLg6hl+pxCCuc0qQ43V0mdIfCjTN8gkGWLNk8R7tAGPz9jyapQPcPEGHgEz0ATIi6yMNWCsibS2eLiE1uVEJONoM4lk6FPl3Q2CHbW2MeEbqjY8hbaw18mNb2xSBH/Fwpiial+Tvi2imqgnCO4ZpO9bllKftZPcQy0stN+eGBlb5ufyflKkDSiChHYroGjEpmiFicdde48cJszF52uKNnf1q67fA9/S2FAHQab3EXojxH2Gbk+kkV2h/TYKFFZSWC3vi4e8mO+vjMUcR0AdsgPFyEIz0SCGuba3CnTLNdEuZwsauAeHkx2vUTnRgJPVgNeeuXmsVG76Sy2ggJHuals0Hj8U2Xda0qO1RuFfoCWfss9wn6HGRwPPkhSB/8oNguAqmRVGKkd8Zwt3IvrTd9fk0/rFFDJKGz7WyNHkYgUmNiGcItD12v0jx7FZ52EJzl3Av1RyJUQK18+8EYPh3SGiU9dt7VX0aF0uo6JouKhOeldUvMP+AugQz8fUclwTQsbboVg27Yxo0DyATVwThW5a56R6Qf5ZiQJluFuzs5y98rq0S5q046lE6o3vVmJpEdwjeSCJoET5CL4nTgkXyWvhm4eB8u/e66l3o0qbaSx8q9YYmT9EpRcl5TP4ThLBKETYdzVvg4exjQfektMatk5EyUpEIhZPXh5vXpJZesdfO9LJ8zTaHBsBjDPU7cdNgQMbebpataRi8A0el2/IJXl+E+olgAz5zC4i2O1Q=="}',
                },
                {
                    id: '6424c353eaf78d000766e9510b125fba',
                    source: 'bitgo',
                    type: 'tss',
                    commonKeychain: '19bdfe2a4b498a05511381235a8892d54267807c4a3f654e310b938b8b424ff4adedbe92f4c146de641c67508a961324c8504cdf8e0c0acbb68d6104ccccd781',
                    verifiedVssProof: true,
                    isBitGo: true,
                },
            ];
        });
        it('should return true when validating a well formatted address', async function () {
            const address = 'f941ae3cbe5645dccc15da8346b533f7f91f202089a5521653c062b2ff10b304';
            basecoin.isValidAddress(address).should.equal(true);
        });
        it('should return true when validating a well formatted address prefixed with 0x', async function () {
            const address = '0xf941ae3cbe5645dccc15da8346b533f7f91f202089a5521653c062b2ff10b304';
            basecoin.isValidAddress(address).should.equal(true);
        });
        it('should return false when validating an old address', async function () {
            const address = '0x2959bfc3fdb7dc23fed8deba2fafb70f3e606a59';
            basecoin.isValidAddress(address).should.equal(false);
        });
        it('should return false when validating an incorrectly formatted', async function () {
            const address = 'wrongaddress';
            basecoin.isValidAddress(address).should.equal(false);
        });
        it('should return true for isWalletAddress with valid address for index 4', async function () {
            const newAddress = '0x8b3c7807730d75792dd6c49732cf9f014d6984a9c77d386bdb1072a9e537d8d8';
            const index = 4;
            const params = { commonKeychain, address: newAddress, index, keychains };
            (await basecoin.isWalletAddress(params)).should.equal(true);
        });
        it('should throw error for isWalletAddress when keychains is missing', async function () {
            const address = '0x2959bfc3fdb7dc23fed8deba2fafb70f3e606a59';
            const index = 0;
            const params = { commonKeychain, address, index };
            await assert_1.default.rejects(async () => basecoin.isWalletAddress(params));
        });
        it('should throw error for isWalletAddress when new address is invalid', async function () {
            const wrongAddress = 'badAddress';
            const index = 0;
            const params = { commonKeychain, address: wrongAddress, index };
            await assert_1.default.rejects(async () => basecoin.isWalletAddress(params), {
                message: `invalid address: ${wrongAddress}`,
            });
        });
    });
    describe('Recover Transactions:', () => {
        const sandBox = sinon_1.default.createSandbox();
        const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
        const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
        const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
        let getBalanceStub;
        let getInputCoinsStub;
        let getFeeEstimateStub;
        beforeEach(() => {
            getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
            getBalanceStub.withArgs(senderAddress0).resolves('1900000000');
            getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
            getInputCoinsStub.withArgs(senderAddress0).resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xc05c765e26e6ae84c78fa245f38a23fb20406a5cf3f61b57bd323a0df9d98003',
                    version: '195',
                    digest: '7BJLb32LKN7wt5uv4xgXW4AbFKoMNcPE76o41TQEvUZb',
                    balance: new bignumber_js_1.default('1900000000'),
                },
            ]);
            getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
            getFeeEstimateStub
                .withArgs('AAACAAgA0klrAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQCR8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdowHAXHZeJuauhMePokXziiP7IEBqXPP2G1e9MjoN+dmAA8MAAAAAAAAAIFvJiJBdEAhi14cxcSr/HUIhBZMbLMd4rczUTCMIb3UmkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaPoAwAAAAAAAADh9QUAAAAAAA==')
                .resolves(new bignumber_js_1.default(1997880));
        });
        afterEach(() => {
            sandBox.restore();
        });
        it('should recover a txn for non-bitgo recovery', async function () {
            const res = await basecoin.recover({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                recoveryDestination,
                walletPassphrase,
            });
            res.should.not.be.empty();
            res.should.hasOwnProperty('transactions');
            const tx = res.transactions[0];
            tx.scanIndex.should.equal(0);
            tx.recoveryAmount.should.equal('1897802332');
            tx.serializedTx.should.equal('AAACAAhcKh5xAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQCR8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdowHAXHZeJuauhMePokXziiP7IEBqXPP2G1e9MjoN+dmAA8MAAAAAAAAAIFvJiJBdEAhi14cxcSr/HUIhBZMbLMd4rczUTCMIb3UmkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaPoAwAAAAAAAKSIIQAAAAAAAA==');
            const NonBitGoTxnDeserialize = new src_1.TransferTransaction(basecoin);
            NonBitGoTxnDeserialize.fromRawTransaction(tx.serializedTx);
            const NonBitGoTxnJson = NonBitGoTxnDeserialize.toJson();
            should_1.default.equal(NonBitGoTxnJson.id, 'FDCBUNqLUAW4qBTnFjTCPZazL8VnRBP2gS3GmEnwtEcg');
            should_1.default.equal(NonBitGoTxnJson.sender, senderAddress0);
            sandBox.assert.callCount(basecoin.getBalance, 1);
            sandBox.assert.callCount(basecoin.getInputCoins, 1);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
        it('should recover a txn for unsigned sweep recovery', async function () {
            const res = await basecoin.recover({
                bitgoKey: sui_1.keys.bitgoKey,
                recoveryDestination,
            });
            res.should.deepEqual({
                txRequests: [
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '00000200085c2a1e7100000000002000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e38902020001010000010102000001010091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da301c05c765e26e6ae84c78fa245f38a23fb20406a5cf3f61b57bd323a0df9d98003c300000000000000205bc988905d100862d78731712aff1d422105931b2cc778adccd44c23086f752691f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3e803000000000000a48821000000000000',
                                    scanIndex: 0,
                                    coin: 'tsui',
                                    signableHex: '873748a31e766f5f8f0077d8d0003548fae4f4c1344067a7c3799cfa73808fb7',
                                    derivationPath: 'm/0',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
                                                valueString: '1897802332',
                                                value: new bignumber_js_1.default(1897802332),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
                                                valueString: '1897802332',
                                                coinName: 'tsui',
                                            },
                                        ],
                                        spendAmount: '1897802332',
                                        type: 'Transfer',
                                    },
                                    feeInfo: { fee: 2197668, feeString: '2197668' },
                                    coinSpecific: {
                                        commonKeychain: '3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54',
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui',
                    },
                ],
            });
            const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
            const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
            const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
            unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
            const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
            should_1.default.equal(unsignedSweepTxnJson.id, 'FDCBUNqLUAW4qBTnFjTCPZazL8VnRBP2gS3GmEnwtEcg');
            should_1.default.equal(unsignedSweepTxnJson.sender, senderAddress0);
            sandBox.assert.callCount(basecoin.getBalance, 1);
            sandBox.assert.callCount(basecoin.getInputCoins, 1);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
        it('should recover a txn for unsigned sweep recovery with multiple input coins', async function () {
            const senderAddress = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
            getBalanceStub.withArgs(senderAddress).resolves('1798002120');
            getInputCoinsStub.withArgs(senderAddress).resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x60aefaffa35daa32a1e561f2ba9c18753057d2feb502f32804e573ea2875a39c',
                    version: '195',
                    digest: 'jKjduy8gHDE244ZJWcP3JXfXPKjqY67avMqhzHw98CL',
                    balance: new bignumber_js_1.default('98002120'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x9a363c91d29b50832ab98094b6c1933941280fc298a2ec232739f14ce31e2582',
                    version: '197',
                    digest: 'ELnbgmW7crPYr3B9pWVqfg9uLeJt43KPofkfdR6LWftu',
                    balance: new bignumber_js_1.default('1700000000'),
                },
            ]);
            getFeeEstimateStub
                .withArgs('AAACAAjIdDVlAAAAAAAgMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8wCAgABAQAAAQECAAABAQAA5OqmopH+ApGEUuZFtWU80mCl/A+zX2GT1YCRaqnjiQKaNjyR0ptQgyq5gJS2wZM5QSgPwpii7CMnOfFM4x4lgsUAAAAAAAAAIMY5hfUFzuMVaY3+LwmZTvypRSAJRLNXocRYR9yKalXyYK76/6NdqjKh5WHyupwYdTBX0v61AvMoBOVz6ih1o5zDAAAAAAAAACAK15PtO6gwSNx0bHksVJOcN96AYyc+3YVpJzaYMMhHbQDk6qaikf4CkYRS5kW1ZTzSYKX8D7NfYZPVgJFqqeOJ6AMAAAAAAAAA4fUFAAAAAAA=')
                .resolves(new bignumber_js_1.default(1997880));
            const res = await basecoin.recover({
                bitgoKey: '7d91f69c285c0b3b0a0d6371020f194d45956ee556289e7854f6d114e07805720eec673c6a2\n72b7da4137db7b1289f38af4f4b824ef0de65c5f53e3e66617617',
                recoveryDestination: '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc',
            });
            res.should.deepEqual({
                txRequests: [
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '000002000824cd096b00000000002032d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc02020001010000010102000001010000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389029a363c91d29b50832ab98094b6c1933941280fc298a2ec232739f14ce31e2582c50000000000000020c63985f505cee315698dfe2f09994efca945200944b357a1c45847dc8a6a55f260aefaffa35daa32a1e561f2ba9c18753057d2feb502f32804e573ea2875a39cc300000000000000200ad793ed3ba83048dc746c792c54939c37de8063273edd856927369830c8476d00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389e803000000000000a48821000000000000',
                                    scanIndex: 0,
                                    coin: 'tsui',
                                    signableHex: '3eec395ccaee7d6a0b9fa5488dd00bfeb89dc4bd37e3139ebebb62c2e60bc00d',
                                    derivationPath: 'm/0',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
                                                valueString: '1795804452',
                                                value: new bignumber_js_1.default(1795804452),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc',
                                                valueString: '1795804452',
                                                coinName: 'tsui',
                                            },
                                        ],
                                        spendAmount: '1795804452',
                                        type: 'Transfer',
                                    },
                                    feeInfo: { fee: 2197668, feeString: '2197668' },
                                    coinSpecific: {
                                        commonKeychain: '7d91f69c285c0b3b0a0d6371020f194d45956ee556289e7854f6d114e07805720eec673c6a272b7da4137db7b1289f38af4f4b824ef0de65c5f53e3e66617617',
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui',
                    },
                ],
            });
            const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
            const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
            const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
            unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
            const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
            should_1.default.equal(unsignedSweepTxnJson.id, '7Jyx3KUVXxs1Q2i1RqXtj4hFgUgBon6PUQAovL84Y3eP');
            should_1.default.equal(unsignedSweepTxnJson.sender, senderAddress);
            sandBox.assert.callCount(basecoin.getBalance, 1);
            sandBox.assert.callCount(basecoin.getInputCoins, 1);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
    });
    describe('Recover Token Transactions:', () => {
        const sandBox = sinon_1.default.createSandbox();
        const coinType = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP';
        const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
        const senderAddressColdWallet = '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421';
        const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
        const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
        const tokenContractAddress = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
        let getBalanceStub;
        let getInputCoinsStub;
        let getFeeEstimateStub;
        beforeEach(() => {
            getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
            getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
            getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
        });
        afterEach(() => {
            sandBox.restore();
        });
        it('should recover a token txn for non-bitgo recovery', async function () {
            getBalanceStub.withArgs(senderAddress0, coinType).resolves('1000');
            getInputCoinsStub.withArgs(senderAddress0, coinType).resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0x924ab69ebba304f2975a588372b41e4e1f5db7fa824868f84199eeb1e0a15a2d',
                    version: '34696807',
                    digest: '7XRbWQTiwAUCjLLsZVpJMrABCheJBkzKVfCr7aTZZVkd',
                    balance: new bignumber_js_1.default(1000),
                },
            ]);
            getInputCoinsStub.withArgs(senderAddress0).resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x9146928f557cb8ab1915a5886c1362435a05b4709b586bb01d4c70e85bb53161',
                    version: '239',
                    digest: 'GLSzR6HJ319nPKAFm5x3TWHcaHZzCFSBCqhvZ1qwT5wr',
                    balance: new bignumber_js_1.default('1230261076'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x93f700dc82e229f699f47b167859c5108288b78f54068800cc290900d0de8429',
                    version: '149',
                    digest: '2wXDxt2ZxekBxN6oW3BqVDXZcX49C87n1AN26Nyu7kPR',
                    balance: new bignumber_js_1.default('169611024'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xb869b45744ca2c4a663c6e8679db5a632bead0364273842d3990d7ff65d57b1e',
                    version: '237',
                    digest: 'F1xWKPVHV5WL72ErjgQxrjn3RNH2GHjyN9jTgwW7Qphk',
                    balance: new bignumber_js_1.default('101976'),
                },
            ]);
            getFeeEstimateStub
                .withArgs('AAADAQCSSraeu6ME8pdaWINytB5OH123+oJIaPhBme6x4KFaLWduEQIAAAAAIGDxWv07uqv0hEZiOG0FC/xG830WBmRDZLOLmMp61gdSAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECAJHyXiN7g6AKYnJP3EqB5D9JTca0GhJBSSgm025NEx2jAZFGko9VfLirGRWliGwTYkNaBbRwm1hrsB1McOhbtTFh7wAAAAAAAAAg49q55eJGGM5xtoJzY233UnL2dj1Kb5N90YxZ70QopW2R8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdo+gDAAAAAAAAAOH1BQAAAAAA')
                .resolves(new bignumber_js_1.default(2345504));
            const res = await basecoin.recover({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                recoveryDestination,
                walletPassphrase,
                tokenContractAddress,
            });
            res.should.not.be.empty();
            res.should.hasOwnProperty('transactions');
            const tx = res.transactions[0];
            tx.scanIndex.should.equal(0);
            tx.recoveryAmount.should.equal('1000');
            tx.serializedTx.should.equal('AAADAQCSSraeu6ME8pdaWINytB5OH123+oJIaPhBme6x4KFaLWduEQIAAAAAIGDxWv07uqv0hEZiOG0FC/xG830WBmRDZLOLmMp61gdSAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECAJHyXiN7g6AKYnJP3EqB5D9JTca0GhJBSSgm025NEx2jAZFGko9VfLirGRWliGwTYkNaBbRwm1hrsB1McOhbtTFh7wAAAAAAAAAg49q55eJGGM5xtoJzY233UnL2dj1Kb5N90YxZ70QopW2R8l4je4OgCmJyT9xKgeQ/SU3GtBoSQUkoJtNuTRMdo+gDAAAAAAAAVl4nAAAAAAAA');
            const NonBitGoTxnDeserialize = new src_1.TokenTransferTransaction(basecoin);
            NonBitGoTxnDeserialize.fromRawTransaction(tx.serializedTx);
            const NonBitGoTxnJson = NonBitGoTxnDeserialize.toJson();
            should_1.default.equal(NonBitGoTxnJson.id, 'DYW9mA8AZGQntk7HGQUEoEdy8BaH8Hh9Ts294EnqGTEr');
            should_1.default.equal(NonBitGoTxnJson.sender, senderAddress0);
            sandBox.assert.callCount(basecoin.getBalance, 2);
            sandBox.assert.callCount(basecoin.getInputCoins, 2);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
        it('should recover a token txn for unsigned sweep recovery', async function () {
            getBalanceStub.withArgs(senderAddressColdWallet).resolves('298980240');
            getBalanceStub.withArgs(senderAddressColdWallet, coinType).resolves('1000');
            getInputCoinsStub.withArgs(senderAddressColdWallet, coinType).resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0x4c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7',
                    version: '34696809',
                    digest: 'Afy4LW46tuczj341TbCLeeynxrupj9Lw2qBQUpndHc1c',
                    balance: new bignumber_js_1.default(1000),
                },
            ]);
            getInputCoinsStub.withArgs(senderAddressColdWallet).resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x98114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068',
                    version: '34696809',
                    digest: 'DBtoqvWtrcYHE1HjQUo4igTkHYxY7D83iHSoKXi9A85W',
                    balance: new bignumber_js_1.default(200000000),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x9ec13440647b0bee74f45409589ad2ff5a18c9615f99d5d914f988b834da493e',
                    version: '239',
                    digest: '9d3uVsQ4p37TGnzTpnXXw2pFoggbVfVp9CdC4jpZq664',
                    balance: new bignumber_js_1.default(98980240),
                },
            ]);
            getFeeEstimateStub
                .withArgs('AAADAQBMHMzG0DUQvXSpX4Gyt9oIEZyxjixWVDXnrXFeaq3Fp2luEQIAAAAAII+0ozS4Kazey/oqMoZCr6JNb5U3QPdoMIDuDks9OpYvAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECAAFkld3adIwRaiGCQoNdNkcJ1sXuXIoe1oTE70M9MUQhAZgRTy3e/j8W2dLgFhlLUsTDr0MMFgG9s1OcvSN8vKBoaW4RAgAAAAAgtRahW1A0vNQkJUQMVkzzb0OVQviGce95nd4GYeeJoAkBZJXd2nSMEWohgkKDXTZHCdbF7lyKHtaExO9DPTFEIegDAAAAAAAAAOH1BQAAAAAA')
                .resolves(new bignumber_js_1.default(2345504));
            const res = await basecoin.recover({
                bitgoKey: sui_1.keys.bitgoKeyColdWallet,
                recoveryDestination,
                tokenContractAddress,
            });
            res.should.deepEqual({
                txRequests: [
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '00000301004c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7696e110200000000208fb4a334b829acdecbfa2a328642afa24d6f953740f7683080ee0e4b3d3a962f0008e803000000000000002000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e3890202010000010101000101020000010200016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210198114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068696e11020000000020b516a15b5034bcd42425440c564cf36f439542f88671ef799dde0661e789a009016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000565e27000000000000',
                                    scanIndex: 0,
                                    coin: 'tsui:deep',
                                    signableHex: 'e3547a58b9c48840a2774aeb71b8652a70b67ee59c3fa5b1f743738d8b295199',
                                    derivationPath: 'm/0',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
                                                valueString: '1000',
                                                value: new bignumber_js_1.default(1000),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
                                                valueString: '1000',
                                                coinName: 'tsui:deep',
                                            },
                                        ],
                                        spendAmount: '1000',
                                        type: 'TokenTransfer',
                                    },
                                    feeInfo: {
                                        fee: 2580054,
                                        feeString: '2580054',
                                    },
                                    coinSpecific: {
                                        commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui:deep',
                    },
                ],
            });
            const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
            const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
            const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
            unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
            const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
            should_1.default.equal(unsignedSweepTxnJson.id, 'F8wrUjZYf6xvDW2LzW9DohAKyJFcWgGEvjMoKLxCajmV');
            should_1.default.equal(unsignedSweepTxnJson.sender, senderAddressColdWallet);
            sandBox.assert.callCount(basecoin.getBalance, 2);
            sandBox.assert.callCount(basecoin.getInputCoins, 2);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
        it('should recover a token txn for unsigned sweep recovery with multiple input coins', async function () {
            getBalanceStub.withArgs(senderAddressColdWallet).resolves('298980240');
            getBalanceStub.withArgs(senderAddressColdWallet, coinType).resolves('11000');
            getInputCoinsStub.withArgs(senderAddressColdWallet, coinType).resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0x4c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7',
                    version: '34696809',
                    digest: 'Afy4LW46tuczj341TbCLeeynxrupj9Lw2qBQUpndHc1c',
                    balance: new bignumber_js_1.default('1000'),
                },
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0x72ad99130abd3790db7bac8908d50d3412a800a8fcd10c1cfbd64b8215537558',
                    version: '34696865',
                    digest: 'X8uaNDkSfYKa6PBzJJUe9StP4nRWR9RZoa2nJHqv5mn',
                    balance: new bignumber_js_1.default('10000'),
                },
            ]);
            getInputCoinsStub.withArgs(senderAddressColdWallet).resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x98114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068',
                    version: '34696809',
                    digest: 'DBtoqvWtrcYHE1HjQUo4igTkHYxY7D83iHSoKXi9A85W',
                    balance: new bignumber_js_1.default('200000000'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x9ec13440647b0bee74f45409589ad2ff5a18c9615f99d5d914f988b834da493e',
                    version: '239',
                    digest: '9d3uVsQ4p37TGnzTpnXXw2pFoggbVfVp9CdC4jpZq664',
                    balance: new bignumber_js_1.default('98980240'),
                },
            ]);
            getFeeEstimateStub
                .withArgs('AAAEAQByrZkTCr03kNt7rIkI1Q00EqgAqPzRDBz71kuCFVN1WKFuEQIAAAAAIAe4XTi24bSF8UVZMNJylhCAgcqs12ZMSNfV9IVy7iu9AQBMHMzG0DUQvXSpX4Gyt9oIEZyxjixWVDXnrXFeaq3Fp2luEQIAAAAAII+0ozS4Kazey/oqMoZCr6JNb5U3QPdoMIDuDks9OpYvAAj4KgAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kDAwEAAAEBAQACAQAAAQECAAEBAgEAAQMAAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCEBmBFPLd7+PxbZ0uAWGUtSxMOvQwwWAb2zU5y9I3y8oGhpbhECAAAAACC1FqFbUDS81CQlRAxWTPNvQ5VC+IZx73md3gZh54mgCQFkld3adIwRaiGCQoNdNkcJ1sXuXIoe1oTE70M9MUQh6AMAAAAAAAAA4fUFAAAAAAA=')
                .resolves(new bignumber_js_1.default(1036328));
            const res = await basecoin.recover({
                bitgoKey: sui_1.keys.bitgoKeyColdWallet,
                recoveryDestination,
                tokenContractAddress,
            });
            res.should.deepEqual({
                txRequests: [
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '000004010072ad99130abd3790db7bac8908d50d3412a800a8fcd10c1cfbd64b8215537558a16e1102000000002007b85d38b6e1b485f1455930d27296108081caacd7664c48d7d5f48572ee2bbd01004c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7696e110200000000208fb4a334b829acdecbfa2a328642afa24d6f953740f7683080ee0e4b3d3a962f0008f82a000000000000002000e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e38903030100000101010002010000010102000101020100010300016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210198114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068696e11020000000020b516a15b5034bcd42425440c564cf36f439542f88671ef799dde0661e789a009016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000f86411000000000000',
                                    scanIndex: 0,
                                    coin: 'tsui:deep',
                                    signableHex: 'cd028c401f815dab7f6c5e8a33976879c5c799ae7c9fde01cafd0aee0075a174',
                                    derivationPath: 'm/0',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
                                                valueString: '11000',
                                                value: new bignumber_js_1.default('11000'),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389',
                                                valueString: '11000',
                                                coinName: 'tsui:deep',
                                            },
                                        ],
                                        spendAmount: '11000',
                                        type: 'TokenTransfer',
                                    },
                                    feeInfo: {
                                        fee: 1139960,
                                        feeString: '1139960',
                                    },
                                    coinSpecific: {
                                        commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui:deep',
                    },
                ],
            });
            const unsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
            const serializedTxHex = res.txRequests[0].transactions[0].unsignedTx.serializedTx;
            const serializedTxBase64 = buffer_1.Buffer.from(serializedTxHex, 'hex').toString('base64');
            unsignedSweepTxnDeserialize.fromRawTransaction(serializedTxBase64);
            const unsignedSweepTxnJson = unsignedSweepTxnDeserialize.toJson();
            should_1.default.equal(unsignedSweepTxnJson.id, '4qeXJP7pTa6pmyAKuJZG9AkGsKM53SDqHVcPjRMFHjc5');
            should_1.default.equal(unsignedSweepTxnJson.sender, senderAddressColdWallet);
            sandBox.assert.callCount(basecoin.getBalance, 2);
            sandBox.assert.callCount(basecoin.getInputCoins, 2);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
    });
    describe('Recover Transactions for wallet with multiple addresses:', () => {
        const sandBox = sinon_1.default.createSandbox();
        const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
        const senderAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
        const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
        const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
        beforeEach(function () {
            let callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
            callBack.withArgs(senderAddress0).resolves('0').withArgs(senderAddress1).resolves('1800000000');
            callBack = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
            callBack.withArgs(senderAddress1).resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xff93adc2f516fcaa0c6040e01f50027a23f9b1767f5040eb2282790a6900ce7f',
                    version: '196',
                    digest: 'XrjRM9ZM98xdNWigHYQjCpGoWt6aZLpqXdSEixnhb4p',
                    balance: new bignumber_js_1.default('1800000000'),
                },
            ]);
            callBack = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
            callBack
                .withArgs('AAACAAgA8VNlAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAH/k63C9Rb8qgxgQOAfUAJ6I/mxdn9QQOsignkKaQDOf8QAAAAAAAAAIAfnp90gMsdBGGz1tW/sFQlArhkRmYjdiXTXx+CvxHjVMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8zoAwAAAAAAAADh9QUAAAAAAA==')
                .resolves(new bignumber_js_1.default(1997880));
        });
        afterEach(function () {
            sandBox.restore();
        });
        it('should recover a txn for non-bitgo recoveries at address 1 but search from address 0', async function () {
            const res = await basecoin.recover({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                recoveryDestination,
                walletPassphrase,
            });
            res.should.not.be.empty();
            res.should.hasOwnProperty('transactions');
            const tx = res.transactions[0];
            tx.scanIndex.should.equal(1);
            tx.recoveryAmount.should.equal('1797802332');
            tx.serializedTx.should.equal('AAACAAhcSShrAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAH/k63C9Rb8qgxgQOAfUAJ6I/mxdn9QQOsignkKaQDOf8QAAAAAAAAAIAfnp90gMsdBGGz1tW/sFQlArhkRmYjdiXTXx+CvxHjVMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8zoAwAAAAAAAKSIIQAAAAAAAA==');
            const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
            UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
            const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
            should_1.default.equal(UnsignedSweepTxnJson.id, 'BqHcCR51mqUyi5GJYEED3cw9AgpJ3SraTrt5aE9nLkLj');
            should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
            sandBox.assert.callCount(basecoin.getBalance, 2);
            sandBox.assert.callCount(basecoin.getInputCoins, 1);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
        it('should recover a txn for non-bitgo recoveries at address 1 but search from address 1', async function () {
            const res = await basecoin.recover({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                recoveryDestination,
                walletPassphrase,
                startingScanIndex: 1,
            });
            res.should.not.be.empty();
            res.should.hasOwnProperty('transactions');
            const tx = res.transactions[0];
            tx.scanIndex.should.equal(1);
            tx.recoveryAmount.should.equal('1797802332');
            tx.serializedTx.should.equal('AAACAAhcSShrAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAH/k63C9Rb8qgxgQOAfUAJ6I/mxdn9QQOsignkKaQDOf8QAAAAAAAAAIAfnp90gMsdBGGz1tW/sFQlArhkRmYjdiXTXx+CvxHjVMtjlfubZHlVY2gZ3FUwvCFeVNI4xf5Wsye+t4bQRL8zoAwAAAAAAAKSIIQAAAAAAAA==');
            const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
            UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
            const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
            should_1.default.equal(UnsignedSweepTxnJson.id, 'BqHcCR51mqUyi5GJYEED3cw9AgpJ3SraTrt5aE9nLkLj');
            should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
            sandBox.assert.callCount(basecoin.getBalance, 1);
            sandBox.assert.callCount(basecoin.getInputCoins, 1);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
    });
    describe('Recover Token Transactions for wallet with multiple addresses:', () => {
        const sandBox = sinon_1.default.createSandbox();
        const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
        const senderAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
        const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
        const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
        const packageId = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
        const coinType = `${packageId}::deep::DEEP`;
        let getBalanceStub;
        let getInputCoinsStub;
        let getFeeEstimateStub;
        beforeEach(function () {
            getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
            getBalanceStub
                .withArgs(senderAddress0)
                .resolves('706875692')
                .withArgs(senderAddress0, coinType)
                .resolves('0')
                .withArgs(senderAddress1)
                .resolves('120101976')
                .withArgs(senderAddress1, coinType)
                .resolves('1000');
            getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
            getInputCoinsStub.withArgs(senderAddress1, coinType).resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0xcdba76bdc3f460ed0d6af834fc17b082eb9eabd0b886f9af17cd4291f2f862fa',
                    version: '34696866',
                    digest: '7vbSgaGytATtnQ2fLRQo3VtCwYr9KjxsuxLLMj2dfCsU',
                    balance: new bignumber_js_1.default('1000'),
                },
            ]);
            getInputCoinsStub.withArgs(senderAddress1).resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x0eca78901e342b2515fbf99be243b3f00ade0a7a50675b37307f44cc195c9046',
                    version: '34696875',
                    digest: 'APE3nj4zYm4hY2Xn9C2n3ynyPiYqxgTRejYT7ParhpU7',
                    balance: new bignumber_js_1.default('120000000'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x761222340db80dd9da144d55098870bc81a788205e0bbdd34c2f8df12cf45aeb',
                    version: '227',
                    digest: '9bwyjaSH3X8anrjGUpD1NqMrLFUtGSCK9LFuLbhjX69E',
                    balance: new bignumber_js_1.default('101976'),
                },
            ]);
            getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
            getFeeEstimateStub
                .withArgs('AAADAQDNuna9w/Rg7Q1q+DT8F7CC656r0LiG+a8XzUKR8vhi+qJuEQIAAAAAIGbg2VphuEezzTVLyBTrQGC+GJWMRSV5YJWka7fwmD9LAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGq24RAgAAAAAgi2q2sUgd0frgxWZVkgajJAb1V5f1VzaTrXEYIxkLqDAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAAOH1BQAAAAAA')
                .resolves(new bignumber_js_1.default(2345504));
        });
        afterEach(function () {
            sandBox.restore();
        });
        it('should recover a token txn for non-bitgo recoveries at address 1 but search from address 0', async function () {
            const res = await basecoin.recover({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                recoveryDestination,
                walletPassphrase,
                tokenContractAddress: packageId,
            });
            res.should.not.be.empty();
            res.should.hasOwnProperty('transactions');
            const tx = res.transactions[0];
            tx.scanIndex.should.equal(1);
            tx.recoveryAmount.should.equal('1000');
            tx.serializedTx.should.equal('AAADAQDNuna9w/Rg7Q1q+DT8F7CC656r0LiG+a8XzUKR8vhi+qJuEQIAAAAAIGbg2VphuEezzTVLyBTrQGC+GJWMRSV5YJWka7fwmD9LAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGq24RAgAAAAAgi2q2sUgd0frgxWZVkgajJAb1V5f1VzaTrXEYIxkLqDAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAVl4nAAAAAAAA');
            const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
            UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
            const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
            should_1.default.equal(UnsignedSweepTxnJson.id, 'GFuk1VKy3wzTFeAUtrmUe6sxRhtezzrGDfKdpQTxv9so');
            should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
            sandBox.assert.callCount(basecoin.getBalance, 4);
            sandBox.assert.callCount(basecoin.getInputCoins, 2);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
        it('should recover a token txn for non-bitgo recoveries at address 1 but search from address 1', async function () {
            const res = await basecoin.recover({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                recoveryDestination,
                walletPassphrase,
                tokenContractAddress: packageId,
                startingScanIndex: 1,
            });
            res.should.not.be.empty();
            res.should.hasOwnProperty('transactions');
            const tx = res.transactions[0];
            tx.scanIndex.should.equal(1);
            tx.recoveryAmount.should.equal('1000');
            tx.serializedTx.should.equal('AAADAQDNuna9w/Rg7Q1q+DT8F7CC656r0LiG+a8XzUKR8vhi+qJuEQIAAAAAIGbg2VphuEezzTVLyBTrQGC+GJWMRSV5YJWka7fwmD9LAAjoAwAAAAAAAAAgAOTqpqKR/gKRhFLmRbVlPNJgpfwPs19hk9WAkWqp44kCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGq24RAgAAAAAgi2q2sUgd0frgxWZVkgajJAb1V5f1VzaTrXEYIxkLqDAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAVl4nAAAAAAAA');
            const UnsignedSweepTxnDeserialize = new src_1.TransferTransaction(basecoin);
            UnsignedSweepTxnDeserialize.fromRawTransaction(tx.serializedTx);
            const UnsignedSweepTxnJson = UnsignedSweepTxnDeserialize.toJson();
            should_1.default.equal(UnsignedSweepTxnJson.id, 'GFuk1VKy3wzTFeAUtrmUe6sxRhtezzrGDfKdpQTxv9so');
            should_1.default.equal(UnsignedSweepTxnJson.sender, senderAddress1);
            sandBox.assert.callCount(basecoin.getBalance, 2);
            sandBox.assert.callCount(basecoin.getInputCoins, 2);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 1);
        });
    });
    describe('Recover Consolidation Transactions', () => {
        const sandBox = sinon_1.default.createSandbox();
        const receiveAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
        const receiveAddress2 = '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c';
        const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
        const seedReceiveAddress1 = '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a';
        const seedReceiveAddress2 = '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9';
        beforeEach(function () {
            let callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
            callBack
                .withArgs(receiveAddress1)
                .resolves('200101976')
                .withArgs(receiveAddress2)
                .resolves('200000000')
                .withArgs(seedReceiveAddress1)
                .resolves('500000000')
                .withArgs(seedReceiveAddress2)
                .resolves('200000000');
            callBack = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
            callBack
                .withArgs(receiveAddress1)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x996aab365d4551b6d1274f520bbfa7b0a566d548b2d590b5565c623812e7e76d',
                    version: '201',
                    digest: 'HXpNTfx9TBdxFcXHi4RziZsQuDAHavRasK6Ri15rVwuA',
                    balance: new bignumber_js_1.default('200000000'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xb39c5f380208cce7fe1ba1258c8d19befb02a80f14952617ed37098dbd4d2df0',
                    version: '199',
                    digest: 'mqk37hXLkiUYgkYxk2MyqNykCkCXwe97uMus7bDPhe2',
                    balance: new bignumber_js_1.default('101976'),
                },
            ])
                .withArgs(receiveAddress2)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xfa04105eedebdabf729dccecf01d0cf5f1b770892fac2ed8f1e69d71a32a2d24',
                    version: '202',
                    digest: 'DeApRVSrTa9ttXvNyLexT4PJcAkyyxSpi3JQeUg4ua8Q',
                    balance: new bignumber_js_1.default('200000000'),
                },
            ])
                .withArgs(seedReceiveAddress1)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x86e728fd7242b3be60e9c1941add2c47fb655779108c3500a216310218748e2d',
                    version: '147',
                    digest: '6PJeyEX4L8RkjsNaF5GSMCwRjmFGYrQB7fbmJPFMMPHL',
                    balance: '500000000',
                },
            ])
                .withArgs(seedReceiveAddress2)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xfd66dbfe7a1497f210747b0532f62e6926cb144c75e519f2dfff17a4f6e515fc',
                    version: '148',
                    digest: 'PJ3jfS1ERShSMtFWZgma4h6duWX8nm5Bei1z3BszyBk',
                    balance: '200000000',
                },
            ]);
            callBack = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
            callBack
                .withArgs('AAACAAhYb/cFAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAKZaqs2XUVRttEnT1ILv6ewpWbVSLLVkLVWXGI4EufnbckAAAAAAAAAIPWf+f1EklW1ggi3rwo5Jw3Lftu9W/UsyrZrI0FYsBTZs5xfOAIIzOf+G6EljI0ZvvsCqA8UlSYX7TcJjb1NLfDHAAAAAAAAACALfKsZ4T9Y2y1rrlBxQQ2BouS9VFjBgVfvbbFf9U+f8zLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/M6AMAAAAAAAAA4fUFAAAAAAA=')
                .resolves(new bignumber_js_1.default('1019760'))
                .withArgs('AAACAAgA4fUFAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQDfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHAH6BBBe7evav3KdzOzwHQz18bdwiS+sLtjx5p1xoyotJMoAAAAAAAAAILvR1XjlKKylRGh9pX4UpBFBsCv5At6RBn+XXDAbnfRB30B+PiXpQA+Xeax1cVN8I2FoQZTxql2xJqj1dLXthRzoAwAAAAAAAADh9QUAAAAAAA==')
                .resolves(new bignumber_js_1.default('1997880'))
                .withArgs('AAACAAgAhNcXAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgABAQAAAQECAAABAQDSAVZuagvAIP0ub3LpveIiP1UNZNqmE5jNkXwvdQEySgGG5yj9ckKzvmDpwZQa3SxH+2VXeRCMNQCiFjECGHSOLZMAAAAAAAAAIFABLLLjMJc51R0P8DHy0PbXwsYUD0b5gvVmiZsupafr0gFWbmoLwCD9Lm9y6b3iIj9VDWTaphOYzZF8L3UBMkroAwAAAAAAAADh9QUAAAAAAA==')
                .resolves(new bignumber_js_1.default('1997880'))
                .withArgs('AAACAAgA4fUFAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgABAQAAAQECAAABAQAvpdg5S9a+xVJblVC/Q74HW4NCLQEHwFxwCUTj6uwm+QH9Ztv+ehSX8hB0ewUy9i5pJssUTHXlGfLf/xek9uUV/JQAAAAAAAAAIAW2DZdVWJ9ENnvL4Z2POOHfK2Z74DgSgDQci60MdQuXL6XYOUvWvsVSW5VQv0O+B1uDQi0BB8BccAlE4+rsJvnoAwAAAAAAAADh9QUAAAAAAA==')
                .resolves(new bignumber_js_1.default('1997880'));
        });
        afterEach(function () {
            sandBox.restore();
        });
        it('should build signed consolidation transactions for hot wallet', async function () {
            const res = await basecoin.recoverConsolidations({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                walletPassphrase,
                startingScanIndex: 1,
                endingScanIndex: 3,
            });
            const transactions = res.transactions;
            transactions.length.should.equal(2);
            const txn1 = transactions[0];
            txn1.scanIndex.should.equal(1);
            txn1.recoveryAmount.should.equal('198980240');
            txn1.serializedTx.should.equal('AAACAAiQMtwLAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQAy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzAKZaqs2XUVRttEnT1ILv6ewpWbVSLLVkLVWXGI4EufnbckAAAAAAAAAIPWf+f1EklW1ggi3rwo5Jw3Lftu9W/UsyrZrI0FYsBTZs5xfOAIIzOf+G6EljI0ZvvsCqA8UlSYX7TcJjb1NLfDHAAAAAAAAACALfKsZ4T9Y2y1rrlBxQQ2BouS9VFjBgVfvbbFf9U+f8zLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/M6AMAAAAAAADIHREAAAAAAAA=');
            const txn2 = transactions[1];
            txn2.scanIndex.should.equal(2);
            txn2.recoveryAmount.should.equal('197802332');
            txn2.serializedTx.should.equal('AAACAAhcOcoLAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgABAQAAAQECAAABAQDfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHAH6BBBe7evav3KdzOzwHQz18bdwiS+sLtjx5p1xoyotJMoAAAAAAAAAILvR1XjlKKylRGh9pX4UpBFBsCv5At6RBn+XXDAbnfRB30B+PiXpQA+Xeax1cVN8I2FoQZTxql2xJqj1dLXthRzoAwAAAAAAAKSIIQAAAAAAAA==');
            res.lastScanIndex.should.equal(2);
            sandBox.assert.callCount(basecoin.getBalance, 2);
            sandBox.assert.callCount(basecoin.getInputCoins, 2);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
        });
        it('should build unsigned consolidation transactions for cold wallet', async function () {
            const res = await basecoin.recoverConsolidations({
                bitgoKey: sui_1.keys.bitgoKey,
                startingScanIndex: 1,
                endingScanIndex: 3,
            });
            res.should.deepEqual({
                txRequests: [
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '00000200089032dc0b00000000002091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da302020001010000010102000001010032d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc02996aab365d4551b6d1274f520bbfa7b0a566d548b2d590b5565c623812e7e76dc90000000000000020f59ff9fd449255b58208b7af0a39270dcb7edbbd5bf52ccab66b234158b014d9b39c5f380208cce7fe1ba1258c8d19befb02a80f14952617ed37098dbd4d2df0c700000000000000200b7cab19e13f58db2d6bae5071410d81a2e4bd5458c18157ef6db15ff54f9ff332d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcce803000000000000c81d11000000000000',
                                    scanIndex: 1,
                                    coin: 'tsui',
                                    signableHex: 'ab84c9d09c678c038439f63fcd40d26535cc1485151257f4f175b6e8a0e94316',
                                    derivationPath: 'm/1',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc',
                                                valueString: '198980240',
                                                value: new bignumber_js_1.default('198980240'),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
                                                valueString: '198980240',
                                                coinName: 'tsui',
                                            },
                                        ],
                                        spendAmount: '198980240',
                                        type: 'Transfer',
                                    },
                                    feeInfo: {
                                        fee: 1121736,
                                        feeString: '1121736',
                                    },
                                    coinSpecific: {
                                        commonKeychain: '3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54',
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui',
                    },
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '00000200085c39ca0b00000000002091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3020200010100000101020000010100df407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c01fa04105eedebdabf729dccecf01d0cf5f1b770892fac2ed8f1e69d71a32a2d24ca0000000000000020bbd1d578e528aca544687da57e14a41141b02bf902de91067f975c301b9df441df407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851ce803000000000000a48821000000000000',
                                    scanIndex: 2,
                                    coin: 'tsui',
                                    signableHex: '66d650b4c4dedf5ab33c9381ee46140b30bb896cf2c66b7b241cae70d1414f16',
                                    derivationPath: 'm/2',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c',
                                                valueString: '197802332',
                                                value: new bignumber_js_1.default('197802332'),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
                                                valueString: '197802332',
                                                coinName: 'tsui',
                                            },
                                        ],
                                        spendAmount: '197802332',
                                        type: 'Transfer',
                                    },
                                    feeInfo: {
                                        fee: 2197668,
                                        feeString: '2197668',
                                    },
                                    coinSpecific: {
                                        commonKeychain: '3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54',
                                        lastScanIndex: 2,
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui',
                    },
                ],
            });
            sandBox.assert.callCount(basecoin.getBalance, 2);
            sandBox.assert.callCount(basecoin.getInputCoins, 2);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
        });
        it('should build unsigned consolidation transactions for cold wallet with seed', async function () {
            const res = await basecoin.recoverConsolidations({
                bitgoKey: sui_1.keys.bitgoKeyWithSeed,
                startingScanIndex: 1,
                endingScanIndex: 3,
                seed: '123',
            });
            res.should.deepEqual({
                txRequests: [
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '00000200085cdcab1d00000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404020200010100000101020000010100d201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a0186e728fd7242b3be60e9c1941add2c47fb655779108c3500a216310218748e2d93000000000000002050012cb2e3309739d51d0ff031f2d0f6d7c2c6140f46f982f566899b2ea5a7ebd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324ae803000000000000a48821000000000000',
                                    scanIndex: 1,
                                    coin: 'tsui',
                                    signableHex: '6d7a4c4882745707c2cd40b0c57566601a2a4d269f5cb0a692828551212cf452',
                                    derivationPath: 'm/999999/94862622/157363509/1',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a',
                                                valueString: '497802332',
                                                value: new bignumber_js_1.default(497802332),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
                                                valueString: '497802332',
                                                coinName: 'tsui',
                                            },
                                        ],
                                        spendAmount: '497802332',
                                        type: 'Transfer',
                                    },
                                    feeInfo: {
                                        fee: 2197668,
                                        feeString: '2197668',
                                    },
                                    coinSpecific: {
                                        commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui',
                    },
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '00000200085c39ca0b00000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b24040202000101000001010200000101002fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f901fd66dbfe7a1497f210747b0532f62e6926cb144c75e519f2dfff17a4f6e515fc94000000000000002005b60d9755589f44367bcbe19d8f38e1df2b667be0381280341c8bad0c750b972fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9e803000000000000a48821000000000000',
                                    scanIndex: 2,
                                    coin: 'tsui',
                                    signableHex: '32a00a6d892630467c7d0666390d3b27caaf4aefee3dda9e0c97c3f8bc06bcea',
                                    derivationPath: 'm/999999/94862622/157363509/2',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9',
                                                valueString: '197802332',
                                                value: new bignumber_js_1.default(197802332),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
                                                valueString: '197802332',
                                                coinName: 'tsui',
                                            },
                                        ],
                                        spendAmount: '197802332',
                                        type: 'Transfer',
                                    },
                                    feeInfo: {
                                        fee: 2197668,
                                        feeString: '2197668',
                                    },
                                    coinSpecific: {
                                        commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
                                        lastScanIndex: 2,
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui',
                    },
                ],
            });
            sandBox.assert.callCount(basecoin.getBalance, 2);
            sandBox.assert.callCount(basecoin.getInputCoins, 2);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
        });
    });
    describe('Recover Token Consolidation Transactions', () => {
        const sandBox = sinon_1.default.createSandbox();
        const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
        const seedReceiveAddress1 = '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a';
        const seedReceiveAddress2 = '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9';
        const packageId = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
        const coinType = `${packageId}::deep::DEEP`;
        const hotWalletReceiveAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
        const hotWalletReceiveAddress2 = '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c';
        const coldWalletReceiveAddress1 = '0xa992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f';
        const coldWalletReceiveAddress2 = '0xc3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39';
        let getBalanceStub;
        let getInputCoinsStub;
        let getFeeEstimateStub;
        beforeEach(function () {
            getBalanceStub = sandBox.stub(src_1.Sui.prototype, 'getBalance');
            getInputCoinsStub = sandBox.stub(src_1.Sui.prototype, 'getInputCoins');
            getFeeEstimateStub = sandBox.stub(src_1.Sui.prototype, 'getFeeEstimate');
        });
        afterEach(function () {
            sandBox.restore();
        });
        it('should build signed token consolidation transactions for hot wallet', async function () {
            getBalanceStub
                .withArgs(hotWalletReceiveAddress1)
                .resolves('116720144')
                .withArgs(hotWalletReceiveAddress1, coinType)
                .resolves('1500')
                .withArgs(hotWalletReceiveAddress2)
                .resolves('120101976')
                .withArgs(hotWalletReceiveAddress2, coinType)
                .resolves('2000');
            getInputCoinsStub
                .withArgs(hotWalletReceiveAddress1, coinType)
                .resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0x8d2da577227e9b7166dbb9b3cce480968cf549b448c662771d1124d6420bf792',
                    version: '34696878',
                    digest: 'BniWiG3v71ozzRirb3hNKEP16pTu3CpNt3voy1uzgMi9',
                    balance: new bignumber_js_1.default('1500'),
                },
            ])
                .withArgs(hotWalletReceiveAddress1)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x0eca78901e342b2515fbf99be243b3f00ade0a7a50675b37307f44cc195c9046',
                    version: '34696877',
                    digest: 'D8XqJXrkVGoer952GvHBdBDXpof8H4F4pRJJ1wSnESNW',
                    balance: new bignumber_js_1.default('116618168'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x761222340db80dd9da144d55098870bc81a788205e0bbdd34c2f8df12cf45aeb',
                    version: '227',
                    digest: '9bwyjaSH3X8anrjGUpD1NqMrLFUtGSCK9LFuLbhjX69E',
                    balance: new bignumber_js_1.default('101976'),
                },
            ])
                .withArgs(hotWalletReceiveAddress2, coinType)
                .resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0x8e18bd14c34e33f81c494f4d6c18d07c686c7f3619682d2066b3f55ecfe707a2',
                    version: '34696868',
                    digest: '6jZFu8PRWLJYPewW7K3o4GLVPYnRyNo3kP6454eLuHZm',
                    balance: new bignumber_js_1.default('2000'),
                },
            ])
                .withArgs(hotWalletReceiveAddress2)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x811a75066134945e3b033f4ac54ec885ec0384f42a80994d88a48d7d18c4260a',
                    version: '236',
                    digest: '32N9ZyferGDEV7PY3ykijVVKhLjEFSL6itqcfRPCy4oW',
                    balance: new bignumber_js_1.default('101976'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xf85a738a30566d558800228f2d5c193a5ca3ddbbddca2a65a48a9332306715cc',
                    version: '34696876',
                    digest: '7gJgCMDEPdQaMeuXZ5CFNonFKMPQyw6k5sT1RpaHEXpe',
                    balance: new bignumber_js_1.default('120000000'),
                },
            ]);
            getFeeEstimateStub
                .withArgs('AAADAQCNLaV3In6bcWbbubPM5ICWjPVJtEjGYncdESTWQgv3kq5uEQIAAAAAIKBK8Zjq4yz/PTFZLg6jf6gDTsogig63pduXeiKgzMVKAAjcBQAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGrW4RAgAAAAAgtDor6b9EJHOSWdJZCQdLkKpS2cPoBc5b28KpX1rg7lsy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAAOH1BQAAAAAA')
                .resolves(new bignumber_js_1.default('2345504'))
                .withArgs('AAADAQCOGL0Uw04z+BxJT01sGNB8aGx/NhloLSBms/Vez+cHoqRuEQIAAAAAIFUxTTQyTKM6bVjeFHHT8KVrV2fgTOCX7Uoevk2r5JPcAAjQBwAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECAN9Afj4l6UAPl3msdXFTfCNhaEGU8apdsSao9XS17YUcAfhac4owVm1ViAAijy1cGTpco9273coqZaSKkzIwZxXMrG4RAgAAAAAgYzfCWiypCmme8IJZhqn5nT8+zoP3S7sfQKfezW99YWvfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHOgDAAAAAAAAAOH1BQAAAAAA')
                .resolves(new bignumber_js_1.default('2345504'));
            const res = await basecoin.recoverConsolidations({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                walletPassphrase,
                tokenContractAddress: packageId,
                startingScanIndex: 1,
                endingScanIndex: 3,
            });
            const transactions = res.transactions;
            transactions.length.should.equal(2);
            const txn1 = transactions[0];
            txn1.scanIndex.should.equal(1);
            txn1.recoveryAmount.should.equal('1500');
            txn1.serializedTx.should.equal('AAADAQCNLaV3In6bcWbbubPM5ICWjPVJtEjGYncdESTWQgv3kq5uEQIAAAAAIKBK8Zjq4yz/PTFZLg6jf6gDTsogig63pduXeiKgzMVKAAjcBQAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECADLY5X7m2R5VWNoGdxVMLwhXlTSOMX+VrMnvreG0ES/MAQ7KeJAeNCslFfv5m+JDs/AK3gp6UGdbNzB/RMwZXJBGrW4RAgAAAAAgtDor6b9EJHOSWdJZCQdLkKpS2cPoBc5b28KpX1rg7lsy2OV+5tkeVVjaBncVTC8IV5U0jjF/lazJ763htBEvzOgDAAAAAAAAVl4nAAAAAAAA');
            const txn2 = transactions[1];
            txn2.scanIndex.should.equal(2);
            txn2.recoveryAmount.should.equal('2000');
            txn2.serializedTx.should.equal('AAADAQCOGL0Uw04z+BxJT01sGNB8aGx/NhloLSBms/Vez+cHoqRuEQIAAAAAIFUxTTQyTKM6bVjeFHHT8KVrV2fgTOCX7Uoevk2r5JPcAAjQBwAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMCAgEAAAEBAQABAQIAAAECAN9Afj4l6UAPl3msdXFTfCNhaEGU8apdsSao9XS17YUcAfhac4owVm1ViAAijy1cGTpco9273coqZaSKkzIwZxXMrG4RAgAAAAAgYzfCWiypCmme8IJZhqn5nT8+zoP3S7sfQKfezW99YWvfQH4+JelAD5d5rHVxU3wjYWhBlPGqXbEmqPV0te2FHOgDAAAAAAAAVl4nAAAAAAAA');
            res.lastScanIndex.should.equal(2);
            sandBox.assert.callCount(basecoin.getBalance, 4);
            sandBox.assert.callCount(basecoin.getInputCoins, 4);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
        });
        it('should build unsigned token consolidation transactions for cold wallet', async function () {
            getBalanceStub
                .withArgs(coldWalletReceiveAddress1)
                .resolves('116720144')
                .withArgs(coldWalletReceiveAddress1, coinType)
                .resolves('4000')
                .withArgs(coldWalletReceiveAddress2)
                .resolves('120101976')
                .withArgs(coldWalletReceiveAddress2, coinType)
                .resolves('6000');
            getInputCoinsStub
                .withArgs(coldWalletReceiveAddress1, coinType)
                .resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0x9e2618685fff38b999355e93a4693c4bd18f68dd6b654ff6555f1f4ad229dcdb',
                    version: '34696876',
                    digest: 'F5iGjs95CnScCtXHFuTJhdZkfLyagWR1Qm1zDH6SngMG',
                    balance: new bignumber_js_1.default('4000'),
                },
            ])
                .withArgs(coldWalletReceiveAddress1)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x8f3f7c8961997327166b1571117ff67232ccd1267ec52a7e973677ba0431ffad',
                    version: '226',
                    digest: 'AWh7tPmS9xmH4a2zYLCG73YDiskCf8uizbLjpCStHhNV',
                    balance: new bignumber_js_1.default('98980240'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x916e35a0ac6b525b7d38a44b667394aaee7cde41dffc876980cfbc8845590cdd',
                    version: '34696878',
                    digest: '14PfNwUvfcR3mNAS1bcNXToaooVLnXQHDdGxPFRJQtY',
                    balance: new bignumber_js_1.default('120000000'),
                },
            ])
                .withArgs(coldWalletReceiveAddress2, coinType)
                .resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0xc548c220454d20e0712bd2858b07260c829a1c847f3818b47805961b574813ab',
                    version: '34696877',
                    digest: '8mANdoskG8eLLy7zVU5rmHRAXVHUyJPABfS1mYHSmAYt',
                    balance: new bignumber_js_1.default('6000'),
                },
            ])
                .withArgs(coldWalletReceiveAddress2)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x396ab09ee58fb2c9fbcca887c00ef01a33d5bfe55a5d50514e32a59f948e9a05',
                    version: '234',
                    digest: 'HWKW56dt8BNxSTvXiW7dtDVmM2gxEexFyNVzGj8HPVp4',
                    balance: new bignumber_js_1.default('101976'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xd4bfefa532827d7619a58279a87db81632e267cc48e6b94ab81a4367f02cbefa',
                    version: '34696879',
                    digest: 'GJnp1oXNjVXLcYY6hqRV8Rm7G7obmk3s8Nhj1bFsfkUo',
                    balance: new bignumber_js_1.default('120000000'),
                },
            ]);
            getFeeEstimateStub
                .withArgs('AAADAQCeJhhoX/84uZk1XpOkaTxL0Y9o3WtlT/ZVXx9K0inc26xuEQIAAAAAINE4mxs1hGMmovTU5dfnFoouWOPdVn0nRDPbuXymALPLAAigDwAAAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgEAAAEBAQABAQIAAAECAKmScJWR3rdHH7MN2g8znberVI0zkaidPx+gxy0gkmdfAZFuNaCsa1JbfTikS2ZzlKrufN5B3/yHaYDPvIhFWQzdrm4RAgAAAAAgAAPVeleb8pMu7o/cp9MwtGsUMwKA28CviO+5N79foNGpknCVkd63Rx+zDdoPM523q1SNM5GonT8foMctIJJnX+gDAAAAAAAAAOH1BQAAAAAA')
                .resolves(new bignumber_js_1.default('2345504'))
                .withArgs('AAADAQDFSMIgRU0g4HEr0oWLByYMgpochH84GLR4BZYbV0gTq61uEQIAAAAAIHNR9lF7b7NdhWgutklx5vwLmihijROI6T24ctzx9g6tAAhwFwAAAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgEAAAEBAQABAQIAAAECAMOsKobjW2K/rag/Y4j/J8fdpwks8Lgp0tH0woE+KK45AdS/76Uygn12GaWCeah9uBYy4mfMSOa5SrgaQ2fwLL76r24RAgAAAAAg42350Lqqaanub5TpjJnYlKiupjF2Xc+qgDIoiPOkU6jDrCqG41tiv62oP2OI/yfH3acJLPC4KdLR9MKBPiiuOegDAAAAAAAAAOH1BQAAAAAA')
                .resolves(new bignumber_js_1.default('2345504'));
            const res = await basecoin.recoverConsolidations({
                bitgoKey: sui_1.keys.bitgoKeyColdWallet,
                tokenContractAddress: packageId,
                startingScanIndex: 1,
                endingScanIndex: 3,
            });
            res.should.deepEqual({
                txRequests: [
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '00000301009e2618685fff38b999355e93a4693c4bd18f68dd6b654ff6555f1f4ad229dcdbac6e11020000000020d1389b1b35846326a2f4d4e5d7e7168a2e58e3dd567d274433dbb97ca600b3cb0008a00f0000000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210202010000010101000101020000010200a992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f01916e35a0ac6b525b7d38a44b667394aaee7cde41dffc876980cfbc8845590cddae6e110200000000200003d57a579bf2932eee8fdca7d330b46b14330280dbc0af88efb937bf5fa0d1a992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675fe803000000000000565e27000000000000',
                                    scanIndex: 1,
                                    coin: 'tsui:deep',
                                    signableHex: 'cedade6c1c99e3531c90536fa228f0fb148f35605d1a4edfbe8eb739bdc99a48',
                                    derivationPath: 'm/1',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0xa992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f',
                                                valueString: '4000',
                                                value: new bignumber_js_1.default('4000'),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
                                                valueString: '4000',
                                                coinName: 'tsui:deep',
                                            },
                                        ],
                                        spendAmount: '4000',
                                        type: 'TokenTransfer',
                                    },
                                    feeInfo: {
                                        fee: 2580054,
                                        feeString: '2580054',
                                    },
                                    coinSpecific: {
                                        commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui:deep',
                    },
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '0000030100c548c220454d20e0712bd2858b07260c829a1c847f3818b47805961b574813abad6e110200000000207351f6517b6fb35d85682eb64971e6fc0b9a28628d1388e93db872dcf1f60ead000870170000000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210202010000010101000101020000010200c3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae3901d4bfefa532827d7619a58279a87db81632e267cc48e6b94ab81a4367f02cbefaaf6e11020000000020e36df9d0baaa69a9ee6f94e98c99d894a8aea631765dcfaa80322888f3a453a8c3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39e803000000000000565e27000000000000',
                                    scanIndex: 2,
                                    coin: 'tsui:deep',
                                    signableHex: 'd0551409d248accdd894713a4c03a6d8f240349a5e85b90aef019b5f426062c8',
                                    derivationPath: 'm/2',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0xc3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39',
                                                valueString: '6000',
                                                value: new bignumber_js_1.default('6000'),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
                                                valueString: '6000',
                                                coinName: 'tsui:deep',
                                            },
                                        ],
                                        spendAmount: '6000',
                                        type: 'TokenTransfer',
                                    },
                                    feeInfo: {
                                        fee: 2580054,
                                        feeString: '2580054',
                                    },
                                    coinSpecific: {
                                        commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
                                        lastScanIndex: 2,
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui:deep',
                    },
                ],
            });
            sandBox.assert.callCount(basecoin.getBalance, 4);
            sandBox.assert.callCount(basecoin.getInputCoins, 4);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
        });
        it('should build unsigned token consolidation transactions for cold wallet with seed', async function () {
            getBalanceStub
                .withArgs(seedReceiveAddress1)
                .resolves('120199788')
                .withArgs(seedReceiveAddress1, coinType)
                .resolves('1500')
                .withArgs(seedReceiveAddress2)
                .resolves('120199788')
                .withArgs(seedReceiveAddress2, coinType)
                .resolves('2000');
            getInputCoinsStub
                .withArgs(seedReceiveAddress1, coinType)
                .resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0xa7a8c91028035ab49977e72b084e145eb1c1ddcfe2e06925f0f833cef2d1f69f',
                    version: '34696878',
                    digest: 'CKiuXkFMaVkn12iKinZCr9aDHfGpCQiPdyZUQzNDJ9Qx',
                    balance: new bignumber_js_1.default('1500'),
                },
            ])
                .withArgs(seedReceiveAddress1)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x5eea0353f078016b71a84cb494e6f791e97cb8de5344def3baedffc89c27a4b5',
                    version: '34696879',
                    digest: '6KqrwjKHhJCe4DXfdH2yMLG8bXGcSQoTeJy4shghDbTZ',
                    balance: new bignumber_js_1.default('120000000'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0x86e728fd7242b3be60e9c1941add2c47fb655779108c3500a216310218748e2d',
                    version: '148',
                    digest: 'B9zJfEYkiXnAuLE6q3XFJeLbPc3K7qmjgDrHVvJnT5wa',
                    balance: new bignumber_js_1.default('199788'),
                },
            ])
                .withArgs(seedReceiveAddress2, coinType)
                .resolves([
                {
                    coinType: '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP',
                    objectId: '0xe191f166e71b1ef20ffda0c91b24da95ecc93b657c464d8a06f561d4692722f0',
                    version: '34696880',
                    digest: '4KyhzfPQcTUrnp4UBvR3GsPE3DLccVDEPgBjDxaWVRcr',
                    balance: new bignumber_js_1.default('2000'),
                },
            ])
                .withArgs(seedReceiveAddress2)
                .resolves([
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xd32f94889d0bfc05c24ed6c023d5d3d3654294a837d850d3738b0e352e1f4867',
                    version: '34696880',
                    digest: '5Po12YiuL3NkNTAvyWvRwtR55JviyPVbcDfTvCwQrTkr',
                    balance: new bignumber_js_1.default('120000000'),
                },
                {
                    coinType: '0x2::sui::SUI',
                    objectId: '0xfd66dbfe7a1497f210747b0532f62e6926cb144c75e519f2dfff17a4f6e515fc',
                    version: '149',
                    digest: '5eVcbbm3NTF6jqadTb4GjZMzn75KDZBqcspRz3sVrpbR',
                    balance: new bignumber_js_1.default('199788'),
                },
            ]);
            getFeeEstimateStub
                .withArgs('AAADAQCnqMkQKANatJl35ysIThRescHdz+LgaSXw+DPO8tH2n65uEQIAAAAAIKg8ZMeF2XLLbBdPQyPmfu8bYqCB2z/uaR5sG7Fobl7VAAjcBQAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECANIBVm5qC8Ag/S5vcum94iI/VQ1k2qYTmM2RfC91ATJKAV7qA1PweAFrcahMtJTm95HpfLjeU0Te87rt/8icJ6S1r24RAgAAAAAgTx4i+RgcLdA5q+vymM+WETpvCnqEqR4oY7RqQdNj2ozSAVZuagvAIP0ub3LpveIiP1UNZNqmE5jNkXwvdQEySugDAAAAAAAAAOH1BQAAAAAA')
                .resolves(new bignumber_js_1.default('2345504'))
                .withArgs('AAADAQDhkfFm5xse8g/9oMkbJNqV7Mk7ZXxGTYoG9WHUaSci8LBuEQIAAAAAIDFvokinBxoWyeL64lPM9mJVOpB0UOjZjDu+J1skPcQPAAjQBwAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECAC+l2DlL1r7FUluVUL9Dvgdbg0ItAQfAXHAJROPq7Cb5AdMvlIidC/wFwk7WwCPV09NlQpSoN9hQ03OLDjUuH0hnsG4RAgAAAAAgQUWJ0/tPZt++q7KnLYmAPWRRonn/W/XGYxzxY689zK8vpdg5S9a+xVJblVC/Q74HW4NCLQEHwFxwCUTj6uwm+egDAAAAAAAAAOH1BQAAAAAA')
                .resolves(new bignumber_js_1.default('2345504'));
            const res = await basecoin.recoverConsolidations({
                bitgoKey: sui_1.keys.bitgoKeyWithSeed,
                tokenContractAddress: packageId,
                startingScanIndex: 1,
                endingScanIndex: 3,
                seed: '123',
            });
            res.should.deepEqual({
                txRequests: [
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '0000030100a7a8c91028035ab49977e72b084e145eb1c1ddcfe2e06925f0f833cef2d1f69fae6e11020000000020a83c64c785d972cb6c174f4323e67eef1b62a081db3fee691e6c1bb1686e5ed50008dc05000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b24040202010000010101000101020000010200d201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a015eea0353f078016b71a84cb494e6f791e97cb8de5344def3baedffc89c27a4b5af6e110200000000204f1e22f9181c2dd039abebf298cf96113a6f0a7a84a91e2863b46a41d363da8cd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324ae803000000000000565e27000000000000',
                                    scanIndex: 1,
                                    coin: 'tsui:deep',
                                    signableHex: '22defa9101ea3a3839c3c0026b27a9837165c07fcecff8e94353bcf3d5a01328',
                                    derivationPath: 'm/999999/94862622/157363509/1',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a',
                                                valueString: '1500',
                                                value: new bignumber_js_1.default('1500'),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
                                                valueString: '1500',
                                                coinName: 'tsui:deep',
                                            },
                                        ],
                                        spendAmount: '1500',
                                        type: 'TokenTransfer',
                                    },
                                    feeInfo: {
                                        fee: 2580054,
                                        feeString: '2580054',
                                    },
                                    coinSpecific: {
                                        commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui:deep',
                    },
                    {
                        transactions: [
                            {
                                unsignedTx: {
                                    serializedTx: '0000030100e191f166e71b1ef20ffda0c91b24da95ecc93b657c464d8a06f561d4692722f0b06e11020000000020316fa248a7071a16c9e2fae253ccf662553a907450e8d98c3bbe275b243dc40f0008d007000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b240402020100000101010001010200000102002fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f901d32f94889d0bfc05c24ed6c023d5d3d3654294a837d850d3738b0e352e1f4867b06e11020000000020414589d3fb4f66dfbeabb2a72d89803d6451a279ff5bf5c6631cf163af3dccaf2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9e803000000000000565e27000000000000',
                                    scanIndex: 2,
                                    coin: 'tsui:deep',
                                    signableHex: '2e6bb17166ee197102729bda47b06b7c0b5962bf431bbb0562b91e267b75129d',
                                    derivationPath: 'm/999999/94862622/157363509/2',
                                    parsedTx: {
                                        inputs: [
                                            {
                                                address: '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9',
                                                valueString: '2000',
                                                value: new bignumber_js_1.default('2000'),
                                            },
                                        ],
                                        outputs: [
                                            {
                                                address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
                                                valueString: '2000',
                                                coinName: 'tsui:deep',
                                            },
                                        ],
                                        spendAmount: '2000',
                                        type: 'TokenTransfer',
                                    },
                                    feeInfo: {
                                        fee: 2580054,
                                        feeString: '2580054',
                                    },
                                    coinSpecific: {
                                        commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
                                        lastScanIndex: 2,
                                    },
                                },
                                signatureShares: [],
                            },
                        ],
                        walletCoin: 'tsui:deep',
                    },
                ],
            });
            sandBox.assert.callCount(basecoin.getBalance, 4);
            sandBox.assert.callCount(basecoin.getInputCoins, 4);
            sandBox.assert.callCount(basecoin.getFeeEstimate, 2);
        });
    });
    describe('Create Broadcastable MPC Transaction', () => {
        it('create broadcastable MPC transaction for OVC signed sweep transaction', async function () {
            const signatureShares = {
                signatureShares: [
                    {
                        txRequest: {
                            transactions: [
                                {
                                    unsignedTx: {
                                        serializedTx: '0000020008c88b902f000000000020df407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c020200010100000101020000010100016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421014553b0f6f79ed95942141835de3ab086bf38d1f1d96272981e1390b84fb86b36c900000000000000200b1de8fdfbbb8a6fa2c65ec79a55703c9a9f0c2685a768f2b81a0426bc932ec3016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000a48821000000000000',
                                        scanIndex: 0,
                                        coin: 'tsui',
                                        signableHex: 'a4ce8eb11362cd45c09936e745044dc78b2689e5d8147b9ea9a7de43ee43923a',
                                        derivationPath: 'm/0',
                                        parsedTx: {
                                            inputs: [
                                                {
                                                    address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
                                                    valueString: '798002120',
                                                    value: {
                                                        s: 1,
                                                        e: 8,
                                                        c: [798002120],
                                                    },
                                                },
                                            ],
                                            outputs: [
                                                {
                                                    address: '0xdf407e3e25e9400f9779ac7571537c2361684194f1aa5db126a8f574b5ed851c',
                                                    valueString: '798002120',
                                                    coinName: 'tsui',
                                                },
                                            ],
                                            spendAmount: '798002120',
                                            type: 'Transfer',
                                        },
                                        feeInfo: {
                                            fee: 2197668,
                                            feeString: '2197668',
                                        },
                                        coinSpecific: {
                                            commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
                                        },
                                    },
                                    signatureShares: [],
                                    signatureShare: {
                                        from: 'backup',
                                        to: 'user',
                                        share: '6f470906df88c33b27c8d113ed944ed0a4fc499ba6cc76f00b8924942812d7835792ee455cbc8941faba7bcc93b15a9cd198a20dc3f0b629f5fdceab34e66100',
                                        publicShare: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
                                    },
                                },
                            ],
                            walletCoin: 'tsui',
                        },
                        tssVersion: '0.0.1',
                        ovc: [
                            {
                                eddsaSignature: {
                                    y: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
                                    R: '6f470906df88c33b27c8d113ed944ed0a4fc499ba6cc76f00b8924942812d783',
                                    sigma: '5c23a8c72ce192731e702da460aea79ed66334b4a783dcf6dd2758347d6c9f0d',
                                },
                            },
                        ],
                    },
                ],
            };
            const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
            res.should.deepEqual({
                transactions: [
                    {
                        serializedTx: 'AAACAAjIi5AvAAAAAAAg30B+PiXpQA+Xeax1cVN8I2FoQZTxql2xJqj1dLXthRwCAgABAQAAAQECAAABAQABZJXd2nSMEWohgkKDXTZHCdbF7lyKHtaExO9DPTFEIQFFU7D2957ZWUIUGDXeOrCGvzjR8dlicpgeE5C4T7hrNskAAAAAAAAAIAsd6P37u4pvosZex5pVcDyanwwmhado8rgaBCa8ky7DAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCHoAwAAAAAAAKSIIQAAAAAAAA==',
                        scanIndex: 0,
                        signature: 'AG9HCQbfiMM7J8jRE+2UTtCk/Embpsx28AuJJJQoEteDXCOoxyzhknMecC2kYK6nntZjNLSng9z23SdYNH1snw0oRJbKBMxgOCP3mTrvE/cvMx2XCFshhNempGOpCqkn0A==',
                        recoveryAmount: '798002120',
                    },
                ],
                lastScanIndex: 0,
            });
        });
        it('create broadcastable MPC token transaction for OVC signed sweep transaction', async function () {
            const signatureShares = {
                signatureShares: [
                    {
                        txRequest: {
                            transactions: [
                                {
                                    unsignedTx: {
                                        serializedTx: '000004010072ad99130abd3790db7bac8908d50d3412a800a8fcd10c1cfbd64b8215537558a16e1102000000002007b85d38b6e1b485f1455930d27296108081caacd7664c48d7d5f48572ee2bbd01004c1cccc6d03510bd74a95f81b2b7da08119cb18e2c565435e7ad715e6aadc5a7696e110200000000208fb4a334b829acdecbfa2a328642afa24d6f953740f7683080ee0e4b3d3a962f0008f82a000000000000002091f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da303030100000101010002010000010102000101020100010300016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d3144210198114f2ddefe3f16d9d2e016194b52c4c3af430c1601bdb3539cbd237cbca068696e11020000000020b516a15b5034bcd42425440c564cf36f439542f88671ef799dde0661e789a009016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421e803000000000000f86411000000000000',
                                        scanIndex: 0,
                                        coin: 'tsui:deep',
                                        signableHex: '449ade19590685b1eb0cefcb2ec41f4c68e37d8eaf75687c45965e288e71caa4',
                                        derivationPath: 'm/0',
                                        parsedTx: {
                                            inputs: [
                                                {
                                                    address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
                                                    valueString: '11000',
                                                    value: {
                                                        s: 1,
                                                        e: 4,
                                                        c: [11000],
                                                    },
                                                },
                                            ],
                                            outputs: [
                                                {
                                                    address: '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3',
                                                    valueString: '11000',
                                                    coinName: 'tsui:deep',
                                                },
                                            ],
                                            spendAmount: '11000',
                                            type: 'TokenTransfer',
                                        },
                                        feeInfo: {
                                            fee: 1139960,
                                            feeString: '1139960',
                                        },
                                        coinSpecific: {
                                            commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
                                        },
                                    },
                                    signatureShares: [],
                                    signatureShare: {
                                        from: 'backup',
                                        to: 'user',
                                        share: '23c53e54f271386578d99a6932ff708960900188ab3e5bce1aec1f019e53a85d3197f8b64a9feadbedbbd37aa42e4444609f000743adc0a94ffcc721c7057d04',
                                        publicShare: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
                                    },
                                },
                            ],
                            walletCoin: 'tsui:deep',
                        },
                        tssVersion: '0.0.1',
                        ovc: [
                            {
                                eddsaSignature: {
                                    y: '284496ca04cc603823f7993aef13f72f331d97085b2184d7a6a463a90aa927d0',
                                    R: '23c53e54f271386578d99a6932ff708960900188ab3e5bce1aec1f019e53a85d',
                                    sigma: '9b52b45c4d539fad906805f9fcbab6fb5e4152243caee252855c36c34048cc09',
                                },
                            },
                        ],
                    },
                ],
            };
            const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
            res.should.deepEqual({
                transactions: [
                    {
                        serializedTx: 'AAAEAQByrZkTCr03kNt7rIkI1Q00EqgAqPzRDBz71kuCFVN1WKFuEQIAAAAAIAe4XTi24bSF8UVZMNJylhCAgcqs12ZMSNfV9IVy7iu9AQBMHMzG0DUQvXSpX4Gyt9oIEZyxjixWVDXnrXFeaq3Fp2luEQIAAAAAII+0ozS4Kazey/oqMoZCr6JNb5U3QPdoMIDuDks9OpYvAAj4KgAAAAAAAAAgkfJeI3uDoApick/cSoHkP0lNxrQaEkFJKCbTbk0THaMDAwEAAAEBAQACAQAAAQECAAEBAgEAAQMAAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCEBmBFPLd7+PxbZ0uAWGUtSxMOvQwwWAb2zU5y9I3y8oGhpbhECAAAAACC1FqFbUDS81CQlRAxWTPNvQ5VC+IZx73md3gZh54mgCQFkld3adIwRaiGCQoNdNkcJ1sXuXIoe1oTE70M9MUQh6AMAAAAAAAD4ZBEAAAAAAAA=',
                        scanIndex: 0,
                        signature: 'ACPFPlTycThleNmaaTL/cIlgkAGIqz5bzhrsHwGeU6hdm1K0XE1Tn62QaAX5/Lq2+15BUiQ8ruJShVw2w0BIzAkoRJbKBMxgOCP3mTrvE/cvMx2XCFshhNempGOpCqkn0A==',
                        recoveryAmount: '11000',
                    },
                ],
                lastScanIndex: 0,
            });
        });
        it('create broadcastable MPC transaction for OVC signed consolidation transactions', async function () {
            const signatureShares = {
                signatureShares: [
                    {
                        txRequest: {
                            transactions: [
                                {
                                    unsignedTx: {
                                        serializedTx: '000002000820c2d605000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421020200010100000101020000010100a992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f01568beffe7651033a081a7375a3bb43d4d2a8e290a396e826236e73d0973b49b5d000000000000000208bc0764a454de7538b5ecea6fd0bd221c9c85207af297612944a967d43e8dd3ba992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675fe803000000000000a48821000000000000',
                                        scanIndex: 1,
                                        coin: 'tsui',
                                        signableHex: '857a2f26687c011a61a060a41d4c80c10b2fd31e98fe6704d6bcda26f57b03bb',
                                        derivationPath: 'm/1',
                                        parsedTx: {
                                            inputs: [
                                                {
                                                    address: '0xa992709591deb7471fb30dda0f339db7ab548d3391a89d3f1fa0c72d2092675f',
                                                    valueString: '97960480',
                                                    value: {
                                                        s: 1,
                                                        e: 7,
                                                        c: [97960480],
                                                    },
                                                },
                                            ],
                                            outputs: [
                                                {
                                                    address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
                                                    valueString: '97960480',
                                                    coinName: 'tsui',
                                                },
                                            ],
                                            spendAmount: '97960480',
                                            type: 'Transfer',
                                        },
                                        feeInfo: {
                                            fee: 2197668,
                                            feeString: '2197668',
                                        },
                                        coinSpecific: {
                                            commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
                                        },
                                    },
                                    signatureShares: [],
                                    signatureShare: {
                                        from: 'backup',
                                        to: 'user',
                                        share: 'cdfe15d7c0f80f8aad89d878706673ce242947b126852c00ee309ef05f7a8301b2e902b90d37ea7dfe86ce79c7a99b2b27a175c3f714c310fd9e10ea877cc60f',
                                        publicShare: 'e445bd092a467df577001cfbd6081b1445ca0f75147233561ed2f53f6a30e45a',
                                    },
                                },
                            ],
                            walletCoin: 'tsui',
                        },
                        tssVersion: '0.0.1',
                        ovc: [
                            {
                                eddsaSignature: {
                                    y: 'e445bd092a467df577001cfbd6081b1445ca0f75147233561ed2f53f6a30e45a',
                                    R: 'cdfe15d7c0f80f8aad89d878706673ce242947b126852c00ee309ef05f7a8301',
                                    sigma: '2a31329b2e5ef8c3f222eb91cd9d70e716f229ee19d3ca9417c8acc16b1da100',
                                },
                            },
                        ],
                    },
                    {
                        txRequest: {
                            transactions: [
                                {
                                    unsignedTx: {
                                        serializedTx: '000002000800c2eb0b000000000020016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421020200010100000101020000010100c3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae3901d68feb4780886ccfa81a37036958ec9c8bfabfe75a0bb7c4d1a4587992343f5bcf00000000000000205ad4f631a378f8b09542d4df66942b6dabb2f65cb20cf8f628c91c64f9352e4ec3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39e803000000000000a48821000000000000',
                                        scanIndex: 2,
                                        coin: 'tsui',
                                        signableHex: 'f2b56a74e787b2a98decf189e71b1e0c5d4ccee88697b3991a48de2910676020',
                                        derivationPath: 'm/2',
                                        parsedTx: {
                                            inputs: [
                                                {
                                                    address: '0xc3ac2a86e35b62bfada83f6388ff27c7dda7092cf0b829d2d1f4c2813e28ae39',
                                                    valueString: '200000000',
                                                    value: {
                                                        s: 1,
                                                        e: 8,
                                                        c: [200000000],
                                                    },
                                                },
                                            ],
                                            outputs: [
                                                {
                                                    address: '0x016495ddda748c116a218242835d364709d6c5ee5c8a1ed684c4ef433d314421',
                                                    valueString: '200000000',
                                                    coinName: 'tsui',
                                                },
                                            ],
                                            spendAmount: '200000000',
                                            type: 'Transfer',
                                        },
                                        feeInfo: {
                                            fee: 2197668,
                                            feeString: '2197668',
                                        },
                                        coinSpecific: {
                                            commonKeychain: '79d4b9b594df028fee3725a6af51ae3ab6a3519e9d2c322f2c8fd815b96496323c5aba7ea874c102f966f1a61d3c9a42b5f3177c6a85712cf313715afddf83d8',
                                            lastScanIndex: 20,
                                        },
                                    },
                                    signatureShares: [],
                                    signatureShare: {
                                        from: 'backup',
                                        to: 'user',
                                        share: '3518613ea5cefa36cd22e1b092742d8d052744188518040397f1a65a754f9e95324889312d70146811dbdc2a96245c518e16fc61bd1a5a2b53b53ebcec5d4a03',
                                        publicShare: '4b143a12835bdda04831a9ed851f9eadd7ba5b46e9c07fd087b751f46a3f364d',
                                    },
                                },
                            ],
                            walletCoin: 'tsui',
                        },
                        tssVersion: '0.0.1',
                        ovc: [
                            {
                                eddsaSignature: {
                                    y: '4b143a12835bdda04831a9ed851f9eadd7ba5b46e9c07fd087b751f46a3f364d',
                                    R: '3518613ea5cefa36cd22e1b092742d8d052744188518040397f1a65a754f9e95',
                                    sigma: '2df48ed60ff62b0e8689c5ebe57318f3dad76288647524b420acf7b1a84cc000',
                                },
                            },
                        ],
                    },
                ],
            };
            const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
            res.should.deepEqual({
                transactions: [
                    {
                        serializedTx: 'AAACAAggwtYFAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgABAQAAAQECAAABAQCpknCVkd63Rx+zDdoPM523q1SNM5GonT8foMctIJJnXwFWi+/+dlEDOggac3Wju0PU0qjikKOW6CYjbnPQlztJtdAAAAAAAAAAIIvAdkpFTedTi17Opv0L0iHJyFIHryl2EpRKln1D6N07qZJwlZHet0cfsw3aDzOdt6tUjTORqJ0/H6DHLSCSZ1/oAwAAAAAAAKSIIQAAAAAAAA==',
                        scanIndex: 1,
                        signature: 'AM3+FdfA+A+KrYnYeHBmc84kKUexJoUsAO4wnvBfeoMBKjEymy5e+MPyIuuRzZ1w5xbyKe4Z08qUF8iswWsdoQDkRb0JKkZ99XcAHPvWCBsURcoPdRRyM1Ye0vU/ajDkWg==',
                        recoveryAmount: '97960480',
                    },
                    {
                        serializedTx: 'AAACAAgAwusLAAAAAAAgAWSV3dp0jBFqIYJCg102RwnWxe5cih7WhMTvQz0xRCECAgABAQAAAQECAAABAQDDrCqG41tiv62oP2OI/yfH3acJLPC4KdLR9MKBPiiuOQHWj+tHgIhsz6gaNwNpWOyci/q/51oLt8TRpFh5kjQ/W88AAAAAAAAAIFrU9jGjePiwlULU32aUK22rsvZcsgz49ijJHGT5NS5Ow6wqhuNbYr+tqD9jiP8nx92nCSzwuCnS0fTCgT4orjnoAwAAAAAAAKSIIQAAAAAAAA==',
                        scanIndex: 2,
                        signature: 'ADUYYT6lzvo2zSLhsJJ0LY0FJ0QYhRgEA5fxplp1T56VLfSO1g/2Kw6GicXr5XMY89rXYohkdSS0IKz3sahMwABLFDoSg1vdoEgxqe2FH56t17pbRunAf9CHt1H0aj82TQ==',
                        recoveryAmount: '200000000',
                    },
                ],
                lastScanIndex: 20,
            });
        });
        it('create broadcastable MPC transaction for OVC signed token consolidation transactions', async function () {
            const signatureShares = {
                signatureShares: [
                    {
                        txRequest: {
                            transactions: [
                                {
                                    unsignedTx: {
                                        serializedTx: '0000030100a7a8c91028035ab49977e72b084e145eb1c1ddcfe2e06925f0f833cef2d1f69fae6e11020000000020a83c64c785d972cb6c174f4323e67eef1b62a081db3fee691e6c1bb1686e5ed50008dc05000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b24040202010000010101000101020000010200d201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a015eea0353f078016b71a84cb494e6f791e97cb8de5344def3baedffc89c27a4b5af6e110200000000204f1e22f9181c2dd039abebf298cf96113a6f0a7a84a91e2863b46a41d363da8cd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324ae803000000000000565e27000000000000',
                                        scanIndex: 1,
                                        coin: 'tsui:deep',
                                        signableHex: '22defa9101ea3a3839c3c0026b27a9837165c07fcecff8e94353bcf3d5a01328',
                                        derivationPath: 'm/999999/94862622/157363509/1',
                                        parsedTx: {
                                            inputs: [
                                                {
                                                    address: '0xd201566e6a0bc020fd2e6f72e9bde2223f550d64daa61398cd917c2f7501324a',
                                                    valueString: '1500',
                                                    value: {
                                                        s: 1,
                                                        e: 3,
                                                        c: [1500],
                                                    },
                                                },
                                            ],
                                            outputs: [
                                                {
                                                    address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
                                                    valueString: '1500',
                                                    coinName: 'tsui:deep',
                                                },
                                            ],
                                            spendAmount: '1500',
                                            type: 'TokenTransfer',
                                        },
                                        feeInfo: {
                                            fee: 2580054,
                                            feeString: '2580054',
                                        },
                                        coinSpecific: {
                                            commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
                                        },
                                    },
                                    signatureShares: [],
                                    signatureShare: {
                                        from: 'backup',
                                        to: 'user',
                                        share: '1989420ce800e35e1c590907f2017b5529945484b3ff884f8e88390da88936e6a5844e4860df0f489e2a0975519c1d6f5f0255dd091edbf859c74063a7f1e20e',
                                        publicShare: '408c7a11967152efee953f3eb16191004946685fdc4dd8087b91e3afcb77c916',
                                    },
                                },
                            ],
                            walletCoin: 'tsui:deep',
                        },
                        tssVersion: '0.0.1',
                        ovc: [
                            {
                                eddsaSignature: {
                                    y: '408c7a11967152efee953f3eb16191004946685fdc4dd8087b91e3afcb77c916',
                                    R: '1989420ce800e35e1c590907f2017b5529945484b3ff884f8e88390da88936e6',
                                    sigma: 'c2ce528f1f323fe9af256abb57428973b2e97e4fa54fa6f50c3943036815860e',
                                },
                            },
                        ],
                    },
                    {
                        txRequest: {
                            transactions: [
                                {
                                    unsignedTx: {
                                        serializedTx: '0000030100e191f166e71b1ef20ffda0c91b24da95ecc93b657c464d8a06f561d4692722f0b06e11020000000020316fa248a7071a16c9e2fae253ccf662553a907450e8d98c3bbe275b243dc40f0008d007000000000000002088c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b240402020100000101010001010200000102002fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f901d32f94889d0bfc05c24ed6c023d5d3d3654294a837d850d3738b0e352e1f4867b06e11020000000020414589d3fb4f66dfbeabb2a72d89803d6451a279ff5bf5c6631cf163af3dccaf2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9e803000000000000565e27000000000000',
                                        scanIndex: 2,
                                        coin: 'tsui:deep',
                                        signableHex: '2e6bb17166ee197102729bda47b06b7c0b5962bf431bbb0562b91e267b75129d',
                                        derivationPath: 'm/999999/94862622/157363509/2',
                                        parsedTx: {
                                            inputs: [
                                                {
                                                    address: '0x2fa5d8394bd6bec5525b9550bf43be075b83422d0107c05c700944e3eaec26f9',
                                                    valueString: '2000',
                                                    value: {
                                                        s: 1,
                                                        e: 3,
                                                        c: [2000],
                                                    },
                                                },
                                            ],
                                            outputs: [
                                                {
                                                    address: '0x88c99e0db89cba1db97cbadd7f37b2a4b2a2b4022594a0c04b2bcc837e4b2404',
                                                    valueString: '2000',
                                                    coinName: 'tsui:deep',
                                                },
                                            ],
                                            spendAmount: '2000',
                                            type: 'TokenTransfer',
                                        },
                                        feeInfo: {
                                            fee: 2580054,
                                            feeString: '2580054',
                                        },
                                        coinSpecific: {
                                            commonKeychain: 'ca0a014ba6f11106a155ef8e2cab2f76d277e4f01cffa591a9b40848343823b3d910752a49c96bf5813985206e23c9f9cd3a78f1cccf5cf88def52b573cedc93',
                                            lastScanIndex: 20,
                                        },
                                    },
                                    signatureShares: [],
                                    signatureShare: {
                                        from: 'backup',
                                        to: 'user',
                                        share: '9e1d0fd6640780cf4dc209fa6ed8957d6958e0d0272d8a2fd48438c011f67a2200de1a78e23bc2a7d261d0d02a422145301aa9ce97d3d306b3501b1f44d95606',
                                        publicShare: '362d716a5a230d683b60d29ece941197e09627c234c71449facab514c3a7abaf',
                                    },
                                },
                            ],
                            walletCoin: 'tsui:deep',
                        },
                        tssVersion: '0.0.1',
                        ovc: [
                            {
                                eddsaSignature: {
                                    y: '362d716a5a230d683b60d29ece941197e09627c234c71449facab514c3a7abaf',
                                    R: '9e1d0fd6640780cf4dc209fa6ed8957d6958e0d0272d8a2fd48438c011f67a22',
                                    sigma: '15a82f7c4aedb9ebd4ab481b4281d6fcadb2a8422635f16e4e31967097001806',
                                },
                            },
                        ],
                    },
                ],
            };
            const res = await basecoin.createBroadcastableSweepTransaction(signatureShares);
            res.should.deepEqual({
                transactions: [
                    {
                        serializedTx: 'AAADAQCnqMkQKANatJl35ysIThRescHdz+LgaSXw+DPO8tH2n65uEQIAAAAAIKg8ZMeF2XLLbBdPQyPmfu8bYqCB2z/uaR5sG7Fobl7VAAjcBQAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECANIBVm5qC8Ag/S5vcum94iI/VQ1k2qYTmM2RfC91ATJKAV7qA1PweAFrcahMtJTm95HpfLjeU0Te87rt/8icJ6S1r24RAgAAAAAgTx4i+RgcLdA5q+vymM+WETpvCnqEqR4oY7RqQdNj2ozSAVZuagvAIP0ub3LpveIiP1UNZNqmE5jNkXwvdQEySugDAAAAAAAAVl4nAAAAAAAA',
                        scanIndex: 1,
                        signature: 'ABmJQgzoAONeHFkJB/IBe1UplFSEs/+IT46IOQ2oiTbmws5Sjx8yP+mvJWq7V0KJc7Lpfk+lT6b1DDlDA2gVhg5AjHoRlnFS7+6VPz6xYZEASUZoX9xN2Ah7keOvy3fJFg==',
                        recoveryAmount: '1500',
                    },
                    {
                        serializedTx: 'AAADAQDhkfFm5xse8g/9oMkbJNqV7Mk7ZXxGTYoG9WHUaSci8LBuEQIAAAAAIDFvokinBxoWyeL64lPM9mJVOpB0UOjZjDu+J1skPcQPAAjQBwAAAAAAAAAgiMmeDbicuh25fLrdfzeypLKitAIllKDASyvMg35LJAQCAgEAAAEBAQABAQIAAAECAC+l2DlL1r7FUluVUL9Dvgdbg0ItAQfAXHAJROPq7Cb5AdMvlIidC/wFwk7WwCPV09NlQpSoN9hQ03OLDjUuH0hnsG4RAgAAAAAgQUWJ0/tPZt++q7KnLYmAPWRRonn/W/XGYxzxY689zK8vpdg5S9a+xVJblVC/Q74HW4NCLQEHwFxwCUTj6uwm+egDAAAAAAAAVl4nAAAAAAAA',
                        scanIndex: 2,
                        signature: 'AJ4dD9ZkB4DPTcIJ+m7YlX1pWODQJy2KL9SEOMAR9noiFagvfErtuevUq0gbQoHW/K2yqEImNfFuTjGWcJcAGAY2LXFqWiMNaDtg0p7OlBGX4JYnwjTHFEn6yrUUw6errw==',
                        recoveryAmount: '2000',
                    },
                ],
                lastScanIndex: 20,
            });
        });
    });
    describe('Recover Transaction Failures:', () => {
        const sandBox = sinon_1.default.createSandbox();
        const senderAddress0 = '0x91f25e237b83a00a62724fdc4a81e43f494dc6b41a1241492826d36e4d131da3';
        const recoveryDestination = '0x00e4eaa6a291fe02918452e645b5653cd260a5fc0fb35f6193d580916aa9e389';
        const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
        afterEach(function () {
            sandBox.restore();
        });
        it('should fail to recover due to non-zero fund but insufficient funds address', async function () {
            const callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
            callBack.withArgs(senderAddress0).resolves('9800212');
            await basecoin
                .recover({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                recoveryDestination,
                walletPassphrase,
                startingScanIndex: '0',
                scan: 1,
            })
                .should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 1. If it is token transaction, please keep sufficient Sui balance in the address for the transaction fee.');
            sandBox.assert.callCount(basecoin.getBalance, 1);
        });
        it('should fail to recover due to not finding an address with funds', async function () {
            const callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
            callBack.resolves('0');
            await basecoin
                .recover({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                recoveryDestination,
                walletPassphrase,
                scan: '10',
            })
                .should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 10. If it is token transaction, please keep sufficient Sui balance in the address for the transaction fee.');
            sandBox.assert.callCount(basecoin.getBalance, 10);
        });
    });
    describe('Consolidation Transaction Failures:', () => {
        it('should fail due to insufficient funds in receive address', async function () {
            const sandBox = sinon_1.default.createSandbox();
            const receiveAddress1 = '0x32d8e57ee6d91e5558da0677154c2f085795348e317f95acc9efade1b4112fcc';
            const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
            const callBack = sandBox.stub(src_1.Sui.prototype, 'getBalance');
            callBack.withArgs(receiveAddress1).resolves('1');
            await basecoin
                .recoverConsolidations({
                userKey: sui_1.keys.userKey,
                backupKey: sui_1.keys.backupKey,
                bitgoKey: sui_1.keys.bitgoKey,
                walletPassphrase,
                startingScanIndex: '1',
                endingScanIndex: '2',
            })
                .should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 2.');
            sandBox.assert.callCount(basecoin.getBalance, 1);
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3N1aS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw4Q0FBMEQ7QUFDMUQsNENBQTBDO0FBQzFDLG1DQUFxRjtBQUNyRiwyREFBNkM7QUFDN0Msb0RBQXVCO0FBQ3ZCLGtEQUEwQjtBQUMxQixnRUFBcUM7QUFDckMsb0RBQTRCO0FBQzVCLCtDQUF5RDtBQUN6RCwyREFBd0Q7QUFDeEQsMENBQXdDO0FBQ3hDLG1DQUFnQztBQUVoQyxRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksUUFBUSxDQUFDO0lBQ2IsSUFBSSxhQUFhLENBQUM7SUFDbEIsSUFBSSxXQUFXLENBQUM7SUFFaEIsTUFBTSxVQUFVLEdBQUc7UUFDakIsS0FBSyxFQUFFLGVBQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQy9ELE1BQU0sRUFBRSxFQUFFO0tBQ1gsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHO1FBQ2YsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0tBQ2hDLENBQUM7SUFFRixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUss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aXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuaW1wb3J0IHsgU3VpLCBUb2tlblRyYW5zZmVyVHJhbnNhY3Rpb24sIFRyYW5zZmVyVHJhbnNhY3Rpb24sIFRzdWkgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3N1aSc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFN1aVRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IGtleXMgfSBmcm9tICcuLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5cbmRlc2NyaWJlKCdTVUk6JywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuICBsZXQgbmV3VHhQcmVidWlsZDtcbiAgbGV0IG5ld1R4UGFyYW1zO1xuXG4gIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLlRSQU5TRkVSLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgIHR4SW5mbzoge30sXG4gIH07XG5cbiAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgcmVjaXBpZW50czogdGVzdERhdGEucmVjaXBpZW50cyxcbiAgfTtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3Rlcignc3VpJywgU3VpLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RzdWknLCBUc3VpLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RzdWknKTtcbiAgICBuZXdUeFByZWJ1aWxkID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKHR4UHJlYnVpbGQpO1xuICAgIH07XG4gICAgbmV3VHhQYXJhbXMgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQYXJhbXMpO1xuICAgIH07XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByaWdodCBpbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHN1aSA9IGJpdGdvLmNvaW4oJ3N1aScpO1xuICAgIGNvbnN0IHRzdWkgPSBiaXRnby5jb2luKCd0c3VpJyk7XG5cbiAgICBzdWkuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3N1aScpO1xuICAgIHN1aS5nZXRGYW1pbHkoKS5zaG91bGQuZXF1YWwoJ3N1aScpO1xuICAgIHN1aS5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnU3VpJyk7XG4gICAgc3VpLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWU5KTtcblxuICAgIHRzdWkuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3RzdWknKTtcbiAgICB0c3VpLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgnc3VpJyk7XG4gICAgdHN1aS5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdG5ldCBTdWknKTtcbiAgICB0c3VpLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWU5KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ZlcmlmeSB0cmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB2ZXJpZmljYXRpb24gfSk7XG4gICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50IGFyZSBudW1iZXJzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzID0gdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzLm1hcCgoeyBhZGRyZXNzLCBhbW91bnQgfSkgPT4ge1xuICAgICAgICByZXR1cm4geyBhZGRyZXNzLCBhbW91bnQ6IE51bWJlcihhbW91bnQpIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgfSk7XG4gICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcGFyYW0nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge307XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gdW5kZWZpbmVkO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSBzcGxpdCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHN1aScpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDEwMDAwMDAwMDA7XG4gICAgICBjb25zdCByZWNpcGllbnRzID0gbmV3IEFycmF5KDEwMCkuZmlsbCh7IGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLCBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiBCdWZmZXIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB0eEluZm86IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHZlcmlmeSA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICB9KTtcbiAgICAgIHZlcmlmeS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFeHBsYWluIFRyYW5zYWN0aW9uOiAnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OiBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5UUkFOU0ZFUiwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VPdXRwdXRzJywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAndHlwZSddLFxuICAgICAgICBpZDogJ0J4b2VHWGJCQ3V3NlZGRWNnd0hIVUFLckNvQXNHYW5QQjM5a2RWVktaWmNSJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEucmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzFdLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dEFtb3VudDogYCR7dGVzdERhdGEuQU1PVU5UICogMn1gLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6IHRlc3REYXRhLmdhc0RhdGEuYnVkZ2V0LnRvU3RyaW5nKCkgfSxcbiAgICAgICAgdHlwZTogMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgc3BsaXQgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OlxuICAgICAgICAgICcwMDAwNjUwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMjA1NzQ4OTVmZTgzYjQwOWIwMDllMmUwNDMzYWQxODIzZWMwZDUzOGFmN2ZlYTUyMzkwYTE5OGJkZmU3Njc2ZjEzMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwMDAwODAwY2E5YTNiMDAwMDAwMDAwMDA4MDBjYTlhM2IwMDAwMDAwMDAwMDgwMGNhOWEzYjAwMDAwMDAwYzgwMTAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDAwMjAwMDEwMTAyMDAwMTAxMDIwMjAwMDEwMTAwMDIwMDAxMDEwMzAwMDEwMTAyMDQwMDAxMDEwMDAyMDAwMTAxMDQwMDAxMDEwMjA2MDAwMTAxMDAwMjAwMDEwMTA1MDAwMTAxMDIwODAwMDEwMTAwMDIwMDAxMDEwNjAwMDEwMTAyMGEwMDAxMDEwMDAyMDAwMTAxMDcwMDAxMDEwMjBjMDAwMTAxMDAwMjAwMDEwMTA4MDAwMTAxMDIwZTAwMDEwMTAwMDIwMDAxMDEwOTAwMDEwMTAyMTAwMDAxMDEwMDAyMDAwMTAxMGEwMDAxMDEwMjEyMDAwMTAxMDAwMjAwMDEwMTBiMDAwMTAxMDIxNDAwMDEwMTAwMDIwMDAxMDEwYzAwMDEwMTAyMTYwMDAxMDEwMDAyMDAwMTAxMGQwMDAxMDEwMjE4MDAwMTAxMDAwMjAwMDEwMTBlMDAwMTAxMDIxYTAwMDEwMTAwMDIwMDAxMDEwZjAwMDEwMTAyMWMwMDAxMDEwMDAyMDAwMTAxMTAwMDAxMDEwMjFlMDAwMTAxMDAwMjAwMDEwMTExMDAwMTAxMDIyMDAwMDEwMTAwMDIwMDAxMDExMjAwMDEwMTAyMjIwMDAxMDEwMDAyMDAwMTAxMTMwMDAxMDEwMjI0MDAwMTAxMDAwMjAwMDEwMTE0MDAwMTAxMDIyNjAwMDEwMTAwMDIwMDAxMDExNTAwMDEwMTAyMjgwMDAxMDEwMDAyMDAwMTAxMTYwMDAxMDEwMjJhMDAwMTAxMDAwMjAwMDEwMTE3MDAwMTAxMDIyYzAwMDEwMTAwMDIwMDAxMDExODAwMDEwMTAyMmUwMDAxMDEwMDAyMDAwMTAxMTkwMDAxMDEwMjMwMDAwMTAxMDAwMjAwMDEwMTFhMDAwMTAxMDIzMjAwMDEwMTAwMDIwMDAxMDExYjAwMDEwMTAyMzQwMDAxMDEwMDAyMDAwMTAxMWMwMDAxMDEwMjM2MDAwMTAxMDAwMjAwMDEwMTFkMDAwMTAxMDIzODAwMDEwMTAwMDIwMDAxMDExZTAwMDEwMTAyM2EwMDAxMDEwMDAyMDAwMTAxMWYwMDAxMDEwMjNjMDAwMTAxMDAwMjAwMDEwMTIwMDAwMTAxMDIzZTAwMDEwMTAwMDIwMDAxMDEyMTAwMDEwMTAyNDAwMDAxMDEwMDAyMDAwMTAxMjIwMDAxMDEwMjQyMDAwMTAxMDAwMjAwMDEwMTIzMDAwMTAxMDI0NDAwMDEwMTAwMDIwMDAxMDEyNDAwMDEwMTAyNDYwMDAxMDEwMDAyMDAwMTAxMjUwMDAxMDEwMjQ4MDAwMTAxMDAwMjAwMDEwMTI2MDAwMTAxMDI0YTAwMDEwMTAwMDIwMDAxMDEyNzAwMDEwMTAyNGMwMDAxMDEwMDAyMDAwMTAxMjgwMDAxMDEwMjRlMDAwMTAxMDAwMjAwMDEwMTI5MDAwMTAxMDI1MDAwMDEwMTAwMDIwMDAxMDEyYTAwMDEwMTAyNTIwMDAxMDEwMDAyMDAwMTAxMmIwMDAxMDEwMjU0MDAwMTAxMDAwMjAwMDEwMTJjMDAwMTAxMDI1NjAwMDEwMTAwMDIwMDAxMDEyZDAwMDEwMTAyNTgwMDAxMDEwMDAyMDAwMTAxMmUwMDAxMDEwMjVhMDAwMTAxMDAwMjAwMDEwMTJmMDAwMTAxMDI1YzAwMDEwMTAwMDIwMDAxMDEzMDAwMDEwMTAyNWUwMDAxMDEwMDAyMDAwMTAxMzEwMDAxMDEwMjYwMDAwMTAxMDAwMjAwMDEwMTMyMDAwMTAxMDI2MjAwMDEwMTAwMDIwMDAxMDEzMzAwMDEwMTAyNjQwMDAxMDEwMDAyMDAwMTAxMzQwMDAxMDEwMjY2MDAwMTAxMDAwMjAwMDEwMTM1MDAwMTAxMDI2ODAwMDEwMTAwMDIwMDAxMDEzNjAwMDEwMTAyNmEwMDAxMDEwMDAyMDAwMTAxMzcwMDAxMDEwMjZjMDAwMTAxMDAwMjAwMDEwMTM4MDAwMTAxMDI2ZTAwMDEwMTAwMDIwMDAxMDEzOTAwMDEwMTAyNzAwMDAxMDEwMDAyMDAwMTAxM2EwMDAxMDEwMjcyMDAwMTAxMDAwMjAwMDEwMTNiMDAwMTAxMDI3NDAwMDEwMTAwMDIwMDAxMDEzYzAwMDEwMTAyNzYwMDAxMDEwMDAyMDAwMTAxM2QwMDAxMDEwMjc4MDAwMTAxMDAwMjAwMDEwMTNlMDAwMTAxMDI3YTAwMDEwMTAwMDIwMDAxMDEzZjAwMDEwMTAyN2MwMDAxMDEwMDAyMDAwMTAxNDAwMDAxMDEwMjdlMDAwMTAxMDAwMjAwMDEwMTQxMDAwMTAxMDI4MDAwMDEwMTAwMDIwMDAxMDE0MjAwMDEwMTAyODIwMDAxMDEwMDAyMDAwMTAxNDMwMDAxMDEwMjg0MDAwMTAxMDAwMjAwMDEwMTQ0MDAwMTAxMDI4NjAwMDEwMTAwMDIwMDAxMDE0NTAwMDEwMTAyODgwMDAxMDEwMDAyMDAwMTAxNDYwMDAxMDEwMjhhMDAwMTAxMDAwMjAwMDEwMTQ3MDAwMTAxMDI4YzAwMDEwMTAwMDIwMDAxMDE0ODAwMDEwMTAyOGUwMDAxMDEwMDAyMDAwMTAxNDkwMDAxMDEwMjkwMDAwMTAxMDAwMjAwMDEwMTRhMDAwMTAxMDI5MjAwMDEwMTAwMDIwMDAxMDE0YjAwMDEwMTAyOTQwMDAxMDEwMDAyMDAwMTAxNGMwMDAxMDEwMjk2MDAwMTAxMDAwMjAwMDEwMTRkMDAwMTAxMDI5ODAwMDEwMTAwMDIwMDAxMDE0ZTAwMDEwMTAyOWEwMDAxMDEwMDAyMDAwMTAxNGYwMDAxMDEwMjljMDAwMTAxMDAwMjAwMDEwMTUwMDAwMTAxMDI5ZTAwMDEwMTAwMDIwMDAxMDE1MTAwMDEwMTAyYTAwMDAxMDEwMDAyMDAwMTAxNTIwMDAxMDEwMmEyMDAwMTAxMDAwMjAwMDEwMTUzMDAwMTAxMDJhNDAwMDEwMTAwMDIwMDAxMDE1NDAwMDEwMTAyYTYwMDAxMDEwMDAyMDAwMTAxNTUwMDAxMDEwMmE4MDAwMTAxMDAwMjAwMDEwMTU2MDAwMTAxMDJhYTAwMDEwMTAwMDIwMDAxMDE1NzAwMDEwMTAyYWMwMDAxMDEwMDAyMDAwMTAxNTgwMDAxMDEwMmFlMDAwMTAxMDAwMjAwMDEwMTU5MDAwMTAxMDJiMDAwMDEwMTAwMDIwMDAxMDE1YTAwMDEwMTAyYjIwMDAxMDEwMDAyMDAwMTAxNWIwMDAxMDEwMmI0MDAwMTAxMDAwMjAwMDEwMTVjMDAwMTAxMDJiNjAwMDEwMTAwMDIwMDAxMDE1ZDAwMDEwMTAyYjgwMDAxMDEwMDAyMDAwMTAxNWUwMDAxMDEwMmJhMDAwMTAxMDAwMjAwMDEwMTVmMDAwMTAxMDJiYzAwMDEwMTAwMDIwMDAxMDE2MDAwMDEwMTAyYmUwMDAxMDEwMDAyMDAwMTAxNjEwMDAxMDEwMmMwMDAwMTAxMDAwMjAwMDEwMTYyMDAwMTAxMDJjMjAwMDEwMTAwMDIwMDAxMDE2MzAwMDEwMTAyYzQwMDAxMDEwMDAyMDAwMTAxNjQwMDAxMDEwMmM2MDAwMTAxMDA1NzQ4OTVmZTgzYjQwOWIwMDllMmUwNDMzYWQxODIzZWMwZDUzOGFmN2ZlYTUyMzkwYTE5OGJkZmU3Njc2ZjEzMDMwMzRmNDAzZmY5YjczYjU3OTRiNzlhODllYmJjZDgxMDMzMWZlYTUyODc4ZGIwYjRkYzFhMWM4OGY0YzBkYzU2MTYwMDAwMDAwMDAwMDAwMDIwMDNjYWY3ZTY3N2M3MmIyNDFkNjFkMDBlNjAwYjZkZjI1NjM5YzU4Mjk4N2QwYWE3OGNlZWEwYjk5NTNlYWM1MmE2MGIwZTUxZjlmZmEzOThmNmVlMWQzMTAxZDZjOWVmYTEzZDE4MDBlNDEyZDdlMDgzMmUyNjE2ZjE3OTNmZDc5Y2U5MTcwMDAwMDAwMDAwMjA1MDQzNWE0OWYwNjM1YmMyZjJjM2JiZGNlMDVhMTZiMjRmYWYwMzY4ZWRhYTI1YzhmYmNlMTZlZjYyNjAyZGE1Y2RhNDRhZTQ3ZjM4MGY0NWQzY2Q0OTExODgwZjRlOWEyNGI1MmZlNDI0NjgzYzY2Y2YzYzc3NjlkZDNjYTIyYzEwMDAwMDAwMDAwMDAwMDAyMDBjNzhmYTIwMjM2YmI4Njg3MWVhY2ZlMmI0ZjIxNThlYWE2OGY0ZjQ1NjVkOGNmOTg2NWVlOWYyNzllNGJkNDA1NzQ4OTVmZTgzYjQwOWIwMDllMmUwNDMzYWQxODIzZWMwZDUzOGFmN2ZlYTUyMzkwYTE5OGJkZmU3Njc2ZjEzZTgwMzAwMDAwMDAwMDAwMDAwZTFmNTA1MDAwMDAwMDAwMCcsXG4gICAgICB9KTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxMDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgc3Rha2luZyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLkFERF9TVEFLRSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ21vZHVsZScsXG4gICAgICAgICAgJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAndmFsaWRhdG9yQWRkcmVzcycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnYlA3OGJvWjQ4c0RkSnNnMlYxdEphaHBHeUJ3YUM5R1NUTDJydnlBRG5zaCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2UudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dEFtb3VudDogdGVzdERhdGEuU1RBS0lOR19BTU9VTlQudG9TdHJpbmcoKSxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBmZWU6IHsgZmVlOiB0ZXN0RGF0YS5nYXNEYXRhLmJ1ZGdldC50b1N0cmluZygpIH0sXG4gICAgICAgIHR5cGU6IDI1LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIG1pc3NpbmcgcGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHt9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbChlcnJvci5tZXNzYWdlLCAnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGV4cGxhaW4gdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiAncmFuZG9tU3RyaW5nJyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbChlcnJvci5tZXNzYWdlLCAnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyc2UgVHJhbnNhY3Rpb25zOiAnLCAoKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmZXJJbnB1dHNSZXNwb25zZSA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIodGVzdERhdGEuQU1PVU5UKS5wbHVzKHRlc3REYXRhLkFNT1VOVCkucGx1cyh0ZXN0RGF0YS5nYXNEYXRhLmJ1ZGdldCkudG9GaXhlZCgpLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgdHJhbnNmZXJPdXRwdXRzUmVzcG9uc2UgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5yZWNpcGllbnRzWzFdLmFtb3VudCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4ucGFyc2VUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OiBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5UUkFOU0ZFUiwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0pO1xuXG4gICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgaW5wdXRzOiB0cmFuc2ZlcklucHV0c1Jlc3BvbnNlLFxuICAgICAgICBvdXRwdXRzOiB0cmFuc2Zlck91dHB1dHNSZXNwb25zZSxcbiAgICAgICAgZmVlOiBuZXcgQmlnTnVtYmVyKDIwMDAwMDAwKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHBhcnNlIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2hlbiBleHBsYWluVHJhbnNhY3Rpb24gcmVzcG9uc2UgaXMgdW5kZWZpbmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3R1YiA9IHNpbm9uLnN0dWIoU3VpLnByb3RvdHlwZSwgJ2V4cGxhaW5UcmFuc2FjdGlvbicpO1xuICAgICAgc3R1Yi5yZXNvbHZlcyh1bmRlZmluZWQpO1xuICAgICAgYXdhaXQgYmFzZWNvaW4ucGFyc2VUcmFuc2FjdGlvbih7IHR4SGV4OiB0ZXN0RGF0YS5UUkFOU0ZFUiB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICBzdHViLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0FkZHJlc3MgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBsZXQga2V5Y2hhaW5zO1xuICAgIGxldCBjb21tb25LZXljaGFpbjtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICBjb21tb25LZXljaGFpbiA9XG4gICAgICAgICcxOWJkZmUyYTRiNDk4YTA1NTExMzgxMjM1YTg4OTJkNTQyNjc4MDdjNGEzZjY1NGUzMTBiOTM4YjhiNDI0ZmY0YWRlZGJlOTJmNGMxNDZkZTY0MWM2NzUwOGE5NjEzMjRjODUwNGNkZjhlMGMwYWNiYjY4ZDYxMDRjY2NjZDc4MSc7XG4gICAgICBrZXljaGFpbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJzY0MjRjMzUzZWFmNzhkMDAwNzY2ZTk1OTQ5ODY4NDY4JyxcbiAgICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICcxOWJkZmUyYTRiNDk4YTA1NTExMzgxMjM1YTg4OTJkNTQyNjc4MDdjNGEzZjY1NGUzMTBiOTM4YjhiNDI0ZmY0YWRlZGJlOTJmNGMxNDZkZTY0MWM2NzUwOGE5NjEzMjRjODUwNGNkZjhlMGMwYWNiYjY4ZDYxMDRjY2NjZDc4MScsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OlxuICAgICAgICAgICAgJ3tcIml2XCI6XCJjWmQ1aTdMNFJ4dHdyQUxXMnJLN1VBPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwiNXpnb0gxQmQzRnc9XCIsXCJjdFwiOlwiOXZWbG5YRlJ0ck05RlZFbytkMmNoYkdIbE05bEZaZW11ZUJ1QXMzQklrUG8zM0ZvN2p6d3dOSy9rSVdrRXlnK05tRUJkNUlhcUFTMTU3bnZ2dnd6enNtTVdsUWRVejlxYm1YTnYzcGc5ODdjWEZSMDhleFMrNHVod1AxWU5PakpUUnZSTmNPOVpxSGI0NmQ0Zm15Si95Qzkvc3VzQ2dlN3IvRXNiYU41QzNhZnYxZHp5YnVxOTEyRndhUUVsWkxZWXA1QklDdWRGT01aOWswVURNZktNL1BNRGtIN1dleG9HSHI5R0txL2JnQ0gyQjM5VFpaeUhLVTZVeTQ3bFhlcDJzNmgwRHJNd0hPcm5taUwzRFpqT2o4OFludnBobHp4dW80ZU9sRDJVSGlhMitudklhSVNZczI5UHIwREF2UkV1dGNodmNCcEV4ajFrV1dQdjdoUVlydjhGME5BZGF0c2JXbDN3K3hLeWZpTUtvMVVTbHJ3eUp2aXlwR3RRdFhPSnl3MFhQTjBydjIrTDVsVzhCYmpwekhmWVlOMTNmSlRlZGxHVEZoaGt6VnRiYlBBS0UwMmt4N3pDSmNqWWFpZXhkU1RzckRMU2NZTlQ5L0poZHQyN0twc29vZWh3Vm9oTGZTS3o0dmJGZlJ1Mk1QWnczLytjL2hmaUpOZ3R6NmVzV2JueEdyY0U4VTJJd1BZQ2FLK0doazREY3FXTkluaTU5Ukk1QjVrQXNRT1RvSUk0MHFQTjUxMHVUZ3hCU1BPN3E3TUhna3hkZDRDcUJxK29qcjlqMFA3b2FvOEU1WStDQkRKcm9qRG9DaDFvQ0NEVzl2bzJkWGxWY0Q4U0lidzdVLzlBZnZFYkE0eHlFLzVtZDFNN0NJd0xuV3MyWW52MFl0YUtvcWhkUzl4NkZtSGxNRGhOL0RLSGlucndtb3d0clRUODJmT2twTzVnOXNhU21nVTdReTNnTHQ4dCtWd2RFeWVGZVFVS1JTeWNpOHFncVhRYVpJZzQrYVhnYVNPbmxDRk10bUI4ZWtZeEVoVFk1dXpSZnJOZ1M0czFRZXFGQnBOdFVGK1lkaTI5N3BiVlhuSm9YQU4rU1ZXZDgwR0N4K3lJMmRwVkM4OWszck9XSzlXZXlxbG56dUxKV3AyUklPQjljZFc4R0Z2L2ZOK1FBSnBZZVZ4T0U0K25aRHNLbnNqOG5LY2c5dDREbHgxRzZnTE0xL1ZxOVl4TkxidXp1UkMwYXNVWXZkTW5vTXZzem1wbSsrVHhuZFlpc2dOWXNjcFpTb3o3d3ZjYXpKTkVQZmhQVmpFa2Q2dFVVdU40R00zNUgwRG1LQ1VRTlQrYTZCNmhtSGxUWnZqeGl5R0FnNWJZNTloZGp2SisyMlFkdWF6bEVFQzZMSTNIckE3dUswVHBwbFd6UzF0Q0lGdlRNVWhqNjVERVptTkoyK1pZOWJRNHZzTWYrRFJSM09PRzR0K0RNbE5mak9kM3pOdjNRb1k5NUJqZldwcnlGd1B6RHE3YkNQNjdKRHNvajdqMlRZNUZSU3JSa0Q3N0gwRXdsdXgyY1dmalJUd2NNSGNkUXh4dVYwT1AwYU5qR0RqeWJGTlwifScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJzY0MjRjMzUzZWFmNzhkMDAwNzY2ZTk2MTM3ZDQ0MDRiJyxcbiAgICAgICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAgICAgIHR5cGU6ICd0c3MnLFxuICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgJzE5YmRmZTJhNGI0OThhMDU1MTEzODEyMzVhODg5MmQ1NDI2NzgwN2M0YTNmNjU0ZTMxMGI5MzhiOGI0MjRmZjRhZGVkYmU5MmY0YzE0NmRlNjQxYzY3NTA4YTk2MTMyNGM4NTA0Y2RmOGUwYzBhY2JiNjhkNjEwNGNjY2NkNzgxJyxcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6XG4gICAgICAgICAgICAne1wiaXZcIjpcInZpMGRQZWYvUng3a0cvcFJ5U1FpNlE9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCI6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCI5ZWZoUXNpRXZWcz1cIixcImN0XCI6XCJHdzZhdHZmNmd4S3pzanRsM3hzZWlwTzNyQXhwMW1BejdZdTFpaEZzaTUvbGYydk1aZWdBcGdaeCtweUlMRlM5S0tMSGJORjNVNldnU1lkcnIydDR2emRMc1hrSDFXSXhmSFMrY2QyQzVONTl5QURaRG5QSkJUNnB2L0lSdmFZZWxQMENrM25JWVEyaFNNbThvcCtWT1dDL1N6SGVoN3NsWURxd0VIVEdhbjBXaWdmdmsxeVJkN0NDSlRhRUFvbW5jLzRlRmkyTlkzWDNndC8zb3B5OUlBZ2tubndVRm9objk2RVdwRVEwRjZwYnpIL1o4VkY2Z0YrRFVjcnJCeUF4RXhVUG5IUVppRmszWUhVL3ZWVjRGeEJVL21WQUU4eEJzQm41dWw1ZTVTVU1QZmM3VEJ1Sld2NEJCeVROZzl4RFNoRi85MVl4Mm5iZlVtNWQ5UW1NOGxwS2d6elF2Y0s4UE9BUGs4N2dSQ3VLbnNHaDV2TlMwVXBwa0hjK29jZnpSUWxHQTZqemU3UXl5UU8wck1qNUx5OGtXandrMnZJU3ZLWUhZUzFOUjdWVTU0OVVJWG83TlhqYXR1bktTYzMrSXJlb1JVSElzaGlhTGc2aGwrcHhDQ3VjMHFRNDNWMG1kSWZDalROOGdrR1dMTms4Ujd0QUdQejlqeWFwUVBjUEVHSGdFejBBVElpNnlNTldDc2liUzJlTGlFMXVWRUpPTm9NNGxrNkZQbDNRMkNIYlcyTWVFYnFqWThoYmF3MThtTmIyeFNCSC9Gd3BpaWFsK1R2aTJpbXFnbkNPNFpwTzlibGxLZnRaUGNReTBzdE4rZUdCbGI1dWZ5ZmxLa0RTaUNoSFlyb0dqRXBtaUZpY2RkZTQ4Y0pzekY1MnVLTm5mMXE2N2ZBOS9TMkZBSFFhYjNFWG9qeEgyR2JrK2trVjJoL1RZS0ZGWlNXQzN2aTRlOG1PK3ZqTVVjUjBBZHNnUEZ5RUl6MFNDR3ViYTNDblRMTmRFdVp3c2F1QWVIa3gydlVUblJnSlBWZ05lZXVYbXNWRzc2U3kyZ2dKSHVhbHMwSGo4VTJYZGEwcU8xUnVGZm9DV2Zzczl3bjZIR1J3UFBraFNCLzhvTmd1QXFtUlZHS2tkOFp3dDNJdnJUZDlmazAvckZGREpLR3o3V3lOSGtZZ1VtTmlHY0l0RDEydjBqeDdGWjUyRUp6bDNBdjFSeUpVUUsxOCs4RVlQaDNTR2lVOWR0N1ZYMGFGMHVvNkpvdUtoT2VsZFV2TVArQXVnUXo4ZlVjbHdUUXNiYm9WZzI3WXhvMER5QVRWd1RoVzVhNTZSNlFmNVppUUpsdUZ1enM1eTk4cnEwUzVxMDQ2bEU2bzN2Vm1KcEVkd2plU0NKb0VUNUNMNG5UZ2tYeVd2aG00ZUI4dS9lNjZsM28wcWJhU3g4cTlZWW1UOUVwUmNsNVRQNFRoTEJLRVRZZHpWdmc0ZXhqUWZla3RNYXRrNUV5VXBFSWhaUFhoNXZYcEpaZXNkZk85TEo4elRhSEJzQmpEUFU3Y2ROZ1FNYmVicGF0YVJpOEEwZWwyL0lKWGwrRStvbGdBejV6QzRpMk8xUT09XCJ9JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnNjQyNGMzNTNlYWY3OGQwMDA3NjZlOTUxMGIxMjVmYmEnLFxuICAgICAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICcxOWJkZmUyYTRiNDk4YTA1NTExMzgxMjM1YTg4OTJkNTQyNjc4MDdjNGEzZjY1NGUzMTBiOTM4YjhiNDI0ZmY0YWRlZGJlOTJmNGMxNDZkZTY0MWM2NzUwOGE5NjEzMjRjODUwNGNkZjhlMGMwYWNiYjY4ZDYxMDRjY2NjZDc4MScsXG4gICAgICAgICAgdmVyaWZpZWRWc3NQcm9vZjogdHJ1ZSxcbiAgICAgICAgICBpc0JpdEdvOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB2YWxpZGF0aW5nIGEgd2VsbCBmb3JtYXR0ZWQgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnZjk0MWFlM2NiZTU2NDVkY2NjMTVkYTgzNDZiNTMzZjdmOTFmMjAyMDg5YTU1MjE2NTNjMDYyYjJmZjEwYjMwNCc7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsaWRhdGluZyBhIHdlbGwgZm9ybWF0dGVkIGFkZHJlc3MgcHJlZml4ZWQgd2l0aCAweCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnMHhmOTQxYWUzY2JlNTY0NWRjY2MxNWRhODM0NmI1MzNmN2Y5MWYyMDIwODlhNTUyMTY1M2MwNjJiMmZmMTBiMzA0JztcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdmFsaWRhdGluZyBhbiBvbGQgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnMHgyOTU5YmZjM2ZkYjdkYzIzZmVkOGRlYmEyZmFmYjcwZjNlNjA2YTU5JztcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHZhbGlkYXRpbmcgYW4gaW5jb3JyZWN0bHkgZm9ybWF0dGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICd3cm9uZ2FkZHJlc3MnO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIGlzV2FsbGV0QWRkcmVzcyB3aXRoIHZhbGlkIGFkZHJlc3MgZm9yIGluZGV4IDQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZXdBZGRyZXNzID0gJzB4OGIzYzc4MDc3MzBkNzU3OTJkZDZjNDk3MzJjZjlmMDE0ZDY5ODRhOWM3N2QzODZiZGIxMDcyYTllNTM3ZDhkOCc7XG4gICAgICBjb25zdCBpbmRleCA9IDQ7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgY29tbW9uS2V5Y2hhaW4sIGFkZHJlc3M6IG5ld0FkZHJlc3MsIGluZGV4LCBrZXljaGFpbnMgfTtcbiAgICAgIChhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MocGFyYW1zKSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaXNXYWxsZXRBZGRyZXNzIHdoZW4ga2V5Y2hhaW5zIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJzB4Mjk1OWJmYzNmZGI3ZGMyM2ZlZDhkZWJhMmZhZmI3MGYzZTYwNmE1OSc7XG4gICAgICBjb25zdCBpbmRleCA9IDA7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgY29tbW9uS2V5Y2hhaW4sIGFkZHJlc3MsIGluZGV4IH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MocGFyYW1zKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpc1dhbGxldEFkZHJlc3Mgd2hlbiBuZXcgYWRkcmVzcyBpcyBpbnZhbGlkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd3JvbmdBZGRyZXNzID0gJ2JhZEFkZHJlc3MnO1xuICAgICAgY29uc3QgaW5kZXggPSAwO1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSB7IGNvbW1vbktleWNoYWluLCBhZGRyZXNzOiB3cm9uZ0FkZHJlc3MsIGluZGV4IH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MocGFyYW1zKSwge1xuICAgICAgICBtZXNzYWdlOiBgaW52YWxpZCBhZGRyZXNzOiAke3dyb25nQWRkcmVzc31gLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIFRyYW5zYWN0aW9uczonLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FuZEJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzMCA9ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnO1xuICAgIGNvbnN0IHJlY292ZXJ5RGVzdGluYXRpb24gPSAnMHgwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5JztcbiAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3AkU3c8Ump2QWdme25ZQVlJMnhNJztcbiAgICBsZXQgZ2V0QmFsYW5jZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0SW5wdXRDb2luc1N0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0RmVlRXN0aW1hdGVTdHViOiBzaW5vbi5TaW5vblN0dWI7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGdldEJhbGFuY2VTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRCYWxhbmNlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0QmFsYW5jZVN0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczApLnJlc29sdmVzKCcxOTAwMDAwMDAwJyk7XG5cbiAgICAgIGdldElucHV0Q29pbnNTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRJbnB1dENvaW5zJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczApLnJlc29sdmVzKFtcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweGMwNWM3NjVlMjZlNmFlODRjNzhmYTI0NWYzOGEyM2ZiMjA0MDZhNWNmM2Y2MWI1N2JkMzIzYTBkZjlkOTgwMDMnLFxuICAgICAgICAgIHZlcnNpb246ICcxOTUnLFxuICAgICAgICAgIGRpZ2VzdDogJzdCSkxiMzJMS043d3Q1dXY0eGdYVzRBYkZLb01OY1BFNzZvNDFUUUV2VVpiJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxOTAwMDAwMDAwJyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRGZWVFc3RpbWF0ZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQUNBQWdBMGtsckFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0FCQVFBQUFRRUNBQUFCQVFDUjhsNGplNE9nQ21KeVQ5eEtnZVEvU1UzR3RCb1NRVWtvSnROdVRSTWRvd0hBWEhaZUp1YXVoTWVQb2tYemlpUDdJRUJxWFBQMkcxZTlNam9OK2RtQUE4TUFBQUFBQUFBQUlGdkppSkJkRUFoaTE0Y3hjU3IvSFVJaEJaTWJMTWQ0cmN6VVRDTUliM1Vta2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhUG9Bd0FBQUFBQUFBRGg5UVVBQUFBQUFBPT0nXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoMTk5Nzg4MCkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTg5NzgwMjMzMicpO1xuICAgICAgdHguc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQUNBQWhjS2g1eEFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0FCQVFBQUFRRUNBQUFCQVFDUjhsNGplNE9nQ21KeVQ5eEtnZVEvU1UzR3RCb1NRVWtvSnROdVRSTWRvd0hBWEhaZUp1YXVoTWVQb2tYemlpUDdJRUJxWFBQMkcxZTlNam9OK2RtQUE4TUFBQUFBQUFBQUlGdkppSkJkRUFoaTE0Y3hjU3IvSFVJaEJaTWJMTWQ0cmN6VVRDTUliM1Vta2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhUG9Bd0FBQUFBQUFLU0lJUUFBQUFBQUFBPT0nXG4gICAgICApO1xuXG4gICAgICBjb25zdCBOb25CaXRHb1R4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgTm9uQml0R29UeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24odHguc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IE5vbkJpdEdvVHhuSnNvbiA9IE5vbkJpdEdvVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChOb25CaXRHb1R4bkpzb24uaWQsICdGRENCVU5xTFVBVzRxQlRuRmpUQ1BaYXpMOFZuUkJQMmdTM0dtRW53dEVjZycpO1xuICAgICAgc2hvdWxkLmVxdWFsKE5vbkJpdEdvVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MwKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0eG4gZm9yIHVuc2lnbmVkIHN3ZWVwIHJlY292ZXJ5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAyMDAwODVjMmExZTcxMDAwMDAwMDAwMDIwMDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OTAyMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMwMWMwNWM3NjVlMjZlNmFlODRjNzhmYTI0NWYzOGEyM2ZiMjA0MDZhNWNmM2Y2MWI1N2JkMzIzYTBkZjlkOTgwMDNjMzAwMDAwMDAwMDAwMDAwMjA1YmM5ODg5MDVkMTAwODYyZDc4NzMxNzEyYWZmMWQ0MjIxMDU5MzFiMmNjNzc4YWRjY2Q0NGMyMzA4NmY3NTI2OTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhM2U4MDMwMDAwMDAwMDAwMDBhNDg4MjEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICc4NzM3NDhhMzFlNzY2ZjVmOGYwMDc3ZDhkMDAwMzU0OGZhZTRmNGMxMzQ0MDY3YTdjMzc5OWNmYTczODA4ZmI3JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8wJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxODk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKDE4OTc4MDIzMzIpLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTg5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTg5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzogeyBmZWU6IDIxOTc2NjgsIGZlZVN0cmluZzogJzIxOTc2NjgnIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzNiODllZWM5ZDJkMmYzYjA0OWVjZGEyZTdiNWY0NzgyN2Y3OTI3ZmU2NjE4ZDZlOGIxM2Y2NGU3Yzk1ZjRiMDBiOTU3N2FiMDEzOTVlY2Y4ZWViODA0YjU5MGNlZGFlMTRmZjVmZDM5NDdiZjNiN2E5NWI5MzI3YzQ5ZTI3YzU0JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZSA9IG5ldyBUcmFuc2ZlclRyYW5zYWN0aW9uKGJhc2Vjb2luKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEhleCA9IHJlcy50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeDtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEJhc2U2NCA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeEhleCwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS5mcm9tUmF3VHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkU3dlZXBUeG5Kc29uID0gdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLmlkLCAnRkRDQlVOcUxVQVc0cUJUbkZqVENQWmF6TDhWblJCUDJnUzNHbUVud3RFY2cnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1bnNpZ25lZFN3ZWVwVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MwKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHR4biBmb3IgdW5zaWduZWQgc3dlZXAgcmVjb3Zlcnkgd2l0aCBtdWx0aXBsZSBpbnB1dCBjb2lucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSAnMHgwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5JztcbiAgICAgIGdldEJhbGFuY2VTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MpLnJlc29sdmVzKCcxNzk4MDAyMTIwJyk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzKS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg2MGFlZmFmZmEzNWRhYTMyYTFlNTYxZjJiYTljMTg3NTMwNTdkMmZlYjUwMmYzMjgwNGU1NzNlYTI4NzVhMzljJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMTk1JyxcbiAgICAgICAgICBkaWdlc3Q6ICdqS2pkdXk4Z0hERTI0NFpKV2NQM0pYZlhQS2pxWTY3YXZNcWh6SHc5OENMJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCc5ODAwMjEyMCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4OWEzNjNjOTFkMjliNTA4MzJhYjk4MDk0YjZjMTkzMzk0MTI4MGZjMjk4YTJlYzIzMjczOWYxNGNlMzFlMjU4MicsXG4gICAgICAgICAgdmVyc2lvbjogJzE5NycsXG4gICAgICAgICAgZGlnZXN0OiAnRUxuYmdtVzdjclBZcjNCOXBXVnFmZzl1TGVKdDQzS1BvZmtmZFI2TFdmdHUnLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzE3MDAwMDAwMDAnKSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBQ0FBaklkRFZsQUFBQUFBQWdNdGpsZnViWkhsVlkyZ1ozRlV3dkNGZVZOSTR4ZjVXc3llK3Q0YlFSTDh3Q0FnQUJBUUFBQVFFQ0FBQUJBUUFBNU9xbW9wSCtBcEdFVXVaRnRXVTgwbUNsL0ErelgyR1QxWUNSYXFuamlRS2FOanlSMHB0UWd5cTVnSlMyd1pNNVFTZ1B3cGlpN0NNbk9mRk00eDRsZ3NVQUFBQUFBQUFBSU1ZNWhmVUZ6dU1WYVkzK0x3bVpUdnlwUlNBSlJMTlhvY1JZUjl5S2FsWHlZSzc2LzZOZHFqS2g1V0h5dXB3WWRUQlgwdjYxQXZNb0JPVno2aWgxbzV6REFBQUFBQUFBQUNBSzE1UHRPNmd3U054MGJIa3NWSk9jTjk2QVl5YyszWVZwSnphWU1NaEhiUURrNnFhaWtmNENrWVJTNWtXMVpUelNZS1g4RDdOZllaUFZnSkZxcWVPSjZBTUFBQUFBQUFBQTRmVUZBQUFBQUFBPSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcigxOTk3ODgwKSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgYml0Z29LZXk6XG4gICAgICAgICAgJzdkOTFmNjljMjg1YzBiM2IwYTBkNjM3MTAyMGYxOTRkNDU5NTZlZTU1NjI4OWU3ODU0ZjZkMTE0ZTA3ODA1NzIwZWVjNjczYzZhMlxcbjcyYjdkYTQxMzdkYjdiMTI4OWYzOGFmNGY0YjgyNGVmMGRlNjVjNWY1M2UzZTY2NjE3NjE3JyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYycsXG4gICAgICB9KTtcblxuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0eFJlcXVlc3RzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDIwMDA4MjRjZDA5NmIwMDAwMDAwMDAwMjAzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjMDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwMDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OTAyOWEzNjNjOTFkMjliNTA4MzJhYjk4MDk0YjZjMTkzMzk0MTI4MGZjMjk4YTJlYzIzMjczOWYxNGNlMzFlMjU4MmM1MDAwMDAwMDAwMDAwMDAyMGM2Mzk4NWY1MDVjZWUzMTU2OThkZmUyZjA5OTk0ZWZjYTk0NTIwMDk0NGIzNTdhMWM0NTg0N2RjOGE2YTU1ZjI2MGFlZmFmZmEzNWRhYTMyYTFlNTYxZjJiYTljMTg3NTMwNTdkMmZlYjUwMmYzMjgwNGU1NzNlYTI4NzVhMzljYzMwMDAwMDAwMDAwMDAwMDIwMGFkNzkzZWQzYmE4MzA0OGRjNzQ2Yzc5MmM1NDkzOWMzN2RlODA2MzI3M2VkZDg1NjkyNzM2OTgzMGM4NDc2ZDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODllODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnM2VlYzM5NWNjYWVlN2Q2YTBiOWZhNTQ4OGRkMDBiZmViODlkYzRiZDM3ZTMxMzllYmViYjYyYzJlNjBiYzAwZCcsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMCcsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTc5NTgwNDQ1MicsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcigxNzk1ODA0NDUyKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYycsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE3OTU4MDQ0NTInLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzE3OTU4MDQ0NTInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHsgZmVlOiAyMTk3NjY4LCBmZWVTdHJpbmc6ICcyMTk3NjY4JyB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICc3ZDkxZjY5YzI4NWMwYjNiMGEwZDYzNzEwMjBmMTk0ZDQ1OTU2ZWU1NTYyODllNzg1NGY2ZDExNGUwNzgwNTcyMGVlYzY3M2M2YTI3MmI3ZGE0MTM3ZGI3YjEyODlmMzhhZjRmNGI4MjRlZjBkZTY1YzVmNTNlM2U2NjYxNzYxNycsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSByZXMudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zZXJpYWxpemVkVHg7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhCYXNlNjQgPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkVHhIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFN3ZWVwVHhuSnNvbiA9IHVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1bnNpZ25lZFN3ZWVwVHhuSnNvbi5pZCwgJzdKeXgzS1VWWHhzMVEyaTFScVh0ajRoRmdVZ0JvbjZQVVFBb3ZMODRZM2VQJyk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgVG9rZW4gVHJhbnNhY3Rpb25zOicsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IGNvaW5UeXBlID0gJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCc7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczAgPSAnMHg5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzJztcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzQ29sZFdhbGxldCA9ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnO1xuICAgIGNvbnN0IHJlY292ZXJ5RGVzdGluYXRpb24gPSAnMHgwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5JztcbiAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3AkU3c8Ump2QWdme25ZQVlJMnhNJztcbiAgICBjb25zdCB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTgnO1xuICAgIGxldCBnZXRCYWxhbmNlU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRJbnB1dENvaW5zU3R1Yjogc2lub24uU2lub25TdHViO1xuICAgIGxldCBnZXRGZWVFc3RpbWF0ZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgZ2V0QmFsYW5jZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0SW5wdXRDb2lucycgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YiA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0RmVlRXN0aW1hdGUnIGFzIGtleW9mIFN1aSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0b2tlbiB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGdldEJhbGFuY2VTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwLCBjb2luVHlwZSkucmVzb2x2ZXMoJzEwMDAnKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwLCBjb2luVHlwZSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg5MjRhYjY5ZWJiYTMwNGYyOTc1YTU4ODM3MmI0MWU0ZTFmNWRiN2ZhODI0ODY4Zjg0MTk5ZWViMWUwYTE1YTJkJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4MDcnLFxuICAgICAgICAgIGRpZ2VzdDogJzdYUmJXUVRpd0FVQ2pMTHNaVnBKTXJBQkNoZUpCa3pLVmZDcjdhVFpaVmtkJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKDEwMDApLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzMCkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4OTE0NjkyOGY1NTdjYjhhYjE5MTVhNTg4NmMxMzYyNDM1YTA1YjQ3MDliNTg2YmIwMWQ0YzcwZTg1YmI1MzE2MScsXG4gICAgICAgICAgdmVyc2lvbjogJzIzOScsXG4gICAgICAgICAgZGlnZXN0OiAnR0xTelI2SEozMTluUEtBRm01eDNUV0hjYUhaekNGU0JDcWh2WjFxd1Q1d3InLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEyMzAyNjEwNzYnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDkzZjcwMGRjODJlMjI5ZjY5OWY0N2IxNjc4NTljNTEwODI4OGI3OGY1NDA2ODgwMGNjMjkwOTAwZDBkZTg0MjknLFxuICAgICAgICAgIHZlcnNpb246ICcxNDknLFxuICAgICAgICAgIGRpZ2VzdDogJzJ3WER4dDJaeGVrQnhONm9XM0JxVkRYWmNYNDlDODduMUFOMjZOeXU3a1BSJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxNjk2MTEwMjQnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweGI4NjliNDU3NDRjYTJjNGE2NjNjNmU4Njc5ZGI1YTYzMmJlYWQwMzY0MjczODQyZDM5OTBkN2ZmNjVkNTdiMWUnLFxuICAgICAgICAgIHZlcnNpb246ICcyMzcnLFxuICAgICAgICAgIGRpZ2VzdDogJ0YxeFdLUFZIVjVXTDcyRXJqZ1F4cmpuM1JOSDJHSGp5TjlqVGd3VzdRcGhrJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMDE5NzYnKSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRQ1NTcmFldTZNRThwZGFXSU55dEI1T0gxMjMrb0pJYVBoQm1lNng0S0ZhTFdkdUVRSUFBQUFBSUdEeFd2MDd1cXYwaEVaaU9HMEZDL3hHODMwV0JtUkRaTE9MbU1wNjFnZFNBQWpvQXdBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FKSHlYaU43ZzZBS1luSlAzRXFCNUQ5SlRjYTBHaEpCU1NnbTAyNU5FeDJqQVpGR2tvOVZmTGlyR1JXbGlHd1RZa05hQmJSd20xaHJzQjFNY09oYnRURmg3d0FBQUFBQUFBQWc0OXE1NWVKR0dNNXh0b0p6WTIzM1VuTDJkajFLYjVOOTBZeFo3MFFvcFcyUjhsNGplNE9nQ21KeVQ5eEtnZVEvU1UzR3RCb1NRVWtvSnROdVRSTWRvK2dEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoMjM0NTUwNCkpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICByZXMuc2hvdWxkLmhhc093blByb3BlcnR5KCd0cmFuc2FjdGlvbnMnKTtcbiAgICAgIGNvbnN0IHR4ID0gcmVzLnRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4LnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB0eC5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICAgIHR4LnNlcmlhbGl6ZWRUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdBQUFEQVFDU1NyYWV1Nk1FOHBkYVdJTnl0QjVPSDEyMytvSklhUGhCbWU2eDRLRmFMV2R1RVFJQUFBQUFJR0R4V3YwN3VxdjBoRVppT0cwRkMveEc4MzBXQm1SRFpMT0xtTXA2MWdkU0FBam9Bd0FBQUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQUpIeVhpTjdnNkFLWW5KUDNFcUI1RDlKVGNhMEdoSkJTU2dtMDI1TkV4MmpBWkZHa285VmZMaXJHUldsaUd3VFlrTmFCYlJ3bTFocnNCMU1jT2hidFRGaDd3QUFBQUFBQUFBZzQ5cTU1ZUpHR001eHRvSnpZMjMzVW5MMmRqMUtiNU45MFl4WjcwUW9wVzJSOGw0amU0T2dDbUp5VDl4S2dlUS9TVTNHdEJvU1FVa29KdE51VFJNZG8rZ0RBQUFBQUFBQVZsNG5BQUFBQUFBQSdcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IE5vbkJpdEdvVHhuRGVzZXJpYWxpemUgPSBuZXcgVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uKGJhc2Vjb2luKTtcbiAgICAgIE5vbkJpdEdvVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBOb25CaXRHb1R4bkpzb24gPSBOb25CaXRHb1R4bkRlc2VyaWFsaXplLnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQuZXF1YWwoTm9uQml0R29UeG5Kc29uLmlkLCAnRFlXOW1BOEFaR1FudGs3SEdRVUVvRWR5OEJhSDhIaDlUczI5NEVucUdURXInKTtcbiAgICAgIHNob3VsZC5lcXVhbChOb25CaXRHb1R4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzMCk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGZvciB1bnNpZ25lZCBzd2VlcCByZWNvdmVyeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGdldEJhbGFuY2VTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0KS5yZXNvbHZlcygnMjk4OTgwMjQwJyk7XG4gICAgICBnZXRCYWxhbmNlU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzQ29sZFdhbGxldCwgY29pblR5cGUpLnJlc29sdmVzKCcxMDAwJyk7XG5cbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0LCBjb2luVHlwZSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg0YzFjY2NjNmQwMzUxMGJkNzRhOTVmODFiMmI3ZGEwODExOWNiMThlMmM1NjU0MzVlN2FkNzE1ZTZhYWRjNWE3JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4MDknLFxuICAgICAgICAgIGRpZ2VzdDogJ0FmeTRMVzQ2dHVjemozNDFUYkNMZWV5bnhydXBqOUx3MnFCUVVwbmRIYzFjJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKDEwMDApLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzQ29sZFdhbGxldCkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4OTgxMTRmMmRkZWZlM2YxNmQ5ZDJlMDE2MTk0YjUyYzRjM2FmNDMwYzE2MDFiZGIzNTM5Y2JkMjM3Y2JjYTA2OCcsXG4gICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODA5JyxcbiAgICAgICAgICBkaWdlc3Q6ICdEQnRvcXZXdHJjWUhFMUhqUVVvNGlnVGtIWXhZN0Q4M2lIU29LWGk5QTg1VycsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcigyMDAwMDAwMDApLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4OWVjMTM0NDA2NDdiMGJlZTc0ZjQ1NDA5NTg5YWQyZmY1YTE4Yzk2MTVmOTlkNWQ5MTRmOTg4YjgzNGRhNDkzZScsXG4gICAgICAgICAgdmVyc2lvbjogJzIzOScsXG4gICAgICAgICAgZGlnZXN0OiAnOWQzdVZzUTRwMzdUR256VHBuWFh3MnBGb2dnYlZmVnA5Q2RDNGpwWnE2NjQnLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoOTg5ODAyNDApLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFCTUhNekcwRFVRdlhTcFg0R3l0OW9JRVp5eGppeFdWRFhuclhGZWFxM0ZwMmx1RVFJQUFBQUFJSSswb3pTNEthemV5L29xTW9aQ3I2Sk5iNVUzUVBkb01JRHVEa3M5T3BZdkFBam9Bd0FBQUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQUFGa2xkM2FkSXdSYWlHQ1FvTmROa2NKMXNYdVhJb2Uxb1RFNzBNOU1VUWhBWmdSVHkzZS9qOFcyZExnRmhsTFVzVERyME1NRmdHOXMxT2N2U044dktCb2FXNFJBZ0FBQUFBZ3RSYWhXMUEwdk5Ra0pVUU1Wa3p6YjBPVlF2aUdjZTk1bmQ0R1llZUpvQWtCWkpYZDJuU01FV29oZ2tLRFhUWkhDZGJGN2x5S0h0YUV4TzlEUFRGRUllZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcigyMzQ1NTA0KSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleUNvbGRXYWxsZXQsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAzMDEwMDRjMWNjY2M2ZDAzNTEwYmQ3NGE5NWY4MWIyYjdkYTA4MTE5Y2IxOGUyYzU2NTQzNWU3YWQ3MTVlNmFhZGM1YTc2OTZlMTEwMjAwMDAwMDAwMjA4ZmI0YTMzNGI4MjlhY2RlY2JmYTJhMzI4NjQyYWZhMjRkNmY5NTM3NDBmNzY4MzA4MGVlMGU0YjNkM2E5NjJmMDAwOGU4MDMwMDAwMDAwMDAwMDAwMDIwMDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OTAyMDIwMTAwMDAwMTAxMDEwMDAxMDEwMjAwMDAwMTAyMDAwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxMDE5ODExNGYyZGRlZmUzZjE2ZDlkMmUwMTYxOTRiNTJjNGMzYWY0MzBjMTYwMWJkYjM1MzljYmQyMzdjYmNhMDY4Njk2ZTExMDIwMDAwMDAwMDIwYjUxNmExNWI1MDM0YmNkNDI0MjU0NDBjNTY0Y2YzNmY0Mzk1NDJmODg2NzFlZjc5OWRkZTA2NjFlNzg5YTAwOTAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjFlODAzMDAwMDAwMDAwMDAwNTY1ZTI3MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdlMzU0N2E1OGI5YzQ4ODQwYTI3NzRhZWI3MWI4NjUyYTcwYjY3ZWU1OWMzZmE1YjFmNzQzNzM4ZDhiMjk1MTk5JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8wJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKDEwMDApLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcxMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1Rva2VuVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgZmVlOiAyNTgwMDU0LFxuICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcyNTgwMDU0JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gcmVzLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2VyaWFsaXplZFR4O1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4QmFzZTY0ID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4SGV4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHhCYXNlNjQpO1xuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkpzb24gPSB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uaWQsICdGOHdyVWpaWWY2eHZEVzJMelc5RG9oQUt5SkZjV2dHRXZqTW9LTHhDYWptVicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLnNlbmRlciwgc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGZvciB1bnNpZ25lZCBzd2VlcCByZWNvdmVyeSB3aXRoIG11bHRpcGxlIGlucHV0IGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0QmFsYW5jZVN0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQpLnJlc29sdmVzKCcyOTg5ODAyNDAnKTtcbiAgICAgIGdldEJhbGFuY2VTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0LCBjb2luVHlwZSkucmVzb2x2ZXMoJzExMDAwJyk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzQ29sZFdhbGxldCwgY29pblR5cGUpLnJlc29sdmVzKFtcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4NGMxY2NjYzZkMDM1MTBiZDc0YTk1ZjgxYjJiN2RhMDgxMTljYjE4ZTJjNTY1NDM1ZTdhZDcxNWU2YWFkYzVhNycsXG4gICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODA5JyxcbiAgICAgICAgICBkaWdlc3Q6ICdBZnk0TFc0NnR1Y3pqMzQxVGJDTGVleW54cnVwajlMdzJxQlFVcG5kSGMxYycsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAwMCcpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg3MmFkOTkxMzBhYmQzNzkwZGI3YmFjODkwOGQ1MGQzNDEyYTgwMGE4ZmNkMTBjMWNmYmQ2NGI4MjE1NTM3NTU4JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NjUnLFxuICAgICAgICAgIGRpZ2VzdDogJ1g4dWFORGtTZllLYTZQQnpKSlVlOVN0UDRuUldSOVJab2EybkpIcXY1bW4nLFxuICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEwMDAwJyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3NDb2xkV2FsbGV0KS5yZXNvbHZlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg5ODExNGYyZGRlZmUzZjE2ZDlkMmUwMTYxOTRiNTJjNGMzYWY0MzBjMTYwMWJkYjM1MzljYmQyMzdjYmNhMDY4JyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4MDknLFxuICAgICAgICAgIGRpZ2VzdDogJ0RCdG9xdld0cmNZSEUxSGpRVW80aWdUa0hZeFk3RDgzaUhTb0tYaTlBODVXJyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcyMDAwMDAwMDAnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDllYzEzNDQwNjQ3YjBiZWU3NGY0NTQwOTU4OWFkMmZmNWExOGM5NjE1Zjk5ZDVkOTE0Zjk4OGI4MzRkYTQ5M2UnLFxuICAgICAgICAgIHZlcnNpb246ICcyMzknLFxuICAgICAgICAgIGRpZ2VzdDogJzlkM3VWc1E0cDM3VEduelRwblhYdzJwRm9nZ2JWZlZwOUNkQzRqcFpxNjY0JyxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCc5ODk4MDI0MCcpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFFQVFCeXJaa1RDcjAza050N3JJa0kxUTAwRXFnQXFQelJEQno3MWt1Q0ZWTjFXS0Z1RVFJQUFBQUFJQWU0WFRpMjRiU0Y4VVZaTU5KeWxoQ0FnY3FzMTJaTVNOZlY5SVZ5N2l1OUFRQk1ITXpHMERVUXZYU3BYNEd5dDlvSUVaeXhqaXhXVkRYbnJYRmVhcTNGcDJsdUVRSUFBQUFBSUkrMG96UzRLYXpleS9vcU1vWkNyNkpOYjVVM1FQZG9NSUR1RGtzOU9wWXZBQWo0S2dBQUFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0RBd0VBQUFFQkFRQUNBUUFBQVFFQ0FBRUJBZ0VBQVFNQUFXU1YzZHAwakJGcUlZSkNnMTAyUnduV3hlNWNpaDdXaE1UdlF6MHhSQ0VCbUJGUExkNytQeGJaMHVBV0dVdFN4TU92UXd3V0FiMnpVNXk5STN5OG9HaHBiaEVDQUFBQUFDQzFGcUZiVURTODFDUWxSQXhXVFBOdlE1VkMrSVp4NzNtZDNnWmg1NG1nQ1FGa2xkM2FkSXdSYWlHQ1FvTmROa2NKMXNYdVhJb2Uxb1RFNzBNOU1VUWg2QU1BQUFBQUFBQUE0ZlVGQUFBQUFBQT0nXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoMTAzNjMyOCkpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5Q29sZFdhbGxldCxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICB9KTtcblxuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0eFJlcXVlc3RzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDQwMTAwNzJhZDk5MTMwYWJkMzc5MGRiN2JhYzg5MDhkNTBkMzQxMmE4MDBhOGZjZDEwYzFjZmJkNjRiODIxNTUzNzU1OGExNmUxMTAyMDAwMDAwMDAyMDA3Yjg1ZDM4YjZlMWI0ODVmMTQ1NTkzMGQyNzI5NjEwODA4MWNhYWNkNzY2NGM0OGQ3ZDVmNDg1NzJlZTJiYmQwMTAwNGMxY2NjYzZkMDM1MTBiZDc0YTk1ZjgxYjJiN2RhMDgxMTljYjE4ZTJjNTY1NDM1ZTdhZDcxNWU2YWFkYzVhNzY5NmUxMTAyMDAwMDAwMDAyMDhmYjRhMzM0YjgyOWFjZGVjYmZhMmEzMjg2NDJhZmEyNGQ2Zjk1Mzc0MGY3NjgzMDgwZWUwZTRiM2QzYTk2MmYwMDA4ZjgyYTAwMDAwMDAwMDAwMDAwMjAwMGU0ZWFhNmEyOTFmZTAyOTE4NDUyZTY0NWI1NjUzY2QyNjBhNWZjMGZiMzVmNjE5M2Q1ODA5MTZhYTllMzg5MDMwMzAxMDAwMDAxMDEwMTAwMDIwMTAwMDAwMTAxMDIwMDAxMDEwMjAxMDAwMTAzMDAwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxMDE5ODExNGYyZGRlZmUzZjE2ZDlkMmUwMTYxOTRiNTJjNGMzYWY0MzBjMTYwMWJkYjM1MzljYmQyMzdjYmNhMDY4Njk2ZTExMDIwMDAwMDAwMDIwYjUxNmExNWI1MDM0YmNkNDI0MjU0NDBjNTY0Y2YzNmY0Mzk1NDJmODg2NzFlZjc5OWRkZTA2NjFlNzg5YTAwOTAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjFlODAzMDAwMDAwMDAwMDAwZjg2NDExMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdjZDAyOGM0MDFmODE1ZGFiN2Y2YzVlOGEzMzk3Njg3OWM1Yzc5OWFlN2M5ZmRlMDFjYWZkMGFlZTAwNzVhMTc0JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8wJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMTAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcignMTEwMDAnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1Rva2VuVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgZmVlOiAxMTM5OTYwLFxuICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcxMTM5OTYwJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gcmVzLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2VyaWFsaXplZFR4O1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4QmFzZTY0ID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4SGV4LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgdW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHhCYXNlNjQpO1xuICAgICAgY29uc3QgdW5zaWduZWRTd2VlcFR4bkpzb24gPSB1bnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodW5zaWduZWRTd2VlcFR4bkpzb24uaWQsICc0cWVYSlA3cFRhNnBteUFLdUpaRzlBa0dzS001M1NEcUhWY1BqUk1GSGpjNScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHVuc2lnbmVkU3dlZXBUeG5Kc29uLnNlbmRlciwgc2VuZGVyQWRkcmVzc0NvbGRXYWxsZXQpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUcmFuc2FjdGlvbnMgZm9yIHdhbGxldCB3aXRoIG11bHRpcGxlIGFkZHJlc3NlczonLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FuZEJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzMCA9ICcweDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMnO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MxID0gJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYyc7XG4gICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9ICcweDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODknO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFjay53aXRoQXJncyhzZW5kZXJBZGRyZXNzMCkucmVzb2x2ZXMoJzAnKS53aXRoQXJncyhzZW5kZXJBZGRyZXNzMSkucmVzb2x2ZXMoJzE4MDAwMDAwMDAnKTtcblxuICAgICAgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldElucHV0Q29pbnMnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFjay53aXRoQXJncyhzZW5kZXJBZGRyZXNzMSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4ZmY5M2FkYzJmNTE2ZmNhYTBjNjA0MGUwMWY1MDAyN2EyM2Y5YjE3NjdmNTA0MGViMjI4Mjc5MGE2OTAwY2U3ZicsXG4gICAgICAgICAgdmVyc2lvbjogJzE5NicsXG4gICAgICAgICAgZGlnZXN0OiAnWHJqUk05Wk05OHhkTldpZ0hZUWpDcEdvV3Q2YVpMcHFYZFNFaXhuaGI0cCcsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTgwMDAwMDAwMCcpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICAgIGNhbGxCYWNrID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRGZWVFc3RpbWF0ZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBQ0FBZ0E4Vk5sQUFBQUFBQWdBT1RxcHFLUi9nS1JoRkxtUmJWbFBOSmdwZndQczE5aGs5V0FrV3FwNDRrQ0FnQUJBUUFBQVFFQ0FBQUJBUUF5Mk9WKzV0a2VWVmphQm5jVlRDOElWNVUwampGL2xheko3NjNodEJFdnpBSC9rNjNDOVJiOHFneGdRT0FmVUFKNkkvbXhkbjlRUU9zaWdua0thUURPZjhRQUFBQUFBQUFBSUFmbnA5MGdNc2RCR0d6MXRXL3NGUWxBcmhrUm1ZamRpWFRYeCtDdnhIalZNdGpsZnViWkhsVlkyZ1ozRlV3dkNGZVZOSTR4ZjVXc3llK3Q0YlFSTDh6b0F3QUFBQUFBQUFEaDlRVUFBQUFBQUE9PSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcigxOTk3ODgwKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyaWVzIGF0IGFkZHJlc3MgMSBidXQgc2VhcmNoIGZyb20gYWRkcmVzcyAwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICByZXMuc2hvdWxkLmhhc093blByb3BlcnR5KCd0cmFuc2FjdGlvbnMnKTtcbiAgICAgIGNvbnN0IHR4ID0gcmVzLnRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4LnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzE3OTc4MDIzMzInKTtcbiAgICAgIHR4LnNlcmlhbGl6ZWRUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdBQUFDQUFoY1NTaHJBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdBQkFRQUFBUUVDQUFBQkFRQXkyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ekFIL2s2M0M5UmI4cWd4Z1FPQWZVQUo2SS9teGRuOVFRT3NpZ25rS2FRRE9mOFFBQUFBQUFBQUFJQWZucDkwZ01zZEJHR3oxdFcvc0ZRbEFyaGtSbVlqZGlYVFh4K0N2eEhqVk10amxmdWJaSGxWWTJnWjNGVXd2Q0ZlVk5JNHhmNVdzeWUrdDRiUVJMOHpvQXdBQUFBQUFBS1NJSVFBQUFBQUFBQT09J1xuICAgICAgKTtcblxuICAgICAgY29uc3QgVW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgVW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgVW5zaWduZWRTd2VlcFR4bkpzb24gPSBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5pZCwgJ0JxSGNDUjUxbXFVeWk1R0pZRUVEM2N3OUFncEozU3JhVHJ0NWFFOW5Ma0xqJyk7XG4gICAgICBzaG91bGQuZXF1YWwoVW5zaWduZWRTd2VlcFR4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcmllcyBhdCBhZGRyZXNzIDEgYnV0IHNlYXJjaCBmcm9tIGFkZHJlc3MgMScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTc5NzgwMjMzMicpO1xuICAgICAgdHguc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQUNBQWhjU1NockFBQUFBQUFnQU9UcXBxS1IvZ0tSaEZMbVJiVmxQTkpncGZ3UHMxOWhrOVdBa1dxcDQ0a0NBZ0FCQVFBQUFRRUNBQUFCQVFBeTJPVis1dGtlVlZqYUJuY1ZUQzhJVjVVMGpqRi9sYXpKNzYzaHRCRXZ6QUgvazYzQzlSYjhxZ3hnUU9BZlVBSjZJL214ZG45UVFPc2lnbmtLYVFET2Y4UUFBQUFBQUFBQUlBZm5wOTBnTXNkQkdHejF0Vy9zRlFsQXJoa1JtWWpkaVhUWHgrQ3Z4SGpWTXRqbGZ1YlpIbFZZMmdaM0ZVd3ZDRmVWTkk0eGY1V3N5ZSt0NGJRUkw4em9Bd0FBQUFBQUFLU0lJUUFBQUFBQUFBPT0nXG4gICAgICApO1xuXG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUgPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihiYXNlY29pbik7XG4gICAgICBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUuZnJvbVJhd1RyYW5zYWN0aW9uKHR4LnNlcmlhbGl6ZWRUeCk7XG4gICAgICBjb25zdCBVbnNpZ25lZFN3ZWVwVHhuSnNvbiA9IFVuc2lnbmVkU3dlZXBUeG5EZXNlcmlhbGl6ZS50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKFVuc2lnbmVkU3dlZXBUeG5Kc29uLmlkLCAnQnFIY0NSNTFtcVV5aTVHSllFRUQzY3c5QWdwSjNTcmFUcnQ1YUU5bkxrTGonKTtcbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5zZW5kZXIsIHNlbmRlckFkZHJlc3MxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIFRva2VuIFRyYW5zYWN0aW9ucyBmb3Igd2FsbGV0IHdpdGggbXVsdGlwbGUgYWRkcmVzc2VzOicsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MwID0gJzB4OTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMyc7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczEgPSAnMHgzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjJztcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4MDBlNGVhYTZhMjkxZmUwMjkxODQ1MmU2NDViNTY1M2NkMjYwYTVmYzBmYjM1ZjYxOTNkNTgwOTE2YWE5ZTM4OSc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG4gICAgY29uc3QgcGFja2FnZUlkID0gJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhOCc7XG4gICAgY29uc3QgY29pblR5cGUgPSBgJHtwYWNrYWdlSWR9OjpkZWVwOjpERUVQYDtcbiAgICBsZXQgZ2V0QmFsYW5jZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0SW5wdXRDb2luc1N0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0RmVlRXN0aW1hdGVTdHViOiBzaW5vbi5TaW5vblN0dWI7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGdldEJhbGFuY2VTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRCYWxhbmNlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0QmFsYW5jZVN0dWJcbiAgICAgICAgLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwKVxuICAgICAgICAucmVzb2x2ZXMoJzcwNjg3NTY5MicpXG4gICAgICAgIC53aXRoQXJncyhzZW5kZXJBZGRyZXNzMCwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcygnMCcpXG4gICAgICAgIC53aXRoQXJncyhzZW5kZXJBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKCcxMjAxMDE5NzYnKVxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczEsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoJzEwMDAnKTtcblxuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldElucHV0Q29pbnMnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzMSwgY29pblR5cGUpLnJlc29sdmVzKFtcbiAgICAgICAge1xuICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4Y2RiYTc2YmRjM2Y0NjBlZDBkNmFmODM0ZmMxN2IwODJlYjllYWJkMGI4ODZmOWFmMTdjZDQyOTFmMmY4NjJmYScsXG4gICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODY2JyxcbiAgICAgICAgICBkaWdlc3Q6ICc3dmJTZ2FHeXRBVHRuUTJmTFJRbzNWdEN3WXI5S2p4c3V4TExNajJkZkNzVScsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAwMCcpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBnZXRJbnB1dENvaW5zU3R1Yi53aXRoQXJncyhzZW5kZXJBZGRyZXNzMSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICBvYmplY3RJZDogJzB4MGVjYTc4OTAxZTM0MmIyNTE1ZmJmOTliZTI0M2IzZjAwYWRlMGE3YTUwNjc1YjM3MzA3ZjQ0Y2MxOTVjOTA0NicsXG4gICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODc1JyxcbiAgICAgICAgICBkaWdlc3Q6ICdBUEUzbmo0elltNGhZMlhuOUMybjN5bnlQaVlxeGdUUmVqWVQ3UGFyaHBVNycsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTIwMDAwMDAwJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg3NjEyMjIzNDBkYjgwZGQ5ZGExNDRkNTUwOTg4NzBiYzgxYTc4ODIwNWUwYmJkZDM0YzJmOGRmMTJjZjQ1YWViJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMjI3JyxcbiAgICAgICAgICBkaWdlc3Q6ICc5Ynd5amFTSDNYOGFucmpHVXBEMU5xTXJMRlV0R1NDSzlMRnVMYmhqWDY5RScsXG4gICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAxOTc2JyksXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRGZWVFc3RpbWF0ZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQURBUUROdW5hOXcvUmc3UTFxK0RUOEY3Q0M2NTZyMExpRythOFh6VUtSOHZoaStxSnVFUUlBQUFBQUlHYmcyVnBodUVlenpUVkx5QlRyUUdDK0dKV01SU1Y1WUpXa2E3ZndtRDlMQUFqb0F3QUFBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdFQUFBRUJBUUFCQVFJQUFBRUNBRExZNVg3bTJSNVZXTm9HZHhWTUx3aFhsVFNPTVgrVnJNbnZyZUcwRVMvTUFRN0tlSkFlTkNzbEZmdjVtK0pEcy9BSzNncDZVR2RiTnpCL1JNd1pYSkJHcTI0UkFnQUFBQUFnaTJxMnNVZ2QwZnJneFdaVmtnYWpKQWIxVjVmMVZ6YVRyWEVZSXhrTHFEQXkyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ek9nREFBQUFBQUFBQU9IMUJRQUFBQUFBJ1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKDIzNDU1MDQpKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHRva2VuIHR4biBmb3Igbm9uLWJpdGdvIHJlY292ZXJpZXMgYXQgYWRkcmVzcyAxIGJ1dCBzZWFyY2ggZnJvbSBhZGRyZXNzIDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHBhY2thZ2VJZCxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHguc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQURBUUROdW5hOXcvUmc3UTFxK0RUOEY3Q0M2NTZyMExpRythOFh6VUtSOHZoaStxSnVFUUlBQUFBQUlHYmcyVnBodUVlenpUVkx5QlRyUUdDK0dKV01SU1Y1WUpXa2E3ZndtRDlMQUFqb0F3QUFBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdFQUFBRUJBUUFCQVFJQUFBRUNBRExZNVg3bTJSNVZXTm9HZHhWTUx3aFhsVFNPTVgrVnJNbnZyZUcwRVMvTUFRN0tlSkFlTkNzbEZmdjVtK0pEcy9BSzNncDZVR2RiTnpCL1JNd1pYSkJHcTI0UkFnQUFBQUFnaTJxMnNVZ2QwZnJneFdaVmtnYWpKQWIxVjVmMVZ6YVRyWEVZSXhrTHFEQXkyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ek9nREFBQUFBQUFBVmw0bkFBQUFBQUFBJ1xuICAgICAgKTtcblxuICAgICAgY29uc3QgVW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgVW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgVW5zaWduZWRTd2VlcFR4bkpzb24gPSBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5pZCwgJ0dGdWsxVkt5M3d6VEZlQVV0cm1VZTZzeFJodGV6enJHRGZLZHBRVHh2OXNvJyk7XG4gICAgICBzaG91bGQuZXF1YWwoVW5zaWduZWRTd2VlcFR4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgNCk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcmllcyBhdCBhZGRyZXNzIDEgYnV0IHNlYXJjaCBmcm9tIGFkZHJlc3MgMScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFja2FnZUlkLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHguc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQURBUUROdW5hOXcvUmc3UTFxK0RUOEY3Q0M2NTZyMExpRythOFh6VUtSOHZoaStxSnVFUUlBQUFBQUlHYmcyVnBodUVlenpUVkx5QlRyUUdDK0dKV01SU1Y1WUpXa2E3ZndtRDlMQUFqb0F3QUFBQUFBQUFBZ0FPVHFwcUtSL2dLUmhGTG1SYlZsUE5KZ3Bmd1BzMTloazlXQWtXcXA0NGtDQWdFQUFBRUJBUUFCQVFJQUFBRUNBRExZNVg3bTJSNVZXTm9HZHhWTUx3aFhsVFNPTVgrVnJNbnZyZUcwRVMvTUFRN0tlSkFlTkNzbEZmdjVtK0pEcy9BSzNncDZVR2RiTnpCL1JNd1pYSkJHcTI0UkFnQUFBQUFnaTJxMnNVZ2QwZnJneFdaVmtnYWpKQWIxVjVmMVZ6YVRyWEVZSXhrTHFEQXkyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ek9nREFBQUFBQUFBVmw0bkFBQUFBQUFBJ1xuICAgICAgKTtcblxuICAgICAgY29uc3QgVW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oYmFzZWNvaW4pO1xuICAgICAgVW5zaWduZWRTd2VlcFR4bkRlc2VyaWFsaXplLmZyb21SYXdUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgICAgY29uc3QgVW5zaWduZWRTd2VlcFR4bkpzb24gPSBVbnNpZ25lZFN3ZWVwVHhuRGVzZXJpYWxpemUudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChVbnNpZ25lZFN3ZWVwVHhuSnNvbi5pZCwgJ0dGdWsxVkt5M3d6VEZlQVV0cm1VZTZzeFJodGV6enJHRGZLZHBRVHh2OXNvJyk7XG4gICAgICBzaG91bGQuZXF1YWwoVW5zaWduZWRTd2VlcFR4bkpzb24uc2VuZGVyLCBzZW5kZXJBZGRyZXNzMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBDb25zb2xpZGF0aW9uIFRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHJlY2VpdmVBZGRyZXNzMSA9ICcweDMyZDhlNTdlZTZkOTFlNTU1OGRhMDY3NzE1NGMyZjA4NTc5NTM0OGUzMTdmOTVhY2M5ZWZhZGUxYjQxMTJmY2MnO1xuICAgIGNvbnN0IHJlY2VpdmVBZGRyZXNzMiA9ICcweGRmNDA3ZTNlMjVlOTQwMGY5Nzc5YWM3NTcxNTM3YzIzNjE2ODQxOTRmMWFhNWRiMTI2YThmNTc0YjVlZDg1MWMnO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgY29uc3Qgc2VlZFJlY2VpdmVBZGRyZXNzMSA9ICcweGQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGEnO1xuICAgIGNvbnN0IHNlZWRSZWNlaXZlQWRkcmVzczIgPSAnMHgyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5JztcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGNhbGxCYWNrID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRCYWxhbmNlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKCcyMDAxMDE5NzYnKVxuICAgICAgICAud2l0aEFyZ3MocmVjZWl2ZUFkZHJlc3MyKVxuICAgICAgICAucmVzb2x2ZXMoJzIwMDAwMDAwMCcpXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoJzUwMDAwMDAwMCcpXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MyKVxuICAgICAgICAucmVzb2x2ZXMoJzIwMDAwMDAwMCcpO1xuXG4gICAgICBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0SW5wdXRDb2lucycgYXMga2V5b2YgU3VpKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyhyZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg5OTZhYWIzNjVkNDU1MWI2ZDEyNzRmNTIwYmJmYTdiMGE1NjZkNTQ4YjJkNTkwYjU1NjVjNjIzODEyZTdlNzZkJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcyMDEnLFxuICAgICAgICAgICAgZGlnZXN0OiAnSFhwTlRmeDlUQmR4RmNYSGk0UnppWnNRdURBSGF2UmFzSzZSaTE1clZ3dUEnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMjAwMDAwMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGIzOWM1ZjM4MDIwOGNjZTdmZTFiYTEyNThjOGQxOWJlZmIwMmE4MGYxNDk1MjYxN2VkMzcwOThkYmQ0ZDJkZjAnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzE5OScsXG4gICAgICAgICAgICBkaWdlc3Q6ICdtcWszN2hYTGtpVVlna1l4azJNeXFOeWtDa0NYd2U5N3VNdXM3YkRQaGUyJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEwMTk3NicpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhyZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHhmYTA0MTA1ZWVkZWJkYWJmNzI5ZGNjZWNmMDFkMGNmNWYxYjc3MDg5MmZhYzJlZDhmMWU2OWQ3MWEzMmEyZDI0JyxcbiAgICAgICAgICAgIHZlcnNpb246ICcyMDInLFxuICAgICAgICAgICAgZGlnZXN0OiAnRGVBcFJWU3JUYTl0dFh2TnlMZXhUNFBKY0FreXl4U3BpM0pRZVVnNHVhOFEnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMjAwMDAwMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg4NmU3MjhmZDcyNDJiM2JlNjBlOWMxOTQxYWRkMmM0N2ZiNjU1Nzc5MTA4YzM1MDBhMjE2MzEwMjE4NzQ4ZTJkJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcxNDcnLFxuICAgICAgICAgICAgZGlnZXN0OiAnNlBKZXlFWDRMOFJranNOYUY1R1NNQ3dSam1GR1lyUUI3ZmJtSlBGTU1QSEwnLFxuICAgICAgICAgICAgYmFsYW5jZTogJzUwMDAwMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKHNlZWRSZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHhmZDY2ZGJmZTdhMTQ5N2YyMTA3NDdiMDUzMmY2MmU2OTI2Y2IxNDRjNzVlNTE5ZjJkZmZmMTdhNGY2ZTUxNWZjJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcxNDgnLFxuICAgICAgICAgICAgZGlnZXN0OiAnUEozamZTMUVSU2hTTXRGV1pnbWE0aDZkdVdYOG5tNUJlaTF6M0JzenlCaycsXG4gICAgICAgICAgICBiYWxhbmNlOiAnMjAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEZlZUVzdGltYXRlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFDQUFoWWIvY0ZBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1DQWdBQkFRQUFBUUVDQUFBQkFRQXkyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ekFLWmFxczJYVVZSdHRFblQxSUx2NmV3cFdiVlNMTFZrTFZXWEdJNEV1Zm5iY2tBQUFBQUFBQUFJUFdmK2YxRWtsVzFnZ2kzcndvNUp3M0xmdHU5Vy9Vc3lyWnJJMEZZc0JUWnM1eGZPQUlJek9mK0c2RWxqSTBadnZzQ3FBOFVsU1lYN1RjSmpiMU5MZkRIQUFBQUFBQUFBQ0FMZktzWjRUOVkyeTFycmxCeFFRMkJvdVM5VkZqQmdWZnZiYkZmOVUrZjh6TFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NNkFNQUFBQUFBQUFBNGZVRkFBQUFBQUE9J1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKCcxMDE5NzYwJykpXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBQ0FBZ0E0ZlVGQUFBQUFBQWdrZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFNQ0FnQUJBUUFBQVFFQ0FBQUJBUURmUUg0K0plbEFENWQ1ckhWeFUzd2pZV2hCbFBHcVhiRW1xUFYwdGUyRkhBSDZCQkJlN2V2YXYzS2R6T3p3SFF6MThiZHdpUytzTHRqeDVwMXhveW90Sk1vQUFBQUFBQUFBSUx2UjFYamxLS3lsUkdoOXBYNFVwQkZCc0N2NUF0NlJCbitYWERBYm5mUkIzMEIrUGlYcFFBK1hlYXgxY1ZOOEkyRm9RWlR4cWwyeEpxajFkTFh0aFJ6b0F3QUFBQUFBQUFEaDlRVUFBQUFBQUE9PSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMTk5Nzg4MCcpKVxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQUNBQWdBaE5jWEFBQUFBQUFnaU1tZURiaWN1aDI1ZkxyZGZ6ZXlwTEtpdEFJbGxLREFTeXZNZzM1TEpBUUNBZ0FCQVFBQUFRRUNBQUFCQVFEU0FWWnVhZ3ZBSVAwdWIzTHB2ZUlpUDFVTlpOcW1FNWpOa1h3dmRRRXlTZ0dHNXlqOWNrS3p2bURwd1pRYTNTeEgrMlZYZVJDTU5RQ2lGakVDR0hTT0xaTUFBQUFBQUFBQUlGQUJMTExqTUpjNTFSMFA4REh5MFBiWHdzWVVEMGI1Z3ZWbWlac3VwYWZyMGdGV2Jtb0x3Q0Q5TG05eTZiM2lJajlWRFdUYXBoT1l6WkY4TDNVQk1rcm9Bd0FBQUFBQUFBRGg5UVVBQUFBQUFBPT0nXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzE5OTc4ODAnKSlcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFDQUFnQTRmVUZBQUFBQUFBZ2lNbWVEYmljdWgyNWZMcmRmemV5cExLaXRBSWxsS0RBU3l2TWczNUxKQVFDQWdBQkFRQUFBUUVDQUFBQkFRQXZwZGc1UzlhK3hWSmJsVkMvUTc0SFc0TkNMUUVId0Z4d0NVVGo2dXdtK1FIOVp0ditlaFNYOGhCMGV3VXk5aTVwSnNzVVRIWGxHZkxmL3hlazl1VVYvSlFBQUFBQUFBQUFJQVcyRFpkVldKOUVObnZMNFoyUE9PSGZLMlo3NERnU2dEUWNpNjBNZFF1WEw2WFlPVXZXdnNWU1c1VlF2ME8rQjF1RFFpMEJCOEJjY0FsRTQrcnNKdm5vQXdBQUFBQUFBQURoOVFVQUFBQUFBQT09J1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKCcxOTk3ODgwJykpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBzaWduZWQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGhvdCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyQ29uc29saWRhdGlvbnMoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgZW5kaW5nU2NhbkluZGV4OiAzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IHJlcy50cmFuc2FjdGlvbnM7XG4gICAgICB0cmFuc2FjdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIGNvbnN0IHR4bjEgPSB0cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eG4xLnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eG4xLnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTk4OTgwMjQwJyk7XG4gICAgICB0eG4xLnNlcmlhbGl6ZWRUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdBQUFDQUFpUU10d0xBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1DQWdBQkFRQUFBUUVDQUFBQkFRQXkyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ekFLWmFxczJYVVZSdHRFblQxSUx2NmV3cFdiVlNMTFZrTFZXWEdJNEV1Zm5iY2tBQUFBQUFBQUFJUFdmK2YxRWtsVzFnZ2kzcndvNUp3M0xmdHU5Vy9Vc3lyWnJJMEZZc0JUWnM1eGZPQUlJek9mK0c2RWxqSTBadnZzQ3FBOFVsU1lYN1RjSmpiMU5MZkRIQUFBQUFBQUFBQ0FMZktzWjRUOVkyeTFycmxCeFFRMkJvdVM5VkZqQmdWZnZiYkZmOVUrZjh6TFk1WDdtMlI1VldOb0dkeFZNTHdoWGxUU09NWCtWck1udnJlRzBFUy9NNkFNQUFBQUFBQURJSFJFQUFBQUFBQUE9J1xuICAgICAgKTtcblxuICAgICAgY29uc3QgdHhuMiA9IHRyYW5zYWN0aW9uc1sxXTtcbiAgICAgIHR4bjIuc2NhbkluZGV4LnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHR4bjIucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxOTc4MDIzMzInKTtcbiAgICAgIHR4bjIuc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQUNBQWhjT2NvTEFBQUFBQUFna2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhTUNBZ0FCQVFBQUFRRUNBQUFCQVFEZlFINCtKZWxBRDVkNXJIVnhVM3dqWVdoQmxQR3FYYkVtcVBWMHRlMkZIQUg2QkJCZTdldmF2M0tkek96d0hRejE4YmR3aVMrc0x0ang1cDF4b3lvdEpNb0FBQUFBQUFBQUlMdlIxWGpsS0t5bFJHaDlwWDRVcEJGQnNDdjVBdDZSQm4rWFhEQWJuZlJCMzBCK1BpWHBRQStYZWF4MWNWTjhJMkZvUVpUeHFsMnhKcWoxZExYdGhSem9Bd0FBQUFBQUFLU0lJUUFBQUFBQUFBPT0nXG4gICAgICApO1xuXG4gICAgICByZXMubGFzdFNjYW5JbmRleC5zaG91bGQuZXF1YWwoMik7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc2lnbmVkIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBjb2xkIHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgZW5kaW5nU2NhbkluZGV4OiAzLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDg5MDMyZGMwYjAwMDAwMDAwMDAyMDkxZjI1ZTIzN2I4M2EwMGE2MjcyNGZkYzRhODFlNDNmNDk0ZGM2YjQxYTEyNDE0OTI4MjZkMzZlNGQxMzFkYTMwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDAzMmQ4ZTU3ZWU2ZDkxZTU1NThkYTA2NzcxNTRjMmYwODU3OTUzNDhlMzE3Zjk1YWNjOWVmYWRlMWI0MTEyZmNjMDI5OTZhYWIzNjVkNDU1MWI2ZDEyNzRmNTIwYmJmYTdiMGE1NjZkNTQ4YjJkNTkwYjU1NjVjNjIzODEyZTdlNzZkYzkwMDAwMDAwMDAwMDAwMDIwZjU5ZmY5ZmQ0NDkyNTViNTgyMDhiN2FmMGEzOTI3MGRjYjdlZGJiZDViZjUyY2NhYjY2YjIzNDE1OGIwMTRkOWIzOWM1ZjM4MDIwOGNjZTdmZTFiYTEyNThjOGQxOWJlZmIwMmE4MGYxNDk1MjYxN2VkMzcwOThkYmQ0ZDJkZjBjNzAwMDAwMDAwMDAwMDAwMjAwYjdjYWIxOWUxM2Y1OGRiMmQ2YmFlNTA3MTQxMGQ4MWEyZTRiZDU0NThjMTgxNTdlZjZkYjE1ZmY1NGY5ZmYzMzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjY2U4MDMwMDAwMDAwMDAwMDBjODFkMTEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAxLFxuICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdhYjg0YzlkMDljNjc4YzAzODQzOWY2M2ZjZDQwZDI2NTM1Y2MxNDg1MTUxMjU3ZjRmMTc1YjZlOGEwZTk0MzE2JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8xJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDMyZDhlNTdlZTZkOTFlNTU1OGRhMDY3NzE1NGMyZjA4NTc5NTM0OGUzMTdmOTVhY2M5ZWZhZGUxYjQxMTJmY2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxOTg5ODAyNDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoJzE5ODk4MDI0MCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHg5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTk4OTgwMjQwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcxOTg5ODAyNDAnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgZmVlOiAxMTIxNzM2LFxuICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcxMTIxNzM2JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzNiODllZWM5ZDJkMmYzYjA0OWVjZGEyZTdiNWY0NzgyN2Y3OTI3ZmU2NjE4ZDZlOGIxM2Y2NGU3Yzk1ZjRiMDBiOTU3N2FiMDEzOTVlY2Y4ZWViODA0YjU5MGNlZGFlMTRmZjVmZDM5NDdiZjNiN2E5NWI5MzI3YzQ5ZTI3YzU0JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAnMDAwMDAyMDAwODVjMzljYTBiMDAwMDAwMDAwMDIwOTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMzAyMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMGRmNDA3ZTNlMjVlOTQwMGY5Nzc5YWM3NTcxNTM3YzIzNjE2ODQxOTRmMWFhNWRiMTI2YThmNTc0YjVlZDg1MWMwMWZhMDQxMDVlZWRlYmRhYmY3MjlkY2NlY2YwMWQwY2Y1ZjFiNzcwODkyZmFjMmVkOGYxZTY5ZDcxYTMyYTJkMjRjYTAwMDAwMDAwMDAwMDAwMjBiYmQxZDU3OGU1MjhhY2E1NDQ2ODdkYTU3ZTE0YTQxMTQxYjAyYmY5MDJkZTkxMDY3Zjk3NWMzMDFiOWRmNDQxZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxY2U4MDMwMDAwMDAwMDAwMDBhNDg4MjEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICc2NmQ2NTBiNGM0ZGVkZjVhYjMzYzkzODFlZTQ2MTQwYjMwYmI4OTZjZjJjNjZiN2IyNDFjYWU3MGQxNDE0ZjE2JyxcbiAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8yJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweGRmNDA3ZTNlMjVlOTQwMGY5Nzc5YWM3NTcxNTM3YzIzNjE2ODQxOTRmMWFhNWRiMTI2YThmNTc0YjVlZDg1MWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxOTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoJzE5NzgwMjMzMicpLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHg5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICcxOTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgZmVlOiAyMTk3NjY4LFxuICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcyMTk3NjY4JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzNiODllZWM5ZDJkMmYzYjA0OWVjZGEyZTdiNWY0NzgyN2Y3OTI3ZmU2NjE4ZDZlOGIxM2Y2NGU3Yzk1ZjRiMDBiOTU3N2FiMDEzOTVlY2Y4ZWViODA0YjU5MGNlZGFlMTRmZjVmZDM5NDdiZjNiN2E5NWI5MzI3YzQ5ZTI3YzU0JyxcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNjYW5JbmRleDogMixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc2lnbmVkIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBjb2xkIHdhbGxldCB3aXRoIHNlZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyQ29uc29saWRhdGlvbnMoe1xuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleVdpdGhTZWVkLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgZW5kaW5nU2NhbkluZGV4OiAzLFxuICAgICAgICBzZWVkOiAnMTIzJyxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0eFJlcXVlc3RzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDIwMDA4NWNkY2FiMWQwMDAwMDAwMDAwMjA4OGM5OWUwZGI4OWNiYTFkYjk3Y2JhZGQ3ZjM3YjJhNGIyYTJiNDAyMjU5NGEwYzA0YjJiY2M4MzdlNGIyNDA0MDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YTAxODZlNzI4ZmQ3MjQyYjNiZTYwZTljMTk0MWFkZDJjNDdmYjY1NTc3OTEwOGMzNTAwYTIxNjMxMDIxODc0OGUyZDkzMDAwMDAwMDAwMDAwMDAyMDUwMDEyY2IyZTMzMDk3MzlkNTFkMGZmMDMxZjJkMGY2ZDdjMmM2MTQwZjQ2Zjk4MmY1NjY4OTliMmVhNWE3ZWJkMjAxNTY2ZTZhMGJjMDIwZmQyZTZmNzJlOWJkZTIyMjNmNTUwZDY0ZGFhNjEzOThjZDkxN2MyZjc1MDEzMjRhZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzZkN2E0YzQ4ODI3NDU3MDdjMmNkNDBiMGM1NzU2NjYwMWEyYTRkMjY5ZjVjYjBhNjkyODI4NTUxMjEyY2Y0NTInLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzk5OTk5OS85NDg2MjYyMi8xNTczNjM1MDkvMScsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHhkMjAxNTY2ZTZhMGJjMDIwZmQyZTZmNzJlOWJkZTIyMjNmNTUwZDY0ZGFhNjEzOThjZDkxN2MyZjc1MDEzMjRhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnNDk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKDQ5NzgwMjMzMiksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICc0OTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzQ5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDIxOTc2NjgsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzIxOTc2NjgnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnY2EwYTAxNGJhNmYxMTEwNmExNTVlZjhlMmNhYjJmNzZkMjc3ZTRmMDFjZmZhNTkxYTliNDA4NDgzNDM4MjNiM2Q5MTA3NTJhNDljOTZiZjU4MTM5ODUyMDZlMjNjOWY5Y2QzYTc4ZjFjY2NmNWNmODhkZWY1MmI1NzNjZWRjOTMnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDIwMDA4NWMzOWNhMGIwMDAwMDAwMDAwMjA4OGM5OWUwZGI4OWNiYTFkYjk3Y2JhZGQ3ZjM3YjJhNGIyYTJiNDAyMjU5NGEwYzA0YjJiY2M4MzdlNGIyNDA0MDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwMmZhNWQ4Mzk0YmQ2YmVjNTUyNWI5NTUwYmY0M2JlMDc1YjgzNDIyZDAxMDdjMDVjNzAwOTQ0ZTNlYWVjMjZmOTAxZmQ2NmRiZmU3YTE0OTdmMjEwNzQ3YjA1MzJmNjJlNjkyNmNiMTQ0Yzc1ZTUxOWYyZGZmZjE3YTRmNmU1MTVmYzk0MDAwMDAwMDAwMDAwMDAyMDA1YjYwZDk3NTU1ODlmNDQzNjdiY2JlMTlkOGYzOGUxZGYyYjY2N2JlMDM4MTI4MDM0MWM4YmFkMGM3NTBiOTcyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5ZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzMyYTAwYTZkODkyNjMwNDY3YzdkMDY2NjM5MGQzYjI3Y2FhZjRhZWZlZTNkZGE5ZTBjOTdjM2Y4YmMwNmJjZWEnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzk5OTk5OS85NDg2MjYyMi8xNTczNjM1MDkvMicsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTk3ODAyMzMyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKDE5NzgwMjMzMiksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxOTc4MDIzMzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzE5NzgwMjMzMicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDIxOTc2NjgsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzIxOTc2NjgnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnY2EwYTAxNGJhNmYxMTEwNmExNTVlZjhlMmNhYjJmNzZkMjc3ZTRmMDFjZmZhNTkxYTliNDA4NDgzNDM4MjNiM2Q5MTA3NTJhNDljOTZiZjU4MTM5ODUyMDZlMjNjOWY5Y2QzYTc4ZjFjY2NmNWNmODhkZWY1MmI1NzNjZWRjOTMnLFxuICAgICAgICAgICAgICAgICAgICBsYXN0U2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEJhbGFuY2UsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldElucHV0Q29pbnMsIDIpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmdldEZlZUVzdGltYXRlLCAyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgVG9rZW4gQ29uc29saWRhdGlvbiBUcmFuc2FjdGlvbnMnLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FuZEJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3AkU3c8Ump2QWdme25ZQVlJMnhNJztcblxuICAgIGNvbnN0IHNlZWRSZWNlaXZlQWRkcmVzczEgPSAnMHhkMjAxNTY2ZTZhMGJjMDIwZmQyZTZmNzJlOWJkZTIyMjNmNTUwZDY0ZGFhNjEzOThjZDkxN2MyZjc1MDEzMjRhJztcbiAgICBjb25zdCBzZWVkUmVjZWl2ZUFkZHJlc3MyID0gJzB4MmZhNWQ4Mzk0YmQ2YmVjNTUyNWI5NTUwYmY0M2JlMDc1YjgzNDIyZDAxMDdjMDVjNzAwOTQ0ZTNlYWVjMjZmOSc7XG5cbiAgICBjb25zdCBwYWNrYWdlSWQgPSAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4JztcbiAgICBjb25zdCBjb2luVHlwZSA9IGAke3BhY2thZ2VJZH06OmRlZXA6OkRFRVBgO1xuICAgIGNvbnN0IGhvdFdhbGxldFJlY2VpdmVBZGRyZXNzMSA9ICcweDMyZDhlNTdlZTZkOTFlNTU1OGRhMDY3NzE1NGMyZjA4NTc5NTM0OGUzMTdmOTVhY2M5ZWZhZGUxYjQxMTJmY2MnO1xuICAgIGNvbnN0IGhvdFdhbGxldFJlY2VpdmVBZGRyZXNzMiA9ICcweGRmNDA3ZTNlMjVlOTQwMGY5Nzc5YWM3NTcxNTM3YzIzNjE2ODQxOTRmMWFhNWRiMTI2YThmNTc0YjVlZDg1MWMnO1xuICAgIGNvbnN0IGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczEgPSAnMHhhOTkyNzA5NTkxZGViNzQ3MWZiMzBkZGEwZjMzOWRiN2FiNTQ4ZDMzOTFhODlkM2YxZmEwYzcyZDIwOTI2NzVmJztcbiAgICBjb25zdCBjb2xkV2FsbGV0UmVjZWl2ZUFkZHJlc3MyID0gJzB4YzNhYzJhODZlMzViNjJiZmFkYTgzZjYzODhmZjI3YzdkZGE3MDkyY2YwYjgyOWQyZDFmNGMyODEzZTI4YWUzOSc7XG5cbiAgICBsZXQgZ2V0QmFsYW5jZVN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0SW5wdXRDb2luc1N0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZ2V0RmVlRXN0aW1hdGVTdHViOiBzaW5vbi5TaW5vblN0dWI7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGdldEJhbGFuY2VTdHViID0gc2FuZEJveC5zdHViKFN1aS5wcm90b3R5cGUsICdnZXRCYWxhbmNlJyBhcyBrZXlvZiBTdWkpO1xuICAgICAgZ2V0SW5wdXRDb2luc1N0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldElucHV0Q29pbnMnIGFzIGtleW9mIFN1aSk7XG4gICAgICBnZXRGZWVFc3RpbWF0ZVN0dWIgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEZlZUVzdGltYXRlJyBhcyBrZXlvZiBTdWkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBzaWduZWQgdG9rZW4gY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGhvdCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRCYWxhbmNlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoJzExNjcyMDE0NCcpXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczEsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoJzE1MDAnKVxuICAgICAgICAud2l0aEFyZ3MoaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MyKVxuICAgICAgICAucmVzb2x2ZXMoJzEyMDEwMTk3NicpXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczIsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoJzIwMDAnKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViXG4gICAgICAgIC53aXRoQXJncyhob3RXYWxsZXRSZWNlaXZlQWRkcmVzczEsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg4ZDJkYTU3NzIyN2U5YjcxNjZkYmI5YjNjY2U0ODA5NjhjZjU0OWI0NDhjNjYyNzcxZDExMjRkNjQyMGJmNzkyJyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3OCcsXG4gICAgICAgICAgICBkaWdlc3Q6ICdCbmlXaUczdjcxb3p6UmlyYjNoTktFUDE2cFR1M0NwTnQzdm95MXV6Z01pOScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxNTAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKGhvdFdhbGxldFJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDBlY2E3ODkwMWUzNDJiMjUxNWZiZjk5YmUyNDNiM2YwMGFkZTBhN2E1MDY3NWIzNzMwN2Y0NGNjMTk1YzkwNDYnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODc3JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ0Q4WHFKWHJrVkdvZXI5NTJHdkhCZEJEWHBvZjhINEY0cFJKSjF3U25FU05XJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzExNjYxODE2OCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHg3NjEyMjIzNDBkYjgwZGQ5ZGExNDRkNTUwOTg4NzBiYzgxYTc4ODIwNWUwYmJkZDM0YzJmOGRmMTJjZjQ1YWViJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcyMjcnLFxuICAgICAgICAgICAgZGlnZXN0OiAnOWJ3eWphU0gzWDhhbnJqR1VwRDFOcU1yTEZVdEdTQ0s5TEZ1TGJoalg2OUUnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAxOTc2JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKGhvdFdhbGxldFJlY2VpdmVBZGRyZXNzMiwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDhlMThiZDE0YzM0ZTMzZjgxYzQ5NGY0ZDZjMThkMDdjNjg2YzdmMzYxOTY4MmQyMDY2YjNmNTVlY2ZlNzA3YTInLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODY4JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJzZqWkZ1OFBSV0xKWVBld1c3SzNvNEdMVlBZblJ5Tm8za1A2NDU0ZUx1SFptJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzIwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3MoaG90V2FsbGV0UmVjZWl2ZUFkZHJlc3MyKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4ODExYTc1MDY2MTM0OTQ1ZTNiMDMzZjRhYzU0ZWM4ODVlYzAzODRmNDJhODA5OTRkODhhNDhkN2QxOGM0MjYwYScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMjM2JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJzMyTjlaeWZlckdERVY3UFkzeWtpalZWS2hMakVGU0w2aXRxY2ZSUEN5NG9XJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEwMTk3NicpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHhmODVhNzM4YTMwNTY2ZDU1ODgwMDIyOGYyZDVjMTkzYTVjYTNkZGJiZGRjYTJhNjVhNDhhOTMzMjMwNjcxNWNjJyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3NicsXG4gICAgICAgICAgICBkaWdlc3Q6ICc3Z0pnQ01ERVBkUWFNZXVYWjVDRk5vbkZLTVBReXc2azVzVDFScGFIRVhwZScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxMjAwMDAwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQURBUUNOTGFWM0luNmJjV2JidWJQTTVJQ1dqUFZKdEVqR1luY2RFU1RXUWd2M2txNXVFUUlBQUFBQUlLQks4WmpxNHl6L1BURlpMZzZqZjZnRFRzb2dpZzYzcGR1WGVpS2d6TVZLQUFqY0JRQUFBQUFBQUFBZ2tmSmVJM3VEb0FwaWNrL2NTb0hrUDBsTnhyUWFFa0ZKS0NiVGJrMFRIYU1DQWdFQUFBRUJBUUFCQVFJQUFBRUNBRExZNVg3bTJSNVZXTm9HZHhWTUx3aFhsVFNPTVgrVnJNbnZyZUcwRVMvTUFRN0tlSkFlTkNzbEZmdjVtK0pEcy9BSzNncDZVR2RiTnpCL1JNd1pYSkJHclc0UkFnQUFBQUFndERvcjZiOUVKSE9TV2RKWkNRZExrS3BTMmNQb0JjNWIyOEtwWDFyZzdsc3kyT1YrNXRrZVZWamFCbmNWVEM4SVY1VTBqakYvbGF6Sjc2M2h0QkV2ek9nREFBQUFBQUFBQU9IMUJRQUFBQUFBJ1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKCcyMzQ1NTA0JykpXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRQ09HTDBVdzA0eitCeEpUMDFzR05COGFHeC9OaGxvTFNCbXMvVmV6K2NIb3FSdUVRSUFBQUFBSUZVeFRUUXlUS002YlZqZUZISFQ4S1ZyVjJmZ1RPQ1g3VW9ldmsycjVKUGNBQWpRQndBQUFBQUFBQUFna2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhTUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FOOUFmajRsNlVBUGwzbXNkWEZUZkNOaGFFR1U4YXBkc1NhbzlYUzE3WVVjQWZoYWM0b3dWbTFWaUFBaWp5MWNHVHBjbzkyNzNjb3FaYVNLa3pJd1p4WE1yRzRSQWdBQUFBQWdZemZDV2l5cENtbWU4SUpaaHFuNW5UOCt6b1AzUzdzZlFLZmV6Vzk5WVd2ZlFINCtKZWxBRDVkNXJIVnhVM3dqWVdoQmxQR3FYYkVtcVBWMHRlMkZIT2dEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzIzNDU1MDQnKSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBwYWNrYWdlSWQsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gcmVzLnRyYW5zYWN0aW9ucztcbiAgICAgIHRyYW5zYWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgY29uc3QgdHhuMSA9IHRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4bjEuc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4bjEucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxNTAwJyk7XG4gICAgICB0eG4xLnNlcmlhbGl6ZWRUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdBQUFEQVFDTkxhVjNJbjZiY1diYnViUE01SUNXalBWSnRFakdZbmNkRVNUV1FndjNrcTV1RVFJQUFBQUFJS0JLOFpqcTR5ei9QVEZaTGc2amY2Z0RUc29naWc2M3BkdVhlaUtnek1WS0FBamNCUUFBQUFBQUFBQWdrZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFNQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQURMWTVYN20yUjVWV05vR2R4Vk1Md2hYbFRTT01YK1ZyTW52cmVHMEVTL01BUTdLZUpBZU5Dc2xGZnY1bStKRHMvQUszZ3A2VUdkYk56Qi9STXdaWEpCR3JXNFJBZ0FBQUFBZ3REb3I2YjlFSkhPU1dkSlpDUWRMa0twUzJjUG9CYzViMjhLcFgxcmc3bHN5Mk9WKzV0a2VWVmphQm5jVlRDOElWNVUwampGL2xheko3NjNodEJFdnpPZ0RBQUFBQUFBQVZsNG5BQUFBQUFBQSdcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4bjIgPSB0cmFuc2FjdGlvbnNbMV07XG4gICAgICB0eG4yLnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eG4yLnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMjAwMCcpO1xuICAgICAgdHhuMi5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBREFRQ09HTDBVdzA0eitCeEpUMDFzR05COGFHeC9OaGxvTFNCbXMvVmV6K2NIb3FSdUVRSUFBQUFBSUZVeFRUUXlUS002YlZqZUZISFQ4S1ZyVjJmZ1RPQ1g3VW9ldmsycjVKUGNBQWpRQndBQUFBQUFBQUFna2ZKZUkzdURvQXBpY2svY1NvSGtQMGxOeHJRYUVrRkpLQ2JUYmswVEhhTUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FOOUFmajRsNlVBUGwzbXNkWEZUZkNOaGFFR1U4YXBkc1NhbzlYUzE3WVVjQWZoYWM0b3dWbTFWaUFBaWp5MWNHVHBjbzkyNzNjb3FaYVNLa3pJd1p4WE1yRzRSQWdBQUFBQWdZemZDV2l5cENtbWU4SUpaaHFuNW5UOCt6b1AzUzdzZlFLZmV6Vzk5WVd2ZlFINCtKZWxBRDVkNXJIVnhVM3dqWVdoQmxQR3FYYkVtcVBWMHRlMkZIT2dEQUFBQUFBQUFWbDRuQUFBQUFBQUEnXG4gICAgICApO1xuXG4gICAgICByZXMubGFzdFNjYW5JbmRleC5zaG91bGQuZXF1YWwoMik7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc2lnbmVkIHRva2VuIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBjb2xkIHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGdldEJhbGFuY2VTdHViXG4gICAgICAgIC53aXRoQXJncyhjb2xkV2FsbGV0UmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoJzExNjcyMDE0NCcpXG4gICAgICAgIC53aXRoQXJncyhjb2xkV2FsbGV0UmVjZWl2ZUFkZHJlc3MxLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKCc0MDAwJylcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcygnMTIwMTAxOTc2JylcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczIsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoJzYwMDAnKTtcbiAgICAgIGdldElucHV0Q29pbnNTdHViXG4gICAgICAgIC53aXRoQXJncyhjb2xkV2FsbGV0UmVjZWl2ZUFkZHJlc3MxLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4OWUyNjE4Njg1ZmZmMzhiOTk5MzU1ZTkzYTQ2OTNjNGJkMThmNjhkZDZiNjU0ZmY2NTU1ZjFmNGFkMjI5ZGNkYicsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzYnLFxuICAgICAgICAgICAgZGlnZXN0OiAnRjVpR2pzOTVDblNjQ3RYSEZ1VEpoZFprZkx5YWdXUjFRbTF6REg2U25nTUcnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignNDAwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhjb2xkV2FsbGV0UmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4OGYzZjdjODk2MTk5NzMyNzE2NmIxNTcxMTE3ZmY2NzIzMmNjZDEyNjdlYzUyYTdlOTczNjc3YmEwNDMxZmZhZCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMjI2JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ0FXaDd0UG1TOXhtSDRhMnpZTENHNzNZRGlza0NmOHVpemJManBDU3RIaE5WJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzk4OTgwMjQwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDkxNmUzNWEwYWM2YjUyNWI3ZDM4YTQ0YjY2NzM5NGFhZWU3Y2RlNDFkZmZjODc2OTgwY2ZiYzg4NDU1OTBjZGQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODc4JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJzE0UGZOd1V2ZmNSM21OQVMxYmNOWFRvYW9vVkxuWFFIRGRHeFBGUkpRdFknLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTIwMDAwMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczIsIGNvaW5UeXBlKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4OjpkZWVwOjpERUVQJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHhjNTQ4YzIyMDQ1NGQyMGUwNzEyYmQyODU4YjA3MjYwYzgyOWExYzg0N2YzODE4YjQ3ODA1OTYxYjU3NDgxM2FiJyxcbiAgICAgICAgICAgIHZlcnNpb246ICczNDY5Njg3NycsXG4gICAgICAgICAgICBkaWdlc3Q6ICc4bUFOZG9za0c4ZUxMeTd6VlU1cm1IUkFYVkhVeUpQQUJmUzFtWUhTbUFZdCcsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCc2MDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgLndpdGhBcmdzKGNvbGRXYWxsZXRSZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHgzOTZhYjA5ZWU1OGZiMmM5ZmJjY2E4ODdjMDBlZjAxYTMzZDViZmU1NWE1ZDUwNTE0ZTMyYTU5Zjk0OGU5YTA1JyxcbiAgICAgICAgICAgIHZlcnNpb246ICcyMzQnLFxuICAgICAgICAgICAgZGlnZXN0OiAnSFdLVzU2ZHQ4Qk54U1R2WGlXN2R0RFZtTTJneEVleEZ5TlZ6R2o4SFBWcDQnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTAxOTc2JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGQ0YmZlZmE1MzI4MjdkNzYxOWE1ODI3OWE4N2RiODE2MzJlMjY3Y2M0OGU2Yjk0YWI4MWE0MzY3ZjAyY2JlZmEnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODc5JyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ0dKbnAxb1hOalZYTGNZWTZocVJWOFJtN0c3b2JtazNzOE5oajFiRnNma1VvJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEyMDAwMDAwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgZ2V0RmVlRXN0aW1hdGVTdHViXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRQ2VKaGhvWC84NHVaazFYcE9rYVR4TDBZOW8zV3RsVC9aVlh4OUswaW5jMjZ4dUVRSUFBQUFBSU5FNG14czFoR01tb3ZUVTVkZm5Gb291V09QZFZuMG5SRFBidVh5bUFMUExBQWlnRHdBQUFBQUFBQUFnQVdTVjNkcDBqQkZxSVlKQ2cxMDJSd25XeGU1Y2loN1doTVR2UXoweFJDRUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FLbVNjSldSM3JkSEg3TU4yZzh6bmJlclZJMHprYWlkUHgrZ3h5MGdrbWRmQVpGdU5hQ3NhMUpiZlRpa1MyWnpsS3J1Zk41QjMveUhhWURQdkloRldRemRybTRSQWdBQUFBQWdBQVBWZWxlYjhwTXU3by9jcDlNd3RHc1VNd0tBMjhDdmlPKzVONzlmb05HcGtuQ1ZrZDYzUngrekRkb1BNNTIzcTFTTk01R29uVDhmb01jdElKSm5YK2dEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzIzNDU1MDQnKSlcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgICdBQUFEQVFERlNNSWdSVTBnNEhFcjBvV0xCeVlNZ3BvY2hIODRHTFI0QlpZYlYwZ1RxNjF1RVFJQUFBQUFJSE5SOWxGN2I3TmRoV2d1dGtseDV2d0xtaWhpalJPSTZUMjRjdHp4OWc2dEFBaHdGd0FBQUFBQUFBQWdBV1NWM2RwMGpCRnFJWUpDZzEwMlJ3bld4ZTVjaWg3V2hNVHZRejB4UkNFQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQU1Pc0tvYmpXMksvcmFnL1k0ai9KOGZkcHdrczhMZ3AwdEgwd29FK0tLNDVBZFMvNzZVeWduMTJHYVdDZWFoOXVCWXk0bWZNU09hNVNyZ2FRMmZ3TEw3NnIyNFJBZ0FBQUFBZzQyMzUwTHFxYWFudWI1VHBqSm5ZbEtpdXBqRjJYYytxZ0RJb2lQT2tVNmpEckNxRzQxdGl2NjJvUDJPSS95ZkgzYWNKTFBDNEtkTFI5TUtCUGlpdU9lZ0RBQUFBQUFBQUFPSDFCUUFBQUFBQSdcbiAgICAgICAgKVxuICAgICAgICAucmVzb2x2ZXMobmV3IEJpZ051bWJlcignMjM0NTUwNCcpKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXlDb2xkV2FsbGV0LFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFja2FnZUlkLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgZW5kaW5nU2NhbkluZGV4OiAzLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMzAxMDA5ZTI2MTg2ODVmZmYzOGI5OTkzNTVlOTNhNDY5M2M0YmQxOGY2OGRkNmI2NTRmZjY1NTVmMWY0YWQyMjlkY2RiYWM2ZTExMDIwMDAwMDAwMDIwZDEzODliMWIzNTg0NjMyNmEyZjRkNGU1ZDdlNzE2OGEyZTU4ZTNkZDU2N2QyNzQ0MzNkYmI5N2NhNjAwYjNjYjAwMDhhMDBmMDAwMDAwMDAwMDAwMDAyMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMjAyMDEwMDAwMDEwMTAxMDAwMTAxMDIwMDAwMDEwMjAwYTk5MjcwOTU5MWRlYjc0NzFmYjMwZGRhMGYzMzlkYjdhYjU0OGQzMzkxYTg5ZDNmMWZhMGM3MmQyMDkyNjc1ZjAxOTE2ZTM1YTBhYzZiNTI1YjdkMzhhNDRiNjY3Mzk0YWFlZTdjZGU0MWRmZmM4NzY5ODBjZmJjODg0NTU5MGNkZGFlNmUxMTAyMDAwMDAwMDAyMDAwMDNkNTdhNTc5YmYyOTMyZWVlOGZkY2E3ZDMzMGI0NmIxNDMzMDI4MGRiYzBhZjg4ZWZiOTM3YmY1ZmEwZDFhOTkyNzA5NTkxZGViNzQ3MWZiMzBkZGEwZjMzOWRiN2FiNTQ4ZDMzOTFhODlkM2YxZmEwYzcyZDIwOTI2NzVmZTgwMzAwMDAwMDAwMDAwMDU2NWUyNzAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnY2VkYWRlNmMxYzk5ZTM1MzFjOTA1MzZmYTIyOGYwZmIxNDhmMzU2MDVkMWE0ZWRmYmU4ZWI3MzliZGM5OWE0OCcsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMScsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHhhOTkyNzA5NTkxZGViNzQ3MWZiMzBkZGEwZjMzOWRiN2FiNTQ4ZDMzOTFhODlkM2YxZmEwYzcyZDIwOTI2NzVmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnNDAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcignNDAwMCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnNDAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICc0MDAwJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1Rva2VuVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgZmVlOiAyNTgwMDU0LFxuICAgICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6ICcyNTgwMDU0JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICcwMDAwMDMwMTAwYzU0OGMyMjA0NTRkMjBlMDcxMmJkMjg1OGIwNzI2MGM4MjlhMWM4NDdmMzgxOGI0NzgwNTk2MWI1NzQ4MTNhYmFkNmUxMTAyMDAwMDAwMDAyMDczNTFmNjUxN2I2ZmIzNWQ4NTY4MmViNjQ5NzFlNmZjMGI5YTI4NjI4ZDEzODhlOTNkYjg3MmRjZjFmNjBlYWQwMDA4NzAxNzAwMDAwMDAwMDAwMDAwMjAwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxMDIwMjAxMDAwMDAxMDEwMTAwMDEwMTAyMDAwMDAxMDIwMGMzYWMyYTg2ZTM1YjYyYmZhZGE4M2Y2Mzg4ZmYyN2M3ZGRhNzA5MmNmMGI4MjlkMmQxZjRjMjgxM2UyOGFlMzkwMWQ0YmZlZmE1MzI4MjdkNzYxOWE1ODI3OWE4N2RiODE2MzJlMjY3Y2M0OGU2Yjk0YWI4MWE0MzY3ZjAyY2JlZmFhZjZlMTEwMjAwMDAwMDAwMjBlMzZkZjlkMGJhYWE2OWE5ZWU2Zjk0ZTk4Yzk5ZDg5NGE4YWVhNjMxNzY1ZGNmYWE4MDMyMjg4OGYzYTQ1M2E4YzNhYzJhODZlMzViNjJiZmFkYTgzZjYzODhmZjI3YzdkZGE3MDkyY2YwYjgyOWQyZDFmNGMyODEzZTI4YWUzOWU4MDMwMDAwMDAwMDAwMDA1NjVlMjcwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJ2QwNTUxNDA5ZDI0OGFjY2RkODk0NzEzYTRjMDNhNmQ4ZjI0MDM0OWE1ZTg1YjkwYWVmMDE5YjVmNDI2MDYyYzgnLFxuICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzInLFxuICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4YzNhYzJhODZlMzViNjJiZmFkYTgzZjYzODhmZjI3YzdkZGE3MDkyY2YwYjgyOWQyZDFmNGMyODEzZTI4YWUzOScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzYwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIoJzYwMDAnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4MDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzYwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnNjAwMCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUb2tlblRyYW5zZmVyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgIGZlZTogMjU4MDA1NCxcbiAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjU4MDA1NCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICc3OWQ0YjliNTk0ZGYwMjhmZWUzNzI1YTZhZjUxYWUzYWI2YTM1MTllOWQyYzMyMmYyYzhmZDgxNWI5NjQ5NjMyM2M1YWJhN2VhODc0YzEwMmY5NjZmMWE2MWQzYzlhNDJiNWYzMTc3YzZhODU3MTJjZjMxMzcxNWFmZGRmODNkOCcsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RTY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRJbnB1dENvaW5zLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRGZWVFc3RpbWF0ZSwgMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc2lnbmVkIHRva2VuIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBjb2xkIHdhbGxldCB3aXRoIHNlZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRCYWxhbmNlU3R1YlxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKCcxMjAxOTk3ODgnKVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMSwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcygnMTUwMCcpXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MyKVxuICAgICAgICAucmVzb2x2ZXMoJzEyMDE5OTc4OCcpXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MyLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKCcyMDAwJyk7XG5cbiAgICAgIGdldElucHV0Q29pbnNTdHViXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MxLCBjb2luVHlwZSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhODo6ZGVlcDo6REVFUCcsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4YTdhOGM5MTAyODAzNWFiNDk5NzdlNzJiMDg0ZTE0NWViMWMxZGRjZmUyZTA2OTI1ZjBmODMzY2VmMmQxZjY5ZicsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzgnLFxuICAgICAgICAgICAgZGlnZXN0OiAnQ0tpdVhrRk1hVmtuMTJpS2luWkNyOWFESGZHcENRaVBkeVpVUXpOREo5UXgnLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTUwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhzZWVkUmVjZWl2ZUFkZHJlc3MxKVxuICAgICAgICAucmVzb2x2ZXMoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBvYmplY3RJZDogJzB4NWVlYTAzNTNmMDc4MDE2YjcxYTg0Y2I0OTRlNmY3OTFlOTdjYjhkZTUzNDRkZWYzYmFlZGZmYzg5YzI3YTRiNScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMzQ2OTY4NzknLFxuICAgICAgICAgICAgZGlnZXN0OiAnNktxcndqS0hoSkNlNERYZmRIMnlNTEc4YlhHY1NRb1RlSnk0c2hnaERiVFonLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTIwMDAwMDAwJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDg2ZTcyOGZkNzI0MmIzYmU2MGU5YzE5NDFhZGQyYzQ3ZmI2NTU3NzkxMDhjMzUwMGEyMTYzMTAyMTg3NDhlMmQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzE0OCcsXG4gICAgICAgICAgICBkaWdlc3Q6ICdCOXpKZkVZa2lYbkF1TEU2cTNYRkplTGJQYzNLN3FtamdEckhWdkpuVDV3YScsXG4gICAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKCcxOTk3ODgnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMiwgY29pblR5cGUpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGUxOTFmMTY2ZTcxYjFlZjIwZmZkYTBjOTFiMjRkYTk1ZWNjOTNiNjU3YzQ2NGQ4YTA2ZjU2MWQ0NjkyNzIyZjAnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODgwJyxcbiAgICAgICAgICAgIGRpZ2VzdDogJzRLeWh6ZlBRY1RVcm5wNFVCdlIzR3NQRTNETGNjVkRFUGdCakR4YVdWUmNyJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzIwMDAnKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKVxuICAgICAgICAud2l0aEFyZ3Moc2VlZFJlY2VpdmVBZGRyZXNzMilcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGQzMmY5NDg4OWQwYmZjMDVjMjRlZDZjMDIzZDVkM2QzNjU0Mjk0YTgzN2Q4NTBkMzczOGIwZTM1MmUxZjQ4NjcnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzM0Njk2ODgwJyxcbiAgICAgICAgICAgIGRpZ2VzdDogJzVQbzEyWWl1TDNOa05UQXZ5V3ZSd3RSNTVKdml5UFZiY0RmVHZDd1FyVGtyJyxcbiAgICAgICAgICAgIGJhbGFuY2U6IG5ldyBCaWdOdW1iZXIoJzEyMDAwMDAwMCcpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29pblR5cGU6ICcweDI6OnN1aTo6U1VJJyxcbiAgICAgICAgICAgIG9iamVjdElkOiAnMHhmZDY2ZGJmZTdhMTQ5N2YyMTA3NDdiMDUzMmY2MmU2OTI2Y2IxNDRjNzVlNTE5ZjJkZmZmMTdhNGY2ZTUxNWZjJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcxNDknLFxuICAgICAgICAgICAgZGlnZXN0OiAnNWVWY2JibTNOVEY2anFhZFRiNEdqWk16bjc1S0RaQnFjc3BSejNzVnJwYlInLFxuICAgICAgICAgICAgYmFsYW5jZTogbmV3IEJpZ051bWJlcignMTk5Nzg4JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgIGdldEZlZUVzdGltYXRlU3R1YlxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgJ0FBQURBUUNucU1rUUtBTmF0SmwzNXlzSVRoUmVzY0hkeitMZ2FTWHcrRFBPOHRIMm42NXVFUUlBQUFBQUlLZzhaTWVGMlhMTGJCZFBReVBtZnU4YllxQ0Iyei91YVI1c0c3Rm9ibDdWQUFqY0JRQUFBQUFBQUFBZ2lNbWVEYmljdWgyNWZMcmRmemV5cExLaXRBSWxsS0RBU3l2TWczNUxKQVFDQWdFQUFBRUJBUUFCQVFJQUFBRUNBTklCVm01cUM4QWcvUzV2Y3VtOTRpSS9WUTFrMnFZVG1NMlJmQzkxQVRKS0FWN3FBMVB3ZUFGcmNhaE10SlRtOTVIcGZMamVVMFRlODdydC84aWNKNlMxcjI0UkFnQUFBQUFnVHg0aStSZ2NMZEE1cSt2eW1NK1dFVHB2Q25xRXFSNG9ZN1JxUWROajJvelNBVlp1YWd2QUlQMHViM0xwdmVJaVAxVU5aTnFtRTVqTmtYd3ZkUUV5U3VnREFBQUFBQUFBQU9IMUJRQUFBQUFBJ1xuICAgICAgICApXG4gICAgICAgIC5yZXNvbHZlcyhuZXcgQmlnTnVtYmVyKCcyMzQ1NTA0JykpXG4gICAgICAgIC53aXRoQXJncyhcbiAgICAgICAgICAnQUFBREFRRGhrZkZtNXhzZThnLzlvTWtiSk5xVjdNazdaWHhHVFlvRzlXSFVhU2NpOExCdUVRSUFBQUFBSURGdm9raW5CeG9XeWVMNjRsUE05bUpWT3BCMFVPalpqRHUrSjFza1BjUVBBQWpRQndBQUFBQUFBQUFnaU1tZURiaWN1aDI1ZkxyZGZ6ZXlwTEtpdEFJbGxLREFTeXZNZzM1TEpBUUNBZ0VBQUFFQkFRQUJBUUlBQUFFQ0FDK2wyRGxMMXI3RlVsdVZVTDlEdmdkYmcwSXRBUWZBWEhBSlJPUHE3Q2I1QWRNdmxJaWRDL3dGd2s3V3dDUFYwOU5sUXBTb045aFEwM09MRGpVdUgwaG5zRzRSQWdBQUFBQWdRVVdKMC90UFp0KytxN0tuTFltQVBXUlJvbm4vVy9YR1l4enhZNjg5eks4dnBkZzVTOWEreFZKYmxWQy9RNzRIVzROQ0xRRUh3Rnh3Q1VUajZ1d20rZWdEQUFBQUFBQUFBT0gxQlFBQUFBQUEnXG4gICAgICAgIClcbiAgICAgICAgLnJlc29sdmVzKG5ldyBCaWdOdW1iZXIoJzIzNDU1MDQnKSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5V2l0aFNlZWQsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBwYWNrYWdlSWQsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICAgIHNlZWQ6ICcxMjMnLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMzAxMDBhN2E4YzkxMDI4MDM1YWI0OTk3N2U3MmIwODRlMTQ1ZWIxYzFkZGNmZTJlMDY5MjVmMGY4MzNjZWYyZDFmNjlmYWU2ZTExMDIwMDAwMDAwMDIwYTgzYzY0Yzc4NWQ5NzJjYjZjMTc0ZjQzMjNlNjdlZWYxYjYyYTA4MWRiM2ZlZTY5MWU2YzFiYjE2ODZlNWVkNTAwMDhkYzA1MDAwMDAwMDAwMDAwMDAyMDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQwMjAyMDEwMDAwMDEwMTAxMDAwMTAxMDIwMDAwMDEwMjAwZDIwMTU2NmU2YTBiYzAyMGZkMmU2ZjcyZTliZGUyMjIzZjU1MGQ2NGRhYTYxMzk4Y2Q5MTdjMmY3NTAxMzI0YTAxNWVlYTAzNTNmMDc4MDE2YjcxYTg0Y2I0OTRlNmY3OTFlOTdjYjhkZTUzNDRkZWYzYmFlZGZmYzg5YzI3YTRiNWFmNmUxMTAyMDAwMDAwMDAyMDRmMWUyMmY5MTgxYzJkZDAzOWFiZWJmMjk4Y2Y5NjExM2E2ZjBhN2E4NGE5MWUyODYzYjQ2YTQxZDM2M2RhOGNkMjAxNTY2ZTZhMGJjMDIwZmQyZTZmNzJlOWJkZTIyMjNmNTUwZDY0ZGFhNjEzOThjZDkxN2MyZjc1MDEzMjRhZTgwMzAwMDAwMDAwMDAwMDU2NWUyNzAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnMjJkZWZhOTEwMWVhM2EzODM5YzNjMDAyNmIyN2E5ODM3MTY1YzA3ZmNlY2ZmOGU5NDM1M2JjZjNkNWEwMTMyOCcsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8xJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweGQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxNTAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKCcxNTAwJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxNTAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzE1MDAnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDI1ODAwNTQsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzI1ODAwNTQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnY2EwYTAxNGJhNmYxMTEwNmExNTVlZjhlMmNhYjJmNzZkMjc3ZTRmMDFjZmZhNTkxYTliNDA4NDgzNDM4MjNiM2Q5MTA3NTJhNDljOTZiZjU4MTM5ODUyMDZlMjNjOWY5Y2QzYTc4ZjFjY2NmNWNmODhkZWY1MmI1NzNjZWRjOTMnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgJzAwMDAwMzAxMDBlMTkxZjE2NmU3MWIxZWYyMGZmZGEwYzkxYjI0ZGE5NWVjYzkzYjY1N2M0NjRkOGEwNmY1NjFkNDY5MjcyMmYwYjA2ZTExMDIwMDAwMDAwMDIwMzE2ZmEyNDhhNzA3MWExNmM5ZTJmYWUyNTNjY2Y2NjI1NTNhOTA3NDUwZThkOThjM2JiZTI3NWIyNDNkYzQwZjAwMDhkMDA3MDAwMDAwMDAwMDAwMDAyMDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQwMjAyMDEwMDAwMDEwMTAxMDAwMTAxMDIwMDAwMDEwMjAwMmZhNWQ4Mzk0YmQ2YmVjNTUyNWI5NTUwYmY0M2JlMDc1YjgzNDIyZDAxMDdjMDVjNzAwOTQ0ZTNlYWVjMjZmOTAxZDMyZjk0ODg5ZDBiZmMwNWMyNGVkNmMwMjNkNWQzZDM2NTQyOTRhODM3ZDg1MGQzNzM4YjBlMzUyZTFmNDg2N2IwNmUxMTAyMDAwMDAwMDAyMDQxNDU4OWQzZmI0ZjY2ZGZiZWFiYjJhNzJkODk4MDNkNjQ1MWEyNzlmZjViZjVjNjYzMWNmMTYzYWYzZGNjYWYyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5ZTgwMzAwMDAwMDAwMDAwMDU2NWUyNzAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDIsXG4gICAgICAgICAgICAgICAgICBjb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnMmU2YmIxNzE2NmVlMTk3MTAyNzI5YmRhNDdiMDZiN2MwYjU5NjJiZjQzMWJiYjA1NjJiOTFlMjY3Yjc1MTI5ZCcsXG4gICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8yJyxcbiAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcyMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKCcyMDAwJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDg4Yzk5ZTBkYjg5Y2JhMWRiOTdjYmFkZDdmMzdiMmE0YjJhMmI0MDIyNTk0YTBjMDRiMmJjYzgzN2U0YjI0MDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcyMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzIwMDAnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmVlSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICBmZWU6IDI1ODAwNTQsXG4gICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzI1ODAwNTQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAnY2EwYTAxNGJhNmYxMTEwNmExNTVlZjhlMmNhYjJmNzZkMjc3ZTRmMDFjZmZhNTkxYTliNDA4NDgzNDM4MjNiM2Q5MTA3NTJhNDljOTZiZjU4MTM5ODUyMDZlMjNjOWY5Y2QzYTc4ZjFjY2NmNWNmODhkZWY1MmI1NzNjZWRjOTMnLFxuICAgICAgICAgICAgICAgICAgICBsYXN0U2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgd2FsbGV0Q29pbjogJ3RzdWk6ZGVlcCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgNCk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0SW5wdXRDb2lucywgNCk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0RmVlRXN0aW1hdGUsIDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ3JlYXRlIEJyb2FkY2FzdGFibGUgTVBDIFRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjcmVhdGUgYnJvYWRjYXN0YWJsZSBNUEMgdHJhbnNhY3Rpb24gZm9yIE9WQyBzaWduZWQgc3dlZXAgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMgPSB7XG4gICAgICAgIHNpZ25hdHVyZVNoYXJlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgICAnMDAwMDAyMDAwOGM4OGI5MDJmMDAwMDAwMDAwMDIwZGY0MDdlM2UyNWU5NDAwZjk3NzlhYzc1NzE1MzdjMjM2MTY4NDE5NGYxYWE1ZGIxMjZhOGY1NzRiNWVkODUxYzAyMDIwMDAxMDEwMDAwMDEwMTAyMDAwMDAxMDEwMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMTQ1NTNiMGY2Zjc5ZWQ5NTk0MjE0MTgzNWRlM2FiMDg2YmYzOGQxZjFkOTYyNzI5ODFlMTM5MGI4NGZiODZiMzZjOTAwMDAwMDAwMDAwMDAwMjAwYjFkZThmZGZiYmI4YTZmYTJjNjVlYzc5YTU1NzAzYzlhOWYwYzI2ODVhNzY4ZjJiODFhMDQyNmJjOTMyZWMzMDE2NDk1ZGRkYTc0OGMxMTZhMjE4MjQyODM1ZDM2NDcwOWQ2YzVlZTVjOGExZWQ2ODRjNGVmNDMzZDMxNDQyMWU4MDMwMDAwMDAwMDAwMDBhNDg4MjEwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICBzY2FuSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICdhNGNlOGViMTEzNjJjZDQ1YzA5OTM2ZTc0NTA0NGRjNzhiMjY4OWU1ZDgxNDdiOWVhOWE3ZGU0M2VlNDM5MjNhJyxcbiAgICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzAnLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICc3OTgwMDIxMjAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogOCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBbNzk4MDAyMTIwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweGRmNDA3ZTNlMjVlOTQwMGY5Nzc5YWM3NTcxNTM3YzIzNjE2ODQxOTRmMWFhNWRiMTI2YThmNTc0YjVlZDg1MWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzc5ODAwMjEyMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6ICc3OTgwMDIxMjAnLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDIxOTc2NjgsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMjE5NzY2OCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICc2ZjQ3MDkwNmRmODhjMzNiMjdjOGQxMTNlZDk0NGVkMGE0ZmM0OTliYTZjYzc2ZjAwYjg5MjQ5NDI4MTJkNzgzNTc5MmVlNDU1Y2JjODk0MWZhYmE3YmNjOTNiMTVhOWNkMTk4YTIwZGMzZjBiNjI5ZjVmZGNlYWIzNGU2NjEwMCcsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnMjg0NDk2Y2EwNGNjNjAzODIzZjc5OTNhZWYxM2Y3MmYzMzFkOTcwODViMjE4NGQ3YTZhNDYzYTkwYWE5MjdkMCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICAgICAgb3ZjOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlZGRzYVNpZ25hdHVyZToge1xuICAgICAgICAgICAgICAgICAgeTogJzI4NDQ5NmNhMDRjYzYwMzgyM2Y3OTkzYWVmMTNmNzJmMzMxZDk3MDg1YjIxODRkN2E2YTQ2M2E5MGFhOTI3ZDAnLFxuICAgICAgICAgICAgICAgICAgUjogJzZmNDcwOTA2ZGY4OGMzM2IyN2M4ZDExM2VkOTQ0ZWQwYTRmYzQ5OWJhNmNjNzZmMDBiODkyNDk0MjgxMmQ3ODMnLFxuICAgICAgICAgICAgICAgICAgc2lnbWE6ICc1YzIzYThjNzJjZTE5MjczMWU3MDJkYTQ2MGFlYTc5ZWQ2NjMzNGI0YTc4M2RjZjZkZDI3NTgzNDdkNmM5ZjBkJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4uY3JlYXRlQnJvYWRjYXN0YWJsZVN3ZWVwVHJhbnNhY3Rpb24oc2lnbmF0dXJlU2hhcmVzKTtcblxuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICdBQUFDQUFqSWk1QXZBQUFBQUFBZzMwQitQaVhwUUErWGVheDFjVk44STJGb1FaVHhxbDJ4SnFqMWRMWHRoUndDQWdBQkFRQUFBUUVDQUFBQkFRQUJaSlhkMm5TTUVXb2hna0tEWFRaSENkYkY3bHlLSHRhRXhPOURQVEZFSVFGRlU3RDI5NTdaV1VJVUdEWGVPckNHdnpqUjhkbGljcGdlRTVDNFQ3aHJOc2tBQUFBQUFBQUFJQXNkNlAzN3U0cHZvc1pleDVwVmNEeWFud3dtaGFkbzhyZ2FCQ2E4a3k3REFXU1YzZHAwakJGcUlZSkNnMTAyUnduV3hlNWNpaDdXaE1UdlF6MHhSQ0hvQXdBQUFBQUFBS1NJSVFBQUFBQUFBQT09JyxcbiAgICAgICAgICAgIHNjYW5JbmRleDogMCxcbiAgICAgICAgICAgIHNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgJ0FHOUhDUWJmaU1NN0o4alJFKzJVVHRDay9FbWJwc3gyOEF1SkpKUW9FdGVEWENPb3h5emhrbk1lY0Mya1lLNm5udFpqTkxTbmc5ejIzU2RZTkgxc253MG9SSmJLQk14Z09DUDNtVHJ2RS9jdk14MlhDRnNoaE5lbXBHT3BDcWtuMEE9PScsXG4gICAgICAgICAgICByZWNvdmVyeUFtb3VudDogJzc5ODAwMjEyMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZSBicm9hZGNhc3RhYmxlIE1QQyB0b2tlbiB0cmFuc2FjdGlvbiBmb3IgT1ZDIHNpZ25lZCBzd2VlcCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAgICcwMDAwMDQwMTAwNzJhZDk5MTMwYWJkMzc5MGRiN2JhYzg5MDhkNTBkMzQxMmE4MDBhOGZjZDEwYzFjZmJkNjRiODIxNTUzNzU1OGExNmUxMTAyMDAwMDAwMDAyMDA3Yjg1ZDM4YjZlMWI0ODVmMTQ1NTkzMGQyNzI5NjEwODA4MWNhYWNkNzY2NGM0OGQ3ZDVmNDg1NzJlZTJiYmQwMTAwNGMxY2NjYzZkMDM1MTBiZDc0YTk1ZjgxYjJiN2RhMDgxMTljYjE4ZTJjNTY1NDM1ZTdhZDcxNWU2YWFkYzVhNzY5NmUxMTAyMDAwMDAwMDAyMDhmYjRhMzM0YjgyOWFjZGVjYmZhMmEzMjg2NDJhZmEyNGQ2Zjk1Mzc0MGY3NjgzMDgwZWUwZTRiM2QzYTk2MmYwMDA4ZjgyYTAwMDAwMDAwMDAwMDAwMjA5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzMDMwMzAxMDAwMDAxMDEwMTAwMDIwMTAwMDAwMTAxMDIwMDAxMDEwMjAxMDAwMTAzMDAwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxMDE5ODExNGYyZGRlZmUzZjE2ZDlkMmUwMTYxOTRiNTJjNGMzYWY0MzBjMTYwMWJkYjM1MzljYmQyMzdjYmNhMDY4Njk2ZTExMDIwMDAwMDAwMDIwYjUxNmExNWI1MDM0YmNkNDI0MjU0NDBjNTY0Y2YzNmY0Mzk1NDJmODg2NzFlZjc5OWRkZTA2NjFlNzg5YTAwOTAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjFlODAzMDAwMDAwMDAwMDAwZjg2NDExMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgICBjb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICc0NDlhZGUxOTU5MDY4NWIxZWIwY2VmY2IyZWM0MWY0YzY4ZTM3ZDhlYWY3NTY4N2M0NTk2NWUyODhlNzFjYWE0JyxcbiAgICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzAnLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMTAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFsxMTAwMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHg5MWYyNWUyMzdiODNhMDBhNjI3MjRmZGM0YTgxZTQzZjQ5NGRjNmI0MWExMjQxNDkyODI2ZDM2ZTRkMTMxZGEzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxMTAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzExMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVG9rZW5UcmFuc2ZlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWU6IDExMzk5NjAsXG4gICAgICAgICAgICAgICAgICAgICAgZmVlU3RyaW5nOiAnMTEzOTk2MCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgICAgICAgICAgICAgJzc5ZDRiOWI1OTRkZjAyOGZlZTM3MjVhNmFmNTFhZTNhYjZhMzUxOWU5ZDJjMzIyZjJjOGZkODE1Yjk2NDk2MzIzYzVhYmE3ZWE4NzRjMTAyZjk2NmYxYTYxZDNjOWE0MmI1ZjMxNzdjNmE4NTcxMmNmMzEzNzE1YWZkZGY4M2Q4JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlOlxuICAgICAgICAgICAgICAgICAgICAgICcyM2M1M2U1NGYyNzEzODY1NzhkOTlhNjkzMmZmNzA4OTYwOTAwMTg4YWIzZTViY2UxYWVjMWYwMTllNTNhODVkMzE5N2Y4YjY0YTlmZWFkYmVkYmJkMzdhYTQyZTQ0NDQ2MDlmMDAwNzQzYWRjMGE5NGZmY2M3MjFjNzA1N2QwNCcsXG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnMjg0NDk2Y2EwNGNjNjAzODIzZjc5OTNhZWYxM2Y3MmYzMzFkOTcwODViMjE4NGQ3YTZhNDYzYTkwYWE5MjdkMCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHdhbGxldENvaW46ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRzc1ZlcnNpb246ICcwLjAuMScsXG4gICAgICAgICAgICBvdmM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVkZHNhU2lnbmF0dXJlOiB7XG4gICAgICAgICAgICAgICAgICB5OiAnMjg0NDk2Y2EwNGNjNjAzODIzZjc5OTNhZWYxM2Y3MmYzMzFkOTcwODViMjE4NGQ3YTZhNDYzYTkwYWE5MjdkMCcsXG4gICAgICAgICAgICAgICAgICBSOiAnMjNjNTNlNTRmMjcxMzg2NTc4ZDk5YTY5MzJmZjcwODk2MDkwMDE4OGFiM2U1YmNlMWFlYzFmMDE5ZTUzYTg1ZCcsXG4gICAgICAgICAgICAgICAgICBzaWdtYTogJzliNTJiNDVjNGQ1MzlmYWQ5MDY4MDVmOWZjYmFiNmZiNWU0MTUyMjQzY2FlZTI1Mjg1NWMzNmMzNDA0OGNjMDknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5jcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihzaWduYXR1cmVTaGFyZXMpO1xuXG4gICAgICByZXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgJ0FBQUVBUUJ5clprVENyMDNrTnQ3cklrSTFRMDBFcWdBcVB6UkRCejcxa3VDRlZOMVdLRnVFUUlBQUFBQUlBZTRYVGkyNGJTRjhVVlpNTkp5bGhDQWdjcXMxMlpNU05mVjlJVnk3aXU5QVFCTUhNekcwRFVRdlhTcFg0R3l0OW9JRVp5eGppeFdWRFhuclhGZWFxM0ZwMmx1RVFJQUFBQUFJSSswb3pTNEthemV5L29xTW9aQ3I2Sk5iNVUzUVBkb01JRHVEa3M5T3BZdkFBajRLZ0FBQUFBQUFBQWdrZkplSTN1RG9BcGljay9jU29Ia1AwbE54clFhRWtGSktDYlRiazBUSGFNREF3RUFBQUVCQVFBQ0FRQUFBUUVDQUFFQkFnRUFBUU1BQVdTVjNkcDBqQkZxSVlKQ2cxMDJSd25XeGU1Y2loN1doTVR2UXoweFJDRUJtQkZQTGQ3K1B4YlowdUFXR1V0U3hNT3ZRd3dXQWIyelU1eTlJM3k4b0docGJoRUNBQUFBQUNDMUZxRmJVRFM4MUNRbFJBeFdUUE52UTVWQytJWng3M21kM2daaDU0bWdDUUZrbGQzYWRJd1JhaUdDUW9OZE5rY0oxc1h1WElvZTFvVEU3ME05TVVRaDZBTUFBQUFBQUFENFpCRUFBQUFBQUFBPScsXG4gICAgICAgICAgICBzY2FuSW5kZXg6IDAsXG4gICAgICAgICAgICBzaWduYXR1cmU6XG4gICAgICAgICAgICAgICdBQ1BGUGxUeWNUaGxlTm1hYVRML2NJbGdrQUdJcXo1YnpocnNId0dlVTZoZG0xSzBYRTFUbjYyUWFBWDUvTHEyKzE1QlVpUThydUpTaFZ3MncwQkl6QWtvUkpiS0JNeGdPQ1AzbVRydkUvY3ZNeDJYQ0ZzaGhOZW1wR09wQ3FrbjBBPT0nLFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQ6ICcxMTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZSBicm9hZGNhc3RhYmxlIE1QQyB0cmFuc2FjdGlvbiBmb3IgT1ZDIHNpZ25lZCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAgICAgICAgICcwMDAwMDIwMDA4MjBjMmQ2MDUwMDAwMDAwMDAwMjAwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxMDIwMjAwMDEwMTAwMDAwMTAxMDIwMDAwMDEwMTAwYTk5MjcwOTU5MWRlYjc0NzFmYjMwZGRhMGYzMzlkYjdhYjU0OGQzMzkxYTg5ZDNmMWZhMGM3MmQyMDkyNjc1ZjAxNTY4YmVmZmU3NjUxMDMzYTA4MWE3Mzc1YTNiYjQzZDRkMmE4ZTI5MGEzOTZlODI2MjM2ZTczZDA5NzNiNDliNWQwMDAwMDAwMDAwMDAwMDAyMDhiYzA3NjRhNDU0ZGU3NTM4YjVlY2VhNmZkMGJkMjIxYzljODUyMDdhZjI5NzYxMjk0NGE5NjdkNDNlOGRkM2JhOTkyNzA5NTkxZGViNzQ3MWZiMzBkZGEwZjMzOWRiN2FiNTQ4ZDMzOTFhODlkM2YxZmEwYzcyZDIwOTI2NzVmZTgwMzAwMDAwMDAwMDAwMGE0ODgyMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICAgICAgICAgIHNjYW5JbmRleDogMSxcbiAgICAgICAgICAgICAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICBzaWduYWJsZUhleDogJzg1N2EyZjI2Njg3YzAxMWE2MWEwNjBhNDFkNGM4MGMxMGIyZmQzMWU5OGZlNjcwNGQ2YmNkYTI2ZjU3YjAzYmInLFxuICAgICAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMScsXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweGE5OTI3MDk1OTFkZWI3NDcxZmIzMGRkYTBmMzM5ZGI3YWI1NDhkMzM5MWE4OWQzZjFmYTBjNzJkMjA5MjY3NWYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzk3OTYwNDgwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IDcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogWzk3OTYwNDgwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzk3OTYwNDgwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogJzk3OTYwNDgwJyxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmVlOiAyMTk3NjY4LFxuICAgICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzIxOTc2NjgnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICc3OWQ0YjliNTk0ZGYwMjhmZWUzNzI1YTZhZjUxYWUzYWI2YTM1MTllOWQyYzMyMmYyYzhmZDgxNWI5NjQ5NjMyM2M1YWJhN2VhODc0YzEwMmY5NjZmMWE2MWQzYzlhNDJiNWYzMTc3YzZhODU3MTJjZjMxMzcxNWFmZGRmODNkOCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlOiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206ICdiYWNrdXAnLFxuICAgICAgICAgICAgICAgICAgICB0bzogJ3VzZXInLFxuICAgICAgICAgICAgICAgICAgICBzaGFyZTpcbiAgICAgICAgICAgICAgICAgICAgICAnY2RmZTE1ZDdjMGY4MGY4YWFkODlkODc4NzA2NjczY2UyNDI5NDdiMTI2ODUyYzAwZWUzMDllZjA1ZjdhODMwMWIyZTkwMmI5MGQzN2VhN2RmZTg2Y2U3OWM3YTk5YjJiMjdhMTc1YzNmNzE0YzMxMGZkOWUxMGVhODc3Y2M2MGYnLFxuICAgICAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogJ2U0NDViZDA5MmE0NjdkZjU3NzAwMWNmYmQ2MDgxYjE0NDVjYTBmNzUxNDcyMzM1NjFlZDJmNTNmNmEzMGU0NWEnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHNzVmVyc2lvbjogJzAuMC4xJyxcbiAgICAgICAgICAgIG92YzogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWRkc2FTaWduYXR1cmU6IHtcbiAgICAgICAgICAgICAgICAgIHk6ICdlNDQ1YmQwOTJhNDY3ZGY1NzcwMDFjZmJkNjA4MWIxNDQ1Y2EwZjc1MTQ3MjMzNTYxZWQyZjUzZjZhMzBlNDVhJyxcbiAgICAgICAgICAgICAgICAgIFI6ICdjZGZlMTVkN2MwZjgwZjhhYWQ4OWQ4Nzg3MDY2NzNjZTI0Mjk0N2IxMjY4NTJjMDBlZTMwOWVmMDVmN2E4MzAxJyxcbiAgICAgICAgICAgICAgICAgIHNpZ21hOiAnMmEzMTMyOWIyZTVlZjhjM2YyMjJlYjkxY2Q5ZDcwZTcxNmYyMjllZTE5ZDNjYTk0MTdjOGFjYzE2YjFkYTEwMCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICAgICAgICAgJzAwMDAwMjAwMDgwMGMyZWIwYjAwMDAwMDAwMDAyMDAxNjQ5NWRkZGE3NDhjMTE2YTIxODI0MjgzNWQzNjQ3MDlkNmM1ZWU1YzhhMWVkNjg0YzRlZjQzM2QzMTQ0MjEwMjAyMDAwMTAxMDAwMDAxMDEwMjAwMDAwMTAxMDBjM2FjMmE4NmUzNWI2MmJmYWRhODNmNjM4OGZmMjdjN2RkYTcwOTJjZjBiODI5ZDJkMWY0YzI4MTNlMjhhZTM5MDFkNjhmZWI0NzgwODg2Y2NmYTgxYTM3MDM2OTU4ZWM5YzhiZmFiZmU3NWEwYmI3YzRkMWE0NTg3OTkyMzQzZjViY2YwMDAwMDAwMDAwMDAwMDIwNWFkNGY2MzFhMzc4ZjhiMDk1NDJkNGRmNjY5NDJiNmRhYmIyZjY1Y2IyMGNmOGY2MjhjOTFjNjRmOTM1MmU0ZWMzYWMyYTg2ZTM1YjYyYmZhZGE4M2Y2Mzg4ZmYyN2M3ZGRhNzA5MmNmMGI4MjlkMmQxZjRjMjgxM2UyOGFlMzllODAzMDAwMDAwMDAwMDAwYTQ4ODIxMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4OiAnZjJiNTZhNzRlNzg3YjJhOThkZWNmMTg5ZTcxYjFlMGM1ZDRjY2VlODg2OTdiMzk5MWE0OGRlMjkxMDY3NjAyMCcsXG4gICAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoOiAnbS8yJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkVHg6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJzB4YzNhYzJhODZlMzViNjJiZmFkYTgzZjYzODhmZjI3YzdkZGE3MDkyY2YwYjgyOWQyZDFmNGMyODEzZTI4YWUzOScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMjAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IDgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogWzIwMDAwMDAwMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHgwMTY0OTVkZGRhNzQ4YzExNmEyMTgyNDI4MzVkMzY0NzA5ZDZjNWVlNWM4YTFlZDY4NGM0ZWY0MzNkMzE0NDIxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcyMDAwMDAwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogJ3RzdWknLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMjAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmVlOiAyMTk3NjY4LFxuICAgICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzIxOTc2NjgnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICc3OWQ0YjliNTk0ZGYwMjhmZWUzNzI1YTZhZjUxYWUzYWI2YTM1MTllOWQyYzMyMmYyYzhmZDgxNWI5NjQ5NjMyM2M1YWJhN2VhODc0YzEwMmY5NjZmMWE2MWQzYzlhNDJiNWYzMTc3YzZhODU3MTJjZjMxMzcxNWFmZGRmODNkOCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdFNjYW5JbmRleDogMjAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlOiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206ICdiYWNrdXAnLFxuICAgICAgICAgICAgICAgICAgICB0bzogJ3VzZXInLFxuICAgICAgICAgICAgICAgICAgICBzaGFyZTpcbiAgICAgICAgICAgICAgICAgICAgICAnMzUxODYxM2VhNWNlZmEzNmNkMjJlMWIwOTI3NDJkOGQwNTI3NDQxODg1MTgwNDAzOTdmMWE2NWE3NTRmOWU5NTMyNDg4OTMxMmQ3MDE0NjgxMWRiZGMyYTk2MjQ1YzUxOGUxNmZjNjFiZDFhNWEyYjUzYjUzZWJjZWM1ZDRhMDMnLFxuICAgICAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogJzRiMTQzYTEyODM1YmRkYTA0ODMxYTllZDg1MWY5ZWFkZDdiYTViNDZlOWMwN2ZkMDg3Yjc1MWY0NmEzZjM2NGQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHNzVmVyc2lvbjogJzAuMC4xJyxcbiAgICAgICAgICAgIG92YzogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWRkc2FTaWduYXR1cmU6IHtcbiAgICAgICAgICAgICAgICAgIHk6ICc0YjE0M2ExMjgzNWJkZGEwNDgzMWE5ZWQ4NTFmOWVhZGQ3YmE1YjQ2ZTljMDdmZDA4N2I3NTFmNDZhM2YzNjRkJyxcbiAgICAgICAgICAgICAgICAgIFI6ICczNTE4NjEzZWE1Y2VmYTM2Y2QyMmUxYjA5Mjc0MmQ4ZDA1Mjc0NDE4ODUxODA0MDM5N2YxYTY1YTc1NGY5ZTk1JyxcbiAgICAgICAgICAgICAgICAgIHNpZ21hOiAnMmRmNDhlZDYwZmY2MmIwZTg2ODljNWViZTU3MzE4ZjNkYWQ3NjI4ODY0NzUyNGI0MjBhY2Y3YjFhODRjYzAwMCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLmNyZWF0ZUJyb2FkY2FzdGFibGVTd2VlcFRyYW5zYWN0aW9uKHNpZ25hdHVyZVNoYXJlcyk7XG5cbiAgICAgIHJlcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VyaWFsaXplZFR4OlxuICAgICAgICAgICAgICAnQUFBQ0FBZ2d3dFlGQUFBQUFBQWdBV1NWM2RwMGpCRnFJWUpDZzEwMlJ3bld4ZTVjaWg3V2hNVHZRejB4UkNFQ0FnQUJBUUFBQVFFQ0FBQUJBUUNwa25DVmtkNjNSeCt6RGRvUE01MjNxMVNOTTVHb25UOGZvTWN0SUpKblh3RldpKy8rZGxFRE9nZ2FjM1dqdTBQVTBxamlrS09XNkNZamJuUFFsenRKdGRBQUFBQUFBQUFBSUl2QWRrcEZUZWRUaTE3T3B2MEwwaUhKeUZJSHJ5bDJFcFJLbG4xRDZOMDdxWkp3bFpIZXQwY2ZzdzNhRHpPZHQ2dFVqVE9ScUowL0g2REhMU0NTWjEvb0F3QUFBQUFBQUtTSUlRQUFBQUFBQUE9PScsXG4gICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICBzaWduYXR1cmU6XG4gICAgICAgICAgICAgICdBTTMrRmRmQStBK0tyWW5ZZUhCbWM4NGtLVWV4Sm9Vc0FPNHdudkJmZW9NQktqRXlteTVlK01QeUl1dVJ6WjF3NXhieUtlNFowOHFVRjhpc3dXc2RvUURrUmIwSktrWjk5WGNBSFB2V0NCc1VSY29QZFJSeU0xWWUwdlUvYWpEa1dnPT0nLFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQ6ICc5Nzk2MDQ4MCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICdBQUFDQUFnQXd1c0xBQUFBQUFBZ0FXU1YzZHAwakJGcUlZSkNnMTAyUnduV3hlNWNpaDdXaE1UdlF6MHhSQ0VDQWdBQkFRQUFBUUVDQUFBQkFRRERyQ3FHNDF0aXY2Mm9QMk9JL3lmSDNhY0pMUEM0S2RMUjlNS0JQaWl1T1FIV2ordEhnSWhzejZnYU53TnBXT3ljaS9xLzUxb0x0OFRScEZoNWtqUS9XODhBQUFBQUFBQUFJRnJVOWpHamVQaXdsVUxVMzJhVUsyMnJzdlpjc2d6NDlpakpIR1Q1TlM1T3c2d3FodU5iWXIrdHFEOWppUDhueDkybkNTend1Q25TMGZUQ2dUNG9yam5vQXdBQUFBQUFBS1NJSVFBQUFBQUFBQT09JyxcbiAgICAgICAgICAgIHNjYW5JbmRleDogMixcbiAgICAgICAgICAgIHNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgJ0FEVVlZVDZsenZvMnpTTGhzSkowTFkwRkowUVloUmdFQTVmeHBscDFUNTZWTGZTTzFnLzJLdzZHaWNYcjVYTVk4OXJYWW9oa2RTUzBJS3ozc2FoTXdBQkxGRG9TZzF2ZG9FZ3hxZTJGSDU2dDE3cGJSdW5BZjlDSHQxSDBhajgyVFE9PScsXG4gICAgICAgICAgICByZWNvdmVyeUFtb3VudDogJzIwMDAwMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogMjAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVhdGUgYnJvYWRjYXN0YWJsZSBNUEMgdHJhbnNhY3Rpb24gZm9yIE9WQyBzaWduZWQgdG9rZW4gY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMgPSB7XG4gICAgICAgIHNpZ25hdHVyZVNoYXJlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgICAnMDAwMDAzMDEwMGE3YThjOTEwMjgwMzVhYjQ5OTc3ZTcyYjA4NGUxNDVlYjFjMWRkY2ZlMmUwNjkyNWYwZjgzM2NlZjJkMWY2OWZhZTZlMTEwMjAwMDAwMDAwMjBhODNjNjRjNzg1ZDk3MmNiNmMxNzRmNDMyM2U2N2VlZjFiNjJhMDgxZGIzZmVlNjkxZTZjMWJiMTY4NmU1ZWQ1MDAwOGRjMDUwMDAwMDAwMDAwMDAwMDIwODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNDAyMDIwMTAwMDAwMTAxMDEwMDAxMDEwMjAwMDAwMTAyMDBkMjAxNTY2ZTZhMGJjMDIwZmQyZTZmNzJlOWJkZTIyMjNmNTUwZDY0ZGFhNjEzOThjZDkxN2MyZjc1MDEzMjRhMDE1ZWVhMDM1M2YwNzgwMTZiNzFhODRjYjQ5NGU2Zjc5MWU5N2NiOGRlNTM0NGRlZjNiYWVkZmZjODljMjdhNGI1YWY2ZTExMDIwMDAwMDAwMDIwNGYxZTIyZjkxODFjMmRkMDM5YWJlYmYyOThjZjk2MTEzYTZmMGE3YTg0YTkxZTI4NjNiNDZhNDFkMzYzZGE4Y2QyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGFlODAzMDAwMDAwMDAwMDAwNTY1ZTI3MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAxLFxuICAgICAgICAgICAgICAgICAgICBjb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICcyMmRlZmE5MTAxZWEzYTM4MzljM2MwMDI2YjI3YTk4MzcxNjVjMDdmY2VjZmY4ZTk0MzUzYmNmM2Q1YTAxMzI4JyxcbiAgICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzk5OTk5OS85NDg2MjYyMi8xNTczNjM1MDkvMScsXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweGQyMDE1NjZlNmEwYmMwMjBmZDJlNmY3MmU5YmRlMjIyM2Y1NTBkNjRkYWE2MTM5OGNkOTE3YzJmNzUwMTMyNGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzE1MDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBbMTUwMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHg4OGM5OWUwZGI4OWNiYTFkYjk3Y2JhZGQ3ZjM3YjJhNGIyYTJiNDAyMjU5NGEwYzA0YjJiY2M4MzdlNGIyNDA0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcxNTAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMTUwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1Rva2VuVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmVlOiAyNTgwMDU0LFxuICAgICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzI1ODAwNTQnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlOiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206ICdiYWNrdXAnLFxuICAgICAgICAgICAgICAgICAgICB0bzogJ3VzZXInLFxuICAgICAgICAgICAgICAgICAgICBzaGFyZTpcbiAgICAgICAgICAgICAgICAgICAgICAnMTk4OTQyMGNlODAwZTM1ZTFjNTkwOTA3ZjIwMTdiNTUyOTk0NTQ4NGIzZmY4ODRmOGU4ODM5MGRhODg5MzZlNmE1ODQ0ZTQ4NjBkZjBmNDg5ZTJhMDk3NTUxOWMxZDZmNWYwMjU1ZGQwOTFlZGJmODU5Yzc0MDYzYTdmMWUyMGUnLFxuICAgICAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogJzQwOGM3YTExOTY3MTUyZWZlZTk1M2YzZWIxNjE5MTAwNDk0NjY4NWZkYzRkZDgwODdiOTFlM2FmY2I3N2M5MTYnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICAgICAgb3ZjOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlZGRzYVNpZ25hdHVyZToge1xuICAgICAgICAgICAgICAgICAgeTogJzQwOGM3YTExOTY3MTUyZWZlZTk1M2YzZWIxNjE5MTAwNDk0NjY4NWZkYzRkZDgwODdiOTFlM2FmY2I3N2M5MTYnLFxuICAgICAgICAgICAgICAgICAgUjogJzE5ODk0MjBjZTgwMGUzNWUxYzU5MDkwN2YyMDE3YjU1Mjk5NDU0ODRiM2ZmODg0ZjhlODgzOTBkYTg4OTM2ZTYnLFxuICAgICAgICAgICAgICAgICAgc2lnbWE6ICdjMmNlNTI4ZjFmMzIzZmU5YWYyNTZhYmI1NzQyODk3M2IyZTk3ZTRmYTU0ZmE2ZjUwYzM5NDMwMzY4MTU4NjBlJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgICAgICAgICAnMDAwMDAzMDEwMGUxOTFmMTY2ZTcxYjFlZjIwZmZkYTBjOTFiMjRkYTk1ZWNjOTNiNjU3YzQ2NGQ4YTA2ZjU2MWQ0NjkyNzIyZjBiMDZlMTEwMjAwMDAwMDAwMjAzMTZmYTI0OGE3MDcxYTE2YzllMmZhZTI1M2NjZjY2MjU1M2E5MDc0NTBlOGQ5OGMzYmJlMjc1YjI0M2RjNDBmMDAwOGQwMDcwMDAwMDAwMDAwMDAwMDIwODhjOTllMGRiODljYmExZGI5N2NiYWRkN2YzN2IyYTRiMmEyYjQwMjI1OTRhMGMwNGIyYmNjODM3ZTRiMjQwNDAyMDIwMTAwMDAwMTAxMDEwMDAxMDEwMjAwMDAwMTAyMDAyZmE1ZDgzOTRiZDZiZWM1NTI1Yjk1NTBiZjQzYmUwNzViODM0MjJkMDEwN2MwNWM3MDA5NDRlM2VhZWMyNmY5MDFkMzJmOTQ4ODlkMGJmYzA1YzI0ZWQ2YzAyM2Q1ZDNkMzY1NDI5NGE4MzdkODUwZDM3MzhiMGUzNTJlMWY0ODY3YjA2ZTExMDIwMDAwMDAwMDIwNDE0NTg5ZDNmYjRmNjZkZmJlYWJiMmE3MmQ4OTgwM2Q2NDUxYTI3OWZmNWJmNWM2NjMxY2YxNjNhZjNkY2NhZjJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjllODAzMDAwMDAwMDAwMDAwNTY1ZTI3MDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgc2NhbkluZGV4OiAyLFxuICAgICAgICAgICAgICAgICAgICBjb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFibGVIZXg6ICcyZTZiYjE3MTY2ZWUxOTcxMDI3MjliZGE0N2IwNmI3YzBiNTk2MmJmNDMxYmJiMDU2MmI5MWUyNjdiNzUxMjlkJyxcbiAgICAgICAgICAgICAgICAgICAgZGVyaXZhdGlvblBhdGg6ICdtLzk5OTk5OS85NDg2MjYyMi8xNTczNjM1MDkvMicsXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICcweDJmYTVkODM5NGJkNmJlYzU1MjViOTU1MGJmNDNiZTA3NWI4MzQyMmQwMTA3YzA1YzcwMDk0NGUzZWFlYzI2ZjknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzIwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBbMjAwMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiAnMHg4OGM5OWUwZGI4OWNiYTFkYjk3Y2JhZGQ3ZjM3YjJhNGIyYTJiNDAyMjU5NGEwYzA0YjJiY2M4MzdlNGIyNDA0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6ICcyMDAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29pbk5hbWU6ICd0c3VpOmRlZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIHNwZW5kQW1vdW50OiAnMjAwMCcsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1Rva2VuVHJhbnNmZXInLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmVlOiAyNTgwMDU0LFxuICAgICAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogJzI1ODAwNTQnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYTBhMDE0YmE2ZjExMTA2YTE1NWVmOGUyY2FiMmY3NmQyNzdlNGYwMWNmZmE1OTFhOWI0MDg0ODM0MzgyM2IzZDkxMDc1MmE0OWM5NmJmNTgxMzk4NTIwNmUyM2M5ZjljZDNhNzhmMWNjY2Y1Y2Y4OGRlZjUyYjU3M2NlZGM5MycsXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdFNjYW5JbmRleDogMjAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlOiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206ICdiYWNrdXAnLFxuICAgICAgICAgICAgICAgICAgICB0bzogJ3VzZXInLFxuICAgICAgICAgICAgICAgICAgICBzaGFyZTpcbiAgICAgICAgICAgICAgICAgICAgICAnOWUxZDBmZDY2NDA3ODBjZjRkYzIwOWZhNmVkODk1N2Q2OTU4ZTBkMDI3MmQ4YTJmZDQ4NDM4YzAxMWY2N2EyMjAwZGUxYTc4ZTIzYmMyYTdkMjYxZDBkMDJhNDIyMTQ1MzAxYWE5Y2U5N2QzZDMwNmIzNTAxYjFmNDRkOTU2MDYnLFxuICAgICAgICAgICAgICAgICAgICBwdWJsaWNTaGFyZTogJzM2MmQ3MTZhNWEyMzBkNjgzYjYwZDI5ZWNlOTQxMTk3ZTA5NjI3YzIzNGM3MTQ0OWZhY2FiNTE0YzNhN2FiYWYnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB3YWxsZXRDb2luOiAndHN1aTpkZWVwJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICAgICAgb3ZjOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlZGRzYVNpZ25hdHVyZToge1xuICAgICAgICAgICAgICAgICAgeTogJzM2MmQ3MTZhNWEyMzBkNjgzYjYwZDI5ZWNlOTQxMTk3ZTA5NjI3YzIzNGM3MTQ0OWZhY2FiNTE0YzNhN2FiYWYnLFxuICAgICAgICAgICAgICAgICAgUjogJzllMWQwZmQ2NjQwNzgwY2Y0ZGMyMDlmYTZlZDg5NTdkNjk1OGUwZDAyNzJkOGEyZmQ0ODQzOGMwMTFmNjdhMjInLFxuICAgICAgICAgICAgICAgICAgc2lnbWE6ICcxNWE4MmY3YzRhZWRiOWViZDRhYjQ4MWI0MjgxZDZmY2FkYjJhODQyMjYzNWYxNmU0ZTMxOTY3MDk3MDAxODA2JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4uY3JlYXRlQnJvYWRjYXN0YWJsZVN3ZWVwVHJhbnNhY3Rpb24oc2lnbmF0dXJlU2hhcmVzKTtcblxuICAgICAgcmVzLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXJpYWxpemVkVHg6XG4gICAgICAgICAgICAgICdBQUFEQVFDbnFNa1FLQU5hdEpsMzV5c0lUaFJlc2NIZHorTGdhU1h3K0RQTzh0SDJuNjV1RVFJQUFBQUFJS2c4Wk1lRjJYTExiQmRQUXlQbWZ1OGJZcUNCMnovdWFSNXNHN0ZvYmw3VkFBamNCUUFBQUFBQUFBQWdpTW1lRGJpY3VoMjVmTHJkZnpleXBMS2l0QUlsbEtEQVN5dk1nMzVMSkFRQ0FnRUFBQUVCQVFBQkFRSUFBQUVDQU5JQlZtNXFDOEFnL1M1dmN1bTk0aUkvVlExazJxWVRtTTJSZkM5MUFUSktBVjdxQTFQd2VBRnJjYWhNdEpUbTk1SHBmTGplVTBUZTg3cnQvOGljSjZTMXIyNFJBZ0FBQUFBZ1R4NGkrUmdjTGRBNXErdnltTStXRVRwdkNucUVxUjRvWTdScVFkTmoyb3pTQVZadWFndkFJUDB1YjNMcHZlSWlQMVVOWk5xbUU1ak5rWHd2ZFFFeVN1Z0RBQUFBQUFBQVZsNG5BQUFBQUFBQScsXG4gICAgICAgICAgICBzY2FuSW5kZXg6IDEsXG4gICAgICAgICAgICBzaWduYXR1cmU6XG4gICAgICAgICAgICAgICdBQm1KUWd6b0FPTmVIRmtKQi9JQmUxVXBsRlNFcy8rSVQ0NklPUTJvaVRibXdzNVNqeDh5UCttdkpXcTdWMEtKYzdMcGZrK2xUNmIxRERsREEyZ1ZoZzVBakhvUmxuRlM3KzZWUHo2eFlaRUFTVVpvWDl4TjJBaDdrZU92eTNmSkZnPT0nLFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQ6ICcxNTAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWRUeDpcbiAgICAgICAgICAgICAgJ0FBQURBUURoa2ZGbTV4c2U4Zy85b01rYkpOcVY3TWs3Wlh4R1RZb0c5V0hVYVNjaThMQnVFUUlBQUFBQUlERnZva2luQnhvV3llTDY0bFBNOW1KVk9wQjBVT2paakR1K0oxc2tQY1FQQUFqUUJ3QUFBQUFBQUFBZ2lNbWVEYmljdWgyNWZMcmRmemV5cExLaXRBSWxsS0RBU3l2TWczNUxKQVFDQWdFQUFBRUJBUUFCQVFJQUFBRUNBQytsMkRsTDFyN0ZVbHVWVUw5RHZnZGJnMEl0QVFmQVhIQUpST1BxN0NiNUFkTXZsSWlkQy93RndrN1d3Q1BWMDlObFFwU29OOWhRMDNPTERqVXVIMGhuc0c0UkFnQUFBQUFnUVVXSjAvdFBadCsrcTdLbkxZbUFQV1JSb25uL1cvWEdZeHp4WTY4OXpLOHZwZGc1UzlhK3hWSmJsVkMvUTc0SFc0TkNMUUVId0Z4d0NVVGo2dXdtK2VnREFBQUFBQUFBVmw0bkFBQUFBQUFBJyxcbiAgICAgICAgICAgIHNjYW5JbmRleDogMixcbiAgICAgICAgICAgIHNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgJ0FKNGREOVprQjREUFRjSUorbTdZbFgxcFdPRFFKeTJLTDlTRU9NQVI5bm9pRmFndmZFcnR1ZXZVcTBnYlFvSFcvSzJ5cUVJbU5mRnVUakdXY0pjQUdBWTJMWEZxV2lNTmFEdGcwcDdPbEJHWDRKWW53alRIRkVuNnlyVVV3NmVycnc9PScsXG4gICAgICAgICAgICByZWNvdmVyeUFtb3VudDogJzIwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxhc3RTY2FuSW5kZXg6IDIwLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIFRyYW5zYWN0aW9uIEZhaWx1cmVzOicsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MwID0gJzB4OTFmMjVlMjM3YjgzYTAwYTYyNzI0ZmRjNGE4MWU0M2Y0OTRkYzZiNDFhMTI0MTQ5MjgyNmQzNmU0ZDEzMWRhMyc7XG4gICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9ICcweDAwZTRlYWE2YTI5MWZlMDI5MTg0NTJlNjQ1YjU2NTNjZDI2MGE1ZmMwZmIzNWY2MTkzZDU4MDkxNmFhOWUzODknO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHJlY292ZXIgZHVlIHRvIG5vbi16ZXJvIGZ1bmQgYnV0IGluc3VmZmljaWVudCBmdW5kcyBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFjay53aXRoQXJncyhzZW5kZXJBZGRyZXNzMCkucmVzb2x2ZXMoJzk4MDAyMTInKTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXIoe1xuICAgICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogJzAnLFxuICAgICAgICAgIHNjYW46IDEsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4gUGxlYXNlIHN0YXJ0IHRoZSBuZXh0IHNjYW4gYXQgYWRkcmVzcyBpbmRleCAxLiBJZiBpdCBpcyB0b2tlbiB0cmFuc2FjdGlvbiwgcGxlYXNlIGtlZXAgc3VmZmljaWVudCBTdWkgYmFsYW5jZSBpbiB0aGUgYWRkcmVzcyBmb3IgdGhlIHRyYW5zYWN0aW9uIGZlZS4nXG4gICAgICAgICk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byByZWNvdmVyIGR1ZSB0byBub3QgZmluZGluZyBhbiBhZGRyZXNzIHdpdGggZnVuZHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihTdWkucHJvdG90eXBlLCAnZ2V0QmFsYW5jZScgYXMga2V5b2YgU3VpKTtcbiAgICAgIGNhbGxCYWNrLnJlc29sdmVzKCcwJyk7XG5cbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgc2NhbjogJzEwJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4IDEwLiBJZiBpdCBpcyB0b2tlbiB0cmFuc2FjdGlvbiwgcGxlYXNlIGtlZXAgc3VmZmljaWVudCBTdWkgYmFsYW5jZSBpbiB0aGUgYWRkcmVzcyBmb3IgdGhlIHRyYW5zYWN0aW9uIGZlZS4nXG4gICAgICAgICk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5nZXRCYWxhbmNlLCAxMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDb25zb2xpZGF0aW9uIFRyYW5zYWN0aW9uIEZhaWx1cmVzOicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcyBpbiByZWNlaXZlIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgICAgY29uc3QgcmVjZWl2ZUFkZHJlc3MxID0gJzB4MzJkOGU1N2VlNmQ5MWU1NTU4ZGEwNjc3MTU0YzJmMDg1Nzk1MzQ4ZTMxN2Y5NWFjYzllZmFkZTFiNDExMmZjYyc7XG4gICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3AkU3c8Ump2QWdme25ZQVlJMnhNJztcblxuICAgICAgY29uc3QgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoU3VpLnByb3RvdHlwZSwgJ2dldEJhbGFuY2UnIGFzIGtleW9mIFN1aSk7XG4gICAgICBjYWxsQmFjay53aXRoQXJncyhyZWNlaXZlQWRkcmVzczEpLnJlc29sdmVzKCcxJyk7XG5cbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyQ29uc29saWRhdGlvbnMoe1xuICAgICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgc3RhcnRpbmdTY2FuSW5kZXg6ICcxJyxcbiAgICAgICAgICBlbmRpbmdTY2FuSW5kZXg6ICcyJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4IDIuJ1xuICAgICAgICApO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZ2V0QmFsYW5jZSwgMSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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