UNPKG

@coolwallet/sol

Version:
154 lines (153 loc) 26.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.encodeAndPaddingSeedInstructionBuffer = encodeAndPaddingSeedInstructionBuffer; exports.encodeInstructionBuffer = encodeInstructionBuffer; exports.encodeSignData = encodeSignData; exports.initAndPaddingComputeBudgetInstructionBuffer = initAndPaddingComputeBudgetInstructionBuffer; exports.paddingSeedInstructionBuffer = paddingSeedInstructionBuffer; var _params = require("../config/params"); var _bufferLayoutUtils = require("./bufferLayoutUtils"); var _instructions = require("./instructions"); function initializeInsructionBuffer(instructionCount) { var instructionBuffer = Buffer.alloc(_params.PACKET_DATA_SIZE); if (instructionCount) { Buffer.from(instructionCount).copy(instructionBuffer); } var instructionBufferLength = !instructionCount ? 0 : instructionCount.length; return { instructionBuffer: instructionBuffer, instructionBufferLength: instructionBufferLength }; } function paddingEmptyInstructionBuffer(params) { var paddingLength = params.paddingLength, sourceInstructionBuf = params.sourceInstructionBuf, sourceInstructionLength = params.sourceInstructionLength; var emptyPaddingBuf = Buffer.alloc(paddingLength); emptyPaddingBuf.copy(sourceInstructionBuf, sourceInstructionLength); return { instructionBuffer: sourceInstructionBuf, instructionBufferLength: sourceInstructionLength + paddingLength }; } function paddingEmptyComputeBudgetInsructionBuffer(srcInstructionBuffer, srcInstructionBufferLength, hasGasPriceComputeBudget, hasGasLimitComputeBudget) { var instructionBuffer = srcInstructionBuffer; var instructionBufferLength = srcInstructionBufferLength; if (!hasGasPriceComputeBudget) { var paddingEmptyGasPrice = paddingEmptyInstructionBuffer({ paddingLength: 12, sourceInstructionBuf: srcInstructionBuffer, sourceInstructionLength: srcInstructionBufferLength }); instructionBuffer = paddingEmptyGasPrice.instructionBuffer; instructionBufferLength = paddingEmptyGasPrice.instructionBufferLength; } if (!hasGasLimitComputeBudget) { var paddingEmptyGasLimit = paddingEmptyInstructionBuffer({ paddingLength: 8, sourceInstructionBuf: instructionBuffer, sourceInstructionLength: instructionBufferLength }); instructionBuffer = paddingEmptyGasLimit.instructionBuffer; instructionBufferLength = paddingEmptyGasLimit.instructionBufferLength; } return { instructionBuffer: instructionBuffer, instructionBufferLength: instructionBufferLength }; } function initAndPaddingComputeBudgetInstructionBuffer(accountKeys, instructions, instructionCount) { var initializeInstruction = initializeInsructionBuffer(instructionCount); var hasGasPriceComputeBudget = (0, _instructions.hasSpecificInstruction)(accountKeys, instructions, _params.COMPUTE_BUDGET_PROGRAM_ID, 3); var hasGasLimitComputeBudget = (0, _instructions.hasSpecificInstruction)(accountKeys, instructions, _params.COMPUTE_BUDGET_PROGRAM_ID, 2); var paddingInstruction = paddingEmptyComputeBudgetInsructionBuffer(initializeInstruction.instructionBuffer, initializeInstruction.instructionBufferLength, hasGasPriceComputeBudget, hasGasLimitComputeBudget); return { instructionBuffer: paddingInstruction.instructionBuffer, instructionBufferLength: paddingInstruction.instructionBufferLength }; } function paddingSeedInstructionBuffer(srcInstructionBuffer, srcInstructionBufferLength, seedData) { /* Since seed is length variant, trying to padding seed to length 32 bytes: Default structure: instruction(4 bytes), basePubkey(32 bytes), length(4 bytes), lengthPadding(4 bytes), seed(variant), lamports(8 bytes), space(8 bytes), programId(32 bytes) After structure: instruction(4 bytes), basePubkey(32 bytes), length(4 bytes), lengthPadding(4 bytes), seed(32 bytes), lamports(8 bytes), space(8 bytes), programId(32 bytes) */ var defaultLength = 92; var prefixLength = 44; var seedLength = seedData.length - defaultLength; var dataAllocator = Buffer.allocUnsafe(seedData.length - seedLength + 32); var dataPrefix = Buffer.from(seedData.slice(0, prefixLength)); var seed = Buffer.from(seedData.slice(prefixLength, prefixLength + seedLength)); var dataPostfix = Buffer.from(seedData.slice(prefixLength + seedLength, seedData.length)); var paddingSeed = Buffer.alloc(32); seed.copy(paddingSeed, 32 - seed.length); dataPrefix.copy(dataAllocator, 0); paddingSeed.copy(dataAllocator, dataPrefix.length); dataPostfix.copy(dataAllocator, dataPrefix.length + paddingSeed.length); var copiedBufferLength = dataAllocator.copy(srcInstructionBuffer, srcInstructionBufferLength); return { instructionBuffer: srcInstructionBuffer, instructionBufferLength: srcInstructionBufferLength + copiedBufferLength }; } function encodeInstructionBuffer(instructions, srcInstructionBuffer, srcInstructionBufferLength) { var instructionBuffer = srcInstructionBuffer; var instructionBufferLength = srcInstructionBufferLength; instructions.forEach(function (instruction) { var instructionLayout = (0, _bufferLayoutUtils.structInstructionLayout)(instruction); instructionBufferLength += instructionLayout.encode(instruction, instructionBuffer, instructionBufferLength); }); return instructionBuffer.slice(0, instructionBufferLength); } function encodeAndPaddingSeedInstructionBuffer(accountKeys, instructions, srcInstructionBuffer, srcInstructionBufferLength) { var instructionBuffer = srcInstructionBuffer; var instructionBufferLength = srcInstructionBufferLength; instructions.forEach(function (instruction) { var instructionLayout; var isCreateSeedInstruction = (0, _instructions.isSpecificInstruction)(accountKeys, instruction, _params.SYSTEM_PROGRAM_ID, 3); if (isCreateSeedInstruction) { instructionLayout = (0, _bufferLayoutUtils.structInstructionLayoutWithoutData)(instruction); instructionBufferLength += instructionLayout.encode(instruction, instructionBuffer, instructionBufferLength); var paddingSeedInstruction = paddingSeedInstructionBuffer(instructionBuffer, instructionBufferLength, instruction.data); instructionBuffer = paddingSeedInstruction.instructionBuffer; instructionBufferLength = paddingSeedInstruction.instructionBufferLength; } else { instructionLayout = (0, _bufferLayoutUtils.structInstructionLayout)(instruction); instructionBufferLength += instructionLayout.encode(instruction, instructionBuffer, instructionBufferLength); } }); return instructionBuffer.slice(0, instructionBufferLength); } function encodeSignData(keyCount, newAccountKeys, recentBlockhash, instructionBuffer) { var signDataLayout = (0, _bufferLayoutUtils.structSignDataLayout)(keyCount, newAccountKeys); var transaction = { keyCount: Buffer.from(keyCount), keys: newAccountKeys.map(function (key) { return Buffer.from(key, 'hex'); }), recentBlockhash: Buffer.from(recentBlockhash, 'hex') }; var signData = Buffer.alloc(2048); // sign data max length var length = signDataLayout.encode(transaction, signData); instructionBuffer.copy(signData, length); return signData.slice(0, length + instructionBuffer.length); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGFyYW1zIiwicmVxdWlyZSIsIl9idWZmZXJMYXlvdXRVdGlscyIsIl9pbnN0cnVjdGlvbnMiLCJpbml0aWFsaXplSW5zcnVjdGlvbkJ1ZmZlciIsImluc3RydWN0aW9uQ291bnQiLCJpbnN0cnVjdGlvbkJ1ZmZlciIsIkJ1ZmZlciIsImFsbG9jIiwiUEFDS0VUX0RBVEFfU0laRSIsImZyb20iLCJjb3B5IiwiaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGgiLCJsZW5ndGgiLCJwYWRkaW5nRW1wdHlJbnN0cnVjdGlvbkJ1ZmZlciIsInBhcmFtcyIsInBhZGRpbmdMZW5ndGgiLCJzb3VyY2VJbnN0cnVjdGlvbkJ1ZiIsInNvdXJjZUluc3RydWN0aW9uTGVuZ3RoIiwiZW1wdHlQYWRkaW5nQnVmIiwicGFkZGluZ0VtcHR5Q29tcHV0ZUJ1ZGdldEluc3J1Y3Rpb25CdWZmZXIiLCJzcmNJbnN0cnVjdGlvbkJ1ZmZlciIsInNyY0luc3RydWN0aW9uQnVmZmVyTGVuZ3RoIiwiaGFzR2FzUHJpY2VDb21wdXRlQnVkZ2V0IiwiaGFzR2FzTGltaXRDb21wdXRlQnVkZ2V0IiwicGFkZGluZ0VtcHR5R2FzUHJpY2UiLCJwYWRkaW5nRW1wdHlHYXNMaW1pdCIsImluaXRBbmRQYWRkaW5nQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uQnVmZmVyIiwiYWNjb3VudEtleXMiLCJpbnN0cnVjdGlvbnMiLCJpbml0aWFsaXplSW5zdHJ1Y3Rpb24iLCJoYXNTcGVjaWZpY0luc3RydWN0aW9uIiwiQ09NUFVURV9CVURHRVRfUFJPR1JBTV9JRCIsInBhZGRpbmdJbnN0cnVjdGlvbiIsInBhZGRpbmdTZWVkSW5zdHJ1Y3Rpb25CdWZmZXIiLCJzZWVkRGF0YSIsImRlZmF1bHRMZW5ndGgiLCJwcmVmaXhMZW5ndGgiLCJzZWVkTGVuZ3RoIiwiZGF0YUFsbG9jYXRvciIsImFsbG9jVW5zYWZlIiwiZGF0YVByZWZpeCIsInNsaWNlIiwic2VlZCIsImRhdGFQb3N0Zml4IiwicGFkZGluZ1NlZWQiLCJjb3BpZWRCdWZmZXJMZW5ndGgiLCJlbmNvZGVJbnN0cnVjdGlvbkJ1ZmZlciIsImZvckVhY2giLCJpbnN0cnVjdGlvbiIsImluc3RydWN0aW9uTGF5b3V0Iiwic3RydWN0SW5zdHJ1Y3Rpb25MYXlvdXQiLCJlbmNvZGUiLCJlbmNvZGVBbmRQYWRkaW5nU2VlZEluc3RydWN0aW9uQnVmZmVyIiwiaXNDcmVhdGVTZWVkSW5zdHJ1Y3Rpb24iLCJpc1NwZWNpZmljSW5zdHJ1Y3Rpb24iLCJTWVNURU1fUFJPR1JBTV9JRCIsInN0cnVjdEluc3RydWN0aW9uTGF5b3V0V2l0aG91dERhdGEiLCJwYWRkaW5nU2VlZEluc3RydWN0aW9uIiwiZGF0YSIsImVuY29kZVNpZ25EYXRhIiwia2V5Q291bnQiLCJuZXdBY2NvdW50S2V5cyIsInJlY2VudEJsb2NraGFzaCIsInNpZ25EYXRhTGF5b3V0Iiwic3RydWN0U2lnbkRhdGFMYXlvdXQiLCJ0cmFuc2FjdGlvbiIsImtleXMiLCJtYXAiLCJrZXkiLCJzaWduRGF0YSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9idWZmZXJVdGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT01QVVRFX0JVREdFVF9QUk9HUkFNX0lELCBQQUNLRVRfREFUQV9TSVpFLCBTWVNURU1fUFJPR1JBTV9JRCB9IGZyb20gJy4uL2NvbmZpZy9wYXJhbXMnO1xuaW1wb3J0IHsgU2VyaWFsaXplZEluc3RydWN0aW9uIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCB7IHN0cnVjdEluc3RydWN0aW9uTGF5b3V0LCBzdHJ1Y3RJbnN0cnVjdGlvbkxheW91dFdpdGhvdXREYXRhLCBzdHJ1Y3RTaWduRGF0YUxheW91dCB9IGZyb20gJy4vYnVmZmVyTGF5b3V0VXRpbHMnO1xuaW1wb3J0IHsgaGFzU3BlY2lmaWNJbnN0cnVjdGlvbiwgaXNTcGVjaWZpY0luc3RydWN0aW9uIH0gZnJvbSAnLi9pbnN0cnVjdGlvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluc3J1Y3Rpb25CdWZmZXJJbmZvIHtcbiAgaW5zdHJ1Y3Rpb25CdWZmZXI6IEJ1ZmZlcjtcbiAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg6IG51bWJlcjtcbn1cbmZ1bmN0aW9uIGluaXRpYWxpemVJbnNydWN0aW9uQnVmZmVyKGluc3RydWN0aW9uQ291bnQ/OiBudW1iZXJbXSk6IEluc3J1Y3Rpb25CdWZmZXJJbmZvIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25CdWZmZXIgPSBCdWZmZXIuYWxsb2MoUEFDS0VUX0RBVEFfU0laRSk7XG4gIGlmIChpbnN0cnVjdGlvbkNvdW50KSB7XG4gICAgQnVmZmVyLmZyb20oaW5zdHJ1Y3Rpb25Db3VudCkuY29weShpbnN0cnVjdGlvbkJ1ZmZlcik7XG4gIH1cbiAgY29uc3QgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggPSAhaW5zdHJ1Y3Rpb25Db3VudCA/IDAgOiBpbnN0cnVjdGlvbkNvdW50Lmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFkZGluZ0VtcHR5SW5zdHJ1Y3Rpb25CdWZmZXIocGFyYW1zOiB7XG4gIHBhZGRpbmdMZW5ndGg6IG51bWJlcjtcbiAgc291cmNlSW5zdHJ1Y3Rpb25CdWY6IEJ1ZmZlcjtcbiAgc291cmNlSW5zdHJ1Y3Rpb25MZW5ndGg6IG51bWJlcjtcbn0pOiBJbnNydWN0aW9uQnVmZmVySW5mbyB7XG4gIGNvbnN0IHsgcGFkZGluZ0xlbmd0aCwgc291cmNlSW5zdHJ1Y3Rpb25CdWYsIHNvdXJjZUluc3RydWN0aW9uTGVuZ3RoIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVtcHR5UGFkZGluZ0J1ZiA9IEJ1ZmZlci5hbGxvYyhwYWRkaW5nTGVuZ3RoKTtcbiAgZW1wdHlQYWRkaW5nQnVmLmNvcHkoc291cmNlSW5zdHJ1Y3Rpb25CdWYsIHNvdXJjZUluc3RydWN0aW9uTGVuZ3RoKTtcbiAgcmV0dXJuIHtcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlcjogc291cmNlSW5zdHJ1Y3Rpb25CdWYsXG4gICAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg6IHNvdXJjZUluc3RydWN0aW9uTGVuZ3RoICsgcGFkZGluZ0xlbmd0aCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFkZGluZ0VtcHR5Q29tcHV0ZUJ1ZGdldEluc3J1Y3Rpb25CdWZmZXIoXG4gIHNyY0luc3RydWN0aW9uQnVmZmVyOiBCdWZmZXIsXG4gIHNyY0luc3RydWN0aW9uQnVmZmVyTGVuZ3RoOiBudW1iZXIsXG4gIGhhc0dhc1ByaWNlQ29tcHV0ZUJ1ZGdldDogYm9vbGVhbixcbiAgaGFzR2FzTGltaXRDb21wdXRlQnVkZ2V0OiBib29sZWFuXG4pOiBJbnNydWN0aW9uQnVmZmVySW5mbyB7XG4gIGxldCBpbnN0cnVjdGlvbkJ1ZmZlciA9IHNyY0luc3RydWN0aW9uQnVmZmVyO1xuICBsZXQgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggPSBzcmNJbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDtcbiAgaWYgKCFoYXNHYXNQcmljZUNvbXB1dGVCdWRnZXQpIHtcbiAgICBjb25zdCBwYWRkaW5nRW1wdHlHYXNQcmljZSA9IHBhZGRpbmdFbXB0eUluc3RydWN0aW9uQnVmZmVyKHtcbiAgICAgIHBhZGRpbmdMZW5ndGg6IDEyLFxuICAgICAgc291cmNlSW5zdHJ1Y3Rpb25CdWY6IHNyY0luc3RydWN0aW9uQnVmZmVyLFxuICAgICAgc291cmNlSW5zdHJ1Y3Rpb25MZW5ndGg6IHNyY0luc3RydWN0aW9uQnVmZmVyTGVuZ3RoLFxuICAgIH0pO1xuICAgIGluc3RydWN0aW9uQnVmZmVyID0gcGFkZGluZ0VtcHR5R2FzUHJpY2UuaW5zdHJ1Y3Rpb25CdWZmZXI7XG4gICAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggPSBwYWRkaW5nRW1wdHlHYXNQcmljZS5pbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDtcbiAgfVxuICBpZiAoIWhhc0dhc0xpbWl0Q29tcHV0ZUJ1ZGdldCkge1xuICAgIGNvbnN0IHBhZGRpbmdFbXB0eUdhc0xpbWl0ID0gcGFkZGluZ0VtcHR5SW5zdHJ1Y3Rpb25CdWZmZXIoe1xuICAgICAgcGFkZGluZ0xlbmd0aDogOCxcbiAgICAgIHNvdXJjZUluc3RydWN0aW9uQnVmOiBpbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICAgIHNvdXJjZUluc3RydWN0aW9uTGVuZ3RoOiBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCxcbiAgICB9KTtcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlciA9IHBhZGRpbmdFbXB0eUdhc0xpbWl0Lmluc3RydWN0aW9uQnVmZmVyO1xuICAgIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoID0gcGFkZGluZ0VtcHR5R2FzTGltaXQuaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRBbmRQYWRkaW5nQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uQnVmZmVyKFxuICBhY2NvdW50S2V5czogc3RyaW5nW10sXG4gIGluc3RydWN0aW9uczogU2VyaWFsaXplZEluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uQ291bnQ/OiBudW1iZXJbXVxuKTogSW5zcnVjdGlvbkJ1ZmZlckluZm8ge1xuICBjb25zdCBpbml0aWFsaXplSW5zdHJ1Y3Rpb24gPSBpbml0aWFsaXplSW5zcnVjdGlvbkJ1ZmZlcihpbnN0cnVjdGlvbkNvdW50KTtcbiAgY29uc3QgaGFzR2FzUHJpY2VDb21wdXRlQnVkZ2V0ID0gaGFzU3BlY2lmaWNJbnN0cnVjdGlvbihhY2NvdW50S2V5cywgaW5zdHJ1Y3Rpb25zLCBDT01QVVRFX0JVREdFVF9QUk9HUkFNX0lELCAzKTtcbiAgY29uc3QgaGFzR2FzTGltaXRDb21wdXRlQnVkZ2V0ID0gaGFzU3BlY2lmaWNJbnN0cnVjdGlvbihhY2NvdW50S2V5cywgaW5zdHJ1Y3Rpb25zLCBDT01QVVRFX0JVREdFVF9QUk9HUkFNX0lELCAyKTtcbiAgY29uc3QgcGFkZGluZ0luc3RydWN0aW9uID0gcGFkZGluZ0VtcHR5Q29tcHV0ZUJ1ZGdldEluc3J1Y3Rpb25CdWZmZXIoXG4gICAgaW5pdGlhbGl6ZUluc3RydWN0aW9uLmluc3RydWN0aW9uQnVmZmVyLFxuICAgIGluaXRpYWxpemVJbnN0cnVjdGlvbi5pbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCxcbiAgICBoYXNHYXNQcmljZUNvbXB1dGVCdWRnZXQsXG4gICAgaGFzR2FzTGltaXRDb21wdXRlQnVkZ2V0XG4gICk7XG4gIHJldHVybiB7XG4gICAgaW5zdHJ1Y3Rpb25CdWZmZXI6IHBhZGRpbmdJbnN0cnVjdGlvbi5pbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDogcGFkZGluZ0luc3RydWN0aW9uLmluc3RydWN0aW9uQnVmZmVyTGVuZ3RoLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkZGluZ1NlZWRJbnN0cnVjdGlvbkJ1ZmZlcihcbiAgc3JjSW5zdHJ1Y3Rpb25CdWZmZXI6IEJ1ZmZlcixcbiAgc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg6IG51bWJlcixcbiAgc2VlZERhdGE6IG51bWJlcltdXG4pOiBJbnNydWN0aW9uQnVmZmVySW5mbyB7XG4gIC8qXG4gICAgU2luY2Ugc2VlZCBpcyBsZW5ndGggdmFyaWFudCwgdHJ5aW5nIHRvIHBhZGRpbmcgc2VlZCB0byBsZW5ndGggMzIgYnl0ZXM6XG5cbiAgICBEZWZhdWx0IHN0cnVjdHVyZTpcbiAgICAgIGluc3RydWN0aW9uKDQgYnl0ZXMpLFxuICAgICAgYmFzZVB1YmtleSgzMiBieXRlcyksXG4gICAgICBsZW5ndGgoNCBieXRlcyksXG4gICAgICBsZW5ndGhQYWRkaW5nKDQgYnl0ZXMpLFxuICAgICAgc2VlZCh2YXJpYW50KSxcbiAgICAgIGxhbXBvcnRzKDggYnl0ZXMpLFxuICAgICAgc3BhY2UoOCBieXRlcyksXG4gICAgICBwcm9ncmFtSWQoMzIgYnl0ZXMpXG5cbiAgICBBZnRlciBzdHJ1Y3R1cmU6XG4gICAgICBpbnN0cnVjdGlvbig0IGJ5dGVzKSxcbiAgICAgIGJhc2VQdWJrZXkoMzIgYnl0ZXMpLFxuICAgICAgbGVuZ3RoKDQgYnl0ZXMpLFxuICAgICAgbGVuZ3RoUGFkZGluZyg0IGJ5dGVzKSxcbiAgICAgIHNlZWQoMzIgYnl0ZXMpLFxuICAgICAgbGFtcG9ydHMoOCBieXRlcyksXG4gICAgICBzcGFjZSg4IGJ5dGVzKSxcbiAgICAgIHByb2dyYW1JZCgzMiBieXRlcylcbiAgKi9cbiAgY29uc3QgZGVmYXVsdExlbmd0aCA9IDkyO1xuICBjb25zdCBwcmVmaXhMZW5ndGggPSA0NDtcbiAgY29uc3Qgc2VlZExlbmd0aCA9IHNlZWREYXRhLmxlbmd0aCAtIGRlZmF1bHRMZW5ndGg7XG4gIGNvbnN0IGRhdGFBbGxvY2F0b3IgPSBCdWZmZXIuYWxsb2NVbnNhZmUoc2VlZERhdGEubGVuZ3RoIC0gc2VlZExlbmd0aCArIDMyKTtcbiAgY29uc3QgZGF0YVByZWZpeCA9IEJ1ZmZlci5mcm9tKHNlZWREYXRhLnNsaWNlKDAsIHByZWZpeExlbmd0aCkpO1xuICBjb25zdCBzZWVkID0gQnVmZmVyLmZyb20oc2VlZERhdGEuc2xpY2UocHJlZml4TGVuZ3RoLCBwcmVmaXhMZW5ndGggKyBzZWVkTGVuZ3RoKSk7XG4gIGNvbnN0IGRhdGFQb3N0Zml4ID0gQnVmZmVyLmZyb20oc2VlZERhdGEuc2xpY2UocHJlZml4TGVuZ3RoICsgc2VlZExlbmd0aCwgc2VlZERhdGEubGVuZ3RoKSk7XG4gIGNvbnN0IHBhZGRpbmdTZWVkID0gQnVmZmVyLmFsbG9jKDMyKTtcbiAgc2VlZC5jb3B5KHBhZGRpbmdTZWVkLCAzMiAtIHNlZWQubGVuZ3RoKTtcbiAgZGF0YVByZWZpeC5jb3B5KGRhdGFBbGxvY2F0b3IsIDApO1xuICBwYWRkaW5nU2VlZC5jb3B5KGRhdGFBbGxvY2F0b3IsIGRhdGFQcmVmaXgubGVuZ3RoKTtcbiAgZGF0YVBvc3RmaXguY29weShkYXRhQWxsb2NhdG9yLCBkYXRhUHJlZml4Lmxlbmd0aCArIHBhZGRpbmdTZWVkLmxlbmd0aCk7XG4gIGNvbnN0IGNvcGllZEJ1ZmZlckxlbmd0aCA9IGRhdGFBbGxvY2F0b3IuY29weShzcmNJbnN0cnVjdGlvbkJ1ZmZlciwgc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGgpO1xuICByZXR1cm4ge1xuICAgIGluc3RydWN0aW9uQnVmZmVyOiBzcmNJbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDogc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggKyBjb3BpZWRCdWZmZXJMZW5ndGgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVJbnN0cnVjdGlvbkJ1ZmZlcihcbiAgaW5zdHJ1Y3Rpb25zOiBTZXJpYWxpemVkSW5zdHJ1Y3Rpb25bXSxcbiAgc3JjSW5zdHJ1Y3Rpb25CdWZmZXI6IEJ1ZmZlcixcbiAgc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg6IG51bWJlclxuKTogQnVmZmVyIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25CdWZmZXIgPSBzcmNJbnN0cnVjdGlvbkJ1ZmZlcjtcbiAgbGV0IGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoID0gc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg7XG4gIGluc3RydWN0aW9ucy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGluc3RydWN0aW9uTGF5b3V0ID0gc3RydWN0SW5zdHJ1Y3Rpb25MYXlvdXQoaW5zdHJ1Y3Rpb24pO1xuICAgIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoICs9IGluc3RydWN0aW9uTGF5b3V0LmVuY29kZShpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb25CdWZmZXIsIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoKTtcbiAgfSk7XG4gIHJldHVybiBpbnN0cnVjdGlvbkJ1ZmZlci5zbGljZSgwLCBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVBbmRQYWRkaW5nU2VlZEluc3RydWN0aW9uQnVmZmVyKFxuICBhY2NvdW50S2V5czogc3RyaW5nW10sXG4gIGluc3RydWN0aW9uczogU2VyaWFsaXplZEluc3RydWN0aW9uW10sXG4gIHNyY0luc3RydWN0aW9uQnVmZmVyOiBCdWZmZXIsXG4gIHNyY0luc3RydWN0aW9uQnVmZmVyTGVuZ3RoOiBudW1iZXJcbik6IEJ1ZmZlciB7XG4gIGxldCBpbnN0cnVjdGlvbkJ1ZmZlciA9IHNyY0luc3RydWN0aW9uQnVmZmVyO1xuICBsZXQgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggPSBzcmNJbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDtcbiAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgbGV0IGluc3RydWN0aW9uTGF5b3V0O1xuICAgIGNvbnN0IGlzQ3JlYXRlU2VlZEluc3RydWN0aW9uID0gaXNTcGVjaWZpY0luc3RydWN0aW9uKGFjY291bnRLZXlzLCBpbnN0cnVjdGlvbiwgU1lTVEVNX1BST0dSQU1fSUQsIDMpO1xuICAgIGlmIChpc0NyZWF0ZVNlZWRJbnN0cnVjdGlvbikge1xuICAgICAgaW5zdHJ1Y3Rpb25MYXlvdXQgPSBzdHJ1Y3RJbnN0cnVjdGlvbkxheW91dFdpdGhvdXREYXRhKGluc3RydWN0aW9uKTtcbiAgICAgIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoICs9IGluc3RydWN0aW9uTGF5b3V0LmVuY29kZShpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb25CdWZmZXIsIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoKTtcbiAgICAgIGNvbnN0IHBhZGRpbmdTZWVkSW5zdHJ1Y3Rpb24gPSBwYWRkaW5nU2VlZEluc3RydWN0aW9uQnVmZmVyKFxuICAgICAgICBpbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICAgICAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGgsXG4gICAgICAgIGluc3RydWN0aW9uLmRhdGFcbiAgICAgICk7XG4gICAgICBpbnN0cnVjdGlvbkJ1ZmZlciA9IHBhZGRpbmdTZWVkSW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25CdWZmZXI7XG4gICAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCA9IHBhZGRpbmdTZWVkSW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RydWN0aW9uTGF5b3V0ID0gc3RydWN0SW5zdHJ1Y3Rpb25MYXlvdXQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggKz0gaW5zdHJ1Y3Rpb25MYXlvdXQuZW5jb2RlKGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbkJ1ZmZlciwgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGgpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBpbnN0cnVjdGlvbkJ1ZmZlci5zbGljZSgwLCBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVTaWduRGF0YShcbiAga2V5Q291bnQ6IG51bWJlcltdLFxuICBuZXdBY2NvdW50S2V5czogc3RyaW5nW10sXG4gIHJlY2VudEJsb2NraGFzaDogc3RyaW5nLFxuICBpbnN0cnVjdGlvbkJ1ZmZlcjogQnVmZmVyXG4pOiBCdWZmZXIge1xuICBjb25zdCBzaWduRGF0YUxheW91dCA9IHN0cnVjdFNpZ25EYXRhTGF5b3V0KGtleUNvdW50LCBuZXdBY2NvdW50S2V5cyk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0ge1xuICAgIGtleUNvdW50OiBCdWZmZXIuZnJvbShrZXlDb3VudCksXG4gICAga2V5czogbmV3QWNjb3VudEtleXMubWFwKChrZXkpID0+IEJ1ZmZlci5mcm9tKGtleSwgJ2hleCcpKSxcbiAgICByZWNlbnRCbG9ja2hhc2g6IEJ1ZmZlci5mcm9tKHJlY2VudEJsb2NraGFzaCwgJ2hleCcpLFxuICB9O1xuICBjb25zdCBzaWduRGF0YSA9IEJ1ZmZlci5hbGxvYygyMDQ4KTsgLy8gc2lnbiBkYXRhIG1heCBsZW5ndGhcbiAgY29uc3QgbGVuZ3RoID0gc2lnbkRhdGFMYXlvdXQuZW5jb2RlKHRyYW5zYWN0aW9uLCBzaWduRGF0YSk7XG4gIGluc3RydWN0aW9uQnVmZmVyLmNvcHkoc2lnbkRhdGEsIGxlbmd0aCk7XG4gIHJldHVybiBzaWduRGF0YS5zbGljZSgwLCBsZW5ndGggKyBpbnN0cnVjdGlvbkJ1ZmZlci5sZW5ndGgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBRUEsSUFBQUMsa0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQU1BLFNBQVNHLDBCQUEwQkEsQ0FBQ0MsZ0JBQTJCLEVBQXdCO0VBQ3JGLElBQU1DLGlCQUFpQixHQUFHQyxNQUFNLENBQUNDLEtBQUssQ0FBQ0Msd0JBQWdCLENBQUM7RUFDeEQsSUFBSUosZ0JBQWdCLEVBQUU7SUFDcEJFLE1BQU0sQ0FBQ0csSUFBSSxDQUFDTCxnQkFBZ0IsQ0FBQyxDQUFDTSxJQUFJLENBQUNMLGlCQUFpQixDQUFDO0VBQ3ZEO0VBQ0EsSUFBTU0sdUJBQXVCLEdBQUcsQ0FBQ1AsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHQSxnQkFBZ0IsQ0FBQ1EsTUFBTTtFQUMvRSxPQUFPO0lBQ0xQLGlCQUFpQixFQUFqQkEsaUJBQWlCO0lBQ2pCTSx1QkFBdUIsRUFBdkJBO0VBQ0YsQ0FBQztBQUNIO0FBRUEsU0FBU0UsNkJBQTZCQSxDQUFDQyxNQUl0QyxFQUF3QjtFQUN2QixJQUFRQyxhQUFhLEdBQW9ERCxNQUFNLENBQXZFQyxhQUFhO0lBQUVDLG9CQUFvQixHQUE4QkYsTUFBTSxDQUF4REUsb0JBQW9CO0lBQUVDLHVCQUF1QixHQUFLSCxNQUFNLENBQWxDRyx1QkFBdUI7RUFDcEUsSUFBTUMsZUFBZSxHQUFHWixNQUFNLENBQUNDLEtBQUssQ0FBQ1EsYUFBYSxDQUFDO0VBQ25ERyxlQUFlLENBQUNSLElBQUksQ0FBQ00sb0JBQW9CLEVBQUVDLHVCQUF1QixDQUFDO0VBQ25FLE9BQU87SUFDTFosaUJBQWlCLEVBQUVXLG9CQUFv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