@akta/sdk 1.0.0 → 1.1.0
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/auction/index.js +5 -5
- package/dist/auction/index.mjs +4 -4
- package/dist/{chunk-C3Q3DYPD.mjs → chunk-2AR3LS5J.mjs} +3 -3
- package/dist/{chunk-C3Q3DYPD.mjs.map → chunk-2AR3LS5J.mjs.map} +1 -1
- package/dist/{chunk-IZTB6YOJ.js → chunk-2WOYNNPV.js} +8 -8
- package/dist/{chunk-IZTB6YOJ.js.map → chunk-2WOYNNPV.js.map} +1 -1
- package/dist/{chunk-WPATZWNC.mjs → chunk-4ANINCSI.mjs} +3 -3
- package/dist/{chunk-BP23PXOA.js → chunk-5M6DY6Q7.js} +7 -7
- package/dist/{chunk-BP23PXOA.js.map → chunk-5M6DY6Q7.js.map} +1 -1
- package/dist/{chunk-N4PQF2XF.mjs → chunk-6MGMITC7.mjs} +3 -3
- package/dist/{chunk-IOSDIJTT.mjs → chunk-6PHYDWAI.mjs} +3 -3
- package/dist/{chunk-I2AH4XA6.js → chunk-76JFN4TN.js} +6 -6
- package/dist/{chunk-I2AH4XA6.js.map → chunk-76JFN4TN.js.map} +1 -1
- package/dist/{chunk-VARI5DBW.js → chunk-B3ANVNAW.js} +31 -31
- package/dist/{chunk-VARI5DBW.js.map → chunk-B3ANVNAW.js.map} +1 -1
- package/dist/{chunk-APOVSDCN.mjs → chunk-CPU7YHCB.mjs} +2 -2
- package/dist/{chunk-BTVZKNNI.js → chunk-FQEKBA3B.js} +5 -5
- package/dist/{chunk-BTVZKNNI.js.map → chunk-FQEKBA3B.js.map} +1 -1
- package/dist/{chunk-ZABE6CV7.mjs → chunk-FZXOT7SC.mjs} +3 -3
- package/dist/{chunk-TGH7PFXC.mjs → chunk-GRR6MUNV.mjs} +3 -3
- package/dist/{chunk-M5QOSPKZ.js → chunk-GVPFBZMF.js} +5 -5
- package/dist/{chunk-M5QOSPKZ.js.map → chunk-GVPFBZMF.js.map} +1 -1
- package/dist/{chunk-MATDF7EM.mjs → chunk-H76YCOUY.mjs} +4 -4
- package/dist/{chunk-LW57YWGF.js → chunk-HHXP4XDJ.js} +5 -5
- package/dist/{chunk-LW57YWGF.js.map → chunk-HHXP4XDJ.js.map} +1 -1
- package/dist/{chunk-5CPWIJNS.js → chunk-HIDVSX3C.js} +7 -7
- package/dist/{chunk-5CPWIJNS.js.map → chunk-HIDVSX3C.js.map} +1 -1
- package/dist/{chunk-7C2J3XNH.js → chunk-HT2LVEDG.js} +5 -5
- package/dist/{chunk-7C2J3XNH.js.map → chunk-HT2LVEDG.js.map} +1 -1
- package/dist/{chunk-VNBPUJXA.mjs → chunk-IERRX2GS.mjs} +3 -3
- package/dist/{chunk-QZWXM2GR.mjs → chunk-IWPVSICN.mjs} +3 -3
- package/dist/{chunk-LAANYMUP.mjs → chunk-JMZYQMSW.mjs} +3 -3
- package/dist/{chunk-HXF3JLNE.js → chunk-JPV3DVL6.js} +10 -10
- package/dist/{chunk-HXF3JLNE.js.map → chunk-JPV3DVL6.js.map} +1 -1
- package/dist/{chunk-5F5IFJ2J.mjs → chunk-KPXE4SEJ.mjs} +2 -2
- package/dist/{chunk-FVFLY5A6.js → chunk-LYG4MDFV.js} +6 -6
- package/dist/{chunk-FVFLY5A6.js.map → chunk-LYG4MDFV.js.map} +1 -1
- package/dist/{chunk-XASWHIKG.js → chunk-MDSBD67B.js} +6 -6
- package/dist/{chunk-XASWHIKG.js.map → chunk-MDSBD67B.js.map} +1 -1
- package/dist/{chunk-WEGE45N2.mjs → chunk-MOHS2K45.mjs} +3 -3
- package/dist/{chunk-CC6LCTVW.mjs → chunk-NANBUL67.mjs} +2 -2
- package/dist/{chunk-C7GS6GJZ.mjs → chunk-OYSHMZRR.mjs} +4 -4
- package/dist/{chunk-ZHFTRBE6.mjs → chunk-SGXO2K4C.mjs} +3 -3
- package/dist/{chunk-RZUZCM44.js → chunk-SQH64QTI.js} +4 -4
- package/dist/{chunk-RZUZCM44.js.map → chunk-SQH64QTI.js.map} +1 -1
- package/dist/{chunk-4M6IGGNM.js → chunk-UWAIIBII.js} +3 -3
- package/dist/{chunk-4M6IGGNM.js.map → chunk-UWAIIBII.js.map} +1 -1
- package/dist/{chunk-MGXVNKUX.js → chunk-V2TNS6B5.js} +8 -8
- package/dist/{chunk-MGXVNKUX.js.map → chunk-V2TNS6B5.js.map} +1 -1
- package/dist/{chunk-S7HZC5RM.js → chunk-VL2UI54Z.js} +5 -5
- package/dist/{chunk-S7HZC5RM.js.map → chunk-VL2UI54Z.js.map} +1 -1
- package/dist/{chunk-SXS2YREI.mjs → chunk-VVRQI5IY.mjs} +4 -4
- package/dist/{chunk-B54US4TN.mjs → chunk-XNWIPDFE.mjs} +4 -4
- package/dist/{chunk-ZW5I4BM7.js → chunk-YHMGRIY5.js} +8 -8
- package/dist/{chunk-ZW5I4BM7.js.map → chunk-YHMGRIY5.js.map} +1 -1
- package/dist/{chunk-KMVWSUUI.js → chunk-ZBVJPS4Y.js} +10 -10
- package/dist/{chunk-KMVWSUUI.js.map → chunk-ZBVJPS4Y.js.map} +1 -1
- package/dist/dao/index.js +5 -5
- package/dist/dao/index.mjs +4 -4
- package/dist/dao-deployable/index.js +7 -7
- package/dist/dao-deployable/index.mjs +4 -4
- package/dist/escrow/index.js +4 -4
- package/dist/escrow/index.mjs +3 -3
- package/dist/gates/index.js +4 -4
- package/dist/gates/index.mjs +3 -3
- package/dist/hyper-swap/index.js +4 -4
- package/dist/hyper-swap/index.mjs +3 -3
- package/dist/index.js +19 -19
- package/dist/index.mjs +18 -18
- package/dist/marketplace/index.js +5 -5
- package/dist/marketplace/index.mjs +4 -4
- package/dist/meta-merkles/index.js +4 -4
- package/dist/meta-merkles/index.mjs +3 -3
- package/dist/poll/index.js +4 -4
- package/dist/poll/index.mjs +3 -3
- package/dist/prize-box/index.js +4 -4
- package/dist/prize-box/index.mjs +3 -3
- package/dist/raffle/index.js +5 -5
- package/dist/raffle/index.mjs +4 -4
- package/dist/rewards/index.js +4 -4
- package/dist/rewards/index.mjs +3 -3
- package/dist/social/index.js +3 -3
- package/dist/social/index.mjs +2 -2
- package/dist/staking/index.js +4 -4
- package/dist/staking/index.mjs +3 -3
- package/dist/staking-pool/index.js +4 -4
- package/dist/staking-pool/index.mjs +3 -3
- package/dist/subscriptions/index.js +4 -4
- package/dist/subscriptions/index.mjs +3 -3
- package/dist/wallet/index.js +4 -4
- package/dist/wallet/index.mjs +3 -3
- package/package.json +1 -1
- /package/dist/{chunk-WPATZWNC.mjs.map → chunk-4ANINCSI.mjs.map} +0 -0
- /package/dist/{chunk-N4PQF2XF.mjs.map → chunk-6MGMITC7.mjs.map} +0 -0
- /package/dist/{chunk-IOSDIJTT.mjs.map → chunk-6PHYDWAI.mjs.map} +0 -0
- /package/dist/{chunk-APOVSDCN.mjs.map → chunk-CPU7YHCB.mjs.map} +0 -0
- /package/dist/{chunk-ZABE6CV7.mjs.map → chunk-FZXOT7SC.mjs.map} +0 -0
- /package/dist/{chunk-TGH7PFXC.mjs.map → chunk-GRR6MUNV.mjs.map} +0 -0
- /package/dist/{chunk-MATDF7EM.mjs.map → chunk-H76YCOUY.mjs.map} +0 -0
- /package/dist/{chunk-VNBPUJXA.mjs.map → chunk-IERRX2GS.mjs.map} +0 -0
- /package/dist/{chunk-QZWXM2GR.mjs.map → chunk-IWPVSICN.mjs.map} +0 -0
- /package/dist/{chunk-LAANYMUP.mjs.map → chunk-JMZYQMSW.mjs.map} +0 -0
- /package/dist/{chunk-5F5IFJ2J.mjs.map → chunk-KPXE4SEJ.mjs.map} +0 -0
- /package/dist/{chunk-WEGE45N2.mjs.map → chunk-MOHS2K45.mjs.map} +0 -0
- /package/dist/{chunk-CC6LCTVW.mjs.map → chunk-NANBUL67.mjs.map} +0 -0
- /package/dist/{chunk-C7GS6GJZ.mjs.map → chunk-OYSHMZRR.mjs.map} +0 -0
- /package/dist/{chunk-ZHFTRBE6.mjs.map → chunk-SGXO2K4C.mjs.map} +0 -0
- /package/dist/{chunk-SXS2YREI.mjs.map → chunk-VVRQI5IY.mjs.map} +0 -0
- /package/dist/{chunk-B54US4TN.mjs.map → chunk-XNWIPDFE.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-LW57YWGF.js","../src/hyper-swap/index.ts","../src/generated/HyperSwapClient.ts","../src/hyper-swap/types.ts"],"names":["OfferState"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-LW57YWGF.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n HyperSwapClient,\n HyperSwapFactory,\n HyperSwapArgs,\n} from '../generated/HyperSwapClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n OfferParams,\n AcceptParams,\n EscrowParams,\n DisburseParams,\n CancelParams,\n WithdrawParams,\n OptInParams,\n GetOfferParams,\n OfferValue,\n HyperSwapMbrData,\n} from \"./types\";\n\nexport * from \"./types\";\n\nexport type HyperSwapContractArgs = HyperSwapArgs[\"obj\"];\n\n/**\n * SDK for interacting with the HyperSwap contract.\n * HyperSwap enables atomic multi-party trades using merkle tree proofs.\n */\nexport class HyperSwapSDK extends BaseSDK<HyperSwapClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: HyperSwapFactory, ...params }, ENV_VAR_NAMES.HYPER_SWAP_APP_ID);\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the MBR data for HyperSwap operations.\n */\n async mbr(): Promise<HyperSwapMbrData> {\n const mbr = await this.client.mbr();\n\n return {\n offers: mbr.offers,\n participants: mbr.participants,\n hashes: mbr.hashes,\n mm: {\n root: mbr.mm.root,\n data: mbr.mm.data,\n },\n };\n }\n\n /**\n * Gets an offer by its ID.\n */\n async getOffer({ id }: GetOfferParams): Promise<OfferValue> {\n const offer = await this.client.state.box.offers.value(id);\n\n if (offer === undefined) {\n throw new Error(`Offer ${id} not found`);\n }\n\n return {\n state: Number(offer.state),\n root: offer.root,\n leaves: offer.leaves,\n escrowed: offer.escrowed,\n participantsRoot: offer.participantsRoot,\n participantsLeaves: offer.participantsLeaves,\n acceptances: offer.acceptances,\n expiration: offer.expiration,\n };\n }\n\n // ========== Write Methods ==========\n\n /**\n * Opts the HyperSwap contract into an asset.\n */\n async optIn({ sender, signer, asset }: OptInParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(100_000), // Asset opt-in MBR\n receiver: this.client.appAddress,\n });\n\n await this.client.send.optIn({\n ...sendParams,\n args: {\n payment,\n asset,\n },\n });\n }\n\n /**\n * Creates a new offer for an atomic multi-party trade.\n */\n async offer({\n sender,\n signer,\n root,\n leaves,\n participantsRoot,\n participantsLeaves,\n expiration,\n }: OfferParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const mbrData = await this.mbr();\n const metaMerklesCost = mbrData.mm.root + mbrData.mm.data;\n const totalMbr = mbrData.offers + mbrData.participants + (metaMerklesCost * 2n);\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(totalMbr),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.offer({\n ...sendParams,\n args: {\n payment,\n root,\n leaves,\n participantsRoot,\n participantsLeaves,\n expiration,\n },\n });\n }\n\n /**\n * Accepts an offer as a participant.\n */\n async accept({ sender, signer, id, proof }: AcceptParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const mbrData = await this.mbr();\n\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.participants),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.accept({\n ...sendParams,\n args: {\n mbrPayment,\n id,\n proof,\n },\n });\n }\n\n /**\n * Escrows assets for a trade leaf.\n * Use `isAsa: true` and `asset` for ASA escrows, otherwise ALGO is used.\n */\n async escrow({\n sender,\n signer,\n id,\n receiver,\n amount,\n proof,\n isAsa = false,\n ...rest\n }: EscrowParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const mbrData = await this.mbr();\n\n if (isAsa) {\n const { asset } = rest as Extract<EscrowParams, { isAsa: true }>;\n\n // MBR includes potential arc59 costs if receiver not opted in\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.hashes + 200_000n), // Extra for potential arc59\n receiver: this.client.appAddress,\n });\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(amount),\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.escrowAsa({\n ...sendParams,\n args: {\n mbrPayment,\n assetXfer,\n id,\n receiver,\n asset,\n amount,\n proof,\n },\n });\n } else {\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(BigInt(amount) + mbrData.hashes),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.escrow({\n ...sendParams,\n args: {\n payment,\n id,\n receiver,\n amount,\n proof,\n },\n });\n }\n }\n\n /**\n * Disburses assets for a trade leaf.\n * @param receiverWallet - The receiver's ARC58 wallet app ID (0 if not an ARC58 wallet)\n */\n async disburse({ sender, signer, id, receiverWallet, receiver, asset, amount }: DisburseParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.disburse({\n ...sendParams,\n args: {\n id,\n receiverWallet,\n receiver,\n asset,\n amount,\n },\n });\n }\n\n /**\n * Cancels an offer.\n */\n async cancel({ sender, signer, id, proof }: CancelParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.cancel({\n ...sendParams,\n args: {\n id,\n proof,\n },\n });\n }\n\n /**\n * Withdraws escrowed assets from a cancelled offer.\n */\n async withdraw({ sender, signer, id, receiver, asset, amount, proof }: WithdrawParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.withdraw({\n ...sendParams,\n args: {\n id,\n receiver,\n asset,\n amount,\n proof,\n },\n });\n }\n}\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"HyperSwap\",\"structs\":{\"Object57CB3C34\":[{\"name\":\"root\",\"type\":\"uint64\"},{\"name\":\"data\",\"type\":\"uint64\"}],\"HashKey\":[{\"name\":\"id\",\"type\":\"uint64\"},{\"name\":\"hash\",\"type\":\"byte[32]\"}],\"HyperSwapMBRData\":[{\"name\":\"offers\",\"type\":\"uint64\"},{\"name\":\"participants\",\"type\":\"uint64\"},{\"name\":\"hashes\",\"type\":\"uint64\"},{\"name\":\"mm\",\"type\":\"Object57CB3C34\"}],\"OfferValue\":[{\"name\":\"state\",\"type\":\"uint8\"},{\"name\":\"root\",\"type\":\"byte[32]\"},{\"name\":\"leaves\",\"type\":\"uint64\"},{\"name\":\"escrowed\",\"type\":\"uint64\"},{\"name\":\"participantsRoot\",\"type\":\"byte[32]\"},{\"name\":\"participantsLeaves\",\"type\":\"uint64\"},{\"name\":\"acceptances\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"}],\"ParticipantKey\":[{\"name\":\"id\",\"type\":\"uint64\"},{\"name\":\"address\",\"type\":\"address\"}],\"RefundValue\":[{\"name\":\"amount\",\"type\":\"uint64\"},{\"name\":\"payor\",\"type\":\"address\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"offer\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"byte[32]\",\"name\":\"root\",\"desc\":\"the merkle tree root of trades consisting of from address, recipient address, asset id & amount\"},{\"type\":\"uint64\",\"name\":\"leaves\",\"desc\":\"the number of leaves in the tree\"},{\"type\":\"byte[32]\",\"name\":\"participantsRoot\",\"desc\":\"the merkle tree root of participating addresses\"},{\"type\":\"uint64\",\"name\":\"participantsLeaves\"},{\"type\":\"uint64\",\"name\":\"expiration\",\"desc\":\"the unix timestamp that the offer auto-expires at if it has not been accepted by all participants\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Creates a merkle tree based atomic payment/xfer group\",\"events\":[],\"recommendations\":{}},{\"name\":\"accept\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\",\"desc\":\"the payment to cover the MBR\"},{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer being accepted\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the bytes32 array proof of inclusion in the participants list\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Accepts an offer\",\"events\":[],\"recommendations\":{}},{\"name\":\"escrow\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"},{\"type\":\"address\",\"name\":\"receiver\",\"desc\":\"the recipient in the offer leaf\"},{\"type\":\"uint64\",\"name\":\"amount\",\"desc\":\"the amount in the offer leaf\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof to verify the details are part of the tree\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Escrows the assets in the trade for a given leaf in the tree\",\"events\":[],\"recommendations\":{}},{\"name\":\"escrowAsa\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\",\"desc\":\"the payment to cover the MBR\"},{\"type\":\"axfer\",\"name\":\"assetXfer\",\"desc\":\"the asset transfer to escrow the asa\"},{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"},{\"type\":\"address\",\"name\":\"receiver\",\"desc\":\"the recipient in the offer leaf\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"the asset in the offer leaf\"},{\"type\":\"uint64\",\"name\":\"amount\",\"desc\":\"the amount in the offer leaf\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof to verify the details are part of the tree\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Escrows the assets in the trade for a given leaf in the tree\",\"events\":[],\"recommendations\":{}},{\"name\":\"disburse\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"},{\"type\":\"uint64\",\"name\":\"receiverWallet\",\"desc\":\"the receiver's ARC58 wallet app id (0 if not an ARC58 wallet)\"},{\"type\":\"address\",\"name\":\"receiver\",\"desc\":\"the recipient address in the leaf\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"the asset being transferred\"},{\"type\":\"uint64\",\"name\":\"amount\",\"desc\":\"the amount being transferred\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Disburses assets for a leaf in the tree, ensuring ordered processing\",\"events\":[],\"recommendations\":{}},{\"name\":\"cancel\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer being cancelled\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"a proof of inclusion in the participants list\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"withdraw\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the cancelled offer\"},{\"type\":\"address\",\"name\":\"receiver\",\"desc\":\"the receiver of the leaf's swap\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"the asset of the leaf's swap\"},{\"type\":\"uint64\",\"name\":\"amount\",\"desc\":\"the amount of the leaf's swap\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof that the leaf is in the tree\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Withdraws your assets from a cancelled swap if they're escrowed\",\"events\":[],\"recommendations\":{}},{\"name\":\"cleanupParticipant\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"},{\"type\":\"address\",\"name\":\"participant\",\"desc\":\"the participant address to clean up\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Cleans up participant box and refunds MBR\\nCan only be called when offer is completed, cancelled+completed, or expired\",\"events\":[],\"recommendations\":{}},{\"name\":\"cleanupOffer\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Cleans up the offer box after all participants have been cleaned up\\nCan only be called when offer is completed, cancelled+completed, or expired\",\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"mbr\",\"args\":[],\"returns\":{\"type\":\"(uint64,uint64,uint64,(uint64,uint64))\",\"struct\":\"HyperSwapMBRData\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":2,\"bytes\":1},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"offerCursor\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"b2ZmZXJfY3Vyc29y\",\"desc\":\"global counter for offers\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"offers\":{\"keyType\":\"uint64\",\"valueType\":\"OfferValue\",\"desc\":\"map of hyper swap offers\",\"prefix\":\"bw==\"},\"participants\":{\"keyType\":\"ParticipantKey\",\"valueType\":\"RefundValue\",\"desc\":\"map of the participants in each swap\",\"prefix\":\"cA==\"},\"hashes\":{\"keyType\":\"HashKey\",\"valueType\":\"RefundValue\",\"desc\":\"map of merkle tree hashes during escrow & disbursal phases\",\"prefix\":\"aA==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[1850],\"errorMessage\":\"Assets and amounts mismatch\"},{\"pc\":[772,1082,1404,1810,2323,2562],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[3042],\"errorMessage\":\"Invalid app upgrade\"},{\"pc\":[426,833,1109,1451,2975],\"errorMessage\":\"Invalid payment\"},{\"pc\":[1475],\"errorMessage\":\"Invalid transfer\"},{\"pc\":[119],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[297],\"errorMessage\":\"OnCompletion must be UpdateApplication && can only call when not creating\"},{\"pc\":[3031,3072],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[2924],\"errorMessage\":\"all participants must be cleaned up first\"},{\"pc\":[441,498,1731,3027,3070],\"errorMessage\":\"application exists\"},{\"pc\":[1090,1412,2570],\"errorMessage\":\"cannot verify leaf\"},{\"pc\":[430,547,702,1016,1338,1745,2253,2496,3019,3063],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[644,909,1225,2160,2419],\"errorMessage\":\"invalid number of bytes for (len+uint8[32][])\"},{\"pc\":[314,3010],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[777,1087,1409,1815,2328,2567],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[325,367,385,394,627,875,892,1172,1189,1203,1528,1540,1561,1573,2141,2366,2383,2397,2685,2845,2958,3056],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[359,377,884,1181,1553,2375,2696],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[2248],\"errorMessage\":\"must have accepted to cancel\"},{\"pc\":[780,2331],\"errorMessage\":\"not a participant in this swap\"},{\"pc\":[406,697,961,1280],\"errorMessage\":\"offer has expired\"},{\"pc\":[1727,1741,1818],\"errorMessage\":\"receiver is not opted into asset\"},{\"pc\":[1735],\"errorMessage\":\"receiverWallet address mismatch\"},{\"pc\":[401],\"errorMessage\":\"root and participantsRoot cannot be the same\"},{\"pc\":[1164],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[350,619,867,1153,2950],\"errorMessage\":\"transaction type is pay\"},{\"pc\":[957,1276,2227,2772,2921],\"errorMessage\":\"wrong state\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMzIgMzQ5MDAgMjIyMjAwIDY4MjAwCiAgICBieXRlY2Jsb2NrICJha2l0YV9kYW8iICJvIiAiYWFsIiAicCIgMHgxNTFmN2M3NSAweDE0IDB4MGEgMHgyYmYzY2M1YSAiaCIgMHgxZSAweDAwMDAgMHgzYyAib2ZmZXJfY3Vyc29yIiAweDI4ICJwYWwiIDB4ODAgInZlcnNpb24iIDB4YTI0YzA2N2MgMHgwMDAxICJ3YWxsZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBleHBvcnQgY2xhc3MgSHlwZXJTd2FwIGV4dGVuZHMgY2xhc3NlcyhCYXNlSHlwZXJTd2FwLCBVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LCBDb250cmFjdFdpdGhPcHRJbikgewogICAgcHVzaGJ5dGVzIDB4ZWE5MTgwZGQgLy8gbWV0aG9kICJ1cGRhdGUoc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGV4cG9ydCBjbGFzcyBIeXBlclN3YXAgZXh0ZW5kcyBjbGFzc2VzKEJhc2VIeXBlclN3YXAsIFVwZ3JhZGVhYmxlQWtpdGFCYXNlQ29udHJhY3QsIENvbnRyYWN0V2l0aE9wdEluKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjEKICAgIHB1c2hieXRlc3MgMHgwZGIzYTQ0YiAweGJkZTFhMTFlIDB4ZDg1ZmViZGQgMHg0NjZmODcxYSAweDU2NmE2MmIyIDB4MGM3YWI0MmUgMHgwNjMxODY4YiAweDY4M2JiNjc4IDB4ZDNlZTA0ZjAgMHgzOTRlYWViMiAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgMHg4NDA3MzNkZCAvLyBtZXRob2QgIm9mZmVyKHBheSxieXRlWzMyXSx1aW50NjQsYnl0ZVszMl0sdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhY2NlcHQocGF5LHVpbnQ2NCxieXRlWzMyXVtdKXZvaWQiLCBtZXRob2QgImVzY3JvdyhwYXksdWludDY0LGFkZHJlc3MsdWludDY0LGJ5dGVbMzJdW10pdm9pZCIsIG1ldGhvZCAiZXNjcm93QXNhKHBheSxheGZlcix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGJ5dGVbMzJdW10pdm9pZCIsIG1ldGhvZCAiZGlzYnVyc2UodWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2FuY2VsKHVpbnQ2NCxieXRlWzMyXVtdKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYnl0ZVszMl1bXSl2b2lkIiwgbWV0aG9kICJjbGVhbnVwUGFydGljaXBhbnQodWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiY2xlYW51cE9mZmVyKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcHRJbihwYXksdWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIiwgbWV0aG9kICJtYnIoKSh1aW50NjQsdWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggb2ZmZXIgYWNjZXB0IGVzY3JvdyBlc2Nyb3dBc2EgZGlzYnVyc2UgY2FuY2VsIHdpdGhkcmF3IGNsZWFudXBQYXJ0aWNpcGFudCBjbGVhbnVwT2ZmZXIgb3B0SW4gdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDE4IG1haW5fbWJyX3JvdXRlQDE5CiAgICBlcnIKCm1haW5fbWJyX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvYmFzZS50czo2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwYzZkNDAwMDAwMDAwMDAwMDg4NTQwMDAwMDAwMDAwMDA4ODU0MDAwMDAwMDAwMDAwOWZjNDAwMDAwMDAwMDAwMDZhYTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcFVwX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDMKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBleHBvcnQgY2xhc3MgSHlwZXJTd2FwIGV4dGVuZHMgY2xhc3NlcyhCYXNlSHlwZXJTd2FwLCBVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LCBDb250cmFjdFdpdGhPcHRJbikgewogICAgcHVzaGJ5dGVzIDB4Y2Q5YWQ2N2UgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nLHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBVcGRhdGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIHVwZGF0ZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDE2IC8vICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MAogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUxCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI3CiAgICAvLyBvZmZlckN1cnNvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEh5cGVyU3dhcEdsb2JhbFN0YXRlS2V5T2ZmZXJDdXJzb3IgfSkKICAgIGJ5dGVjIDEyIC8vICJvZmZlcl9jdXJzb3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyB0aGlzLm9mZmVyQ3Vyc29yLnZhbHVlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC5vZmZlcltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9mZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo2OC03NQogICAgLy8gb2ZmZXIoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgcm9vdDogYnl0ZXM8MzI+LAogICAgLy8gICBsZWF2ZXM6IHVpbnQ2NCwKICAgIC8vICAgcGFydGljaXBhbnRzUm9vdDogYnl0ZXM8MzI+LAogICAgLy8gICBwYXJ0aWNpcGFudHNMZWF2ZXM6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0CiAgICAvLyApIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjc2CiAgICAvLyBhc3NlcnQocm9vdCAhPT0gcGFydGljaXBhbnRzUm9vdCwgRVJSX0JBRF9ST09UUykKICAgIGRpZyA2CiAgICBkaWcgNAogICAgIT0KICAgIGFzc2VydCAvLyByb290IGFuZCBwYXJ0aWNpcGFudHNSb290IGNhbm5vdCBiZSB0aGUgc2FtZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gYXNzZXJ0KGV4cGlyYXRpb24gPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfT0ZGRVJfRVhQSVJFRCkKICAgIGR1cAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYXNzZXJ0IC8vIG9mZmVyIGhhcyBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyBjb25zdCBwYXlvciA9IHBheW1lbnQuc2VuZGVyCiAgICBkaWcgNwogICAgZ3R4bnMgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjg1LTkyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGh5cGVyU3dhcE9mZmVyTUJSQW1vdW50CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA4CiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo4OAogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6ODUtOTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogaHlwZXJTd2FwT2ZmZXJNQlJBbW91bnQKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHVuY292ZXIgOQogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyBjb25zdCBoeXBlclN3YXBPZmZlck1CUkFtb3VudDogdWludDY0ID0gY29zdHMub2ZmZXJzICsgY29zdHMucGFydGljaXBhbnRzICsgKG1ldGFNZXJrbGVzQ29zdCAqIDIpCiAgICBpbnRjIDUgLy8gMjIyMjAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjg1LTkyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGh5cGVyU3dhcE9mZmVyTUJSQW1vdW50CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gY29uc3QgbWV0YU1lcmtsZXNBcHBJRCA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gY29uc3QgbWV0YU1lcmtsZXNBcHBJRCA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzIgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6OTQKICAgIC8vIGNvbnN0IG1ldGFNZXJrbGVzQXBwSUQgPSBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjk2LTEwNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocm9vdCksCiAgICAvLyAgICAgcm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihtZXRhTWVya2xlc0FwcElEKS5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBjb25zdCBtZXRhTWVya2xlc0Nvc3Q6IHVpbnQ2NCA9IGNvc3RzLm1tLnJvb3QgKyBjb3N0cy5tbS5kYXRhCiAgICBpbnRjIDYgLy8gNjgyMDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjk5LTEwMgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogbWV0YU1lcmtsZXNDb3N0LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjk2LTEwNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocm9vdCksCiAgICAvLyAgICAgcm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gU3RyaW5nKHJvb3QpLAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMDUKICAgIC8vIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjk2LTEwNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocm9vdCksCiAgICAvLyAgICAgcm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJhZGRSb290KHBheSxzdHJpbmcsYnl0ZVszMl0sdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTEwLTEyMQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICAvLyAgICAgcGFydGljaXBhbnRzUm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihtZXRhTWVya2xlc0FwcElEKS5hZGRyZXNzLAogICAgZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6ODEKICAgIC8vIGNvbnN0IG1ldGFNZXJrbGVzQ29zdDogdWludDY0ID0gY29zdHMubW0ucm9vdCArIGNvc3RzLm1tLmRhdGEKICAgIGludGMgNiAvLyA2ODIwMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTEzLTExNgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogbWV0YU1lcmtsZXNDb3N0LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjExMC0xMjEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS5hZGRSb290Pih7CiAgICAvLyAgIGFwcElkOiBtZXRhTWVya2xlc0FwcElELAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihtZXRhTWVya2xlc0FwcElEKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtZXRhTWVya2xlc0Nvc3QsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgU3RyaW5nKHBhcnRpY2lwYW50c1Jvb3QpLAogICAgLy8gICAgIHBhcnRpY2lwYW50c1Jvb3QsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMTcKICAgIC8vIFN0cmluZyhwYXJ0aWNpcGFudHNSb290KSwKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTEwLTEyMQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICAvLyAgICAgcGFydGljaXBhbnRzUm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJhZGRSb290KHBheSxzdHJpbmcsYnl0ZVszMl0sdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5vZmZlckN1cnNvci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjcKICAgIC8vIG9mZmVyQ3Vyc29yID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogSHlwZXJTd2FwR2xvYmFsU3RhdGVLZXlPZmZlckN1cnNvciB9KQogICAgYnl0ZWMgMTIgLy8gIm9mZmVyX2N1cnNvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5vZmZlckN1cnNvci52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHRoaXMub2ZmZXJDdXJzb3IudmFsdWUgKz0gMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNwogICAgLy8gb2ZmZXJDdXJzb3IgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBIeXBlclN3YXBHbG9iYWxTdGF0ZUtleU9mZmVyQ3Vyc29yIH0pCiAgICBieXRlYyAxMiAvLyAib2ZmZXJfY3Vyc29yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdGhpcy5vZmZlckN1cnNvci52YWx1ZSArPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo4MgogICAgLy8gY29uc3QgaHlwZXJTd2FwT2ZmZXJNQlJBbW91bnQ6IHVpbnQ2NCA9IGNvc3RzLm9mZmVycyArIGNvc3RzLnBhcnRpY2lwYW50cyArIChtZXRhTWVya2xlc0Nvc3QgKiAyKQogICAgaW50YyA1IC8vIDIyMjIwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIHRoaXMucGFydGljaXBhbnRzKHsgaWQsIGFkZHJlc3M6IFR4bi5zZW5kZXIgfSkudmFsdWUgPSB7IHBheW9yLCBhbW91bnQ6IGh5cGVyU3dhcE9mZmVyTUJSQW1vdW50IH0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzQKICAgIC8vIHBhcnRpY2lwYW50cyA9IEJveE1hcDxQYXJ0aWNpcGFudEtleSwgUmVmdW5kVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhQYXJ0aWNpcGFudHMgfSkKICAgIGJ5dGVjXzMgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyB0aGlzLnBhcnRpY2lwYW50cyh7IGlkLCBhZGRyZXNzOiBUeG4uc2VuZGVyIH0pLnZhbHVlID0geyBwYXlvciwgYW1vdW50OiBoeXBlclN3YXBPZmZlck1CUkFtb3VudCB9CiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBzdGF0ZTogU1RBVEVfT0ZGRVJFRCwKICAgIGJ5dGVjIDYgLy8gMHgwYQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMjktMTM4CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIHN0YXRlOiBTVEFURV9PRkZFUkVELAogICAgLy8gICByb290LAogICAgLy8gICBsZWF2ZXMsCiAgICAvLyAgIGVzY3Jvd2VkOiAwLAogICAgLy8gICBwYXJ0aWNpcGFudHNSb290LAogICAgLy8gICBwYXJ0aWNpcGFudHNMZWF2ZXMsCiAgICAvLyAgIGFjY2VwdGFuY2VzOiAxLAogICAgLy8gICBleHBpcmF0aW9uLAogICAgLy8gfQogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjEzMwogICAgLy8gZXNjcm93ZWQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMjktMTM4CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIHN0YXRlOiBTVEFURV9PRkZFUkVELAogICAgLy8gICByb290LAogICAgLy8gICBsZWF2ZXMsCiAgICAvLyAgIGVzY3Jvd2VkOiAwLAogICAgLy8gICBwYXJ0aWNpcGFudHNSb290LAogICAgLy8gICBwYXJ0aWNpcGFudHNMZWF2ZXMsCiAgICAvLyAgIGFjY2VwdGFuY2VzOiAxLAogICAgLy8gICBleHBpcmF0aW9uLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTM2CiAgICAvLyBhY2NlcHRhbmNlczogMSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjEyOS0xMzgKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgc3RhdGU6IFNUQVRFX09GRkVSRUQsCiAgICAvLyAgIHJvb3QsCiAgICAvLyAgIGxlYXZlcywKICAgIC8vICAgZXNjcm93ZWQ6IDAsCiAgICAvLyAgIHBhcnRpY2lwYW50c1Jvb3QsCiAgICAvLyAgIHBhcnRpY2lwYW50c0xlYXZlcywKICAgIC8vICAgYWNjZXB0YW5jZXM6IDEsCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyBvZmZlcnMgPSBCb3hNYXA8dWludDY0LCBPZmZlclZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4T2ZmZXJzIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTI5LTEzOAogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlID0gewogICAgLy8gICBzdGF0ZTogU1RBVEVfT0ZGRVJFRCwKICAgIC8vICAgcm9vdCwKICAgIC8vICAgbGVhdmVzLAogICAgLy8gICBlc2Nyb3dlZDogMCwKICAgIC8vICAgcGFydGljaXBhbnRzUm9vdCwKICAgIC8vICAgcGFydGljaXBhbnRzTGVhdmVzLAogICAgLy8gICBhY2NlcHRhbmNlczogMSwKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vIH0KICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NjgtNzUKICAgIC8vIG9mZmVyKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHJvb3Q6IGJ5dGVzPDMyPiwKICAgIC8vICAgbGVhdmVzOiB1aW50NjQsCiAgICAvLyAgIHBhcnRpY2lwYW50c1Jvb3Q6IGJ5dGVzPDMyPiwKICAgIC8vICAgcGFydGljaXBhbnRzTGVhdmVzOiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NAogICAgLy8gKSB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo6SHlwZXJTd2FwLmFjY2VwdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY2VwdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTQ4CiAgICAvLyBhY2NlcHQobWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBpZDogdWludDY0LCBwcm9vZjogUHJvb2YpIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMgogICAgLy8gb2ZmZXJzID0gQm94TWFwPHVpbnQ2NCwgT2ZmZXJWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeE9mZmVycyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGNvbnN0IHsgc3RhdGUsIGV4cGlyYXRpb24sIHBhcnRpY2lwYW50c1Jvb3QsIGFjY2VwdGFuY2VzLCBwYXJ0aWNpcGFudHNMZWF2ZXMgfSA9IHRoaXMub2ZmZXJzKGlkKS52YWx1ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgZXh0cmFjdCAwIDEKICAgIGRpZyAxCiAgICBwdXNoaW50IDk3IC8vIDk3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGV4dHJhY3QgNDkgMzIKICAgIGRpZyAzCiAgICBwdXNoaW50IDg5IC8vIDg5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciA0CiAgICBwdXNoaW50IDgxIC8vIDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGFzc2VydChzdGF0ZSA9PT0gU1RBVEVfT0ZGRVJFRCkKICAgIHVuY292ZXIgNAogICAgYnl0ZWMgNiAvLyAweDBhCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gYXNzZXJ0KGV4cGlyYXRpb24gPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfT0ZGRVJfRVhQSVJFRCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHVuY292ZXIgNAogICAgPAogICAgYXNzZXJ0IC8vIG9mZmVyIGhhcyBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE1Ni0xNjUKICAgIC8vIGNvbnN0IGlzUGFydGljaXBhbnQgPSBhYmlDYWxsPHR5cGVvZiBNZXRhTWVya2xlcy5wcm90b3R5cGUudmVyaWZ5Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihUeG4uc2VuZGVyLmJ5dGVzKSksCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTU3CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTkKICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTYxCiAgICAvLyBzaGEyNTYoc2hhMjU2KFR4bi5zZW5kZXIuYnl0ZXMpKSwKICAgIHR4biBTZW5kZXIKICAgIHNoYTI1NgogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE2MwogICAgLy8gTWVya2xlVHJlZVR5cGVUcmFkZQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTU2LTE2NQogICAgLy8gY29uc3QgaXNQYXJ0aWNpcGFudCA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZnk+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIFN0cmluZyhwYXJ0aWNpcGFudHNSb290KSwKICAgIC8vICAgICBzaGEyNTYoc2hhMjU2KFR4bi5zZW5kZXIuYnl0ZXMpKSwKICAgIC8vICAgICBwcm9vZiwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgYnl0ZWMgNyAvLyBtZXRob2QgInZlcmlmeShhZGRyZXNzLHN0cmluZyxieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NClib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYm9vbDgKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTY3CiAgICAvLyBhc3NlcnQoaXNQYXJ0aWNpcGFudCwgRVJSX05PVF9BX1BBUlRJQ0lQQU5UKQogICAgYXNzZXJ0IC8vIG5vdCBhIHBhcnRpY2lwYW50IGluIHRoaXMgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGNvbnN0IHNlbmRlclBhcnRpY2lwYW50S2V5ID0geyBpZCwgYWRkcmVzczogVHhuLnNlbmRlciB9CiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNzEKICAgIC8vIGFzc2VydCghdGhpcy5wYXJ0aWNpcGFudHMoc2VuZGVyUGFydGljaXBhbnRLZXkpLmV4aXN0cykKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHN3YXAKICAgIGV4dHJhY3QgOCAzMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0CiAgICAvLyBwYXJ0aWNpcGFudHMgPSBCb3hNYXA8UGFydGljaXBhbnRLZXksIFJlZnVuZFZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4UGFydGljaXBhbnRzIH0pCiAgICBieXRlY18zIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE3MQogICAgLy8gYXNzZXJ0KCF0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNzMKICAgIC8vIGNvbnN0IG5ld0FjY2VwdGFuY2VzOiB1aW50NjQgPSBhY2NlcHRhbmNlcyArIDEKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuYWNjZXB0YW5jZXMgPSBuZXdBY2NlcHRhbmNlcwogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIHB1c2hpbnQgODkgLy8gODkKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTc4LTE4NQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIG1iclBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5wYXJ0aWNpcGFudHMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE4MQogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTc4LTE4NQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIG1iclBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5wYXJ0aWNpcGFudHMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyA0CiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBhbW91bnQ6IGNvc3RzLnBhcnRpY2lwYW50cwogICAgaW50YyA0IC8vIDM0OTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE3OC0xODUKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBtYnJQYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogY29zdHMucGFydGljaXBhbnRzCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxODkKICAgIC8vIHBheW9yOiBtYnJQYXltZW50LnNlbmRlciwKICAgIHVuY292ZXIgMwogICAgZ3R4bnMgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gYW1vdW50OiBjb3N0cy5wYXJ0aWNpcGFudHMKICAgIGludGMgNCAvLyAzNDkwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxODgtMTkxCiAgICAvLyB0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkudmFsdWUgPSB7CiAgICAvLyAgIHBheW9yOiBtYnJQYXltZW50LnNlbmRlciwKICAgIC8vICAgYW1vdW50OiBjb3N0cy5wYXJ0aWNpcGFudHMKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gaWYgKHBhcnRpY2lwYW50c0xlYXZlcyA9PT0gbmV3QWNjZXB0YW5jZXMpIHsKICAgID09CiAgICBieiBhY2NlcHRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLnN0YXRlID0gU1RBVEVfRVNDUk9XSU5HCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vIDB4MTQKICAgIGJveF9yZXBsYWNlCgphY2NlcHRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNDgKICAgIC8vIGFjY2VwdChtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGlkOiB1aW50NjQsIHByb29mOiBQcm9vZikgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC5lc2Nyb3dbcm91dGluZ10oKSAtPiB2b2lkOgplc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gZXNjcm93KHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgaWQ6IHVpbnQ2NCwgcmVjZWl2ZXI6IEFjY291bnQsIGFtb3VudDogdWludDY0LCBwcm9vZjogUHJvb2YpIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMTAKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyBvZmZlcnMgPSBCb3hNYXA8dWludDY0LCBPZmZlclZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4T2ZmZXJzIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gYXNzZXJ0KHRoaXMub2ZmZXJzKGlkKS5leGlzdHMpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gY29uc3QgeyBzdGF0ZSwgcm9vdCwgZXNjcm93ZWQsIGxlYXZlcywgZXhwaXJhdGlvbiB9ID0gdGhpcy5vZmZlcnMoaWQpLnZhbHVlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgZGlnIDEKICAgIGV4dHJhY3QgMSAzMgogICAgZGlnIDIKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgcHVzaGludCAzMyAvLyAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgNAogICAgcHVzaGludCA5NyAvLyA5NwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBhc3NlcnQoc3RhdGUgPT09IFNUQVRFX0VTQ1JPV0lORywgRVJSX0lOVkFMSURfU1RBVEUpCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjIDUgLy8gMHgxNAogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBzdGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX09GRkVSX0VYUElSRUQpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gb2ZmZXIgaGFzIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyBjb25zdCBzZW5kZXJQYXJ0aWNpcGFudEtleSA9IHsgaWQsIGFkZHJlc3M6IFR4bi5zZW5kZXIgfQogICAgZGlnIDQKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMTgKICAgIC8vIGFzc2VydCh0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkuZXhpc3RzKQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDMyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzQKICAgIC8vIHBhcnRpY2lwYW50cyA9IEJveE1hcDxQYXJ0aWNpcGFudEtleSwgUmVmdW5kVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhQYXJ0aWNpcGFudHMgfSkKICAgIGJ5dGVjXzMgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyBhc3NlcnQodGhpcy5wYXJ0aWNpcGFudHMoc2VuZGVyUGFydGljaXBhbnRLZXkpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gY29uc3QgaGFzaCA9IHNoYTI1NihzaGEyNTYoQnl0ZXNgJHtUeG4uc2VuZGVyLmJ5dGVzfSR7cmVjZWl2ZXIuYnl0ZXN9JHtpdG9iKDApfSR7aXRvYihhbW91bnQpfWApKQogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHNoYTI1NgogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyMQogICAgLy8gY29uc3QgaGFzaEtleTogSGFzaEtleSA9IHsgaWQsIGhhc2ggfQogICAgdW5jb3ZlciA1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM2CiAgICAvLyBoYXNoZXMgPSBCb3hNYXA8SGFzaEtleSwgUmVmdW5kVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhIYXNoZXMgfSkKICAgIGJ5dGVjIDggLy8gImgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBhc3NlcnQoIXRoaXMuaGFzaGVzKGhhc2hLZXkpLmV4aXN0cykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjI0LTIzMwogICAgLy8gY29uc3QgdmVyaWZpZWQgPSBhYmlDYWxsPHR5cGVvZiBNZXRhTWVya2xlcy5wcm90b3R5cGUudmVyaWZ5Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBTdHJpbmcocm9vdCksCiAgICAvLyAgICAgaGFzaCwKICAgIC8vICAgICBwcm9vZiwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMjUKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyNQogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlY18yIC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyNQogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyNwogICAgLy8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIFN0cmluZyhyb290KSwKICAgIGRpZyA2CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMzEKICAgIC8vIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyNC0yMzMKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgU3RyaW5nKHJvb3QpLAogICAgLy8gICAgIGhhc2gsCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJ2ZXJpZnkoYWRkcmVzcyxzdHJpbmcsYnl0ZVszMl0sYnl0ZVszMl1bXSx1aW50NjQpYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGJvb2w4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIzNQogICAgLy8gYXNzZXJ0KHZlcmlmaWVkLCBFUlJfQ0FOVF9WRVJJRllfTEVBRikKICAgIGFzc2VydCAvLyBjYW5ub3QgdmVyaWZ5IGxlYWYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjM5LTI0NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQgKyBjb3N0cy5oYXNoZXMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDUKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI0MgogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjM5LTI0NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQgKyBjb3N0cy5oYXNoZXMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyA2CiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBhbW91bnQ6IGFtb3VudCArIGNvc3RzLmhhc2hlcwogICAgdW5jb3ZlciA2CiAgICBpbnRjIDQgLy8gMzQ5MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjM5LTI0NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQgKyBjb3N0cy5oYXNoZXMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI1MAogICAgLy8gcGF5b3I6IHBheW1lbnQuc2VuZGVyLAogICAgdW5jb3ZlciA0CiAgICBndHhucyBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBhbW91bnQ6IGFtb3VudCArIGNvc3RzLmhhc2hlcwogICAgaW50YyA0IC8vIDM0OTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI0OS0yNTIKICAgIC8vIHRoaXMuaGFzaGVzKGhhc2hLZXkpLnZhbHVlID0gewogICAgLy8gICBwYXlvcjogcGF5bWVudC5zZW5kZXIsCiAgICAvLyAgIGFtb3VudDogY29zdHMuaGFzaGVzCiAgICAvLyB9CiAgICBpdG9iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjU0CiAgICAvLyBjb25zdCBuZXdFc2Nyb3dlZDogdWludDY0ID0gZXNjcm93ZWQgKyAxCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNTUKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZS5lc2Nyb3dlZCA9IG5ld0VzY3Jvd2VkCiAgICBkdXAKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgcHVzaGludCA0MSAvLyA0MQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNTgKICAgIC8vIGlmIChsZWF2ZXMgPT09IG5ld0VzY3Jvd2VkKSB7CiAgICA9PQogICAgYnogZXNjcm93X2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNTkKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZS5zdGF0ZSA9IFNUQVRFX0RJU0JVUlNJTkcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gMHgxZQogICAgYm94X3JlcGxhY2UKCmVzY3Jvd19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gZXNjcm93KHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgaWQ6IHVpbnQ2NCwgcmVjZWl2ZXI6IEFjY291bnQsIGFtb3VudDogdWludDY0LCBwcm9vZjogUHJvb2YpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjpIeXBlclN3YXAuZXNjcm93QXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKZXNjcm93QXNhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNzMtMjgxCiAgICAvLyBlc2Nyb3dBc2EoCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVyOiBBY2NvdW50LAogICAgLy8gICBhc3NldDogdWludDY0LAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcHJvb2Y6IFByb29mCiAgICAvLyApIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAzMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbMzJdW10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gYXNzZXJ0KHRoaXMub2ZmZXJzKGlkKS5leGlzdHMpCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIG9mZmVycyA9IEJveE1hcDx1aW50NjQsIE9mZmVyVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhPZmZlcnMgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjgzCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBjb25zdCB7IHN0YXRlLCByb290LCBlc2Nyb3dlZCwgbGVhdmVzLCBleHBpcmF0aW9uIH0gPSB0aGlzLm9mZmVycyhpZCkudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgZGlnIDEKICAgIGV4dHJhY3QgMSAzMgogICAgZGlnIDIKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBjb3ZlciA4CiAgICBkaWcgMgogICAgcHVzaGludCAzMyAvLyAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDgKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA5NyAvLyA5NwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mjg2CiAgICAvLyBhc3NlcnQoc3RhdGUgPT09IFNUQVRFX0VTQ1JPV0lORywgRVJSX0lOVkFMSURfU1RBVEUpCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDUgLy8gMHgxNAogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBzdGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyODgKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX09GRkVSX0VYUElSRUQpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gb2ZmZXIgaGFzIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjkwCiAgICAvLyBjb25zdCBzZW5kZXJQYXJ0aWNpcGFudEtleSA9IHsgaWQsIGFkZHJlc3M6IFR4bi5zZW5kZXIgfQogICAgZGlnIDEKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTEKICAgIC8vIGFzc2VydCh0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkuZXhpc3RzKQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDMyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzQKICAgIC8vIHBhcnRpY2lwYW50cyA9IEJveE1hcDxQYXJ0aWNpcGFudEtleSwgUmVmdW5kVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhQYXJ0aWNpcGFudHMgfSkKICAgIGJ5dGVjXzMgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjkxCiAgICAvLyBhc3NlcnQodGhpcy5wYXJ0aWNpcGFudHMoc2VuZGVyUGFydGljaXBhbnRLZXkpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI5MwogICAgLy8gY29uc3QgaGFzaCA9IHNoYTI1NihzaGEyNTYoQnl0ZXNgJHtUeG4uc2VuZGVyLmJ5dGVzfSR7cmVjZWl2ZXIuYnl0ZXN9JHtpdG9iKGFzc2V0KX0ke2l0b2IoYW1vdW50KX1gKSkKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTQKICAgIC8vIGNvbnN0IGhhc2hLZXk6IEhhc2hLZXkgPSB7IGlkLCBoYXNoIH0KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNgogICAgLy8gaGFzaGVzID0gQm94TWFwPEhhc2hLZXksIFJlZnVuZFZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4SGFzaGVzIH0pCiAgICBieXRlYyA4IC8vICJoIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mjk1CiAgICAvLyBhc3NlcnQoIXRoaXMuaGFzaGVzKGhhc2hLZXkpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI5Ny0zMDYKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgU3RyaW5nKHJvb3QpLAogICAgLy8gICAgIGhhc2gsCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mjk4CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTgKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTgKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMDAKICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzAxCiAgICAvLyBTdHJpbmcocm9vdCksCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTctMzA2CiAgICAvLyBjb25zdCB2ZXJpZmllZCA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZnk+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIFN0cmluZyhyb290KSwKICAgIC8vICAgICBoYXNoLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyA3IC8vIG1ldGhvZCAidmVyaWZ5KGFkZHJlc3Msc3RyaW5nLGJ5dGVbMzJdLGJ5dGVbMzJdW10sdWludDY0KWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMDgKICAgIC8vIGFzc2VydCh2ZXJpZmllZCwgRVJSX0NBTlRfVkVSSUZZX0xFQUYpCiAgICBhc3NlcnQgLy8gY2Fubm90IHZlcmlmeSBsZWFmCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gbGV0IG1ickFtb3VudCA9IGNvc3RzLmhhc2hlcwogICAgaW50YyA0IC8vIDM0OTAwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gaWYgKCFyZWNlaXZlci5pc09wdGVkSW4oQXNzZXQoYXNzZXQpKSkgewogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBlc2Nyb3dBc2FfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gbGV0IG1ickFtb3VudCA9IGNvc3RzLmhhc2hlcwogICAgaW50YyA0IC8vIDM0OTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxNgogICAgLy8gbWJyQW1vdW50ICs9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICArCiAgICBidXJ5IDEKCmVzY3Jvd0FzYV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxOS0zMjYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBtYnJQYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA4CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyMgogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzE5LTMyNgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIG1iclBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMjgtMzM2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldCksCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9UUkFOU0ZFUgogICAgLy8gKQogICAgZGlnIDkKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzI4LTMzNgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIGFzc2V0WGZlciwKICAgIC8vICAgewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHhmZXJBc3NldDogQXNzZXQoYXNzZXQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnQKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfVFJBTlNGRVIKICAgIC8vICkKICAgID09CiAgICBkaWcgMQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBkaWcgMTEKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGRpZyA5CiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0MAogICAgLy8gcGF5b3I6IG1iclBheW1lbnQuc2VuZGVyLAogICAgc3dhcAogICAgZ3R4bnMgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMzOS0zNDIKICAgIC8vIHRoaXMuaGFzaGVzKGhhc2hLZXkpLnZhbHVlID0gewogICAgLy8gICBwYXlvcjogbWJyUGF5bWVudC5zZW5kZXIsCiAgICAvLyAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyB9CiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0NAogICAgLy8gY29uc3QgbmV3RXNjcm93ZWQ6IHVpbnQ2NCA9IGVzY3Jvd2VkICsgMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0NQogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLmVzY3Jvd2VkID0gbmV3RXNjcm93ZWQKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDYKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBpZiAobGVhdmVzID09PSBuZXdFc2Nyb3dlZCkgewogICAgZGlnIDMKICAgID09CiAgICBieiBlc2Nyb3dBc2FfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLnN0YXRlID0gU1RBVEVfRElTQlVSU0lORwogICAgZGlnIDQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vIDB4MWUKICAgIGJveF9yZXBsYWNlCgplc2Nyb3dBc2FfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNzMtMjgxCiAgICAvLyBlc2Nyb3dBc2EoCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVyOiBBY2NvdW50LAogICAgLy8gICBhc3NldDogdWludDY0LAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcHJvb2Y6IFByb29mCiAgICAvLyApIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjpIeXBlclN3YXAuZGlzYnVyc2Vbcm91dGluZ10oKSAtPiB2b2lkOgpkaXNidXJzZToKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM2MQogICAgLy8gZGlzYnVyc2UoaWQ6IHVpbnQ2NCwgcmVjZWl2ZXJXYWxsZXQ6IHVpbnQ2NCwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiB1aW50NjQsIGFtb3VudDogdWludDY0KSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzYzCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMgogICAgLy8gb2ZmZXJzID0gQm94TWFwPHVpbnQ2NCwgT2ZmZXJWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeE9mZmVycyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNjMKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNjQKICAgIC8vIGNvbnN0IHsgc3RhdGUsIGVzY3Jvd2VkIH0gPSB0aGlzLm9mZmVycyhpZCkudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgc3dhcAogICAgcHVzaGludCA0MSAvLyA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzY2CiAgICAvLyBhc3NlcnQoc3RhdGUgPT09IFNUQVRFX0RJU0JVUlNJTkcpCiAgICBieXRlYyA5IC8vIDB4MWUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBjb25zdCBoYXNoID0gc2hhMjU2KHNoYTI1NihCeXRlc2Ake1R4bi5zZW5kZXIuYnl0ZXN9JHtyZWNlaXZlci5ieXRlc30ke2l0b2IoYXNzZXQpfSR7aXRvYihhbW91bnQpfWApKQogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBjb25zdCBoYXNoS2V5OiBIYXNoS2V5ID0geyBpZCwgaGFzaCB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzYKICAgIC8vIGhhc2hlcyA9IEJveE1hcDxIYXNoS2V5LCBSZWZ1bmRWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeEhhc2hlcyB9KQogICAgYnl0ZWMgOCAvLyAiaCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNzEKICAgIC8vIGFzc2VydCh0aGlzLmhhc2hlcyhoYXNoS2V5KS5leGlzdHMpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM3MwogICAgLy8gbGV0IHsgcGF5b3IsIGFtb3VudDogcmVmdW5kQW1vdW50IH0gPSB0aGlzLmhhc2hlcyhoYXNoS2V5KS52YWx1ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgZXh0cmFjdCA4IDMyCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyB0aGlzLmhhc2hlcyhoYXNoS2V5KS5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM3NwogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBibnogZGlzYnVyc2VfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzc5LTM4MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDYKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM3OS0zODAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM3OS0zODEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzg0LTM4OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiByZWZ1bmRBbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHBheW9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM4NC0zODgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzg0LTM4OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiByZWZ1bmRBbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHBheW9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpkaXNidXJzZV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NDkKICAgIC8vIGNvbnN0IG5ld0VzY3Jvd2VkOiB1aW50NjQgPSBlc2Nyb3dlZCAtIDEKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZS5lc2Nyb3dlZCA9IG5ld0VzY3Jvd2VkCiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyA3CiAgICBwdXNoaW50IDQxIC8vIDQxCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ1MgogICAgLy8gaWYgKG5ld0VzY3Jvd2VkID09PSAwKSB7CiAgICBibnogZGlzYnVyc2VfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NTMKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZS5zdGF0ZSA9IFNUQVRFX0NPTVBMRVRFRAogICAgZGlnIDUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAweDI4CiAgICBib3hfcmVwbGFjZQoKZGlzYnVyc2VfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzYxCiAgICAvLyBkaXNidXJzZShpZDogdWludDY0LCByZWNlaXZlcldhbGxldDogdWludDY0LCByZWNlaXZlcjogQWNjb3VudCwgYXNzZXQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmRpc2J1cnNlX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozOTIKICAgIC8vIGNvbnN0IFssIGlzT3B0ZWRJbl0gPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKHJlY2VpdmVyLCBhc3NldCkKICAgIGRpZyA4CiAgICBkaWcgOAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBpZiAoIWlzT3B0ZWRJbikgewogICAgYm56IGRpc2J1cnNlX2Vsc2VfYm9keUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozOTYKICAgIC8vIGFzc2VydChyZWNlaXZlcldhbGxldCAhPT0gMCwgRVJSX1JFQ0VJVkVSX05PVF9PUFRFRF9JTikKICAgIGRpZyA5CiAgICBkdXAKICAgIGFzc2VydCAvLyByZWNlaXZlciBpcyBub3Qgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozOTcKICAgIC8vIGFzc2VydChBcHBsaWNhdGlvbihyZWNlaXZlcldhbGxldCkuYWRkcmVzcyA9PT0gcmVjZWl2ZXIsICdyZWNlaXZlcldhbGxldCBhZGRyZXNzIG1pc21hdGNoJykKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlY2VpdmVyV2FsbGV0IGFkZHJlc3MgbWlzbWF0Y2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzk5CiAgICAvLyBhc3NlcnQocmVmdW5kQW1vdW50ID49IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwgRVJSX1JFQ0VJVkVSX05PVF9PUFRFRF9JTikKICAgIGRpZyAxCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgID49CiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgaXMgbm90IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDAyCiAgICAvLyBjb25zdCBvcHRpblBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkub3B0aW4KICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDAyCiAgICAvLyBjb25zdCBvcHRpblBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkub3B0aW4KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgZHVwCiAgICBieXRlYyAxNCAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MDIKICAgIC8vIGNvbnN0IG9wdGluUGx1Z2luID0gZ2V0UGx1Z2luQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5vcHRpbgogICAgZXh0cmFjdCAwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDAzLTQxMgogICAgLy8gY29uc3QgY2FuT3B0SW4gPSBhYmlDYWxsPHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfY2FuQ2FsbD4oewogICAgLy8gICBhcHBJZDogcmVjZWl2ZXJXYWxsZXQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBvcHRpblBsdWdpbiwKICAgIC8vICAgICB0cnVlLAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgICcnLAogICAgLy8gICAgIG9wLmJ6ZXJvKDQpLnRvRml4ZWQoeyBsZW5ndGg6IDQgfSksCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIG9wLmJ6ZXJvKDQpLnRvRml4ZWQoeyBsZW5ndGg6IDQgfSksCiAgICBwdXNoaW50IDQgLy8gNAogICAgYnplcm8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDAzLTQxMgogICAgLy8gY29uc3QgY2FuT3B0SW4gPSBhYmlDYWxsPHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfY2FuQ2FsbD4oewogICAgLy8gICBhcHBJZDogcmVjZWl2ZXJXYWxsZXQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBvcHRpblBsdWdpbiwKICAgIC8vICAgICB0cnVlLAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgICcnLAogICAgLy8gICAgIG9wLmJ6ZXJvKDQpLnRvRml4ZWQoeyBsZW5ndGg6IDQgfSksCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHg0NzI3YWYyMSAvLyBtZXRob2QgImFyYzU4X2NhbkNhbGwodWludDY0LGJvb2wsYWRkcmVzcyxzdHJpbmcsYnl0ZVs0XSlib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyB0cnVlLAogICAgYnl0ZWMgMTUgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQwOQogICAgLy8gJycsCiAgICBieXRlYyAxMCAvLyAweDAwMDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MDMtNDEyCiAgICAvLyBjb25zdCBjYW5PcHRJbiA9IGFiaUNhbGw8dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9jYW5DYWxsPih7CiAgICAvLyAgIGFwcElkOiByZWNlaXZlcldhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG9wdGluUGx1Z2luLAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgJycsCiAgICAvLyAgICAgb3AuYnplcm8oNCkudG9GaXhlZCh7IGxlbmd0aDogNCB9KSwKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MTQKICAgIC8vIGFzc2VydChjYW5PcHRJbiwgRVJSX1JFQ0VJVkVSX05PVF9PUFRFRF9JTikKICAgIGFzc2VydCAvLyByZWNlaXZlciBpcyBub3Qgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MTcKICAgIC8vIGFyYzU4T3B0SW5BbmRTZW5kKHRoaXMuYWtpdGFEQU8udmFsdWUsIEFwcGxpY2F0aW9uKHJlY2VpdmVyV2FsbGV0KSwgJycsIFthc3NldF0sIFthbW91bnRdKQogICAgYnl0ZWMgMTggLy8gMHgwMDAxCiAgICBkaWcgNgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMjEKICAgIGJ5dGVjIDE4IC8vIDB4MDAwMQogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjM3NgogICAgLy8gYXNzZXJ0KGFzc2V0cy5sZW5ndGggPT09IGFtb3VudHMubGVuZ3RoLCBFUlJfQVNTRVRTX0FORF9BTU9VTlRTX01JU01BVENIKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGJ1cnkgMjEKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEFzc2V0cyBhbmQgYW1vdW50cyBtaXNtYXRjaAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NAogICAgLy8gY29uc3QgW3BsdWdpbkFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNQbHVnaW5BcHBMaXN0KSkKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgMTQgLy8gInBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Mzc3CiAgICAvLyBjb25zdCBvcHRpblBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QoYWtpdGFEQU8pLm9wdGluCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NwogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICBwdXNoYnl0ZXMgImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozODAtMzgzCiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHJlY2lwaWVudFdhbGxldC5pZCwKICAgIC8vICAgYXJnczogW29wdGluUGx1Z2luLCB0cnVlLCBlc2Nyb3csIFtdLCBbXV0KICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoYnl0ZXMgMHg1ODJmZjM4MiAvLyBtZXRob2QgImFyYzU4X3Jla2V5VG9QbHVnaW4odWludDY0LGJvb2wsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyB0cnVlLAogICAgYnl0ZWMgMTUgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDA5CiAgICAvLyAnJywKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MzgyCiAgICAvLyBhcmdzOiBbb3B0aW5QbHVnaW4sIHRydWUsIGVzY3JvdywgW10sIFtdXQogICAgYnl0ZWMgMTAgLy8gMHgwMDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTAgLy8gMHgwMDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MzgwLTM4MwogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW48dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9yZWtleVRvUGx1Z2luPih7CiAgICAvLyAgIGFwcElkOiByZWNpcGllbnRXYWxsZXQuaWQsCiAgICAvLyAgIGFyZ3M6IFtvcHRpblBsdWdpbiwgdHJ1ZSwgZXNjcm93LCBbXSwgW11dCiAgICAvLyB9KQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozODUtMzk2CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBPcHRJblBsdWdpbi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IG9wdGluUGx1Z2luLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgcmVjaXBpZW50V2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgYXNzZXRzLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogb3JpZ2luLAogICAgLy8gICAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBhc3NldHMubGVuZ3RoCiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozOTMKICAgIC8vIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICB1bmNvdmVyIDMKICAgICoKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjM5MS0zOTQKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBvcmlnaW4sCiAgICAvLyAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Mzg1LTM5NgogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgT3B0SW5QbHVnaW4ucHJvdG90eXBlLm9wdEluPih7CiAgICAvLyAgIGFwcElkOiBvcHRpblBsdWdpbiwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJlY2lwaWVudFdhbGxldCwKICAgIC8vICAgICB0cnVlLAogICAgLy8gICAgIGFzc2V0cywKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IG9yaWdpbiwKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gICAgIH0pCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIHB1c2hieXRlcyAweDY4MzVlM2JjIC8vIG1ldGhvZCAib3B0SW4odWludDY0LGJvb2wsdWludDY0W10scGF5KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MDcKICAgIC8vIHRydWUsCiAgICBieXRlYyAxNSAvLyAweDgwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozODUtMzk2CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBPcHRJblBsdWdpbi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IG9wdGluUGx1Z2luLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgcmVjaXBpZW50V2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgYXNzZXRzLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogb3JpZ2luLAogICAgLy8gICAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBhc3NldHMubGVuZ3RoCiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Mzk4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYW1vdW50cy5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKCmRpc2J1cnNlX3doaWxlX3RvcEAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Mzk4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYW1vdW50cy5sZW5ndGg7IGkrKykgewogICAgZGlnIDEzCiAgICBkaWcgMTYKICAgIDwKICAgIGJ6IGRpc2J1cnNlX2FmdGVyX3doaWxlQDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjM5OQogICAgLy8gaWYgKGFtb3VudHNbaV0gPiAwKSB7CiAgICBkaWcgMTgKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGJ6IGRpc2J1cnNlX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDAwLTQwNgogICAgLy8gaXR4bkNvbXBvc2UubmV4dCgKICAgIC8vICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50c1tpXSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBvcmlnaW4sCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldHNbaV0KICAgIC8vICAgfSkKICAgIC8vICkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MDQKICAgIC8vIHhmZXJBc3NldDogYXNzZXRzW2ldCiAgICBkaWcgMTcKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTUKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZGlnIDE2CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAxMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MDEtNDA1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50c1tpXSwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogb3JpZ2luLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0c1tpXQogICAgLy8gfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKCmRpc2J1cnNlX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjM5OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFtb3VudHMubGVuZ3RoOyBpKyspIHsKICAgIGRpZyAxMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTQKICAgIGIgZGlzYnVyc2Vfd2hpbGVfdG9wQDE5CgpkaXNidXJzZV9hZnRlcl93aGlsZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDEwLTQxMgogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzPih7CiAgICAvLyAgIGFwcElkOiByZWNpcGllbnRXYWxsZXQKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIHB1c2hieXRlcyAweDZjYzNmNjA2IC8vIG1ldGhvZCAiYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MTQKICAgIC8vIGl0eG5Db21wb3NlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MjAKICAgIC8vIGNvbnN0IG9wdEluQ29zdCA9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDIxCiAgICAvLyBpZiAocmVmdW5kQW1vdW50ID4gb3B0SW5Db3N0KSB7CiAgICBkaWcgMQogICAgPAogICAgYnogZGlzYnVyc2VfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MjItNDI3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IHJlZnVuZEFtb3VudCAtIG9wdEluQ29zdCwKICAgIC8vICAgICByZWNlaXZlcjogcGF5b3IsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MjQKICAgIC8vIGFtb3VudDogcmVmdW5kQW1vdW50IC0gb3B0SW5Db3N0LAogICAgZHVwCiAgICBkaWcgMTMKICAgIC0KICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MjItNDI2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IHJlZnVuZEFtb3VudCAtIG9wdEluQ29zdCwKICAgIC8vICAgICByZWNlaXZlcjogcGF5b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQyMi00MjcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50IC0gb3B0SW5Db3N0LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBkaXNidXJzZV9hZnRlcl9pZl9lbHNlQDE1CgpkaXNidXJzZV9lbHNlX2JvZHlAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQzMS00MzcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiByZWNlaXZlciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQzMS00MzYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiByZWNlaXZlciwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDMxLTQzNwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHJlY2VpdmVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ0MC00NDUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NDAtNDQ0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IHJlZnVuZEFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcjogcGF5b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ0MC00NDUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBkaXNidXJzZV9hZnRlcl9pZl9lbHNlQDE1CgoKLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo6SHlwZXJTd2FwLmNhbmNlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNhbmNlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDYxCiAgICAvLyBjYW5jZWwoaWQ6IHVpbnQ2NCwgcHJvb2Y6IFByb29mKSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NjMKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgaXRvYgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyBvZmZlcnMgPSBCb3hNYXA8dWludDY0LCBPZmZlclZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4T2ZmZXJzIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ2NAogICAgLy8gY29uc3QgeyBzdGF0ZSwgcGFydGljaXBhbnRzUm9vdCwgZXNjcm93ZWQsIHJvb3QsIGV4cGlyYXRpb24gfSA9IHRoaXMub2ZmZXJzKGlkKS52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBleHRyYWN0IDQ5IDMyCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDk3IC8vIDk3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NjcKICAgIC8vIHN0YXRlID09PSBTVEFURV9PRkZFUkVEIHx8IHN0YXRlID09PSBTVEFURV9FU0NST1dJTkcgfHwKICAgIGJ5dGVjIDYgLy8gMHgwYQogICAgPT0KICAgIGJueiBjYW5jZWxfYm9vbF90cnVlQDUKICAgIGRpZyAzCiAgICBieXRlYyA1IC8vIDB4MTQKICAgID09CiAgICBibnogY2FuY2VsX2Jvb2xfdHJ1ZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ2OAogICAgLy8gKHN0YXRlID09PSBTVEFURV9ESVNCVVJTSU5HICYmIGV4cGlyYXRpb24gPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCksCiAgICBkaWcgMwogICAgYnl0ZWMgOSAvLyAweDFlCiAgICA9PQogICAgYnogY2FuY2VsX2Jvb2xfZmFsc2VANgogICAgZHVwCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYnogY2FuY2VsX2Jvb2xfZmFsc2VANgoKY2FuY2VsX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmNhbmNlbF9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ2Ni00NzAKICAgIC8vIGFzc2VydCgKICAgIC8vICAgc3RhdGUgPT09IFNUQVRFX09GRkVSRUQgfHwgc3RhdGUgPT09IFNUQVRFX0VTQ1JPV0lORyB8fAogICAgLy8gICAoc3RhdGUgPT09IFNUQVRFX0RJU0JVUlNJTkcgJiYgZXhwaXJhdGlvbiA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wKSwKICAgIC8vICAgRVJSX0lOVkFMSURfU1RBVEUKICAgIC8vICkKICAgIGFzc2VydCAvLyB3cm9uZyBzdGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NzMKICAgIC8vIGNvbnN0IHNlbmRlclBhcnRpY2lwYW50S2V5ID0geyBpZCwgYWRkcmVzczogVHhuLnNlbmRlciB9CiAgICBkaWcgNQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ3NAogICAgLy8gYXNzZXJ0KHRoaXMucGFydGljaXBhbnRzKHNlbmRlclBhcnRpY2lwYW50S2V5KS5leGlzdHMsIEVSUl9OT1RfQUNDRVBURUQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBleHRyYWN0IDggMzIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNAogICAgLy8gcGFydGljaXBhbnRzID0gQm94TWFwPFBhcnRpY2lwYW50S2V5LCBSZWZ1bmRWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeFBhcnRpY2lwYW50cyB9KQogICAgYnl0ZWNfMyAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIGFzc2VydCh0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkuZXhpc3RzLCBFUlJfTk9UX0FDQ0VQVEVEKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbXVzdCBoYXZlIGFjY2VwdGVkIHRvIGNhbmNlbAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NzctNDg2CiAgICAvLyBjb25zdCBpc1BhcnRpY2lwYW50ID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgU3RyaW5nKHBhcnRpY2lwYW50c1Jvb3QpLAogICAgLy8gICAgIHNoYTI1NihzaGEyNTYoVHhuLnNlbmRlci5ieXRlcykpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzIgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgcHVzaGludCA3MiAvLyA3MgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDgwCiAgICAvLyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ4MQogICAgLy8gU3RyaW5nKHBhcnRpY2lwYW50c1Jvb3QpLAogICAgZGlnIDQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ4MgogICAgLy8gc2hhMjU2KHNoYTI1NihUeG4uc2VuZGVyLmJ5dGVzKSksCiAgICB0eG4gU2VuZGVyCiAgICBzaGEyNTYKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0ODQKICAgIC8vIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ3Ny00ODYKICAgIC8vIGNvbnN0IGlzUGFydGljaXBhbnQgPSBhYmlDYWxsPHR5cGVvZiBNZXRhTWVya2xlcy5wcm90b3R5cGUudmVyaWZ5Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihUeG4uc2VuZGVyLmJ5dGVzKSksCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJ2ZXJpZnkoYWRkcmVzcyxzdHJpbmcsYnl0ZVszMl0sYnl0ZVszMl1bXSx1aW50NjQpYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDgKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYm9vbDgKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDg4CiAgICAvLyBhc3NlcnQoaXNQYXJ0aWNpcGFudCwgRVJSX05PVF9BX1BBUlRJQ0lQQU5UKQogICAgYXNzZXJ0IC8vIG5vdCBhIHBhcnRpY2lwYW50IGluIHRoaXMgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0OTAKICAgIC8vIGlmIChlc2Nyb3dlZCA9PT0gMCkgewogICAgZGlnIDEKICAgIGJueiBjYW5jZWxfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ5MQogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLnN0YXRlID0gU1RBVEVfQ0FOQ0VMX0NPTVBMRVRFRAogICAgZGlnIDQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAweDNjCiAgICBib3hfcmVwbGFjZQoKY2FuY2VsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ2MQogICAgLy8gY2FuY2VsKGlkOiB1aW50NjQsIHByb29mOiBQcm9vZikgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2FuY2VsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDkzCiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuc3RhdGUgPSBTVEFURV9DQU5DRUxMRUQKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzIDB4MzIKICAgIGJveF9yZXBsYWNlCiAgICBiIGNhbmNlbF9hZnRlcl9pZl9lbHNlQDExCgpjYW5jZWxfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2FuY2VsX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC53aXRoZHJhd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhkcmF3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MDgKICAgIC8vIHdpdGhkcmF3KGlkOiB1aW50NjQsIHJlY2VpdmVyOiBBY2NvdW50LCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCwgcHJvb2Y6IFByb29mKSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1aW50OFszMl1bXSkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTEwCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMgogICAgLy8gb2ZmZXJzID0gQm94TWFwPHVpbnQ2NCwgT2ZmZXJWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeE9mZmVycyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MTAKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MTEKICAgIC8vIGNvbnN0IHsgc3RhdGUsIGVzY3Jvd2VkLCByb290IH0gPSB0aGlzLm9mZmVycyhpZCkudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgZGlnIDEKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvdmVyIDkKICAgIHN3YXAKICAgIGV4dHJhY3QgMSAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MTMKICAgIC8vIGFzc2VydChzdGF0ZSA9PT0gU1RBVEVfQ0FOQ0VMTEVEKQogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTE1CiAgICAvLyBhc3NlcnQoZXNjcm93ZWQgPiAwKQogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUxNwogICAgLy8gY29uc3QgaGFzaCA9IHNoYTI1NihzaGEyNTYoQnl0ZXNgJHtUeG4uc2VuZGVyLmJ5dGVzfSR7cmVjZWl2ZXIuYnl0ZXN9JHtpdG9iKGFzc2V0KX0ke2l0b2IoYW1vdW50KX1gKSkKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTE4CiAgICAvLyBjb25zdCBoYXNoS2V5OiBIYXNoS2V5ID0geyBpZCwgaGFzaCB9CiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzYKICAgIC8vIGhhc2hlcyA9IEJveE1hcDxIYXNoS2V5LCBSZWZ1bmRWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeEhhc2hlcyB9KQogICAgYnl0ZWMgOCAvLyAiaCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MTkKICAgIC8vIGFzc2VydCh0aGlzLmhhc2hlcyhoYXNoS2V5KS5leGlzdHMpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUyMS01MzAKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgU3RyaW5nKHJvb3QpLAogICAgLy8gICAgIGhhc2gsCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTIyCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MjIKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MjIKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MjQKICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTI1CiAgICAvLyBTdHJpbmcocm9vdCksCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTI4CiAgICAvLyBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MjEtNTMwCiAgICAvLyBjb25zdCB2ZXJpZmllZCA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZnk+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIFN0cmluZyhyb290KSwKICAgIC8vICAgICBoYXNoLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyA3IC8vIG1ldGhvZCAidmVyaWZ5KGFkZHJlc3Msc3RyaW5nLGJ5dGVbMzJdLGJ5dGVbMzJdW10sdWludDY0KWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MzIKICAgIC8vIGFzc2VydCh2ZXJpZmllZCwgRVJSX0NBTlRfVkVSSUZZX0xFQUYpCiAgICBhc3NlcnQgLy8gY2Fubm90IHZlcmlmeSBsZWFmCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUzNAogICAgLy8gbGV0IHsgcGF5b3IsIGFtb3VudDogcmVmdW5kQW1vdW50IH0gPSB0aGlzLmhhc2hlcyhoYXNoS2V5KS52YWx1ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgZXh0cmFjdCA4IDMyCiAgICBjb3ZlciA0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTM1CiAgICAvLyB0aGlzLmhhc2hlcyhoYXNoS2V5KS5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUzNwogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBibnogd2l0aGRyYXdfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTM4LTU0MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1NDEKICAgIC8vIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTM4LTU0MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUzOC01NDMKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0Cgp3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU1NC01NTkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1NTQtNTU4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IHJlZnVuZEFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcjogcGF5b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU1NC01NTkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1NjIKICAgIC8vIGNvbnN0IG5ld0VzY3Jvd2VkOiB1aW50NjQgPSBlc2Nyb3dlZCAtIDEKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU2NAogICAgLy8gaWYgKG5ld0VzY3Jvd2VkID09PSAwKSB7CiAgICBibnogd2l0aGRyYXdfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU2NQogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLmVzY3Jvd2VkID0gbmV3RXNjcm93ZWQKICAgIGl0b2IKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTY2CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuc3RhdGUgPSBTVEFURV9DQU5DRUxfQ09NUExFVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gMHgzYwogICAgYm94X3JlcGxhY2UKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUwOAogICAgLy8gd2l0aGRyYXcoaWQ6IHVpbnQ2NCwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiB1aW50NjQsIGFtb3VudDogdWludDY0LCBwcm9vZjogUHJvb2YpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCndpdGhkcmF3X2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTY4CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuZXNjcm93ZWQgPSBuZXdFc2Nyb3dlZAogICAgaXRvYgogICAgZGlnIDQKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIGIgd2l0aGRyYXdfYWZ0ZXJfaWZfZWxzZUAxMQoKd2l0aGRyYXdfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU0NS01NTEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTQ5CiAgICAvLyBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTQ1LTU1MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU0NS01NTEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBiIHdpdGhkcmF3X2FmdGVyX2lmX2Vsc2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC5jbGVhbnVwUGFydGljaXBhbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjbGVhbnVwUGFydGljaXBhbnQ6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTgxCiAgICAvLyBjbGVhbnVwUGFydGljaXBhbnQoaWQ6IHVpbnQ2NCwgcGFydGljaXBhbnQ6IEFjY291bnQpIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTgyCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIGl0b2IKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMgogICAgLy8gb2ZmZXJzID0gQm94TWFwPHVpbnQ2NCwgT2ZmZXJWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeE9mZmVycyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU4MgogICAgLy8gYXNzZXJ0KHRoaXMub2ZmZXJzKGlkKS5leGlzdHMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1ODMKICAgIC8vIGNvbnN0IHsgc3RhdGUsIGV4cGlyYXRpb24sIGFjY2VwdGFuY2VzIH0gPSB0aGlzLm9mZmVycyhpZCkudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGR1cAogICAgcHVzaGludCA5NyAvLyA5NwogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgODkgLy8gODkKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU4NgogICAgLy8gY29uc3QgaXNDb21wbGV0ZWQgPSBzdGF0ZSA9PT0gU1RBVEVfQ09NUExFVEVEIHx8IHN0YXRlID09PSBTVEFURV9DQU5DRUxfQ09NUExFVEVECiAgICBieXRlYyAxMyAvLyAweDI4CiAgICA9PQogICAgYm56IGNsZWFudXBQYXJ0aWNpcGFudF9ib29sX3RydWVAMwogICAgZGlnIDIKICAgIGJ5dGVjIDExIC8vIDB4M2MKICAgID09CiAgICBieiBjbGVhbnVwUGFydGljaXBhbnRfYm9vbF9mYWxzZUA0CgpjbGVhbnVwUGFydGljaXBhbnRfYm9vbF90cnVlQDM6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSA3CgpjbGVhbnVwUGFydGljaXBhbnRfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1ODcKICAgIC8vIGNvbnN0IGlzRXhwaXJlZCA9IChzdGF0ZSA9PT0gU1RBVEVfT0ZGRVJFRCB8fCBzdGF0ZSA9PT0gU1RBVEVfRVNDUk9XSU5HKSAmJiBleHBpcmF0aW9uIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAyCiAgICBieXRlYyA2IC8vIDB4MGEKICAgID09CiAgICBibnogY2xlYW51cFBhcnRpY2lwYW50X2FuZF9jb250ZEA3CiAgICBkaWcgMgogICAgYnl0ZWMgNSAvLyAweDE0CiAgICA9PQogICAgYnogY2xlYW51cFBhcnRpY2lwYW50X2Jvb2xfZmFsc2VAOQoKY2xlYW51cFBhcnRpY2lwYW50X2FuZF9jb250ZEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1ODcKICAgIC8vIGNvbnN0IGlzRXhwaXJlZCA9IChzdGF0ZSA9PT0gU1RBVEVfT0ZGRVJFRCB8fCBzdGF0ZSA9PT0gU1RBVEVfRVNDUk9XSU5HKSAmJiBleHBpcmF0aW9uIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYnogY2xlYW51cFBhcnRpY2lwYW50X2Jvb2xfZmFsc2VAOQogICAgaW50Y18xIC8vIDEKCmNsZWFudXBQYXJ0aWNpcGFudF9ib29sX21lcmdlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1ODgKICAgIC8vIGFzc2VydChpc0NvbXBsZXRlZCB8fCBpc0V4cGlyZWQsIEVSUl9JTlZBTElEX1NUQVRFKQogICAgZGlnIDcKICAgIHx8CiAgICBhc3NlcnQgLy8gd3Jvbmcgc3RhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTkwCiAgICAvLyBjb25zdCBwYXJ0aWNpcGFudEtleTogUGFydGljaXBhbnRLZXkgPSB7IGlkLCBhZGRyZXNzOiBwYXJ0aWNpcGFudCB9CiAgICBkaWcgNAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNAogICAgLy8gcGFydGljaXBhbnRzID0gQm94TWFwPFBhcnRpY2lwYW50S2V5LCBSZWZ1bmRWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeFBhcnRpY2lwYW50cyB9KQogICAgYnl0ZWNfMyAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGFzc2VydCh0aGlzLnBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudEtleSkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1OTMKICAgIC8vIGNvbnN0IHsgcGF5b3IsIGFtb3VudCB9ID0gdGhpcy5wYXJ0aWNpcGFudHMocGFydGljaXBhbnRLZXkpLnZhbHVlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDggMzIKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1OTQKICAgIC8vIHRoaXMucGFydGljaXBhbnRzKHBhcnRpY2lwYW50S2V5KS5kZWxldGUoKQogICAgdW5jb3ZlciAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTk3CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuYWNjZXB0YW5jZXMgPSBhY2NlcHRhbmNlcyAtIDEKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZGlnIDYKICAgIHB1c2hpbnQgODkgLy8gODkKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NjAwLTYwNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo2MDAtNjA0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHBheW9yLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo2MDAtNjA1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHBheW9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU4MQogICAgLy8gY2xlYW51cFBhcnRpY2lwYW50KGlkOiB1aW50NjQsIHBhcnRpY2lwYW50OiBBY2NvdW50KSB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGVhbnVwUGFydGljaXBhbnRfYm9vbF9mYWxzZUA5OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xlYW51cFBhcnRpY2lwYW50X2Jvb2xfbWVyZ2VAMTAKCmNsZWFudXBQYXJ0aWNpcGFudF9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICBiIGNsZWFudXBQYXJ0aWNpcGFudF9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjpIeXBlclN3YXAuY2xlYW51cE9mZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xlYW51cE9mZmVyOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYxNAogICAgLy8gY2xlYW51cE9mZmVyKGlkOiB1aW50NjQpIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYxNQogICAgLy8gYXNzZXJ0KHRoaXMub2ZmZXJzKGlkKS5leGlzdHMpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyBvZmZlcnMgPSBCb3hNYXA8dWludDY0LCBPZmZlclZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4T2ZmZXJzIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NjE1CiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYxNgogICAgLy8gY29uc3QgeyBzdGF0ZSwgZXhwaXJhdGlvbiwgYWNjZXB0YW5jZXMgfSA9IHRoaXMub2ZmZXJzKGlkKS52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBwdXNoaW50IDk3IC8vIDk3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgY292ZXIgMgogICAgcHVzaGludCA4OSAvLyA4OQogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NjE5CiAgICAvLyBjb25zdCBpc0NvbXBsZXRlZCA9IHN0YXRlID09PSBTVEFURV9DT01QTEVURUQgfHwgc3RhdGUgPT09IFNUQVRFX0NBTkNFTF9DT01QTEVURUQKICAgIGJ5dGVjIDEzIC8vIDB4MjgKICAgID09CiAgICBibnogY2xlYW51cE9mZmVyX2Jvb2xfdHJ1ZUAzCiAgICBkaWcgMgogICAgYnl0ZWMgMTEgLy8gMHgzYwogICAgPT0KICAgIGJ6IGNsZWFudXBPZmZlcl9ib29sX2ZhbHNlQDQKCmNsZWFudXBPZmZlcl9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDUKCmNsZWFudXBPZmZlcl9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYyMAogICAgLy8gY29uc3QgaXNFeHBpcmVkID0gKHN0YXRlID09PSBTVEFURV9PRkZFUkVEIHx8IHN0YXRlID09PSBTVEFURV9FU0NST1dJTkcpICYmIGV4cGlyYXRpb24gPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZGlnIDIKICAgIGJ5dGVjIDYgLy8gMHgwYQogICAgPT0KICAgIGJueiBjbGVhbnVwT2ZmZXJfYW5kX2NvbnRkQDcKICAgIGRpZyAyCiAgICBieXRlYyA1IC8vIDB4MTQKICAgID09CiAgICBieiBjbGVhbnVwT2ZmZXJfYm9vbF9mYWxzZUA5CgpjbGVhbnVwT2ZmZXJfYW5kX2NvbnRkQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYyMAogICAgLy8gY29uc3QgaXNFeHBpcmVkID0gKHN0YXRlID09PSBTVEFURV9PRkZFUkVEIHx8IHN0YXRlID09PSBTVEFURV9FU0NST1dJTkcpICYmIGV4cGlyYXRpb24gPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBieiBjbGVhbnVwT2ZmZXJfYm9vbF9mYWxzZUA5CiAgICBpbnRjXzEgLy8gMQoKY2xlYW51cE9mZmVyX2Jvb2xfbWVyZ2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYyMQogICAgLy8gYXNzZXJ0KGlzQ29tcGxldGVkIHx8IGlzRXhwaXJlZCwgRVJSX0lOVkFMSURfU1RBVEUpCiAgICBkaWcgNQogICAgfHwKICAgIGFzc2VydCAvLyB3cm9uZyBzdGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo2MjQKICAgIC8vIGFzc2VydChhY2NlcHRhbmNlcyA9PT0gMCwgJ2FsbCBwYXJ0aWNpcGFudHMgbXVzdCBiZSBjbGVhbmVkIHVwIGZpcnN0JykKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIGFsbCBwYXJ0aWNpcGFudHMgbXVzdCBiZSBjbGVhbmVkIHVwIGZpcnN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYyNgogICAgLy8gdGhpcy5vZmZlcnMoaWQpLmRlbGV0ZSgpCiAgICBkaWcgMwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYxNAogICAgLy8gY2xlYW51cE9mZmVyKGlkOiB1aW50NjQpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsZWFudXBPZmZlcl9ib29sX2ZhbHNlQDk6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGVhbnVwT2ZmZXJfYm9vbF9tZXJnZUAxMAoKY2xlYW51cE9mZmVyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIGIgY2xlYW51cE9mZmVyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo6Q29udHJhY3RXaXRoT3B0SW4ub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czoyMwogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czoyNS0zMgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjI4CiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjI1LTMyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHVuY292ZXIgMgogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjkKICAgIC8vIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjUtMzIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozNC00MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozNgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozNwogICAgLy8gYXNzZXRBbW91bnQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MzQtMzkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozNC00MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjMKICAgIC8vIG9wdEluKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OlVwZ3JhZGVhYmxlQWtpdGFCYXNlQ29udHJhY3QudXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGJ5dGVjIDE5IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NAogICAgLy8gY29uc3QgW3BsdWdpbkFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNQbHVnaW5BcHBMaXN0KSkKICAgIGJ5dGVjIDE0IC8vICJwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MQogICAgLy8gY29uc3QgdXBkYXRlUGx1Z2luID0gZ2V0UGx1Z2luQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS51cGRhdGUKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MgogICAgLy8gYXNzZXJ0KEdsb2JhbC5jYWxsZXJBcHBsaWNhdGlvbklkID09PSB1cGRhdGVQbHVnaW4sIEVSUl9JTlZBTElEX1VQR1JBREUpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGFwcCB1cGdyYWRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgYnl0ZWMgMTYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MwogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gbmV3VmVyc2lvbgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyAxOSAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOAogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type Object57Cb3C34 = {\n root: bigint,\n data: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a Object57CB3C34 to the struct representation\n */\nexport function Object57Cb3C34FromTuple(abiTuple: [bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.Object57CB3C34, APP_SPEC.structs) as Object57Cb3C34\n}\n\nexport type HashKey = {\n id: bigint,\n hash: Uint8Array\n}\n\n\n/**\n * Converts the ABI tuple representation of a HashKey to the struct representation\n */\nexport function HashKeyFromTuple(abiTuple: [bigint, Uint8Array]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.HashKey, APP_SPEC.structs) as HashKey\n}\n\nexport type HyperSwapMbrData = {\n offers: bigint,\n participants: bigint,\n hashes: bigint,\n mm: Object57Cb3C34\n}\n\n\n/**\n * Converts the ABI tuple representation of a HyperSwapMBRData to the struct representation\n */\nexport function HyperSwapMbrDataFromTuple(abiTuple: [bigint, bigint, bigint, [bigint, bigint]]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.HyperSwapMBRData, APP_SPEC.structs) as HyperSwapMbrData\n}\n\nexport type OfferValue = {\n state: number,\n root: Uint8Array,\n leaves: bigint,\n escrowed: bigint,\n participantsRoot: Uint8Array,\n participantsLeaves: bigint,\n acceptances: bigint,\n expiration: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a OfferValue to the struct representation\n */\nexport function OfferValueFromTuple(abiTuple: [number, Uint8Array, bigint, bigint, Uint8Array, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.OfferValue, APP_SPEC.structs) as OfferValue\n}\n\nexport type ParticipantKey = {\n id: bigint,\n address: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a ParticipantKey to the struct representation\n */\nexport function ParticipantKeyFromTuple(abiTuple: [bigint, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.ParticipantKey, APP_SPEC.structs) as ParticipantKey\n}\n\nexport type RefundValue = {\n amount: bigint,\n payor: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a RefundValue to the struct representation\n */\nexport function RefundValueFromTuple(abiTuple: [bigint, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RefundValue, APP_SPEC.structs) as RefundValue\n}\n\n/**\n * The argument types for the HyperSwap contract\n */\nexport type HyperSwapArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,uint64)void': {\n version: string\n akitaDao: bigint | number\n }\n 'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void': {\n payment: AppMethodCallTransactionArgument\n /**\n * the merkle tree root of trades consisting of from address, recipient address, asset id & amount\n */\n root: Uint8Array\n /**\n * the number of leaves in the tree\n */\n leaves: bigint | number\n /**\n * the merkle tree root of participating addresses\n */\n participantsRoot: Uint8Array\n participantsLeaves: bigint | number\n /**\n * the unix timestamp that the offer auto-expires at if it has not been accepted by all participants\n */\n expiration: bigint | number\n }\n 'accept(pay,uint64,byte[32][])void': {\n /**\n * the payment to cover the MBR\n */\n mbrPayment: AppMethodCallTransactionArgument\n /**\n * the id of the offer being accepted\n */\n id: bigint | number\n /**\n * the bytes32 array proof of inclusion in the participants list\n */\n proof: Uint8Array[]\n }\n 'escrow(pay,uint64,address,uint64,byte[32][])void': {\n payment: AppMethodCallTransactionArgument\n /**\n * the id of the offer\n */\n id: bigint | number\n /**\n * the recipient in the offer leaf\n */\n receiver: string\n /**\n * the amount in the offer leaf\n */\n amount: bigint | number\n /**\n * the proof to verify the details are part of the tree\n */\n proof: Uint8Array[]\n }\n 'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void': {\n /**\n * the payment to cover the MBR\n */\n mbrPayment: AppMethodCallTransactionArgument\n /**\n * the asset transfer to escrow the asa\n */\n assetXfer: AppMethodCallTransactionArgument\n /**\n * the id of the offer\n */\n id: bigint | number\n /**\n * the recipient in the offer leaf\n */\n receiver: string\n /**\n * the asset in the offer leaf\n */\n asset: bigint | number\n /**\n * the amount in the offer leaf\n */\n amount: bigint | number\n /**\n * the proof to verify the details are part of the tree\n */\n proof: Uint8Array[]\n }\n 'disburse(uint64,uint64,address,uint64,uint64)void': {\n /**\n * the id of the offer\n */\n id: bigint | number\n /**\n * the receiver's ARC58 wallet app id (0 if not an ARC58 wallet)\n */\n receiverWallet: bigint | number\n /**\n * the recipient address in the leaf\n */\n receiver: string\n /**\n * the asset being transferred\n */\n asset: bigint | number\n /**\n * the amount being transferred\n */\n amount: bigint | number\n }\n 'cancel(uint64,byte[32][])void': {\n /**\n * the id of the offer being cancelled\n */\n id: bigint | number\n /**\n * a proof of inclusion in the participants list\n */\n proof: Uint8Array[]\n }\n 'withdraw(uint64,address,uint64,uint64,byte[32][])void': {\n /**\n * the id of the cancelled offer\n */\n id: bigint | number\n /**\n * the receiver of the leaf's swap\n */\n receiver: string\n /**\n * the asset of the leaf's swap\n */\n asset: bigint | number\n /**\n * the amount of the leaf's swap\n */\n amount: bigint | number\n /**\n * the proof that the leaf is in the tree\n */\n proof: Uint8Array[]\n }\n 'cleanupParticipant(uint64,address)void': {\n /**\n * the id of the offer\n */\n id: bigint | number\n /**\n * the participant address to clean up\n */\n participant: string\n }\n 'cleanupOffer(uint64)void': {\n /**\n * the id of the offer\n */\n id: bigint | number\n }\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n 'mbr()(uint64,uint64,uint64,(uint64,uint64))': Record<string, never>\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,uint64)void': [version: string, akitaDao: bigint | number]\n 'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void': [payment: AppMethodCallTransactionArgument, root: Uint8Array, leaves: bigint | number, participantsRoot: Uint8Array, participantsLeaves: bigint | number, expiration: bigint | number]\n 'accept(pay,uint64,byte[32][])void': [mbrPayment: AppMethodCallTransactionArgument, id: bigint | number, proof: Uint8Array[]]\n 'escrow(pay,uint64,address,uint64,byte[32][])void': [payment: AppMethodCallTransactionArgument, id: bigint | number, receiver: string, amount: bigint | number, proof: Uint8Array[]]\n 'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void': [mbrPayment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, id: bigint | number, receiver: string, asset: bigint | number, amount: bigint | number, proof: Uint8Array[]]\n 'disburse(uint64,uint64,address,uint64,uint64)void': [id: bigint | number, receiverWallet: bigint | number, receiver: string, asset: bigint | number, amount: bigint | number]\n 'cancel(uint64,byte[32][])void': [id: bigint | number, proof: Uint8Array[]]\n 'withdraw(uint64,address,uint64,uint64,byte[32][])void': [id: bigint | number, receiver: string, asset: bigint | number, amount: bigint | number, proof: Uint8Array[]]\n 'cleanupParticipant(uint64,address)void': [id: bigint | number, participant: string]\n 'cleanupOffer(uint64)void': [id: bigint | number]\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'mbr()(uint64,uint64,uint64,(uint64,uint64))': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type HyperSwapReturns = {\n 'create(string,uint64)void': void\n 'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void': void\n 'accept(pay,uint64,byte[32][])void': void\n 'escrow(pay,uint64,address,uint64,byte[32][])void': void\n 'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void': void\n 'disburse(uint64,uint64,address,uint64,uint64)void': void\n 'cancel(uint64,byte[32][])void': void\n 'withdraw(uint64,address,uint64,uint64,byte[32][])void': void\n 'cleanupParticipant(uint64,address)void': void\n 'cleanupOffer(uint64)void': void\n 'optIn(pay,uint64)void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'mbr()(uint64,uint64,uint64,(uint64,uint64))': HyperSwapMbrData\n}\n\n/**\n * Defines the types of available calls and state of the HyperSwap smart contract.\n */\nexport type HyperSwapTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,uint64)void' | 'create', {\n argsObj: HyperSwapArgs['obj']['create(string,uint64)void']\n argsTuple: HyperSwapArgs['tuple']['create(string,uint64)void']\n returns: HyperSwapReturns['create(string,uint64)void']\n }>\n & Record<'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void' | 'offer', {\n argsObj: HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']\n argsTuple: HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']\n returns: HyperSwapReturns['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']\n }>\n & Record<'accept(pay,uint64,byte[32][])void' | 'accept', {\n argsObj: HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']\n returns: HyperSwapReturns['accept(pay,uint64,byte[32][])void']\n }>\n & Record<'escrow(pay,uint64,address,uint64,byte[32][])void' | 'escrow', {\n argsObj: HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']\n returns: HyperSwapReturns['escrow(pay,uint64,address,uint64,byte[32][])void']\n }>\n & Record<'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void' | 'escrowAsa', {\n argsObj: HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']\n returns: HyperSwapReturns['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']\n }>\n & Record<'disburse(uint64,uint64,address,uint64,uint64)void' | 'disburse', {\n argsObj: HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void']\n argsTuple: HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']\n returns: HyperSwapReturns['disburse(uint64,uint64,address,uint64,uint64)void']\n }>\n & Record<'cancel(uint64,byte[32][])void' | 'cancel', {\n argsObj: HyperSwapArgs['obj']['cancel(uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']\n returns: HyperSwapReturns['cancel(uint64,byte[32][])void']\n }>\n & Record<'withdraw(uint64,address,uint64,uint64,byte[32][])void' | 'withdraw', {\n argsObj: HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']\n returns: HyperSwapReturns['withdraw(uint64,address,uint64,uint64,byte[32][])void']\n }>\n & Record<'cleanupParticipant(uint64,address)void' | 'cleanupParticipant', {\n argsObj: HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void']\n argsTuple: HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']\n returns: HyperSwapReturns['cleanupParticipant(uint64,address)void']\n }>\n & Record<'cleanupOffer(uint64)void' | 'cleanupOffer', {\n argsObj: HyperSwapArgs['obj']['cleanupOffer(uint64)void']\n argsTuple: HyperSwapArgs['tuple']['cleanupOffer(uint64)void']\n returns: HyperSwapReturns['cleanupOffer(uint64)void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: HyperSwapArgs['obj']['optIn(pay,uint64)void']\n argsTuple: HyperSwapArgs['tuple']['optIn(pay,uint64)void']\n returns: HyperSwapReturns['optIn(pay,uint64)void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: HyperSwapArgs['obj']['update(string)void']\n argsTuple: HyperSwapArgs['tuple']['update(string)void']\n returns: HyperSwapReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: HyperSwapArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: HyperSwapReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: HyperSwapArgs['obj']['opUp()void']\n argsTuple: HyperSwapArgs['tuple']['opUp()void']\n returns: HyperSwapReturns['opUp()void']\n }>\n & Record<'mbr()(uint64,uint64,uint64,(uint64,uint64))' | 'mbr', {\n argsObj: HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))']\n argsTuple: HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']\n returns: HyperSwapReturns['mbr()(uint64,uint64,uint64,(uint64,uint64))']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * global counter for offers\n */\n offerCursor: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {}\n maps: {\n /**\n * map of hyper swap offers\n */\n offers: Map<bigint | number, OfferValue>\n /**\n * map of the participants in each swap\n */\n participants: Map<ParticipantKey, RefundValue>\n /**\n * map of merkle tree hashes during escrow & disbursal phases\n */\n hashes: Map<HashKey, RefundValue>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type HyperSwapSignatures = keyof HyperSwapTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type HyperSwapNonVoidMethodSignatures = keyof HyperSwapTypes['methods'] extends infer T ? T extends keyof HyperSwapTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the HyperSwap smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends HyperSwapSignatures> = HyperSwapTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the HyperSwap smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends HyperSwapSignatures> = HyperSwapTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = HyperSwapTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = HyperSwapTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type HyperSwapCreateCallParams =\n | Expand<CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & {method: 'create(string,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type HyperSwapUpdateCallParams =\n | Expand<CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type HyperSwapDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: HyperSwapCreateCallParams\n /**\n * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n updateParams?: HyperSwapUpdateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the HyperSwap smart contract\n */\nexport abstract class HyperSwapParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends HyperSwapCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,uint64)void':\n return HyperSwapParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the HyperSwap smart contract using the create(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.akitaDao],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends HyperSwapUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return HyperSwapParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the HyperSwap smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the offer(pay,byte[32],uint64,byte[32],uint64,uint64)void ABI method\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static offer(params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.root, params.args.leaves, params.args.participantsRoot, params.args.participantsLeaves, params.args.expiration],\n }\n }\n /**\n * Constructs a no op call for the accept(pay,uint64,byte[32][])void ABI method\n *\n * Accepts an offer\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static accept(params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'accept(pay,uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.id, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the escrow(pay,uint64,address,uint64,byte[32][])void ABI method\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static escrow(params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'escrow(pay,uint64,address,uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.id, params.args.receiver, params.args.amount, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void ABI method\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static escrowAsa(params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.assetXfer, params.args.id, params.args.receiver, params.args.asset, params.args.amount, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the disburse(uint64,uint64,address,uint64,uint64)void ABI method\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static disburse(params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'disburse(uint64,uint64,address,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.receiverWallet, params.args.receiver, params.args.asset, params.args.amount],\n }\n }\n /**\n * Constructs a no op call for the cancel(uint64,byte[32][])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static cancel(params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'cancel(uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the withdraw(uint64,address,uint64,uint64,byte[32][])void ABI method\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static withdraw(params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'withdraw(uint64,address,uint64,uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.receiver, params.args.asset, params.args.amount, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the cleanupParticipant(uint64,address)void ABI method\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static cleanupParticipant(params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'cleanupParticipant(uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.participant],\n }\n }\n /**\n * Constructs a no op call for the cleanupOffer(uint64)void ABI method\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static cleanupOffer(params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'cleanupOffer(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the mbr()(uint64,uint64,uint64,(uint64,uint64)) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mbr(params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mbr()(uint64,uint64,uint64,(uint64,uint64))' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the HyperSwap smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class HyperSwapFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `HyperSwapFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new HyperSwapClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new HyperSwapClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the HyperSwap smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: HyperSwapDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? HyperSwapParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (HyperSwapCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? HyperSwapParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (HyperSwapUpdateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new HyperSwapClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the HyperSwap smart contract using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(HyperSwapParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(HyperSwapParamsFactory.update.update(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the HyperSwap smart contract using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(HyperSwapParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the HyperSwap smart contract using an ABI method call using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(HyperSwapParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | HyperSwapReturns['create(string,uint64)void']) }, appClient: new HyperSwapClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the HyperSwap smart contract\n */\nexport class HyperSwapClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `HyperSwapClient`\n *\n * @param appClient An `AppClient` instance which has been created with the HyperSwap app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `HyperSwapClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Checks for decode errors on the given return value and maps the return value to the return type for the given method\n * @returns The typed return value or undefined if there was no value\n */\n decodeReturnValue<TSignature extends HyperSwapNonVoidMethodSignatures>(method: TSignature, returnValue: ABIReturn | undefined) {\n return returnValue !== undefined ? getArc56ReturnValue<MethodReturn<TSignature>>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined\n }\n\n /**\n * Returns a new `HyperSwapClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<HyperSwapClient> {\n return new HyperSwapClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `HyperSwapClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<HyperSwapClient> {\n return new HyperSwapClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.params.update(HyperSwapParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the HyperSwap smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `offer(pay,byte[32],uint64,byte[32],uint64,uint64)void` ABI method.\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n offer: (params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.offer(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `accept(pay,uint64,byte[32][])void` ABI method.\n *\n * Accepts an offer\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n accept: (params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.accept(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrow(pay,uint64,address,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n escrow: (params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.escrow(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n escrowAsa: (params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.escrowAsa(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `disburse(uint64,uint64,address,uint64,uint64)void` ABI method.\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n disburse: (params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.disburse(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cancel(uint64,byte[32][])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n cancel: (params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.cancel(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `withdraw(uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n withdraw: (params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.withdraw(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupParticipant(uint64,address)void` ABI method.\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n cleanupParticipant: (params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.cleanupParticipant(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupOffer(uint64)void` ABI method.\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n cleanupOffer: (params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.cleanupOffer(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `mbr()(uint64,uint64,uint64,(uint64,uint64))` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n mbr: (params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.mbr(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.createTransaction.update(HyperSwapParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the HyperSwap smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `offer(pay,byte[32],uint64,byte[32],uint64,uint64)void` ABI method.\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n offer: (params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.offer(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `accept(pay,uint64,byte[32][])void` ABI method.\n *\n * Accepts an offer\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n accept: (params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.accept(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrow(pay,uint64,address,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n escrow: (params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.escrow(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n escrowAsa: (params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.escrowAsa(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `disburse(uint64,uint64,address,uint64,uint64)void` ABI method.\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n disburse: (params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.disburse(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cancel(uint64,byte[32][])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n cancel: (params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.cancel(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `withdraw(uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n withdraw: (params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.withdraw(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupParticipant(uint64,address)void` ABI method.\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n cleanupParticipant: (params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.cleanupParticipant(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupOffer(uint64)void` ABI method.\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n cleanupOffer: (params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.cleanupOffer(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `mbr()(uint64,uint64,uint64,(uint64,uint64))` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n mbr: (params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.mbr(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams) => {\n const result = await this.appClient.send.update(HyperSwapParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the HyperSwap smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `offer(pay,byte[32],uint64,byte[32],uint64,uint64)void` ABI method.\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n offer: async (params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.offer(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `accept(pay,uint64,byte[32][])void` ABI method.\n *\n * Accepts an offer\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n accept: async (params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.accept(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['accept(pay,uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrow(pay,uint64,address,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n escrow: async (params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.escrow(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['escrow(pay,uint64,address,uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n escrowAsa: async (params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.escrowAsa(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `disburse(uint64,uint64,address,uint64,uint64)void` ABI method.\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n disburse: async (params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.disburse(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['disburse(uint64,uint64,address,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cancel(uint64,byte[32][])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n cancel: async (params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.cancel(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['cancel(uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `withdraw(uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n withdraw: async (params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.withdraw(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['withdraw(uint64,address,uint64,uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupParticipant(uint64,address)void` ABI method.\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n cleanupParticipant: async (params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.cleanupParticipant(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['cleanupParticipant(uint64,address)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupOffer(uint64)void` ABI method.\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n cleanupOffer: async (params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.cleanupOffer(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['cleanupOffer(uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `mbr()(uint64,uint64,uint64,(uint64,uint64))` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n mbr: async (params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.mbr(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['mbr()(uint64,uint64,uint64,(uint64,uint64))'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new HyperSwapClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the HyperSwap smart contract using the `mbr()(uint64,uint64,uint64,(uint64,uint64))` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async mbr(params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> = {args: []}) {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.mbr(params))\n return result.return as unknown as HyperSwapReturns['mbr()(uint64,uint64,uint64,(uint64,uint64))']\n }\n\n /**\n * Methods to access state for the current HyperSwap app\n */\n state = {\n /**\n * Methods to access global state for the current HyperSwap app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n offerCursor: result.offerCursor,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the offerCursor key in global state\n */\n offerCursor: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"offerCursor\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current HyperSwap app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n }\n },\n /**\n * Get values from the offers map in box state\n */\n offers: {\n /**\n * Get all current values of the offers map in box state\n */\n getMap: async (): Promise<Map<bigint, OfferValue>> => { return (await this.appClient.state.box.getMap(\"offers\")) as Map<bigint, OfferValue> },\n /**\n * Get a current value of the offers map by key from box state\n */\n value: async (key: bigint | number): Promise<OfferValue | undefined> => { return await this.appClient.state.box.getMapValue(\"offers\", key) as OfferValue | undefined },\n },\n /**\n * Get values from the participants map in box state\n */\n participants: {\n /**\n * Get all current values of the participants map in box state\n */\n getMap: async (): Promise<Map<ParticipantKey, RefundValue>> => { return (await this.appClient.state.box.getMap(\"participants\")) as Map<ParticipantKey, RefundValue> },\n /**\n * Get a current value of the participants map by key from box state\n */\n value: async (key: ParticipantKey): Promise<RefundValue | undefined> => { return await this.appClient.state.box.getMapValue(\"participants\", key) as RefundValue | undefined },\n },\n /**\n * Get values from the hashes map in box state\n */\n hashes: {\n /**\n * Get all current values of the hashes map in box state\n */\n getMap: async (): Promise<Map<HashKey, RefundValue>> => { return (await this.appClient.state.box.getMap(\"hashes\")) as Map<HashKey, RefundValue> },\n /**\n * Get a current value of the hashes map by key from box state\n */\n value: async (key: HashKey): Promise<RefundValue | undefined> => { return await this.appClient.state.box.getMapValue(\"hashes\", key) as RefundValue | undefined },\n },\n },\n }\n\n public newGroup(): HyperSwapComposer {\n const client = this\n const composer = this.algorand.newGroup()\n let promiseChain:Promise<unknown> = Promise.resolve()\n const resultMappers: Array<undefined | ((x: ABIReturn | undefined) => any)> = []\n return {\n /**\n * Add a offer(pay,byte[32],uint64,byte[32],uint64,uint64)void method call against the HyperSwap contract\n */\n offer(params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.offer(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a accept(pay,uint64,byte[32][])void method call against the HyperSwap contract\n */\n accept(params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.accept(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a escrow(pay,uint64,address,uint64,byte[32][])void method call against the HyperSwap contract\n */\n escrow(params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.escrow(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void method call against the HyperSwap contract\n */\n escrowAsa(params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.escrowAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a disburse(uint64,uint64,address,uint64,uint64)void method call against the HyperSwap contract\n */\n disburse(params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.disburse(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a cancel(uint64,byte[32][])void method call against the HyperSwap contract\n */\n cancel(params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.cancel(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a withdraw(uint64,address,uint64,uint64,byte[32][])void method call against the HyperSwap contract\n */\n withdraw(params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdraw(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a cleanupParticipant(uint64,address)void method call against the HyperSwap contract\n */\n cleanupParticipant(params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.cleanupParticipant(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a cleanupOffer(uint64)void method call against the HyperSwap contract\n */\n cleanupOffer(params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.cleanupOffer(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the HyperSwap contract\n */\n optIn(params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the HyperSwap contract\n */\n updateAkitaDao(params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a opUp()void method call against the HyperSwap contract\n */\n opUp(params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a mbr()(uint64,uint64,uint64,(uint64,uint64)) method call against the HyperSwap contract\n */\n mbr(params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mbr(params)))\n resultMappers.push((v) => client.decodeReturnValue('mbr()(uint64,uint64,uint64,(uint64,uint64))', v))\n return this\n },\n get update() {\n return {\n update: (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the HyperSwap contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n }\n } as unknown as HyperSwapComposer\n }\n}\nexport type HyperSwapComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the offer(pay,byte[32],uint64,byte[32],uint64,uint64)void ABI method.\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n offer(params?: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the accept(pay,uint64,byte[32][])void ABI method.\n *\n * Accepts an offer\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n accept(params?: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['accept(pay,uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the escrow(pay,uint64,address,uint64,byte[32][])void ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n escrow(params?: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['escrow(pay,uint64,address,uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n escrowAsa(params?: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the disburse(uint64,uint64,address,uint64,uint64)void ABI method.\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n disburse(params?: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['disburse(uint64,uint64,address,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the cancel(uint64,byte[32][])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n cancel(params?: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['cancel(uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the withdraw(uint64,address,uint64,uint64,byte[32][])void ABI method.\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n withdraw(params?: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the cleanupParticipant(uint64,address)void ABI method.\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n cleanupParticipant(params?: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['cleanupParticipant(uint64,address)void'] | undefined]>\n\n /**\n * Calls the cleanupOffer(uint64)void ABI method.\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n cleanupOffer(params?: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['cleanupOffer(uint64)void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['opUp()void'] | undefined]>\n\n /**\n * Calls the mbr()(uint64,uint64,uint64,(uint64,uint64)) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n mbr(params?: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the update(string)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the HyperSwap smart contract.\n *\n * @param args The arguments for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): HyperSwapComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): HyperSwapComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<HyperSwapComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<HyperSwapComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<HyperSwapComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<HyperSwapComposerResults<TReturns>>\n}\nexport type HyperSwapComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { MaybeSigner } from \"../types\";\nimport {\n HyperSwapArgs,\n} from '../generated/HyperSwapClient';\n\n// HyperSwap Types\ntype ContractArgs = HyperSwapArgs[\"obj\"];\n\nexport type OfferParams = MaybeSigner & Omit<\n ContractArgs['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'],\n 'payment'\n>;\n\nexport type AcceptParams = MaybeSigner & Omit<\n ContractArgs['accept(pay,uint64,byte[32][])void'],\n 'mbrPayment'\n>;\n\ntype BaseEscrowParams = MaybeSigner & {\n /** The offer ID */\n id: bigint | number;\n /** The receiver address */\n receiver: string;\n /** The amount to escrow */\n amount: bigint | number;\n /** Merkle proof */\n proof: Uint8Array[];\n};\n\nexport type EscrowParams = BaseEscrowParams & (\n | {\n /** Whether escrowing ASA (true) or ALGO (false/undefined) */\n isAsa?: false;\n }\n | {\n /** Whether escrowing ASA (true) or ALGO (false/undefined) */\n isAsa: true;\n /** The asset ID to escrow (required when isAsa is true) */\n asset: bigint | number;\n }\n);\n\nexport type DisburseParams = MaybeSigner & ContractArgs['disburse(uint64,uint64,address,uint64,uint64)void'];\n\nexport type CancelParams = MaybeSigner & ContractArgs['cancel(uint64,byte[32][])void'];\n\nexport type WithdrawParams = MaybeSigner & ContractArgs['withdraw(uint64,address,uint64,uint64,byte[32][])void'];\n\nexport type OptInParams = MaybeSigner & Omit<\n ContractArgs['optIn(pay,uint64)void'],\n 'payment'\n>;\n\nexport type GetOfferParams = {\n id: bigint | number;\n};\n\n// Offer states\nexport enum OfferState {\n Offered = 10,\n Escrowing = 20,\n Disbursing = 30,\n Completed = 40,\n Cancelled = 50,\n CancelCompleted = 60,\n}\n\nexport type OfferValue = {\n state: number;\n root: Uint8Array;\n leaves: bigint;\n escrowed: bigint;\n participantsRoot: Uint8Array;\n participantsLeaves: bigint;\n acceptances: bigint;\n expiration: bigint;\n};\n\nexport type HyperSwapMbrData = {\n offers: bigint;\n participants: bigint;\n hashes: bigint;\n mm: {\n root: bigint;\n data: bigint;\n };\n};\n\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-HHXP4XDJ.js","../src/hyper-swap/index.ts","../src/generated/HyperSwapClient.ts","../src/hyper-swap/types.ts"],"names":["OfferState"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-HHXP4XDJ.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n HyperSwapClient,\n HyperSwapFactory,\n HyperSwapArgs,\n} from '../generated/HyperSwapClient';\nimport { MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n OfferParams,\n AcceptParams,\n EscrowParams,\n DisburseParams,\n CancelParams,\n WithdrawParams,\n OptInParams,\n GetOfferParams,\n OfferValue,\n HyperSwapMbrData,\n} from \"./types\";\n\nexport * from \"./types\";\n\nexport type HyperSwapContractArgs = HyperSwapArgs[\"obj\"];\n\n/**\n * SDK for interacting with the HyperSwap contract.\n * HyperSwap enables atomic multi-party trades using merkle tree proofs.\n */\nexport class HyperSwapSDK extends BaseSDK<HyperSwapClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: HyperSwapFactory, ...params }, ENV_VAR_NAMES.HYPER_SWAP_APP_ID);\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the MBR data for HyperSwap operations.\n */\n async mbr(): Promise<HyperSwapMbrData> {\n const mbr = await this.client.mbr();\n\n return {\n offers: mbr.offers,\n participants: mbr.participants,\n hashes: mbr.hashes,\n mm: {\n root: mbr.mm.root,\n data: mbr.mm.data,\n },\n };\n }\n\n /**\n * Gets an offer by its ID.\n */\n async getOffer({ id }: GetOfferParams): Promise<OfferValue> {\n const offer = await this.client.state.box.offers.value(id);\n\n if (offer === undefined) {\n throw new Error(`Offer ${id} not found`);\n }\n\n return {\n state: Number(offer.state),\n root: offer.root,\n leaves: offer.leaves,\n escrowed: offer.escrowed,\n participantsRoot: offer.participantsRoot,\n participantsLeaves: offer.participantsLeaves,\n acceptances: offer.acceptances,\n expiration: offer.expiration,\n };\n }\n\n // ========== Write Methods ==========\n\n /**\n * Opts the HyperSwap contract into an asset.\n */\n async optIn({ sender, signer, asset }: OptInParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(100_000), // Asset opt-in MBR\n receiver: this.client.appAddress,\n });\n\n await this.client.send.optIn({\n ...sendParams,\n args: {\n payment,\n asset,\n },\n });\n }\n\n /**\n * Creates a new offer for an atomic multi-party trade.\n */\n async offer({\n sender,\n signer,\n root,\n leaves,\n participantsRoot,\n participantsLeaves,\n expiration,\n }: OfferParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const mbrData = await this.mbr();\n const metaMerklesCost = mbrData.mm.root + mbrData.mm.data;\n const totalMbr = mbrData.offers + mbrData.participants + (metaMerklesCost * 2n);\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(totalMbr),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.offer({\n ...sendParams,\n args: {\n payment,\n root,\n leaves,\n participantsRoot,\n participantsLeaves,\n expiration,\n },\n });\n }\n\n /**\n * Accepts an offer as a participant.\n */\n async accept({ sender, signer, id, proof }: AcceptParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const mbrData = await this.mbr();\n\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.participants),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.accept({\n ...sendParams,\n args: {\n mbrPayment,\n id,\n proof,\n },\n });\n }\n\n /**\n * Escrows assets for a trade leaf.\n * Use `isAsa: true` and `asset` for ASA escrows, otherwise ALGO is used.\n */\n async escrow({\n sender,\n signer,\n id,\n receiver,\n amount,\n proof,\n isAsa = false,\n ...rest\n }: EscrowParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const mbrData = await this.mbr();\n\n if (isAsa) {\n const { asset } = rest as Extract<EscrowParams, { isAsa: true }>;\n\n // MBR includes potential arc59 costs if receiver not opted in\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.hashes + 200_000n), // Extra for potential arc59\n receiver: this.client.appAddress,\n });\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: BigInt(amount),\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.escrowAsa({\n ...sendParams,\n args: {\n mbrPayment,\n assetXfer,\n id,\n receiver,\n asset,\n amount,\n proof,\n },\n });\n } else {\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(BigInt(amount) + mbrData.hashes),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.escrow({\n ...sendParams,\n args: {\n payment,\n id,\n receiver,\n amount,\n proof,\n },\n });\n }\n }\n\n /**\n * Disburses assets for a trade leaf.\n * @param receiverWallet - The receiver's ARC58 wallet app ID (0 if not an ARC58 wallet)\n */\n async disburse({ sender, signer, id, receiverWallet, receiver, asset, amount }: DisburseParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.disburse({\n ...sendParams,\n args: {\n id,\n receiverWallet,\n receiver,\n asset,\n amount,\n },\n });\n }\n\n /**\n * Cancels an offer.\n */\n async cancel({ sender, signer, id, proof }: CancelParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.cancel({\n ...sendParams,\n args: {\n id,\n proof,\n },\n });\n }\n\n /**\n * Withdraws escrowed assets from a cancelled offer.\n */\n async withdraw({ sender, signer, id, receiver, asset, amount, proof }: WithdrawParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.withdraw({\n ...sendParams,\n args: {\n id,\n receiver,\n asset,\n amount,\n proof,\n },\n });\n }\n}\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"HyperSwap\",\"structs\":{\"Object57CB3C34\":[{\"name\":\"root\",\"type\":\"uint64\"},{\"name\":\"data\",\"type\":\"uint64\"}],\"HashKey\":[{\"name\":\"id\",\"type\":\"uint64\"},{\"name\":\"hash\",\"type\":\"byte[32]\"}],\"HyperSwapMBRData\":[{\"name\":\"offers\",\"type\":\"uint64\"},{\"name\":\"participants\",\"type\":\"uint64\"},{\"name\":\"hashes\",\"type\":\"uint64\"},{\"name\":\"mm\",\"type\":\"Object57CB3C34\"}],\"OfferValue\":[{\"name\":\"state\",\"type\":\"uint8\"},{\"name\":\"root\",\"type\":\"byte[32]\"},{\"name\":\"leaves\",\"type\":\"uint64\"},{\"name\":\"escrowed\",\"type\":\"uint64\"},{\"name\":\"participantsRoot\",\"type\":\"byte[32]\"},{\"name\":\"participantsLeaves\",\"type\":\"uint64\"},{\"name\":\"acceptances\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"}],\"ParticipantKey\":[{\"name\":\"id\",\"type\":\"uint64\"},{\"name\":\"address\",\"type\":\"address\"}],\"RefundValue\":[{\"name\":\"amount\",\"type\":\"uint64\"},{\"name\":\"payor\",\"type\":\"address\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"offer\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"byte[32]\",\"name\":\"root\",\"desc\":\"the merkle tree root of trades consisting of from address, recipient address, asset id & amount\"},{\"type\":\"uint64\",\"name\":\"leaves\",\"desc\":\"the number of leaves in the tree\"},{\"type\":\"byte[32]\",\"name\":\"participantsRoot\",\"desc\":\"the merkle tree root of participating addresses\"},{\"type\":\"uint64\",\"name\":\"participantsLeaves\"},{\"type\":\"uint64\",\"name\":\"expiration\",\"desc\":\"the unix timestamp that the offer auto-expires at if it has not been accepted by all participants\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Creates a merkle tree based atomic payment/xfer group\",\"events\":[],\"recommendations\":{}},{\"name\":\"accept\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\",\"desc\":\"the payment to cover the MBR\"},{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer being accepted\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the bytes32 array proof of inclusion in the participants list\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Accepts an offer\",\"events\":[],\"recommendations\":{}},{\"name\":\"escrow\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"},{\"type\":\"address\",\"name\":\"receiver\",\"desc\":\"the recipient in the offer leaf\"},{\"type\":\"uint64\",\"name\":\"amount\",\"desc\":\"the amount in the offer leaf\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof to verify the details are part of the tree\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Escrows the assets in the trade for a given leaf in the tree\",\"events\":[],\"recommendations\":{}},{\"name\":\"escrowAsa\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\",\"desc\":\"the payment to cover the MBR\"},{\"type\":\"axfer\",\"name\":\"assetXfer\",\"desc\":\"the asset transfer to escrow the asa\"},{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"},{\"type\":\"address\",\"name\":\"receiver\",\"desc\":\"the recipient in the offer leaf\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"the asset in the offer leaf\"},{\"type\":\"uint64\",\"name\":\"amount\",\"desc\":\"the amount in the offer leaf\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof to verify the details are part of the tree\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Escrows the assets in the trade for a given leaf in the tree\",\"events\":[],\"recommendations\":{}},{\"name\":\"disburse\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"},{\"type\":\"uint64\",\"name\":\"receiverWallet\",\"desc\":\"the receiver's ARC58 wallet app id (0 if not an ARC58 wallet)\"},{\"type\":\"address\",\"name\":\"receiver\",\"desc\":\"the recipient address in the leaf\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"the asset being transferred\"},{\"type\":\"uint64\",\"name\":\"amount\",\"desc\":\"the amount being transferred\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Disburses assets for a leaf in the tree, ensuring ordered processing\",\"events\":[],\"recommendations\":{}},{\"name\":\"cancel\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer being cancelled\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"a proof of inclusion in the participants list\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"withdraw\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the cancelled offer\"},{\"type\":\"address\",\"name\":\"receiver\",\"desc\":\"the receiver of the leaf's swap\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"the asset of the leaf's swap\"},{\"type\":\"uint64\",\"name\":\"amount\",\"desc\":\"the amount of the leaf's swap\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof that the leaf is in the tree\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Withdraws your assets from a cancelled swap if they're escrowed\",\"events\":[],\"recommendations\":{}},{\"name\":\"cleanupParticipant\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"},{\"type\":\"address\",\"name\":\"participant\",\"desc\":\"the participant address to clean up\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Cleans up participant box and refunds MBR\\nCan only be called when offer is completed, cancelled+completed, or expired\",\"events\":[],\"recommendations\":{}},{\"name\":\"cleanupOffer\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\",\"desc\":\"the id of the offer\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Cleans up the offer box after all participants have been cleaned up\\nCan only be called when offer is completed, cancelled+completed, or expired\",\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}},{\"name\":\"update\",\"args\":[{\"type\":\"string\",\"name\":\"newVersion\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"UpdateApplication\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"mbr\",\"args\":[],\"returns\":{\"type\":\"(uint64,uint64,uint64,(uint64,uint64))\",\"struct\":\"HyperSwapMBRData\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":2,\"bytes\":1},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"offerCursor\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"b2ZmZXJfY3Vyc29y\",\"desc\":\"global counter for offers\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"offers\":{\"keyType\":\"uint64\",\"valueType\":\"OfferValue\",\"desc\":\"map of hyper swap offers\",\"prefix\":\"bw==\"},\"participants\":{\"keyType\":\"ParticipantKey\",\"valueType\":\"RefundValue\",\"desc\":\"map of the participants in each swap\",\"prefix\":\"cA==\"},\"hashes\":{\"keyType\":\"HashKey\",\"valueType\":\"RefundValue\",\"desc\":\"map of merkle tree hashes during escrow & disbursal phases\",\"prefix\":\"aA==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[1850],\"errorMessage\":\"Assets and amounts mismatch\"},{\"pc\":[772,1082,1404,1810,2323,2562],\"errorMessage\":\"Bytes has valid prefix\"},{\"pc\":[3042],\"errorMessage\":\"Invalid app upgrade\"},{\"pc\":[426,833,1109,1451,2975],\"errorMessage\":\"Invalid payment\"},{\"pc\":[1475],\"errorMessage\":\"Invalid transfer\"},{\"pc\":[119],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[297],\"errorMessage\":\"OnCompletion must be UpdateApplication && can only call when not creating\"},{\"pc\":[3031,3072],\"errorMessage\":\"Only the Akita DAO can call this function\"},{\"pc\":[2924],\"errorMessage\":\"all participants must be cleaned up first\"},{\"pc\":[441,498,1731,3027,3070],\"errorMessage\":\"application exists\"},{\"pc\":[1090,1412,2570],\"errorMessage\":\"cannot verify leaf\"},{\"pc\":[430,547,702,1016,1338,1745,2253,2496,3019,3063],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[644,909,1225,2160,2419],\"errorMessage\":\"invalid number of bytes for (len+uint8[32][])\"},{\"pc\":[314,3010],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[777,1087,1409,1815,2328,2567],\"errorMessage\":\"invalid number of bytes for bool8\"},{\"pc\":[325,367,385,394,627,875,892,1172,1189,1203,1528,1540,1561,1573,2141,2366,2383,2397,2685,2845,2958,3056],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[359,377,884,1181,1553,2375,2696],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[2248],\"errorMessage\":\"must have accepted to cancel\"},{\"pc\":[780,2331],\"errorMessage\":\"not a participant in this swap\"},{\"pc\":[406,697,961,1280],\"errorMessage\":\"offer has expired\"},{\"pc\":[1727,1741,1818],\"errorMessage\":\"receiver is not opted into asset\"},{\"pc\":[1735],\"errorMessage\":\"receiverWallet address mismatch\"},{\"pc\":[401],\"errorMessage\":\"root and participantsRoot cannot be the same\"},{\"pc\":[1164],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[350,619,867,1153,2950],\"errorMessage\":\"transaction type is pay\"},{\"pc\":[957,1276,2227,2772,2921],\"errorMessage\":\"wrong state\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMzIgMzQ5MDAgMjIyMjAwIDY4MjAwCiAgICBieXRlY2Jsb2NrICJha2l0YV9kYW8iICJvIiAiYWFsIiAicCIgMHgxNTFmN2M3NSAweDE0IDB4MGEgMHgyYmYzY2M1YSAiaCIgMHgxZSAweDAwMDAgMHgzYyAib2ZmZXJfY3Vyc29yIiAweDI4ICJwYWwiIDB4ODAgInZlcnNpb24iIDB4YTI0YzA2N2MgMHgwMDAxICJ3YWxsZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBleHBvcnQgY2xhc3MgSHlwZXJTd2FwIGV4dGVuZHMgY2xhc3NlcyhCYXNlSHlwZXJTd2FwLCBVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LCBDb250cmFjdFdpdGhPcHRJbikgewogICAgcHVzaGJ5dGVzIDB4ZWE5MTgwZGQgLy8gbWV0aG9kICJ1cGRhdGUoc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGV4cG9ydCBjbGFzcyBIeXBlclN3YXAgZXh0ZW5kcyBjbGFzc2VzKEJhc2VIeXBlclN3YXAsIFVwZ3JhZGVhYmxlQWtpdGFCYXNlQ29udHJhY3QsIENvbnRyYWN0V2l0aE9wdEluKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjEKICAgIHB1c2hieXRlc3MgMHgwZGIzYTQ0YiAweGJkZTFhMTFlIDB4ZDg1ZmViZGQgMHg0NjZmODcxYSAweDU2NmE2MmIyIDB4MGM3YWI0MmUgMHgwNjMxODY4YiAweDY4M2JiNjc4IDB4ZDNlZTA0ZjAgMHgzOTRlYWViMiAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgMHg4NDA3MzNkZCAvLyBtZXRob2QgIm9mZmVyKHBheSxieXRlWzMyXSx1aW50NjQsYnl0ZVszMl0sdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhY2NlcHQocGF5LHVpbnQ2NCxieXRlWzMyXVtdKXZvaWQiLCBtZXRob2QgImVzY3JvdyhwYXksdWludDY0LGFkZHJlc3MsdWludDY0LGJ5dGVbMzJdW10pdm9pZCIsIG1ldGhvZCAiZXNjcm93QXNhKHBheSxheGZlcix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LGJ5dGVbMzJdW10pdm9pZCIsIG1ldGhvZCAiZGlzYnVyc2UodWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2FuY2VsKHVpbnQ2NCxieXRlWzMyXVtdKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYnl0ZVszMl1bXSl2b2lkIiwgbWV0aG9kICJjbGVhbnVwUGFydGljaXBhbnQodWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiY2xlYW51cE9mZmVyKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcHRJbihwYXksdWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIiwgbWV0aG9kICJtYnIoKSh1aW50NjQsdWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggb2ZmZXIgYWNjZXB0IGVzY3JvdyBlc2Nyb3dBc2EgZGlzYnVyc2UgY2FuY2VsIHdpdGhkcmF3IGNsZWFudXBQYXJ0aWNpcGFudCBjbGVhbnVwT2ZmZXIgb3B0SW4gdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDE4IG1haW5fbWJyX3JvdXRlQDE5CiAgICBlcnIKCm1haW5fbWJyX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvYmFzZS50czo2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwYzZkNDAwMDAwMDAwMDAwMDg4NTQwMDAwMDAwMDAwMDA4ODU0MDAwMDAwMDAwMDAwOWZjNDAwMDAwMDAwMDAwMDZhYTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcFVwX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDMKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBleHBvcnQgY2xhc3MgSHlwZXJTd2FwIGV4dGVuZHMgY2xhc3NlcyhCYXNlSHlwZXJTd2FwLCBVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LCBDb250cmFjdFdpdGhPcHRJbikgewogICAgcHVzaGJ5dGVzIDB4Y2Q5YWQ2N2UgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nLHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydVcGRhdGVBcHBsaWNhdGlvbiddIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBVcGRhdGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIHVwZGF0ZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDE2IC8vICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MAogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gdmVyc2lvbgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUxCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI3CiAgICAvLyBvZmZlckN1cnNvciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IEh5cGVyU3dhcEdsb2JhbFN0YXRlS2V5T2ZmZXJDdXJzb3IgfSkKICAgIGJ5dGVjIDEyIC8vICJvZmZlcl9jdXJzb3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyB0aGlzLm9mZmVyQ3Vyc29yLnZhbHVlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC5vZmZlcltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9mZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo2OC03NQogICAgLy8gb2ZmZXIoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgcm9vdDogYnl0ZXM8MzI+LAogICAgLy8gICBsZWF2ZXM6IHVpbnQ2NCwKICAgIC8vICAgcGFydGljaXBhbnRzUm9vdDogYnl0ZXM8MzI+LAogICAgLy8gICBwYXJ0aWNpcGFudHNMZWF2ZXM6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0CiAgICAvLyApIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjc2CiAgICAvLyBhc3NlcnQocm9vdCAhPT0gcGFydGljaXBhbnRzUm9vdCwgRVJSX0JBRF9ST09UUykKICAgIGRpZyA2CiAgICBkaWcgNAogICAgIT0KICAgIGFzc2VydCAvLyByb290IGFuZCBwYXJ0aWNpcGFudHNSb290IGNhbm5vdCBiZSB0aGUgc2FtZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gYXNzZXJ0KGV4cGlyYXRpb24gPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfT0ZGRVJfRVhQSVJFRCkKICAgIGR1cAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYXNzZXJ0IC8vIG9mZmVyIGhhcyBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyBjb25zdCBwYXlvciA9IHBheW1lbnQuc2VuZGVyCiAgICBkaWcgNwogICAgZ3R4bnMgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjg1LTkyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGh5cGVyU3dhcE9mZmVyTUJSQW1vdW50CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA4CiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo4OAogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6ODUtOTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogaHlwZXJTd2FwT2ZmZXJNQlJBbW91bnQKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHVuY292ZXIgOQogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyBjb25zdCBoeXBlclN3YXBPZmZlck1CUkFtb3VudDogdWludDY0ID0gY29zdHMub2ZmZXJzICsgY29zdHMucGFydGljaXBhbnRzICsgKG1ldGFNZXJrbGVzQ29zdCAqIDIpCiAgICBpbnRjIDUgLy8gMjIyMjAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjg1LTkyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGh5cGVyU3dhcE9mZmVyTUJSQW1vdW50CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gY29uc3QgbWV0YU1lcmtsZXNBcHBJRCA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gY29uc3QgbWV0YU1lcmtsZXNBcHBJRCA9IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzIgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6OTQKICAgIC8vIGNvbnN0IG1ldGFNZXJrbGVzQXBwSUQgPSBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjk2LTEwNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocm9vdCksCiAgICAvLyAgICAgcm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihtZXRhTWVya2xlc0FwcElEKS5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBjb25zdCBtZXRhTWVya2xlc0Nvc3Q6IHVpbnQ2NCA9IGNvc3RzLm1tLnJvb3QgKyBjb3N0cy5tbS5kYXRhCiAgICBpbnRjIDYgLy8gNjgyMDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjk5LTEwMgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogbWV0YU1lcmtsZXNDb3N0LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjk2LTEwNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocm9vdCksCiAgICAvLyAgICAgcm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gU3RyaW5nKHJvb3QpLAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMDUKICAgIC8vIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjk2LTEwNwogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocm9vdCksCiAgICAvLyAgICAgcm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJhZGRSb290KHBheSxzdHJpbmcsYnl0ZVszMl0sdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTEwLTEyMQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICAvLyAgICAgcGFydGljaXBhbnRzUm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihtZXRhTWVya2xlc0FwcElEKS5hZGRyZXNzLAogICAgZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6ODEKICAgIC8vIGNvbnN0IG1ldGFNZXJrbGVzQ29zdDogdWludDY0ID0gY29zdHMubW0ucm9vdCArIGNvc3RzLm1tLmRhdGEKICAgIGludGMgNiAvLyA2ODIwMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTEzLTExNgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogbWV0YU1lcmtsZXNDb3N0LAogICAgLy8gfSksCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjExMC0xMjEKICAgIC8vIGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS5hZGRSb290Pih7CiAgICAvLyAgIGFwcElkOiBtZXRhTWVya2xlc0FwcElELAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihtZXRhTWVya2xlc0FwcElEKS5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtZXRhTWVya2xlc0Nvc3QsCiAgICAvLyAgICAgfSksCiAgICAvLyAgICAgU3RyaW5nKHBhcnRpY2lwYW50c1Jvb3QpLAogICAgLy8gICAgIHBhcnRpY2lwYW50c1Jvb3QsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMTcKICAgIC8vIFN0cmluZyhwYXJ0aWNpcGFudHNSb290KSwKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTEwLTEyMQogICAgLy8gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLmFkZFJvb3Q+KHsKICAgIC8vICAgYXBwSWQ6IG1ldGFNZXJrbGVzQXBwSUQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IEFwcGxpY2F0aW9uKG1ldGFNZXJrbGVzQXBwSUQpLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ldGFNZXJrbGVzQ29zdCwKICAgIC8vICAgICB9KSwKICAgIC8vICAgICBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICAvLyAgICAgcGFydGljaXBhbnRzUm9vdCwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTcgLy8gbWV0aG9kICJhZGRSb290KHBheSxzdHJpbmcsYnl0ZVszMl0sdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5vZmZlckN1cnNvci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjcKICAgIC8vIG9mZmVyQ3Vyc29yID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogSHlwZXJTd2FwR2xvYmFsU3RhdGVLZXlPZmZlckN1cnNvciB9KQogICAgYnl0ZWMgMTIgLy8gIm9mZmVyX2N1cnNvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5vZmZlckN1cnNvci52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHRoaXMub2ZmZXJDdXJzb3IudmFsdWUgKz0gMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNwogICAgLy8gb2ZmZXJDdXJzb3IgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBIeXBlclN3YXBHbG9iYWxTdGF0ZUtleU9mZmVyQ3Vyc29yIH0pCiAgICBieXRlYyAxMiAvLyAib2ZmZXJfY3Vyc29yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdGhpcy5vZmZlckN1cnNvci52YWx1ZSArPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo4MgogICAgLy8gY29uc3QgaHlwZXJTd2FwT2ZmZXJNQlJBbW91bnQ6IHVpbnQ2NCA9IGNvc3RzLm9mZmVycyArIGNvc3RzLnBhcnRpY2lwYW50cyArIChtZXRhTWVya2xlc0Nvc3QgKiAyKQogICAgaW50YyA1IC8vIDIyMjIwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIHRoaXMucGFydGljaXBhbnRzKHsgaWQsIGFkZHJlc3M6IFR4bi5zZW5kZXIgfSkudmFsdWUgPSB7IHBheW9yLCBhbW91bnQ6IGh5cGVyU3dhcE9mZmVyTUJSQW1vdW50IH0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzQKICAgIC8vIHBhcnRpY2lwYW50cyA9IEJveE1hcDxQYXJ0aWNpcGFudEtleSwgUmVmdW5kVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhQYXJ0aWNpcGFudHMgfSkKICAgIGJ5dGVjXzMgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyB0aGlzLnBhcnRpY2lwYW50cyh7IGlkLCBhZGRyZXNzOiBUeG4uc2VuZGVyIH0pLnZhbHVlID0geyBwYXlvciwgYW1vdW50OiBoeXBlclN3YXBPZmZlck1CUkFtb3VudCB9CiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyBzdGF0ZTogU1RBVEVfT0ZGRVJFRCwKICAgIGJ5dGVjIDYgLy8gMHgwYQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMjktMTM4CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIHN0YXRlOiBTVEFURV9PRkZFUkVELAogICAgLy8gICByb290LAogICAgLy8gICBsZWF2ZXMsCiAgICAvLyAgIGVzY3Jvd2VkOiAwLAogICAgLy8gICBwYXJ0aWNpcGFudHNSb290LAogICAgLy8gICBwYXJ0aWNpcGFudHNMZWF2ZXMsCiAgICAvLyAgIGFjY2VwdGFuY2VzOiAxLAogICAgLy8gICBleHBpcmF0aW9uLAogICAgLy8gfQogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjEzMwogICAgLy8gZXNjcm93ZWQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxMjktMTM4CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIHN0YXRlOiBTVEFURV9PRkZFUkVELAogICAgLy8gICByb290LAogICAgLy8gICBsZWF2ZXMsCiAgICAvLyAgIGVzY3Jvd2VkOiAwLAogICAgLy8gICBwYXJ0aWNpcGFudHNSb290LAogICAgLy8gICBwYXJ0aWNpcGFudHNMZWF2ZXMsCiAgICAvLyAgIGFjY2VwdGFuY2VzOiAxLAogICAgLy8gICBleHBpcmF0aW9uLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTM2CiAgICAvLyBhY2NlcHRhbmNlczogMSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjEyOS0xMzgKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgc3RhdGU6IFNUQVRFX09GRkVSRUQsCiAgICAvLyAgIHJvb3QsCiAgICAvLyAgIGxlYXZlcywKICAgIC8vICAgZXNjcm93ZWQ6IDAsCiAgICAvLyAgIHBhcnRpY2lwYW50c1Jvb3QsCiAgICAvLyAgIHBhcnRpY2lwYW50c0xlYXZlcywKICAgIC8vICAgYWNjZXB0YW5jZXM6IDEsCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyBvZmZlcnMgPSBCb3hNYXA8dWludDY0LCBPZmZlclZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4T2ZmZXJzIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTI5LTEzOAogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlID0gewogICAgLy8gICBzdGF0ZTogU1RBVEVfT0ZGRVJFRCwKICAgIC8vICAgcm9vdCwKICAgIC8vICAgbGVhdmVzLAogICAgLy8gICBlc2Nyb3dlZDogMCwKICAgIC8vICAgcGFydGljaXBhbnRzUm9vdCwKICAgIC8vICAgcGFydGljaXBhbnRzTGVhdmVzLAogICAgLy8gICBhY2NlcHRhbmNlczogMSwKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vIH0KICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NjgtNzUKICAgIC8vIG9mZmVyKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHJvb3Q6IGJ5dGVzPDMyPiwKICAgIC8vICAgbGVhdmVzOiB1aW50NjQsCiAgICAvLyAgIHBhcnRpY2lwYW50c1Jvb3Q6IGJ5dGVzPDMyPiwKICAgIC8vICAgcGFydGljaXBhbnRzTGVhdmVzOiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NAogICAgLy8gKSB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo6SHlwZXJTd2FwLmFjY2VwdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY2VwdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTQ4CiAgICAvLyBhY2NlcHQobWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBpZDogdWludDY0LCBwcm9vZjogUHJvb2YpIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMgogICAgLy8gb2ZmZXJzID0gQm94TWFwPHVpbnQ2NCwgT2ZmZXJWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeE9mZmVycyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGNvbnN0IHsgc3RhdGUsIGV4cGlyYXRpb24sIHBhcnRpY2lwYW50c1Jvb3QsIGFjY2VwdGFuY2VzLCBwYXJ0aWNpcGFudHNMZWF2ZXMgfSA9IHRoaXMub2ZmZXJzKGlkKS52YWx1ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgZXh0cmFjdCAwIDEKICAgIGRpZyAxCiAgICBwdXNoaW50IDk3IC8vIDk3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGV4dHJhY3QgNDkgMzIKICAgIGRpZyAzCiAgICBwdXNoaW50IDg5IC8vIDg5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciA0CiAgICBwdXNoaW50IDgxIC8vIDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIGFzc2VydChzdGF0ZSA9PT0gU1RBVEVfT0ZGRVJFRCkKICAgIHVuY292ZXIgNAogICAgYnl0ZWMgNiAvLyAweDBhCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gYXNzZXJ0KGV4cGlyYXRpb24gPiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfT0ZGRVJfRVhQSVJFRCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHVuY292ZXIgNAogICAgPAogICAgYXNzZXJ0IC8vIG9mZmVyIGhhcyBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE1Ni0xNjUKICAgIC8vIGNvbnN0IGlzUGFydGljaXBhbnQgPSBhYmlDYWxsPHR5cGVvZiBNZXRhTWVya2xlcy5wcm90b3R5cGUudmVyaWZ5Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihUeG4uc2VuZGVyLmJ5dGVzKSksCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTU3CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNTkKICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTYxCiAgICAvLyBzaGEyNTYoc2hhMjU2KFR4bi5zZW5kZXIuYnl0ZXMpKSwKICAgIHR4biBTZW5kZXIKICAgIHNoYTI1NgogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE2MwogICAgLy8gTWVya2xlVHJlZVR5cGVUcmFkZQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTU2LTE2NQogICAgLy8gY29uc3QgaXNQYXJ0aWNpcGFudCA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZnk+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIFN0cmluZyhwYXJ0aWNpcGFudHNSb290KSwKICAgIC8vICAgICBzaGEyNTYoc2hhMjU2KFR4bi5zZW5kZXIuYnl0ZXMpKSwKICAgIC8vICAgICBwcm9vZiwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgYnl0ZWMgNyAvLyBtZXRob2QgInZlcmlmeShhZGRyZXNzLHN0cmluZyxieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NClib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYm9vbDgKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTY3CiAgICAvLyBhc3NlcnQoaXNQYXJ0aWNpcGFudCwgRVJSX05PVF9BX1BBUlRJQ0lQQU5UKQogICAgYXNzZXJ0IC8vIG5vdCBhIHBhcnRpY2lwYW50IGluIHRoaXMgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGNvbnN0IHNlbmRlclBhcnRpY2lwYW50S2V5ID0geyBpZCwgYWRkcmVzczogVHhuLnNlbmRlciB9CiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNzEKICAgIC8vIGFzc2VydCghdGhpcy5wYXJ0aWNpcGFudHMoc2VuZGVyUGFydGljaXBhbnRLZXkpLmV4aXN0cykKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHN3YXAKICAgIGV4dHJhY3QgOCAzMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0CiAgICAvLyBwYXJ0aWNpcGFudHMgPSBCb3hNYXA8UGFydGljaXBhbnRLZXksIFJlZnVuZFZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4UGFydGljaXBhbnRzIH0pCiAgICBieXRlY18zIC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE3MQogICAgLy8gYXNzZXJ0KCF0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNzMKICAgIC8vIGNvbnN0IG5ld0FjY2VwdGFuY2VzOiB1aW50NjQgPSBhY2NlcHRhbmNlcyArIDEKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuYWNjZXB0YW5jZXMgPSBuZXdBY2NlcHRhbmNlcwogICAgZHVwCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIHB1c2hpbnQgODkgLy8gODkKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTc4LTE4NQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIG1iclBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5wYXJ0aWNpcGFudHMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE4MQogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTc4LTE4NQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIG1iclBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBjb3N0cy5wYXJ0aWNpcGFudHMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyA0CiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBhbW91bnQ6IGNvc3RzLnBhcnRpY2lwYW50cwogICAgaW50YyA0IC8vIDM0OTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE3OC0xODUKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBtYnJQYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogY29zdHMucGFydGljaXBhbnRzCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxODkKICAgIC8vIHBheW9yOiBtYnJQYXltZW50LnNlbmRlciwKICAgIHVuY292ZXIgMwogICAgZ3R4bnMgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gYW1vdW50OiBjb3N0cy5wYXJ0aWNpcGFudHMKICAgIGludGMgNCAvLyAzNDkwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxODgtMTkxCiAgICAvLyB0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkudmFsdWUgPSB7CiAgICAvLyAgIHBheW9yOiBtYnJQYXltZW50LnNlbmRlciwKICAgIC8vICAgYW1vdW50OiBjb3N0cy5wYXJ0aWNpcGFudHMKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gaWYgKHBhcnRpY2lwYW50c0xlYXZlcyA9PT0gbmV3QWNjZXB0YW5jZXMpIHsKICAgID09CiAgICBieiBhY2NlcHRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLnN0YXRlID0gU1RBVEVfRVNDUk9XSU5HCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vIDB4MTQKICAgIGJveF9yZXBsYWNlCgphY2NlcHRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoxNDgKICAgIC8vIGFjY2VwdChtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGlkOiB1aW50NjQsIHByb29mOiBQcm9vZikgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC5lc2Nyb3dbcm91dGluZ10oKSAtPiB2b2lkOgplc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gZXNjcm93KHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgaWQ6IHVpbnQ2NCwgcmVjZWl2ZXI6IEFjY291bnQsIGFtb3VudDogdWludDY0LCBwcm9vZjogUHJvb2YpIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMTAKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyBvZmZlcnMgPSBCb3hNYXA8dWludDY0LCBPZmZlclZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4T2ZmZXJzIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gYXNzZXJ0KHRoaXMub2ZmZXJzKGlkKS5leGlzdHMpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gY29uc3QgeyBzdGF0ZSwgcm9vdCwgZXNjcm93ZWQsIGxlYXZlcywgZXhwaXJhdGlvbiB9ID0gdGhpcy5vZmZlcnMoaWQpLnZhbHVlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgZGlnIDEKICAgIGV4dHJhY3QgMSAzMgogICAgZGlnIDIKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgcHVzaGludCAzMyAvLyAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgNAogICAgcHVzaGludCA5NyAvLyA5NwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBhc3NlcnQoc3RhdGUgPT09IFNUQVRFX0VTQ1JPV0lORywgRVJSX0lOVkFMSURfU1RBVEUpCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjIDUgLy8gMHgxNAogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBzdGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX09GRkVSX0VYUElSRUQpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gb2ZmZXIgaGFzIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyBjb25zdCBzZW5kZXJQYXJ0aWNpcGFudEtleSA9IHsgaWQsIGFkZHJlc3M6IFR4bi5zZW5kZXIgfQogICAgZGlnIDQKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMTgKICAgIC8vIGFzc2VydCh0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkuZXhpc3RzKQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDMyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzQKICAgIC8vIHBhcnRpY2lwYW50cyA9IEJveE1hcDxQYXJ0aWNpcGFudEtleSwgUmVmdW5kVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhQYXJ0aWNpcGFudHMgfSkKICAgIGJ5dGVjXzMgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyBhc3NlcnQodGhpcy5wYXJ0aWNpcGFudHMoc2VuZGVyUGFydGljaXBhbnRLZXkpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gY29uc3QgaGFzaCA9IHNoYTI1NihzaGEyNTYoQnl0ZXNgJHtUeG4uc2VuZGVyLmJ5dGVzfSR7cmVjZWl2ZXIuYnl0ZXN9JHtpdG9iKDApfSR7aXRvYihhbW91bnQpfWApKQogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHNoYTI1NgogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyMQogICAgLy8gY29uc3QgaGFzaEtleTogSGFzaEtleSA9IHsgaWQsIGhhc2ggfQogICAgdW5jb3ZlciA1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM2CiAgICAvLyBoYXNoZXMgPSBCb3hNYXA8SGFzaEtleSwgUmVmdW5kVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhIYXNoZXMgfSkKICAgIGJ5dGVjIDggLy8gImgiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBhc3NlcnQoIXRoaXMuaGFzaGVzKGhhc2hLZXkpLmV4aXN0cykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjI0LTIzMwogICAgLy8gY29uc3QgdmVyaWZpZWQgPSBhYmlDYWxsPHR5cGVvZiBNZXRhTWVya2xlcy5wcm90b3R5cGUudmVyaWZ5Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBTdHJpbmcocm9vdCksCiAgICAvLyAgICAgaGFzaCwKICAgIC8vICAgICBwcm9vZiwKICAgIC8vICAgICBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICAvLyAgIF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMjUKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjkKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyNQogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBieXRlY18yIC8vICJhYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyNQogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyNwogICAgLy8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIFN0cmluZyhyb290KSwKICAgIGRpZyA2CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyMzEKICAgIC8vIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIyNC0yMzMKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgU3RyaW5nKHJvb3QpLAogICAgLy8gICAgIGhhc2gsCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJ2ZXJpZnkoYWRkcmVzcyxzdHJpbmcsYnl0ZVszMl0sYnl0ZVszMl1bXSx1aW50NjQpYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGJvb2w4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIzNQogICAgLy8gYXNzZXJ0KHZlcmlmaWVkLCBFUlJfQ0FOVF9WRVJJRllfTEVBRikKICAgIGFzc2VydCAvLyBjYW5ub3QgdmVyaWZ5IGxlYWYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjM5LTI0NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQgKyBjb3N0cy5oYXNoZXMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgZGlnIDUKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI0MgogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjM5LTI0NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQgKyBjb3N0cy5oYXNoZXMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyA2CiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBhbW91bnQ6IGFtb3VudCArIGNvc3RzLmhhc2hlcwogICAgdW5jb3ZlciA2CiAgICBpbnRjIDQgLy8gMzQ5MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjM5LTI0NgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQgKyBjb3N0cy5oYXNoZXMKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI1MAogICAgLy8gcGF5b3I6IHBheW1lbnQuc2VuZGVyLAogICAgdW5jb3ZlciA0CiAgICBndHhucyBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBhbW91bnQ6IGFtb3VudCArIGNvc3RzLmhhc2hlcwogICAgaW50YyA0IC8vIDM0OTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI0OS0yNTIKICAgIC8vIHRoaXMuaGFzaGVzKGhhc2hLZXkpLnZhbHVlID0gewogICAgLy8gICBwYXlvcjogcGF5bWVudC5zZW5kZXIsCiAgICAvLyAgIGFtb3VudDogY29zdHMuaGFzaGVzCiAgICAvLyB9CiAgICBpdG9iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjU0CiAgICAvLyBjb25zdCBuZXdFc2Nyb3dlZDogdWludDY0ID0gZXNjcm93ZWQgKyAxCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNTUKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZS5lc2Nyb3dlZCA9IG5ld0VzY3Jvd2VkCiAgICBkdXAKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgcHVzaGludCA0MSAvLyA0MQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNTgKICAgIC8vIGlmIChsZWF2ZXMgPT09IG5ld0VzY3Jvd2VkKSB7CiAgICA9PQogICAgYnogZXNjcm93X2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNTkKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZS5zdGF0ZSA9IFNUQVRFX0RJU0JVUlNJTkcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gMHgxZQogICAgYm94X3JlcGxhY2UKCmVzY3Jvd19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gZXNjcm93KHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgaWQ6IHVpbnQ2NCwgcmVjZWl2ZXI6IEFjY291bnQsIGFtb3VudDogdWludDY0LCBwcm9vZjogUHJvb2YpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjpIeXBlclN3YXAuZXNjcm93QXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKZXNjcm93QXNhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNzMtMjgxCiAgICAvLyBlc2Nyb3dBc2EoCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVyOiBBY2NvdW50LAogICAgLy8gICBhc3NldDogdWludDY0LAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcHJvb2Y6IFByb29mCiAgICAvLyApIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAzMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbMzJdW10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gYXNzZXJ0KHRoaXMub2ZmZXJzKGlkKS5leGlzdHMpCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIG9mZmVycyA9IEJveE1hcDx1aW50NjQsIE9mZmVyVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhPZmZlcnMgfSkKICAgIGJ5dGVjXzEgLy8gIm8iCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjgzCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBjb25zdCB7IHN0YXRlLCByb290LCBlc2Nyb3dlZCwgbGVhdmVzLCBleHBpcmF0aW9uIH0gPSB0aGlzLm9mZmVycyhpZCkudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgZGlnIDEKICAgIGV4dHJhY3QgMSAzMgogICAgZGlnIDIKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBjb3ZlciA4CiAgICBkaWcgMgogICAgcHVzaGludCAzMyAvLyAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDgKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA5NyAvLyA5NwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mjg2CiAgICAvLyBhc3NlcnQoc3RhdGUgPT09IFNUQVRFX0VTQ1JPV0lORywgRVJSX0lOVkFMSURfU1RBVEUpCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDUgLy8gMHgxNAogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBzdGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyODgKICAgIC8vIGFzc2VydChleHBpcmF0aW9uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgRVJSX09GRkVSX0VYUElSRUQpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gb2ZmZXIgaGFzIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjkwCiAgICAvLyBjb25zdCBzZW5kZXJQYXJ0aWNpcGFudEtleSA9IHsgaWQsIGFkZHJlc3M6IFR4bi5zZW5kZXIgfQogICAgZGlnIDEKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTEKICAgIC8vIGFzc2VydCh0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkuZXhpc3RzKQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDMyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzQKICAgIC8vIHBhcnRpY2lwYW50cyA9IEJveE1hcDxQYXJ0aWNpcGFudEtleSwgUmVmdW5kVmFsdWU+KHsga2V5UHJlZml4OiBIeXBlclN3YXBCb3hQcmVmaXhQYXJ0aWNpcGFudHMgfSkKICAgIGJ5dGVjXzMgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MjkxCiAgICAvLyBhc3NlcnQodGhpcy5wYXJ0aWNpcGFudHMoc2VuZGVyUGFydGljaXBhbnRLZXkpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI5MwogICAgLy8gY29uc3QgaGFzaCA9IHNoYTI1NihzaGEyNTYoQnl0ZXNgJHtUeG4uc2VuZGVyLmJ5dGVzfSR7cmVjZWl2ZXIuYnl0ZXN9JHtpdG9iKGFzc2V0KX0ke2l0b2IoYW1vdW50KX1gKSkKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTQKICAgIC8vIGNvbnN0IGhhc2hLZXk6IEhhc2hLZXkgPSB7IGlkLCBoYXNoIH0KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNgogICAgLy8gaGFzaGVzID0gQm94TWFwPEhhc2hLZXksIFJlZnVuZFZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4SGFzaGVzIH0pCiAgICBieXRlYyA4IC8vICJoIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mjk1CiAgICAvLyBhc3NlcnQoIXRoaXMuaGFzaGVzKGhhc2hLZXkpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjI5Ny0zMDYKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgU3RyaW5nKHJvb3QpLAogICAgLy8gICAgIGhhc2gsCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mjk4CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTgKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTgKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMDAKICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzAxCiAgICAvLyBTdHJpbmcocm9vdCksCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyOTctMzA2CiAgICAvLyBjb25zdCB2ZXJpZmllZCA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZnk+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIFN0cmluZyhyb290KSwKICAgIC8vICAgICBoYXNoLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyA3IC8vIG1ldGhvZCAidmVyaWZ5KGFkZHJlc3Msc3RyaW5nLGJ5dGVbMzJdLGJ5dGVbMzJdW10sdWludDY0KWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMDgKICAgIC8vIGFzc2VydCh2ZXJpZmllZCwgRVJSX0NBTlRfVkVSSUZZX0xFQUYpCiAgICBhc3NlcnQgLy8gY2Fubm90IHZlcmlmeSBsZWFmCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gbGV0IG1ickFtb3VudCA9IGNvc3RzLmhhc2hlcwogICAgaW50YyA0IC8vIDM0OTAwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gaWYgKCFyZWNlaXZlci5pc09wdGVkSW4oQXNzZXQoYXNzZXQpKSkgewogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBlc2Nyb3dBc2FfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gbGV0IG1ickFtb3VudCA9IGNvc3RzLmhhc2hlcwogICAgaW50YyA0IC8vIDM0OTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxNgogICAgLy8gbWJyQW1vdW50ICs9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICArCiAgICBidXJ5IDEKCmVzY3Jvd0FzYV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMxOS0zMjYKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBtYnJQYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA4CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyMgogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzE5LTMyNgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIG1iclBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIGRpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMjgtMzM2CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgYXNzZXRYZmVyLAogICAgLy8gICB7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldCksCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9UUkFOU0ZFUgogICAgLy8gKQogICAgZGlnIDkKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzI4LTMzNgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIGFzc2V0WGZlciwKICAgIC8vICAgewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHhmZXJBc3NldDogQXNzZXQoYXNzZXQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnQKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfVFJBTlNGRVIKICAgIC8vICkKICAgID09CiAgICBkaWcgMQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBkaWcgMTEKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGRpZyA5CiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0MAogICAgLy8gcGF5b3I6IG1iclBheW1lbnQuc2VuZGVyLAogICAgc3dhcAogICAgZ3R4bnMgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMzOS0zNDIKICAgIC8vIHRoaXMuaGFzaGVzKGhhc2hLZXkpLnZhbHVlID0gewogICAgLy8gICBwYXlvcjogbWJyUGF5bWVudC5zZW5kZXIsCiAgICAvLyAgIGFtb3VudDogbWJyQW1vdW50CiAgICAvLyB9CiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0NAogICAgLy8gY29uc3QgbmV3RXNjcm93ZWQ6IHVpbnQ2NCA9IGVzY3Jvd2VkICsgMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0NQogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLmVzY3Jvd2VkID0gbmV3RXNjcm93ZWQKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDYKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBpZiAobGVhdmVzID09PSBuZXdFc2Nyb3dlZCkgewogICAgZGlnIDMKICAgID09CiAgICBieiBlc2Nyb3dBc2FfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLnN0YXRlID0gU1RBVEVfRElTQlVSU0lORwogICAgZGlnIDQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vIDB4MWUKICAgIGJveF9yZXBsYWNlCgplc2Nyb3dBc2FfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czoyNzMtMjgxCiAgICAvLyBlc2Nyb3dBc2EoCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVyOiBBY2NvdW50LAogICAgLy8gICBhc3NldDogdWludDY0LAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcHJvb2Y6IFByb29mCiAgICAvLyApIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjpIeXBlclN3YXAuZGlzYnVyc2Vbcm91dGluZ10oKSAtPiB2b2lkOgpkaXNidXJzZToKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM2MQogICAgLy8gZGlzYnVyc2UoaWQ6IHVpbnQ2NCwgcmVjZWl2ZXJXYWxsZXQ6IHVpbnQ2NCwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiB1aW50NjQsIGFtb3VudDogdWludDY0KSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzYzCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMgogICAgLy8gb2ZmZXJzID0gQm94TWFwPHVpbnQ2NCwgT2ZmZXJWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeE9mZmVycyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNjMKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNjQKICAgIC8vIGNvbnN0IHsgc3RhdGUsIGVzY3Jvd2VkIH0gPSB0aGlzLm9mZmVycyhpZCkudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgc3dhcAogICAgcHVzaGludCA0MSAvLyA0MQogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzY2CiAgICAvLyBhc3NlcnQoc3RhdGUgPT09IFNUQVRFX0RJU0JVUlNJTkcpCiAgICBieXRlYyA5IC8vIDB4MWUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBjb25zdCBoYXNoID0gc2hhMjU2KHNoYTI1NihCeXRlc2Ake1R4bi5zZW5kZXIuYnl0ZXN9JHtyZWNlaXZlci5ieXRlc30ke2l0b2IoYXNzZXQpfSR7aXRvYihhbW91bnQpfWApKQogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBjb25zdCBoYXNoS2V5OiBIYXNoS2V5ID0geyBpZCwgaGFzaCB9CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzYKICAgIC8vIGhhc2hlcyA9IEJveE1hcDxIYXNoS2V5LCBSZWZ1bmRWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeEhhc2hlcyB9KQogICAgYnl0ZWMgOCAvLyAiaCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNzEKICAgIC8vIGFzc2VydCh0aGlzLmhhc2hlcyhoYXNoS2V5KS5leGlzdHMpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM3MwogICAgLy8gbGV0IHsgcGF5b3IsIGFtb3VudDogcmVmdW5kQW1vdW50IH0gPSB0aGlzLmhhc2hlcyhoYXNoS2V5KS52YWx1ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgZXh0cmFjdCA4IDMyCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyB0aGlzLmhhc2hlcyhoYXNoS2V5KS5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM3NwogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBibnogZGlzYnVyc2VfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzc5LTM4MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDYKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM3OS0zODAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM3OS0zODEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzg0LTM4OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiByZWZ1bmRBbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHBheW9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjM4NC0zODgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzg0LTM4OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiByZWZ1bmRBbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHBheW9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpkaXNidXJzZV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NDkKICAgIC8vIGNvbnN0IG5ld0VzY3Jvd2VkOiB1aW50NjQgPSBlc2Nyb3dlZCAtIDEKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZS5lc2Nyb3dlZCA9IG5ld0VzY3Jvd2VkCiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyA3CiAgICBwdXNoaW50IDQxIC8vIDQxCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ1MgogICAgLy8gaWYgKG5ld0VzY3Jvd2VkID09PSAwKSB7CiAgICBibnogZGlzYnVyc2VfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NTMKICAgIC8vIHRoaXMub2ZmZXJzKGlkKS52YWx1ZS5zdGF0ZSA9IFNUQVRFX0NPTVBMRVRFRAogICAgZGlnIDUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAweDI4CiAgICBib3hfcmVwbGFjZQoKZGlzYnVyc2VfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzYxCiAgICAvLyBkaXNidXJzZShpZDogdWludDY0LCByZWNlaXZlcldhbGxldDogdWludDY0LCByZWNlaXZlcjogQWNjb3VudCwgYXNzZXQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmRpc2J1cnNlX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozOTIKICAgIC8vIGNvbnN0IFssIGlzT3B0ZWRJbl0gPSBBc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKHJlY2VpdmVyLCBhc3NldCkKICAgIGRpZyA4CiAgICBkaWcgOAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBpZiAoIWlzT3B0ZWRJbikgewogICAgYm56IGRpc2J1cnNlX2Vsc2VfYm9keUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozOTYKICAgIC8vIGFzc2VydChyZWNlaXZlcldhbGxldCAhPT0gMCwgRVJSX1JFQ0VJVkVSX05PVF9PUFRFRF9JTikKICAgIGRpZyA5CiAgICBkdXAKICAgIGFzc2VydCAvLyByZWNlaXZlciBpcyBub3Qgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozOTcKICAgIC8vIGFzc2VydChBcHBsaWNhdGlvbihyZWNlaXZlcldhbGxldCkuYWRkcmVzcyA9PT0gcmVjZWl2ZXIsICdyZWNlaXZlcldhbGxldCBhZGRyZXNzIG1pc21hdGNoJykKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlY2VpdmVyV2FsbGV0IGFkZHJlc3MgbWlzbWF0Y2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Mzk5CiAgICAvLyBhc3NlcnQocmVmdW5kQW1vdW50ID49IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwgRVJSX1JFQ0VJVkVSX05PVF9PUFRFRF9JTikKICAgIGRpZyAxCiAgICBnbG9iYWwgQXNzZXRPcHRJbk1pbkJhbGFuY2UKICAgID49CiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgaXMgbm90IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDAyCiAgICAvLyBjb25zdCBvcHRpblBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkub3B0aW4KICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDAyCiAgICAvLyBjb25zdCBvcHRpblBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkub3B0aW4KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgZHVwCiAgICBieXRlYyAxNCAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MDIKICAgIC8vIGNvbnN0IG9wdGluUGx1Z2luID0gZ2V0UGx1Z2luQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5vcHRpbgogICAgZXh0cmFjdCAwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDAzLTQxMgogICAgLy8gY29uc3QgY2FuT3B0SW4gPSBhYmlDYWxsPHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfY2FuQ2FsbD4oewogICAgLy8gICBhcHBJZDogcmVjZWl2ZXJXYWxsZXQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBvcHRpblBsdWdpbiwKICAgIC8vICAgICB0cnVlLAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgICcnLAogICAgLy8gICAgIG9wLmJ6ZXJvKDQpLnRvRml4ZWQoeyBsZW5ndGg6IDQgfSksCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIG9wLmJ6ZXJvKDQpLnRvRml4ZWQoeyBsZW5ndGg6IDQgfSksCiAgICBwdXNoaW50IDQgLy8gNAogICAgYnplcm8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDAzLTQxMgogICAgLy8gY29uc3QgY2FuT3B0SW4gPSBhYmlDYWxsPHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfY2FuQ2FsbD4oewogICAgLy8gICBhcHBJZDogcmVjZWl2ZXJXYWxsZXQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBvcHRpblBsdWdpbiwKICAgIC8vICAgICB0cnVlLAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgICcnLAogICAgLy8gICAgIG9wLmJ6ZXJvKDQpLnRvRml4ZWQoeyBsZW5ndGg6IDQgfSksCiAgICAvLyAgIF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBwdXNoYnl0ZXMgMHg0NzI3YWYyMSAvLyBtZXRob2QgImFyYzU4X2NhbkNhbGwodWludDY0LGJvb2wsYWRkcmVzcyxzdHJpbmcsYnl0ZVs0XSlib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyB0cnVlLAogICAgYnl0ZWMgMTUgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQwOQogICAgLy8gJycsCiAgICBieXRlYyAxMCAvLyAweDAwMDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MDMtNDEyCiAgICAvLyBjb25zdCBjYW5PcHRJbiA9IGFiaUNhbGw8dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9jYW5DYWxsPih7CiAgICAvLyAgIGFwcElkOiByZWNlaXZlcldhbGxldCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIG9wdGluUGx1Z2luLAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgJycsCiAgICAvLyAgICAgb3AuYnplcm8oNCkudG9GaXhlZCh7IGxlbmd0aDogNCB9KSwKICAgIC8vICAgXQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MTQKICAgIC8vIGFzc2VydChjYW5PcHRJbiwgRVJSX1JFQ0VJVkVSX05PVF9PUFRFRF9JTikKICAgIGFzc2VydCAvLyByZWNlaXZlciBpcyBub3Qgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MTcKICAgIC8vIGFyYzU4T3B0SW5BbmRTZW5kKHRoaXMuYWtpdGFEQU8udmFsdWUsIEFwcGxpY2F0aW9uKHJlY2VpdmVyV2FsbGV0KSwgJycsIFthc3NldF0sIFthbW91bnRdKQogICAgYnl0ZWMgMTggLy8gMHgwMDAxCiAgICBkaWcgNgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMjEKICAgIGJ5dGVjIDE4IC8vIDB4MDAwMQogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjM3NgogICAgLy8gYXNzZXJ0KGFzc2V0cy5sZW5ndGggPT09IGFtb3VudHMubGVuZ3RoLCBFUlJfQVNTRVRTX0FORF9BTU9VTlRTX01JU01BVENIKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGJ1cnkgMjEKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEFzc2V0cyBhbmQgYW1vdW50cyBtaXNtYXRjaAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NAogICAgLy8gY29uc3QgW3BsdWdpbkFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNQbHVnaW5BcHBMaXN0KSkKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgMTQgLy8gInBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Mzc3CiAgICAvLyBjb25zdCBvcHRpblBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QoYWtpdGFEQU8pLm9wdGluCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGRpZyA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjE2NwogICAgLy8gQnl0ZXMoQWJzdHJhY3RBY2NvdW50R2xvYmFsU3RhdGVLZXlzQ29udHJvbGxlZEFkZHJlc3MpCiAgICBwdXNoYnl0ZXMgImNvbnRyb2xsZWRfYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTY1LTE2OAogICAgLy8gY29uc3QgW2NvbnRyb2xsZWRBY2NvdW50Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoCiAgICAvLyAgIHdhbGxldElELAogICAgLy8gICBCeXRlcyhBYnN0cmFjdEFjY291bnRHbG9iYWxTdGF0ZUtleXNDb250cm9sbGVkQWRkcmVzcykKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozODAtMzgzCiAgICAvLyBpdHhuQ29tcG9zZS5iZWdpbjx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3Jla2V5VG9QbHVnaW4+KHsKICAgIC8vICAgYXBwSWQ6IHJlY2lwaWVudFdhbGxldC5pZCwKICAgIC8vICAgYXJnczogW29wdGluUGx1Z2luLCB0cnVlLCBlc2Nyb3csIFtdLCBbXV0KICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoYnl0ZXMgMHg1ODJmZjM4MiAvLyBtZXRob2QgImFyYzU4X3Jla2V5VG9QbHVnaW4odWludDY0LGJvb2wsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyB0cnVlLAogICAgYnl0ZWMgMTUgLy8gMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDA5CiAgICAvLyAnJywKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MzgyCiAgICAvLyBhcmdzOiBbb3B0aW5QbHVnaW4sIHRydWUsIGVzY3JvdywgW10sIFtdXQogICAgYnl0ZWMgMTAgLy8gMHgwMDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTAgLy8gMHgwMDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MzgwLTM4MwogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW48dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9yZWtleVRvUGx1Z2luPih7CiAgICAvLyAgIGFwcElkOiByZWNpcGllbnRXYWxsZXQuaWQsCiAgICAvLyAgIGFyZ3M6IFtvcHRpblBsdWdpbiwgdHJ1ZSwgZXNjcm93LCBbXSwgW11dCiAgICAvLyB9KQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozODUtMzk2CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBPcHRJblBsdWdpbi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IG9wdGluUGx1Z2luLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgcmVjaXBpZW50V2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgYXNzZXRzLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogb3JpZ2luLAogICAgLy8gICAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBhc3NldHMubGVuZ3RoCiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozOTMKICAgIC8vIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICB1bmNvdmVyIDMKICAgICoKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjM5MS0zOTQKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBvcmlnaW4sCiAgICAvLyAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Mzg1LTM5NgogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgT3B0SW5QbHVnaW4ucHJvdG90eXBlLm9wdEluPih7CiAgICAvLyAgIGFwcElkOiBvcHRpblBsdWdpbiwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHJlY2lwaWVudFdhbGxldCwKICAgIC8vICAgICB0cnVlLAogICAgLy8gICAgIGFzc2V0cywKICAgIC8vICAgICBpdHhuLnBheW1lbnQoewogICAgLy8gICAgICAgcmVjZWl2ZXI6IG9yaWdpbiwKICAgIC8vICAgICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlICogYXNzZXRzLmxlbmd0aAogICAgLy8gICAgIH0pCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIHB1c2hieXRlcyAweDY4MzVlM2JjIC8vIG1ldGhvZCAib3B0SW4odWludDY0LGJvb2wsdWludDY0W10scGF5KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MDcKICAgIC8vIHRydWUsCiAgICBieXRlYyAxNSAvLyAweDgwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czozODUtMzk2CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBPcHRJblBsdWdpbi5wcm90b3R5cGUub3B0SW4+KHsKICAgIC8vICAgYXBwSWQ6IG9wdGluUGx1Z2luLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgcmVjaXBpZW50V2FsbGV0LAogICAgLy8gICAgIHRydWUsCiAgICAvLyAgICAgYXNzZXRzLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogb3JpZ2luLAogICAgLy8gICAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiBhc3NldHMubGVuZ3RoCiAgICAvLyAgICAgfSkKICAgIC8vICAgXQogICAgLy8gfSkKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Mzk4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYW1vdW50cy5sZW5ndGg7IGkrKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTQKCmRpc2J1cnNlX3doaWxlX3RvcEAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6Mzk4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYW1vdW50cy5sZW5ndGg7IGkrKykgewogICAgZGlnIDEzCiAgICBkaWcgMTYKICAgIDwKICAgIGJ6IGRpc2J1cnNlX2FmdGVyX3doaWxlQDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjM5OQogICAgLy8gaWYgKGFtb3VudHNbaV0gPiAwKSB7CiAgICBkaWcgMTgKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGJ6IGRpc2J1cnNlX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDAwLTQwNgogICAgLy8gaXR4bkNvbXBvc2UubmV4dCgKICAgIC8vICAgaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50c1tpXSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBvcmlnaW4sCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldHNbaV0KICAgIC8vICAgfSkKICAgIC8vICkKICAgIGl0eG5fbmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MDQKICAgIC8vIHhmZXJBc3NldDogYXNzZXRzW2ldCiAgICBkaWcgMTcKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTUKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZGlnIDE2CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAxMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MDEtNDA1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50c1tpXSwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogb3JpZ2luLAogICAgLy8gICB4ZmVyQXNzZXQ6IGFzc2V0c1tpXQogICAgLy8gfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKCmRpc2J1cnNlX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjM5OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFtb3VudHMubGVuZ3RoOyBpKyspIHsKICAgIGRpZyAxMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTQKICAgIGIgZGlzYnVyc2Vfd2hpbGVfdG9wQDE5CgpkaXNidXJzZV9hZnRlcl93aGlsZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDEwLTQxMgogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X3ZlcmlmeUF1dGhBZGRyZXNzPih7CiAgICAvLyAgIGFwcElkOiByZWNpcGllbnRXYWxsZXQKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIHB1c2hieXRlcyAweDZjYzNmNjA2IC8vIG1ldGhvZCAiYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0MTQKICAgIC8vIGl0eG5Db21wb3NlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MjAKICAgIC8vIGNvbnN0IG9wdEluQ29zdCA9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDIxCiAgICAvLyBpZiAocmVmdW5kQW1vdW50ID4gb3B0SW5Db3N0KSB7CiAgICBkaWcgMQogICAgPAogICAgYnogZGlzYnVyc2VfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MjItNDI3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IHJlZnVuZEFtb3VudCAtIG9wdEluQ29zdCwKICAgIC8vICAgICByZWNlaXZlcjogcGF5b3IsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MjQKICAgIC8vIGFtb3VudDogcmVmdW5kQW1vdW50IC0gb3B0SW5Db3N0LAogICAgZHVwCiAgICBkaWcgMTMKICAgIC0KICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0MjItNDI2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IHJlZnVuZEFtb3VudCAtIG9wdEluQ29zdCwKICAgIC8vICAgICByZWNlaXZlcjogcGF5b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQyMi00MjcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50IC0gb3B0SW5Db3N0LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBkaXNidXJzZV9hZnRlcl9pZl9lbHNlQDE1CgpkaXNidXJzZV9lbHNlX2JvZHlAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQzMS00MzcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiByZWNlaXZlciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQzMS00MzYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiByZWNlaXZlciwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDMxLTQzNwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHJlY2VpdmVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ0MC00NDUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NDAtNDQ0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IHJlZnVuZEFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcjogcGF5b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ0MC00NDUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBkaXNidXJzZV9hZnRlcl9pZl9lbHNlQDE1CgoKLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo6SHlwZXJTd2FwLmNhbmNlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNhbmNlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDYxCiAgICAvLyBjYW5jZWwoaWQ6IHVpbnQ2NCwgcHJvb2Y6IFByb29mKSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NjMKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgaXRvYgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyBvZmZlcnMgPSBCb3hNYXA8dWludDY0LCBPZmZlclZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4T2ZmZXJzIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ2NAogICAgLy8gY29uc3QgeyBzdGF0ZSwgcGFydGljaXBhbnRzUm9vdCwgZXNjcm93ZWQsIHJvb3QsIGV4cGlyYXRpb24gfSA9IHRoaXMub2ZmZXJzKGlkKS52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBleHRyYWN0IDQ5IDMyCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDk3IC8vIDk3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NjcKICAgIC8vIHN0YXRlID09PSBTVEFURV9PRkZFUkVEIHx8IHN0YXRlID09PSBTVEFURV9FU0NST1dJTkcgfHwKICAgIGJ5dGVjIDYgLy8gMHgwYQogICAgPT0KICAgIGJueiBjYW5jZWxfYm9vbF90cnVlQDUKICAgIGRpZyAzCiAgICBieXRlYyA1IC8vIDB4MTQKICAgID09CiAgICBibnogY2FuY2VsX2Jvb2xfdHJ1ZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ2OAogICAgLy8gKHN0YXRlID09PSBTVEFURV9ESVNCVVJTSU5HICYmIGV4cGlyYXRpb24gPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCksCiAgICBkaWcgMwogICAgYnl0ZWMgOSAvLyAweDFlCiAgICA9PQogICAgYnogY2FuY2VsX2Jvb2xfZmFsc2VANgogICAgZHVwCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYnogY2FuY2VsX2Jvb2xfZmFsc2VANgoKY2FuY2VsX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmNhbmNlbF9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ2Ni00NzAKICAgIC8vIGFzc2VydCgKICAgIC8vICAgc3RhdGUgPT09IFNUQVRFX09GRkVSRUQgfHwgc3RhdGUgPT09IFNUQVRFX0VTQ1JPV0lORyB8fAogICAgLy8gICAoc3RhdGUgPT09IFNUQVRFX0RJU0JVUlNJTkcgJiYgZXhwaXJhdGlvbiA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wKSwKICAgIC8vICAgRVJSX0lOVkFMSURfU1RBVEUKICAgIC8vICkKICAgIGFzc2VydCAvLyB3cm9uZyBzdGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NzMKICAgIC8vIGNvbnN0IHNlbmRlclBhcnRpY2lwYW50S2V5ID0geyBpZCwgYWRkcmVzczogVHhuLnNlbmRlciB9CiAgICBkaWcgNQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ3NAogICAgLy8gYXNzZXJ0KHRoaXMucGFydGljaXBhbnRzKHNlbmRlclBhcnRpY2lwYW50S2V5KS5leGlzdHMsIEVSUl9OT1RfQUNDRVBURUQpCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBleHRyYWN0IDggMzIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNAogICAgLy8gcGFydGljaXBhbnRzID0gQm94TWFwPFBhcnRpY2lwYW50S2V5LCBSZWZ1bmRWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeFBhcnRpY2lwYW50cyB9KQogICAgYnl0ZWNfMyAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIGFzc2VydCh0aGlzLnBhcnRpY2lwYW50cyhzZW5kZXJQYXJ0aWNpcGFudEtleSkuZXhpc3RzLCBFUlJfTk9UX0FDQ0VQVEVEKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbXVzdCBoYXZlIGFjY2VwdGVkIHRvIGNhbmNlbAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0NzctNDg2CiAgICAvLyBjb25zdCBpc1BhcnRpY2lwYW50ID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgU3RyaW5nKHBhcnRpY2lwYW50c1Jvb3QpLAogICAgLy8gICAgIHNoYTI1NihzaGEyNTYoVHhuLnNlbmRlci5ieXRlcykpLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NDQKICAgIC8vIGNvbnN0IFthcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzQWtpdGFBcHBMaXN0KSkKICAgIGJ5dGVjXzIgLy8gImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgcHVzaGludCA3MiAvLyA3MgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDgwCiAgICAvLyBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ4MQogICAgLy8gU3RyaW5nKHBhcnRpY2lwYW50c1Jvb3QpLAogICAgZGlnIDQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ4MgogICAgLy8gc2hhMjU2KHNoYTI1NihUeG4uc2VuZGVyLmJ5dGVzKSksCiAgICB0eG4gU2VuZGVyCiAgICBzaGEyNTYKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0ODQKICAgIC8vIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ3Ny00ODYKICAgIC8vIGNvbnN0IGlzUGFydGljaXBhbnQgPSBhYmlDYWxsPHR5cGVvZiBNZXRhTWVya2xlcy5wcm90b3R5cGUudmVyaWZ5Pih7CiAgICAvLyAgIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBTdHJpbmcocGFydGljaXBhbnRzUm9vdCksCiAgICAvLyAgICAgc2hhMjU2KHNoYTI1NihUeG4uc2VuZGVyLmJ5dGVzKSksCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJ2ZXJpZnkoYWRkcmVzcyxzdHJpbmcsYnl0ZVszMl0sYnl0ZVszMl1bXSx1aW50NjQpYm9vbCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDgKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYm9vbDgKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDg4CiAgICAvLyBhc3NlcnQoaXNQYXJ0aWNpcGFudCwgRVJSX05PVF9BX1BBUlRJQ0lQQU5UKQogICAgYXNzZXJ0IC8vIG5vdCBhIHBhcnRpY2lwYW50IGluIHRoaXMgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo0OTAKICAgIC8vIGlmIChlc2Nyb3dlZCA9PT0gMCkgewogICAgZGlnIDEKICAgIGJueiBjYW5jZWxfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ5MQogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLnN0YXRlID0gU1RBVEVfQ0FOQ0VMX0NPTVBMRVRFRAogICAgZGlnIDQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAweDNjCiAgICBib3hfcmVwbGFjZQoKY2FuY2VsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjQ2MQogICAgLy8gY2FuY2VsKGlkOiB1aW50NjQsIHByb29mOiBQcm9vZikgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2FuY2VsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NDkzCiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuc3RhdGUgPSBTVEFURV9DQU5DRUxMRUQKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzIDB4MzIKICAgIGJveF9yZXBsYWNlCiAgICBiIGNhbmNlbF9hZnRlcl9pZl9lbHNlQDExCgpjYW5jZWxfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2FuY2VsX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC53aXRoZHJhd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhkcmF3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MDgKICAgIC8vIHdpdGhkcmF3KGlkOiB1aW50NjQsIHJlY2VpdmVyOiBBY2NvdW50LCBhc3NldDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCwgcHJvb2Y6IFByb29mKSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1aW50OFszMl1bXSkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTEwCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMgogICAgLy8gb2ZmZXJzID0gQm94TWFwPHVpbnQ2NCwgT2ZmZXJWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeE9mZmVycyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MTAKICAgIC8vIGFzc2VydCh0aGlzLm9mZmVycyhpZCkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MTEKICAgIC8vIGNvbnN0IHsgc3RhdGUsIGVzY3Jvd2VkLCByb290IH0gPSB0aGlzLm9mZmVycyhpZCkudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgZGlnIDEKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvdmVyIDkKICAgIHN3YXAKICAgIGV4dHJhY3QgMSAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MTMKICAgIC8vIGFzc2VydChzdGF0ZSA9PT0gU1RBVEVfQ0FOQ0VMTEVEKQogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTE1CiAgICAvLyBhc3NlcnQoZXNjcm93ZWQgPiAwKQogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUxNwogICAgLy8gY29uc3QgaGFzaCA9IHNoYTI1NihzaGEyNTYoQnl0ZXNgJHtUeG4uc2VuZGVyLmJ5dGVzfSR7cmVjZWl2ZXIuYnl0ZXN9JHtpdG9iKGFzc2V0KX0ke2l0b2IoYW1vdW50KX1gKSkKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTE4CiAgICAvLyBjb25zdCBoYXNoS2V5OiBIYXNoS2V5ID0geyBpZCwgaGFzaCB9CiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6MzYKICAgIC8vIGhhc2hlcyA9IEJveE1hcDxIYXNoS2V5LCBSZWZ1bmRWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeEhhc2hlcyB9KQogICAgYnl0ZWMgOCAvLyAiaCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MTkKICAgIC8vIGFzc2VydCh0aGlzLmhhc2hlcyhoYXNoS2V5KS5leGlzdHMpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUyMS01MzAKICAgIC8vIGNvbnN0IHZlcmlmaWVkID0gYWJpQ2FsbDx0eXBlb2YgTWV0YU1lcmtsZXMucHJvdG90eXBlLnZlcmlmeT4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgU3RyaW5nKHJvb3QpLAogICAgLy8gICAgIGhhc2gsCiAgICAvLyAgICAgcHJvb2YsCiAgICAvLyAgICAgTWVya2xlVHJlZVR5cGVUcmFkZQogICAgLy8gICBdLAogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTIyCiAgICAvLyBhcHBJZDogZ2V0QWtpdGFBcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLm1ldGFNZXJrbGVzLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI5CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MjIKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo0NAogICAgLy8gY29uc3QgW2FwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNBa2l0YUFwcExpc3QpKQogICAgYnl0ZWNfMiAvLyAiYWFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MjIKICAgIC8vIGFwcElkOiBnZXRBa2l0YUFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkubWV0YU1lcmtsZXMsCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MjQKICAgIC8vIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTI1CiAgICAvLyBTdHJpbmcocm9vdCksCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTI4CiAgICAvLyBNZXJrbGVUcmVlVHlwZVRyYWRlCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MjEtNTMwCiAgICAvLyBjb25zdCB2ZXJpZmllZCA9IGFiaUNhbGw8dHlwZW9mIE1ldGFNZXJrbGVzLnByb3RvdHlwZS52ZXJpZnk+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS5tZXRhTWVya2xlcywKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIFN0cmluZyhyb290KSwKICAgIC8vICAgICBoYXNoLAogICAgLy8gICAgIHByb29mLAogICAgLy8gICAgIE1lcmtsZVRyZWVUeXBlVHJhZGUKICAgIC8vICAgXSwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBieXRlYyA3IC8vIG1ldGhvZCAidmVyaWZ5KGFkZHJlc3Msc3RyaW5nLGJ5dGVbMzJdLGJ5dGVbMzJdW10sdWludDY0KWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBib29sOAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1MzIKICAgIC8vIGFzc2VydCh2ZXJpZmllZCwgRVJSX0NBTlRfVkVSSUZZX0xFQUYpCiAgICBhc3NlcnQgLy8gY2Fubm90IHZlcmlmeSBsZWFmCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUzNAogICAgLy8gbGV0IHsgcGF5b3IsIGFtb3VudDogcmVmdW5kQW1vdW50IH0gPSB0aGlzLmhhc2hlcyhoYXNoS2V5KS52YWx1ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgZXh0cmFjdCA4IDMyCiAgICBjb3ZlciA0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTM1CiAgICAvLyB0aGlzLmhhc2hlcyhoYXNoS2V5KS5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUzNwogICAgLy8gaWYgKGFzc2V0ID09PSAwKSB7CiAgICBibnogd2l0aGRyYXdfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTM4LTU0MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1NDEKICAgIC8vIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTM4LTU0MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUzOC01NDMKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0Cgp3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU1NC01NTkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1NTQtNTU4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQ6IHJlZnVuZEFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcjogcGF5b3IsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU1NC01NTkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIGFtb3VudDogcmVmdW5kQW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1NjIKICAgIC8vIGNvbnN0IG5ld0VzY3Jvd2VkOiB1aW50NjQgPSBlc2Nyb3dlZCAtIDEKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU2NAogICAgLy8gaWYgKG5ld0VzY3Jvd2VkID09PSAwKSB7CiAgICBibnogd2l0aGRyYXdfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU2NQogICAgLy8gdGhpcy5vZmZlcnMoaWQpLnZhbHVlLmVzY3Jvd2VkID0gbmV3RXNjcm93ZWQKICAgIGl0b2IKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTY2CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuc3RhdGUgPSBTVEFURV9DQU5DRUxfQ09NUExFVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gMHgzYwogICAgYm94X3JlcGxhY2UKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjUwOAogICAgLy8gd2l0aGRyYXcoaWQ6IHVpbnQ2NCwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiB1aW50NjQsIGFtb3VudDogdWludDY0LCBwcm9vZjogUHJvb2YpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCndpdGhkcmF3X2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTY4CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuZXNjcm93ZWQgPSBuZXdFc2Nyb3dlZAogICAgaXRvYgogICAgZGlnIDQKICAgIHB1c2hpbnQgNDEgLy8gNDEKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIGIgd2l0aGRyYXdfYWZ0ZXJfaWZfZWxzZUAxMQoKd2l0aGRyYXdfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU0NS01NTEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTQ5CiAgICAvLyBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBkaWcgNAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTQ1LTU1MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU0NS01NTEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBiIHdpdGhkcmF3X2FmdGVyX2lmX2Vsc2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6Okh5cGVyU3dhcC5jbGVhbnVwUGFydGljaXBhbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjbGVhbnVwUGFydGljaXBhbnQ6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTgxCiAgICAvLyBjbGVhbnVwUGFydGljaXBhbnQoaWQ6IHVpbnQ2NCwgcGFydGljaXBhbnQ6IEFjY291bnQpIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTgyCiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIGl0b2IKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozMgogICAgLy8gb2ZmZXJzID0gQm94TWFwPHVpbnQ2NCwgT2ZmZXJWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeE9mZmVycyB9KQogICAgYnl0ZWNfMSAvLyAibyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU4MgogICAgLy8gYXNzZXJ0KHRoaXMub2ZmZXJzKGlkKS5leGlzdHMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1ODMKICAgIC8vIGNvbnN0IHsgc3RhdGUsIGV4cGlyYXRpb24sIGFjY2VwdGFuY2VzIH0gPSB0aGlzLm9mZmVycyhpZCkudmFsdWUKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDAgMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGR1cAogICAgcHVzaGludCA5NyAvLyA5NwogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgODkgLy8gODkKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU4NgogICAgLy8gY29uc3QgaXNDb21wbGV0ZWQgPSBzdGF0ZSA9PT0gU1RBVEVfQ09NUExFVEVEIHx8IHN0YXRlID09PSBTVEFURV9DQU5DRUxfQ09NUExFVEVECiAgICBieXRlYyAxMyAvLyAweDI4CiAgICA9PQogICAgYm56IGNsZWFudXBQYXJ0aWNpcGFudF9ib29sX3RydWVAMwogICAgZGlnIDIKICAgIGJ5dGVjIDExIC8vIDB4M2MKICAgID09CiAgICBieiBjbGVhbnVwUGFydGljaXBhbnRfYm9vbF9mYWxzZUA0CgpjbGVhbnVwUGFydGljaXBhbnRfYm9vbF90cnVlQDM6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSA3CgpjbGVhbnVwUGFydGljaXBhbnRfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1ODcKICAgIC8vIGNvbnN0IGlzRXhwaXJlZCA9IChzdGF0ZSA9PT0gU1RBVEVfT0ZGRVJFRCB8fCBzdGF0ZSA9PT0gU1RBVEVfRVNDUk9XSU5HKSAmJiBleHBpcmF0aW9uIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAyCiAgICBieXRlYyA2IC8vIDB4MGEKICAgID09CiAgICBibnogY2xlYW51cFBhcnRpY2lwYW50X2FuZF9jb250ZEA3CiAgICBkaWcgMgogICAgYnl0ZWMgNSAvLyAweDE0CiAgICA9PQogICAgYnogY2xlYW51cFBhcnRpY2lwYW50X2Jvb2xfZmFsc2VAOQoKY2xlYW51cFBhcnRpY2lwYW50X2FuZF9jb250ZEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1ODcKICAgIC8vIGNvbnN0IGlzRXhwaXJlZCA9IChzdGF0ZSA9PT0gU1RBVEVfT0ZGRVJFRCB8fCBzdGF0ZSA9PT0gU1RBVEVfRVNDUk9XSU5HKSAmJiBleHBpcmF0aW9uIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgYnogY2xlYW51cFBhcnRpY2lwYW50X2Jvb2xfZmFsc2VAOQogICAgaW50Y18xIC8vIDEKCmNsZWFudXBQYXJ0aWNpcGFudF9ib29sX21lcmdlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1ODgKICAgIC8vIGFzc2VydChpc0NvbXBsZXRlZCB8fCBpc0V4cGlyZWQsIEVSUl9JTlZBTElEX1NUQVRFKQogICAgZGlnIDcKICAgIHx8CiAgICBhc3NlcnQgLy8gd3Jvbmcgc3RhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTkwCiAgICAvLyBjb25zdCBwYXJ0aWNpcGFudEtleTogUGFydGljaXBhbnRLZXkgPSB7IGlkLCBhZGRyZXNzOiBwYXJ0aWNpcGFudCB9CiAgICBkaWcgNAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czozNAogICAgLy8gcGFydGljaXBhbnRzID0gQm94TWFwPFBhcnRpY2lwYW50S2V5LCBSZWZ1bmRWYWx1ZT4oeyBrZXlQcmVmaXg6IEh5cGVyU3dhcEJveFByZWZpeFBhcnRpY2lwYW50cyB9KQogICAgYnl0ZWNfMyAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGFzc2VydCh0aGlzLnBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudEtleSkuZXhpc3RzKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1OTMKICAgIC8vIGNvbnN0IHsgcGF5b3IsIGFtb3VudCB9ID0gdGhpcy5wYXJ0aWNpcGFudHMocGFydGljaXBhbnRLZXkpLnZhbHVlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDggMzIKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo1OTQKICAgIC8vIHRoaXMucGFydGljaXBhbnRzKHBhcnRpY2lwYW50S2V5KS5kZWxldGUoKQogICAgdW5jb3ZlciAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NTk3CiAgICAvLyB0aGlzLm9mZmVycyhpZCkudmFsdWUuYWNjZXB0YW5jZXMgPSBhY2NlcHRhbmNlcyAtIDEKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZGlnIDYKICAgIHB1c2hpbnQgODkgLy8gODkKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NjAwLTYwNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyOiBwYXlvciwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo2MDAtNjA0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHBheW9yLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo2MDAtNjA1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI6IHBheW9yLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjU4MQogICAgLy8gY2xlYW51cFBhcnRpY2lwYW50KGlkOiB1aW50NjQsIHBhcnRpY2lwYW50OiBBY2NvdW50KSB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGVhbnVwUGFydGljaXBhbnRfYm9vbF9mYWxzZUA5OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xlYW51cFBhcnRpY2lwYW50X2Jvb2xfbWVyZ2VAMTAKCmNsZWFudXBQYXJ0aWNpcGFudF9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICBiIGNsZWFudXBQYXJ0aWNpcGFudF9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjpIeXBlclN3YXAuY2xlYW51cE9mZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xlYW51cE9mZmVyOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYxNAogICAgLy8gY2xlYW51cE9mZmVyKGlkOiB1aW50NjQpIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYxNQogICAgLy8gYXNzZXJ0KHRoaXMub2ZmZXJzKGlkKS5leGlzdHMpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyBvZmZlcnMgPSBCb3hNYXA8dWludDY0LCBPZmZlclZhbHVlPih7IGtleVByZWZpeDogSHlwZXJTd2FwQm94UHJlZml4T2ZmZXJzIH0pCiAgICBieXRlY18xIC8vICJvIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NjE1CiAgICAvLyBhc3NlcnQodGhpcy5vZmZlcnMoaWQpLmV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYxNgogICAgLy8gY29uc3QgeyBzdGF0ZSwgZXhwaXJhdGlvbiwgYWNjZXB0YW5jZXMgfSA9IHRoaXMub2ZmZXJzKGlkKS52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBwdXNoaW50IDk3IC8vIDk3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgY292ZXIgMgogICAgcHVzaGludCA4OSAvLyA4OQogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9oeXBlci1zd2FwL2NvbnRyYWN0LmFsZ28udHM6NjE5CiAgICAvLyBjb25zdCBpc0NvbXBsZXRlZCA9IHN0YXRlID09PSBTVEFURV9DT01QTEVURUQgfHwgc3RhdGUgPT09IFNUQVRFX0NBTkNFTF9DT01QTEVURUQKICAgIGJ5dGVjIDEzIC8vIDB4MjgKICAgID09CiAgICBibnogY2xlYW51cE9mZmVyX2Jvb2xfdHJ1ZUAzCiAgICBkaWcgMgogICAgYnl0ZWMgMTEgLy8gMHgzYwogICAgPT0KICAgIGJ6IGNsZWFudXBPZmZlcl9ib29sX2ZhbHNlQDQKCmNsZWFudXBPZmZlcl9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDUKCmNsZWFudXBPZmZlcl9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYyMAogICAgLy8gY29uc3QgaXNFeHBpcmVkID0gKHN0YXRlID09PSBTVEFURV9PRkZFUkVEIHx8IHN0YXRlID09PSBTVEFURV9FU0NST1dJTkcpICYmIGV4cGlyYXRpb24gPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZGlnIDIKICAgIGJ5dGVjIDYgLy8gMHgwYQogICAgPT0KICAgIGJueiBjbGVhbnVwT2ZmZXJfYW5kX2NvbnRkQDcKICAgIGRpZyAyCiAgICBieXRlYyA1IC8vIDB4MTQKICAgID09CiAgICBieiBjbGVhbnVwT2ZmZXJfYm9vbF9mYWxzZUA5CgpjbGVhbnVwT2ZmZXJfYW5kX2NvbnRkQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYyMAogICAgLy8gY29uc3QgaXNFeHBpcmVkID0gKHN0YXRlID09PSBTVEFURV9PRkZFUkVEIHx8IHN0YXRlID09PSBTVEFURV9FU0NST1dJTkcpICYmIGV4cGlyYXRpb24gPD0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBieiBjbGVhbnVwT2ZmZXJfYm9vbF9mYWxzZUA5CiAgICBpbnRjXzEgLy8gMQoKY2xlYW51cE9mZmVyX2Jvb2xfbWVyZ2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYyMQogICAgLy8gYXNzZXJ0KGlzQ29tcGxldGVkIHx8IGlzRXhwaXJlZCwgRVJSX0lOVkFMSURfU1RBVEUpCiAgICBkaWcgNQogICAgfHwKICAgIGFzc2VydCAvLyB3cm9uZyBzdGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2h5cGVyLXN3YXAvY29udHJhY3QuYWxnby50czo2MjQKICAgIC8vIGFzc2VydChhY2NlcHRhbmNlcyA9PT0gMCwgJ2FsbCBwYXJ0aWNpcGFudHMgbXVzdCBiZSBjbGVhbmVkIHVwIGZpcnN0JykKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIGFsbCBwYXJ0aWNpcGFudHMgbXVzdCBiZSBjbGVhbmVkIHVwIGZpcnN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYyNgogICAgLy8gdGhpcy5vZmZlcnMoaWQpLmRlbGV0ZSgpCiAgICBkaWcgMwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvaHlwZXItc3dhcC9jb250cmFjdC5hbGdvLnRzOjYxNAogICAgLy8gY2xlYW51cE9mZmVyKGlkOiB1aW50NjQpIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsZWFudXBPZmZlcl9ib29sX2ZhbHNlQDk6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjbGVhbnVwT2ZmZXJfYm9vbF9tZXJnZUAxMAoKY2xlYW51cE9mZmVyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIGIgY2xlYW51cE9mZmVyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czo6Q29udHJhY3RXaXRoT3B0SW4ub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czoyMwogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czoyNS0zMgogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjI4CiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjI1LTMyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHVuY292ZXIgMgogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjkKICAgIC8vIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjUtMzIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogR2xvYmFsLmFzc2V0T3B0SW5NaW5CYWxhbmNlLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozNC00MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozNgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozNwogICAgLy8gYXNzZXRBbW91bnQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MzQtMzkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozNC00MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjMKICAgIC8vIG9wdEluKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OlVwZ3JhZGVhYmxlQWtpdGFCYXNlQ29udHJhY3QudXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGJ5dGVjIDE5IC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBBa2l0YSBEQU8gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo1NAogICAgLy8gY29uc3QgW3BsdWdpbkFwcExpc3RCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyhha2l0YURBTywgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNQbHVnaW5BcHBMaXN0KSkKICAgIGJ5dGVjIDE0IC8vICJwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MQogICAgLy8gY29uc3QgdXBkYXRlUGx1Z2luID0gZ2V0UGx1Z2luQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS51cGRhdGUKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MgogICAgLy8gYXNzZXJ0KEdsb2JhbC5jYWxsZXJBcHBsaWNhdGlvbklkID09PSB1cGRhdGVQbHVnaW4sIEVSUl9JTlZBTElEX1VQR1JBREUpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGFwcCB1cGdyYWRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5VmVyc2lvbiB9KQogICAgYnl0ZWMgMTYgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo1MwogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gbmV3VmVyc2lvbgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMyCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlYyAxOSAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIEFraXRhIERBTyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyOQogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQwCiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozOAogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type Object57Cb3C34 = {\n root: bigint,\n data: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a Object57CB3C34 to the struct representation\n */\nexport function Object57Cb3C34FromTuple(abiTuple: [bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.Object57CB3C34, APP_SPEC.structs) as Object57Cb3C34\n}\n\nexport type HashKey = {\n id: bigint,\n hash: Uint8Array\n}\n\n\n/**\n * Converts the ABI tuple representation of a HashKey to the struct representation\n */\nexport function HashKeyFromTuple(abiTuple: [bigint, Uint8Array]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.HashKey, APP_SPEC.structs) as HashKey\n}\n\nexport type HyperSwapMbrData = {\n offers: bigint,\n participants: bigint,\n hashes: bigint,\n mm: Object57Cb3C34\n}\n\n\n/**\n * Converts the ABI tuple representation of a HyperSwapMBRData to the struct representation\n */\nexport function HyperSwapMbrDataFromTuple(abiTuple: [bigint, bigint, bigint, [bigint, bigint]]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.HyperSwapMBRData, APP_SPEC.structs) as HyperSwapMbrData\n}\n\nexport type OfferValue = {\n state: number,\n root: Uint8Array,\n leaves: bigint,\n escrowed: bigint,\n participantsRoot: Uint8Array,\n participantsLeaves: bigint,\n acceptances: bigint,\n expiration: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a OfferValue to the struct representation\n */\nexport function OfferValueFromTuple(abiTuple: [number, Uint8Array, bigint, bigint, Uint8Array, bigint, bigint, bigint]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.OfferValue, APP_SPEC.structs) as OfferValue\n}\n\nexport type ParticipantKey = {\n id: bigint,\n address: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a ParticipantKey to the struct representation\n */\nexport function ParticipantKeyFromTuple(abiTuple: [bigint, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.ParticipantKey, APP_SPEC.structs) as ParticipantKey\n}\n\nexport type RefundValue = {\n amount: bigint,\n payor: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a RefundValue to the struct representation\n */\nexport function RefundValueFromTuple(abiTuple: [bigint, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RefundValue, APP_SPEC.structs) as RefundValue\n}\n\n/**\n * The argument types for the HyperSwap contract\n */\nexport type HyperSwapArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,uint64)void': {\n version: string\n akitaDao: bigint | number\n }\n 'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void': {\n payment: AppMethodCallTransactionArgument\n /**\n * the merkle tree root of trades consisting of from address, recipient address, asset id & amount\n */\n root: Uint8Array\n /**\n * the number of leaves in the tree\n */\n leaves: bigint | number\n /**\n * the merkle tree root of participating addresses\n */\n participantsRoot: Uint8Array\n participantsLeaves: bigint | number\n /**\n * the unix timestamp that the offer auto-expires at if it has not been accepted by all participants\n */\n expiration: bigint | number\n }\n 'accept(pay,uint64,byte[32][])void': {\n /**\n * the payment to cover the MBR\n */\n mbrPayment: AppMethodCallTransactionArgument\n /**\n * the id of the offer being accepted\n */\n id: bigint | number\n /**\n * the bytes32 array proof of inclusion in the participants list\n */\n proof: Uint8Array[]\n }\n 'escrow(pay,uint64,address,uint64,byte[32][])void': {\n payment: AppMethodCallTransactionArgument\n /**\n * the id of the offer\n */\n id: bigint | number\n /**\n * the recipient in the offer leaf\n */\n receiver: string\n /**\n * the amount in the offer leaf\n */\n amount: bigint | number\n /**\n * the proof to verify the details are part of the tree\n */\n proof: Uint8Array[]\n }\n 'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void': {\n /**\n * the payment to cover the MBR\n */\n mbrPayment: AppMethodCallTransactionArgument\n /**\n * the asset transfer to escrow the asa\n */\n assetXfer: AppMethodCallTransactionArgument\n /**\n * the id of the offer\n */\n id: bigint | number\n /**\n * the recipient in the offer leaf\n */\n receiver: string\n /**\n * the asset in the offer leaf\n */\n asset: bigint | number\n /**\n * the amount in the offer leaf\n */\n amount: bigint | number\n /**\n * the proof to verify the details are part of the tree\n */\n proof: Uint8Array[]\n }\n 'disburse(uint64,uint64,address,uint64,uint64)void': {\n /**\n * the id of the offer\n */\n id: bigint | number\n /**\n * the receiver's ARC58 wallet app id (0 if not an ARC58 wallet)\n */\n receiverWallet: bigint | number\n /**\n * the recipient address in the leaf\n */\n receiver: string\n /**\n * the asset being transferred\n */\n asset: bigint | number\n /**\n * the amount being transferred\n */\n amount: bigint | number\n }\n 'cancel(uint64,byte[32][])void': {\n /**\n * the id of the offer being cancelled\n */\n id: bigint | number\n /**\n * a proof of inclusion in the participants list\n */\n proof: Uint8Array[]\n }\n 'withdraw(uint64,address,uint64,uint64,byte[32][])void': {\n /**\n * the id of the cancelled offer\n */\n id: bigint | number\n /**\n * the receiver of the leaf's swap\n */\n receiver: string\n /**\n * the asset of the leaf's swap\n */\n asset: bigint | number\n /**\n * the amount of the leaf's swap\n */\n amount: bigint | number\n /**\n * the proof that the leaf is in the tree\n */\n proof: Uint8Array[]\n }\n 'cleanupParticipant(uint64,address)void': {\n /**\n * the id of the offer\n */\n id: bigint | number\n /**\n * the participant address to clean up\n */\n participant: string\n }\n 'cleanupOffer(uint64)void': {\n /**\n * the id of the offer\n */\n id: bigint | number\n }\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n 'update(string)void': {\n newVersion: string\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n 'mbr()(uint64,uint64,uint64,(uint64,uint64))': Record<string, never>\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,uint64)void': [version: string, akitaDao: bigint | number]\n 'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void': [payment: AppMethodCallTransactionArgument, root: Uint8Array, leaves: bigint | number, participantsRoot: Uint8Array, participantsLeaves: bigint | number, expiration: bigint | number]\n 'accept(pay,uint64,byte[32][])void': [mbrPayment: AppMethodCallTransactionArgument, id: bigint | number, proof: Uint8Array[]]\n 'escrow(pay,uint64,address,uint64,byte[32][])void': [payment: AppMethodCallTransactionArgument, id: bigint | number, receiver: string, amount: bigint | number, proof: Uint8Array[]]\n 'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void': [mbrPayment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, id: bigint | number, receiver: string, asset: bigint | number, amount: bigint | number, proof: Uint8Array[]]\n 'disburse(uint64,uint64,address,uint64,uint64)void': [id: bigint | number, receiverWallet: bigint | number, receiver: string, asset: bigint | number, amount: bigint | number]\n 'cancel(uint64,byte[32][])void': [id: bigint | number, proof: Uint8Array[]]\n 'withdraw(uint64,address,uint64,uint64,byte[32][])void': [id: bigint | number, receiver: string, asset: bigint | number, amount: bigint | number, proof: Uint8Array[]]\n 'cleanupParticipant(uint64,address)void': [id: bigint | number, participant: string]\n 'cleanupOffer(uint64)void': [id: bigint | number]\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n 'update(string)void': [newVersion: string]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'mbr()(uint64,uint64,uint64,(uint64,uint64))': []\n }\n}\n\n/**\n * The return type for each method\n */\nexport type HyperSwapReturns = {\n 'create(string,uint64)void': void\n 'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void': void\n 'accept(pay,uint64,byte[32][])void': void\n 'escrow(pay,uint64,address,uint64,byte[32][])void': void\n 'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void': void\n 'disburse(uint64,uint64,address,uint64,uint64)void': void\n 'cancel(uint64,byte[32][])void': void\n 'withdraw(uint64,address,uint64,uint64,byte[32][])void': void\n 'cleanupParticipant(uint64,address)void': void\n 'cleanupOffer(uint64)void': void\n 'optIn(pay,uint64)void': void\n 'update(string)void': void\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'mbr()(uint64,uint64,uint64,(uint64,uint64))': HyperSwapMbrData\n}\n\n/**\n * Defines the types of available calls and state of the HyperSwap smart contract.\n */\nexport type HyperSwapTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,uint64)void' | 'create', {\n argsObj: HyperSwapArgs['obj']['create(string,uint64)void']\n argsTuple: HyperSwapArgs['tuple']['create(string,uint64)void']\n returns: HyperSwapReturns['create(string,uint64)void']\n }>\n & Record<'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void' | 'offer', {\n argsObj: HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']\n argsTuple: HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']\n returns: HyperSwapReturns['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']\n }>\n & Record<'accept(pay,uint64,byte[32][])void' | 'accept', {\n argsObj: HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']\n returns: HyperSwapReturns['accept(pay,uint64,byte[32][])void']\n }>\n & Record<'escrow(pay,uint64,address,uint64,byte[32][])void' | 'escrow', {\n argsObj: HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']\n returns: HyperSwapReturns['escrow(pay,uint64,address,uint64,byte[32][])void']\n }>\n & Record<'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void' | 'escrowAsa', {\n argsObj: HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']\n returns: HyperSwapReturns['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']\n }>\n & Record<'disburse(uint64,uint64,address,uint64,uint64)void' | 'disburse', {\n argsObj: HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void']\n argsTuple: HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']\n returns: HyperSwapReturns['disburse(uint64,uint64,address,uint64,uint64)void']\n }>\n & Record<'cancel(uint64,byte[32][])void' | 'cancel', {\n argsObj: HyperSwapArgs['obj']['cancel(uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']\n returns: HyperSwapReturns['cancel(uint64,byte[32][])void']\n }>\n & Record<'withdraw(uint64,address,uint64,uint64,byte[32][])void' | 'withdraw', {\n argsObj: HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void']\n argsTuple: HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']\n returns: HyperSwapReturns['withdraw(uint64,address,uint64,uint64,byte[32][])void']\n }>\n & Record<'cleanupParticipant(uint64,address)void' | 'cleanupParticipant', {\n argsObj: HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void']\n argsTuple: HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']\n returns: HyperSwapReturns['cleanupParticipant(uint64,address)void']\n }>\n & Record<'cleanupOffer(uint64)void' | 'cleanupOffer', {\n argsObj: HyperSwapArgs['obj']['cleanupOffer(uint64)void']\n argsTuple: HyperSwapArgs['tuple']['cleanupOffer(uint64)void']\n returns: HyperSwapReturns['cleanupOffer(uint64)void']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: HyperSwapArgs['obj']['optIn(pay,uint64)void']\n argsTuple: HyperSwapArgs['tuple']['optIn(pay,uint64)void']\n returns: HyperSwapReturns['optIn(pay,uint64)void']\n }>\n & Record<'update(string)void' | 'update', {\n argsObj: HyperSwapArgs['obj']['update(string)void']\n argsTuple: HyperSwapArgs['tuple']['update(string)void']\n returns: HyperSwapReturns['update(string)void']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: HyperSwapArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: HyperSwapReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: HyperSwapArgs['obj']['opUp()void']\n argsTuple: HyperSwapArgs['tuple']['opUp()void']\n returns: HyperSwapReturns['opUp()void']\n }>\n & Record<'mbr()(uint64,uint64,uint64,(uint64,uint64))' | 'mbr', {\n argsObj: HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))']\n argsTuple: HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']\n returns: HyperSwapReturns['mbr()(uint64,uint64,uint64,(uint64,uint64))']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * global counter for offers\n */\n offerCursor: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {}\n maps: {\n /**\n * map of hyper swap offers\n */\n offers: Map<bigint | number, OfferValue>\n /**\n * map of the participants in each swap\n */\n participants: Map<ParticipantKey, RefundValue>\n /**\n * map of merkle tree hashes during escrow & disbursal phases\n */\n hashes: Map<HashKey, RefundValue>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type HyperSwapSignatures = keyof HyperSwapTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type HyperSwapNonVoidMethodSignatures = keyof HyperSwapTypes['methods'] extends infer T ? T extends keyof HyperSwapTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the HyperSwap smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends HyperSwapSignatures> = HyperSwapTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the HyperSwap smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends HyperSwapSignatures> = HyperSwapTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = HyperSwapTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = HyperSwapTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type HyperSwapCreateCallParams =\n | Expand<CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & {method: 'create(string,uint64)void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines supported update method params for this smart contract\n */\nexport type HyperSwapUpdateCallParams =\n | Expand<CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & {method: 'update'}>\n | Expand<CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & {method: 'update(string)void'}>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type HyperSwapDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: HyperSwapCreateCallParams\n /**\n * Update transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n updateParams?: HyperSwapUpdateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the HyperSwap smart contract\n */\nexport abstract class HyperSwapParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends HyperSwapCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,uint64)void':\n return HyperSwapParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the HyperSwap smart contract using the create(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.akitaDao],\n }\n },\n }\n }\n\n /**\n * Gets available update ABI call param factories\n */\n static get update() {\n return {\n _resolveByMethod<TParams extends HyperSwapUpdateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'update':\n case 'update(string)void':\n return HyperSwapParamsFactory.update.update(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs update ABI call params for the HyperSwap smart contract using the update(string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n update(params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams): AppClientMethodCallParams & AppClientCompilationParams {\n return {\n ...params,\n method: 'update(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.newVersion],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the offer(pay,byte[32],uint64,byte[32],uint64,uint64)void ABI method\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static offer(params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'offer(pay,byte[32],uint64,byte[32],uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.root, params.args.leaves, params.args.participantsRoot, params.args.participantsLeaves, params.args.expiration],\n }\n }\n /**\n * Constructs a no op call for the accept(pay,uint64,byte[32][])void ABI method\n *\n * Accepts an offer\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static accept(params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'accept(pay,uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.id, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the escrow(pay,uint64,address,uint64,byte[32][])void ABI method\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static escrow(params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'escrow(pay,uint64,address,uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.id, params.args.receiver, params.args.amount, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void ABI method\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static escrowAsa(params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.assetXfer, params.args.id, params.args.receiver, params.args.asset, params.args.amount, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the disburse(uint64,uint64,address,uint64,uint64)void ABI method\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static disburse(params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'disburse(uint64,uint64,address,uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.receiverWallet, params.args.receiver, params.args.asset, params.args.amount],\n }\n }\n /**\n * Constructs a no op call for the cancel(uint64,byte[32][])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static cancel(params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'cancel(uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the withdraw(uint64,address,uint64,uint64,byte[32][])void ABI method\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static withdraw(params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'withdraw(uint64,address,uint64,uint64,byte[32][])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.receiver, params.args.asset, params.args.amount, params.args.proof],\n }\n }\n /**\n * Constructs a no op call for the cleanupParticipant(uint64,address)void ABI method\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static cleanupParticipant(params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'cleanupParticipant(uint64,address)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.participant],\n }\n }\n /**\n * Constructs a no op call for the cleanupOffer(uint64)void ABI method\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static cleanupOffer(params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'cleanupOffer(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the mbr()(uint64,uint64,uint64,(uint64,uint64)) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mbr(params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mbr()(uint64,uint64,uint64,(uint64,uint64))' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the HyperSwap smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class HyperSwapFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `HyperSwapFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new HyperSwapClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new HyperSwapClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the HyperSwap smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: HyperSwapDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? HyperSwapParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (HyperSwapCreateCallParams & { args: Uint8Array[] }) : undefined,\n updateParams: params.updateParams?.method ? HyperSwapParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams as (HyperSwapUpdateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new HyperSwapClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the HyperSwap smart contract using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.params.create(HyperSwapParamsFactory.create.create(params))\n },\n },\n\n /**\n * Gets available deployUpdate methods\n */\n deployUpdate: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the update(string)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The deployUpdate params\n */\n update: (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appFactory.params.deployUpdate(HyperSwapParamsFactory.update.update(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the HyperSwap smart contract using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appFactory.createTransaction.create(HyperSwapParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the HyperSwap smart contract using an ABI method call using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<HyperSwapArgs['obj']['create(string,uint64)void'] | HyperSwapArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appFactory.send.create(HyperSwapParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | HyperSwapReturns['create(string,uint64)void']) }, appClient: new HyperSwapClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the HyperSwap smart contract\n */\nexport class HyperSwapClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `HyperSwapClient`\n *\n * @param appClient An `AppClient` instance which has been created with the HyperSwap app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `HyperSwapClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Checks for decode errors on the given return value and maps the return value to the return type for the given method\n * @returns The typed return value or undefined if there was no value\n */\n decodeReturnValue<TSignature extends HyperSwapNonVoidMethodSignatures>(method: TSignature, returnValue: ABIReturn | undefined) {\n return returnValue !== undefined ? getArc56ReturnValue<MethodReturn<TSignature>>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined\n }\n\n /**\n * Returns a new `HyperSwapClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<HyperSwapClient> {\n return new HyperSwapClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `HyperSwapClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<HyperSwapClient> {\n return new HyperSwapClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update params\n */\n update: (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.params.update(HyperSwapParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the HyperSwap smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `offer(pay,byte[32],uint64,byte[32],uint64,uint64)void` ABI method.\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n offer: (params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.offer(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `accept(pay,uint64,byte[32][])void` ABI method.\n *\n * Accepts an offer\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n accept: (params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.accept(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrow(pay,uint64,address,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n escrow: (params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.escrow(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n escrowAsa: (params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.escrowAsa(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `disburse(uint64,uint64,address,uint64,uint64)void` ABI method.\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n disburse: (params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.disburse(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cancel(uint64,byte[32][])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n cancel: (params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.cancel(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `withdraw(uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n withdraw: (params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.withdraw(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupParticipant(uint64,address)void` ABI method.\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n cleanupParticipant: (params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.cleanupParticipant(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupOffer(uint64)void` ABI method.\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n cleanupOffer: (params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.cleanupOffer(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `mbr()(uint64,uint64,uint64,(uint64,uint64))` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n mbr: (params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.params.call(HyperSwapParamsFactory.mbr(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update transaction\n */\n update: (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n return this.appClient.createTransaction.update(HyperSwapParamsFactory.update.update(params))\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the HyperSwap smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `offer(pay,byte[32],uint64,byte[32],uint64,uint64)void` ABI method.\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n offer: (params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.offer(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `accept(pay,uint64,byte[32][])void` ABI method.\n *\n * Accepts an offer\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n accept: (params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.accept(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrow(pay,uint64,address,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n escrow: (params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.escrow(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n escrowAsa: (params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.escrowAsa(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `disburse(uint64,uint64,address,uint64,uint64)void` ABI method.\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n disburse: (params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.disburse(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cancel(uint64,byte[32][])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n cancel: (params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.cancel(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `withdraw(uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n withdraw: (params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.withdraw(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupParticipant(uint64,address)void` ABI method.\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n cleanupParticipant: (params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.cleanupParticipant(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupOffer(uint64)void` ABI method.\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n cleanupOffer: (params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.cleanupOffer(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.optIn(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `mbr()(uint64,uint64,uint64,(uint64,uint64))` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n mbr: (params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appClient.createTransaction.call(HyperSwapParamsFactory.mbr(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available update methods\n */\n update: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the `update(string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The update result\n */\n update: async (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams & SendParams) => {\n const result = await this.appClient.send.update(HyperSwapParamsFactory.update.update(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['update(string)void'])}\n },\n\n },\n\n /**\n * Makes a clear_state call to an existing instance of the HyperSwap smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `offer(pay,byte[32],uint64,byte[32],uint64,uint64)void` ABI method.\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n offer: async (params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.offer(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `accept(pay,uint64,byte[32][])void` ABI method.\n *\n * Accepts an offer\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n accept: async (params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.accept(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['accept(pay,uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrow(pay,uint64,address,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n escrow: async (params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.escrow(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['escrow(pay,uint64,address,uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n escrowAsa: async (params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.escrowAsa(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `disburse(uint64,uint64,address,uint64,uint64)void` ABI method.\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n disburse: async (params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.disburse(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['disburse(uint64,uint64,address,uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cancel(uint64,byte[32][])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n cancel: async (params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.cancel(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['cancel(uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `withdraw(uint64,address,uint64,uint64,byte[32][])void` ABI method.\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n withdraw: async (params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.withdraw(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['withdraw(uint64,address,uint64,uint64,byte[32][])void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupParticipant(uint64,address)void` ABI method.\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n cleanupParticipant: async (params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.cleanupParticipant(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['cleanupParticipant(uint64,address)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `cleanupOffer(uint64)void` ABI method.\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n cleanupOffer: async (params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.cleanupOffer(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['cleanupOffer(uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['optIn(pay,uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the HyperSwap smart contract using the `mbr()(uint64,uint64,uint64,(uint64,uint64))` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n mbr: async (params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.mbr(params))\n return {...result, return: result.return as unknown as (undefined | HyperSwapReturns['mbr()(uint64,uint64,uint64,(uint64,uint64))'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new HyperSwapClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the HyperSwap smart contract using the `mbr()(uint64,uint64,uint64,(uint64,uint64))` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async mbr(params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> = {args: []}) {\n const result = await this.appClient.send.call(HyperSwapParamsFactory.mbr(params))\n return result.return as unknown as HyperSwapReturns['mbr()(uint64,uint64,uint64,(uint64,uint64))']\n }\n\n /**\n * Methods to access state for the current HyperSwap app\n */\n state = {\n /**\n * Methods to access global state for the current HyperSwap app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n offerCursor: result.offerCursor,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the offerCursor key in global state\n */\n offerCursor: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"offerCursor\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current HyperSwap app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n }\n },\n /**\n * Get values from the offers map in box state\n */\n offers: {\n /**\n * Get all current values of the offers map in box state\n */\n getMap: async (): Promise<Map<bigint, OfferValue>> => { return (await this.appClient.state.box.getMap(\"offers\")) as Map<bigint, OfferValue> },\n /**\n * Get a current value of the offers map by key from box state\n */\n value: async (key: bigint | number): Promise<OfferValue | undefined> => { return await this.appClient.state.box.getMapValue(\"offers\", key) as OfferValue | undefined },\n },\n /**\n * Get values from the participants map in box state\n */\n participants: {\n /**\n * Get all current values of the participants map in box state\n */\n getMap: async (): Promise<Map<ParticipantKey, RefundValue>> => { return (await this.appClient.state.box.getMap(\"participants\")) as Map<ParticipantKey, RefundValue> },\n /**\n * Get a current value of the participants map by key from box state\n */\n value: async (key: ParticipantKey): Promise<RefundValue | undefined> => { return await this.appClient.state.box.getMapValue(\"participants\", key) as RefundValue | undefined },\n },\n /**\n * Get values from the hashes map in box state\n */\n hashes: {\n /**\n * Get all current values of the hashes map in box state\n */\n getMap: async (): Promise<Map<HashKey, RefundValue>> => { return (await this.appClient.state.box.getMap(\"hashes\")) as Map<HashKey, RefundValue> },\n /**\n * Get a current value of the hashes map by key from box state\n */\n value: async (key: HashKey): Promise<RefundValue | undefined> => { return await this.appClient.state.box.getMapValue(\"hashes\", key) as RefundValue | undefined },\n },\n },\n }\n\n public newGroup(): HyperSwapComposer {\n const client = this\n const composer = this.algorand.newGroup()\n let promiseChain:Promise<unknown> = Promise.resolve()\n const resultMappers: Array<undefined | ((x: ABIReturn | undefined) => any)> = []\n return {\n /**\n * Add a offer(pay,byte[32],uint64,byte[32],uint64,uint64)void method call against the HyperSwap contract\n */\n offer(params: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.offer(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a accept(pay,uint64,byte[32][])void method call against the HyperSwap contract\n */\n accept(params: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.accept(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a escrow(pay,uint64,address,uint64,byte[32][])void method call against the HyperSwap contract\n */\n escrow(params: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.escrow(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void method call against the HyperSwap contract\n */\n escrowAsa(params: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.escrowAsa(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a disburse(uint64,uint64,address,uint64,uint64)void method call against the HyperSwap contract\n */\n disburse(params: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.disburse(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a cancel(uint64,byte[32][])void method call against the HyperSwap contract\n */\n cancel(params: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.cancel(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a withdraw(uint64,address,uint64,uint64,byte[32][])void method call against the HyperSwap contract\n */\n withdraw(params: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdraw(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a cleanupParticipant(uint64,address)void method call against the HyperSwap contract\n */\n cleanupParticipant(params: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.cleanupParticipant(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a cleanupOffer(uint64)void method call against the HyperSwap contract\n */\n cleanupOffer(params: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.cleanupOffer(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the HyperSwap contract\n */\n optIn(params: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the HyperSwap contract\n */\n updateAkitaDao(params: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a opUp()void method call against the HyperSwap contract\n */\n opUp(params: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a mbr()(uint64,uint64,uint64,(uint64,uint64)) method call against the HyperSwap contract\n */\n mbr(params: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mbr(params)))\n resultMappers.push((v) => client.decodeReturnValue('mbr()(uint64,uint64,uint64,(uint64,uint64))', v))\n return this\n },\n get update() {\n return {\n update: (params: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']> & AppClientCompilationParams) => {\n promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)))\n resultMappers.push(undefined)\n return this\n },\n }\n },\n /**\n * Add a clear state call to the HyperSwap contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n }\n } as unknown as HyperSwapComposer\n }\n}\nexport type HyperSwapComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the offer(pay,byte[32],uint64,byte[32],uint64,uint64)void ABI method.\n *\n * Creates a merkle tree based atomic payment/xfer group\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n offer(params?: CallParams<HyperSwapArgs['obj']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | HyperSwapArgs['tuple']['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the accept(pay,uint64,byte[32][])void ABI method.\n *\n * Accepts an offer\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n accept(params?: CallParams<HyperSwapArgs['obj']['accept(pay,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['accept(pay,uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['accept(pay,uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the escrow(pay,uint64,address,uint64,byte[32][])void ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n escrow(params?: CallParams<HyperSwapArgs['obj']['escrow(pay,uint64,address,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrow(pay,uint64,address,uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['escrow(pay,uint64,address,uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void ABI method.\n *\n * Escrows the assets in the trade for a given leaf in the tree\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n escrowAsa(params?: CallParams<HyperSwapArgs['obj']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['escrowAsa(pay,axfer,uint64,address,uint64,uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the disburse(uint64,uint64,address,uint64,uint64)void ABI method.\n *\n * Disburses assets for a leaf in the tree, ensuring ordered processing\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n disburse(params?: CallParams<HyperSwapArgs['obj']['disburse(uint64,uint64,address,uint64,uint64)void'] | HyperSwapArgs['tuple']['disburse(uint64,uint64,address,uint64,uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['disburse(uint64,uint64,address,uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the cancel(uint64,byte[32][])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n cancel(params?: CallParams<HyperSwapArgs['obj']['cancel(uint64,byte[32][])void'] | HyperSwapArgs['tuple']['cancel(uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['cancel(uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the withdraw(uint64,address,uint64,uint64,byte[32][])void ABI method.\n *\n * Withdraws your assets from a cancelled swap if they're escrowed\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n withdraw(params?: CallParams<HyperSwapArgs['obj']['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | HyperSwapArgs['tuple']['withdraw(uint64,address,uint64,uint64,byte[32][])void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['withdraw(uint64,address,uint64,uint64,byte[32][])void'] | undefined]>\n\n /**\n * Calls the cleanupParticipant(uint64,address)void ABI method.\n *\n * Cleans up participant box and refunds MBR\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n cleanupParticipant(params?: CallParams<HyperSwapArgs['obj']['cleanupParticipant(uint64,address)void'] | HyperSwapArgs['tuple']['cleanupParticipant(uint64,address)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['cleanupParticipant(uint64,address)void'] | undefined]>\n\n /**\n * Calls the cleanupOffer(uint64)void ABI method.\n *\n * Cleans up the offer box after all participants have been cleaned up\n Can only be called when offer is completed, cancelled+completed, or expired\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n cleanupOffer(params?: CallParams<HyperSwapArgs['obj']['cleanupOffer(uint64)void'] | HyperSwapArgs['tuple']['cleanupOffer(uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['cleanupOffer(uint64)void'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<HyperSwapArgs['obj']['optIn(pay,uint64)void'] | HyperSwapArgs['tuple']['optIn(pay,uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<HyperSwapArgs['obj']['updateAkitaDAO(uint64)void'] | HyperSwapArgs['tuple']['updateAkitaDAO(uint64)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<HyperSwapArgs['obj']['opUp()void'] | HyperSwapArgs['tuple']['opUp()void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['opUp()void'] | undefined]>\n\n /**\n * Calls the mbr()(uint64,uint64,uint64,(uint64,uint64)) ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n mbr(params?: CallParams<HyperSwapArgs['obj']['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | HyperSwapArgs['tuple']['mbr()(uint64,uint64,uint64,(uint64,uint64))']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['mbr()(uint64,uint64,uint64,(uint64,uint64))'] | undefined]>\n\n /**\n * Gets available update methods\n */\n readonly update: {\n /**\n * Updates an existing instance of the HyperSwap smart contract using the update(string)void ABI method.\n *\n * @param args The arguments for the smart contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n update(params?: CallParams<HyperSwapArgs['obj']['update(string)void'] | HyperSwapArgs['tuple']['update(string)void']>): HyperSwapComposer<[...TReturns, HyperSwapReturns['update(string)void'] | undefined]>\n }\n\n /**\n * Makes a clear_state call to an existing instance of the HyperSwap smart contract.\n *\n * @param args The arguments for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): HyperSwapComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): HyperSwapComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<HyperSwapComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<HyperSwapComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<HyperSwapComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<HyperSwapComposerResults<TReturns>>\n}\nexport type HyperSwapComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { MaybeSigner } from \"../types\";\nimport {\n HyperSwapArgs,\n} from '../generated/HyperSwapClient';\n\n// HyperSwap Types\ntype ContractArgs = HyperSwapArgs[\"obj\"];\n\nexport type OfferParams = MaybeSigner & Omit<\n ContractArgs['offer(pay,byte[32],uint64,byte[32],uint64,uint64)void'],\n 'payment'\n>;\n\nexport type AcceptParams = MaybeSigner & Omit<\n ContractArgs['accept(pay,uint64,byte[32][])void'],\n 'mbrPayment'\n>;\n\ntype BaseEscrowParams = MaybeSigner & {\n /** The offer ID */\n id: bigint | number;\n /** The receiver address */\n receiver: string;\n /** The amount to escrow */\n amount: bigint | number;\n /** Merkle proof */\n proof: Uint8Array[];\n};\n\nexport type EscrowParams = BaseEscrowParams & (\n | {\n /** Whether escrowing ASA (true) or ALGO (false/undefined) */\n isAsa?: false;\n }\n | {\n /** Whether escrowing ASA (true) or ALGO (false/undefined) */\n isAsa: true;\n /** The asset ID to escrow (required when isAsa is true) */\n asset: bigint | number;\n }\n);\n\nexport type DisburseParams = MaybeSigner & ContractArgs['disburse(uint64,uint64,address,uint64,uint64)void'];\n\nexport type CancelParams = MaybeSigner & ContractArgs['cancel(uint64,byte[32][])void'];\n\nexport type WithdrawParams = MaybeSigner & ContractArgs['withdraw(uint64,address,uint64,uint64,byte[32][])void'];\n\nexport type OptInParams = MaybeSigner & Omit<\n ContractArgs['optIn(pay,uint64)void'],\n 'payment'\n>;\n\nexport type GetOfferParams = {\n id: bigint | number;\n};\n\n// Offer states\nexport enum OfferState {\n Offered = 10,\n Escrowing = 20,\n Disbursing = 30,\n Completed = 40,\n Cancelled = 50,\n CancelCompleted = 60,\n}\n\nexport type OfferValue = {\n state: number;\n root: Uint8Array;\n leaves: bigint;\n escrowed: bigint;\n participantsRoot: Uint8Array;\n participantsLeaves: bigint;\n acceptances: bigint;\n expiration: bigint;\n};\n\nexport type HyperSwapMbrData = {\n offers: bigint;\n participants: bigint;\n hashes: bigint;\n mm: {\n root: bigint;\n data: bigint;\n };\n};\n\n"]}
|