PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-sol/dist/src/lib

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

"use strict";
/**
 * @file Implementation of the depositSol instruction. On upgrade of
 * '@solana/spl-token', this module may no longer be necessary.
 */
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WITHDRAW_STAKE_LAYOUT_CODE = exports.DEPOSIT_SOL_LAYOUT_CODE = void 0;
exports.findWithdrawAuthorityProgramAddressSync = findWithdrawAuthorityProgramAddressSync;
exports.depositSolInstructions = depositSolInstructions;
exports.decodeDepositSol = decodeDepositSol;
exports.withdrawStakeInstructions = withdrawStakeInstructions;
exports.decodeWithdrawStake = decodeWithdrawStake;
const spl_stake_pool_1 = require("@solana/spl-stake-pool");
const spl_token_1 = require("@solana/spl-token");
const web3_js_1 = require("@solana/web3.js");
const assert_1 = __importDefault(require("assert"));
const constants_1 = require("./constants");
exports.DEPOSIT_SOL_LAYOUT_CODE = 14;
exports.WITHDRAW_STAKE_LAYOUT_CODE = 10;
/**
 * Generates the withdraw authority program address for the stake pool.
 * Like findWithdrawAuthorityProgramAddress in @solana/spl-stake-pool,
 * but synchronous.
 *
 * @see {findWithdrawAuthorityProgramAddress}
 */
function findWithdrawAuthorityProgramAddressSync(programId, stakePoolAddress) {
    const [withdrawAuthority] = web3_js_1.PublicKey.findProgramAddressSync([stakePoolAddress.toBuffer(), Buffer.from('withdraw')], programId);
    return withdrawAuthority;
}
/**
 * Construct Solana depositSol stake pool instruction from parameters.
 *
 * @param {DepositSolInstructionsParams} params - parameters for staking to stake pool
 * @param poolMint - pool mint derived from getStakePoolAccount
 * @param reserveStake - reserve account derived from getStakePoolAccount
 * @param managerFeeAccount - manager fee account derived from getStakePoolAccount
 * @returns {TransactionInstruction}
 */
function depositSolInstructions(params, stakePool) {
    const { stakePoolAddress, from, lamports } = params;
    const poolMint = new web3_js_1.PublicKey(stakePool.poolMint);
    const reserveStake = new web3_js_1.PublicKey(stakePool.reserveStake);
    const managerFeeAccount = new web3_js_1.PublicKey(stakePool.managerFeeAccount);
    // findWithdrawAuthorityProgramAddress
    const withdrawAuthority = findWithdrawAuthorityProgramAddressSync(spl_stake_pool_1.STAKE_POOL_PROGRAM_ID, stakePoolAddress);
    const associatedAddress = (0, spl_token_1.getAssociatedTokenAddressSync)(poolMint, from);
    return [
        (0, spl_token_1.createAssociatedTokenAccountInstruction)(from, associatedAddress, from, poolMint),
        spl_stake_pool_1.StakePoolInstruction.depositSol({
            stakePool: stakePoolAddress,
            reserveStake,
            fundingAccount: from,
            destinationPoolAccount: associatedAddress,
            managerFeeAccount,
            referralPoolAccount: associatedAddress,
            poolMint,
            lamports: Number(lamports),
            withdrawAuthority,
        }),
    ];
}
function parseKey(key, template) {
    (0, assert_1.default)(key.isSigner === template.isSigner && key.isWritable === template.isWritable, `Unexpected key metadata in instruction: { isSigner: ${key.isSigner}, isWritable: ${key.isWritable} }`);
    return key.pubkey;
}
/**
 * Construct Solana depositSol stake pool parameters from instruction.
 *
 * @param {TransactionInstruction} instruction
 * @returns {DepositSolParams}
 */
function decodeDepositSol(instruction) {
    const { programId, keys, data } = instruction;
    (0, assert_1.default)(programId.equals(spl_stake_pool_1.STAKE_POOL_PROGRAM_ID), 'Invalid DepositSol instruction, program ID must be the Stake Pool Program');
    let i = 0;
    const stakePool = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const withdrawAuthority = parseKey(keys[i++], { isSigner: false, isWritable: false });
    const reserveStake = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const fundingAccount = parseKey(keys[i++], { isSigner: true, isWritable: true });
    const destinationPoolAccount = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const managerFeeAccount = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const referralPoolAccount = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const poolMint = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const systemProgramProgramId = parseKey(keys[i++], { isSigner: false, isWritable: false });
    (0, assert_1.default)(systemProgramProgramId.equals(web3_js_1.SystemProgram.programId), 'Unexpected pubkey in DepositSol instruction');
    const tokenProgramId = parseKey(keys[i++], { isSigner: false, isWritable: false });
    (0, assert_1.default)(tokenProgramId.equals(spl_token_1.TOKEN_PROGRAM_ID), 'Unexpected pubkey in DepositSol instruction');
    const depositAuthority = keys.length > 10 ? parseKey(keys[i++], { isSigner: true, isWritable: false }) : undefined;
    (0, assert_1.default)(keys.length <= 11, 'Too many keys in DepositSol instruction');
    const layoutCode = data.readUint8(0);
    (0, assert_1.default)(layoutCode === exports.DEPOSIT_SOL_LAYOUT_CODE, 'Incorrect layout code in DepositSol data');
    (0, assert_1.default)(data.length === 9, 'Incorrect data size for DepositSol layout');
    const lamports = data.readBigInt64LE(1);
    return {
        stakePool,
        depositAuthority,
        withdrawAuthority,
        reserveStake,
        fundingAccount,
        destinationPoolAccount,
        managerFeeAccount,
        referralPoolAccount,
        poolMint,
        lamports: Number(lamports),
    };
}
/**
 * Construct Solana depositSol stake pool instruction from parameters.
 *
 * @param {DepositSolInstructionsParams} params - parameters for staking to stake pool
 * @param poolMint - pool mint derived from getStakePoolAccount
 * @param reserveStake - reserve account derived from getStakePoolAccount
 * @param managerFeeAccount - manager fee account derived from getStakePoolAccount
 * @returns {TransactionInstruction}
 */
function withdrawStakeInstructions(params, stakePool) {
    const { tokenOwner, stakePoolAddress, destinationStakeAccount, validatorAddress, transferAuthority, poolAmount: poolAmountString, } = params;
    const poolMint = new web3_js_1.PublicKey(stakePool.poolMint);
    const validatorList = new web3_js_1.PublicKey(stakePool.validatorListAccount);
    const managerFeeAccount = new web3_js_1.PublicKey(stakePool.managerFeeAccount);
    const poolTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(poolMint, tokenOwner);
    const withdrawAuthority = findWithdrawAuthorityProgramAddressSync(spl_stake_pool_1.STAKE_POOL_PROGRAM_ID, stakePoolAddress);
    const poolAmount = BigInt(poolAmountString);
    return [
        (0, spl_token_1.createApproveInstruction)(poolTokenAccount, tokenOwner, tokenOwner, poolAmount),
        web3_js_1.SystemProgram.createAccount({
            fromPubkey: tokenOwner,
            newAccountPubkey: destinationStakeAccount,
            lamports: constants_1.STAKE_ACCOUNT_RENT_EXEMPT_AMOUNT,
            space: web3_js_1.StakeProgram.space,
            programId: web3_js_1.StakeProgram.programId,
        }),
        spl_stake_pool_1.StakePoolInstruction.withdrawStake({
            stakePool: stakePoolAddress,
            validatorList: validatorList,
            validatorStake: validatorAddress,
            destinationStake: destinationStakeAccount,
            destinationStakeAuthority: tokenOwner,
            sourceTransferAuthority: transferAuthority,
            sourcePoolAccount: poolTokenAccount,
            managerFeeAccount: managerFeeAccount,
            poolMint: poolMint,
            poolTokens: Number(poolAmount),
            withdrawAuthority,
        }),
    ];
}
/**
 * Construct Solana withdrawStake stake pool parameters from instruction.
 *
 * @param {TransactionInstruction} instruction
 * @returns {DepositSolParams}
 */
function decodeWithdrawStake(instruction) {
    const { programId, keys, data } = instruction;
    (0, assert_1.default)(programId.equals(spl_stake_pool_1.STAKE_POOL_PROGRAM_ID), 'Invalid WithdrawStake instruction, program ID must be the Stake Pool Program');
    const layoutCode = data.readUint8(0);
    (0, assert_1.default)(layoutCode === exports.WITHDRAW_STAKE_LAYOUT_CODE, 'Incorrect layout code in WithdrawStake data');
    (0, assert_1.default)(data.length === 9, 'Incorrect data size for WithdrawStake layout');
    const poolTokens = data.readBigInt64LE(1);
    let i = 0;
    const stakePool = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const validatorList = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const withdrawAuthority = parseKey(keys[i++], { isSigner: false, isWritable: false });
    const validatorStake = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const destinationStake = keys[i++].pubkey;
    const destinationStakeAuthority = keys[i++].pubkey;
    const sourceTransferAuthority = parseKey(keys[i++], { isSigner: true, isWritable: false });
    const sourcePoolAccount = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const managerFeeAccount = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const poolMint = parseKey(keys[i++], { isSigner: false, isWritable: true });
    const sysvarClockPubkey = parseKey(keys[i++], { isSigner: false, isWritable: false });
    (0, assert_1.default)(sysvarClockPubkey.equals(web3_js_1.SYSVAR_CLOCK_PUBKEY), 'Unexpected pubkey in WithdrawStake instruction');
    const tokenProgramId = parseKey(keys[i++], { isSigner: false, isWritable: false });
    (0, assert_1.default)(tokenProgramId.equals(spl_token_1.TOKEN_PROGRAM_ID), 'Unexpected pubkey in WithdrawStake instruction');
    const stakeProgramProgramId = parseKey(keys[i++], { isSigner: false, isWritable: false });
    (0, assert_1.default)(stakeProgramProgramId.equals(web3_js_1.StakeProgram.programId), 'Unexpected pubkey in WithdrawStake instruction');
    (0, assert_1.default)(i === keys.length, 'Too many keys in WithdrawStake instruction');
    return {
        stakePool,
        validatorList,
        withdrawAuthority,
        validatorStake,
        destinationStake,
        destinationStakeAuthority,
        sourceTransferAuthority,
        sourcePoolAccount,
        managerFeeAccount,
        poolMint,
        poolTokens: Number(poolTokens),
    };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaml0b1N0YWtlUG9vbE9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2ppdG9TdGFrZVBvb2xPcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQXVGSCwwRkFNQztBQW1CRCx3REE0QkM7QUFnQkQsNENBeUNDO0FBc0JELDhEQTZDQztBQVFELGtEQTZDQztBQTNURCwyREFLZ0M7QUFDaEMsaURBSzJCO0FBQzNCLDZDQU95QjtBQUN6QixvREFBNEI7QUFDNUIsMkNBQStEO0FBc0RsRCxRQUFBLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUM3QixRQUFBLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUU3Qzs7Ozs7O0dBTUc7QUFDSCxTQUFnQix1Q0FBdUMsQ0FBQyxTQUFvQixFQUFFLGdCQUEyQjtJQUN2RyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxtQkFBUyxDQUFDLHNCQUFzQixDQUMxRCxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFDdEQsU0FBUyxDQUNWLENBQUM7SUFDRixPQUFPLGlCQUFpQixDQUFDO0FBQzNCLENBQUM7QUFVRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHNCQUFzQixDQUNwQyxNQUFvQyxFQUNwQyxTQUFrQztJQUVsQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLG1CQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sWUFBWSxHQUFHLElBQUksbUJBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLG1CQUFTLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFckUsc0NBQXNDO0lBQ3RDLE1BQU0saUJBQWlCLEdBQUcsdUNBQXVDLENBQUMsc0NBQXFCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUUzRyxNQUFNLGlCQUFpQixHQUFHLElBQUEseUNBQTZCLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXhFLE9BQU87UUFDTCxJQUFBLG1EQUF1QyxFQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDO1FBQ2hGLHFDQUFvQixDQUFDLFVBQVUsQ0FBQztZQUM5QixTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLFlBQVk7WUFDWixjQUFjLEVBQUUsSUFBSTtZQUNwQixzQkFBc0IsRUFBRSxpQkFBaUI7WUFDekMsaUJBQWlCO1lBQ2pCLG1CQUFtQixFQUFFLGlCQUFpQjtZQUN0QyxRQUFRO1lBQ1IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDMUIsaUJBQWlCO1NBQ2xCLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEdBQWdCLEVBQUUsUUFBb0Q7SUFDdEYsSUFBQSxnQkFBTSxFQUNKLEdBQUcsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxVQUFVLEVBQzVFLHVEQUF1RCxHQUFHLENBQUMsUUFBUSxpQkFBaUIsR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUN2RyxDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLFdBQW1DO0lBQ2xFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLFdBQVcsQ0FBQztJQUU5QyxJQUFBLGdCQUFNLEVBQ0osU0FBUyxDQUFDLE1BQU0sQ0FBQyxzQ0FBcUIsQ0FBQyxFQUN2QywyRUFBMkUsQ0FDNUUsQ0FBQztJQUVGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0UsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEYsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqRixNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUYsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sc0JBQXNCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzRixJQUFBLGdCQUFNLEVBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLHVCQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztJQUM5RyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLElBQUEsZ0JBQU0sRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLDRCQUFnQixDQUFDLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztJQUMvRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkgsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLHlDQUF5QyxDQUFDLENBQUM7SUFFckUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxLQUFLLCtCQUF1QixFQUFFLDBDQUEwQyxDQUFDLENBQUM7SUFDM0YsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLDJDQUEyQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4QyxPQUFPO1FBQ0wsU0FBUztRQUNULGdCQUFnQjtRQUNoQixpQkFBaUI7UUFDakIsWUFBWTtRQUNaLGNBQWM7UUFDZCxzQkFBc0I7UUFDdEIsaUJBQWlCO1FBQ2pCLG1CQUFtQjtRQUNuQixRQUFRO1FBQ1IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUM7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFhRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHlCQUF5QixDQUN2QyxNQUF1QyxFQUN2QyxTQUFxQztJQUVyQyxNQUFNLEVBQ0osVUFBVSxFQUNWLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixVQUFVLEVBQUUsZ0JBQWdCLEdBQzdCLEdBQUcsTUFBTSxDQUFDO0lBRVgsTUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFJLG1CQUFTLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDcEUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLG1CQUFTLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFckUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLHlDQUE2QixFQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3RSxNQUFNLGlCQUFpQixHQUFHLHVDQUF1QyxDQUFDLHNDQUFxQixFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFM0csTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFNUMsT0FBTztRQUNMLElBQUEsb0NBQXdCLEVBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFDOUUsdUJBQWEsQ0FBQyxhQUFhLENBQUM7WUFDMUIsVUFBVSxFQUFFLFVBQVU7WUFDdEIsZ0JBQWdCLEVBQUUsdUJBQXVCO1lBQ3pDLFFBQVEsRUFBRSw0Q0FBZ0M7WUFDMUMsS0FBSyxFQUFFLHNCQUFZLENBQUMsS0FBSztZQUN6QixTQUFTLEVBQUUsc0JBQVksQ0FBQyxTQUFTO1NBQ2xDLENBQUM7UUFDRixxQ0FBb0IsQ0FBQyxhQUFhLENBQUM7WUFDakMsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixhQUFhLEVBQUUsYUFBYTtZQUM1QixjQUFjLEVBQUUsZ0JBQWdCO1lBQ2hDLGdCQUFnQixFQUFFLHVCQUF1QjtZQUN6Qyx5QkFBeUIsRUFBRSxVQUFVO1lBQ3JDLHVCQUF1QixFQUFFLGlCQUFpQjtZQUMxQyxpQkFBaUIsRUFBRSxnQkFBZ0I7WUFDbkMsaUJBQWlCLEVBQUUsaUJBQWlCO1lBQ3BDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQzlCLGlCQUFpQjtTQUNsQixDQUFDO0tBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLFdBQW1DO0lBQ3JFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLFdBQVcsQ0FBQztJQUU5QyxJQUFBLGdCQUFNLEVBQ0osU0FBUyxDQUFDLE1BQU0sQ0FBQyxzQ0FBcUIsQ0FBQyxFQUN2Qyw4RUFBOEUsQ0FDL0UsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsSUFBQSxnQkFBTSxFQUFDLFVBQVUsS0FBSyxrQ0FBMEIsRUFBRSw2Q0FBNkMsQ0FBQyxDQUFDO0lBQ2pHLElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3RSxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN0RixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ25ELE1BQU0sdUJBQXVCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzRixNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckYsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUUsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLElBQUEsZ0JBQU0sRUFBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsNkJBQW1CLENBQUMsRUFBRSxnREFBZ0QsQ0FBQyxDQUFDO0lBQ3hHLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbkYsSUFBQSxnQkFBTSxFQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsNEJBQWdCLENBQUMsRUFBRSxnREFBZ0QsQ0FBQyxDQUFDO0lBQ2xHLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMxRixJQUFBLGdCQUFNLEVBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLHNCQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsZ0RBQWdELENBQUMsQ0FBQztJQUMvRyxJQUFBLGdCQUFNLEVBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsNENBQTRDLENBQUMsQ0FBQztJQUV4RSxPQUFPO1FBQ0wsU0FBUztRQUNULGFBQWE7UUFDYixpQkFBaUI7UUFDakIsY0FBYztRQUNkLGdCQUFnQjtRQUNoQix5QkFBeUI7UUFDekIsdUJBQXVCO1FBQ3ZCLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsUUFBUTtRQUNSLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDO0tBQy9CLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGVwb3NpdFNvbCBpbnN0cnVjdGlvbi4gT24gdXBncmFkZSBvZlxuICogJ0Bzb2xhbmEvc3BsLXRva2VuJywgdGhpcyBtb2R1bGUgbWF5IG5vIGxvbmdlciBiZSBuZWNlc3NhcnkuXG4gKi9cblxuaW1wb3J0IHtcbiAgU3Rha2VQb29sSW5zdHJ1Y3Rpb24sXG4gIFNUQUtFX1BPT0xfUFJPR1JBTV9JRCxcbiAgRGVwb3NpdFNvbFBhcmFtcyxcbiAgV2l0aGRyYXdTdGFrZVBhcmFtcyxcbn0gZnJvbSAnQHNvbGFuYS9zcGwtc3Rha2UtcG9vbCc7XG5pbXBvcnQge1xuICBjcmVhdGVBcHByb3ZlSW5zdHJ1Y3Rpb24sXG4gIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJbnN0cnVjdGlvbixcbiAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMsXG4gIFRPS0VOX1BST0dSQU1fSUQsXG59IGZyb20gJ0Bzb2xhbmEvc3BsLXRva2VuJztcbmltcG9ydCB7XG4gIEFjY291bnRNZXRhLFxuICBQdWJsaWNLZXksXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgU1lTVkFSX0NMT0NLX1BVQktFWSxcbiAgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFNUQUtFX0FDQ09VTlRfUkVOVF9FWEVNUFRfQU1PVU5UIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIFJlcGxpY2F0ZXMgdGhlIGZpZWxkcyBpbiBAc29sYW5hL3NwbC1zdGFrZS1wb29sIEZlZS5cbiAqXG4gKiBAc2VlIHtGZWV9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVlIHtcbiAgZGVub21pbmF0b3I6IHN0cmluZztcbiAgbnVtZXJhdG9yOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwbGljYXRlcyB0aGUgZmllbGRzIGluIEBzb2xhbmEvc3BsLXN0YWtlLXBvb2wgU3Rha2VQb29sTGF5b3V0LlxuICpcbiAqIEBzZWUge1N0YWtlUG9vbExheW91dH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFrZVBvb2xEYXRhIHtcbiAgYWNjb3VudFR5cGU6IG51bWJlcjtcbiAgbWFuYWdlcjogc3RyaW5nO1xuICBzdGFrZXI6IHN0cmluZztcbiAgc3Rha2VEZXBvc2l0QXV0aG9yaXR5OiBzdHJpbmc7XG4gIHN0YWtlV2l0aGRyYXdCdW1wU2VlZDogbnVtYmVyO1xuICB2YWxpZGF0b3JMaXN0QWNjb3VudDogc3RyaW5nO1xuICByZXNlcnZlU3Rha2U6IHN0cmluZztcbiAgcG9vbE1pbnQ6IHN0cmluZztcbiAgbWFuYWdlckZlZUFjY291bnQ6IHN0cmluZztcbiAgdG9rZW5Qcm9ncmFtSWQ6IHN0cmluZztcbiAgdG90YWxMYW1wb3J0czogc3RyaW5nO1xuICBwb29sVG9rZW5TdXBwbHk6IHN0cmluZztcbiAgbGFzdFVwZGF0ZUVwb2NoOiBzdHJpbmc7XG4gIGxvY2t1cDoge1xuICAgIHVuaXhUaW1lc3RhbXA6IHN0cmluZztcbiAgICBlcG9jaDogc3RyaW5nO1xuICAgIGN1c3RvZGlhbjogc3RyaW5nO1xuICB9O1xuICBlcG9jaEZlZTogRmVlO1xuICBuZXh0RXBvY2hGZWU/OiBGZWUgfCB1bmRlZmluZWQ7XG4gIHByZWZlcnJlZERlcG9zaXRWYWxpZGF0b3JWb3RlQWRkcmVzcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJlZmVycmVkV2l0aGRyYXdWYWxpZGF0b3JWb3RlQWRkcmVzcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc3Rha2VEZXBvc2l0RmVlOiBGZWU7XG4gIHN0YWtlV2l0aGRyYXdhbEZlZTogRmVlO1xuICBuZXh0U3Rha2VXaXRoZHJhd2FsRmVlPzogRmVlIHwgdW5kZWZpbmVkO1xuICBzdGFrZVJlZmVycmFsRmVlOiBudW1iZXI7XG4gIHNvbERlcG9zaXRBdXRob3JpdHk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNvbERlcG9zaXRGZWU6IEZlZTtcbiAgc29sUmVmZXJyYWxGZWU6IG51bWJlcjtcbiAgc29sV2l0aGRyYXdBdXRob3JpdHk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNvbFdpdGhkcmF3YWxGZWU6IEZlZTtcbiAgbmV4dFNvbFdpdGhkcmF3YWxGZWU/OiBGZWUgfCB1bmRlZmluZWQ7XG4gIGxhc3RFcG9jaFBvb2xUb2tlblN1cHBseTogc3RyaW5nO1xuICBsYXN0RXBvY2hUb3RhbExhbXBvcnRzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBERVBPU0lUX1NPTF9MQVlPVVRfQ09ERSA9IDE0O1xuZXhwb3J0IGNvbnN0IFdJVEhEUkFXX1NUQUtFX0xBWU9VVF9DT0RFID0gMTA7XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSB3aXRoZHJhdyBhdXRob3JpdHkgcHJvZ3JhbSBhZGRyZXNzIGZvciB0aGUgc3Rha2UgcG9vbC5cbiAqIExpa2UgZmluZFdpdGhkcmF3QXV0aG9yaXR5UHJvZ3JhbUFkZHJlc3MgaW4gQHNvbGFuYS9zcGwtc3Rha2UtcG9vbCxcbiAqIGJ1dCBzeW5jaHJvbm91cy5cbiAqXG4gKiBAc2VlIHtmaW5kV2l0aGRyYXdBdXRob3JpdHlQcm9ncmFtQWRkcmVzc31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXaXRoZHJhd0F1dGhvcml0eVByb2dyYW1BZGRyZXNzU3luYyhwcm9ncmFtSWQ6IFB1YmxpY0tleSwgc3Rha2VQb29sQWRkcmVzczogUHVibGljS2V5KTogUHVibGljS2V5IHtcbiAgY29uc3QgW3dpdGhkcmF3QXV0aG9yaXR5XSA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgIFtzdGFrZVBvb2xBZGRyZXNzLnRvQnVmZmVyKCksIEJ1ZmZlci5mcm9tKCd3aXRoZHJhdycpXSxcbiAgICBwcm9ncmFtSWRcbiAgKTtcbiAgcmV0dXJuIHdpdGhkcmF3QXV0aG9yaXR5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTb2xJbnN0cnVjdGlvbnNQYXJhbXMge1xuICBzdGFrZVBvb2xBZGRyZXNzOiBQdWJsaWNLZXk7XG4gIGZyb206IFB1YmxpY0tleTtcbiAgbGFtcG9ydHM6IGJpZ2ludDtcbn1cblxuZXhwb3J0IHR5cGUgRGVwb3NpdFNvbFN0YWtlUG9vbERhdGEgPSBQaWNrPFN0YWtlUG9vbERhdGEsICdwb29sTWludCcgfCAncmVzZXJ2ZVN0YWtlJyB8ICdtYW5hZ2VyRmVlQWNjb3VudCc+O1xuXG4vKipcbiAqIENvbnN0cnVjdCBTb2xhbmEgZGVwb3NpdFNvbCBzdGFrZSBwb29sIGluc3RydWN0aW9uIGZyb20gcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0ge0RlcG9zaXRTb2xJbnN0cnVjdGlvbnNQYXJhbXN9IHBhcmFtcyAtIHBhcmFtZXRlcnMgZm9yIHN0YWtpbmcgdG8gc3Rha2UgcG9vbFxuICogQHBhcmFtIHBvb2xNaW50IC0gcG9vbCBtaW50IGRlcml2ZWQgZnJvbSBnZXRTdGFrZVBvb2xBY2NvdW50XG4gKiBAcGFyYW0gcmVzZXJ2ZVN0YWtlIC0gcmVzZXJ2ZSBhY2NvdW50IGRlcml2ZWQgZnJvbSBnZXRTdGFrZVBvb2xBY2NvdW50XG4gKiBAcGFyYW0gbWFuYWdlckZlZUFjY291bnQgLSBtYW5hZ2VyIGZlZSBhY2NvdW50IGRlcml2ZWQgZnJvbSBnZXRTdGFrZVBvb2xBY2NvdW50XG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcG9zaXRTb2xJbnN0cnVjdGlvbnMoXG4gIHBhcmFtczogRGVwb3NpdFNvbEluc3RydWN0aW9uc1BhcmFtcyxcbiAgc3Rha2VQb29sOiBEZXBvc2l0U29sU3Rha2VQb29sRGF0YVxuKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3QgeyBzdGFrZVBvb2xBZGRyZXNzLCBmcm9tLCBsYW1wb3J0cyB9ID0gcGFyYW1zO1xuICBjb25zdCBwb29sTWludCA9IG5ldyBQdWJsaWNLZXkoc3Rha2VQb29sLnBvb2xNaW50KTtcbiAgY29uc3QgcmVzZXJ2ZVN0YWtlID0gbmV3IFB1YmxpY0tleShzdGFrZVBvb2wucmVzZXJ2ZVN0YWtlKTtcbiAgY29uc3QgbWFuYWdlckZlZUFjY291bnQgPSBuZXcgUHVibGljS2V5KHN0YWtlUG9vbC5tYW5hZ2VyRmVlQWNjb3VudCk7XG5cbiAgLy8gZmluZFdpdGhkcmF3QXV0aG9yaXR5UHJvZ3JhbUFkZHJlc3NcbiAgY29uc3Qgd2l0aGRyYXdBdXRob3JpdHkgPSBmaW5kV2l0aGRyYXdBdXRob3JpdHlQcm9ncmFtQWRkcmVzc1N5bmMoU1RBS0VfUE9PTF9QUk9HUkFNX0lELCBzdGFrZVBvb2xBZGRyZXNzKTtcblxuICBjb25zdCBhc3NvY2lhdGVkQWRkcmVzcyA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHBvb2xNaW50LCBmcm9tKTtcblxuICByZXR1cm4gW1xuICAgIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJbnN0cnVjdGlvbihmcm9tLCBhc3NvY2lhdGVkQWRkcmVzcywgZnJvbSwgcG9vbE1pbnQpLFxuICAgIFN0YWtlUG9vbEluc3RydWN0aW9uLmRlcG9zaXRTb2woe1xuICAgICAgc3Rha2VQb29sOiBzdGFrZVBvb2xBZGRyZXNzLFxuICAgICAgcmVzZXJ2ZVN0YWtlLFxuICAgICAgZnVuZGluZ0FjY291bnQ6IGZyb20sXG4gICAgICBkZXN0aW5hdGlvblBvb2xBY2NvdW50OiBhc3NvY2lhdGVkQWRkcmVzcyxcbiAgICAgIG1hbmFnZXJGZWVBY2NvdW50LFxuICAgICAgcmVmZXJyYWxQb29sQWNjb3VudDogYXNzb2NpYXRlZEFkZHJlc3MsXG4gICAgICBwb29sTWludCxcbiAgICAgIGxhbXBvcnRzOiBOdW1iZXIobGFtcG9ydHMpLFxuICAgICAgd2l0aGRyYXdBdXRob3JpdHksXG4gICAgfSksXG4gIF07XG59XG5cbmZ1bmN0aW9uIHBhcnNlS2V5KGtleTogQWNjb3VudE1ldGEsIHRlbXBsYXRlOiB7IGlzU2lnbmVyOiBib29sZWFuOyBpc1dyaXRhYmxlOiBib29sZWFuIH0pOiBQdWJsaWNLZXkge1xuICBhc3NlcnQoXG4gICAga2V5LmlzU2lnbmVyID09PSB0ZW1wbGF0ZS5pc1NpZ25lciAmJiBrZXkuaXNXcml0YWJsZSA9PT0gdGVtcGxhdGUuaXNXcml0YWJsZSxcbiAgICBgVW5leHBlY3RlZCBrZXkgbWV0YWRhdGEgaW4gaW5zdHJ1Y3Rpb246IHsgaXNTaWduZXI6ICR7a2V5LmlzU2lnbmVyfSwgaXNXcml0YWJsZTogJHtrZXkuaXNXcml0YWJsZX0gfWBcbiAgKTtcbiAgcmV0dXJuIGtleS5wdWJrZXk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IFNvbGFuYSBkZXBvc2l0U29sIHN0YWtlIHBvb2wgcGFyYW1ldGVycyBmcm9tIGluc3RydWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtEZXBvc2l0U29sUGFyYW1zfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRGVwb3NpdFNvbChpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IERlcG9zaXRTb2xQYXJhbXMge1xuICBjb25zdCB7IHByb2dyYW1JZCwga2V5cywgZGF0YSB9ID0gaW5zdHJ1Y3Rpb247XG5cbiAgYXNzZXJ0KFxuICAgIHByb2dyYW1JZC5lcXVhbHMoU1RBS0VfUE9PTF9QUk9HUkFNX0lEKSxcbiAgICAnSW52YWxpZCBEZXBvc2l0U29sIGluc3RydWN0aW9uLCBwcm9ncmFtIElEIG11c3QgYmUgdGhlIFN0YWtlIFBvb2wgUHJvZ3JhbSdcbiAgKTtcblxuICBsZXQgaSA9IDA7XG4gIGNvbnN0IHN0YWtlUG9vbCA9IHBhcnNlS2V5KGtleXNbaSsrXSwgeyBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gIGNvbnN0IHdpdGhkcmF3QXV0aG9yaXR5ID0gcGFyc2VLZXkoa2V5c1tpKytdLCB7IGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSk7XG4gIGNvbnN0IHJlc2VydmVTdGFrZSA9IHBhcnNlS2V5KGtleXNbaSsrXSwgeyBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gIGNvbnN0IGZ1bmRpbmdBY2NvdW50ID0gcGFyc2VLZXkoa2V5c1tpKytdLCB7IGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICBjb25zdCBkZXN0aW5hdGlvblBvb2xBY2NvdW50ID0gcGFyc2VLZXkoa2V5c1tpKytdLCB7IGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgY29uc3QgbWFuYWdlckZlZUFjY291bnQgPSBwYXJzZUtleShrZXlzW2krK10sIHsgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICBjb25zdCByZWZlcnJhbFBvb2xBY2NvdW50ID0gcGFyc2VLZXkoa2V5c1tpKytdLCB7IGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgY29uc3QgcG9vbE1pbnQgPSBwYXJzZUtleShrZXlzW2krK10sIHsgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICBjb25zdCBzeXN0ZW1Qcm9ncmFtUHJvZ3JhbUlkID0gcGFyc2VLZXkoa2V5c1tpKytdLCB7IGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSk7XG4gIGFzc2VydChzeXN0ZW1Qcm9ncmFtUHJvZ3JhbUlkLmVxdWFscyhTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCksICdVbmV4cGVjdGVkIHB1YmtleSBpbiBEZXBvc2l0U29sIGluc3RydWN0aW9uJyk7XG4gIGNvbnN0IHRva2VuUHJvZ3JhbUlkID0gcGFyc2VLZXkoa2V5c1tpKytdLCB7IGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSk7XG4gIGFzc2VydCh0b2tlblByb2dyYW1JZC5lcXVhbHMoVE9LRU5fUFJPR1JBTV9JRCksICdVbmV4cGVjdGVkIHB1YmtleSBpbiBEZXBvc2l0U29sIGluc3RydWN0aW9uJyk7XG4gIGNvbnN0IGRlcG9zaXRBdXRob3JpdHkgPSBrZXlzLmxlbmd0aCA+IDEwID8gcGFyc2VLZXkoa2V5c1tpKytdLCB7IGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiBmYWxzZSB9KSA6IHVuZGVmaW5lZDtcbiAgYXNzZXJ0KGtleXMubGVuZ3RoIDw9IDExLCAnVG9vIG1hbnkga2V5cyBpbiBEZXBvc2l0U29sIGluc3RydWN0aW9uJyk7XG5cbiAgY29uc3QgbGF5b3V0Q29kZSA9IGRhdGEucmVhZFVpbnQ4KDApO1xuICBhc3NlcnQobGF5b3V0Q29kZSA9PT0gREVQT1NJVF9TT0xfTEFZT1VUX0NPREUsICdJbmNvcnJlY3QgbGF5b3V0IGNvZGUgaW4gRGVwb3NpdFNvbCBkYXRhJyk7XG4gIGFzc2VydChkYXRhLmxlbmd0aCA9PT0gOSwgJ0luY29ycmVjdCBkYXRhIHNpemUgZm9yIERlcG9zaXRTb2wgbGF5b3V0Jyk7XG4gIGNvbnN0IGxhbXBvcnRzID0gZGF0YS5yZWFkQmlnSW50NjRMRSgxKTtcblxuICByZXR1cm4ge1xuICAgIHN0YWtlUG9vbCxcbiAgICBkZXBvc2l0QXV0aG9yaXR5LFxuICAgIHdpdGhkcmF3QXV0aG9yaXR5LFxuICAgIHJlc2VydmVTdGFrZSxcbiAgICBmdW5kaW5nQWNjb3VudCxcbiAgICBkZXN0aW5hdGlvblBvb2xBY2NvdW50LFxuICAgIG1hbmFnZXJGZWVBY2NvdW50LFxuICAgIHJlZmVycmFsUG9vbEFjY291bnQsXG4gICAgcG9vbE1pbnQsXG4gICAgbGFtcG9ydHM6IE51bWJlcihsYW1wb3J0cyksXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aGRyYXdTdGFrZUluc3RydWN0aW9uc1BhcmFtcyB7XG4gIHN0YWtlUG9vbEFkZHJlc3M6IFB1YmxpY0tleTtcbiAgdG9rZW5Pd25lcjogUHVibGljS2V5O1xuICBkZXN0aW5hdGlvblN0YWtlQWNjb3VudDogUHVibGljS2V5O1xuICB2YWxpZGF0b3JBZGRyZXNzOiBQdWJsaWNLZXk7XG4gIHRyYW5zZmVyQXV0aG9yaXR5OiBQdWJsaWNLZXk7XG4gIHBvb2xBbW91bnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgV2l0aGRyYXdTdGFrZVN0YWtlUG9vbERhdGEgPSBQaWNrPFN0YWtlUG9vbERhdGEsICdwb29sTWludCcgfCAndmFsaWRhdG9yTGlzdEFjY291bnQnIHwgJ21hbmFnZXJGZWVBY2NvdW50Jz47XG5cbi8qKlxuICogQ29uc3RydWN0IFNvbGFuYSBkZXBvc2l0U29sIHN0YWtlIHBvb2wgaW5zdHJ1Y3Rpb24gZnJvbSBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7RGVwb3NpdFNvbEluc3RydWN0aW9uc1BhcmFtc30gcGFyYW1zIC0gcGFyYW1ldGVycyBmb3Igc3Rha2luZyB0byBzdGFrZSBwb29sXG4gKiBAcGFyYW0gcG9vbE1pbnQgLSBwb29sIG1pbnQgZGVyaXZlZCBmcm9tIGdldFN0YWtlUG9vbEFjY291bnRcbiAqIEBwYXJhbSByZXNlcnZlU3Rha2UgLSByZXNlcnZlIGFjY291bnQgZGVyaXZlZCBmcm9tIGdldFN0YWtlUG9vbEFjY291bnRcbiAqIEBwYXJhbSBtYW5hZ2VyRmVlQWNjb3VudCAtIG1hbmFnZXIgZmVlIGFjY291bnQgZGVyaXZlZCBmcm9tIGdldFN0YWtlUG9vbEFjY291bnRcbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aGRyYXdTdGFrZUluc3RydWN0aW9ucyhcbiAgcGFyYW1zOiBXaXRoZHJhd1N0YWtlSW5zdHJ1Y3Rpb25zUGFyYW1zLFxuICBzdGFrZVBvb2w6IFdpdGhkcmF3U3Rha2VTdGFrZVBvb2xEYXRhXG4pOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgdG9rZW5Pd25lcixcbiAgICBzdGFrZVBvb2xBZGRyZXNzLFxuICAgIGRlc3RpbmF0aW9uU3Rha2VBY2NvdW50LFxuICAgIHZhbGlkYXRvckFkZHJlc3MsXG4gICAgdHJhbnNmZXJBdXRob3JpdHksXG4gICAgcG9vbEFtb3VudDogcG9vbEFtb3VudFN0cmluZyxcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBwb29sTWludCA9IG5ldyBQdWJsaWNLZXkoc3Rha2VQb29sLnBvb2xNaW50KTtcbiAgY29uc3QgdmFsaWRhdG9yTGlzdCA9IG5ldyBQdWJsaWNLZXkoc3Rha2VQb29sLnZhbGlkYXRvckxpc3RBY2NvdW50KTtcbiAgY29uc3QgbWFuYWdlckZlZUFjY291bnQgPSBuZXcgUHVibGljS2V5KHN0YWtlUG9vbC5tYW5hZ2VyRmVlQWNjb3VudCk7XG5cbiAgY29uc3QgcG9vbFRva2VuQWNjb3VudCA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHBvb2xNaW50LCB0b2tlbk93bmVyKTtcbiAgY29uc3Qgd2l0aGRyYXdBdXRob3JpdHkgPSBmaW5kV2l0aGRyYXdBdXRob3JpdHlQcm9ncmFtQWRkcmVzc1N5bmMoU1RBS0VfUE9PTF9QUk9HUkFNX0lELCBzdGFrZVBvb2xBZGRyZXNzKTtcblxuICBjb25zdCBwb29sQW1vdW50ID0gQmlnSW50KHBvb2xBbW91bnRTdHJpbmcpO1xuXG4gIHJldHVybiBbXG4gICAgY3JlYXRlQXBwcm92ZUluc3RydWN0aW9uKHBvb2xUb2tlbkFjY291bnQsIHRva2VuT3duZXIsIHRva2VuT3duZXIsIHBvb2xBbW91bnQpLFxuICAgIFN5c3RlbVByb2dyYW0uY3JlYXRlQWNjb3VudCh7XG4gICAgICBmcm9tUHVia2V5OiB0b2tlbk93bmVyLFxuICAgICAgbmV3QWNjb3VudFB1YmtleTogZGVzdGluYXRpb25TdGFrZUFjY291bnQsXG4gICAgICBsYW1wb3J0czogU1RBS0VfQUNDT1VOVF9SRU5UX0VYRU1QVF9BTU9VTlQsXG4gICAgICBzcGFjZTogU3Rha2VQcm9ncmFtLnNwYWNlLFxuICAgICAgcHJvZ3JhbUlkOiBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgIH0pLFxuICAgIFN0YWtlUG9vbEluc3RydWN0aW9uLndpdGhkcmF3U3Rha2Uoe1xuICAgICAgc3Rha2VQb29sOiBzdGFrZVBvb2xBZGRyZXNzLFxuICAgICAgdmFsaWRhdG9yTGlzdDogdmFsaWRhdG9yTGlzdCxcbiAgICAgIHZhbGlkYXRvclN0YWtlOiB2YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgZGVzdGluYXRpb25TdGFrZTogZGVzdGluYXRpb25TdGFrZUFjY291bnQsXG4gICAgICBkZXN0aW5hdGlvblN0YWtlQXV0aG9yaXR5OiB0b2tlbk93bmVyLFxuICAgICAgc291cmNlVHJhbnNmZXJBdXRob3JpdHk6IHRyYW5zZmVyQXV0aG9yaXR5LFxuICAgICAgc291cmNlUG9vbEFjY291bnQ6IHBvb2xUb2tlbkFjY291bnQsXG4gICAgICBtYW5hZ2VyRmVlQWNjb3VudDogbWFuYWdlckZlZUFjY291bnQsXG4gICAgICBwb29sTWludDogcG9vbE1pbnQsXG4gICAgICBwb29sVG9rZW5zOiBOdW1iZXIocG9vbEFtb3VudCksXG4gICAgICB3aXRoZHJhd0F1dGhvcml0eSxcbiAgICB9KSxcbiAgXTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgU29sYW5hIHdpdGhkcmF3U3Rha2Ugc3Rha2UgcG9vbCBwYXJhbWV0ZXJzIGZyb20gaW5zdHJ1Y3Rpb24uXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge0RlcG9zaXRTb2xQYXJhbXN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVXaXRoZHJhd1N0YWtlKGluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uKTogV2l0aGRyYXdTdGFrZVBhcmFtcyB7XG4gIGNvbnN0IHsgcHJvZ3JhbUlkLCBrZXlzLCBkYXRhIH0gPSBpbnN0cnVjdGlvbjtcblxuICBhc3NlcnQoXG4gICAgcHJvZ3JhbUlkLmVxdWFscyhTVEFLRV9QT09MX1BST0dSQU1fSUQpLFxuICAgICdJbnZhbGlkIFdpdGhkcmF3U3Rha2UgaW5zdHJ1Y3Rpb24sIHByb2dyYW0gSUQgbXVzdCBiZSB0aGUgU3Rha2UgUG9vbCBQcm9ncmFtJ1xuICApO1xuXG4gIGNvbnN0IGxheW91dENvZGUgPSBkYXRhLnJlYWRVaW50OCgwKTtcbiAgYXNzZXJ0KGxheW91dENvZGUgPT09IFdJVEhEUkFXX1NUQUtFX0xBWU9VVF9DT0RFLCAnSW5jb3JyZWN0IGxheW91dCBjb2RlIGluIFdpdGhkcmF3U3Rha2UgZGF0YScpO1xuICBhc3NlcnQoZGF0YS5sZW5ndGggPT09IDksICdJbmNvcnJlY3QgZGF0YSBzaXplIGZvciBXaXRoZHJhd1N0YWtlIGxheW91dCcpO1xuICBjb25zdCBwb29sVG9rZW5zID0gZGF0YS5yZWFkQmlnSW50NjRMRSgxKTtcblxuICBsZXQgaSA9IDA7XG4gIGNvbnN0IHN0YWtlUG9vbCA9IHBhcnNlS2V5KGtleXNbaSsrXSwgeyBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gIGNvbnN0IHZhbGlkYXRvckxpc3QgPSBwYXJzZUtleShrZXlzW2krK10sIHsgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICBjb25zdCB3aXRoZHJhd0F1dGhvcml0eSA9IHBhcnNlS2V5KGtleXNbaSsrXSwgeyBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICBjb25zdCB2YWxpZGF0b3JTdGFrZSA9IHBhcnNlS2V5KGtleXNbaSsrXSwgeyBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uU3Rha2UgPSBrZXlzW2krK10ucHVia2V5O1xuICBjb25zdCBkZXN0aW5hdGlvblN0YWtlQXV0aG9yaXR5ID0ga2V5c1tpKytdLnB1YmtleTtcbiAgY29uc3Qgc291cmNlVHJhbnNmZXJBdXRob3JpdHkgPSBwYXJzZUtleShrZXlzW2krK10sIHsgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICBjb25zdCBzb3VyY2VQb29sQWNjb3VudCA9IHBhcnNlS2V5KGtleXNbaSsrXSwgeyBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSk7XG4gIGNvbnN0IG1hbmFnZXJGZWVBY2NvdW50ID0gcGFyc2VLZXkoa2V5c1tpKytdLCB7IGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9KTtcbiAgY29uc3QgcG9vbE1pbnQgPSBwYXJzZUtleShrZXlzW2krK10sIHsgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0pO1xuICBjb25zdCBzeXN2YXJDbG9ja1B1YmtleSA9IHBhcnNlS2V5KGtleXNbaSsrXSwgeyBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICBhc3NlcnQoc3lzdmFyQ2xvY2tQdWJrZXkuZXF1YWxzKFNZU1ZBUl9DTE9DS19QVUJLRVkpLCAnVW5leHBlY3RlZCBwdWJrZXkgaW4gV2l0aGRyYXdTdGFrZSBpbnN0cnVjdGlvbicpO1xuICBjb25zdCB0b2tlblByb2dyYW1JZCA9IHBhcnNlS2V5KGtleXNbaSsrXSwgeyBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICBhc3NlcnQodG9rZW5Qcm9ncmFtSWQuZXF1YWxzKFRPS0VOX1BST0dSQU1fSUQpLCAnVW5leHBlY3RlZCBwdWJrZXkgaW4gV2l0aGRyYXdTdGFrZSBpbnN0cnVjdGlvbicpO1xuICBjb25zdCBzdGFrZVByb2dyYW1Qcm9ncmFtSWQgPSBwYXJzZUtleShrZXlzW2krK10sIHsgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9KTtcbiAgYXNzZXJ0KHN0YWtlUHJvZ3JhbVByb2dyYW1JZC5lcXVhbHMoU3Rha2VQcm9ncmFtLnByb2dyYW1JZCksICdVbmV4cGVjdGVkIHB1YmtleSBpbiBXaXRoZHJhd1N0YWtlIGluc3RydWN0aW9uJyk7XG4gIGFzc2VydChpID09PSBrZXlzLmxlbmd0aCwgJ1RvbyBtYW55IGtleXMgaW4gV2l0aGRyYXdTdGFrZSBpbnN0cnVjdGlvbicpO1xuXG4gIHJldHVybiB7XG4gICAgc3Rha2VQb29sLFxuICAgIHZhbGlkYXRvckxpc3QsXG4gICAgd2l0aGRyYXdBdXRob3JpdHksXG4gICAgdmFsaWRhdG9yU3Rha2UsXG4gICAgZGVzdGluYXRpb25TdGFrZSxcbiAgICBkZXN0aW5hdGlvblN0YWtlQXV0aG9yaXR5LFxuICAgIHNvdXJjZVRyYW5zZmVyQXV0aG9yaXR5LFxuICAgIHNvdXJjZVBvb2xBY2NvdW50LFxuICAgIG1hbmFnZXJGZWVBY2NvdW50LFxuICAgIHBvb2xNaW50LFxuICAgIHBvb2xUb2tlbnM6IE51bWJlcihwb29sVG9rZW5zKSxcbiAgfTtcbn1cbiJdfQ==

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


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