PHP WebShell

Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit

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

"use strict";
//
// Test for Keychains
//
Object.defineProperty(exports, "__esModule", { value: true });
const statics_1 = require("@bitgo/statics");
const assert = require("assert");
const _ = require("lodash");
const nock = require("nock");
const should = require("should");
const sinon = require("sinon");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const bitgo_1 = require("../../../src/bitgo");
describe('V2 Keychains', function () {
    let bitgo;
    let basecoin;
    let keychains;
    let bgUrl;
    before(function () {
        bitgo = sdk_test_1.TestBitGo.decorate(bitgo_1.BitGo, { env: 'mock' });
        bitgo.initializeTestVars();
        bitgo.setValidate(false);
        basecoin = bitgo.coin('tltc');
        keychains = basecoin.keychains();
        bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri;
    });
    describe('Add Keychain', function () {
        it('should add a keychain', async function () {
            const scope = nock(bgUrl)
                .post('/api/v2/tltc/key', function (body) {
                body.pub.should.equal('pub');
                body.derivedFromParentWithSeed.should.equal('derivedFromParentWithSeed');
                return true;
            })
                .reply(200, {});
            await keychains.add({ pub: 'pub', derivedFromParentWithSeed: 'derivedFromParentWithSeed' });
            scope.done();
        });
    });
    /**
     * This section's intention is to provide some key generation sanity checking. generateKeyPair is a general surface
     * for key generation but the keys are treated the same by BitGo down the line. Any SECP256K1 based coins key-pairs can
     * be re-used so need to be the same.
     **/
    describe('Key generation enforcement for SECP256K1', function () {
        // iterate over non-fiat crypto secp coins
        const coinFamilyValues = Object.keys(statics_1.CoinFamily).map((n) => n.toLowerCase());
        const cryptoSecpCoins = statics_1.coins.filter((n) => n.primaryKeyCurve === statics_1.KeyCurve.Secp256k1 &&
            n.kind === statics_1.CoinKind.CRYPTO &&
            n.asset !== statics_1.UnderlyingAsset.USD &&
            n.asset !== statics_1.UnderlyingAsset.AVAXP &&
            n.asset !== statics_1.UnderlyingAsset.DOGE &&
            n.asset !== statics_1.UnderlyingAsset.ETHW &&
            n.asset !== statics_1.UnderlyingAsset.KAVA &&
            n.asset !== statics_1.UnderlyingAsset.COREUM &&
            n.asset !== statics_1.UnderlyingAsset.BERA &&
            n.asset !== statics_1.UnderlyingAsset.ISLM &&
            n.asset !== statics_1.UnderlyingAsset.ARBETH && // TODO(WIN-692): remove this once coin-specific module for arbeth is added
            n.asset !== statics_1.UnderlyingAsset.OPETH && // TODO(WIN-692): remove this once coin-specific module for opeth is added
            n.asset !== statics_1.UnderlyingAsset.ZKETH && // TODO(WIN-1427): remove this once coin-specific module for zketh is added
            n.asset !== statics_1.UnderlyingAsset.OAS && // TODO(WIN-3696): remove this once coin-specific module for oas is added
            n.asset !== statics_1.UnderlyingAsset.COREDAO && // TODO(WIN-3696): remove this once coin-specific module for coredao is added
            n.asset !== statics_1.UnderlyingAsset.FLR && // TODO(WIN-4215): remove this once coin-specific module for FLR is added
            n.asset !== statics_1.UnderlyingAsset.SGB && // TODO(WIN-4216): remove this once coin-specific module for SGB is added
            n.asset !== statics_1.UnderlyingAsset.WEMIX && // TODO(WIN-4177): remove this once coin-specific module for WEMIX is added
            n.asset !== statics_1.UnderlyingAsset.XDC && // TODO(WIN-4173): remove this once coin-specific module for XDC is added
            n.asset !== statics_1.UnderlyingAsset.RUNE &&
            n.asset !== statics_1.UnderlyingAsset.BABY &&
            n.asset !== statics_1.UnderlyingAsset.ICP &&
            n.asset !== statics_1.UnderlyingAsset.MANTRA &&
            n.asset !== statics_1.UnderlyingAsset.MON &&
            n.asset !== statics_1.UnderlyingAsset.WORLD &&
            n.asset !== statics_1.UnderlyingAsset.STT &&
            n.asset !== statics_1.UnderlyingAsset.SONEIUM &&
            n.asset !== statics_1.UnderlyingAsset.VET &&
            n.asset !== statics_1.UnderlyingAsset.CRONOS &&
            n.asset !== statics_1.UnderlyingAsset.FETCH &&
            n.asset !== statics_1.UnderlyingAsset.INIT &&
            coinFamilyValues.includes(n.name));
        const expectedXpub = 'xpub661MyMwAqRbcGpZf8mxNWhSPdWaLGvQzzage6vq2oQFzq8toVzmkjygYZ3HcZw6eCzAfn9ZdyGjKoKkcpKwackdgznVbiunpq7rkxDu7quS';
        const expectedXprv = 'xprv9s21ZrQH143K4LVC2kRN9ZVf5UjqsTh9dMm3JYRRF4j1xLZexTTWCBN4hmdZUHeT3vCJPL181ErVaY489ArBKSWaB7Du7vyVS6XC43WtK7A';
        const seed = Buffer.from('this is some random seed we will use', 'utf-8');
        cryptoSecpCoins.forEach((coin) => {
            it(`should create the same ${coin.name} key with the same seed`, function () {
                const currentCoin = bitgo.coin(coin.name);
                const keyPair = currentCoin.generateKeyPair(seed);
                should.exist(keyPair.pub);
                should.exist(keyPair.prv);
                keyPair.pub.should.equal(expectedXpub);
                keyPair.prv.should.equal(expectedXprv);
            });
        });
    });
    describe('Update Password', function () {
        const oldPassword = 'oldPassword';
        const newPassword = 'newPassword';
        const otherPassword = 'otherPassword';
        describe('should fail', function () {
            let sandbox;
            beforeEach(function () {
                sandbox = sinon.createSandbox();
            });
            afterEach(function () {
                sandbox.restore();
            });
            it('to update the password', async function () {
                await keychains
                    .updatePassword({ newPassword: '5678' })
                    .should.be.rejectedWith('Missing parameter: oldPassword');
                await keychains
                    .updatePassword({ oldPassword: 1234, newPassword: '5678' })
                    .should.be.rejectedWith('Expecting parameter string: oldPassword but found number');
                await keychains
                    .updatePassword({ oldPassword: '1234' })
                    .should.be.rejectedWith('Missing parameter: newPassword');
                await keychains
                    .updatePassword({ oldPassword: '1234', newPassword: 5678 })
                    .should.be.rejectedWith('Expecting parameter string: newPassword but found number');
            });
            it('to update the password for a single keychain', function () {
                (() => keychains.updateSingleKeychainPassword({ newPassword: '5678' })).should.throw('expected old password to be a string');
                (() => keychains.updateSingleKeychainPassword({ oldPassword: 1234, newPassword: '5678' })).should.throw('expected old password to be a string');
                (() => keychains.updateSingleKeychainPassword({ oldPassword: '1234' })).should.throw('expected new password to be a string');
                (() => keychains.updateSingleKeychainPassword({ oldPassword: '1234', newPassword: 5678 })).should.throw('expected new password to be a string');
                (() => keychains.updateSingleKeychainPassword({ oldPassword: '1234', newPassword: '5678' })).should.throw('expected keychain to be an object with an encryptedPrv property');
                (() => keychains.updateSingleKeychainPassword({
                    oldPassword: '1234',
                    newPassword: '5678',
                    keychain: {},
                })).should.throw('expected keychain to be an object with an encryptedPrv property');
                (() => keychains.updateSingleKeychainPassword({
                    oldPassword: '1234',
                    newPassword: '5678',
                    keychain: { encryptedPrv: 123 },
                })).should.throw('expected keychain to be an object with an encryptedPrv property');
                const keychain = { encryptedPrv: bitgo.encrypt({ input: 'xprv1', password: otherPassword }) };
                (() => keychains.updateSingleKeychainPassword({ oldPassword, newPassword, keychain })).should.throw('password used to decrypt keychain private key is incorrect');
            });
            it('on any other error', async function () {
                nock(bgUrl)
                    .get('/api/v2/tltc/key')
                    .query(true)
                    .reply(200, {
                    keys: [
                        {
                            pub: 'xpub1',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv1', password: oldPassword }),
                        },
                    ],
                });
                sandbox.stub(keychains, 'updateSingleKeychainPassword').throws('error', 'some random error');
                await keychains.updatePassword({ oldPassword, newPassword }).should.be.rejectedWith('some random error');
            });
        });
        describe('successful password update', function () {
            const validateKeys = function (keys, newPassword, expectedLength) {
                assert.ok(Object.keys(keys).length === expectedLength, 'should have the expected number of keys');
                _.each(keys, function (value, key) {
                    assert.ok(key.includes('xpub') || key.includes('randomid'), 'key should be xpub or randomid');
                    const decryptedPrv = bitgo.decrypt({ input: value, password: newPassword });
                    decryptedPrv.should.startWith('xprv');
                });
            };
            it('receive only one page when listing keychains', async function () {
                nock(bgUrl)
                    .get('/api/v2/tltc/key')
                    .query(true)
                    .reply(200, {
                    keys: [
                        {
                            pub: 'xpub1',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv1', password: oldPassword }),
                        },
                        {
                            pub: 'xpub2',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv2', password: otherPassword }),
                        },
                        {
                            id: 'randomid1',
                            type: 'tss',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv3', password: oldPassword }),
                        },
                    ],
                });
                const keys = await keychains.updatePassword({ oldPassword: oldPassword, newPassword: newPassword });
                validateKeys(keys, newPassword, 2);
            });
            it('receive multiple pages when listing keychains', async function () {
                const prevId = 'prevId';
                nock(bgUrl)
                    .get('/api/v2/tltc/key')
                    .query(true)
                    .reply(200, {
                    nextBatchPrevId: prevId,
                    keys: [
                        {
                            pub: 'xpub1',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv1', password: oldPassword }),
                        },
                        {
                            pub: 'xpub2',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv2', password: otherPassword }),
                        },
                        {
                            id: 'randomid1',
                            type: 'tss',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv3', password: oldPassword }),
                        },
                    ],
                });
                nock(bgUrl)
                    .get('/api/v2/tltc/key')
                    .query(function queryNextPageMatch(queryObject) {
                    return queryObject.prevId === prevId;
                })
                    .reply(200, {
                    keys: [
                        {
                            pub: 'xpub3',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv3', password: oldPassword }),
                        },
                        {
                            pub: 'xpub4',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv4', password: otherPassword }),
                        },
                    ],
                });
                const keys = await keychains.updatePassword({ oldPassword: oldPassword, newPassword: newPassword });
                validateKeys(keys, newPassword, 3);
            });
            it('single keychain password update', () => {
                const prv = 'xprvtest';
                const keychain = {
                    xpub: 'xpub123',
                    encryptedPrv: bitgo.encrypt({ input: prv, password: oldPassword }),
                };
                const newKeychain = keychains.updateSingleKeychainPassword({ keychain, oldPassword, newPassword });
                const decryptedPrv = bitgo.decrypt({ input: newKeychain.encryptedPrv, password: newPassword });
                decryptedPrv.should.equal(prv);
            });
            it('should return the updated keys with ids', async function () {
                nock(bgUrl)
                    .get('/api/v2/tltc/key')
                    .query(true)
                    .reply(200, {
                    keys: [
                        {
                            id: 'randomid1',
                            type: 'tss',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv1', password: oldPassword }),
                        },
                        {
                            id: 'randomid2',
                            type: 'tss',
                            encryptedPrv: bitgo.encrypt({ input: 'xprv2', password: otherPassword }),
                        },
                    ],
                });
                const keys = await keychains.updatePassword({ oldPassword: oldPassword, newPassword: newPassword });
                validateKeys(keys, newPassword, 1);
            });
        });
        describe('Create TSS Keychains', function () {
            const stubbedKeychainsTriplet = {
                userKeychain: {
                    id: '1',
                    pub: 'userPub',
                },
                backupKeychain: {
                    id: '2',
                    pub: 'userPub',
                },
                bitgoKeychain: {
                    id: '3',
                    pub: 'userPub',
                },
            };
            let sandbox;
            beforeEach(function () {
                sandbox = sinon.createSandbox();
            });
            afterEach(function () {
                sandbox.restore();
            });
            ['tsol', 'tdot', 'tnear'].forEach((coin) => {
                it('should create EDDSA TSS Keychains', async function () {
                    sandbox.stub(sdk_core_1.EDDSAUtils.default.prototype, 'createKeychains').resolves(stubbedKeychainsTriplet);
                    const keychains = await bitgo.coin(coin).keychains().createMpc({
                        multisigType: 'tss',
                        passphrase: 'password',
                        enterprise: 'enterprise',
                        originalPasscodeEncryptionCode: 'originalPasscodeEncryptionCode',
                    });
                    keychains.should.deepEqual(stubbedKeychainsTriplet);
                });
            });
            ['tbsc'].forEach((coin) => {
                it('should create ECDSA TSS Keychains', async function () {
                    nock(bgUrl).get('/api/v2/tss/settings').reply(200, {
                        coinSettings: {},
                    });
                    sandbox.stub(sdk_core_1.ECDSAUtils.EcdsaUtils.prototype, 'createKeychains').resolves(stubbedKeychainsTriplet);
                    const keychains = await bitgo.coin(coin).keychains().createMpc({
                        multisigType: 'tss',
                        passphrase: 'password',
                        enterprise: 'enterprise',
                        originalPasscodeEncryptionCode: 'originalPasscodeEncryptionCode',
                    });
                    keychains.should.deepEqual(stubbedKeychainsTriplet);
                });
            });
        });
        describe('Recreate Keychains from MPCV1 to MPCV2', async function () {
            const coin = 'hteth';
            const walletId = 'walletId';
            const otp = '000000';
            const sandbox = sinon.createSandbox();
            const decryptResult = JSON.stringify({ key: 'decrypted' });
            beforeEach(function () {
                nock(bgUrl)
                    .get('/api/v2/tss/settings')
                    .reply(200, {
                    coinSettings: {
                        eth: {
                            walletCreationSettings: {
                                multiSigTypeVersion: 'MPCv2',
                            },
                        },
                    },
                });
                sandbox.stub(bitgo_1.BitGo.prototype, 'decrypt').returns(decryptResult);
            });
            afterEach(function () {
                sandbox.restore();
                nock.cleanAll();
            });
            it('should fail if empty strings are provided', async function () {
                const params = {
                    coin,
                    walletId,
                    otp,
                    passphrase: 'password',
                    enterprise: 'enterprise',
                    encryptedMaterial: {
                        encryptedUserKey: 'encrypted',
                        encryptedBackupKey: 'encrypted',
                        encryptedWalletPassphrase: 'passphrase',
                    },
                };
                await keychains.recreateMpc({ ...params, coin: '' }).should.be.rejectedWith('missing required param coin');
                await keychains
                    .recreateMpc({ ...params, walletId: '' })
                    .should.be.rejectedWith('missing required param walletId');
                await keychains.recreateMpc({ ...params, otp: '' }).should.be.rejectedWith('missing required param otp');
                await keychains
                    .recreateMpc({ ...params, passphrase: '' })
                    .should.be.rejectedWith('missing required param passphrase');
                await keychains
                    .recreateMpc({
                    ...params,
                    encryptedMaterial: {
                        ...params.encryptedMaterial,
                        encryptedWalletPassphrase: '',
                    },
                })
                    .should.be.rejectedWith('missing required param encryptedWalletPassphrase');
                await keychains
                    .recreateMpc({
                    ...params,
                    encryptedMaterial: {
                        ...params.encryptedMaterial,
                        encryptedUserKey: '',
                    },
                })
                    .should.be.rejectedWith('missing required param encryptedUserKey');
                await keychains
                    .recreateMpc({
                    ...params,
                    encryptedMaterial: {
                        ...params.encryptedMaterial,
                        encryptedBackupKey: '',
                    },
                })
                    .should.be.rejectedWith('missing required param encryptedBackupKey');
            });
            it('should fail if otp unlock fails', async function () {
                nock(bgUrl).post('/api/v1/user/unlock').replyWithError('otp error');
                const params = {
                    coin,
                    walletId,
                    otp,
                    passphrase: 'password',
                    encryptedMaterial: {
                        encryptedUserKey: 'encryptedUserKey',
                        encryptedBackupKey: 'encryptedBackupKey',
                        encryptedWalletPassphrase: 'encryptedWalletPassphrase',
                    },
                };
                await keychains.recreateMpc(params).should.be.rejectedWith('otp error');
            });
            it('should fail if passcode recovery api call fails', async function () {
                nock(bgUrl).post('/api/v1/user/unlock').reply(200, { otp });
                nock(bgUrl)
                    .post(`/api/v2/${coin}/wallet/${walletId}/passcoderecovery`)
                    .replyWithError('passcode recovery error');
                const params = {
                    coin,
                    walletId,
                    otp,
                    passphrase: 'password',
                    encryptedMaterial: {
                        encryptedUserKey: 'encryptedUserKey',
                        encryptedBackupKey: 'encryptedBackupKey',
                        encryptedWalletPassphrase: 'encryptedWalletPassphrase',
                    },
                };
                await keychains.recreateMpc(params).should.be.rejectedWith('passcode recovery error');
            });
            it('should fail if passcode recovery api call returns invalid recovery info', async function () {
                nock(bgUrl).post('/api/v1/user/unlock').reply(200, { otp });
                nock(bgUrl).post(`/api/v2/${coin}/wallet/${walletId}/passcoderecovery`).reply(200, { recoveryInfo: {} });
                const params = {
                    coin,
                    walletId,
                    otp,
                    passphrase: 'password',
                    encryptedMaterial: {
                        encryptedUserKey: 'encryptedUserKey',
                        encryptedBackupKey: 'encryptedBackupKey',
                        encryptedWalletPassphrase: 'encryptedWalletPassphrase',
                    },
                };
                await keychains.recreateMpc(params).should.be.rejectedWith('failed to get recovery info');
            });
            it('should call createMpc with the correct parameters', async function () {
                nock(bgUrl).post('/api/v1/user/unlock').reply(200, { otp });
                nock(bgUrl)
                    .post(`/api/v2/${coin}/wallet/${walletId}/passcoderecovery`)
                    .reply(200, { recoveryInfo: { passcodeEncryptionCode: '123' } });
                const params = {
                    coin,
                    walletId: 'walletId',
                    otp,
                    passphrase: 'password',
                    enterprise: 'enterprise',
                    originalPasscodeEncryptionCode: 'originalPasscodeEncryptionCode',
                    encryptedMaterial: {
                        encryptedUserKey: 'encryptedUserKey',
                        encryptedBackupKey: 'encryptedBackupKey',
                        encryptedWalletPassphrase: 'encryptedWalletPassphrase',
                    },
                };
                const createMpcStub = sinon.stub(keychains, 'createMpc').resolves();
                await keychains.recreateMpc(params);
                assert.ok(createMpcStub.calledOnceWith({
                    ...params,
                    multisigType: 'tss',
                    retrofit: {
                        decryptedUserKey: decryptResult,
                        decryptedBackupKey: decryptResult,
                        walletId: params.walletId,
                    },
                }));
            });
        });
        after(function afterUpdatePassword() {
            nock.pendingMocks().should.be.empty();
        });
    });
    describe('Create BitGo Key from OVC JSON', function () {
        it('Parses the OVC JSON file properly and creates the next input for OVC', async function () {
            const bitGoKeyResult = {
                id: '6421eb755fea9e0006c2c040072f74bb',
                commonKeychain: '123',
                walletHSMGPGPublicKeySigs: '123',
                verifiedVssProof: true,
                keyShares: [
                    {
                        from: 'bitgo',
                        to: 'user',
                        publicShare: 'ccc',
                        privateShare: 'ccc private',
                        paillierPublicKey: 'ccc paillier',
                        vssProof: 'ccc vss proof',
                    },
                    {
                        from: 'bitgo',
                        to: 'backup',
                        publicShare: 'fff',
                        privateShare: 'fff private',
                        paillierPublicKey: 'fff paillier',
                        vssProof: 'fff vss proof',
                    },
                ],
            };
            nock(bgUrl)
                .post('/api/v2/tsol/key', _.matches({ source: 'bitgo', keyType: 'tss' }))
                .reply(200, bitGoKeyResult);
            const ovcOutputJson = {
                tssVersion: '0.0.1',
                walletType: 'tss',
                coin: 'sol',
                state: 1,
                ovc: {
                    1: {
                        gpgPubKey: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsq9RMFK4EEAAoCAwRgDpgm1bptRT5yLOMadcGAHuvkxISL8/3xPy/D\nYA+1NgBqIFK/3OOXxp73Tv86bt1dgH7OD1ACO0mVXAoX5EaVzWZvdmMtMS11\nc2VyLWRmMjQwOWY0NWNhMTZmNTU3OGNkMzAxMyA8b3ZjLTEtdXNlci1kZjI0\nMDlmNDVjYTE2ZjU1NzhjZDMwMTNAZGYyNDA5ZjQ1Y2ExNmY1NTc4Y2QzMDEz\nLmNvbT7CjAQQEwgAHQUCZBsq9QQLCQcIAxUICgQWAAIBAhkBAhsDAh4BACEJ\nEOUeC7QrGL+2FiEEjN6vPUFRweVtDKFZ5R4LtCsYv7Z7oAEAvNKaJrTIs3ky\nbxjkUicsuxOyA2oWGarJH6TGlWF6WD8A/3EIeZzPKSLaW+3enpbCPiU8RVDp\nC6yo6NMAqKp4XlyQzlMEZBsq9RIFK4EEAAoCAwQWlWPNMpk3afEzfgG0xFg4\nCEjY7fGO35n47nZ4qxjEXz2XN4I23xFMiwZbXbptDXlqm7W9ZAHKi892h+Yt\nU4B6AwEIB8J4BBgTCAAJBQJkGyr1AhsMACEJEOUeC7QrGL+2FiEEjN6vPUFR\nweVtDKFZ5R4LtCsYv7YqZwD8DLRuneB0HEzBCyrE4YL+UHaofoHQX1+nRh0j\n82qaDzAA/i3U1SoEIi32YMrorNG50vb4vaEPbbYmfglb+JQ1Yx7o\n=vjgl\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        ovcToBitgoShare: {
                            publicShare: '07bfbb052a1f4b106b315bd5a9d6a71604653289f861320d9801881e952f8550753c89511a360e3b599d9f239a8d36a4956437ed0b152180e22cb94fb08fdc81',
                            privateShare: '-----BEGIN PGP MESSAGE-----\n\nwX4DUQ8XhGVGcTISAgMEd/wQ/AhwIRsSf/6iHwmHKvEYAwfaLtTQotS6BwZm\naX00T7LumGIrNZzBgcggBKMl+8Omom8mX5sP8FUE451iZjBmXlkpHlpAqskS\nEi5SfjlsT31utoLaBLA7NjNSmyYHIiyfh6YnwfV5U72k6hhfpuDSsQGy8Yxp\nM2dVlN4uoO31zgQPf+fgJkZvAPwvjYLBL4O8hs21HGf0VvG99brk4xlFVRhw\nQnuPpM51GOs4vUtbLNSYnAuhU4ReXwwDV9Xu0MXAjfQMk2E3wQLGQ+82uv2B\n1hPD9nDHTtAdWrXd6ZjXFrG4Mf2MQBxySFvVSnFi6yStjfZeiKcD5Vg38PjG\nWg1O5N3/paq98HfH0Q4qNKGZljwo3oEQZzlYm2kVnI0PULoMYg==\n=ovAx\n-----END PGP MESSAGE-----\n',
                            vssProof: 'be8198c2cef94cb381aa8aa9277a0a46ba5a54b0ac9930034b4af66b1b805234',
                            i: 3,
                            j: 1,
                            uSig: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsq9RMFK4EEAAoCAwRgDpgm1bptRT5yLOMadcGAHuvkxISL8/3xPy/D\nYA+1NgBqIFK/3OOXxp73Tv86bt1dgH7OD1ACO0mVXAoX5EaVzWZvdmMtMS11\nc2VyLWRmMjQwOWY0NWNhMTZmNTU3OGNkMzAxMyA8b3ZjLTEtdXNlci1kZjI0\nMDlmNDVjYTE2ZjU1NzhjZDMwMTNAZGYyNDA5ZjQ1Y2ExNmY1NTc4Y2QzMDEz\nLmNvbT7CjAQQEwgAHQUCZBsq9QQLCQcIAxUICgQWAAIBAhkBAhsDAh4BACEJ\nEOUeC7QrGL+2FiEEjN6vPUFRweVtDKFZ5R4LtCsYv7Z7oAEAvNKaJrTIs3ky\nbxjkUicsuxOyA2oWGarJH6TGlWF6WD8A/3EIeZzPKSLaW+3enpbCPiU8RVDp\nC6yo6NMAqKp4XlyQzlMEZBsq9RIFK4EEAAoCAwQWlWPNMpk3afEzfgG0xFg4\nCEjY7fGO35n47nZ4qxjEXz2XN4I23xFMiwZbXbptDXlqm7W9ZAHKi892h+Yt\nU4B6AwEIB8J4BBgTCAAJBQJkGyr1AhsMACEJEOUeC7QrGL+2FiEEjN6vPUFR\nweVtDKFZ5R4LtCsYv7YqZwD8DLRuneB0HEzBCyrE4YL+UHaofoHQX1+nRh0j\n82qaDzAA/i3U1SoEIi32YMrorNG50vb4vaEPbbYmfglb+JQ1Yx7ozjMEZBsq\n9RYJKwYBBAHaRw8BAQdAS1534LdCC60ASpEgnEBC8pWPSOWWBLXyWaBhEOW2\n/ijCeAQYEwgACQUCZBsq9QIbIAAhCRDlHgu0Kxi/thYhBIzerz1BUcHlbQyh\nWeUeC7QrGL+2FUYA/AgMU4V7C7I/5HwK73mctaGXNdfVr/muRMNOGW/CAxVL\nAP9KaBr95o32oEN5eo7tWFByoOCCk9JMjs36Cq7o+sR31A==\n=eZ3B\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        },
                    },
                    2: {
                        gpgPubKey: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsrNBMFK4EEAAoCAwT2xXv/mG/daPdKGD/fHIUEE2ZtcK+njtCZtMEr\nkIubmUwe3Dj8+hQxt3SKaTxQbuD+WaLSj986QYUr4Zw4T+W3zWpvdmMtMi1i\nYWNrdXAtNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4IDxvdmMtMi1iYWNrdXAt\nNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4QDU0N2JiZGYzMDhjMWU2MWNkOWRi\nODZlOC5jb20+wowEEBMIAB0FAmQbKzQECwkHCAMVCAoEFgACAQIZAQIbAwIe\nAQAhCRC2Ak5G2Sk7ZRYhBLTpSkFOe3ajbqouerYCTkbZKTtlxtYBALLIBnAa\n4AS77XvXmmznNCWO/HNuDPD2ugRqVhqU4SxmAQDma14APuMNSVyi17xomZjW\n0nimtaMIBjc0A4MXE6G4Xc5TBGQbKzQSBSuBBAAKAgMEUHoQDY98y8CAVouu\ny4y3Q2QnBpnUBK/0PELV7VANXd9lY7CShyogJScgPliUm97Au9FC17vqZa1B\n5bBMJAdXVwMBCAfCeAQYEwgACQUCZBsrNAIbDAAhCRC2Ak5G2Sk7ZRYhBLTp\nSkFOe3ajbqouerYCTkbZKTtlR5wA/3zOFTSeXXRRemXl3hY10spxabE4O2J8\nZD2VRfjbDpZjAQDWg1W+jPbM2Htikd1N01V+zweNDhJEH65r0Qr8BlXh2w==\n=Ettu\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        ovcToBitgoShare: {
                            publicShare: 'ecf95e9ba6f02c0bc4c2ab254565d21a1562059c8a1ab70d286fa04ae2c511e0491410b6d6fa8ab22e691bed7938a7adaabfa8d9d59aab9cc2c078cd37dde01b',
                            privateShare: '-----BEGIN PGP MESSAGE-----\n\nwX4DUQ8XhGVGcTISAgMEe1nYNv9DnHl8HX8jNs3reGs5nPT2bNzGMCFL0N3P\nKLwGd8DBkDJIMpoClaAS/HTUTPTRzj4U1GShV79I+bbfTDBV6uhyfZ7a88dV\nRDTXl6rchFl/fmwLoXnqH+BDPEXytpAvKwDrAg55T/H7aop5QbfSsQErEv7X\nTpTLHHHflEEQL62p1Rnnq2kKvwJK7TY1g5RtPgYXH6GEs33DLulPeUs8UkKq\nTPLf2+1KCLYyzMwmSi8KEC8HJb0vAkXZAlZ1+DoZ2PfiIJcVnz7a3omjiP77\nhmC8phTcJ718UxIB09f8uic0/fM7FNu0JHFgRDA69zzeFYnZc2XNQg5hs/dZ\nZ8AitP4rnaAfprsq4rAEE/c3Trm9tzQHZPCqr/2s4LluyUMVJw==\n=IJZH\n-----END PGP MESSAGE-----\n',
                            vssProof: '309d2fef2272ad31375954b99a862742f22d8023eef9855b8ae26ea84e08bf5e',
                            i: 3,
                            j: 2,
                            uSig: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsrNBMFK4EEAAoCAwT2xXv/mG/daPdKGD/fHIUEE2ZtcK+njtCZtMEr\nkIubmUwe3Dj8+hQxt3SKaTxQbuD+WaLSj986QYUr4Zw4T+W3zWpvdmMtMi1i\nYWNrdXAtNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4IDxvdmMtMi1iYWNrdXAt\nNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4QDU0N2JiZGYzMDhjMWU2MWNkOWRi\nODZlOC5jb20+wowEEBMIAB0FAmQbKzQECwkHCAMVCAoEFgACAQIZAQIbAwIe\nAQAhCRC2Ak5G2Sk7ZRYhBLTpSkFOe3ajbqouerYCTkbZKTtlxtYBALLIBnAa\n4AS77XvXmmznNCWO/HNuDPD2ugRqVhqU4SxmAQDma14APuMNSVyi17xomZjW\n0nimtaMIBjc0A4MXE6G4Xc5TBGQbKzQSBSuBBAAKAgMEUHoQDY98y8CAVouu\ny4y3Q2QnBpnUBK/0PELV7VANXd9lY7CShyogJScgPliUm97Au9FC17vqZa1B\n5bBMJAdXVwMBCAfCeAQYEwgACQUCZBsrNAIbDAAhCRC2Ak5G2Sk7ZRYhBLTp\nSkFOe3ajbqouerYCTkbZKTtlR5wA/3zOFTSeXXRRemXl3hY10spxabE4O2J8\nZD2VRfjbDpZjAQDWg1W+jPbM2Htikd1N01V+zweNDhJEH65r0Qr8BlXh284z\nBGQbKzQWCSsGAQQB2kcPAQEHQIVTmlt8a/fjJCY9UyP8J51eTPX9PMRF3/Hr\nBYwtfOZYwngEGBMIAAkFAmQbKzQCGyAAIQkQtgJORtkpO2UWIQS06UpBTnt2\no26qLnq2Ak5G2Sk7ZcthAQD4ek3aqUDEbhfRHolm4jFhIPIbb9hUJwuBR0R4\n+gvaeAEAk8uk5cEACeqmpdEF52oGx7jmGCoX73AIILYVcf9iMkI=\n=92Hf\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        },
                        ovcToOvcShare: {
                            publicShare: 'ecf95e9ba6f02c0bc4c2ab254565d21a1562059c8a1ab70d286fa04ae2c511e0491410b6d6fa8ab22e691bed7938a7adaabfa8d9d59aab9cc2c078cd37dde01b',
                            privateShare: '-----BEGIN PGP MESSAGE-----\n\nwX4D+F3vI962zVMSAgMENy2X9xDIOm1gwOfMdL/1vZjeMW/ile/f2dRIP2GV\nv4w60K92+mHI9yooU1VT77jZrVOcNK41DFNCF/fuoUU+VzBON0I1hHyXm2QJ\nwL+nNdvAXwRv7nSFD3ABUmRYdG71AFIWjW2L+1C2hxpsNlmdxffSsQHHT9uP\nBNpFYgQN77OUxcgrweSVrPyer1rCQ8o+QnoK2/hIx9PlJZkcl3uwF6TpBtjs\nqvRxThomoHyo0hJHG0vmI42Gq5u0tcSeU902efpCDaeJhPVOiqISoJ96wn0r\nFB3lYLSflOpCLAE7nsZJRoXA6akU7xMCMNA++d4tv6p98FQ+MZ6e9x6kiSw1\nM+VWj+PvN1dtQ8fNYwpJf7KBfD1w6ISMFDmewkDE7iBOXF6FLw==\n=+3Yc\n-----END PGP MESSAGE-----\n',
                            vssProof: '309d2fef2272ad31375954b99a862742f22d8023eef9855b8ae26ea84e08bf5e',
                            i: 1,
                            j: 2,
                            uSig: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsrNBMFK4EEAAoCAwT2xXv/mG/daPdKGD/fHIUEE2ZtcK+njtCZtMEr\nkIubmUwe3Dj8+hQxt3SKaTxQbuD+WaLSj986QYUr4Zw4T+W3zWpvdmMtMi1i\nYWNrdXAtNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4IDxvdmMtMi1iYWNrdXAt\nNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4QDU0N2JiZGYzMDhjMWU2MWNkOWRi\nODZlOC5jb20+wowEEBMIAB0FAmQbKzQECwkHCAMVCAoEFgACAQIZAQIbAwIe\nAQAhCRC2Ak5G2Sk7ZRYhBLTpSkFOe3ajbqouerYCTkbZKTtlxtYBALLIBnAa\n4AS77XvXmmznNCWO/HNuDPD2ugRqVhqU4SxmAQDma14APuMNSVyi17xomZjW\n0nimtaMIBjc0A4MXE6G4Xc5TBGQbKzQSBSuBBAAKAgMEUHoQDY98y8CAVouu\ny4y3Q2QnBpnUBK/0PELV7VANXd9lY7CShyogJScgPliUm97Au9FC17vqZa1B\n5bBMJAdXVwMBCAfCeAQYEwgACQUCZBsrNAIbDAAhCRC2Ak5G2Sk7ZRYhBLTp\nSkFOe3ajbqouerYCTkbZKTtlR5wA/3zOFTSeXXRRemXl3hY10spxabE4O2J8\nZD2VRfjbDpZjAQDWg1W+jPbM2Htikd1N01V+zweNDhJEH65r0Qr8BlXh284z\nBGQbKzQWCSsGAQQB2kcPAQEHQNVGg0vPsfK1yJjFuDYB8Tj7CQRHKGAVEDcj\nh/QIqr0KwngEGBMIAAkFAmQbKzQCGyAAIQkQtgJORtkpO2UWIQS06UpBTnt2\no26qLnq2Ak5G2Sk7ZS9oAQCe2zJD5ItW2GEgAitnY+NrLBjbXI6+LY29GjRa\nf6yFTQD/cP0E1DleqXMjgfR+ewt6quVFMZebhr3tBr/H0Zv/9EA=\n=8ai+\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        },
                    },
                },
            };
            const expectedBitGoOutput = {
                wallet: {
                    ...ovcOutputJson,
                    state: 2,
                    platform: {
                        commonKeychain: bitGoKeyResult.commonKeychain,
                        walletGpgPubKeySigs: bitGoKeyResult.walletHSMGPGPublicKeySigs,
                        ovc: {
                            1: {
                                bitgoToOvcShare: {
                                    i: 1,
                                    j: 3,
                                    publicShare: bitGoKeyResult.keyShares[0].publicShare,
                                    privateShare: bitGoKeyResult.keyShares[0].privateShare,
                                    paillierPublicKey: bitGoKeyResult.keyShares[0].paillierPublicKey,
                                    vssProof: bitGoKeyResult.keyShares[0].vssProof,
                                },
                            },
                            2: {
                                bitgoToOvcShare: {
                                    i: 2,
                                    j: 3,
                                    publicShare: bitGoKeyResult.keyShares[1].publicShare,
                                    privateShare: bitGoKeyResult.keyShares[1].privateShare,
                                    paillierPublicKey: bitGoKeyResult.keyShares[1].paillierPublicKey,
                                    vssProof: bitGoKeyResult.keyShares[1].vssProof,
                                },
                            },
                        },
                    },
                },
            };
            const platformOutput = await bitgo.coin('tsol').keychains().createTssBitGoKeyFromOvcShares(ovcOutputJson);
            should.equal(platformOutput.bitGoKeyId, bitGoKeyResult.id);
            should.deepEqual(platformOutput.bitGoOutputJsonForOvc, expectedBitGoOutput);
        });
        it('Should fail if the state is not 1', async function () {
            const ovcOutputJson = {
                tssVersion: '0.0.1',
                walletType: 'tss',
                coin: 'sol',
                state: 0,
                ovc: {
                    1: {
                        gpgPubKey: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsq9RMFK4EEAAoCAwRgDpgm1bptRT5yLOMadcGAHuvkxISL8/3xPy/D\nYA+1NgBqIFK/3OOXxp73Tv86bt1dgH7OD1ACO0mVXAoX5EaVzWZvdmMtMS11\nc2VyLWRmMjQwOWY0NWNhMTZmNTU3OGNkMzAxMyA8b3ZjLTEtdXNlci1kZjI0\nMDlmNDVjYTE2ZjU1NzhjZDMwMTNAZGYyNDA5ZjQ1Y2ExNmY1NTc4Y2QzMDEz\nLmNvbT7CjAQQEwgAHQUCZBsq9QQLCQcIAxUICgQWAAIBAhkBAhsDAh4BACEJ\nEOUeC7QrGL+2FiEEjN6vPUFRweVtDKFZ5R4LtCsYv7Z7oAEAvNKaJrTIs3ky\nbxjkUicsuxOyA2oWGarJH6TGlWF6WD8A/3EIeZzPKSLaW+3enpbCPiU8RVDp\nC6yo6NMAqKp4XlyQzlMEZBsq9RIFK4EEAAoCAwQWlWPNMpk3afEzfgG0xFg4\nCEjY7fGO35n47nZ4qxjEXz2XN4I23xFMiwZbXbptDXlqm7W9ZAHKi892h+Yt\nU4B6AwEIB8J4BBgTCAAJBQJkGyr1AhsMACEJEOUeC7QrGL+2FiEEjN6vPUFR\nweVtDKFZ5R4LtCsYv7YqZwD8DLRuneB0HEzBCyrE4YL+UHaofoHQX1+nRh0j\n82qaDzAA/i3U1SoEIi32YMrorNG50vb4vaEPbbYmfglb+JQ1Yx7o\n=vjgl\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        ovcToBitgoShare: {
                            publicShare: '07bfbb052a1f4b106b315bd5a9d6a71604653289f861320d9801881e952f8550753c89511a360e3b599d9f239a8d36a4956437ed0b152180e22cb94fb08fdc81',
                            privateShare: '-----BEGIN PGP MESSAGE-----\n\nwX4DUQ8XhGVGcTISAgMEd/wQ/AhwIRsSf/6iHwmHKvEYAwfaLtTQotS6BwZm\naX00T7LumGIrNZzBgcggBKMl+8Omom8mX5sP8FUE451iZjBmXlkpHlpAqskS\nEi5SfjlsT31utoLaBLA7NjNSmyYHIiyfh6YnwfV5U72k6hhfpuDSsQGy8Yxp\nM2dVlN4uoO31zgQPf+fgJkZvAPwvjYLBL4O8hs21HGf0VvG99brk4xlFVRhw\nQnuPpM51GOs4vUtbLNSYnAuhU4ReXwwDV9Xu0MXAjfQMk2E3wQLGQ+82uv2B\n1hPD9nDHTtAdWrXd6ZjXFrG4Mf2MQBxySFvVSnFi6yStjfZeiKcD5Vg38PjG\nWg1O5N3/paq98HfH0Q4qNKGZljwo3oEQZzlYm2kVnI0PULoMYg==\n=ovAx\n-----END PGP MESSAGE-----\n',
                            vssProof: 'be8198c2cef94cb381aa8aa9277a0a46ba5a54b0ac9930034b4af66b1b805234',
                            i: 3,
                            j: 1,
                            uSig: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsq9RMFK4EEAAoCAwRgDpgm1bptRT5yLOMadcGAHuvkxISL8/3xPy/D\nYA+1NgBqIFK/3OOXxp73Tv86bt1dgH7OD1ACO0mVXAoX5EaVzWZvdmMtMS11\nc2VyLWRmMjQwOWY0NWNhMTZmNTU3OGNkMzAxMyA8b3ZjLTEtdXNlci1kZjI0\nMDlmNDVjYTE2ZjU1NzhjZDMwMTNAZGYyNDA5ZjQ1Y2ExNmY1NTc4Y2QzMDEz\nLmNvbT7CjAQQEwgAHQUCZBsq9QQLCQcIAxUICgQWAAIBAhkBAhsDAh4BACEJ\nEOUeC7QrGL+2FiEEjN6vPUFRweVtDKFZ5R4LtCsYv7Z7oAEAvNKaJrTIs3ky\nbxjkUicsuxOyA2oWGarJH6TGlWF6WD8A/3EIeZzPKSLaW+3enpbCPiU8RVDp\nC6yo6NMAqKp4XlyQzlMEZBsq9RIFK4EEAAoCAwQWlWPNMpk3afEzfgG0xFg4\nCEjY7fGO35n47nZ4qxjEXz2XN4I23xFMiwZbXbptDXlqm7W9ZAHKi892h+Yt\nU4B6AwEIB8J4BBgTCAAJBQJkGyr1AhsMACEJEOUeC7QrGL+2FiEEjN6vPUFR\nweVtDKFZ5R4LtCsYv7YqZwD8DLRuneB0HEzBCyrE4YL+UHaofoHQX1+nRh0j\n82qaDzAA/i3U1SoEIi32YMrorNG50vb4vaEPbbYmfglb+JQ1Yx7ozjMEZBsq\n9RYJKwYBBAHaRw8BAQdAS1534LdCC60ASpEgnEBC8pWPSOWWBLXyWaBhEOW2\n/ijCeAQYEwgACQUCZBsq9QIbIAAhCRDlHgu0Kxi/thYhBIzerz1BUcHlbQyh\nWeUeC7QrGL+2FUYA/AgMU4V7C7I/5HwK73mctaGXNdfVr/muRMNOGW/CAxVL\nAP9KaBr95o32oEN5eo7tWFByoOCCk9JMjs36Cq7o+sR31A==\n=eZ3B\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        },
                    },
                    2: {
                        gpgPubKey: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsrNBMFK4EEAAoCAwT2xXv/mG/daPdKGD/fHIUEE2ZtcK+njtCZtMEr\nkIubmUwe3Dj8+hQxt3SKaTxQbuD+WaLSj986QYUr4Zw4T+W3zWpvdmMtMi1i\nYWNrdXAtNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4IDxvdmMtMi1iYWNrdXAt\nNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4QDU0N2JiZGYzMDhjMWU2MWNkOWRi\nODZlOC5jb20+wowEEBMIAB0FAmQbKzQECwkHCAMVCAoEFgACAQIZAQIbAwIe\nAQAhCRC2Ak5G2Sk7ZRYhBLTpSkFOe3ajbqouerYCTkbZKTtlxtYBALLIBnAa\n4AS77XvXmmznNCWO/HNuDPD2ugRqVhqU4SxmAQDma14APuMNSVyi17xomZjW\n0nimtaMIBjc0A4MXE6G4Xc5TBGQbKzQSBSuBBAAKAgMEUHoQDY98y8CAVouu\ny4y3Q2QnBpnUBK/0PELV7VANXd9lY7CShyogJScgPliUm97Au9FC17vqZa1B\n5bBMJAdXVwMBCAfCeAQYEwgACQUCZBsrNAIbDAAhCRC2Ak5G2Sk7ZRYhBLTp\nSkFOe3ajbqouerYCTkbZKTtlR5wA/3zOFTSeXXRRemXl3hY10spxabE4O2J8\nZD2VRfjbDpZjAQDWg1W+jPbM2Htikd1N01V+zweNDhJEH65r0Qr8BlXh2w==\n=Ettu\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        ovcToBitgoShare: {
                            publicShare: 'ecf95e9ba6f02c0bc4c2ab254565d21a1562059c8a1ab70d286fa04ae2c511e0491410b6d6fa8ab22e691bed7938a7adaabfa8d9d59aab9cc2c078cd37dde01b',
                            privateShare: '-----BEGIN PGP MESSAGE-----\n\nwX4DUQ8XhGVGcTISAgMEe1nYNv9DnHl8HX8jNs3reGs5nPT2bNzGMCFL0N3P\nKLwGd8DBkDJIMpoClaAS/HTUTPTRzj4U1GShV79I+bbfTDBV6uhyfZ7a88dV\nRDTXl6rchFl/fmwLoXnqH+BDPEXytpAvKwDrAg55T/H7aop5QbfSsQErEv7X\nTpTLHHHflEEQL62p1Rnnq2kKvwJK7TY1g5RtPgYXH6GEs33DLulPeUs8UkKq\nTPLf2+1KCLYyzMwmSi8KEC8HJb0vAkXZAlZ1+DoZ2PfiIJcVnz7a3omjiP77\nhmC8phTcJ718UxIB09f8uic0/fM7FNu0JHFgRDA69zzeFYnZc2XNQg5hs/dZ\nZ8AitP4rnaAfprsq4rAEE/c3Trm9tzQHZPCqr/2s4LluyUMVJw==\n=IJZH\n-----END PGP MESSAGE-----\n',
                            vssProof: '309d2fef2272ad31375954b99a862742f22d8023eef9855b8ae26ea84e08bf5e',
                            i: 3,
                            j: 2,
                            uSig: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsrNBMFK4EEAAoCAwT2xXv/mG/daPdKGD/fHIUEE2ZtcK+njtCZtMEr\nkIubmUwe3Dj8+hQxt3SKaTxQbuD+WaLSj986QYUr4Zw4T+W3zWpvdmMtMi1i\nYWNrdXAtNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4IDxvdmMtMi1iYWNrdXAt\nNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4QDU0N2JiZGYzMDhjMWU2MWNkOWRi\nODZlOC5jb20+wowEEBMIAB0FAmQbKzQECwkHCAMVCAoEFgACAQIZAQIbAwIe\nAQAhCRC2Ak5G2Sk7ZRYhBLTpSkFOe3ajbqouerYCTkbZKTtlxtYBALLIBnAa\n4AS77XvXmmznNCWO/HNuDPD2ugRqVhqU4SxmAQDma14APuMNSVyi17xomZjW\n0nimtaMIBjc0A4MXE6G4Xc5TBGQbKzQSBSuBBAAKAgMEUHoQDY98y8CAVouu\ny4y3Q2QnBpnUBK/0PELV7VANXd9lY7CShyogJScgPliUm97Au9FC17vqZa1B\n5bBMJAdXVwMBCAfCeAQYEwgACQUCZBsrNAIbDAAhCRC2Ak5G2Sk7ZRYhBLTp\nSkFOe3ajbqouerYCTkbZKTtlR5wA/3zOFTSeXXRRemXl3hY10spxabE4O2J8\nZD2VRfjbDpZjAQDWg1W+jPbM2Htikd1N01V+zweNDhJEH65r0Qr8BlXh284z\nBGQbKzQWCSsGAQQB2kcPAQEHQIVTmlt8a/fjJCY9UyP8J51eTPX9PMRF3/Hr\nBYwtfOZYwngEGBMIAAkFAmQbKzQCGyAAIQkQtgJORtkpO2UWIQS06UpBTnt2\no26qLnq2Ak5G2Sk7ZcthAQD4ek3aqUDEbhfRHolm4jFhIPIbb9hUJwuBR0R4\n+gvaeAEAk8uk5cEACeqmpdEF52oGx7jmGCoX73AIILYVcf9iMkI=\n=92Hf\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        },
                        ovcToOvcShare: {
                            publicShare: 'ecf95e9ba6f02c0bc4c2ab254565d21a1562059c8a1ab70d286fa04ae2c511e0491410b6d6fa8ab22e691bed7938a7adaabfa8d9d59aab9cc2c078cd37dde01b',
                            privateShare: '-----BEGIN PGP MESSAGE-----\n\nwX4D+F3vI962zVMSAgMENy2X9xDIOm1gwOfMdL/1vZjeMW/ile/f2dRIP2GV\nv4w60K92+mHI9yooU1VT77jZrVOcNK41DFNCF/fuoUU+VzBON0I1hHyXm2QJ\nwL+nNdvAXwRv7nSFD3ABUmRYdG71AFIWjW2L+1C2hxpsNlmdxffSsQHHT9uP\nBNpFYgQN77OUxcgrweSVrPyer1rCQ8o+QnoK2/hIx9PlJZkcl3uwF6TpBtjs\nqvRxThomoHyo0hJHG0vmI42Gq5u0tcSeU902efpCDaeJhPVOiqISoJ96wn0r\nFB3lYLSflOpCLAE7nsZJRoXA6akU7xMCMNA++d4tv6p98FQ+MZ6e9x6kiSw1\nM+VWj+PvN1dtQ8fNYwpJf7KBfD1w6ISMFDmewkDE7iBOXF6FLw==\n=+3Yc\n-----END PGP MESSAGE-----\n',
                            vssProof: '309d2fef2272ad31375954b99a862742f22d8023eef9855b8ae26ea84e08bf5e',
                            i: 1,
                            j: 2,
                            uSig: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsrNBMFK4EEAAoCAwT2xXv/mG/daPdKGD/fHIUEE2ZtcK+njtCZtMEr\nkIubmUwe3Dj8+hQxt3SKaTxQbuD+WaLSj986QYUr4Zw4T+W3zWpvdmMtMi1i\nYWNrdXAtNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4IDxvdmMtMi1iYWNrdXAt\nNTQ3YmJkZjMwOGMxZTYxY2Q5ZGI4NmU4QDU0N2JiZGYzMDhjMWU2MWNkOWRi\nODZlOC5jb20+wowEEBMIAB0FAmQbKzQECwkHCAMVCAoEFgACAQIZAQIbAwIe\nAQAhCRC2Ak5G2Sk7ZRYhBLTpSkFOe3ajbqouerYCTkbZKTtlxtYBALLIBnAa\n4AS77XvXmmznNCWO/HNuDPD2ugRqVhqU4SxmAQDma14APuMNSVyi17xomZjW\n0nimtaMIBjc0A4MXE6G4Xc5TBGQbKzQSBSuBBAAKAgMEUHoQDY98y8CAVouu\ny4y3Q2QnBpnUBK/0PELV7VANXd9lY7CShyogJScgPliUm97Au9FC17vqZa1B\n5bBMJAdXVwMBCAfCeAQYEwgACQUCZBsrNAIbDAAhCRC2Ak5G2Sk7ZRYhBLTp\nSkFOe3ajbqouerYCTkbZKTtlR5wA/3zOFTSeXXRRemXl3hY10spxabE4O2J8\nZD2VRfjbDpZjAQDWg1W+jPbM2Htikd1N01V+zweNDhJEH65r0Qr8BlXh284z\nBGQbKzQWCSsGAQQB2kcPAQEHQNVGg0vPsfK1yJjFuDYB8Tj7CQRHKGAVEDcj\nh/QIqr0KwngEGBMIAAkFAmQbKzQCGyAAIQkQtgJORtkpO2UWIQS06UpBTnt2\no26qLnq2Ak5G2Sk7ZS9oAQCe2zJD5ItW2GEgAitnY+NrLBjbXI6+LY29GjRa\nf6yFTQD/cP0E1DleqXMjgfR+ewt6quVFMZebhr3tBr/H0Zv/9EA=\n=8ai+\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        },
                    },
                },
            };
            await bitgo
                .coin('tsol')
                .keychains()
                .createTssBitGoKeyFromOvcShares(ovcOutputJson)
                .should.be.rejectedWith('State expected to be "1". Please complete the first two OVC operations');
        });
        it('Fails to decode if the OVC json is missing fields', async function () {
            const ovcOutputJson = {
                tssVersion: '0.0.1',
                state: 1,
                coin: 'tsol',
                ovc: {
                    1: {
                        gpgPubKey: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsq9RMFK4EEAAoCAwRgDpgm1bptRT5yLOMadcGAHuvkxISL8/3xPy/D\nYA+1NgBqIFK/3OOXxp73Tv86bt1dgH7OD1ACO0mVXAoX5EaVzWZvdmMtMS11\nc2VyLWRmMjQwOWY0NWNhMTZmNTU3OGNkMzAxMyA8b3ZjLTEtdXNlci1kZjI0\nMDlmNDVjYTE2ZjU1NzhjZDMwMTNAZGYyNDA5ZjQ1Y2ExNmY1NTc4Y2QzMDEz\nLmNvbT7CjAQQEwgAHQUCZBsq9QQLCQcIAxUICgQWAAIBAhkBAhsDAh4BACEJ\nEOUeC7QrGL+2FiEEjN6vPUFRweVtDKFZ5R4LtCsYv7Z7oAEAvNKaJrTIs3ky\nbxjkUicsuxOyA2oWGarJH6TGlWF6WD8A/3EIeZzPKSLaW+3enpbCPiU8RVDp\nC6yo6NMAqKp4XlyQzlMEZBsq9RIFK4EEAAoCAwQWlWPNMpk3afEzfgG0xFg4\nCEjY7fGO35n47nZ4qxjEXz2XN4I23xFMiwZbXbptDXlqm7W9ZAHKi892h+Yt\nU4B6AwEIB8J4BBgTCAAJBQJkGyr1AhsMACEJEOUeC7QrGL+2FiEEjN6vPUFR\nweVtDKFZ5R4LtCsYv7YqZwD8DLRuneB0HEzBCyrE4YL+UHaofoHQX1+nRh0j\n82qaDzAA/i3U1SoEIi32YMrorNG50vb4vaEPbbYmfglb+JQ1Yx7o\n=vjgl\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        ovcToBitgoShare: {
                            publicShare: '07bfbb052a1f4b106b315bd5a9d6a71604653289f861320d9801881e952f8550753c89511a360e3b599d9f239a8d36a4956437ed0b152180e22cb94fb08fdc81',
                            privateShare: '-----BEGIN PGP MESSAGE-----\n\nwX4DUQ8XhGVGcTISAgMEd/wQ/AhwIRsSf/6iHwmHKvEYAwfaLtTQotS6BwZm\naX00T7LumGIrNZzBgcggBKMl+8Omom8mX5sP8FUE451iZjBmXlkpHlpAqskS\nEi5SfjlsT31utoLaBLA7NjNSmyYHIiyfh6YnwfV5U72k6hhfpuDSsQGy8Yxp\nM2dVlN4uoO31zgQPf+fgJkZvAPwvjYLBL4O8hs21HGf0VvG99brk4xlFVRhw\nQnuPpM51GOs4vUtbLNSYnAuhU4ReXwwDV9Xu0MXAjfQMk2E3wQLGQ+82uv2B\n1hPD9nDHTtAdWrXd6ZjXFrG4Mf2MQBxySFvVSnFi6yStjfZeiKcD5Vg38PjG\nWg1O5N3/paq98HfH0Q4qNKGZljwo3oEQZzlYm2kVnI0PULoMYg==\n=ovAx\n-----END PGP MESSAGE-----\n',
                            vssProof: 'be8198c2cef94cb381aa8aa9277a0a46ba5a54b0ac9930034b4af66b1b805234',
                            i: 3,
                            j: 1,
                            uSig: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EZBsq9RMFK4EEAAoCAwRgDpgm1bptRT5yLOMadcGAHuvkxISL8/3xPy/D\nYA+1NgBqIFK/3OOXxp73Tv86bt1dgH7OD1ACO0mVXAoX5EaVzWZvdmMtMS11\nc2VyLWRmMjQwOWY0NWNhMTZmNTU3OGNkMzAxMyA8b3ZjLTEtdXNlci1kZjI0\nMDlmNDVjYTE2ZjU1NzhjZDMwMTNAZGYyNDA5ZjQ1Y2ExNmY1NTc4Y2QzMDEz\nLmNvbT7CjAQQEwgAHQUCZBsq9QQLCQcIAxUICgQWAAIBAhkBAhsDAh4BACEJ\nEOUeC7QrGL+2FiEEjN6vPUFRweVtDKFZ5R4LtCsYv7Z7oAEAvNKaJrTIs3ky\nbxjkUicsuxOyA2oWGarJH6TGlWF6WD8A/3EIeZzPKSLaW+3enpbCPiU8RVDp\nC6yo6NMAqKp4XlyQzlMEZBsq9RIFK4EEAAoCAwQWlWPNMpk3afEzfgG0xFg4\nCEjY7fGO35n47nZ4qxjEXz2XN4I23xFMiwZbXbptDXlqm7W9ZAHKi892h+Yt\nU4B6AwEIB8J4BBgTCAAJBQJkGyr1AhsMACEJEOUeC7QrGL+2FiEEjN6vPUFR\nweVtDKFZ5R4LtCsYv7YqZwD8DLRuneB0HEzBCyrE4YL+UHaofoHQX1+nRh0j\n82qaDzAA/i3U1SoEIi32YMrorNG50vb4vaEPbbYmfglb+JQ1Yx7ozjMEZBsq\n9RYJKwYBBAHaRw8BAQdAS1534LdCC60ASpEgnEBC8pWPSOWWBLXyWaBhEOW2\n/ijCeAQYEwgACQUCZBsq9QIbIAAhCRDlHgu0Kxi/thYhBIzerz1BUcHlbQyh\nWeUeC7QrGL+2FUYA/AgMU4V7C7I/5HwK73mctaGXNdfVr/muRMNOGW/CAxVL\nAP9KaBr95o32oEN5eo7tWFByoOCCk9JMjs36Cq7o+sR31A==\n=eZ3B\n-----END PGP PUBLIC KEY BLOCK-----\n',
                        },
                    },
                },
            };
            await bitgo.coin('tsol').keychains().createTssBitGoKeyFromOvcShares(ovcOutputJson).should.be.rejected();
        });
        it('OvcShare codec decodes correctly', async function () {
            const test = {
                publicShare: '07bfbb052a1f4b106b315bd5a9d6a71604653289f861320d9801881e952f8550753c89511a360e3b599d9f239a8d36a4956437ed0b152180e22cb94fb08fdc81',
                privateShare: '-----BEGIN PGP MESSAGE-----\n\nwX4DUQ8XhGVGcTISAgMEd/wQ/AhwIRsSf/6iHwmHKvEYAwfaLtTQotS6BwZm\naX00T7LumGIrNZzBgcggBKMl+8Omom8mX5sP8FUE451iZjBmXlkpHlpAqskS\nEi5SfjlsT31utoLaBLA7NjNSmyYHIiyfh6YnwfV5U72k6hhfpuDSsQGy8Yxp\nM2dVlN4uoO31zgQPf+fgJkZvAPwvjYLBL4O8hs21HGf0VvG99brk4xlFVRhw\nQnuPpM51GOs4vUtbLNSYnAuhU4ReXwwDV9Xu0MXAjfQMk2E3wQLGQ+82uv2B\n1hPD9nDHTtAdWrXd6ZjXFrG4Mf2MQBxySFvVSnFi6yStjfZeiKcD5Vg38PjG\nWg1O5N3/paq98HfH0Q4qNKGZljwo3oEQZzlYm2kVnI0PULoMYg==\n=ovAx\n-----END PGP MESSAGE-----\n',
                vssProof: 'be8198c2cef94cb381aa8aa9277a0a46ba5a54b0ac9930034b4af66b1b805234',
                i: 3,
                j: 1,
            };
            const decodedRes = (0, sdk_core_1.decodeOrElse)(sdk_core_1.OvcShare.name, sdk_core_1.OvcShare, test, (errors) => {
                throw new Error(`error(s) parsing parsing json: ${errors}`);
            });
            assert(decodedRes);
        });
    });
    it('should generate backup without encryptedPrv when passphrase not provided', async () => {
        const scope = nock(bgUrl)
            .post('/api/v2/tltc/key', (body) => {
            return body.encryptedPrv === undefined && body.prv === undefined;
        })
            .reply(200);
        const backup = await keychains.createBackup({});
        scope.isDone().should.be.true();
        backup.should.not.have.property('encryptedPrv');
        backup.should.have.property('prv');
    });
    it('should generate backup and call endpoint with encryptedPrv when passphrase is provided', async () => {
        const scope = nock(bgUrl)
            .post('/api/v2/tltc/key', (body) => {
            return body.encryptedPrv !== undefined && body.prv === undefined;
        })
            .reply(200);
        const backup = await keychains.createBackup({ passphrase: 't3stSicretly!' });
        scope.isDone().should.be.true();
        backup.should.have.property('encryptedPrv');
        const decryptedPrv = bitgo.decrypt({ input: backup.encryptedPrv, password: 't3stSicretly!' });
        decryptedPrv.should.startWith('xprv');
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsRUFBRTtBQUNGLHFCQUFxQjtBQUNyQixFQUFFOztBQUVGLDRDQUF3RjtBQUN4RixpQ0FBaUM7QUFDakMsNEJBQTRCO0FBQzVCLDZCQUE2QjtBQUM3QixpQ0FBaUM7QUFDakMsK0JBQStCO0FBRS9CLDhDQUFvRztBQUNwRyw4Q0FBNEM7QUFDNUMsOENBQTJDO0FBRTNDLFFBQVEsQ0FBQyxjQUFjLEVBQUU7SUFDdkIsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFFBQVEsQ0FBQztJQUNiLElBQUksU0FBUyxDQUFDO0lBQ2QsSUFBSSxLQUFLLENBQUM7SUFFVixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsYUFBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpDLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsY0FBYyxFQUFFO1FBQ3ZCLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLO1lBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7aUJBQ3RCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLElBQUk7Z0JBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDekUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsQixNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLENBQUMsQ0FBQztZQUM1RixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7UUFJSTtJQUNKLFFBQVEsQ0FBQywwQ0FBMEMsRUFBRTtRQUNuRCwwQ0FBMEM7UUFDMUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sZUFBZSxHQUFHLGVBQUssQ0FBQyxNQUFNLENBQ2xDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLENBQUMsZUFBZSxLQUFLLGtCQUFRLENBQUMsU0FBUztZQUN4QyxDQUFDLENBQUMsSUFBSSxLQUFLLGtCQUFRLENBQUMsTUFBTTtZQUMxQixDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsR0FBRztZQUMvQixDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsS0FBSztZQUNqQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsSUFBSTtZQUNoQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsSUFBSTtZQUNoQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsSUFBSTtZQUNoQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsTUFBTTtZQUNsQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsSUFBSTtZQUNoQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsSUFBSTtZQUNoQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsTUFBTSxJQUFJLDJFQUEyRTtZQUNqSCxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsS0FBSyxJQUFJLDBFQUEwRTtZQUMvRyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsS0FBSyxJQUFJLDJFQUEyRTtZQUNoSCxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsR0FBRyxJQUFJLHlFQUF5RTtZQUM1RyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsT0FBTyxJQUFJLDZFQUE2RTtZQUNwSCxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsR0FBRyxJQUFJLHlFQUF5RTtZQUM1RyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsR0FBRyxJQUFJLHlFQUF5RTtZQUM1RyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsS0FBSyxJQUFJLDJFQUEyRTtZQUNoSCxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsR0FBRyxJQUFJLHlFQUF5RTtZQUM1RyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsSUFBSTtZQUNoQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsSUFBSTtZQUNoQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsR0FBRztZQUMvQixDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsTUFBTTtZQUNsQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsR0FBRztZQUMvQixDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsS0FBSztZQUNqQyxDQUFDLENBQUMsS0FBSyxLQUFLLHlCQUFlLENBQUMsR0FBRztZQUMvQixDQUFDLENB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UUFDOUYsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vXG4vLyBUZXN0IGZvciBLZXljaGFpbnNcbi8vXG5cbmltcG9ydCB7IENvaW5GYW1pbHksIENvaW5LaW5kLCBjb2lucywgS2V5Q3VydmUsIFVuZGVybHlpbmdBc3NldCB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuXG5pbXBvcnQgeyBjb21tb24sIGRlY29kZU9yRWxzZSwgRUNEU0FVdGlscywgRUREU0FVdGlscywgS2V5Y2hhaW5zLCBPdmNTaGFyZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R28gfSBmcm9tICcuLi8uLi8uLi9zcmMvYml0Z28nO1xuXG5kZXNjcmliZSgnVjIgS2V5Y2hhaW5zJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z287XG4gIGxldCBiYXNlY29pbjtcbiAgbGV0IGtleWNoYWlucztcbiAgbGV0IGJnVXJsO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYml0Z28uc2V0VmFsaWRhdGUoZmFsc2UpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGx0YycpO1xuICAgIGtleWNoYWlucyA9IGJhc2Vjb2luLmtleWNoYWlucygpO1xuXG4gICAgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS51cmk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBZGQgS2V5Y2hhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhZGQgYSBrZXljaGFpbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jayhiZ1VybClcbiAgICAgICAgLnBvc3QoJy9hcGkvdjIvdGx0Yy9rZXknLCBmdW5jdGlvbiAoYm9keSkge1xuICAgICAgICAgIGJvZHkucHViLnNob3VsZC5lcXVhbCgncHViJyk7XG4gICAgICAgICAgYm9keS5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkLnNob3VsZC5lcXVhbCgnZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCcpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAwLCB7fSk7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuYWRkKHsgcHViOiAncHViJywgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogJ2Rlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQnIH0pO1xuICAgICAgc2NvcGUuZG9uZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogVGhpcyBzZWN0aW9uJ3MgaW50ZW50aW9uIGlzIHRvIHByb3ZpZGUgc29tZSBrZXkgZ2VuZXJhdGlvbiBzYW5pdHkgY2hlY2tpbmcuIGdlbmVyYXRlS2V5UGFpciBpcyBhIGdlbmVyYWwgc3VyZmFjZVxuICAgKiBmb3Iga2V5IGdlbmVyYXRpb24gYnV0IHRoZSBrZXlzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGJ5IEJpdEdvIGRvd24gdGhlIGxpbmUuIEFueSBTRUNQMjU2SzEgYmFzZWQgY29pbnMga2V5LXBhaXJzIGNhblxuICAgKiBiZSByZS11c2VkIHNvIG5lZWQgdG8gYmUgdGhlIHNhbWUuXG4gICAqKi9cbiAgZGVzY3JpYmUoJ0tleSBnZW5lcmF0aW9uIGVuZm9yY2VtZW50IGZvciBTRUNQMjU2SzEnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gaXRlcmF0ZSBvdmVyIG5vbi1maWF0IGNyeXB0byBzZWNwIGNvaW5zXG4gICAgY29uc3QgY29pbkZhbWlseVZhbHVlcyA9IE9iamVjdC5rZXlzKENvaW5GYW1pbHkpLm1hcCgobikgPT4gbi50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCBjcnlwdG9TZWNwQ29pbnMgPSBjb2lucy5maWx0ZXIoXG4gICAgICAobikgPT5cbiAgICAgICAgbi5wcmltYXJ5S2V5Q3VydmUgPT09IEtleUN1cnZlLlNlY3AyNTZrMSAmJlxuICAgICAgICBuLmtpbmQgPT09IENvaW5LaW5kLkNSWVBUTyAmJlxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuVVNEICYmXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5BVkFYUCAmJlxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuRE9HRSAmJlxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuRVRIVyAmJlxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuS0FWQSAmJlxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuQ09SRVVNICYmXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5CRVJBICYmXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5JU0xNICYmXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5BUkJFVEggJiYgLy8gVE9ETyhXSU4tNjkyKTogcmVtb3ZlIHRoaXMgb25jZSBjb2luLXNwZWNpZmljIG1vZHVsZSBmb3IgYXJiZXRoIGlzIGFkZGVkXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5PUEVUSCAmJiAvLyBUT0RPKFdJTi02OTIpOiByZW1vdmUgdGhpcyBvbmNlIGNvaW4tc3BlY2lmaWMgbW9kdWxlIGZvciBvcGV0aCBpcyBhZGRlZFxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuWktFVEggJiYgLy8gVE9ETyhXSU4tMTQyNyk6IHJlbW92ZSB0aGlzIG9uY2UgY29pbi1zcGVjaWZpYyBtb2R1bGUgZm9yIHprZXRoIGlzIGFkZGVkXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5PQVMgJiYgLy8gVE9ETyhXSU4tMzY5Nik6IHJlbW92ZSB0aGlzIG9uY2UgY29pbi1zcGVjaWZpYyBtb2R1bGUgZm9yIG9hcyBpcyBhZGRlZFxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuQ09SRURBTyAmJiAvLyBUT0RPKFdJTi0zNjk2KTogcmVtb3ZlIHRoaXMgb25jZSBjb2luLXNwZWNpZmljIG1vZHVsZSBmb3IgY29yZWRhbyBpcyBhZGRlZFxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuRkxSICYmIC8vIFRPRE8oV0lOLTQyMTUpOiByZW1vdmUgdGhpcyBvbmNlIGNvaW4tc3BlY2lmaWMgbW9kdWxlIGZvciBGTFIgaXMgYWRkZWRcbiAgICAgICAgbi5hc3NldCAhPT0gVW5kZXJseWluZ0Fzc2V0LlNHQiAmJiAvLyBUT0RPKFdJTi00MjE2KTogcmVtb3ZlIHRoaXMgb25jZSBjb2luLXNwZWNpZmljIG1vZHVsZSBmb3IgU0dCIGlzIGFkZGVkXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5XRU1JWCAmJiAvLyBUT0RPKFdJTi00MTc3KTogcmVtb3ZlIHRoaXMgb25jZSBjb2luLXNwZWNpZmljIG1vZHVsZSBmb3IgV0VNSVggaXMgYWRkZWRcbiAgICAgICAgbi5hc3NldCAhPT0gVW5kZXJseWluZ0Fzc2V0LlhEQyAmJiAvLyBUT0RPKFdJTi00MTczKTogcmVtb3ZlIHRoaXMgb25jZSBjb2luLXNwZWNpZmljIG1vZHVsZSBmb3IgWERDIGlzIGFkZGVkXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5SVU5FICYmXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5CQUJZICYmXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5JQ1AgJiZcbiAgICAgICAgbi5hc3NldCAhPT0gVW5kZXJseWluZ0Fzc2V0Lk1BTlRSQSAmJlxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuTU9OICYmXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5XT1JMRCAmJlxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuU1RUICYmXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5TT05FSVVNICYmXG4gICAgICAgIG4uYXNzZXQgIT09IFVuZGVybHlpbmdBc3NldC5WRVQgJiZcbiAgICAgICAgbi5hc3NldCAhPT0gVW5kZXJseWluZ0Fzc2V0LkNST05PUyAmJlxuICAgICAgICBuLmFzc2V0ICE9PSBVbmRlcmx5aW5nQXNzZXQuRkVUQ0ggJiZcbiAgICAgICAgbi5hc3NldCAhPT0gVW5kZXJseWluZ0Fzc2V0LklOSVQgJiZcbiAgICAgICAgY29pbkZhbWlseVZhbHVlcy5pbmNsdWRlcyhuLm5hbWUpXG4gICAgKTtcblxuICAgIGNvbnN0IGV4cGVjdGVkWHB1YiA9XG4gICAgICAneHB1YjY2MU15TXdBcVJiY0dwWmY4bXhOV2hTUGRXYUxHdlF6emFnZTZ2cTJvUUZ6cTh0b1Z6bWtqeWdZWjNIY1p3NmVDekFmbjlaZHlHaktvS2tjcEt3YWNrZGd6blZiaXVucHE3cmt4RHU3cXVTJztcbiAgICBjb25zdCBleHBlY3RlZFhwcnYgPVxuICAgICAgJ3hwcnY5czIxWnJRSDE0M0s0TFZDMmtSTjlaVmY1VWpxc1RoOWRNbTNKWVJSRjRqMXhMWmV4VFRXQ0JONGhtZFpVSGVUM3ZDSlBMMTgxRXJWYVk0ODlBckJLU1dhQjdEdTd2eVZTNlhDNDNXdEs3QSc7XG5cbiAgICBjb25zdCBzZWVkID0gQnVmZmVyLmZyb20oJ3RoaXMgaXMgc29tZSByYW5kb20gc2VlZCB3ZSB3aWxsIHVzZScsICd1dGYtOCcpO1xuXG4gICAgY3J5cHRvU2VjcENvaW5zLmZvckVhY2goKGNvaW4pID0+IHtcbiAgICAgIGl0KGBzaG91bGQgY3JlYXRlIHRoZSBzYW1lICR7Y29pbi5uYW1lfSBrZXkgd2l0aCB0aGUgc2FtZSBzZWVkYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q29pbiA9IGJpdGdvLmNvaW4oY29pbi5uYW1lKTtcbiAgICAgICAgY29uc3Qga2V5UGFpciA9IGN1cnJlbnRDb2luLmdlbmVyYXRlS2V5UGFpcihzZWVkKTtcblxuICAgICAgICBzaG91bGQuZXhpc3Qoa2V5UGFpci5wdWIpO1xuICAgICAgICBzaG91bGQuZXhpc3Qoa2V5UGFpci5wcnYpO1xuXG4gICAgICAgIGtleVBhaXIucHViLnNob3VsZC5lcXVhbChleHBlY3RlZFhwdWIpO1xuICAgICAgICBrZXlQYWlyLnBydi5zaG91bGQuZXF1YWwoZXhwZWN0ZWRYcHJ2KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVXBkYXRlIFBhc3N3b3JkJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG9sZFBhc3N3b3JkID0gJ29sZFBhc3N3b3JkJztcbiAgICBjb25zdCBuZXdQYXNzd29yZCA9ICduZXdQYXNzd29yZCc7XG4gICAgY29uc3Qgb3RoZXJQYXNzd29yZCA9ICdvdGhlclBhc3N3b3JkJztcblxuICAgIGRlc2NyaWJlKCdzaG91bGQgZmFpbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBzYW5kYm94O1xuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3RvIHVwZGF0ZSB0aGUgcGFzc3dvcmQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGtleWNoYWluc1xuICAgICAgICAgIC51cGRhdGVQYXNzd29yZCh7IG5ld1Bhc3N3b3JkOiAnNTY3OCcgfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnTWlzc2luZyBwYXJhbWV0ZXI6IG9sZFBhc3N3b3JkJyk7XG5cbiAgICAgICAgYXdhaXQga2V5Y2hhaW5zXG4gICAgICAgICAgLnVwZGF0ZVBhc3N3b3JkKHsgb2xkUGFzc3dvcmQ6IDEyMzQsIG5ld1Bhc3N3b3JkOiAnNTY3OCcgfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRXhwZWN0aW5nIHBhcmFtZXRlciBzdHJpbmc6IG9sZFBhc3N3b3JkIGJ1dCBmb3VuZCBudW1iZXInKTtcblxuICAgICAgICBhd2FpdCBrZXljaGFpbnNcbiAgICAgICAgICAudXBkYXRlUGFzc3dvcmQoeyBvbGRQYXNzd29yZDogJzEyMzQnIH0pXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ01pc3NpbmcgcGFyYW1ldGVyOiBuZXdQYXNzd29yZCcpO1xuXG4gICAgICAgIGF3YWl0IGtleWNoYWluc1xuICAgICAgICAgIC51cGRhdGVQYXNzd29yZCh7IG9sZFBhc3N3b3JkOiAnMTIzNCcsIG5ld1Bhc3N3b3JkOiA1Njc4IH0pXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0V4cGVjdGluZyBwYXJhbWV0ZXIgc3RyaW5nOiBuZXdQYXNzd29yZCBidXQgZm91bmQgbnVtYmVyJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3RvIHVwZGF0ZSB0aGUgcGFzc3dvcmQgZm9yIGEgc2luZ2xlIGtleWNoYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ga2V5Y2hhaW5zLnVwZGF0ZVNpbmdsZUtleWNoYWluUGFzc3dvcmQoeyBuZXdQYXNzd29yZDogJzU2NzgnIH0pKS5zaG91bGQudGhyb3coXG4gICAgICAgICAgJ2V4cGVjdGVkIG9sZCBwYXNzd29yZCB0byBiZSBhIHN0cmluZydcbiAgICAgICAgKTtcblxuICAgICAgICAoKCkgPT4ga2V5Y2hhaW5zLnVwZGF0ZVNpbmdsZUtleWNoYWluUGFzc3dvcmQoeyBvbGRQYXNzd29yZDogMTIzNCwgbmV3UGFzc3dvcmQ6ICc1Njc4JyB9KSkuc2hvdWxkLnRocm93KFxuICAgICAgICAgICdleHBlY3RlZCBvbGQgcGFzc3dvcmQgdG8gYmUgYSBzdHJpbmcnXG4gICAgICAgICk7XG5cbiAgICAgICAgKCgpID0+IGtleWNoYWlucy51cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHsgb2xkUGFzc3dvcmQ6ICcxMjM0JyB9KSkuc2hvdWxkLnRocm93KFxuICAgICAgICAgICdleHBlY3RlZCBuZXcgcGFzc3dvcmQgdG8gYmUgYSBzdHJpbmcnXG4gICAgICAgICk7XG5cbiAgICAgICAgKCgpID0+IGtleWNoYWlucy51cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHsgb2xkUGFzc3dvcmQ6ICcxMjM0JywgbmV3UGFzc3dvcmQ6IDU2NzggfSkpLnNob3VsZC50aHJvdyhcbiAgICAgICAgICAnZXhwZWN0ZWQgbmV3IHBhc3N3b3JkIHRvIGJlIGEgc3RyaW5nJ1xuICAgICAgICApO1xuXG4gICAgICAgICgoKSA9PiBrZXljaGFpbnMudXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZCh7IG9sZFBhc3N3b3JkOiAnMTIzNCcsIG5ld1Bhc3N3b3JkOiAnNTY3OCcgfSkpLnNob3VsZC50aHJvdyhcbiAgICAgICAgICAnZXhwZWN0ZWQga2V5Y2hhaW4gdG8gYmUgYW4gb2JqZWN0IHdpdGggYW4gZW5jcnlwdGVkUHJ2IHByb3BlcnR5J1xuICAgICAgICApO1xuXG4gICAgICAgICgoKSA9PlxuICAgICAgICAgIGtleWNoYWlucy51cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHtcbiAgICAgICAgICAgIG9sZFBhc3N3b3JkOiAnMTIzNCcsXG4gICAgICAgICAgICBuZXdQYXNzd29yZDogJzU2NzgnLFxuICAgICAgICAgICAga2V5Y2hhaW46IHt9LFxuICAgICAgICAgIH0pKS5zaG91bGQudGhyb3coJ2V4cGVjdGVkIGtleWNoYWluIHRvIGJlIGFuIG9iamVjdCB3aXRoIGFuIGVuY3J5cHRlZFBydiBwcm9wZXJ0eScpO1xuXG4gICAgICAgICgoKSA9PlxuICAgICAgICAgIGtleWNoYWlucy51cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHtcbiAgICAgICAgICAgIG9sZFBhc3N3b3JkOiAnMTIzNCcsXG4gICAgICAgICAgICBuZXdQYXNzd29yZDogJzU2NzgnLFxuICAgICAgICAgICAga2V5Y2hhaW46IHsgZW5jcnlwdGVkUHJ2OiAxMjMgfSxcbiAgICAgICAgICB9KSkuc2hvdWxkLnRocm93KCdleHBlY3RlZCBrZXljaGFpbiB0byBiZSBhbiBvYmplY3Qgd2l0aCBhbiBlbmNyeXB0ZWRQcnYgcHJvcGVydHknKTtcblxuICAgICAgICBjb25zdCBrZXljaGFpbiA9IHsgZW5jcnlwdGVkUHJ2OiBiaXRnby5lbmNyeXB0KHsgaW5wdXQ6ICd4cHJ2MScsIHBhc3N3b3JkOiBvdGhlclBhc3N3b3JkIH0pIH07XG4gICAgICAgICgoKSA9PiBrZXljaGFpbnMudXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZCh7IG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCwga2V5Y2hhaW4gfSkpLnNob3VsZC50aHJvdyhcbiAgICAgICAgICAncGFzc3dvcmQgdXNlZCB0byBkZWNyeXB0IGtleWNoYWluIHByaXZhdGUga2V5IGlzIGluY29ycmVjdCdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnb24gYW55IG90aGVyIGVycm9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBub2NrKGJnVXJsKVxuICAgICAgICAgIC5nZXQoJy9hcGkvdjIvdGx0Yy9rZXknKVxuICAgICAgICAgIC5xdWVyeSh0cnVlKVxuICAgICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHB1YjogJ3hwdWIxJyxcbiAgICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGJpdGdvLmVuY3J5cHQoeyBpbnB1dDogJ3hwcnYxJywgcGFzc3dvcmQ6IG9sZFBhc3N3b3JkIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICBzYW5kYm94LnN0dWIoa2V5Y2hhaW5zLCAndXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZCcpLnRocm93cygnZXJyb3InLCAnc29tZSByYW5kb20gZXJyb3InKTtcblxuICAgICAgICBhd2FpdCBrZXljaGFpbnMudXBkYXRlUGFzc3dvcmQoeyBvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnc29tZSByYW5kb20gZXJyb3InKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3N1Y2Nlc3NmdWwgcGFzc3dvcmQgdXBkYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRhdGVLZXlzID0gZnVuY3Rpb24gKGtleXMsIG5ld1Bhc3N3b3JkLCBleHBlY3RlZExlbmd0aCkge1xuICAgICAgICBhc3NlcnQub2soT2JqZWN0LmtleXMoa2V5cykubGVuZ3RoID09PSBleHBlY3RlZExlbmd0aCwgJ3Nob3VsZCBoYXZlIHRoZSBleHBlY3RlZCBudW1iZXIgb2Yga2V5cycpO1xuICAgICAgICBfLmVhY2goa2V5cywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICBhc3NlcnQub2soa2V5LmluY2x1ZGVzKCd4cHViJykgfHwga2V5LmluY2x1ZGVzKCdyYW5kb21pZCcpLCAna2V5IHNob3VsZCBiZSB4cHViIG9yIHJhbmRvbWlkJyk7XG4gICAgICAgICAgY29uc3QgZGVjcnlwdGVkUHJ2ID0gYml0Z28uZGVjcnlwdCh7IGlucHV0OiB2YWx1ZSwgcGFzc3dvcmQ6IG5ld1Bhc3N3b3JkIH0pO1xuICAgICAgICAgIGRlY3J5cHRlZFBydi5zaG91bGQuc3RhcnRXaXRoKCd4cHJ2Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaXQoJ3JlY2VpdmUgb25seSBvbmUgcGFnZSB3aGVuIGxpc3Rpbmcga2V5Y2hhaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBub2NrKGJnVXJsKVxuICAgICAgICAgIC5nZXQoJy9hcGkvdjIvdGx0Yy9rZXknKVxuICAgICAgICAgIC5xdWVyeSh0cnVlKVxuICAgICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHB1YjogJ3hwdWIxJyxcbiAgICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGJpdGdvLmVuY3J5cHQoeyBpbnB1dDogJ3hwcnYxJywgcGFzc3dvcmQ6IG9sZFBhc3N3b3JkIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHViOiAneHB1YjInLFxuICAgICAgICAgICAgICAgIGVuY3J5cHRlZFBydjogYml0Z28uZW5jcnlwdCh7IGlucHV0OiAneHBydjInLCBwYXNzd29yZDogb3RoZXJQYXNzd29yZCB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAncmFuZG9taWQxJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGJpdGdvLmVuY3J5cHQoeyBpbnB1dDogJ3hwcnYzJywgcGFzc3dvcmQ6IG9sZFBhc3N3b3JkIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQga2V5Y2hhaW5zLnVwZGF0ZVBhc3N3b3JkKHsgb2xkUGFzc3dvcmQ6IG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZDogbmV3UGFzc3dvcmQgfSk7XG4gICAgICAgIHZhbGlkYXRlS2V5cyhrZXlzLCBuZXdQYXNzd29yZCwgMik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JlY2VpdmUgbXVsdGlwbGUgcGFnZXMgd2hlbiBsaXN0aW5nIGtleWNoYWlucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcHJldklkID0gJ3ByZXZJZCc7XG4gICAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgICAgLmdldCgnL2FwaS92Mi90bHRjL2tleScpXG4gICAgICAgICAgLnF1ZXJ5KHRydWUpXG4gICAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgICAgbmV4dEJhdGNoUHJldklkOiBwcmV2SWQsXG4gICAgICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwdWI6ICd4cHViMScsXG4gICAgICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBiaXRnby5lbmNyeXB0KHsgaW5wdXQ6ICd4cHJ2MScsIHBhc3N3b3JkOiBvbGRQYXNzd29yZCB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHB1YjogJ3hwdWIyJyxcbiAgICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGJpdGdvLmVuY3J5cHQoeyBpbnB1dDogJ3hwcnYyJywgcGFzc3dvcmQ6IG90aGVyUGFzc3dvcmQgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ3JhbmRvbWlkMScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RzcycsXG4gICAgICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBiaXRnby5lbmNyeXB0KHsgaW5wdXQ6ICd4cHJ2MycsIHBhc3N3b3JkOiBvbGRQYXNzd29yZCB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgbm9jayhiZ1VybClcbiAgICAgICAgICAuZ2V0KCcvYXBpL3YyL3RsdGMva2V5JylcbiAgICAgICAgICAucXVlcnkoZnVuY3Rpb24gcXVlcnlOZXh0UGFnZU1hdGNoKHF1ZXJ5T2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcXVlcnlPYmplY3QucHJldklkID09PSBwcmV2SWQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwdWI6ICd4cHViMycsXG4gICAgICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBiaXRnby5lbmNyeXB0KHsgaW5wdXQ6ICd4cHJ2MycsIHBhc3N3b3JkOiBvbGRQYXNzd29yZCB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHB1YjogJ3hwdWI0JyxcbiAgICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGJpdGdvLmVuY3J5cHQoeyBpbnB1dDogJ3hwcnY0JywgcGFzc3dvcmQ6IG90aGVyUGFzc3dvcmQgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBrZXljaGFpbnMudXBkYXRlUGFzc3dvcmQoeyBvbGRQYXNzd29yZDogb2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkOiBuZXdQYXNzd29yZCB9KTtcbiAgICAgICAgdmFsaWRhdGVLZXlzKGtleXMsIG5ld1Bhc3N3b3JkLCAzKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2luZ2xlIGtleWNoYWluIHBhc3N3b3JkIHVwZGF0ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJ2ID0gJ3hwcnZ0ZXN0JztcbiAgICAgICAgY29uc3Qga2V5Y2hhaW4gPSB7XG4gICAgICAgICAgeHB1YjogJ3hwdWIxMjMnLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogYml0Z28uZW5jcnlwdCh7IGlucHV0OiBwcnYsIHBhc3N3b3JkOiBvbGRQYXNzd29yZCB9KSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBuZXdLZXljaGFpbiA9IGtleWNoYWlucy51cGRhdGVTaW5nbGVLZXljaGFpblBhc3N3b3JkKHsga2V5Y2hhaW4sIG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9KTtcblxuICAgICAgICBjb25zdCBkZWNyeXB0ZWRQcnYgPSBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IG5ld0tleWNoYWluLmVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IG5ld1Bhc3N3b3JkIH0pO1xuICAgICAgICBkZWNyeXB0ZWRQcnYuc2hvdWxkLmVxdWFsKHBydik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHVwZGF0ZWQga2V5cyB3aXRoIGlkcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbm9jayhiZ1VybClcbiAgICAgICAgICAuZ2V0KCcvYXBpL3YyL3RsdGMva2V5JylcbiAgICAgICAgICAucXVlcnkodHJ1ZSlcbiAgICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ3JhbmRvbWlkMScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RzcycsXG4gICAgICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBiaXRnby5lbmNyeXB0KHsgaW5wdXQ6ICd4cHJ2MScsIHBhc3N3b3JkOiBvbGRQYXNzd29yZCB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAncmFuZG9taWQyJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGJpdGdvLmVuY3J5cHQoeyBpbnB1dDogJ3hwcnYyJywgcGFzc3dvcmQ6IG90aGVyUGFzc3dvcmQgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBrZXljaGFpbnMudXBkYXRlUGFzc3dvcmQoeyBvbGRQYXNzd29yZDogb2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkOiBuZXdQYXNzd29yZCB9KTtcbiAgICAgICAgdmFsaWRhdGVLZXlzKGtleXMsIG5ld1Bhc3N3b3JkLCAxKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0NyZWF0ZSBUU1MgS2V5Y2hhaW5zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3R1YmJlZEtleWNoYWluc1RyaXBsZXQgPSB7XG4gICAgICAgIHVzZXJLZXljaGFpbjoge1xuICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgcHViOiAndXNlclB1YicsXG4gICAgICAgIH0sXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiB7XG4gICAgICAgICAgaWQ6ICcyJyxcbiAgICAgICAgICBwdWI6ICd1c2VyUHViJyxcbiAgICAgICAgfSxcbiAgICAgICAgYml0Z29LZXljaGFpbjoge1xuICAgICAgICAgIGlkOiAnMycsXG4gICAgICAgICAgcHViOiAndXNlclB1YicsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBsZXQgc2FuZGJveDtcbiAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIFsndHNvbCcsICd0ZG90JywgJ3RuZWFyJ10uZm9yRWFjaCgoY29pbikgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBFRERTQSBUU1MgS2V5Y2hhaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNhbmRib3guc3R1YihFRERTQVV0aWxzLmRlZmF1bHQucHJvdG90eXBlLCAnY3JlYXRlS2V5Y2hhaW5zJykucmVzb2x2ZXMoc3R1YmJlZEtleWNoYWluc1RyaXBsZXQpO1xuICAgICAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IGJpdGdvLmNvaW4oY29pbikua2V5Y2hhaW5zKCkuY3JlYXRlTXBjKHtcbiAgICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgICBwYXNzcGhyYXNlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UnLFxuICAgICAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiAnb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBrZXljaGFpbnMuc2hvdWxkLmRlZXBFcXVhbChzdHViYmVkS2V5Y2hhaW5zVHJpcGxldCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIFsndGJzYyddLmZvckVhY2goKGNvaW4pID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgRUNEU0EgVFNTIEtleWNoYWlucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBub2NrKGJnVXJsKS5nZXQoJy9hcGkvdjIvdHNzL3NldHRpbmdzJykucmVwbHkoMjAwLCB7XG4gICAgICAgICAgICBjb2luU2V0dGluZ3M6IHt9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNhbmRib3guc3R1YihFQ0RTQVV0aWxzLkVjZHNhVXRpbHMucHJvdG90eXBlLCAnY3JlYXRlS2V5Y2hhaW5zJykucmVzb2x2ZXMoc3R1YmJlZEtleWNoYWluc1RyaXBsZXQpO1xuICAgICAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IGJpdGdvLmNvaW4oY29pbikua2V5Y2hhaW5zKCkuY3JlYXRlTXBjKHtcbiAgICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgICBwYXNzcGhyYXNlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UnLFxuICAgICAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiAnb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBrZXljaGFpbnMuc2hvdWxkLmRlZXBFcXVhbChzdHViYmVkS2V5Y2hhaW5zVHJpcGxldCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnUmVjcmVhdGUgS2V5Y2hhaW5zIGZyb20gTVBDVjEgdG8gTVBDVjInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb2luID0gJ2h0ZXRoJztcbiAgICAgIGNvbnN0IHdhbGxldElkID0gJ3dhbGxldElkJztcbiAgICAgIGNvbnN0IG90cCA9ICcwMDAwMDAnO1xuICAgICAgY29uc3Qgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcblxuICAgICAgY29uc3QgZGVjcnlwdFJlc3VsdCA9IEpTT04uc3RyaW5naWZ5KHsga2V5OiAnZGVjcnlwdGVkJyB9KTtcblxuICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgICAgLmdldCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKVxuICAgICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICAgIGNvaW5TZXR0aW5nczoge1xuICAgICAgICAgICAgICBldGg6IHtcbiAgICAgICAgICAgICAgICB3YWxsZXRDcmVhdGlvblNldHRpbmdzOiB7XG4gICAgICAgICAgICAgICAgICBtdWx0aVNpZ1R5cGVWZXJzaW9uOiAnTVBDdjInLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHNhbmRib3guc3R1YihCaXRHby5wcm90b3R5cGUsICdkZWNyeXB0JykucmV0dXJucyhkZWNyeXB0UmVzdWx0KTtcbiAgICAgIH0pO1xuXG4gICAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBpZiBlbXB0eSBzdHJpbmdzIGFyZSBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zOiBQYXJhbWV0ZXJzPEtleWNoYWluc1sncmVjcmVhdGVNcGMnXT5bMF0gPSB7XG4gICAgICAgICAgY29pbixcbiAgICAgICAgICB3YWxsZXRJZCxcbiAgICAgICAgICBvdHAsXG4gICAgICAgICAgcGFzc3BocmFzZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZScsXG4gICAgICAgICAgZW5jcnlwdGVkTWF0ZXJpYWw6IHtcbiAgICAgICAgICAgIGVuY3J5cHRlZFVzZXJLZXk6ICdlbmNyeXB0ZWQnLFxuICAgICAgICAgICAgZW5jcnlwdGVkQmFja3VwS2V5OiAnZW5jcnlwdGVkJyxcbiAgICAgICAgICAgIGVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IGtleWNoYWlucy5yZWNyZWF0ZU1wYyh7IC4uLnBhcmFtcywgY29pbjogJycgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyByZXF1aXJlZCBwYXJhbSBjb2luJyk7XG5cbiAgICAgICAgYXdhaXQga2V5Y2hhaW5zXG4gICAgICAgICAgLnJlY3JlYXRlTXBjKHsgLi4ucGFyYW1zLCB3YWxsZXRJZDogJycgfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyByZXF1aXJlZCBwYXJhbSB3YWxsZXRJZCcpO1xuXG4gICAgICAgIGF3YWl0IGtleWNoYWlucy5yZWNyZWF0ZU1wYyh7IC4uLnBhcmFtcywgb3RwOiAnJyB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIG90cCcpO1xuXG4gICAgICAgIGF3YWl0IGtleWNoYWluc1xuICAgICAgICAgIC5yZWNyZWF0ZU1wYyh7IC4uLnBhcmFtcywgcGFzc3BocmFzZTogJycgfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyByZXF1aXJlZCBwYXJhbSBwYXNzcGhyYXNlJyk7XG5cbiAgICAgICAgYXdhaXQga2V5Y2hhaW5zXG4gICAgICAgICAgLnJlY3JlYXRlTXBjKHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIGVuY3J5cHRlZE1hdGVyaWFsOiB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcy5lbmNyeXB0ZWRNYXRlcmlhbCxcbiAgICAgICAgICAgICAgZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZScpO1xuICAgICAgICBhd2FpdCBrZXljaGFpbnNcbiAgICAgICAgICAucmVjcmVhdGVNcGMoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgZW5jcnlwdGVkTWF0ZXJpYWw6IHtcbiAgICAgICAgICAgICAgLi4ucGFyYW1zLmVuY3J5cHRlZE1hdGVyaWFsLFxuICAgICAgICAgICAgICBlbmNyeXB0ZWRVc2VyS2V5OiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyByZXF1aXJlZCBwYXJhbSBlbmNyeXB0ZWRVc2VyS2V5Jyk7XG4gICAgICAgIGF3YWl0IGtleWNoYWluc1xuICAgICAgICAgIC5yZWNyZWF0ZU1wYyh7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBlbmNyeXB0ZWRNYXRlcmlhbDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuZW5jcnlwdGVkTWF0ZXJpYWwsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZEJhY2t1cEtleTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gZW5jcnlwdGVkQmFja3VwS2V5Jyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGlmIG90cCB1bmxvY2sgZmFpbHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5vY2soYmdVcmwpLnBvc3QoJy9hcGkvdjEvdXNlci91bmxvY2snKS5yZXBseVdpdGhFcnJvcignb3RwIGVycm9yJyk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICBjb2luLFxuICAgICAgICAgIHdhbGxldElkLFxuICAgICAgICAgIG90cCxcbiAgICAgICAgICBwYXNzcGhyYXNlOiAncGFzc3dvcmQnLFxuICAgICAgICAgIGVuY3J5cHRlZE1hdGVyaWFsOiB7XG4gICAgICAgICAgICBlbmNyeXB0ZWRVc2VyS2V5OiAnZW5jcnlwdGVkVXNlcktleScsXG4gICAgICAgICAgICBlbmNyeXB0ZWRCYWNrdXBLZXk6ICdlbmNyeXB0ZWRCYWNrdXBLZXknLFxuICAgICAgICAgICAgZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZTogJ2VuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQga2V5Y2hhaW5zLnJlY3JlYXRlTXBjKHBhcmFtcykuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnb3RwIGVycm9yJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHBhc3Njb2RlIHJlY292ZXJ5IGFwaSBjYWxsIGZhaWxzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBub2NrKGJnVXJsKS5wb3N0KCcvYXBpL3YxL3VzZXIvdW5sb2NrJykucmVwbHkoMjAwLCB7IG90cCB9KTtcbiAgICAgICAgbm9jayhiZ1VybClcbiAgICAgICAgICAucG9zdChgL2FwaS92Mi8ke2NvaW59L3dhbGxldC8ke3dhbGxldElkfS9wYXNzY29kZXJlY292ZXJ5YClcbiAgICAgICAgICAucmVwbHlXaXRoRXJyb3IoJ3Bhc3Njb2RlIHJlY292ZXJ5IGVycm9yJyk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIGNvaW4sXG4gICAgICAgICAgd2FsbGV0SWQsXG4gICAgICAgICAgb3RwLFxuICAgICAgICAgIHBhc3NwaHJhc2U6ICdwYXNzd29yZCcsXG4gICAgICAgICAgZW5jcnlwdGVkTWF0ZXJpYWw6IHtcbiAgICAgICAgICAgIGVuY3J5cHRlZFVzZXJLZXk6ICdlbmNyeXB0ZWRVc2VyS2V5JyxcbiAgICAgICAgICAgIGVuY3J5cHRlZEJhY2t1cEtleTogJ2VuY3J5cHRlZEJhY2t1cEtleScsXG4gICAgICAgICAgICBlbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlOiAnZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCBrZXljaGFpbnMucmVjcmVhdGVNcGMocGFyYW1zKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdwYXNzY29kZSByZWNvdmVyeSBlcnJvcicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBpZiBwYXNzY29kZSByZWNvdmVyeSBhcGkgY2FsbCByZXR1cm5zIGludmFsaWQgcmVjb3ZlcnkgaW5mbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbm9jayhiZ1VybCkucG9zdCgnL2FwaS92MS91c2VyL3VubG9jaycpLnJlcGx5KDIwMCwgeyBvdHAgfSk7XG4gICAgICAgIG5vY2soYmdVcmwpLnBvc3QoYC9hcGkvdjIvJHtjb2lufS93YWxsZXQvJHt3YWxsZXRJZH0vcGFzc2NvZGVyZWNvdmVyeWApLnJlcGx5KDIwMCwgeyByZWNvdmVyeUluZm86IHt9IH0pO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICBjb2luLFxuICAgICAgICAgIHdhbGxldElkLFxuICAgICAgICAgIG90cCxcbiAgICAgICAgICBwYXNzcGhyYXNlOiAncGFzc3dvcmQnLFxuICAgICAgICAgIGVuY3J5cHRlZE1hdGVyaWFsOiB7XG4gICAgICAgICAgICBlbmNyeXB0ZWRVc2VyS2V5OiAnZW5jcnlwdGVkVXNlcktleScsXG4gICAgICAgICAgICBlbmNyeXB0ZWRCYWNrdXBLZXk6ICdlbmNyeXB0ZWRCYWNrdXBLZXknLFxuICAgICAgICAgICAgZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZTogJ2VuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQga2V5Y2hhaW5zLnJlY3JlYXRlTXBjKHBhcmFtcykuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnZmFpbGVkIHRvIGdldCByZWNvdmVyeSBpbmZvJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBjYWxsIGNyZWF0ZU1wYyB3aXRoIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5vY2soYmdVcmwpLnBvc3QoJy9hcGkvdjEvdXNlci91bmxvY2snKS5yZXBseSgyMDAsIHsgb3RwIH0pO1xuICAgICAgICBub2NrKGJnVXJsKVxuICAgICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7Y29pbn0vd2FsbGV0LyR7d2FsbGV0SWR9L3Bhc3Njb2RlcmVjb3ZlcnlgKVxuICAgICAgICAgIC5yZXBseSgyMDAsIHsgcmVjb3ZlcnlJbmZvOiB7IHBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6ICcxMjMnIH0gfSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIGNvaW4sXG4gICAgICAgICAgd2FsbGV0SWQ6ICd3YWxsZXRJZCcsXG4gICAgICAgICAgb3RwLFxuICAgICAgICAgIHBhc3NwaHJhc2U6ICdwYXNzd29yZCcsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UnLFxuICAgICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogJ29yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZScsXG4gICAgICAgICAgZW5jcnlwdGVkTWF0ZXJpYWw6IHtcbiAgICAgICAgICAgIGVuY3J5cHRlZFVzZXJLZXk6ICdlbmNyeXB0ZWRVc2VyS2V5JyxcbiAgICAgICAgICAgIGVuY3J5cHRlZEJhY2t1cEtleTogJ2VuY3J5cHRlZEJhY2t1cEtleScsXG4gICAgICAgICAgICBlbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlOiAnZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY3JlYXRlTXBjU3R1YiA9IHNpbm9uLnN0dWIoa2V5Y2hhaW5zLCAnY3JlYXRlTXBjJykucmVzb2x2ZXMoKTtcbiAgICAgICAgYXdhaXQga2V5Y2hhaW5zLnJlY3JlYXRlTXBjKHBhcmFtcyk7XG5cbiAgICAgICAgYXNzZXJ0Lm9rKFxuICAgICAgICAgIGNyZWF0ZU1wY1N0dWIuY2FsbGVkT25jZVdpdGgoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgICAgIHJldHJvZml0OiB7XG4gICAgICAgICAgICAgIGRlY3J5cHRlZFVzZXJLZXk6IGRlY3J5cHRSZXN1bHQsXG4gICAgICAgICAgICAgIGRlY3J5cHRlZEJhY2t1cEtleTogZGVjcnlwdFJlc3VsdCxcbiAgICAgICAgICAgICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXRJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXIoZnVuY3Rpb24gYWZ0ZXJVcGRhdGVQYXNzd29yZCgpIHtcbiAgICAgIG5vY2sucGVuZGluZ01vY2tzKCkuc2hvdWxkLmJlLmVtcHR5KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDcmVhdGUgQml0R28gS2V5IGZyb20gT1ZDIEpTT04nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ1BhcnNlcyB0aGUgT1ZDIEpTT04gZmlsZSBwcm9wZXJseSBhbmQgY3JlYXRlcyB0aGUgbmV4dCBpbnB1dCBmb3IgT1ZDJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0R29LZXlSZXN1bHQgPSB7XG4gICAgICAgIGlkOiAnNjQyMWViNzU1ZmVhOWUwMDA2YzJjMDQwMDcyZjc0YmInLFxuICAgICAgICBjb21tb25LZXljaGFpbjogJzEyMycsXG4gICAgICAgIHdhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3M6ICcxMjMnLFxuICAgICAgICB2ZXJpZmllZFZzc1Byb29mOiB0cnVlLFxuICAgICAgICBrZXlTaGFyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcm9tOiAnYml0Z28nLFxuICAgICAgICAgICAgdG86ICd1c2VyJyxcbiAgICAgICAgICAgIHB1YmxpY1NoYXJlOiAnY2NjJyxcbiAgICAgICAgICAgIHByaXZhdGVTaGFyZTogJ2NjYyBwcml2YXRlJyxcbiAgICAgICAgICAgIHBhaWxsaWVyUHVibGljS2V5OiAnY2NjIHBhaWxsaWVyJyxcbiAgICAgICAgICAgIHZzc1Byb29mOiAnY2NjIHZzcyBwcm9vZicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcm9tOiAnYml0Z28nLFxuICAgICAgICAgICAgdG86ICdiYWNrdXAnLFxuICAgICAgICAgICAgcHVibGljU2hhcmU6ICdmZmYnLFxuICAgICAgICAgICAgcHJpdmF0ZVNoYXJlOiAnZmZmIHByaXZhdGUnLFxuICAgICAgICAgICAgcGFpbGxpZXJQdWJsaWNLZXk6ICdmZmYgcGFpbGxpZXInLFxuICAgICAgICAgICAgdnNzUHJvb2Y6ICdmZmYgdnNzIHByb29mJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgIC5wb3N0KCcvYXBpL3YyL3Rzb2wva2V5JywgXy5tYXRjaGVzKHsgc291cmNlOiAnYml0Z28nLCBrZXlUeXBlOiAndHNzJyB9KSlcbiAgICAgICAgLnJlcGx5KDIwMCwgYml0R29LZXlSZXN1bHQpO1xuXG4gICAgICBjb25zdCBvdmNPdXRwdXRKc29uID0ge1xuICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgY29pbjogJ3NvbCcsXG4gICAgICAgIHN0YXRlOiAxLFxuICAgICAgICBvdmM6IHtcbiAgICAgICAgICAxOiB7XG4gICAgICAgICAgICBncGdQdWJLZXk6XG4gICAgICAgICAgICAgICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG5cXG54azhFWkJzcTlSTUZLNEVFQUFvQ0F3UmdEcGdtMWJwdFJUNXlMT01hZGNHQUh1dmt4SVNMOC8zeFB5L0RcXG5ZQSsxTmdCcUlGSy8zT09YeHA3M1R2ODZidDFkZ0g3T0QxQUNPMG1WWEFvWDVFYVZ6V1p2ZG1NdE1TMTFcXG5jMlZ5TFdSbU1qUXdPV1kwTldOaE1UWm1OVFUzT0dOa016QXhNeUE4YjNaakxURXRkWE5sY2kxa1pqSTBcXG5NRGxtTkRWallURTJaalUxTnpoalpETXdNVE5BWkdZeU5EQTVaalExWTJFeE5tWTFOVGM0WTJRek1ERXpcXG5MbU52YlQ3Q2pBUVFFd2dBSFFVQ1pCc3E5UVFMQ1FjSUF4VUlDZ1FXQUFJQkFoa0JBaHNEQWg0QkFDRUpcXG5FT1VlQzdRckdMKzJGaUVFak42dlBVRlJ3ZVZ0REtGWjVSNEx0Q3NZdjdaN29BRUF2TkthSnJUSXMza3lcXG5ieGprVWljc3V4T3lBMm9XR2FySkg2VEdsV0Y2V0Q4QS8zRUllWnpQS1NMYVcrM2VucGJDUGlVOFJWRHBcXG5DNnlvNk5NQXFLcDRYbHlRemxNRVpCc3E5UklGSzRFRUFBb0NBd1FXbFdQTk1wazNhZkV6ZmdHMHhGZzRcXG5DRWpZN2ZHTzM1bjQ3blo0cXhqRVh6MlhONEkyM3hGTWl3WmJYYnB0RFhscW03VzlaQUhLaTg5MmgrWXRcXG5VNEI2QXdFSUI4SjRCQmdUQ0FBSkJRSmtHeXIxQWhzTUFDRUpFT1VlQzdRckdMKzJGaUVFak42dlBVRlJcXG53ZVZ0REtGWjVSNEx0Q3NZdjdZcVp3RDhETFJ1bmVCMEhFekJDeXJFNFlMK1VIYW9mb0hRWDErblJoMGpcXG44MnFhRHpBQS9pM1UxU29FSWkzMllNcm9yTkc1MHZiNHZhRVBiYlltZmdsYitKUTFZeDdvXFxuPXZqZ2xcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIG92Y1RvQml0Z29TaGFyZToge1xuICAgICAgICAgICAgICBwdWJsaWNTaGFyZTpcbiAgICAgICAgICAgICAgICAnMDdiZmJiMDUyYTFmNGIxMDZiMzE1YmQ1YTlkNmE3MTYwNDY1MzI4OWY4NjEzMjBkOTgwMTg4MWU5NTJmODU1MDc1M2M4OTUxMWEzNjBlM2I1OTlkOWYyMzlhOGQzNmE0OTU2NDM3ZWQwYjE1MjE4MGUyMmNiOTRmYjA4ZmRjODEnLFxuICAgICAgICAgICAgICBwcml2YXRlU2hhcmU6XG4gICAgICAgICAgICAgICAgJy0tLS0tQkVHSU4gUEdQIE1FU1NBR0UtLS0tLVxcblxcbndYNERVUThYaEdWR2NUSVNBZ01FZC93US9BaHdJUnNTZi82aUh3bUhLdkVZQXdmYUx0VFFvdFM2QndabVxcbmFYMDBUN0x1bUdJck5aekJnY2dnQktNbCs4T21vbThtWDVzUDhGVUU0NTFpWmpCbVhsa3BIbHBBcXNrU1xcbkVpNVNmamxzVDMxdXRvTGFCTEE3TmpOU215WUhJaXlmaDZZbndmVjVVNzJrNmhoZnB1RFNzUUd5OFl4cFxcbk0yZFZsTjR1b08zMXpnUVBmK2ZnSmtadkFQd3ZqWUxCTDRPOGhzMjFIR2YwVnZHOTlicms0eGxGVlJod1xcblFudVBwTTUxR09zNHZVdGJMTlNZbkF1aFU0UmVYd3dEVjlYdTBNWEFqZlFNazJFM3dRTEdRKzgydXYyQlxcbjFoUEQ5bkRIVHRBZFdyWGQ2WmpYRnJHNE1mMk1RQnh5U0Z2VlNuRmk2eVN0amZaZWlLY0Q1VmczOFBqR1xcbldnMU81TjMvcGFxOThIZkgwUTRxTktHWmxqd28zb0VRWnpsWW0ya1ZuSTBQVUxvTVlnPT1cXG49b3ZBeFxcbi0tLS0tRU5EIFBHUCBNRVNTQUdFLS0tLS1cXG4nLFxuICAgICAgICAgICAgICB2c3NQcm9vZjogJ2JlODE5OGMyY2VmOTRjYjM4MWFhOGFhOTI3N2EwYTQ2YmE1YTU0YjBhYzk5MzAwMzRiNGFmNjZiMWI4MDUyMzQnLFxuICAgICAgICAgICAgICBpOiAzLFxuICAgICAgICAgICAgICBqOiAxLFxuICAgICAgICAgICAgICB1U2lnOiAnLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuXFxueGs4RVpCc3E5Uk1GSzRFRUFBb0NBd1JnRHBnbTFicHRSVDV5TE9NYWRjR0FIdXZreElTTDgvM3hQeS9EXFxuWUErMU5nQnFJRksvM09PWHhwNzNUdjg2YnQxZGdIN09EMUFDTzBtVlhBb1g1RWFWeldadmRtTXRNUzExXFxuYzJWeUxXUm1NalF3T1dZME5XTmhNVFptTlRVM09HTmtNekF4TXlBOGIzWmpMVEV0ZFhObGNpMWtaakkwXFxuTURsbU5EVmpZVEUyWmpVMU56aGpaRE13TVROQVpHWXlOREE1WmpRMVkyRXhObVkxTlRjNFkyUXpNREV6XFxuTG1OdmJUN0NqQVFRRXdnQUhRVUNaQnNxOVFRTENRY0lBeFVJQ2dRV0FBSUJBaGtCQWhzREFoNEJBQ0VKXFxuRU9VZUM3UXJHTCsyRmlFRWpONnZQVUZSd2VWdERLRlo1UjRMdENzWXY3WjdvQUVBdk5LYUpyVElzM2t5XFxuYnhqa1VpY3N1eE95QTJvV0dhckpINlRHbFdGNldEOEEvM0VJZVp6UEtTTGFXKzNlbnBiQ1BpVThSVkRwXFxuQzZ5bzZOTUFxS3A0WGx5UXpsTUVaQnNxOVJJRks0RUVBQW9DQXdRV2xXUE5NcGszYWZFemZnRzB4Rmc0XFxuQ0VqWTdmR08zNW40N25aNHF4akVYejJYTjRJMjN4Rk1pd1piWGJwdERYbHFtN1c5WkFIS2k4OTJoK1l0XFxuVTRCNkF3RUlCOEo0QkJnVENBQUpCUUprR3lyMUFoc01BQ0VKRU9VZUM3UXJHTCsyRmlFRWpONnZQVUZSXFxud2VWdERLRlo1UjRMdENzWXY3WXFad0Q4RExSdW5lQjBIRXpCQ3lyRTRZTCtVSGFvZm9IUVgxK25SaDBqXFxuODJxYUR6QUEvaTNVMVNvRUlpMzJZTXJvck5HNTB2YjR2YUVQYmJZbWZnbGIrSlExWXg3b3pqTUVaQnNxXFxuOVJZSkt3WUJCQUhhUnc4QkFRZEFTMTUzNExkQ0M2MEFTcEVnbkVCQzhwV1BTT1dXQkxYeVdhQmhFT1cyXFxuL2lqQ2VBUVlFd2dBQ1FVQ1pCc3E5UUliSUFBaENSRGxIZ3UwS3hpL3RoWWhCSXplcnoxQlVjSGxiUXloXFxuV2VVZUM3UXJHTCsyRlVZQS9BZ01VNFY3QzdJLzVId0s3M21jdGFHWE5kZlZyL211Uk1OT0dXL0NBeFZMXFxuQVA5S2FCcjk1bzMyb0VONWVvN3RXRkJ5b09DQ2s5Sk1qczM2Q3E3bytzUjMxQT09XFxuPWVaM0JcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAyOiB7XG4gICAgICAgICAgICBncGdQdWJLZXk6XG4gICAgICAgICAgICAgICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG5cXG54azhFWkJzck5CTUZLNEVFQUFvQ0F3VDJ4WHYvbUcvZGFQZEtHRC9mSElVRUUyWnRjSytuanRDWnRNRXJcXG5rSXVibVV3ZTNEajgraFF4dDNTS2FUeFFidUQrV2FMU2o5ODZRWVVyNFp3NFQrVzN6V3B2ZG1NdE1pMWlcXG5ZV05yZFhBdE5UUTNZbUprWmpNd09HTXhaVFl4WTJRNVpHSTRObVU0SUR4dmRtTXRNaTFpWVdOcmRYQXRcXG5OVFEzWW1Ka1pqTXdPR014WlRZeFkyUTVaR0k0Tm1VNFFEVTBOMkppWkdZek1EaGpNV1UyTVdOa09XUmlcXG5PRFpsT0M1amIyMCt3b3dFRUJNSUFCMEZBbVFiS3pRRUN3a0hDQU1WQ0FvRUZnQUNBUUlaQVFJYkF3SWVcXG5BUUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBTa0ZPZTNhamJxb3VlcllDVGtiWktUdGx4dFlCQUxMSUJuQWFcXG40QVM3N1h2WG1tem5OQ1dPL0hOdURQRDJ1Z1JxVmhxVTRTeG1BUURtYTE0QVB1TU5TVnlpMTd4b21aaldcXG4wbmltdGFNSUJqYzBBNE1YRTZHNFhjNVRCR1FiS3pRU0JTdUJCQUFLQWdNRVVIb1FEWTk4eThDQVZvdXVcXG55NHkzUTJRbkJwblVCSy8wUEVMVjdWQU5YZDlsWTdDU2h5b2dKU2NnUGxpVW05N0F1OUZDMTd2cVphMUJcXG41YkJNSkFkWFZ3TUJDQWZDZUFRWUV3Z0FDUVVDWkJzck5BSWJEQUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBcXG5Ta0ZPZTNhamJxb3VlcllDVGtiWktUdGxSNXdBLzN6T0ZUU2VYWFJSZW1YbDNoWTEwc3B4YWJFNE8ySjhcXG5aRDJWUmZqYkRwWmpBUURXZzFXK2pQYk0ySHRpa2QxTjAxVit6d2VORGhKRUg2NXIwUXI4QmxYaDJ3PT1cXG49RXR0dVxcbi0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG4nLFxuICAgICAgICAgICAgb3ZjVG9CaXRnb1NoYXJlOiB7XG4gICAgICAgICAgICAgIHB1YmxpY1NoYXJlOlxuICAgICAgICAgICAgICAgICdlY2Y5NWU5YmE2ZjAyYzBiYzRjMmFiMjU0NTY1ZDIxYTE1NjIwNTljOGExYWI3MGQyODZmYTA0YWUyYzUxMWUwNDkxNDEwYjZkNmZhOGFiMjJlNjkxYmVkNzkzOGE3YWRhYWJmYThkOWQ1OWFhYjljYzJjMDc4Y2QzN2RkZTAxYicsXG4gICAgICAgICAgICAgIHByaXZhdGVTaGFyZTpcbiAgICAgICAgICAgICAgICAnLS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tXFxuXFxud1g0RFVROFhoR1ZHY1RJU0FnTUVlMW5ZTnY5RG5IbDhIWDhqTnMzcmVHczVuUFQyYk56R01DRkwwTjNQXFxuS0x3R2Q4REJrREpJTXBvQ2xhQVMvSFRVVFBUUnpqNFUxR1NoVjc5SStiYmZUREJWNnVoeWZaN2E4OGRWXFxuUkRUWGw2cmNoRmwvZm13TG9YbnFIK0JEUEVYeXRwQXZLd0RyQWc1NVQvSDdhb3A1UWJmU3NRRXJFdjdYXFxuVHBUTEhISGZsRUVRTDYycDFSbm5xMmtLdndKSzdUWTFnNVJ0UGdZWEg2R0VzMzNETHVsUGVVczhVa0txXFxuVFBMZjIrMUtDTFl5ek13bVNpOEtFQzhISmIwdkFrWFpBbFoxK0RvWjJQZmlJSmNWbno3YTNvbWppUDc3XFxuaG1DOHBoVGNKNzE4VXhJQjA5Zjh1aWMwL2ZNN0ZOdTBKSEZnUkRBNjl6emVGWW5aYzJYTlFnNWhzL2RaXFxuWjhBaXRQNHJuYUFmcHJzcTRyQUVFL2MzVHJtOXR6UUhaUENxci8yczRMbHV5VU1WSnc9PVxcbj1JSlpIXFxuLS0tLS1FTkQgUEdQIE1FU1NBR0UtLS0tLVxcbicsXG4gICAgICAgICAgICAgIHZzc1Byb29mOiAnMzA5ZDJmZWYyMjcyYWQzMTM3NTk1NGI5OWE4NjI3NDJmMjJkODAyM2VlZjk4NTViOGFlMjZlYTg0ZTA4YmY1ZScsXG4gICAgICAgICAgICAgIGk6IDMsXG4gICAgICAgICAgICAgIGo6IDIsXG4gICAgICAgICAgICAgIHVTaWc6ICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG5cXG54azhFWkJzck5CTUZLNEVFQUFvQ0F3VDJ4WHYvbUcvZGFQZEtHRC9mSElVRUUyWnRjSytuanRDWnRNRXJcXG5rSXVibVV3ZTNEajgraFF4dDNTS2FUeFFidUQrV2FMU2o5ODZRWVVyNFp3NFQrVzN6V3B2ZG1NdE1pMWlcXG5ZV05yZFhBdE5UUTNZbUprWmpNd09HTXhaVFl4WTJRNVpHSTRObVU0SUR4dmRtTXRNaTFpWVdOcmRYQXRcXG5OVFEzWW1Ka1pqTXdPR014WlRZeFkyUTVaR0k0Tm1VNFFEVTBOMkppWkdZek1EaGpNV1UyTVdOa09XUmlcXG5PRFpsT0M1amIyMCt3b3dFRUJNSUFCMEZBbVFiS3pRRUN3a0hDQU1WQ0FvRUZnQUNBUUlaQVFJYkF3SWVcXG5BUUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBTa0ZPZTNhamJxb3VlcllDVGtiWktUdGx4dFlCQUxMSUJuQWFcXG40QVM3N1h2WG1tem5OQ1dPL0hOdURQRDJ1Z1JxVmhxVTRTeG1BUURtYTE0QVB1TU5TVnlpMTd4b21aaldcXG4wbmltdGFNSUJqYzBBNE1YRTZHNFhjNVRCR1FiS3pRU0JTdUJCQUFLQWdNRVVIb1FEWTk4eThDQVZvdXVcXG55NHkzUTJRbkJwblVCSy8wUEVMVjdWQU5YZDlsWTdDU2h5b2dKU2NnUGxpVW05N0F1OUZDMTd2cVphMUJcXG41YkJNSkFkWFZ3TUJDQWZDZUFRWUV3Z0FDUVVDWkJzck5BSWJEQUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBcXG5Ta0ZPZTNhamJxb3VlcllDVGtiWktUdGxSNXdBLzN6T0ZUU2VYWFJSZW1YbDNoWTEwc3B4YWJFNE8ySjhcXG5aRDJWUmZqYkRwWmpBUURXZzFXK2pQYk0ySHRpa2QxTjAxVit6d2VORGhKRUg2NXIwUXI4QmxYaDI4NHpcXG5CR1FiS3pRV0NTc0dBUVFCMmtjUEFRRUhRSVZUbWx0OGEvZmpKQ1k5VXlQOEo1MWVUUFg5UE1SRjMvSHJcXG5CWXd0Zk9aWXduZ0VHQk1JQUFrRkFtUWJLelFDR3lBQUlRa1F0Z0pPUnRrcE8yVVdJUVMwNlVwQlRudDJcXG5vMjZxTG5xMkFrNUcyU2s3WmN0aEFRRDRlazNhcVVERWJoZlJIb2xtNGpGaElQSWJiOWhVSnd1QlIwUjRcXG4rZ3ZhZUFFQWs4dWs1Y0VBQ2VxbXBkRUY1Mm9HeDdqbUdDb1g3M0FJSUxZVmNmOWlNa0k9XFxuPTkySGZcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmNUb092Y1NoYXJlOiB7XG4gICAgICAgICAgICAgIHB1YmxpY1NoYXJlOlxuICAgICAgICAgICAgICAgICdlY2Y5NWU5YmE2ZjAyYzBiYzRjMmFiMjU0NTY1ZDIxYTE1NjIwNTljOGExYWI3MGQyODZmYTA0YWUyYzUxMWUwNDkxNDEwYjZkNmZhOGFiMjJlNjkxYmVkNzkzOGE3YWRhYWJmYThkOWQ1OWFhYjljYzJjMDc4Y2QzN2RkZTAxYicsXG4gICAgICAgICAgICAgIHByaXZhdGVTaGFyZTpcbiAgICAgICAgICAgICAgICAnLS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tXFxuXFxud1g0RCtGM3ZJOTYyelZNU0FnTUVOeTJYOXhESU9tMWd3T2ZNZEwvMXZaamVNVy9pbGUvZjJkUklQMkdWXFxudjR3NjBLOTIrbUhJOXlvb1UxVlQ3N2paclZPY05LNDFERk5DRi9mdW9VVStWekJPTjBJMWhIeVhtMlFKXFxud0wrbk5kdkFYd1J2N25TRkQzQUJVbVJZZEc3MUFGSVdqVzJMKzFDMmh4cHNObG1keGZmU3NRSEhUOXVQXFxuQk5wRllnUU43N09VeGNncndlU1ZyUHllcjFyQ1E4bytRbm9LMi9oSXg5UGxKWmtjbDN1d0Y2VHBCdGpzXFxucXZSeFRob21vSHlvMGhKSEcwdm1JNDJHcTV1MHRjU2VVOTAyZWZwQ0RhZUpoUFZPaXFJU29KOTZ3bjByXFxuRkIzbFlMU2ZsT3BDTEFFN25zWkpSb1hBNmFrVTd4TUNNTkErK2Q0dHY2cDk4RlErTVo2ZTl4NmtpU3cxXFxuTStWV2orUHZOMWR0UThmTll3cEpmN0tCZkQxdzZJU01GRG1ld2tERTdpQk9YRjZGTHc9PVxcbj0rM1ljXFxuLS0tLS1FTkQgUEdQIE1FU1NBR0UtLS0tLVxcbicsXG4gICAgICAgICAgICAgIHZzc1Byb29mOiAnMzA5ZDJmZWYyMjcyYWQzMTM3NTk1NGI5OWE4NjI3NDJmMjJkODAyM2VlZjk4NTViOGFlMjZlYTg0ZTA4YmY1ZScsXG4gICAgICAgICAgICAgIGk6IDEsXG4gICAgICAgICAgICAgIGo6IDIsXG4gICAgICAgICAgICAgIHVTaWc6ICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG5cXG54azhFWkJzck5CTUZLNEVFQUFvQ0F3VDJ4WHYvbUcvZGFQZEtHRC9mSElVRUUyWnRjSytuanRDWnRNRXJcXG5rSXVibVV3ZTNEajgraFF4dDNTS2FUeFFidUQrV2FMU2o5ODZRWVVyNFp3NFQrVzN6V3B2ZG1NdE1pMWlcXG5ZV05yZFhBdE5UUTNZbUprWmpNd09HTXhaVFl4WTJRNVpHSTRObVU0SUR4dmRtTXRNaTFpWVdOcmRYQXRcXG5OVFEzWW1Ka1pqTXdPR014WlRZeFkyUTVaR0k0Tm1VNFFEVTBOMkppWkdZek1EaGpNV1UyTVdOa09XUmlcXG5PRFpsT0M1amIyMCt3b3dFRUJNSUFCMEZBbVFiS3pRRUN3a0hDQU1WQ0FvRUZnQUNBUUlaQVFJYkF3SWVcXG5BUUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBTa0ZPZTNhamJxb3VlcllDVGtiWktUdGx4dFlCQUxMSUJuQWFcXG40QVM3N1h2WG1tem5OQ1dPL0hOdURQRDJ1Z1JxVmhxVTRTeG1BUURtYTE0QVB1TU5TVnlpMTd4b21aaldcXG4wbmltdGFNSUJqYzBBNE1YRTZHNFhjNVRCR1FiS3pRU0JTdUJCQUFLQWdNRVVIb1FEWTk4eThDQVZvdXVcXG55NHkzUTJRbkJwblVCSy8wUEVMVjdWQU5YZDlsWTdDU2h5b2dKU2NnUGxpVW05N0F1OUZDMTd2cVphMUJcXG41YkJNSkFkWFZ3TUJDQWZDZUFRWUV3Z0FDUVVDWkJzck5BSWJEQUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBcXG5Ta0ZPZTNhamJxb3VlcllDVGtiWktUdGxSNXdBLzN6T0ZUU2VYWFJSZW1YbDNoWTEwc3B4YWJFNE8ySjhcXG5aRDJWUmZqYkRwWmpBUURXZzFXK2pQYk0ySHRpa2QxTjAxVit6d2VORGhKRUg2NXIwUXI4QmxYaDI4NHpcXG5CR1FiS3pRV0NTc0dBUVFCMmtjUEFRRUhRTlZHZzB2UHNmSzF5SmpGdURZQjhUajdDUVJIS0dBVkVEY2pcXG5oL1FJcXIwS3duZ0VHQk1JQUFrRkFtUWJLelFDR3lBQUlRa1F0Z0pPUnRrcE8yVVdJUVMwNlVwQlRudDJcXG5vMjZxTG5xMkFrNUcyU2s3WlM5b0FRQ2UyekpENUl0VzJHRWdBaXRuWStOckxCamJYSTYrTFkyOUdqUmFcXG5mNnlGVFFEL2NQMEUxRGxlcVhNamdmUitld3Q2cXVWRk1aZWJocjN0QnIvSDBadi85RUE9XFxuPThhaStcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBleHBlY3RlZEJpdEdvT3V0cHV0ID0ge1xuICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAuLi5vdmNPdXRwdXRKc29uLFxuICAgICAgICAgIHN0YXRlOiAyLFxuICAgICAgICAgIHBsYXRmb3JtOiB7XG4gICAgICAgICAgICBjb21tb25LZXljaGFpbjogYml0R29LZXlSZXN1bHQuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgICAgICB3YWxsZXRHcGdQdWJLZXlTaWdzOiBiaXRHb0tleVJlc3VsdC53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzLFxuICAgICAgICAgICAgb3ZjOiB7XG4gICAgICAgICAgICAgIDE6IHtcbiAgICAgICAgICAgICAgICBiaXRnb1RvT3ZjU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgIGk6IDEsXG4gICAgICAgICAgICAgICAgICBqOiAzLFxuICAgICAgICAgICAgICAgICAgcHVibGljU2hhcmU6IGJpdEdvS2V5UmVzdWx0LmtleVNoYXJlc1swXS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICAgICAgICAgIHByaXZhdGVTaGFyZTogYml0R29LZXlSZXN1bHQua2V5U2hhcmVzWzBdLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICAgICAgICAgIHBhaWxsaWVyUHVibGljS2V5OiBiaXRHb0tleVJlc3VsdC5rZXlTaGFyZXNbMF0ucGFpbGxpZXJQdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB2c3NQcm9vZjogYml0R29LZXlSZXN1bHQua2V5U2hhcmVzWzBdLnZzc1Byb29mLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIDI6IHtcbiAgICAgICAgICAgICAgICBiaXRnb1RvT3ZjU2hhcmU6IHtcbiAgICAgICAgICAgICAgICAgIGk6IDIsXG4gICAgICAgICAgICAgICAgICBqOiAzLFxuICAgICAgICAgICAgICAgICAgcHVibGljU2hhcmU6IGJpdEdvS2V5UmVzdWx0LmtleVNoYXJlc1sxXS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICAgICAgICAgIHByaXZhdGVTaGFyZTogYml0R29LZXlSZXN1bHQua2V5U2hhcmVzWzFdLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICAgICAgICAgIHBhaWxsaWVyUHVibGljS2V5OiBiaXRHb0tleVJlc3VsdC5rZXlTaGFyZXNbMV0ucGFpbGxpZXJQdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB2c3NQcm9vZjogYml0R29LZXlSZXN1bHQua2V5U2hhcmVzWzFdLnZzc1Byb29mLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgcGxhdGZvcm1PdXRwdXQgPSBhd2FpdCBiaXRnby5jb2luKCd0c29sJykua2V5Y2hhaW5zKCkuY3JlYXRlVHNzQml0R29LZXlGcm9tT3ZjU2hhcmVzKG92Y091dHB1dEpzb24pO1xuICAgICAgc2hvdWxkLmVxdWFsKHBsYXRmb3JtT3V0cHV0LmJpdEdvS2V5SWQsIGJpdEdvS2V5UmVzdWx0LmlkKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocGxhdGZvcm1PdXRwdXQuYml0R29PdXRwdXRKc29uRm9yT3ZjLCBleHBlY3RlZEJpdEdvT3V0cHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZmFpbCBpZiB0aGUgc3RhdGUgaXMgbm90IDEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvdmNPdXRwdXRKc29uID0ge1xuICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgY29pbjogJ3NvbCcsXG4gICAgICAgIHN0YXRlOiAwLFxuICAgICAgICBvdmM6IHtcbiAgICAgICAgICAxOiB7XG4gICAgICAgICAgICBncGdQdWJLZXk6XG4gICAgICAgICAgICAgICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG5cXG54azhFWkJzcTlSTUZLNEVFQUFvQ0F3UmdEcGdtMWJwdFJUNXlMT01hZGNHQUh1dmt4SVNMOC8zeFB5L0RcXG5ZQSsxTmdCcUlGSy8zT09YeHA3M1R2ODZidDFkZ0g3T0QxQUNPMG1WWEFvWDVFYVZ6V1p2ZG1NdE1TMTFcXG5jMlZ5TFdSbU1qUXdPV1kwTldOaE1UWm1OVFUzT0dOa016QXhNeUE4YjNaakxURXRkWE5sY2kxa1pqSTBcXG5NRGxtTkRWallURTJaalUxTnpoalpETXdNVE5BWkdZeU5EQTVaalExWTJFeE5tWTFOVGM0WTJRek1ERXpcXG5MbU52YlQ3Q2pBUVFFd2dBSFFVQ1pCc3E5UVFMQ1FjSUF4VUlDZ1FXQUFJQkFoa0JBaHNEQWg0QkFDRUpcXG5FT1VlQzdRckdMKzJGaUVFak42dlBVRlJ3ZVZ0REtGWjVSNEx0Q3NZdjdaN29BRUF2TkthSnJUSXMza3lcXG5ieGprVWljc3V4T3lBMm9XR2FySkg2VEdsV0Y2V0Q4QS8zRUllWnpQS1NMYVcrM2VucGJDUGlVOFJWRHBcXG5DNnlvNk5NQXFLcDRYbHlRemxNRVpCc3E5UklGSzRFRUFBb0NBd1FXbFdQTk1wazNhZkV6ZmdHMHhGZzRcXG5DRWpZN2ZHTzM1bjQ3blo0cXhqRVh6MlhONEkyM3hGTWl3WmJYYnB0RFhscW03VzlaQUhLaTg5MmgrWXRcXG5VNEI2QXdFSUI4SjRCQmdUQ0FBSkJRSmtHeXIxQWhzTUFDRUpFT1VlQzdRckdMKzJGaUVFak42dlBVRlJcXG53ZVZ0REtGWjVSNEx0Q3NZdjdZcVp3RDhETFJ1bmVCMEhFekJDeXJFNFlMK1VIYW9mb0hRWDErblJoMGpcXG44MnFhRHpBQS9pM1UxU29FSWkzMllNcm9yTkc1MHZiNHZhRVBiYlltZmdsYitKUTFZeDdvXFxuPXZqZ2xcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIG92Y1RvQml0Z29TaGFyZToge1xuICAgICAgICAgICAgICBwdWJsaWNTaGFyZTpcbiAgICAgICAgICAgICAgICAnMDdiZmJiMDUyYTFmNGIxMDZiMzE1YmQ1YTlkNmE3MTYwNDY1MzI4OWY4NjEzMjBkOTgwMTg4MWU5NTJmODU1MDc1M2M4OTUxMWEzNjBlM2I1OTlkOWYyMzlhOGQzNmE0OTU2NDM3ZWQwYjE1MjE4MGUyMmNiOTRmYjA4ZmRjODEnLFxuICAgICAgICAgICAgICBwcml2YXRlU2hhcmU6XG4gICAgICAgICAgICAgICAgJy0tLS0tQkVHSU4gUEdQIE1FU1NBR0UtLS0tLVxcblxcbndYNERVUThYaEdWR2NUSVNBZ01FZC93US9BaHdJUnNTZi82aUh3bUhLdkVZQXdmYUx0VFFvdFM2QndabVxcbmFYMDBUN0x1bUdJck5aekJnY2dnQktNbCs4T21vbThtWDVzUDhGVUU0NTFpWmpCbVhsa3BIbHBBcXNrU1xcbkVpNVNmamxzVDMxdXRvTGFCTEE3TmpOU215WUhJaXlmaDZZbndmVjVVNzJrNmhoZnB1RFNzUUd5OFl4cFxcbk0yZFZsTjR1b08zMXpnUVBmK2ZnSmtadkFQd3ZqWUxCTDRPOGhzMjFIR2YwVnZHOTlicms0eGxGVlJod1xcblFudVBwTTUxR09zNHZVdGJMTlNZbkF1aFU0UmVYd3dEVjlYdTBNWEFqZlFNazJFM3dRTEdRKzgydXYyQlxcbjFoUEQ5bkRIVHRBZFdyWGQ2WmpYRnJHNE1mMk1RQnh5U0Z2VlNuRmk2eVN0amZaZWlLY0Q1VmczOFBqR1xcbldnMU81TjMvcGFxOThIZkgwUTRxTktHWmxqd28zb0VRWnpsWW0ya1ZuSTBQVUxvTVlnPT1cXG49b3ZBeFxcbi0tLS0tRU5EIFBHUCBNRVNTQUdFLS0tLS1cXG4nLFxuICAgICAgICAgICAgICB2c3NQcm9vZjogJ2JlODE5OGMyY2VmOTRjYjM4MWFhOGFhOTI3N2EwYTQ2YmE1YTU0YjBhYzk5MzAwMzRiNGFmNjZiMWI4MDUyMzQnLFxuICAgICAgICAgICAgICBpOiAzLFxuICAgICAgICAgICAgICBqOiAxLFxuICAgICAgICAgICAgICB1U2lnOiAnLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuXFxueGs4RVpCc3E5Uk1GSzRFRUFBb0NBd1JnRHBnbTFicHRSVDV5TE9NYWRjR0FIdXZreElTTDgvM3hQeS9EXFxuWUErMU5nQnFJRksvM09PWHhwNzNUdjg2YnQxZGdIN09EMUFDTzBtVlhBb1g1RWFWeldadmRtTXRNUzExXFxuYzJWeUxXUm1NalF3T1dZME5XTmhNVFptTlRVM09HTmtNekF4TXlBOGIzWmpMVEV0ZFhObGNpMWtaakkwXFxuTURsbU5EVmpZVEUyWmpVMU56aGpaRE13TVROQVpHWXlOREE1WmpRMVkyRXhObVkxTlRjNFkyUXpNREV6XFxuTG1OdmJUN0NqQVFRRXdnQUhRVUNaQnNxOVFRTENRY0lBeFVJQ2dRV0FBSUJBaGtCQWhzREFoNEJBQ0VKXFxuRU9VZUM3UXJHTCsyRmlFRWpONnZQVUZSd2VWdERLRlo1UjRMdENzWXY3WjdvQUVBdk5LYUpyVElzM2t5XFxuYnhqa1VpY3N1eE95QTJvV0dhckpINlRHbFdGNldEOEEvM0VJZVp6UEtTTGFXKzNlbnBiQ1BpVThSVkRwXFxuQzZ5bzZOTUFxS3A0WGx5UXpsTUVaQnNxOVJJRks0RUVBQW9DQXdRV2xXUE5NcGszYWZFemZnRzB4Rmc0XFxuQ0VqWTdmR08zNW40N25aNHF4akVYejJYTjRJMjN4Rk1pd1piWGJwdERYbHFtN1c5WkFIS2k4OTJoK1l0XFxuVTRCNkF3RUlCOEo0QkJnVENBQUpCUUprR3lyMUFoc01BQ0VKRU9VZUM3UXJHTCsyRmlFRWpONnZQVUZSXFxud2VWdERLRlo1UjRMdENzWXY3WXFad0Q4RExSdW5lQjBIRXpCQ3lyRTRZTCtVSGFvZm9IUVgxK25SaDBqXFxuODJxYUR6QUEvaTNVMVNvRUlpMzJZTXJvck5HNTB2YjR2YUVQYmJZbWZnbGIrSlExWXg3b3pqTUVaQnNxXFxuOVJZSkt3WUJCQUhhUnc4QkFRZEFTMTUzNExkQ0M2MEFTcEVnbkVCQzhwV1BTT1dXQkxYeVdhQmhFT1cyXFxuL2lqQ2VBUVlFd2dBQ1FVQ1pCc3E5UUliSUFBaENSRGxIZ3UwS3hpL3RoWWhCSXplcnoxQlVjSGxiUXloXFxuV2VVZUM3UXJHTCsyRlVZQS9BZ01VNFY3QzdJLzVId0s3M21jdGFHWE5kZlZyL211Uk1OT0dXL0NBeFZMXFxuQVA5S2FCcjk1bzMyb0VONWVvN3RXRkJ5b09DQ2s5Sk1qczM2Q3E3bytzUjMxQT09XFxuPWVaM0JcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAyOiB7XG4gICAgICAgICAgICBncGdQdWJLZXk6XG4gICAgICAgICAgICAgICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG5cXG54azhFWkJzck5CTUZLNEVFQUFvQ0F3VDJ4WHYvbUcvZGFQZEtHRC9mSElVRUUyWnRjSytuanRDWnRNRXJcXG5rSXVibVV3ZTNEajgraFF4dDNTS2FUeFFidUQrV2FMU2o5ODZRWVVyNFp3NFQrVzN6V3B2ZG1NdE1pMWlcXG5ZV05yZFhBdE5UUTNZbUprWmpNd09HTXhaVFl4WTJRNVpHSTRObVU0SUR4dmRtTXRNaTFpWVdOcmRYQXRcXG5OVFEzWW1Ka1pqTXdPR014WlRZeFkyUTVaR0k0Tm1VNFFEVTBOMkppWkdZek1EaGpNV1UyTVdOa09XUmlcXG5PRFpsT0M1amIyMCt3b3dFRUJNSUFCMEZBbVFiS3pRRUN3a0hDQU1WQ0FvRUZnQUNBUUlaQVFJYkF3SWVcXG5BUUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBTa0ZPZTNhamJxb3VlcllDVGtiWktUdGx4dFlCQUxMSUJuQWFcXG40QVM3N1h2WG1tem5OQ1dPL0hOdURQRDJ1Z1JxVmhxVTRTeG1BUURtYTE0QVB1TU5TVnlpMTd4b21aaldcXG4wbmltdGFNSUJqYzBBNE1YRTZHNFhjNVRCR1FiS3pRU0JTdUJCQUFLQWdNRVVIb1FEWTk4eThDQVZvdXVcXG55NHkzUTJRbkJwblVCSy8wUEVMVjdWQU5YZDlsWTdDU2h5b2dKU2NnUGxpVW05N0F1OUZDMTd2cVphMUJcXG41YkJNSkFkWFZ3TUJDQWZDZUFRWUV3Z0FDUVVDWkJzck5BSWJEQUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBcXG5Ta0ZPZTNhamJxb3VlcllDVGtiWktUdGxSNXdBLzN6T0ZUU2VYWFJSZW1YbDNoWTEwc3B4YWJFNE8ySjhcXG5aRDJWUmZqYkRwWmpBUURXZzFXK2pQYk0ySHRpa2QxTjAxVit6d2VORGhKRUg2NXIwUXI4QmxYaDJ3PT1cXG49RXR0dVxcbi0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG4nLFxuICAgICAgICAgICAgb3ZjVG9CaXRnb1NoYXJlOiB7XG4gICAgICAgICAgICAgIHB1YmxpY1NoYXJlOlxuICAgICAgICAgICAgICAgICdlY2Y5NWU5YmE2ZjAyYzBiYzRjMmFiMjU0NTY1ZDIxYTE1NjIwNTljOGExYWI3MGQyODZmYTA0YWUyYzUxMWUwNDkxNDEwYjZkNmZhOGFiMjJlNjkxYmVkNzkzOGE3YWRhYWJmYThkOWQ1OWFhYjljYzJjMDc4Y2QzN2RkZTAxYicsXG4gICAgICAgICAgICAgIHByaXZhdGVTaGFyZTpcbiAgICAgICAgICAgICAgICAnLS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tXFxuXFxud1g0RFVROFhoR1ZHY1RJU0FnTUVlMW5ZTnY5RG5IbDhIWDhqTnMzcmVHczVuUFQyYk56R01DRkwwTjNQXFxuS0x3R2Q4REJrREpJTXBvQ2xhQVMvSFRVVFBUUnpqNFUxR1NoVjc5SStiYmZUREJWNnVoeWZaN2E4OGRWXFxuUkRUWGw2cmNoRmwvZm13TG9YbnFIK0JEUEVYeXRwQXZLd0RyQWc1NVQvSDdhb3A1UWJmU3NRRXJFdjdYXFxuVHBUTEhISGZsRUVRTDYycDFSbm5xMmtLdndKSzdUWTFnNVJ0UGdZWEg2R0VzMzNETHVsUGVVczhVa0txXFxuVFBMZjIrMUtDTFl5ek13bVNpOEtFQzhISmIwdkFrWFpBbFoxK0RvWjJQZmlJSmNWbno3YTNvbWppUDc3XFxuaG1DOHBoVGNKNzE4VXhJQjA5Zjh1aWMwL2ZNN0ZOdTBKSEZnUkRBNjl6emVGWW5aYzJYTlFnNWhzL2RaXFxuWjhBaXRQNHJuYUFmcHJzcTRyQUVFL2MzVHJtOXR6UUhaUENxci8yczRMbHV5VU1WSnc9PVxcbj1JSlpIXFxuLS0tLS1FTkQgUEdQIE1FU1NBR0UtLS0tLVxcbicsXG4gICAgICAgICAgICAgIHZzc1Byb29mOiAnMzA5ZDJmZWYyMjcyYWQzMTM3NTk1NGI5OWE4NjI3NDJmMjJkODAyM2VlZjk4NTViOGFlMjZlYTg0ZTA4YmY1ZScsXG4gICAgICAgICAgICAgIGk6IDMsXG4gICAgICAgICAgICAgIGo6IDIsXG4gICAgICAgICAgICAgIHVTaWc6ICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG5cXG54azhFWkJzck5CTUZLNEVFQUFvQ0F3VDJ4WHYvbUcvZGFQZEtHRC9mSElVRUUyWnRjSytuanRDWnRNRXJcXG5rSXVibVV3ZTNEajgraFF4dDNTS2FUeFFidUQrV2FMU2o5ODZRWVVyNFp3NFQrVzN6V3B2ZG1NdE1pMWlcXG5ZV05yZFhBdE5UUTNZbUprWmpNd09HTXhaVFl4WTJRNVpHSTRObVU0SUR4dmRtTXRNaTFpWVdOcmRYQXRcXG5OVFEzWW1Ka1pqTXdPR014WlRZeFkyUTVaR0k0Tm1VNFFEVTBOMkppWkdZek1EaGpNV1UyTVdOa09XUmlcXG5PRFpsT0M1amIyMCt3b3dFRUJNSUFCMEZBbVFiS3pRRUN3a0hDQU1WQ0FvRUZnQUNBUUlaQVFJYkF3SWVcXG5BUUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBTa0ZPZTNhamJxb3VlcllDVGtiWktUdGx4dFlCQUxMSUJuQWFcXG40QVM3N1h2WG1tem5OQ1dPL0hOdURQRDJ1Z1JxVmhxVTRTeG1BUURtYTE0QVB1TU5TVnlpMTd4b21aaldcXG4wbmltdGFNSUJqYzBBNE1YRTZHNFhjNVRCR1FiS3pRU0JTdUJCQUFLQWdNRVVIb1FEWTk4eThDQVZvdXVcXG55NHkzUTJRbkJwblVCSy8wUEVMVjdWQU5YZDlsWTdDU2h5b2dKU2NnUGxpVW05N0F1OUZDMTd2cVphMUJcXG41YkJNSkFkWFZ3TUJDQWZDZUFRWUV3Z0FDUVVDWkJzck5BSWJEQUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBcXG5Ta0ZPZTNhamJxb3VlcllDVGtiWktUdGxSNXdBLzN6T0ZUU2VYWFJSZW1YbDNoWTEwc3B4YWJFNE8ySjhcXG5aRDJWUmZqYkRwWmpBUURXZzFXK2pQYk0ySHRpa2QxTjAxVit6d2VORGhKRUg2NXIwUXI4QmxYaDI4NHpcXG5CR1FiS3pRV0NTc0dBUVFCMmtjUEFRRUhRSVZUbWx0OGEvZmpKQ1k5VXlQOEo1MWVUUFg5UE1SRjMvSHJcXG5CWXd0Zk9aWXduZ0VHQk1JQUFrRkFtUWJLelFDR3lBQUlRa1F0Z0pPUnRrcE8yVVdJUVMwNlVwQlRudDJcXG5vMjZxTG5xMkFrNUcyU2s3WmN0aEFRRDRlazNhcVVERWJoZlJIb2xtNGpGaElQSWJiOWhVSnd1QlIwUjRcXG4rZ3ZhZUFFQWs4dWs1Y0VBQ2VxbXBkRUY1Mm9HeDdqbUdDb1g3M0FJSUxZVmNmOWlNa0k9XFxuPTkySGZcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmNUb092Y1NoYXJlOiB7XG4gICAgICAgICAgICAgIHB1YmxpY1NoYXJlOlxuICAgICAgICAgICAgICAgICdlY2Y5NWU5YmE2ZjAyYzBiYzRjMmFiMjU0NTY1ZDIxYTE1NjIwNTljOGExYWI3MGQyODZmYTA0YWUyYzUxMWUwNDkxNDEwYjZkNmZhOGFiMjJlNjkxYmVkNzkzOGE3YWRhYWJmYThkOWQ1OWFhYjljYzJjMDc4Y2QzN2RkZTAxYicsXG4gICAgICAgICAgICAgIHByaXZhdGVTaGFyZTpcbiAgICAgICAgICAgICAgICAnLS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tXFxuXFxud1g0RCtGM3ZJOTYyelZNU0FnTUVOeTJYOXhESU9tMWd3T2ZNZEwvMXZaamVNVy9pbGUvZjJkUklQMkdWXFxudjR3NjBLOTIrbUhJOXlvb1UxVlQ3N2paclZPY05LNDFERk5DRi9mdW9VVStWekJPTjBJMWhIeVhtMlFKXFxud0wrbk5kdkFYd1J2N25TRkQzQUJVbVJZZEc3MUFGSVdqVzJMKzFDMmh4cHNObG1keGZmU3NRSEhUOXVQXFxuQk5wRllnUU43N09VeGNncndlU1ZyUHllcjFyQ1E4bytRbm9LMi9oSXg5UGxKWmtjbDN1d0Y2VHBCdGpzXFxucXZSeFRob21vSHlvMGhKSEcwdm1JNDJHcTV1MHRjU2VVOTAyZWZwQ0RhZUpoUFZPaXFJU29KOTZ3bjByXFxuRkIzbFlMU2ZsT3BDTEFFN25zWkpSb1hBNmFrVTd4TUNNTkErK2Q0dHY2cDk4RlErTVo2ZTl4NmtpU3cxXFxuTStWV2orUHZOMWR0UThmTll3cEpmN0tCZkQxdzZJU01GRG1ld2tERTdpQk9YRjZGTHc9PVxcbj0rM1ljXFxuLS0tLS1FTkQgUEdQIE1FU1NBR0UtLS0tLVxcbicsXG4gICAgICAgICAgICAgIHZzc1Byb29mOiAnMzA5ZDJmZWYyMjcyYWQzMTM3NTk1NGI5OWE4NjI3NDJmMjJkODAyM2VlZjk4NTViOGFlMjZlYTg0ZTA4YmY1ZScsXG4gICAgICAgICAgICAgIGk6IDEsXG4gICAgICAgICAgICAgIGo6IDIsXG4gICAgICAgICAgICAgIHVTaWc6ICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG5cXG54azhFWkJzck5CTUZLNEVFQUFvQ0F3VDJ4WHYvbUcvZGFQZEtHRC9mSElVRUUyWnRjSytuanRDWnRNRXJcXG5rSXVibVV3ZTNEajgraFF4dDNTS2FUeFFidUQrV2FMU2o5ODZRWVVyNFp3NFQrVzN6V3B2ZG1NdE1pMWlcXG5ZV05yZFhBdE5UUTNZbUprWmpNd09HTXhaVFl4WTJRNVpHSTRObVU0SUR4dmRtTXRNaTFpWVdOcmRYQXRcXG5OVFEzWW1Ka1pqTXdPR014WlRZeFkyUTVaR0k0Tm1VNFFEVTBOMkppWkdZek1EaGpNV1UyTVdOa09XUmlcXG5PRFpsT0M1amIyMCt3b3dFRUJNSUFCMEZBbVFiS3pRRUN3a0hDQU1WQ0FvRUZnQUNBUUlaQVFJYkF3SWVcXG5BUUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBTa0ZPZTNhamJxb3VlcllDVGtiWktUdGx4dFlCQUxMSUJuQWFcXG40QVM3N1h2WG1tem5OQ1dPL0hOdURQRDJ1Z1JxVmhxVTRTeG1BUURtYTE0QVB1TU5TVnlpMTd4b21aaldcXG4wbmltdGFNSUJqYzBBNE1YRTZHNFhjNVRCR1FiS3pRU0JTdUJCQUFLQWdNRVVIb1FEWTk4eThDQVZvdXVcXG55NHkzUTJRbkJwblVCSy8wUEVMVjdWQU5YZDlsWTdDU2h5b2dKU2NnUGxpVW05N0F1OUZDMTd2cVphMUJcXG41YkJNSkFkWFZ3TUJDQWZDZUFRWUV3Z0FDUVVDWkJzck5BSWJEQUFoQ1JDMkFrNUcyU2s3WlJZaEJMVHBcXG5Ta0ZPZTNhamJxb3VlcllDVGtiWktUdGxSNXdBLzN6T0ZUU2VYWFJSZW1YbDNoWTEwc3B4YWJFNE8ySjhcXG5aRDJWUmZqYkRwWmpBUURXZzFXK2pQYk0ySHRpa2QxTjAxVit6d2VORGhKRUg2NXIwUXI4QmxYaDI4NHpcXG5CR1FiS3pRV0NTc0dBUVFCMmtjUEFRRUhRTlZHZzB2UHNmSzF5SmpGdURZQjhUajdDUVJIS0dBVkVEY2pcXG5oL1FJcXIwS3duZ0VHQk1JQUFrRkFtUWJLelFDR3lBQUlRa1F0Z0pPUnRrcE8yVVdJUVMwNlVwQlRudDJcXG5vMjZxTG5xMkFrNUcyU2s3WlM5b0FRQ2UyekpENUl0VzJHRWdBaXRuWStOckxCamJYSTYrTFkyOUdqUmFcXG5mNnlGVFFEL2NQMEUxRGxlcVhNamdmUitld3Q2cXVWRk1aZWJocjN0QnIvSDBadi85RUE9XFxuPThhaStcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGJpdGdvXG4gICAgICAgIC5jb2luKCd0c29sJylcbiAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgIC5jcmVhdGVUc3NCaXRHb0tleUZyb21PdmNTaGFyZXMob3ZjT3V0cHV0SnNvbilcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1N0YXRlIGV4cGVjdGVkIHRvIGJlIFwiMVwiLiBQbGVhc2UgY29tcGxldGUgdGhlIGZpcnN0IHR3byBPVkMgb3BlcmF0aW9ucycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0ZhaWxzIHRvIGRlY29kZSBpZiB0aGUgT1ZDIGpzb24gaXMgbWlzc2luZyBmaWVsZHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvdmNPdXRwdXRKc29uID0ge1xuICAgICAgICB0c3NWZXJzaW9uOiAnMC4wLjEnLFxuICAgICAgICBzdGF0ZTogMSxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgICBvdmM6IHtcbiAgICAgICAgICAxOiB7XG4gICAgICAgICAgICBncGdQdWJLZXk6XG4gICAgICAgICAgICAgICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXG5cXG54azhFWkJzcTlSTUZLNEVFQUFvQ0F3UmdEcGdtMWJwdFJUNXlMT01hZGNHQUh1dmt4SVNMOC8zeFB5L0RcXG5ZQSsxTmdCcUlGSy8zT09YeHA3M1R2ODZidDFkZ0g3T0QxQUNPMG1WWEFvWDVFYVZ6V1p2ZG1NdE1TMTFcXG5jMlZ5TFdSbU1qUXdPV1kwTldOaE1UWm1OVFUzT0dOa016QXhNeUE4YjNaakxURXRkWE5sY2kxa1pqSTBcXG5NRGxtTkRWallURTJaalUxTnpoalpETXdNVE5BWkdZeU5EQTVaalExWTJFeE5tWTFOVGM0WTJRek1ERXpcXG5MbU52YlQ3Q2pBUVFFd2dBSFFVQ1pCc3E5UVFMQ1FjSUF4VUlDZ1FXQUFJQkFoa0JBaHNEQWg0QkFDRUpcXG5FT1VlQzdRckdMKzJGaUVFak42dlBVRlJ3ZVZ0REtGWjVSNEx0Q3NZdjdaN29BRUF2TkthSnJUSXMza3lcXG5ieGprVWljc3V4T3lBMm9XR2FySkg2VEdsV0Y2V0Q4QS8zRUllWnpQS1NMYVcrM2VucGJDUGlVOFJWRHBcXG5DNnlvNk5NQXFLcDRYbHlRemxNRVpCc3E5UklGSzRFRUFBb0NBd1FXbFdQTk1wazNhZkV6ZmdHMHhGZzRcXG5DRWpZN2ZHTzM1bjQ3blo0cXhqRVh6MlhONEkyM3hGTWl3WmJYYnB0RFhscW03VzlaQUhLaTg5MmgrWXRcXG5VNEI2QXdFSUI4SjRCQmdUQ0FBSkJRSmtHeXIxQWhzTUFDRUpFT1VlQzdRckdMKzJGaUVFak42dlBVRlJcXG53ZVZ0REtGWjVSNEx0Q3NZdjdZcVp3RDhETFJ1bmVCMEhFekJDeXJFNFlMK1VIYW9mb0hRWDErblJoMGpcXG44MnFhRHpBQS9pM1UxU29FSWkzMllNcm9yTkc1MHZiNHZhRVBiYlltZmdsYitKUTFZeDdvXFxuPXZqZ2xcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIG92Y1RvQml0Z29TaGFyZToge1xuICAgICAgICAgICAgICBwdWJsaWNTaGFyZTpcbiAgICAgICAgICAgICAgICAnMDdiZmJiMDUyYTFmNGIxMDZiMzE1YmQ1YTlkNmE3MTYwNDY1MzI4OWY4NjEzMjBkOTgwMTg4MWU5NTJmODU1MDc1M2M4OTUxMWEzNjBlM2I1OTlkOWYyMzlhOGQzNmE0OTU2NDM3ZWQwYjE1MjE4MGUyMmNiOTRmYjA4ZmRjODEnLFxuICAgICAgICAgICAgICBwcml2YXRlU2hhcmU6XG4gICAgICAgICAgICAgICAgJy0tLS0tQkVHSU4gUEdQIE1FU1NBR0UtLS0tLVxcblxcbndYNERVUThYaEdWR2NUSVNBZ01FZC93US9BaHdJUnNTZi82aUh3bUhLdkVZQXdmYUx0VFFvdFM2QndabVxcbmFYMDBUN0x1bUdJck5aekJnY2dnQktNbCs4T21vbThtWDVzUDhGVUU0NTFpWmpCbVhsa3BIbHBBcXNrU1xcbkVpNVNmamxzVDMxdXRvTGFCTEE3TmpOU215WUhJaXlmaDZZbndmVjVVNzJrNmhoZnB1RFNzUUd5OFl4cFxcbk0yZFZsTjR1b08zMXpnUVBmK2ZnSmtadkFQd3ZqWUxCTDRPOGhzMjFIR2YwVnZHOTlicms0eGxGVlJod1xcblFudVBwTTUxR09zNHZVdGJMTlNZbkF1aFU0UmVYd3dEVjlYdTBNWEFqZlFNazJFM3dRTEdRKzgydXYyQlxcbjFoUEQ5bkRIVHRBZFdyWGQ2WmpYRnJHNE1mMk1RQnh5U0Z2VlNuRmk2eVN0amZaZWlLY0Q1VmczOFBqR1xcbldnMU81TjMvcGFxOThIZkgwUTRxTktHWmxqd28zb0VRWnpsWW0ya1ZuSTBQVUxvTVlnPT1cXG49b3ZBeFxcbi0tLS0tRU5EIFBHUCBNRVNTQUdFLS0tLS1cXG4nLFxuICAgICAgICAgICAgICB2c3NQcm9vZjogJ2JlODE5OGMyY2VmOTRjYjM4MWFhOGFhOTI3N2EwYTQ2YmE1YTU0YjBhYzk5MzAwMzRiNGFmNjZiMWI4MDUyMzQnLFxuICAgICAgICAgICAgICBpOiAzLFxuICAgICAgICAgICAgICBqOiAxLFxuICAgICAgICAgICAgICB1U2lnOiAnLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuXFxueGs4RVpCc3E5Uk1GSzRFRUFBb0NBd1JnRHBnbTFicHRSVDV5TE9NYWRjR0FIdXZreElTTDgvM3hQeS9EXFxuWUErMU5nQnFJRksvM09PWHhwNzNUdjg2YnQxZGdIN09EMUFDTzBtVlhBb1g1RWFWeldadmRtTXRNUzExXFxuYzJWeUxXUm1NalF3T1dZME5XTmhNVFptTlRVM09HTmtNekF4TXlBOGIzWmpMVEV0ZFhObGNpMWtaakkwXFxuTURsbU5EVmpZVEUyWmpVMU56aGpaRE13TVROQVpHWXlOREE1WmpRMVkyRXhObVkxTlRjNFkyUXpNREV6XFxuTG1OdmJUN0NqQVFRRXdnQUhRVUNaQnNxOVFRTENRY0lBeFVJQ2dRV0FBSUJBaGtCQWhzREFoNEJBQ0VKXFxuRU9VZUM3UXJHTCsyRmlFRWpONnZQVUZSd2VWdERLRlo1UjRMdENzWXY3WjdvQUVBdk5LYUpyVElzM2t5XFxuYnhqa1VpY3N1eE95QTJvV0dhckpINlRHbFdGNldEOEEvM0VJZVp6UEtTTGFXKzNlbnBiQ1BpVThSVkRwXFxuQzZ5bzZOTUFxS3A0WGx5UXpsTUVaQnNxOVJJRks0RUVBQW9DQXdRV2xXUE5NcGszYWZFemZnRzB4Rmc0XFxuQ0VqWTdmR08zNW40N25aNHF4akVYejJYTjRJMjN4Rk1pd1piWGJwdERYbHFtN1c5WkFIS2k4OTJoK1l0XFxuVTRCNkF3RUlCOEo0QkJnVENBQUpCUUprR3lyMUFoc01BQ0VKRU9VZUM3UXJHTCsyRmlFRWpONnZQVUZSXFxud2VWdERLRlo1UjRMdENzWXY3WXFad0Q4RExSdW5lQjBIRXpCQ3lyRTRZTCtVSGFvZm9IUVgxK25SaDBqXFxuODJxYUR6QUEvaTNVMVNvRUlpMzJZTXJvck5HNTB2YjR2YUVQYmJZbWZnbGIrSlExWXg3b3pqTUVaQnNxXFxuOVJZSkt3WUJCQUhhUnc4QkFRZEFTMTUzNExkQ0M2MEFTcEVnbkVCQzhwV1BTT1dXQkxYeVdhQmhFT1cyXFxuL2lqQ2VBUVlFd2dBQ1FVQ1pCc3E5UUliSUFBaENSRGxIZ3UwS3hpL3RoWWhCSXplcnoxQlVjSGxiUXloXFxuV2VVZUM3UXJHTCsyRlVZQS9BZ01VNFY3QzdJLzVId0s3M21jdGFHWE5kZlZyL211Uk1OT0dXL0NBeFZMXFxuQVA5S2FCcjk1bzMyb0VONWVvN3RXRkJ5b09DQ2s5Sk1qczM2Q3E3bytzUjMxQT09XFxuPWVaM0JcXG4tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiaXRnby5jb2luKCd0c29sJykua2V5Y2hhaW5zKCkuY3JlYXRlVHNzQml0R29LZXlGcm9tT3ZjU2hhcmVzKG92Y091dHB1dEpzb24pLnNob3VsZC5iZS5yZWplY3RlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ092Y1NoYXJlIGNvZGVjIGRlY29kZXMgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGVzdCA9IHtcbiAgICAgICAgcHVibGljU2hhcmU6XG4gICAgICAgICAgJzA3YmZiYjA1MmExZjRiMTA2YjMxNWJkNWE5ZDZhNzE2MDQ2NTMyODlmODYxMzIwZDk4MDE4ODFlOTUyZjg1NTA3NTNjODk1MTFhMzYwZTNiNTk5ZDlmMjM5YThkMzZhNDk1NjQzN2VkMGIxNTIxODBlMjJjYjk0ZmIwOGZkYzgxJyxcbiAgICAgICAgcHJpdmF0ZVNoYXJlOlxuICAgICAgICAgICctLS0tLUJFR0lOIFBHUCBNRVNTQUdFLS0tLS1cXG5cXG53WDREVVE4WGhHVkdjVElTQWdNRWQvd1EvQWh3SVJzU2YvNmlId21IS3ZFWUF3ZmFMdFRRb3RTNkJ3Wm1cXG5hWDAwVDdMdW1HSXJOWnpCZ2NnZ0JLTWwrOE9tb204bVg1c1A4RlVFNDUxaVpqQm1YbGtwSGxwQXFza1NcXG5FaTVTZmpsc1QzMXV0b0xhQkxBN05qTlNteVlISWl5Zmg2WW53ZlY1VTcyazZoaGZwdURTc1FHeThZeHBcXG5NMmRWbE40dW9PMzF6Z1FQZitmZ0prWnZBUHd2allMQkw0TzhoczIxSEdmMFZ2Rzk5YnJrNHhsRlZSaHdcXG5RbnVQcE01MUdPczR2VXRiTE5TWW5BdWhVNFJlWHd3RFY5WHUwTVhBamZRTWsyRTN3UUxHUSs4MnV2MkJcXG4xaFBEOW5ESFR0QWRXclhkNlpqWEZyRzRNZjJNUUJ4eVNGdlZTbkZpNnlTdGpmWmVpS2NENVZnMzhQakdcXG5XZzFPNU4zL3BhcTk4SGZIMFE0cU5LR1psandvM29FUVp6bFltMmtWbkkwUFVMb01ZZz09XFxuPW92QXhcXG4tLS0tLUVORCBQR1AgTUVTU0FHRS0tLS0tXFxuJyxcbiAgICAgICAgdnNzUHJvb2Y6ICdiZTgxOThjMmNlZjk0Y2IzODFhYThhYTkyNzdhMGE0NmJhNWE1NGIwYWM5OTMwMDM0YjRhZjY2YjFiODA1MjM0JyxcbiAgICAgICAgaTogMyxcbiAgICAgICAgajogMSxcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNvZGVkUmVzID0gZGVjb2RlT3JFbHNlKE92Y1NoYXJlLm5hbWUsIE92Y1NoYXJlLCB0ZXN0LCAoZXJyb3JzKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IocykgcGFyc2luZyBwYXJzaW5nIGpzb246ICR7ZXJyb3JzfWApO1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQoZGVjb2RlZFJlcyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYmFja3VwIHdpdGhvdXQgZW5jcnlwdGVkUHJ2IHdoZW4gcGFzc3BocmFzZSBub3QgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoJy9hcGkvdjIvdGx0Yy9rZXknLCAoYm9keSkgPT4ge1xuICAgICAgICByZXR1cm4gYm9keS5lbmNyeXB0ZWRQcnYgPT09IHVuZGVmaW5lZCAmJiBib2R5LnBydiA9PT0gdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgY29uc3QgYmFja3VwID0gYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7fSk7XG4gICAgc2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICBiYWNrdXAuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdlbmNyeXB0ZWRQcnYnKTtcbiAgICBiYWNrdXAuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BydicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGJhY2t1cCBhbmQgY2FsbCBlbmRwb2ludCB3aXRoIGVuY3J5cHRlZFBydiB3aGVuIHBhc3NwaHJhc2UgaXMgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoJy9hcGkvdjIvdGx0Yy9rZXknLCAoYm9keSkgPT4ge1xuICAgICAgICByZXR1cm4gYm9keS5lbmNyeXB0ZWRQcnYgIT09IHVuZGVmaW5lZCAmJiBib2R5LnBydiA9PT0gdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgY29uc3QgYmFja3VwID0gYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICd0M3N0U2ljcmV0bHkhJyB9KTtcbiAgICBzY29wZS5pc0RvbmUoKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIGJhY2t1cC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZW5jcnlwdGVkUHJ2Jyk7XG4gICAgY29uc3QgZGVjcnlwdGVkUHJ2ID0gYml0Z28uZGVjcnlwdCh7IGlucHV0OiBiYWNrdXAuZW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogJ3Qzc3RTaWNyZXRseSEnIH0pO1xuICAgIGRlY3J5cHRlZFBydi5zaG91bGQuc3RhcnRXaXRoKCd4cHJ2Jyk7XG4gIH0pO1xufSk7XG4iXX0=

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


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