@bitgo-beta/sdk-coin-sol 7.6.4-beta.78 → 7.6.4-beta.780
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/cjs/src/bigint-buffer-guard.js +29 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +12 -1
- package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/ataInitializationBuilder.js +231 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts +55 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/closeAtaBuilder.js +162 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +136 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.js +375 -0
- package/dist/{src → cjs/src}/lib/constants.d.ts +97 -2
- package/dist/cjs/src/lib/constants.d.ts.map +1 -0
- package/dist/cjs/src/lib/constants.js +277 -0
- package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +13 -2
- package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/customInstructionBuilder.js +392 -0
- package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
- package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
- package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
- package/dist/cjs/src/lib/iface.d.ts +538 -0
- package/dist/cjs/src/lib/iface.d.ts.map +1 -0
- package/dist/cjs/src/lib/iface.js +7 -0
- package/dist/{src → cjs/src}/lib/index.d.ts +9 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -0
- package/dist/cjs/src/lib/index.js +106 -0
- package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/instructionParamsFactory.js +1284 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
- package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
- package/dist/cjs/src/lib/keyPair.js +112 -0
- package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
- package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
- package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
- package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
- package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +36 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +211 -0
- package/dist/cjs/src/lib/serialization/index.d.ts +5 -0
- package/dist/cjs/src/lib/serialization/index.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/index.js +27 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
- package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
- package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/solInstructionFactory.js +1119 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
- package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
- package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
- package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
- package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
- package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
- package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/src/lib/token2022Resolve.js +199 -0
- package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
- package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenExtensions.js +109 -0
- package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
- package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
- package/dist/{src → cjs/src}/lib/transaction.d.ts +46 -1
- package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/transaction.js +761 -0
- package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +42 -1
- package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilder.js +462 -0
- package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +37 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.js +249 -0
- package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilder.js +81 -0
- package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
- package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
- package/dist/{src → cjs/src}/lib/utils.d.ts +16 -0
- package/dist/cjs/src/lib/utils.d.ts.map +1 -0
- package/dist/cjs/src/lib/utils.js +681 -0
- package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts +29 -0
- package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/v1CustomInstructionBuilder.js +36 -0
- package/dist/cjs/src/lib/v1PaymentBuilder.d.ts +36 -0
- package/dist/cjs/src/lib/v1PaymentBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/v1PaymentBuilder.js +70 -0
- package/dist/cjs/src/lib/v1TransactionBuilder.d.ts +253 -0
- package/dist/cjs/src/lib/v1TransactionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/v1TransactionBuilder.js +601 -0
- package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
- package/dist/cjs/src/register.d.ts +5 -0
- package/dist/cjs/src/register.d.ts.map +1 -0
- package/dist/cjs/src/register.js +29 -0
- package/dist/{src → cjs/src}/sol.d.ts +114 -3
- package/dist/cjs/src/sol.d.ts.map +1 -0
- package/dist/cjs/src/sol.js +1707 -0
- package/dist/{src → cjs/src}/solToken.d.ts +7 -0
- package/dist/cjs/src/solToken.d.ts.map +1 -0
- package/dist/cjs/src/solToken.js +79 -0
- package/dist/cjs/src/tsol.d.ts.map +1 -0
- package/dist/cjs/src/tsol.js +24 -0
- package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
- package/dist/cjs/test/fixtures/sol.js +1433 -0
- package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
- package/dist/cjs/test/resources/sol.d.ts.map +1 -0
- package/dist/cjs/test/resources/sol.js +320 -0
- package/dist/cjs/test/unit/ctEnablementVerify.d.ts +2 -0
- package/dist/cjs/test/unit/ctEnablementVerify.d.ts.map +1 -0
- package/dist/cjs/test/unit/ctEnablementVerify.js +143 -0
- package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
- package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
- package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
- package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
- package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
- package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
- package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
- package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
- package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
- package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
- package/dist/cjs/test/unit/keyPair.js +177 -0
- package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/cjs/test/unit/register.d.ts +2 -0
- package/dist/cjs/test/unit/register.d.ts.map +1 -0
- package/dist/cjs/test/unit/register.js +65 -0
- package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
- package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
- package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
- package/dist/cjs/test/unit/serialization/exportV1.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/exportV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/exportV1.js +21 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
- package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
- package/dist/cjs/test/unit/sol.js +5364 -0
- package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
- package/dist/cjs/test/unit/solIntentVersion.d.ts +2 -0
- package/dist/cjs/test/unit/solIntentVersion.d.ts.map +1 -0
- package/dist/cjs/test/unit/solIntentVersion.js +59 -0
- package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
- package/dist/cjs/test/unit/solToken.js +37 -0
- package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
- package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/test/unit/token2022Resolve.js +252 -0
- package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
- package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/test/unit/tokenExtensions.js +73 -0
- package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction.js +1129 -0
- package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
- package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.js +124 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +922 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +194 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +168 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +724 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
- package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.js +138 -0
- package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.js +331 -0
- package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
- package/dist/cjs/test/unit/utils.js +663 -0
- package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/versionedTransaction.js +207 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/bigint-buffer-guard.d.ts +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
- package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
- package/dist/esm/lib/ataInitializationBuilder.js +191 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/esm/lib/closeAtaBuilder.js +155 -0
- package/dist/esm/lib/confidentialTransferBuilder.d.ts +136 -0
- package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/esm/lib/confidentialTransferBuilder.js +368 -0
- package/dist/esm/lib/constants.d.ts +235 -0
- package/dist/esm/lib/constants.d.ts.map +1 -0
- package/dist/esm/lib/constants.js +274 -0
- package/dist/esm/lib/customInstructionBuilder.d.ts +83 -0
- package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +1 -1
- package/dist/esm/lib/customInstructionBuilder.js +385 -0
- package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
- package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
- package/dist/esm/lib/explainTransactionWasm.js +301 -0
- package/dist/esm/lib/iface.d.ts +538 -0
- package/dist/esm/lib/iface.d.ts.map +1 -0
- package/dist/esm/lib/iface.js +3 -0
- package/dist/esm/lib/index.d.ts +31 -0
- package/dist/esm/lib/index.d.ts.map +1 -0
- package/dist/esm/lib/index.js +31 -0
- package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
- package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
- package/dist/esm/lib/instructionParamsFactory.js +1276 -0
- package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
- package/dist/esm/lib/keyPair.d.ts +32 -0
- package/dist/esm/lib/keyPair.d.ts.map +1 -0
- package/dist/esm/lib/keyPair.js +75 -0
- package/dist/esm/lib/messages/index.d.ts +2 -0
- package/dist/esm/lib/messages/index.js +2 -0
- package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
- package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
- package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
- package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
- package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
- package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
- package/dist/esm/lib/scaledUiAmount.js +108 -0
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +36 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.js +208 -0
- package/dist/esm/lib/serialization/index.d.ts +5 -0
- package/dist/esm/lib/serialization/index.d.ts.map +1 -0
- package/dist/esm/lib/serialization/index.js +5 -0
- package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
- package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/wire-transaction.js +48 -0
- package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
- package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
- package/dist/esm/lib/solInstructionFactory.js +1113 -0
- package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
- package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingActivateBuilder.js +122 -0
- package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
- package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
- package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
- package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
- package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
- package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
- package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
- package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
- package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
- package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
- package/dist/esm/lib/token2022Resolve.d.ts +106 -0
- package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/esm/lib/token2022Resolve.js +194 -0
- package/dist/esm/lib/tokenExtensions.d.ts +26 -0
- package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/esm/lib/tokenExtensions.js +103 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/esm/lib/tokenTransferBuilder.js +230 -0
- package/dist/esm/lib/transaction.d.ts +148 -0
- package/dist/esm/lib/transaction.d.ts.map +1 -0
- package/dist/esm/lib/transaction.js +754 -0
- package/dist/esm/lib/transactionBuilder.d.ts +169 -0
- package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/esm/lib/transactionBuilder.js +455 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts +152 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/esm/lib/transactionBuilderFactory.js +245 -0
- package/dist/esm/lib/transferBuilder.d.ts +26 -0
- package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
- package/dist/esm/lib/transferBuilder.js +74 -0
- package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
- package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
- package/dist/esm/lib/transferBuilderV2.js +245 -0
- package/dist/esm/lib/utils.d.ts +216 -0
- package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +642 -0
- package/dist/esm/lib/v1CustomInstructionBuilder.d.ts +29 -0
- package/dist/esm/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
- package/dist/esm/lib/v1CustomInstructionBuilder.js +32 -0
- package/dist/esm/lib/v1PaymentBuilder.d.ts +36 -0
- package/dist/esm/lib/v1PaymentBuilder.d.ts.map +1 -0
- package/dist/esm/lib/v1PaymentBuilder.js +63 -0
- package/dist/esm/lib/v1TransactionBuilder.d.ts +253 -0
- package/dist/esm/lib/v1TransactionBuilder.d.ts.map +1 -0
- package/dist/esm/lib/v1TransactionBuilder.js +591 -0
- package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
- package/dist/esm/lib/walletInitializationBuilder.js +64 -0
- package/dist/esm/register.d.ts +5 -0
- package/dist/esm/register.d.ts.map +1 -0
- package/dist/esm/register.js +24 -0
- package/dist/esm/sol.d.ts +351 -0
- package/dist/esm/sol.d.ts.map +1 -0
- package/dist/esm/sol.js +1666 -0
- package/dist/esm/solToken.d.ts +44 -0
- package/dist/esm/solToken.d.ts.map +1 -0
- package/dist/esm/solToken.js +75 -0
- package/dist/esm/tsol.d.ts +11 -0
- package/dist/esm/tsol.js +20 -0
- package/package.json +37 -17
- package/dist/src/config/token2022StaticConfig.d.ts +0 -3
- package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
- package/dist/src/config/token2022StaticConfig.js +0 -50
- package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
- package/dist/src/lib/ataInitializationBuilder.js +0 -196
- package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
- package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
- package/dist/src/lib/closeAtaBuilder.js +0 -69
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -171
- package/dist/src/lib/customInstructionBuilder.js +0 -289
- package/dist/src/lib/iface.d.ts +0 -244
- package/dist/src/lib/iface.d.ts.map +0 -1
- package/dist/src/lib/iface.js +0 -7
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js +0 -77
- package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
- package/dist/src/lib/instructionParamsFactory.js +0 -1036
- package/dist/src/lib/jitoStakePoolOperations.js +0 -200
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -63
- package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
- package/dist/src/lib/solInstructionFactory.js +0 -572
- package/dist/src/lib/stakingActivateBuilder.js +0 -120
- package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
- package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
- package/dist/src/lib/stakingDelegateBuilder.js +0 -120
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
- package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
- package/dist/src/lib/token2022Config.d.ts +0 -44
- package/dist/src/lib/token2022Config.d.ts.map +0 -1
- package/dist/src/lib/token2022Config.js +0 -27
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
- package/dist/src/lib/tokenTransferBuilder.js +0 -188
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -595
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -380
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilderFactory.js +0 -202
- package/dist/src/lib/transferBuilder.js +0 -70
- package/dist/src/lib/transferBuilderV2.d.ts +0 -43
- package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
- package/dist/src/lib/transferBuilderV2.js +0 -210
- package/dist/src/lib/utils.js +0 -589
- package/dist/src/lib/walletInitializationBuilder.js +0 -71
- package/dist/src/register.d.ts +0 -3
- package/dist/src/register.d.ts.map +0 -1
- package/dist/src/register.js +0 -15
- package/dist/src/sol.d.ts.map +0 -1
- package/dist/src/sol.js +0 -1324
- package/dist/src/solToken.d.ts.map +0 -1
- package/dist/src/solToken.js +0 -69
- package/dist/src/tsol.js +0 -24
- package/dist/test/fixtures/sol.js +0 -1433
- package/dist/test/resources/sol.d.ts.map +0 -1
- package/dist/test/resources/sol.js +0 -320
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
- package/dist/test/unit/fixtures/solBackupKey.js +0 -8
- package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
- package/dist/test/unit/getBuilderFactory.js +0 -10
- package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
- package/dist/test/unit/instructionParamsFactory.js +0 -412
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
- package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
- package/dist/test/unit/keyPair.js +0 -177
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
- package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
- package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
- package/dist/test/unit/sol.js +0 -3180
- package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
- package/dist/test/unit/solInstructionFactory.js +0 -454
- package/dist/test/unit/solToken.d.ts.map +0 -1
- package/dist/test/unit/solToken.js +0 -31
- package/dist/test/unit/transaction.d.ts.map +0 -1
- package/dist/test/unit/transaction.js +0 -983
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
- package/dist/test/unit/utils.js +0 -517
- package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
- package/dist/test/unit/versionedTransaction.js +0 -207
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
- /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
- /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
- /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/tsol.d.ts.map +0 -0
|
@@ -0,0 +1,724 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const should_1 = __importDefault(require("should"));
|
|
40
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
41
|
+
const getBuilderFactory_1 = require("../getBuilderFactory");
|
|
42
|
+
const src_1 = require("../../../src");
|
|
43
|
+
const testData = __importStar(require("../../resources/sol"));
|
|
44
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
45
|
+
describe('Sol Custom Instruction Builder', () => {
|
|
46
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
47
|
+
const customInstructionBuilder = () => {
|
|
48
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
49
|
+
txBuilder.nonce(recentBlockHash);
|
|
50
|
+
txBuilder.sender(authAccount.pub);
|
|
51
|
+
return txBuilder;
|
|
52
|
+
};
|
|
53
|
+
const authAccount = new src_1.KeyPair(testData.authAccount).getKeys();
|
|
54
|
+
const otherAccount = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
|
|
55
|
+
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
56
|
+
const memo = 'test memo';
|
|
57
|
+
// Helper to deconstruct a serialized VersionedTransaction into the data shape
|
|
58
|
+
// consumed by fromVersionedTransactionData
|
|
59
|
+
function extractVersionedTransactionData(base64Bytes) {
|
|
60
|
+
const buffer = Buffer.from(base64Bytes, 'base64');
|
|
61
|
+
const versionedTx = web3_js_1.VersionedTransaction.deserialize(buffer);
|
|
62
|
+
return {
|
|
63
|
+
versionedInstructions: versionedTx.message.compiledInstructions.map((ci) => ({
|
|
64
|
+
programIdIndex: ci.programIdIndex,
|
|
65
|
+
accountKeyIndexes: ci.accountKeyIndexes,
|
|
66
|
+
data: bs58_1.default.encode(ci.data),
|
|
67
|
+
})),
|
|
68
|
+
addressLookupTables: versionedTx.message.addressTableLookups.map((alt) => ({
|
|
69
|
+
accountKey: alt.accountKey.toString(),
|
|
70
|
+
writableIndexes: alt.writableIndexes,
|
|
71
|
+
readonlyIndexes: alt.readonlyIndexes,
|
|
72
|
+
})),
|
|
73
|
+
staticAccountKeys: versionedTx.message.staticAccountKeys.map((key) => key.toString()),
|
|
74
|
+
messageHeader: {
|
|
75
|
+
numRequiredSignatures: versionedTx.message.header.numRequiredSignatures,
|
|
76
|
+
numReadonlySignedAccounts: versionedTx.message.header.numReadonlySignedAccounts,
|
|
77
|
+
numReadonlyUnsignedAccounts: versionedTx.message.header.numReadonlyUnsignedAccounts,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Helper function to convert TransactionInstruction to the expected format
|
|
82
|
+
const convertInstructionToParams = (instruction) => ({
|
|
83
|
+
programId: instruction.programId.toString(),
|
|
84
|
+
keys: instruction.keys.map((key) => ({
|
|
85
|
+
pubkey: key.pubkey.toString(),
|
|
86
|
+
isSigner: key.isSigner,
|
|
87
|
+
isWritable: key.isWritable,
|
|
88
|
+
})),
|
|
89
|
+
data: instruction.data.toString('hex'),
|
|
90
|
+
});
|
|
91
|
+
describe('Succeed', () => {
|
|
92
|
+
it('build a transaction with a single custom instruction', async () => {
|
|
93
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
94
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
95
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
96
|
+
lamports: 1000000,
|
|
97
|
+
});
|
|
98
|
+
const txBuilder = customInstructionBuilder();
|
|
99
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
100
|
+
const tx = await txBuilder.build();
|
|
101
|
+
tx.inputs.length.should.equal(0);
|
|
102
|
+
const rawTx = tx.toBroadcastFormat();
|
|
103
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
104
|
+
});
|
|
105
|
+
it('build a transaction with multiple custom instructions', async () => {
|
|
106
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
107
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
108
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
109
|
+
lamports: 1000000,
|
|
110
|
+
});
|
|
111
|
+
const priorityFeeInstruction = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({
|
|
112
|
+
microLamports: 1000,
|
|
113
|
+
});
|
|
114
|
+
const txBuilder = customInstructionBuilder();
|
|
115
|
+
txBuilder.addCustomInstructions([
|
|
116
|
+
convertInstructionToParams(transferInstruction),
|
|
117
|
+
convertInstructionToParams(priorityFeeInstruction),
|
|
118
|
+
]);
|
|
119
|
+
const tx = await txBuilder.build();
|
|
120
|
+
tx.inputs.length.should.equal(0);
|
|
121
|
+
tx.outputs.length.should.equal(0);
|
|
122
|
+
const rawTx = tx.toBroadcastFormat();
|
|
123
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
124
|
+
// Should have 2 instructions
|
|
125
|
+
tx.solTransaction.instructions.should.have.length(2);
|
|
126
|
+
});
|
|
127
|
+
it('build a transaction with custom instruction and memo', async () => {
|
|
128
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
129
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
130
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
131
|
+
lamports: 1000000,
|
|
132
|
+
});
|
|
133
|
+
const txBuilder = customInstructionBuilder();
|
|
134
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
135
|
+
txBuilder.memo(memo);
|
|
136
|
+
const tx = await txBuilder.build();
|
|
137
|
+
const rawTx = tx.toBroadcastFormat();
|
|
138
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
139
|
+
// Should have instruction + memo
|
|
140
|
+
tx.solTransaction.instructions.should.have.length(2);
|
|
141
|
+
});
|
|
142
|
+
it('build a signed transaction with custom instruction', async () => {
|
|
143
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
144
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
145
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
146
|
+
lamports: 1000000,
|
|
147
|
+
});
|
|
148
|
+
const txBuilder = customInstructionBuilder();
|
|
149
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
150
|
+
txBuilder.sign({ key: authAccount.prv });
|
|
151
|
+
const tx = await txBuilder.build();
|
|
152
|
+
const rawTx = tx.toBroadcastFormat();
|
|
153
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
154
|
+
// Should be signed
|
|
155
|
+
tx.solTransaction.signatures.should.not.be.empty();
|
|
156
|
+
});
|
|
157
|
+
it('clear instructions from builder', async () => {
|
|
158
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
159
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
160
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
161
|
+
lamports: 1000000,
|
|
162
|
+
});
|
|
163
|
+
const txBuilder = customInstructionBuilder();
|
|
164
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
165
|
+
txBuilder.getInstructions().should.have.length(1);
|
|
166
|
+
txBuilder.clearInstructions();
|
|
167
|
+
txBuilder.getInstructions().should.have.length(0);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('Fail', () => {
|
|
171
|
+
it('for null instruction', () => {
|
|
172
|
+
const txBuilder = customInstructionBuilder();
|
|
173
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
174
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(null)).throwError('Instruction cannot be null or undefined');
|
|
175
|
+
});
|
|
176
|
+
it('for undefined instruction', () => {
|
|
177
|
+
const txBuilder = customInstructionBuilder();
|
|
178
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
179
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(undefined)).throwError('Instruction cannot be null or undefined');
|
|
180
|
+
});
|
|
181
|
+
it('for instruction without programId', () => {
|
|
182
|
+
const txBuilder = customInstructionBuilder();
|
|
183
|
+
const invalidInstruction = {
|
|
184
|
+
keys: [],
|
|
185
|
+
data: '',
|
|
186
|
+
};
|
|
187
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
188
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(invalidInstruction)).throwError('Versioned instruction must have a valid programIdIndex number');
|
|
189
|
+
});
|
|
190
|
+
it('for instruction without keys', () => {
|
|
191
|
+
const txBuilder = customInstructionBuilder();
|
|
192
|
+
const invalidInstruction = {
|
|
193
|
+
programId: '11111111111111111111111111111112',
|
|
194
|
+
data: '',
|
|
195
|
+
};
|
|
196
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
197
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(invalidInstruction)).throwError('Instruction must have valid keys array');
|
|
198
|
+
});
|
|
199
|
+
it('for instruction without data', () => {
|
|
200
|
+
const txBuilder = customInstructionBuilder();
|
|
201
|
+
const invalidInstruction = {
|
|
202
|
+
programId: '11111111111111111111111111111112',
|
|
203
|
+
keys: [],
|
|
204
|
+
};
|
|
205
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
206
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(invalidInstruction)).throwError('Instruction must have valid data string');
|
|
207
|
+
});
|
|
208
|
+
it('for non-array in addCustomInstructions', () => {
|
|
209
|
+
const txBuilder = customInstructionBuilder();
|
|
210
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
211
|
+
(0, should_1.default)(() => txBuilder.addCustomInstructions('invalid')).throwError('Instructions must be an array');
|
|
212
|
+
});
|
|
213
|
+
it('when building without instructions', async () => {
|
|
214
|
+
const txBuilder = customInstructionBuilder();
|
|
215
|
+
await txBuilder.build().should.be.rejectedWith('At least one custom instruction must be specified');
|
|
216
|
+
});
|
|
217
|
+
it('when building without sender', async () => {
|
|
218
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
219
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
220
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
221
|
+
lamports: 1000000,
|
|
222
|
+
});
|
|
223
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
224
|
+
txBuilder.nonce(recentBlockHash);
|
|
225
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
226
|
+
await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing sender');
|
|
227
|
+
});
|
|
228
|
+
it('when building without nonce', async () => {
|
|
229
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
230
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
231
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
232
|
+
lamports: 1000000,
|
|
233
|
+
});
|
|
234
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
235
|
+
txBuilder.sender(authAccount.pub);
|
|
236
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
237
|
+
await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing nonce blockhash');
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
describe('SolVersionedInstruction Support', () => {
|
|
241
|
+
it('should accept and validate SolVersionedInstruction format', () => {
|
|
242
|
+
const compiledInstruction = {
|
|
243
|
+
programIdIndex: 1,
|
|
244
|
+
accountKeyIndexes: [0, 2, 3],
|
|
245
|
+
data: '3Bxs43ZMjSRQLs6o', // base58 encoded instruction data
|
|
246
|
+
};
|
|
247
|
+
const txBuilder = customInstructionBuilder();
|
|
248
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(compiledInstruction)).not.throwError();
|
|
249
|
+
txBuilder.getInstructions().should.have.length(1);
|
|
250
|
+
const addedInstruction = txBuilder.getInstructions()[0];
|
|
251
|
+
addedInstruction.params.should.deepEqual(compiledInstruction);
|
|
252
|
+
});
|
|
253
|
+
it('should validate versioned instruction format', () => {
|
|
254
|
+
const txBuilder = customInstructionBuilder();
|
|
255
|
+
// Invalid programIdIndex
|
|
256
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction({
|
|
257
|
+
programIdIndex: -1,
|
|
258
|
+
accountKeyIndexes: [0],
|
|
259
|
+
data: '1', // base58 for 0x00
|
|
260
|
+
})).throwError('Versioned instruction must have a valid programIdIndex number');
|
|
261
|
+
// Invalid accountKeyIndexes
|
|
262
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction({
|
|
263
|
+
programIdIndex: 0,
|
|
264
|
+
accountKeyIndexes: [-1],
|
|
265
|
+
data: '1', // base58 for 0x00
|
|
266
|
+
})).throwError('Each accountKeyIndex must be a non-negative number');
|
|
267
|
+
// Missing data
|
|
268
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction({
|
|
269
|
+
programIdIndex: 0,
|
|
270
|
+
accountKeyIndexes: [0],
|
|
271
|
+
})).throwError('Versioned instruction must have valid data string');
|
|
272
|
+
});
|
|
273
|
+
it('should handle mixed SolInstruction and SolVersionedInstruction', () => {
|
|
274
|
+
const traditionalInstruction = convertInstructionToParams(web3_js_1.SystemProgram.transfer({
|
|
275
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
276
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
277
|
+
lamports: 1000000,
|
|
278
|
+
}));
|
|
279
|
+
const compiledInstruction = {
|
|
280
|
+
programIdIndex: 1,
|
|
281
|
+
accountKeyIndexes: [0, 2],
|
|
282
|
+
data: '4HSo5YVBrgChTZX5',
|
|
283
|
+
};
|
|
284
|
+
const txBuilder = customInstructionBuilder();
|
|
285
|
+
txBuilder.addCustomInstruction(traditionalInstruction);
|
|
286
|
+
txBuilder.addCustomInstruction(compiledInstruction);
|
|
287
|
+
txBuilder.getInstructions().should.have.length(2);
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
describe('fromVersionedTransactionData', () => {
|
|
291
|
+
it('should process VersionedTransactionData and extract instructions', () => {
|
|
292
|
+
const txBuilder = customInstructionBuilder();
|
|
293
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
294
|
+
// Should parse without throwing errors
|
|
295
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData(versionedTxData)).not.throwError();
|
|
296
|
+
// Should have extracted instructions
|
|
297
|
+
const instructions = txBuilder.getInstructions();
|
|
298
|
+
instructions.length.should.be.greaterThan(0);
|
|
299
|
+
for (const instruction of instructions) {
|
|
300
|
+
instruction.type.should.equal('VersionedCustomInstruction');
|
|
301
|
+
instruction.params.should.have.property('programIdIndex');
|
|
302
|
+
instruction.params.should.have.property('accountKeyIndexes');
|
|
303
|
+
instruction.params.should.have.property('data');
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
it('should store VersionedTransactionData in underlying transaction', async () => {
|
|
307
|
+
const txBuilder = customInstructionBuilder();
|
|
308
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
309
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
310
|
+
const tx = txBuilder['_transaction'];
|
|
311
|
+
const storedData = tx.getVersionedTransactionData();
|
|
312
|
+
should_1.default.exist(storedData);
|
|
313
|
+
storedData.versionedInstructions.length.should.equal(versionedTxData.versionedInstructions.length);
|
|
314
|
+
storedData.addressLookupTables.length.should.equal(versionedTxData.addressLookupTables.length);
|
|
315
|
+
storedData.staticAccountKeys.length.should.equal(versionedTxData.staticAccountKeys.length);
|
|
316
|
+
});
|
|
317
|
+
it('should validate input data', () => {
|
|
318
|
+
const txBuilder = customInstructionBuilder();
|
|
319
|
+
// Invalid: null/undefined
|
|
320
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData(null)).throwError(/must be a valid object/);
|
|
321
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData(undefined)).throwError(/must be a valid object/);
|
|
322
|
+
// Invalid: empty instructions
|
|
323
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData({
|
|
324
|
+
versionedInstructions: [],
|
|
325
|
+
addressLookupTables: [],
|
|
326
|
+
staticAccountKeys: ['test'],
|
|
327
|
+
messageHeader: { numRequiredSignatures: 1, numReadonlySignedAccounts: 0, numReadonlyUnsignedAccounts: 0 },
|
|
328
|
+
})).throwError(/non-empty array/);
|
|
329
|
+
// Invalid: missing addressLookupTables
|
|
330
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData({
|
|
331
|
+
versionedInstructions: [{ programIdIndex: 0, accountKeyIndexes: [0], data: '1' }], // base58 for 0x00
|
|
332
|
+
staticAccountKeys: ['test'],
|
|
333
|
+
})).throwError(/must be an array/);
|
|
334
|
+
// Invalid: empty staticAccountKeys
|
|
335
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData({
|
|
336
|
+
versionedInstructions: [{ programIdIndex: 0, accountKeyIndexes: [0], data: '1' }], // base58 for 0x00
|
|
337
|
+
addressLookupTables: [],
|
|
338
|
+
staticAccountKeys: [],
|
|
339
|
+
messageHeader: { numRequiredSignatures: 1, numReadonlySignedAccounts: 0, numReadonlyUnsignedAccounts: 0 },
|
|
340
|
+
})).throwError(/non-empty array/);
|
|
341
|
+
});
|
|
342
|
+
it('should work with the complete transaction building flow', async () => {
|
|
343
|
+
const txBuilder = customInstructionBuilder();
|
|
344
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
345
|
+
// Process the VersionedTransactionData
|
|
346
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
347
|
+
txBuilder.sender(versionedTxData.staticAccountKeys[0]); // Fee payer
|
|
348
|
+
txBuilder.nonce(testData.blockHashes.validBlockHashes[0]);
|
|
349
|
+
const tx = await txBuilder.build();
|
|
350
|
+
// Verify transaction properties
|
|
351
|
+
tx.should.be.ok();
|
|
352
|
+
tx.type.should.equal(31); // TransactionType.CustomTx enum value
|
|
353
|
+
// Verify signable payload
|
|
354
|
+
const payload = tx.signablePayload;
|
|
355
|
+
payload.should.be.instanceOf(Buffer);
|
|
356
|
+
payload.length.should.be.greaterThan(0);
|
|
357
|
+
// Verify payload is deterministic - rebuilding with same params produces same payload
|
|
358
|
+
const txBuilder2 = customInstructionBuilder();
|
|
359
|
+
txBuilder2.fromVersionedTransactionData(versionedTxData);
|
|
360
|
+
txBuilder2.sender(versionedTxData.staticAccountKeys[0]);
|
|
361
|
+
txBuilder2.nonce(testData.blockHashes.validBlockHashes[0]);
|
|
362
|
+
const tx2 = await txBuilder2.build();
|
|
363
|
+
should_1.default.equal(tx2.signablePayload.toString('hex'), payload.toString('hex'));
|
|
364
|
+
});
|
|
365
|
+
it('should extract the correct number of instructions from Jupiter transaction', () => {
|
|
366
|
+
const txBuilder = customInstructionBuilder();
|
|
367
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
368
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
369
|
+
const instructions = txBuilder.getInstructions();
|
|
370
|
+
// Verify we extracted instructions
|
|
371
|
+
instructions.length.should.be.greaterThan(0);
|
|
372
|
+
instructions.length.should.equal(versionedTxData.versionedInstructions.length);
|
|
373
|
+
// Verify each instruction has valid compiled format
|
|
374
|
+
for (const instruction of instructions) {
|
|
375
|
+
const params = instruction.params;
|
|
376
|
+
(typeof params.programIdIndex).should.equal('number');
|
|
377
|
+
params.programIdIndex.should.be.greaterThanOrEqual(0);
|
|
378
|
+
Array.isArray(params.accountKeyIndexes).should.equal(true);
|
|
379
|
+
(typeof params.data).should.equal('string');
|
|
380
|
+
// Data should be valid base58 string (non-empty)
|
|
381
|
+
params.data.length.should.be.greaterThan(0);
|
|
382
|
+
// Verify it can be decoded
|
|
383
|
+
should_1.default.doesNotThrow(() => bs58_1.default.decode(params.data));
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
it('should clear instructions properly after using fromVersionedTransactionData', () => {
|
|
387
|
+
const txBuilder = customInstructionBuilder();
|
|
388
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
389
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
390
|
+
txBuilder.getInstructions().length.should.be.greaterThan(0);
|
|
391
|
+
// Clear should work
|
|
392
|
+
txBuilder.clearInstructions();
|
|
393
|
+
txBuilder.getInstructions().should.have.length(0);
|
|
394
|
+
});
|
|
395
|
+
it('should extract fee payer from staticAccountKeys', () => {
|
|
396
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
397
|
+
txBuilder.nonce(recentBlockHash);
|
|
398
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
399
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
400
|
+
const sender = txBuilder['_sender'];
|
|
401
|
+
should_1.default.exist(sender);
|
|
402
|
+
sender.should.equal(versionedTxData.staticAccountKeys[0]);
|
|
403
|
+
});
|
|
404
|
+
it('should not override existing sender', () => {
|
|
405
|
+
const txBuilder = customInstructionBuilder();
|
|
406
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
407
|
+
const originalSender = txBuilder['_sender'];
|
|
408
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
409
|
+
const sender = txBuilder['_sender'];
|
|
410
|
+
sender.should.equal(originalSender);
|
|
411
|
+
sender.should.equal(authAccount.pub);
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
describe('durable nonce injection', () => {
|
|
415
|
+
const SYSTEM_PROGRAM_ID = web3_js_1.SystemProgram.programId.toBase58();
|
|
416
|
+
const SYSVAR_RECENT_BLOCKHASHES_ID = web3_js_1.SYSVAR_RECENT_BLOCKHASHES_PUBKEY.toBase58();
|
|
417
|
+
const walletNonceAddress = testData.nonceAccount.pub;
|
|
418
|
+
const authWalletAddress = authAccount.pub;
|
|
419
|
+
const seededPublicKey = (seed) => web3_js_1.Keypair.fromSeed(Buffer.alloc(32, seed)).publicKey;
|
|
420
|
+
// Deterministic fixture keys covering all four MessageV0 header sections
|
|
421
|
+
const fixturePayer = seededPublicKey(11); // writable signer (account 0)
|
|
422
|
+
const fixtureRoSigner = seededPublicKey(12); // read-only signer
|
|
423
|
+
const fixtureWritableNonSigner = seededPublicKey(13);
|
|
424
|
+
const fixtureRoNonSigner = seededPublicKey(14);
|
|
425
|
+
const fixtureAltWritable = seededPublicKey(15); // loaded from the lookup table
|
|
426
|
+
const fixtureAltReadonly = seededPublicKey(16); // loaded from the lookup table
|
|
427
|
+
const fixtureProgram = seededPublicKey(17);
|
|
428
|
+
// The lookup table has filler addresses at indexes 0 and 2 so the
|
|
429
|
+
// referenced indexes (1 writable, 3 readonly) are non-trivial
|
|
430
|
+
const lookupTableAccount = new web3_js_1.AddressLookupTableAccount({
|
|
431
|
+
key: seededPublicKey(200),
|
|
432
|
+
state: {
|
|
433
|
+
deactivationSlot: BigInt(0),
|
|
434
|
+
lastExtendedSlot: 0,
|
|
435
|
+
lastExtendedSlotStartIndex: 0,
|
|
436
|
+
addresses: [seededPublicKey(90), fixtureAltWritable, seededPublicKey(91), fixtureAltReadonly],
|
|
437
|
+
},
|
|
438
|
+
});
|
|
439
|
+
/**
|
|
440
|
+
* Compile versioned transaction data through web3.js with a lookup table,
|
|
441
|
+
* mirroring the data callers extract from a real VersionedTransaction.
|
|
442
|
+
*/
|
|
443
|
+
function buildVersionedFixture(payerKey, instructions) {
|
|
444
|
+
const message = web3_js_1.MessageV0.compile({
|
|
445
|
+
payerKey,
|
|
446
|
+
recentBlockhash: recentBlockHash,
|
|
447
|
+
addressLookupTableAccounts: [lookupTableAccount],
|
|
448
|
+
instructions: instructions.map((ix) => new web3_js_1.TransactionInstruction({
|
|
449
|
+
programId: ix.programId,
|
|
450
|
+
keys: ix.keys,
|
|
451
|
+
data: Buffer.from([1, 2, 3, 4]),
|
|
452
|
+
})),
|
|
453
|
+
});
|
|
454
|
+
const data = {
|
|
455
|
+
versionedInstructions: message.compiledInstructions.map((ci) => ({
|
|
456
|
+
programIdIndex: ci.programIdIndex,
|
|
457
|
+
accountKeyIndexes: [...ci.accountKeyIndexes],
|
|
458
|
+
data: bs58_1.default.encode(ci.data),
|
|
459
|
+
})),
|
|
460
|
+
addressLookupTables: message.addressTableLookups.map((alt) => ({
|
|
461
|
+
accountKey: alt.accountKey.toBase58(),
|
|
462
|
+
writableIndexes: [...alt.writableIndexes],
|
|
463
|
+
readonlyIndexes: [...alt.readonlyIndexes],
|
|
464
|
+
})),
|
|
465
|
+
staticAccountKeys: message.staticAccountKeys.map((key) => key.toBase58()),
|
|
466
|
+
messageHeader: {
|
|
467
|
+
numRequiredSignatures: message.header.numRequiredSignatures,
|
|
468
|
+
numReadonlySignedAccounts: message.header.numReadonlySignedAccounts,
|
|
469
|
+
numReadonlyUnsignedAccounts: message.header.numReadonlyUnsignedAccounts,
|
|
470
|
+
},
|
|
471
|
+
recentBlockhash: recentBlockHash,
|
|
472
|
+
};
|
|
473
|
+
return { message, data };
|
|
474
|
+
}
|
|
475
|
+
/** Compile processed VersionedTransactionData back into a MessageV0 */
|
|
476
|
+
function compileProcessedMessage(data) {
|
|
477
|
+
return new web3_js_1.MessageV0({
|
|
478
|
+
header: { ...data.messageHeader },
|
|
479
|
+
staticAccountKeys: data.staticAccountKeys.map((key) => new web3_js_1.PublicKey(key)),
|
|
480
|
+
recentBlockhash: data.recentBlockhash ?? recentBlockHash,
|
|
481
|
+
compiledInstructions: data.versionedInstructions.map((instruction) => ({
|
|
482
|
+
programIdIndex: instruction.programIdIndex,
|
|
483
|
+
accountKeyIndexes: [...instruction.accountKeyIndexes],
|
|
484
|
+
data: Buffer.from(bs58_1.default.decode(instruction.data)),
|
|
485
|
+
})),
|
|
486
|
+
addressTableLookups: data.addressLookupTables.map((alt) => ({
|
|
487
|
+
accountKey: new web3_js_1.PublicKey(alt.accountKey),
|
|
488
|
+
writableIndexes: [...alt.writableIndexes],
|
|
489
|
+
readonlyIndexes: [...alt.readonlyIndexes],
|
|
490
|
+
})),
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
/** Inject the durable nonce advance instruction and return the processed data */
|
|
494
|
+
function injectNonceAdvance(data) {
|
|
495
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
496
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress, authWalletAddress });
|
|
497
|
+
txBuilder.fromVersionedTransactionData(data);
|
|
498
|
+
const processed = txBuilder['_transaction'].getVersionedTransactionData();
|
|
499
|
+
should_1.default.exist(processed);
|
|
500
|
+
return processed;
|
|
501
|
+
}
|
|
502
|
+
/** Fixture using every header section and both lookup-table slots */
|
|
503
|
+
const mainFixture = () => buildVersionedFixture(fixturePayer, [
|
|
504
|
+
{
|
|
505
|
+
programId: fixtureProgram,
|
|
506
|
+
keys: [
|
|
507
|
+
{ pubkey: fixturePayer, isSigner: true, isWritable: true },
|
|
508
|
+
{ pubkey: fixtureRoSigner, isSigner: true, isWritable: false },
|
|
509
|
+
{ pubkey: fixtureAltWritable, isSigner: false, isWritable: true },
|
|
510
|
+
{ pubkey: fixtureAltReadonly, isSigner: false, isWritable: false },
|
|
511
|
+
{ pubkey: fixtureWritableNonSigner, isSigner: false, isWritable: true },
|
|
512
|
+
{ pubkey: fixtureRoNonSigner, isSigner: false, isWritable: false },
|
|
513
|
+
],
|
|
514
|
+
},
|
|
515
|
+
]);
|
|
516
|
+
it('keeps lookup-table-referencing instructions pointing at the same accounts', () => {
|
|
517
|
+
const { message, data } = mainFixture();
|
|
518
|
+
const processed = injectNonceAdvance(data);
|
|
519
|
+
// The fixture must actually reference accounts loaded from the lookup table
|
|
520
|
+
Math.max(...data.versionedInstructions.flatMap((ix) => [...ix.accountKeyIndexes, ix.programIdIndex])).should.be.greaterThanOrEqual(data.staticAccountKeys.length);
|
|
521
|
+
const before = message.getAccountKeys({ addressLookupTableAccounts: [lookupTableAccount] });
|
|
522
|
+
const after = compileProcessedMessage(processed).getAccountKeys({
|
|
523
|
+
addressLookupTableAccounts: [lookupTableAccount],
|
|
524
|
+
});
|
|
525
|
+
processed.versionedInstructions.should.have.length(data.versionedInstructions.length + 1);
|
|
526
|
+
const remappedInstructions = processed.versionedInstructions.slice(1);
|
|
527
|
+
remappedInstructions.forEach((instruction, ixIndex) => {
|
|
528
|
+
const original = data.versionedInstructions[ixIndex];
|
|
529
|
+
before.get(original.programIdIndex).toBase58().should.equal(after.get(instruction.programIdIndex).toBase58());
|
|
530
|
+
instruction.accountKeyIndexes.should.have.length(original.accountKeyIndexes.length);
|
|
531
|
+
original.accountKeyIndexes.forEach((_, k) => {
|
|
532
|
+
before
|
|
533
|
+
.get(original.accountKeyIndexes[k])
|
|
534
|
+
.toBase58()
|
|
535
|
+
.should.equal(after.get(instruction.accountKeyIndexes[k]).toBase58());
|
|
536
|
+
});
|
|
537
|
+
instruction.data.should.equal(original.data);
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
it('keeps Jupiter lookup-table accounts pointing at the same accounts', () => {
|
|
541
|
+
const data = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
542
|
+
const processed = injectNonceAdvance(data);
|
|
543
|
+
// authority, nonce account and sysvar are added; the system program is already present
|
|
544
|
+
const shift = processed.staticAccountKeys.length - data.staticAccountKeys.length;
|
|
545
|
+
shift.should.equal(3);
|
|
546
|
+
processed.messageHeader.should.deepEqual({
|
|
547
|
+
numRequiredSignatures: 2,
|
|
548
|
+
numReadonlySignedAccounts: 1,
|
|
549
|
+
numReadonlyUnsignedAccounts: 6,
|
|
550
|
+
});
|
|
551
|
+
const oldStaticLen = data.staticAccountKeys.length;
|
|
552
|
+
const remappedInstructions = processed.versionedInstructions.slice(1);
|
|
553
|
+
remappedInstructions.forEach((instruction, ixIndex) => {
|
|
554
|
+
const original = data.versionedInstructions[ixIndex];
|
|
555
|
+
const remappedProgramIndex = instruction.programIdIndex;
|
|
556
|
+
if (original.programIdIndex < oldStaticLen) {
|
|
557
|
+
processed.staticAccountKeys[remappedProgramIndex].should.equal(data.staticAccountKeys[original.programIdIndex]);
|
|
558
|
+
}
|
|
559
|
+
else {
|
|
560
|
+
remappedProgramIndex.should.equal(original.programIdIndex + shift);
|
|
561
|
+
}
|
|
562
|
+
original.accountKeyIndexes.forEach((oldIndex, k) => {
|
|
563
|
+
const newIndex = instruction.accountKeyIndexes[k];
|
|
564
|
+
if (oldIndex < oldStaticLen) {
|
|
565
|
+
processed.staticAccountKeys[newIndex].should.equal(data.staticAccountKeys[oldIndex]);
|
|
566
|
+
}
|
|
567
|
+
else {
|
|
568
|
+
newIndex.should.equal(oldIndex + shift);
|
|
569
|
+
}
|
|
570
|
+
});
|
|
571
|
+
});
|
|
572
|
+
});
|
|
573
|
+
it('makes the nonce account writable and keeps original read-only accounts read-only', () => {
|
|
574
|
+
const { data } = mainFixture();
|
|
575
|
+
const processed = injectNonceAdvance(data);
|
|
576
|
+
const message = compileProcessedMessage(processed);
|
|
577
|
+
// header adjusted for the new authority, nonce account, sysvar and system program
|
|
578
|
+
processed.messageHeader.should.deepEqual({
|
|
579
|
+
numRequiredSignatures: 3, // payer + ro signer + new authority
|
|
580
|
+
numReadonlySignedAccounts: 2, // ro signer + new authority
|
|
581
|
+
numReadonlyUnsignedAccounts: 4, // ro non-signer, program, system program, sysvar
|
|
582
|
+
});
|
|
583
|
+
const indexOf = (key) => processed.staticAccountKeys.indexOf(key);
|
|
584
|
+
// AdvanceNonceAccount requires a writable nonce account
|
|
585
|
+
message.isAccountWritable(indexOf(walletNonceAddress)).should.equal(true);
|
|
586
|
+
// original accounts keep their writability
|
|
587
|
+
message.isAccountWritable(indexOf(fixturePayer.toBase58())).should.equal(true);
|
|
588
|
+
message.isAccountWritable(indexOf(fixtureWritableNonSigner.toBase58())).should.equal(true);
|
|
589
|
+
message.isAccountWritable(indexOf(fixtureRoSigner.toBase58())).should.equal(false);
|
|
590
|
+
message.isAccountWritable(indexOf(fixtureRoNonSigner.toBase58())).should.equal(false);
|
|
591
|
+
message.isAccountWritable(indexOf(fixtureProgram.toBase58())).should.equal(false);
|
|
592
|
+
// the new authority is a read-only signer
|
|
593
|
+
message.isAccountSigner(indexOf(authWalletAddress)).should.equal(true);
|
|
594
|
+
message.isAccountWritable(indexOf(authWalletAddress)).should.equal(false);
|
|
595
|
+
// no duplicate keys
|
|
596
|
+
new Set(processed.staticAccountKeys).size.should.equal(processed.staticAccountKeys.length);
|
|
597
|
+
});
|
|
598
|
+
it('prepends a well-formed AdvanceNonceAccount instruction', () => {
|
|
599
|
+
const { data } = mainFixture();
|
|
600
|
+
const processed = injectNonceAdvance(data);
|
|
601
|
+
const [nonceAdvance] = processed.versionedInstructions;
|
|
602
|
+
should_1.default.exist(nonceAdvance);
|
|
603
|
+
nonceAdvance.data.should.equal('6vx8P'); // SystemProgram AdvanceNonceAccount
|
|
604
|
+
nonceAdvance.programIdIndex.should.equal(processed.staticAccountKeys.indexOf(SYSTEM_PROGRAM_ID));
|
|
605
|
+
nonceAdvance.accountKeyIndexes.should.deepEqual([
|
|
606
|
+
processed.staticAccountKeys.indexOf(walletNonceAddress),
|
|
607
|
+
processed.staticAccountKeys.indexOf(SYSVAR_RECENT_BLOCKHASHES_ID),
|
|
608
|
+
processed.staticAccountKeys.indexOf(authWalletAddress),
|
|
609
|
+
]);
|
|
610
|
+
});
|
|
611
|
+
it('turns an authority already present as a writable non-signer into a writable signer, once', () => {
|
|
612
|
+
const { data } = buildVersionedFixture(fixturePayer, [
|
|
613
|
+
{
|
|
614
|
+
programId: fixtureProgram,
|
|
615
|
+
keys: [
|
|
616
|
+
{ pubkey: fixturePayer, isSigner: true, isWritable: true },
|
|
617
|
+
// authority already present as a writable non-signer
|
|
618
|
+
{ pubkey: new web3_js_1.PublicKey(authWalletAddress), isSigner: false, isWritable: true },
|
|
619
|
+
{ pubkey: fixtureRoNonSigner, isSigner: false, isWritable: false },
|
|
620
|
+
],
|
|
621
|
+
},
|
|
622
|
+
]);
|
|
623
|
+
const processed = injectNonceAdvance(data);
|
|
624
|
+
const message = compileProcessedMessage(processed);
|
|
625
|
+
// appears once, as a signer, keeping its writability
|
|
626
|
+
processed.staticAccountKeys.filter((key) => key === authWalletAddress).should.have.length(1);
|
|
627
|
+
const authIndex = processed.staticAccountKeys.indexOf(authWalletAddress);
|
|
628
|
+
message.isAccountSigner(authIndex).should.equal(true);
|
|
629
|
+
message.isAccountWritable(authIndex).should.equal(true);
|
|
630
|
+
processed.messageHeader.numRequiredSignatures.should.equal(data.messageHeader.numRequiredSignatures + 1);
|
|
631
|
+
processed.messageHeader.numReadonlySignedAccounts.should.equal(data.messageHeader.numReadonlySignedAccounts);
|
|
632
|
+
});
|
|
633
|
+
it('turns an authority already present as a read-only non-signer into a read-only signer, once', () => {
|
|
634
|
+
const { data } = buildVersionedFixture(fixturePayer, [
|
|
635
|
+
{
|
|
636
|
+
programId: fixtureProgram,
|
|
637
|
+
keys: [
|
|
638
|
+
{ pubkey: fixturePayer, isSigner: true, isWritable: true },
|
|
639
|
+
// authority already present as a read-only non-signer
|
|
640
|
+
{ pubkey: new web3_js_1.PublicKey(authWalletAddress), isSigner: false, isWritable: false },
|
|
641
|
+
{ pubkey: fixtureWritableNonSigner, isSigner: false, isWritable: true },
|
|
642
|
+
],
|
|
643
|
+
},
|
|
644
|
+
]);
|
|
645
|
+
const processed = injectNonceAdvance(data);
|
|
646
|
+
const message = compileProcessedMessage(processed);
|
|
647
|
+
// appears once, as a read-only signer
|
|
648
|
+
processed.staticAccountKeys.filter((key) => key === authWalletAddress).should.have.length(1);
|
|
649
|
+
const authIndex = processed.staticAccountKeys.indexOf(authWalletAddress);
|
|
650
|
+
message.isAccountSigner(authIndex).should.equal(true);
|
|
651
|
+
message.isAccountWritable(authIndex).should.equal(false);
|
|
652
|
+
processed.messageHeader.numRequiredSignatures.should.equal(data.messageHeader.numRequiredSignatures + 1);
|
|
653
|
+
processed.messageHeader.numReadonlySignedAccounts.should.equal(data.messageHeader.numReadonlySignedAccounts + 1);
|
|
654
|
+
// it left the read-only non-signers (system program + sysvar are added)
|
|
655
|
+
processed.messageHeader.numReadonlyUnsignedAccounts.should.equal(data.messageHeader.numReadonlyUnsignedAccounts + 1);
|
|
656
|
+
});
|
|
657
|
+
it('does not add a signer when the nonce authority is already the fee payer', () => {
|
|
658
|
+
const { data } = buildVersionedFixture(new web3_js_1.PublicKey(authWalletAddress), [
|
|
659
|
+
{
|
|
660
|
+
programId: fixtureProgram,
|
|
661
|
+
keys: [
|
|
662
|
+
{ pubkey: new web3_js_1.PublicKey(authWalletAddress), isSigner: true, isWritable: true },
|
|
663
|
+
{ pubkey: fixtureWritableNonSigner, isSigner: false, isWritable: true },
|
|
664
|
+
],
|
|
665
|
+
},
|
|
666
|
+
]);
|
|
667
|
+
const processed = injectNonceAdvance(data);
|
|
668
|
+
const message = compileProcessedMessage(processed);
|
|
669
|
+
processed.staticAccountKeys[0].should.equal(authWalletAddress);
|
|
670
|
+
processed.staticAccountKeys.filter((key) => key === authWalletAddress).should.have.length(1);
|
|
671
|
+
processed.messageHeader.numRequiredSignatures.should.equal(data.messageHeader.numRequiredSignatures);
|
|
672
|
+
processed.messageHeader.numReadonlySignedAccounts.should.equal(data.messageHeader.numReadonlySignedAccounts);
|
|
673
|
+
message.isAccountSigner(0).should.equal(true);
|
|
674
|
+
});
|
|
675
|
+
it('moves a nonce account already present as read-only into the writable non-signers', () => {
|
|
676
|
+
const { data } = buildVersionedFixture(fixturePayer, [
|
|
677
|
+
{
|
|
678
|
+
programId: fixtureProgram,
|
|
679
|
+
keys: [
|
|
680
|
+
{ pubkey: fixturePayer, isSigner: true, isWritable: true },
|
|
681
|
+
{ pubkey: fixtureRoNonSigner, isSigner: false, isWritable: false },
|
|
682
|
+
// nonce account already present as a read-only non-signer
|
|
683
|
+
{ pubkey: new web3_js_1.PublicKey(walletNonceAddress), isSigner: false, isWritable: false },
|
|
684
|
+
],
|
|
685
|
+
},
|
|
686
|
+
]);
|
|
687
|
+
const processed = injectNonceAdvance(data);
|
|
688
|
+
const message = compileProcessedMessage(processed);
|
|
689
|
+
processed.staticAccountKeys.filter((key) => key === walletNonceAddress).should.have.length(1);
|
|
690
|
+
const nonceIndex = processed.staticAccountKeys.indexOf(walletNonceAddress);
|
|
691
|
+
message.isAccountWritable(nonceIndex).should.equal(true);
|
|
692
|
+
message.isAccountSigner(nonceIndex).should.equal(false);
|
|
693
|
+
// the other original read-only account stays read-only
|
|
694
|
+
message.isAccountWritable(processed.staticAccountKeys.indexOf(fixtureRoNonSigner.toBase58())).should.equal(false);
|
|
695
|
+
});
|
|
696
|
+
it('produces a signable payload that deserializes as a MessageV0 with the nonce advance first', async () => {
|
|
697
|
+
const { data } = mainFixture();
|
|
698
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
699
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress, authWalletAddress });
|
|
700
|
+
txBuilder.fromVersionedTransactionData(data);
|
|
701
|
+
const tx = await txBuilder.build();
|
|
702
|
+
const message = web3_js_1.MessageV0.deserialize(tx.signablePayload);
|
|
703
|
+
message.compiledInstructions.should.have.length(data.versionedInstructions.length + 1);
|
|
704
|
+
const nonceAdvance = message.compiledInstructions[0];
|
|
705
|
+
message.staticAccountKeys[nonceAdvance.programIdIndex].toBase58().should.equal(SYSTEM_PROGRAM_ID);
|
|
706
|
+
message.staticAccountKeys[nonceAdvance.accountKeyIndexes[0]].toBase58().should.equal(walletNonceAddress);
|
|
707
|
+
message.staticAccountKeys[nonceAdvance.accountKeyIndexes[1]]
|
|
708
|
+
.toBase58()
|
|
709
|
+
.should.equal(SYSVAR_RECENT_BLOCKHASHES_ID);
|
|
710
|
+
message.staticAccountKeys[nonceAdvance.accountKeyIndexes[2]].toBase58().should.equal(authWalletAddress);
|
|
711
|
+
});
|
|
712
|
+
it('rejects versioned data whose message header is inconsistent', () => {
|
|
713
|
+
const { data } = mainFixture();
|
|
714
|
+
const inconsistent = {
|
|
715
|
+
...data,
|
|
716
|
+
messageHeader: { ...data.messageHeader, numReadonlyUnsignedAccounts: 99 },
|
|
717
|
+
};
|
|
718
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
719
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress, authWalletAddress });
|
|
720
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData(inconsistent)).throwError(/Invalid message header/);
|
|
721
|
+
});
|
|
722
|
+
});
|
|
723
|
+
});
|
|
724
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBVXlCO0FBQ3pCLDREQUF5RDtBQUN6RCxzQ0FBMkQ7QUFDM0QsOERBQWdEO0FBR2hELGdEQUEwQjtBQUUxQixRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO0lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEVBQUU7UUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDeEQsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyRixNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztJQUN2RSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUM7SUFFekIsOEVBQThFO0lBQzlFLDJDQUEyQztJQUMzQyxTQUFTLCtCQUErQixDQUFDLFdBQW1C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Q0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekQsUUFBUSxFQUFFO2lCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM5QyxPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEdBQUcsRUFBRTtZQUNyRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxZQUFZLEdBQUc7Z0JBQ25CLEdBQUcsSUFBSTtnQkFDUCxhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsMkJBQTJCLEVBQUUsRUFBRSxFQUFFO2FBQzFFLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN4RCxTQUFTLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUM1RSxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHtcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgUHVibGljS2V5LFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbiAgVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG4gIEtleXBhaXIsXG4gIE1lc3NhZ2VWMCxcbiAgQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCxcbiAgU1lTVkFSX1JFQ0VOVF9CTE9DS0hBU0hFU19QVUJLRVksXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IEtleVBhaXIsIFV0aWxzLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IFNvbFZlcnNpb25lZEluc3RydWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5pbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuXG5kZXNjcmliZSgnU29sIEN1c3RvbSBJbnN0cnVjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3Rzb2wnKTtcblxuICBjb25zdCBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBhdXRoQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmF1dGhBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IG90aGVyQWNjb3VudCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcnZLZXlzLnBydktleTEuYmFzZTU4IH0pLmdldEtleXMoKTtcbiAgY29uc3QgcmVjZW50QmxvY2tIYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcbiAgY29uc3QgbWVtbyA9ICd0ZXN0IG1lbW8nO1xuXG4gIC8vIEhlbHBlciB0byBkZWNvbnN0cnVjdCBhIHNlcmlhbGl6ZWQgVmVyc2lvbmVkVHJhbnNhY3Rpb24gaW50byB0aGUgZGF0YSBzaGFwZVxuICAvLyBjb25zdW1lZCBieSBmcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhXG4gIGZ1bmN0aW9uIGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoYmFzZTY0Qnl0ZXM6IHN0cmluZyk6IFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0Qnl0ZXMsICdiYXNlNjQnKTtcbiAgICBjb25zdCB2ZXJzaW9uZWRUeCA9IFZlcnNpb25lZFRyYW5zYWN0aW9uLmRlc2VyaWFsaXplKGJ1ZmZlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiB2ZXJzaW9uZWRUeC5tZXNzYWdlLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLm1hcCgoY2kpID0+ICh7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBjaS5wcm9ncmFtSWRJbmRleCxcbiAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IGNpLmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgICBkYXRhOiBiYXNlNTguZW5jb2RlKGNpLmRhdGEpLFxuICAgICAgfSkpLFxuICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlczogdmVyc2lvbmVkVHgubWVzc2FnZS5hZGRyZXNzVGFibGVMb29rdXBzLm1hcCgoYWx0KSA9PiAoe1xuICAgICAgICBhY2NvdW50S2V5OiBhbHQuYWNjb3VudEtleS50b1N0cmluZygpLFxuICAgICAgICB3cml0YWJsZUluZGV4ZXM6IGFsdC53cml0YWJsZUluZGV4ZXMsXG4gICAgICAgIHJlYWRvbmx5SW5kZXhlczogYWx0LnJlYWRvbmx5SW5kZXhlcyxcbiAgICAgIH0pKSxcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzOiB2ZXJzaW9uZWRUeC5tZXNzYWdlLnN0YXRpY0FjY291bnRLZXlzLm1hcCgoa2V5KSA9PiBrZXkudG9TdHJpbmcoKSksXG4gICAgICBtZXNzYWdlSGVhZGVyOiB7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogdmVyc2lvbmVkVHgubWVzc2FnZS5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLFxuICAgICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiB2ZXJzaW9uZWRUeC5tZXNzYWdlLmhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzLFxuICAgICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IHZlcnNpb25lZFR4Lm1lc3NhZ2UuaGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24gdG8gdGhlIGV4cGVjdGVkIGZvcm1hdFxuICBjb25zdCBjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyA9IChpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbikgPT4gKHtcbiAgICBwcm9ncmFtSWQ6IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpLFxuICAgIGtleXM6IGluc3RydWN0aW9uLmtleXMubWFwKChrZXkpID0+ICh7XG4gICAgICBwdWJrZXk6IGtleS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGlzU2lnbmVyOiBrZXkuaXNTaWduZXIsXG4gICAgICBpc1dyaXRhYmxlOiBrZXkuaXNXcml0YWJsZSxcbiAgICB9KSksXG4gICAgZGF0YTogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygnaGV4JyksXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTdWNjZWVkJywgKCkgPT4ge1xuICAgIGl0KCdidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggYSBzaW5nbGUgY3VzdG9tIGluc3RydWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNhY3Rpb24gd2l0aCBtdWx0aXBsZSBjdXN0b20gaW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcmlvcml0eUZlZUluc3RydWN0aW9uID0gQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRQcmljZSh7XG4gICAgICAgIG1pY3JvTGFtcG9ydHM6IDEwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zKFtcbiAgICAgICAgY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbiksXG4gICAgICAgIGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHByaW9yaXR5RmVlSW5zdHJ1Y3Rpb24pLFxuICAgICAgXSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICAvLyBTaG91bGQgaGF2ZSAyIGluc3RydWN0aW9uc1xuICAgICAgKHR4IGFzIFRyYW5zYWN0aW9uKS5zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNhY3Rpb24gd2l0aCBjdXN0b20gaW5zdHJ1Y3Rpb24gYW5kIG1lbW8nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aEFjY291bnQucHViKSxcbiAgICAgICAgdG9QdWJrZXk6IG5ldyBQdWJsaWNLZXkob3RoZXJBY2NvdW50LnB1YiksXG4gICAgICAgIGxhbXBvcnRzOiAxMDAwMDAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHRyYW5zZmVySW5zdHJ1Y3Rpb24pKTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICAvLyBTaG91bGQgaGF2ZSBpbnN0cnVjdGlvbiArIG1lbW9cbiAgICAgICh0eCBhcyBUcmFuc2FjdGlvbikuc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIGN1c3RvbSBpbnN0cnVjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbikpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGF1dGhBY2NvdW50LnBydiB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gU2hvdWxkIGJlIHNpZ25lZFxuICAgICAgKHR4IGFzIFRyYW5zYWN0aW9uKS5zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjbGVhciBpbnN0cnVjdGlvbnMgZnJvbSBidWlsZGVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuXG4gICAgICB0eEJ1aWxkZXIuY2xlYXJJbnN0cnVjdGlvbnMoKTtcbiAgICAgIHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKS5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFR5cGUgZm9yIHRlc3RpbmcgaW52YWxpZCBpbnN0cnVjdGlvbiBmb3JtYXRzXG4gIGludGVyZmFjZSBJbnZhbGlkSW5zdHJ1Y3Rpb24ge1xuICAgIHByb2dyYW1JZD86IHN0cmluZztcbiAgICBrZXlzPzogdW5rbm93bjtcbiAgICBkYXRhPzogdW5rbm93bjtcbiAgfVxuXG4gIGRlc2NyaWJlKCdGYWlsJywgKCkgPT4ge1xuICAgIGl0KCdmb3IgbnVsbCBpbnN0cnVjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24obnVsbCBhcyBhbnkpKS50aHJvd0Vycm9yKCdJbnN0cnVjdGlvbiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgdW5kZWZpbmVkIGluc3RydWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih1bmRlZmluZWQgYXMgYW55KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0luc3RydWN0aW9uIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGluc3RydWN0aW9uIHdpdGhvdXQgcHJvZ3JhbUlkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBjb25zdCBpbnZhbGlkSW5zdHJ1Y3Rpb246IEludmFsaWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAga2V5czogW10sXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgfTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oaW52YWxpZEluc3RydWN0aW9uIGFzIGFueSkpLnRocm93RXJyb3IoXG4gICAgICAgICdWZXJzaW9uZWQgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIGEgdmFsaWQgcHJvZ3JhbUlkSW5kZXggbnVtYmVyJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW5zdHJ1Y3Rpb24gd2l0aG91dCBrZXlzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBjb25zdCBpbnZhbGlkSW5zdHJ1Y3Rpb246IEludmFsaWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgcHJvZ3JhbUlkOiAnMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTInLFxuICAgICAgICBkYXRhOiAnJyxcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGludmFsaWRJbnN0cnVjdGlvbiBhcyBhbnkpKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIHZhbGlkIGtleXMgYXJyYXknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvciBpbnN0cnVjdGlvbiB3aXRob3V0IGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IGludmFsaWRJbnN0cnVjdGlvbjogSW52YWxpZEluc3RydWN0aW9uID0ge1xuICAgICAgICBwcm9ncmFtSWQ6ICcxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMicsXG4gICAgICAgIGtleXM6IFtdLFxuICAgICAgfTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oaW52YWxpZEluc3RydWN0aW9uIGFzIGFueSkpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnN0cnVjdGlvbiBtdXN0IGhhdmUgdmFsaWQgZGF0YSBzdHJpbmcnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvciBub24tYXJyYXkgaW4gYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbnMoJ2ludmFsaWQnIGFzIGFueSkpLnRocm93RXJyb3IoJ0luc3RydWN0aW9ucyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2hlbiBidWlsZGluZyB3aXRob3V0IGluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnQXQgbGVhc3Qgb25lIGN1c3RvbSBpbnN0cnVjdGlvbiBtdXN0IGJlIHNwZWNpZmllZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3doZW4gYnVpbGRpbmcgd2l0aG91dCBzZW5kZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aEFjY291bnQucHViKSxcbiAgICAgICAgdG9QdWJrZXk6IG5ldyBQdWJsaWNLZXkob3RoZXJBY2NvdW50LnB1YiksXG4gICAgICAgIGxhbXBvcnRzOiAxMDAwMDAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgc2VuZGVyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2hlbiBidWlsZGluZyB3aXRob3V0IG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcihhdXRoQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHRyYW5zZmVySW5zdHJ1Y3Rpb24pKTtcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBub25jZSBibG9ja2hhc2gnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NvbFZlcnNpb25lZEluc3RydWN0aW9uIFN1cHBvcnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYW5kIHZhbGlkYXRlIFNvbFZlcnNpb25lZEluc3RydWN0aW9uIGZvcm1hdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBpbGVkSW5zdHJ1Y3Rpb246IFNvbFZlcnNpb25lZEluc3RydWN0aW9uID0ge1xuICAgICAgICBwcm9ncmFtSWRJbmRleDogMSxcbiAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IFswLCAyLCAzXSxcbiAgICAgICAgZGF0YTogJzNCeHM0M1pNalNSUUxzNm8nLCAvLyBiYXNlNTggZW5jb2RlZCBpbnN0cnVjdGlvbiBkYXRhXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29tcGlsZWRJbnN0cnVjdGlvbikpLm5vdC50aHJvd0Vycm9yKCk7XG5cbiAgICAgIHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBhZGRlZEluc3RydWN0aW9uID0gdHhCdWlsZGVyLmdldEluc3RydWN0aW9ucygpWzBdO1xuICAgICAgYWRkZWRJbnN0cnVjdGlvbi5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbChjb21waWxlZEluc3RydWN0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdmVyc2lvbmVkIGluc3RydWN0aW9uIGZvcm1hdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuXG4gICAgICAvLyBJbnZhbGlkIHByb2dyYW1JZEluZGV4XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKHtcbiAgICAgICAgICBwcm9ncmFtSWRJbmRleDogLTEsXG4gICAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IFswXSxcbiAgICAgICAgICBkYXRhOiAnMScsIC8vIGJhc2U1OCBmb3IgMHgwMFxuICAgICAgICB9IGFzIFNvbFZlcnNpb25lZEluc3RydWN0aW9uKVxuICAgICAgKS50aHJvd0Vycm9yKCdWZXJzaW9uZWQgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIGEgdmFsaWQgcHJvZ3JhbUlkSW5kZXggbnVtYmVyJyk7XG5cbiAgICAgIC8vIEludmFsaWQgYWNjb3VudEtleUluZGV4ZXNcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oe1xuICAgICAgICAgIHByb2dyYW1JZEluZGV4OiAwLFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbLTFdLFxuICAgICAgICAgIGRhdGE6ICcxJywgLy8gYmFzZTU4IGZvciAweDAwXG4gICAgICAgIH0gYXMgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24pXG4gICAgICApLnRocm93RXJyb3IoJ0VhY2ggYWNjb3VudEtleUluZGV4IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJyk7XG5cbiAgICAgIC8vIE1pc3NpbmcgZGF0YVxuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih7XG4gICAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IDAsXG4gICAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IFswXSxcbiAgICAgICAgfSBhcyBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbilcbiAgICAgICkudGhyb3dFcnJvcignVmVyc2lvbmVkIGluc3RydWN0aW9uIG11c3QgaGF2ZSB2YWxpZCBkYXRhIHN0cmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWl4ZWQgU29sSW5zdHJ1Y3Rpb24gYW5kIFNvbFZlcnNpb25lZEluc3RydWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhZGl0aW9uYWxJbnN0cnVjdGlvbiA9IGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKFxuICAgICAgICBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgICAgdG9QdWJrZXk6IG5ldyBQdWJsaWNLZXkob3RoZXJBY2NvdW50LnB1YiksXG4gICAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCBjb21waWxlZEluc3RydWN0aW9uOiBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IDEsXG4gICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbMCwgMl0sXG4gICAgICAgIGRhdGE6ICc0SFNvNVlWQnJnQ2hUWlg1JyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKHRyYWRpdGlvbmFsSW5zdHJ1Y3Rpb24pO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbXBpbGVkSW5zdHJ1Y3Rpb24pO1xuXG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIGFuZCBleHRyYWN0IGluc3RydWN0aW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIC8vIFNob3VsZCBwYXJzZSB3aXRob3V0IHRocm93aW5nIGVycm9yc1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSkpLm5vdC50aHJvd0Vycm9yKCk7XG5cbiAgICAgIC8vIFNob3VsZCBoYXZlIGV4dHJhY3RlZCBpbnN0cnVjdGlvbnNcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKTtcbiAgICAgIGluc3RydWN0aW9ucy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuXG4gICAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgICBpbnN0cnVjdGlvbi50eXBlLnNob3VsZC5lcXVhbCgnVmVyc2lvbmVkQ3VzdG9tSW5zdHJ1Y3Rpb24nKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwcm9ncmFtSWRJbmRleCcpO1xuICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FjY291bnRLZXlJbmRleGVzJyk7XG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZGF0YScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdG9yZSBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgaW4gdW5kZXJseWluZyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gdHhCdWlsZGVyWydfdHJhbnNhY3Rpb24nXTtcbiAgICAgIGNvbnN0IHN0b3JlZERhdGEgPSB0eC5nZXRWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoKTtcbiAgICAgIHNob3VsZC5leGlzdChzdG9yZWREYXRhKTtcbiAgICAgIHN0b3JlZERhdGEhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKHZlcnNpb25lZFR4RGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMubGVuZ3RoKTtcbiAgICAgIHN0b3JlZERhdGEhLmFkZHJlc3NMb29rdXBUYWJsZXMubGVuZ3RoLnNob3VsZC5lcXVhbCh2ZXJzaW9uZWRUeERhdGEuYWRkcmVzc0xvb2t1cFRhYmxlcy5sZW5ndGgpO1xuICAgICAgc3RvcmVkRGF0YSEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoLnNob3VsZC5lcXVhbCh2ZXJzaW9uZWRUeERhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgaW5wdXQgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuXG4gICAgICAvLyBJbnZhbGlkOiBudWxsL3VuZGVmaW5lZFxuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKG51bGwgYXMgYW55KSkudGhyb3dFcnJvcigvbXVzdCBiZSBhIHZhbGlkIG9iamVjdC8pO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHVuZGVmaW5lZCBhcyBhbnkpKS50aHJvd0Vycm9yKC9tdXN0IGJlIGEgdmFsaWQgb2JqZWN0Lyk7XG5cbiAgICAgIC8vIEludmFsaWQ6IGVtcHR5IGluc3RydWN0aW9uc1xuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHtcbiAgICAgICAgICB2ZXJzaW9uZWRJbnN0cnVjdGlvbnM6IFtdLFxuICAgICAgICAgIGFkZHJlc3NMb29rdXBUYWJsZXM6IFtdLFxuICAgICAgICAgIHN0YXRpY0FjY291bnRLZXlzOiBbJ3Rlc3QnXSxcbiAgICAgICAgICBtZXNzYWdlSGVhZGVyOiB7IG51bVJlcXVpcmVkU2lnbmF0dXJlczogMSwgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogMCwgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiAwIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoL25vbi1lbXB0eSBhcnJheS8pO1xuXG4gICAgICAvLyBJbnZhbGlkOiBtaXNzaW5nIGFkZHJlc3NMb29rdXBUYWJsZXNcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh7XG4gICAgICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiBbeyBwcm9ncmFtSWRJbmRleDogMCwgYWNjb3VudEtleUluZGV4ZXM6IFswXSwgZGF0YTogJzEnIH1dLCAvLyBiYXNlNTggZm9yIDB4MDBcbiAgICAgICAgICBzdGF0aWNBY2NvdW50S2V5czogWyd0ZXN0J10sXG4gICAgICAgIH0gYXMgYW55KVxuICAgICAgKS50aHJvd0Vycm9yKC9tdXN0IGJlIGFuIGFycmF5Lyk7XG5cbiAgICAgIC8vIEludmFsaWQ6IGVtcHR5IHN0YXRpY0FjY291bnRLZXlzXG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoe1xuICAgICAgICAgIHZlcnNpb25lZEluc3RydWN0aW9uczogW3sgcHJvZ3JhbUlkSW5kZXg6IDAsIGFjY291bnRLZXlJbmRleGVzOiBbMF0sIGRhdGE6ICcxJyB9XSwgLy8gYmFzZTU4IGZvciAweDAwXG4gICAgICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlczogW10sXG4gICAgICAgICAgc3RhdGljQWNjb3VudEtleXM6IFtdLFxuICAgICAgICAgIG1lc3NhZ2VIZWFkZXI6IHsgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiAxLCBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiAwLCBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IDAgfSxcbiAgICAgICAgfSlcbiAgICAgICkudGhyb3dFcnJvcigvbm9uLWVtcHR5IGFycmF5Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgdHJhbnNhY3Rpb24gYnVpbGRpbmcgZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YVxuICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcblxuICAgICAgdHhCdWlsZGVyLnNlbmRlcih2ZXJzaW9uZWRUeERhdGEuc3RhdGljQWNjb3VudEtleXNbMF0pOyAvLyBGZWUgcGF5ZXJcbiAgICAgIHR4QnVpbGRlci5ub25jZSh0ZXN0RGF0YS5ibG9ja0hhc2hlcy52YWxpZEJsb2NrSGFzaGVzWzBdKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIHByb3BlcnRpZXNcbiAgICAgIHR4LnNob3VsZC5iZS5vaygpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoMzEpOyAvLyBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHggZW51bSB2YWx1ZVxuXG4gICAgICAvLyBWZXJpZnkgc2lnbmFibGUgcGF5bG9hZFxuICAgICAgY29uc3QgcGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIHBheWxvYWQuc2hvdWxkLmJlLmluc3RhbmNlT2YoQnVmZmVyKTtcbiAgICAgIHBheWxvYWQubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IHBheWxvYWQgaXMgZGV0ZXJtaW5pc3RpYyAtIHJlYnVpbGRpbmcgd2l0aCBzYW1lIHBhcmFtcyBwcm9kdWNlcyBzYW1lIHBheWxvYWRcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlcjIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpO1xuICAgICAgdHhCdWlsZGVyMi5zZW5kZXIodmVyc2lvbmVkVHhEYXRhLnN0YXRpY0FjY291bnRLZXlzWzBdKTtcbiAgICAgIHR4QnVpbGRlcjIubm9uY2UodGVzdERhdGEuYmxvY2tIYXNoZXMudmFsaWRCbG9ja0hhc2hlc1swXSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgyLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4JyksIHBheWxvYWQudG9TdHJpbmcoJ2hleCcpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGZyb20gSnVwaXRlciB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG5cbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKTtcblxuICAgICAgLy8gVmVyaWZ5IHdlIGV4dHJhY3RlZCBpbnN0cnVjdGlvbnNcbiAgICAgIGluc3RydWN0aW9ucy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgaW5zdHJ1Y3Rpb25zLmxlbmd0aC5zaG91bGQuZXF1YWwodmVyc2lvbmVkVHhEYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGgpO1xuXG4gICAgICAvLyBWZXJpZnkgZWFjaCBpbnN0cnVjdGlvbiBoYXMgdmFsaWQgY29tcGlsZWQgZm9ybWF0XG4gICAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBpbnN0cnVjdGlvbi5wYXJhbXMgYXMgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb247XG4gICAgICAgICh0eXBlb2YgcGFyYW1zLnByb2dyYW1JZEluZGV4KS5zaG91bGQuZXF1YWwoJ251bWJlcicpO1xuICAgICAgICBwYXJhbXMucHJvZ3JhbUlkSW5kZXguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuT3JFcXVhbCgwKTtcbiAgICAgICAgQXJyYXkuaXNBcnJheShwYXJhbXMuYWNjb3VudEtleUluZGV4ZXMpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgICAgKHR5cGVvZiBwYXJhbXMuZGF0YSkuc2hvdWxkLmVxdWFsKCdzdHJpbmcnKTtcbiAgICAgICAgLy8gRGF0YSBzaG91bGQgYmUgdmFsaWQgYmFzZTU4IHN0cmluZyAobm9uLWVtcHR5KVxuICAgICAgICBwYXJhbXMuZGF0YS5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgICAvLyBWZXJpZnkgaXQgY2FuIGJlIGRlY29kZWRcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBiYXNlNTguZGVjb2RlKHBhcmFtcy5kYXRhKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNsZWFyIGluc3RydWN0aW9ucyBwcm9wZXJseSBhZnRlciB1c2luZyBmcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBjb25zdCB2ZXJzaW9uZWRUeERhdGEgPSBleHRyYWN0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHRlc3REYXRhLkpVUElURVJfVkVSU0lPTkVEX1RYX0JZVEVTKTtcblxuICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKS5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuXG4gICAgICAvLyBDbGVhciBzaG91bGQgd29ya1xuICAgICAgdHhCdWlsZGVyLmNsZWFySW5zdHJ1Y3Rpb25zKCk7XG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IGZlZSBwYXllciBmcm9tIHN0YXRpY0FjY291bnRLZXlzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuXG4gICAgICBjb25zdCB2ZXJzaW9uZWRUeERhdGEgPSBleHRyYWN0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHRlc3REYXRhLkpVUElURVJfVkVSU0lPTkVEX1RYX0JZVEVTKTtcblxuICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcblxuICAgICAgY29uc3Qgc2VuZGVyID0gdHhCdWlsZGVyWydfc2VuZGVyJ107XG4gICAgICBzaG91bGQuZXhpc3Qoc2VuZGVyKTtcbiAgICAgIHNlbmRlci5zaG91bGQuZXF1YWwodmVyc2lvbmVkVHhEYXRhLnN0YXRpY0FjY291bnRLZXlzWzBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IG92ZXJyaWRlIGV4aXN0aW5nIHNlbmRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsU2VuZGVyID0gdHhCdWlsZGVyWydfc2VuZGVyJ107XG4gICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpO1xuXG4gICAgICBjb25zdCBzZW5kZXIgPSB0eEJ1aWxkZXJbJ19zZW5kZXInXTtcbiAgICAgIHNlbmRlci5zaG91bGQuZXF1YWwob3JpZ2luYWxTZW5kZXIpO1xuICAgICAgc2VuZGVyLnNob3VsZC5lcXVhbChhdXRoQWNjb3VudC5wdWIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZHVyYWJsZSBub25jZSBpbmplY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgU1lTVEVNX1BST0dSQU1fSUQgPSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVNfSUQgPSBTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX1BVQktFWS50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IHdhbGxldE5vbmNlQWRkcmVzcyA9IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWI7XG4gICAgY29uc3QgYXV0aFdhbGxldEFkZHJlc3MgPSBhdXRoQWNjb3VudC5wdWI7XG5cbiAgICBjb25zdCBzZWVkZWRQdWJsaWNLZXkgPSAoc2VlZDogbnVtYmVyKTogUHVibGljS2V5ID0+IEtleXBhaXIuZnJvbVNlZWQoQnVmZmVyLmFsbG9jKDMyLCBzZWVkKSkucHVibGljS2V5O1xuXG4gICAgLy8gRGV0ZXJtaW5pc3RpYyBmaXh0dXJlIGtleXMgY292ZXJpbmcgYWxsIGZvdXIgTWVzc2FnZVYwIGhlYWRlciBzZWN0aW9uc1xuICAgIGNvbnN0IGZpeHR1cmVQYXllciA9IHNlZWRlZFB1YmxpY0tleSgxMSk7IC8vIHdyaXRhYmxlIHNpZ25lciAoYWNjb3VudCAwKVxuICAgIGNvbnN0IGZpeHR1cmVSb1NpZ25lciA9IHNlZWRlZFB1YmxpY0tleSgxMik7IC8vIHJlYWQtb25seSBzaWduZXJcbiAgICBjb25zdCBmaXh0dXJlV3JpdGFibGVOb25TaWduZXIgPSBzZWVkZWRQdWJsaWNLZXkoMTMpO1xuICAgIGNvbnN0IGZpeHR1cmVSb05vblNpZ25lciA9IHNlZWRlZFB1YmxpY0tleSgxNCk7XG4gICAgY29uc3QgZml4dHVyZUFsdFdyaXRhYmxlID0gc2VlZGVkUHVibGljS2V5KDE1KTsgLy8gbG9hZGVkIGZyb20gdGhlIGxvb2t1cCB0YWJsZVxuICAgIGNvbnN0IGZpeHR1cmVBbHRSZWFkb25seSA9IHNlZWRlZFB1YmxpY0tleSgxNik7IC8vIGxvYWRlZCBmcm9tIHRoZSBsb29rdXAgdGFibGVcbiAgICBjb25zdCBmaXh0dXJlUHJvZ3JhbSA9IHNlZWRlZFB1YmxpY0tleSgxNyk7XG5cbiAgICAvLyBUaGUgbG9va3VwIHRhYmxlIGhhcyBmaWxsZXIgYWRkcmVzc2VzIGF0IGluZGV4ZXMgMCBhbmQgMiBzbyB0aGVcbiAgICAvLyByZWZlcmVuY2VkIGluZGV4ZXMgKDEgd3JpdGFibGUsIDMgcmVhZG9ubHkpIGFyZSBub24tdHJpdmlhbFxuICAgIGNvbnN0IGxvb2t1cFRhYmxlQWNjb3VudCA9IG5ldyBBZGRyZXNzTG9va3VwVGFibGVBY2NvdW50KHtcbiAgICAgIGtleTogc2VlZGVkUHVibGljS2V5KDIwMCksXG4gICAgICBzdGF0ZToge1xuICAgICAgICBkZWFjdGl2YXRpb25TbG90OiBCaWdJbnQoMCksXG4gICAgICAgIGxhc3RFeHRlbmRlZFNsb3Q6IDAsXG4gICAgICAgIGxhc3RFeHRlbmRlZFNsb3RTdGFydEluZGV4OiAwLFxuICAgICAgICBhZGRyZXNzZXM6IFtzZWVkZWRQdWJsaWNLZXkoOTApLCBmaXh0dXJlQWx0V3JpdGFibGUsIHNlZWRlZFB1YmxpY0tleSg5MSksIGZpeHR1cmVBbHRSZWFkb25seV0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcGlsZSB2ZXJzaW9uZWQgdHJhbnNhY3Rpb24gZGF0YSB0aHJvdWdoIHdlYjMuanMgd2l0aCBhIGxvb2t1cCB0YWJsZSxcbiAgICAgKiBtaXJyb3JpbmcgdGhlIGRhdGEgY2FsbGVycyBleHRyYWN0IGZyb20gYSByZWFsIFZlcnNpb25lZFRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJ1aWxkVmVyc2lvbmVkRml4dHVyZShcbiAgICAgIHBheWVyS2V5OiBQdWJsaWNLZXksXG4gICAgICBpbnN0cnVjdGlvbnM6IHtcbiAgICAgICAgcHJvZ3JhbUlkOiBQdWJsaWNLZXk7XG4gICAgICAgIGtleXM6IHsgcHVia2V5OiBQdWJsaWNLZXk7IGlzU2lnbmVyOiBib29sZWFuOyBpc1dyaXRhYmxlOiBib29sZWFuIH1bXTtcbiAgICAgIH1bXVxuICAgICk6IHsgbWVzc2FnZTogTWVzc2FnZVYwOyBkYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gTWVzc2FnZVYwLmNvbXBpbGUoe1xuICAgICAgICBwYXllcktleSxcbiAgICAgICAgcmVjZW50QmxvY2toYXNoOiByZWNlbnRCbG9ja0hhc2gsXG4gICAgICAgIGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzOiBbbG9va3VwVGFibGVBY2NvdW50XSxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnN0cnVjdGlvbnMubWFwKFxuICAgICAgICAgIChpeCkgPT5cbiAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgICAgICAgICAgcHJvZ3JhbUlkOiBpeC5wcm9ncmFtSWQsXG4gICAgICAgICAgICAgIGtleXM6IGl4LmtleXMsXG4gICAgICAgICAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKFsxLCAyLCAzLCA0XSksXG4gICAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGE6IFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSA9IHtcbiAgICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiBtZXNzYWdlLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLm1hcCgoY2kpID0+ICh7XG4gICAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IGNpLnByb2dyYW1JZEluZGV4LFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbLi4uY2kuYWNjb3VudEtleUluZGV4ZXNdLFxuICAgICAgICAgIGRhdGE6IGJhc2U1OC5lbmNvZGUoY2kuZGF0YSksXG4gICAgICAgIH0pKSxcbiAgICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlczogbWVzc2FnZS5hZGRyZXNzVGFibGVMb29rdXBzLm1hcCgoYWx0KSA9PiAoe1xuICAgICAgICAgIGFjY291bnRLZXk6IGFsdC5hY2NvdW50S2V5LnRvQmFzZTU4KCksXG4gICAgICAgICAgd3JpdGFibGVJbmRleGVzOiBbLi4uYWx0LndyaXRhYmxlSW5kZXhlc10sXG4gICAgICAgICAgcmVhZG9ubHlJbmRleGVzOiBbLi4uYWx0LnJlYWRvbmx5SW5kZXhlc10sXG4gICAgICAgIH0pKSxcbiAgICAgICAgc3RhdGljQWNjb3VudEtleXM6IG1lc3NhZ2Uuc3RhdGljQWNjb3VudEtleXMubWFwKChrZXkpID0+IGtleS50b0Jhc2U1OCgpKSxcbiAgICAgICAgbWVzc2FnZUhlYWRlcjoge1xuICAgICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogbWVzc2FnZS5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLFxuICAgICAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM6IG1lc3NhZ2UuaGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMsXG4gICAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiBtZXNzYWdlLmhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMsXG4gICAgICAgIH0sXG4gICAgICAgIHJlY2VudEJsb2NraGFzaDogcmVjZW50QmxvY2tIYXNoLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHsgbWVzc2FnZSwgZGF0YSB9O1xuICAgIH1cblxuICAgIC8qKiBDb21waWxlIHByb2Nlc3NlZCBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgYmFjayBpbnRvIGEgTWVzc2FnZVYwICovXG4gICAgZnVuY3Rpb24gY29tcGlsZVByb2Nlc3NlZE1lc3NhZ2UoZGF0YTogVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKTogTWVzc2FnZVYwIHtcbiAgICAgIHJldHVybiBuZXcgTWVzc2FnZVYwKHtcbiAgICAgICAgaGVhZGVyOiB7IC4uLmRhdGEubWVzc2FnZUhlYWRlciB9LFxuICAgICAgICBzdGF0aWNBY2NvdW50S2V5czogZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5tYXAoKGtleSkgPT4gbmV3IFB1YmxpY0tleShrZXkpKSxcbiAgICAgICAgcmVjZW50QmxvY2toYXNoOiBkYXRhLnJlY2VudEJsb2NraGFzaCA/PyByZWNlbnRCbG9ja0hhc2gsXG4gICAgICAgIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zOiBkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5tYXAoKGluc3RydWN0aW9uKSA9PiAoe1xuICAgICAgICAgIHByb2dyYW1JZEluZGV4OiBpbnN0cnVjdGlvbi5wcm9ncmFtSWRJbmRleCxcbiAgICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogWy4uLmluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzXSxcbiAgICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShiYXNlNTguZGVjb2RlKGluc3RydWN0aW9uLmRhdGEpKSxcbiAgICAgICAgfSkpLFxuICAgICAgICBhZGRyZXNzVGFibGVMb29rdXBzOiBkYXRhLmFkZHJlc3NMb29rdXBUYWJsZXMubWFwKChhbHQpID0+ICh7XG4gICAgICAgICAgYWNjb3VudEtleTogbmV3IFB1YmxpY0tleShhbHQuYWNjb3VudEtleSksXG4gICAgICAgICAgd3JpdGFibGVJbmRleGVzOiBbLi4uYWx0LndyaXRhYmxlSW5kZXhlc10sXG4gICAgICAgICAgcmVhZG9ubHlJbmRleGVzOiBbLi4uYWx0LnJlYWRvbmx5SW5kZXhlc10sXG4gICAgICAgIH0pKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBJbmplY3QgdGhlIGR1cmFibGUgbm9uY2UgYWR2YW5jZSBpbnN0cnVjdGlvbiBhbmQgcmV0dXJuIHRoZSBwcm9jZXNzZWQgZGF0YSAqL1xuICAgIGZ1bmN0aW9uIGluamVjdE5vbmNlQWR2YW5jZShkYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEpOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzLCBhdXRoV2FsbGV0QWRkcmVzcyB9KTtcbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKGRhdGEpO1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gdHhCdWlsZGVyWydfdHJhbnNhY3Rpb24nXS5nZXRWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoKTtcbiAgICAgIHNob3VsZC5leGlzdChwcm9jZXNzZWQpO1xuICAgICAgcmV0dXJuIHByb2Nlc3NlZCE7XG4gICAgfVxuXG4gICAgLyoqIEZpeHR1cmUgdXNpbmcgZXZlcnkgaGVhZGVyIHNlY3Rpb24gYW5kIGJvdGggbG9va3VwLXRhYmxlIHNsb3RzICovXG4gICAgY29uc3QgbWFpbkZpeHR1cmUgPSAoKSA9PlxuICAgICAgYnVpbGRWZXJzaW9uZWRGaXh0dXJlKGZpeHR1cmVQYXllciwgW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvZ3JhbUlkOiBmaXh0dXJlUHJvZ3JhbSxcbiAgICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgICB7IHB1YmtleTogZml4dHVyZVBheWVyLCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBwdWJrZXk6IGZpeHR1cmVSb1NpZ25lciwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IHB1YmtleTogZml4dHVyZUFsdFdyaXRhYmxlLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlQWx0UmVhZG9ubHksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlV3JpdGFibGVOb25TaWduZXIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBwdWJrZXk6IGZpeHR1cmVSb05vblNpZ25lciwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgIGl0KCdrZWVwcyBsb29rdXAtdGFibGUtcmVmZXJlbmNpbmcgaW5zdHJ1Y3Rpb25zIHBvaW50aW5nIGF0IHRoZSBzYW1lIGFjY291bnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBkYXRhIH0gPSBtYWluRml4dHVyZSgpO1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gaW5qZWN0Tm9uY2VBZHZhbmNlKGRhdGEpO1xuXG4gICAgICAvLyBUaGUgZml4dHVyZSBtdXN0IGFjdHVhbGx5IHJlZmVyZW5jZSBhY2NvdW50cyBsb2FkZWQgZnJvbSB0aGUgbG9va3VwIHRhYmxlXG4gICAgICBNYXRoLm1heChcbiAgICAgICAgLi4uZGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMuZmxhdE1hcCgoaXgpID0+IFsuLi5peC5hY2NvdW50S2V5SW5kZXhlcywgaXgucHJvZ3JhbUlkSW5kZXhdKVxuICAgICAgKS5zaG91bGQuYmUuZ3JlYXRlclRoYW5PckVxdWFsKGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoKTtcblxuICAgICAgY29uc3QgYmVmb3JlID0gbWVzc2FnZS5nZXRBY2NvdW50S2V5cyh7IGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzOiBbbG9va3VwVGFibGVBY2NvdW50XSB9KTtcbiAgICAgIGNvbnN0IGFmdGVyID0gY29tcGlsZVByb2Nlc3NlZE1lc3NhZ2UocHJvY2Vzc2VkKS5nZXRBY2NvdW50S2V5cyh7XG4gICAgICAgIGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzOiBbbG9va3VwVGFibGVBY2NvdW50XSxcbiAgICAgIH0pO1xuXG4gICAgICBwcm9jZXNzZWQudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aChkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGggKyAxKTtcbiAgICAgIGNvbnN0IHJlbWFwcGVkSW5zdHJ1Y3Rpb25zID0gcHJvY2Vzc2VkLnZlcnNpb25lZEluc3RydWN0aW9ucy5zbGljZSgxKTtcbiAgICAgIHJlbWFwcGVkSW5zdHJ1Y3Rpb25zLmZvckVhY2goKGluc3RydWN0aW9uLCBpeEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gZGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnNbaXhJbmRleF07XG4gICAgICAgIGJlZm9yZS5nZXQob3JpZ2luYWwucHJvZ3JhbUlkSW5kZXgpIS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChhZnRlci5nZXQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkSW5kZXgpIS50b0Jhc2U1OCgpKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24uYWNjb3VudEtleUluZGV4ZXMuc2hvdWxkLmhhdmUubGVuZ3RoKG9yaWdpbmFsLmFjY291bnRLZXlJbmRleGVzLmxlbmd0aCk7XG4gICAgICAgIG9yaWdpbmFsLmFjY291bnRLZXlJbmRleGVzLmZvckVhY2goKF8sIGspID0+IHtcbiAgICAgICAgICBiZWZvcmVcbiAgICAgICAgICAgIC5nZXQob3JpZ2luYWwuYWNjb3VudEtleUluZGV4ZXNba10pIVxuICAgICAgICAgICAgLnRvQmFzZTU4KClcbiAgICAgICAgICAgIC5zaG91bGQuZXF1YWwoYWZ0ZXIuZ2V0KGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzW2tdKSEudG9CYXNlNTgoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpbnN0cnVjdGlvbi5kYXRhLnNob3VsZC5lcXVhbChvcmlnaW5hbC5kYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2tlZXBzIEp1cGl0ZXIgbG9va3VwLXRhYmxlIGFjY291bnRzIHBvaW50aW5nIGF0IHRoZSBzYW1lIGFjY291bnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gaW5qZWN0Tm9uY2VBZHZhbmNlKGRhdGEpO1xuXG4gICAgICAvLyBhdXRob3JpdHksIG5vbmNlIGFjY291bnQgYW5kIHN5c3ZhciBhcmUgYWRkZWQ7IHRoZSBzeXN0ZW0gcHJvZ3JhbSBpcyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIGNvbnN0IHNoaWZ0ID0gcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCAtIGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoO1xuICAgICAgc2hpZnQuc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgcHJvY2Vzc2VkLm1lc3NhZ2VIZWFkZXIuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogMixcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogMSxcbiAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiA2LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9sZFN0YXRpY0xlbiA9IGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoO1xuICAgICAgY29uc3QgcmVtYXBwZWRJbnN0cnVjdGlvbnMgPSBwcm9jZXNzZWQudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zLnNsaWNlKDEpO1xuICAgICAgcmVtYXBwZWRJbnN0cnVjdGlvbnMuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24sIGl4SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBkYXRhLnZlcnNpb25lZEluc3RydWN0aW9uc1tpeEluZGV4XTtcbiAgICAgICAgY29uc3QgcmVtYXBwZWRQcm9ncmFtSW5kZXggPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWRJbmRleDtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnByb2dyYW1JZEluZGV4IDwgb2xkU3RhdGljTGVuKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzW3JlbWFwcGVkUHJvZ3JhbUluZGV4XS5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgICBkYXRhLnN0YXRpY0FjY291bnRLZXlzW29yaWdpbmFsLnByb2dyYW1JZEluZGV4XVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtYXBwZWRQcm9ncmFtSW5kZXguc2hvdWxkLmVxdWFsKG9yaWdpbmFsLnByb2dyYW1JZEluZGV4ICsgc2hpZnQpO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbmFsLmFjY291bnRLZXlJbmRleGVzLmZvckVhY2goKG9sZEluZGV4LCBrKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBpbnN0cnVjdGlvbi5hY2NvdW50S2V5SW5kZXhlc1trXTtcbiAgICAgICAgICBpZiAob2xkSW5kZXggPCBvbGRTdGF0aWNMZW4pIHtcbiAgICAgICAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5c1tuZXdJbmRleF0uc2hvdWxkLmVxdWFsKGRhdGEuc3RhdGljQWNjb3VudEtleXNbb2xkSW5kZXhdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3SW5kZXguc2hvdWxkLmVxdWFsKG9sZEluZGV4ICsgc2hpZnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdtYWtlcyB0aGUgbm9uY2UgYWNjb3VudCB3cml0YWJsZSBhbmQga2VlcHMgb3JpZ2luYWwgcmVhZC1vbmx5IGFjY291bnRzIHJlYWQtb25seScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gbWFpbkZpeHR1cmUoKTtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGluamVjdE5vbmNlQWR2YW5jZShkYXRhKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjb21waWxlUHJvY2Vzc2VkTWVzc2FnZShwcm9jZXNzZWQpO1xuXG4gICAgICAvLyBoZWFkZXIgYWRqdXN0ZWQgZm9yIHRoZSBuZXcgYXV0aG9yaXR5LCBub25jZSBhY2NvdW50LCBzeXN2YXIgYW5kIHN5c3RlbSBwcm9ncmFtXG4gICAgICBwcm9jZXNzZWQubWVzc2FnZUhlYWRlci5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiAzLCAvLyBwYXllciArIHJvIHNpZ25lciArIG5ldyBhdXRob3JpdHlcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogMiwgLy8gcm8gc2lnbmVyICsgbmV3IGF1dGhvcml0eVxuICAgICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IDQsIC8vIHJvIG5vbi1zaWduZXIsIHByb2dyYW0sIHN5c3RlbSBwcm9ncmFtLCBzeXN2YXJcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbmRleE9mID0gKGtleTogc3RyaW5nKSA9PiBwcm9jZXNzZWQuc3RhdGljQWNjb3VudEtleXMuaW5kZXhPZihrZXkpO1xuXG4gICAgICAvLyBBZHZhbmNlTm9uY2VBY2NvdW50IHJlcXVpcmVzIGEgd3JpdGFibGUgbm9uY2UgYWNjb3VudFxuICAgICAgbWVzc2FnZS5pc0FjY291bnRXcml0YWJsZShpbmRleE9mKHdhbGxldE5vbmNlQWRkcmVzcykpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIC8vIG9yaWdpbmFsIGFjY291bnRzIGtlZXAgdGhlaXIgd3JpdGFiaWxpdHlcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUoaW5kZXhPZihmaXh0dXJlUGF5ZXIudG9CYXNlNTgoKSkpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUoaW5kZXhPZihmaXh0dXJlV3JpdGFibGVOb25TaWduZXIudG9CYXNlNTgoKSkpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUoaW5kZXhPZihmaXh0dXJlUm9TaWduZXIudG9CYXNlNTgoKSkpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBtZXNzYWdlLmlzQWNjb3VudFdyaXRhYmxlKGluZGV4T2YoZml4dHVyZVJvTm9uU2lnbmVyLnRvQmFzZTU4KCkpKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRXcml0YWJsZShpbmRleE9mKGZpeHR1cmVQcm9ncmFtLnRvQmFzZTU4KCkpKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgLy8gdGhlIG5ldyBhdXRob3JpdHkgaXMgYSByZWFkLW9ubHkgc2lnbmVyXG4gICAgICBtZXNzYWdlLmlzQWNjb3VudFNpZ25lcihpbmRleE9mKGF1dGhXYWxsZXRBZGRyZXNzKSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRXcml0YWJsZShpbmRleE9mKGF1dGhXYWxsZXRBZGRyZXNzKSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIC8vIG5vIGR1cGxpY2F0ZSBrZXlzXG4gICAgICBuZXcgU2V0KHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cykuc2l6ZS5zaG91bGQuZXF1YWwocHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlcGVuZHMgYSB3ZWxsLWZvcm1lZCBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBtYWluRml4dHVyZSgpO1xuICAgICAgY29uc3QgcHJvY2Vzc2VkID0gaW5qZWN0Tm9uY2VBZHZhbmNlKGRhdGEpO1xuXG4gICAgICBjb25zdCBbbm9uY2VBZHZhbmNlXSA9IHByb2Nlc3NlZC52ZXJzaW9uZWRJbnN0cnVjdGlvbnM7XG4gICAgICBzaG91bGQuZXhpc3Qobm9uY2VBZHZhbmNlKTtcbiAgICAgIG5vbmNlQWR2YW5jZS5kYXRhLnNob3VsZC5lcXVhbCgnNnZ4OFAnKTsgLy8gU3lzdGVtUHJvZ3JhbSBBZHZhbmNlTm9uY2VBY2NvdW50XG4gICAgICBub25jZUFkdmFuY2UucHJvZ3JhbUlkSW5kZXguc2hvdWxkLmVxdWFsKHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKFNZU1RFTV9QUk9HUkFNX0lEKSk7XG4gICAgICBub25jZUFkdmFuY2UuYWNjb3VudEtleUluZGV4ZXMuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKHdhbGxldE5vbmNlQWRkcmVzcyksXG4gICAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVNfSUQpLFxuICAgICAgICBwcm9jZXNzZWQuc3RhdGljQWNjb3VudEtleXMuaW5kZXhPZihhdXRoV2FsbGV0QWRkcmVzcyksXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCd0dXJucyBhbiBhdXRob3JpdHkgYWxyZWFkeSBwcmVzZW50IGFzIGEgd3JpdGFibGUgbm9uLXNpZ25lciBpbnRvIGEgd3JpdGFibGUgc2lnbmVyLCBvbmNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBidWlsZFZlcnNpb25lZEZpeHR1cmUoZml4dHVyZVBheWVyLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9ncmFtSWQ6IGZpeHR1cmVQcm9ncmFtLFxuICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlUGF5ZXIsIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICAgICAgICAvLyBhdXRob3JpdHkgYWxyZWFkeSBwcmVzZW50IGFzIGEgd3JpdGFibGUgbm9uLXNpZ25lclxuICAgICAgICAgICAgeyBwdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aFdhbGxldEFkZHJlc3MpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlUm9Ob25TaWduZXIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSBpbmplY3ROb25jZUFkdmFuY2UoZGF0YSk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gY29tcGlsZVByb2Nlc3NlZE1lc3NhZ2UocHJvY2Vzc2VkKTtcblxuICAgICAgLy8gYXBwZWFycyBvbmNlLCBhcyBhIHNpZ25lciwga2VlcGluZyBpdHMgd3JpdGFiaWxpdHlcbiAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ID09PSBhdXRoV2FsbGV0QWRkcmVzcykuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgYXV0aEluZGV4ID0gcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRTaWduZXIoYXV0aEluZGV4KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBtZXNzYWdlLmlzQWNjb3VudFdyaXRhYmxlKGF1dGhJbmRleCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICBwcm9jZXNzZWQubWVzc2FnZUhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMuc2hvdWxkLmVxdWFsKGRhdGEubWVzc2FnZUhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMgKyAxKTtcbiAgICAgIHByb2Nlc3NlZC5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMuc2hvdWxkLmVxdWFsKGRhdGEubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCd0dXJucyBhbiBhdXRob3JpdHkgYWxyZWFkeSBwcmVzZW50IGFzIGEgcmVhZC1vbmx5IG5vbi1zaWduZXIgaW50byBhIHJlYWQtb25seSBzaWduZXIsIG9uY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGJ1aWxkVmVyc2lvbmVkRml4dHVyZShmaXh0dXJlUGF5ZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIHByb2dyYW1JZDogZml4dHVyZVByb2dyYW0sXG4gICAgICAgICAga2V5czogW1xuICAgICAgICAgICAgeyBwdWJrZXk6IGZpeHR1cmVQYXllciwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIC8vIGF1dGhvcml0eSBhbHJlYWR5IHByZXNlbnQgYXMgYSByZWFkLW9ubHkgbm9uLXNpZ25lclxuICAgICAgICAgICAgeyBwdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aFdhbGxldEFkZHJlc3MpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IHB1YmtleTogZml4dHVyZVdyaXRhYmxlTm9uU2lnbmVyLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSBpbmplY3ROb25jZUFkdmFuY2UoZGF0YSk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gY29tcGlsZVByb2Nlc3NlZE1lc3NhZ2UocHJvY2Vzc2VkKTtcblxuICAgICAgLy8gYXBwZWFycyBvbmNlLCBhcyBhIHJlYWQtb25seSBzaWduZXJcbiAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ID09PSBhdXRoV2FsbGV0QWRkcmVzcykuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgYXV0aEluZGV4ID0gcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRTaWduZXIoYXV0aEluZGV4KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBtZXNzYWdlLmlzQWNjb3VudFdyaXRhYmxlKGF1dGhJbmRleCkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcblxuICAgICAgcHJvY2Vzc2VkLm1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLnNob3VsZC5lcXVhbChkYXRhLm1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzICsgMSk7XG4gICAgICBwcm9jZXNzZWQubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzLnNob3VsZC5lcXVhbChkYXRhLm1lc3NhZ2VIZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyArIDEpO1xuICAgICAgLy8gaXQgbGVmdCB0aGUgcmVhZC1vbmx5IG5vbi1zaWduZXJzIChzeXN0ZW0gcHJvZ3JhbSArIHN5c3ZhciBhcmUgYWRkZWQpXG4gICAgICBwcm9jZXNzZWQubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMuc2hvdWxkLmVxdWFsKFxuICAgICAgICBkYXRhLm1lc3NhZ2VIZWFkZXIubnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzICsgMVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBhZGQgYSBzaWduZXIgd2hlbiB0aGUgbm9uY2UgYXV0aG9yaXR5IGlzIGFscmVhZHkgdGhlIGZlZSBwYXllcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYnVpbGRWZXJzaW9uZWRGaXh0dXJlKG5ldyBQdWJsaWNLZXkoYXV0aFdhbGxldEFkZHJlc3MpLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9ncmFtSWQ6IGZpeHR1cmVQcm9ncmFtLFxuICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgIHsgcHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhXYWxsZXRBZGRyZXNzKSwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgcHVia2V5OiBmaXh0dXJlV3JpdGFibGVOb25TaWduZXIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGluamVjdE5vbmNlQWR2YW5jZShkYXRhKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjb21waWxlUHJvY2Vzc2VkTWVzc2FnZShwcm9jZXNzZWQpO1xuXG4gICAgICBwcm9jZXNzZWQuc3RhdGljQWNjb3VudEtleXNbMF0uc2hvdWxkLmVxdWFsKGF1dGhXYWxsZXRBZGRyZXNzKTtcbiAgICAgIHByb2Nlc3NlZC5zdGF0aWNBY2NvdW50S2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ID09PSBhdXRoV2FsbGV0QWRkcmVzcykuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcHJvY2Vzc2VkLm1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLnNob3VsZC5lcXVhbChkYXRhLm1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzKTtcbiAgICAgIHByb2Nlc3NlZC5tZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMuc2hvdWxkLmVxdWFsKGRhdGEubWVzc2FnZUhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzKTtcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50U2lnbmVyKDApLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdtb3ZlcyBhIG5vbmNlIGFjY291bnQgYWxyZWFkeSBwcmVzZW50IGFzIHJlYWQtb25seSBpbnRvIHRoZSB3cml0YWJsZSBub24tc2lnbmVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYnVpbGRWZXJzaW9uZWRGaXh0dXJlKGZpeHR1cmVQYXllciwgW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvZ3JhbUlkOiBmaXh0dXJlUHJvZ3JhbSxcbiAgICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgICB7IHB1YmtleTogZml4dHVyZVBheWVyLCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBwdWJrZXk6IGZpeHR1cmVSb05vblNpZ25lciwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgICAgICAgLy8gbm9uY2UgYWNjb3VudCBhbHJlYWR5IHByZXNlbnQgYXMgYSByZWFkLW9ubHkgbm9uLXNpZ25lclxuICAgICAgICAgICAgeyBwdWJrZXk6IG5ldyBQdWJsaWNLZXkod2FsbGV0Tm9uY2VBZGRyZXNzKSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGluamVjdE5vbmNlQWR2YW5jZShkYXRhKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjb21waWxlUHJvY2Vzc2VkTWVzc2FnZShwcm9jZXNzZWQpO1xuXG4gICAgICBwcm9jZXNzZWQuc3RhdGljQWNjb3VudEtleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gd2FsbGV0Tm9uY2VBZGRyZXNzKS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBub25jZUluZGV4ID0gcHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2Yod2FsbGV0Tm9uY2VBZGRyZXNzKTtcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUobm9uY2VJbmRleCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgbWVzc2FnZS5pc0FjY291bnRTaWduZXIobm9uY2VJbmRleCkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIC8vIHRoZSBvdGhlciBvcmlnaW5hbCByZWFkLW9ubHkgYWNjb3VudCBzdGF5cyByZWFkLW9ubHlcbiAgICAgIG1lc3NhZ2UuaXNBY2NvdW50V3JpdGFibGUocHJvY2Vzc2VkLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoZml4dHVyZVJvTm9uU2lnbmVyLnRvQmFzZTU4KCkpKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Byb2R1Y2VzIGEgc2lnbmFibGUgcGF5bG9hZCB0aGF0IGRlc2VyaWFsaXplcyBhcyBhIE1lc3NhZ2VWMCB3aXRoIHRoZSBub25jZSBhZHZhbmNlIGZpcnN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBtYWluRml4dHVyZSgpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzLCBhdXRoV2FsbGV0QWRkcmVzcyB9KTtcbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKGRhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IE1lc3NhZ2VWMC5kZXNlcmlhbGl6ZSh0eC5zaWduYWJsZVBheWxvYWQpO1xuXG4gICAgICBtZXNzYWdlLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aChkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGggKyAxKTtcbiAgICAgIGNvbnN0IG5vbmNlQWR2YW5jZSA9IG1lc3NhZ2UuY29tcGlsZWRJbnN0cnVjdGlvbnNbMF07XG4gICAgICBtZXNzYWdlLnN0YXRpY0FjY291bnRLZXlzW25vbmNlQWR2YW5jZS5wcm9ncmFtSWRJbmRleF0udG9CYXNlNTgoKS5zaG91bGQuZXF1YWwoU1lTVEVNX1BST0dSQU1fSUQpO1xuICAgICAgbWVzc2FnZS5zdGF0aWNBY2NvdW50S2V5c1tub25jZUFkdmFuY2UuYWNjb3VudEtleUluZGV4ZXNbMF1dLnRvQmFzZTU4KCkuc2hvdWxkLmVxdWFsKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gICAgICBtZXNzYWdlLnN0YXRpY0FjY291bnRLZXlzW25vbmNlQWR2YW5jZS5hY2NvdW50S2V5SW5kZXhlc1sxXV1cbiAgICAgICAgLnRvQmFzZTU4KClcbiAgICAgICAgLnNob3VsZC5lcXVhbChTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX0lEKTtcbiAgICAgIG1lc3NhZ2Uuc3RhdGljQWNjb3VudEtleXNbbm9uY2VBZHZhbmNlLmFjY291bnRLZXlJbmRleGVzWzJdXS50b0Jhc2U1OCgpLnNob3VsZC5lcXVhbChhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyB2ZXJzaW9uZWQgZGF0YSB3aG9zZSBtZXNzYWdlIGhlYWRlciBpcyBpbmNvbnNpc3RlbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IG1haW5GaXh0dXJlKCk7XG4gICAgICBjb25zdCBpbmNvbnNpc3RlbnQgPSB7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIG1lc3NhZ2VIZWFkZXI6IHsgLi4uZGF0YS5tZXNzYWdlSGVhZGVyLCBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IDk5IH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzLCBhdXRoV2FsbGV0QWRkcmVzcyB9KTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShpbmNvbnNpc3RlbnQpKS50aHJvd0Vycm9yKC9JbnZhbGlkIG1lc3NhZ2UgaGVhZGVyLyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|