@pyron-finance/pyron-client 2.5.3 → 2.7.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/bank-metadata-X4_5k9-u.d.cts +9488 -0
- package/dist/bank-metadata-X4_5k9-u.d.ts +9488 -0
- package/dist/common/index.cjs +1255 -68
- package/dist/common/index.d.cts +296 -2
- package/dist/common/index.d.ts +296 -2
- package/dist/common/index.js +1159 -2
- package/dist/index.cjs +27328 -25577
- package/dist/index.d.cts +3154 -12384
- package/dist/index.d.ts +3151 -12380
- package/dist/index.js +27160 -25337
- package/package.json +9 -7
- package/dist/chunk-DcLnE9XY.js +0 -37
- package/dist/common/index-BpWkZ1Nx.d.ts +0 -2
- package/dist/common/index-Cog_oDCj.d.cts +0 -2
- package/dist/common-DBVYOab7.cjs +0 -1954
- package/dist/common-IgVl6MYx.js +0 -1222
- package/dist/common-IgVl6MYx.js.map +0 -1
- package/dist/index-3HKqH7ts.d.ts +0 -2
- package/dist/index-Csp-53bZ.d.ts +0 -12674
- package/dist/index-Csp-53bZ.d.ts.map +0 -1
- package/dist/index-D1cmbuoh.d.cts +0 -12675
- package/dist/index-D1cmbuoh.d.cts.map +0 -1
- package/dist/index-DDauQZBg.d.cts +0 -2
- package/dist/index.js.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["bankAccountsData","z","umiPublicKey","metadata","z","meta","LENDR_IDL_JSON","log","accounts","makePoolConfigureBankIx","BN","makePoolAddBankIx","makePulseHealthIx","instructions","BN","parsePriceInfo","AccountType","borsh","capConfidenceInterval","instructions","STAKE_CONFIG_ID","accounts","publicKey","BN","BN","AggregatorResolutionMode.layout","AggregatorResolutionMode.fromDecoded","SWB_ONDEMAND_IDL","address","BN","SECONDS_PER_DAY","BN","instructions","MAX_TX_SIZE","BUNDLE_TX_SIZE","PRIORITY_TX_SIZE","assets","liabilities","bank","accounts","address","BN","bank","BN","instructions","BN","instructions","BN","publicKey","accounts","address","address","address","priceLowestBias","instructions","accounts","findPoolAddress","findPoolStakeAddress","findPoolMintAddress","BN","txSize","txToBig","instructions","LendrClient","address","address","address","metadata","parsePriceInfo","tokenSupply","stakeActual","adjustPriceComponent","accounts","instructions"],"sources":["../src/logger.ts","../src/services/data-fetcher.ts","../src/services/metadata/dummy.ts","../src/services/metadata/metaplex.ts","../src/services/metadata/service.ts","../src/services/metadata/fogo.ts","../src/config.ts","../src/idl/lendr_0.1.6.json","../src/idl/index.ts","../src/errors.ts","../src/idl/idl.utils.ts","../src/instructions.ts","../src/models/health-cache.ts","../src/services/bank/types/bank.types.ts","../src/types.ts","../src/services/bank/utils/deserialize.utils.ts","../src/vendor/pyth_legacy/readBig.ts","../src/vendor/pyth_legacy/index.ts","../src/vendor/pyth_push_oracle/index.ts","../src/vendor/rpc-get-stake/index.ts","../src/vendor/single-spl-pool/index.ts","../src/vendor/switchboard_legacy/account.ts","../src/vendor/switchboard_legacy/aggregatorAccount.ts","../src/vendor/switchboard_legacy/AggregatorResolutionMode.ts","../src/vendor/switchboard_legacy/switchboardDecimal.ts","../src/vendor/switchboard_legacy/aggregatorRound.ts","../src/vendor/switchboard_legacy/Hash.ts","../src/vendor/switchboard_legacy/aggregatorAccountData.ts","../src/vendor/switchboard_pull/idl.json","../src/vendor/switchboard_pull/index.ts","../src/vendor/index.ts","../src/utils.ts","../src/vendor/pyth_crank/idl/pyth_push_oracle.ts","../src/vendor/pyth_crank/idl/pyth_wormhole.ts","../src/vendor/pyth_crank/idl/receiver_program.ts","../src/vendor/pyth_crank/pyth.consts.ts","../src/vendor/pyth_crank/pyth.utils.ts","../src/services/price/types/price.types.ts","../src/services/price/utils/compute.utils.ts","../src/services/price/utils/deserialize.utils.ts","../src/services/price/utils/fetch.utils.ts","../src/services/price/utils/serialize.utils.ts","../src/services/bank/utils/compute.utils.ts","../src/services/bank/utils/fetch.utils.ts","../src/services/bank/utils/serialize.utils.ts","../src/services/bank/bank.service.ts","../src/services/transaction/helpers/bundle-sending.ts","../src/services/transaction/helpers/bundle-simulation.ts","../src/services/transaction/transaction.service.ts","../src/services/transaction/helpers/rpc-sending.ts","../src/services/transaction/helpers/tx-formatting.ts","../src/services/account/utils/compute.utils.ts","../src/models/balance.ts","../src/services/account/types/account.types.ts","../src/services/account/utils/deserialize.utils.ts","../src/services/account/utils/emode.utils.ts","../src/services/account/utils/fetch.utils.ts","../src/services/account/utils/serialize.utils.ts","../src/services/account/account.service.ts","../src/services/group/group.service.ts","../src/services/group/utils/deserialize.utils.ts","../src/services/group/utils/serialize.utils.ts","../src/services/native-stake/utils/deserialize.utils.ts","../src/services/native-stake/utils/fetch.utils.ts","../src/services/native-stake/utils/serialize.utils.ts","../src/models/bank.ts","../src/models/account/pure.ts","../src/models/account/wrapper.ts","../src/models/group.ts","../src/clients/client.ts","../src/models/emode-settings.ts","../src/index.ts"],"sourcesContent":["import type { TLogger } from \"@/types\";\n\nexport class NoopLogger implements TLogger {\n info() {}\n error() {}\n warn() {}\n debug() {}\n}\n","import type { Commitment, PublicKey } from \"@solana/web3.js\";\nimport type { LendrProgram, TLogger } from \"@/types\";\nimport type { BankRaw } from \"./bank\";\n\nexport interface FetchRawBanksArgs {\n program: LendrProgram;\n groupAddress: PublicKey;\n logger: TLogger;\n bankAddresses?: Array<PublicKey>;\n commitment?: Commitment;\n}\n\nexport class DataFetcher {\n async fetchRawBanks({ program, groupAddress, logger, bankAddresses, commitment }: FetchRawBanksArgs) {\n if (!bankAddresses || bankAddresses.length === 0) {\n logger.debug({}, \"[data-fetcher:rawBanks] no bank addresses provided, fetching all\");\n const bankAccountsData = await program.account.bank.all([\n { memcmp: { offset: 8 + 32 + 1, bytes: groupAddress.toBase58() } },\n ]);\n return bankAccountsData.map((account) => ({\n address: account.publicKey,\n data: account.account as BankRaw,\n }));\n }\n\n logger.debug(\n { banksLength: bankAddresses.length },\n \"[data-fetcher:rawBanks] Using preloaded bank addresses, skipping gpa call\",\n );\n\n const bankAccountsData = await program.account.bank.fetchMultiple(bankAddresses, commitment);\n\n const banksRawData: Array<{ address: PublicKey; data: BankRaw }> = [];\n for (let i = 0; i < bankAccountsData.length; i++) {\n if (bankAccountsData[i] === null) {\n continue;\n }\n\n banksRawData.push({\n address: bankAddresses[i],\n data: bankAccountsData[i] as unknown as BankRaw,\n });\n }\n\n return banksRawData;\n }\n}\n","import { shortenAddress } from \"@/common\";\nimport type { IMetadataFetcher, TMetadata } from \".\";\n\nexport class DummyMetadataFetcher implements IMetadataFetcher {\n readonly name = \"DummyMetadataFetcher\";\n\n async fetch(mints: Array<string>) {\n return mints.reduce(\n (prev, mint) => {\n prev[mint] = {\n name: shortenAddress(mint),\n symbol: mint.slice(0, 4),\n image: \"\",\n };\n return prev;\n },\n {} as Record<string, TMetadata>,\n );\n }\n}\n","import {\n findMetadataPda,\n type Metadata,\n mplTokenMetadata,\n safeFetchAllMetadata,\n} from \"@metaplex-foundation/mpl-token-metadata\";\nimport type { Umi } from \"@metaplex-foundation/umi\";\nimport { publicKey as umiPublicKey } from \"@metaplex-foundation/umi\";\nimport { createUmi } from \"@metaplex-foundation/umi-bundle-defaults\";\nimport * as z from \"zod/v4-mini\";\nimport type { IMetadataFetcher, TMetadata } from \"./service\";\n\nconst imageEndpointSchema = z.object({\n image: z.string(),\n});\n\nexport class MetaplexMetadataFetcher implements IMetadataFetcher {\n readonly name = \"MetaplexMetadataFetcher\";\n private readonly _umi: Umi;\n\n constructor(rpcEndpoint: string) {\n this._umi = createUmi(rpcEndpoint).use(mplTokenMetadata());\n }\n\n async fetch(mints: Array<string>) {\n const pdaList = mints.map((mint) => findMetadataPda(this._umi, { mint: umiPublicKey(mint) }));\n const fetched = await safeFetchAllMetadata(this._umi, pdaList);\n const metas = await Promise.all(\n fetched.map(async (meta) => {\n return {\n mint: meta.mint,\n data: {\n name: meta.name,\n symbol: meta.symbol,\n image: await this._getImage(meta),\n uri: meta.uri,\n },\n };\n }),\n );\n\n const result: Record<string, TMetadata> = {};\n for (const { mint, data } of metas) {\n result[mint] = data;\n }\n\n return result;\n }\n\n private async _getImage(metadata: Metadata) {\n try {\n const result = await fetch(metadata.uri).then((r) => r.json());\n const parsed = await imageEndpointSchema.parseAsync(result);\n return parsed.image;\n } catch (_) {\n return \"\";\n }\n }\n}\n","import type { PublicKey } from \"@solana/web3.js\";\nimport { prefixStorage, type Storage } from \"unstorage\";\nimport * as z from \"zod/v4-mini\";\nimport type { BanksExtendedMetadataOverrideMap } from \"@/common\";\nimport type { TLogger } from \"@/types\";\n\nexport const metadataSchema = z.object({\n name: z.string(),\n symbol: z.string(),\n image: z.string(),\n uri: z.optional(z.string()),\n});\nexport type TMetadata = z.infer<typeof metadataSchema>;\n\nexport interface IMetadataFetcher {\n readonly name: string;\n fetch(mints: Array<string>): Promise<Record<string, TMetadata>>;\n}\n\nexport interface MetadataServiceProps {\n storage: Storage;\n fetchers: Array<IMetadataFetcher>;\n logger: TLogger;\n overrides?: BanksExtendedMetadataOverrideMap;\n}\n\nexport class MetadataService {\n /** NOTE: record key is base58 of mint public key */\n readonly overrides: BanksExtendedMetadataOverrideMap;\n private _storage: Storage<TMetadata>;\n private readonly _fetchers: Array<IMetadataFetcher>;\n private _logger: TLogger;\n\n constructor({ storage, logger, fetchers, overrides }: MetadataServiceProps) {\n this._storage = prefixStorage<TMetadata>(storage, \"banks:metadata\");\n this.overrides = overrides ?? {};\n this._fetchers = fetchers;\n this._logger = logger;\n }\n\n public async forMints(mints: Array<PublicKey>) {\n if (mints.length === 0) return {};\n\n const cached: Record<string, TMetadata> = {};\n const toFetch: Array<string> = [];\n\n for (const mint of mints) {\n const mintStr = mint.toBase58();\n const found = await this._storage.get(mintStr);\n if (found) {\n cached[mintStr] = found;\n } else {\n toFetch.push(mintStr);\n }\n }\n\n const fetched = await this._fetch(toFetch);\n const metas: Record<string, TMetadata> = {};\n for (const key in fetched) {\n const override = this.overrides[key];\n const meta = {\n name: override?.name ?? fetched[key].name,\n symbol: override?.symbol ?? fetched[key].symbol,\n image: override?.logoURI ?? fetched[key].image,\n uri: fetched[key].uri,\n };\n metas[key] = meta;\n await this._storage.set(key, meta);\n }\n\n return { ...metas, ...cached };\n }\n\n public async forMint(mint: PublicKey) {\n const mintStr = mint.toBase58();\n const found = await this._storage.get(mintStr);\n if (found) {\n return found;\n }\n\n const meta = await this._fetch([mintStr]).then((meta) => meta[mintStr]);\n const override = this.overrides[mintStr];\n\n await this._storage.set(mintStr, {\n name: override?.name ?? meta.name,\n symbol: override?.symbol ?? meta.symbol,\n image: override?.logoURI ?? meta.image,\n });\n return meta;\n }\n\n async _fetch(mints: Array<string>) {\n const meta: Record<string, TMetadata> = {};\n let remaining = [...mints];\n\n for (const fetcher of this._fetchers) {\n if (remaining.length === 0) break;\n\n try {\n const fetched = await fetcher.fetch(remaining);\n for (const key in fetched) {\n meta[key] = fetched[key];\n }\n remaining = remaining.filter((key) => !Object.hasOwn(fetched, key));\n } catch (err) {\n this._logger.debug({ err, remaining, mints, fetcher: fetcher.name }, \"failed to fetch metadata\");\n }\n }\n\n if (remaining.length > 0) {\n this._logger.warn({ remaining, mints }, \"failed to fetch metadata for some mints\");\n }\n\n return meta;\n }\n}\n","import { z } from \"zod/v4-mini\";\nimport { type IMetadataFetcher, metadataSchema } from \"@/services/metadata\";\n\nconst endpointSchema = z.record(z.string(), metadataSchema);\n\nexport type FogoNetworks = \"mainnet\" | \"testnet\";\n\nexport class FogoMetadataFetcher implements IMetadataFetcher {\n readonly name = \"FogoMetadataFetcher\";\n\n constructor(public network: FogoNetworks = \"mainnet\") {}\n\n async fetch(mints: Array<string>) {\n if (mints.length === 0) {\n return {};\n }\n\n const url = new URL(\"https://api.fogo.io/api/token-metadata\");\n for (const mint of mints) {\n url.searchParams.append(\"mint[]\", mint);\n }\n url.searchParams.append(\"network\", this.network);\n\n const result = await fetch(url).then((r) => r.json());\n return await endpointSchema.parseAsync(result);\n }\n}\n","import { DEFAULT_CLUSTER, GROUP_PK, PROGRAM_ID } from \"@/constants\";\nimport type { Environment, LendrConfig } from \"./types\";\n\nexport function getConfig({\n environment = \"production\",\n overrides,\n}: {\n environment?: Environment;\n overrides?: Partial<Omit<LendrConfig, \"environment\">>;\n} = {}): LendrConfig {\n return {\n environment,\n cluster: overrides?.cluster ?? DEFAULT_CLUSTER,\n programId: overrides?.programId ?? PROGRAM_ID,\n groupPk: overrides?.groupPk ?? GROUP_PK,\n };\n}\n","","import type { Lendr as LendrIdlTypeV0_1_3 } from \"./lendr_0.1.6\";\nimport LENDR_IDL_JSON from \"./lendr_0.1.6.json\";\n\nexport const LENDR_IDL = LENDR_IDL_JSON as LendrIdlType;\nexport type LendrIdlType = LendrIdlTypeV0_1_3;\n","import { LangErrorMessage } from \"@coral-xyz/anchor\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport type { PublicKey } from \"@solana/web3.js\";\nimport { JUPITER_V6_PROGRAM } from \"@/constants\";\nimport type { SolanaTransaction } from \"./common\";\nimport { LENDR_IDL } from \"./idl\";\n\nexport enum ProcessTransactionErrorType {\n TransactionBuildingError,\n TransactionSendingError,\n SimulationError,\n TransactionTupleError,\n\n FallthroughError,\n TimeoutError,\n}\n\nexport class ProcessTransactionError extends Error {\n logs?: string[];\n type: ProcessTransactionErrorType;\n programId?: string;\n failedTxs?: SolanaTransaction[];\n _error?: Error;\n\n constructor({\n message,\n type,\n logs,\n programId,\n code: _code,\n failedTxs,\n _error,\n }: {\n message: string;\n type: ProcessTransactionErrorType;\n logs?: string[];\n programId?: string;\n code?: number;\n failedTxs?: SolanaTransaction[];\n _error?: Error;\n }) {\n super(message);\n this.programId = programId;\n this.type = type;\n this.logs = logs;\n this.failedTxs = failedTxs;\n this._error = _error;\n }\n\n static withFailedTransactions(\n error: ProcessTransactionError,\n failedTxs: SolanaTransaction[],\n ): ProcessTransactionError {\n return new ProcessTransactionError({\n message: error.message,\n type: error.type,\n logs: error.logs,\n programId: error.programId,\n failedTxs: failedTxs,\n _error: error,\n });\n }\n}\n\nexport interface ProgramError {\n programId: string;\n code: number;\n}\n\nexport interface ProgramErrorWithDescription extends ProgramError {\n description: string;\n}\n\nconst LDR_ERROR_CODE_MAP: Map<number, string> = new Map(LENDR_IDL.errors.map((error) => [error.code, error.msg]));\n\nexport function parseTransactionError(error: any, ldrProgramId: PublicKey) {\n const logs = error?.logs;\n const name = error?.name;\n let message = error?.transactionMessage ?? error?.message ?? error?.err;\n let programId = error?.programId;\n let code = error?.code;\n\n if (message) {\n message = message.replace(/\\\\\"/g, '\"').replace(/^\"|\"$/g, \"\");\n } else if (error?.error) {\n message = error.error.replace(/\\\\\"/g, '\"').replace(/^\"|\"$/g, \"\");\n }\n\n if (logs) {\n const parsedError = parseErrorFromLogs(logs, ldrProgramId);\n if (parsedError) {\n message = parsedError.description;\n programId = parsedError.programId;\n code = parsedError.code;\n }\n }\n\n return {\n programId: programId,\n type: name,\n description: message,\n code: code,\n };\n}\n\nexport function parseErrorFromLogs(logs: string[], ldrProgramId: PublicKey): ProgramErrorWithDescription | null {\n const customError = parseCustomProgramError(logs, ldrProgramId);\n if (customError) return customError;\n\n return null;\n}\n\nfunction parseCustomProgramError(logs: string[], ldrProgramId: PublicKey): ProgramErrorWithDescription | null {\n const error = parseCustomProgramErrorFromLogs(logs);\n if (error === null) {\n return null;\n }\n\n let errorMsg: string | undefined;\n\n if (error.programId === ldrProgramId.toBase58()) {\n const ldrError = LDR_ERROR_CODE_MAP.get(error.code);\n if (ldrError !== undefined) {\n return { code: error.code, programId: error.programId, description: ldrError };\n }\n }\n\n const programErrors = ERROR_CODE_MAPS.get(error.programId);\n if (programErrors !== undefined) {\n errorMsg = programErrors.get(error.code);\n if (errorMsg !== undefined) {\n return { code: error.code, programId: error.programId, description: errorMsg };\n }\n }\n\n errorMsg = LangErrorMessage.get(error.code);\n if (errorMsg !== undefined) {\n return { code: error.code, programId: error.programId, description: errorMsg };\n }\n\n return null;\n}\n\nfunction parseCustomProgramErrorFromLogs(logs: string[]): ProgramError | null {\n const log = logs.find((log) => log.includes(\"failed: custom program error\"));\n if (!log) return null;\n const regex = /^Program (?<program>\\S+) failed: custom program error: (?<code>0x[0-9a-fA-F]+)/g;\n const match = regex.exec(log);\n if (!match?.groups) return null;\n const code = parseInt(match.groups.code, 16);\n return { programId: match.groups.program, code };\n}\n\nenum TokenErrorCode {\n NotRentExempt = 0,\n InsufficientFunds = 1,\n InvalidMint = 2,\n MintMismatch = 3,\n OwnerMismatch = 4,\n FixedSupply = 5,\n AlreadyInUse = 6,\n InvalidNumberOfProvidedSigners = 7,\n InvalidNumberOfRequiredSigners = 8,\n UninitializedState = 9,\n NativeNotSupported = 10,\n NonNativeHasBalance = 11,\n InvalidInstruction = 12,\n InvalidState = 13,\n Overflow = 14,\n AuthorityTypeNotSupported = 15,\n MintCannotFreeze = 16,\n AccountFrozen = 17,\n MintDecimalsMismatch = 18,\n NonNativeNotSupported = 19,\n}\n\nconst TokenErrorCodeMap: Map<number, string> = new Map([\n [TokenErrorCode.NotRentExempt, \"Lamport balance below rent-exempt threshold\"],\n [TokenErrorCode.InsufficientFunds, \"Insufficient funds\"],\n [TokenErrorCode.InvalidMint, \"Invalid Mint\"],\n [TokenErrorCode.MintMismatch, \"Account not associated with this Mint\"],\n [TokenErrorCode.OwnerMismatch, \"Owner does not match\"],\n [TokenErrorCode.FixedSupply, \"This token's supply is fixed and new tokens cannot be minted\"],\n [TokenErrorCode.AlreadyInUse, \"The account cannot be initialized because it is already being used\"],\n [TokenErrorCode.InvalidNumberOfProvidedSigners, \"Invalid number of provided signers\"],\n [TokenErrorCode.InvalidNumberOfRequiredSigners, \"Invalid number of required signers\"],\n [TokenErrorCode.UninitializedState, \"State is uninitialized\"],\n [TokenErrorCode.NativeNotSupported, \"Instruction does not support native tokens\"],\n [TokenErrorCode.NonNativeHasBalance, \"Non-native account can only be closed if its balance is zero\"],\n [TokenErrorCode.InvalidInstruction, \"Invalid instruction\"],\n [TokenErrorCode.InvalidState, \"State is invalid for requested operation\"],\n [TokenErrorCode.Overflow, \"Operation overflowed\"],\n [TokenErrorCode.AuthorityTypeNotSupported, \"Account does not support specified authority type\"],\n [TokenErrorCode.MintCannotFreeze, \"This token mint cannot freeze accounts\"],\n [TokenErrorCode.AccountFrozen, \"Account is frozen; all account operations will fail\"],\n [TokenErrorCode.MintDecimalsMismatch, \"Mint decimals mismatch between the client and mint\"],\n [TokenErrorCode.NonNativeNotSupported, \"Instruction does not support non-native tokens\"],\n]);\n\nenum JupiterErrorCode {\n EmptyRoute = 6000,\n SlippageToleranceExceeded = 6001,\n InvalidCalculation = 6002,\n MissingPlatformFeeAccount = 6003,\n InvalidSlippage = 6004,\n NotEnoughPercent = 6005,\n InvalidInputIndex = 6006,\n InvalidOutputIndex = 6007,\n NotEnoughAccountKeys = 6008,\n NonZeroMinimumOutAmountNotSupported = 6009,\n InvalidRoutePlan = 6010,\n InvalidReferralAuthority = 6011,\n LedgerTokenAccountDoesNotMatch = 6012,\n InvalidTokenLedger = 6013,\n IncorrectTokenProgramID = 6014,\n TokenProgramNotProvided = 6015,\n SwapNotSupported = 6016,\n ExactOutAmountNotMatched = 6017,\n SourceAndDestinationMintCannotBeTheSame = 6018,\n}\n\nconst JupiterErrorCodeMap: Map<number, string> = new Map([\n [JupiterErrorCode.EmptyRoute, \"Empty route\"],\n [JupiterErrorCode.SlippageToleranceExceeded, \"Slippage tolerance exceeded\"],\n [JupiterErrorCode.InvalidCalculation, \"Invalid calculation\"],\n [JupiterErrorCode.MissingPlatformFeeAccount, \"Missing platform fee account\"],\n [JupiterErrorCode.InvalidSlippage, \"Invalid slippage\"],\n [JupiterErrorCode.NotEnoughPercent, \"Not enough percent to 100\"],\n [JupiterErrorCode.InvalidInputIndex, \"Token input index is invalid\"],\n [JupiterErrorCode.InvalidOutputIndex, \"Token output index is invalid\"],\n [JupiterErrorCode.NotEnoughAccountKeys, \"Not Enough Account keys\"],\n [JupiterErrorCode.NonZeroMinimumOutAmountNotSupported, \"Non zero minimum out amount not supported\"],\n [JupiterErrorCode.InvalidRoutePlan, \"Invalid route plan\"],\n [JupiterErrorCode.InvalidReferralAuthority, \"Invalid referral authority\"],\n [JupiterErrorCode.LedgerTokenAccountDoesNotMatch, \"Token account doesn't match the ledger\"],\n [JupiterErrorCode.InvalidTokenLedger, \"Invalid token ledger\"],\n [JupiterErrorCode.IncorrectTokenProgramID, \"Token program ID is invalid\"],\n [JupiterErrorCode.TokenProgramNotProvided, \"Token program not provided\"],\n [JupiterErrorCode.SwapNotSupported, \"Swap not supported\"],\n [JupiterErrorCode.ExactOutAmountNotMatched, \"Exact out amount doesn't match\"],\n [JupiterErrorCode.SourceAndDestinationMintCannotBeTheSame, \"Source mint and destination mint cannot the same\"],\n]);\n\nconst ERROR_CODE_MAPS: Map<string, Map<number, string>> = new Map([\n [TOKEN_PROGRAM_ID.toBase58(), TokenErrorCodeMap],\n [JUPITER_V6_PROGRAM.toBase58(), JupiterErrorCodeMap],\n]);\n","// Import fallback files\nimport { LENDR_IDL, type LendrIdlType } from \".\";\n\n/**\n * Fetches the latest IDL files from GCP.\n * If either fetch fails, it falls back to version 0.1.0.\n *\n * @returns The Lendr IDL\n */\nexport function fetchLatestIdl(): LendrIdlType {\n return LENDR_IDL as LendrIdlType;\n}\n","import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { type AccountMeta, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport type { EstablishedSessionState } from \"./common/session\";\nimport type { BankConfigCompactRaw, BankConfigOptRaw } from \"./services\";\nimport type {\n LendingAccountDepositOrRepayWithSessionAccounts,\n LendingAccountWithdrawOrBorrowWithSessionAccounts,\n LendrProgram,\n} from \"./types\";\n\nasync function makeInitLendrAccountIx(\n ldProgram: LendrProgram,\n accounts: {\n lendrGroup: PublicKey;\n lendrAccount: PublicKey;\n authority: PublicKey;\n feePayer: PublicKey;\n },\n) {\n return ldProgram.methods.lendrAccountInitialize().accounts(accounts).instruction();\n}\n\nasync function makeInitLendrAccountWithSessionIx(\n ldProgram: LendrProgram,\n {\n lendrGroup,\n session,\n feePayer,\n }: {\n lendrGroup: PublicKey;\n session: EstablishedSessionState;\n feePayer: PublicKey;\n },\n accountIndex: number,\n thirdPartyId?: number,\n) {\n const thirdPartyIdValue = thirdPartyId ?? 0;\n\n // Manually derive the lendrAccount PDA to avoid account resolution issues\n const [lendrAccount] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"lendr_account\"),\n lendrGroup.toBuffer(),\n session.walletPublicKey.toBuffer(),\n Buffer.from(new Uint16Array([accountIndex]).buffer),\n Buffer.from(new Uint16Array([thirdPartyIdValue]).buffer),\n ],\n ldProgram.programId,\n );\n\n return ldProgram.methods\n .lendrAccountInitializeWithSession(session.walletPublicKey, accountIndex, thirdPartyId ?? null)\n .accounts({\n lendrGroup,\n lendrAccount,\n sessionKey: session.sessionPublicKey,\n feePayer,\n })\n .instruction();\n}\n\nasync function makeDepositIx(\n ldProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrAccount: PublicKey;\n signerTokenAccount: PublicKey;\n bank: PublicKey;\n tokenProgram: PublicKey;\n // Optional accounts - to override inference\n group?: PublicKey;\n authority?: PublicKey;\n liquidityVault?: PublicKey;\n },\n args: {\n amount: BN;\n depositUpToLimit?: boolean;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, signerTokenAccount, bank, tokenProgram, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingAccountDeposit(args.amount, args.depositUpToLimit ?? null)\n .accounts({\n lendrAccount,\n signerTokenAccount,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nexport async function makeDepositWithSessionIx(\n ldProgram: LendrProgram,\n accounts: LendingAccountDepositOrRepayWithSessionAccounts,\n args: {\n amount: BN;\n depositUpToLimit?: boolean;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, signerTokenAccount, bank, tokenProgram, sessionKey, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingAccountDepositWithSession(args.amount, args.depositUpToLimit ?? null)\n .accounts({\n sessionKey,\n lendrAccount,\n signerTokenAccount,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nasync function makeRepayIx(\n ldProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrAccount: PublicKey;\n signerTokenAccount: PublicKey;\n bank: PublicKey;\n tokenProgram: PublicKey;\n // Optional accounts - to override inference\n group?: PublicKey;\n authority?: PublicKey;\n liquidityVault?: PublicKey;\n },\n args: {\n amount: BN;\n repayAll?: boolean;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, signerTokenAccount, bank, tokenProgram, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingAccountRepay(args.amount, args.repayAll ?? null)\n .accounts({\n lendrAccount,\n signerTokenAccount,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nasync function makeRepayWithSessionIx(\n ldProgram: LendrProgram,\n accounts: LendingAccountDepositOrRepayWithSessionAccounts,\n args: {\n amount: BN;\n repayAll?: boolean;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, signerTokenAccount, bank, tokenProgram, sessionKey, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingAccountRepayWithSession(args.amount, args.repayAll ?? null)\n .accounts({\n sessionKey,\n lendrAccount,\n signerTokenAccount,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nasync function makeWithdrawIx(\n ldProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrAccount: PublicKey;\n bank: PublicKey;\n destinationTokenAccount: PublicKey;\n tokenProgram: PublicKey;\n // Optional accounts - to override inference\n group?: PublicKey;\n authority?: PublicKey;\n bankLiquidityVaultAuthority?: PublicKey;\n liquidityVault?: PublicKey;\n },\n args: {\n amount: BN;\n withdrawAll?: boolean;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, bank, destinationTokenAccount, tokenProgram, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingAccountWithdraw(args.amount, args.withdrawAll ?? null)\n .accounts({\n lendrAccount,\n destinationTokenAccount,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nasync function makeWithdrawWithSessionIx(\n ldProgram: LendrProgram,\n accounts: LendingAccountWithdrawOrBorrowWithSessionAccounts,\n args: {\n amount: BN;\n withdrawAll?: boolean;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, bank, destinationTokenAccount, tokenProgram, sessionKey, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingAccountWithdrawWithSession(args.amount, args.withdrawAll ?? null)\n .accounts({\n sessionKey,\n lendrAccount,\n destinationTokenAccount,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nasync function makeBorrowIx(\n ldProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrAccount: PublicKey;\n bank: PublicKey;\n destinationTokenAccount: PublicKey;\n tokenProgram: PublicKey;\n // Optional accounts - to override inference\n group?: PublicKey;\n authority?: PublicKey;\n bankLiquidityVaultAuthority?: PublicKey;\n liquidityVault?: PublicKey;\n },\n args: {\n amount: BN;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, bank, destinationTokenAccount, tokenProgram, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingAccountBorrow(args.amount)\n .accounts({\n lendrAccount,\n destinationTokenAccount,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nasync function makeBorrowWithSessionIx(\n ldProgram: LendrProgram,\n accounts: LendingAccountWithdrawOrBorrowWithSessionAccounts,\n args: {\n amount: BN;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, bank, destinationTokenAccount, tokenProgram, sessionKey, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingAccountBorrowWithSession(args.amount)\n .accounts({\n sessionKey,\n lendrAccount,\n destinationTokenAccount,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nfunction makeLendingAccountLiquidateIx(\n ldrProgram: LendrProgram,\n accounts: {\n // Required accounts\n assetBank: PublicKey;\n liabBank: PublicKey;\n liquidatorLendrAccount: PublicKey;\n liquidateeLendrAccount: PublicKey;\n tokenProgram: PublicKey;\n // Optional accounts - to override inference\n group?: PublicKey;\n authority?: PublicKey;\n },\n args: {\n assetAmount: BN;\n liquidateeAccounts: number;\n liquidatorAccounts: number;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { assetBank, liabBank, liquidatorLendrAccount, liquidateeLendrAccount, tokenProgram, ...optionalAccounts } =\n accounts;\n\n return ldrProgram.methods\n .lendingAccountLiquidate(args.assetAmount, args.liquidateeAccounts, args.liquidatorAccounts)\n .accounts({\n assetBank,\n liabBank,\n liquidatorLendrAccount,\n liquidateeLendrAccount,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nfunction makelendingAccountWithdrawEmissionIx(\n ldrProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrAccount: PublicKey;\n destinationAccount: PublicKey;\n bank: PublicKey;\n tokenProgram: PublicKey;\n // Optional accounts - to override inference\n group?: PublicKey;\n authority?: PublicKey;\n emissionsMint?: PublicKey;\n },\n) {\n const { lendrAccount, destinationAccount, bank, tokenProgram, ...optionalAccounts } = accounts;\n\n return ldrProgram.methods\n .lendingAccountWithdrawEmissions()\n .accounts({\n lendrAccount,\n destinationAccount,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .instruction();\n}\n\nfunction makePoolConfigureBankIx(\n ldrProgram: LendrProgram,\n accounts: {\n // Required accounts\n bank: PublicKey;\n // Optional accounts - to override inference\n group?: PublicKey;\n admin?: PublicKey;\n },\n args: {\n bankConfigOpt: BankConfigOptRaw;\n },\n) {\n const { bank, ...optionalAccounts } = accounts;\n\n return ldrProgram.methods\n .lendingPoolConfigureBank(args.bankConfigOpt)\n .accounts({\n bank,\n })\n .accountsPartial(optionalAccounts)\n .instruction();\n}\n\nfunction makeBeginFlashLoanIx(\n ldrProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrAccount: PublicKey;\n // Optional accounts - to override inference\n authority?: PublicKey;\n ixsSysvar?: PublicKey;\n },\n args: {\n endIndex: BN;\n },\n) {\n const { lendrAccount, ...optionalAccounts } = accounts;\n\n return ldrProgram.methods\n .lendingAccountStartFlashloan(args.endIndex)\n .accounts({\n lendrAccount,\n })\n .accountsPartial(optionalAccounts)\n .instruction();\n}\n\nfunction makeBeginFlashLoanWithSessionIx(\n ldrProgram: LendrProgram,\n accounts: {\n // Required accounts\n sessionKey: PublicKey;\n lendrAccount: PublicKey;\n // Optional accounts - to override inference\n ixsSysvar?: PublicKey;\n },\n args: {\n endIndex: BN;\n },\n) {\n const { lendrAccount, sessionKey, ...optionalAccounts } = accounts;\n\n return ldrProgram.methods\n .lendingAccountStartFlashloanWithSession(args.endIndex)\n .accounts({\n sessionKey,\n lendrAccount,\n })\n .accountsPartial(optionalAccounts)\n .instruction();\n}\n\nfunction makeEndFlashLoanIx(\n ldrProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrAccount: PublicKey;\n // Optional accounts - to override inference\n authority?: PublicKey;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, ...optionalAccounts } = accounts;\n\n return ldrProgram.methods\n .lendingAccountEndFlashloan()\n .accounts({\n lendrAccount,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nfunction makeEndFlashLoanWithSessionIx(\n ldrProgram: LendrProgram,\n accounts: {\n // Required accounts\n sessionKey: PublicKey;\n lendrAccount: PublicKey;\n },\n remainingAccounts: AccountMeta[] = [],\n) {\n const { lendrAccount, sessionKey, ...optionalAccounts } = accounts;\n\n return ldrProgram.methods\n .lendingAccountEndFlashloanWithSession()\n .accounts({\n sessionKey,\n lendrAccount,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nasync function makeGroupInitIx(\n ldProgram: LendrProgram,\n accounts: {\n lendrGroup: PublicKey;\n admin: PublicKey;\n },\n args?: {\n isArenaGroup?: boolean;\n },\n) {\n return ldProgram.methods\n .lendrGroupInitialize(args?.isArenaGroup ?? false)\n .accounts({\n lendrGroup: accounts.lendrGroup,\n admin: accounts.admin,\n })\n .instruction();\n}\n\n/**\n * Configure the oracle for a bank\n * @param ldProgram The lendr program\n * @param accounts The accounts required for this instruction\n * @param args The oracle setup index and feed id\n * @param remainingAccounts The remaining accounts required for this instruction, should include the feed oracle key\n */\nasync function makeLendingPoolConfigureBankOracleIx(\n ldProgram: LendrProgram,\n accounts: {\n // Required accounts\n bank: PublicKey;\n // Optional accounts - to override inference\n group?: PublicKey;\n admin?: PublicKey;\n },\n args: {\n /**\n * The oracle setup index, see {@link serializeOracleSetupToIndex}\n */\n setup: number;\n /**\n * The oracle feed id\n */\n feedId: PublicKey;\n },\n /**\n * The remaining accounts required for this instruction, should include the feed oracle key (non writable & signable)\n */\n remainingAccounts: AccountMeta[] = [],\n) {\n const { bank, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingPoolConfigureBankOracle(args.setup, args.feedId)\n .accounts({\n bank,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nfunction makeLendingAccountSettleEmissionsIx(\n ldrProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrAccount: PublicKey;\n bank: PublicKey;\n },\n) {\n const { lendrAccount, bank } = accounts;\n\n return ldrProgram.methods\n .lendingAccountSettleEmissions()\n .accounts({\n lendrAccount,\n bank,\n })\n .instruction();\n}\n\n/**\n * Creates an instruction to add a permissionless staked bank to a lending pool.\n * @param ldProgram - The lendr program instance\n * @param accounts - The accounts required for this instruction\n * @param remainingAccounts - The remaining accounts required for this instruction, including pythOracle, solPool and bankMint\n * @param args - Optional arguments for this instruction\n */\nasync function makePoolAddPermissionlessStakedBankIx(\n ldProgram: LendrProgram,\n accounts: {\n // Required accounts\n stakedSettings: PublicKey;\n feePayer: PublicKey;\n bankMint: PublicKey;\n solPool: PublicKey;\n stakePool: PublicKey;\n // Optional accounts - to override inference\n lendrGroup?: PublicKey;\n /**\n * The token program to use for this instruction, defaults to the SPL token program\n */\n tokenProgram?: PublicKey;\n },\n /**\n * The remaining accounts required for this instruction. Should include:\n * - pythOracle: The pyth oracle key (non writable & non signer)\n * - solPool: The sol pool key (non writable & non signer)\n * - bankMint: The bank mint key (non writable & non signer)\n */\n remainingAccounts: AccountMeta[],\n args: {\n /**\n * The seed to use for the bank account. Defaults to 0 (new BN(0)).\n * If the seed is not specified, the seed is set to 0, and the bank account\n * will be created at the address {@link findPoolAddress} with the default\n * bump.\n */\n seed?: BN;\n },\n) {\n const {\n stakedSettings,\n feePayer,\n bankMint,\n solPool,\n stakePool,\n tokenProgram = TOKEN_PROGRAM_ID,\n ...optionalAccounts\n } = accounts;\n\n return ldProgram.methods\n .lendingPoolAddBankPermissionless(args.seed ?? new BN(0))\n .accounts({\n stakedSettings,\n feePayer,\n bankMint,\n solPool,\n stakePool,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nasync function makePoolAddBankIx(\n ldProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrGroup: PublicKey;\n feePayer: PublicKey;\n bankMint: PublicKey;\n bank: PublicKey;\n tokenProgram: PublicKey;\n // Optional accounts - to override inference\n admin?: PublicKey;\n globalFeeWallet?: PublicKey;\n },\n args: {\n bankConfig: BankConfigCompactRaw;\n },\n) {\n const { lendrGroup, feePayer, bankMint, bank, tokenProgram, ...optionalAccounts } = accounts;\n\n return ldProgram.methods\n .lendingPoolAddBank({\n ...args.bankConfig,\n configFlags: 0,\n pad0: [0, 0, 0, 0, 0, 0, 0, 0],\n })\n .accounts({\n lendrGroup,\n feePayer,\n bankMint,\n bank,\n tokenProgram,\n })\n .accountsPartial(optionalAccounts)\n .instruction();\n}\n\nasync function makeCloseAccountIx(\n ldProgram: LendrProgram,\n accounts: {\n // Required accounts\n lendrAccount: PublicKey;\n feePayer: PublicKey;\n // Optional accounts - to override inference\n authority?: PublicKey;\n },\n) {\n const { lendrAccount, feePayer, ...optionalAccounts } = accounts;\n return ldProgram.methods\n .lendrAccountClose()\n .accounts({\n lendrAccount,\n feePayer,\n })\n .accountsPartial(optionalAccounts)\n .instruction();\n}\n\nasync function makePulseHealthIx(\n ldProgram: LendrProgram,\n accounts: {\n lendrAccount: PublicKey;\n },\n /**\n * The remaining accounts required for this instruction. Should include:\n * - For each balance the user has, pass bank and oracle: <bank1, oracle1, bank2, oracle2>\n */\n remainingAccounts: AccountMeta[] = [],\n) {\n return ldProgram.methods\n .lendingAccountPulseHealth()\n .accounts({\n lendrAccount: accounts.lendrAccount,\n })\n .remainingAccounts(remainingAccounts)\n .instruction();\n}\n\nconst instructions = {\n makeDepositIx,\n makeDepositWithSessionIx,\n makeRepayIx,\n makeRepayWithSessionIx,\n makeWithdrawIx,\n makeWithdrawWithSessionIx,\n makeBorrowIx,\n makeBorrowWithSessionIx,\n makeInitLendrAccountIx,\n makeInitLendrAccountWithSessionIx,\n makeLendingAccountLiquidateIx,\n makelendingAccountWithdrawEmissionIx,\n makePoolAddBankIx,\n makePoolConfigureBankIx,\n makeBeginFlashLoanIx,\n makeBeginFlashLoanWithSessionIx,\n makeEndFlashLoanIx,\n makeEndFlashLoanWithSessionIx,\n makeGroupInitIx,\n makeCloseAccountIx,\n makePoolAddPermissionlessStakedBankIx,\n makeLendingPoolConfigureBankOracleIx,\n makePulseHealthIx,\n makeLendingAccountSettleEmissionsIx,\n};\n\nexport default instructions;\n","import type BigNumber from \"bignumber.js\";\nimport { toBigNumber, wrappedI80F48toBigNumber } from \"../common\";\nimport {\n getActiveHealthCacheFlags,\n type HealthCacheFlags,\n type HealthCacheRaw,\n type HealthCacheType,\n} from \"../services\";\n\nexport class HealthCache implements HealthCacheType {\n constructor(\n public assetValue: BigNumber,\n public liabilityValue: BigNumber,\n public assetValueMaint: BigNumber,\n public liabilityValueMaint: BigNumber,\n public assetValueEquity: BigNumber,\n public liabilityValueEquity: BigNumber,\n public timestamp: BigNumber,\n public flags: HealthCacheFlags[],\n public prices: number[][],\n public simulationFailed?: boolean,\n ) {\n this.assetValue = assetValue;\n this.liabilityValue = liabilityValue;\n this.assetValueMaint = assetValueMaint;\n this.liabilityValueMaint = liabilityValueMaint;\n this.assetValueEquity = assetValueEquity;\n this.liabilityValueEquity = liabilityValueEquity;\n this.timestamp = timestamp;\n this.flags = flags;\n this.prices = prices;\n this.simulationFailed = simulationFailed;\n }\n\n static from(healthCacheRaw: HealthCacheRaw): HealthCache {\n const assetValue = wrappedI80F48toBigNumber(healthCacheRaw.assetValue);\n const liabilityValue = wrappedI80F48toBigNumber(healthCacheRaw.liabilityValue);\n const assetValueMaint = wrappedI80F48toBigNumber(healthCacheRaw.assetValueMaint);\n const liabilityValueMaint = wrappedI80F48toBigNumber(healthCacheRaw.liabilityValueMaint);\n const assetValueEquity = wrappedI80F48toBigNumber(healthCacheRaw.assetValueEquity);\n const liabilityValueEquity = wrappedI80F48toBigNumber(healthCacheRaw.liabilityValueEquity);\n const timestamp = toBigNumber(healthCacheRaw.timestamp);\n const flags = getActiveHealthCacheFlags(healthCacheRaw.flags);\n const prices = healthCacheRaw.prices;\n return new HealthCache(\n assetValue,\n liabilityValue,\n assetValueMaint,\n liabilityValueMaint,\n assetValueEquity,\n liabilityValueEquity,\n timestamp,\n flags,\n prices,\n );\n }\n}\n","import type { PublicKey } from \"@solana/web3.js\";\nimport type BigNumber from \"bignumber.js\";\n\nexport enum RiskTier {\n Collateral = \"Collateral\",\n Isolated = \"Isolated\",\n}\n\nexport enum OperationalState {\n Paused = \"Paused\",\n Operational = \"Operational\",\n ReduceOnly = \"ReduceOnly\",\n KilledByBankruptcy = \"KilledByBankruptcy\",\n}\n\nexport interface RatePoint {\n util: number;\n rate: number;\n}\n\nexport interface InterestRateConfig {\n // Curve Params\n optimalUtilizationRate: BigNumber;\n plateauInterestRate: BigNumber;\n maxInterestRate: BigNumber;\n\n // Fees\n insuranceFeeFixedApr: BigNumber;\n insuranceIrFee: BigNumber;\n protocolFixedFeeApr: BigNumber;\n protocolIrFee: BigNumber;\n protocolOriginationFee: BigNumber;\n\n zeroUtilRate: number;\n hundredUtilRate: number;\n points: RatePoint[];\n curveType: number;\n}\n\nexport interface InterestRateConfigOpt\n extends Omit<\n InterestRateConfig,\n \"optimalUtilizationRate\" | \"plateauInterestRate\" | \"maxInterestRate\" | \"curveType\"\n > {}\n\nexport enum OracleSetup {\n None = \"None\",\n PythLegacy = \"PythLegacy\",\n SwitchboardV2 = \"SwitchboardV2\",\n PythPushOracle = \"PythPushOracle\",\n SwitchboardPull = \"SwitchboardPull\",\n StakedWithPythPush = \"StakedWithPythPush\",\n KaminoPythPush = \"KaminoPythPush\",\n KaminoSwitchboardPull = \"KaminoSwitchboardPull\",\n Fixed = \"Fixed\",\n}\n\nexport enum AssetTag {\n DEFAULT = 0,\n SOL = 1,\n STAKED = 2,\n}\n\nexport enum BankConfigFlag {\n PYTH_MIGRATED = 1 << 0, // 1\n}\n\n// BankConfigOpt Args\nexport interface BankConfigOpt {\n assetWeightInit: BigNumber | null;\n assetWeightMaint: BigNumber | null;\n\n liabilityWeightInit: BigNumber | null;\n liabilityWeightMaint: BigNumber | null;\n\n depositLimit: BigNumber | null;\n borrowLimit: BigNumber | null;\n interestRateConfig: InterestRateConfig | null;\n operationalState: OperationalState | null;\n\n riskTier: RiskTier | null;\n assetTag: AssetTag | null;\n totalAssetValueInitLimit: BigNumber | null;\n\n oracleMaxConfidence: number | null;\n oracleMaxAge: number | null;\n permissionlessBadDebtSettlement: boolean | null;\n freezeSettings: boolean | null;\n tokenlessRepaymentsAllowed: boolean | null;\n}\n\nexport interface BankConfigType {\n assetWeightInit: BigNumber;\n assetWeightMaint: BigNumber;\n\n liabilityWeightInit: BigNumber;\n liabilityWeightMaint: BigNumber;\n\n depositLimit: BigNumber;\n borrowLimit: BigNumber;\n\n riskTier: RiskTier;\n totalAssetValueInitLimit: BigNumber;\n assetTag: AssetTag;\n configFlags?: BankConfigFlag;\n\n interestRateConfig: InterestRateConfig;\n operationalState: OperationalState;\n\n oracleSetup: OracleSetup;\n oracleKeys: PublicKey[];\n oracleMaxAge: number;\n oracleMaxConfidence: number;\n fixedPrice: BigNumber;\n}\n\nexport interface BankType {\n address: PublicKey;\n tokenSymbol?: string;\n group: PublicKey;\n mint: PublicKey;\n mintDecimals: number;\n mintRate: number | null;\n mintPrice: number;\n\n assetShareValue: BigNumber;\n liabilityShareValue: BigNumber;\n\n liquidityVault: PublicKey;\n liquidityVaultBump: number;\n liquidityVaultAuthorityBump: number;\n\n insuranceVault: PublicKey;\n insuranceVaultBump: number;\n insuranceVaultAuthorityBump: number;\n collectedInsuranceFeesOutstanding: BigNumber;\n\n feeVault: PublicKey;\n feeVaultBump: number;\n feeVaultAuthorityBump: number;\n collectedGroupFeesOutstanding: BigNumber;\n\n lastUpdate: number;\n\n config: BankConfigType;\n\n totalAssetShares: BigNumber;\n totalLiabilityShares: BigNumber;\n\n emissionsActiveBorrowing: boolean;\n emissionsActiveLending: boolean;\n emissionsRate: number;\n emissionsMint: PublicKey;\n emissionsRemaining: BigNumber;\n\n oracleKey: PublicKey;\n pythShardId?: number;\n emode: EmodeSettingsType;\n feesDestinationAccount?: PublicKey;\n lendingPositionCount?: BigNumber;\n borrowingPositionCount?: BigNumber;\n}\n\n/**\n * Bitwise flags for EMode entry\n */\nexport enum EmodeEntryFlags {\n /**\n * If set, isolated banks with this tag also benefit.\n * If not set, isolated banks continue to offer zero collateral, even if they use this tag.\n * (NOT YET IMPLEMENTED)\n */\n APPLIES_TO_ISOLATED = 1 << 0, // 1\n /** Reserved for future use */\n RESERVED_1 = 1 << 1, // 2\n RESERVED_2 = 1 << 2, // 4\n RESERVED_3 = 1 << 3, // 8\n RESERVED_4 = 1 << 4, // 16\n RESERVED_5 = 1 << 5, // 32\n}\n\nexport interface EmodeEntry {\n collateralBankEmodeTag: EmodeTag;\n flags: EmodeEntryFlags[];\n assetWeightInit: BigNumber;\n assetWeightMaint: BigNumber;\n}\n\n/**\n * Bitwise flags for EMode settings\n */\nexport enum EmodeFlags {\n /** If set, at least one entry is configured */\n EMODE_ON = 1 << 0, // 1\n /** Reserved for future use */\n RESERVED_1 = 1 << 1, // 2\n RESERVED_2 = 1 << 2, // 4\n RESERVED_3 = 1 << 3, // 8\n}\n\nexport enum EmodeTag {\n UNSET = 0,\n SOL = 501,\n LST_T1 = 1571,\n LST_T2 = 1572,\n UNKNOWN = 9999,\n}\n\nexport interface EmodeSettingsType {\n emodeTag: EmodeTag;\n timestamp: number;\n flags: EmodeFlags[];\n emodeEntries: EmodeEntry[];\n}\n\nexport interface OracleConfigOpt {\n setup: OracleSetup;\n keys: PublicKey[];\n}\n\nexport type EmodePair = {\n collateralBanks: PublicKey[];\n collateralBankTag: EmodeTag;\n liabilityBank: PublicKey;\n liabilityBankTag: EmodeTag;\n assetWeightMaint: BigNumber;\n assetWeightInit: BigNumber;\n};\n\nexport type ActiveEmodePair = {\n collateralBanks: PublicKey[];\n collateralBankTags: EmodeTag[];\n liabilityBanks: PublicKey[];\n liabilityBankTags: EmodeTag[];\n assetWeightMaint: BigNumber;\n assetWeightInit: BigNumber;\n};\n\nexport enum EmodeImpactStatus {\n ActivateEmode,\n ExtendEmode,\n IncreaseEmode,\n ReduceEmode,\n RemoveEmode,\n InactiveEmode,\n}\n\nexport interface EmodeImpact {\n status: EmodeImpactStatus;\n resultingPairs: EmodePair[];\n activePair?: ActiveEmodePair;\n}\n\nexport interface ActionEmodeImpact {\n borrowImpact?: EmodeImpact;\n supplyImpact?: EmodeImpact;\n repayAllImpact?: EmodeImpact;\n withdrawAllImpact?: EmodeImpact;\n}\n","import type { PublicKey } from \"@solana/web3.js\";\nimport type { Program } from \"./common\";\nimport type { LendrIdlType } from \"./idl\";\n\nexport type LendrProgram = Program<LendrIdlType>;\n\n/**\n * Supported config environments.\n */\nexport type Environment = \"production\" | \"alpha\" | \"staging\" | \"dev\" | \"mainnet-test-1\" | \"dev.1\";\n\n/**\n * Lendr bank vault type\n */\nexport enum BankVaultType {\n LiquidityVault,\n InsuranceVault,\n FeeVault,\n}\n\nexport interface LendrConfig {\n environment: Environment;\n cluster: \"mainnet\" | \"testnet\" | \"devnet\" | ({} & string);\n programId: PublicKey;\n groupPk: PublicKey;\n}\n\nexport interface BankAddress {\n label: string;\n address: PublicKey;\n}\n\n// --- On-chain account structs\n\nexport enum AccountType {\n LendrGroup = \"lendrGroup\",\n LendrAccount = \"lendrAccount\",\n Bank = \"bank\",\n}\n\nexport type LogFn = <T extends object>(obj: T, msg?: string) => void;\n\nexport interface TLogger {\n info: LogFn;\n error: LogFn;\n warn: LogFn;\n debug: LogFn;\n}\n\nexport type LendingAccountDepositOrRepayWithSessionAccounts = {\n sessionKey: PublicKey; // The session key\n lendrAccount: PublicKey; // (must match session user)\n bank: PublicKey;\n signerTokenAccount: PublicKey; // User's token account (source)\n tokenProgram: PublicKey; // SPL Token program (interface)\n group?: PublicKey;\n liquidityVault?: PublicKey;\n};\n\nexport type LendingAccountWithdrawOrBorrowWithSessionAccounts = {\n sessionKey: PublicKey;\n lendrAccount: PublicKey;\n bank: PublicKey;\n destinationTokenAccount: PublicKey;\n tokenProgram: PublicKey;\n\n group?: PublicKey;\n};\n","import { BorshCoder } from \"@coral-xyz/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport BN from \"bn.js\";\nimport { DEFAULT_ORACLE_MAX_AGE } from \"~/constants\";\nimport type { LendrIdlType } from \"~/idl\";\nimport { AccountType } from \"~/types\";\nimport { findOracleKey, type PythPushFeedIdMap } from \"~/utils\";\nimport { type BankMetadata, wrappedI80F48toBigNumber } from \"../../../common\";\n\nimport {\n type AssetTag,\n type BankConfigDto,\n type BankConfigRaw,\n type BankConfigRawDto,\n type BankConfigType,\n type BankRaw,\n type BankRawDto,\n type BankType,\n type BankTypeDto,\n EmodeEntryFlags,\n EmodeFlags,\n type EmodeSettingsDto,\n type EmodeSettingsRaw,\n type EmodeSettingsRawDto,\n type EmodeSettingsType,\n EmodeTag,\n type InterestRateConfig,\n type InterestRateConfigDto,\n OperationalState,\n type OperationalStateRaw,\n OracleSetup,\n type OracleSetupRaw,\n RiskTier,\n type RiskTierRaw,\n} from \"../types\";\n\n/*\n * Bank deserialization\n */\n\nexport function decodeBankRaw(encoded: Buffer, idl: LendrIdlType): BankRaw {\n const coder = new BorshCoder(idl);\n return coder.accounts.decode(AccountType.Bank, encoded);\n}\n\nexport function parseEmodeSettingsRaw(emodeSettingsRaw: EmodeSettingsRaw): EmodeSettingsType {\n const emodeTag = parseEmodeTag(emodeSettingsRaw.emodeTag);\n const timestamp = emodeSettingsRaw.timestamp.toNumber();\n const flags = getActiveEmodeFlags(emodeSettingsRaw.flags);\n const emodeEntries = emodeSettingsRaw.emodeConfig.entries\n .filter((entry) => entry.collateralBankEmodeTag !== 0)\n .map((entry) => {\n return {\n collateralBankEmodeTag: parseEmodeTag(entry.collateralBankEmodeTag),\n flags: getActiveEmodeEntryFlags(entry.flags),\n assetWeightInit: wrappedI80F48toBigNumber(entry.assetWeightInit),\n assetWeightMaint: wrappedI80F48toBigNumber(entry.assetWeightMaint),\n };\n });\n\n const emodeSettings: EmodeSettingsType = {\n emodeTag,\n timestamp,\n flags,\n emodeEntries,\n };\n\n return emodeSettings;\n}\n\nexport function parseBankRaw(\n address: PublicKey,\n accountParsed: BankRaw,\n feedIdMap?: PythPushFeedIdMap,\n bankMetadata?: BankMetadata,\n mintData?: {\n mintRate: number | null;\n mintPrice: number;\n },\n): BankType {\n const flags = accountParsed.flags.toNumber();\n\n const mint = accountParsed.mint;\n const mintDecimals = accountParsed.mintDecimals;\n const group = accountParsed.group;\n\n const assetShareValue = wrappedI80F48toBigNumber(accountParsed.assetShareValue);\n const liabilityShareValue = wrappedI80F48toBigNumber(accountParsed.liabilityShareValue);\n\n const liquidityVault = accountParsed.liquidityVault;\n const liquidityVaultBump = accountParsed.liquidityVaultBump;\n const liquidityVaultAuthorityBump = accountParsed.liquidityVaultAuthorityBump;\n\n const insuranceVault = accountParsed.insuranceVault;\n const insuranceVaultBump = accountParsed.insuranceVaultBump;\n const insuranceVaultAuthorityBump = accountParsed.insuranceVaultAuthorityBump;\n\n const collectedInsuranceFeesOutstanding = wrappedI80F48toBigNumber(accountParsed.collectedInsuranceFeesOutstanding);\n\n const feeVault = accountParsed.feeVault;\n const feeVaultBump = accountParsed.feeVaultBump;\n const feeVaultAuthorityBump = accountParsed.feeVaultAuthorityBump;\n\n const collectedGroupFeesOutstanding = wrappedI80F48toBigNumber(accountParsed.collectedGroupFeesOutstanding);\n\n const config = parseBankConfigRaw(accountParsed.config);\n\n const lastUpdate = accountParsed.lastUpdate.toNumber();\n\n const totalAssetShares = wrappedI80F48toBigNumber(accountParsed.totalAssetShares);\n const totalLiabilityShares = wrappedI80F48toBigNumber(accountParsed.totalLiabilityShares);\n\n const emissionsActiveBorrowing = (flags & 1) > 0;\n const emissionsActiveLending = (flags & 2) > 0;\n\n // @todo existence checks here should be temporary - remove once all banks have emission configs\n const emissionsRate = accountParsed.emissionsRate.toNumber();\n const emissionsMint = accountParsed.emissionsMint;\n const emissionsRemaining = accountParsed.emissionsRemaining\n ? wrappedI80F48toBigNumber(accountParsed.emissionsRemaining)\n : new BigNumber(0);\n\n // Derive the oracle key - for PythPushOracle, this resolves the PDA from the feed ID\n const { oracleKey, shardId: pythShardId } = feedIdMap\n ? findOracleKey(config, feedIdMap)\n : { oracleKey: config.oracleKeys[0], shardId: undefined };\n const emode = parseEmodeSettingsRaw(accountParsed.emode);\n\n const tokenSymbol = bankMetadata?.tokenSymbol;\n\n const feesDestinationAccount = accountParsed.feesDestinationAccount;\n const lendingPositionCount = accountParsed.lendingPositionCount\n ? new BigNumber(accountParsed.lendingPositionCount.toString())\n : new BigNumber(0);\n const borrowingPositionCount = accountParsed.borrowingPositionCount\n ? new BigNumber(accountParsed.borrowingPositionCount.toString())\n : new BigNumber(0);\n\n return {\n address,\n group,\n mint,\n mintDecimals,\n assetShareValue,\n liabilityShareValue,\n liquidityVault,\n liquidityVaultBump,\n liquidityVaultAuthorityBump,\n insuranceVault,\n insuranceVaultBump,\n insuranceVaultAuthorityBump,\n collectedInsuranceFeesOutstanding,\n feeVault,\n feeVaultBump,\n feeVaultAuthorityBump,\n collectedGroupFeesOutstanding,\n lastUpdate,\n config,\n totalAssetShares,\n totalLiabilityShares,\n emissionsActiveBorrowing,\n emissionsActiveLending,\n emissionsRate,\n emissionsMint,\n emissionsRemaining,\n oracleKey,\n feesDestinationAccount,\n lendingPositionCount,\n borrowingPositionCount,\n pythShardId,\n emode,\n tokenSymbol,\n mintRate: mintData?.mintRate ?? null,\n mintPrice: mintData?.mintPrice ?? 0,\n };\n}\n\n/*\n * DTO Bank deserialization\n */\n\nexport function dtoToBank(bankDto: BankTypeDto): BankType {\n return {\n address: new PublicKey(bankDto.address),\n group: new PublicKey(bankDto.group),\n mint: new PublicKey(bankDto.mint),\n mintDecimals: bankDto.mintDecimals,\n assetShareValue: new BigNumber(bankDto.assetShareValue),\n liabilityShareValue: new BigNumber(bankDto.liabilityShareValue),\n liquidityVault: new PublicKey(bankDto.liquidityVault),\n liquidityVaultBump: bankDto.liquidityVaultBump,\n liquidityVaultAuthorityBump: bankDto.liquidityVaultAuthorityBump,\n insuranceVault: new PublicKey(bankDto.insuranceVault),\n insuranceVaultBump: bankDto.insuranceVaultBump,\n insuranceVaultAuthorityBump: bankDto.insuranceVaultAuthorityBump,\n collectedInsuranceFeesOutstanding: new BigNumber(bankDto.collectedInsuranceFeesOutstanding),\n feeVault: new PublicKey(bankDto.feeVault),\n feeVaultBump: bankDto.feeVaultBump,\n feeVaultAuthorityBump: bankDto.feeVaultAuthorityBump,\n collectedGroupFeesOutstanding: new BigNumber(bankDto.collectedGroupFeesOutstanding),\n lastUpdate: bankDto.lastUpdate,\n config: dtoToBankConfig(bankDto.config),\n totalAssetShares: new BigNumber(bankDto.totalAssetShares),\n totalLiabilityShares: new BigNumber(bankDto.totalLiabilityShares),\n emissionsActiveBorrowing: bankDto.emissionsActiveBorrowing,\n emissionsActiveLending: bankDto.emissionsActiveLending,\n emissionsRate: bankDto.emissionsRate,\n emissionsMint: new PublicKey(bankDto.emissionsMint),\n emissionsRemaining: new BigNumber(bankDto.emissionsRemaining),\n oracleKey: new PublicKey(bankDto.oracleKey),\n pythShardId: bankDto.pythShardId,\n emode: dtoToEmodeSettings(bankDto.emode),\n tokenSymbol: bankDto.tokenSymbol,\n feesDestinationAccount: bankDto.feesDestinationAccount ? new PublicKey(bankDto.feesDestinationAccount) : undefined,\n lendingPositionCount: bankDto.lendingPositionCount ? new BigNumber(bankDto.lendingPositionCount) : undefined,\n borrowingPositionCount: bankDto.borrowingPositionCount ? new BigNumber(bankDto.borrowingPositionCount) : undefined,\n mintRate: null, // TODO: move these out\n mintPrice: 0,\n };\n}\n\nexport function dtoToEmodeSettings(emodeSettingsDto: EmodeSettingsDto): EmodeSettingsType {\n return {\n emodeTag: emodeSettingsDto.emodeTag,\n timestamp: emodeSettingsDto.timestamp,\n flags: emodeSettingsDto.flags,\n emodeEntries: emodeSettingsDto.emodeEntries.map((entry) => {\n return {\n collateralBankEmodeTag: entry.collateralBankEmodeTag,\n flags: entry.flags,\n assetWeightInit: new BigNumber(entry.assetWeightInit),\n assetWeightMaint: new BigNumber(entry.assetWeightMaint),\n };\n }),\n };\n}\n\nexport function dtoToBankConfig(bankConfigDto: BankConfigDto): BankConfigType {\n return {\n assetWeightInit: new BigNumber(bankConfigDto.assetWeightInit),\n assetWeightMaint: new BigNumber(bankConfigDto.assetWeightMaint),\n liabilityWeightInit: new BigNumber(bankConfigDto.liabilityWeightInit),\n liabilityWeightMaint: new BigNumber(bankConfigDto.liabilityWeightMaint),\n depositLimit: new BigNumber(bankConfigDto.depositLimit),\n borrowLimit: new BigNumber(bankConfigDto.borrowLimit),\n riskTier: bankConfigDto.riskTier,\n operationalState: bankConfigDto.operationalState,\n totalAssetValueInitLimit: new BigNumber(bankConfigDto.totalAssetValueInitLimit),\n assetTag: bankConfigDto.assetTag,\n configFlags: bankConfigDto.configFlags,\n oracleSetup: bankConfigDto.oracleSetup,\n oracleKeys: bankConfigDto.oracleKeys.map((key) => new PublicKey(key)),\n oracleMaxAge: bankConfigDto.oracleMaxAge,\n interestRateConfig: dtoToInterestRateConfig(bankConfigDto.interestRateConfig),\n oracleMaxConfidence: bankConfigDto.oracleMaxConfidence,\n fixedPrice: new BigNumber(bankConfigDto.fixedPrice),\n };\n}\n\nexport function dtoToInterestRateConfig(interestRateConfigDto: InterestRateConfigDto): InterestRateConfig {\n return {\n optimalUtilizationRate: new BigNumber(interestRateConfigDto.optimalUtilizationRate),\n plateauInterestRate: new BigNumber(interestRateConfigDto.plateauInterestRate),\n maxInterestRate: new BigNumber(interestRateConfigDto.maxInterestRate),\n insuranceFeeFixedApr: new BigNumber(interestRateConfigDto.insuranceFeeFixedApr),\n insuranceIrFee: new BigNumber(interestRateConfigDto.insuranceIrFee),\n protocolFixedFeeApr: new BigNumber(interestRateConfigDto.protocolFixedFeeApr),\n protocolIrFee: new BigNumber(interestRateConfigDto.protocolIrFee),\n protocolOriginationFee: new BigNumber(interestRateConfigDto.protocolOriginationFee),\n zeroUtilRate: interestRateConfigDto.zeroUtilRate,\n hundredUtilRate: interestRateConfigDto.hundredUtilRate,\n points: interestRateConfigDto.points,\n curveType: interestRateConfigDto.curveType,\n };\n}\n\nexport function dtoToBankRaw(bankDto: BankRawDto): BankRaw {\n return {\n group: new PublicKey(bankDto.group),\n mint: new PublicKey(bankDto.mint),\n mintDecimals: bankDto.mintDecimals,\n\n assetShareValue: bankDto.assetShareValue,\n liabilityShareValue: bankDto.liabilityShareValue,\n\n liquidityVault: new PublicKey(bankDto.liquidityVault),\n liquidityVaultBump: bankDto.liquidityVaultBump,\n liquidityVaultAuthorityBump: bankDto.liquidityVaultAuthorityBump,\n\n insuranceVault: new PublicKey(bankDto.insuranceVault),\n insuranceVaultBump: bankDto.insuranceVaultBump,\n insuranceVaultAuthorityBump: bankDto.insuranceVaultAuthorityBump,\n collectedInsuranceFeesOutstanding: bankDto.collectedInsuranceFeesOutstanding,\n\n feeVault: new PublicKey(bankDto.feeVault),\n feeVaultBump: bankDto.feeVaultBump,\n feeVaultAuthorityBump: bankDto.feeVaultAuthorityBump,\n collectedGroupFeesOutstanding: bankDto.collectedGroupFeesOutstanding,\n\n lastUpdate: new BN(bankDto.lastUpdate),\n\n config: dtoToBankConfigRaw(bankDto.config),\n\n totalAssetShares: bankDto.totalAssetShares,\n totalLiabilityShares: bankDto.totalLiabilityShares,\n\n flags: new BN(bankDto.flags),\n emissionsRate: new BN(bankDto.emissionsRate),\n emissionsRemaining: bankDto.emissionsRemaining,\n emissionsMint: new PublicKey(bankDto.emissionsMint),\n feesDestinationAccount: bankDto.feesDestinationAccount ? new PublicKey(bankDto.feesDestinationAccount) : undefined,\n lendingPositionCount: bankDto.lendingPositionCount ? Number(bankDto.lendingPositionCount) : undefined,\n borrowingPositionCount: bankDto.borrowingPositionCount ? Number(bankDto.borrowingPositionCount) : undefined,\n\n emode: dtoToEmodeSettingsRaw(bankDto.emode),\n };\n}\n\nexport function dtoToEmodeSettingsRaw(emodeSettingsDto: EmodeSettingsRawDto): EmodeSettingsRaw {\n return {\n emodeTag: emodeSettingsDto.emodeTag,\n timestamp: new BN(emodeSettingsDto.timestamp),\n flags: new BN(emodeSettingsDto.flags),\n emodeConfig: {\n entries: emodeSettingsDto.emodeConfig.entries.map((entry) => {\n return {\n collateralBankEmodeTag: entry.collateralBankEmodeTag,\n flags: entry.flags,\n assetWeightInit: entry.assetWeightInit,\n assetWeightMaint: entry.assetWeightMaint,\n };\n }),\n },\n };\n}\n\nexport function dtoToBankConfigRaw(bankConfigDto: BankConfigRawDto): BankConfigRaw {\n return {\n assetWeightInit: bankConfigDto.assetWeightInit,\n assetWeightMaint: bankConfigDto.assetWeightMaint,\n liabilityWeightInit: bankConfigDto.liabilityWeightInit,\n liabilityWeightMaint: bankConfigDto.liabilityWeightMaint,\n depositLimit: new BN(bankConfigDto.depositLimit),\n borrowLimit: new BN(bankConfigDto.borrowLimit),\n riskTier: bankConfigDto.riskTier,\n operationalState: bankConfigDto.operationalState,\n totalAssetValueInitLimit: new BN(bankConfigDto.totalAssetValueInitLimit),\n assetTag: bankConfigDto.assetTag,\n configFlags: bankConfigDto.configFlags,\n oracleSetup: bankConfigDto.oracleSetup,\n oracleKeys: bankConfigDto.oracleKeys.map((key: string) => new PublicKey(key)),\n oracleMaxAge: bankConfigDto.oracleMaxAge,\n interestRateConfig: bankConfigDto.interestRateConfig,\n oracleMaxConfidence: bankConfigDto.oracleMaxConfidence,\n fixedPrice: bankConfigDto.fixedPrice,\n };\n}\n\n/*\n * Bank config deserialization\n */\n\nexport function parseBankConfigRaw(bankConfigRaw: BankConfigRaw): BankConfigType {\n const assetWeightInit = wrappedI80F48toBigNumber(bankConfigRaw.assetWeightInit);\n const assetWeightMaint = wrappedI80F48toBigNumber(bankConfigRaw.assetWeightMaint);\n const liabilityWeightInit = wrappedI80F48toBigNumber(bankConfigRaw.liabilityWeightInit);\n const liabilityWeightMaint = wrappedI80F48toBigNumber(bankConfigRaw.liabilityWeightMaint);\n const depositLimit = BigNumber(bankConfigRaw.depositLimit.toString());\n const borrowLimit = BigNumber(bankConfigRaw.borrowLimit.toString());\n const riskTier = parseRiskTier(bankConfigRaw.riskTier);\n const operationalState = parseOperationalState(bankConfigRaw.operationalState);\n const totalAssetValueInitLimit = BigNumber(bankConfigRaw.totalAssetValueInitLimit.toString());\n const assetTag = bankConfigRaw.assetTag as AssetTag;\n const configFlags = bankConfigRaw.configFlags;\n const oracleSetup = parseOracleSetup(bankConfigRaw.oracleSetup);\n const oracleKeys = bankConfigRaw.oracleKeys;\n const oracleMaxAge = bankConfigRaw.oracleMaxAge === 0 ? DEFAULT_ORACLE_MAX_AGE : bankConfigRaw.oracleMaxAge;\n const interestRateConfig = {\n insuranceFeeFixedApr: wrappedI80F48toBigNumber(bankConfigRaw.interestRateConfig.insuranceFeeFixedApr),\n maxInterestRate: wrappedI80F48toBigNumber(bankConfigRaw.interestRateConfig.maxInterestRate),\n insuranceIrFee: wrappedI80F48toBigNumber(bankConfigRaw.interestRateConfig.insuranceIrFee),\n optimalUtilizationRate: wrappedI80F48toBigNumber(bankConfigRaw.interestRateConfig.optimalUtilizationRate),\n plateauInterestRate: wrappedI80F48toBigNumber(bankConfigRaw.interestRateConfig.plateauInterestRate),\n protocolFixedFeeApr: wrappedI80F48toBigNumber(bankConfigRaw.interestRateConfig.protocolFixedFeeApr),\n protocolIrFee: wrappedI80F48toBigNumber(bankConfigRaw.interestRateConfig.protocolIrFee),\n protocolOriginationFee: wrappedI80F48toBigNumber(bankConfigRaw.interestRateConfig.protocolOriginationFee),\n zeroUtilRate: bankConfigRaw.interestRateConfig.zeroUtilRate,\n hundredUtilRate: bankConfigRaw.interestRateConfig.hundredUtilRate,\n points: bankConfigRaw.interestRateConfig.points,\n curveType: bankConfigRaw.interestRateConfig.curveType,\n };\n const oracleMaxConfidence = bankConfigRaw.oracleMaxConfidence;\n const fixedPrice = wrappedI80F48toBigNumber(bankConfigRaw.fixedPrice);\n\n return {\n assetWeightInit,\n assetWeightMaint,\n liabilityWeightInit,\n liabilityWeightMaint,\n depositLimit,\n borrowLimit,\n riskTier,\n operationalState,\n totalAssetValueInitLimit,\n assetTag,\n configFlags,\n oracleSetup,\n oracleKeys,\n oracleMaxAge,\n interestRateConfig,\n oracleMaxConfidence,\n fixedPrice,\n };\n}\n\nexport function parseRiskTier(riskTierRaw: RiskTierRaw): RiskTier {\n switch (Object.keys(riskTierRaw)[0].toLowerCase()) {\n case \"collateral\":\n return RiskTier.Collateral;\n case \"isolated\":\n return RiskTier.Isolated;\n default:\n throw new Error(`Invalid risk tier \"${riskTierRaw}\"`);\n }\n}\n\nexport function parseOperationalState(operationalStateRaw: OperationalStateRaw): OperationalState {\n switch (Object.keys(operationalStateRaw)[0].toLowerCase()) {\n case \"paused\":\n return OperationalState.Paused;\n case \"operational\":\n return OperationalState.Operational;\n case \"reduceonly\":\n return OperationalState.ReduceOnly;\n default:\n throw new Error(`Invalid operational state \"${operationalStateRaw}\"`);\n }\n}\n\nexport function parseOracleSetup(oracleSetupRaw: OracleSetupRaw): OracleSetup {\n const oracleKey = Object.keys(oracleSetupRaw)[0].toLowerCase();\n\n switch (oracleKey) {\n case \"none\":\n return OracleSetup.None;\n case \"pythlegacy\":\n return OracleSetup.PythLegacy;\n case \"switchboardv2\":\n return OracleSetup.SwitchboardV2;\n case \"pythpushoracle\":\n return OracleSetup.PythPushOracle;\n case \"switchboardpull\":\n return OracleSetup.SwitchboardPull;\n case \"stakedwithpythpush\":\n return OracleSetup.StakedWithPythPush;\n case \"kaminopythpush\":\n return OracleSetup.KaminoPythPush;\n case \"kaminoswitchboardpull\":\n return OracleSetup.KaminoSwitchboardPull;\n case \"fixed\":\n return OracleSetup.Fixed;\n default:\n return OracleSetup.None;\n }\n}\n\n/**\n * Get all active EMode flags as an array of flag names\n */\nexport function getActiveEmodeFlags(flags: BN): EmodeFlags[] {\n const activeFlags: EmodeFlags[] = [];\n\n for (const flagName in EmodeFlags) {\n const flag = EmodeFlags[flagName];\n\n if (typeof flag === \"number\" && hasEmodeFlag(flags, flag)) {\n activeFlags.push(flag);\n }\n }\n\n return activeFlags;\n}\n\n/**\n * Check if a specific EMode flag is set\n */\nexport function hasEmodeFlag(flags: BN, flag: number): boolean {\n return !flags.and(new BN(flag)).isZero();\n}\n\n/**\n * Get all active EMode entry flags as an array of flag names\n */\nexport function getActiveEmodeEntryFlags(flags: number): EmodeEntryFlags[] {\n const activeFlags: EmodeEntryFlags[] = [];\n\n for (const flagName in EmodeEntryFlags) {\n const flag = EmodeEntryFlags[flagName];\n\n if (typeof flag === \"number\" && hasEmodeEntryFlag(flags, flag)) {\n activeFlags.push(flag);\n }\n }\n\n return activeFlags;\n}\n\n/**\n * Check if a specific EMode entry flag is set\n */\nexport function hasEmodeEntryFlag(flags: number, flag: number): boolean {\n return (flags & flag) === flag;\n}\n\n/**\n * Parse a raw EMode tag number into the corresponding EmodeTag enum value\n */\nexport function parseEmodeTag(emodeTagRaw: number): EmodeTag {\n switch (emodeTagRaw) {\n case 0:\n return EmodeTag.UNSET;\n case 501:\n return EmodeTag.SOL;\n case 1571:\n return EmodeTag.LST_T1;\n case 1572:\n return EmodeTag.LST_T2;\n default:\n return EmodeTag.UNKNOWN;\n }\n}\n","import type { Buffer } from \"buffer\";\n\n// https://github.com/nodejs/node/blob/v14.17.0/lib/internal/errors.js#L758\nconst ERR_BUFFER_OUT_OF_BOUNDS = () => new Error(\"Attempt to access memory outside buffer bounds\");\n\n// https://github.com/nodejs/node/blob/v14.17.0/lib/internal/errors.js#L968\nconst ERR_INVALID_ARG_TYPE = (name: string, expected: string, actual: any) =>\n new Error(`The \"${name}\" argument must be of type ${expected}. Received ${actual}`);\n\n// https://github.com/nodejs/node/blob/v14.17.0/lib/internal/errors.js#L1262\nconst ERR_OUT_OF_RANGE = (str: string, range: string, received: number) =>\n new Error(`The value of \"${str} is out of range. It must be ${range}. Received ${received}`);\n\n// https://github.com/nodejs/node/blob/v14.17.0/lib/internal/validators.js#L127-L130\nfunction validateNumber(value: any, name: string) {\n if (typeof value !== \"number\") throw ERR_INVALID_ARG_TYPE(name, \"number\", value);\n}\n\n// https://github.com/nodejs/node/blob/v14.17.0/lib/internal/buffer.js#L68-L80\nfunction boundsError(value: number, length: number) {\n if (Math.floor(value) !== value) {\n validateNumber(value, \"offset\");\n throw ERR_OUT_OF_RANGE(\"offset\", \"an integer\", value);\n }\n\n if (length < 0) throw ERR_BUFFER_OUT_OF_BOUNDS();\n\n throw ERR_OUT_OF_RANGE(\"offset\", `>= 0 and <= ${length}`, value);\n}\n\n// https://github.com/nodejs/node/blob/v14.17.0/lib/internal/buffer.js#L129-L145\nexport function readBigInt64LE(buffer: Buffer, offset = 0): bigint {\n validateNumber(offset, \"offset\");\n const first = buffer[offset];\n const last = buffer[offset + 7];\n if (first === undefined || last === undefined) boundsError(offset, buffer.length - 8);\n // tslint:disable-next-line:no-bitwise\n const val = buffer[offset + 4] + buffer[offset + 5] * 2 ** 8 + buffer[offset + 6] * 2 ** 16 + (last << 24); // Overflow\n return (\n (BigInt(val) << BigInt(32)) + // tslint:disable-line:no-bitwise\n BigInt(first + buffer[++offset] * 2 ** 8 + buffer[++offset] * 2 ** 16 + buffer[++offset] * 2 ** 24)\n );\n}\n\n// https://github.com/nodejs/node/blob/v14.17.0/lib/internal/buffer.js#L89-L107\nexport function readBigUInt64LE(buffer: Buffer, offset = 0): bigint {\n validateNumber(offset, \"offset\");\n const first = buffer[offset];\n const last = buffer[offset + 7];\n if (first === undefined || last === undefined) boundsError(offset, buffer.length - 8);\n\n const lo = first + buffer[++offset] * 2 ** 8 + buffer[++offset] * 2 ** 16 + buffer[++offset] * 2 ** 24;\n\n const hi = buffer[++offset] + buffer[++offset] * 2 ** 8 + buffer[++offset] * 2 ** 16 + last * 2 ** 24;\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32)); // tslint:disable-line:no-bitwise\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { readBigInt64LE, readBigUInt64LE } from \"./readBig\";\n\n/** Number of slots that can pass before a publisher's price is no longer included in the aggregate. */\nexport const MAX_SLOT_DIFFERENCE = 25;\nconst empty32Buffer = Buffer.alloc(32);\nconst PKorNull = (data: Buffer) => (data.equals(empty32Buffer) ? null : new PublicKey(data));\n\nexport interface Price {\n priceComponent: bigint;\n price: number;\n confidenceComponent: bigint;\n confidence: number;\n status: PriceStatus;\n corporateAction: CorpAction;\n publishSlot: number;\n}\n\nexport enum PriceStatus {\n Unknown,\n Trading,\n Halted,\n Auction,\n Ignored,\n}\n\nexport enum CorpAction {\n NoCorpAct,\n}\n\nconst parsePriceInfo = (data: Buffer, exponent: number): Price => {\n // aggregate price\n const priceComponent = readBigInt64LE(data, 0);\n const price = Number(priceComponent) * 10 ** exponent;\n // aggregate confidence\n const confidenceComponent = readBigUInt64LE(data, 8);\n const confidence = Number(confidenceComponent) * 10 ** exponent;\n // aggregate status\n const status: PriceStatus = data.readUInt32LE(16);\n // aggregate corporate action\n const corporateAction: CorpAction = data.readUInt32LE(20);\n // aggregate publish slot. It is converted to number to be consistent with Solana's library interface (Slot there is number)\n const publishSlot = Number(readBigUInt64LE(data, 24));\n return {\n priceComponent,\n price,\n confidenceComponent,\n confidence,\n status,\n corporateAction,\n publishSlot,\n };\n};\n\nexport interface PriceData extends Base {\n priceType: PriceType;\n exponent: number;\n numComponentPrices: number;\n numQuoters: number;\n lastSlot: bigint;\n validSlot: bigint;\n emaPrice: Ema;\n emaConfidence: Ema;\n timestamp: bigint;\n minPublishers: number;\n drv2: number;\n drv3: number;\n drv4: number;\n productAccountKey: PublicKey;\n nextPriceAccountKey: PublicKey | null;\n previousSlot: bigint;\n previousPriceComponent: bigint;\n previousPrice: number;\n previousConfidenceComponent: bigint;\n previousConfidence: number;\n previousTimestamp: bigint;\n priceComponents: PriceComponent[];\n aggregate: Price;\n // The current price and confidence and status. The typical use of this interface is to consume these three fields.\n // If undefined, Pyth does not currently have price information for this product. This condition can\n // happen for various reasons (e.g., US equity market is closed, or insufficient publishers), and your\n // application should handle it gracefully. Note that other raw price information fields (such as\n // aggregate.price) may be defined even if this is undefined; you most likely should not use those fields,\n // as their value can be arbitrary when this is undefined.\n price: number | undefined;\n confidence: number | undefined;\n status: PriceStatus;\n}\n\nexport interface Base {\n magic: number;\n version: number;\n type: AccountType;\n size: number;\n}\n\nexport enum AccountType {\n Unknown,\n Mapping,\n Product,\n Price,\n Test,\n Permission,\n}\n\nexport enum PriceType {\n Unknown,\n Price,\n}\n\n/**\n * valueComponent = numerator / denominator\n * value = valueComponent * 10 ^ exponent (from PriceData)\n */\nexport interface Ema {\n valueComponent: bigint;\n value: number;\n numerator: bigint;\n denominator: bigint;\n}\n\nexport interface PriceComponent {\n publisher: PublicKey;\n aggregate: Price;\n latest: Price;\n}\n\n// Provide currentSlot when available to allow status to consider the case when price goes stale. It is optional because\n// it requires an extra request to get it when it is not available which is not always efficient.\nexport const parsePriceData = (data: Buffer, currentSlot?: number): PriceData => {\n // pyth magic number\n const magic = data.readUInt32LE(0);\n // program version\n const version = data.readUInt32LE(4);\n // account type\n const type = data.readUInt32LE(8);\n // price account size\n const size = data.readUInt32LE(12);\n // price or calculation type\n const priceType: PriceType = data.readUInt32LE(16);\n // price exponent\n const exponent = data.readInt32LE(20);\n // number of component prices\n const numComponentPrices = data.readUInt32LE(24);\n // number of quoters that make up aggregate\n const numQuoters = data.readUInt32LE(28);\n // slot of last valid (not unknown) aggregate price\n const lastSlot = readBigUInt64LE(data, 32);\n // valid on-chain slot of aggregate price\n const validSlot = readBigUInt64LE(data, 40);\n // exponential moving average price\n const emaPrice = parseEma(data.slice(48, 72), exponent);\n // exponential moving average confidence interval\n const emaConfidence = parseEma(data.slice(72, 96), exponent);\n // timestamp of the current price\n const timestamp = readBigInt64LE(data, 96);\n // minimum number of publishers for status to be TRADING\n const minPublishers = data.readUInt8(104);\n // space for future derived values\n const drv2 = data.readInt8(105);\n // space for future derived values\n const drv3 = data.readInt16LE(106);\n // space for future derived values\n const drv4 = data.readInt32LE(108);\n // product id / reference account\n const productAccountKey = new PublicKey(data.slice(112, 144));\n // next price account in list\n const nextPriceAccountKey = PKorNull(data.slice(144, 176));\n // valid slot of previous update\n const previousSlot = readBigUInt64LE(data, 176);\n // aggregate price of previous update\n const previousPriceComponent = readBigInt64LE(data, 184);\n const previousPrice = Number(previousPriceComponent) * 10 ** exponent;\n // confidence interval of previous update\n const previousConfidenceComponent = readBigUInt64LE(data, 192);\n const previousConfidence = Number(previousConfidenceComponent) * 10 ** exponent;\n // space for future derived values\n const previousTimestamp = readBigInt64LE(data, 200);\n const aggregate = parsePriceInfo(data.slice(208, 240), exponent);\n\n let status = aggregate.status;\n\n if (currentSlot && status === PriceStatus.Trading) {\n if (currentSlot - aggregate.publishSlot > MAX_SLOT_DIFFERENCE) {\n status = PriceStatus.Unknown;\n }\n }\n\n let price: number | undefined;\n let confidence: number | undefined;\n if (status === PriceStatus.Trading) {\n price = aggregate.price;\n confidence = aggregate.confidence;\n }\n\n // price components - up to 32\n const priceComponents: PriceComponent[] = [];\n let offset = 240;\n while (priceComponents.length < numComponentPrices) {\n const publisher = new PublicKey(data.slice(offset, offset + 32));\n offset += 32;\n const componentAggregate = parsePriceInfo(data.slice(offset, offset + 32), exponent);\n offset += 32;\n const latest = parsePriceInfo(data.slice(offset, offset + 32), exponent);\n offset += 32;\n priceComponents.push({ publisher, aggregate: componentAggregate, latest });\n }\n\n return {\n magic,\n version,\n type,\n size,\n priceType,\n exponent,\n numComponentPrices,\n numQuoters,\n lastSlot,\n validSlot,\n emaPrice,\n emaConfidence,\n timestamp,\n minPublishers,\n drv2,\n drv3,\n drv4,\n productAccountKey,\n nextPriceAccountKey,\n previousSlot,\n previousPriceComponent,\n previousPrice,\n previousConfidenceComponent,\n previousConfidence,\n previousTimestamp,\n aggregate,\n priceComponents,\n price,\n confidence,\n status,\n };\n};\n\nconst parseEma = (data: Buffer, exponent: number): Ema => {\n // current value of ema\n const valueComponent = readBigInt64LE(data, 0);\n const value = Number(valueComponent) * 10 ** exponent;\n // numerator state for next update\n const numerator = readBigInt64LE(data, 8);\n // denominator state for next update\n const denominator = readBigInt64LE(data, 16);\n return { valueComponent, value, numerator, denominator };\n};\n","import BigNumber from \"bignumber.js\";\nimport * as borsh from \"borsh\";\n\ntype PriceUpdateV2 = {\n writeAuthority: Buffer;\n verificationLevel: number;\n priceMessage: {\n feedId: Buffer;\n price: bigint;\n conf: bigint;\n exponent: number;\n publishTime: bigint;\n prevPublishTime: bigint;\n emaPrice: bigint;\n emaConf: bigint;\n };\n};\n\nconst priceUpdateV2Schema = {\n struct: {\n writeAuthority: {\n array: { type: \"u8\", len: 32 },\n },\n verificationLevel: \"u8\",\n priceMessage: {\n struct: {\n feedId: { array: { type: \"u8\", len: 32 } },\n price: \"i64\",\n conf: \"u64\",\n exponent: \"i32\",\n publishTime: \"i64\",\n prevPublishTime: \"i64\",\n emaPrice: \"i64\",\n emaConf: \"u64\",\n },\n },\n postedSlot: \"u64\",\n },\n};\n\nexport const parsePriceInfo = (data: Buffer): PriceUpdateV2 => {\n const decoded: PriceUpdateV2 = borsh.deserialize(priceUpdateV2Schema, data) as any;\n return decoded;\n};\n\nfunction capConfidenceInterval(price: BigNumber, confidence: BigNumber, maxConfidence: BigNumber): BigNumber {\n const maxConfidenceInterval = price.times(maxConfidence);\n\n return BigNumber.min(confidence, maxConfidenceInterval);\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\n/**\n * Parsed content of an on-chain StakeAccount\n *\n * Copied from https://github.com/solana-developers/solana-rpc-get-stake-activation/blob/main/web3js-1.0/src/stake.ts\n * */\nexport type StakeAccount = {\n discriminant: bigint;\n meta: {\n rentExemptReserve: bigint;\n authorized: {\n staker: PublicKey;\n withdrawer: PublicKey;\n };\n lockup: {\n unixTimestamp: bigint;\n epoch: bigint;\n custodian: PublicKey;\n };\n };\n stake: {\n delegation: {\n voterPubkey: PublicKey;\n stake: bigint;\n activationEpoch: bigint;\n deactivationEpoch: bigint;\n };\n creditsObserved: bigint;\n };\n};\n\n/**\n * Decode a StakeAccount from parsed account data.\n *\n * Copied from https://github.com/solana-developers/solana-rpc-get-stake-activation/blob/main/web3js-1.0/src/stake.ts\n * */\nexport const getStakeAccount = (data: Buffer): StakeAccount => {\n let offset = 0;\n\n // Discriminant (4 bytes)\n const discriminant = data.readBigUInt64LE(offset);\n offset += 4;\n\n // Meta\n const rentExemptReserve = data.readBigUInt64LE(offset);\n offset += 8;\n\n // Authorized staker and withdrawer (2 public keys)\n const staker = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n const withdrawer = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n // Lockup: unixTimestamp, epoch, custodian\n const unixTimestamp = data.readBigUInt64LE(offset);\n offset += 8;\n const epoch = data.readBigUInt64LE(offset);\n offset += 8;\n const custodian = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n // Stake: Delegation\n const voterPubkey = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n const stake = data.readBigUInt64LE(offset);\n offset += 8;\n const activationEpoch = data.readBigUInt64LE(offset);\n offset += 8;\n const deactivationEpoch = data.readBigUInt64LE(offset);\n offset += 8;\n\n // Credits observed\n const creditsObserved = data.readBigUInt64LE(offset);\n\n // Return the parsed StakeAccount object\n return {\n discriminant,\n meta: {\n rentExemptReserve,\n authorized: {\n staker,\n withdrawer,\n },\n lockup: {\n unixTimestamp,\n epoch,\n custodian,\n },\n },\n stake: {\n delegation: {\n voterPubkey,\n stake,\n activationEpoch,\n deactivationEpoch,\n },\n creditsObserved,\n },\n };\n};\n","import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport {\n type Connection,\n LAMPORTS_PER_SOL,\n PublicKey,\n STAKE_CONFIG_ID,\n StakeProgram,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport type BigNumber from \"bignumber.js\";\nimport { BN } from \"bn.js\";\nimport {\n MPL_METADATA_PROGRAM_ID,\n SINGLE_POOL_PROGRAM_ID,\n STAKE_PROGRAM_ID,\n SYSTEM_PROGRAM_ID,\n SYSVAR_CLOCK_ID,\n SYSVAR_RENT_ID,\n SYSVAR_STAKE_HISTORY_ID,\n} from \"@/constants\";\n\ninterface AccountMeta {\n pubkey: PublicKey;\n isSigner: boolean;\n isWritable: boolean;\n}\n\n// Instruction type enum\nenum SinglePoolInstructionType {\n InitializePool = 0,\n ReplenishPool,\n DepositStake,\n WithdrawStake,\n CreateTokenMetadata,\n UpdateTokenMetadata,\n InitializeOnRamp,\n}\n\nconst SinglePoolInstruction = {\n initializePool: (voteAccount: PublicKey): TransactionInstruction => {\n const pool = findPoolAddress(voteAccount);\n const stake = findPoolStakeAddress(pool);\n const mint = findPoolMintAddress(pool);\n const stakeAuthority = findPoolStakeAuthorityAddress(pool);\n const mintAuthority = findPoolMintAuthorityAddress(pool);\n\n return createTransactionInstruction(\n SINGLE_POOL_PROGRAM_ID,\n [\n { pubkey: voteAccount, isSigner: false, isWritable: false },\n { pubkey: pool, isSigner: false, isWritable: true },\n { pubkey: stake, isSigner: false, isWritable: true },\n { pubkey: mint, isSigner: false, isWritable: true },\n { pubkey: stakeAuthority, isSigner: false, isWritable: false },\n { pubkey: mintAuthority, isSigner: false, isWritable: false },\n { pubkey: SYSVAR_RENT_ID, isSigner: false, isWritable: false },\n { pubkey: SYSVAR_CLOCK_ID, isSigner: false, isWritable: false },\n { pubkey: SYSVAR_STAKE_HISTORY_ID, isSigner: false, isWritable: false },\n { pubkey: STAKE_CONFIG_ID, isSigner: false, isWritable: false },\n { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: STAKE_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n Buffer.from([SinglePoolInstructionType.InitializePool]),\n );\n },\n\n initializeOnRamp: (pool: PublicKey): TransactionInstruction => {\n const onRamp = findPoolOnRampAddress(pool);\n const stakeAuthority = findPoolStakeAuthorityAddress(pool);\n\n return createTransactionInstruction(\n SINGLE_POOL_PROGRAM_ID,\n [\n { pubkey: pool, isSigner: false, isWritable: false },\n { pubkey: onRamp, isSigner: false, isWritable: true },\n { pubkey: stakeAuthority, isSigner: false, isWritable: false },\n { pubkey: SYSVAR_RENT_ID, isSigner: false, isWritable: false },\n { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: STAKE_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n Buffer.from([SinglePoolInstructionType.InitializeOnRamp]),\n );\n },\n\n depositStake: async (\n pool: PublicKey,\n userStakeAccount: PublicKey,\n userTokenAccount: PublicKey,\n userLamportAccount: PublicKey,\n ): Promise<TransactionInstruction> => {\n const stake = findPoolStakeAddress(pool);\n const mint = findPoolMintAddress(pool);\n const stakeAuthority = findPoolStakeAuthorityAddress(pool);\n const mintAuthority = findPoolMintAuthorityAddress(pool);\n\n return createTransactionInstruction(\n SINGLE_POOL_PROGRAM_ID,\n [\n { pubkey: pool, isSigner: false, isWritable: false },\n { pubkey: stake, isSigner: false, isWritable: true },\n { pubkey: mint, isSigner: false, isWritable: true },\n { pubkey: stakeAuthority, isSigner: false, isWritable: false },\n { pubkey: mintAuthority, isSigner: false, isWritable: false },\n { pubkey: userStakeAccount, isSigner: false, isWritable: true },\n { pubkey: userTokenAccount, isSigner: false, isWritable: true },\n { pubkey: userLamportAccount, isSigner: false, isWritable: true },\n { pubkey: SYSVAR_CLOCK_ID, isSigner: false, isWritable: false },\n { pubkey: SYSVAR_STAKE_HISTORY_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: STAKE_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n Buffer.from([SinglePoolInstructionType.DepositStake]),\n );\n },\n\n withdrawStake: async (\n pool: PublicKey,\n userStakeAccount: PublicKey,\n userStakeAuthority: PublicKey,\n userTokenAccount: PublicKey,\n tokenAmount: BigNumber,\n ): Promise<TransactionInstruction> => {\n const stake = findPoolStakeAddress(pool);\n const mint = findPoolMintAddress(pool);\n const stakeAuthority = findPoolStakeAuthorityAddress(pool);\n const mintAuthority = findPoolMintAuthorityAddress(pool);\n\n // Try using BigInt for more precise conversion\n const rawAmount = BigInt(tokenAmount.multipliedBy(1e9).toString());\n\n const data = Buffer.concat([\n Buffer.from([SinglePoolInstructionType.WithdrawStake]),\n userStakeAuthority.toBuffer(),\n Buffer.from(new BN(rawAmount.toString()).toArray(\"le\", 8)),\n ]);\n\n return createTransactionInstruction(\n SINGLE_POOL_PROGRAM_ID,\n [\n { pubkey: pool, isSigner: false, isWritable: false },\n { pubkey: stake, isSigner: false, isWritable: true },\n { pubkey: mint, isSigner: false, isWritable: true },\n { pubkey: stakeAuthority, isSigner: false, isWritable: false },\n { pubkey: mintAuthority, isSigner: false, isWritable: false },\n { pubkey: userStakeAccount, isSigner: false, isWritable: true },\n { pubkey: userTokenAccount, isSigner: false, isWritable: true },\n { pubkey: SYSVAR_CLOCK_ID, isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: STAKE_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n data,\n );\n },\n\n createTokenMetadata: async (pool: PublicKey, payer: PublicKey): Promise<TransactionInstruction> => {\n const mint = findPoolMintAddress(pool);\n const [mintAuthority, mplAuthority, mplMetadata] = await Promise.all([\n findPoolMintAuthorityAddress(pool),\n findPoolMplAuthorityAddress(pool),\n findMplMetadataAddress(mint),\n ]);\n\n return createTransactionInstruction(\n SINGLE_POOL_PROGRAM_ID,\n [\n { pubkey: pool, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: mintAuthority, isSigner: false, isWritable: false },\n { pubkey: mplAuthority, isSigner: false, isWritable: false },\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: mplMetadata, isSigner: false, isWritable: true },\n { pubkey: MPL_METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n Buffer.from([SinglePoolInstructionType.CreateTokenMetadata]),\n );\n },\n\n updateTokenMetadata: async (\n voteAccount: PublicKey,\n authorizedWithdrawer: PublicKey,\n tokenName: string,\n tokenSymbol: string,\n tokenUri: string = \"\",\n ): Promise<TransactionInstruction> => {\n if (tokenName.length > 32) {\n throw new Error(\"maximum token name length is 32 characters\");\n }\n if (tokenSymbol.length > 10) {\n throw new Error(\"maximum token symbol length is 10 characters\");\n }\n if (tokenUri.length > 200) {\n throw new Error(\"maximum token uri length is 200 characters\");\n }\n\n const pool = findPoolAddress(voteAccount);\n const [mint, mplAuthority] = await Promise.all([findPoolMintAddress(pool), findPoolMplAuthorityAddress(pool)]);\n const mplMetadata = await findMplMetadataAddress(mint);\n\n const data = Buffer.concat([\n Buffer.from([SinglePoolInstructionType.UpdateTokenMetadata]),\n Buffer.from(new Uint32Array([tokenName.length]).buffer),\n Buffer.from(tokenName),\n Buffer.from(new Uint32Array([tokenSymbol.length]).buffer),\n Buffer.from(tokenSymbol),\n Buffer.from(new Uint32Array([tokenUri.length]).buffer),\n Buffer.from(tokenUri),\n ]);\n\n return createTransactionInstruction(\n SINGLE_POOL_PROGRAM_ID,\n [\n { pubkey: voteAccount, isSigner: false, isWritable: false },\n { pubkey: pool, isSigner: false, isWritable: false },\n { pubkey: mplAuthority, isSigner: false, isWritable: false },\n { pubkey: authorizedWithdrawer, isSigner: true, isWritable: false },\n { pubkey: mplMetadata, isSigner: false, isWritable: true },\n { pubkey: MPL_METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n data,\n );\n },\n};\n\nconst createTransactionInstruction = (\n programId: PublicKey,\n keys: AccountMeta[],\n data: Buffer,\n): TransactionInstruction => {\n return {\n programId,\n keys,\n data,\n };\n};\n\nconst findPda = (baseAddress: PublicKey, prefix: string, programId: PublicKey = SINGLE_POOL_PROGRAM_ID): PublicKey => {\n const [pda] = PublicKey.findProgramAddressSync([Buffer.from(prefix), baseAddress.toBuffer()], programId);\n return pda;\n};\n\nconst findPoolMintAddressByVoteAccount = (voteAccountAddress: PublicKey): PublicKey =>\n findPda(findPoolAddress(voteAccountAddress), \"mint\");\nconst findPoolAddress = (voteAccountAddress: PublicKey): PublicKey => findPda(voteAccountAddress, \"pool\");\nconst findPoolMintAddress = (poolAddress: PublicKey): PublicKey => findPda(poolAddress, \"mint\");\nconst findPoolStakeAddress = (poolAddress: PublicKey): PublicKey => findPda(poolAddress, \"stake\");\nconst findPoolStakeAuthorityAddress = (poolAddress: PublicKey): PublicKey => findPda(poolAddress, \"stake_authority\");\nconst findPoolMintAuthorityAddress = (poolAddress: PublicKey): PublicKey => findPda(poolAddress, \"mint_authority\");\nconst findPoolMplAuthorityAddress = (poolAddress: PublicKey): PublicKey => findPda(poolAddress, \"mpl_authority\");\nconst findPoolOnRampAddress = (poolAddress: PublicKey): PublicKey => findPda(poolAddress, \"onramp\");\n\nconst findMplMetadataAddress = async (poolMintAddress: PublicKey): Promise<PublicKey> => {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"metadata\"), MPL_METADATA_PROGRAM_ID.toBuffer(), poolMintAddress.toBuffer()],\n MPL_METADATA_PROGRAM_ID,\n );\n return pda;\n};\n\nconst SINGLE_POOL_ACCOUNT_SIZE = BigInt(33);\nconst STAKE_ACCOUNT_SIZE = BigInt(200);\nconst MINT_SIZE = BigInt(82);\n\nasync function initializeStakedPoolTx(connection: Connection, payer: PublicKey, voteAccountAddress: PublicKey) {\n const instructions = await initializeStakedPoolIxs(connection, payer, voteAccountAddress);\n const tx = new Transaction().add(...instructions);\n return tx;\n}\n\nasync function initializeStakedPoolIxs(connection: Connection, payer: PublicKey, voteAccountAddress: PublicKey) {\n const poolAddress = findPoolAddress(voteAccountAddress);\n\n const stakeAddress = findPoolStakeAddress(poolAddress);\n const mintAddress = findPoolMintAddress(poolAddress);\n const onRampAddress = findPoolOnRampAddress(poolAddress);\n\n // get min rent\n const [poolRent, stakeRent, mintRent, minimumDelegationObj] = await Promise.all([\n connection.getMinimumBalanceForRentExemption(Number(SINGLE_POOL_ACCOUNT_SIZE), \"confirmed\"),\n connection.getMinimumBalanceForRentExemption(Number(STAKE_ACCOUNT_SIZE), \"confirmed\"),\n connection.getMinimumBalanceForRentExemption(Number(MINT_SIZE), \"confirmed\"),\n connection.getStakeMinimumDelegation(),\n ]);\n\n const minimumDelegation = minimumDelegationObj.value;\n\n const instructions: TransactionInstruction[] = [];\n\n // instructions\n instructions.push(SystemProgram.transfer({ fromPubkey: payer, toPubkey: poolAddress, lamports: poolRent }));\n instructions.push(\n SystemProgram.transfer({\n fromPubkey: payer,\n toPubkey: stakeAddress,\n lamports: stakeRent + minimumDelegation + LAMPORTS_PER_SOL * 1,\n }),\n );\n instructions.push(SystemProgram.transfer({ fromPubkey: payer, toPubkey: onRampAddress, lamports: stakeRent }));\n instructions.push(SystemProgram.transfer({ fromPubkey: payer, toPubkey: mintAddress, lamports: mintRent }));\n\n instructions.push(SinglePoolInstruction.initializePool(voteAccountAddress));\n instructions.push(SinglePoolInstruction.initializeOnRamp(poolAddress));\n instructions.push(await SinglePoolInstruction.createTokenMetadata(poolAddress, payer));\n\n return instructions;\n}\n\nconst createAccountIx = (\n from: PublicKey,\n newAccount: PublicKey,\n lamports: number,\n space: number,\n programAddress: PublicKey,\n) => {\n const data = Buffer.concat([\n Buffer.from([0]), // Assuming the first byte is an instruction type or similar\n Buffer.from(new BN(lamports).toArray(\"le\", 8)),\n Buffer.from(new BN(space).toArray(\"le\", 8)),\n programAddress.toBuffer(),\n ]);\n\n const accounts = [\n { pubkey: from, isSigner: true, isWritable: true },\n { pubkey: newAccount, isSigner: true, isWritable: true },\n ];\n\n return createTransactionInstruction(SYSTEM_PROGRAM_ID, accounts, data);\n};\n\nconst createPoolOnrampIx = (voteAccount: PublicKey): TransactionInstruction => {\n const poolAccount = findPoolAddress(voteAccount);\n const onRampAccount = findPoolOnRampAddress(poolAccount);\n const poolStakeAuthority = findPoolStakeAuthorityAddress(poolAccount);\n\n const keys = [\n { pubkey: poolAccount, isSigner: false, isWritable: false },\n { pubkey: onRampAccount, isSigner: false, isWritable: true },\n { pubkey: poolStakeAuthority, isSigner: false, isWritable: false },\n { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: StakeProgram.programId, isSigner: false, isWritable: false },\n ];\n\n // TODO don't hard code the instruction index? (or why not, it's not gna change is it?)\n const data = Buffer.from(Uint8Array.of(6));\n\n return new TransactionInstruction({\n keys,\n programId: SINGLE_POOL_PROGRAM_ID,\n data,\n });\n};\n\nconst replenishPoolIx = (voteAccount: PublicKey): TransactionInstruction => {\n const poolAccount = findPoolAddress(voteAccount);\n const stakePool = findPoolStakeAddress(poolAccount);\n const onRampPool = findPoolOnRampAddress(poolAccount);\n const authority = findPoolStakeAuthorityAddress(poolAccount);\n\n const keys = [\n { pubkey: voteAccount, isSigner: false, isWritable: false },\n { pubkey: poolAccount, isSigner: false, isWritable: false },\n { pubkey: stakePool, isSigner: false, isWritable: true },\n { pubkey: onRampPool, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: false, isWritable: false },\n { pubkey: SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false },\n { pubkey: SYSVAR_STAKE_HISTORY_ID, isSigner: false, isWritable: false },\n { pubkey: STAKE_CONFIG_ID, isSigner: false, isWritable: false },\n { pubkey: StakeProgram.programId, isSigner: false, isWritable: false },\n ];\n\n // TODO don't hard code the instruction index? (or why not, it's not gna change is it?)\n const data = Buffer.from(Uint8Array.of(1));\n\n return createTransactionInstruction(SINGLE_POOL_PROGRAM_ID, keys, data);\n};\n\nexport {\n SinglePoolInstruction,\n initializeStakedPoolIxs,\n initializeStakedPoolTx,\n findPoolAddress,\n findPoolMintAddress,\n findPoolStakeAddress,\n findPoolStakeAuthorityAddress,\n findPoolMintAuthorityAddress,\n findPoolMplAuthorityAddress,\n findMplMetadataAddress,\n findPoolOnRampAddress,\n findPoolMintAddressByVoteAccount,\n createAccountIx,\n createPoolOnrampIx,\n replenishPoolIx,\n};\n","import * as anchor from \"@coral-xyz/anchor\";\n\nexport class Account {\n program;\n publicKey;\n /**\n * Account constructor\n * @param program SwitchboardProgram\n * @param publicKey PublicKey of the on-chain resource\n */\n constructor(program: any, publicKey: anchor.web3.PublicKey) {\n this.program = program;\n this.publicKey = typeof publicKey === \"string\" ? new anchor.web3.PublicKey(publicKey) : publicKey;\n }\n}\nexport const BUFFER_DISCRIMINATOR = Buffer.from([\n 66,\n 85,\n 70,\n 70,\n 69,\n 82,\n 120,\n 120, // BUFFERxx\n]);\n","import { Account } from \"./account\";\n\nexport class AggregatorAccount extends Account {\n static decodeLatestValue(aggregator: { latestConfirmedRound: { numSuccess: any; result: { toBig: () => any } } }) {\n if ((aggregator.latestConfirmedRound?.numSuccess ?? 0) === 0) {\n return null;\n }\n const result = aggregator.latestConfirmedRound.result.toBig();\n return result;\n }\n}\n","import * as borsh from \"@coral-xyz/borsh\";\n\nexport class ModeRoundResolution {\n static discriminator = 0;\n static kind = \"ModeRoundResolution\";\n discriminator = 0;\n kind = \"ModeRoundResolution\";\n toJSON() {\n return {\n kind: \"ModeRoundResolution\",\n };\n }\n toEncodable() {\n return {\n ModeRoundResolution: {},\n };\n }\n}\nexport class ModeSlidingResolution {\n static discriminator = 1;\n static kind = \"ModeSlidingResolution\";\n discriminator = 1;\n kind = \"ModeSlidingResolution\";\n toJSON() {\n return {\n kind: \"ModeSlidingResolution\",\n };\n }\n toEncodable() {\n return {\n ModeSlidingResolution: {},\n };\n }\n}\nexport function fromDecoded(obj: any) {\n if (typeof obj !== \"object\") {\n throw new Error(\"Invalid enum object\");\n }\n if (\"ModeRoundResolution\" in obj) {\n return new ModeRoundResolution();\n }\n if (\"ModeSlidingResolution\" in obj) {\n return new ModeSlidingResolution();\n }\n throw new Error(\"Invalid enum object\");\n}\nexport function fromJSON(obj: any) {\n switch (obj.kind) {\n case \"ModeRoundResolution\": {\n return new ModeRoundResolution();\n }\n case \"ModeSlidingResolution\": {\n return new ModeSlidingResolution();\n }\n }\n}\nexport function layout(property: any) {\n const ret = borsh.rustEnum([borsh.struct([], \"ModeRoundResolution\"), borsh.struct([], \"ModeSlidingResolution\")]);\n if (property !== undefined) {\n return ret.replicate(property);\n }\n return ret;\n}\n","import * as borsh from \"@coral-xyz/borsh\";\nimport Big from \"big.js\";\nimport BN from \"bn.js\";\n\n// import { Big, BN } from \"@switchboard-xyz/common\"; // eslint-disable-line @typescript-eslint/no-unused-vars\nexport class SwitchboardDecimal {\n /**\n * The part of a floating-point number that represents the significant digits of that number,\n * and that is multiplied by the base, 10, raised to the power of scale to give the actual value of the number.\n */\n mantissa;\n /** The number of decimal places to move to the left to yield the actual value. */\n scale;\n constructor(fields: { mantissa: any; scale: any }) {\n this.mantissa = fields.mantissa;\n this.scale = fields.scale;\n }\n static layout(property: any) {\n return borsh.struct([borsh.i128(\"mantissa\"), borsh.u32(\"scale\")], property);\n }\n static fromDecoded(obj: { mantissa: any; scale: any }) {\n return new SwitchboardDecimal({\n mantissa: obj.mantissa,\n scale: obj.scale,\n });\n }\n static toEncodable(fields: any) {\n return {\n mantissa: fields.mantissa,\n scale: fields.scale,\n };\n }\n toJSON() {\n return {\n mantissa: this.mantissa.toString(),\n scale: this.scale,\n };\n }\n static fromJSON(obj: { mantissa: string | number | BN | number[] | Uint8Array | Buffer; scale: any }) {\n return new SwitchboardDecimal({\n mantissa: new BN(obj.mantissa),\n scale: obj.scale,\n });\n }\n // toEncodable() {\n // return SwitchboardDecimal.toEncodable(this);\n // }\n /**\n * Convert untyped object to a Switchboard decimal, if possible.\n * @param obj raw object to convert from\n * @return SwitchboardDecimal\n */\n static from(obj: { mantissa: string | number | BN | number[] | Uint8Array | Buffer; scale: any }) {\n return new SwitchboardDecimal({\n mantissa: new BN(obj.mantissa),\n scale: obj.scale,\n });\n }\n /**\n * Convert a Big.js decimal to a Switchboard decimal.\n * @param big a Big.js decimal\n * @return a SwitchboardDecimal\n */\n static fromBig(big: {\n round: (arg0: number) => any;\n c: {\n join: (arg0: string) => string | number | BN | number[] | Uint8Array | Buffer;\n slice: (arg0: number) => { (): any; new (): any; length: number };\n };\n e: number;\n s: string | number | BN | number[] | Uint8Array | Buffer;\n // sub: (arg0: Big) => {\n // (): any;\n // new (): any;\n // abs: {\n // (): { (): any; new (): any; gt: { (arg0: Big): any; new (): any } };\n // new (): any;\n // };\n // };\n toNumber: () => any;\n }) {\n // Round to fit in Switchboard Decimal\n // TODO: smarter logic.\n big = big.round(20);\n let mantissa = new BN(big.c.join(\"\"), 10);\n // Set the scale. Big.exponenet sets scale from the opposite side\n // SwitchboardDecimal does.\n let scale = big.c.slice(1).length - big.e;\n if (scale < 0) {\n mantissa = mantissa.mul(new BN(10, 10).pow(new BN(Math.abs(scale), 10)));\n scale = 0;\n }\n if (scale < 0) {\n throw new Error(\"SwitchboardDecimal: Unexpected negative scale.\");\n }\n if (scale >= 28) {\n throw new Error(\"SwitchboardDecimalExcessiveScaleError\");\n }\n // Set sign for the coefficient (mantissa)\n mantissa = mantissa.mul(new BN(big.s, 10));\n const result = new SwitchboardDecimal({ mantissa, scale });\n // if (big.sub(result.toBig()).abs().gt(new Big(0.00005))) {\n // throw new Error(\n // \"SwitchboardDecimal: Converted decimal does not match original:\\n\" +\n // `out: ${result.toBig().toNumber()} vs in: ${big.toNumber()}\\n` +\n // `-- result mantissa and scale: ${result.mantissa.toString()} ${result.scale.toString()}\\n` +\n // `${result} ${result.toBig()}`\n // );\n // }\n return result;\n }\n /**\n * SwitchboardDecimal equality comparator.\n * @param other object to compare to.\n * @return true iff equal\n */\n eq(other: { mantissa: any; scale: any }) {\n return this.mantissa.eq(other.mantissa) && this.scale === other.scale;\n }\n /**\n * Convert SwitchboardDecimal to big.js Big type.\n * @return Big representation\n */\n toBig() {\n let mantissa = new BN(this.mantissa, 10);\n let s = 1;\n const c: Array<number> = [];\n const ZERO = new BN(0, 10);\n const TEN = new BN(10, 10);\n if (mantissa.lt(ZERO)) {\n s = -1;\n mantissa = mantissa.abs();\n }\n while (mantissa.gt(ZERO)) {\n c.unshift(mantissa.mod(TEN).toNumber());\n mantissa = mantissa.div(TEN);\n }\n const e = c.length - this.scale - 1;\n const result = new Big(0);\n if (c.length === 0) {\n return result;\n }\n result.s = s;\n result.c = c;\n result.e = e;\n return result;\n }\n // toString() {\n // return this.toBig().toString();\n // }\n}\n","// import * as types from \"../types/index.js\"; // eslint-disable-line @typescript-eslint/no-unused-vars\n\nimport * as borsh from \"@coral-xyz/borsh\";\nimport { PublicKey, type PublicKeyInitData } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n// import { BN } from \"@switchboard-xyz/common\"; // eslint-disable-line @typescript-eslint/no-unused-vars\nimport { SwitchboardDecimal } from \"./switchboardDecimal\";\n\nexport class AggregatorRound {\n /**\n * Maintains the number of successful responses received from nodes.\n * Nodes can submit one successful response per round.\n */\n numSuccess;\n /** Number of error responses. */\n numError;\n /** Whether an update request round has ended. */\n isClosed;\n /** Maintains the `solana_program::clock::Slot` that the round was opened at. */\n roundOpenSlot;\n /** Maintains the `solana_program::clock::UnixTimestamp;` the round was opened at. */\n roundOpenTimestamp;\n /** Maintains the current median of all successful round responses. */\n result;\n /** Standard deviation of the accepted results in the round. */\n stdDeviation;\n /** Maintains the minimum node response this round. */\n minResponse;\n /** Maintains the maximum node response this round. */\n maxResponse;\n /** Pubkeys of the oracles fulfilling this round. */\n oraclePubkeysData;\n /** Represents all successful node responses this round. `NaN` if empty. */\n mediansData;\n /** Current rewards/slashes oracles have received this round. */\n currentPayout;\n /** Keep track of which responses are fulfilled here. */\n mediansFulfilled;\n /** Keeps track of which errors are fulfilled here. */\n errorsFulfilled;\n constructor(fields: any) {\n this.numSuccess = fields.numSuccess;\n this.numError = fields.numError;\n this.isClosed = fields.isClosed;\n this.roundOpenSlot = fields.roundOpenSlot;\n this.roundOpenTimestamp = fields.roundOpenTimestamp;\n this.result = new SwitchboardDecimal({ ...fields.result });\n this.stdDeviation = new SwitchboardDecimal({\n ...fields.stdDeviation,\n });\n this.minResponse = new SwitchboardDecimal({ ...fields.minResponse });\n this.maxResponse = new SwitchboardDecimal({ ...fields.maxResponse });\n this.oraclePubkeysData = fields.oraclePubkeysData;\n this.mediansData = fields.mediansData.map((item: any) => new SwitchboardDecimal({ ...item }));\n this.currentPayout = fields.currentPayout;\n this.mediansFulfilled = fields.mediansFulfilled;\n this.errorsFulfilled = fields.errorsFulfilled;\n }\n static layout(property: any) {\n return borsh.struct(\n [\n borsh.u32(\"numSuccess\"),\n borsh.u32(\"numError\"),\n borsh.bool(\"isClosed\"),\n borsh.u64(\"roundOpenSlot\"),\n borsh.i64(\"roundOpenTimestamp\"),\n SwitchboardDecimal.layout(\"result\"),\n SwitchboardDecimal.layout(\"stdDeviation\"),\n SwitchboardDecimal.layout(\"minResponse\"),\n SwitchboardDecimal.layout(\"maxResponse\"),\n borsh.array(borsh.publicKey(), 16, \"oraclePubkeysData\"),\n borsh.array(SwitchboardDecimal.layout({}), 16, \"mediansData\"),\n borsh.array(borsh.i64(), 16, \"currentPayout\"),\n borsh.array(borsh.bool(), 16, \"mediansFulfilled\"),\n borsh.array(borsh.bool(), 16, \"errorsFulfilled\"),\n ],\n property,\n );\n }\n static fromDecoded(obj: any) {\n return new AggregatorRound({\n numSuccess: obj.numSuccess,\n numError: obj.numError,\n isClosed: obj.isClosed,\n roundOpenSlot: obj.roundOpenSlot,\n roundOpenTimestamp: obj.roundOpenTimestamp,\n result: SwitchboardDecimal.fromDecoded(obj.result),\n stdDeviation: SwitchboardDecimal.fromDecoded(obj.stdDeviation),\n minResponse: SwitchboardDecimal.fromDecoded(obj.minResponse),\n maxResponse: SwitchboardDecimal.fromDecoded(obj.maxResponse),\n oraclePubkeysData: obj.oraclePubkeysData,\n mediansData: obj.mediansData.map((item: any) => SwitchboardDecimal.fromDecoded(item)),\n currentPayout: obj.currentPayout,\n mediansFulfilled: obj.mediansFulfilled,\n errorsFulfilled: obj.errorsFulfilled,\n });\n }\n static toEncodable(fields: any) {\n return {\n numSuccess: fields.numSuccess,\n numError: fields.numError,\n isClosed: fields.isClosed,\n roundOpenSlot: fields.roundOpenSlot,\n roundOpenTimestamp: fields.roundOpenTimestamp,\n result: SwitchboardDecimal.toEncodable(fields.result),\n stdDeviation: SwitchboardDecimal.toEncodable(fields.stdDeviation),\n minResponse: SwitchboardDecimal.toEncodable(fields.minResponse),\n maxResponse: SwitchboardDecimal.toEncodable(fields.maxResponse),\n oraclePubkeysData: fields.oraclePubkeysData,\n mediansData: fields.mediansData.map((item: any) => SwitchboardDecimal.toEncodable(item)),\n currentPayout: fields.currentPayout,\n mediansFulfilled: fields.mediansFulfilled,\n errorsFulfilled: fields.errorsFulfilled,\n };\n }\n toJSON() {\n return {\n numSuccess: this.numSuccess,\n numError: this.numError,\n isClosed: this.isClosed,\n roundOpenSlot: this.roundOpenSlot.toString(),\n roundOpenTimestamp: this.roundOpenTimestamp.toString(),\n result: this.result.toJSON(),\n stdDeviation: this.stdDeviation.toJSON(),\n minResponse: this.minResponse.toJSON(),\n maxResponse: this.maxResponse.toJSON(),\n oraclePubkeysData: this.oraclePubkeysData.map((item: any) => item.toString()),\n mediansData: this.mediansData.map((item: any) => item.toJSON()),\n currentPayout: this.currentPayout.map((item: any) => item.toString()),\n mediansFulfilled: this.mediansFulfilled,\n errorsFulfilled: this.errorsFulfilled,\n };\n }\n static fromJSON(obj: any) {\n return new AggregatorRound({\n numSuccess: obj.numSuccess,\n numError: obj.numError,\n isClosed: obj.isClosed,\n roundOpenSlot: new BN(obj.roundOpenSlot),\n roundOpenTimestamp: new BN(obj.roundOpenTimestamp),\n result: SwitchboardDecimal.fromJSON(obj.result),\n stdDeviation: SwitchboardDecimal.fromJSON(obj.stdDeviation),\n minResponse: SwitchboardDecimal.fromJSON(obj.minResponse),\n maxResponse: SwitchboardDecimal.fromJSON(obj.maxResponse),\n oraclePubkeysData: obj.oraclePubkeysData.map((item: PublicKeyInitData) => new PublicKey(item)),\n mediansData: obj.mediansData.map(\n (item: { mantissa: string | number | BN | number[] | Uint8Array | Buffer; scale: any }) =>\n SwitchboardDecimal.fromJSON(item),\n ),\n currentPayout: obj.currentPayout.map(\n (item: string | number | BN | number[] | Uint8Array | Buffer) => new BN(item),\n ),\n mediansFulfilled: obj.mediansFulfilled,\n errorsFulfilled: obj.errorsFulfilled,\n });\n }\n toEncodable() {\n return AggregatorRound.toEncodable(this);\n }\n}\n","import * as borsh from \"@coral-xyz/borsh\";\n\nexport class Hash {\n /** The bytes used to derive the hash. */\n data;\n constructor(fields: { data: any }) {\n this.data = fields.data;\n }\n static layout(property: any) {\n return borsh.struct([borsh.array(borsh.u8(), 32, \"data\")], property);\n }\n static fromDecoded(obj: { data: any }) {\n return new Hash({\n data: obj.data,\n });\n }\n static toEncodable(fields: any) {\n return {\n data: fields.data,\n };\n }\n toJSON() {\n return {\n data: this.data,\n };\n }\n static fromJSON(obj: { data: any }) {\n return new Hash({\n data: obj.data,\n });\n }\n toEncodable() {\n return Hash.toEncodable(this);\n }\n}\n","import * as borsh from \"@coral-xyz/borsh\";\nimport * as AggregatorResolutionMode from \"./AggregatorResolutionMode\";\nimport { AggregatorRound } from \"./aggregatorRound\";\nimport { Hash } from \"./Hash\";\nimport { SwitchboardDecimal } from \"./switchboardDecimal\";\n\nexport class AggregatorAccountData {\n /** Name of the aggregator to store on-chain. */\n name;\n /** Metadata of the aggregator to store on-chain. */\n metadata;\n /** Reserved. */\n reserved1;\n /** Pubkey of the queue the aggregator belongs to. */\n queuePubkey;\n /**\n * CONFIGS\n * Number of oracles assigned to an update request.\n */\n oracleRequestBatchSize;\n /** Minimum number of oracle responses required before a round is validated. */\n minOracleResults;\n /** Minimum number of job results before an oracle accepts a result. */\n minJobResults;\n /** Minimum number of seconds required between aggregator rounds. */\n minUpdateDelaySeconds;\n /** Unix timestamp for which no feed update will occur before. */\n startAfter;\n /** Change percentage required between a previous round and the current round. If variance percentage is not met, reject new oracle responses. */\n varianceThreshold;\n /** Number of seconds for which, even if the variance threshold is not passed, accept new responses from oracles. */\n forceReportPeriod;\n /** Timestamp when the feed is no longer needed. */\n expiration;\n /** Counter for the number of consecutive failures before a feed is removed from a queue. If set to 0, failed feeds will remain on the queue. */\n consecutiveFailureCount;\n /** Timestamp when the next update request will be available. */\n nextAllowedUpdateTime;\n /** Flag for whether an aggregators configuration is locked for editing. */\n isLocked;\n /** Optional, public key of the crank the aggregator is currently using. Event based feeds do not need a crank. */\n crankPubkey;\n /** Latest confirmed update request result that has been accepted as valid. */\n latestConfirmedRound;\n /** Oracle results from the current round of update request that has not been accepted as valid yet. */\n currentRound;\n /** List of public keys containing the job definitions for how data is sourced off-chain by oracles. */\n jobPubkeysData;\n /** Used to protect against malicious RPC nodes providing incorrect task definitions to oracles before fulfillment. */\n jobHashes;\n /** Number of jobs assigned to an oracle. */\n jobPubkeysSize;\n /** Used to protect against malicious RPC nodes providing incorrect task definitions to oracles before fulfillment. */\n jobsChecksum;\n /** The account delegated as the authority for making account changes. */\n authority;\n /** Optional, public key of a history buffer account storing the last N accepted results and their timestamps. */\n historyBuffer;\n /** The previous confirmed round result. */\n previousConfirmedRoundResult;\n /** The slot when the previous confirmed round was opened. */\n previousConfirmedRoundSlot;\n /** Whether an aggregator is permitted to join a crank. */\n disableCrank;\n /** Job weights used for the weighted median of the aggregator's assigned job accounts. */\n jobWeights;\n /** Unix timestamp when the feed was created. */\n creationTimestamp;\n /**\n * Use sliding window or round based resolution\n * NOTE: This changes result propogation in latest_round_result\n */\n resolutionMode;\n basePriorityFee;\n priorityFeeBump;\n priorityFeeBumpPeriod;\n maxPriorityFeeMultiplier;\n /** Reserved for future info. */\n ebuf;\n static discriminator = Buffer.from([217, 230, 65, 101, 201, 162, 27, 125]);\n static layout = borsh.struct([\n borsh.array(borsh.u8(), 32, \"name\"),\n borsh.array(borsh.u8(), 128, \"metadata\"),\n borsh.array(borsh.u8(), 32, \"reserved1\"),\n borsh.publicKey(\"queuePubkey\"),\n borsh.u32(\"oracleRequestBatchSize\"),\n borsh.u32(\"minOracleResults\"),\n borsh.u32(\"minJobResults\"),\n borsh.u32(\"minUpdateDelaySeconds\"),\n borsh.i64(\"startAfter\"),\n SwitchboardDecimal.layout(\"varianceThreshold\"),\n borsh.i64(\"forceReportPeriod\"),\n borsh.i64(\"expiration\"),\n borsh.u64(\"consecutiveFailureCount\"),\n borsh.i64(\"nextAllowedUpdateTime\"),\n borsh.bool(\"isLocked\"),\n borsh.publicKey(\"crankPubkey\"),\n AggregatorRound.layout(\"latestConfirmedRound\"),\n AggregatorRound.layout(\"currentRound\"),\n borsh.array(borsh.publicKey(), 16, \"jobPubkeysData\"),\n borsh.array(Hash.layout({}), 16, \"jobHashes\"),\n borsh.u32(\"jobPubkeysSize\"),\n borsh.array(borsh.u8(), 32, \"jobsChecksum\"),\n borsh.publicKey(\"authority\"),\n borsh.publicKey(\"historyBuffer\"),\n SwitchboardDecimal.layout(\"previousConfirmedRoundResult\"),\n borsh.u64(\"previousConfirmedRoundSlot\"),\n borsh.bool(\"disableCrank\"),\n borsh.array(borsh.u8(), 16, \"jobWeights\"),\n borsh.i64(\"creationTimestamp\"),\n AggregatorResolutionMode.layout(\"resolutionMode\"),\n borsh.u32(\"basePriorityFee\"),\n borsh.u32(\"priorityFeeBump\"),\n borsh.u32(\"priorityFeeBumpPeriod\"),\n borsh.u32(\"maxPriorityFeeMultiplier\"),\n borsh.array(borsh.u8(), 122, \"ebuf\"),\n ]);\n constructor(fields: any) {\n this.name = fields.name;\n this.metadata = fields.metadata;\n this.reserved1 = fields.reserved1;\n this.queuePubkey = fields.queuePubkey;\n this.oracleRequestBatchSize = fields.oracleRequestBatchSize;\n this.minOracleResults = fields.minOracleResults;\n this.minJobResults = fields.minJobResults;\n this.minUpdateDelaySeconds = fields.minUpdateDelaySeconds;\n this.startAfter = fields.startAfter;\n this.varianceThreshold = new SwitchboardDecimal({\n ...fields.varianceThreshold,\n });\n this.forceReportPeriod = fields.forceReportPeriod;\n this.expiration = fields.expiration;\n this.consecutiveFailureCount = fields.consecutiveFailureCount;\n this.nextAllowedUpdateTime = fields.nextAllowedUpdateTime;\n this.isLocked = fields.isLocked;\n this.crankPubkey = fields.crankPubkey;\n this.latestConfirmedRound = new AggregatorRound({\n ...fields.latestConfirmedRound,\n });\n this.currentRound = new AggregatorRound({ ...fields.currentRound });\n this.jobPubkeysData = fields.jobPubkeysData;\n this.jobHashes = fields.jobHashes.map((item: any) => new Hash({ ...item }));\n this.jobPubkeysSize = fields.jobPubkeysSize;\n this.jobsChecksum = fields.jobsChecksum;\n this.authority = fields.authority;\n this.historyBuffer = fields.historyBuffer;\n this.previousConfirmedRoundResult = new SwitchboardDecimal({\n ...fields.previousConfirmedRoundResult,\n });\n this.previousConfirmedRoundSlot = fields.previousConfirmedRoundSlot;\n this.disableCrank = fields.disableCrank;\n this.jobWeights = fields.jobWeights;\n this.creationTimestamp = fields.creationTimestamp;\n this.resolutionMode = fields.resolutionMode;\n this.basePriorityFee = fields.basePriorityFee;\n this.priorityFeeBump = fields.priorityFeeBump;\n this.priorityFeeBumpPeriod = fields.priorityFeeBumpPeriod;\n this.maxPriorityFeeMultiplier = fields.maxPriorityFeeMultiplier;\n this.ebuf = fields.ebuf;\n }\n static decode(data: any) {\n if (!data.slice(0, 8).equals(AggregatorAccountData.discriminator)) {\n throw new Error(\"invalid account discriminator\");\n }\n const dec = AggregatorAccountData.layout.decode(data.slice(8));\n return new AggregatorAccountData({\n name: dec.name,\n metadata: dec.metadata,\n reserved1: dec.reserved1,\n queuePubkey: dec.queuePubkey,\n oracleRequestBatchSize: dec.oracleRequestBatchSize,\n minOracleResults: dec.minOracleResults,\n minJobResults: dec.minJobResults,\n minUpdateDelaySeconds: dec.minUpdateDelaySeconds,\n startAfter: dec.startAfter,\n varianceThreshold: SwitchboardDecimal.fromDecoded(dec.varianceThreshold),\n forceReportPeriod: dec.forceReportPeriod,\n expiration: dec.expiration,\n consecutiveFailureCount: dec.consecutiveFailureCount,\n nextAllowedUpdateTime: dec.nextAllowedUpdateTime,\n isLocked: dec.isLocked,\n crankPubkey: dec.crankPubkey,\n latestConfirmedRound: AggregatorRound.fromDecoded(dec.latestConfirmedRound),\n currentRound: AggregatorRound.fromDecoded(dec.currentRound),\n jobPubkeysData: dec.jobPubkeysData,\n jobHashes: dec.jobHashes.map((item: any) => Hash.fromDecoded(item)),\n jobPubkeysSize: dec.jobPubkeysSize,\n jobsChecksum: dec.jobsChecksum,\n authority: dec.authority,\n historyBuffer: dec.historyBuffer,\n previousConfirmedRoundResult: SwitchboardDecimal.fromDecoded(dec.previousConfirmedRoundResult),\n previousConfirmedRoundSlot: dec.previousConfirmedRoundSlot,\n disableCrank: dec.disableCrank,\n jobWeights: dec.jobWeights,\n creationTimestamp: dec.creationTimestamp,\n resolutionMode: AggregatorResolutionMode.fromDecoded(dec.resolutionMode),\n basePriorityFee: dec.basePriorityFee,\n priorityFeeBump: dec.priorityFeeBump,\n priorityFeeBumpPeriod: dec.priorityFeeBumpPeriod,\n maxPriorityFeeMultiplier: dec.maxPriorityFeeMultiplier,\n ebuf: dec.ebuf,\n });\n }\n}\n","","import { BorshCoder, type Idl, Program, type Provider } from \"@coral-xyz/anchor\";\nimport type { PublicKey } from \"@solana/web3.js\";\nimport type BN from \"bn.js\";\nimport SWB_ONDEMAND_IDL from \"./idl.json\";\n\nexport const SWITCHBOARD_ONDEMANDE_PRICE_PRECISION = 18;\n\nexport interface CurrentResult {\n value: BN;\n std_dev: BN;\n mean: BN;\n range: BN;\n min_value: BN;\n max_vaalue: BN;\n slot: BN;\n min_slot: BN;\n max_slot: BN;\n}\n\nexport interface OracleSubmission {\n oracle: PublicKey;\n slot: BN;\n value: BN;\n}\n\nexport interface PullFeedAccountData {\n submissions: OracleSubmission[];\n authority: PublicKey;\n queue: PublicKey;\n feed_hash: Buffer;\n initialized_at: BN;\n permissions: BN;\n max_variance: BN;\n min_responses: number;\n name: Buffer;\n sample_size: number;\n last_update_timestamp: BN;\n lut_slot: BN;\n result: CurrentResult;\n max_staleness: number;\n min_sample_size: number;\n}\n\nexport type CrossbarSimulatePayload = FeedResponse[];\n\nexport interface FeedResponse {\n feedHash: string;\n results: number[];\n}\n\nexport const switchboardAccountCoder = new BorshCoder(SWB_ONDEMAND_IDL as unknown as Idl);\nexport function getSwitchboardProgram(provider: Provider): Program {\n return new Program(SWB_ONDEMAND_IDL as unknown as Idl, provider);\n}\n\nexport function decodeSwitchboardPullFeedData(data: Buffer): PullFeedAccountData {\n const pullFeedDAta = switchboardAccountCoder.accounts.decode(\"PullFeedAccountData\", data) as PullFeedAccountData;\n return pullFeedDAta;\n}\n","export * from \"./pyth_legacy\";\nexport * from \"./pyth_push_oracle\";\nexport * from \"./rpc-get-stake\";\nexport * from \"./single-spl-pool\";\nexport * from \"./switchboard_legacy\";\nexport * from \"./switchboard_pull\";\n","import {\n createAssociatedTokenAccountIdempotentInstruction,\n createCloseAccountInstruction,\n createSyncNativeInstruction,\n getAssociatedTokenAddressSync,\n NATIVE_MINT,\n} from \"@solana/spl-token\";\nimport {\n type AccountInfo,\n type AddressLookupTableAccount,\n type Blockhash,\n ComputeBudgetProgram,\n type Connection,\n LAMPORTS_PER_SOL,\n PublicKey,\n SystemProgram,\n type Transaction,\n type TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport type BigNumber from \"bignumber.js\";\nimport { uiToNative } from \"@/common\";\nimport {\n PDA_BANK_FEE_VAULT_AUTH_SEED,\n PDA_BANK_FEE_VAULT_SEED,\n PDA_BANK_INSURANCE_VAULT_AUTH_SEED,\n PDA_BANK_INSURANCE_VAULT_SEED,\n PDA_BANK_LIQUIDITY_VAULT_AUTH_SEED,\n PDA_BANK_LIQUIDITY_VAULT_SEED,\n PYTH_PUSH_ORACLE_ID,\n} from \"./constants\";\nimport type { BankConfig } from \"./models/bank\";\nimport type { BankConfigRaw } from \"./services\";\nimport { OracleSetup } from \"./services/bank/types/bank.types\";\nimport { parseOracleSetup } from \"./services/bank/utils/deserialize.utils\";\nimport { BankVaultType } from \"./types\";\nimport { parsePriceInfo } from \"./vendor\";\n\nexport function getBankVaultSeeds(type: BankVaultType): Buffer {\n switch (type) {\n case BankVaultType.LiquidityVault:\n return PDA_BANK_LIQUIDITY_VAULT_SEED;\n case BankVaultType.InsuranceVault:\n return PDA_BANK_INSURANCE_VAULT_SEED;\n case BankVaultType.FeeVault:\n return PDA_BANK_FEE_VAULT_SEED;\n default:\n throw Error(`Unknown vault type ${type}`);\n }\n}\n\nfunction getBankVaultAuthoritySeeds(type: BankVaultType): Buffer {\n switch (type) {\n case BankVaultType.LiquidityVault:\n return PDA_BANK_LIQUIDITY_VAULT_AUTH_SEED;\n case BankVaultType.InsuranceVault:\n return PDA_BANK_INSURANCE_VAULT_AUTH_SEED;\n case BankVaultType.FeeVault:\n return PDA_BANK_FEE_VAULT_AUTH_SEED;\n default:\n throw Error(`Unknown vault type ${type}`);\n }\n}\n\n/**\n * Compute authority PDA for a specific lendr group bank vault\n */\nexport function getBankVaultAuthority(\n bankVaultType: BankVaultType,\n bankPk: PublicKey,\n programId: PublicKey,\n): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([getBankVaultAuthoritySeeds(bankVaultType), bankPk.toBuffer()], programId);\n}\n\nexport function makeWrapSolIxs(walletAddress: PublicKey, amount: BigNumber): TransactionInstruction[] {\n const address = getAssociatedTokenAddressSync(NATIVE_MINT, walletAddress, true);\n const ixs = [createAssociatedTokenAccountIdempotentInstruction(walletAddress, address, walletAddress, NATIVE_MINT)];\n\n if (amount.gt(0)) {\n const nativeAmount = uiToNative(amount, 9).toNumber() + 10000;\n ixs.push(\n SystemProgram.transfer({ fromPubkey: walletAddress, toPubkey: address, lamports: nativeAmount }),\n createSyncNativeInstruction(address),\n );\n }\n\n return ixs;\n}\n\nexport function makeUnwrapSolIx(walletAddress: PublicKey): TransactionInstruction {\n const address = getAssociatedTokenAddressSync(NATIVE_MINT, walletAddress, true); // We allow off curve addresses here to support Fuse.\n return createCloseAccountInstruction(address, walletAddress, walletAddress);\n}\n\nexport async function makeVersionedTransaction(\n blockhash: Blockhash,\n transaction: Transaction,\n payer: PublicKey,\n addressLookupTables?: AddressLookupTableAccount[],\n): Promise<VersionedTransaction> {\n const message = new TransactionMessage({\n instructions: transaction.instructions,\n payerKey: payer,\n recentBlockhash: blockhash,\n });\n\n const versionedMessage = addressLookupTables\n ? message.compileToV0Message(addressLookupTables)\n : message.compileToLegacyMessage();\n\n return new VersionedTransaction(versionedMessage);\n}\n/**\n * Creates a compute budget instruction to set the priority fee for a transaction.\n * The priority fee is specified in micro-lamports per compute unit.\n *\n * @param priorityFeeMicro - Priority fee in micro-lamports per compute unit. If not provided, defaults to 1.\n * @returns A compute budget instruction with the specified priority fee\n */\nexport function makePriorityFeeMicroIx(priorityFeeMicro?: number): TransactionInstruction {\n return ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: Math.floor(priorityFeeMicro ?? 1),\n });\n}\n\n/*\n deprecated use makePriorityFeeMicroIx instead\n*/\nexport function makePriorityFeeIx(priorityFeeUi?: number, computeUnitsLimit?: number): TransactionInstruction[] {\n const priorityFeeIx: TransactionInstruction[] = [];\n const limit = computeUnitsLimit ?? 1_400_000;\n\n let microLamports: number = 1;\n\n if (priorityFeeUi) {\n // if priority fee is above 0.2 SOL discard it for safety reasons\n const isAbsurdPriorityFee = priorityFeeUi > 0.1;\n\n if (!isAbsurdPriorityFee) {\n const priorityFeeMicroLamports = priorityFeeUi * LAMPORTS_PER_SOL * 1_000_000;\n microLamports = Math.round(priorityFeeMicroLamports / limit);\n }\n }\n\n priorityFeeIx.push(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports,\n }),\n );\n\n return priorityFeeIx;\n}\n\nexport function feedIdToString(feedId: PublicKey): string {\n return feedId.toBuffer().toString(\"hex\");\n}\n\nexport type PythPushFeedIdMap = Map<string, { feedId: PublicKey; shardId?: number }>;\n\nexport async function buildFeedIdMap(bankConfigs: BankConfigRaw[], connection: Connection): Promise<PythPushFeedIdMap> {\n const feedIdMap: PythPushFeedIdMap = new Map<string, { feedId: PublicKey; shardId?: number }>();\n\n const feedIdsWithAddresses = bankConfigs\n .filter((bankConfig) => {\n const oracleSetup = parseOracleSetup(bankConfig.oracleSetup);\n return oracleSetup === OracleSetup.PythPushOracle || oracleSetup === OracleSetup.KaminoPythPush;\n })\n .map((bankConfig) => {\n const oracleKey = bankConfig.oracleKeys[0];\n const feedId = oracleKey.toBuffer();\n\n // Derive PDAs from this key (assuming it's a feed ID)\n const pythSponsoredPDA = findPythPushOracleAddress(feedId, PYTH_PUSH_ORACLE_ID, PYTH_SPONSORED_SHARD_ID);\n const lendrSponsoredPDA = findPythPushOracleAddress(feedId, PYTH_PUSH_ORACLE_ID, LENDR_SPONSORED_SHARD_ID);\n\n return {\n feedId,\n oracleKey,\n addresses: [pythSponsoredPDA, lendrSponsoredPDA],\n };\n });\n\n // Collect all addresses to check: both derived PDAs AND the original oracle keys\n const addressess = feedIdsWithAddresses.flatMap((entry) => [\n entry.addresses[0], // Pyth sponsored PDA\n entry.addresses[1], // Lendr sponsored PDA\n entry.oracleKey, // The original oracle key (might already be a PDA)\n ]);\n const accountInfos: Array<AccountInfo<Buffer<ArrayBufferLike>> | null> = [];\n\n const chunkSize = 25;\n for (let i = 0; i < addressess.length; i += chunkSize) {\n const chunk = addressess.slice(i, i + chunkSize);\n const accountInfosChunk = await connection.getMultipleAccountsInfo(chunk);\n accountInfos.push(...accountInfosChunk);\n }\n\n for (let i = 0; i < feedIdsWithAddresses.length; i++) {\n const entry = feedIdsWithAddresses[i];\n const oraclesStartIndex = i * 3; // Now 3 accounts per entry\n\n const pythSponsoredOracle = accountInfos[oraclesStartIndex];\n const ldrSponsoredOracle = accountInfos[oraclesStartIndex + 1];\n const directOracleAccount = accountInfos[oraclesStartIndex + 2]; // The oracle key itself\n\n const feedId = entry.feedId.toString(\"hex\");\n\n // Check if the oracle key itself is already a valid oracle account\n if (directOracleAccount) {\n // The oracle key is already a PDA, use it directly\n const shardId = entry.oracleKey.equals(entry.addresses[0])\n ? PYTH_SPONSORED_SHARD_ID\n : entry.oracleKey.equals(entry.addresses[1])\n ? LENDR_SPONSORED_SHARD_ID\n : undefined; // Unknown shard, but still valid\n\n feedIdMap.set(feedId, { feedId: entry.oracleKey, shardId });\n continue;\n }\n\n // Otherwise, determine which shard to use based on derived PDAs\n if (ldrSponsoredOracle && pythSponsoredOracle) {\n const pythPriceAccount = parsePriceInfo(pythSponsoredOracle.data.slice(8));\n const pythPublishTime = pythPriceAccount.priceMessage.publishTime;\n\n const ldrPriceAccount = parsePriceInfo(ldrSponsoredOracle.data.slice(8));\n const ldrPublishTime = ldrPriceAccount.priceMessage.publishTime;\n\n if (pythPublishTime > ldrPublishTime) {\n feedIdMap.set(feedId, { feedId: entry.addresses[0], shardId: PYTH_SPONSORED_SHARD_ID });\n } else {\n feedIdMap.set(feedId, { feedId: entry.addresses[1], shardId: LENDR_SPONSORED_SHARD_ID });\n }\n } else if (pythSponsoredOracle) {\n feedIdMap.set(feedId, { feedId: entry.addresses[0], shardId: PYTH_SPONSORED_SHARD_ID });\n } else if (ldrSponsoredOracle) {\n feedIdMap.set(feedId, { feedId: entry.addresses[1], shardId: LENDR_SPONSORED_SHARD_ID });\n } else {\n throw new Error(`No oracle found for feedId: ${feedId}, either Pyth or LDR sponsored oracle must exist`);\n }\n }\n\n return feedIdMap;\n}\n\nexport function findOracleKey(\n bankConfig: BankConfig,\n feedIdMap?: PythPushFeedIdMap,\n): { oracleKey: PublicKey; shardId?: number } {\n try {\n const oracleSetup = bankConfig.oracleSetup;\n const feedId = bankConfig.oracleKeys[0]; // This is the feed ID for PythPushOracle types\n\n if ((oracleSetup === OracleSetup.PythPushOracle || oracleSetup === OracleSetup.KaminoPythPush) && feedIdMap) {\n const feedIdHex = feedId.toBuffer().toString(\"hex\");\n const feedMapEntry = feedIdMap.get(feedIdHex);\n if (!feedMapEntry) {\n console.warn(`Feed ID ${feedId.toBase58()} not found in map for PythPushOracle, falling back to feed ID`);\n return { oracleKey: feedId };\n }\n return {\n oracleKey: feedMapEntry.feedId,\n shardId: feedMapEntry.shardId,\n };\n }\n return { oracleKey: feedId }; // For other oracle types, it's the direct key\n } catch (error) {\n console.error(\"Error finding oracle key\", error);\n console.log(\"oracleSetup\", bankConfig.oracleSetup);\n return { oracleKey: bankConfig.oracleKeys[0] };\n }\n}\n\nexport const PYTH_SPONSORED_SHARD_ID = 0;\nexport const LENDR_SPONSORED_SHARD_ID = 3301;\n\nexport function findPythPushOracleAddress(feedId: Buffer, programId: PublicKey, shardId: number): PublicKey {\n const shardBytes = u16ToArrayBufferLE(shardId);\n return PublicKey.findProgramAddressSync([shardBytes, feedId], programId)[0];\n}\n\nfunction u16ToArrayBufferLE(value: number): Uint8Array {\n // Create a buffer of 2 bytes\n const buffer = new ArrayBuffer(2);\n const dataView = new DataView(buffer);\n\n // Set the Uint16 value in little-endian order\n dataView.setUint16(0, value, true);\n\n // Return the buffer\n return new Uint8Array(buffer);\n}\n","/**\n * Program IDL in camelCase format in order to be used in JS/TS.\n *\n * Note that this is only a type helper and is not the actual IDL. The original\n * IDL can be found at `target/idl/pyth_push_oracle.json`.\n */\nexport type PythPushOracle = {\n address: \"pythWSnswVUd12oZpeFP8e9CVaEqJg25g1Vtc2biRsT\";\n metadata: {\n name: \"pythPushOracle\";\n version: \"0.1.0\";\n spec: \"0.1.0\";\n };\n instructions: [\n {\n name: \"updatePriceFeed\";\n discriminator: [28, 9, 93, 150, 86, 153, 188, 115];\n accounts: [\n {\n name: \"payer\";\n writable: true;\n signer: true;\n },\n {\n name: \"pythSolanaReceiver\";\n },\n {\n name: \"encodedVaa\";\n },\n {\n name: \"config\";\n },\n {\n name: \"treasury\";\n writable: true;\n },\n {\n name: \"priceFeedAccount\";\n writable: true;\n },\n {\n name: \"systemProgram\";\n },\n ];\n args: [\n {\n name: \"params\";\n type: {\n defined: {\n name: \"postUpdateParams\";\n };\n };\n },\n {\n name: \"shardId\";\n type: \"u16\";\n },\n {\n name: \"feedId\";\n type: {\n array: [\"u8\", 32];\n };\n },\n ];\n },\n ];\n errors: [\n {\n code: 6000;\n name: \"updatesNotMonotonic\";\n msg: \"Updates must be monotonically increasing\";\n },\n {\n code: 6001;\n name: \"priceFeedMessageMismatch\";\n msg: \"Trying to update price feed with the wrong feed id\";\n },\n ];\n types: [\n {\n name: \"postUpdateParams\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"merklePriceUpdate\";\n type: {\n defined: {\n name: \"merklePriceUpdate\";\n };\n };\n },\n {\n name: \"treasuryId\";\n type: \"u8\";\n },\n ];\n };\n },\n {\n name: \"merklePriceUpdate\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"message\";\n type: \"bytes\";\n },\n {\n name: \"proof\";\n type: {\n vec: {\n array: [\"u8\", 20];\n };\n };\n },\n ];\n };\n },\n ];\n};\n\nexport const PYTH_PUSH_ORACLE_IDL: PythPushOracle = {\n address: \"pythWSnswVUd12oZpeFP8e9CVaEqJg25g1Vtc2biRsT\",\n metadata: {\n name: \"pythPushOracle\",\n version: \"0.1.0\",\n spec: \"0.1.0\",\n },\n instructions: [\n {\n name: \"updatePriceFeed\",\n discriminator: [28, 9, 93, 150, 86, 153, 188, 115],\n accounts: [\n {\n name: \"payer\",\n writable: true,\n signer: true,\n },\n {\n name: \"pythSolanaReceiver\",\n },\n {\n name: \"encodedVaa\",\n },\n {\n name: \"config\",\n },\n {\n name: \"treasury\",\n writable: true,\n },\n {\n name: \"priceFeedAccount\",\n writable: true,\n },\n {\n name: \"systemProgram\",\n },\n ],\n args: [\n {\n name: \"params\",\n type: {\n defined: {\n name: \"postUpdateParams\",\n },\n },\n },\n {\n name: \"shardId\",\n type: \"u16\",\n },\n {\n name: \"feedId\",\n type: {\n array: [\"u8\", 32],\n },\n },\n ],\n },\n ],\n errors: [\n {\n code: 6000,\n name: \"updatesNotMonotonic\",\n msg: \"Updates must be monotonically increasing\",\n },\n {\n code: 6001,\n name: \"priceFeedMessageMismatch\",\n msg: \"Trying to update price feed with the wrong feed id\",\n },\n ],\n types: [\n {\n name: \"postUpdateParams\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"merklePriceUpdate\",\n type: {\n defined: {\n name: \"merklePriceUpdate\",\n },\n },\n },\n {\n name: \"treasuryId\",\n type: \"u8\",\n },\n ],\n },\n },\n {\n name: \"merklePriceUpdate\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"message\",\n type: \"bytes\",\n },\n {\n name: \"proof\",\n type: {\n vec: {\n array: [\"u8\", 20],\n },\n },\n },\n ],\n },\n },\n ],\n};\n","/**\n * Program IDL in camelCase format in order to be used in JS/TS.\n *\n * Note that this is only a type helper and is not the actual IDL. The original\n * IDL can be found at `target/idl/wormhole_core_bridge_solana.json`.\n */\nexport type WormholeCoreBridgeSolana = {\n address: \"HDwcJBJXjL9FpJ7UBsYBtaDjsBUhuLCUYoz3zr8SWWaQ\";\n metadata: {\n name: \"wormholeCoreBridgeSolana\";\n version: \"0.0.1-alpha.5\";\n spec: \"0.1.0\";\n };\n instructions: [\n {\n name: \"initMessageV1\";\n docs: [\n \"Processor for initializing a new draft [PostedMessageV1](crate::state::PostedMessageV1)\",\n \"account for writing. The emitter authority is established at this point and the payload size\",\n \"is inferred from the size of the created account. This instruction handler also allows an\",\n \"integrator to publish Wormhole messages using his program's ID as the emitter address\",\n \"(by passing `Some(crate::ID)` to the [cpi_program_id](InitMessageV1Args::cpi_program_id)\",\n 'argument). **Be aware that the emitter authority\\'s seeds must only be \\\\[b\"emitter\"\\\\] in this',\n \"case.**\",\n \"\",\n \"This instruction should be followed up with `write_message_v1` and `finalize_message_v1` to\",\n \"write and indicate that the message is ready for publishing respectively (to prepare it for\",\n \"publishing via the\",\n \"[post message instruction](crate::legacy::instruction::LegacyInstruction::PostMessage)).\",\n \"\",\n \"NOTE: If you wish to publish a small message (one where the data does not overflow the\",\n \"Solana transaction size), it is recommended that you use an [sdk](crate::sdk::cpi) method to\",\n \"either prepare your message or post a message as a program ID emitter.\",\n ];\n discriminator: [247, 187, 26, 16, 122, 198, 106, 247];\n accounts: [\n {\n name: \"emitterAuthority\";\n docs: [\"This authority is the only one who can write to the draft message account.\"];\n signer: true;\n },\n {\n name: \"draftMessage\";\n docs: [\"Bridge.\"];\n writable: true;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: {\n name: \"initMessageV1Args\";\n };\n };\n },\n ];\n },\n {\n name: \"writeMessageV1\";\n docs: [\n \"Processor used to write to a draft [PostedMessageV1](crate::state::PostedMessageV1) account.\",\n \"This instruction requires an authority (the emitter authority) to interact with the message\",\n \"account.\",\n ];\n discriminator: [35, 67, 197, 233, 94, 117, 124, 143];\n accounts: [\n {\n name: \"emitterAuthority\";\n signer: true;\n },\n {\n name: \"draftMessage\";\n docs: [\"only be published when the message is finalized.\"];\n writable: true;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: {\n name: \"writeMessageV1Args\";\n };\n };\n },\n ];\n },\n {\n name: \"finalizeMessageV1\";\n docs: [\n \"Processor used to finalize a draft [PostedMessageV1](crate::state::PostedMessageV1) account.\",\n \"Once finalized, this message account cannot be written to again. A finalized message is the\",\n \"only state the legacy post message instruction can accept before publishing. This\",\n \"instruction requires an authority (the emitter authority) to interact with the message\",\n \"account.\",\n ];\n discriminator: [245, 208, 215, 228, 129, 56, 51, 251];\n accounts: [\n {\n name: \"emitterAuthority\";\n signer: true;\n },\n {\n name: \"draftMessage\";\n docs: [\"only be published when the message is finalized.\"];\n writable: true;\n },\n ];\n args: [];\n },\n {\n name: \"closeMessageV1\";\n docs: [\n \"Processor used to process a draft [PostedMessageV1](crate::state::PostedMessageV1) account.\",\n \"This instruction requires an authority (the emitter authority) to interact with the message\",\n \"account.\",\n ];\n discriminator: [36, 185, 40, 107, 239, 13, 51, 162];\n accounts: [\n {\n name: \"emitterAuthority\";\n signer: true;\n },\n {\n name: \"draftMessage\";\n docs: [\"only be published when the message is finalized.\"];\n writable: true;\n },\n {\n name: \"closeAccountDestination\";\n writable: true;\n },\n ];\n args: [];\n },\n {\n name: \"initEncodedVaa\";\n docs: [\n \"Processor used to intialize a created account as [EncodedVaa](crate::state::EncodedVaa). An\",\n \"authority (the write authority) is established with this instruction.\",\n ];\n discriminator: [209, 193, 173, 25, 91, 202, 181, 218];\n accounts: [\n {\n name: \"writeAuthority\";\n docs: [\"The authority who can write to the VAA account when it is being processed.\"];\n signer: true;\n },\n {\n name: \"encodedVaa\";\n docs: [\"Bridge.\"];\n writable: true;\n },\n ];\n args: [];\n },\n {\n name: \"closeEncodedVaa\";\n docs: [\n \"Processor used to close an [EncodedVaa](crate::state::EncodedVaa). This instruction requires\",\n \"an authority (the write authority) to interact witht he encoded VAA account.\",\n ];\n discriminator: [48, 221, 174, 198, 231, 7, 152, 38];\n accounts: [\n {\n name: \"writeAuthority\";\n docs: [\n \"This account is only required to be mutable for the `CloseVaaAccount` directive. This\",\n \"authority is the same signer that originally created the VAA accounts, so he is the one that\",\n \"will receive the lamports back for the closed accounts.\",\n ];\n writable: true;\n signer: true;\n },\n {\n name: \"encodedVaa\";\n docs: [\"written to and then verified.\"];\n writable: true;\n },\n ];\n args: [];\n },\n {\n name: \"writeEncodedVaa\";\n docs: [\n \"Processor used to write to an [EncodedVaa](crate::state::EncodedVaa) account. This\",\n \"instruction requires an authority (the write authority) to interact with the encoded VAA\",\n \"account.\",\n ];\n discriminator: [199, 208, 110, 177, 150, 76, 118, 42];\n accounts: [\n {\n name: \"writeAuthority\";\n docs: [\"The only authority that can write to the encoded VAA account.\"];\n signer: true;\n },\n {\n name: \"draftVaa\";\n docs: [\"written to and then verified.\"];\n writable: true;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: {\n name: \"writeEncodedVaaArgs\";\n };\n };\n },\n ];\n },\n {\n name: \"verifyEncodedVaaV1\";\n docs: [\n \"Processor used to verify an [EncodedVaa](crate::state::EncodedVaa) account as a version 1\",\n \"VAA (guardian signatures attesting to this observation). This instruction requires an\",\n \"authority (the write authority) to interact with the encoded VAA account.\",\n ];\n discriminator: [103, 56, 177, 229, 240, 103, 68, 73];\n accounts: [\n {\n name: \"writeAuthority\";\n signer: true;\n },\n {\n name: \"draftVaa\";\n docs: [\"written to and then verified.\"];\n writable: true;\n },\n {\n name: \"guardianSet\";\n docs: [\n \"Guardian set account, which should be the same one that was used to attest for the VAA. The\",\n \"signatures in the encoded VAA are verified against this guardian set.\",\n ];\n },\n ];\n args: [];\n },\n {\n name: \"postVaaV1\";\n docs: [\n \"Processor used to close an [EncodedVaa](crate::state::EncodedVaa) account to create a\",\n \"[PostedMessageV1](crate::state::PostedMessageV1) account in its place.\",\n \"\",\n \"NOTE: Because the legacy verify signatures instruction was not required for the Posted VAA\",\n \"account to exist, the encoded [SignatureSet](crate::state::SignatureSet) is the default\",\n \"[Pubkey].\",\n ];\n discriminator: [0, 57, 97, 3, 225, 37, 254, 31];\n accounts: [\n {\n name: \"payer\";\n docs: [\n \"Payer to create the posted VAA account. This instruction allows anyone with an encoded VAA\",\n \"to create a posted VAA account.\",\n ];\n writable: true;\n signer: true;\n },\n {\n name: \"encodedVaa\";\n docs: [\n \"Encoded VAA, whose body will be serialized into the posted VAA account.\",\n \"\",\n \"NOTE: This instruction handler only exists to support integrators that still rely on posted\",\n \"VAA accounts. While we encourage integrators to use the encoded VAA account instead, we\",\n \"allow a pathway to convert the encoded VAA into a posted VAA. However, the payload is\",\n \"restricted to 9.5KB, which is much larger than what was possible with the old implementation\",\n \"using the legacy post vaa instruction. The Core Bridge program will not support posting VAAs\",\n \"larger than this payload size.\",\n ];\n },\n {\n name: \"postedVaa\";\n writable: true;\n },\n {\n name: \"systemProgram\";\n },\n ];\n args: [];\n },\n {\n name: \"closeSignatureSet\";\n docs: [\n \"Processor used to close a [SignatureSet](crate::state::SignatureSet), which was used to\",\n \"verify the VAA using the legacy parse and verify procedure.\",\n ];\n discriminator: [64, 154, 185, 168, 234, 229, 218, 103];\n accounts: [\n {\n name: \"solDestination\";\n writable: true;\n signer: true;\n },\n {\n name: \"postedVaa\";\n docs: [\"Posted VAA.\"];\n },\n {\n name: \"signatureSet\";\n docs: [\n \"Signature set that may have been used to create the posted VAA account. If the `post_vaa_v1`\",\n \"instruction were used to create the posted VAA account, then the encoded signature set\",\n \"pubkey would be all zeroes.\",\n ];\n writable: true;\n },\n ];\n args: [];\n },\n ];\n accounts: [\n {\n name: \"guardianSet\";\n discriminator: [16, 67, 62, 123, 169, 90, 100, 60];\n },\n {\n name: \"signatureSet\";\n discriminator: [135, 116, 238, 4, 218, 116, 194, 143];\n },\n {\n name: \"encodedVaa\";\n discriminator: [73, 170, 26, 37, 21, 245, 172, 192];\n },\n ];\n errors: [\n {\n code: 6002;\n name: \"invalidInstructionArgument\";\n msg: \"invalidInstructionArgument\";\n },\n {\n code: 6003;\n name: \"accountNotZeroed\";\n msg: \"accountNotZeroed\";\n },\n {\n code: 6004;\n name: \"invalidDataConversion\";\n msg: \"invalidDataConversion\";\n },\n {\n code: 6006;\n name: \"u64Overflow\";\n msg: \"u64Overflow\";\n },\n {\n code: 6008;\n name: \"invalidComputeSize\";\n msg: \"invalidComputeSize\";\n },\n {\n code: 6016;\n name: \"invalidChain\";\n msg: \"invalidChain\";\n },\n {\n code: 6032;\n name: \"invalidGovernanceEmitter\";\n msg: \"invalidGovernanceEmitter\";\n },\n {\n code: 6034;\n name: \"invalidGovernanceAction\";\n msg: \"invalidGovernanceAction\";\n },\n {\n code: 6036;\n name: \"latestGuardianSetRequired\";\n msg: \"latestGuardianSetRequired\";\n },\n {\n code: 6038;\n name: \"governanceForAnotherChain\";\n msg: \"governanceForAnotherChain\";\n },\n {\n code: 6040;\n name: \"invalidGovernanceVaa\";\n msg: \"invalidGovernanceVaa\";\n },\n {\n code: 6256;\n name: \"insufficientFees\";\n msg: \"insufficientFees\";\n },\n {\n code: 6258;\n name: \"emitterMismatch\";\n msg: \"emitterMismatch\";\n },\n {\n code: 6260;\n name: \"notReadyForPublishing\";\n msg: \"notReadyForPublishing\";\n },\n {\n code: 6262;\n name: \"invalidPreparedMessage\";\n msg: \"invalidPreparedMessage\";\n },\n {\n code: 6264;\n name: \"executableEmitter\";\n msg: \"executableEmitter\";\n },\n {\n code: 6266;\n name: \"legacyEmitter\";\n msg: \"legacyEmitter\";\n },\n {\n code: 6512;\n name: \"invalidSignatureSet\";\n msg: \"invalidSignatureSet\";\n },\n {\n code: 6514;\n name: \"invalidMessageHash\";\n msg: \"invalidMessageHash\";\n },\n {\n code: 6515;\n name: \"noQuorum\";\n msg: \"noQuorum\";\n },\n {\n code: 6516;\n name: \"messageMismatch\";\n msg: \"messageMismatch\";\n },\n {\n code: 7024;\n name: \"notEnoughLamports\";\n msg: \"notEnoughLamports\";\n },\n {\n code: 7026;\n name: \"invalidFeeRecipient\";\n msg: \"invalidFeeRecipient\";\n },\n {\n code: 7280;\n name: \"implementationMismatch\";\n msg: \"implementationMismatch\";\n },\n {\n code: 7536;\n name: \"invalidGuardianSetIndex\";\n msg: \"invalidGuardianSetIndex\";\n },\n {\n code: 7792;\n name: \"guardianSetMismatch\";\n msg: \"guardianSetMismatch\";\n },\n {\n code: 7794;\n name: \"instructionAtWrongIndex\";\n msg: \"instructionAtWrongIndex\";\n },\n {\n code: 7795;\n name: \"emptySigVerifyInstruction\";\n msg: \"emptySigVerifyInstruction\";\n },\n {\n code: 7796;\n name: \"invalidSigVerifyInstruction\";\n msg: \"invalidSigVerifyInstruction\";\n },\n {\n code: 7798;\n name: \"guardianSetExpired\";\n msg: \"guardianSetExpired\";\n },\n {\n code: 7800;\n name: \"invalidGuardianKeyRecovery\";\n msg: \"invalidGuardianKeyRecovery\";\n },\n {\n code: 7802;\n name: \"signerIndicesMismatch\";\n msg: \"signerIndicesMismatch\";\n },\n {\n code: 8048;\n name: \"payloadSizeMismatch\";\n msg: \"payloadSizeMismatch\";\n },\n {\n code: 10112;\n name: \"zeroGuardians\";\n msg: \"zeroGuardians\";\n },\n {\n code: 10128;\n name: \"guardianZeroAddress\";\n msg: \"guardianZeroAddress\";\n },\n {\n code: 10144;\n name: \"duplicateGuardianAddress\";\n msg: \"duplicateGuardianAddress\";\n },\n {\n code: 10160;\n name: \"messageAlreadyPublished\";\n msg: \"messageAlreadyPublished\";\n },\n {\n code: 10176;\n name: \"vaaWritingDisallowed\";\n msg: \"vaaWritingDisallowed\";\n },\n {\n code: 10192;\n name: \"vaaAlreadyVerified\";\n msg: \"vaaAlreadyVerified\";\n },\n {\n code: 10208;\n name: \"invalidGuardianIndex\";\n msg: \"invalidGuardianIndex\";\n },\n {\n code: 10224;\n name: \"invalidSignature\";\n msg: \"invalidSignature\";\n },\n {\n code: 10256;\n name: \"unverifiedVaa\";\n msg: \"unverifiedVaa\";\n },\n {\n code: 10258;\n name: \"vaaStillProcessing\";\n msg: \"vaaStillProcessing\";\n },\n {\n code: 10260;\n name: \"inWritingStatus\";\n msg: \"inWritingStatus\";\n },\n {\n code: 10262;\n name: \"notInWritingStatus\";\n msg: \"notInWritingStatus\";\n },\n {\n code: 10264;\n name: \"invalidMessageStatus\";\n msg: \"invalidMessageStatus\";\n },\n {\n code: 10266;\n name: \"hashNotComputed\";\n msg: \"hashNotComputed\";\n },\n {\n code: 10268;\n name: \"invalidVaaVersion\";\n msg: \"invalidVaaVersion\";\n },\n {\n code: 10270;\n name: \"invalidCreatedAccountSize\";\n msg: \"invalidCreatedAccountSize\";\n },\n {\n code: 10272;\n name: \"dataOverflow\";\n msg: \"dataOverflow\";\n },\n {\n code: 10274;\n name: \"exceedsMaxPayloadSize\";\n msg: \"ExceedsMaxPayloadSize (30KB)\";\n },\n {\n code: 10276;\n name: \"cannotParseVaa\";\n msg: \"cannotParseVaa\";\n },\n {\n code: 10278;\n name: \"emitterAuthorityMismatch\";\n msg: \"emitterAuthorityMismatch\";\n },\n {\n code: 10280;\n name: \"invalidProgramEmitter\";\n msg: \"invalidProgramEmitter\";\n },\n {\n code: 10282;\n name: \"writeAuthorityMismatch\";\n msg: \"writeAuthorityMismatch\";\n },\n {\n code: 10284;\n name: \"postedVaaPayloadTooLarge\";\n msg: \"postedVaaPayloadTooLarge\";\n },\n {\n code: 10286;\n name: \"executableDisallowed\";\n msg: \"executableDisallowed\";\n },\n ];\n types: [\n {\n name: \"initializeArgs\";\n docs: [\"Arguments used to initialize the Core Bridge program.\"];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"guardianSetTtlSeconds\";\n type: \"u32\";\n },\n {\n name: \"feeLamports\";\n type: \"u64\";\n },\n {\n name: \"initialGuardians\";\n type: {\n vec: {\n array: [\"u8\", 20];\n };\n };\n },\n ];\n };\n },\n {\n name: \"postMessageArgs\";\n docs: [\n \"Arguments used to post a new Wormhole (Core Bridge) message either using\",\n \"[post_message](crate::legacy::instruction::post_message) or\",\n \"[post_message_unreliable](crate::legacy::instruction::post_message_unreliable).\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"nonce\";\n docs: [\"Unique id for this message.\"];\n type: \"u32\";\n },\n {\n name: \"payload\";\n docs: [\"Encoded message.\"];\n type: \"bytes\";\n },\n {\n name: \"commitment\";\n docs: [\"Solana commitment level for Guardian observation.\"];\n type: {\n defined: {\n name: \"commitment\";\n };\n };\n },\n ];\n };\n },\n {\n name: \"postVaaArgs\";\n docs: [\n \"Arguments to post new VAA data after signature verification.\",\n \"\",\n \"NOTE: It is preferred to use the new process of verifying a VAA using the new Core Bridge Anchor\",\n \"instructions. See [init_encoded_vaa](crate::wormhole_core_bridge_solana::init_encoded_vaa) and\",\n \"[write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa) for more info.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"gap0\";\n docs: [\"Unused data.\"];\n type: {\n array: [\"u8\", 5];\n };\n },\n {\n name: \"timestamp\";\n docs: [\"Time the message was submitted.\"];\n type: \"u32\";\n },\n {\n name: \"nonce\";\n docs: [\"Unique ID for this message.\"];\n type: \"u32\";\n },\n {\n name: \"emitterChain\";\n docs: [\"The Wormhole chain ID denoting the origin of this message.\"];\n type: \"u16\";\n },\n {\n name: \"emitterAddress\";\n docs: [\"Emitter of the message.\"];\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"sequence\";\n docs: [\"Sequence number of this message.\"];\n type: \"u64\";\n },\n {\n name: \"consistencyLevel\";\n docs: [\"Level of consistency requested by the emitter.\"];\n type: \"u8\";\n },\n {\n name: \"payload\";\n docs: [\"Message payload.\"];\n type: \"bytes\";\n },\n ];\n };\n },\n {\n name: \"verifySignaturesArgs\";\n docs: [\n \"Arguments to verify specific guardian indices.\",\n \"\",\n \"NOTE: It is preferred to use the new process of verifying a VAA using the new Core Bridge Anchor\",\n \"instructions. See [init_encoded_vaa](crate::wormhole_core_bridge_solana::init_encoded_vaa) and\",\n \"[write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa) for more info.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"signerIndices\";\n docs: [\n \"Indices of verified guardian signatures, where -1 indicates a missing value. There is a\",\n \"missing value if the guardian at this index is not expected to have its signature verified by\",\n \"the Sig Verify native program in the instruction invoked prior).\",\n \"\",\n \"NOTE: In the legacy implementation, this argument being a fixed-sized array of 19 only\",\n \"allows the first 19 guardians of any size guardian set to be verified. Because of this, it\",\n \"is absolutely important to use the new process of verifying a VAA.\",\n ];\n type: {\n array: [\"i8\", 19];\n };\n },\n ];\n };\n },\n {\n name: \"emptyArgs\";\n docs: [\"Unit struct used to represent an empty instruction argument.\"];\n type: {\n kind: \"struct\";\n };\n },\n {\n name: \"config\";\n docs: [\n \"Account used to store the current configuration of the bridge, including tracking Wormhole fee\",\n \"payments. For governance decrees, the guardian set index is used to determine whether a decree\",\n \"was attested for using the latest guardian set.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"guardianSetIndex\";\n docs: [\"The current guardian set index, used to decide which signature sets to accept.\"];\n type: \"u32\";\n },\n {\n name: \"gap0\";\n docs: [\n \"Gap. In the old implementation, this was an amount that kept track of message fees that\",\n \"were paid to the program's fee collector.\",\n ];\n type: {\n array: [\"u8\", 8];\n };\n },\n {\n name: \"guardianSetTtl\";\n docs: [\n \"Period for how long a guardian set is valid after it has been replaced by a new one. This\",\n \"guarantees that VAAs issued by that set can still be submitted for a certain period. In\",\n \"this period we still trust the old guardian set.\",\n ];\n type: {\n defined: {\n name: \"duration\";\n };\n };\n },\n {\n name: \"feeLamports\";\n docs: [\"Amount of lamports that needs to be paid to the protocol to post a message\"];\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"legacyEmitterSequence\";\n docs: [\"Account used to store the current sequence number for a given emitter.\"];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"value\";\n docs: [\"Current sequence number, which will be used the next time this emitter publishes a message.\"];\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"emitterSequence\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"legacy\";\n type: {\n defined: {\n name: \"legacyEmitterSequence\";\n };\n };\n },\n {\n name: \"bump\";\n type: \"u8\";\n },\n {\n name: \"emitterType\";\n type: {\n defined: {\n name: \"emitterType\";\n };\n };\n },\n ];\n };\n },\n {\n name: \"postedMessageV1Unreliable\";\n docs: [\"Account used to store a published (reusable) Wormhole message.\"];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"data\";\n type: {\n defined: {\n name: \"postedMessageV1Data\";\n };\n };\n },\n ];\n };\n },\n {\n name: \"postedMessageV1Info\";\n docs: [\"Message metadata defining information about a published Wormhole message.\"];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"consistencyLevel\";\n docs: [\"Level of consistency requested by the emitter.\"];\n type: \"u8\";\n },\n {\n name: \"emitterAuthority\";\n docs: [\"Authority used to write the message. This field is set to default when the message is\", \"posted.\"];\n type: \"pubkey\";\n },\n {\n name: \"status\";\n docs: [\n \"If a message is being written to, this status is used to determine which state this\",\n \"account is in (e.g. [MessageStatus::Writing] indicates that the emitter authority is still\",\n \"writing its message to this account). When this message is posted, this value will be\",\n \"set to [MessageStatus::Published].\",\n ];\n type: {\n defined: {\n name: \"messageStatus\";\n };\n };\n },\n {\n name: \"gap0\";\n docs: [\"No data is stored here.\"];\n type: {\n array: [\"u8\", 3];\n };\n },\n {\n name: \"postedTimestamp\";\n docs: [\"Time the posted message was created.\"];\n type: {\n defined: {\n name: \"timestamp\";\n };\n };\n },\n {\n name: \"nonce\";\n docs: [\"Unique id for this message.\"];\n type: \"u32\";\n },\n {\n name: \"sequence\";\n docs: [\"Sequence number of this message.\"];\n type: \"u64\";\n },\n {\n name: \"solanaChainId\";\n docs: [\n \"Always `1`.\",\n \"\",\n \"NOTE: Saving this value is silly, but we are keeping it to be consistent with how the posted\",\n \"message account is written.\",\n ];\n type: {\n defined: {\n name: \"chainIdSolanaOnly\";\n };\n };\n },\n {\n name: \"emitter\";\n docs: [\"Emitter of the message. This may either be the emitter authority or a program ID.\"];\n type: \"pubkey\";\n },\n ];\n };\n },\n {\n name: \"postedMessageV1Data\";\n docs: [\n \"Underlying data for either [PostedMessageV1](crate::legacy::state::PostedMessageV1) or\",\n \"[PostedMessageV1Unreliable](crate::legacy::state::PostedMessageV1Unreliable).\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"info\";\n docs: [\"Message metadata.\"];\n type: {\n defined: {\n name: \"postedMessageV1Info\";\n };\n };\n },\n {\n name: \"payload\";\n docs: [\"Encoded message.\"];\n type: \"bytes\";\n },\n ];\n };\n },\n {\n name: \"postedMessageV1\";\n docs: [\n \"Account used to store a published Wormhole message.\",\n \"\",\n \"NOTE: If your integration requires reusable message accounts, please see\",\n \"[PostedMessageV1Unreliable](crate::legacy::state::PostedMessageV1Unreliable).\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"data\";\n docs: [\"Message data.\"];\n type: {\n defined: {\n name: \"postedMessageV1Data\";\n };\n };\n },\n ];\n };\n },\n {\n name: \"postedVaaV1Info\";\n docs: [\"VAA metadata defining information about a Wormhole message attested for by an active guardian\", \"set.\"];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"consistencyLevel\";\n docs: [\"Level of consistency requested by the emitter.\"];\n type: \"u8\";\n },\n {\n name: \"timestamp\";\n docs: [\"Time the message was submitted.\"];\n type: {\n defined: {\n name: \"timestamp\";\n };\n };\n },\n {\n name: \"signatureSet\";\n docs: [\n \"Pubkey of [SignatureSet](crate::state::SignatureSet) account that represents this VAA's\",\n \"signature verification.\",\n ];\n type: \"pubkey\";\n },\n {\n name: \"guardianSetIndex\";\n docs: [\n \"Guardian set index used to verify signatures for [SignatureSet](crate::state::SignatureSet).\",\n \"\",\n 'NOTE: In the previous implementation, this member was referred to as the \"posted timestamp\",',\n \"which is zero for VAA data (posted messages and VAAs resemble the same account schema). By\",\n \"changing this to the guardian set index, we patch a bug with verifying governance VAAs for\",\n \"the Core Bridge (other Core Bridge implementations require that the guardian set that\",\n \"attested for the governance VAA is the current one).\",\n ];\n type: \"u32\";\n },\n {\n name: \"nonce\";\n docs: [\"Unique ID for this message.\"];\n type: \"u32\";\n },\n {\n name: \"sequence\";\n docs: [\"Sequence number of this message.\"];\n type: \"u64\";\n },\n {\n name: \"emitterChain\";\n docs: [\"The Wormhole chain ID denoting the origin of this message.\"];\n type: \"u16\";\n },\n {\n name: \"emitterAddress\";\n docs: [\"Emitter of the message.\"];\n type: {\n array: [\"u8\", 32];\n };\n },\n ];\n };\n },\n {\n name: \"postedVaaV1\";\n docs: [\"Account used to store a verified VAA.\"];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"info\";\n docs: [\"VAA metadata.\"];\n type: {\n defined: {\n name: \"postedVaaV1Info\";\n };\n };\n },\n {\n name: \"payload\";\n docs: [\"Message payload.\"];\n type: \"bytes\";\n },\n ];\n };\n },\n {\n name: \"writeEncodedVaaArgs\";\n docs: [\n \"Arguments for the [write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa)\",\n \"instruction.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"index\";\n docs: [\"Index of VAA buffer.\"];\n type: \"u32\";\n },\n {\n name: \"data\";\n docs: [\"Data representing subset of VAA buffer starting at specified index.\"];\n type: \"bytes\";\n },\n ];\n };\n },\n {\n name: \"initMessageV1Args\";\n docs: [\n \"Arguments for the [init_message_v1](crate::wormhole_core_bridge_solana::init_message_v1)\",\n \"instruction.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"nonce\";\n docs: [\"Unique id for this message.\"];\n type: \"u32\";\n },\n {\n name: \"commitment\";\n docs: [\"Solana commitment level for Guardian observation.\"];\n type: {\n defined: {\n name: \"commitment\";\n };\n };\n },\n {\n name: \"cpiProgramId\";\n docs: [\n \"Optional program ID if the emitter address will be your program ID.\",\n \"\",\n 'NOTE: If `Some(program_id)`, your emitter authority seeds to be \\\\[b\"emitter\\\\].',\n ];\n type: {\n option: \"pubkey\";\n };\n },\n ];\n };\n },\n {\n name: \"writeMessageV1Args\";\n docs: [\n \"Arguments for the [write_message_v1](crate::wormhole_core_bridge_solana::write_message_v1)\",\n \"instruction.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"index\";\n docs: [\"Index of message buffer.\"];\n type: \"u32\";\n },\n {\n name: \"data\";\n docs: [\"Data representing subset of message buffer starting at specified index.\"];\n type: \"bytes\";\n },\n ];\n };\n },\n {\n name: \"header\";\n docs: [\"`EncodedVaa` account header.\"];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"status\";\n docs: [\n \"Processing status. **This encoded VAA is only considered usable when this status is set\",\n \"to [Verified](ProcessingStatus::Verified).**\",\n ];\n type: {\n defined: {\n name: \"processingStatus\";\n };\n };\n },\n {\n name: \"writeAuthority\";\n docs: [\"The authority that has write privilege to this account.\"];\n type: \"pubkey\";\n },\n {\n name: \"version\";\n docs: [\"VAA version. Only when the VAA is verified is this version set to a value.\"];\n type: \"u8\";\n },\n ];\n };\n },\n {\n name: \"timestamp\";\n docs: [\n \"This struct defines unix timestamp as u32 (as opposed to more modern systems that have adopted\",\n \"i64). Methods for this struct are meant to convert Solana's clock type to this type assuming we\",\n \"are far from year 2038.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"value\";\n type: \"u32\";\n },\n ];\n };\n },\n {\n name: \"duration\";\n docs: [\"To be used with the [Timestamp] type, this struct defines a duration in seconds.\"];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"seconds\";\n type: \"u32\";\n },\n ];\n };\n },\n {\n name: \"messageHash\";\n docs: [\"This type is used to represent a message hash (keccak).\"];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"bytes\";\n type: {\n array: [\"u8\", 32];\n };\n },\n ];\n };\n },\n {\n name: \"chainIdSolanaOnly\";\n docs: [\n \"This type is kind of silly. But because [PostedMessageV1](crate::state::PostedMessageV1) has the\",\n \"emitter chain ID as a field, which is unnecessary since it is always Solana's chain ID, we use\",\n \"this type to guarantee that the encoded chain ID is always `1`.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainId\";\n type: \"u16\";\n },\n ];\n };\n },\n {\n name: \"emitterInfo\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chain\";\n type: \"u16\";\n },\n {\n name: \"address\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"sequence\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"legacyInstruction\";\n docs: [\n \"Legacy instruction selector.\",\n \"\",\n \"NOTE: No more instructions should be added to this enum. Instead, add them as Anchor instruction\",\n \"handlers, which will inevitably live in\",\n \"[wormhole_core_bridge_solana](crate::wormhole_core_bridge_solana).\",\n ];\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"initialize\";\n },\n {\n name: \"postMessage\";\n },\n {\n name: \"postVaa\";\n },\n {\n name: \"setMessageFee\";\n },\n {\n name: \"transferFees\";\n },\n {\n name: \"upgradeContract\";\n },\n {\n name: \"guardianSetUpdate\";\n },\n {\n name: \"verifySignatures\";\n },\n {\n name: \"postMessageUnreliable\";\n },\n ];\n };\n },\n {\n name: \"emitterType\";\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"unset\";\n },\n {\n name: \"legacy\";\n },\n {\n name: \"executable\";\n },\n ];\n };\n },\n {\n name: \"messageStatus\";\n docs: [\"Status of a message. When a message is posted, its status is\", \"[Published](MessageStatus::Published).\"];\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"published\";\n },\n {\n name: \"writing\";\n },\n {\n name: \"readyForPublishing\";\n },\n ];\n };\n },\n {\n name: \"publishMessageDirective\";\n docs: [\"Directive used to determine how to post a Core Bridge message.\"];\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"message\";\n fields: [\n {\n name: \"nonce\";\n type: \"u32\";\n },\n {\n name: \"payload\";\n type: \"bytes\";\n },\n {\n name: \"commitment\";\n type: {\n defined: {\n name: \"commitment\";\n };\n };\n },\n ];\n },\n {\n name: \"programMessage\";\n fields: [\n {\n name: \"programId\";\n type: \"pubkey\";\n },\n {\n name: \"nonce\";\n type: \"u32\";\n },\n {\n name: \"payload\";\n type: \"bytes\";\n },\n {\n name: \"commitment\";\n type: {\n defined: {\n name: \"commitment\";\n };\n };\n },\n ];\n },\n {\n name: \"preparedMessage\";\n },\n ];\n };\n },\n {\n name: \"processingStatus\";\n docs: [\"Encoded VAA's processing status.\"];\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"unset\";\n },\n {\n name: \"writing\";\n },\n {\n name: \"verified\";\n },\n ];\n };\n },\n {\n name: \"commitment\";\n docs: [\n \"Representation of Solana's commitment levels. This enum is not exhaustive because Wormhole only\",\n \"considers these two commitment levels in its Guardian observation.\",\n \"\",\n \"See <https://docs.solana.com/cluster/commitments> for more info.\",\n ];\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"confirmed\";\n },\n {\n name: \"finalized\";\n },\n ];\n };\n },\n {\n name: \"guardianSet\";\n docs: [\n \"Account used to store a guardian set. The keys encoded in this account are Ethereum pubkeys.\",\n \"Its expiration time is determined at the time a guardian set is updated to a new set, where the\",\n \"current network clock time is used with\",\n \"[guardian_set_ttl](crate::state::Config::guardian_set_ttl).\",\n \"\",\n \"NOTE: The account schema is the same as legacy guardian sets, but this account now has a\",\n \"discriminator generated by Anchor's [account] macro. When the Core Bridge program performs a\",\n \"guardian set update with this implementation, guardian sets will now have this Anchor-generated\",\n \"discriminator.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"index\";\n docs: [\"Index representing an incrementing version number for this guardian set.\"];\n type: \"u32\";\n },\n {\n name: \"keys\";\n docs: [\"Ethereum-style public keys.\"];\n type: {\n vec: {\n array: [\"u8\", 20];\n };\n };\n },\n {\n name: \"creationTime\";\n docs: [\"Timestamp representing the time this guardian became active.\"];\n type: {\n defined: {\n name: \"timestamp\";\n };\n };\n },\n {\n name: \"expirationTime\";\n docs: [\"Expiration time when VAAs issued by this set are no longer valid.\"];\n type: {\n defined: {\n name: \"timestamp\";\n };\n };\n },\n ];\n };\n },\n {\n name: \"signatureSet\";\n docs: [\n \"Account used to store information about a guardian set used to sign a VAA. There is only one\",\n \"signature set for each verified VAA (associated with a\",\n \"[PostedVaaV1](crate::legacy::state::PostedVaaV1) account). This account is created using the\",\n \"verify signatures legacy instruction.\",\n \"\",\n \"NOTE: The account schema is the same as legacy signature sets, but this account now has a\",\n \"discriminator generated by Anchor's [account] macro. When the Core Bridge program upgrades to\",\n \"this implementation from the old one, integrators in the middle of verifying signatures will\",\n \"have to use a new keypair for this account and try again.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"sigVerifySuccesses\";\n docs: [\"Signatures of validators\"];\n type: {\n vec: \"bool\";\n };\n },\n {\n name: \"messageHash\";\n docs: [\"Hash of the VAA message body.\"];\n type: {\n defined: {\n name: \"messageHash\";\n };\n };\n },\n {\n name: \"guardianSetIndex\";\n docs: [\"Index of the guardian set\"];\n type: \"u32\";\n },\n ];\n };\n },\n {\n name: \"encodedVaa\";\n docs: [\n \"Account used to warehouse VAA buffer.\",\n \"\",\n \"NOTE: This account should not be used by an external application unless the header's status is\",\n \"`Verified`. It is encouraged to use the `EncodedVaa` zero-copy account struct instead.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"header\";\n docs: [\"Status, write authority and VAA version.\"];\n type: {\n defined: {\n name: \"header\";\n };\n };\n },\n {\n name: \"buf\";\n docs: [\"VAA buffer.\"];\n type: \"bytes\";\n },\n ];\n };\n },\n ];\n constants: [\n {\n name: \"solanaChain\";\n type: \"u16\";\n value: \"1\";\n },\n {\n name: \"feeCollectorSeedPrefix\";\n type: \"bytes\";\n value: \"[102, 101, 101, 95, 99, 111, 108, 108, 101, 99, 116, 111, 114]\";\n },\n {\n name: \"upgradeSeedPrefix\";\n type: \"bytes\";\n value: \"[117, 112, 103, 114, 97, 100, 101]\";\n },\n {\n name: \"programEmitterSeedPrefix\";\n type: \"bytes\";\n value: \"[101, 109, 105, 116, 116, 101, 114]\";\n },\n {\n name: \"maxMessagePayloadSize\";\n type: {\n defined: {\n name: \"usize\";\n };\n };\n value: \"30 * 1_024\";\n },\n ];\n};\n\nexport const PYTH_WORMHOLE_IDL: WormholeCoreBridgeSolana = {\n address: \"HDwcJBJXjL9FpJ7UBsYBtaDjsBUhuLCUYoz3zr8SWWaQ\",\n metadata: {\n name: \"wormholeCoreBridgeSolana\",\n version: \"0.0.1-alpha.5\",\n spec: \"0.1.0\",\n },\n instructions: [\n {\n name: \"initMessageV1\",\n docs: [\n \"Processor for initializing a new draft [PostedMessageV1](crate::state::PostedMessageV1)\",\n \"account for writing. The emitter authority is established at this point and the payload size\",\n \"is inferred from the size of the created account. This instruction handler also allows an\",\n \"integrator to publish Wormhole messages using his program's ID as the emitter address\",\n \"(by passing `Some(crate::ID)` to the [cpi_program_id](InitMessageV1Args::cpi_program_id)\",\n 'argument). **Be aware that the emitter authority\\'s seeds must only be \\\\[b\"emitter\"\\\\] in this',\n \"case.**\",\n \"\",\n \"This instruction should be followed up with `write_message_v1` and `finalize_message_v1` to\",\n \"write and indicate that the message is ready for publishing respectively (to prepare it for\",\n \"publishing via the\",\n \"[post message instruction](crate::legacy::instruction::LegacyInstruction::PostMessage)).\",\n \"\",\n \"NOTE: If you wish to publish a small message (one where the data does not overflow the\",\n \"Solana transaction size), it is recommended that you use an [sdk](crate::sdk::cpi) method to\",\n \"either prepare your message or post a message as a program ID emitter.\",\n ],\n discriminator: [247, 187, 26, 16, 122, 198, 106, 247],\n accounts: [\n {\n name: \"emitterAuthority\",\n docs: [\"This authority is the only one who can write to the draft message account.\"],\n signer: true,\n },\n {\n name: \"draftMessage\",\n docs: [\"Bridge.\"],\n writable: true,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: {\n name: \"initMessageV1Args\",\n },\n },\n },\n ],\n },\n {\n name: \"writeMessageV1\",\n docs: [\n \"Processor used to write to a draft [PostedMessageV1](crate::state::PostedMessageV1) account.\",\n \"This instruction requires an authority (the emitter authority) to interact with the message\",\n \"account.\",\n ],\n discriminator: [35, 67, 197, 233, 94, 117, 124, 143],\n accounts: [\n {\n name: \"emitterAuthority\",\n signer: true,\n },\n {\n name: \"draftMessage\",\n docs: [\"only be published when the message is finalized.\"],\n writable: true,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: {\n name: \"writeMessageV1Args\",\n },\n },\n },\n ],\n },\n {\n name: \"finalizeMessageV1\",\n docs: [\n \"Processor used to finalize a draft [PostedMessageV1](crate::state::PostedMessageV1) account.\",\n \"Once finalized, this message account cannot be written to again. A finalized message is the\",\n \"only state the legacy post message instruction can accept before publishing. This\",\n \"instruction requires an authority (the emitter authority) to interact with the message\",\n \"account.\",\n ],\n discriminator: [245, 208, 215, 228, 129, 56, 51, 251],\n accounts: [\n {\n name: \"emitterAuthority\",\n signer: true,\n },\n {\n name: \"draftMessage\",\n docs: [\"only be published when the message is finalized.\"],\n writable: true,\n },\n ],\n args: [],\n },\n {\n name: \"closeMessageV1\",\n docs: [\n \"Processor used to process a draft [PostedMessageV1](crate::state::PostedMessageV1) account.\",\n \"This instruction requires an authority (the emitter authority) to interact with the message\",\n \"account.\",\n ],\n discriminator: [36, 185, 40, 107, 239, 13, 51, 162],\n accounts: [\n {\n name: \"emitterAuthority\",\n signer: true,\n },\n {\n name: \"draftMessage\",\n docs: [\"only be published when the message is finalized.\"],\n writable: true,\n },\n {\n name: \"closeAccountDestination\",\n writable: true,\n },\n ],\n args: [],\n },\n {\n name: \"initEncodedVaa\",\n docs: [\n \"Processor used to intialize a created account as [EncodedVaa](crate::state::EncodedVaa). An\",\n \"authority (the write authority) is established with this instruction.\",\n ],\n discriminator: [209, 193, 173, 25, 91, 202, 181, 218],\n accounts: [\n {\n name: \"writeAuthority\",\n docs: [\"The authority who can write to the VAA account when it is being processed.\"],\n signer: true,\n },\n {\n name: \"encodedVaa\",\n docs: [\"Bridge.\"],\n writable: true,\n },\n ],\n args: [],\n },\n {\n name: \"closeEncodedVaa\",\n docs: [\n \"Processor used to close an [EncodedVaa](crate::state::EncodedVaa). This instruction requires\",\n \"an authority (the write authority) to interact witht he encoded VAA account.\",\n ],\n discriminator: [48, 221, 174, 198, 231, 7, 152, 38],\n accounts: [\n {\n name: \"writeAuthority\",\n docs: [\n \"This account is only required to be mutable for the `CloseVaaAccount` directive. This\",\n \"authority is the same signer that originally created the VAA accounts, so he is the one that\",\n \"will receive the lamports back for the closed accounts.\",\n ],\n writable: true,\n signer: true,\n },\n {\n name: \"encodedVaa\",\n docs: [\"written to and then verified.\"],\n writable: true,\n },\n ],\n args: [],\n },\n {\n name: \"writeEncodedVaa\",\n docs: [\n \"Processor used to write to an [EncodedVaa](crate::state::EncodedVaa) account. This\",\n \"instruction requires an authority (the write authority) to interact with the encoded VAA\",\n \"account.\",\n ],\n discriminator: [199, 208, 110, 177, 150, 76, 118, 42],\n accounts: [\n {\n name: \"writeAuthority\",\n docs: [\"The only authority that can write to the encoded VAA account.\"],\n signer: true,\n },\n {\n name: \"draftVaa\",\n docs: [\"written to and then verified.\"],\n writable: true,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: {\n name: \"writeEncodedVaaArgs\",\n },\n },\n },\n ],\n },\n {\n name: \"verifyEncodedVaaV1\",\n docs: [\n \"Processor used to verify an [EncodedVaa](crate::state::EncodedVaa) account as a version 1\",\n \"VAA (guardian signatures attesting to this observation). This instruction requires an\",\n \"authority (the write authority) to interact with the encoded VAA account.\",\n ],\n discriminator: [103, 56, 177, 229, 240, 103, 68, 73],\n accounts: [\n {\n name: \"writeAuthority\",\n signer: true,\n },\n {\n name: \"draftVaa\",\n docs: [\"written to and then verified.\"],\n writable: true,\n },\n {\n name: \"guardianSet\",\n docs: [\n \"Guardian set account, which should be the same one that was used to attest for the VAA. The\",\n \"signatures in the encoded VAA are verified against this guardian set.\",\n ],\n },\n ],\n args: [],\n },\n {\n name: \"postVaaV1\",\n docs: [\n \"Processor used to close an [EncodedVaa](crate::state::EncodedVaa) account to create a\",\n \"[PostedMessageV1](crate::state::PostedMessageV1) account in its place.\",\n \"\",\n \"NOTE: Because the legacy verify signatures instruction was not required for the Posted VAA\",\n \"account to exist, the encoded [SignatureSet](crate::state::SignatureSet) is the default\",\n \"[Pubkey].\",\n ],\n discriminator: [0, 57, 97, 3, 225, 37, 254, 31],\n accounts: [\n {\n name: \"payer\",\n docs: [\n \"Payer to create the posted VAA account. This instruction allows anyone with an encoded VAA\",\n \"to create a posted VAA account.\",\n ],\n writable: true,\n signer: true,\n },\n {\n name: \"encodedVaa\",\n docs: [\n \"Encoded VAA, whose body will be serialized into the posted VAA account.\",\n \"\",\n \"NOTE: This instruction handler only exists to support integrators that still rely on posted\",\n \"VAA accounts. While we encourage integrators to use the encoded VAA account instead, we\",\n \"allow a pathway to convert the encoded VAA into a posted VAA. However, the payload is\",\n \"restricted to 9.5KB, which is much larger than what was possible with the old implementation\",\n \"using the legacy post vaa instruction. The Core Bridge program will not support posting VAAs\",\n \"larger than this payload size.\",\n ],\n },\n {\n name: \"postedVaa\",\n writable: true,\n },\n {\n name: \"systemProgram\",\n },\n ],\n args: [],\n },\n {\n name: \"closeSignatureSet\",\n docs: [\n \"Processor used to close a [SignatureSet](crate::state::SignatureSet), which was used to\",\n \"verify the VAA using the legacy parse and verify procedure.\",\n ],\n discriminator: [64, 154, 185, 168, 234, 229, 218, 103],\n accounts: [\n {\n name: \"solDestination\",\n writable: true,\n signer: true,\n },\n {\n name: \"postedVaa\",\n docs: [\"Posted VAA.\"],\n },\n {\n name: \"signatureSet\",\n docs: [\n \"Signature set that may have been used to create the posted VAA account. If the `post_vaa_v1`\",\n \"instruction were used to create the posted VAA account, then the encoded signature set\",\n \"pubkey would be all zeroes.\",\n ],\n writable: true,\n },\n ],\n args: [],\n },\n ],\n accounts: [\n {\n name: \"guardianSet\",\n discriminator: [16, 67, 62, 123, 169, 90, 100, 60],\n },\n {\n name: \"signatureSet\",\n discriminator: [135, 116, 238, 4, 218, 116, 194, 143],\n },\n {\n name: \"encodedVaa\",\n discriminator: [73, 170, 26, 37, 21, 245, 172, 192],\n },\n ],\n errors: [\n {\n code: 6002,\n name: \"invalidInstructionArgument\",\n msg: \"invalidInstructionArgument\",\n },\n {\n code: 6003,\n name: \"accountNotZeroed\",\n msg: \"accountNotZeroed\",\n },\n {\n code: 6004,\n name: \"invalidDataConversion\",\n msg: \"invalidDataConversion\",\n },\n {\n code: 6006,\n name: \"u64Overflow\",\n msg: \"u64Overflow\",\n },\n {\n code: 6008,\n name: \"invalidComputeSize\",\n msg: \"invalidComputeSize\",\n },\n {\n code: 6016,\n name: \"invalidChain\",\n msg: \"invalidChain\",\n },\n {\n code: 6032,\n name: \"invalidGovernanceEmitter\",\n msg: \"invalidGovernanceEmitter\",\n },\n {\n code: 6034,\n name: \"invalidGovernanceAction\",\n msg: \"invalidGovernanceAction\",\n },\n {\n code: 6036,\n name: \"latestGuardianSetRequired\",\n msg: \"latestGuardianSetRequired\",\n },\n {\n code: 6038,\n name: \"governanceForAnotherChain\",\n msg: \"governanceForAnotherChain\",\n },\n {\n code: 6040,\n name: \"invalidGovernanceVaa\",\n msg: \"invalidGovernanceVaa\",\n },\n {\n code: 6256,\n name: \"insufficientFees\",\n msg: \"insufficientFees\",\n },\n {\n code: 6258,\n name: \"emitterMismatch\",\n msg: \"emitterMismatch\",\n },\n {\n code: 6260,\n name: \"notReadyForPublishing\",\n msg: \"notReadyForPublishing\",\n },\n {\n code: 6262,\n name: \"invalidPreparedMessage\",\n msg: \"invalidPreparedMessage\",\n },\n {\n code: 6264,\n name: \"executableEmitter\",\n msg: \"executableEmitter\",\n },\n {\n code: 6266,\n name: \"legacyEmitter\",\n msg: \"legacyEmitter\",\n },\n {\n code: 6512,\n name: \"invalidSignatureSet\",\n msg: \"invalidSignatureSet\",\n },\n {\n code: 6514,\n name: \"invalidMessageHash\",\n msg: \"invalidMessageHash\",\n },\n {\n code: 6515,\n name: \"noQuorum\",\n msg: \"noQuorum\",\n },\n {\n code: 6516,\n name: \"messageMismatch\",\n msg: \"messageMismatch\",\n },\n {\n code: 7024,\n name: \"notEnoughLamports\",\n msg: \"notEnoughLamports\",\n },\n {\n code: 7026,\n name: \"invalidFeeRecipient\",\n msg: \"invalidFeeRecipient\",\n },\n {\n code: 7280,\n name: \"implementationMismatch\",\n msg: \"implementationMismatch\",\n },\n {\n code: 7536,\n name: \"invalidGuardianSetIndex\",\n msg: \"invalidGuardianSetIndex\",\n },\n {\n code: 7792,\n name: \"guardianSetMismatch\",\n msg: \"guardianSetMismatch\",\n },\n {\n code: 7794,\n name: \"instructionAtWrongIndex\",\n msg: \"instructionAtWrongIndex\",\n },\n {\n code: 7795,\n name: \"emptySigVerifyInstruction\",\n msg: \"emptySigVerifyInstruction\",\n },\n {\n code: 7796,\n name: \"invalidSigVerifyInstruction\",\n msg: \"invalidSigVerifyInstruction\",\n },\n {\n code: 7798,\n name: \"guardianSetExpired\",\n msg: \"guardianSetExpired\",\n },\n {\n code: 7800,\n name: \"invalidGuardianKeyRecovery\",\n msg: \"invalidGuardianKeyRecovery\",\n },\n {\n code: 7802,\n name: \"signerIndicesMismatch\",\n msg: \"signerIndicesMismatch\",\n },\n {\n code: 8048,\n name: \"payloadSizeMismatch\",\n msg: \"payloadSizeMismatch\",\n },\n {\n code: 10112,\n name: \"zeroGuardians\",\n msg: \"zeroGuardians\",\n },\n {\n code: 10128,\n name: \"guardianZeroAddress\",\n msg: \"guardianZeroAddress\",\n },\n {\n code: 10144,\n name: \"duplicateGuardianAddress\",\n msg: \"duplicateGuardianAddress\",\n },\n {\n code: 10160,\n name: \"messageAlreadyPublished\",\n msg: \"messageAlreadyPublished\",\n },\n {\n code: 10176,\n name: \"vaaWritingDisallowed\",\n msg: \"vaaWritingDisallowed\",\n },\n {\n code: 10192,\n name: \"vaaAlreadyVerified\",\n msg: \"vaaAlreadyVerified\",\n },\n {\n code: 10208,\n name: \"invalidGuardianIndex\",\n msg: \"invalidGuardianIndex\",\n },\n {\n code: 10224,\n name: \"invalidSignature\",\n msg: \"invalidSignature\",\n },\n {\n code: 10256,\n name: \"unverifiedVaa\",\n msg: \"unverifiedVaa\",\n },\n {\n code: 10258,\n name: \"vaaStillProcessing\",\n msg: \"vaaStillProcessing\",\n },\n {\n code: 10260,\n name: \"inWritingStatus\",\n msg: \"inWritingStatus\",\n },\n {\n code: 10262,\n name: \"notInWritingStatus\",\n msg: \"notInWritingStatus\",\n },\n {\n code: 10264,\n name: \"invalidMessageStatus\",\n msg: \"invalidMessageStatus\",\n },\n {\n code: 10266,\n name: \"hashNotComputed\",\n msg: \"hashNotComputed\",\n },\n {\n code: 10268,\n name: \"invalidVaaVersion\",\n msg: \"invalidVaaVersion\",\n },\n {\n code: 10270,\n name: \"invalidCreatedAccountSize\",\n msg: \"invalidCreatedAccountSize\",\n },\n {\n code: 10272,\n name: \"dataOverflow\",\n msg: \"dataOverflow\",\n },\n {\n code: 10274,\n name: \"exceedsMaxPayloadSize\",\n msg: \"ExceedsMaxPayloadSize (30KB)\",\n },\n {\n code: 10276,\n name: \"cannotParseVaa\",\n msg: \"cannotParseVaa\",\n },\n {\n code: 10278,\n name: \"emitterAuthorityMismatch\",\n msg: \"emitterAuthorityMismatch\",\n },\n {\n code: 10280,\n name: \"invalidProgramEmitter\",\n msg: \"invalidProgramEmitter\",\n },\n {\n code: 10282,\n name: \"writeAuthorityMismatch\",\n msg: \"writeAuthorityMismatch\",\n },\n {\n code: 10284,\n name: \"postedVaaPayloadTooLarge\",\n msg: \"postedVaaPayloadTooLarge\",\n },\n {\n code: 10286,\n name: \"executableDisallowed\",\n msg: \"executableDisallowed\",\n },\n ],\n types: [\n {\n name: \"initializeArgs\",\n docs: [\"Arguments used to initialize the Core Bridge program.\"],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"guardianSetTtlSeconds\",\n type: \"u32\",\n },\n {\n name: \"feeLamports\",\n type: \"u64\",\n },\n {\n name: \"initialGuardians\",\n type: {\n vec: {\n array: [\"u8\", 20],\n },\n },\n },\n ],\n },\n },\n {\n name: \"postMessageArgs\",\n docs: [\n \"Arguments used to post a new Wormhole (Core Bridge) message either using\",\n \"[post_message](crate::legacy::instruction::post_message) or\",\n \"[post_message_unreliable](crate::legacy::instruction::post_message_unreliable).\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"nonce\",\n docs: [\"Unique id for this message.\"],\n type: \"u32\",\n },\n {\n name: \"payload\",\n docs: [\"Encoded message.\"],\n type: \"bytes\",\n },\n {\n name: \"commitment\",\n docs: [\"Solana commitment level for Guardian observation.\"],\n type: {\n defined: {\n name: \"commitment\",\n },\n },\n },\n ],\n },\n },\n {\n name: \"postVaaArgs\",\n docs: [\n \"Arguments to post new VAA data after signature verification.\",\n \"\",\n \"NOTE: It is preferred to use the new process of verifying a VAA using the new Core Bridge Anchor\",\n \"instructions. See [init_encoded_vaa](crate::wormhole_core_bridge_solana::init_encoded_vaa) and\",\n \"[write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa) for more info.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"gap0\",\n docs: [\"Unused data.\"],\n type: {\n array: [\"u8\", 5],\n },\n },\n {\n name: \"timestamp\",\n docs: [\"Time the message was submitted.\"],\n type: \"u32\",\n },\n {\n name: \"nonce\",\n docs: [\"Unique ID for this message.\"],\n type: \"u32\",\n },\n {\n name: \"emitterChain\",\n docs: [\"The Wormhole chain ID denoting the origin of this message.\"],\n type: \"u16\",\n },\n {\n name: \"emitterAddress\",\n docs: [\"Emitter of the message.\"],\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"sequence\",\n docs: [\"Sequence number of this message.\"],\n type: \"u64\",\n },\n {\n name: \"consistencyLevel\",\n docs: [\"Level of consistency requested by the emitter.\"],\n type: \"u8\",\n },\n {\n name: \"payload\",\n docs: [\"Message payload.\"],\n type: \"bytes\",\n },\n ],\n },\n },\n {\n name: \"verifySignaturesArgs\",\n docs: [\n \"Arguments to verify specific guardian indices.\",\n \"\",\n \"NOTE: It is preferred to use the new process of verifying a VAA using the new Core Bridge Anchor\",\n \"instructions. See [init_encoded_vaa](crate::wormhole_core_bridge_solana::init_encoded_vaa) and\",\n \"[write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa) for more info.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"signerIndices\",\n docs: [\n \"Indices of verified guardian signatures, where -1 indicates a missing value. There is a\",\n \"missing value if the guardian at this index is not expected to have its signature verified by\",\n \"the Sig Verify native program in the instruction invoked prior).\",\n \"\",\n \"NOTE: In the legacy implementation, this argument being a fixed-sized array of 19 only\",\n \"allows the first 19 guardians of any size guardian set to be verified. Because of this, it\",\n \"is absolutely important to use the new process of verifying a VAA.\",\n ],\n type: {\n array: [\"i8\", 19],\n },\n },\n ],\n },\n },\n {\n name: \"emptyArgs\",\n docs: [\"Unit struct used to represent an empty instruction argument.\"],\n type: {\n kind: \"struct\",\n },\n },\n {\n name: \"config\",\n docs: [\n \"Account used to store the current configuration of the bridge, including tracking Wormhole fee\",\n \"payments. For governance decrees, the guardian set index is used to determine whether a decree\",\n \"was attested for using the latest guardian set.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"guardianSetIndex\",\n docs: [\"The current guardian set index, used to decide which signature sets to accept.\"],\n type: \"u32\",\n },\n {\n name: \"gap0\",\n docs: [\n \"Gap. In the old implementation, this was an amount that kept track of message fees that\",\n \"were paid to the program's fee collector.\",\n ],\n type: {\n array: [\"u8\", 8],\n },\n },\n {\n name: \"guardianSetTtl\",\n docs: [\n \"Period for how long a guardian set is valid after it has been replaced by a new one. This\",\n \"guarantees that VAAs issued by that set can still be submitted for a certain period. In\",\n \"this period we still trust the old guardian set.\",\n ],\n type: {\n defined: {\n name: \"duration\",\n },\n },\n },\n {\n name: \"feeLamports\",\n docs: [\"Amount of lamports that needs to be paid to the protocol to post a message\"],\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"legacyEmitterSequence\",\n docs: [\"Account used to store the current sequence number for a given emitter.\"],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"value\",\n docs: [\"Current sequence number, which will be used the next time this emitter publishes a message.\"],\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"emitterSequence\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"legacy\",\n type: {\n defined: {\n name: \"legacyEmitterSequence\",\n },\n },\n },\n {\n name: \"bump\",\n type: \"u8\",\n },\n {\n name: \"emitterType\",\n type: {\n defined: {\n name: \"emitterType\",\n },\n },\n },\n ],\n },\n },\n {\n name: \"postedMessageV1Unreliable\",\n docs: [\"Account used to store a published (reusable) Wormhole message.\"],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"data\",\n type: {\n defined: {\n name: \"postedMessageV1Data\",\n },\n },\n },\n ],\n },\n },\n {\n name: \"postedMessageV1Info\",\n docs: [\"Message metadata defining information about a published Wormhole message.\"],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"consistencyLevel\",\n docs: [\"Level of consistency requested by the emitter.\"],\n type: \"u8\",\n },\n {\n name: \"emitterAuthority\",\n docs: [\"Authority used to write the message. This field is set to default when the message is\", \"posted.\"],\n type: \"pubkey\",\n },\n {\n name: \"status\",\n docs: [\n \"If a message is being written to, this status is used to determine which state this\",\n \"account is in (e.g. [MessageStatus::Writing] indicates that the emitter authority is still\",\n \"writing its message to this account). When this message is posted, this value will be\",\n \"set to [MessageStatus::Published].\",\n ],\n type: {\n defined: {\n name: \"messageStatus\",\n },\n },\n },\n {\n name: \"gap0\",\n docs: [\"No data is stored here.\"],\n type: {\n array: [\"u8\", 3],\n },\n },\n {\n name: \"postedTimestamp\",\n docs: [\"Time the posted message was created.\"],\n type: {\n defined: {\n name: \"timestamp\",\n },\n },\n },\n {\n name: \"nonce\",\n docs: [\"Unique id for this message.\"],\n type: \"u32\",\n },\n {\n name: \"sequence\",\n docs: [\"Sequence number of this message.\"],\n type: \"u64\",\n },\n {\n name: \"solanaChainId\",\n docs: [\n \"Always `1`.\",\n \"\",\n \"NOTE: Saving this value is silly, but we are keeping it to be consistent with how the posted\",\n \"message account is written.\",\n ],\n type: {\n defined: {\n name: \"chainIdSolanaOnly\",\n },\n },\n },\n {\n name: \"emitter\",\n docs: [\"Emitter of the message. This may either be the emitter authority or a program ID.\"],\n type: \"pubkey\",\n },\n ],\n },\n },\n {\n name: \"postedMessageV1Data\",\n docs: [\n \"Underlying data for either [PostedMessageV1](crate::legacy::state::PostedMessageV1) or\",\n \"[PostedMessageV1Unreliable](crate::legacy::state::PostedMessageV1Unreliable).\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"info\",\n docs: [\"Message metadata.\"],\n type: {\n defined: {\n name: \"postedMessageV1Info\",\n },\n },\n },\n {\n name: \"payload\",\n docs: [\"Encoded message.\"],\n type: \"bytes\",\n },\n ],\n },\n },\n {\n name: \"postedMessageV1\",\n docs: [\n \"Account used to store a published Wormhole message.\",\n \"\",\n \"NOTE: If your integration requires reusable message accounts, please see\",\n \"[PostedMessageV1Unreliable](crate::legacy::state::PostedMessageV1Unreliable).\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"data\",\n docs: [\"Message data.\"],\n type: {\n defined: {\n name: \"postedMessageV1Data\",\n },\n },\n },\n ],\n },\n },\n {\n name: \"postedVaaV1Info\",\n docs: [\"VAA metadata defining information about a Wormhole message attested for by an active guardian\", \"set.\"],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"consistencyLevel\",\n docs: [\"Level of consistency requested by the emitter.\"],\n type: \"u8\",\n },\n {\n name: \"timestamp\",\n docs: [\"Time the message was submitted.\"],\n type: {\n defined: {\n name: \"timestamp\",\n },\n },\n },\n {\n name: \"signatureSet\",\n docs: [\n \"Pubkey of [SignatureSet](crate::state::SignatureSet) account that represents this VAA's\",\n \"signature verification.\",\n ],\n type: \"pubkey\",\n },\n {\n name: \"guardianSetIndex\",\n docs: [\n \"Guardian set index used to verify signatures for [SignatureSet](crate::state::SignatureSet).\",\n \"\",\n 'NOTE: In the previous implementation, this member was referred to as the \"posted timestamp\",',\n \"which is zero for VAA data (posted messages and VAAs resemble the same account schema). By\",\n \"changing this to the guardian set index, we patch a bug with verifying governance VAAs for\",\n \"the Core Bridge (other Core Bridge implementations require that the guardian set that\",\n \"attested for the governance VAA is the current one).\",\n ],\n type: \"u32\",\n },\n {\n name: \"nonce\",\n docs: [\"Unique ID for this message.\"],\n type: \"u32\",\n },\n {\n name: \"sequence\",\n docs: [\"Sequence number of this message.\"],\n type: \"u64\",\n },\n {\n name: \"emitterChain\",\n docs: [\"The Wormhole chain ID denoting the origin of this message.\"],\n type: \"u16\",\n },\n {\n name: \"emitterAddress\",\n docs: [\"Emitter of the message.\"],\n type: {\n array: [\"u8\", 32],\n },\n },\n ],\n },\n },\n {\n name: \"postedVaaV1\",\n docs: [\"Account used to store a verified VAA.\"],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"info\",\n docs: [\"VAA metadata.\"],\n type: {\n defined: {\n name: \"postedVaaV1Info\",\n },\n },\n },\n {\n name: \"payload\",\n docs: [\"Message payload.\"],\n type: \"bytes\",\n },\n ],\n },\n },\n {\n name: \"writeEncodedVaaArgs\",\n docs: [\n \"Arguments for the [write_encoded_vaa](crate::wormhole_core_bridge_solana::write_encoded_vaa)\",\n \"instruction.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"index\",\n docs: [\"Index of VAA buffer.\"],\n type: \"u32\",\n },\n {\n name: \"data\",\n docs: [\"Data representing subset of VAA buffer starting at specified index.\"],\n type: \"bytes\",\n },\n ],\n },\n },\n {\n name: \"initMessageV1Args\",\n docs: [\n \"Arguments for the [init_message_v1](crate::wormhole_core_bridge_solana::init_message_v1)\",\n \"instruction.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"nonce\",\n docs: [\"Unique id for this message.\"],\n type: \"u32\",\n },\n {\n name: \"commitment\",\n docs: [\"Solana commitment level for Guardian observation.\"],\n type: {\n defined: {\n name: \"commitment\",\n },\n },\n },\n {\n name: \"cpiProgramId\",\n docs: [\n \"Optional program ID if the emitter address will be your program ID.\",\n \"\",\n 'NOTE: If `Some(program_id)`, your emitter authority seeds to be \\\\[b\"emitter\\\\].',\n ],\n type: {\n option: \"pubkey\",\n },\n },\n ],\n },\n },\n {\n name: \"writeMessageV1Args\",\n docs: [\n \"Arguments for the [write_message_v1](crate::wormhole_core_bridge_solana::write_message_v1)\",\n \"instruction.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"index\",\n docs: [\"Index of message buffer.\"],\n type: \"u32\",\n },\n {\n name: \"data\",\n docs: [\"Data representing subset of message buffer starting at specified index.\"],\n type: \"bytes\",\n },\n ],\n },\n },\n {\n name: \"header\",\n docs: [\"`EncodedVaa` account header.\"],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"status\",\n docs: [\n \"Processing status. **This encoded VAA is only considered usable when this status is set\",\n \"to [Verified](ProcessingStatus::Verified).**\",\n ],\n type: {\n defined: {\n name: \"processingStatus\",\n },\n },\n },\n {\n name: \"writeAuthority\",\n docs: [\"The authority that has write privilege to this account.\"],\n type: \"pubkey\",\n },\n {\n name: \"version\",\n docs: [\"VAA version. Only when the VAA is verified is this version set to a value.\"],\n type: \"u8\",\n },\n ],\n },\n },\n {\n name: \"timestamp\",\n docs: [\n \"This struct defines unix timestamp as u32 (as opposed to more modern systems that have adopted\",\n \"i64). Methods for this struct are meant to convert Solana's clock type to this type assuming we\",\n \"are far from year 2038.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"value\",\n type: \"u32\",\n },\n ],\n },\n },\n {\n name: \"duration\",\n docs: [\"To be used with the [Timestamp] type, this struct defines a duration in seconds.\"],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"seconds\",\n type: \"u32\",\n },\n ],\n },\n },\n {\n name: \"messageHash\",\n docs: [\"This type is used to represent a message hash (keccak).\"],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"bytes\",\n type: {\n array: [\"u8\", 32],\n },\n },\n ],\n },\n },\n {\n name: \"chainIdSolanaOnly\",\n docs: [\n \"This type is kind of silly. But because [PostedMessageV1](crate::state::PostedMessageV1) has the\",\n \"emitter chain ID as a field, which is unnecessary since it is always Solana's chain ID, we use\",\n \"this type to guarantee that the encoded chain ID is always `1`.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainId\",\n type: \"u16\",\n },\n ],\n },\n },\n {\n name: \"emitterInfo\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chain\",\n type: \"u16\",\n },\n {\n name: \"address\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"sequence\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"legacyInstruction\",\n docs: [\n \"Legacy instruction selector.\",\n \"\",\n \"NOTE: No more instructions should be added to this enum. Instead, add them as Anchor instruction\",\n \"handlers, which will inevitably live in\",\n \"[wormhole_core_bridge_solana](crate::wormhole_core_bridge_solana).\",\n ],\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"initialize\",\n },\n {\n name: \"postMessage\",\n },\n {\n name: \"postVaa\",\n },\n {\n name: \"setMessageFee\",\n },\n {\n name: \"transferFees\",\n },\n {\n name: \"upgradeContract\",\n },\n {\n name: \"guardianSetUpdate\",\n },\n {\n name: \"verifySignatures\",\n },\n {\n name: \"postMessageUnreliable\",\n },\n ],\n },\n },\n {\n name: \"emitterType\",\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"unset\",\n },\n {\n name: \"legacy\",\n },\n {\n name: \"executable\",\n },\n ],\n },\n },\n {\n name: \"messageStatus\",\n docs: [\"Status of a message. When a message is posted, its status is\", \"[Published](MessageStatus::Published).\"],\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"published\",\n },\n {\n name: \"writing\",\n },\n {\n name: \"readyForPublishing\",\n },\n ],\n },\n },\n {\n name: \"publishMessageDirective\",\n docs: [\"Directive used to determine how to post a Core Bridge message.\"],\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"message\",\n fields: [\n {\n name: \"nonce\",\n type: \"u32\",\n },\n {\n name: \"payload\",\n type: \"bytes\",\n },\n {\n name: \"commitment\",\n type: {\n defined: {\n name: \"commitment\",\n },\n },\n },\n ],\n },\n {\n name: \"programMessage\",\n fields: [\n {\n name: \"programId\",\n type: \"pubkey\",\n },\n {\n name: \"nonce\",\n type: \"u32\",\n },\n {\n name: \"payload\",\n type: \"bytes\",\n },\n {\n name: \"commitment\",\n type: {\n defined: {\n name: \"commitment\",\n },\n },\n },\n ],\n },\n {\n name: \"preparedMessage\",\n },\n ],\n },\n },\n {\n name: \"processingStatus\",\n docs: [\"Encoded VAA's processing status.\"],\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"unset\",\n },\n {\n name: \"writing\",\n },\n {\n name: \"verified\",\n },\n ],\n },\n },\n {\n name: \"commitment\",\n docs: [\n \"Representation of Solana's commitment levels. This enum is not exhaustive because Wormhole only\",\n \"considers these two commitment levels in its Guardian observation.\",\n \"\",\n \"See <https://docs.solana.com/cluster/commitments> for more info.\",\n ],\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"confirmed\",\n },\n {\n name: \"finalized\",\n },\n ],\n },\n },\n {\n name: \"guardianSet\",\n docs: [\n \"Account used to store a guardian set. The keys encoded in this account are Ethereum pubkeys.\",\n \"Its expiration time is determined at the time a guardian set is updated to a new set, where the\",\n \"current network clock time is used with\",\n \"[guardian_set_ttl](crate::state::Config::guardian_set_ttl).\",\n \"\",\n \"NOTE: The account schema is the same as legacy guardian sets, but this account now has a\",\n \"discriminator generated by Anchor's [account] macro. When the Core Bridge program performs a\",\n \"guardian set update with this implementation, guardian sets will now have this Anchor-generated\",\n \"discriminator.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"index\",\n docs: [\"Index representing an incrementing version number for this guardian set.\"],\n type: \"u32\",\n },\n {\n name: \"keys\",\n docs: [\"Ethereum-style public keys.\"],\n type: {\n vec: {\n array: [\"u8\", 20],\n },\n },\n },\n {\n name: \"creationTime\",\n docs: [\"Timestamp representing the time this guardian became active.\"],\n type: {\n defined: {\n name: \"timestamp\",\n },\n },\n },\n {\n name: \"expirationTime\",\n docs: [\"Expiration time when VAAs issued by this set are no longer valid.\"],\n type: {\n defined: {\n name: \"timestamp\",\n },\n },\n },\n ],\n },\n },\n {\n name: \"signatureSet\",\n docs: [\n \"Account used to store information about a guardian set used to sign a VAA. There is only one\",\n \"signature set for each verified VAA (associated with a\",\n \"[PostedVaaV1](crate::legacy::state::PostedVaaV1) account). This account is created using the\",\n \"verify signatures legacy instruction.\",\n \"\",\n \"NOTE: The account schema is the same as legacy signature sets, but this account now has a\",\n \"discriminator generated by Anchor's [account] macro. When the Core Bridge program upgrades to\",\n \"this implementation from the old one, integrators in the middle of verifying signatures will\",\n \"have to use a new keypair for this account and try again.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"sigVerifySuccesses\",\n docs: [\"Signatures of validators\"],\n type: {\n vec: \"bool\",\n },\n },\n {\n name: \"messageHash\",\n docs: [\"Hash of the VAA message body.\"],\n type: {\n defined: {\n name: \"messageHash\",\n },\n },\n },\n {\n name: \"guardianSetIndex\",\n docs: [\"Index of the guardian set\"],\n type: \"u32\",\n },\n ],\n },\n },\n {\n name: \"encodedVaa\",\n docs: [\n \"Account used to warehouse VAA buffer.\",\n \"\",\n \"NOTE: This account should not be used by an external application unless the header's status is\",\n \"`Verified`. It is encouraged to use the `EncodedVaa` zero-copy account struct instead.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"header\",\n docs: [\"Status, write authority and VAA version.\"],\n type: {\n defined: {\n name: \"header\",\n },\n },\n },\n {\n name: \"buf\",\n docs: [\"VAA buffer.\"],\n type: \"bytes\",\n },\n ],\n },\n },\n ],\n constants: [\n {\n name: \"solanaChain\",\n type: \"u16\",\n value: \"1\",\n },\n {\n name: \"feeCollectorSeedPrefix\",\n type: \"bytes\",\n value: \"[102, 101, 101, 95, 99, 111, 108, 108, 101, 99, 116, 111, 114]\",\n },\n {\n name: \"upgradeSeedPrefix\",\n type: \"bytes\",\n value: \"[117, 112, 103, 114, 97, 100, 101]\",\n },\n {\n name: \"programEmitterSeedPrefix\",\n type: \"bytes\",\n value: \"[101, 109, 105, 116, 116, 101, 114]\",\n },\n {\n name: \"maxMessagePayloadSize\",\n type: {\n defined: {\n name: \"usize\",\n },\n },\n value: \"30 * 1_024\",\n },\n ],\n};\n","/**\n * Program IDL in camelCase format in order to be used in JS/TS.\n *\n * Note that this is only a type helper and is not the actual IDL. The original\n * IDL can be found at `target/idl/pyth_solana_receiver.json`.\n */\nexport type PythSolanaReceiver = {\n address: \"rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ\";\n metadata: {\n name: \"pyth_solana_receiver\";\n version: \"0.2.0\";\n spec: \"0.1.0\";\n };\n instructions: [\n {\n name: \"initialize\";\n discriminator: [175, 175, 109, 31, 13, 152, 155, 237];\n accounts: [\n {\n name: \"payer\";\n writable: true;\n signer: true;\n },\n {\n name: \"config\";\n writable: true;\n },\n {\n name: \"systemProgram\";\n },\n ];\n args: [\n {\n name: \"initialConfig\";\n type: {\n defined: {\n name: \"config\";\n };\n };\n },\n ];\n },\n {\n name: \"requestGovernanceAuthorityTransfer\";\n discriminator: [92, 18, 67, 156, 27, 151, 183, 224];\n accounts: [\n {\n name: \"payer\";\n signer: true;\n },\n {\n name: \"config\";\n writable: true;\n },\n ];\n args: [\n {\n name: \"targetGovernanceAuthority\";\n type: \"pubkey\";\n },\n ];\n },\n {\n name: \"acceptGovernanceAuthorityTransfer\";\n discriminator: [254, 39, 222, 79, 64, 217, 205, 127];\n accounts: [\n {\n name: \"payer\";\n signer: true;\n },\n {\n name: \"config\";\n writable: true;\n },\n ];\n args: [];\n },\n {\n name: \"setDataSources\";\n discriminator: [107, 73, 15, 119, 195, 116, 91, 210];\n accounts: [\n {\n name: \"payer\";\n signer: true;\n },\n {\n name: \"config\";\n writable: true;\n },\n ];\n args: [\n {\n name: \"validDataSources\";\n type: {\n vec: {\n defined: {\n name: \"dataSource\";\n };\n };\n };\n },\n ];\n },\n {\n name: \"setFee\";\n discriminator: [18, 154, 24, 18, 237, 214, 19, 80];\n accounts: [\n {\n name: \"payer\";\n signer: true;\n },\n {\n name: \"config\";\n writable: true;\n },\n ];\n args: [\n {\n name: \"singleUpdateFeeInLamports\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"setWormholeAddress\";\n discriminator: [154, 174, 252, 157, 91, 215, 179, 156];\n accounts: [\n {\n name: \"payer\";\n signer: true;\n },\n {\n name: \"config\";\n writable: true;\n },\n ];\n args: [\n {\n name: \"wormhole\";\n type: \"pubkey\";\n },\n ];\n },\n {\n name: \"setMinimumSignatures\";\n discriminator: [5, 210, 206, 124, 43, 68, 104, 149];\n accounts: [\n {\n name: \"payer\";\n signer: true;\n },\n {\n name: \"config\";\n writable: true;\n },\n ];\n args: [\n {\n name: \"minimumSignatures\";\n type: \"u8\";\n },\n ];\n },\n {\n name: \"postUpdateAtomic\";\n docs: [\n \"Post a price update using a VAA and a MerklePriceUpdate.\",\n \"This function allows you to post a price update in a single transaction.\",\n \"Compared to post_update, it is less secure since you won't be able to verify all guardian signatures if you use this function because of transaction size limitations.\",\n \"Typically, you can fit 5 guardian signatures in a transaction that uses this.\",\n ];\n discriminator: [49, 172, 84, 192, 175, 180, 52, 234];\n accounts: [\n {\n name: \"payer\";\n writable: true;\n signer: true;\n },\n {\n name: \"guardianSet\";\n docs: [\"Instead we do the same steps in deserialize_guardian_set_checked.\"];\n },\n {\n name: \"config\";\n },\n {\n name: \"treasury\";\n writable: true;\n },\n {\n name: \"priceUpdateAccount\";\n docs: [\n \"The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.\",\n \"Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized\",\n ];\n writable: true;\n signer: true;\n },\n {\n name: \"systemProgram\";\n },\n {\n name: \"writeAuthority\";\n signer: true;\n },\n ];\n args: [\n {\n name: \"params\";\n type: {\n defined: {\n name: \"postUpdateAtomicParams\";\n };\n };\n },\n ];\n },\n {\n name: \"postUpdate\";\n docs: [\n \"Post a price update using an encoded_vaa account and a MerklePriceUpdate calldata.\",\n \"This should be called after the client has already verified the Vaa via the Wormhole contract.\",\n \"Check out target_chains/solana/cli/src/main.rs for an example of how to do this.\",\n ];\n discriminator: [133, 95, 207, 175, 11, 79, 118, 44];\n accounts: [\n {\n name: \"payer\";\n writable: true;\n signer: true;\n },\n {\n name: \"encodedVaa\";\n },\n {\n name: \"config\";\n },\n {\n name: \"treasury\";\n writable: true;\n },\n {\n name: \"priceUpdateAccount\";\n docs: [\n \"The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.\",\n \"Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized\",\n ];\n writable: true;\n signer: true;\n },\n {\n name: \"systemProgram\";\n },\n {\n name: \"writeAuthority\";\n signer: true;\n },\n ];\n args: [\n {\n name: \"params\";\n type: {\n defined: {\n name: \"postUpdateParams\";\n };\n };\n },\n ];\n },\n {\n name: \"postTwapUpdate\";\n docs: [\n \"Post a TWAP (time weighted average price) update for a given time window.\",\n \"This should be called after the client has already verified the VAAs via the Wormhole contract.\",\n \"Check out target_chains/solana/cli/src/main.rs for an example of how to do this.\",\n ];\n discriminator: [232, 176, 212, 105, 69, 121, 18, 30];\n accounts: [\n {\n name: \"payer\";\n writable: true;\n signer: true;\n },\n {\n name: \"startEncodedVaa\";\n },\n {\n name: \"endEncodedVaa\";\n },\n {\n name: \"config\";\n },\n {\n name: \"treasury\";\n writable: true;\n },\n {\n name: \"twapUpdateAccount\";\n docs: [\n \"The contraint is such that either the twap_update_account is uninitialized or the write_authority is the write_authority.\",\n \"Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that twap_update_account.write_authority == Pubkey::default() once the account is initialized\",\n ];\n writable: true;\n signer: true;\n },\n {\n name: \"systemProgram\";\n },\n {\n name: \"writeAuthority\";\n signer: true;\n },\n ];\n args: [\n {\n name: \"params\";\n type: {\n defined: {\n name: \"postTwapUpdateParams\";\n };\n };\n },\n ];\n },\n {\n name: \"reclaimRent\";\n discriminator: [218, 200, 19, 197, 227, 89, 192, 22];\n accounts: [\n {\n name: \"payer\";\n writable: true;\n signer: true;\n },\n {\n name: \"priceUpdateAccount\";\n writable: true;\n },\n ];\n args: [];\n },\n {\n name: \"reclaimTwapRent\";\n discriminator: [84, 3, 32, 238, 108, 217, 135, 39];\n accounts: [\n {\n name: \"payer\";\n writable: true;\n signer: true;\n },\n {\n name: \"twapUpdateAccount\";\n writable: true;\n },\n ];\n args: [];\n },\n ];\n accounts: [\n {\n name: \"config\";\n discriminator: [155, 12, 170, 224, 30, 250, 204, 130];\n },\n {\n name: \"priceUpdateV2\";\n discriminator: [70, 9, 59, 15, 151, 95, 3, 234];\n },\n {\n name: \"twapUpdate\";\n discriminator: [138, 162, 109, 54, 148, 149, 159, 138];\n },\n ];\n errors: [\n {\n code: 6000;\n name: \"invalidWormholeMessage\";\n msg: \"Received an invalid wormhole message\";\n },\n {\n code: 6001;\n name: \"deserializeMessageFailed\";\n msg: \"An error occurred when deserializing the message\";\n },\n {\n code: 6002;\n name: \"invalidPriceUpdate\";\n msg: \"Received an invalid price update\";\n },\n {\n code: 6003;\n name: \"unsupportedMessageType\";\n msg: \"This type of message is not supported currently\";\n },\n {\n code: 6004;\n name: \"invalidDataSource\";\n msg: \"The tuple emitter chain, emitter doesn't match one of the valid data sources.\";\n },\n {\n code: 6005;\n name: \"insufficientFunds\";\n msg: \"Funds are insufficient to pay the receiving fee\";\n },\n {\n code: 6006;\n name: \"wrongWriteAuthority\";\n msg: \"This signer can't write to price update account\";\n },\n {\n code: 6007;\n name: \"wrongVaaOwner\";\n msg: \"The posted VAA account has the wrong owner.\";\n },\n {\n code: 6008;\n name: \"deserializeVaaFailed\";\n msg: \"An error occurred when deserializing the VAA.\";\n },\n {\n code: 6009;\n name: \"insufficientGuardianSignatures\";\n msg: \"The number of guardian signatures is below the minimum\";\n },\n {\n code: 6010;\n name: \"invalidVaaVersion\";\n msg: \"Invalid VAA version\";\n },\n {\n code: 6011;\n name: \"guardianSetMismatch\";\n msg: \"Guardian set version in the VAA doesn't match the guardian set passed\";\n },\n {\n code: 6012;\n name: \"invalidGuardianOrder\";\n msg: \"Guardian signature indices must be increasing\";\n },\n {\n code: 6013;\n name: \"invalidGuardianIndex\";\n msg: \"Guardian index exceeds the number of guardians in the set\";\n },\n {\n code: 6014;\n name: \"invalidSignature\";\n msg: \"A VAA signature is invalid\";\n },\n {\n code: 6015;\n name: \"invalidGuardianKeyRecovery\";\n msg: \"The recovered guardian public key doesn't match the guardian set\";\n },\n {\n code: 6016;\n name: \"wrongGuardianSetOwner\";\n msg: \"The guardian set account is owned by the wrong program\";\n },\n {\n code: 6017;\n name: \"invalidGuardianSetPda\";\n msg: \"The Guardian Set account doesn't match the PDA derivation\";\n },\n {\n code: 6018;\n name: \"guardianSetExpired\";\n msg: \"The Guardian Set is expired\";\n },\n {\n code: 6019;\n name: \"governanceAuthorityMismatch\";\n msg: \"The signer is not authorized to perform this governance action\";\n },\n {\n code: 6020;\n name: \"targetGovernanceAuthorityMismatch\";\n msg: \"The signer is not authorized to accept the governance authority\";\n },\n {\n code: 6021;\n name: \"nonexistentGovernanceAuthorityTransferRequest\";\n msg: \"The governance authority needs to request a transfer first\";\n },\n ];\n types: [\n {\n name: \"priceFeedMessage\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"feedId\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"price\";\n type: \"i64\";\n },\n {\n name: \"conf\";\n type: \"u64\";\n },\n {\n name: \"exponent\";\n type: \"i32\";\n },\n {\n name: \"publishTime\";\n type: \"i64\";\n },\n {\n name: \"prevPublishTime\";\n type: \"i64\";\n },\n {\n name: \"emaPrice\";\n type: \"i64\";\n },\n {\n name: \"emaConf\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"twapPrice\";\n docs: [\n \"The time weighted average price & conf for a feed over the window [start_time, end_time].\",\n \"This type is used to persist the calculated TWAP in TwapUpdate accounts on Solana.\",\n ];\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"feedId\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"startTime\";\n type: \"i64\";\n },\n {\n name: \"endTime\";\n type: \"i64\";\n },\n {\n name: \"price\";\n type: \"i64\";\n },\n {\n name: \"conf\";\n type: \"u64\";\n },\n {\n name: \"exponent\";\n type: \"i32\";\n },\n {\n name: \"downSlotsRatio\";\n docs: [\n \"Ratio out of 1_000_000, where a value of 1_000_000 represents\",\n \"all slots were missed and 0 represents no slots were missed.\",\n ];\n type: \"u32\";\n },\n ];\n };\n },\n {\n name: \"merklePriceUpdate\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"message\";\n type: \"bytes\";\n },\n {\n name: \"proof\";\n type: {\n vec: {\n array: [\"u8\", 20];\n };\n };\n },\n ];\n };\n },\n {\n name: \"dataSource\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chain\";\n type: \"u16\";\n },\n {\n name: \"emitter\";\n type: \"pubkey\";\n },\n ];\n };\n },\n {\n name: \"postUpdateAtomicParams\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"vaa\";\n type: \"bytes\";\n },\n {\n name: \"merklePriceUpdate\";\n type: {\n defined: {\n name: \"merklePriceUpdate\";\n };\n };\n },\n {\n name: \"treasuryId\";\n type: \"u8\";\n },\n ];\n };\n },\n {\n name: \"postUpdateParams\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"merklePriceUpdate\";\n type: {\n defined: {\n name: \"merklePriceUpdate\";\n };\n };\n },\n {\n name: \"treasuryId\";\n type: \"u8\";\n },\n ];\n };\n },\n {\n name: \"postTwapUpdateParams\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"startMerklePriceUpdate\";\n type: {\n defined: {\n name: \"merklePriceUpdate\";\n };\n };\n },\n {\n name: \"endMerklePriceUpdate\";\n type: {\n defined: {\n name: \"merklePriceUpdate\";\n };\n };\n },\n {\n name: \"treasuryId\";\n type: \"u8\";\n },\n ];\n };\n },\n {\n name: \"verificationLevel\";\n docs: [\n \"* This enum represents how many guardian signatures were checked for a Pythnet price update\\n * If full, guardian quorum has been attained\\n * If partial, at least config.minimum signatures have been verified, but in the case config.minimum_signatures changes in the future we also include the number of signatures that were checked\",\n ];\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"partial\";\n fields: [\n {\n name: \"numSignatures\";\n type: \"u8\";\n },\n ];\n },\n {\n name: \"full\";\n },\n ];\n };\n },\n {\n name: \"config\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"governanceAuthority\";\n type: \"pubkey\";\n },\n {\n name: \"targetGovernanceAuthority\";\n type: {\n option: \"pubkey\";\n };\n },\n {\n name: \"wormhole\";\n type: \"pubkey\";\n },\n {\n name: \"validDataSources\";\n type: {\n vec: {\n defined: {\n name: \"dataSource\";\n };\n };\n };\n },\n {\n name: \"singleUpdateFeeInLamports\";\n type: \"u64\";\n },\n {\n name: \"minimumSignatures\";\n type: \"u8\";\n },\n ];\n };\n },\n {\n name: \"priceUpdateV2\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"writeAuthority\";\n type: \"pubkey\";\n },\n {\n name: \"verificationLevel\";\n type: {\n defined: {\n name: \"verificationLevel\";\n };\n };\n },\n {\n name: \"priceMessage\";\n type: {\n defined: {\n name: \"priceFeedMessage\";\n };\n };\n },\n {\n name: \"postedSlot\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"twapUpdate\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"writeAuthority\";\n type: \"pubkey\";\n },\n {\n name: \"twap\";\n type: {\n defined: {\n name: \"twapPrice\";\n };\n };\n },\n ];\n };\n },\n ];\n};\n\nexport const PYTH_SOLANA_RECEIVER_PROGRAM_IDL: PythSolanaReceiver = {\n address: \"rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ\",\n metadata: {\n name: \"pyth_solana_receiver\",\n version: \"0.2.0\",\n spec: \"0.1.0\",\n },\n instructions: [\n {\n name: \"initialize\",\n discriminator: [175, 175, 109, 31, 13, 152, 155, 237],\n accounts: [\n {\n name: \"payer\",\n writable: true,\n signer: true,\n },\n {\n name: \"config\",\n writable: true,\n },\n {\n name: \"systemProgram\",\n },\n ],\n args: [\n {\n name: \"initialConfig\",\n type: {\n defined: {\n name: \"config\",\n },\n },\n },\n ],\n },\n {\n name: \"requestGovernanceAuthorityTransfer\",\n discriminator: [92, 18, 67, 156, 27, 151, 183, 224],\n accounts: [\n {\n name: \"payer\",\n signer: true,\n },\n {\n name: \"config\",\n writable: true,\n },\n ],\n args: [\n {\n name: \"targetGovernanceAuthority\",\n type: \"pubkey\",\n },\n ],\n },\n {\n name: \"acceptGovernanceAuthorityTransfer\",\n discriminator: [254, 39, 222, 79, 64, 217, 205, 127],\n accounts: [\n {\n name: \"payer\",\n signer: true,\n },\n {\n name: \"config\",\n writable: true,\n },\n ],\n args: [],\n },\n {\n name: \"setDataSources\",\n discriminator: [107, 73, 15, 119, 195, 116, 91, 210],\n accounts: [\n {\n name: \"payer\",\n signer: true,\n },\n {\n name: \"config\",\n writable: true,\n },\n ],\n args: [\n {\n name: \"validDataSources\",\n type: {\n vec: {\n defined: {\n name: \"dataSource\",\n },\n },\n },\n },\n ],\n },\n {\n name: \"setFee\",\n discriminator: [18, 154, 24, 18, 237, 214, 19, 80],\n accounts: [\n {\n name: \"payer\",\n signer: true,\n },\n {\n name: \"config\",\n writable: true,\n },\n ],\n args: [\n {\n name: \"singleUpdateFeeInLamports\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"setWormholeAddress\",\n discriminator: [154, 174, 252, 157, 91, 215, 179, 156],\n accounts: [\n {\n name: \"payer\",\n signer: true,\n },\n {\n name: \"config\",\n writable: true,\n },\n ],\n args: [\n {\n name: \"wormhole\",\n type: \"pubkey\",\n },\n ],\n },\n {\n name: \"setMinimumSignatures\",\n discriminator: [5, 210, 206, 124, 43, 68, 104, 149],\n accounts: [\n {\n name: \"payer\",\n signer: true,\n },\n {\n name: \"config\",\n writable: true,\n },\n ],\n args: [\n {\n name: \"minimumSignatures\",\n type: \"u8\",\n },\n ],\n },\n {\n name: \"postUpdateAtomic\",\n docs: [\n \"Post a price update using a VAA and a MerklePriceUpdate.\",\n \"This function allows you to post a price update in a single transaction.\",\n \"Compared to post_update, it is less secure since you won't be able to verify all guardian signatures if you use this function because of transaction size limitations.\",\n \"Typically, you can fit 5 guardian signatures in a transaction that uses this.\",\n ],\n discriminator: [49, 172, 84, 192, 175, 180, 52, 234],\n accounts: [\n {\n name: \"payer\",\n writable: true,\n signer: true,\n },\n {\n name: \"guardianSet\",\n docs: [\"Instead we do the same steps in deserialize_guardian_set_checked.\"],\n },\n {\n name: \"config\",\n },\n {\n name: \"treasury\",\n writable: true,\n },\n {\n name: \"priceUpdateAccount\",\n docs: [\n \"The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.\",\n \"Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized\",\n ],\n writable: true,\n signer: true,\n },\n {\n name: \"systemProgram\",\n },\n {\n name: \"writeAuthority\",\n signer: true,\n },\n ],\n args: [\n {\n name: \"params\",\n type: {\n defined: {\n name: \"postUpdateAtomicParams\",\n },\n },\n },\n ],\n },\n {\n name: \"postUpdate\",\n docs: [\n \"Post a price update using an encoded_vaa account and a MerklePriceUpdate calldata.\",\n \"This should be called after the client has already verified the Vaa via the Wormhole contract.\",\n \"Check out target_chains/solana/cli/src/main.rs for an example of how to do this.\",\n ],\n discriminator: [133, 95, 207, 175, 11, 79, 118, 44],\n accounts: [\n {\n name: \"payer\",\n writable: true,\n signer: true,\n },\n {\n name: \"encodedVaa\",\n },\n {\n name: \"config\",\n },\n {\n name: \"treasury\",\n writable: true,\n },\n {\n name: \"priceUpdateAccount\",\n docs: [\n \"The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.\",\n \"Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized\",\n ],\n writable: true,\n signer: true,\n },\n {\n name: \"systemProgram\",\n },\n {\n name: \"writeAuthority\",\n signer: true,\n },\n ],\n args: [\n {\n name: \"params\",\n type: {\n defined: {\n name: \"postUpdateParams\",\n },\n },\n },\n ],\n },\n {\n name: \"postTwapUpdate\",\n docs: [\n \"Post a TWAP (time weighted average price) update for a given time window.\",\n \"This should be called after the client has already verified the VAAs via the Wormhole contract.\",\n \"Check out target_chains/solana/cli/src/main.rs for an example of how to do this.\",\n ],\n discriminator: [232, 176, 212, 105, 69, 121, 18, 30],\n accounts: [\n {\n name: \"payer\",\n writable: true,\n signer: true,\n },\n {\n name: \"startEncodedVaa\",\n },\n {\n name: \"endEncodedVaa\",\n },\n {\n name: \"config\",\n },\n {\n name: \"treasury\",\n writable: true,\n },\n {\n name: \"twapUpdateAccount\",\n docs: [\n \"The contraint is such that either the twap_update_account is uninitialized or the write_authority is the write_authority.\",\n \"Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that twap_update_account.write_authority == Pubkey::default() once the account is initialized\",\n ],\n writable: true,\n signer: true,\n },\n {\n name: \"systemProgram\",\n },\n {\n name: \"writeAuthority\",\n signer: true,\n },\n ],\n args: [\n {\n name: \"params\",\n type: {\n defined: {\n name: \"postTwapUpdateParams\",\n },\n },\n },\n ],\n },\n {\n name: \"reclaimRent\",\n discriminator: [218, 200, 19, 197, 227, 89, 192, 22],\n accounts: [\n {\n name: \"payer\",\n writable: true,\n signer: true,\n },\n {\n name: \"priceUpdateAccount\",\n writable: true,\n },\n ],\n args: [],\n },\n {\n name: \"reclaimTwapRent\",\n discriminator: [84, 3, 32, 238, 108, 217, 135, 39],\n accounts: [\n {\n name: \"payer\",\n writable: true,\n signer: true,\n },\n {\n name: \"twapUpdateAccount\",\n writable: true,\n },\n ],\n args: [],\n },\n ],\n accounts: [\n {\n name: \"config\",\n discriminator: [155, 12, 170, 224, 30, 250, 204, 130],\n },\n {\n name: \"priceUpdateV2\",\n discriminator: [70, 9, 59, 15, 151, 95, 3, 234],\n },\n {\n name: \"twapUpdate\",\n discriminator: [138, 162, 109, 54, 148, 149, 159, 138],\n },\n ],\n errors: [\n {\n code: 6000,\n name: \"invalidWormholeMessage\",\n msg: \"Received an invalid wormhole message\",\n },\n {\n code: 6001,\n name: \"deserializeMessageFailed\",\n msg: \"An error occurred when deserializing the message\",\n },\n {\n code: 6002,\n name: \"invalidPriceUpdate\",\n msg: \"Received an invalid price update\",\n },\n {\n code: 6003,\n name: \"unsupportedMessageType\",\n msg: \"This type of message is not supported currently\",\n },\n {\n code: 6004,\n name: \"invalidDataSource\",\n msg: \"The tuple emitter chain, emitter doesn't match one of the valid data sources.\",\n },\n {\n code: 6005,\n name: \"insufficientFunds\",\n msg: \"Funds are insufficient to pay the receiving fee\",\n },\n {\n code: 6006,\n name: \"wrongWriteAuthority\",\n msg: \"This signer can't write to price update account\",\n },\n {\n code: 6007,\n name: \"wrongVaaOwner\",\n msg: \"The posted VAA account has the wrong owner.\",\n },\n {\n code: 6008,\n name: \"deserializeVaaFailed\",\n msg: \"An error occurred when deserializing the VAA.\",\n },\n {\n code: 6009,\n name: \"insufficientGuardianSignatures\",\n msg: \"The number of guardian signatures is below the minimum\",\n },\n {\n code: 6010,\n name: \"invalidVaaVersion\",\n msg: \"Invalid VAA version\",\n },\n {\n code: 6011,\n name: \"guardianSetMismatch\",\n msg: \"Guardian set version in the VAA doesn't match the guardian set passed\",\n },\n {\n code: 6012,\n name: \"invalidGuardianOrder\",\n msg: \"Guardian signature indices must be increasing\",\n },\n {\n code: 6013,\n name: \"invalidGuardianIndex\",\n msg: \"Guardian index exceeds the number of guardians in the set\",\n },\n {\n code: 6014,\n name: \"invalidSignature\",\n msg: \"A VAA signature is invalid\",\n },\n {\n code: 6015,\n name: \"invalidGuardianKeyRecovery\",\n msg: \"The recovered guardian public key doesn't match the guardian set\",\n },\n {\n code: 6016,\n name: \"wrongGuardianSetOwner\",\n msg: \"The guardian set account is owned by the wrong program\",\n },\n {\n code: 6017,\n name: \"invalidGuardianSetPda\",\n msg: \"The Guardian Set account doesn't match the PDA derivation\",\n },\n {\n code: 6018,\n name: \"guardianSetExpired\",\n msg: \"The Guardian Set is expired\",\n },\n {\n code: 6019,\n name: \"governanceAuthorityMismatch\",\n msg: \"The signer is not authorized to perform this governance action\",\n },\n {\n code: 6020,\n name: \"targetGovernanceAuthorityMismatch\",\n msg: \"The signer is not authorized to accept the governance authority\",\n },\n {\n code: 6021,\n name: \"nonexistentGovernanceAuthorityTransferRequest\",\n msg: \"The governance authority needs to request a transfer first\",\n },\n ],\n types: [\n {\n name: \"priceFeedMessage\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"feedId\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"price\",\n type: \"i64\",\n },\n {\n name: \"conf\",\n type: \"u64\",\n },\n {\n name: \"exponent\",\n type: \"i32\",\n },\n {\n name: \"publishTime\",\n type: \"i64\",\n },\n {\n name: \"prevPublishTime\",\n type: \"i64\",\n },\n {\n name: \"emaPrice\",\n type: \"i64\",\n },\n {\n name: \"emaConf\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"twapPrice\",\n docs: [\n \"The time weighted average price & conf for a feed over the window [start_time, end_time].\",\n \"This type is used to persist the calculated TWAP in TwapUpdate accounts on Solana.\",\n ],\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"feedId\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"startTime\",\n type: \"i64\",\n },\n {\n name: \"endTime\",\n type: \"i64\",\n },\n {\n name: \"price\",\n type: \"i64\",\n },\n {\n name: \"conf\",\n type: \"u64\",\n },\n {\n name: \"exponent\",\n type: \"i32\",\n },\n {\n name: \"downSlotsRatio\",\n docs: [\n \"Ratio out of 1_000_000, where a value of 1_000_000 represents\",\n \"all slots were missed and 0 represents no slots were missed.\",\n ],\n type: \"u32\",\n },\n ],\n },\n },\n {\n name: \"merklePriceUpdate\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"message\",\n type: \"bytes\",\n },\n {\n name: \"proof\",\n type: {\n vec: {\n array: [\"u8\", 20],\n },\n },\n },\n ],\n },\n },\n {\n name: \"dataSource\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chain\",\n type: \"u16\",\n },\n {\n name: \"emitter\",\n type: \"pubkey\",\n },\n ],\n },\n },\n {\n name: \"postUpdateAtomicParams\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"vaa\",\n type: \"bytes\",\n },\n {\n name: \"merklePriceUpdate\",\n type: {\n defined: {\n name: \"merklePriceUpdate\",\n },\n },\n },\n {\n name: \"treasuryId\",\n type: \"u8\",\n },\n ],\n },\n },\n {\n name: \"postUpdateParams\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"merklePriceUpdate\",\n type: {\n defined: {\n name: \"merklePriceUpdate\",\n },\n },\n },\n {\n name: \"treasuryId\",\n type: \"u8\",\n },\n ],\n },\n },\n {\n name: \"postTwapUpdateParams\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"startMerklePriceUpdate\",\n type: {\n defined: {\n name: \"merklePriceUpdate\",\n },\n },\n },\n {\n name: \"endMerklePriceUpdate\",\n type: {\n defined: {\n name: \"merklePriceUpdate\",\n },\n },\n },\n {\n name: \"treasuryId\",\n type: \"u8\",\n },\n ],\n },\n },\n {\n name: \"verificationLevel\",\n docs: [\n \"* This enum represents how many guardian signatures were checked for a Pythnet price update\\n * If full, guardian quorum has been attained\\n * If partial, at least config.minimum signatures have been verified, but in the case config.minimum_signatures changes in the future we also include the number of signatures that were checked\",\n ],\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"partial\",\n fields: [\n {\n name: \"numSignatures\",\n type: \"u8\",\n },\n ],\n },\n {\n name: \"full\",\n },\n ],\n },\n },\n {\n name: \"config\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"governanceAuthority\",\n type: \"pubkey\",\n },\n {\n name: \"targetGovernanceAuthority\",\n type: {\n option: \"pubkey\",\n },\n },\n {\n name: \"wormhole\",\n type: \"pubkey\",\n },\n {\n name: \"validDataSources\",\n type: {\n vec: {\n defined: {\n name: \"dataSource\",\n },\n },\n },\n },\n {\n name: \"singleUpdateFeeInLamports\",\n type: \"u64\",\n },\n {\n name: \"minimumSignatures\",\n type: \"u8\",\n },\n ],\n },\n },\n {\n name: \"priceUpdateV2\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"writeAuthority\",\n type: \"pubkey\",\n },\n {\n name: \"verificationLevel\",\n type: {\n defined: {\n name: \"verificationLevel\",\n },\n },\n },\n {\n name: \"priceMessage\",\n type: {\n defined: {\n name: \"priceFeedMessage\",\n },\n },\n },\n {\n name: \"postedSlot\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"twapUpdate\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"writeAuthority\",\n type: \"pubkey\",\n },\n {\n name: \"twap\",\n type: {\n defined: {\n name: \"twapPrice\",\n },\n },\n },\n ],\n },\n },\n ],\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\nexport const DEFAULT_RECEIVER_PROGRAM_ID = new PublicKey(\"rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ\");\nexport const DEFAULT_WORMHOLE_PROGRAM_ID = new PublicKey(\"HDwcJBJXjL9FpJ7UBsYBtaDjsBUhuLCUYoz3zr8SWWaQ\");\nexport const DEFAULT_PUSH_ORACLE_PROGRAM_ID = new PublicKey(\"pythWSnswVUd12oZpeFP8e9CVaEqJg25g1Vtc2biRsT\");\n\nexport const ACCUMULATOR_MAGIC = \"504e4155\";\nexport const MAJOR_VERSION = 1;\nexport const MINOR_VERSION = 0;\nexport const KECCAK160_HASH_SIZE = 20;\nexport const PRICE_FEED_MESSAGE_VARIANT = 0;\nexport const TWAP_MESSAGE_VARIANT = 1;\n\n/**\n * A hard-coded budget for the compute units required for the `verifyEncodedVaa` instruction in the Wormhole program.\n */\nexport const VERIFY_ENCODED_VAA_COMPUTE_BUDGET = 350000;\n/**\n * A hard-coded budget for the compute units required for the `postUpdateAtomic` instruction in the Pyth Solana Receiver program.\n */\nexport const POST_UPDATE_ATOMIC_COMPUTE_BUDGET = 170000;\n/**\n * A hard-coded budget for the compute units required for the `postUpdate` instruction in the Pyth Solana Receiver program.\n */\nexport const POST_UPDATE_COMPUTE_BUDGET = 35000;\n/**\n * A hard-coded budget for the compute units required for the `postTwapUpdate` instruction in the Pyth Solana Receiver program.\n */\nexport const POST_TWAP_UPDATE_COMPUTE_BUDGET = 50_000;\n/**\n * A hard-coded budget for the compute units required for the `updatePriceFeed` instruction in the Pyth Push Oracle program.\n */\nexport const UPDATE_PRICE_FEED_COMPUTE_BUDGET = 55000;\n/**\n * A hard-coded budget for the compute units required for the `initEncodedVaa` instruction in the Wormhole program.\n */\nexport const INIT_ENCODED_VAA_COMPUTE_BUDGET = 3000;\n/**\n * A hard-coded budget for the compute units required for the `writeEncodedVaa` instruction in the Wormhole program.\n */\nexport const WRITE_ENCODED_VAA_COMPUTE_BUDGET = 3000;\n/**\n * A hard-coded budget for the compute units required for the `closeEncodedVaa` instruction in the Wormhole program.\n */\nexport const CLOSE_ENCODED_VAA_COMPUTE_BUDGET = 30000;\n\nexport const VAA_SPLIT_INDEX = 721;\n\nexport const VAA_START = 46;\n","import type { Program } from \"@coral-xyz/anchor\";\nimport { Keypair, PublicKey, type Signer, type TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport type { WormholeCoreBridgeSolana } from \"./idl\";\nimport {\n ACCUMULATOR_MAGIC,\n CLOSE_ENCODED_VAA_COMPUTE_BUDGET,\n INIT_ENCODED_VAA_COMPUTE_BUDGET,\n KECCAK160_HASH_SIZE,\n MAJOR_VERSION,\n MINOR_VERSION,\n PRICE_FEED_MESSAGE_VARIANT,\n VAA_SPLIT_INDEX,\n VAA_START,\n VERIFY_ENCODED_VAA_COMPUTE_BUDGET,\n WRITE_ENCODED_VAA_COMPUTE_BUDGET,\n} from \"./pyth.consts\";\n\nexport function getGuardianSetIndex(vaa: Buffer) {\n return vaa.readUInt32BE(1);\n}\n\nexport const DEFAULT_REDUCED_GUARDIAN_SET_SIZE = 5;\nexport const VAA_SIGNATURE_SIZE = 66;\nexport function trimSignatures(vaa: Buffer, n = DEFAULT_REDUCED_GUARDIAN_SET_SIZE): Buffer {\n const currentNumSignatures = vaa[5];\n if (n > currentNumSignatures) {\n throw new Error(\"Resulting VAA can't have more signatures than the original VAA\");\n }\n\n const trimmedVaa = Buffer.concat([\n vaa.subarray(0, 6 + n * VAA_SIGNATURE_SIZE),\n vaa.subarray(6 + currentNumSignatures * VAA_SIGNATURE_SIZE),\n ]);\n\n trimmedVaa[5] = n;\n return trimmedVaa;\n}\n\nexport function isAccumulatorUpdateData(updateBytes: Buffer): boolean {\n return (\n updateBytes.toString(\"hex\").slice(0, 8) === ACCUMULATOR_MAGIC &&\n updateBytes[4] === MAJOR_VERSION &&\n updateBytes[5] === MINOR_VERSION\n );\n}\n\nexport type AccumulatorUpdateData = {\n vaa: Buffer;\n updates: { message: Buffer; proof: number[][] }[];\n};\n\nexport function parseAccumulatorUpdateData(data: Buffer): AccumulatorUpdateData {\n if (!isAccumulatorUpdateData(data)) {\n throw new Error(\"Invalid accumulator message\");\n }\n\n let cursor = 6;\n const trailingPayloadSize = data.readUint8(cursor);\n cursor += 1 + trailingPayloadSize;\n\n // const proofType = data.readUint8(cursor);\n cursor += 1;\n\n const vaaSize = data.readUint16BE(cursor);\n cursor += 2;\n\n const vaa = data.subarray(cursor, cursor + vaaSize);\n cursor += vaaSize;\n\n const numUpdates = data.readUInt8(cursor);\n const updates: Array<{\n message: Buffer<ArrayBufferLike>;\n proof: Array<number>[];\n }> = [];\n cursor += 1;\n\n for (let i = 0; i < numUpdates; i++) {\n const messageSize = data.readUint16BE(cursor);\n cursor += 2;\n const message = data.subarray(cursor, cursor + messageSize);\n cursor += messageSize;\n\n const numProofs = data.readUInt8(cursor);\n cursor += 1;\n const proof: Array<number[]> = [];\n for (let j = 0; j < numProofs; j++) {\n proof.push(Array.from(data.subarray(cursor, cursor + KECCAK160_HASH_SIZE)));\n cursor += KECCAK160_HASH_SIZE;\n }\n\n updates.push({ message, proof });\n }\n\n if (cursor !== data.length) {\n throw new Error(\"Didn't reach the end of the message\");\n }\n\n return { vaa, updates };\n}\n\n/**\n * An instruction with some extra information that will be used to build transactions.\n */\nexport type InstructionWithEphemeralSigners = {\n /** The instruction */\n instruction: TransactionInstruction;\n /** The ephemeral signers that need to sign the transaction where this instruction will be */\n signers: Signer[];\n /** The compute units that this instruction requires, useful if greater than `DEFAULT_COMPUTE_BUDGET_UNITS` */\n computeUnits?: number;\n};\ninterface VaaInstructionGroups {\n initInstructions: InstructionWithEphemeralSigners[];\n writeFirstPartInstructions: InstructionWithEphemeralSigners[];\n writeSecondPartAndVerifyInstructions: InstructionWithEphemeralSigners[];\n closeInstructions: InstructionWithEphemeralSigners[];\n encodedVaaAddress: PublicKey;\n}\n\nexport async function buildPostEncodedVaaInstructions(\n wormhole: Program<WormholeCoreBridgeSolana>,\n vaa: Buffer,\n): Promise<{\n encodedVaaAddress: PublicKey;\n postInstructions: InstructionWithEphemeralSigners[];\n closeInstructions: InstructionWithEphemeralSigners[];\n}> {\n const groups = await generateVaaInstructionGroups(wormhole, vaa);\n\n // Pack instructions for optimal 2-transaction pattern:\n // TX1: init + first write\n // TX2: second write + verify\n return {\n encodedVaaAddress: groups.encodedVaaAddress,\n postInstructions: [\n ...groups.initInstructions,\n ...groups.writeFirstPartInstructions,\n ...groups.writeSecondPartAndVerifyInstructions,\n ],\n closeInstructions: groups.closeInstructions,\n };\n}\n\nasync function generateVaaInstructionGroups(\n wormhole: Program<WormholeCoreBridgeSolana>,\n vaa: Buffer,\n): Promise<VaaInstructionGroups> {\n const encodedVaaKeypair = new Keypair();\n\n // Create and init instructions\n const initInstructions: InstructionWithEphemeralSigners[] = [\n await buildEncodedVaaCreateInstruction(wormhole, vaa, encodedVaaKeypair),\n {\n instruction: await wormhole.methods\n .initEncodedVaa()\n .accounts({\n encodedVaa: encodedVaaKeypair.publicKey,\n })\n .instruction(),\n signers: [],\n computeUnits: INIT_ENCODED_VAA_COMPUTE_BUDGET,\n },\n ];\n\n // First write instruction\n const writeFirstPartInstructions: InstructionWithEphemeralSigners[] = [\n {\n instruction: await wormhole.methods\n .writeEncodedVaa({\n index: 0,\n data: vaa.subarray(0, VAA_SPLIT_INDEX),\n })\n .accounts({\n draftVaa: encodedVaaKeypair.publicKey,\n })\n .instruction(),\n signers: [],\n computeUnits: WRITE_ENCODED_VAA_COMPUTE_BUDGET,\n },\n ];\n\n // Second write and verify instructions\n const writeSecondPartAndVerifyInstructions: InstructionWithEphemeralSigners[] = [\n {\n instruction: await wormhole.methods\n .writeEncodedVaa({\n index: VAA_SPLIT_INDEX,\n data: vaa.subarray(VAA_SPLIT_INDEX),\n })\n .accounts({\n draftVaa: encodedVaaKeypair.publicKey,\n })\n .instruction(),\n signers: [],\n computeUnits: WRITE_ENCODED_VAA_COMPUTE_BUDGET,\n },\n {\n instruction: await wormhole.methods\n .verifyEncodedVaaV1()\n .accounts({\n guardianSet: getGuardianSetPda(getGuardianSetIndex(vaa), wormhole.programId),\n draftVaa: encodedVaaKeypair.publicKey,\n })\n .instruction(),\n signers: [],\n computeUnits: VERIFY_ENCODED_VAA_COMPUTE_BUDGET,\n },\n ];\n\n // Close instructions\n const closeInstructions: InstructionWithEphemeralSigners[] = [\n {\n instruction: await wormhole.methods\n .closeEncodedVaa()\n .accounts({ encodedVaa: encodedVaaKeypair.publicKey })\n .instruction(),\n signers: [],\n computeUnits: CLOSE_ENCODED_VAA_COMPUTE_BUDGET,\n },\n ];\n\n return {\n initInstructions,\n writeFirstPartInstructions,\n writeSecondPartAndVerifyInstructions,\n closeInstructions,\n encodedVaaAddress: encodedVaaKeypair.publicKey,\n };\n}\n\n/**\n * Build an instruction to create an encoded VAA account.\n *\n * This is the first step to post a VAA to the Wormhole program.\n */\nexport async function buildEncodedVaaCreateInstruction(\n wormhole: Program<WormholeCoreBridgeSolana>,\n vaa: Buffer,\n encodedVaaKeypair: Keypair,\n): Promise<InstructionWithEphemeralSigners> {\n const encodedVaaSize = vaa.length + VAA_START;\n return {\n instruction: await wormhole.account.encodedVaa.createInstruction(encodedVaaKeypair, encodedVaaSize),\n signers: [encodedVaaKeypair],\n };\n}\n\n/**\n * Returns the address of a guardian set account from the Wormhole program.\n */\nexport const getGuardianSetPda = (guardianSetIndex: number, wormholeProgramId: PublicKey) => {\n const guardianSetIndexBuf = Buffer.alloc(4);\n guardianSetIndexBuf.writeUInt32BE(guardianSetIndex, 0);\n return PublicKey.findProgramAddressSync([Buffer.from(\"GuardianSet\"), guardianSetIndexBuf], wormholeProgramId)[0];\n};\n\nexport type PriceFeedMessage = {\n feedId: Buffer;\n price: BN;\n confidence: BN;\n exponent: number;\n publishTime: BN;\n prevPublishTime: BN;\n emaPrice: BN;\n emaConf: BN;\n};\n\nexport function parsePriceFeedMessage(message: Buffer): PriceFeedMessage {\n let cursor = 0;\n const variant = message.readUInt8(cursor);\n if (variant !== PRICE_FEED_MESSAGE_VARIANT) {\n throw new Error(\"Not a price feed message\");\n }\n cursor += 1;\n const feedId = message.subarray(cursor, cursor + 32);\n cursor += 32;\n const price = new BN(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const confidence = new BN(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const exponent = message.readInt32BE(cursor);\n cursor += 4;\n const publishTime = new BN(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const prevPublishTime = new BN(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const emaPrice = new BN(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n const emaConf = new BN(message.subarray(cursor, cursor + 8), \"be\");\n cursor += 8;\n return {\n feedId,\n price,\n confidence,\n exponent,\n publishTime,\n prevPublishTime,\n emaPrice,\n emaConf,\n };\n}\n","import type BigNumber from \"bignumber.js\";\n\nexport interface PriceWithConfidence {\n price: BigNumber;\n confidence: BigNumber;\n lowestPrice: BigNumber;\n highestPrice: BigNumber;\n}\n\nexport interface OraclePrice {\n priceRealtime: PriceWithConfidence;\n priceWeighted: PriceWithConfidence;\n timestamp: BigNumber;\n pythShardId?: number;\n}\n\nexport enum PriceBias {\n Lowest = 0,\n None = 1,\n Highest = 2,\n}\n\nexport interface PriceWithConfidenceDto {\n price: string;\n confidence: string;\n lowestPrice: string;\n highestPrice: string;\n}\n\nexport interface OraclePriceDto {\n priceRealtime: PriceWithConfidenceDto;\n priceWeighted: PriceWithConfidenceDto;\n timestamp: string;\n pythShardId?: number;\n}\n","import BigNumber from \"bignumber.js\";\nimport { NoopLogger } from \"@/logger\";\nimport type { TLogger } from \"@/types\";\nimport { MAX_CONFIDENCE_INTERVAL_RATIO, PYTH_PRICE_CONF_INTERVALS, SWB_PRICE_CONF_INTERVALS } from \"~/constants\";\nimport { OracleSetup } from \"~/services/bank\";\nimport { parsePriceData } from \"~/vendor/pyth_legacy\";\nimport { parsePriceInfo } from \"~/vendor/pyth_push_oracle\";\nimport { AggregatorAccount, AggregatorAccountData } from \"~/vendor/switchboard_legacy\";\nimport { decodeSwitchboardPullFeedData, SWITCHBOARD_ONDEMANDE_PRICE_PRECISION } from \"~/vendor/switchboard_pull\";\nimport { type OraclePrice, PriceBias, type PriceWithConfidence } from \"../types\";\n\nexport function getPriceWithConfidence(oraclePrice: OraclePrice, weighted: boolean): PriceWithConfidence {\n return weighted ? oraclePrice.priceWeighted : oraclePrice.priceRealtime;\n}\n\nexport function getPrice(\n oraclePrice: OraclePrice,\n priceBias: PriceBias = PriceBias.None,\n weightedPrice: boolean = false,\n): BigNumber {\n const price = getPriceWithConfidence(oraclePrice, weightedPrice);\n switch (priceBias) {\n case PriceBias.Lowest:\n return price.lowestPrice;\n case PriceBias.Highest:\n return price.highestPrice;\n case PriceBias.None:\n return price.price;\n }\n}\n\nfunction capConfidenceInterval(price: BigNumber, confidence: BigNumber, maxConfidence: BigNumber): BigNumber {\n const maxConfidenceInterval = price.times(maxConfidence);\n\n return BigNumber.min(confidence, maxConfidenceInterval);\n}\n\nexport type SupportedOracleSetup =\n | OracleSetup.PythLegacy\n | OracleSetup.PythPushOracle\n | OracleSetup.StakedWithPythPush\n | OracleSetup.SwitchboardV2\n | OracleSetup.SwitchboardPull\n | OracleSetup.KaminoPythPush\n | OracleSetup.KaminoSwitchboardPull\n | OracleSetup.Fixed;\n\nexport function isOracleSetupSupported(oracleSetup: OracleSetup): oracleSetup is SupportedOracleSetup {\n switch (oracleSetup) {\n case OracleSetup.PythLegacy:\n case OracleSetup.PythPushOracle:\n case OracleSetup.StakedWithPythPush:\n case OracleSetup.SwitchboardV2:\n case OracleSetup.SwitchboardPull:\n case OracleSetup.KaminoPythPush:\n case OracleSetup.KaminoSwitchboardPull:\n case OracleSetup.Fixed:\n return true;\n default:\n return false;\n }\n}\n\nfunction parseOraclePriceData(\n oracleSetup: SupportedOracleSetup,\n rawData: Buffer,\n fixedPrice?: BigNumber,\n logger: TLogger = new NoopLogger(),\n): OraclePrice {\n switch (oracleSetup) {\n case OracleSetup.PythLegacy: {\n const pythPriceData = parsePriceData(rawData);\n\n let priceData = pythPriceData.price;\n if (priceData === undefined) {\n priceData = pythPriceData.previousPrice;\n }\n\n let confidenceData = pythPriceData.confidence;\n if (confidenceData === undefined) {\n confidenceData = pythPriceData.previousConfidence;\n }\n\n if (priceData === undefined || confidenceData === undefined) {\n throw new Error(\"Price data or confidence data is undefined\");\n }\n\n const pythPriceRealtime = new BigNumber(priceData);\n const pythConfidenceRealtime = new BigNumber(confidenceData).times(PYTH_PRICE_CONF_INTERVALS);\n const pythConfidenceRealtimeCapped = capConfidenceInterval(\n pythPriceRealtime,\n pythConfidenceRealtime,\n PYTH_PRICE_CONF_INTERVALS,\n );\n const pythLowestPriceRealtime = pythPriceRealtime.minus(pythConfidenceRealtimeCapped);\n const pythHighestPriceRealtime = pythPriceRealtime.plus(pythConfidenceRealtimeCapped);\n\n const pythPriceWeighted = new BigNumber(pythPriceData.emaPrice.value);\n const pythConfIntervalWeighted = new BigNumber(pythPriceData.emaConfidence.value).times(\n PYTH_PRICE_CONF_INTERVALS,\n );\n const pythConfIntervalWeightedCapped = capConfidenceInterval(\n pythPriceWeighted,\n pythConfIntervalWeighted,\n PYTH_PRICE_CONF_INTERVALS,\n );\n const pythLowestPrice = pythPriceWeighted.minus(pythConfIntervalWeightedCapped);\n const pythHighestPrice = pythPriceWeighted.plus(pythConfIntervalWeightedCapped);\n\n logger.debug(\n {\n pythPriceRealtime: pythPriceRealtime.toString(),\n pythConfidenceRealtimeCapped: pythConfidenceRealtimeCapped.toString(),\n pythPriceWeighted: pythPriceWeighted.toString(),\n pythConfIntervalWeightedCapped: pythConfIntervalWeightedCapped.toString(),\n },\n \"[lendr:oracle-loader] loaded pyth price\",\n );\n\n return {\n priceRealtime: {\n price: pythPriceRealtime,\n confidence: pythConfidenceRealtimeCapped,\n lowestPrice: pythLowestPriceRealtime,\n highestPrice: pythHighestPriceRealtime,\n },\n priceWeighted: {\n price: pythPriceWeighted,\n confidence: pythConfIntervalWeightedCapped,\n lowestPrice: pythLowestPrice,\n highestPrice: pythHighestPrice,\n },\n timestamp: new BigNumber(Number(pythPriceData.timestamp)),\n };\n }\n case OracleSetup.PythPushOracle:\n case OracleSetup.StakedWithPythPush:\n case OracleSetup.KaminoPythPush: {\n const bytesWithoutDiscriminator = rawData.slice(8);\n const data = parsePriceInfo(bytesWithoutDiscriminator);\n\n const exponent = new BigNumber(10 ** data.priceMessage.exponent);\n\n const priceRealTime = new BigNumber(Number(data.priceMessage.price)).times(exponent);\n const confidenceRealTime = new BigNumber(Number(data.priceMessage.conf))\n .times(exponent)\n .times(PYTH_PRICE_CONF_INTERVALS);\n const cappedConfidenceRealTime = capConfidenceInterval(\n priceRealTime,\n confidenceRealTime,\n MAX_CONFIDENCE_INTERVAL_RATIO,\n );\n const lowestPriceRealTime = priceRealTime.minus(cappedConfidenceRealTime);\n const highestPriceRealTime = priceRealTime.plus(cappedConfidenceRealTime);\n\n const priceTimeWeighted = new BigNumber(Number(data.priceMessage.emaPrice)).times(exponent);\n const confidenceTimeWeighted = new BigNumber(Number(data.priceMessage.emaConf))\n .times(exponent)\n .times(PYTH_PRICE_CONF_INTERVALS);\n const cappedConfidenceWeighted = capConfidenceInterval(\n priceTimeWeighted,\n confidenceTimeWeighted,\n MAX_CONFIDENCE_INTERVAL_RATIO,\n );\n const lowestPriceWeighted = priceTimeWeighted.minus(cappedConfidenceWeighted);\n const highestPriceWeighted = priceTimeWeighted.plus(cappedConfidenceWeighted);\n\n return {\n priceRealtime: {\n price: priceRealTime,\n confidence: cappedConfidenceRealTime,\n lowestPrice: lowestPriceRealTime,\n highestPrice: highestPriceRealTime,\n },\n priceWeighted: {\n price: priceTimeWeighted,\n confidence: cappedConfidenceWeighted,\n lowestPrice: lowestPriceWeighted,\n highestPrice: highestPriceWeighted,\n },\n timestamp: new BigNumber(Number(data.priceMessage.publishTime)),\n };\n }\n\n case OracleSetup.SwitchboardV2: {\n const aggData = AggregatorAccountData.decode(rawData);\n\n const latestValue = AggregatorAccount.decodeLatestValue(aggData);\n if (!latestValue) {\n throw new Error(\"Switchboard latest value is undefined\");\n }\n const swbPrice = new BigNumber(latestValue.toString());\n const swbConfidence = new BigNumber(aggData.latestConfirmedRound.stdDeviation.toBig().toString()).times(\n SWB_PRICE_CONF_INTERVALS,\n );\n const swbConfidenceCapped = capConfidenceInterval(swbPrice, swbConfidence, MAX_CONFIDENCE_INTERVAL_RATIO);\n const swbLowestPrice = swbPrice.minus(swbConfidenceCapped);\n const swbHighestPrice = swbPrice.plus(swbConfidenceCapped);\n\n logger.debug(\n {\n swbPrice: swbPrice.toString(),\n swbConfidenceCapped: swbConfidenceCapped.toString(),\n },\n \"[lendr:oracle-loader] loaded swb legacy price\",\n );\n\n return {\n priceRealtime: {\n price: swbPrice,\n confidence: swbConfidenceCapped,\n lowestPrice: swbLowestPrice,\n highestPrice: swbHighestPrice,\n },\n priceWeighted: {\n price: swbPrice,\n confidence: swbConfidenceCapped,\n lowestPrice: swbLowestPrice,\n highestPrice: swbHighestPrice,\n },\n timestamp: new BigNumber(aggData.latestConfirmedRound.roundOpenTimestamp),\n };\n }\n case OracleSetup.SwitchboardPull:\n case OracleSetup.KaminoSwitchboardPull: {\n const pullFeedDAta = decodeSwitchboardPullFeedData(rawData);\n\n const swbPrice = new BigNumber(pullFeedDAta.result.value.toString()).div(\n 10 ** SWITCHBOARD_ONDEMANDE_PRICE_PRECISION,\n );\n const swbConfidence = new BigNumber(pullFeedDAta.result.std_dev.toString()).times(SWB_PRICE_CONF_INTERVALS);\n const swbConfidenceCapped = capConfidenceInterval(swbPrice, swbConfidence, MAX_CONFIDENCE_INTERVAL_RATIO);\n const swbLowestPrice = swbPrice.minus(swbConfidenceCapped);\n const swbHighestPrice = swbPrice.plus(swbConfidenceCapped);\n\n logger.debug(\n {\n swbPrice: swbPrice.toString(),\n swbConfidenceCapped: swbConfidenceCapped.toString(),\n },\n \"[lendr:oracle-loader] Loaded swb pull price\",\n );\n\n return {\n priceRealtime: {\n price: swbPrice,\n confidence: swbConfidenceCapped,\n lowestPrice: swbLowestPrice,\n highestPrice: swbHighestPrice,\n },\n priceWeighted: {\n price: swbPrice,\n confidence: swbConfidenceCapped,\n lowestPrice: swbLowestPrice,\n highestPrice: swbHighestPrice,\n },\n timestamp: new BigNumber(pullFeedDAta.last_update_timestamp.toString()),\n };\n }\n case OracleSetup.Fixed: {\n const price = fixedPrice ?? BigNumber(0);\n\n const fixedOraclePrice: OraclePrice = {\n priceRealtime: {\n price: price,\n confidence: BigNumber(0),\n lowestPrice: price,\n highestPrice: price,\n },\n priceWeighted: {\n price: price,\n confidence: BigNumber(0),\n lowestPrice: price,\n highestPrice: price,\n },\n timestamp: BigNumber(Date.now()),\n };\n return fixedOraclePrice;\n }\n default:\n console.error(\"Invalid oracle setup\", oracleSetup);\n throw new Error(`Invalid oracle setup \"${oracleSetup}\"`);\n }\n}\n\nexport { parseOraclePriceData as parsePriceInfo };\n","import BigNumber from \"bignumber.js\";\n\nimport type { OraclePrice, OraclePriceDto } from \"../types\";\n\nexport function dtoToOraclePrice(dto: OraclePriceDto): OraclePrice {\n return {\n priceRealtime: {\n price: new BigNumber(dto.priceRealtime.price),\n confidence: new BigNumber(dto.priceRealtime.confidence),\n lowestPrice: new BigNumber(dto.priceRealtime.lowestPrice),\n highestPrice: new BigNumber(dto.priceRealtime.highestPrice),\n },\n priceWeighted: {\n price: new BigNumber(dto.priceWeighted.price),\n confidence: new BigNumber(dto.priceWeighted.confidence),\n lowestPrice: new BigNumber(dto.priceWeighted.lowestPrice),\n highestPrice: new BigNumber(dto.priceWeighted.highestPrice),\n },\n timestamp: new BigNumber(dto.timestamp),\n pythShardId: dto.pythShardId,\n };\n}\n","import { type Connection, PublicKey } from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport type { BankRaw } from \"~/services/bank\";\nimport { buildFeedIdMap, type PythPushFeedIdMap } from \"~/utils\";\nimport type { BankMetadata } from \"../../../common\";\n\nimport type { OraclePrice, PriceWithConfidence } from \"../types\";\n\n/**\n * =============================================================================\n * PYTH ORACLE UTILS\n * =============================================================================\n *\n * Utility functions for fetching Pyth oracle data\n */\n\ntype PythFeedMapResponse = Record<\n string,\n {\n feedId: string;\n shardId?: number;\n }\n>;\n\n/**\n * Categorizes banks by their oracle setup type\n */\nconst categorizePythBanks = (banks: { address: PublicKey; data: BankRaw }[]) => {\n // Deprecated\n const pythLegacyBanks = banks.filter(\n (bank) => bank.data.config.oracleSetup && \"pythLegacy\" in bank.data.config.oracleSetup,\n );\n const pythPushBanks = banks.filter(\n (bank) => bank.data.config.oracleSetup && \"pythPushOracle\" in bank.data.config.oracleSetup,\n );\n const pythStakedCollateralBanks = banks.filter(\n (bank) => bank.data.config.oracleSetup && \"stakedWithPythPush\" in bank.data.config.oracleSetup,\n );\n\n return { pythLegacyBanks, pythPushBanks, pythStakedCollateralBanks };\n};\n\n/**\n * Fetches Pyth feed map and staked collateral data via API endpoints\n */\nconst fetchPythDataViaAPI = async (\n pythPushBanks: { address: PublicKey; data: BankRaw }[],\n voteAccMintTuples: [string, string][],\n): Promise<{ pythFeedMap: PythPushFeedIdMap; priceCoeffByBank: Record<string, number> }> => {\n const pythFeedMapPromise = fetch(\n \"/api/bankData/pythFeedMap?feedIds=\" +\n pythPushBanks.map((bank) => bank.data.config.oracleKeys[0].toBase58()).join(\",\"),\n );\n const encodedQuery = encodeURIComponent(JSON.stringify(voteAccMintTuples));\n const stakedCollatDataPromise = fetch(`/api/stakeData/stakedCollatData?voteAccMintTuple=${encodedQuery}`);\n\n const [pythFeedMapResponse, stakedCollatDataResponse] = await Promise.all([\n pythFeedMapPromise,\n stakedCollatDataPromise,\n ]);\n\n if (!pythFeedMapResponse.ok) {\n throw new Error(\"Failed to fetch pyth feed map\");\n }\n if (!stakedCollatDataResponse.ok) {\n throw new Error(\"Failed to fetch staked collateral data\");\n }\n\n const pythFeedMapJson: PythFeedMapResponse = await pythFeedMapResponse.json();\n const stakedCollatDataJson: Record<string, number> = await stakedCollatDataResponse.json();\n\n // Build pythFeedMap\n const pythFeedMap = new Map<string, { feedId: PublicKey; shardId?: number }>();\n Object.entries(pythFeedMapJson).forEach(([feedId, { feedId: feedIdStr, shardId }]) => {\n pythFeedMap.set(feedId, { feedId: new PublicKey(feedIdStr), shardId });\n });\n\n return { pythFeedMap, priceCoeffByBank: stakedCollatDataJson };\n};\n\n/**\n * Fetches Pyth feed map via direct connection (non-API)\n */\nconst fetchPythDataDirect = async (\n banks: { address: PublicKey; data: BankRaw }[],\n connection: Connection,\n): Promise<{ pythFeedMap: PythPushFeedIdMap; priceCoeffByBank: Record<string, number> }> => {\n const pythFeedMap = await buildFeedIdMap(\n banks.map((bank) => bank.data.config),\n connection,\n );\n const priceCoeffByBank = {};\n\n return { pythFeedMap, priceCoeffByBank };\n};\n\n/**\n * Converts vote account coefficients to bank address coefficients\n */\nconst convertVoteAccCoeffsToBankCoeffs = (\n pythStakedCollateralBanks: { address: PublicKey; data: BankRaw }[],\n bankMetadataMap: { [address: string]: BankMetadata },\n voteAccCoeffs: Record<string, number>,\n): Record<string, number> => {\n const priceCoeffByBank: Record<string, number> = {};\n\n pythStakedCollateralBanks.forEach((bank) => {\n const voteAccount = bankMetadataMap[bank.address.toBase58()]?.validatorVoteAccount;\n if (voteAccount && voteAccCoeffs[voteAccount] !== undefined) {\n priceCoeffByBank[bank.address.toBase58()] = voteAccCoeffs[voteAccount];\n }\n });\n\n return priceCoeffByBank;\n};\n\n/**\n * Extracts oracle keys for Pyth price fetching\n */\nexport const extractPythOracleKeys = (pythBanks: { address: PublicKey; data: BankRaw }[]): string[] => {\n const keys = pythBanks\n .map((bank) => bank.data.config.oracleKeys[0]?.toBase58())\n .filter((key): key is string => key !== undefined);\n\n return [...keys];\n};\n\n/**\n * Fetches oracle prices via API endpoint\n */\nconst fetchPythOraclePricesViaAPI = async (pythOracleKeys: string[]): Promise<Record<string, OraclePrice>> => {\n const response = await fetch(`/api/bankData/pythOracleData?pythOracleKeys=${pythOracleKeys.join(\",\")}`);\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch pyth oracle data\");\n }\n\n const responseBody: Record<string, any> = await response.json();\n return Object.fromEntries(\n Object.entries(responseBody).map(([key, oraclePrice]) => [\n key,\n {\n priceRealtime: {\n price: BigNumber(oraclePrice.priceRealtime.price),\n confidence: BigNumber(oraclePrice.priceRealtime.confidence),\n lowestPrice: BigNumber(oraclePrice.priceRealtime.lowestPrice),\n highestPrice: BigNumber(oraclePrice.priceRealtime.highestPrice),\n },\n priceWeighted: {\n price: BigNumber(oraclePrice.priceWeighted.price),\n confidence: BigNumber(oraclePrice.priceWeighted.confidence),\n lowestPrice: BigNumber(oraclePrice.priceWeighted.lowestPrice),\n highestPrice: BigNumber(oraclePrice.priceWeighted.highestPrice),\n },\n timestamp: oraclePrice.timestamp ? BigNumber(oraclePrice.timestamp) : null,\n pythShardId: oraclePrice.pythShardId,\n },\n ]),\n ) as Record<string, OraclePrice>;\n};\n\n/**\n * Maps banks to their corresponding oracle prices\n */\nconst mapPythBanksToOraclePrices = (\n pythLegacyBanks: { address: PublicKey; data: BankRaw }[],\n pythPushBanks: { address: PublicKey; data: BankRaw }[],\n pythStakedCollateralBanks: { address: PublicKey; data: BankRaw }[],\n pythFeedMap: PythPushFeedIdMap,\n oraclePrices: Record<string, OraclePrice>,\n priceCoeffByBank: Record<string, number>,\n): Map<string, OraclePrice> => {\n const bankOraclePriceMap = new Map<string, OraclePrice>();\n\n // Map legacy banks\n pythLegacyBanks.forEach((bank) => {\n const oracleKey = bank.data.config.oracleKeys[0].toBase58();\n const oraclePrice = oraclePrices[oracleKey];\n if (oraclePrice) {\n bankOraclePriceMap.set(bank.address.toBase58(), oraclePrice);\n }\n });\n\n // Map push oracle banks\n pythPushBanks.forEach((bank) => {\n const feed = pythFeedMap.get(bank.data.config.oracleKeys[0].toBuffer().toString(\"hex\"));\n if (feed) {\n const oraclePrice = oraclePrices[feed.feedId.toBase58()];\n if (oraclePrice) {\n bankOraclePriceMap.set(bank.address.toBase58(), oraclePrice);\n }\n }\n });\n\n // Map staked collateral banks with price coefficient adjustment\n pythStakedCollateralBanks.forEach((bank) => {\n const priceCoeff = priceCoeffByBank[bank.address.toBase58()];\n const oracleKey = bank.data.config.oracleKeys[0].toBase58();\n\n if (oracleKey && priceCoeff !== undefined) {\n const oraclePrice = oraclePrices[oracleKey];\n if (oraclePrice) {\n bankOraclePriceMap.set(bank.address.toBase58(), {\n timestamp: oraclePrice.timestamp,\n priceRealtime: adjustPriceComponent(oraclePrice.priceRealtime, priceCoeff),\n priceWeighted: adjustPriceComponent(oraclePrice.priceWeighted, priceCoeff),\n });\n }\n }\n });\n\n return bankOraclePriceMap;\n};\n\nexport const fetchPythOracleData = async (\n banks: { address: PublicKey; data: BankRaw }[],\n bankMetadataMap: {\n [address: string]: BankMetadata;\n },\n connection?: Connection,\n opts?: { useApiEndpoint?: boolean },\n): Promise<{\n pythFeedMap: PythPushFeedIdMap;\n bankOraclePriceMap: Map<string, OraclePrice>;\n}> => {\n // Step 1: Categorize banks by oracle type\n const { pythLegacyBanks, pythPushBanks, pythStakedCollateralBanks } = categorizePythBanks(banks);\n\n // Step 2: Prepare vote account mint tuples for staked collateral\n const voteAccMintTuples: [string, string][] = pythStakedCollateralBanks.map((bank) => [\n bankMetadataMap[bank.address.toBase58()]?.validatorVoteAccount ?? \"\",\n bank.data.mint?.toBase58() ?? \"\",\n ]);\n\n // Step 3: Fetch Pyth feed map and price coefficients\n let pythFeedMap: PythPushFeedIdMap;\n let priceCoeffByBank: Record<string, number>;\n\n if (opts?.useApiEndpoint || !connection) {\n const { pythFeedMap: feedMap, priceCoeffByBank: voteAccCoeffs } = await fetchPythDataViaAPI(\n pythPushBanks,\n voteAccMintTuples,\n );\n pythFeedMap = feedMap;\n priceCoeffByBank = convertVoteAccCoeffsToBankCoeffs(pythStakedCollateralBanks, bankMetadataMap, voteAccCoeffs);\n } else {\n const result = await fetchPythDataDirect(banks, connection);\n pythFeedMap = result.pythFeedMap;\n priceCoeffByBank = result.priceCoeffByBank;\n }\n\n // Step 4: Extract oracle keys for price fetching\n const pythOracleKeys = extractPythOracleKeys([...pythLegacyBanks, ...pythPushBanks]);\n\n // Step 5: Fetch oracle prices\n let oraclePrices: Record<string, OraclePrice>;\n if (opts?.useApiEndpoint) {\n oraclePrices = await fetchPythOraclePricesViaAPI(pythOracleKeys);\n } else {\n // Handle non-API endpoint case - placeholder for now\n oraclePrices = {};\n }\n\n // Step 6: Map banks to oracle prices\n const bankOraclePriceMap = mapPythBanksToOraclePrices(\n pythLegacyBanks,\n pythPushBanks,\n pythStakedCollateralBanks,\n pythFeedMap,\n oraclePrices,\n priceCoeffByBank,\n );\n\n return {\n pythFeedMap,\n bankOraclePriceMap,\n };\n};\n\nconst adjustPriceComponent = (priceComponent: PriceWithConfidence, priceCoeff: number) => ({\n price: priceComponent.price.multipliedBy(priceCoeff),\n confidence: priceComponent.confidence,\n lowestPrice: priceComponent.lowestPrice.multipliedBy(priceCoeff),\n highestPrice: priceComponent.highestPrice.multipliedBy(priceCoeff),\n});\n\n/**\n * =============================================================================\n * SWITCHBOARD ORACLE UTILS\n * =============================================================================\n *\n * Utility functions for fetching Switchboard oracle data\n */\n\nexport const fetchSwbOracleData = async (\n banks: { address: PublicKey; data: BankRaw }[],\n opts?: { useApiEndpoint?: boolean },\n): Promise<{\n bankOraclePriceMap: Map<string, OraclePrice>;\n}> => {\n // Step 1: Fetch Switchboard oracle map\n const switchboardBanks = banks.filter(\n (bank) =>\n bank.data.config.oracleSetup &&\n (\"switchboardPull\" in bank.data.config.oracleSetup || \"switchboardV2\" in bank.data.config.oracleSetup),\n );\n\n let oracleKeyMap: Record<string, { feedId: string }>;\n\n if (opts?.useApiEndpoint) {\n const { oracleKeyMap: swbOracleKeyMap } = await fetchSwbDataViaAPI(switchboardBanks);\n oracleKeyMap = swbOracleKeyMap;\n } else {\n oracleKeyMap = {};\n }\n\n // Step 4: Extract oracle keys for price fetching\n const swbFeedIds = Object.values(oracleKeyMap).map((oracleKey) => oracleKey.feedId);\n\n // Step 5: Fetch oracle prices\n let oraclePrices: Record<string, OraclePrice>;\n if (opts?.useApiEndpoint) {\n oraclePrices = await fetchSwbOraclePricesViaAPI(swbFeedIds);\n } else {\n // Handle non-API endpoint case - placeholder for now\n oraclePrices = {};\n }\n\n // Step 6: Map switchboardBanks to oracle prices\n const bankOraclePriceMap = mapSwbBanksToOraclePrices(switchboardBanks, oraclePrices, oracleKeyMap);\n\n return {\n bankOraclePriceMap,\n };\n};\n\n/**\n * Fetches Pyth feed map and staked collateral data via API endpoints\n */\nconst fetchSwbDataViaAPI = async (\n swbPullBanks: { address: PublicKey; data: BankRaw }[],\n): Promise<{ oracleKeyMap: Record<string, { feedId: string }> }> => {\n const swbOracleKeyMapResponse = await fetch(\n \"/api/bankData/swbOracleMap?oracleKeys=\" +\n swbPullBanks.map((bank) => bank.data.config.oracleKeys[0].toBase58()).join(\",\"),\n );\n\n if (!swbOracleKeyMapResponse.ok) {\n throw new Error(\"Failed to fetch swb oracle key map\");\n }\n\n const swbOracleKeyMapJson: Record<string, { feedId: string }> = await swbOracleKeyMapResponse.json();\n\n return { oracleKeyMap: swbOracleKeyMapJson };\n};\n\nconst fetchSwbOraclePricesViaAPI = async (swbFeedIds: string[]): Promise<Record<string, OraclePrice>> => {\n const response = await fetch(`/api/bankData/swbOracleData?feedIds=${swbFeedIds.join(\",\")}`);\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch swb oracle data\");\n }\n\n const responseBody: Record<string, any> = await response.json();\n return Object.fromEntries(\n Object.entries(responseBody).map(([key, oraclePrice]) => [\n key,\n {\n priceRealtime: {\n price: BigNumber(oraclePrice.priceRealtime.price),\n confidence: BigNumber(oraclePrice.priceRealtime.confidence),\n lowestPrice: BigNumber(oraclePrice.priceRealtime.lowestPrice),\n highestPrice: BigNumber(oraclePrice.priceRealtime.highestPrice),\n },\n priceWeighted: {\n price: BigNumber(oraclePrice.priceWeighted.price),\n confidence: BigNumber(oraclePrice.priceWeighted.confidence),\n lowestPrice: BigNumber(oraclePrice.priceWeighted.lowestPrice),\n highestPrice: BigNumber(oraclePrice.priceWeighted.highestPrice),\n },\n timestamp: oraclePrice.timestamp ? BigNumber(oraclePrice.timestamp) : null,\n },\n ]),\n ) as Record<string, OraclePrice>;\n};\n\n/**\n * Maps banks to their corresponding oracle prices\n */\nconst mapSwbBanksToOraclePrices = (\n banks: { address: PublicKey; data: BankRaw }[],\n oraclePrices: Record<string, OraclePrice>,\n oracleKeyMap: Record<string, { feedId: string }>,\n): Map<string, OraclePrice> => {\n const bankOraclePriceMap = new Map<string, OraclePrice>();\n\n // Map legacy banks\n banks.forEach((bank) => {\n const oracleKey = bank.data.config.oracleKeys[0].toBase58();\n const oracleFeed = oracleKeyMap[oracleKey];\n const oraclePrice = oracleFeed?.feedId ? oraclePrices[oracleFeed.feedId] : null;\n if (oraclePrice) {\n bankOraclePriceMap.set(bank.address.toBase58(), oraclePrice);\n }\n });\n\n return bankOraclePriceMap;\n};\n\n/**\n * =============================================================================\n * ORACLE UTILS\n * =============================================================================\n *\n * Utility functions for fetching all oracle data\n */\n\nexport const fetchOracleData = async (\n banks: { address: PublicKey; data: BankRaw }[],\n bankMetadataMap: {\n [address: string]: BankMetadata;\n },\n connection?: Connection,\n opts?: { useApiEndpoint?: boolean },\n): Promise<{\n bankOraclePriceMap: Map<string, OraclePrice>;\n pythFeedMap: PythPushFeedIdMap;\n}> => {\n const [pythData, swbData] = await Promise.all([\n fetchPythOracleData(banks, bankMetadataMap, connection, opts),\n fetchSwbOracleData(banks, opts),\n ]);\n\n const bankOraclePriceMap = new Map<string, OraclePrice>();\n\n // Map pyth data\n pythData.bankOraclePriceMap.forEach((oraclePrice, bankAddress) => {\n bankOraclePriceMap.set(bankAddress, oraclePrice);\n });\n\n // Map swb data\n swbData.bankOraclePriceMap.forEach((oraclePrice, bankAddress) => {\n bankOraclePriceMap.set(bankAddress, oraclePrice);\n });\n\n // check if any bank is missing an oracle price\n banks.forEach((bank) => {\n if (!bankOraclePriceMap.has(bank.address.toBase58())) {\n console.error(`Bank ${bank.address.toBase58()} is missing an oracle price`);\n\n bankOraclePriceMap.set(bank.address.toBase58(), {\n priceRealtime: {\n price: BigNumber(0),\n confidence: BigNumber(0),\n lowestPrice: BigNumber(0),\n highestPrice: BigNumber(0),\n },\n priceWeighted: {\n price: BigNumber(0),\n confidence: BigNumber(0),\n lowestPrice: BigNumber(0),\n highestPrice: BigNumber(0),\n },\n timestamp: BigNumber(0),\n });\n }\n });\n\n return {\n bankOraclePriceMap,\n pythFeedMap: pythData.pythFeedMap,\n };\n};\n","import type { OraclePrice, OraclePriceDto } from \"../types\";\n\nexport function oraclePriceToDto(oraclePrice: OraclePrice): OraclePriceDto {\n return {\n priceRealtime: {\n price: oraclePrice.priceRealtime.price.toString(),\n confidence: oraclePrice.priceRealtime.confidence.toString(),\n lowestPrice: oraclePrice.priceRealtime.lowestPrice.toString(),\n highestPrice: oraclePrice.priceRealtime.highestPrice.toString(),\n },\n priceWeighted: {\n price: oraclePrice.priceWeighted.price.toString(),\n confidence: oraclePrice.priceWeighted.confidence.toString(),\n lowestPrice: oraclePrice.priceWeighted.lowestPrice.toString(),\n highestPrice: oraclePrice.priceWeighted.highestPrice.toString(),\n },\n timestamp: oraclePrice.timestamp.toString(),\n pythShardId: oraclePrice.pythShardId,\n };\n}\n","import BigNumber from \"bignumber.js\";\nimport { isWeightedPrice, LendrRequirementType } from \"~/models/account\";\nimport { getPrice, type OraclePrice, PriceBias } from \"~/services/price\";\nimport { type Amount, toBigNumber } from \"../../../common\";\n\nimport type { BankConfigType, BankType } from \"../types\";\n\nexport function computeMaxLeverage(\n depositBank: BankType,\n borrowBank: BankType,\n opts?: { assetWeightInit?: BigNumber; liabilityWeightInit?: BigNumber },\n): { maxLeverage: number; ltv: number } {\n const assetWeightInit = opts?.assetWeightInit || depositBank.config.assetWeightInit;\n const liabilityWeightInit = opts?.liabilityWeightInit || borrowBank.config.liabilityWeightInit;\n\n const ltv = assetWeightInit.div(liabilityWeightInit).toNumber();\n const maxLeverage = 1 / (1 - ltv);\n\n return {\n maxLeverage,\n ltv,\n };\n}\n\nexport function computeLoopingParams(\n principal: Amount,\n targetLeverage: number,\n depositBank: BankType,\n borrowBank: BankType,\n depositOracleInfo: OraclePrice,\n borrowOracleInfo: OraclePrice,\n): { borrowAmount: BigNumber; totalDepositAmount: BigNumber } {\n const initialCollateral = toBigNumber(principal);\n const { maxLeverage } = computeMaxLeverage(depositBank, borrowBank);\n\n if (targetLeverage < 1) {\n throw Error(`Target leverage ${targetLeverage} needs to be greater than 1`);\n }\n\n if (targetLeverage > maxLeverage) {\n throw Error(`Target leverage ${targetLeverage} exceeds max leverage for banks ${maxLeverage}`);\n }\n\n const totalDepositAmount = initialCollateral.times(new BigNumber(targetLeverage));\n const additionalDepositAmount = totalDepositAmount.minus(initialCollateral);\n const borrowAmount = additionalDepositAmount\n .times(depositOracleInfo.priceWeighted.lowestPrice)\n .div(borrowOracleInfo.priceWeighted.highestPrice);\n\n return { borrowAmount, totalDepositAmount };\n}\n\n/** Small getters */\n\nexport function getTotalAssetQuantity(bank: BankType): BigNumber {\n return bank.totalAssetShares.times(bank.assetShareValue);\n}\n\nexport function getTotalLiabilityQuantity(bank: BankType): BigNumber {\n return bank.totalLiabilityShares.times(bank.liabilityShareValue);\n}\n\nexport function getAssetQuantity(bank: BankType, assetShares: BigNumber): BigNumber {\n return assetShares.times(bank.assetShareValue);\n}\n\nexport function getLiabilityQuantity(bank: BankType, liabilityShares: BigNumber): BigNumber {\n return liabilityShares.times(bank.liabilityShareValue);\n}\n\nexport function getAssetShares(bank: BankType, assetQuantity: BigNumber): BigNumber {\n return assetQuantity.times(bank.assetShareValue);\n}\n\nexport function getLiabilityShares(bank: BankType, liabilityQuantity: BigNumber): BigNumber {\n return liabilityQuantity.times(bank.liabilityShareValue);\n}\n\nexport function getAssetWeight(\n bank: BankType,\n lendrRequirementType: LendrRequirementType,\n oraclePrice: OraclePrice,\n opts?: {\n ignoreSoftLimits?: boolean;\n assetWeightInitOverride?: BigNumber;\n },\n): BigNumber {\n const assetWeightInit = opts?.assetWeightInitOverride ?? bank.config.assetWeightInit;\n\n switch (lendrRequirementType) {\n case LendrRequirementType.Initial: {\n const isSoftLimitDisabled = bank.config.totalAssetValueInitLimit.isZero();\n if (opts?.ignoreSoftLimits || isSoftLimitDisabled) return assetWeightInit;\n const totalBankCollateralValue = computeAssetUsdValue(\n bank,\n oraclePrice,\n bank.totalAssetShares,\n LendrRequirementType.Equity,\n PriceBias.Lowest,\n );\n if (totalBankCollateralValue.isGreaterThan(bank.config.totalAssetValueInitLimit)) {\n return bank.config.totalAssetValueInitLimit.div(totalBankCollateralValue).times(assetWeightInit);\n } else {\n return assetWeightInit;\n }\n }\n case LendrRequirementType.Maintenance:\n return bank.config.assetWeightMaint;\n case LendrRequirementType.Equity:\n return new BigNumber(1);\n default:\n throw new Error(\"Invalid lendr requirement type\");\n }\n}\n\nexport function getLiabilityWeight(config: BankConfigType, lendrRequirementType: LendrRequirementType): BigNumber {\n switch (lendrRequirementType) {\n case LendrRequirementType.Initial:\n return config.liabilityWeightInit;\n case LendrRequirementType.Maintenance:\n return config.liabilityWeightMaint;\n case LendrRequirementType.Equity:\n return new BigNumber(1);\n default:\n throw new Error(\"Invalid lendr requirement type\");\n }\n}\n\n/** Computes */\n\nexport function computeLiabilityUsdValue(\n bank: BankType,\n oraclePrice: OraclePrice,\n liabilityShares: BigNumber,\n lendrRequirementType: LendrRequirementType,\n priceBias: PriceBias,\n): BigNumber {\n const liabilityQuantity = getLiabilityQuantity(bank, liabilityShares);\n const liabilityWeight = getLiabilityWeight(bank.config, lendrRequirementType);\n const isWeighted = isWeightedPrice(lendrRequirementType);\n return computeUsdValue(bank, oraclePrice, liabilityQuantity, priceBias, isWeighted, liabilityWeight);\n}\n\nexport function computeAssetUsdValue(\n bank: BankType,\n oraclePrice: OraclePrice,\n assetShares: BigNumber,\n lendrRequirementType: LendrRequirementType,\n priceBias: PriceBias,\n): BigNumber {\n const assetQuantity = getAssetQuantity(bank, assetShares);\n const assetWeight = getAssetWeight(bank, lendrRequirementType, oraclePrice);\n const isWeighted = isWeightedPrice(lendrRequirementType);\n return computeUsdValue(bank, oraclePrice, assetQuantity, priceBias, isWeighted, assetWeight);\n}\n\nexport function computeUsdValue(\n bank: BankType,\n oraclePrice: OraclePrice,\n quantity: BigNumber,\n priceBias: PriceBias,\n weightedPrice: boolean,\n weight?: BigNumber,\n scaleToBase: boolean = true,\n): BigNumber {\n const price = getPrice(oraclePrice, priceBias, weightedPrice);\n return quantity\n .times(price)\n .times(weight ?? 1)\n .dividedBy(scaleToBase ? 10 ** bank.mintDecimals : 1);\n}\n\nexport function computeTvl(bank: BankType, oraclePrice: OraclePrice): BigNumber {\n return computeAssetUsdValue(\n bank,\n oraclePrice,\n bank.totalAssetShares,\n LendrRequirementType.Equity,\n PriceBias.None,\n ).minus(\n computeLiabilityUsdValue(bank, oraclePrice, bank.totalLiabilityShares, LendrRequirementType.Equity, PriceBias.None),\n );\n}\n\nexport function computeInterestRates(bank: BankType): {\n lendingRate: BigNumber;\n borrowingRate: BigNumber;\n} {\n const { insuranceFeeFixedApr, insuranceIrFee, protocolFixedFeeApr, protocolIrFee } = bank.config.interestRateConfig;\n\n const fixedFee = insuranceFeeFixedApr.plus(protocolFixedFeeApr);\n const rateFee = insuranceIrFee.plus(protocolIrFee);\n\n const baseInterestRate = computeBaseInterestRate(bank);\n const utilizationRate = computeUtilizationRate(bank);\n\n const lendingRate = baseInterestRate.times(utilizationRate);\n const borrowingRate = baseInterestRate.times(new BigNumber(1).plus(rateFee)).plus(fixedFee);\n\n return { lendingRate, borrowingRate };\n}\n\n/**\n * Maximum value for u32\n */\nconst U32_MAX = 0xffffffff;\n\n/**\n * Convert u32 encoded rate to APR percentage (0.0 to 10.0)\n * Rate is encoded as: rate / u32::MAX * 1000%\n * Example: 100% APR = 0.1 * u32::MAX\n */\nfunction rateFromU32(rate: number): BigNumber {\n const ratio = new BigNumber(rate).div(U32_MAX);\n return ratio.times(10);\n}\n\n/**\n * Convert u32 encoded utilization to percentage (0.0 to 1.0)\n * Util is encoded as: util / u32::MAX * 100%\n * Example: 50% = 0.5 * u32::MAX\n */\nfunction utilFromU32(util: number): BigNumber {\n return new BigNumber(util).div(U32_MAX);\n}\n\n/**\n * Linear interpolation between two points\n * Given points (startX, startY) and (endX, endY), find Y at targetX\n */\nfunction calculateRateBetweenPoints(\n startX: BigNumber,\n startY: BigNumber,\n endX: BigNumber,\n endY: BigNumber,\n targetX: BigNumber,\n): BigNumber {\n // Handle edge cases\n if (endX.lte(startX)) return startY;\n if (targetX.lt(startX)) return startY;\n if (targetX.gt(endX)) return endY;\n // Program enforces that points must be ascending (or equal)\n if (endY.lt(startY)) return startY;\n\n const deltaX = endX.minus(startX);\n if (deltaX.isZero()) return startY;\n\n // Calculate interpolation\n const offset = targetX.minus(startX);\n const proportion = offset.div(deltaX);\n const deltaY = endY.minus(startY);\n const scaledDelta = deltaY.times(proportion);\n\n return startY.plus(scaledDelta);\n}\n\n/**\n * Compute base interest rate using the legacy 3-point curve\n */\nfunction computeLegacyCurve(\n utilizationRate: BigNumber,\n optimalUtilizationRate: BigNumber,\n plateauInterestRate: BigNumber,\n maxInterestRate: BigNumber,\n): BigNumber {\n if (utilizationRate.lte(optimalUtilizationRate)) {\n return utilizationRate.times(plateauInterestRate).div(optimalUtilizationRate);\n } else {\n return utilizationRate\n .minus(optimalUtilizationRate)\n .div(new BigNumber(1).minus(optimalUtilizationRate))\n .times(maxInterestRate.minus(plateauInterestRate))\n .plus(plateauInterestRate);\n }\n}\n\n/**\n * Compute base interest rate using the 7-point multipoint curve\n * Locates utilization on a linear function with up to 7 points:\n * - Point 1: (0%, zeroUtilRate)\n * - Points 2-6: Custom points from the points array\n * - Point 7: (100%, hundredUtilRate)\n */\nfunction computeMultipointCurve(\n utilizationRate: BigNumber,\n zeroUtilRate: number,\n hundredUtilRate: number,\n points: Array<{ util: number; rate: number }>,\n): BigNumber {\n const zeroRate = rateFromU32(zeroUtilRate);\n const hundredRate = rateFromU32(hundredUtilRate);\n\n // clamp utilization rate to [0, 1] for safety\n const clampedUtilizationRate = BigNumber.max(0, BigNumber.min(1, utilizationRate));\n\n // Filter out padding (where util = 0) to match on-chain behavior\n // Program enforces: no gaps, ascending order, all padding at end\n const nonPaddingPoints = points.filter((point) => point.util !== 0);\n\n // start from point (0%, zeroRate)\n let prevUtil = new BigNumber(0);\n let prevRate = zeroRate;\n\n // Iterate through non-padding custom points\n for (const point of nonPaddingPoints) {\n const pointUtil = utilFromU32(point.util);\n const pointRate = rateFromU32(point.rate);\n\n // If current utilization is <= this point's utilization,\n // interpolate between previous point and this point\n if (clampedUtilizationRate.lte(pointUtil)) {\n return calculateRateBetweenPoints(prevUtil, prevRate, pointUtil, pointRate, clampedUtilizationRate);\n }\n\n // update previous point and continue\n prevUtil = pointUtil;\n prevRate = pointRate;\n }\n\n // interpolate between last point and (100%, hundredRate)\n return calculateRateBetweenPoints(prevUtil, prevRate, new BigNumber(1), hundredRate, clampedUtilizationRate);\n}\n\nexport function computeBaseInterestRate(bank: BankType): BigNumber {\n const interestRateConfig = bank.config.interestRateConfig;\n const utilizationRate = computeUtilizationRate(bank);\n const curveType = interestRateConfig.curveType;\n\n // Curve type 1 is multipoint curve\n if (curveType === 1) {\n return computeMultipointCurve(\n utilizationRate,\n interestRateConfig.zeroUtilRate,\n interestRateConfig.hundredUtilRate,\n interestRateConfig.points,\n );\n } else {\n // Legacy 3-point curve\n return computeLegacyCurve(\n utilizationRate,\n interestRateConfig.optimalUtilizationRate,\n interestRateConfig.plateauInterestRate,\n interestRateConfig.maxInterestRate,\n );\n }\n}\n\nexport function computeUtilizationRate(bank: BankType): BigNumber {\n const assets = getTotalAssetQuantity(bank);\n const liabilities = getTotalLiabilityQuantity(bank);\n if (assets.isZero()) return new BigNumber(0);\n return liabilities.div(assets);\n}\n\nconst SECONDS_PER_DAY = 24 * 60 * 60;\nconst SECONDS_PER_YEAR = SECONDS_PER_DAY * 365.25;\n\nexport function computeRemainingCapacity(bank: BankType): {\n depositCapacity: BigNumber;\n borrowCapacity: BigNumber;\n} {\n const totalDeposits = getTotalAssetQuantity(bank);\n const remainingCapacity = BigNumber.max(0, bank.config.depositLimit.minus(totalDeposits));\n\n const totalBorrows = getTotalLiabilityQuantity(bank);\n const remainingBorrowCapacity = BigNumber.max(0, bank.config.borrowLimit.minus(totalBorrows));\n\n const durationSinceLastAccrual = Date.now() / 1000 - bank.lastUpdate;\n\n const { lendingRate, borrowingRate } = computeInterestRates(bank);\n\n const outstandingLendingInterest = lendingRate\n .times(durationSinceLastAccrual)\n .dividedBy(SECONDS_PER_YEAR)\n .times(totalDeposits);\n const outstandingBorrowInterest = borrowingRate\n .times(durationSinceLastAccrual)\n .dividedBy(SECONDS_PER_YEAR)\n .times(totalBorrows);\n\n const depositCapacity = remainingCapacity.minus(outstandingLendingInterest.times(2));\n const borrowCapacity = remainingBorrowCapacity.minus(outstandingBorrowInterest.times(2));\n\n return {\n depositCapacity,\n borrowCapacity,\n };\n}\n","import type { Address } from \"@coral-xyz/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\n\nimport type { LendrProgram } from \"~/types\";\n\nimport type { BankRaw } from \"../types\";\n\nexport const fetchMultipleBanks = async (\n program: LendrProgram,\n opts?: { bankAddresses?: Address[]; groupAddress?: PublicKey },\n): Promise<{ address: PublicKey; data: BankRaw }[]> => {\n let bankDatas: { address: PublicKey; data: BankRaw }[] = [];\n\n if (opts?.bankAddresses && opts.bankAddresses.length > 0) {\n const addresses = opts.bankAddresses;\n const data = await program.account.bank.fetchMultiple(addresses);\n\n data.forEach((d, idx) => {\n if (d) {\n bankDatas.push({ address: new PublicKey(addresses[idx]), data: d });\n } else {\n console.error(`Bank ${addresses[idx]} not found`);\n }\n });\n } else {\n const bankOpts = opts?.groupAddress\n ? [{ memcmp: { offset: 8 + 32 + 1, bytes: opts.groupAddress.toBase58() } }]\n : [];\n const data = await program.account.bank.all(bankOpts);\n bankDatas = data.map((d) => ({ address: d.publicKey, data: d.account }));\n }\n\n return bankDatas;\n};\n","import type BigNumber from \"bignumber.js\";\nimport BN from \"bn.js\";\n\nimport { bigNumberToWrappedI80F48 } from \"../../../common\";\n\nimport {\n type BankConfigDto,\n type BankConfigOpt,\n type BankConfigOptRaw,\n type BankConfigRaw,\n type BankConfigRawDto,\n type BankConfigType,\n type BankRaw,\n type BankRawDto,\n type BankType,\n type BankTypeDto,\n type EmodeSettingsDto,\n type EmodeSettingsRaw,\n type EmodeSettingsRawDto,\n type EmodeSettingsType,\n type InterestRateConfig,\n type InterestRateConfigDto,\n type InterestRateConfigOptRaw,\n type InterestRateConfigRaw,\n OperationalState,\n OracleSetup,\n type OracleSetupRaw,\n RiskTier,\n type RiskTierRaw,\n} from \"../types\";\n\nfunction serializeBankConfigOpt(bankConfigOpt: BankConfigOpt): BankConfigOptRaw {\n const toWrappedI80F48 = (value: BigNumber | null) => value && bigNumberToWrappedI80F48(value);\n const toBN = (value: BigNumber | null) => value && new BN(value.toString());\n\n return {\n assetWeightInit: toWrappedI80F48(bankConfigOpt.assetWeightInit),\n assetWeightMaint: toWrappedI80F48(bankConfigOpt.assetWeightMaint),\n liabilityWeightInit: toWrappedI80F48(bankConfigOpt.liabilityWeightInit),\n liabilityWeightMaint: toWrappedI80F48(bankConfigOpt.liabilityWeightMaint),\n depositLimit: toBN(bankConfigOpt.depositLimit),\n borrowLimit: toBN(bankConfigOpt.borrowLimit),\n riskTier: bankConfigOpt.riskTier && serializeRiskTier(bankConfigOpt.riskTier),\n totalAssetValueInitLimit: toBN(bankConfigOpt.totalAssetValueInitLimit),\n assetTag: bankConfigOpt.assetTag !== null ? Number(bankConfigOpt.assetTag) : 0,\n interestRateConfig:\n bankConfigOpt.interestRateConfig &&\n ({\n insuranceFeeFixedApr: toWrappedI80F48(bankConfigOpt.interestRateConfig.insuranceFeeFixedApr),\n maxInterestRate: toWrappedI80F48(bankConfigOpt.interestRateConfig.maxInterestRate),\n insuranceIrFee: toWrappedI80F48(bankConfigOpt.interestRateConfig.insuranceIrFee),\n optimalUtilizationRate: toWrappedI80F48(bankConfigOpt.interestRateConfig.optimalUtilizationRate),\n plateauInterestRate: toWrappedI80F48(bankConfigOpt.interestRateConfig.plateauInterestRate),\n protocolFixedFeeApr: toWrappedI80F48(bankConfigOpt.interestRateConfig.protocolFixedFeeApr),\n protocolIrFee: toWrappedI80F48(bankConfigOpt.interestRateConfig.protocolIrFee),\n protocolOriginationFee: toWrappedI80F48(bankConfigOpt.interestRateConfig.protocolOriginationFee),\n zeroUtilRate: bankConfigOpt.interestRateConfig.zeroUtilRate,\n hundredUtilRate: bankConfigOpt.interestRateConfig.hundredUtilRate,\n points: bankConfigOpt.interestRateConfig.points,\n } as InterestRateConfigOptRaw),\n operationalState: bankConfigOpt.operationalState && serializeOperationalState(bankConfigOpt.operationalState),\n oracleMaxAge: bankConfigOpt.oracleMaxAge,\n permissionlessBadDebtSettlement: bankConfigOpt.permissionlessBadDebtSettlement,\n freezeSettings: null,\n tokenlessRepaymentsAllowed: bankConfigOpt.tokenlessRepaymentsAllowed,\n oracleMaxConfidence: bankConfigOpt.oracleMaxConfidence,\n };\n}\n\nfunction serializeInterestRateConfig(interestRateConfig: InterestRateConfig): InterestRateConfigRaw {\n return {\n optimalUtilizationRate: bigNumberToWrappedI80F48(interestRateConfig.optimalUtilizationRate),\n plateauInterestRate: bigNumberToWrappedI80F48(interestRateConfig.plateauInterestRate),\n maxInterestRate: bigNumberToWrappedI80F48(interestRateConfig.maxInterestRate),\n\n insuranceFeeFixedApr: bigNumberToWrappedI80F48(interestRateConfig.insuranceFeeFixedApr),\n insuranceIrFee: bigNumberToWrappedI80F48(interestRateConfig.insuranceIrFee),\n protocolFixedFeeApr: bigNumberToWrappedI80F48(interestRateConfig.protocolFixedFeeApr),\n protocolIrFee: bigNumberToWrappedI80F48(interestRateConfig.protocolIrFee),\n protocolOriginationFee: bigNumberToWrappedI80F48(interestRateConfig.protocolOriginationFee),\n zeroUtilRate: interestRateConfig.zeroUtilRate,\n hundredUtilRate: interestRateConfig.hundredUtilRate,\n points: interestRateConfig.points,\n curveType: interestRateConfig.curveType,\n };\n}\n\nfunction serializeRiskTier(riskTier: RiskTier): RiskTierRaw {\n switch (riskTier) {\n case RiskTier.Collateral:\n return { collateral: {} };\n case RiskTier.Isolated:\n return { isolated: {} };\n default:\n throw new Error(`Invalid risk tier \"${riskTier}\"`);\n }\n}\n\nfunction serializeOperationalState(\n operationalState: OperationalState,\n): { paused: {} } | { operational: {} } | { reduceOnly: {} } {\n switch (operationalState) {\n case OperationalState.Paused:\n return { paused: {} };\n case OperationalState.Operational:\n return { operational: {} };\n case OperationalState.ReduceOnly:\n return { reduceOnly: {} };\n default:\n throw new Error(`Invalid operational state \"${operationalState}\"`);\n }\n}\n\nfunction serializeOracleSetupToIndex(oracleSetup: OracleSetup): number {\n switch (oracleSetup) {\n case OracleSetup.None:\n return 0;\n case OracleSetup.PythLegacy:\n return 1;\n case OracleSetup.SwitchboardV2:\n return 2;\n case OracleSetup.PythPushOracle:\n return 3;\n case OracleSetup.SwitchboardPull:\n return 4;\n case OracleSetup.StakedWithPythPush:\n return 5;\n case OracleSetup.KaminoPythPush:\n return 6;\n case OracleSetup.KaminoSwitchboardPull:\n return 7;\n case OracleSetup.Fixed:\n return 8;\n default:\n return 0;\n }\n}\n\nfunction serializeOracleSetup(oracleSetup: OracleSetup): OracleSetupRaw {\n switch (oracleSetup) {\n case OracleSetup.None:\n return { none: {} };\n case OracleSetup.PythLegacy:\n return { pythLegacy: {} };\n case OracleSetup.SwitchboardV2:\n return { switchboardV2: {} };\n case OracleSetup.PythPushOracle:\n return { pythPushOracle: {} };\n case OracleSetup.SwitchboardPull:\n return { switchboardPull: {} };\n case OracleSetup.StakedWithPythPush:\n return { stakedWithPythPush: {} };\n case OracleSetup.KaminoPythPush:\n return { kaminoPythPush: {} };\n case OracleSetup.KaminoSwitchboardPull:\n return { kaminoSwitchboardPull: {} };\n case OracleSetup.Fixed:\n return { fixed: {} };\n default:\n throw new Error(`Invalid oracle setup \"${oracleSetup}\"`);\n }\n}\n\nfunction toBankDto(bank: BankType): BankTypeDto {\n return {\n address: bank.address.toBase58(),\n group: bank.group.toBase58(),\n mint: bank.mint.toBase58(),\n mintDecimals: bank.mintDecimals,\n assetShareValue: bank.assetShareValue.toString(),\n liabilityShareValue: bank.liabilityShareValue.toString(),\n liquidityVault: bank.liquidityVault.toBase58(),\n liquidityVaultBump: bank.liquidityVaultBump,\n liquidityVaultAuthorityBump: bank.liquidityVaultAuthorityBump,\n insuranceVault: bank.insuranceVault.toBase58(),\n insuranceVaultBump: bank.insuranceVaultBump,\n insuranceVaultAuthorityBump: bank.insuranceVaultAuthorityBump,\n collectedInsuranceFeesOutstanding: bank.collectedInsuranceFeesOutstanding.toString(),\n feeVault: bank.feeVault.toBase58(),\n feeVaultBump: bank.feeVaultBump,\n feeVaultAuthorityBump: bank.feeVaultAuthorityBump,\n collectedGroupFeesOutstanding: bank.collectedGroupFeesOutstanding.toString(),\n lastUpdate: bank.lastUpdate,\n config: toBankConfigDto(bank.config),\n totalAssetShares: bank.totalAssetShares.toString(),\n totalLiabilityShares: bank.totalLiabilityShares.toString(),\n emissionsActiveBorrowing: bank.emissionsActiveBorrowing,\n emissionsActiveLending: bank.emissionsActiveLending,\n emissionsRate: bank.emissionsRate,\n emissionsMint: bank.emissionsMint.toBase58(),\n emissionsRemaining: bank.emissionsRemaining.toString(),\n oracleKey: bank.oracleKey.toBase58(),\n pythShardId: bank.pythShardId,\n emode: toEmodeSettingsDto(bank.emode),\n tokenSymbol: bank.tokenSymbol,\n feesDestinationAccount: bank.feesDestinationAccount?.toBase58(),\n lendingPositionCount: bank.lendingPositionCount?.toString(),\n borrowingPositionCount: bank.borrowingPositionCount?.toString(),\n };\n}\n\nfunction toEmodeSettingsDto(emodeSettings: EmodeSettingsType): EmodeSettingsDto {\n return {\n emodeTag: emodeSettings.emodeTag,\n timestamp: emodeSettings.timestamp,\n flags: emodeSettings.flags,\n emodeEntries: emodeSettings.emodeEntries.map((entry) => {\n return {\n collateralBankEmodeTag: entry.collateralBankEmodeTag,\n flags: entry.flags,\n assetWeightInit: entry.assetWeightInit.toString(),\n assetWeightMaint: entry.assetWeightMaint.toString(),\n };\n }),\n };\n}\n\nfunction toBankConfigDto(bankConfig: BankConfigType): BankConfigDto {\n return {\n assetWeightInit: bankConfig.assetWeightInit.toString(),\n assetWeightMaint: bankConfig.assetWeightMaint.toString(),\n liabilityWeightInit: bankConfig.liabilityWeightInit.toString(),\n liabilityWeightMaint: bankConfig.liabilityWeightMaint.toString(),\n depositLimit: bankConfig.depositLimit.toString(),\n borrowLimit: bankConfig.borrowLimit.toString(),\n riskTier: bankConfig.riskTier,\n operationalState: bankConfig.operationalState,\n totalAssetValueInitLimit: bankConfig.totalAssetValueInitLimit.toString(),\n assetTag: bankConfig.assetTag,\n oracleSetup: bankConfig.oracleSetup,\n oracleKeys: bankConfig.oracleKeys.map((key) => key.toBase58()),\n oracleMaxAge: bankConfig.oracleMaxAge,\n interestRateConfig: toInterestRateConfigDto(bankConfig.interestRateConfig),\n configFlags: bankConfig.configFlags,\n oracleMaxConfidence: bankConfig.oracleMaxConfidence,\n fixedPrice: bankConfig.fixedPrice.toString(),\n };\n}\n\nfunction toInterestRateConfigDto(interestRateConfig: InterestRateConfig): InterestRateConfigDto {\n return {\n optimalUtilizationRate: interestRateConfig.optimalUtilizationRate.toString(),\n plateauInterestRate: interestRateConfig.plateauInterestRate.toString(),\n maxInterestRate: interestRateConfig.maxInterestRate.toString(),\n insuranceFeeFixedApr: interestRateConfig.insuranceFeeFixedApr.toString(),\n insuranceIrFee: interestRateConfig.insuranceIrFee.toString(),\n protocolFixedFeeApr: interestRateConfig.protocolFixedFeeApr.toString(),\n protocolIrFee: interestRateConfig.protocolIrFee.toString(),\n protocolOriginationFee: interestRateConfig.protocolOriginationFee.toString(),\n zeroUtilRate: interestRateConfig.zeroUtilRate,\n hundredUtilRate: interestRateConfig.hundredUtilRate,\n points: interestRateConfig.points,\n curveType: interestRateConfig.curveType,\n };\n}\n\nexport function bankConfigToBankConfigRaw(config: BankConfigType): BankConfigRaw {\n return {\n assetWeightInit: bigNumberToWrappedI80F48(config.assetWeightInit),\n assetWeightMaint: bigNumberToWrappedI80F48(config.assetWeightMaint),\n liabilityWeightInit: bigNumberToWrappedI80F48(config.liabilityWeightInit),\n liabilityWeightMaint: bigNumberToWrappedI80F48(config.liabilityWeightMaint),\n depositLimit: new BN(config.depositLimit.toString()),\n interestRateConfig: serializeInterestRateConfig(config.interestRateConfig),\n operationalState: serializeOperationalState(config.operationalState),\n oracleSetup: serializeOracleSetup(config.oracleSetup),\n oracleKeys: config.oracleKeys,\n configFlags: config.configFlags,\n borrowLimit: new BN(config.borrowLimit.toString()),\n riskTier: serializeRiskTier(config.riskTier),\n assetTag: config.assetTag,\n totalAssetValueInitLimit: new BN(config.totalAssetValueInitLimit.toString()),\n oracleMaxAge: config.oracleMaxAge,\n oracleMaxConfidence: config.oracleMaxConfidence,\n fixedPrice: bigNumberToWrappedI80F48(config.fixedPrice),\n };\n}\n\nexport function bankRawToDto(bankRaw: BankRaw): BankRawDto {\n return {\n group: bankRaw.group.toBase58(),\n mint: bankRaw.mint.toBase58(),\n mintDecimals: bankRaw.mintDecimals,\n\n assetShareValue: bankRaw.assetShareValue,\n liabilityShareValue: bankRaw.liabilityShareValue,\n\n liquidityVault: bankRaw.liquidityVault.toBase58(),\n liquidityVaultBump: bankRaw.liquidityVaultBump,\n liquidityVaultAuthorityBump: bankRaw.liquidityVaultAuthorityBump,\n\n insuranceVault: bankRaw.insuranceVault.toBase58(),\n insuranceVaultBump: bankRaw.insuranceVaultBump,\n insuranceVaultAuthorityBump: bankRaw.insuranceVaultAuthorityBump,\n collectedInsuranceFeesOutstanding: bankRaw.collectedInsuranceFeesOutstanding,\n\n feeVault: bankRaw.feeVault.toBase58(),\n feeVaultBump: bankRaw.feeVaultBump,\n feeVaultAuthorityBump: bankRaw.feeVaultAuthorityBump,\n collectedGroupFeesOutstanding: bankRaw.collectedGroupFeesOutstanding,\n\n lastUpdate: bankRaw.lastUpdate.toString(),\n\n config: bankConfigRawToDto(bankRaw.config),\n\n totalAssetShares: bankRaw.totalAssetShares,\n totalLiabilityShares: bankRaw.totalLiabilityShares,\n\n flags: bankRaw.flags.toString(),\n emissionsRate: bankRaw.emissionsRate.toString(),\n emissionsRemaining: bankRaw.emissionsRemaining,\n emissionsMint: bankRaw.emissionsMint.toBase58(),\n feesDestinationAccount: bankRaw?.feesDestinationAccount?.toBase58(),\n lendingPositionCount: bankRaw?.lendingPositionCount?.toString(),\n borrowingPositionCount: bankRaw?.borrowingPositionCount?.toString(),\n\n emode: emodeSettingsRawToDto(bankRaw.emode),\n };\n}\n\nexport function emodeSettingsRawToDto(emodeSettingsRaw: EmodeSettingsRaw): EmodeSettingsRawDto {\n return {\n emodeTag: emodeSettingsRaw.emodeTag,\n timestamp: emodeSettingsRaw.timestamp.toString(),\n flags: emodeSettingsRaw.flags.toString(),\n emodeConfig: {\n entries: emodeSettingsRaw.emodeConfig.entries.map((entry) => {\n return {\n collateralBankEmodeTag: entry.collateralBankEmodeTag,\n flags: entry.flags,\n assetWeightInit: entry.assetWeightInit,\n assetWeightMaint: entry.assetWeightMaint,\n };\n }),\n },\n };\n}\n\nexport function bankConfigRawToDto(bankConfigRaw: BankConfigRaw): BankConfigRawDto {\n return {\n assetWeightInit: bankConfigRaw.assetWeightInit,\n assetWeightMaint: bankConfigRaw.assetWeightMaint,\n liabilityWeightInit: bankConfigRaw.liabilityWeightInit,\n liabilityWeightMaint: bankConfigRaw.liabilityWeightMaint,\n depositLimit: bankConfigRaw.depositLimit.toString(),\n borrowLimit: bankConfigRaw.borrowLimit.toString(),\n riskTier: bankConfigRaw.riskTier,\n operationalState: bankConfigRaw.operationalState,\n totalAssetValueInitLimit: bankConfigRaw.totalAssetValueInitLimit.toString(),\n assetTag: bankConfigRaw.assetTag,\n oracleSetup: bankConfigRaw.oracleSetup,\n oracleKeys: bankConfigRaw.oracleKeys.map((key) => key.toBase58()),\n oracleMaxAge: bankConfigRaw.oracleMaxAge,\n interestRateConfig: bankConfigRaw.interestRateConfig,\n configFlags: bankConfigRaw.configFlags,\n oracleMaxConfidence: bankConfigRaw.oracleMaxConfidence,\n fixedPrice: bankConfigRaw.fixedPrice,\n };\n}\n\nexport {\n serializeOracleSetupToIndex,\n serializeBankConfigOpt,\n serializeRiskTier,\n serializeOperationalState,\n serializeOracleSetup,\n toBankDto,\n toEmodeSettingsDto,\n toBankConfigDto,\n toInterestRateConfigDto,\n};\n","import { Program, type Provider } from \"@coral-xyz/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { PYTH_PUSH_ORACLE_ID, SYSTEM_PROGRAM_ID } from \"@/constants\";\nimport instructions from \"~/instructions\";\nimport type { LendrProgram } from \"~/types\";\nimport { findPythPushOracleAddress, PYTH_SPONSORED_SHARD_ID } from \"~/utils\";\nimport {\n buildPostEncodedVaaInstructions,\n DEFAULT_PUSH_ORACLE_PROGRAM_ID,\n type InstructionWithEphemeralSigners,\n PYTH_PUSH_ORACLE_IDL,\n PYTH_SOLANA_RECEIVER_PROGRAM_IDL,\n PYTH_WORMHOLE_IDL,\n parseAccumulatorUpdateData,\n parsePriceFeedMessage,\n UPDATE_PRICE_FEED_COMPUTE_BUDGET,\n} from \"~/vendor/pyth_crank\";\nimport type { InstructionsWrapper } from \"../../common\";\nimport type { OracleSetup } from \"./types\";\nimport { serializeBankConfigOpt, serializeOracleSetupToIndex } from \"./utils\";\n\nexport async function freezeBankConfigIx(\n program: LendrProgram,\n bankAddress: PublicKey,\n bankConfigOpt: BankConfigOpt,\n): Promise<InstructionsWrapper> {\n if (!bankConfigOpt) {\n // todo: make bankConfigOpt optional and create function to get bankConfigOptRaw from bank\n }\n const bankConfigRaw = serializeBankConfigOpt(bankConfigOpt);\n\n const ix = await instructions.makePoolConfigureBankIx(\n program,\n {\n bank: bankAddress,\n },\n {\n bankConfigOpt: {\n ...bankConfigRaw,\n assetWeightInit: null,\n assetWeightMaint: null,\n\n liabilityWeightInit: null,\n liabilityWeightMaint: null,\n\n depositLimit: null,\n borrowLimit: null,\n riskTier: null,\n assetTag: null,\n totalAssetValueInitLimit: null,\n\n interestRateConfig: null,\n operationalState: null,\n\n oracleMaxAge: null,\n permissionlessBadDebtSettlement: null,\n freezeSettings: true,\n oracleMaxConfidence: null,\n tokenlessRepaymentsAllowed: null,\n },\n },\n );\n\n return {\n instructions: [ix],\n keys: [],\n };\n}\n\ntype AddOracleToBanksIxArgs = {\n program: LendrProgram;\n bankAddress: PublicKey;\n /**\n * The feed ID for the oracle. For Pyth Push oracles, this is the price feed ID.\n * The function will automatically derive the PDA from this feed ID.\n */\n feedId: PublicKey;\n /**\n * The oracle setup type (e.g., PythPushOracle, KaminoPythPush, etc.)\n */\n setup: OracleSetup;\n /**\n * The shard ID for Pyth Push oracles. Defaults to PYTH_SPONSORED_SHARD_ID.\n * Only relevant for PythPushOracle and KaminoPythPush setups.\n */\n shardId?: number;\n groupAddress?: PublicKey;\n adminAddress?: PublicKey;\n};\n\n/**\n * Creates an instruction to configure a bank's oracle.\n * For Pyth Push oracles, automatically derives the PDA from the feed ID.\n */\nexport async function addOracleToBanksIx({\n program,\n bankAddress,\n feedId,\n setup,\n shardId = PYTH_SPONSORED_SHARD_ID,\n groupAddress,\n adminAddress,\n}: AddOracleToBanksIxArgs): Promise<InstructionsWrapper> {\n // Determine the oracle key based on setup type\n let oraclePDA: PublicKey;\n\n if (setup === \"PythPushOracle\" || setup === \"KaminoPythPush\") {\n // For Pyth Push oracles, derive the PDA from the feed ID\n oraclePDA = findPythPushOracleAddress(feedId.toBuffer(), PYTH_PUSH_ORACLE_ID, shardId);\n } else {\n // For other oracle types, use the feed ID directly as the oracle key\n oraclePDA = feedId;\n }\n\n const ix = await instructions.makeLendingPoolConfigureBankOracleIx(\n program,\n {\n bank: bankAddress,\n group: groupAddress,\n admin: adminAddress,\n },\n {\n setup: serializeOracleSetupToIndex(setup),\n feedId: oraclePDA, // Pass the derived PDA (or raw feed ID for non-Pyth setups)\n },\n [{ isSigner: false, isWritable: false, pubkey: oraclePDA }], // Include in remaining accounts\n );\n\n return {\n instructions: [ix],\n keys: [],\n };\n}\n\n/**\n * Derive the address of a price feed account\n * @param shardId The shard ID of the set of price feed accounts. This shard ID allows for multiple price feed accounts for the same price feed id to exist.\n * @param priceFeedId The price feed ID, as either a 32-byte buffer or hexadecimal string with or without a leading \"0x\" prefix.\n * @param pushOracleProgramId The program ID of the Pyth Push Oracle program. If not provided, the default deployment will be used.\n * @returns The address of the price feed account\n */\nexport function getPriceFeedAccountForProgram(\n shardId: number,\n priceFeedId: Buffer | string,\n pushOracleProgramId?: PublicKey,\n): PublicKey {\n let feedIdBuffer: Buffer;\n if (typeof priceFeedId === \"string\") {\n if (priceFeedId.startsWith(\"0x\")) {\n feedIdBuffer = Buffer.from(priceFeedId.slice(2), \"hex\");\n } else {\n feedIdBuffer = Buffer.from(priceFeedId, \"hex\");\n }\n } else {\n feedIdBuffer = priceFeedId;\n }\n\n if (feedIdBuffer.length !== 32) {\n throw new Error(\"Feed ID should be 32 bytes long\");\n }\n const shardBuffer = Buffer.alloc(2);\n shardBuffer.writeUint16LE(shardId, 0);\n\n return PublicKey.findProgramAddressSync(\n [shardBuffer, feedIdBuffer],\n pushOracleProgramId ?? DEFAULT_PUSH_ORACLE_PROGRAM_ID,\n )[0];\n}\n\nexport const getTreasuryPda = (treasuryId: number, receiverProgramId: PublicKey) => {\n return PublicKey.findProgramAddressSync([Buffer.from(\"treasury\"), Buffer.from([treasuryId])], receiverProgramId)[0];\n};\n\nexport const getConfigPda = (receiverProgramId: PublicKey) => {\n return PublicKey.findProgramAddressSync([Buffer.from(\"config\")], receiverProgramId)[0];\n};\n\nexport async function crankPythOracleIx(oracles: { feedId: string; shardId: number }[], provider: Provider) {\n const feedIdsByShardId: Record<number, string[]> = {};\n const wormholeProgram = new Program(PYTH_WORMHOLE_IDL, provider);\n const pushOracleProgram = new Program(PYTH_PUSH_ORACLE_IDL, provider);\n const receiverProgram = new Program(PYTH_SOLANA_RECEIVER_PROGRAM_IDL, provider);\n\n const addressLookupTableAccount = new PublicKey(\"5DNCErWQFBdvCxWQXaC1mrEFsvL3ftrzZ2gVZWNybaSX\");\n\n const lookupTableAccount = (await provider.connection.getAddressLookupTable(addressLookupTableAccount)).value;\n\n const buildURL = (endpoint: string) => {\n return new URL(`./v2/${endpoint}`, `https://hermes.pyth.network/`);\n };\n\n for (const oracle of oracles) {\n const { shardId, feedId } = oracle;\n if (!feedIdsByShardId[shardId]) {\n feedIdsByShardId[shardId] = [];\n }\n feedIdsByShardId[shardId].push(feedId);\n }\n const postInstructions: InstructionWithEphemeralSigners[] = [];\n const _priceFeedIdToPriceUpdateAccount: Record<string, PublicKey> = {};\n const closeInstructions: InstructionWithEphemeralSigners[] = [];\n\n for (const [shardId, feedIds] of Object.entries(feedIdsByShardId)) {\n const url = buildURL(\"updates/price/latest\");\n for (const id of feedIds) {\n url.searchParams.append(\"ids[]\", id);\n }\n\n url.searchParams.append(\"encoding\", \"base64\");\n\n const response = await fetch(url);\n const priceDataArray: string[] = (await response.json()).binary.data;\n\n const treasuryId = 0;\n\n for (const priceData of priceDataArray) {\n const accumulatorUpdateData = parseAccumulatorUpdateData(Buffer.from(priceData, \"base64\"));\n\n const {\n postInstructions: postEncodedVaaInstructions,\n encodedVaaAddress: encodedVaa,\n closeInstructions: postEncodedVaacloseInstructions,\n } = await buildPostEncodedVaaInstructions(wormholeProgram, accumulatorUpdateData.vaa);\n postInstructions.push(...postEncodedVaaInstructions);\n closeInstructions.push(...postEncodedVaacloseInstructions);\n\n for (const update of accumulatorUpdateData.updates) {\n const feedId = parsePriceFeedMessage(update.message).feedId;\n postInstructions.push({\n instruction: await pushOracleProgram.methods\n .updatePriceFeed(\n {\n merklePriceUpdate: update,\n treasuryId,\n },\n Number(shardId),\n Array.from(feedId),\n )\n .accounts({\n pythSolanaReceiver: receiverProgram.programId,\n encodedVaa,\n priceFeedAccount: getPriceFeedAccountForProgram(Number(shardId), feedId, pushOracleProgram.programId),\n treasury: getTreasuryPda(treasuryId, receiverProgram.programId),\n config: getConfigPda(receiverProgram.programId),\n systemProgram: SYSTEM_PROGRAM_ID,\n })\n .instruction(),\n signers: [],\n computeUnits: UPDATE_PRICE_FEED_COMPUTE_BUDGET,\n });\n }\n }\n }\n\n return {\n postInstructions: postInstructions,\n closeInstructions: closeInstructions,\n keys: [],\n lut: lookupTableAccount,\n };\n}\n","import type { Commitment, Connection } from \"@solana/web3.js\";\n\nimport { setTimeoutPromise, sleep } from \"../../../common\";\n\nexport class SendBundleError extends Error {\n public readonly bundleId?: string;\n\n constructor(message: string, bundleId?: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype); // Restore prototype chain\n this.bundleId = bundleId;\n\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nconst GRPC_ERROR_TAG = \"GRPC bundle failed:\";\n\nexport async function sendTransactionAsGrpcBundle(\n connection: Connection,\n base58Txs: string[],\n throwError = false,\n): Promise<string | undefined> {\n try {\n const sendBundleResponse = await fetch(\"/api/bundles/sendBundle\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n transactions: base58Txs,\n }),\n });\n\n const sendBundleResult = await sendBundleResponse.json();\n if (sendBundleResult.error) throw new SendBundleError(sendBundleResult.error, sendBundleResult?.bundleId);\n const bundleId = sendBundleResult.bundleId;\n\n // confirm bundle\n try {\n await confirmBundle(connection, bundleId);\n } catch (_error) {\n return bundleId;\n }\n\n return bundleId;\n } catch (error) {\n if (throwError) {\n if (error instanceof SendBundleError) throw error;\n throw new SendBundleError(`${GRPC_ERROR_TAG} unknown error`);\n }\n }\n}\n\nconst API_ERROR_TAG = \"API bundle failed:\";\n\nexport async function sendTransactionAsBundle(\n connection: Connection,\n base58Txs: string[],\n throwError = false,\n tempBundleId?: string,\n): Promise<string | undefined> {\n try {\n const sendBundleResponse = await fetch(\"https://mainnet.block-engine.jito.wtf/api/v1/bundles\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"sendBundle\",\n params: [base58Txs],\n }),\n });\n\n const sendBundleResult = await sendBundleResponse.json();\n if (sendBundleResult.error) {\n if (sendBundleResult.error.message.includes(\"already processed\")) {\n return tempBundleId ?? \"0x0\"; // todo add proper bundle id\n }\n\n throw new SendBundleError(`${API_ERROR_TAG} ${sendBundleResult.error.message}`);\n }\n\n const bundleId = sendBundleResult.result as string;\n await sleep(500);\n\n for (let attempt = 0; attempt < 10; attempt++) {\n const getBundleStatusResponse = await fetch(\"https://mainnet.block-engine.jito.wtf/api/v1/bundles\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"getBundleStatuses\",\n params: [[bundleId]],\n }),\n });\n\n const getBundleStatusResult = await getBundleStatusResponse.json();\n\n const status = getBundleStatusResult.result?.value[0]?.confirmation_status;\n\n if (getBundleStatusResult.result?.value[0]?.err) {\n const error = getBundleStatusResult.result?.value[0].err;\n if (error?.Ok !== null) {\n throw new Error(error);\n }\n }\n\n /**\n * Bundle status values:\n * - Failed: All regions marked bundle as failed, not forwarded\n * - Pending: Bundle has not failed, landed, or been deemed invalid\n * - Landed: Bundle successfully landed on-chain (verified via RPC/bundles_landed table)\n * - Invalid: Bundle is no longer in the system\n */\n if (status === \"Failed\") {\n throw new SendBundleError(`${API_ERROR_TAG} unknown error`);\n } else if (status === \"confirmed\" || status === \"finalized\") {\n await confirmBundle(connection, bundleId);\n return bundleId;\n }\n\n await sleep(1000); // Wait before retrying\n }\n } catch (error) {\n if (throwError) {\n if (error instanceof SendBundleError) throw error;\n\n throw new SendBundleError(`${API_ERROR_TAG} unknown error`);\n }\n }\n}\n\nexport async function confirmBundle(_connection: Connection, bundleId: string, _commitment: Commitment = \"confirmed\") {\n const getStatus = async () => {\n let attempts = 0;\n const maxAttempts = 5;\n\n while (attempts < maxAttempts) {\n await sleep(2000);\n attempts += 1;\n\n const getBundleStatus = await fetch(\"https://mainnet.block-engine.jito.wtf/api/v1/bundles\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"getBundleStatuses\",\n params: [[bundleId]],\n }),\n });\n\n const bundleStatus = await getBundleStatus.json();\n if (bundleStatus.result.value) {\n if (bundleStatus.result.value[0].bundle_id) {\n const commitmentStatus = bundleStatus.result.value[0].confirmation_status;\n\n if (commitmentStatus === \"confirmed\") {\n return bundleId;\n }\n }\n }\n\n console.log(\"🔄 Waiting for confirmation...\");\n }\n console.log(\"❌ Transaction failed to confirm in time.\");\n throw new Error(\"Transaction failed to confirm in time.\");\n };\n\n const result = await Promise.race([getStatus(), setTimeoutPromise(20000, `Transaction failed to confirm in time.`)]);\n\n if (result instanceof Error) {\n throw result;\n }\n\n return result;\n}\n","import {\n type PublicKey,\n type RpcResponseAndContext,\n type SimulatedTransactionResponse,\n SolanaJSONRPCError,\n type TransactionError,\n type VersionedTransaction,\n} from \"@solana/web3.js\";\n\nexport class BundleSimulationError extends Error {\n constructor(\n message: string,\n public readonly logs?: string[],\n override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"BundleSimulationError\";\n }\n\n static fromHttpError(status: number, statusText: string): BundleSimulationError {\n return new BundleSimulationError(`HTTP error ${status}: ${statusText}`);\n }\n\n static fromEncodingError(_error: unknown, index?: number): BundleSimulationError {\n return new BundleSimulationError(`Failed to encode transaction${index !== undefined ? ` at index ${index}` : \"s\"}`);\n }\n}\n\ntype JsonRpcResponse<T> =\n | {\n id: number;\n jsonrpc: string;\n result: RpcResponseAndContext<T>;\n }\n | {\n id: number;\n jsonrpc: string;\n error: SolanaJSONRPCError;\n };\n\ninterface RpcSimulateBundleResult {\n summary:\n | \"succeeded\"\n | {\n failed: {\n error: any;\n txSignature?: string;\n };\n };\n transactionResults: RpcSimulateBundleTransactionResult[];\n}\n\nexport function isSimulatedTransactionResponse(\n response: SimulatedTransactionResponse | RpcSimulateBundleTransactionResult[],\n): response is SimulatedTransactionResponse {\n return !Array.isArray(response) && \"err\" in response;\n}\n\nexport interface RpcSimulateBundleTransactionResult {\n err?: TransactionError;\n logs: string[];\n preExecutionAccounts?: any; //UiAccount[],\n postExecutionAccounts?: any; //UiAccount[],\n unitsConsumed?: string;\n returnData?: any; //UiTransactionReturnData,\n}\n\ninterface RpcSimulateBundleConfig {\n preExecutionAccountsConfigs: (RpcSimulateTransactionAccountsConfig | undefined)[];\n postExecutionAccountsConfigs: (RpcSimulateTransactionAccountsConfig | undefined)[];\n transactionEncoding?: any;\n simulationBank?: SimulationSlotConfig;\n skipSigVerify?: boolean;\n replaceRecentBlockhash?: boolean;\n}\n\ninterface RpcSimulateTransactionAccountsConfig {\n encoding?: any; // UiAccountEncoding,\n addresses: string[];\n}\n\ntype SimulationSlotConfig = \"confirmed\" | \"processed\" | number;\n\nexport async function simulateBundle(\n rpcEndpoint: string,\n transactions: VersionedTransaction[],\n includeAccounts?: Array<PublicKey>,\n): Promise<RpcSimulateBundleTransactionResult[]> {\n // Validate input\n if (!transactions.length) {\n throw new BundleSimulationError(\"No bundle provided for simulation\");\n }\n\n try {\n // Prepare transaction data\n const encodedTransactions = encodeTransactions(transactions);\n const config = createBundleConfig(transactions, includeAccounts);\n\n // Execute simulation\n const result = await executeBundleSimulation(rpcEndpoint, encodedTransactions, config);\n\n return result;\n } catch (error) {\n // If it's already a SolanaJSONRPCError or BundleSimulationError, rethrow it\n if (error instanceof SolanaJSONRPCError || error instanceof BundleSimulationError) {\n throw error;\n } else {\n throw new BundleSimulationError(\"Failed to execute bundle simulation\", undefined, error);\n }\n }\n}\n\nfunction encodeTransactions(transactions: VersionedTransaction[]): string[] {\n try {\n return transactions.map((tx, index) => {\n try {\n const serialized = tx.serialize();\n return Buffer.from(serialized).toString(\"base64\");\n } catch (error) {\n throw BundleSimulationError.fromEncodingError(error, index);\n }\n });\n } catch (error) {\n if (error instanceof BundleSimulationError) throw error;\n throw BundleSimulationError.fromEncodingError(error);\n }\n}\n\nfunction createBundleConfig(\n transactions: VersionedTransaction[],\n includeAccounts?: Array<PublicKey>,\n): RpcSimulateBundleConfig {\n return {\n skipSigVerify: true,\n replaceRecentBlockhash: true,\n preExecutionAccountsConfigs: transactions.map(() => ({ addresses: [] })),\n postExecutionAccountsConfigs: transactions.map((_, index) => ({\n addresses:\n index === transactions.length - 1 && includeAccounts\n ? includeAccounts.map((account) => account.toBase58())\n : [],\n })),\n };\n}\n\nasync function executeBundleSimulation(\n rpcEndpoint: string,\n encodedTransactions: string[],\n config: RpcSimulateBundleConfig,\n): Promise<RpcSimulateBundleTransactionResult[]> {\n const response = await fetch(rpcEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"simulateBundle\",\n params: [{ encodedTransactions }, config],\n }),\n });\n\n if (!response.ok) {\n throw BundleSimulationError.fromHttpError(response.status, response.statusText);\n }\n\n const jsonResponse = (await response.json()) as JsonRpcResponse<RpcSimulateBundleResult>;\n\n if (\"error\" in jsonResponse) {\n throw jsonResponse.error;\n }\n\n const value = jsonResponse.result.value;\n\n if (value.summary !== \"succeeded\") {\n const logs = value.transactionResults.flatMap((tx) => tx.logs);\n\n throw new BundleSimulationError(JSON.stringify(value.summary.failed.error), logs);\n }\n\n return value.transactionResults;\n}\n","import {\n type Commitment,\n type ConfirmOptions,\n type Connection,\n type PublicKey,\n type SimulatedTransactionResponse,\n SolanaJSONRPCError,\n type Transaction,\n type TransactionSignature,\n type VersionedTransaction,\n} from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { DEFAULT_CONFIRM_OPTS, PROGRAM_ID, SKIP_SIMULATION } from \"@/constants\";\nimport { ProcessTransactionError, ProcessTransactionErrorType, parseTransactionError } from \"~/errors\";\nimport {\n addTransactionMetadata,\n getComputeBudgetUnits,\n isV0Tx,\n legacyTxToV0Tx,\n microLamportsToUi,\n type SolanaTransaction,\n setTimeoutPromise,\n sleep,\n type TransactionBroadcastType,\n type TransactionOptions,\n type Wallet,\n} from \"../../common\";\nimport {\n BundleSimulationError,\n formatTransactions,\n isSimulatedTransactionResponse,\n type RpcSimulateBundleTransactionResult,\n SendBundleError,\n sendTransactionAsBundle,\n sendTransactionAsBundleRpc,\n sendTransactionAsGrpcBundle,\n simulateBundle,\n} from \"./helpers\";\n\nexport const DEFAULT_PROCESS_TX_OPTS = {\n broadcastType: \"RPC\" as TransactionBroadcastType,\n isSequentialTxs: true,\n isReadOnly: false,\n};\nexport interface ProcessTransactionOpts extends ProcessTransactionsClientOpts {\n isReadOnly?: boolean;\n programId?: PublicKey;\n bundleSimRpcEndpoint?: string;\n addArenaTxTag?: boolean;\n}\n\nexport type PriorityFees = {\n bundleTipUi?: number;\n priorityFeeMicro?: number;\n maxCapUi?: number;\n};\n\nexport type BroadcastMethodType = Extract<TransactionBroadcastType, \"BUNDLE\" | \"RPC\">;\n\nexport type SpecificBroadcastMethodType = \"GRPC_BUNDLE\" | \"API_BUNDLE\" | \"RPC_BUNDLE\" | \"RPC_SEQUENTIAL\";\n\nexport type SpecificBroadcastMethod = {\n method: SpecificBroadcastMethodType;\n broadcastType: BroadcastMethodType;\n};\n\nexport type ProcessTransactionStrategy = {\n splitExecutionsStrategy?: {\n singleTx: BroadcastMethodType;\n multiTx: BroadcastMethodType;\n };\n fallbackSequence: SpecificBroadcastMethod[];\n};\n\nexport const DEFAULT_PROCESS_TX_STRATEGY: ProcessTransactionStrategy = {\n splitExecutionsStrategy: {\n singleTx: \"RPC\",\n multiTx: \"RPC\",\n },\n // if splitExecutionsStrategy is provided, the fallbackSequence will prioritize the first relevant broadcast method in the array\n fallbackSequence: [\n { method: \"GRPC_BUNDLE\", broadcastType: \"BUNDLE\" },\n { method: \"API_BUNDLE\", broadcastType: \"BUNDLE\" },\n { method: \"RPC_BUNDLE\", broadcastType: \"RPC\" },\n { method: \"RPC_SEQUENTIAL\", broadcastType: \"RPC\" },\n ],\n};\n\nexport interface ProcessTransactionsClientOpts extends PriorityFees {\n broadcastType?: TransactionBroadcastType;\n dynamicStrategy?: ProcessTransactionStrategy;\n isSequentialTxs?: boolean;\n addArenaTxTag?: boolean;\n callback?: (index?: number, success?: boolean, signature?: string, stepsToAdvance?: number) => void;\n}\n\ntype ProcessTransactionsProps = {\n transactions: SolanaTransaction[];\n connection: Connection;\n wallet: Wallet;\n txOpts?: TransactionOptions;\n processOpts?: ProcessTransactionOpts;\n};\n\n/**\n * Processes a batch of Solana transactions by signing, simulating, and sending them to the network.\n *\n * @param {ProcessTransactionsProps} props - The properties required to process transactions.\n * @param {SolanaTransaction[]} props.transactions - The transactions to be processed.\n * @param {Connection} props.connection - The connection to the Solana network.\n * @param {Wallet} props.wallet - The wallet used to sign the transactions.\n * @param {ProcessTransactionOpts} [props.processOpts] - Optional processing options.\n * @param {TransactionOptions} [props.txOpts] - Optional transaction options.\n *\n * @returns {Promise<TransactionSignature[]>} - A promise that resolves to an array of transaction signatures.\n *\n * @throws {ProcessTransactionError} - Throws an error if transaction processing fails.\n */\nexport async function processTransactions({\n transactions,\n connection,\n wallet,\n processOpts: processOptsArgs,\n txOpts,\n}: ProcessTransactionsProps): Promise<TransactionSignature[]> {\n const processOpts = {\n ...DEFAULT_PROCESS_TX_OPTS,\n ...processOptsArgs,\n };\n const commitment = connection.commitment ?? DEFAULT_CONFIRM_OPTS.commitment;\n\n if (processOpts?.broadcastType === \"BUNDLE\" && processOpts?.bundleTipUi === 0) {\n throw new Error(\"A bundle tip is required for a bundled transactions\");\n }\n\n let broadcastType: BroadcastMethodType;\n let finalFallbackMethod: SpecificBroadcastMethod[];\n\n const strategy = processOpts.dynamicStrategy ?? DEFAULT_PROCESS_TX_STRATEGY;\n if (processOpts?.broadcastType === \"DYNAMIC\") {\n if (strategy.splitExecutionsStrategy) {\n if (transactions.length > 1) {\n broadcastType = strategy.splitExecutionsStrategy.multiTx;\n } else {\n broadcastType = strategy.splitExecutionsStrategy.singleTx;\n }\n } else {\n broadcastType = strategy.fallbackSequence[0].broadcastType;\n }\n } else {\n broadcastType = processOpts.broadcastType;\n }\n\n if (broadcastType === \"RPC\") {\n finalFallbackMethod = strategy.fallbackSequence.filter((method) => method.broadcastType === \"RPC\");\n } else {\n finalFallbackMethod = strategy.fallbackSequence.filter((method) => method.broadcastType === \"BUNDLE\");\n }\n\n let versionedTransactions: VersionedTransaction[] = [];\n let minContextSlot: number;\n let blockhash: string;\n let lastValidBlockHeight: number;\n\n try {\n const getLatestBlockhashAndContext = await connection.getLatestBlockhashAndContext(commitment);\n\n minContextSlot = getLatestBlockhashAndContext.context.slot - 4;\n blockhash = getLatestBlockhashAndContext.value.blockhash;\n lastValidBlockHeight = getLatestBlockhashAndContext.value.lastValidBlockHeight;\n } catch (error) {\n console.error(\"Failed to get latest blockhash and context\", error);\n\n if (error instanceof SolanaJSONRPCError) {\n throw error;\n }\n\n throw new ProcessTransactionError({\n message: \"Failed to get latest blockhash and context.\",\n type: ProcessTransactionErrorType.TransactionBuildingError,\n failedTxs: transactions,\n });\n }\n\n const mergedOpts: ConfirmOptions = {\n ...DEFAULT_CONFIRM_OPTS,\n commitment,\n preflightCommitment: commitment,\n minContextSlot,\n ...txOpts,\n };\n\n let updatedTransactions: SolanaTransaction[] = transactions;\n\n try {\n const simulationResult = await simulateTransactions(processOpts, connection, transactions, mergedOpts, {\n feePayer: wallet.publicKey,\n blockhash,\n });\n\n const unitsConsumed = isSimulatedTransactionResponse(simulationResult)\n ? [simulationResult.unitsConsumed]\n : simulationResult.map((tx) => (tx.unitsConsumed ? Number(tx.unitsConsumed) : undefined));\n\n updatedTransactions = transactions.map((tx, idx) =>\n addTransactionMetadata(tx, {\n ...tx,\n unitsConsumed: unitsConsumed[idx],\n }),\n );\n } catch {\n // only to estimate compute units, final simulation is done just before sending\n }\n\n const maxCapUi = processOpts.maxCapUi;\n\n console.log(\"------ Transaction Details 👇 ------\");\n console.log(`📝 Executing ${transactions.length} transaction${transactions.length > 1 ? \"s\" : \"\"}`);\n console.log(`📡 Broadcast type: ${broadcastType}`);\n if (broadcastType === \"BUNDLE\") {\n console.log(\n `💸 Bundle tip: ${maxCapUi ? Math.min(processOpts.bundleTipUi ?? 0, maxCapUi) : processOpts.bundleTipUi} SOL`,\n );\n } else {\n updatedTransactions.forEach((tx, idx) => {\n const cu = tx.unitsConsumed ? Math.min(tx.unitsConsumed + 50_000, 1_400_000) : getComputeBudgetUnits(tx);\n const priorityFeeUi = maxCapUi\n ? Math.min(processOpts.priorityFeeMicro ? microLamportsToUi(processOpts.priorityFeeMicro, cu) : 0, maxCapUi)\n : processOpts.priorityFeeMicro\n ? microLamportsToUi(processOpts.priorityFeeMicro, cu)\n : 0;\n console.log(`💸 Priority fee for tx ${idx}: ${priorityFeeUi} SOL`);\n });\n }\n console.log(\"--------------------------------\");\n\n versionedTransactions = formatTransactions(\n updatedTransactions,\n broadcastType,\n blockhash,\n {\n priorityFeeMicro: processOpts.priorityFeeMicro ?? 0,\n bundleTipUi: processOpts.bundleTipUi ?? 0,\n feePayer: wallet.publicKey,\n\n maxCapUi,\n },\n processOpts.addArenaTxTag,\n );\n\n let signatures: TransactionSignature[] = [];\n let bundleSignature: string | undefined;\n\n try {\n if (txOpts?.dryRun || processOpts?.isReadOnly) {\n return await dryRunTransaction(processOpts, connection, versionedTransactions);\n } else {\n let base58Txs: string[] = [];\n\n if (wallet.signAllTransactions) {\n versionedTransactions = await wallet.signAllTransactions(versionedTransactions);\n base58Txs = versionedTransactions.map((signedTx) => bs58.encode(signedTx.serialize()));\n } else {\n for (let i = 0; i < versionedTransactions.length; i++) {\n const signedTx = await wallet.signTransaction(versionedTransactions[i]);\n const base58Tx = bs58.encode(signedTx.serialize());\n base58Txs.push(base58Tx);\n versionedTransactions[i] = signedTx;\n }\n }\n // Updating after 'sign in wallet' step in toast\n // If the transactions are bundled, we need to advance the toast by the number of transactions.\n if (broadcastType === \"BUNDLE\") {\n const stepsToAdvance = versionedTransactions.length;\n processOpts.callback?.(undefined, true, undefined, stepsToAdvance);\n } else {\n processOpts.callback?.(undefined, true);\n }\n\n let simulateTxs: (() => Promise<SimulatedTransactionResponse | RpcSimulateBundleTransactionResult[]>) | null =\n null;\n if (!SKIP_SIMULATION) {\n simulateTxs = async () =>\n await simulateTransactions(processOpts, connection, versionedTransactions, mergedOpts);\n }\n\n const sendTxBundleGrpc = async (throwError: boolean) =>\n await sendTransactionAsGrpcBundle(connection, base58Txs, throwError);\n const sendTxBundleApi = async (throwError: boolean, bundleId?: string) =>\n await sendTransactionAsBundle(connection, base58Txs, throwError, bundleId);\n const sendTxBundleRpc = async () =>\n await sendTransactionAsBundleRpc({\n versionedTransactions,\n txOpts,\n connection,\n onCallback: processOpts.callback,\n blockStrategy: { blockhash, lastValidBlockHeight },\n confirmCommitment: mergedOpts.commitment,\n isSequentialTxs: processOpts.isSequentialTxs,\n throwError: true,\n });\n\n for (const [idx, method] of finalFallbackMethod.entries()) {\n const isLast = idx === finalFallbackMethod.length - 1;\n if (idx === 0 && simulateTxs && !SKIP_SIMULATION) {\n await simulateTxs();\n }\n\n let temporaryBundleSignature: string | undefined;\n let sig: string | undefined;\n let sigs: string[] | undefined;\n switch (method.method) {\n case \"GRPC_BUNDLE\":\n // always throw error, this is temporary as bundle already processed isn't catched well\n sig = await sendTxBundleGrpc(true).catch((error) => {\n if (error?.bundleId) {\n temporaryBundleSignature = error.bundleId;\n }\n\n if (isLast) throw error;\n return undefined;\n });\n if (sig) bundleSignature = sig;\n break;\n case \"API_BUNDLE\":\n sig = await sendTxBundleApi(isLast, temporaryBundleSignature);\n if (sig) bundleSignature = sig;\n break;\n case \"RPC_BUNDLE\":\n sigs = await sendTxBundleRpc();\n if (sigs) signatures = sigs;\n break;\n case \"RPC_SEQUENTIAL\":\n console.log(\"implement\");\n break;\n }\n\n if (sig || sigs) {\n break;\n }\n }\n\n if (bundleSignature || signatures.length > 0) {\n console.log(\"------ Transaction Success ✅ ------\");\n if (bundleSignature) {\n console.log(\"Bundle signature:\", bundleSignature);\n }\n if (signatures.length > 0) {\n console.log(\"Transaction signatures:\", signatures.join(\", \"));\n }\n console.log(\"--------------------------------\");\n }\n\n if (signatures.length !== 0) {\n return signatures;\n } else {\n if (!bundleSignature) throw new Error(\"API bundle failed: unknown error\");\n return [bundleSignature];\n }\n }\n } catch (error: any) {\n const failedTxs = transactions.splice(signatures.length);\n\n if (error instanceof SolanaJSONRPCError) {\n throw error;\n }\n\n if (error instanceof ProcessTransactionError) {\n throw ProcessTransactionError.withFailedTransactions(error, failedTxs);\n }\n\n if (error instanceof SendBundleError) {\n // the bundle failed to land not much info we can gather from failing bundles\n throw new ProcessTransactionError({\n message: error.message,\n type: ProcessTransactionErrorType.TransactionSendingError,\n programId: PROGRAM_ID.toBase58(),\n failedTxs: failedTxs,\n _error: error,\n });\n }\n\n const parsedError = parseTransactionError(error, processOpts?.programId ?? PROGRAM_ID);\n\n if (error?.logs?.length > 0) {\n console.log(\"------ Logs 👇 ------\");\n console.log(error.logs.join(\"\\n\"));\n if (parsedError) {\n console.log(\"Parsed:\", parsedError);\n throw new ProcessTransactionError({\n message: parsedError.description,\n type: ProcessTransactionErrorType.TransactionSendingError,\n logs: error.logs,\n programId: parsedError.programId,\n _error: error,\n });\n }\n }\n console.log(\"fallthrough error\", error);\n throw new ProcessTransactionError({\n message: parsedError?.description ?? \"Something went wrong\",\n type: ProcessTransactionErrorType.FallthroughError,\n logs: error.logs,\n programId: parsedError.programId,\n _error: error,\n });\n }\n}\n\nexport const simulateTransactions = async (\n processOpts: ProcessTransactionOpts,\n connection: Connection,\n solanaTransactions: VersionedTransaction[] | Transaction[] | SolanaTransaction[],\n confirmOpts?: ConfirmOptions,\n txOpts?: {\n feePayer: PublicKey;\n blockhash: string;\n },\n): Promise<SimulatedTransactionResponse | RpcSimulateBundleTransactionResult[]> => {\n const v0Txs = solanaTransactions.map((tx) => (isV0Tx(tx) ? tx : legacyTxToV0Tx(tx, txOpts)));\n\n try {\n if (v0Txs.length > 1) {\n const response = await simulateBundle(processOpts?.bundleSimRpcEndpoint ?? connection.rpcEndpoint, v0Txs);\n return response;\n } else {\n const response = await connection.simulateTransaction(v0Txs[0], {\n sigVerify: false,\n commitment: confirmOpts?.commitment,\n replaceRecentBlockhash: false,\n minContextSlot: confirmOpts?.minContextSlot,\n });\n if (response.value.err) {\n const error = response.value.err;\n const parsedError = parseTransactionError(error, processOpts?.programId ?? PROGRAM_ID);\n throw new ProcessTransactionError({\n message: parsedError.description ?? JSON.stringify(response.value.err),\n type: ProcessTransactionErrorType.SimulationError,\n logs: response.value.logs ?? [],\n programId: parsedError.programId,\n });\n }\n return response.value;\n }\n } catch (error) {\n if (error instanceof BundleSimulationError) {\n const parsedError = parseTransactionError(error, processOpts?.programId ?? PROGRAM_ID);\n throw new ProcessTransactionError({\n message: parsedError.description,\n type: ProcessTransactionErrorType.SimulationError,\n logs: error.logs,\n programId: parsedError.programId,\n _error: error,\n });\n }\n\n throw error;\n }\n};\n\nconst dryRunTransaction = async (\n processOpts: ProcessTransactionOpts,\n connection: Connection,\n versionedTransactions: VersionedTransaction[],\n): Promise<TransactionSignature[]> => {\n try {\n const response = await simulateBundle(\n processOpts?.bundleSimRpcEndpoint ?? connection.rpcEndpoint,\n versionedTransactions,\n );\n\n console.log(\"------ Units Consumed 👇 ------\");\n for (const tx of response) {\n console.log(`✅ Success - ${tx.unitsConsumed} CU`);\n }\n\n console.log(\"------ Logs 👇 ------\");\n for (const tx of response) {\n console.log(tx.logs);\n }\n } catch (error) {\n if (error instanceof BundleSimulationError) {\n console.log(`❌ Error: ${error.message}`);\n console.log(\"------ Logs 👇 ------\");\n if (error.logs) {\n for (const log of error.logs) {\n console.log(log);\n }\n }\n }\n throw error;\n }\n\n return [];\n};\n\nexport async function confirmTransaction(\n connection: Connection,\n signature: string,\n commitment: Commitment = \"confirmed\",\n) {\n const getStatus = async () => {\n const commitmentArray: Commitment[] = [\"processed\", \"confirmed\", \"finalized\"];\n const index: number = commitmentArray.indexOf(commitment);\n if (index === -1) throw new Error(\"Invalid commitment\");\n\n let attempts = 0;\n const maxAttempts = 8;\n\n while (attempts < maxAttempts) {\n attempts += 1;\n\n const status = await connection.getSignatureStatus(signature);\n\n if (status?.value?.err) {\n console.error(\"❌ Error:\", status.value.err);\n throw status.value.err;\n }\n\n if (status?.value?.confirmationStatus) {\n const confirmationStatusIndex = commitmentArray.indexOf(status.value.confirmationStatus);\n if (confirmationStatusIndex >= index) {\n return status.value;\n }\n }\n\n console.log(\"🔄 Waiting for confirmation...\");\n\n await sleep(2000);\n }\n console.log(\"❌ Transaction failed to confirm in time.\");\n throw new Error(\"Transaction failed to confirm in time.\");\n };\n\n const result = await Promise.race([getStatus(), setTimeoutPromise(20000, `Transaction failed to confirm in time.`)]);\n\n if (result instanceof Error) {\n throw result;\n }\n\n return result;\n}\n","import type { Commitment, Connection, TransactionSignature, VersionedTransaction } from \"@solana/web3.js\";\nimport { ProcessTransactionError, ProcessTransactionErrorType } from \"~/errors\";\nimport type { TransactionOptions } from \"../../../common\";\nimport { confirmTransaction } from \"../transaction.service\";\n\ntype SendTransactionAsRpcProps = {\n versionedTransactions: VersionedTransaction[];\n connection: Connection;\n blockStrategy: {\n blockhash: string;\n lastValidBlockHeight: number;\n };\n isSequentialTxs: boolean;\n confirmCommitment?: Commitment;\n txOpts?: TransactionOptions;\n throwError?: boolean;\n onCallback?: (index: number, success: boolean, sig: string) => void;\n};\n\nexport async function sendTransactionAsBundleRpc({\n versionedTransactions,\n txOpts,\n connection,\n onCallback,\n blockStrategy: _blockStrategy,\n confirmCommitment,\n isSequentialTxs,\n throwError: _throwError = false,\n}: SendTransactionAsRpcProps): Promise<TransactionSignature[]> {\n let signatures: TransactionSignature[] = [];\n let hasValidationErrors = false;\n\n if (isSequentialTxs) {\n for (const [index, tx] of versionedTransactions.entries()) {\n let signature: TransactionSignature;\n\n try {\n signature = await connection.sendTransaction(tx, txOpts);\n } catch (error) {\n // Handle the specific \"fallthrough error ea\" and other sendTransaction errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (\n errorMessage.includes(\"Expected the value to satisfy a union\") ||\n errorMessage.includes(\"satisfy a union\")\n ) {\n console.warn(\"Transaction type validation error:\", errorMessage);\n // onCallback?.(index, true, \"\");\n hasValidationErrors = true;\n continue;\n } else {\n onCallback?.(index, false, \"\");\n throw error;\n }\n }\n\n if (signature) {\n try {\n await confirmTransaction(connection, signature, confirmCommitment);\n onCallback?.(index, true, signature);\n } catch (error) {\n onCallback?.(index, false, signature);\n throw error;\n }\n signatures.push(signature);\n }\n }\n\n // Throw user-friendly error if validation errors occurred\n if (hasValidationErrors) {\n onCallback?.(\n versionedTransactions.length,\n true,\n \"The transaction may have landed on-chain but confirmation failed.\",\n );\n\n signatures.push(\"The transaction may have landed on-chain but confirmation failed.\");\n }\n } else {\n signatures = await Promise.all(\n versionedTransactions.map(async (versionedTransaction, index) => {\n try {\n const signature = await connection.sendTransaction(versionedTransaction, txOpts);\n return signature;\n } catch (error) {\n // Handle the specific \"fallthrough error ea\" and other sendTransaction errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (\n errorMessage.includes(\"Expected the value to satisfy a union\") ||\n errorMessage.includes(\"satisfy a union\")\n ) {\n console.warn(\"Transaction type validation error:\", errorMessage);\n onCallback?.(index, false, \"\");\n hasValidationErrors = true;\n return \"\"; // Return empty signature to continue processing\n }\n // Re-throw other errors\n onCallback?.(index, false, \"\");\n throw error;\n }\n }),\n );\n\n // Filter out empty signatures from failed transactions\n signatures = signatures.filter((sig) => sig !== \"\");\n\n // Throw user-friendly error if validation errors occurred\n if (hasValidationErrors) {\n throw new ProcessTransactionError({\n message:\n \"Transaction confirmation failed. The transaction may have landed on-chain but confirmation failed. Please check your wallet and try again.\",\n type: ProcessTransactionErrorType.TransactionTupleError,\n });\n }\n\n await Promise.all(\n signatures.map(async (signature, index) => {\n try {\n const result = await confirmTransaction(connection, signature, confirmCommitment);\n onCallback?.(index, true, signature);\n return result;\n } catch (error) {\n onCallback?.(index, false, signature);\n throw error;\n }\n }),\n );\n }\n\n return signatures;\n}\n","import {\n ComputeBudgetProgram,\n PublicKey,\n type TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { LENDR_IDL, type LendrIdlType } from \"~/idl\";\nimport { makeTxPriorityIx } from \"~/models/account\";\nimport { makePriorityFeeMicroIx } from \"~/utils\";\nimport {\n addTransactionMetadata,\n decodeInstruction,\n decompileV0Transaction,\n getComputeBudgetUnits,\n getTxSize,\n isV0Tx,\n legacyTxToV0Tx,\n microLamportsToUi,\n type SolanaTransaction,\n TransactionArenaKeyMap,\n type TransactionBroadcastType,\n uiToMicroLamports,\n updateV0Tx,\n} from \"../../../common\";\n\n// Temporary imports\nexport const MAX_TX_SIZE = 1232;\nexport const BUNDLE_TX_SIZE = 81;\nexport const PRIORITY_TX_SIZE = 44;\n\nexport function isFlashloan(tx: SolanaTransaction): boolean {\n if (isV0Tx(tx)) {\n const addressLookupTableAccounts = tx.addressLookupTables ?? [];\n const message = decompileV0Transaction(tx, addressLookupTableAccounts);\n const idl = { ...LENDR_IDL, address: new PublicKey(0) } as unknown as LendrIdlType;\n const decoded = message.instructions.map((ix) => decodeInstruction(idl, ix.data));\n return decoded.some((ix) => ix?.name.toLowerCase().includes(\"flashloan\"));\n }\n //TODO: add legacy tx check\n return false;\n}\n\nfunction getFlashloanIndex(transactions: SolanaTransaction[]): number | null {\n for (const [index, transaction] of transactions.entries()) {\n if (isFlashloan(transaction)) {\n return index;\n }\n }\n return null;\n}\n\ntype FeeSettings = {\n priorityFeeMicro: number;\n bundleTipUi: number;\n feePayer: PublicKey;\n maxCapUi?: number;\n};\n\n/**\n * Formats a list of Solana transactions into versioned transactions, applying\n * necessary settings such as fees and blockhash. Optionally adds transaction tags.\n *\n * @param {SolanaTransaction[]} transactionsArg - The array of Solana transactions to format.\n * @param {TransactionBroadcastType} broadcastType - The type of transaction broadcast to use.\n * @param {string} blockhash - The recent blockhash to set for the transactions.\n * @param {FeeSettings} feeSettings - The settings for transaction fees, including priority fee and bundle tip.\n * @param {boolean} [addTransactionTags] - Optional flag to add transaction tags.\n * @returns {VersionedTransaction[]} - The array of formatted versioned transactions.\n */\nexport function formatTransactions(\n transactionsArg: SolanaTransaction[],\n broadcastType: TransactionBroadcastType,\n blockhash: string,\n feeSettings: FeeSettings,\n addTransactionTags?: boolean,\n): VersionedTransaction[] {\n const formattedTransactions: VersionedTransaction[] = [];\n const { priorityFeeMicro, bundleTipUi, feePayer, maxCapUi } = feeSettings;\n\n const flashloanIndex = getFlashloanIndex(transactionsArg);\n transactionsArg.forEach((tx) => {\n if (!isV0Tx(tx)) {\n tx.recentBlockhash = blockhash;\n tx.feePayer = feePayer;\n }\n });\n\n const transactions = addTransactionTags ? addTransactionTxTags(transactionsArg) : transactionsArg;\n\n const txSizes: number[] = transactions.map((tx) => getTxSize(tx));\n const dummyPriorityFeeIx = makePriorityFeeMicroIx(1);\n\n const priorityIxs: TransactionInstruction[] = [];\n const cuLimitIxs: (TransactionInstruction | undefined)[] = [];\n\n transactions.forEach((tx, _idx) => {\n const cu = tx.unitsConsumed ? Math.min(tx.unitsConsumed + 50_000, 1_400_000) : getComputeBudgetUnits(tx);\n const priorityFeeUi = maxCapUi\n ? Math.min(microLamportsToUi(priorityFeeMicro, cu), maxCapUi)\n : microLamportsToUi(priorityFeeMicro, cu);\n\n let updatedFees = uiToMicroLamports(priorityFeeUi, cu);\n // don't want to pay more than 0.1 SOL in fees\n if (priorityFeeUi > 0.1) {\n updatedFees = uiToMicroLamports(0.1, cu);\n }\n\n priorityIxs.push(broadcastType === \"BUNDLE\" ? dummyPriorityFeeIx : makePriorityFeeMicroIx(updatedFees));\n cuLimitIxs.push(cu ? ComputeBudgetProgram.setComputeUnitLimit({ units: cu }) : undefined);\n });\n\n const { bundleTipIx } = makeTxPriorityIx(\n feePayer,\n maxCapUi ? Math.min(bundleTipUi, maxCapUi) : bundleTipUi,\n broadcastType,\n );\n\n let bundleTipIndex = broadcastType === \"BUNDLE\" ? -1 : null; // if index is -1 in the end, then add bundle tx\n const priorityFeeIndexes: number[] = [];\n\n for (let i = 0; i < txSizes.length; i++) {\n let baseTxSize = txSizes[i];\n\n if (flashloanIndex !== i) {\n if (bundleTipIndex === -1 && txSizes[i] + BUNDLE_TX_SIZE < MAX_TX_SIZE) {\n baseTxSize += BUNDLE_TX_SIZE;\n bundleTipIndex = i;\n }\n }\n\n if (flashloanIndex === i || baseTxSize + PRIORITY_TX_SIZE < MAX_TX_SIZE) {\n priorityFeeIndexes.push(i);\n }\n }\n\n // no space for bundle tip, so add seperate tx\n if (bundleTipIndex === -1 && bundleTipIx) {\n const bundleTipMessage = new TransactionMessage({\n instructions: [bundleTipIx],\n payerKey: feePayer,\n recentBlockhash: blockhash,\n });\n\n formattedTransactions.push(new VersionedTransaction(bundleTipMessage.compileToV0Message()));\n }\n\n for (const [index, transaction] of transactions.entries()) {\n const hasFlashloan = flashloanIndex !== null; // check if there is a flashloan\n const isTxFlashloan = hasFlashloan && flashloanIndex === index; // check if the tx is the flashloan tx\n\n const signers = transaction.signers ?? [];\n const addressLookupTables = transaction.addressLookupTables ?? [];\n\n const requiredIxs: TransactionInstruction[] = [\n ...(bundleTipIndex === index && bundleTipIx ? [bundleTipIx] : []),\n ...(priorityFeeIndexes.includes(index) ? [priorityIxs[index]] : []),\n ...(cuLimitIxs[index] ? [cuLimitIxs[index]] : []),\n ];\n\n let newTransaction: VersionedTransaction;\n\n if (isV0Tx(transaction)) {\n newTransaction = updateV0Tx(transaction, {\n addressLookupTables,\n additionalIxs: requiredIxs,\n blockhash,\n replaceOnly: isTxFlashloan,\n });\n } else {\n newTransaction = legacyTxToV0Tx(transaction, {\n addressLookupTables,\n additionalIxs: requiredIxs,\n blockhash,\n replaceOnly: isTxFlashloan,\n });\n }\n\n newTransaction.sign(signers);\n formattedTransactions.push(newTransaction);\n }\n\n return formattedTransactions;\n}\n\nfunction addTransactionTxTags(transactions: SolanaTransaction[]): SolanaTransaction[] {\n const txWithTags: SolanaTransaction[] = [];\n\n for (const [_, tx] of transactions.entries()) {\n let solanaTx: SolanaTransaction = tx;\n const arenaKey = TransactionArenaKeyMap[tx.type];\n\n if (arenaKey) {\n if (isV0Tx(solanaTx)) {\n console.log(\"tx\", solanaTx);\n const addressLookupTableAccounts = solanaTx.addressLookupTables ?? [];\n const message = decompileV0Transaction(solanaTx, addressLookupTableAccounts);\n\n message.instructions[0].keys.push({\n pubkey: arenaKey,\n isSigner: false,\n isWritable: false,\n });\n solanaTx = addTransactionMetadata(\n new VersionedTransaction(message.compileToV0Message(tx.addressLookupTables)),\n {\n signers: solanaTx.signers,\n addressLookupTables: solanaTx.addressLookupTables,\n type: solanaTx.type,\n unitsConsumed: solanaTx.unitsConsumed,\n },\n );\n } else {\n solanaTx.instructions[0].keys.push({\n pubkey: arenaKey,\n isSigner: false,\n isWritable: false,\n });\n }\n }\n txWithTags.push(solanaTx);\n }\n return txWithTags;\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport { LendrRequirementType } from \"~/models/account\";\nimport {\n type BankType,\n computeAssetUsdValue,\n computeInterestRates,\n computeLiabilityUsdValue,\n getAssetQuantity,\n getLiabilityQuantity,\n} from \"~/services/bank\";\nimport { type OraclePrice, PriceBias } from \"~/services/price\";\nimport { findPoolAddress, findPoolMintAddress, findPoolStakeAddress } from \"~/vendor/single-spl-pool\";\nimport {\n aprToApy,\n type BankExtendedMetadata,\n type BankMetadataMap,\n composeRemainingAccounts,\n nativeToUi,\n shortenAddress,\n} from \"../../../common\";\n\nimport type { BalanceType, LendrAccountType } from \"../types\";\n\n/**\n * Lendr Account Computes\n * =========================\n */\n\nexport function computeFreeCollateral(lendrAccount: LendrAccountType, opts?: { clamped?: boolean }): BigNumber {\n const _clamped = opts?.clamped ?? true;\n\n const { assets, liabilities } = computeHealthComponents(lendrAccount, LendrRequirementType.Initial);\n\n const signedFreeCollateral = assets.minus(liabilities);\n\n return _clamped ? BigNumber.max(0, signedFreeCollateral) : signedFreeCollateral;\n}\n\nexport function computeFreeCollateralLegacy(\n activeBalances: BalanceType[],\n banks: Map<string, BankType>,\n oraclePrices: Map<string, OraclePrice>,\n opts?: { clamped?: boolean },\n): BigNumber {\n const _clamped = opts?.clamped ?? true;\n\n const { assets, liabilities } = computeHealthComponentsLegacy(\n activeBalances,\n banks,\n oraclePrices,\n LendrRequirementType.Initial,\n [],\n );\n\n const signedFreeCollateral = assets.minus(liabilities);\n\n return _clamped ? BigNumber.max(0, signedFreeCollateral) : signedFreeCollateral;\n}\n\nexport function computeHealthComponents(\n lendrAccount: LendrAccountType,\n lendrReqType: LendrRequirementType,\n): {\n assets: BigNumber;\n liabilities: BigNumber;\n} {\n // check if health cache failed\n switch (lendrReqType) {\n case LendrRequirementType.Equity:\n return {\n assets: lendrAccount.healthCache.assetValueEquity,\n liabilities: lendrAccount.healthCache.liabilityValueEquity,\n };\n case LendrRequirementType.Initial:\n return {\n assets: lendrAccount.healthCache.assetValue,\n liabilities: lendrAccount.healthCache.liabilityValue,\n };\n case LendrRequirementType.Maintenance:\n return {\n assets: lendrAccount.healthCache.assetValueMaint,\n liabilities: lendrAccount.healthCache.liabilityValueMaint,\n };\n }\n}\n\nexport function computeHealthComponentsLegacy(\n activeBalances: BalanceType[],\n banks: Map<string, BankType>,\n oraclePrices: Map<string, OraclePrice>,\n lendrReqType: LendrRequirementType,\n excludedBanks: PublicKey[] = [],\n): {\n assets: BigNumber;\n liabilities: BigNumber;\n} {\n const filteredBalances = activeBalances.filter(\n (accountBalance) => !excludedBanks.find((b) => b.equals(accountBalance.bankPk)),\n );\n\n const [assets, liabilities] = filteredBalances\n .map((accountBalance) => {\n const bank = banks.get(accountBalance.bankPk.toBase58());\n if (!bank) {\n console.warn(`Bank ${shortenAddress(accountBalance.bankPk)} not found, excluding from health computation`);\n return [new BigNumber(0), new BigNumber(0)];\n }\n\n const priceInfo = oraclePrices.get(accountBalance.bankPk.toBase58());\n if (!priceInfo) {\n console.warn(\n `Price info for bank ${shortenAddress(accountBalance.bankPk)} not found, excluding from health computation`,\n );\n return [new BigNumber(0), new BigNumber(0)];\n }\n\n const { assets, liabilities } = getBalanceUsdValueWithPriceBias(accountBalance, bank, priceInfo, lendrReqType);\n return [assets, liabilities];\n })\n .reduce(\n ([asset, liability], [d, l]) => {\n return [asset.plus(d), liability.plus(l)];\n },\n [new BigNumber(0), new BigNumber(0)],\n );\n\n return { assets, liabilities };\n}\n\nexport function computeHealthComponentsWithoutBiasLegacy(\n activeBalances: BalanceType[],\n banks: Map<string, BankType>,\n oraclePrices: Map<string, OraclePrice>,\n lendrReqType: LendrRequirementType,\n): {\n assets: BigNumber;\n liabilities: BigNumber;\n} {\n const [assets, liabilities] = activeBalances\n .map((accountBalance) => {\n const bank = banks.get(accountBalance.bankPk.toBase58());\n if (!bank) {\n console.warn(`Bank ${shortenAddress(accountBalance.bankPk)} not found, excluding from health computation`);\n return [new BigNumber(0), new BigNumber(0)];\n }\n\n const priceInfo = oraclePrices.get(accountBalance.bankPk.toBase58());\n if (!priceInfo) {\n console.warn(\n `Price info for bank ${shortenAddress(accountBalance.bankPk)} not found, excluding from health computation`,\n );\n return [new BigNumber(0), new BigNumber(0)];\n }\n\n const { assets, liabilities } = computeBalanceUsdValue(accountBalance, bank, priceInfo, lendrReqType);\n return [assets, liabilities];\n })\n .reduce(\n ([asset, liability], [d, l]) => {\n return [asset.plus(d), liability.plus(l)];\n },\n [new BigNumber(0), new BigNumber(0)],\n );\n\n return { assets, liabilities };\n}\n\nexport function computeAccountValue(lendrAccount: LendrAccountType): BigNumber {\n const { assets, liabilities } = computeHealthComponents(lendrAccount, LendrRequirementType.Equity);\n return assets.minus(liabilities);\n}\n\nexport function computeNetApy(\n lendrAccount: LendrAccountType,\n activeBalances: BalanceType[],\n banks: Map<string, BankType>,\n oraclePrices: Map<string, OraclePrice>,\n): number {\n const { assets, liabilities } = computeHealthComponents(lendrAccount, LendrRequirementType.Equity);\n const totalUsdValue = assets.minus(liabilities);\n const apr = activeBalances\n .reduce((weightedApr, balance) => {\n const bank = banks.get(balance.bankPk.toBase58());\n if (!bank) {\n console.warn(`Bank ${shortenAddress(balance.bankPk)} not found, excluding from APY computation`);\n return weightedApr;\n }\n\n const priceInfo = oraclePrices.get(balance.bankPk.toBase58());\n if (!priceInfo) {\n console.warn(`Price info for bank ${shortenAddress(balance.bankPk)} not found, excluding from APY computation`);\n return weightedApr;\n }\n\n return weightedApr\n .minus(\n computeInterestRates(bank)\n .borrowingRate.times(\n computeBalanceUsdValue(balance, bank, priceInfo, LendrRequirementType.Equity).liabilities,\n )\n .div(totalUsdValue.isEqualTo(0) ? 1 : totalUsdValue),\n )\n .plus(\n computeInterestRates(bank)\n .lendingRate.times(computeBalanceUsdValue(balance, bank, priceInfo, LendrRequirementType.Equity).assets)\n .div(totalUsdValue.isEqualTo(0) ? 1 : totalUsdValue),\n );\n }, new BigNumber(0))\n .toNumber();\n\n return aprToApy(apr);\n}\n\n/**\n * Lendr Balance Computes\n * =========================\n */\n\nexport function computeBalanceUsdValue(\n balance: BalanceType,\n bank: BankType,\n oraclePrice: OraclePrice,\n lendrRequirementType: LendrRequirementType,\n): {\n assets: BigNumber;\n liabilities: BigNumber;\n} {\n const assetsValue = computeAssetUsdValue(\n bank,\n oraclePrice,\n balance.assetShares,\n lendrRequirementType,\n PriceBias.None,\n );\n const liabilitiesValue = computeLiabilityUsdValue(\n bank,\n oraclePrice,\n balance.liabilityShares,\n lendrRequirementType,\n PriceBias.None,\n );\n return { assets: assetsValue, liabilities: liabilitiesValue };\n}\n\nexport function getBalanceUsdValueWithPriceBias(\n balance: BalanceType,\n bank: BankType,\n oraclePrice: OraclePrice,\n lendrRequirementType: LendrRequirementType,\n): {\n assets: BigNumber;\n liabilities: BigNumber;\n} {\n const assetsValue = computeAssetUsdValue(\n bank,\n oraclePrice,\n balance.assetShares,\n lendrRequirementType,\n PriceBias.Lowest,\n );\n const liabilitiesValue = computeLiabilityUsdValue(\n bank,\n oraclePrice,\n balance.liabilityShares,\n lendrRequirementType,\n PriceBias.Highest,\n );\n return { assets: assetsValue, liabilities: liabilitiesValue };\n}\n\nexport function computeQuantity(\n balance: BalanceType,\n bank: BankType,\n): {\n assets: BigNumber;\n liabilities: BigNumber;\n} {\n const assetsQuantity = getAssetQuantity(bank, balance.assetShares);\n const liabilitiesQuantity = getLiabilityQuantity(bank, balance.liabilityShares);\n return { assets: assetsQuantity, liabilities: liabilitiesQuantity };\n}\n\nexport function computeQuantityUi(\n balance: BalanceType,\n bank: BankType,\n): {\n assets: BigNumber;\n liabilities: BigNumber;\n} {\n const assetsQuantity = new BigNumber(nativeToUi(getAssetQuantity(bank, balance.assetShares), bank.mintDecimals));\n const liabilitiesQuantity = new BigNumber(\n nativeToUi(getLiabilityQuantity(bank, balance.liabilityShares), bank.mintDecimals),\n );\n return { assets: assetsQuantity, liabilities: liabilitiesQuantity };\n}\n\nexport function computeClaimedEmissions(balance: BalanceType, bank: BankType, currentTimestamp: number): BigNumber {\n const lendingActive = bank.emissionsActiveLending;\n const borrowActive = bank.emissionsActiveBorrowing;\n\n const { assets, liabilities } = computeQuantity(balance, bank);\n\n let balanceAmount: BigNumber | null = null;\n\n if (lendingActive) {\n balanceAmount = assets;\n } else if (borrowActive) {\n balanceAmount = liabilities;\n }\n\n if (balanceAmount) {\n const lastUpdate = balance.lastUpdate;\n const period = new BigNumber(currentTimestamp - lastUpdate);\n const emissionsRate = new BigNumber(bank.emissionsRate);\n const emissions = period\n .times(balanceAmount)\n .times(emissionsRate)\n .div(31_536_000 * 10 ** bank.mintDecimals);\n const emissionsReal = BigNumber.min(emissions, new BigNumber(bank.emissionsRemaining));\n\n return emissionsReal;\n }\n\n return new BigNumber(0);\n}\n\nexport function computeTotalOutstandingEmissions(balance: BalanceType, bank: BankType): BigNumber {\n const claimedEmissions = balance.emissionsOutstanding;\n const unclaimedEmissions = computeClaimedEmissions(balance, bank, Date.now() / 1000);\n return claimedEmissions.plus(unclaimedEmissions);\n}\n\nexport function computeHealthCheckAccounts(\n balances: BalanceType[],\n banks: Map<string, BankType>,\n mandatoryBanks: PublicKey[] = [],\n excludedBanks: PublicKey[] = [],\n): BankType[] {\n const activeBalances = balances.filter((b) => b.active);\n\n const mandatoryBanksSet = new Set(mandatoryBanks.map((b) => b.toBase58()));\n const excludedBanksSet = new Set(excludedBanks.map((b) => b.toBase58()));\n const activeBanks = new Set(activeBalances.map((b) => b.bankPk.toBase58()));\n const banksToAdd = new Set([...mandatoryBanksSet].filter((x) => !activeBanks.has(x)));\n\n let slotsToKeep = banksToAdd.size;\n const projectedActiveBanks = balances\n .filter((balance) => {\n if (balance.active) {\n return !excludedBanksSet.has(balance.bankPk.toBase58());\n } else if (slotsToKeep > 0) {\n slotsToKeep--;\n return true;\n } else {\n return false;\n }\n })\n .map((balance) => {\n if (balance.active) {\n const bank = banks.get(balance.bankPk.toBase58());\n if (!bank) throw Error(`Bank ${balance.bankPk.toBase58()} not found`);\n return bank;\n }\n const newBankAddress = [...banksToAdd.values()][0];\n banksToAdd.delete(newBankAddress);\n const bank = banks.get(newBankAddress);\n if (!bank) throw Error(`Bank ${newBankAddress} not found`);\n return bank;\n });\n\n return projectedActiveBanks;\n}\n\nexport function computeHealthAccountMetas(\n banksToInclude: BankType[],\n // TODO)) remove\n bankMetadataMap?: BankMetadataMap,\n enableSorting = true,\n bankExtendedMetadata?: BankExtendedMetadata,\n): PublicKey[] {\n const wrapperFn = enableSorting\n ? composeRemainingAccounts\n : (banksAndOracles: PublicKey[][]) => banksAndOracles.flat();\n\n const accounts = wrapperFn(\n banksToInclude.map((bank) => {\n const keys = [bank.address, bank.oracleKey];\n\n // for staked collateral banks (assetTag === 2), include additional accounts\n if (bank.config.assetTag === 2) {\n // TODO))\n if (!bankMetadataMap && !bankExtendedMetadata) {\n throw Error(`No bank metadata for ${bank.address.toBase58()} provided`);\n }\n\n const bankMetadata = bankExtendedMetadata ?? bankMetadataMap?.[bank.address.toBase58()];\n const validatorVoteAccount = bankMetadata?.validatorVoteAccount;\n\n if (!validatorVoteAccount) {\n throw Error(`no validatorVoteAccount on Bank metadata: ${bank.address.toBase58()}`);\n }\n\n const pool = findPoolAddress(new PublicKey(validatorVoteAccount));\n const solPool = findPoolStakeAddress(pool);\n const lstMint = findPoolMintAddress(pool);\n\n keys.push(lstMint, solPool);\n }\n\n return keys;\n }),\n );\n\n return accounts;\n}\n","import type { PublicKey } from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\n\nimport {\n type BalanceRaw,\n type BalanceType,\n computeBalanceUsdValue,\n computeClaimedEmissions,\n computeQuantity,\n computeQuantityUi,\n computeTotalOutstandingEmissions,\n getBalanceUsdValueWithPriceBias,\n LendrRequirementType,\n type OraclePrice,\n parseBalanceRaw,\n} from \"..\";\nimport type { Bank } from \"./bank\";\n\n// ----------------------------------------------------------------------------\n// Client types\n// ----------------------------------------------------------------------------\n\nclass Balance implements BalanceType {\n constructor(\n public active: boolean,\n public bankPk: PublicKey,\n public assetShares: BigNumber,\n public liabilityShares: BigNumber,\n public emissionsOutstanding: BigNumber,\n public lastUpdate: number,\n ) {}\n\n static from(balanceRaw: BalanceRaw): Balance {\n const props = parseBalanceRaw(balanceRaw);\n return new Balance(\n props.active,\n props.bankPk,\n props.assetShares,\n props.liabilityShares,\n props.emissionsOutstanding,\n props.lastUpdate,\n );\n }\n\n static fromBalanceType(balance: BalanceType): Balance {\n return new Balance(\n balance.active,\n balance.bankPk,\n balance.assetShares,\n balance.liabilityShares,\n balance.emissionsOutstanding,\n balance.lastUpdate,\n );\n }\n\n static createEmpty(bankPk: PublicKey): Balance {\n return new Balance(false, bankPk, new BigNumber(0), new BigNumber(0), new BigNumber(0), 0);\n }\n\n computeUsdValue(\n bank: Bank,\n oraclePrice: OraclePrice,\n lendrRequirementType = LendrRequirementType.Equity,\n ): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return computeBalanceUsdValue(this, bank, oraclePrice, lendrRequirementType);\n }\n\n getUsdValueWithPriceBias(\n bank: Bank,\n oraclePrice: OraclePrice,\n lendrRequirementType = LendrRequirementType.Equity,\n ): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return getBalanceUsdValueWithPriceBias(this, bank, oraclePrice, lendrRequirementType);\n }\n\n computeQuantity(bank: Bank): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return computeQuantity(this, bank);\n }\n\n computeQuantityUi(bank: Bank): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return computeQuantityUi(this, bank);\n }\n\n computeTotalOutstandingEmissions(bank: Bank): BigNumber {\n return computeTotalOutstandingEmissions(this, bank);\n }\n\n computeClaimedEmissions(bank: Bank, currentTimestamp: number): BigNumber {\n return computeClaimedEmissions(this, bank, currentTimestamp);\n }\n\n describe(bank: Bank, oraclePrice: OraclePrice): string {\n const { assets: assetsQt, liabilities: liabsQt } = this.computeQuantityUi(bank);\n const { assets: assetsUsd, liabilities: liabsUsd } = this.computeUsdValue(\n bank,\n oraclePrice,\n LendrRequirementType.Equity,\n );\n\n return `> ${bank.tokenSymbol ?? bank.address} balance:\n\\t- Deposits: ${assetsQt.toFixed(5)} (${assetsUsd.toFixed(5)} USD)\n\\t- Borrows: ${liabsQt.toFixed(5)} (${liabsUsd.toFixed(5)} USD)\n`;\n }\n}\n\nexport { Balance };\n","import type { PublicKey } from \"@solana/web3.js\";\nimport type BigNumber from \"bignumber.js\";\n\nexport interface BalanceType {\n active: boolean;\n bankPk: PublicKey;\n assetShares: BigNumber;\n liabilityShares: BigNumber;\n emissionsOutstanding: BigNumber;\n lastUpdate: number;\n}\n\nexport enum HealthCacheFlags {\n /**\n * If set (1), the account is considered healthy and cannot be liquidated.\n * If not set (0), the account is unhealthy and can be liquidated.\n */\n HEALTHY = 1 << 0, // 1\n /**\n * If set (1), the engine did not error during the last health pulse.\n * If not set (0), the engine would have errored and this cache is likely invalid.\n * `RiskEngineInitRejected` is ignored and will allow the flag to be set anyways.\n */\n ENGINE_STATUS_OK = 1 << 1, // 2\n /**\n * If set (1), the engine did not error due to an oracle issue.\n * If not set (0), engine was passed a bad bank or oracle account, or an oracle was stale.\n * Check the order in which accounts were passed and ensure each balance has the correct banks/oracles,\n * and that oracle cranks ran recently enough. Check `internal_err` and `err_index` for more details\n * in some circumstances. Invalid if generated after borrow/withdraw (these instructions will\n * ignore oracle issues if health is still satisfactory with some balance zeroed out).\n */\n ORACLE_OK = 1 << 2, // 4\n}\n\nexport interface HealthCacheType {\n assetValue: BigNumber;\n liabilityValue: BigNumber;\n assetValueMaint: BigNumber;\n liabilityValueMaint: BigNumber;\n assetValueEquity: BigNumber;\n liabilityValueEquity: BigNumber;\n timestamp: BigNumber;\n flags: HealthCacheFlags[];\n prices: number[][];\n simulationFailed?: boolean;\n}\n\nexport interface LendrAccountType {\n address: PublicKey;\n group: PublicKey;\n authority: PublicKey;\n balances: BalanceType[];\n accountFlags: AccountFlags[];\n emissionsDestinationAccount: PublicKey;\n healthCache: HealthCacheType;\n}\n\nexport enum AccountFlags {\n ACCOUNT_DISABLED = 1 << 0, // 1\n ACCOUNT_IN_FLASHLOAN = 1 << 1, // 2\n ACCOUNT_FLAG_DEPRECATED = 1 << 2, // 4\n ACCOUNT_TRANSFER_AUTHORITY_ALLOWED = 1 << 3, // 8\n}\n","import { BorshCoder } from \"@coral-xyz/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport BN from \"bn.js\";\nimport type { LendrIdlType } from \"~/idl\";\n\nimport { Balance } from \"~/models/balance\";\nimport { HealthCache } from \"~/models/health-cache\";\nimport { AccountType } from \"~/types\";\nimport { wrappedI80F48toBigNumber } from \"../../../common\";\n\nimport {\n AccountFlags,\n type BalanceRaw,\n type BalanceType,\n type BalanceTypeDto,\n HealthCacheFlags,\n type HealthCacheType,\n type HealthCacheTypeDto,\n type LendrAccountRaw,\n type LendrAccountType,\n type LendrAccountTypeDto,\n} from \"../types\";\n\nexport function decodeAccountRaw(encoded: Buffer, idl: LendrIdlType): LendrAccountRaw {\n const coder = new BorshCoder(idl);\n return coder.accounts.decode(AccountType.LendrAccount, encoded);\n}\n\nexport function parseBalanceRaw(balanceRaw: BalanceRaw): BalanceType {\n const active = typeof balanceRaw.active === \"number\" ? balanceRaw.active === 1 : balanceRaw.active;\n const bankPk = balanceRaw.bankPk;\n const assetShares = wrappedI80F48toBigNumber(balanceRaw.assetShares);\n const liabilityShares = wrappedI80F48toBigNumber(balanceRaw.liabilityShares);\n const emissionsOutstanding = wrappedI80F48toBigNumber(balanceRaw.emissionsOutstanding);\n const lastUpdate = balanceRaw.lastUpdate.toNumber();\n\n return {\n active,\n bankPk,\n assetShares,\n liabilityShares,\n emissionsOutstanding,\n lastUpdate,\n };\n}\n\nexport function parseLendrAccountRaw(lendrAccountPk: PublicKey, accountData: LendrAccountRaw) {\n const address = lendrAccountPk;\n const group = accountData.group;\n const authority = accountData.authority;\n const balances = accountData.lendingAccount.balances.map(Balance.from);\n const accountFlags = getActiveAccountFlags(accountData.accountFlags);\n const emissionsDestinationAccount = accountData.emissionsDestinationAccount;\n const healthCache = HealthCache.from(accountData.healthCache);\n\n return {\n address,\n group,\n authority,\n balances,\n accountFlags,\n emissionsDestinationAccount,\n healthCache,\n };\n}\n\n/**\n * Get all active account flags as an array of flag names\n */\nexport function getActiveAccountFlags(flags: BN): AccountFlags[] {\n const activeFlags: AccountFlags[] = [];\n\n Object.keys(AccountFlags)\n .filter((key) => Number.isNaN(Number(key))) // Only get the string keys (not the reverse mapping)\n .forEach((key) => {\n const flag = AccountFlags[key as keyof typeof AccountFlags];\n if (typeof flag === \"number\" && hasAccountFlag(flags, flag)) {\n activeFlags.push(flag);\n }\n });\n\n return activeFlags;\n}\n\n/**\n * Check if an account flag is set\n */\nexport function hasAccountFlag(flags: BN, flag: number): boolean {\n return !flags.and(new BN(flag)).isZero();\n}\n\n/**\n * Convert on-chain health cache flags (BN) to an array of HealthCacheFlags enum values\n *\n * According to the IDL, health cache flags are defined as:\n * - HEALTHY = 1 (bit 0) - If set, the account cannot be liquidated\n * - ENGINE_STATUS_OK = 2 (bit 1) - If set, the engine did not error during health calculation\n * - ORACLE_OK = 4 (bit 2) - If set, the engine did not encounter oracle issues\n */\nexport function getActiveHealthCacheFlags(flags: number): HealthCacheFlags[] {\n const activeFlags: HealthCacheFlags[] = [];\n\n // Check each flag bit\n if (hasHealthCacheFlag(flags, HealthCacheFlags.HEALTHY)) {\n activeFlags.push(HealthCacheFlags.HEALTHY);\n }\n\n if (hasHealthCacheFlag(flags, HealthCacheFlags.ENGINE_STATUS_OK)) {\n activeFlags.push(HealthCacheFlags.ENGINE_STATUS_OK);\n }\n\n if (hasHealthCacheFlag(flags, HealthCacheFlags.ORACLE_OK)) {\n activeFlags.push(HealthCacheFlags.ORACLE_OK);\n }\n\n return activeFlags;\n}\n\n/**\n * Check if a health cache flag is set\n */\nexport function hasHealthCacheFlag(flags: number, flag: HealthCacheFlags): boolean {\n return (flags & flag) !== 0;\n}\n\n/**\n * Convert numeric health cache flags to a human-readable status message\n */\nexport function getHealthCacheStatusDescription(flags: number): string {\n const activeFlags = getActiveHealthCacheFlags(flags);\n\n // Check for critical conditions first\n if (!activeFlags.includes(HealthCacheFlags.HEALTHY)) {\n return \"UNHEALTHY: Account is eligible for liquidation\";\n }\n\n if (!activeFlags.includes(HealthCacheFlags.ENGINE_STATUS_OK)) {\n return \"ERROR: Risk engine encountered an error during health calculation\";\n }\n\n if (!activeFlags.includes(HealthCacheFlags.ORACLE_OK)) {\n return \"WARNING: Oracle price data may be stale or invalid\";\n }\n\n // All good\n if (activeFlags.length === 3) {\n return \"HEALTHY: Account is in good standing\";\n }\n\n // Default case (shouldn't happen often)\n return `Status flags: ${activeFlags.join(\", \")}`;\n}\n\nexport function dtoToLendrAccount(lendrAccountDto: LendrAccountTypeDto): LendrAccountType {\n return {\n address: new PublicKey(lendrAccountDto.address),\n group: new PublicKey(lendrAccountDto.group),\n authority: new PublicKey(lendrAccountDto.authority),\n balances: lendrAccountDto.balances.map(dtoToBalance),\n accountFlags: lendrAccountDto.accountFlags,\n emissionsDestinationAccount: new PublicKey(lendrAccountDto.emissionsDestinationAccount),\n healthCache: dtoToHealthCache(lendrAccountDto.healthCache),\n };\n}\n\nexport function dtoToBalance(balanceDto: BalanceTypeDto): BalanceType {\n return {\n active: balanceDto.active,\n bankPk: new PublicKey(balanceDto.bankPk),\n assetShares: new BigNumber(balanceDto.assetShares),\n liabilityShares: new BigNumber(balanceDto.liabilityShares),\n emissionsOutstanding: new BigNumber(balanceDto.emissionsOutstanding),\n lastUpdate: balanceDto.lastUpdate,\n };\n}\n\nexport function dtoToHealthCache(healthCacheDto: HealthCacheTypeDto): HealthCacheType {\n return {\n assetValue: new BigNumber(healthCacheDto.assetValue),\n liabilityValue: new BigNumber(healthCacheDto.liabilityValue),\n assetValueMaint: new BigNumber(healthCacheDto.assetValueMaint),\n liabilityValueMaint: new BigNumber(healthCacheDto.liabilityValueMaint),\n assetValueEquity: new BigNumber(healthCacheDto.assetValueEquity),\n liabilityValueEquity: new BigNumber(healthCacheDto.liabilityValueEquity),\n timestamp: new BigNumber(healthCacheDto.timestamp),\n flags: healthCacheDto.flags,\n prices: healthCacheDto.prices,\n simulationFailed: healthCacheDto.simulationFailed,\n };\n}\n","import type { PublicKey } from \"@solana/web3.js\";\nimport type BigNumber from \"bignumber.js\";\n\nimport {\n type ActionEmodeImpact,\n type ActiveEmodePair,\n type EmodeImpact,\n EmodeImpactStatus,\n type EmodePair,\n EmodeTag,\n} from \"~/services/bank\";\n\nexport function computeEmodeImpacts(\n emodePairs: EmodePair[],\n activeLiabilities: PublicKey[],\n activeCollateral: PublicKey[],\n allBanks: PublicKey[],\n): Record<string, ActionEmodeImpact> {\n const toKey = (k: PublicKey) => k.toBase58();\n\n // Baseline state\n const basePairs = computeActiveEmodePairs(emodePairs, activeLiabilities, activeCollateral);\n const baseOn = basePairs.length > 0;\n\n // Liability tag map & existing tags\n const liabTagMap = new Map<string, string>();\n for (const p of emodePairs) {\n liabTagMap.set(p.liabilityBank.toBase58(), p.liabilityBankTag.toString());\n }\n const existingTags = new Set<string>(\n activeLiabilities.map((l) => liabTagMap.get(l.toBase58())).filter((t): t is string => !!t),\n );\n\n // Helper for min initial weight (used in diffState only)\n function minWeight(ps: EmodePair[]): BigNumber {\n let m = ps[0].assetWeightInit;\n for (const x of ps) if (x.assetWeightInit.lt(m)) m = x.assetWeightInit;\n return m;\n }\n\n // Determine status transitions\n function diffState(before: EmodePair[], after: EmodePair[]): EmodeImpactStatus {\n const was = before.length > 0,\n isOn = after.length > 0;\n if (!was && !isOn) return EmodeImpactStatus.InactiveEmode;\n if (!was && isOn) return EmodeImpactStatus.ActivateEmode;\n if (was && !isOn) return EmodeImpactStatus.RemoveEmode;\n\n const bMin = minWeight(before),\n aMin = minWeight(after);\n if (aMin.gt(bMin)) return EmodeImpactStatus.IncreaseEmode;\n if (aMin.lt(bMin)) return EmodeImpactStatus.ReduceEmode;\n return EmodeImpactStatus.ExtendEmode;\n }\n\n // Simulation of each action\n function simulate(bank: PublicKey, action: \"borrow\" | \"repay\" | \"supply\" | \"withdraw\"): EmodeImpact {\n let L = [...activeLiabilities],\n C = [...activeCollateral];\n switch (action) {\n case \"borrow\":\n if (!L.some((x) => x.equals(bank))) L.push(bank);\n break;\n case \"repay\":\n L = L.filter((x) => !x.equals(bank));\n break;\n case \"supply\":\n if (!C.some((x) => x.equals(bank))) C.push(bank);\n break;\n case \"withdraw\":\n C = C.filter((x) => !x.equals(bank));\n break;\n }\n\n const after = computeActiveEmodePairs(emodePairs, L, C);\n let status = diffState(basePairs, after);\n\n // Borrow override\n if (action === \"borrow\") {\n const tag = liabTagMap.get(bank.toBase58());\n\n // Borrowing an unconfigured bank => EMODE off / inactive\n if (!tag) {\n status = baseOn ? EmodeImpactStatus.RemoveEmode : EmodeImpactStatus.InactiveEmode;\n\n // EMODE was ON; keep the diffState result unless EMODE really turns OFF\n } else if (baseOn) {\n if (after.length === 0) {\n status = EmodeImpactStatus.RemoveEmode;\n } else if (existingTags.has(tag)) {\n status = EmodeImpactStatus.ExtendEmode; // same tag ⇒ extend\n // else keep diffState (Increase/Reduce) which is already correct\n }\n }\n }\n\n // Supply override\n if (action === \"supply\") {\n const isOn = after.length > 0;\n status =\n !baseOn && isOn\n ? EmodeImpactStatus.ActivateEmode\n : baseOn && isOn\n ? EmodeImpactStatus.ExtendEmode\n : EmodeImpactStatus.InactiveEmode;\n }\n\n // Withdraw override\n if (action === \"withdraw\") {\n if (!baseOn) {\n status = EmodeImpactStatus.InactiveEmode;\n } else if (after.length === 0) {\n status = EmodeImpactStatus.RemoveEmode;\n } else {\n const b = minWeight(basePairs),\n a = minWeight(after);\n if (a.gt(b)) status = EmodeImpactStatus.IncreaseEmode;\n else if (a.lt(b)) status = EmodeImpactStatus.ReduceEmode;\n else status = EmodeImpactStatus.ExtendEmode;\n }\n }\n\n // Find the pair with lowest assetWeightInit and grab its maint weight\n let bestPair: EmodePair | undefined;\n if (after.length > 0) {\n bestPair = after[0];\n for (const p of after) {\n if (p.assetWeightInit.lt(bestPair.assetWeightInit)) {\n bestPair = p;\n }\n }\n }\n\n const activeEmodePair: ActiveEmodePair | undefined = bestPair\n ? {\n collateralBanks: Array.from(\n new Map(after.flatMap((p) => p.collateralBanks).map((bank) => [bank.toBase58(), bank])).values(),\n ),\n collateralBankTags: Array.from(new Set(after.flatMap((p) => p.collateralBankTag))),\n liabilityBanks: Array.from(\n new Map(after.flatMap((p) => p.liabilityBank).map((bank) => [bank.toBase58(), bank])).values(),\n ),\n liabilityBankTags: Array.from(new Set(after.flatMap((p) => p.liabilityBankTag))),\n assetWeightMaint: bestPair.assetWeightMaint,\n assetWeightInit: bestPair.assetWeightInit,\n }\n : undefined;\n\n return {\n status,\n resultingPairs: after,\n activePair: activeEmodePair,\n };\n }\n\n // Run simulations across allBanks\n const result: Record<string, ActionEmodeImpact> = {};\n for (const bank of allBanks) {\n const key = toKey(bank);\n const impact: ActionEmodeImpact = {};\n\n // Only new borrows\n if (!activeCollateral.some((x) => x.equals(bank))) {\n impact.borrowImpact = simulate(bank, \"borrow\");\n }\n\n // Only supply for collateral-configured banks not in play\n const collSet = new Set(emodePairs.flatMap((p) => p.collateralBanks.map((c) => c.toBase58())));\n if (\n collSet.has(key) &&\n !activeCollateral.some((x) => x.equals(bank)) &&\n !activeLiabilities.some((x) => x.equals(bank))\n ) {\n impact.supplyImpact = simulate(bank, \"supply\");\n }\n\n if (activeLiabilities.some((x) => x.equals(bank))) {\n impact.repayAllImpact = simulate(bank, \"repay\");\n }\n if (activeCollateral.some((x) => x.equals(bank))) {\n impact.withdrawAllImpact = simulate(bank, \"withdraw\");\n }\n\n result[key] = impact;\n }\n\n return result;\n}\n\nexport function computeActiveEmodePairs(\n emodePairs: EmodePair[],\n activeLiabilities: PublicKey[],\n activeCollateral: PublicKey[],\n): EmodePair[] {\n // 1) Drop any pairs with an “unset” tag (0)\n const configured = emodePairs.filter(\n (p) => p.collateralBankTag !== EmodeTag.UNSET && p.liabilityBankTag !== EmodeTag.UNSET,\n );\n\n // 2) Build the set of required liability‐tags from _all_ active liabilities\n // If any liability has no configured entry at all, EMODE is off.\n const liabTagByBank = new Map<string, string>();\n for (const p of configured) {\n liabTagByBank.set(p.liabilityBank.toBase58(), p.liabilityBankTag.toString());\n }\n const requiredTags = new Set<string>();\n for (const liab of activeLiabilities) {\n const tag = liabTagByBank.get(liab.toBase58());\n if (!tag) {\n // a liability with no entries kills EMODE immediately\n return [];\n }\n requiredTags.add(tag);\n }\n\n // 3) Of those configured pairs, keep only ones touching both an active liability AND collateral\n const possible = configured.filter(\n (p) =>\n activeLiabilities.some((l) => l.equals(p.liabilityBank)) &&\n p.collateralBanks.some((c) => activeCollateral.some((a) => a.equals(c))),\n );\n if (possible.length === 0) return [];\n\n // 4) Group by collateral-tag\n const byCollTag: Record<string, EmodePair[]> = {};\n for (const p of possible) {\n const ct = p.collateralBankTag.toString();\n if (!byCollTag[ct]) {\n byCollTag[ct] = [];\n }\n byCollTag[ct].push(p);\n }\n\n // 5) Return the group whose liability-tags cover _every_ requiredTag\n const validGroups: EmodePair[][] = [];\n\n for (const group of Object.values(byCollTag)) {\n const supports = new Set(group.map((p) => p.liabilityBankTag.toString()));\n let coversAll = true;\n for (const rt of requiredTags) {\n if (!supports.has(rt)) {\n coversAll = false;\n break;\n }\n }\n if (coversAll) {\n validGroups.push(group);\n }\n }\n\n // 6) Nothing can cover all liabilities → EMODE off\n if (validGroups.length === 0) return [];\n\n return validGroups.flat();\n}\n","import type { PublicKey } from \"@solana/web3.js\";\nimport { LendrAccount } from \"~/models/account\";\nimport type { Bank } from \"~/models/bank\";\nimport type { OraclePrice } from \"~/services/price\";\nimport type { LendrProgram } from \"~/types\";\nimport type { BankMetadataMap } from \"../../../common\";\n\nimport { type HealthCacheSimulationError, simulateAccountHealthCacheWithFallback } from \"../account.service\";\nimport type { LendrAccountRaw, LendrAccountType } from \"../types\";\n\nexport const fetchLendrAccountAddresses = async (\n program: LendrProgram,\n authority: PublicKey,\n group: PublicKey,\n): Promise<PublicKey[]> => {\n const lendrAccounts = (\n await program.account.lendrAccount.all([\n {\n memcmp: {\n bytes: group.toBase58(),\n offset: 8, // lendrGroup is the first field in the account, so only offset is the discriminant\n },\n },\n {\n memcmp: {\n bytes: authority.toBase58(),\n offset: 8 + 32, // authority is the second field in the account after the authority, so offset by the discriminant and a pubkey\n },\n },\n ])\n ).map((a) => a.publicKey);\n\n return lendrAccounts;\n};\n\nexport const fetchLendrAccountData = async (\n program: LendrProgram,\n lendrAccountPk: PublicKey,\n bankMap: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n bankMetadataMap: BankMetadataMap,\n): Promise<{ lendrAccount: LendrAccountType; error?: HealthCacheSimulationError }> => {\n const lendrAccountRaw: LendrAccountRaw = await program.account.lendrAccount.fetch(lendrAccountPk, \"confirmed\");\n const lendrAccount = LendrAccount.fromAccountParsed(lendrAccountPk, lendrAccountRaw);\n\n const lendrAccountWithCache = await simulateAccountHealthCacheWithFallback({\n program,\n lendrAccount,\n bankMap,\n oraclePrices,\n bankMetadataMap,\n balances: lendrAccount.balances,\n });\n\n return lendrAccountWithCache;\n};\n","import BN from \"bn.js\";\n\nimport type {\n AccountFlags,\n BalanceType,\n BalanceTypeDto,\n HealthCacheType,\n HealthCacheTypeDto,\n LendrAccountType,\n LendrAccountTypeDto,\n} from \"../types\";\n\n/**\n * Convert numeric flag to BN for Solana compatibility\n */\nexport function accountFlagToBN(flag: AccountFlags): BN {\n return new BN(flag);\n}\n\nexport function lendrAccountToDto(lendrAccount: LendrAccountType): LendrAccountTypeDto {\n return {\n address: lendrAccount.address.toBase58(),\n group: lendrAccount.group.toBase58(),\n authority: lendrAccount.authority.toBase58(),\n balances: lendrAccount.balances.map(balanceToDto),\n accountFlags: lendrAccount.accountFlags,\n emissionsDestinationAccount: lendrAccount.emissionsDestinationAccount.toBase58(),\n healthCache: healthCacheToDto(lendrAccount.healthCache),\n };\n}\n\nexport function balanceToDto(balance: BalanceType): BalanceTypeDto {\n return {\n active: balance.active,\n bankPk: balance.bankPk.toBase58(),\n assetShares: balance.assetShares.toString(),\n liabilityShares: balance.liabilityShares.toString(),\n emissionsOutstanding: balance.emissionsOutstanding.toString(),\n lastUpdate: balance.lastUpdate,\n };\n}\n\nexport function healthCacheToDto(healthCache: HealthCacheType): HealthCacheTypeDto {\n return {\n assetValue: healthCache.assetValue.toString(),\n liabilityValue: healthCache.liabilityValue.toString(),\n assetValueMaint: healthCache.assetValueMaint.toString(),\n liabilityValueMaint: healthCache.liabilityValueMaint.toString(),\n assetValueEquity: healthCache.assetValueEquity.toString(),\n liabilityValueEquity: healthCache.liabilityValueEquity.toString(),\n timestamp: healthCache.timestamp.toString(),\n flags: healthCache.flags,\n prices: healthCache.prices,\n simulationFailed: healthCache.simulationFailed,\n };\n}\n","import type { AnchorProvider } from \"@coral-xyz/anchor\";\nimport {\n type AddressLookupTableAccount,\n ComputeBudgetProgram,\n Keypair,\n PublicKey,\n SystemProgram,\n type TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport BN from \"bn.js\";\n\nimport type LendrClient from \"~/clients/client\";\nimport type { BankMap, OraclePriceMap } from \"~/clients/client\";\n\nimport type { LendrIdlType } from \"~/idl\";\nimport instructions from \"~/instructions\";\nimport { LendrAccount, LendrAccountWrapper, LendrRequirementType } from \"~/models/account\";\nimport type { Balance } from \"~/models/balance\";\nimport type { Bank } from \"~/models/bank\";\nimport { HealthCache } from \"~/models/health-cache\";\n\nimport { type BankType, OracleSetup } from \"~/services/bank\";\nimport type { OraclePrice } from \"~/services/price\";\nimport { simulateBundle } from \"~/services/transaction/helpers\";\nimport type { LendrProgram } from \"~/types\";\nimport { feedIdToString } from \"~/utils\";\nimport type { InstructionWithEphemeralSigners } from \"~/vendor/pyth_crank\";\nimport {\n type BankMetadataMap,\n bigNumberToWrappedI80F48,\n type Program,\n type SolanaTransaction,\n splitInstructionsToFitTransactions,\n wrappedI80F48toBigNumber,\n} from \"../../common\";\nimport type { BalanceRaw, BalanceType, LendrAccountRaw } from \"./types\";\nimport {\n computeHealthAccountMetas,\n computeHealthCheckAccounts,\n computeHealthComponentsLegacy,\n computeHealthComponentsWithoutBiasLegacy,\n} from \"./utils\";\n\n/**\n * Custom error class for health cache simulation failures\n */\nexport class HealthCacheSimulationError extends Error {\n lndrErr: number | null;\n internalErr: number | null;\n\n constructor(message: string, lndrErr: number | null, internalErr: number | null) {\n super(message);\n this.name = \"HealthCacheSimulationError\";\n this.lndrErr = lndrErr;\n this.internalErr = internalErr;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, HealthCacheSimulationError);\n }\n }\n}\n\nexport async function simulateAccountHealthCacheWithFallback(props: {\n program: Program<LendrIdlType>;\n bankMap: Map<string, Bank>;\n oraclePrices: Map<string, OraclePrice>;\n lendrAccount: LendrAccount;\n balances: Balance[];\n bankMetadataMap: BankMetadataMap;\n}): Promise<{ lendrAccount: LendrAccount; error?: HealthCacheSimulationError }> {\n let lendrAccount = props.lendrAccount;\n\n const activeBalances = props.balances.filter((b) => b.active);\n\n const { assets: assetValueEquity, liabilities: liabilityValueEquity } = computeHealthComponentsWithoutBiasLegacy(\n activeBalances,\n props.bankMap,\n props.oraclePrices,\n LendrRequirementType.Equity,\n );\n\n try {\n const simulatedAccount = await simulateAccountHealthCache({\n program: props.program,\n bankMap: props.bankMap,\n oraclePrices: props.oraclePrices,\n lendrAccountPk: props.lendrAccount.address,\n balances: props.balances,\n bankMetadataMap: props.bankMetadataMap,\n });\n\n simulatedAccount.healthCache.assetValueEquity = bigNumberToWrappedI80F48(assetValueEquity);\n simulatedAccount.healthCache.liabilityValueEquity = bigNumberToWrappedI80F48(liabilityValueEquity);\n\n lendrAccount = LendrAccount.fromAccountParsed(props.lendrAccount.address, simulatedAccount);\n } catch (e) {\n console.log(\"e\", e);\n const { assets: assetValueMaint, liabilities: liabilityValueMaint } = computeHealthComponentsLegacy(\n activeBalances,\n props.bankMap,\n props.oraclePrices,\n LendrRequirementType.Maintenance,\n );\n\n const { assets: assetValueInitial, liabilities: liabilityValueInitial } = computeHealthComponentsLegacy(\n activeBalances,\n props.bankMap,\n props.oraclePrices,\n LendrRequirementType.Initial,\n );\n\n lendrAccount.setHealthCache(\n new HealthCache(\n assetValueInitial,\n liabilityValueInitial,\n assetValueMaint,\n liabilityValueMaint,\n assetValueEquity,\n liabilityValueEquity,\n new BigNumber(0),\n [],\n [],\n true,\n ),\n );\n\n // Return the error if it's a HealthCacheSimulationError\n if (e instanceof HealthCacheSimulationError) {\n return { lendrAccount, error: e };\n }\n }\n\n return { lendrAccount };\n}\n\nexport async function simulateAccountHealthCache(props: {\n program: Program<LendrIdlType>;\n bankMap: Map<string, Bank>;\n oraclePrices: Map<string, OraclePrice>;\n lendrAccountPk: PublicKey;\n balances: Balance[];\n bankMetadataMap: BankMetadataMap;\n}): Promise<LendrAccountRaw> {\n const { program, bankMap, oraclePrices, lendrAccountPk, balances, bankMetadataMap } = props;\n\n const activeBalances = balances.filter((b) => b.active);\n\n const { staleSwbOracles } = getActiveStaleBanks(activeBalances, bankMap, [], oraclePrices, 30);\n\n const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 1_400_000 });\n const blockhash = (await program.provider.connection.getLatestBlockhash(\"confirmed\")).blockhash;\n\n const fundAccountIx = SystemProgram.transfer({\n fromPubkey: new PublicKey(\"DD3AeAssFvjqTvRTrRAtpfjkBF8FpVKnFuwnMLN9haXD\"), // lendr SOL VAULT\n toPubkey: program.provider.publicKey,\n lamports: 100_000_000, // 0.1 SOL\n });\n\n const crankPythIxs: {\n postInstructions: InstructionWithEphemeralSigners[];\n closeInstructions: InstructionWithEphemeralSigners[];\n keys: never[];\n lut: AddressLookupTableAccount | null;\n } = {\n postInstructions: [],\n closeInstructions: [],\n keys: [],\n lut: null,\n }; //await crankPythOracleIx(stalePythFeeds, program.provider);\n const crankSwbIxs =\n staleSwbOracles.length > 0\n ? await createUpdateFeedIx({\n swbPullOracles: staleSwbOracles.map((oracle) => oracle.oracleKey),\n provider: program.provider,\n })\n : { instructions: [], luts: [] };\n\n const healthPulseIxs = await makePulseHealthIx(\n program,\n lendrAccountPk,\n bankMap,\n balances,\n activeBalances.map((b) => b.bankPk),\n [],\n bankMetadataMap,\n );\n\n const pythLut = crankPythIxs.lut ? [crankPythIxs.lut] : [];\n\n const txs: Array<VersionedTransaction> = [];\n\n if (crankPythIxs.postInstructions.length > 0) {\n txs.push(\n ...splitInstructionsToFitTransactions(\n [computeIx],\n [\n fundAccountIx,\n ...crankPythIxs.postInstructions.map((ix) => ix.instruction),\n ...crankPythIxs.closeInstructions.map((ix) => ix.instruction),\n ],\n {\n blockhash,\n payerKey: program.provider.publicKey,\n luts: [...crankSwbIxs.luts, ...pythLut],\n },\n ),\n );\n }\n\n const messageV0 = new TransactionMessage({\n payerKey: program.provider.publicKey,\n recentBlockhash: blockhash,\n instructions: [...crankSwbIxs.instructions],\n }).compileToV0Message([...crankSwbIxs.luts]);\n\n const swbTx = new VersionedTransaction(messageV0);\n\n txs.push(swbTx);\n\n const healthTx = new TransactionMessage({\n payerKey: program.provider.publicKey,\n recentBlockhash: blockhash,\n instructions: [...healthPulseIxs.instructions],\n }).compileToV0Message([]);\n\n const healthTxV0 = new VersionedTransaction(healthTx);\n txs.push(healthTxV0);\n\n if (txs.length > 5) {\n console.error(\"Too many transactions\", txs.length);\n throw new Error(\"Too many transactions\");\n }\n\n const simulationResult = await simulateBundle(program.provider.connection.rpcEndpoint, txs, [lendrAccountPk]);\n\n const postExecutionAccount = simulationResult.find((result) => result.postExecutionAccounts.length > 0);\n\n if (!postExecutionAccount) {\n throw new Error(\"Account not found\");\n }\n\n const lendrAccountPost = LendrAccount.decodeAccountRaw(\n Buffer.from(postExecutionAccount.postExecutionAccounts[0].data[0], \"base64\"),\n program.idl,\n );\n\n if (lendrAccountPost.healthCache.lndrErr || lendrAccountPost.healthCache.internalErr) {\n console.log(\n \"cranked swb oracles\",\n staleSwbOracles.map((oracle) => oracle.oracleKey),\n );\n console.log(\"LendrAccountPost healthCache internalErr\", lendrAccountPost.healthCache.internalErr);\n console.log(\"LendrAccountPost healthCache lndrErr\", lendrAccountPost.healthCache.lndrErr);\n\n if (lendrAccountPost.healthCache.lndrErr === 6009) {\n const assetValue = !wrappedI80F48toBigNumber(lendrAccountPost.healthCache.assetValue).isZero();\n const liabilityValue = !wrappedI80F48toBigNumber(lendrAccountPost.healthCache.liabilityValue).isZero();\n const assetValueEquity = !wrappedI80F48toBigNumber(lendrAccountPost.healthCache.assetValueEquity).isZero();\n const liabilityValueEquity = !wrappedI80F48toBigNumber(\n lendrAccountPost.healthCache.liabilityValueEquity,\n ).isZero();\n const assetValueMaint = !wrappedI80F48toBigNumber(lendrAccountPost.healthCache.assetValueMaint).isZero();\n const liabilityValueMaint = !wrappedI80F48toBigNumber(lendrAccountPost.healthCache.liabilityValueMaint).isZero();\n\n if (\n assetValue &&\n liabilityValue &&\n assetValueEquity &&\n liabilityValueEquity &&\n assetValueMaint &&\n liabilityValueMaint\n ) {\n return lendrAccountPost;\n }\n }\n console.error(\"Account health cache simulation failed\", {\n lndrErr: lendrAccountPost.healthCache.lndrErr,\n internalErr: lendrAccountPost.healthCache.internalErr,\n });\n throw new HealthCacheSimulationError(\n \"Account health cache simulation failed\",\n lendrAccountPost.healthCache.lndrErr,\n lendrAccountPost.healthCache.internalErr,\n );\n }\n\n return lendrAccountPost;\n}\n\nexport async function makePulseHealthIx(\n program: LendrProgram,\n lendrAccountPk: PublicKey,\n banks: Map<string, BankType>,\n balances: BalanceType[],\n mandatoryBanks: PublicKey[],\n excludedBanks: PublicKey[],\n bankMetadataMap: BankMetadataMap,\n) {\n const healthAccounts = computeHealthCheckAccounts(balances, banks, mandatoryBanks, excludedBanks);\n const accountMetas = computeHealthAccountMetas(healthAccounts, bankMetadataMap);\n\n const ix = await instructions.makePulseHealthIx(\n program,\n {\n lendrAccount: lendrAccountPk,\n },\n accountMetas.map((account) => ({ pubkey: account, isSigner: false, isWritable: false })),\n );\n\n return { instructions: [ix], keys: [] };\n}\nexport async function createUpdateFeedIx(_props: {\n swbPullOracles: PublicKey[];\n provider: AnchorProvider;\n}): Promise<{ instructions: TransactionInstruction[]; luts: AddressLookupTableAccount[] }> {\n // TODO))\n throw new Error(\"in terms of switchboard, we have no switchboard\");\n // const sbProgram = getSwitchboardProgram(props.provider);\n // const [pullIx, luts] = await sb.PullFeed.fetchUpdateManyIx(sbProgram, {\n // feeds: props.swbPullOracles,\n // numSignatures: 1,\n // payer: props.provider.publicKey,\n // });\n // return { instructions: pullIx, luts };\n}\n\n/**\n * This function creates a new Lendr account transaction and returns a projected dummy account for simulation.\n * Note: This function is subject to future updates and improvements.\n */\nexport async function createLendrAccountTx(props: {\n lendrAccount: LendrAccountWrapper | null;\n lendrClient: LendrClient;\n}): Promise<{ account: LendrAccountWrapper; tx: SolanaTransaction }> {\n const authority = props.lendrAccount?.authority ?? props.lendrClient.provider.publicKey;\n const lendrAccountKeypair = Keypair.generate();\n\n // create a dummy account with 15 empty balances to be used in other transactions\n const dummyWrappedI80F48 = bigNumberToWrappedI80F48(new BigNumber(0));\n const dummyBalances: BalanceRaw[] = Array(15).fill({\n active: false,\n bankPk: new PublicKey(\"11111111111111111111111111111111\"),\n assetShares: dummyWrappedI80F48,\n liabilityShares: dummyWrappedI80F48,\n emissionsOutstanding: dummyWrappedI80F48,\n lastUpdate: new BN(0),\n });\n const rawAccount: LendrAccountRaw = {\n group: props.lendrClient.group.address,\n authority: authority,\n lendingAccount: { balances: dummyBalances },\n healthCache: {\n assetValue: {\n value: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n },\n liabilityValue: {\n value: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n },\n timestamp: new BN(0),\n flags: 0,\n prices: [],\n assetValueMaint: bigNumberToWrappedI80F48(new BigNumber(0)),\n liabilityValueMaint: bigNumberToWrappedI80F48(new BigNumber(0)),\n assetValueEquity: bigNumberToWrappedI80F48(new BigNumber(0)),\n liabilityValueEquity: bigNumberToWrappedI80F48(new BigNumber(0)),\n errIndex: 0,\n internalErr: 0,\n internalBankruptcyErr: 0,\n internalLiqErr: 0,\n lndrErr: 0,\n },\n emissionsDestinationAccount: new PublicKey(\"11111111111111111111111111111111\"),\n accountFlags: new BN([0, 0, 0]),\n };\n\n const account = LendrAccount.fromAccountParsed(lendrAccountKeypair.publicKey, rawAccount);\n\n const wrappedAccount = new LendrAccountWrapper(lendrAccountKeypair.publicKey, props.lendrClient, account);\n\n return {\n account: wrappedAccount,\n tx: await props.lendrClient.createLendrAccountTx({ accountKeypair: lendrAccountKeypair }),\n };\n}\n\nexport function getActiveStaleBanks(\n balances: Balance[],\n banks: BankMap,\n additionalBanks: Bank[],\n oraclePrices: OraclePriceMap,\n maxAgeOffset: number = 0,\n): { stalePythFeeds: { feedId: string; shardId: number }[]; staleSwbOracles: { oracleKey: PublicKey }[] } {\n const activeBanks = balances\n .filter((balance) => balance.active)\n .map((balance) => banks.get(balance.bankPk.toBase58()))\n .filter((bank): bank is NonNullable<typeof bank> => !!bank);\n\n const allBanks = [...activeBanks, ...additionalBanks];\n\n const staleBanks = allBanks.filter((bank) => {\n if (\n bank.config.oracleSetup === OracleSetup.SwitchboardPull ||\n bank.config.oracleSetup === OracleSetup.SwitchboardV2 ||\n bank.config.oracleSetup === OracleSetup.KaminoSwitchboardPull\n ) {\n // always crank swb banks\n return true;\n }\n const oraclePrice = oraclePrices.get(bank.address.toBase58());\n const maxAge = bank.config.oracleMaxAge;\n const currentTime = Math.round(Date.now() / 1000);\n const oracleTime = Math.round(oraclePrice?.timestamp ? oraclePrice.timestamp.toNumber() : Date.now());\n const adjustedMaxAge = Math.max(maxAge - maxAgeOffset, 0);\n const isStale = currentTime - oracleTime > adjustedMaxAge;\n\n return isStale;\n });\n\n if (staleBanks.length > 0) {\n const stalePythFeeds: { feedId: string; shardId: number }[] = [];\n const staleSwbOracles: { oracleKey: PublicKey }[] = [];\n const seenSwbOracles = new Set<string>();\n const seenPythFeeds = new Set<string>();\n\n staleBanks.forEach((bank) => {\n if (\n bank.config.oracleSetup === OracleSetup.SwitchboardPull ||\n bank.config.oracleSetup === OracleSetup.KaminoSwitchboardPull\n ) {\n const key = bank.oracleKey.toBase58();\n if (!seenSwbOracles.has(key)) {\n seenSwbOracles.add(key);\n staleSwbOracles.push({ oracleKey: bank.oracleKey });\n }\n } else if (\n bank.config.oracleSetup === OracleSetup.PythPushOracle ||\n bank.config.oracleSetup === OracleSetup.StakedWithPythPush ||\n bank.config.oracleSetup === OracleSetup.KaminoPythPush\n ) {\n const oraclePrice = oraclePrices.get(bank.address.toBase58());\n\n const shardId = oraclePrice?.pythShardId ?? 0;\n const feedId = bank.config.oracleKeys[0];\n const feedKey = feedIdToString(feedId);\n if (!seenPythFeeds.has(feedKey)) {\n seenPythFeeds.add(feedKey);\n stalePythFeeds.push({ feedId: feedKey, shardId });\n }\n }\n });\n\n return { stalePythFeeds, staleSwbOracles };\n }\n\n return { stalePythFeeds: [], staleSwbOracles: [] };\n}\n","import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey, StakeProgram, SYSVAR_RENT_PUBKEY, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { SINGLE_POOL_PROGRAM_ID } from \"~/constants\";\nimport instructions from \"~/instructions\";\nimport type { LendrProgram } from \"~/types\";\nimport {\n findPoolAddress,\n findPoolMintAddress,\n findPoolOnRampAddress,\n findPoolStakeAddress,\n} from \"~/vendor/single-spl-pool\";\nimport type { InstructionsWrapper } from \"../../common\";\nimport { type BankConfigCompactRaw, type BankConfigOpt, type BankConfigOptRaw, serializeBankConfigOpt } from \"../bank\";\n\nexport async function makePoolConfigureBankIx(\n program: LendrProgram,\n bank: PublicKey,\n args: BankConfigOptRaw,\n): Promise<InstructionsWrapper> {\n const ix = await instructions.makePoolConfigureBankIx(\n program,\n {\n bank: bank,\n },\n { bankConfigOpt: args },\n );\n\n return {\n instructions: [ix],\n keys: [],\n };\n}\n\nexport async function makeAddPermissionlessStakedBankIx(\n program: LendrProgram,\n group: PublicKey,\n voteAccountAddress: PublicKey,\n feePayer: PublicKey,\n pythOracle: PublicKey, // wSOL oracle\n): Promise<InstructionsWrapper> {\n const [settingsKey] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"staked_settings\", \"utf-8\"), group.toBuffer()],\n program.programId,\n );\n const poolAddress = findPoolAddress(voteAccountAddress);\n const solPool = findPoolStakeAddress(poolAddress);\n const lstMint = findPoolMintAddress(poolAddress);\n const onRampAddress = findPoolOnRampAddress(poolAddress);\n\n const keys = [\n { pubkey: poolAddress, isSigner: false, isWritable: false },\n { pubkey: onRampAddress, isSigner: false, isWritable: true },\n { pubkey: solPool, isSigner: false, isWritable: false },\n { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: StakeProgram.programId, isSigner: false, isWritable: false },\n ];\n\n // TODO don't hard code the instruction index? (or why not, it's not gna change is it?)\n const data = Buffer.from(Uint8Array.of(6));\n\n const _onrampIx = new TransactionInstruction({\n keys,\n programId: SINGLE_POOL_PROGRAM_ID,\n data,\n });\n\n const remainingKeys = [pythOracle, lstMint, solPool];\n\n const ix = await instructions.makePoolAddPermissionlessStakedBankIx(\n program,\n {\n stakedSettings: settingsKey,\n feePayer: feePayer,\n bankMint: lstMint,\n solPool,\n stakePool: poolAddress,\n },\n remainingKeys.map((key) => ({ pubkey: key, isSigner: false, isWritable: false })),\n {\n seed: new BN(0),\n },\n );\n\n return {\n instructions: [ix],\n keys: [],\n };\n}\n\nexport async function makePoolAddBankIx(\n program: LendrProgram,\n group: PublicKey,\n bank: PublicKey,\n feePayer: PublicKey,\n bankMint: PublicKey,\n bankConfig: BankConfigOpt,\n tokenProgram: PublicKey = TOKEN_PROGRAM_ID,\n overrideOpt: { admin?: PublicKey; globalFeeWallet?: PublicKey } = {},\n): Promise<InstructionsWrapper> {\n const rawBankConfig = serializeBankConfigOpt(bankConfig);\n\n // TODO verify this is correct\n const rawBankConfigCompact = {\n ...rawBankConfig,\n oracleMaxAge: bankConfig.oracleMaxAge,\n auto_padding_0: [0],\n auto_padding_1: [0],\n } as BankConfigCompactRaw;\n\n const ix = await instructions.makePoolAddBankIx(\n program,\n {\n lendrGroup: group,\n feePayer,\n bankMint,\n bank,\n tokenProgram,\n ...overrideOpt,\n // if two oracle keys: first is feed id, second is oracle key\n },\n {\n bankConfig: rawBankConfigCompact,\n },\n );\n\n return {\n instructions: [ix], //ix\n keys: [],\n };\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport type { LendrGroupType, LendrGroupTypeDto } from \"../types\";\n\nexport function dtoToGroup(groupDto: LendrGroupTypeDto): LendrGroupType {\n return {\n admin: new PublicKey(groupDto.admin),\n address: new PublicKey(groupDto.address),\n };\n}\n","import type { LendrGroupType, LendrGroupTypeDto } from \"../types\";\n\nexport function groupToDto(group: LendrGroupType): LendrGroupTypeDto {\n return {\n admin: group.admin.toBase58(),\n address: group.address.toBase58(),\n };\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport type { ValidatorStakeGroup, ValidatorStakeGroupDto } from \"../types\";\n\nexport function dtoToValidatorStakeGroup(validatorStakeGroupDto: ValidatorStakeGroupDto): ValidatorStakeGroup {\n return {\n validator: new PublicKey(validatorStakeGroupDto.validator),\n poolKey: new PublicKey(validatorStakeGroupDto.poolKey),\n poolMintKey: new PublicKey(validatorStakeGroupDto.poolMintKey),\n totalStake: validatorStakeGroupDto.totalStake,\n selectedAccount: {\n pubkey: new PublicKey(validatorStakeGroupDto.selectedAccount.pubkey),\n amount: validatorStakeGroupDto.selectedAccount.amount,\n },\n accounts: validatorStakeGroupDto.accounts.map((account) => ({\n pubkey: new PublicKey(account.pubkey),\n amount: account.amount,\n })),\n };\n}\n","import { type Connection, LAMPORTS_PER_SOL, type ParsedAccountData, PublicKey, StakeProgram } from \"@solana/web3.js\";\nimport { MAX_U64 } from \"@/constants\";\nimport {\n findPoolAddress,\n findPoolMintAddress,\n findPoolOnRampAddress,\n findPoolStakeAddress,\n} from \"~/vendor/single-spl-pool\";\nimport { chunkedGetRawMultipleAccountInfoOrdered } from \"../../../common\";\nimport type { StakeAccount, StakePoolMevMap, ValidatorStakeGroup } from \"../types\";\n\n/**\n * Retrieves all active stake accounts associated with a given public key grouped by validator\n *\n * @warning this is an expensive rpc call and should be heavily cached\n *\n * @param connection - Solana RPC connection\n * @param publicKey - Users's public key\n * @param opts - Options for filtering inactive stake accounts\n * @returns {Promise<ValidatorStakeGroup[]>} An array of validator stake groups\n */\nexport const fetchNativeStakeAccounts = async (\n connection: Connection,\n publicKey: PublicKey,\n opts: {\n filterInactive: boolean;\n } = {\n filterInactive: true,\n },\n): Promise<ValidatorStakeGroup[]> => {\n if (!connection || !publicKey) {\n throw new Error(\"Invalid connection or public key\");\n }\n\n try {\n const epochInfo = await connection.getEpochInfo();\n const accounts = await connection.getParsedProgramAccounts(StakeProgram.programId, {\n filters: [\n {\n memcmp: {\n offset: 12,\n bytes: publicKey.toBase58(),\n },\n },\n ],\n });\n\n const validatorMap = new Map<string, { pubkey: PublicKey; amount: number }[]>();\n\n // Map accounts to promises and run them in parallel\n await Promise.all(\n accounts.map(async (acc) => {\n const parsedAccount = acc.account.data as ParsedAccountData;\n const stakeInfo = parsedAccount.parsed.info;\n\n // filter out inactive stake accounts\n if (\n !stakeInfo.stake?.delegation ||\n (opts.filterInactive &&\n (Number(stakeInfo.stake.delegation.activationEpoch) >= epochInfo.epoch ||\n stakeInfo.stake.delegation.deactivationEpoch !== MAX_U64))\n ) {\n return;\n }\n\n const validatorAddress = stakeInfo.stake.delegation.voter;\n const accountPubkey = acc.pubkey;\n const amount = Number(stakeInfo.stake.delegation.stake) / LAMPORTS_PER_SOL;\n\n const existingAccounts = validatorMap.get(validatorAddress) || [];\n validatorMap.set(validatorAddress, [...existingAccounts, { pubkey: accountPubkey, amount }]);\n }),\n );\n\n // Calculate pool keys once per validator when creating return value\n return Promise.all(\n Array.from(validatorMap.entries()).map(async ([validatorAddress, accounts]) => {\n const poolKey = findPoolAddress(new PublicKey(validatorAddress));\n const poolMintKey = findPoolMintAddress(poolKey);\n const totalStake = accounts.reduce((acc, curr) => acc + curr.amount, 0);\n const largestAccount = accounts.reduce((acc, curr) => (acc.amount > curr.amount ? acc : curr));\n const sortedAccounts = accounts.sort((a, b) => b.amount - a.amount);\n\n // if the largest account is not the first in the array, move it to the front\n if (!sortedAccounts[0].pubkey.equals(largestAccount.pubkey)) {\n sortedAccounts.unshift(sortedAccounts.splice(sortedAccounts.indexOf(largestAccount), 1)[0]);\n }\n\n return {\n validator: new PublicKey(validatorAddress),\n poolKey,\n poolMintKey,\n accounts: sortedAccounts,\n totalStake,\n selectedAccount: largestAccount,\n };\n }),\n );\n } catch (e) {\n console.error(\"Error getting stake accounts\", e);\n return [];\n }\n};\n\n/**\n * Gets active states for stake pools associated with staked asset banks\n *\n * @param connection - Solana RPC connection\n * @param bankInfos - Array of ExtendedBankInfo objects\n * @returns Promise<Map<string, boolean>> - Map of bank addresses to active states\n */\nexport const fetchStakePoolActiveStates = async (\n connection: Connection,\n validatorVoteAccounts: PublicKey[],\n): Promise<Map<string, boolean>> => {\n const currentEpoch = await connection.getEpochInfo();\n const activeStates = new Map<string, boolean>();\n\n const poolMintAddressRecord: Record<string, PublicKey> = {};\n const poolStakeAddressRecord: Record<string, PublicKey> = {};\n\n validatorVoteAccounts.forEach((validatorVoteAccount) => {\n const poolAddress = findPoolAddress(validatorVoteAccount);\n const poolStakeAddress = findPoolStakeAddress(poolAddress);\n const poolMintAddress = findPoolMintAddress(poolAddress);\n\n poolMintAddressRecord[validatorVoteAccount.toBase58()] = poolMintAddress;\n poolStakeAddressRecord[poolStakeAddress.toBase58()] = validatorVoteAccount;\n });\n\n const poolStakeAddressKeys = Object.keys(poolStakeAddressRecord);\n\n const poolStakeAccounts = Object.fromEntries(\n (await chunkedGetRawMultipleAccountInfoOrdered(connection, poolStakeAddressKeys)).map((ai, index) => [\n poolStakeAddressRecord[poolStakeAddressKeys[index]],\n ai?.data || null,\n ]),\n );\n\n validatorVoteAccounts.forEach((validatorVoteAccount) => {\n const stakeAccount = fetchStakeAccount(poolStakeAccounts[validatorVoteAccount.toBase58()]);\n const poolMintAddress = poolMintAddressRecord[validatorVoteAccount.toBase58()];\n\n if (!stakeAccount) {\n activeStates.set(poolMintAddress.toBase58(), false);\n return;\n }\n\n if (!stakeAccount.stake?.delegation) {\n activeStates.set(poolMintAddress.toBase58(), false);\n return;\n }\n\n const activationEpoch = stakeAccount.stake.delegation.activationEpoch;\n const isActive = currentEpoch.epoch > Number(activationEpoch);\n activeStates.set(validatorVoteAccount.toBase58(), isActive);\n });\n\n return activeStates;\n};\n\n/**\n * Gets APY rates for validators associated with staked asset banks\n *\n * @param validatorVoteAccounts - Array of validator vote account public keys\n * @returns Promise<Map<string, number>> - Map of bank addresses to APY rates\n */\n// export const getValidatorRates = async (validatorVoteAccounts: PublicKey[]): Promise<Map<string, number>> => {\n// const rates = new Map<string, number>();\n\n// await Promise.all(\n// validatorVoteAccounts.map(async (validatorVoteAccount) => {\n// const poolAddress = findPoolAddress(validatorVoteAccount);\n// const poolMintAddress = findPoolMintAddress(poolAddress);\n\n// try {\n// const response = await fetch(`/api/validator-info?validator=${validatorVoteAccount.toBase58()}`);\n\n// if (!response.ok) {\n// rates.set(poolMintAddress.toBase58(), 0);\n// return;\n// }\n\n// const data = await response.json();\n// rates.set(poolMintAddress.toBase58(), data.data?.total_apy ?? 0);\n// } catch (error) {\n// console.error(\"Error fetching validator rate:\", error);\n// rates.set(poolMintAddress.toBase58(), 0);\n// }\n// })\n// );\n\n// return rates;\n// };\n\nexport const fetchStakeAccount = (data: Buffer): StakeAccount => {\n let offset = 0;\n\n // Discriminant (4 bytes)\n const discriminant = data.readUInt32LE(offset);\n offset += 4;\n\n // Meta\n const rentExemptReserve = data.readBigUInt64LE(offset);\n offset += 8;\n\n // Authorized staker and withdrawer (2 public keys)\n const staker = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n const withdrawer = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n // Lockup: unixTimestamp, epoch, custodian\n const unixTimestamp = data.readBigUInt64LE(offset);\n offset += 8;\n const epoch = data.readBigUInt64LE(offset);\n offset += 8;\n const custodian = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n // Stake: Delegation\n const voterPubkey = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n const stake = data.readBigUInt64LE(offset);\n offset += 8;\n const activationEpoch = data.readBigUInt64LE(offset);\n offset += 8;\n const deactivationEpoch = data.readBigUInt64LE(offset);\n offset += 8;\n\n // Credits observed\n const creditsObserved = data.readBigUInt64LE(offset);\n\n // Return the parsed StakeAccount object\n return {\n discriminant,\n meta: {\n rentExemptReserve,\n authorized: {\n staker,\n withdrawer,\n },\n lockup: {\n unixTimestamp,\n epoch,\n custodian,\n },\n },\n stake: {\n delegation: {\n voterPubkey,\n stake,\n activationEpoch,\n deactivationEpoch,\n },\n creditsObserved,\n },\n };\n};\n\nexport const fetchStakePoolMev = async (\n connection: Connection,\n validatorVoteAccounts: PublicKey[],\n): Promise<StakePoolMevMap> => {\n const poolAddressRecord: Record<string, PublicKey> = {};\n const poolStakeAddressRecord: Record<string, PublicKey> = {};\n const onRampAddressRecord: Record<string, PublicKey> = {};\n const mev: StakePoolMevMap = new Map<string, { pool: number; onramp: number }>();\n\n validatorVoteAccounts.forEach((validatorVoteAccount) => {\n const poolAddress = findPoolAddress(validatorVoteAccount);\n const poolStakeAddress = findPoolStakeAddress(poolAddress);\n const onRampAddress = findPoolOnRampAddress(poolAddress);\n\n poolAddressRecord[validatorVoteAccount.toBase58()] = poolAddress;\n poolStakeAddressRecord[validatorVoteAccount.toBase58()] = poolStakeAddress;\n onRampAddressRecord[validatorVoteAccount.toBase58()] = onRampAddress;\n });\n\n const poolStakeAddresses = validatorVoteAccounts.map(\n (validatorVoteAccount) => poolStakeAddressRecord[validatorVoteAccount.toBase58()],\n );\n const onRampAddresses = validatorVoteAccounts.map(\n (validatorVoteAccount) => onRampAddressRecord[validatorVoteAccount.toBase58()],\n );\n\n const allAddresses = [...poolStakeAddresses, ...onRampAddresses].map((address) => address.toBase58());\n\n return chunkedGetRawMultipleAccountInfoOrdered(connection, allAddresses).then((accountInfos) => {\n const poolStakeInfos = accountInfos.slice(0, poolStakeAddresses.length);\n const onRampInfos = accountInfos.slice(poolStakeAddresses.length);\n const rent = 2282280;\n\n validatorVoteAccounts.forEach((validatorVoteAccount, index) => {\n const poolStakeInfo = poolStakeInfos[index];\n const onRampInfo = onRampInfos[index];\n\n if (poolStakeInfo && onRampInfo) {\n const stakeDecoded = fetchStakeAccount(poolStakeInfo.data);\n const onrampDecoded = fetchStakeAccount(onRampInfo.data);\n const poolLamps = poolStakeInfo.lamports - rent - Number(stakeDecoded.stake.delegation.stake.toString());\n const onrampStake = Number(onrampDecoded.stake.delegation.stake.toString());\n\n mev.set(validatorVoteAccount.toBase58(), {\n pool: poolLamps >= 1000 ? poolLamps : 0,\n onramp: onrampStake,\n });\n }\n });\n\n return mev;\n });\n};\n","import type { ValidatorStakeGroup, ValidatorStakeGroupDto } from \"../types\";\n\nexport function validatorStakeGroupToDto(validatorStakeGroup: ValidatorStakeGroup): ValidatorStakeGroupDto {\n return {\n validator: validatorStakeGroup.validator.toBase58(),\n poolKey: validatorStakeGroup.poolKey.toBase58(),\n poolMintKey: validatorStakeGroup.poolMintKey.toBase58(),\n totalStake: validatorStakeGroup.totalStake,\n selectedAccount: {\n pubkey: validatorStakeGroup.selectedAccount.pubkey.toBase58(),\n amount: validatorStakeGroup.selectedAccount.amount,\n },\n accounts: validatorStakeGroup.accounts.map((account) => ({\n pubkey: account.pubkey.toBase58(),\n amount: account.amount,\n })),\n };\n}\n","import type { PublicKey } from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport type { BankExtendedMetadata } from \"@/common/bank-metadata\";\nimport { nativeToUi } from \"../common\";\nimport type { LendrIdlType } from \"../idl\";\nimport {\n type AssetTag,\n type BankConfigFlag,\n type BankConfigRaw,\n type BankConfigType,\n type BankRaw,\n type BankType,\n getPrice,\n type InterestRateConfig,\n type OperationalState,\n type OraclePrice,\n type OracleSetup,\n type RiskTier,\n} from \"../services\";\nimport {\n computeAssetUsdValue,\n computeBaseInterestRate,\n computeInterestRates,\n computeLiabilityUsdValue,\n computeRemainingCapacity,\n computeTvl,\n computeUsdValue,\n computeUtilizationRate,\n decodeBankRaw,\n getAssetQuantity,\n getAssetShares,\n getAssetWeight,\n getLiabilityQuantity,\n getLiabilityShares,\n getLiabilityWeight,\n getTotalAssetQuantity,\n getTotalLiabilityQuantity,\n parseBankConfigRaw,\n parseBankRaw,\n} from \"../services/bank/utils\";\nimport { PriceBias } from \"../services/price/types\";\nimport type { PythPushFeedIdMap } from \"../utils\";\nimport { LendrRequirementType } from \"./account\";\nimport type { EmodeSettings } from \"./emode-settings\";\n\nconst SECONDS_PER_DAY = 24 * 60 * 60;\nconst _SECONDS_PER_YEAR = SECONDS_PER_DAY * 365.25;\n\n// ----------------------------------------------------------------------------\n// Client types\n// ----------------------------------------------------------------------------\n\nclass Bank implements BankType {\n constructor(\n public readonly address: PublicKey,\n public readonly mint: PublicKey,\n public readonly mintDecimals: number,\n public readonly group: PublicKey,\n public readonly mintRate: number | null,\n public readonly mintPrice: number,\n public readonly assetShareValue: BigNumber,\n public readonly liabilityShareValue: BigNumber,\n public readonly liquidityVault: PublicKey,\n public readonly liquidityVaultBump: number,\n public readonly liquidityVaultAuthorityBump: number,\n public readonly insuranceVault: PublicKey,\n public readonly insuranceVaultBump: number,\n public readonly insuranceVaultAuthorityBump: number,\n public readonly collectedInsuranceFeesOutstanding: BigNumber,\n public readonly feeVault: PublicKey,\n public readonly feeVaultBump: number,\n public readonly feeVaultAuthorityBump: number,\n public readonly collectedGroupFeesOutstanding: BigNumber,\n public readonly lastUpdate: number,\n public config: BankConfig,\n public readonly totalAssetShares: BigNumber,\n public readonly totalLiabilityShares: BigNumber,\n public readonly emissionsActiveBorrowing: boolean,\n public readonly emissionsActiveLending: boolean,\n public readonly emissionsRate: number,\n public readonly emissionsMint: PublicKey,\n public readonly emissionsRemaining: BigNumber,\n public readonly oracleKey: PublicKey,\n public readonly emode: EmodeSettings,\n public readonly feesDestinationAccount?: PublicKey,\n public readonly lendingPositionCount?: BigNumber,\n public readonly borrowingPositionCount?: BigNumber,\n public readonly pythShardId?: number,\n public readonly tokenSymbol?: string,\n public readonly extendedMetadata?: BankExtendedMetadata,\n public readonly owner?: PublicKey,\n ) {}\n\n static decodeBankRaw(encoded: Buffer, idl: LendrIdlType): BankRaw {\n return decodeBankRaw(encoded, idl);\n }\n\n static fromBuffer(bankPk: PublicKey, rawData: Buffer, idl: LendrIdlType, feedIdMap: PythPushFeedIdMap): Bank {\n const accountParsed = Bank.decodeBankRaw(rawData, idl);\n return Bank.fromAccountParsed(bankPk, accountParsed, feedIdMap);\n }\n\n static fromBankType(bankType: BankType): Bank {\n const config = new BankConfig(\n bankType.config.assetWeightInit,\n bankType.config.assetWeightMaint,\n bankType.config.liabilityWeightInit,\n bankType.config.liabilityWeightMaint,\n bankType.config.depositLimit,\n bankType.config.borrowLimit,\n bankType.config.riskTier,\n bankType.config.totalAssetValueInitLimit,\n bankType.config.assetTag,\n bankType.config.oracleSetup,\n bankType.config.oracleKeys,\n bankType.config.oracleMaxAge,\n bankType.config.interestRateConfig,\n bankType.config.operationalState,\n bankType.config.oracleMaxConfidence,\n bankType.config.fixedPrice,\n bankType.config.configFlags,\n );\n return new Bank(\n bankType.address,\n bankType.mint,\n bankType.mintDecimals,\n bankType.group,\n bankType.mintRate,\n bankType.mintPrice,\n bankType.assetShareValue,\n bankType.liabilityShareValue,\n bankType.liquidityVault,\n bankType.liquidityVaultBump,\n bankType.liquidityVaultAuthorityBump,\n bankType.insuranceVault,\n bankType.insuranceVaultBump,\n bankType.insuranceVaultAuthorityBump,\n bankType.collectedInsuranceFeesOutstanding,\n bankType.feeVault,\n bankType.feeVaultBump,\n bankType.feeVaultAuthorityBump,\n bankType.collectedGroupFeesOutstanding,\n bankType.lastUpdate,\n config,\n bankType.totalAssetShares,\n bankType.totalLiabilityShares,\n bankType.emissionsActiveBorrowing,\n bankType.emissionsActiveLending,\n bankType.emissionsRate,\n bankType.emissionsMint,\n bankType.emissionsRemaining,\n bankType.oracleKey,\n bankType.emode,\n bankType.feesDestinationAccount,\n bankType.lendingPositionCount,\n bankType.borrowingPositionCount,\n bankType.pythShardId,\n bankType.tokenSymbol,\n );\n }\n\n static fromAccountParsed(\n address: PublicKey,\n accountParsed: BankRaw,\n feedIdMap?: PythPushFeedIdMap,\n // TODO)) [later] change these to non-optional\n extendedMetadata?: BankExtendedMetadata,\n owner?: PublicKey,\n ): Bank {\n const props = parseBankRaw(address, accountParsed, feedIdMap);\n return new Bank(\n props.address,\n props.mint,\n props.mintDecimals,\n props.group,\n props.mintRate,\n props.mintPrice,\n props.assetShareValue,\n props.liabilityShareValue,\n props.liquidityVault,\n props.liquidityVaultBump,\n props.liquidityVaultAuthorityBump,\n props.insuranceVault,\n props.insuranceVaultBump,\n props.insuranceVaultAuthorityBump,\n props.collectedInsuranceFeesOutstanding,\n props.feeVault,\n props.feeVaultBump,\n props.feeVaultAuthorityBump,\n props.collectedGroupFeesOutstanding,\n props.lastUpdate,\n props.config,\n props.totalAssetShares,\n props.totalLiabilityShares,\n props.emissionsActiveBorrowing,\n props.emissionsActiveLending,\n props.emissionsRate,\n props.emissionsMint,\n props.emissionsRemaining,\n props.oracleKey,\n props.emode,\n props.feesDestinationAccount,\n props.lendingPositionCount,\n props.borrowingPositionCount,\n props.pythShardId,\n extendedMetadata?.symbol,\n extendedMetadata,\n owner,\n );\n }\n\n static withEmodeWeights(bank: Bank, emodeWeights: { assetWeightMaint: BigNumber; assetWeightInit: BigNumber }): Bank {\n const newBank = Object.create(Bank.prototype);\n\n Object.assign(newBank, bank);\n\n newBank.config = Object.assign({}, bank.config);\n newBank.config.assetWeightInit = BigNumber.max(bank.config.assetWeightInit, emodeWeights.assetWeightInit);\n newBank.config.assetWeightMaint = BigNumber.max(bank.config.assetWeightMaint, emodeWeights.assetWeightMaint);\n\n return newBank;\n }\n\n static getPrice(\n oraclePrice: OraclePrice,\n priceBias: PriceBias = PriceBias.None,\n weightedPrice: boolean = false,\n ): BigNumber {\n return getPrice(oraclePrice, priceBias, weightedPrice);\n }\n\n static computeQuantityFromUsdValue(\n oraclePrice: OraclePrice,\n usdValue: BigNumber,\n priceBias: PriceBias,\n weightedPrice: boolean,\n ): BigNumber {\n const price = getPrice(oraclePrice, priceBias, weightedPrice);\n return usdValue.div(price);\n }\n\n getTotalAssetQuantity(): BigNumber {\n return getTotalAssetQuantity(this);\n }\n\n getTotalLiabilityQuantity(): BigNumber {\n return getTotalLiabilityQuantity(this);\n }\n\n getAssetQuantity(assetShares: BigNumber): BigNumber {\n return getAssetQuantity(this, assetShares);\n }\n\n getLiabilityQuantity(liabilityShares: BigNumber): BigNumber {\n return getLiabilityQuantity(this, liabilityShares);\n }\n\n getAssetShares(assetQuantity: BigNumber): BigNumber {\n return getAssetShares(this, assetQuantity);\n }\n\n getLiabilityShares(liabilityQuantity: BigNumber): BigNumber {\n return getLiabilityShares(this, liabilityQuantity);\n }\n\n computeAssetUsdValue(\n oraclePrice: OraclePrice,\n assetShares: BigNumber,\n lendrRequirementType: LendrRequirementType,\n priceBias: PriceBias,\n ): BigNumber {\n return computeAssetUsdValue(this, oraclePrice, assetShares, lendrRequirementType, priceBias);\n }\n\n computeLiabilityUsdValue(\n oraclePrice: OraclePrice,\n liabilityShares: BigNumber,\n lendrRequirementType: LendrRequirementType,\n priceBias: PriceBias,\n ): BigNumber {\n return computeLiabilityUsdValue(this, oraclePrice, liabilityShares, lendrRequirementType, priceBias);\n }\n\n computeUsdValue(\n oraclePrice: OraclePrice,\n quantity: BigNumber,\n priceBias: PriceBias,\n weightedPrice: boolean,\n weight?: BigNumber,\n scaleToBase: boolean = true,\n ): BigNumber {\n return computeUsdValue(this, oraclePrice, quantity, priceBias, weightedPrice, weight, scaleToBase);\n }\n\n getAssetWeight(\n lendrRequirementType: LendrRequirementType,\n oraclePrice: OraclePrice,\n ignoreSoftLimits: boolean = false,\n assetWeightInitOverride?: BigNumber,\n ): BigNumber {\n return getAssetWeight(this, lendrRequirementType, oraclePrice, {\n ignoreSoftLimits,\n assetWeightInitOverride,\n });\n }\n\n getLiabilityWeight(lendrRequirementType: LendrRequirementType): BigNumber {\n return getLiabilityWeight(this.config, lendrRequirementType);\n }\n\n computeTvl(oraclePrice: OraclePrice): BigNumber {\n return computeTvl(this, oraclePrice);\n }\n\n computeInterestRates(): {\n lendingRate: BigNumber;\n borrowingRate: BigNumber;\n } {\n return computeInterestRates(this);\n }\n\n computeBaseInterestRate(): BigNumber {\n return computeBaseInterestRate(this);\n }\n\n computeUtilizationRate(): BigNumber {\n return computeUtilizationRate(this);\n }\n\n computeRemainingCapacity(): {\n depositCapacity: BigNumber;\n borrowCapacity: BigNumber;\n } {\n return computeRemainingCapacity(this);\n }\n\n describe(oraclePrice: OraclePrice): string {\n return `\nBank address: ${this.address.toBase58()}\nMint: ${this.mint.toBase58()}, decimals: ${this.mintDecimals}\n\nTotal deposits: ${nativeToUi(this.getTotalAssetQuantity(), this.mintDecimals)}\nTotal borrows: ${nativeToUi(this.getTotalLiabilityQuantity(), this.mintDecimals)}\n\nTotal assets (USD value): ${this.computeAssetUsdValue(\n oraclePrice,\n this.totalAssetShares,\n LendrRequirementType.Equity,\n PriceBias.None,\n )}\nTotal liabilities (USD value): ${this.computeLiabilityUsdValue(\n oraclePrice,\n this.totalLiabilityShares,\n LendrRequirementType.Equity,\n PriceBias.None,\n )}\n\nAsset price (USD): ${Bank.getPrice(oraclePrice, PriceBias.None, false)}\nAsset price Weighted (USD): ${Bank.getPrice(oraclePrice, PriceBias.None, true)}\n\nConfig:\n- Asset weight init: ${this.config.assetWeightInit.toFixed(2)}\n- Asset weight maint: ${this.config.assetWeightMaint.toFixed(2)}\n- Liability weight init: ${this.config.liabilityWeightInit.toFixed(2)}\n- Liability weight maint: ${this.config.liabilityWeightMaint.toFixed(2)}\n\n- Deposit limit: ${this.config.depositLimit}\n- Borrow limit: ${this.config.borrowLimit}\n\nLTVs:\n- Initial: ${new BigNumber(1).div(this.config.liabilityWeightInit).times(100).toFixed(2)}%\n- Maintenance: ${new BigNumber(1).div(this.config.liabilityWeightMaint).times(100).toFixed(2)}%\n`;\n }\n}\n\nclass BankConfig implements BankConfigType {\n constructor(\n public assetWeightInit: BigNumber,\n public assetWeightMaint: BigNumber,\n public readonly liabilityWeightInit: BigNumber,\n public readonly liabilityWeightMaint: BigNumber,\n public readonly depositLimit: BigNumber,\n public readonly borrowLimit: BigNumber,\n public readonly riskTier: RiskTier,\n public readonly totalAssetValueInitLimit: BigNumber,\n public readonly assetTag: AssetTag,\n public readonly oracleSetup: OracleSetup,\n public readonly oracleKeys: PublicKey[],\n public readonly oracleMaxAge: number,\n public readonly interestRateConfig: InterestRateConfig,\n public readonly operationalState: OperationalState,\n public readonly oracleMaxConfidence: number,\n public readonly fixedPrice: BigNumber,\n public readonly configFlags?: BankConfigFlag,\n ) {}\n\n static fromAccountParsed(bankConfigRaw: BankConfigRaw): BankConfig {\n const bankConfig = parseBankConfigRaw(bankConfigRaw);\n return new BankConfig(\n bankConfig.assetWeightInit,\n bankConfig.assetWeightMaint,\n bankConfig.liabilityWeightInit,\n bankConfig.liabilityWeightMaint,\n bankConfig.depositLimit,\n bankConfig.borrowLimit,\n bankConfig.riskTier,\n bankConfig.totalAssetValueInitLimit,\n bankConfig.assetTag,\n bankConfig.oracleSetup,\n bankConfig.oracleKeys,\n bankConfig.oracleMaxAge,\n bankConfig.interestRateConfig,\n bankConfig.operationalState,\n bankConfig.oracleMaxConfidence,\n bankConfig.fixedPrice,\n bankConfig.configFlags,\n );\n }\n}\n\nexport { Bank, BankConfig };\n","import { BorshInstructionCoder } from \"@coral-xyz/anchor\";\nimport { createSessionUnwrapInstruction, createSessionWrapInstructions } from \"@fogo/sessions-sdk\";\nimport {\n createAssociatedTokenAccountIdempotentInstruction,\n getAssociatedTokenAddressSync,\n NATIVE_MINT,\n TOKEN_2022_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { type AccountMeta, ComputeBudgetProgram, PublicKey, type TransactionInstruction } from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport BN from \"bn.js\";\nimport type LendrClient from \"@/clients/client\";\nimport type { BankMap, MintData, OraclePriceMap } from \"@/clients/client\";\nimport type { EstablishedSessionState } from \"@/common/session\";\nimport type { LendrIdlType } from \"@/idl\";\nimport { NoopLogger } from \"@/logger\";\nimport {\n AccountFlags,\n type ActionEmodeImpact,\n type BankType,\n computeAccountValue,\n computeActiveEmodePairs,\n computeEmodeImpacts,\n computeFreeCollateral,\n computeFreeCollateralLegacy,\n computeHealthAccountMetas,\n computeHealthCheckAccounts,\n computeHealthComponents,\n computeHealthComponentsLegacy,\n computeHealthComponentsWithoutBiasLegacy,\n computeNetApy,\n decodeAccountRaw,\n type EmodeImpactStatus,\n type EmodePair,\n type EmodeTag,\n getPrice,\n type LendrAccountRaw,\n type LendrAccountType,\n makePulseHealthIx,\n parseLendrAccountRaw,\n RiskTier,\n simulateAccountHealthCacheWithFallback,\n} from \"@/services\";\nimport instructions from \"~/instructions\";\nimport type { LendrProgram, TLogger } from \"~/types\";\nimport { BankVaultType } from \"~/types\";\nimport { getBankVaultAuthority, makeUnwrapSolIx, makeWrapSolIxs } from \"~/utils\";\nimport { type Amount, type BankMetadataMap, type InstructionsWrapper, type Program, uiToNative } from \"../../common\";\nimport { type OraclePrice, PriceBias } from \"../../services/price/types\";\nimport { Balance } from \"../balance\";\nimport { Bank } from \"../bank\";\n\n/**\n * Creates session-aware wrap instructions for SOL.\n * Uses the session SDK's wrap instruction builders to create instructions\n * that work with Fogo Sessions.\n *\n * Note: The amount transferred must include rent-exempt amount if the account is new.\n * Standard rent-exempt amount for a token account is ~2,039,280 lamports.\n * We add this as a safety margin when the amount is small, as we can't know if the account exists.\n */\nfunction makeSessionWrapSolIxs(\n walletAddress: PublicKey,\n sessionKey: PublicKey,\n payer: PublicKey,\n amount: BigNumber,\n existingBalance?: number,\n): TransactionInstruction[] {\n // createSessionWrapInstructions signature: (sessionKey, walletPublicKey, amount: bigint)\n // It already handles ATA creation, transfer, and sync native - no need to call separately\n\n const nativeAmount = uiToNative(amount, 9).toNumber();\n\n // Standard rent-exempt amount for a token account (165 bytes) is ~2,039,280 lamports\n // If existing balance is 0 or very small, we need to ensure the account has rent\n // Add rent-exempt amount as safety margin if account might be new\n const TOKEN_ACCOUNT_RENT_EXEMPT = 2_039_280;\n const existingBalanceNative = existingBalance ? uiToNative(existingBalance, 9).toNumber() : 0;\n\n // If existing balance is below rent-exempt threshold, add rent to the transfer amount\n // This ensures the account will be rent-exempt after the transfer\n let totalAmount = nativeAmount;\n if (existingBalanceNative < TOKEN_ACCOUNT_RENT_EXEMPT) {\n // Add enough to cover rent if account is new or below rent-exempt\n const rentNeeded = Math.max(0, TOKEN_ACCOUNT_RENT_EXEMPT - existingBalanceNative);\n totalAmount = nativeAmount + rentNeeded;\n } else {\n // Account already has rent, just add small buffer\n totalAmount = nativeAmount + 10000;\n }\n\n return createSessionWrapInstructions(sessionKey, walletAddress, BigInt(totalAmount));\n}\n\n/**\n * Creates a session-aware unwrap instruction for SOL.\n * Uses the session SDK's unwrap instruction builder to create an instruction\n * that works with Fogo Sessions.\n *\n * Note: createSessionUnwrapInstruction signature: (sessionKey, walletPublicKey)\n */\nfunction makeSessionUnwrapSolIx(\n walletAddress: PublicKey,\n sessionKey: PublicKey,\n payer: PublicKey,\n): TransactionInstruction {\n // createSessionUnwrapInstruction signature: (sessionKey, walletPublicKey)\n // No payer parameter needed\n return createSessionUnwrapInstruction(sessionKey, walletAddress);\n}\n\nimport type { HealthCache } from \"../health-cache\";\n\n// ----------------------------------------------------------------------------\n// Client types\n// ----------------------------------------------------------------------------\n\nclass LendrAccount implements LendrAccountType {\n constructor(\n public readonly address: PublicKey,\n public readonly group: PublicKey,\n public readonly authority: PublicKey,\n public readonly balances: Balance[],\n public readonly accountFlags: AccountFlags[],\n public readonly emissionsDestinationAccount: PublicKey,\n public healthCache: HealthCache,\n ) {}\n\n static async fetch(address: PublicKey, client: LendrClient): Promise<LendrAccount> {\n const data: LendrAccountRaw = await client.program.account.lendrAccount.fetch(address);\n return LendrAccount.fromAccountParsed(address, data);\n }\n\n /**\n * @deprecated use decodeAccountRaw instead\n */\n static decode(encoded: Buffer, idl: LendrIdlType): LendrAccountRaw {\n return decodeAccountRaw(encoded, idl);\n }\n\n static decodeAccountRaw(encoded: Buffer, idl: LendrIdlType): LendrAccountRaw {\n return decodeAccountRaw(encoded, idl);\n }\n\n static fromAccountType(account: LendrAccountType) {\n return new LendrAccount(\n account.address,\n account.group,\n account.authority,\n account.balances.map((b) => Balance.fromBalanceType(b)),\n account.accountFlags,\n account.emissionsDestinationAccount,\n account.healthCache,\n );\n }\n\n static fromAccountParsed(lendrAccountPk: PublicKey, accountData: LendrAccountRaw) {\n const props = parseLendrAccountRaw(lendrAccountPk, accountData);\n return new LendrAccount(\n props.address,\n props.group,\n props.authority,\n props.balances,\n props.accountFlags,\n props.emissionsDestinationAccount,\n props.healthCache,\n );\n }\n\n async simulateHealthCache(\n program: Program<LendrIdlType>,\n bankMap: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n bankMetadataMap: BankMetadataMap,\n ) {\n const accountWithHealthCache = await simulateAccountHealthCacheWithFallback({\n program,\n bankMap,\n oraclePrices,\n lendrAccount: this,\n balances: this.balances,\n bankMetadataMap: bankMetadataMap,\n });\n\n return accountWithHealthCache;\n }\n\n static fromAccountDataRaw(lendrAccountPk: PublicKey, rawData: Buffer, idl: LendrIdlType) {\n const lendrAccountData = LendrAccount.decodeAccountRaw(rawData, idl);\n return LendrAccount.fromAccountParsed(lendrAccountPk, lendrAccountData);\n }\n // ----------------------------------------------------------------------------\n // Attributes\n // ----------------------------------------------------------------------------\n\n get activeBalances(): Balance[] {\n return this.balances.filter((b) => b.active);\n }\n\n getBalance(bankPk: PublicKey): Balance {\n return this.activeBalances.find((b) => b.bankPk.equals(bankPk)) ?? Balance.createEmpty(bankPk);\n }\n\n get isDisabled(): boolean {\n return this.accountFlags.includes(AccountFlags.ACCOUNT_DISABLED);\n }\n\n get isFlashLoanEnabled(): boolean {\n return this.accountFlags.includes(AccountFlags.ACCOUNT_IN_FLASHLOAN);\n }\n\n get isTransferAccountAuthorityEnabled(): boolean {\n return this.accountFlags.includes(AccountFlags.ACCOUNT_TRANSFER_AUTHORITY_ALLOWED);\n }\n\n setHealthCache(value: HealthCache) {\n this.healthCache = value;\n }\n\n computeFreeCollateral(opts?: { clamped?: boolean }): BigNumber {\n return computeFreeCollateral(this, opts);\n }\n\n computeFreeCollateralLegacy(\n banks: Map<string, BankType>,\n oraclePrices: Map<string, OraclePrice>,\n opts?: { clamped?: boolean },\n ): BigNumber {\n return computeFreeCollateralLegacy(this.activeBalances, banks, oraclePrices, opts);\n }\n\n computeHealthComponents(lendrReqType: LendrRequirementType): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return computeHealthComponents(this, lendrReqType);\n }\n\n /**\n * @deprecated use computeHealthComponents instead\n */\n computeHealthComponentsLegacy(\n banks: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n lendrReqType: LendrRequirementType,\n excludedBanks: PublicKey[] = [],\n ): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return computeHealthComponentsLegacy(this.activeBalances, banks, oraclePrices, lendrReqType, excludedBanks);\n }\n\n /**\n * @deprecated use computeHealthComponents instead\n */\n computeHealthComponentsWithoutBiasLegacy(\n banks: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n lendrReqType: LendrRequirementType,\n ): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return computeHealthComponentsWithoutBiasLegacy(this.activeBalances, banks, oraclePrices, lendrReqType);\n }\n\n computeAccountValue(): BigNumber {\n return computeAccountValue(this);\n }\n\n computeNetApy(banks: Map<string, Bank>, oraclePrices: Map<string, OraclePrice>): number {\n return computeNetApy(this, this.activeBalances, banks, oraclePrices);\n }\n\n /**\n * Calculate the maximum amount of asset that can be withdrawn from a bank given existing deposits of the asset\n * and the untied collateral of the lendr account.\n *\n * fc = free collateral\n * ucb = untied collateral for bank\n *\n * q = (min(fc, ucb) / (price_lowest_bias * deposit_weight)) + (fc - min(fc, ucb)) / (price_highest_bias * liab_weight)\n *\n *\n *\n * NOTE FOR LIQUIDATORS\n * This function doesn't take into account the collateral received when liquidating an account.\n */\n computeMaxBorrowForBank(\n banks: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n bankAddress: PublicKey,\n opts?: {\n emodeImpactStatus?: EmodeImpactStatus;\n volatilityFactor?: number;\n emodeWeights?: {\n assetWeightMaint: BigNumber;\n assetWeightInit: BigNumber;\n collateralTags: EmodeTag[];\n };\n },\n logger: TLogger = new NoopLogger(),\n ): BigNumber {\n const modifiedBanks = new Map(banks);\n\n if (opts?.emodeWeights) {\n const emodeWeights = opts.emodeWeights; // Create a local reference to avoid null checks\n const collateralTags = emodeWeights.collateralTags;\n\n // Go through each bank and update the ones with matching tag\n banks.forEach((existingBank, bankKey) => {\n // Only apply to banks with matching tag\n if (existingBank.emode?.emodeTag && collateralTags.includes(existingBank.emode.emodeTag)) {\n modifiedBanks.set(\n bankKey,\n Bank.withEmodeWeights(existingBank, {\n assetWeightMaint: emodeWeights.assetWeightMaint,\n assetWeightInit: emodeWeights.assetWeightInit,\n }),\n );\n }\n });\n }\n\n const bank = modifiedBanks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n\n const priceInfo = oraclePrices.get(bankAddress.toBase58());\n if (!priceInfo) throw Error(`Price info for ${bankAddress.toBase58()} not found`);\n\n // -------------------------- //\n // isolated asset constraints //\n // -------------------------- //\n\n const hasLiabilitiesAlready =\n this.activeBalances.filter((b) => b.liabilityShares.gt(0) || !b.bankPk.equals(bankAddress)).length > 0;\n\n const attemptingToBorrowIsolatedAssetWithActiveDebt =\n bank.config.riskTier === RiskTier.Isolated && hasLiabilitiesAlready;\n logger.debug({ attemptingToBorrowIsolatedAssetWithActiveDebt }, \"[lendr:computeMaxBorrowForBank]\");\n\n const existingLiabilityBanks = this.activeBalances\n .filter((b) => b.liabilityShares.gt(0))\n .map((b) => modifiedBanks.get(b.bankPk.toBase58()));\n\n const attemptingToBorrowNewAssetWithExistingIsolatedDebt = existingLiabilityBanks.some(\n (b) => b?.config.riskTier === RiskTier.Isolated && !b?.address.equals(bankAddress),\n );\n logger.debug({ attemptingToBorrowNewAssetWithExistingIsolatedDebt }, \"[lendr:computeMaxBorrowForBank]\");\n\n if (attemptingToBorrowIsolatedAssetWithActiveDebt || attemptingToBorrowNewAssetWithExistingIsolatedDebt) {\n // User can only withdraw\n return this.computeMaxWithdrawForBank(modifiedBanks, oraclePrices, bankAddress, opts);\n }\n\n // ------------- //\n // FC-based calc //\n // ------------- //\n\n const _volatilityFactor = opts?.volatilityFactor ?? 1;\n\n const balance = this.getBalance(bankAddress);\n\n const useCache = false;\n // opts?.emodeImpactStatus === EmodeImpactStatus.InactiveEmode ||\n // opts?.emodeImpactStatus === EmodeImpactStatus.ExtendEmode;\n\n const freeCollateral = useCache\n ? this.computeFreeCollateral().times(_volatilityFactor)\n : this.computeFreeCollateralLegacy(modifiedBanks, oraclePrices).times(_volatilityFactor);\n\n // Apply switchboard variance adjustment to free collateral only when using legacy computation\n // This reduces borrowing power by the amount of switchboard variance risk\n // if (!useCache) {\n // \tfreeCollateral = freeCollateral.minus(switchboardVarianceAdjustment);\n // }\n logger.debug({ freeCollateral: freeCollateral.toFixed(6) }, \"[lendr:computeMaxBorrowForBank] Free collateral\");\n // logger.debug(\n // \t{\n // \t\tswitchboardVarianceAdjustment: switchboardVarianceAdjustment.toFixed(6),\n // \t},\n // \t\"[lendr:computeMaxBorrowForBank] Switchboard variance adjustment\",\n // );\n\n const untiedCollateralForBank = BigNumber.min(\n bank.computeAssetUsdValue(priceInfo, balance.assetShares, LendrRequirementType.Initial, PriceBias.Lowest),\n freeCollateral,\n );\n\n const priceLowestBias = getPrice(priceInfo, PriceBias.Lowest, true);\n const priceHighestBias = getPrice(priceInfo, PriceBias.Highest, true);\n const assetWeight = bank.getAssetWeight(LendrRequirementType.Initial, priceInfo);\n const liabWeight = bank.getLiabilityWeight(LendrRequirementType.Initial);\n\n if (assetWeight.eq(0)) {\n return balance\n .computeQuantityUi(bank)\n .assets.plus(freeCollateral.minus(untiedCollateralForBank).div(priceHighestBias.times(liabWeight)));\n }\n\n return untiedCollateralForBank\n .div(priceLowestBias.times(assetWeight))\n .plus(freeCollateral.minus(untiedCollateralForBank).div(priceHighestBias.times(liabWeight)));\n }\n\n /**\n * Calculate the maximum amount that can be withdrawn form a bank without borrowing.\n */\n computeMaxWithdrawForBank(\n banks: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n bankAddress: PublicKey,\n opts?: { volatilityFactor?: number },\n ): BigNumber {\n const bank = banks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n const priceInfo = oraclePrices.get(bankAddress.toBase58());\n if (!priceInfo) throw Error(`Price info for ${bankAddress.toBase58()} not found`);\n\n const _volatilityFactor = opts?.volatilityFactor ?? 1;\n\n const initAssetWeight = bank.getAssetWeight(LendrRequirementType.Initial, priceInfo);\n const maintAssetWeight = bank.getAssetWeight(LendrRequirementType.Maintenance, priceInfo);\n const balance = this.getBalance(bankAddress);\n\n const freeCollateral = this.computeFreeCollateral();\n const initCollateralForBank = bank.computeAssetUsdValue(\n priceInfo,\n balance.assetShares,\n LendrRequirementType.Initial,\n PriceBias.Lowest,\n );\n\n const entireBalance = balance.computeQuantityUi(bank).assets;\n\n const { liabilities: liabilitiesInit } = this.computeHealthComponents(LendrRequirementType.Initial);\n\n // -------------------------------------------------- //\n // isolated bank (=> init weight = maint weight = 0) //\n // or collateral bank with 0-weights (does not happen //\n // in practice) //\n // -------------------------------------------------- //\n\n if (bank.config.riskTier === RiskTier.Isolated || (initAssetWeight.isZero() && maintAssetWeight.isZero())) {\n if (freeCollateral.isZero() && !liabilitiesInit.isZero()) {\n // if account is already below init requirements and has active debt, prevent any withdrawal even if those don't count as collateral\n // inefficient, but reflective of contract which does not look at action delta, but only end state atm\n return new BigNumber(0);\n } else {\n return entireBalance;\n }\n }\n\n // ----------------------------- //\n // collateral bank being retired //\n // ----------------------------- //\n\n if (initAssetWeight.isZero() && !maintAssetWeight.isZero()) {\n if (liabilitiesInit.eq(0)) {\n return entireBalance;\n } else if (freeCollateral.isZero()) {\n return new BigNumber(0); // inefficient, but reflective of contract which does not look at action delta, but only end state\n } else {\n const { liabilities: maintLiabilities, assets: maintAssets } = this.computeHealthComponents(\n LendrRequirementType.Maintenance,\n );\n const maintUntiedCollateral = maintAssets.minus(maintLiabilities);\n\n const priceLowestBias = getPrice(priceInfo, PriceBias.Lowest, true);\n const maintWeightedPrice = priceLowestBias.times(maintAssetWeight);\n\n return maintUntiedCollateral.div(maintWeightedPrice);\n }\n }\n\n // ------------------------------------- //\n // collateral bank with positive weights //\n // ------------------------------------- //\n // bypass volatility factor if no liabilities or if all collateral is untied\n if (liabilitiesInit.isZero() || initCollateralForBank.lte(freeCollateral)) {\n return entireBalance;\n }\n\n // apply volatility factor to avoid failure due to price volatility / slippage\n const initUntiedCollateralForBank = freeCollateral.times(_volatilityFactor);\n\n const priceLowestBias = getPrice(priceInfo, PriceBias.Lowest, true);\n const initWeightedPrice = priceLowestBias.times(initAssetWeight);\n const maxWithdraw = initUntiedCollateralForBank.div(initWeightedPrice);\n\n return maxWithdraw;\n }\n\n /**\n * Calculate the price at which the user position for the given bank will lead to liquidation, all other prices constant.\n */\n public computeLiquidationPriceForBank(\n banks: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n bankAddress: PublicKey,\n ): number | null {\n const bank = banks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n const priceInfo = oraclePrices.get(bankAddress.toBase58());\n if (!priceInfo) throw Error(`Price info for ${bankAddress.toBase58()} not found`);\n\n const balance = this.getBalance(bankAddress);\n\n if (!balance.active) return null;\n\n const { assets: assetBank, liabilities: liabilitiesBank } = balance.computeUsdValue(\n bank,\n priceInfo,\n LendrRequirementType.Maintenance,\n );\n\n const { assets: assetsAccount, liabilities: liabilitiesAccount } = this.computeHealthComponents(\n LendrRequirementType.Maintenance,\n );\n\n const assets = assetsAccount.minus(assetBank);\n const liabilities = liabilitiesAccount.minus(liabilitiesBank);\n\n const isLending = balance.liabilityShares.isZero();\n const { assets: assetQuantityUi, liabilities: liabQuantitiesUi } = balance.computeQuantityUi(bank);\n\n let liquidationPrice: BigNumber;\n if (isLending) {\n if (liabilities.eq(0)) return null;\n\n const assetWeight = bank.getAssetWeight(LendrRequirementType.Maintenance, priceInfo);\n const priceConfidence = getPrice(priceInfo, PriceBias.None, false).minus(\n getPrice(priceInfo, PriceBias.Lowest, false),\n );\n liquidationPrice = liabilities.minus(assets).div(assetQuantityUi.times(assetWeight)).plus(priceConfidence);\n } else {\n const liabWeight = bank.getLiabilityWeight(LendrRequirementType.Maintenance);\n const priceConfidence = getPrice(priceInfo, PriceBias.Highest, false).minus(\n getPrice(priceInfo, PriceBias.None, false),\n );\n liquidationPrice = assets.minus(liabilities).div(liabQuantitiesUi.times(liabWeight)).minus(priceConfidence);\n }\n if (liquidationPrice.isNaN() || liquidationPrice.lt(0) || !liquidationPrice.isFinite()) return null;\n return liquidationPrice.toNumber();\n }\n\n /**\n * Calculate the price at which the user position for the given bank will lead to liquidation, all other prices constant.\n */\n public computeLiquidationPriceForBankHealth(\n banks: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n bankAddress: PublicKey,\n opts?: {\n assetWeightMaint: BigNumber;\n },\n ): number | null {\n const bank = banks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n const priceInfo = oraclePrices.get(bankAddress.toBase58());\n if (!priceInfo) throw Error(`Price info for ${bankAddress.toBase58()} not found`);\n\n const balance = this.getBalance(bankAddress);\n\n if (!balance.active) return null;\n\n const isLending = balance.liabilityShares.isZero();\n\n const assetValueMaint = this.healthCache.assetValueMaint;\n const liabValueMaint = this.healthCache.liabilityValueMaint;\n\n const { assets: assetQuantityUi, liabilities: liabQuantitiesUi } = balance.computeQuantityUi(bank);\n\n let liquidationPrice: BigNumber;\n if (isLending) {\n if (liabValueMaint.eq(0)) return null;\n\n const assetWeight = bank.getAssetWeight(\n LendrRequirementType.Maintenance,\n priceInfo,\n undefined,\n opts?.assetWeightMaint,\n );\n const priceConfidence = getPrice(priceInfo, PriceBias.None, false).minus(\n getPrice(priceInfo, PriceBias.Lowest, false),\n );\n liquidationPrice = liabValueMaint\n .minus(assetValueMaint)\n .div(assetQuantityUi.times(assetWeight))\n .plus(priceConfidence);\n } else {\n const liabWeight = bank.getLiabilityWeight(LendrRequirementType.Maintenance);\n const priceConfidence = getPrice(priceInfo, PriceBias.Highest, false).minus(\n getPrice(priceInfo, PriceBias.None, false),\n );\n liquidationPrice = assetValueMaint\n .minus(liabValueMaint)\n .div(liabQuantitiesUi.times(liabWeight))\n .minus(priceConfidence);\n }\n if (liquidationPrice.isNaN() || liquidationPrice.lt(0) || !liquidationPrice.isFinite()) return null;\n return liquidationPrice.toNumber();\n }\n\n /**\n * Calculate the price at which the user position for the given bank and amount will lead to liquidation, all other prices constant.\n */\n public computeLiquidationPriceForBankAmount(\n banks: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n bankAddress: PublicKey,\n isLending: boolean,\n amount: number,\n ): number | null {\n const bank = banks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n const priceInfo = oraclePrices.get(bankAddress.toBase58());\n if (!priceInfo) throw Error(`Price info for ${bankAddress.toBase58()} not found`);\n\n const balance = this.getBalance(bankAddress);\n\n if (!balance.active) return null;\n\n const { assets: assetBank, liabilities: liabilitiesBank } = balance.computeUsdValue(\n bank,\n priceInfo,\n LendrRequirementType.Maintenance,\n );\n\n const { assets: assetsAccount, liabilities: liabilitiesAccount } = this.computeHealthComponents(\n LendrRequirementType.Maintenance,\n );\n\n const assets = assetsAccount.minus(assetBank);\n const liabilities = liabilitiesAccount.minus(liabilitiesBank);\n\n const amountBn = new BigNumber(amount);\n\n let liquidationPrice: BigNumber;\n if (isLending) {\n if (liabilities.eq(0)) return null;\n\n const assetWeight = bank.getAssetWeight(LendrRequirementType.Maintenance, priceInfo);\n const priceConfidence = getPrice(priceInfo, PriceBias.None, false).minus(\n getPrice(priceInfo, PriceBias.Lowest, false),\n );\n liquidationPrice = liabilities.minus(assets).div(amountBn.times(assetWeight)).plus(priceConfidence);\n } else {\n const liabWeight = bank.getLiabilityWeight(LendrRequirementType.Maintenance);\n const priceConfidence = getPrice(priceInfo, PriceBias.Highest, false).minus(\n getPrice(priceInfo, PriceBias.None, false),\n );\n liquidationPrice = assets.minus(liabilities).div(amountBn.times(liabWeight)).minus(priceConfidence);\n }\n if (liquidationPrice.isNaN() || liquidationPrice.lt(0)) return null;\n return liquidationPrice.toNumber();\n }\n\n // Calculate the max amount of collateral to liquidate to bring an account maint health to 0 (assuming negative health).\n //\n // The asset amount is bounded by 2 constraints,\n // (1) the amount of liquidated collateral cannot be more than the balance,\n // (2) the amount of covered liablity cannot be more than existing liablity.\n computeMaxLiquidatableAssetAmount(\n banks: Map<string, Bank>,\n oraclePrices: Map<string, OraclePrice>,\n assetBankAddress: PublicKey,\n liabilityBankAddress: PublicKey,\n logger: TLogger = new NoopLogger(),\n ): BigNumber {\n const assetBank = banks.get(assetBankAddress.toBase58());\n if (!assetBank) throw Error(`Bank ${assetBankAddress.toBase58()} not found`);\n const assetPriceInfo = oraclePrices.get(assetBankAddress.toBase58());\n if (!assetPriceInfo) throw Error(`Price info for ${assetBankAddress.toBase58()} not found`);\n\n const liabilityBank = banks.get(liabilityBankAddress.toBase58());\n if (!liabilityBank) throw Error(`Bank ${liabilityBankAddress.toBase58()} not found`);\n const liabilityPriceInfo = oraclePrices.get(liabilityBankAddress.toBase58());\n if (!liabilityPriceInfo) throw Error(`Price info for ${liabilityBankAddress.toBase58()} not found`);\n\n const { assets, liabilities } = this.computeHealthComponents(LendrRequirementType.Maintenance);\n const currentHealth = assets.minus(liabilities);\n\n const priceAssetLower = getPrice(assetPriceInfo, PriceBias.Lowest, false);\n const priceAssetMarket = getPrice(assetPriceInfo, PriceBias.None, false);\n const assetMaintWeight = assetBank.config.assetWeightMaint;\n\n const liquidationDiscount = new BigNumber(0.95);\n\n const priceLiabHighest = getPrice(liabilityPriceInfo, PriceBias.Highest, false);\n const priceLiabMarket = getPrice(liabilityPriceInfo, PriceBias.None, false);\n const liabMaintWeight = liabilityBank.config.liabilityWeightMaint;\n\n logger.debug(\n {\n currentHealth: currentHealth.toFixed(6),\n assetMaintWeight,\n liabMaintWeight,\n liquidationDiscount,\n },\n \"[lendr:getMaxLiquidatableAssetAmount]\",\n );\n\n const underwaterMaintUsdValue = currentHealth.div(\n assetMaintWeight.minus(liabMaintWeight.times(liquidationDiscount)),\n );\n\n logger.debug(\n { underwaterMaintUsdValue: underwaterMaintUsdValue.toFixed(6) },\n \"[lendr:getMaxLiquidatableAssetAmount] Underwater maint usd to adjust\",\n );\n\n // MAX asset amount bounded by available asset amount\n const assetBalance = this.getBalance(assetBankAddress);\n const assetsAmountUi = assetBalance.computeQuantityUi(assetBank).assets;\n const assetsUsdValue = assetsAmountUi.times(priceAssetLower);\n\n // MAX asset amount bounded by available liability amount\n const liabilityBalance = this.getBalance(liabilityBankAddress);\n const liabilitiesAmountUi = liabilityBalance.computeQuantityUi(liabilityBank).liabilities;\n const liabUsdValue = liabilitiesAmountUi.times(liquidationDiscount).times(priceLiabHighest);\n logger.debug(\n {\n assetsAmountUi: assetsAmountUi.toFixed(6),\n priceAssetMarket: priceAssetMarket.toFixed(6),\n assetsUsdValue: assetsUsdValue.times(priceAssetMarket).toFixed(6),\n liabilitiesAmountUi: liabilitiesAmountUi.toFixed(6),\n priceLiabMarket: priceLiabMarket.toFixed(6),\n liabUsdValue: liabUsdValue.toFixed(6),\n },\n \"[lendr:getMaxLiquidatableAssetAmount]\",\n );\n\n const maxLiquidatableUsdValue = BigNumber.min(assetsUsdValue, underwaterMaintUsdValue, liabUsdValue);\n logger.debug(\n {\n maxLiquidatableUsdValue: maxLiquidatableUsdValue.toFixed(6),\n },\n \"[lendr:getMaxLiquidatableAssetAmount] Max liquidatable usd value\",\n );\n\n return maxLiquidatableUsdValue.div(priceAssetLower);\n }\n\n getHealthCheckAccounts(\n banks: Map<string, Bank>,\n mandatoryBanks: PublicKey[] = [],\n excludedBanks: PublicKey[] = [],\n ): BankType[] {\n return computeHealthCheckAccounts(this.balances, banks, mandatoryBanks, excludedBanks);\n }\n\n /**\n * Determines which E-mode pairs are currently active for this account based on its balances\n *\n * @param emodePairs - All available E-mode pairs to check against the account's balances\n * @returns Array of active E-mode pairs for this account, or empty array if no E-mode is active\n */\n computeActiveEmodePairs(emodePairs: EmodePair[]): EmodePair[] {\n const activeLiabilities = this.activeBalances\n .filter((balance) => balance.liabilityShares.gt(0))\n .map((balance) => balance.bankPk);\n const activeCollateral = this.activeBalances\n .filter((balance) => balance.assetShares.gt(0))\n .map((balance) => balance.bankPk);\n return computeActiveEmodePairs(emodePairs, activeLiabilities, activeCollateral);\n }\n\n /**\n * Calculates the impact of different actions on E-mode status for each bank\n *\n * For each bank, this method simulates the following actions and their effect on E-mode:\n * - Borrowing from the bank (for banks not currently borrowed from)\n * - Supplying to the bank (for supported collateral banks not currently supplied)\n * - Repaying all borrowing from the bank (for banks with active liabilities)\n * - Withdrawing all supply from the bank (for banks with active collateral)\n *\n * @param emodePairs - All available E-mode pairs to check against\n * @param banks - Array of bank PublicKeys to calculate impacts for\n * @returns Object mapping bank PublicKey strings to impact analysis for each possible action\n */\n computeEmodeImpacts(emodePairs: EmodePair[], banks: PublicKey[]): Record<string, ActionEmodeImpact> {\n const activeLiabilities = this.activeBalances\n .filter((balance) => balance.liabilityShares.gt(0))\n .map((balance) => balance.bankPk);\n const activeCollateral = this.activeBalances\n .filter((balance) => balance.assetShares.gt(0))\n .map((balance) => balance.bankPk);\n\n return computeEmodeImpacts(emodePairs, activeLiabilities, activeCollateral, banks);\n }\n\n // ----------------------------------------------------------------------------\n // Actions\n // ----------------------------------------------------------------------------\n\n async prepareDepositIx(\n banks: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n amount: Amount,\n bankAddress: PublicKey,\n opts: MakeDepositIxOpts = {},\n ) {\n const bank = banks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n const mintData = mintDatas.get(bankAddress.toBase58());\n if (!mintData) throw Error(`Mint for bank ${bankAddress.toBase58()} not found`);\n\n const wrapAndUnwrapSol = opts.wrapAndUnwrapSol ?? true;\n const wSolBalanceUi = opts.wSolBalanceUi ?? 0;\n\n const userTokenAtaPk = getAssociatedTokenAddressSync(bank.mint, this.authority, true, mintData.tokenProgram); // We allow off curve addresses here to support Fuse.\n\n const remainingAccounts: AccountMeta[] = [];\n\n // Add bank and oracle accounts (required by fetch_asset_price_for_bank)\n // IMPORTANT: Pass the oracle key from bank.config.oracleKeys[0] (what's stored on-chain),\n // NOT bank.oracleKey (which is the derived PDA for display purposes)\n remainingAccounts.push(\n { pubkey: bank.address, isSigner: false, isWritable: false },\n { pubkey: bank.config.oracleKeys[0], isSigner: false, isWritable: false },\n );\n\n // Add TOKEN_2022 mint if needed\n if (mintData.tokenProgram.equals(TOKEN_2022_PROGRAM_ID)) {\n remainingAccounts.push({ pubkey: mintData.mint, isSigner: false, isWritable: false });\n }\n\n const depositIxs: Array<TransactionInstruction> = [];\n\n if (bank.mint.equals(NATIVE_MINT) && wrapAndUnwrapSol) {\n depositIxs.push(...makeWrapSolIxs(this.authority, new BigNumber(amount).minus(wSolBalanceUi)));\n }\n\n return {\n depositIxs,\n userTokenAtaPk,\n mintData,\n bank,\n ixArguments: { amount: uiToNative(amount, bank.mintDecimals) },\n remainingAccounts,\n };\n }\n\n async makeDepositIx(\n program: LendrProgram,\n banks: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n amount: Amount,\n bankAddress: PublicKey,\n opts: MakeDepositIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const { depositIxs, ixArguments, userTokenAtaPk, mintData, bank, remainingAccounts } = await this.prepareDepositIx(\n banks,\n mintDatas,\n amount,\n bankAddress,\n opts,\n );\n\n const depositIx = await instructions.makeDepositIx(\n program,\n {\n lendrAccount: this.address,\n signerTokenAccount: userTokenAtaPk,\n bank: bankAddress,\n tokenProgram: mintData.tokenProgram,\n authority: opts.overrideInferAccounts?.authority ?? this.authority,\n group: opts.overrideInferAccounts?.group ?? this.group,\n liquidityVault: opts.overrideInferAccounts?.liquidityVault ?? bank.liquidityVault,\n },\n ixArguments,\n remainingAccounts.map((account) => ({\n pubkey: account.pubkey,\n isSigner: false,\n isWritable: false,\n })),\n );\n depositIxs.push(depositIx);\n\n return {\n instructions: depositIxs,\n keys: [],\n };\n }\n\n async makeDepositWithSessionIx(\n program: LendrProgram,\n banks: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n opts: MakeDepositWithSessionIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const bank = banks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n\n // Prepare deposit without wrap/unwrap (we'll add session-aware wrap separately)\n const { depositIxs, ixArguments, userTokenAtaPk, mintData, remainingAccounts } = await this.prepareDepositIx(\n banks,\n mintDatas,\n amount,\n bankAddress,\n { ...opts, wrapAndUnwrapSol: false },\n );\n\n const accounts = {\n sessionKey: session.sessionPublicKey,\n lendrAccount: this.address,\n bank: bankAddress,\n signerTokenAccount: userTokenAtaPk,\n tokenProgram: mintData.tokenProgram,\n group: opts.overrideInferAccounts?.group ?? this.group,\n liquidityVault: opts.overrideInferAccounts?.liquidityVault,\n };\n\n const depositIx = await instructions.makeDepositWithSessionIx(program, accounts, ixArguments, remainingAccounts);\n\n // Add session-aware wrap instructions if native SOL (before the deposit instruction)\n if (bank.mint.equals(NATIVE_MINT)) {\n const wSolBalanceUi = opts.wSolBalanceUi ?? 0;\n const wrapAmount = new BigNumber(amount).minus(wSolBalanceUi);\n const wrapIxs = makeSessionWrapSolIxs(\n session.walletPublicKey,\n session.sessionPublicKey,\n session.payer,\n wrapAmount,\n wSolBalanceUi, // Pass existing balance to calculate rent correctly\n );\n depositIxs.push(...wrapIxs);\n }\n\n depositIxs.push(depositIx);\n\n return {\n instructions: depositIxs,\n keys: [],\n };\n }\n\n async makeSettleEmissionsIx(program: LendrProgram, bank: PublicKey): Promise<InstructionsWrapper> {\n const settleEmissionsIx = await instructions.makeLendingAccountSettleEmissionsIx(program, {\n lendrAccount: this.address,\n bank: bank,\n });\n\n return {\n instructions: [settleEmissionsIx],\n keys: [],\n };\n }\n\n async prepareRepayInstruction(\n program: LendrProgram,\n banks: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n amount: Amount,\n bankAddress: PublicKey,\n repayAll = false,\n opts: MakeRepayIxOpts = {},\n ) {\n const bank = banks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n const mintData = mintDatas.get(bankAddress.toBase58());\n if (!mintData) throw Error(`Mint data for bank ${bankAddress.toBase58()} not found`);\n\n const wrapAndUnwrapSol = opts.wrapAndUnwrapSol ?? true;\n const wSolBalanceUi = opts.wSolBalanceUi ?? 0;\n\n const repayIxs: Array<TransactionInstruction> = [];\n\n // Add emissions-related instructions if necessary\n if (repayAll && !bank.emissionsMint.equals(PublicKey.default)) {\n repayIxs.push(...(await this.makeWithdrawEmissionsIx(program, banks, mintDatas, bankAddress)).instructions);\n }\n\n // Add repay-related instructions\n const userAta = getAssociatedTokenAddressSync(bank.mint, this.authority, true, mintData.tokenProgram); // We allow off curve addresses here to support Fuse.\n\n const remainingAccounts: PublicKey[] = [];\n\n // Add bank and oracle accounts (required by fetch_asset_price_for_bank)\n // IMPORTANT: Pass the oracle key from bank.config.oracleKeys[0] (what's stored on-chain),\n // NOT bank.oracleKey (which is the derived PDA for display purposes)\n remainingAccounts.push(bank.address, bank.config.oracleKeys[0]);\n\n // Add TOKEN_2022 mint if needed\n if (mintData.tokenProgram.equals(TOKEN_2022_PROGRAM_ID)) {\n remainingAccounts.push(mintData.mint);\n }\n\n if (bank.mint.equals(NATIVE_MINT) && wrapAndUnwrapSol) {\n repayIxs.push(...makeWrapSolIxs(this.authority, new BigNumber(amount).minus(wSolBalanceUi)));\n }\n return {\n repayIxs,\n mintData,\n bank,\n userAta,\n ixArguments: { amount: uiToNative(amount, bank.mintDecimals), repayAll },\n remainingAccounts,\n };\n }\n\n async makeRepayIx(\n program: LendrProgram,\n banks: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n amount: Amount,\n bankAddress: PublicKey,\n repayAll = false,\n opts: MakeRepayIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const { repayIxs, ixArguments, userAta, mintData, bank, remainingAccounts } = await this.prepareRepayInstruction(\n program,\n banks,\n mintDatas,\n amount,\n bankAddress,\n repayAll,\n opts,\n );\n\n const repayIx = await instructions.makeRepayIx(\n program,\n {\n lendrAccount: this.address,\n signerTokenAccount: userAta,\n bank: bankAddress,\n tokenProgram: mintData.tokenProgram,\n authority: opts.overrideInferAccounts?.authority ?? this.authority,\n group: opts.overrideInferAccounts?.group ?? this.group,\n liquidityVault: opts.overrideInferAccounts?.liquidityVault ?? bank.liquidityVault,\n },\n ixArguments,\n remainingAccounts.map((account) => ({\n pubkey: account,\n isSigner: false,\n isWritable: false,\n })),\n );\n repayIxs.push(repayIx);\n\n return {\n instructions: repayIxs,\n keys: [],\n };\n }\n\n async makeRepayWithSessionIx(\n program: LendrProgram,\n banks: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n repayAll = false,\n opts: MakeRepayWithSessionIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const bank = banks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n\n // Prepare repay without wrap/unwrap (we'll add session-aware wrap separately)\n const { repayIxs, ixArguments, userAta, mintData, remainingAccounts } = await this.prepareRepayInstruction(\n program,\n banks,\n mintDatas,\n amount,\n bankAddress,\n repayAll,\n { ...opts, wrapAndUnwrapSol: false },\n );\n\n const repayIx = await instructions.makeRepayWithSessionIx(\n program,\n {\n sessionKey: session.sessionPublicKey,\n lendrAccount: this.address,\n signerTokenAccount: userAta,\n bank: bankAddress,\n tokenProgram: mintData.tokenProgram,\n group: opts.overrideInferAccounts?.group,\n liquidityVault: opts.overrideInferAccounts?.liquidityVault,\n },\n ixArguments,\n remainingAccounts.map((account) => ({\n pubkey: account,\n isSigner: false,\n isWritable: false,\n })),\n );\n\n // Add session-aware wrap instructions if native SOL (before the repay instruction)\n if (bank.mint.equals(NATIVE_MINT)) {\n const wSolBalanceUi = opts.wSolBalanceUi ?? 0;\n const wrapAmount = new BigNumber(amount).minus(wSolBalanceUi);\n const wrapIxs = makeSessionWrapSolIxs(\n session.walletPublicKey,\n session.sessionPublicKey,\n session.payer,\n wrapAmount.plus(0.00096071), // add buffer in case more is needed\n wSolBalanceUi, // Pass existing balance to calculate rent correctly\n );\n repayIxs.push(...wrapIxs);\n }\n\n repayIxs.push(repayIx);\n\n // Add session-aware unwrap instruction if native SOL (after the repay instruction)\n if (bank.mint.equals(NATIVE_MINT)) {\n // Use session-aware unwrap instruction\n repayIxs.push(makeSessionUnwrapSolIx(session.walletPublicKey, session.sessionPublicKey, session.payer));\n }\n\n return {\n instructions: repayIxs,\n keys: [],\n };\n }\n\n async prepareWithdrawInstruction(\n program: LendrProgram,\n bankMap: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n bankMetadataMap: BankMetadataMap,\n bankAddress: PublicKey,\n withdrawAll = false,\n withdrawOpts: MakeWithdrawIxOpts & { createAtaPayer?: PublicKey } = {},\n ) {\n const bank = bankMap.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n const mintData = mintDatas.get(bankAddress.toBase58());\n if (!mintData) throw Error(`Mint data for bank ${bankAddress.toBase58()} not found`);\n\n const wrapAndUnwrapSol = withdrawOpts.wrapAndUnwrapSol ?? true;\n const createAtas = withdrawOpts.createAtas ?? true;\n\n const withdrawIxs: Array<TransactionInstruction> = [];\n\n // Add emissions-related instructions if necessary\n if (withdrawAll && !bank.emissionsMint.equals(PublicKey.default) && mintData.emissionTokenProgram) {\n withdrawIxs.push(...(await this.makeWithdrawEmissionsIx(program, bankMap, mintDatas, bankAddress)).instructions);\n }\n\n const userAta = getAssociatedTokenAddressSync(bank.mint, this.authority, true, mintData.tokenProgram); // We allow off curve addresses here to support Fuse.\n\n if (createAtas) {\n const createAtaIdempotentIx = createAssociatedTokenAccountIdempotentInstruction(\n withdrawOpts?.createAtaPayer ?? this.authority,\n userAta,\n this.authority,\n bank.mint,\n mintData.tokenProgram,\n );\n withdrawIxs.push(createAtaIdempotentIx);\n }\n\n const healthAccounts = withdrawAll\n ? this.getHealthCheckAccounts(bankMap, [], [bankAddress])\n : this.getHealthCheckAccounts(bankMap, [bankAddress], []);\n\n // Add withdraw-related instructions\n const remainingAccounts: PublicKey[] = [];\n if (mintData.tokenProgram.equals(TOKEN_2022_PROGRAM_ID)) {\n remainingAccounts.push(mintData.mint);\n }\n\n if (withdrawOpts.observationBanksOverride) {\n remainingAccounts.push(...withdrawOpts.observationBanksOverride);\n } else {\n const accountMetas = computeHealthAccountMetas(healthAccounts, bankMetadataMap);\n remainingAccounts.push(...accountMetas);\n }\n\n if (withdrawAll) {\n remainingAccounts.push(bank.address, bank.config.oracleKeys[0]);\n\n if (bank.config.assetTag === 2) {\n const bankMetadata = bankMetadataMap?.[bankAddress.toBase58()];\n if (!bankMetadata?.validatorVoteAccount) {\n throw Error(`No validator vote account for staked bank ${bankAddress.toBase58()}`);\n }\n const { findPoolAddress, findPoolStakeAddress, findPoolMintAddress } = require(\"../../vendor/single-spl-pool\");\n const pool = findPoolAddress(new PublicKey(bankMetadata.validatorVoteAccount));\n const solPool = findPoolStakeAddress(pool);\n const lstMint = findPoolMintAddress(pool);\n remainingAccounts.push(lstMint, solPool);\n }\n }\n\n return {\n withdrawIxs,\n wrapAndUnwrapSol,\n mintData,\n userAta,\n bank,\n remainingAccounts: remainingAccounts.map((account) => ({\n pubkey: account,\n isSigner: false,\n isWritable: false,\n })),\n };\n }\n\n async makeWithdrawIx(\n program: LendrProgram,\n bankMap: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n bankMetadataMap: BankMetadataMap,\n amount: Amount,\n bankAddress: PublicKey,\n withdrawAll = false,\n withdrawOpts: MakeWithdrawIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const { withdrawIxs, wrapAndUnwrapSol, userAta, mintData, bank, remainingAccounts } =\n await this.prepareWithdrawInstruction(\n program,\n bankMap,\n mintDatas,\n bankMetadataMap,\n bankAddress,\n withdrawAll,\n withdrawOpts,\n );\n\n const [bankLiquidityVaultAuthority] = getBankVaultAuthority(\n BankVaultType.LiquidityVault,\n bank.address,\n program.programId,\n );\n\n const withdrawIx = await instructions.makeWithdrawIx(\n program,\n {\n lendrAccount: this.address,\n bank: bank.address,\n destinationTokenAccount: userAta,\n tokenProgram: mintData.tokenProgram,\n authority: withdrawOpts.overrideInferAccounts?.authority ?? this.authority,\n group: withdrawOpts.overrideInferAccounts?.group ?? this.group,\n bankLiquidityVaultAuthority,\n liquidityVault: bank.liquidityVault,\n },\n { amount: uiToNative(amount, bank.mintDecimals), withdrawAll },\n remainingAccounts,\n );\n withdrawIxs.push(withdrawIx);\n\n if (wrapAndUnwrapSol && bank.mint.equals(NATIVE_MINT)) {\n withdrawIxs.push(makeUnwrapSolIx(this.authority));\n }\n\n return {\n instructions: withdrawIxs,\n keys: [],\n };\n }\n\n async makeWithdrawWithSessionIx(\n program: LendrProgram,\n bankMap: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n bankMetadataMap: BankMetadataMap,\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n withdrawAll = false,\n withdrawOpts: MakeWithdrawWithSessionIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const { withdrawIxs, wrapAndUnwrapSol, userAta, mintData, bank, remainingAccounts } =\n await this.prepareWithdrawInstruction(program, bankMap, mintDatas, bankMetadataMap, bankAddress, withdrawAll, {\n ...withdrawOpts,\n createAtaPayer: session.payer,\n });\n\n const withdrawIx = await instructions.makeWithdrawWithSessionIx(\n program,\n {\n sessionKey: session.sessionPublicKey,\n lendrAccount: this.address,\n bank: bank.address,\n destinationTokenAccount: userAta,\n tokenProgram: mintData.tokenProgram,\n group: withdrawOpts.overrideInferAccounts?.group,\n },\n { amount: uiToNative(amount, bank.mintDecimals), withdrawAll },\n remainingAccounts,\n );\n withdrawIxs.push(withdrawIx);\n\n if (wrapAndUnwrapSol && bank.mint.equals(NATIVE_MINT)) {\n // Use session-aware unwrap instruction\n withdrawIxs.push(makeSessionUnwrapSolIx(session.walletPublicKey, session.sessionPublicKey, session.payer));\n }\n\n return {\n instructions: withdrawIxs,\n keys: [],\n };\n }\n\n async prepareBorrowInstrcution(\n bankMap: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n bankMetadataMap: BankMetadataMap,\n bankAddress: PublicKey,\n borrowOpts: MakeBorrowIxOpts & { createAtaPayer?: PublicKey } = {},\n ) {\n const bank = bankMap.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n const mintData = mintDatas.get(bankAddress.toBase58());\n if (!mintData) throw Error(`Mint data for bank ${bankAddress.toBase58()} not found`);\n\n const wrapAndUnwrapSol = borrowOpts.wrapAndUnwrapSol ?? true;\n const createAtas = borrowOpts.createAtas ?? true;\n\n const borrowIxs: TransactionInstruction[] = [];\n\n const userAta = getAssociatedTokenAddressSync(bank.mint, this.authority, true, mintData.tokenProgram); // We allow off curve addresses here to support Fuse.\n\n if (createAtas) {\n const createAtaIdempotentIx = createAssociatedTokenAccountIdempotentInstruction(\n borrowOpts?.createAtaPayer ?? this.authority,\n userAta,\n this.authority,\n bank.mint,\n mintData.tokenProgram,\n );\n borrowIxs.push(createAtaIdempotentIx);\n }\n\n const healthAccounts = this.getHealthCheckAccounts(bankMap, [bankAddress], []);\n\n const remainingAccounts: PublicKey[] = [];\n\n if (mintData.tokenProgram.equals(TOKEN_2022_PROGRAM_ID)) {\n remainingAccounts.push(mintData.mint);\n }\n if (borrowOpts?.observationBanksOverride) {\n remainingAccounts.push(...borrowOpts.observationBanksOverride);\n } else {\n const accountMetas = computeHealthAccountMetas(healthAccounts, bankMetadataMap);\n remainingAccounts.push(...accountMetas);\n }\n\n return {\n borrowIxs,\n bank,\n mintData,\n userAta,\n wrapAndUnwrapSol,\n remainingAccounts: remainingAccounts.map((account) => ({\n pubkey: account,\n isSigner: false,\n isWritable: false,\n })),\n };\n }\n\n async makeBorrowIx(\n program: LendrProgram,\n bankMap: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n bankMetadataMap: BankMetadataMap,\n amount: Amount,\n bankAddress: PublicKey,\n borrowOpts: MakeBorrowIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const { borrowIxs, bank, mintData, userAta, remainingAccounts, wrapAndUnwrapSol } =\n await this.prepareBorrowInstrcution(bankMap, mintDatas, bankMetadataMap, bankAddress, borrowOpts);\n\n const [bankLiquidityVaultAuthority] = getBankVaultAuthority(\n BankVaultType.LiquidityVault,\n bank.address,\n program.programId,\n );\n\n const borrowIx = await instructions.makeBorrowIx(\n program,\n {\n lendrAccount: this.address,\n bank: bank.address,\n destinationTokenAccount: userAta,\n tokenProgram: mintData.tokenProgram,\n authority: borrowOpts?.overrideInferAccounts?.authority ?? this.authority,\n group: borrowOpts?.overrideInferAccounts?.group ?? this.group,\n bankLiquidityVaultAuthority,\n liquidityVault: bank.liquidityVault,\n },\n { amount: uiToNative(amount, bank.mintDecimals) },\n remainingAccounts,\n );\n borrowIxs.push(borrowIx);\n\n if (bank.mint.equals(NATIVE_MINT) && wrapAndUnwrapSol) {\n borrowIxs.push(makeUnwrapSolIx(this.authority));\n }\n\n return {\n instructions: borrowIxs,\n keys: [],\n };\n }\n\n async makeBorrowWithSessionIx(\n program: LendrProgram,\n bankMap: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n bankMetadataMap: BankMetadataMap,\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n borrowOpts: MakeBorrowWithSessionIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const { borrowIxs, bank, mintData, userAta, remainingAccounts, wrapAndUnwrapSol } =\n await this.prepareBorrowInstrcution(bankMap, mintDatas, bankMetadataMap, bankAddress, {\n ...borrowOpts,\n createAtaPayer: session.payer,\n });\n\n const borrowIx = await instructions.makeBorrowWithSessionIx(\n program,\n {\n sessionKey: session.sessionPublicKey,\n lendrAccount: this.address,\n bank: bank.address,\n destinationTokenAccount: userAta,\n tokenProgram: mintData.tokenProgram,\n group: borrowOpts?.overrideInferAccounts?.group,\n },\n { amount: uiToNative(amount, bank.mintDecimals) },\n remainingAccounts,\n );\n borrowIxs.push(borrowIx);\n\n if (bank.mint.equals(NATIVE_MINT) && wrapAndUnwrapSol) {\n // Use session-aware unwrap instruction\n borrowIxs.push(makeSessionUnwrapSolIx(session.walletPublicKey, session.sessionPublicKey, session.payer));\n }\n\n return {\n instructions: borrowIxs,\n keys: [],\n };\n }\n\n async makeWithdrawEmissionsIx(\n program: LendrProgram,\n banks: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n bankAddress: PublicKey,\n ): Promise<InstructionsWrapper> {\n const bank = banks.get(bankAddress.toBase58());\n if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);\n const mintData = mintDatas.get(bankAddress.toBase58());\n if (!mintData) throw Error(`Mint data for bank ${bankAddress.toBase58()} not found`);\n if (!mintData.emissionTokenProgram) {\n throw Error(`Emission token program not found for bank ${bankAddress.toBase58()}`);\n }\n\n const ixs: Array<TransactionInstruction> = [];\n\n const userAta = getAssociatedTokenAddressSync(\n bank.emissionsMint,\n this.authority,\n true,\n mintData.emissionTokenProgram,\n ); // We allow off curve addresses here to support Fuse.\n const createAtaIdempotentIx = createAssociatedTokenAccountIdempotentInstruction(\n this.authority,\n userAta,\n this.authority,\n bank.emissionsMint,\n mintData.emissionTokenProgram,\n );\n ixs.push(createAtaIdempotentIx);\n\n const withdrawEmissionsIx = await instructions.makelendingAccountWithdrawEmissionIx(program, {\n lendrAccount: this.address,\n destinationAccount: userAta,\n bank: bank.address,\n tokenProgram: mintData.emissionTokenProgram,\n });\n ixs.push(withdrawEmissionsIx);\n\n return { instructions: ixs, keys: [] };\n }\n\n async makeLendingAccountLiquidateIx(\n liquidateeLendrAccount: LendrAccount,\n program: LendrProgram,\n bankMap: Map<string, Bank>,\n mintDatas: Map<string, MintData>,\n bankMetadataMap: BankMetadataMap,\n assetBankAddress: PublicKey,\n assetQuantityUi: Amount,\n liabilityBankAddress: PublicKey,\n ): Promise<InstructionsWrapper> {\n const assetBank = bankMap.get(assetBankAddress.toBase58());\n if (!assetBank) throw Error(`Asset bank ${assetBankAddress.toBase58()} not found`);\n const liabilityBank = bankMap.get(liabilityBankAddress.toBase58());\n if (!liabilityBank) throw Error(`Liability bank ${liabilityBankAddress.toBase58()} not found`);\n const liabilityMintData = mintDatas.get(liabilityBankAddress.toBase58());\n if (!liabilityMintData) throw Error(`Mint data for bank ${liabilityBankAddress.toBase58()} not found`);\n\n const ixs: Array<TransactionInstruction> = [];\n\n const liquidatorHealthAccounts = this.getHealthCheckAccounts(bankMap, [liabilityBankAddress, assetBankAddress], []);\n const liquidateeHealthAccounts = liquidateeLendrAccount.getHealthCheckAccounts(bankMap, [], []);\n\n const healthAccounts = [...liquidatorHealthAccounts, ...liquidateeHealthAccounts];\n\n const remainingAccounts: PublicKey[] = [];\n\n if (liabilityMintData.tokenProgram.equals(TOKEN_2022_PROGRAM_ID)) {\n remainingAccounts.push(liabilityMintData.mint);\n }\n\n const accountMetas = computeHealthAccountMetas(healthAccounts, bankMetadataMap);\n remainingAccounts.push(...accountMetas);\n\n ixs.push(ComputeBudgetProgram.setComputeUnitLimit({ units: 1_400_000 }));\n const liquidateIx = await instructions.makeLendingAccountLiquidateIx(\n program,\n {\n assetBank: assetBankAddress,\n liabBank: liabilityBankAddress,\n liquidatorLendrAccount: this.address,\n liquidateeLendrAccount: liquidateeLendrAccount.address,\n tokenProgram: liabilityMintData.tokenProgram,\n },\n //Check: need to handle liquidateAll later, for now just use default value of false for backward compatibility\n {\n assetAmount: uiToNative(assetQuantityUi, assetBank.mintDecimals),\n liquidateeAccounts: liquidateeHealthAccounts.length,\n liquidatorAccounts: liquidatorHealthAccounts.length,\n },\n remainingAccounts.map((account) => ({\n pubkey: account,\n isSigner: false,\n isWritable: false,\n })),\n );\n ixs.push(liquidateIx);\n\n return { instructions: ixs, keys: [] };\n }\n\n async makeBeginFlashLoanIx(program: LendrProgram, endIndex: number): Promise<InstructionsWrapper> {\n const ix = await instructions.makeBeginFlashLoanIx(\n program,\n {\n lendrAccount: this.address,\n },\n { endIndex: new BN(endIndex) },\n );\n return { instructions: [ix], keys: [] };\n }\n\n async makeBeginFlashLoanWithSessionIx(\n program: LendrProgram,\n endIndex: number,\n sessionKey: PublicKey,\n ): Promise<InstructionsWrapper> {\n const ix = await instructions.makeBeginFlashLoanWithSessionIx(\n program,\n {\n sessionKey,\n lendrAccount: this.address,\n },\n { endIndex: new BN(endIndex) },\n );\n return { instructions: [ix], keys: [] };\n }\n\n async makeEndFlashLoanIx(\n program: LendrProgram,\n bankMap: Map<string, Bank>,\n projectedActiveBalances: PublicKey[],\n ): Promise<InstructionsWrapper> {\n const banks = projectedActiveBalances.map((account) => {\n const b = bankMap.get(account.toBase58());\n if (!b) throw Error(`Bank ${account.toBase58()} not found`);\n return b;\n });\n const remainingAccounts = computeHealthAccountMetas(banks);\n const ix = await instructions.makeEndFlashLoanIx(\n program,\n {\n lendrAccount: this.address,\n },\n remainingAccounts.map((account) => ({\n pubkey: account,\n isSigner: false,\n isWritable: false,\n })),\n );\n\n return { instructions: [ix], keys: [] };\n }\n\n async makeEndFlashLoanWithSessionIx(\n program: LendrProgram,\n bankMap: Map<string, Bank>,\n projectedActiveBalances: PublicKey[],\n sessionKey: PublicKey,\n ): Promise<InstructionsWrapper> {\n const banks = projectedActiveBalances.map((account) => {\n const b = bankMap.get(account.toBase58());\n if (!b) throw Error(`Bank ${account.toBase58()} not found`);\n return b;\n });\n const remainingAccounts = computeHealthAccountMetas(banks);\n const ix = await instructions.makeEndFlashLoanWithSessionIx(\n program,\n {\n sessionKey,\n lendrAccount: this.address,\n },\n remainingAccounts.map((account) => ({\n pubkey: account,\n isSigner: false,\n isWritable: false,\n })),\n );\n\n return { instructions: [ix], keys: [] };\n }\n\n // TODO)) deprecated\n async makeAccountAuthorityTransferIx(\n program: LendrProgram,\n newAccountAuthority: PublicKey,\n ): Promise<InstructionsWrapper> {\n throw new Error(`TODO: ${program} ${newAccountAuthority}`);\n // const accountAuthorityTransferIx = await instructions.makeAccountAuthorityTransferIx(program, {\n // lendrAccount: this.address,\n // newAuthority: newAccountAuthority,\n // feePayer: this.authority,\n // });\n // return { instructions: [accountAuthorityTransferIx], keys: [] };\n }\n\n async makeCloseAccountIx(program: LendrProgram): Promise<InstructionsWrapper> {\n const ix = await instructions.makeCloseAccountIx(program, {\n lendrAccount: this.address,\n feePayer: this.authority,\n });\n return { instructions: [ix], keys: [] };\n }\n\n async makePulseHealthIx(\n program: LendrProgram,\n banks: Map<string, Bank>,\n mandatoryBanks: PublicKey[],\n excludedBanks: PublicKey[],\n bankMetadataMap: BankMetadataMap,\n ): Promise<InstructionsWrapper> {\n return makePulseHealthIx(\n program,\n this.address,\n banks,\n this.balances,\n mandatoryBanks,\n excludedBanks,\n bankMetadataMap,\n );\n }\n\n projectActiveBalancesNoCpi(program: LendrProgram, instructions: TransactionInstruction[]): PublicKey[] {\n const projectedBalances = [...this.balances.map((b) => ({ active: b.active, bankPk: b.bankPk }))];\n\n for (let index = 0; index < instructions.length; index++) {\n const ix = instructions[index];\n\n if (!ix.programId.equals(program.programId)) continue;\n\n const borshCoder = new BorshInstructionCoder(program.idl);\n const decoded = borshCoder.decode(ix.data, \"base58\");\n if (!decoded) continue;\n\n const ixArgs = decoded.data as any;\n\n if (decoded.name === \"lendingAccountBorrow\" || decoded.name === \"lendingAccountDeposit\") {\n const targetBank = new PublicKey(ix.keys[3].pubkey);\n const targetBalance = projectedBalances.find((b) => b.bankPk.equals(targetBank));\n if (!targetBalance) {\n const firstInactiveBalanceIndex = projectedBalances.findIndex((b) => !b.active);\n if (firstInactiveBalanceIndex === -1) {\n throw Error(\"No inactive balance found\");\n }\n\n projectedBalances[firstInactiveBalanceIndex].active = true;\n projectedBalances[firstInactiveBalanceIndex].bankPk = targetBank;\n }\n continue;\n }\n if (decoded.name === \"lendingAccountRepay\" || decoded.name === \"lendingAccountWithdraw\") {\n const targetBank = new PublicKey(ix.keys[3].pubkey);\n const targetBalance = projectedBalances.find((b) => b.bankPk.equals(targetBank));\n if (!targetBalance) {\n throw Error(\n `Balance for bank ${targetBank.toBase58()} should be projected active at this point (ix ${index}: ${\n decoded.name\n }))`,\n );\n }\n\n if (ixArgs.repayAll || ixArgs.withdrawAll) {\n targetBalance.active = false;\n targetBalance.bankPk = PublicKey.default;\n }\n }\n }\n\n return projectedBalances.filter((b) => b.active).map((b) => b.bankPk);\n }\n\n wrapInstructionForWSol(ix: TransactionInstruction, amount: Amount = new BigNumber(0)): TransactionInstruction[] {\n return [...makeWrapSolIxs(this.authority, new BigNumber(amount)), ix, makeUnwrapSolIx(this.authority)];\n }\n\n public describe(banks: BankMap, oraclePrices: OraclePriceMap): string {\n const { assets, liabilities } = this.computeHealthComponents(LendrRequirementType.Equity);\n const { assets: assetsMaint, liabilities: liabilitiesMaint } = this.computeHealthComponents(\n LendrRequirementType.Maintenance,\n );\n const { assets: assetsInit, liabilities: liabilitiesInit } = this.computeHealthComponents(\n LendrRequirementType.Initial,\n );\n let description = `\n- Lendr account: ${this.address}\n- Authority: ${this.authority}\n- Total deposits: $${assets.toFixed(6)}\n- Total liabilities: $${liabilities.toFixed(6)}\n- Equity: $${assets.minus(liabilities).toFixed(6)}\n- Health maint: ${assetsMaint.minus(liabilitiesMaint).div(assetsMaint).times(100).toFixed(2)}%\n- Health init: ${assetsInit.minus(liabilitiesInit).div(assetsInit).times(100).toFixed(2)}%\n- Balances:\\n`;\n\n for (const balance of this.activeBalances) {\n const bank = banks.get(balance.bankPk.toBase58());\n const priceInfo = oraclePrices.get(balance.bankPk.toBase58());\n if (!bank || !priceInfo) continue;\n description += balance.describe(bank, priceInfo);\n }\n return description;\n }\n}\n\nenum LendrRequirementType {\n Initial = 0,\n Maintenance = 1,\n Equity = 2,\n}\n\nexport interface MakeDepositIxOpts {\n wrapAndUnwrapSol?: boolean;\n wSolBalanceUi?: number;\n overrideInferAccounts?: {\n group?: PublicKey;\n authority?: PublicKey;\n liquidityVault?: PublicKey;\n };\n}\n\nexport interface MakeDepositWithSessionIxOpts extends MakeDepositIxOpts {\n overrideInferAccounts?: {\n group?: PublicKey;\n liquidityVault?: PublicKey;\n };\n}\n\nexport interface MakeRepayIxOpts {\n wrapAndUnwrapSol?: boolean;\n wSolBalanceUi?: number;\n overrideInferAccounts?: {\n group?: PublicKey;\n authority?: PublicKey;\n liquidityVault?: PublicKey;\n };\n}\n\nexport interface MakeRepayWithSessionIxOpts extends MakeRepayIxOpts {\n overrideInferAccounts?: {\n group?: PublicKey;\n liquidityVault?: PublicKey;\n };\n}\n\nexport interface MakeWithdrawIxOpts {\n observationBanksOverride?: PublicKey[];\n wrapAndUnwrapSol?: boolean;\n createAtas?: boolean;\n overrideInferAccounts?: {\n group?: PublicKey;\n authority?: PublicKey;\n };\n}\n\nexport interface MakeWithdrawWithSessionIxOpts extends MakeWithdrawIxOpts {\n overrideInferAccounts?: {\n group?: PublicKey;\n };\n}\nexport interface MakeBorrowIxOpts {\n observationBanksOverride?: PublicKey[];\n wrapAndUnwrapSol?: boolean;\n createAtas?: boolean;\n overrideInferAccounts?: {\n group?: PublicKey;\n authority?: PublicKey;\n };\n}\n\nexport interface MakeBorrowWithSessionIxOpts extends MakeBorrowIxOpts {\n overrideInferAccounts?: {\n group?: PublicKey;\n };\n}\n\nexport function isWeightedPrice(reqType: LendrRequirementType): boolean {\n return reqType === LendrRequirementType.Initial;\n}\n\nexport { LendrAccount, LendrRequirementType };\n","import { type Address, BorshCoder, translateAddress } from \"@coral-xyz/anchor\";\nimport type { TransactionResult } from \"@fogo/sessions-sdk\";\nimport {\n createApproveInstruction,\n createAssociatedTokenAccountIdempotentInstruction,\n createAssociatedTokenAccountInstruction,\n getAssociatedTokenAddressSync,\n NATIVE_MINT,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n type AddressLookupTableAccount,\n type Commitment,\n ComputeBudgetProgram,\n Keypair,\n LAMPORTS_PER_SOL,\n type ParsedAccountData,\n PublicKey,\n type Signer,\n StakeAuthorizationLayout,\n StakeProgram,\n SystemProgram,\n Transaction,\n type TransactionInstruction,\n TransactionMessage,\n type TransactionSignature,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport LendrClient from \"@/clients/client\";\nimport type { EstablishedSessionState } from \"@/common/session\";\nimport {\n DEFAULT_COMMITMENT,\n MAX_ACCOUNT_KEYS,\n MAX_TX_SIZE,\n PRIORITY_TX_SIZE,\n STAKE_PROGRAM_ID,\n SYSVAR_CLOCK_ID,\n WSOL_MINT,\n} from \"@/constants\";\nimport type { LendrIdlType } from \"@/idl\";\nimport type {\n FlashloanActionResult,\n LoopProps,\n LoopTxProps,\n RepayWithCollateralProps,\n TransactionBuilderResult,\n} from \"@/models/account/types\";\nimport type { LendrGroup } from \"@/models/group\";\nimport {\n type ActionEmodeImpact,\n computeLoopingParams,\n type EmodePair,\n type EmodeTag,\n type LendrAccountRaw,\n type ProcessTransactionsClientOpts,\n} from \"@/services\";\nimport { makePriorityFeeIx, makeWrapSolIxs } from \"@/utils\";\nimport {\n type Amount,\n addTransactionMetadata,\n type ExtendedTransaction,\n type ExtendedV0Transaction,\n getAccountKeys,\n getTxSize,\n type InstructionsWrapper,\n type TransactionBroadcastType,\n type TransactionOptions,\n TransactionType,\n type Wallet,\n} from \"../../common\";\nimport instructions from \"../../instructions\";\nimport { AccountType, type LendrConfig, type LendrProgram } from \"../../types\";\nimport {\n findPoolAddress,\n findPoolMintAddress,\n findPoolMintAuthorityAddress,\n findPoolStakeAddress,\n findPoolStakeAuthorityAddress,\n SinglePoolInstruction,\n} from \"../../vendor\";\nimport type { Balance } from \"../balance\";\nimport { Bank } from \"../bank\";\nimport {\n LendrAccount,\n LendrRequirementType,\n type MakeBorrowIxOpts,\n type MakeBorrowWithSessionIxOpts,\n type MakeDepositIxOpts,\n type MakeDepositWithSessionIxOpts,\n type MakeRepayIxOpts,\n type MakeRepayWithSessionIxOpts,\n type MakeWithdrawIxOpts,\n type MakeWithdrawWithSessionIxOpts,\n} from \"./pure\";\n\nexport interface SimulationResult {\n banks: Map<string, Bank>;\n lendrAccount: LendrAccountWrapper;\n}\n\nexport interface FlashLoanArgs {\n ixs: TransactionInstruction[];\n signers?: Signer[];\n addressLookupTableAccounts?: AddressLookupTableAccount[];\n blockhash?: string;\n}\n\nclass LendrAccountWrapper {\n public readonly address: PublicKey;\n\n private _lendrAccount: LendrAccount;\n\n // --------------------------------------------------------------------------\n // Factories\n // --------------------------------------------------------------------------\n\n /**\n * @internal\n */\n constructor(\n lendrAccountPk: PublicKey,\n readonly client: LendrClient,\n lendrAccount: LendrAccount,\n ) {\n this.address = lendrAccountPk;\n this._lendrAccount = lendrAccount;\n }\n\n static async fetch(\n lendrAccountPk: Address,\n client: LendrClient,\n commitment?: Commitment,\n ): Promise<LendrAccountWrapper> {\n const { config, program } = client;\n const _lendrAccountPk = translateAddress(lendrAccountPk);\n\n const accountData = await LendrAccountWrapper.fetchAccountData(_lendrAccountPk, config, program, commitment);\n const lendrAccount = LendrAccount.fromAccountParsed(_lendrAccountPk, accountData);\n\n const lendrAccountProxy = new LendrAccountWrapper(_lendrAccountPk, client, lendrAccount);\n\n client.logger.debug({ accountPk: _lendrAccountPk }, \"[lendr:lendr-account] Loaded lendr account\");\n\n return lendrAccountProxy;\n }\n\n static fromAccountParsed(lendrAccountPk: Address, client: LendrClient, accountData: LendrAccountRaw) {\n if (!accountData.group.equals(client.config.groupPk))\n throw Error(\n `Lendr account tied to group ${accountData.group.toBase58()}. Expected: ${client.config.groupPk.toBase58()}`,\n );\n\n const _lendrAccountPk = translateAddress(lendrAccountPk);\n const lendrAccount = LendrAccount.fromAccountParsed(_lendrAccountPk, accountData);\n return new LendrAccountWrapper(_lendrAccountPk, client, lendrAccount);\n }\n\n static fromAccountDataRaw(\n lendrAccountPk: PublicKey,\n client: LendrClient,\n lendrAccountRawData: Buffer,\n idl: LendrIdlType,\n ) {\n const lendrAccountData = LendrAccount.decode(lendrAccountRawData, idl);\n return LendrAccountWrapper.fromAccountParsed(lendrAccountPk, client, lendrAccountData);\n }\n\n // --------------------------------------------------------------------------\n // Attributes\n // --------------------------------------------------------------------------\n\n get authority(): PublicKey {\n return this._lendrAccount.authority;\n }\n\n get group(): LendrGroup {\n return this.client.group;\n }\n\n get balances(): Balance[] {\n return this._lendrAccount.balances;\n }\n\n get data(): LendrAccount {\n return this._lendrAccount;\n }\n\n get pureAccount(): LendrAccount {\n return this._lendrAccount;\n }\n\n /** @internal */\n private get _program() {\n return this.client.program;\n }\n\n /** @internal */\n private get _config() {\n return this.client.config;\n }\n\n get activeBalances(): Balance[] {\n return this._lendrAccount.balances.filter((la) => la.active);\n }\n\n get isDisabled(): boolean {\n return this._lendrAccount.isDisabled;\n }\n\n get isFlashLoanEnabled(): boolean {\n return this._lendrAccount.isFlashLoanEnabled;\n }\n\n get isTransferAccountAuthorityEnabled(): boolean {\n return this._lendrAccount.isTransferAccountAuthorityEnabled;\n }\n\n public getBalance(bankPk: PublicKey): Balance {\n return this._lendrAccount.getBalance(bankPk);\n }\n\n public async simulateHealthCache(): Promise<LendrAccountWrapper> {\n const { lendrAccount: account } = await this._lendrAccount.simulateHealthCache(\n this._program,\n this.client.banks,\n this.client.oraclePrices,\n this.client.bankMetadataMap ?? {},\n );\n return new LendrAccountWrapper(this.address, this.client, account);\n }\n\n public canBeLiquidated(): boolean {\n const { assets, liabilities } = this._lendrAccount.computeHealthComponents(LendrRequirementType.Maintenance);\n\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n assets,\n liabilities,\n },\n \"[lendr:lendr-account:canBeLiquidated]\",\n );\n\n return assets.lt(liabilities);\n }\n\n public computeHealthComponents(lendrRequirement: LendrRequirementType): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return this._lendrAccount.computeHealthComponents(lendrRequirement);\n }\n\n // TODO)) migrate to computeHealthComponents\n public computeHealthComponentsLegacy(\n lendrRequirement: LendrRequirementType,\n excludedBanks: PublicKey[] = [],\n ): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return this._lendrAccount.computeHealthComponentsLegacy(\n this.client.banks,\n this.client.oraclePrices,\n lendrRequirement,\n excludedBanks,\n );\n }\n\n public computeHealthComponentsWithoutBiasLegacy(lendrRequirement: LendrRequirementType): {\n assets: BigNumber;\n liabilities: BigNumber;\n } {\n return this._lendrAccount.computeHealthComponentsWithoutBiasLegacy(\n this.client.banks,\n this.client.oraclePrices,\n lendrRequirement,\n );\n }\n\n public computeFreeCollateral(opts?: { clamped?: boolean }): BigNumber {\n return this._lendrAccount.computeFreeCollateral(opts);\n }\n\n public computeFreeCollateralLegacy(opts?: { clamped?: boolean }): BigNumber {\n return this._lendrAccount.computeFreeCollateralLegacy(this.client.banks, this.client.oraclePrices, opts);\n }\n\n public computeAccountValue(): BigNumber {\n return this._lendrAccount.computeAccountValue();\n }\n\n public computeActiveEmodePairs(emodePairs: EmodePair[]): EmodePair[] {\n return this._lendrAccount.computeActiveEmodePairs(emodePairs);\n }\n\n public computeEmodeImpacts(emodePairs: EmodePair[]): Record<string, ActionEmodeImpact> {\n return this._lendrAccount.computeEmodeImpacts(\n emodePairs,\n Array.from(this.client.banks.keys()).map((b) => new PublicKey(b)),\n );\n }\n\n public computeMaxBorrowForBank(\n bankAddress: PublicKey,\n opts?: {\n volatilityFactor?: number;\n emodeWeights?: {\n assetWeightMaint: BigNumber;\n assetWeightInit: BigNumber;\n collateralTags: EmodeTag[];\n };\n },\n ): BigNumber {\n return this._lendrAccount.computeMaxBorrowForBank(\n this.client.banks,\n this.client.oraclePrices,\n bankAddress,\n opts,\n this.client.logger,\n );\n }\n\n public computeMaxWithdrawForBank(bankAddress: PublicKey, opts?: { volatilityFactor?: number }): BigNumber {\n return this._lendrAccount.computeMaxWithdrawForBank(this.client.banks, this.client.oraclePrices, bankAddress, opts);\n }\n\n public computeMaxLiquidatableAssetAmount(assetBankAddress: PublicKey, liabilityBankAddress: PublicKey): BigNumber {\n return this._lendrAccount.computeMaxLiquidatableAssetAmount(\n this.client.banks,\n this.client.oraclePrices,\n assetBankAddress,\n liabilityBankAddress,\n this.client.logger,\n );\n }\n\n public computeLiquidationPriceForBank(bankAddress: PublicKey): number | null {\n return this._lendrAccount.computeLiquidationPriceForBank(this.client.banks, this.client.oraclePrices, bankAddress);\n }\n\n public computeLiquidationPriceForBankAmount(\n bankAddress: PublicKey,\n isLending: boolean,\n amount: number,\n ): number | null {\n return this._lendrAccount.computeLiquidationPriceForBankAmount(\n this.client.banks,\n this.client.oraclePrices,\n bankAddress,\n isLending,\n amount,\n );\n }\n\n public computeNetApy(): number {\n return this._lendrAccount.computeNetApy(this.client.banks, this.client.oraclePrices);\n }\n\n /** Todo move this into client */\n public computeLoopingParams(\n principal: Amount,\n targetLeverage: number,\n depositBankAddress: PublicKey,\n borrowBankAddress: PublicKey,\n ): { borrowAmount: BigNumber; totalDepositAmount: BigNumber } {\n const depositBank = this.client.banks.get(depositBankAddress.toBase58());\n if (!depositBank) throw Error(`Bank ${depositBankAddress.toBase58()} not found`);\n const depositPriceInfo = this.client.oraclePrices.get(depositBankAddress.toBase58());\n if (!depositPriceInfo) throw Error(`Price info for ${depositBankAddress.toBase58()} not found`);\n\n const borrowBank = this.client.banks.get(borrowBankAddress.toBase58());\n if (!borrowBank) throw Error(`Bank ${borrowBankAddress.toBase58()} not found`);\n const borrowPriceInfo = this.client.oraclePrices.get(borrowBankAddress.toBase58());\n if (!borrowPriceInfo) throw Error(`Price info for ${borrowBankAddress.toBase58()} not found`);\n\n return computeLoopingParams(principal, targetLeverage, depositBank, borrowBank, depositPriceInfo, borrowPriceInfo);\n }\n\n makeComputeBudgetIx(): TransactionInstruction[] {\n // Add additional CU request if necessary\n const cuRequestIxs: TransactionInstruction[] = [];\n const activeBalances = this.balances.filter((b) => b.active);\n if (activeBalances.length >= 4) {\n cuRequestIxs.push(ComputeBudgetProgram.setComputeUnitLimit({ units: 1_000_000 }));\n }\n\n return cuRequestIxs;\n }\n\n // --------------------------------------------------------------------------\n // User actions\n // --------------------------------------------------------------------------\n\n async makeSetupIx(banks: PublicKey[]) {\n this._lendrAccount.authority;\n\n if (this.client.bankMetadataMap === undefined) {\n return [];\n }\n\n try {\n const userAtas = banks.map((bankAddress) => {\n const bank = this.client.bankMetadataMap?.[bankAddress.toBase58()];\n const mintData = this.client.mintDatas.get(bankAddress.toBase58());\n if (!bank || !mintData) throw Error(`Token data for ${bankAddress.toBase58()} not found`);\n return getAssociatedTokenAddressSync(\n new PublicKey(bank.tokenAddress),\n this.authority,\n true,\n mintData.tokenProgram.equals(TOKEN_2022_PROGRAM_ID) ? TOKEN_2022_PROGRAM_ID : undefined,\n );\n });\n\n const ixs: Array<TransactionInstruction> = [];\n const userAtaAis = await this._program.provider.connection.getMultipleAccountsInfo(userAtas);\n\n for (const [i, userAta] of userAtaAis.entries()) {\n if (userAta === null) {\n const bankAddress = banks[i];\n const bank = this.client.bankMetadataMap?.[bankAddress.toBase58()];\n const mintData = this.client.mintDatas.get(bankAddress.toBase58());\n if (!mintData) throw Error(`Token data for ${bank.tokenAddress} not found`);\n ixs.push(\n createAssociatedTokenAccountIdempotentInstruction(\n this.authority,\n userAtas[i],\n this.authority,\n new PublicKey(bank.tokenAddress),\n mintData.tokenProgram.equals(TOKEN_2022_PROGRAM_ID) ? TOKEN_2022_PROGRAM_ID : undefined,\n ),\n );\n }\n }\n\n return ixs;\n } catch {\n return [];\n }\n }\n\n /**\n * Moves a position from one lendr account to another by withdrawing from source account and depositing to destination account.\n *\n * @param amount - The amount of tokens to move, can be a number or Amount object\n * @param bankAddress - The public key of the bank to move position from/to\n * @param destinationAccount - The lendr account to move the position to\n * @param processOpts - Optional transaction processing configuration\n * @param txOpts - Optional transaction options\n * @returns Array of transaction signatures - includes signatures for any required oracle feed updates, withdraw transaction, and deposit transaction\n */\n async movePosition(\n amount: Amount,\n bankAddress: PublicKey,\n destinationAccountPk: PublicKey,\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature[]> {\n this.client.logger.debug({ from: this.address }, \"[lendr:lendr-account:move-position] Moving position\");\n\n const { transactions } = await this.makeMovePositionTx(amount, bankAddress, destinationAccountPk);\n\n const sigs = await this.client.processTransactions(transactions, processOpts, txOpts);\n\n this.client.logger.debug(\n { sigs: sigs[sigs.length - 1] },\n \"[lendr:lendr-account:move-position] Moving position successful\",\n );\n return sigs;\n }\n\n /**\n * Creates transactions for moving a position from one lendr account to another.\n *\n * @param amount - The amount of tokens to move, can be a number or Amount object\n * @param bankAddress - The public key of the bank to move position from/to\n * @param destinationAccount - The lendr account to move the position to\n * @returns Object containing feed crank transactions, withdraw transaction, and deposit transaction\n */\n async makeMovePositionTx(\n amount: Amount,\n bankAddress: PublicKey,\n destinationAccountPk: PublicKey,\n ): Promise<TransactionBuilderResult> {\n const cuRequestIxs = this.makeComputeBudgetIx();\n const { instructions: updateFeedIxs, luts: feedLuts } = await this.makeUpdateFeedIx([]);\n const withdrawIxs = await this.makeWithdrawIx(amount, bankAddress, true);\n\n const {\n value: { blockhash },\n } = await this._program.provider.connection.getLatestBlockhashAndContext(\"confirmed\");\n\n const feedCrankTxs: ExtendedV0Transaction[] = [];\n\n if (updateFeedIxs.length > 0) {\n feedCrankTxs.push(\n addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: [...updateFeedIxs],\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(feedLuts),\n ),\n {\n addressLookupTables: feedLuts,\n type: TransactionType.CRANK,\n },\n ),\n );\n }\n\n const lookupTables = await getClientAddressLookupTableAccounts(this.client);\n\n const withdrawTx = addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: [...cuRequestIxs, ...withdrawIxs.instructions],\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(lookupTables),\n ),\n {\n signers: withdrawIxs.keys,\n addressLookupTables: lookupTables,\n type: TransactionType.MOVE_POSITION_WITHDRAW,\n },\n );\n\n const destinationAccount = await LendrAccountWrapper.fetch(destinationAccountPk, this.client);\n\n const depositIx = await destinationAccount.makeDepositIx(amount, bankAddress);\n const tx = new Transaction().add(...depositIx.instructions);\n const depositTx = addTransactionMetadata(tx, {\n signers: depositIx.keys,\n addressLookupTables: lookupTables,\n type: TransactionType.MOVE_POSITION_DEPOSIT,\n });\n\n const transactions = [...feedCrankTxs, withdrawTx, depositTx];\n\n return { transactions, actionTxIndex: transactions.length - 1 };\n }\n\n /**\n * Repays a loan using collateral from another bank by:\n * 1. Withdrawing collateral from one bank\n * 2. Swapping it to the repayment asset\n * 3. Repaying the loan in another bank\n *\n * @param {RepayWithCollateralProps} props - Parameters for the repay with collateral transaction\n * @param {Amount} props.repayAmount - Amount to repay\n * @param {Amount} props.withdrawAmount - Amount of collateral to withdraw\n * @param {PublicKey} props.borrowBankAddress - Bank address where the loan is being repaid\n * @param {PublicKey} props.depositBankAddress - Bank address where collateral is being withdrawn from\n * @param {boolean} [props.withdrawAll=false] - Whether to withdraw all collateral from deposit bank\n * @param {boolean} [props.repayAll=false] - Whether to repay entire loan amount\n * @param {Object} props.swap - Swap configuration with instructions and lookup tables\n * @param {ProcessTransactionsClientOpts} [props.processOpts] - Optional transaction processing configuration\n * @param {TransactionOptions} [props.txOpts] - Optional transaction options\n * @returns {Promise<TransactionSignature[]>} Array of transaction signatures\n */\n async repayWithCollatV2(props: RepayWithCollateralProps): Promise<TransactionSignature[]> {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n repayAmount: props.repayAmount,\n borrowBankAddress: props.borrowBankAddress,\n repayAll: props.repayAll,\n },\n \"[lendr:lendr-account:repayWithCollat] Repaying into lendr account\",\n );\n\n const { processOpts, txOpts, ...txProps } = props;\n const { transactions } = await this.makeRepayWithCollatTxV2({\n ...txProps,\n });\n\n const sigs = await this.client.processTransactions(transactions, processOpts, txOpts);\n this.client.logger.debug(\n { sig: sigs[sigs.length - 1] },\n \"[lendr:lendr-account:repayWithCollat] Repay with collateral successful\",\n );\n\n return sigs;\n }\n\n /**\n * Creates a transaction to repay a loan using collateral by:\n * 1. Withdrawing collateral from one bank\n * 2. Swapping it to the repayment asset\n * 3. Repaying the loan in another bank\n *\n * @param {RepayWithCollateralProps} params - Parameters for the repay with collateral transaction\n * @param {Amount} params.repayAmount - Amount to repay\n * @param {Amount} params.withdrawAmount - Amount of collateral to withdraw\n * @param {PublicKey} params.borrowBankAddress - Bank address where the loan is being repaid\n * @param {PublicKey} params.depositBankAddress - Bank address where collateral is being withdrawn from\n * @param {boolean} [params.withdrawAll=false] - Whether to withdraw all collateral from deposit bank\n * @param {boolean} [params.repayAll=false] - Whether to repay entire loan amount\n * @param {Object} params.swap - Swap configuration with instructions and lookup tables\n * @param {string} [params.blockhash] - Optional recent blockhash\n * @param {MakeWithdrawIxOpts} [params.withdrawOpts] - Optional withdraw configuration\n * @param {MakeRepayIxOpts} [params.repayOpts] - Optional repay configuration\n * @returns {Promise<RepayWithCollateralResult>} Result containing feed crank and flashloan transactions\n */\n async makeRepayWithCollatTxV2({\n repayAmount,\n withdrawAmount,\n borrowBankAddress,\n depositBankAddress,\n withdrawAll = false,\n repayAll = false,\n swap,\n blockhash: blockhashArg,\n }: RepayWithCollateralProps): Promise<FlashloanActionResult> {\n const blockhash =\n blockhashArg ?? (await this._program.provider.connection.getLatestBlockhash(\"confirmed\")).blockhash;\n\n // creates atas if needed\n const setupIxs = await this.makeSetupIx([borrowBankAddress, depositBankAddress]);\n const cuRequestIxs =\n this.makeComputeBudgetIx().length > 0\n ? this.makeComputeBudgetIx()\n : [ComputeBudgetProgram.setComputeUnitLimit({ units: 1_000_000 })];\n // tiny priority fee just in case bundle fails\n const [priorityFeeIx] = makePriorityFeeIx(0.00001);\n const withdrawIxs = await this.makeWithdrawIx(withdrawAmount, depositBankAddress, withdrawAll, {\n createAtas: false,\n wrapAndUnwrapSol: false,\n });\n const repayIxs = await this.makeRepayIx(repayAmount, borrowBankAddress, repayAll, {\n wrapAndUnwrapSol: false,\n });\n const { instructions: updateFeedIxs, luts: feedLuts } = await this.makeUpdateFeedIx([\n depositBankAddress,\n borrowBankAddress,\n ]);\n const { lookupTables: swapLookupTables, instructions: swapIxs } = swap;\n\n const additionalTxs: ExtendedV0Transaction[] = [];\n let flashloanTx: ExtendedV0Transaction;\n let txOverflown = false;\n\n // if atas are needed, add them\n if (setupIxs.length > 0) {\n const message = new TransactionMessage({\n payerKey: this.client.wallet.publicKey,\n recentBlockhash: blockhash,\n instructions: setupIxs,\n }).compileToLegacyMessage();\n\n additionalTxs.push(\n addTransactionMetadata(new VersionedTransaction(message), {\n type: TransactionType.CREATE_ATA,\n }),\n );\n }\n\n // if crank is needed, add it\n if (updateFeedIxs.length > 0) {\n const message = new TransactionMessage({\n payerKey: this.client.wallet.publicKey,\n recentBlockhash: blockhash,\n instructions: updateFeedIxs,\n }).compileToV0Message(feedLuts);\n\n additionalTxs.push(\n addTransactionMetadata(new VersionedTransaction(message), {\n addressLookupTables: feedLuts,\n type: TransactionType.CRANK,\n }),\n );\n }\n\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n\n const addressLookupTableAccounts = [...clientLookupTables, ...swapLookupTables];\n\n // if cuRequestIxs are not present, priority fee ix is needed\n // wallets add a priority fee ix by default breaking the flashloan tx so we need to add a placeholder priority fee ix\n // docs: https://docs.phantom.app/developer-powertools/solana-priority-fees\n flashloanTx = await this.buildFlashLoanTx({\n ixs: [...cuRequestIxs, priorityFeeIx, ...withdrawIxs.instructions, ...swapIxs, ...repayIxs.instructions],\n addressLookupTableAccounts,\n blockhash,\n });\n\n const txSize = getTxSize(flashloanTx);\n const accountKeys = getAccountKeys(flashloanTx, addressLookupTableAccounts);\n const txToManyKeys = accountKeys > MAX_ACCOUNT_KEYS;\n const txToBig = txSize > MAX_TX_SIZE;\n const canBeDownsized = txToManyKeys && txToBig && txSize - PRIORITY_TX_SIZE <= MAX_TX_SIZE;\n\n if (canBeDownsized) {\n // wallets won't add a priority fee if tx space is limited\n // this will decrease landing rate for non-rpc calls\n flashloanTx = await this.buildFlashLoanTx({\n ixs: [...cuRequestIxs, ...withdrawIxs.instructions, ...swapIxs, ...repayIxs.instructions],\n addressLookupTableAccounts,\n blockhash,\n });\n\n const txSize = getTxSize(flashloanTx);\n const txToBig = txSize > MAX_TX_SIZE;\n\n // this shouldn't trigger, but just in case\n if (txToBig) {\n txOverflown = true;\n }\n } else if (txToBig || txToManyKeys) {\n txOverflown = true;\n }\n\n flashloanTx = addTransactionMetadata(flashloanTx, {\n type: TransactionType.REPAY_COLLAT,\n addressLookupTables: flashloanTx.addressLookupTables,\n });\n\n const transactions = [...additionalTxs, flashloanTx];\n\n // TODO throw tx overflown error and cath\n return {\n transactions,\n actionTxIndex: transactions.length - 1,\n txOverflown,\n };\n }\n\n async loopV2(props: LoopProps): Promise<TransactionSignature[]> {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n depositAmount: props.borrowAmount,\n depositBankAddress: props.depositBankAddress.toBase58(),\n borrowAmount: props.borrowAmount,\n borrowBankAddress: props.borrowBankAddress.toBase58(),\n },\n \"[lendr:lendr-account:loop] Looping into Lendr account\",\n );\n\n const depositBank = this.client.banks.get(props.depositBankAddress.toBase58());\n if (!depositBank) throw Error(\"Deposit bank not found\");\n const borrowBank = this.client.banks.get(props.borrowBankAddress.toBase58());\n if (!borrowBank) throw Error(\"Borrow bank not found\");\n\n const { processOpts, txOpts, ...txProps } = props;\n\n const { transactions } = await this.makeLoopTxV2(txProps);\n\n const sigs = await this.client.processTransactions(transactions, processOpts, txOpts);\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n sig: sigs[sigs.length - 1],\n },\n \"[lendr:lendr-account:loop] Looping successful\",\n );\n\n return sigs;\n }\n\n async makeLoopTxV2({\n depositAmount,\n inputDepositAmount,\n borrowAmount,\n depositBankAddress,\n borrowBankAddress,\n swap,\n blockhash: blockhashArg,\n setupBankAddresses,\n overrideInferAccounts,\n }: LoopTxProps): Promise<FlashloanActionResult> {\n const depositBank = this.client.banks.get(depositBankAddress.toBase58());\n if (!depositBank) throw Error(\"Deposit bank not found\");\n const borrowBank = this.client.banks.get(borrowBankAddress.toBase58());\n if (!borrowBank) throw Error(\"Borrow bank not found\");\n\n const blockhash =\n blockhashArg ?? (await this._program.provider.connection.getLatestBlockhash(\"confirmed\")).blockhash;\n\n // creates atas if needed\n const setupIxs = await this.makeSetupIx(setupBankAddresses ?? [borrowBankAddress, depositBankAddress]);\n const cuRequestIxs =\n this.makeComputeBudgetIx().length > 0\n ? this.makeComputeBudgetIx()\n : [ComputeBudgetProgram.setComputeUnitLimit({ units: 500_000 })];\n // tiny priority fee just in case bundle fails\n const [priorityFeeIx] = makePriorityFeeIx(0.00001);\n const borrowIxs = await this.makeBorrowIx(borrowAmount, borrowBankAddress, {\n createAtas: false,\n wrapAndUnwrapSol: false,\n overrideInferAccounts,\n });\n const depositIxs = await this.makeDepositIx(depositAmount, depositBankAddress, {\n wrapAndUnwrapSol: false,\n overrideInferAccounts,\n });\n\n // unwrap if deposit bank is native\n // const unwrapIx = depositBank.mint.equals(NATIVE_MINT) ? [makeUnwrapSolIx(this.authority)] : [];\n\n const { instructions: updateFeedIxs, luts: feedLuts } = await this.makeUpdateFeedIx([\n depositBankAddress,\n borrowBankAddress,\n ]);\n const { lookupTables: swapLookupTables, instructions: swapIxs } = swap;\n\n const additionalTxs: ExtendedV0Transaction[] = [];\n let flashloanTx: ExtendedV0Transaction;\n let txOverflown = false;\n\n // wrap sol if needed\n if (depositBank.mint.equals(NATIVE_MINT) && inputDepositAmount) {\n setupIxs.push(...makeWrapSolIxs(this.authority, new BigNumber(inputDepositAmount)));\n }\n\n // if atas are needed, add them\n if (setupIxs.length > 0) {\n const message = new TransactionMessage({\n payerKey: this.client.wallet.publicKey,\n recentBlockhash: blockhash,\n instructions: setupIxs,\n }).compileToLegacyMessage();\n\n additionalTxs.push(\n addTransactionMetadata(new VersionedTransaction(message), {\n type: TransactionType.CREATE_ATA,\n }),\n );\n }\n\n // if crank is needed, add it\n if (updateFeedIxs.length > 0) {\n const message = new TransactionMessage({\n payerKey: this.client.wallet.publicKey,\n recentBlockhash: blockhash,\n instructions: updateFeedIxs,\n }).compileToV0Message(feedLuts);\n\n additionalTxs.push(\n addTransactionMetadata(new VersionedTransaction(message), {\n addressLookupTables: feedLuts,\n type: TransactionType.CRANK,\n }),\n );\n }\n\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n const addressLookupTableAccounts = [...clientLookupTables, ...swapLookupTables];\n\n // if cuRequestIxs are not present, priority fee ix is needed\n // wallets add a priority fee ix by default breaking the flashloan tx so we need to add a placeholder priority fee ix\n // docs: https://docs.phantom.app/developer-powertools/solana-priority-fees\n flashloanTx = await this.buildFlashLoanTx({\n ixs: [...cuRequestIxs, priorityFeeIx, ...borrowIxs.instructions, ...swapIxs, ...depositIxs.instructions],\n addressLookupTableAccounts,\n blockhash,\n });\n\n const txSize = getTxSize(flashloanTx);\n const accountKeys = getAccountKeys(flashloanTx, addressLookupTableAccounts);\n const txToManyKeys = accountKeys > MAX_ACCOUNT_KEYS;\n const txToBig = txSize > MAX_TX_SIZE;\n const canBeDownsized = txToManyKeys && txToBig && txSize - PRIORITY_TX_SIZE <= MAX_TX_SIZE;\n\n if (canBeDownsized) {\n // wallets won't add a priority fee if tx space is limited\n // this will decrease landing rate for non-rpc calls ...unwrapIx,\n flashloanTx = await this.buildFlashLoanTx({\n ixs: [...cuRequestIxs, ...borrowIxs.instructions, ...swapIxs, ...depositIxs.instructions],\n addressLookupTableAccounts,\n blockhash,\n });\n const txSize = getTxSize(flashloanTx);\n const txToBig = txSize > MAX_TX_SIZE;\n\n // this shouldn't trigger, but just in case\n if (txToBig) {\n txOverflown = true;\n }\n } else if (txToBig || txToManyKeys) {\n txOverflown = true;\n }\n\n flashloanTx = addTransactionMetadata(flashloanTx, {\n type: TransactionType.LOOP,\n addressLookupTables: flashloanTx.addressLookupTables,\n });\n\n const transactions = [...additionalTxs, flashloanTx];\n return {\n transactions,\n actionTxIndex: transactions.length - 1,\n txOverflown,\n };\n }\n\n /**\n * Creates instructions for closing a lendr account.\n * The account must have no active positions or balances to be closed.\n * Closing an account will return any remaining SOL to the fee payer.\n *\n * @returns An InstructionsWrapper containing the close account instruction\n */\n async makeCloseAccountIx(): Promise<InstructionsWrapper> {\n const ix = await instructions.makeCloseAccountIx(this._program, {\n lendrAccount: this.address,\n feePayer: this.client.wallet.publicKey,\n });\n return { instructions: [ix], keys: [] };\n }\n\n /**\n * Closes a lendr account. The account must have no active positions or balances to be closed.\n * Closing an account will return any remaining SOL to the fee payer.\n *\n * @param processOpts - Optional transaction processing configuration\n * @param txOpts - Optional transaction options\n * @returns The transaction signature of the close account operation\n */\n async closeAccount(\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature> {\n const tx = await this.makeCloseAccountTx();\n return this.client.processTransaction(tx, processOpts, txOpts);\n }\n\n /**\n * Creates a transaction for closing a lendr account.\n * The account must have no active positions or balances to be closed.\n *\n * @returns A transaction configured to close the lendr account\n */\n async makeCloseAccountTx(): Promise<ExtendedTransaction> {\n const ix = await this.makeCloseAccountIx();\n const tx = new Transaction().add(...ix.instructions);\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n return addTransactionMetadata(tx, {\n signers: ix.keys,\n addressLookupTables: clientLookupTables,\n type: TransactionType.CLOSE_ACCOUNT,\n });\n }\n\n /**\n * Creates instructions for depositing tokens into a lendr bank account.\n *\n * @param amount - The amount of tokens to deposit, can be a number or Amount object\n * @param bankAddress - The public key of the bank to deposit into\n * @param depositOpts - Optional deposit configuration parameters\n * @returns An InstructionsWrapper containing the deposit instructions\n */\n async makeDepositIx(\n amount: Amount,\n bankAddress: PublicKey,\n depositOpts: MakeDepositIxOpts = {},\n ): Promise<InstructionsWrapper> {\n return this._lendrAccount.makeDepositIx(\n this._program,\n this.client.banks,\n this.client.mintDatas,\n amount,\n bankAddress,\n depositOpts,\n );\n }\n\n async makeDepositWithSessionIx(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n depositOpts: MakeDepositWithSessionIxOpts = {},\n ): Promise<InstructionsWrapper> {\n return this._lendrAccount.makeDepositWithSessionIx(\n this._program,\n this.client.banks,\n this.client.mintDatas,\n amount,\n bankAddress,\n session,\n depositOpts,\n );\n }\n\n // ... existing code ...\n /**\n * Creates a transaction for depositing native stake into a lendr staked asset bank account.\n * - Split stake account if required\n * - Authorize stake account to single spl pool pogram\n * - Deposit stake into pool for LST\n * - Deposit LST into lendr bank\n *\n * @param amount - The amount of tokens to deposit, can be a number or Amount object\n * @param bankAddress - The public key of the bank to deposit into\n * @param stakeAccountPk - The public key of the stake account to delegate\n * @param validator - The public key of the validator to delegate to\n * @param depositOpts - Optional deposit configuration parameters\n * @returns A transaction object ready to be signed and sent\n */\n async makeDepositStakedTx(\n amount: Amount,\n bankAddress: PublicKey,\n stakeAccountPk: PublicKey,\n validator: PublicKey,\n depositOpts: MakeDepositIxOpts = {},\n ): Promise<ExtendedTransaction> {\n // derive addresses\n const pool = findPoolAddress(validator);\n const poolStakeAddress = findPoolStakeAddress(pool);\n const lstMint = findPoolMintAddress(pool);\n const auth = findPoolStakeAuthorityAddress(pool);\n const lstAta = getAssociatedTokenAddressSync(lstMint, this.authority);\n\n // fetch account info\n const [lstAccInfo, _stakeAccountInfo, stakeAccInfoParsed] = await Promise.all([\n this.client.provider.connection.getAccountInfo(lstAta),\n this._program.provider.connection.getAccountInfo(stakeAccountPk),\n this._program.provider.connection.getParsedAccountInfo(stakeAccountPk),\n ]);\n const stakeAccParsed = stakeAccInfoParsed?.value?.data as ParsedAccountData;\n\n // calculate amounts and thresholds\n const [rentExemptReserve, minimumDelegation] = await Promise.all([\n this._program.provider.connection.getMinimumBalanceForRentExemption(StakeProgram.space),\n this._program.provider.connection.getStakeMinimumDelegation().then((res) => {\n return Math.max(res.value, LAMPORTS_PER_SOL);\n }),\n ]);\n\n // calculate if full stake or requires splitting\n const amountLamports = Math.round(Number(amount) * LAMPORTS_PER_SOL);\n const stakeAccLamports = Number(stakeAccParsed.parsed.info.stake?.delegation?.stake ?? 0);\n const isFullStake = amountLamports >= stakeAccLamports;\n\n // calculate pool tokens\n const poolStakeAccLamports =\n (await this._program.provider.connection.getAccountInfo(poolStakeAddress))?.lamports ?? 0;\n const prePoolStake = Math.max(poolStakeAccLamports - minimumDelegation - rentExemptReserve, 0);\n\n const tokenSupply = Number.parseInt(\n (await this._program.provider.connection.getTokenSupply(lstMint)).value.amount,\n 10,\n );\n const stakeAddedNative = Number(amount) * 1e9;\n\n const newPoolTokens =\n prePoolStake > 0 && tokenSupply > 0\n ? Math.floor((stakeAddedNative * tokenSupply) / prePoolStake)\n : stakeAddedNative;\n\n if (newPoolTokens <= 0) {\n throw new Error(\"Deposit too small or calculation error.\");\n }\n\n // build instructions\n const instructions: TransactionInstruction[] = [];\n const signers: Signer[] = [];\n\n // create ata if needed\n if (!lstAccInfo) {\n instructions.push(createAssociatedTokenAccountInstruction(this.authority, lstAta, this.authority, lstMint));\n }\n\n // handle stake splitting if needed\n let targetStakePubkey: PublicKey;\n if (!isFullStake) {\n const splitStakeAccount = Keypair.generate();\n signers.push(splitStakeAccount);\n targetStakePubkey = splitStakeAccount.publicKey;\n\n instructions.push(\n ...StakeProgram.split(\n {\n stakePubkey: stakeAccountPk,\n authorizedPubkey: this.authority,\n splitStakePubkey: splitStakeAccount.publicKey,\n lamports: amountLamports,\n },\n rentExemptReserve,\n ).instructions,\n );\n } else {\n targetStakePubkey = stakeAccountPk;\n }\n\n // authorization instructions\n const [authorizeStakerIx, authorizeWithdrawIx] = await Promise.all([\n StakeProgram.authorize({\n stakePubkey: targetStakePubkey,\n authorizedPubkey: this.authority,\n newAuthorizedPubkey: auth,\n stakeAuthorizationType: StakeAuthorizationLayout.Staker,\n }).instructions,\n StakeProgram.authorize({\n stakePubkey: targetStakePubkey,\n authorizedPubkey: this.authority,\n newAuthorizedPubkey: auth,\n stakeAuthorizationType: StakeAuthorizationLayout.Withdrawer,\n }).instructions,\n ]);\n\n // fix SYSVAR_CLOCK_ID writability\n [authorizeStakerIx[0], authorizeWithdrawIx[0]].forEach((ix) => {\n ix.keys = ix.keys.map((key) => ({\n ...key,\n isWritable: key.pubkey.equals(SYSVAR_CLOCK_ID) ? false : key.isWritable,\n }));\n });\n\n instructions.push(...authorizeStakerIx, ...authorizeWithdrawIx);\n\n // deposit stake instructions\n const depositStakeIx = await SinglePoolInstruction.depositStake(pool, targetStakePubkey, lstAta, this.authority);\n\n // deposit bank instructions\n const lendrDepositIxs = await this.makeDepositIx(newPoolTokens / 1e9, bankAddress, depositOpts);\n\n instructions.push(depositStakeIx, ...lendrDepositIxs.instructions);\n\n // build transaction\n const transaction = new Transaction().add(...instructions);\n return addTransactionMetadata(transaction, {\n type: TransactionType.DEPOSIT_STAKE,\n signers: [...signers, ...lendrDepositIxs.keys],\n addressLookupTables: this.client.addressLookupTables,\n });\n }\n\n async makeMergeStakeAccountsTx(\n stakeAccountSrc: PublicKey,\n stakeAccountDest: PublicKey,\n ): Promise<ExtendedTransaction> {\n // Create the merge instruction\n const mergeInstruction = StakeProgram.merge({\n stakePubkey: stakeAccountDest, // Public key of the destination stake account\n sourceStakePubKey: stakeAccountSrc, // Public key of the source stake account\n authorizedPubkey: this.authority, // Public key of the stake authority\n });\n\n // Build the transaction\n const transaction = new Transaction().add(mergeInstruction);\n\n // Get client lookup tables for consistency with other functions\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n\n return addTransactionMetadata(transaction, {\n type: TransactionType.MERGE_STAKE_ACCOUNTS,\n signers: [],\n addressLookupTables: clientLookupTables,\n });\n }\n\n /**\n * Deposits tokens into a lendr bank account.\n *\n * @param amount - The amount of tokens to deposit, can be a number or Amount object\n * @param bankAddress - The public key of the bank to deposit into\n * @param depositOpts - Optional deposit configuration parameters\n * @param processOpts - Optional transaction processing configuration\n * @param txOpts - Optional transaction options\n * @returns The transaction signature of the deposit\n */\n async deposit(\n amount: Amount,\n bankAddress: PublicKey,\n depositOpts: MakeDepositIxOpts = {},\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature> {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n amount,\n bankAddress: bankAddress.toBase58(),\n },\n \"[lendr:lendr-account:deposit] Depositing into lendr account\",\n );\n\n const tx = await this.makeDepositTx(amount, bankAddress, depositOpts);\n\n const sig = await this.client.processTransaction(tx, processOpts, txOpts);\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n sig,\n },\n \"[lendr:lendr-account:deposit] Depositing successful\",\n );\n return sig;\n }\n\n async depositWithSession(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n depositOpts: MakeDepositWithSessionIxOpts = {},\n ): Promise<TransactionResult> {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n amount,\n bankAddress: bankAddress.toBase58(),\n sessionKey: session.sessionPublicKey,\n },\n \"[lendr:lendr-account:depositWithSession] Depositing into lendr account, using sessions.\",\n );\n\n const { instructions } = await this.makeDepositWithSessionIx(amount, bankAddress, session, depositOpts);\n\n const txResult = await session.sendTransaction(instructions);\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n txResult,\n },\n \"[lendr:lendr-account:depositWithSession] WithSession-Deposit was successful\",\n );\n return txResult;\n }\n\n /**\n * Creates a transaction for depositing tokens into a lendr bank account.\n *\n * @param amount - The amount of tokens to deposit, can be a number or Amount object\n * @param bankAddress - The public key of the bank to deposit into\n * @param depositOpts - Optional deposit configuration parameters\n * @returns A transaction object ready to be signed and sent\n */\n async makeDepositTx(\n amount: Amount,\n bankAddress: PublicKey,\n depositOpts: MakeDepositIxOpts = {},\n ): Promise<ExtendedTransaction> {\n const ixs = await this.makeDepositIx(amount, bankAddress, depositOpts);\n const tx = new Transaction().add(...ixs.instructions);\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n const solanaTx = addTransactionMetadata(tx, {\n type: TransactionType.DEPOSIT,\n signers: ixs.keys,\n addressLookupTables: clientLookupTables,\n });\n\n return solanaTx;\n }\n\n async makeDepositWithSessionTx(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n depositOpts: MakeDepositWithSessionIxOpts = {},\n ): Promise<ExtendedTransaction> {\n const ixs = await this.makeDepositWithSessionIx(amount, bankAddress, session, depositOpts);\n const tx = new Transaction().add(...ixs.instructions);\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n const solanaTx = addTransactionMetadata(tx, {\n type: TransactionType.DEPOSIT,\n signers: ixs.keys,\n addressLookupTables: clientLookupTables,\n });\n\n return solanaTx;\n }\n\n /**\n * Simulates a lendr transaction to preview its effects.\n *\n * @param txs - Array of transactions to simulate, can be either VersionedTransaction or Transaction\n * @param bankAddress - The public key of the bank to inspect\n * @param additionalAccountsToInspect - Optional array of additional account public keys to inspect during simulation\n * @returns A SimulationResult containing the preview state of both the lendr account and bank\n * @throws Will throw an error if simulation fails\n */\n async simulateBorrowLendTransaction(\n txs: (VersionedTransaction | Transaction)[],\n banksToInspect: PublicKey[],\n healthSimOptions?: {\n enabled: boolean;\n mandatoryBanks: PublicKey[];\n excludedBanks: PublicKey[];\n },\n ): Promise<SimulationResult> {\n const additionalTxs: VersionedTransaction[] = [];\n\n if (healthSimOptions?.enabled) {\n const computeIx = ComputeBudgetProgram.setComputeUnitLimit({\n units: 1_400_000,\n });\n const updateFeedIx = await this.makeUpdateFeedIx(healthSimOptions.mandatoryBanks);\n const healthPulseIx = await this.makePulseHealthIx(\n healthSimOptions.mandatoryBanks,\n healthSimOptions.excludedBanks,\n );\n\n const blockhash = (await this.client.provider.connection.getLatestBlockhash(\"confirmed\")).blockhash;\n\n const tx = new VersionedTransaction(\n new TransactionMessage({\n instructions: [computeIx, ...updateFeedIx.instructions, ...healthPulseIx.instructions],\n payerKey: this.client.provider.publicKey,\n recentBlockhash: blockhash,\n }).compileToV0Message([...this.client.addressLookupTables, ...updateFeedIx.luts]),\n );\n\n additionalTxs.push(tx);\n }\n\n const [ldrAccountData, ...bankData] = await this.client.simulateTransactions(\n [...txs, ...additionalTxs],\n [this.address, ...banksToInspect],\n );\n\n if (!ldrAccountData) throw new Error(\"Failed to simulate\");\n const ldrAccount = LendrAccount.decode(ldrAccountData, this._program.idl);\n console.log(\"ldrAccount\", ldrAccount);\n if (!bankData) throw new Error(\"Failed to simulate\");\n const previewBanks = new Map(this.client.banks);\n\n banksToInspect.forEach((bankAddress, idx) => {\n const data = bankData[idx];\n if (!data) throw new Error(\"Failed to simulate\");\n previewBanks.set(\n bankAddress.toBase58(),\n Bank.fromBuffer(bankAddress, data, this._program.idl, this.client.feedIdMap),\n );\n });\n\n const previewClient = new LendrClient({\n config: this._config,\n program: this.client.program,\n wallet: {} as Wallet,\n isReadOnly: true,\n group: this.client.group,\n banks: this.client.banks,\n priceInfos: this.client.oraclePrices,\n mintDatas: this.client.mintDatas,\n feedIdMap: this.client.feedIdMap,\n metadataService: this.client.metadataService,\n });\n const previewLendrAccount = LendrAccountWrapper.fromAccountDataRaw(\n this.address,\n previewClient,\n ldrAccountData,\n this._program.idl,\n );\n\n return {\n banks: previewBanks,\n lendrAccount: previewLendrAccount,\n };\n }\n\n /**\n * Creates a transaction instruction for repaying a loan.\n *\n * @param amount - The amount to repay, can be a number or Amount object\n * @param bankAddress - The public key of the bank to repay to\n * @param repayAll - Whether to repay the entire loan balance, defaults to false\n * @param repayOpts - Optional parameters for the repay instruction\n * @returns An InstructionsWrapper containing the deposit instructions\n * @throws Will throw an error if the repay mint is not found\n */\n async makeRepayIx(\n amount: Amount,\n bankAddress: PublicKey,\n repayAll = false,\n repayOpts: MakeRepayIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const tokenProgramAddress = this.client.mintDatas.get(bankAddress.toBase58())?.tokenProgram;\n if (!tokenProgramAddress) throw Error(\"Repay mint not found\");\n\n return this._lendrAccount.makeRepayIx(\n this._program,\n this.client.banks,\n this.client.mintDatas,\n amount,\n bankAddress,\n repayAll,\n repayOpts,\n );\n }\n\n /**\n * Creates a transaction instruction for repaying a loan.\n *\n * @param amount - The amount to repay, can be a number or Amount object\n * @param bankAddress - The public key of the bank to repay to\n * @param sessionKey - The session key of the logged in user (with session)\n * @param repayAll - Whether to repay the entire loan balance, defaults to false\n * @param repayOpts - Optional parameters for the repay instruction\n * @returns An InstructionsWrapper containing the deposit instructions\n * @throws Will throw an error if the repay mint is not found\n */\n async makeRepayWithSessionIx(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n repayAll = false,\n repayOpts: MakeRepayWithSessionIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const tokenProgramAddress = this.client.mintDatas.get(bankAddress.toBase58())?.tokenProgram;\n if (!tokenProgramAddress) throw Error(\"Repay mint not found\");\n\n return this._lendrAccount.makeRepayWithSessionIx(\n this._program,\n this.client.banks,\n this.client.mintDatas,\n amount,\n bankAddress,\n session,\n repayAll,\n repayOpts,\n );\n }\n\n /**\n * Repays a loan in a lendr bank account.\n *\n * @param amount - The amount to repay, can be a number or Amount object\n * @param bankAddress - The public key of the bank to repay to\n * @param repayAll - Whether to repay the entire loan balance, defaults to false\n * @param repayOpts - Optional parameters for the repay instruction\n * @param processOpts - Optional transaction processing configuration\n * @param txOpts - Optional transaction options\n * @returns The transaction signature of the repayment\n */\n async repay(\n amount: Amount,\n bankAddress: PublicKey,\n repayAll = false,\n repayOpts: MakeRepayIxOpts = {},\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature> {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n amount,\n bankAddress,\n repayAll,\n },\n \"[lendr:lendr-account:repay] Repaying into lendr account\",\n );\n\n const tx = await this.makeRepayTx(amount, bankAddress, repayAll, repayOpts);\n\n const sig = await this.client.processTransaction(tx, processOpts, txOpts);\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n sig,\n },\n \"[lendr:lendr-account:repay] Repaying successful\",\n );\n\n return sig;\n }\n\n /**\n * Repays a loan in a lendr bank account.\n *\n * @param amount - The amount to repay, can be a number or Amount object\n * @param bankAddress - The public key of the bank to repay to\n * @param session: Session object in Established state (o.w. sendTransaction method won't work!)\n * @param repayAll - Whether to repay the entire loan balance, defaults to false\n * @param repayOpts - Optional parameters for the repay instruction\n * @returns The transaction signature of the repayment\n */\n async repayWithSession(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n repayAll = false,\n repayOpts: MakeRepayWithSessionIxOpts = {},\n ): Promise<TransactionResult> {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n sessionKey: session.sessionPublicKey,\n amount,\n bankAddress,\n repayAll,\n },\n \"[lendr:lendr-account:repayWithSession] Repaying into lendr account\",\n );\n\n const { instructions } = await this.makeRepayWithSessionIx(amount, bankAddress, session, repayAll, repayOpts);\n\n const result = await session.sendTransaction(instructions);\n\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n result,\n },\n \"[lendr:lendr-account:repayWithSession] Repaying successful\",\n );\n\n return result;\n }\n\n /**\n * Creates a transaction for repaying a loan in a lendr bank account.\n *\n * @param amount - The amount to repay, can be a number or Amount object\n * @param bankAddress - The public key of the bank to repay to\n * @param repayAll - Whether to repay the entire loan balance, defaults to false\n * @param repayOpts - Optional parameters for the repay instruction\n * @returns A transaction object containing the repay instructions\n */\n async makeRepayTx(\n amount: Amount,\n bankAddress: PublicKey,\n repayAll = false,\n repayOpts: MakeRepayIxOpts = {},\n ): Promise<ExtendedTransaction> {\n const ixs = await this.makeRepayIx(amount, bankAddress, repayAll, repayOpts);\n const tx = new Transaction().add(...ixs.instructions);\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n const solanaTx = addTransactionMetadata(tx, {\n type: TransactionType.REPAY,\n signers: ixs.keys,\n addressLookupTables: clientLookupTables,\n });\n return solanaTx;\n }\n\n /**\n * Creates a transaction for repaying a loan in a lendr bank account.\n *\n * @param amount - The amount to repay, can be a number or Amount object\n * @param bankAddress - The public key of the bank to repay to\n * @param repayAll - Whether to repay the entire loan balance, defaults to false\n * @param repayOpts - Optional parameters for the repay instruction\n * @returns A transaction object containing the repay instructions\n */\n async makeRepayWithSessionTx(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n repayAll = false,\n repayOpts: MakeRepayWithSessionIxOpts = {},\n ): Promise<ExtendedTransaction> {\n const ixs = await this.makeRepayWithSessionIx(amount, bankAddress, session, repayAll, repayOpts);\n const tx = new Transaction().add(...ixs.instructions);\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n const solanaTx = addTransactionMetadata(tx, {\n type: TransactionType.REPAY,\n signers: ixs.keys,\n addressLookupTables: clientLookupTables,\n });\n return solanaTx;\n }\n\n /**\n * Creates instructions for withdrawing tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to withdraw, can be a number or Amount object\n * @param bankAddress - The public key of the bank to withdraw from\n * @param withdrawAll - Whether to withdraw the entire balance, defaults to false\n * @param withdrawOpts - Optional parameters for the withdraw instruction\n * @returns An InstructionsWrapper containing the withdraw instructions and signers\n * @throws Will throw an error if the withdraw mint is not found\n */\n async makeWithdrawIx(\n amount: Amount,\n bankAddress: PublicKey,\n withdrawAll = false,\n withdrawOpts: MakeWithdrawIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const tokenProgramAddress = this.client.mintDatas.get(bankAddress.toBase58())?.tokenProgram;\n if (!tokenProgramAddress) throw Error(\"Withdraw mint not found\");\n\n if (!this.client.bankMetadataMap) throw Error(\"Bank metadata map not found\");\n\n return this._lendrAccount.makeWithdrawIx(\n this._program,\n this.client.banks,\n this.client.mintDatas,\n this.client.bankMetadataMap,\n amount,\n bankAddress,\n withdrawAll,\n withdrawOpts,\n );\n }\n\n /**\n * Creates instructions for withdrawing tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to withdraw, can be a number or Amount object\n * @param bankAddress - The public key of the bank to withdraw from\n * @param session - User's logged in session object in Established state.\n * @param withdrawAll - Whether to withdraw the entire balance, defaults to false\n * @param withdrawOpts - Optional parameters for the withdraw instruction\n * @returns An InstructionsWrapper containing the withdraw instructions and signers\n * @throws Will throw an error if the withdraw mint is not found\n */\n async makeWithdrawWithSessionIx(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n withdrawAll = false,\n withdrawOpts: MakeWithdrawWithSessionIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const tokenProgramAddress = this.client.mintDatas.get(bankAddress.toBase58())?.tokenProgram;\n if (!tokenProgramAddress) throw Error(\"Withdraw mint not found\");\n\n if (!this.client.bankMetadataMap) throw Error(\"Bank metadata map not found\");\n\n return this._lendrAccount.makeWithdrawWithSessionIx(\n this._program,\n this.client.banks,\n this.client.mintDatas,\n this.client.bankMetadataMap,\n amount,\n bankAddress,\n session,\n withdrawAll,\n withdrawOpts,\n );\n }\n\n /**\n * Creates a transaction for withdrawing tokens from a lendr bank account and staking them.\n * - Withdraw from lendr bank\n * - Create stake account\n * - Approve mint authority to burn tokens\n * - Delegate stake account\n *\n * @param amount - The amount of tokens to withdraw, can be a number or Amount object\n * @param bankAddress - The public key of the bank to withdraw from\n * @param isWholePosition - Whether to withdraw the entire position, defaults to false\n * @returns A transaction object ready to be signed and sent\n */\n async makeWithdrawStakedTx(\n amount: Amount,\n bankAddress: PublicKey,\n isWholePosition: boolean,\n ): Promise<TransactionBuilderResult> {\n // get bank and metadata\n const bank = this.client.getBankByPk(bankAddress);\n const solBank = this.client.getBankByMint(WSOL_MINT);\n const bankMetadata = this.client.bankMetadataMap?.[bankAddress.toBase58()];\n\n if (!bank || !solBank) {\n throw new Error(\"Banks not found\");\n }\n\n if (!bankMetadata || !bankMetadata.validatorVoteAccount) {\n throw new Error(\"Validator vote account not found\");\n }\n\n // derive addresses\n const pool = findPoolAddress(new PublicKey(bankMetadata.validatorVoteAccount));\n const lstMint = findPoolMintAddress(pool);\n const mintAuthority = findPoolMintAuthorityAddress(pool);\n const lstAta = getAssociatedTokenAddressSync(lstMint, this.authority);\n\n // calculate amounts and thresholds\n const rentExemption = await this._program.provider.connection.getMinimumBalanceForRentExemption(200);\n\n const stakeAmount = new BigNumber(new BigNumber(amount).toString());\n\n // withdraw from lendr bank\n const withdrawIxs = await this.makeWithdrawIx(amount, bankAddress, isWholePosition, {\n createAtas: true,\n wrapAndUnwrapSol: true,\n });\n\n // create stake account\n const stakeAccount = Keypair.generate();\n const createStakeAccountIx = SystemProgram.createAccount({\n fromPubkey: this.authority,\n newAccountPubkey: stakeAccount.publicKey,\n lamports: rentExemption,\n space: 200,\n programId: STAKE_PROGRAM_ID,\n });\n\n const approveAccountAuthorityIx = createApproveInstruction(\n lstAta,\n mintAuthority,\n this.authority,\n stakeAmount.multipliedBy(1e9).toNumber(),\n [],\n // TODO)) test and see if this should be 2022\n TOKEN_PROGRAM_ID,\n );\n\n // delegate stake account\n const withdrawStakeIx: TransactionInstruction = await SinglePoolInstruction.withdrawStake(\n pool,\n stakeAccount.publicKey,\n this.authority,\n lstAta,\n stakeAmount,\n );\n\n // build transaction\n const {\n value: { blockhash },\n } = await this._program.provider.connection.getLatestBlockhashAndContext(\"confirmed\");\n\n const withdrawMessage = new TransactionMessage({\n payerKey: this.client.wallet.publicKey,\n recentBlockhash: blockhash,\n instructions: [...withdrawIxs.instructions],\n }).compileToV0Message(this.client.addressLookupTables);\n const withdrawTxn = addTransactionMetadata(new VersionedTransaction(withdrawMessage), {\n signers: withdrawIxs.keys,\n addressLookupTables: this.client.addressLookupTables,\n type: TransactionType.WITHDRAW,\n });\n\n const stakeMessage = new TransactionMessage({\n payerKey: this.client.wallet.publicKey,\n recentBlockhash: blockhash,\n instructions: [createStakeAccountIx, approveAccountAuthorityIx, withdrawStakeIx],\n }).compileToV0Message(this.client.addressLookupTables);\n const stakeTxn = addTransactionMetadata(new VersionedTransaction(stakeMessage), {\n signers: [stakeAccount],\n addressLookupTables: this.client.addressLookupTables,\n type: TransactionType.WITHDRAW_STAKE,\n });\n\n return { transactions: [withdrawTxn, stakeTxn], actionTxIndex: 1 };\n }\n\n /**\n * Creates a transaction for withdrawing all tokens from multiple lendr banks.\n *\n * @param banks - Array of objects containing amount and bank address for each withdrawal\n * @param withdrawOpts - Optional parameters for the withdraw instructions\n * @returns A transaction object ready to be signed and sent\n */\n async makeWithdrawAllTx(\n banks: {\n amount: Amount;\n bankAddress: PublicKey;\n }[],\n withdrawOpts: MakeWithdrawIxOpts = {},\n ): Promise<ExtendedTransaction> {\n this.client.logger.debug(\n { address: this.address.toBase58() },\n \"[lendr:lendr-account:withdraw-all] Withdrawing all from lendr account\",\n );\n\n const withdrawIxsWrapped = await Promise.all(\n banks.map((bank) => this.makeWithdrawIx(bank.amount, bank.bankAddress, true, withdrawOpts)),\n );\n return this.finalizeWithdrawAllTransaction(withdrawIxsWrapped);\n }\n\n /**\n * Creates a transaction for withdrawing all tokens from multiple lendr banks.\n *\n * @param banks - Array of objects containing amount and bank address for each withdrawal\n * @param session - user session object (in Established state)\n * @param withdrawOpts - Optional parameters for the withdraw instructions\n * @returns A transaction object ready to be signed and sent\n */\n async makeWithdrawAllWithSessionTx(\n banks: {\n amount: Amount;\n bankAddress: PublicKey;\n }[],\n session: EstablishedSessionState,\n withdrawOpts: MakeWithdrawWithSessionIxOpts = {},\n ): Promise<ExtendedTransaction> {\n this.client.logger.debug(\n { address: this.address.toBase58() },\n \"[lendr:lendr-account:withdraw-all-with-session] Withdrawing all from lendr account\",\n );\n\n const withdrawIxsWrapped = await Promise.all(\n banks.map((bank) => this.makeWithdrawWithSessionIx(bank.amount, bank.bankAddress, session, true, withdrawOpts)),\n );\n\n return this.finalizeWithdrawAllTransaction(withdrawIxsWrapped);\n }\n\n async finalizeWithdrawAllTransaction(withdrawIxsWrapped: InstructionsWrapper[]) {\n // TODO add crank\n const cuRequestIxs = this.makeComputeBudgetIx();\n const withdrawIxs = withdrawIxsWrapped.flatMap((ix) => ix.instructions);\n // make sure all signers are unique\n const filteredSigners = withdrawIxsWrapped\n .flatMap((ix) => ix.keys)\n .filter((key, index, self) => index === self.findIndex((k) => k.publicKey.equals(key.publicKey)));\n\n const tx = new Transaction().add(...cuRequestIxs, ...withdrawIxs);\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n\n const solanaTx = addTransactionMetadata(tx, {\n signers: filteredSigners,\n addressLookupTables: clientLookupTables,\n type: TransactionType.WITHDRAW_ALL,\n });\n return solanaTx;\n }\n\n /**\n * Withdraws tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to withdraw, can be a number or Amount object\n * @param bankAddress - The public key of the bank to withdraw from\n * @param withdrawAll - If true, withdraws entire balance from the bank\n * @param withdrawOpts - Optional withdraw configuration parameters\n * @param processOpts - Optional transaction processing configuration\n * @param txOpts - Optional transaction options\n * @returns Array of transaction signatures - includes signatures for any required oracle feed updates followed by the withdraw transaction\n */\n async withdraw(\n amount: Amount,\n bankAddress: PublicKey,\n withdrawAll = false,\n withdrawOpts: MakeWithdrawIxOpts = {},\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature[]> {\n this.client.logger.debug(\n { address: this.address.toBase58(), amount },\n \"[lendr:lendr-account:withdraw] Withdrawing from lendr account\",\n );\n\n const { transactions } = await this.makeWithdrawTx(amount, bankAddress, withdrawAll, withdrawOpts);\n\n // process multiple transactions if feed updates required\n const sigs = await this.client.processTransactions([...transactions], processOpts, txOpts);\n this.client.logger.debug(\n { address: this.address.toBase58(), sig: sigs[sigs.length - 1] },\n \"[lendr:lendr-account:withdraw] Withdrawing successful\",\n );\n\n return sigs;\n }\n\n /**\n * Withdraws tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to withdraw, can be a number or Amount object\n * @param bankAddress - The public key of the bank to withdraw from\n * @param withdrawAll - If true, withdraws entire balance from the bank\n * @param withdrawOpts - Optional withdraw configuration parameters\n * @returns Array of transaction signatures - includes signatures for any required oracle feed updates followed by the withdraw transaction\n */\n async withdrawWithSession(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n withdrawAll = false,\n withdrawOpts: MakeWithdrawWithSessionIxOpts = {},\n ) {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n amount,\n sessionKey: session.sessionPublicKey,\n },\n \"[lendr:lendr-account:withdrawWithSession] Withdrawing from lendr account\",\n );\n\n const { instructions } = await this.makeWithdrawWithSessionIx(\n amount,\n bankAddress,\n session,\n withdrawAll,\n withdrawOpts,\n );\n\n // TODO: CHECK: For now this codebase returns empty array for updateFeedIxs; I don't know if this completely works without user sign\n // In case makeUpdateFeedIx returns actual instructions!\n const txResult = await session.sendTransaction(instructions);\n\n this.client.logger.debug(\n { address: this.address.toBase58(), txResult },\n \"[lendr:lendr-account:withdraw-with-session] Withdrawing successful\",\n );\n\n return txResult;\n }\n\n /**\n * Creates a versioned transaction for withdrawing tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to withdraw, can be a number or Amount object\n * @param bankAddress - The public key of the bank to withdraw from\n * @param withdrawAll - If true, withdraws entire balance from the bank\n * @param withdrawOpts - Optional withdraw configuration parameters\n * @returns Object containing feed crank transactions and the withdraw transaction\n */\n async makeWithdrawTx(\n amount: Amount,\n bankAddress: PublicKey,\n withdrawAll = false,\n withdrawOpts: MakeWithdrawIxOpts = {},\n ): Promise<TransactionBuilderResult> {\n const cuRequestIxs = this.makeComputeBudgetIx();\n const { instructions: updateFeedIxs, luts: feedLuts } = await this.makeUpdateFeedIx([]);\n const withdrawIxs = await this.makeWithdrawIx(amount, bankAddress, withdrawAll, withdrawOpts);\n\n const {\n value: { blockhash },\n } = await this._program.provider.connection.getLatestBlockhashAndContext(\"confirmed\");\n\n const feedCrankTxs: ExtendedV0Transaction[] = [];\n\n if (updateFeedIxs.length > 0) {\n feedCrankTxs.push(\n addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: [...updateFeedIxs],\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(feedLuts),\n ),\n {\n addressLookupTables: feedLuts,\n type: TransactionType.CRANK,\n },\n ),\n );\n }\n\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n\n const withdrawTx = addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: [...cuRequestIxs, ...withdrawIxs.instructions],\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(clientLookupTables),\n ),\n {\n signers: withdrawIxs.keys,\n addressLookupTables: clientLookupTables,\n type: TransactionType.WITHDRAW,\n },\n );\n\n const transactions = [...feedCrankTxs, withdrawTx];\n\n return { transactions, actionTxIndex: transactions.length - 1 };\n }\n\n /**\n * Creates a versioned transaction for withdrawing tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to withdraw, can be a number or Amount object\n * @param bankAddress - The public key of the bank to withdraw from\n * @param session - Logged in user session object in Established state.\n * @param withdrawAll - If true, withdraws entire balance from the bank\n * @param withdrawOpts - Optional withdraw configuration parameters\n * @returns Object containing feed crank transactions and the withdraw transaction\n */\n async makeWithdrawWithSessionTx(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n withdrawAll = false,\n withdrawOpts: MakeWithdrawWithSessionIxOpts = {},\n ) {\n const cuRequestIxs = this.makeComputeBudgetIx();\n const { instructions: updateFeedIxs, luts: feedLuts } = await this.makeUpdateFeedIx([]);\n const withdrawIxs = await this.makeWithdrawWithSessionIx(amount, bankAddress, session, withdrawAll, withdrawOpts);\n\n const {\n value: { blockhash },\n } = await this._program.provider.connection.getLatestBlockhashAndContext(\"confirmed\");\n\n const feedCrankTxs: ExtendedV0Transaction[] = [];\n\n if (updateFeedIxs.length > 0) {\n feedCrankTxs.push(\n addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: [...updateFeedIxs],\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(feedLuts),\n ),\n {\n addressLookupTables: feedLuts,\n type: TransactionType.CRANK,\n },\n ),\n );\n }\n\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n\n const withdrawTx = addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: [...cuRequestIxs, ...withdrawIxs.instructions],\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(clientLookupTables),\n ),\n {\n signers: withdrawIxs.keys,\n addressLookupTables: clientLookupTables,\n type: TransactionType.WITHDRAW,\n },\n );\n\n const transactions = [...feedCrankTxs, withdrawTx];\n\n return {\n transactions,\n instructions: [...updateFeedIxs, ...cuRequestIxs, ...withdrawIxs.instructions],\n actionTxIndex: transactions.length - 1,\n };\n }\n\n /**\n * Creates instructions for borrowing tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to borrow, can be a number or Amount object\n * @param bankAddress - The public key of the bank to borrow from\n * @param borrowOpts - Optional borrow configuration parameters\n * @returns An InstructionsWrapper containing the borrow instructions\n */\n async makeBorrowIx(\n amount: Amount,\n bankAddress: PublicKey,\n borrowOpts: MakeBorrowIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const tokenProgramAddress = this.client.mintDatas.get(bankAddress.toBase58())?.tokenProgram;\n if (!tokenProgramAddress) throw Error(\"Borrow mint not found\");\n\n if (!this.client.bankMetadataMap) throw Error(\"Bank metadata map not found\");\n\n return this._lendrAccount.makeBorrowIx(\n this._program,\n this.client.banks,\n this.client.mintDatas,\n this.client.bankMetadataMap,\n amount,\n bankAddress,\n borrowOpts,\n );\n }\n\n /**\n * Creates instructions for borrowing tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to borrow, can be a number or Amount object\n * @param bankAddress - The public key of the bank to borrow from\n * @param session\n * @param borrowOpts - Optional borrow configuration parameters\n * @returns An InstructionsWrapper containing the borrow instructions\n */\n async makeBorrowWithSessionIx(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n borrowOpts: MakeBorrowWithSessionIxOpts = {},\n ): Promise<InstructionsWrapper> {\n const tokenProgramAddress = this.client.mintDatas.get(bankAddress.toBase58())?.tokenProgram;\n if (!tokenProgramAddress) throw Error(\"Borrow mint not found\");\n\n if (!this.client.bankMetadataMap) throw Error(\"Bank metadata map not found\");\n\n return this._lendrAccount.makeBorrowWithSessionIx(\n this._program,\n this.client.banks,\n this.client.mintDatas,\n this.client.bankMetadataMap,\n amount,\n bankAddress,\n session,\n borrowOpts,\n );\n }\n\n /**\n * Borrows tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to borrow, can be a number or Amount object\n * @param bankAddress - The public key of the bank to borrow from\n * @param borrowOpts - Optional borrow configuration parameters\n * @param processOpts - Optional transaction processing configuration\n * @param txOpts - Optional transaction configuration parameters\n * @returns Array of transaction signatures from the borrow operation\n */\n async borrow(\n amount: Amount,\n bankAddress: PublicKey,\n borrowOpts: MakeBorrowIxOpts = {},\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature[]> {\n this.client.logger.debug(\n { address: this.address.toBase58(), amount },\n \"[lendr:lendr-account:borrow] Borrowing from lendr account\",\n );\n\n const { transactions } = await this.makeBorrowTx(amount, bankAddress, borrowOpts);\n\n const sigs = await this.client.processTransactions([...transactions], processOpts, txOpts);\n this.client.logger.debug(\n { address: this.address.toBase58(), sigs },\n \"[lendr:lendr-account:borrow] Borrowing successful\",\n );\n return sigs;\n }\n\n /**\n * Borrows tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to borrow, can be a number or Amount object\n * @param bankAddress - The public key of the bank to borrow from\n * @param session - Fogo session object in Established state.\n * @param borrowOpts - Optional borrow configuration parameters\n * @returns Array of transaction signatures from the borrow operation\n */\n async borrowWithSession(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n borrowOpts: MakeBorrowWithSessionIxOpts = {},\n ): Promise<TransactionResult> {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n amount,\n sessionKey: session.sessionPublicKey,\n },\n \"[lendr:lendr-account:borrowWithSession] Borrowing from lendr account\",\n );\n\n const { instructions } = await this.makeBorrowWithSessionIx(amount, bankAddress, session, borrowOpts);\n\n const txResult = await session.sendTransaction(instructions, { variation: \"LendingAccountBorrow\" });\n\n this.client.logger.debug(\n { address: this.address.toBase58(), txResult },\n \"[lendr:lendr-account:borrowWithSession] Borrowing successful\",\n );\n return txResult;\n }\n\n /**\n * Creates a versioned transaction for borrowing tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to borrow, can be a number or Amount object\n * @param bankAddress - The public key of the bank to borrow from\n * @param borrowOpts - Optional borrow configuration parameters\n * @returns Object containing feed crank transactions and the borrow transaction\n */\n async makeBorrowTx(\n amount: Amount,\n bankAddress: PublicKey,\n borrowOpts: MakeBorrowIxOpts = {},\n ): Promise<TransactionBuilderResult> {\n const cuRequestIxs = this.makeComputeBudgetIx();\n\n // if banks are stale and using switchboard pull, we need to crank the feed\n const { instructions: updateFeedIxs, luts: feedLuts } = await this.makeUpdateFeedIx([bankAddress]);\n const borrowIxs = await this.makeBorrowIx(amount, bankAddress, borrowOpts);\n\n const {\n value: { blockhash },\n } = await this._program.provider.connection.getLatestBlockhashAndContext(\"confirmed\");\n\n const feedCrankTxs: ExtendedV0Transaction[] = [];\n\n if (updateFeedIxs.length > 0) {\n feedCrankTxs.push(\n addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: updateFeedIxs,\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(feedLuts),\n ),\n {\n type: TransactionType.CRANK,\n addressLookupTables: feedLuts,\n },\n ),\n );\n }\n\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n\n const borrowTx = addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: [...cuRequestIxs, ...borrowIxs.instructions],\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(clientLookupTables),\n ),\n {\n signers: borrowIxs.keys,\n type: TransactionType.BORROW,\n addressLookupTables: clientLookupTables,\n },\n );\n\n const transactions = [...feedCrankTxs, borrowTx];\n return { transactions, actionTxIndex: transactions.length - 1 };\n }\n\n /**\n * Creates a versioned transaction for borrowing tokens from a lendr bank account.\n *\n * @param amount - The amount of tokens to borrow, can be a number or Amount object\n * @param bankAddress - The public key of the bank to borrow from\n * @param session\n * @param borrowOpts - Optional borrow configuration parameters\n * @returns Object containing feed crank transactions and the borrow transaction\n */\n async makeBorrowWithSessionTx(\n amount: Amount,\n bankAddress: PublicKey,\n session: EstablishedSessionState,\n borrowOpts: MakeBorrowWithSessionIxOpts = {},\n ) {\n const cuRequestIxs = this.makeComputeBudgetIx();\n\n // if banks are stale and using switchboard pull, we need to crank the feed\n const { instructions: updateFeedIxs, luts: feedLuts } = await this.makeUpdateFeedIx([bankAddress]);\n const borrowIxs = await this.makeBorrowWithSessionIx(amount, bankAddress, session, borrowOpts);\n\n const {\n value: { blockhash },\n } = await this._program.provider.connection.getLatestBlockhashAndContext(\"confirmed\");\n\n const feedCrankTxs: ExtendedV0Transaction[] = [];\n\n if (updateFeedIxs.length > 0) {\n feedCrankTxs.push(\n addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: updateFeedIxs,\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(feedLuts),\n ),\n {\n type: TransactionType.CRANK,\n addressLookupTables: feedLuts,\n },\n ),\n );\n }\n\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n\n const borrowTx = addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: [...cuRequestIxs, ...borrowIxs.instructions],\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(clientLookupTables),\n ),\n {\n signers: borrowIxs.keys,\n type: TransactionType.BORROW,\n addressLookupTables: clientLookupTables,\n },\n );\n\n const transactions = [...feedCrankTxs, borrowTx];\n return {\n transactions,\n instructions: [...updateFeedIxs, ...cuRequestIxs, ...borrowIxs.instructions],\n actionTxIndex: transactions.length - 1,\n };\n }\n\n /**\n * Creates instructions for withdrawing emissions rewards from a lendr bank account.\n *\n * @param bankAddress - The public key of the bank to withdraw emissions from\n * @returns An InstructionsWrapper containing the withdraw emissions instructions\n */\n async makeWithdrawEmissionsIx(bankAddress: PublicKey): Promise<InstructionsWrapper> {\n return this._lendrAccount.makeWithdrawEmissionsIx(\n this._program,\n this.client.banks,\n this.client.mintDatas,\n bankAddress,\n );\n }\n\n /**\n * Creates a versioned transaction for withdrawing emissions rewards from multiple lendr bank accounts.\n *\n * @param bankAddresses - Array of public keys for the banks to withdraw emissions from\n * @returns A versioned transaction containing the withdraw emissions instructions\n */\n async makeWithdrawEmissionsTx(bankAddresses: PublicKey[]): Promise<ExtendedV0Transaction> {\n const {\n value: { blockhash },\n } = await this._program.provider.connection.getLatestBlockhashAndContext(\"confirmed\");\n\n const withdrawEmissionsIxs: InstructionsWrapper[] = [];\n await Promise.all(\n bankAddresses.map(async (bankAddress) => {\n const ix = await this.makeWithdrawEmissionsIx(bankAddress);\n if (!ix) return;\n withdrawEmissionsIxs.push(ix);\n }),\n );\n\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n\n const emissionsTx = addTransactionMetadata(\n new VersionedTransaction(\n new TransactionMessage({\n instructions: withdrawEmissionsIxs.flatMap((ix) => ix.instructions),\n payerKey: this.authority,\n recentBlockhash: blockhash,\n }).compileToV0Message(clientLookupTables),\n ),\n {\n signers: withdrawEmissionsIxs.flatMap((ix) => ix.keys),\n type: TransactionType.WITHDRAW_EMISSIONS,\n addressLookupTables: clientLookupTables,\n },\n );\n\n return emissionsTx;\n }\n\n /**\n * Withdraws emissions rewards from multiple lendr bank accounts.\n *\n * @param bankAddresses - Array of public keys for the banks to withdraw emissions from\n * @param processOpts - Optional processing options for the transaction\n * @param txOpts - Optional transaction options\n * @returns The transaction signature of the withdraw emissions transaction\n */\n async withdrawEmissions(\n bankAddresses: PublicKey[],\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature> {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n banks: bankAddresses.map((b) => b.toBase58()),\n },\n \"[lendr:lendr-account:withdraw-emissions] Withdrawing emission from lendr account\",\n );\n\n const withdrawEmissionsTx = await this.makeWithdrawEmissionsTx(bankAddresses);\n const sig = await this.client.processTransaction(withdrawEmissionsTx, processOpts, txOpts);\n this.client.logger.debug(\n { address: this.address.toBase58(), sig },\n \"[lendr:lendr-account:withdraw-emissions] Withdrawing emission from lendr account\",\n );\n\n return sig;\n }\n\n /**\n * Creates an instruction wrapper for liquidating a lending account position.\n *\n * @param liquidateeLendrAccount - The lendr account to be liquidated\n * @param assetBankAddress - Public key of the bank containing the asset to receive in liquidation\n * @param assetQuantityUi - Amount of the asset to receive, in UI units\n * @param liabBankAddress - Public key of the bank containing the liability to repay\n * @returns An instruction wrapper containing the liquidation instructions\n */\n public async makeLendingAccountLiquidateIx(\n liquidateeLendrAccount: LendrAccount,\n assetBankAddress: PublicKey,\n assetQuantityUi: Amount,\n liabBankAddress: PublicKey,\n ): Promise<InstructionsWrapper> {\n const liabTokenProgramAddress = this.client.mintDatas.get(liabBankAddress.toBase58())?.tokenProgram;\n if (!liabTokenProgramAddress) throw Error(\"Liability mint not found\");\n\n if (!this.client.bankMetadataMap) throw Error(\"Bank metadata map not found\");\n\n return this._lendrAccount.makeLendingAccountLiquidateIx(\n liquidateeLendrAccount,\n this._program,\n this.client.banks,\n this.client.mintDatas,\n this.client.bankMetadataMap,\n assetBankAddress,\n assetQuantityUi,\n liabBankAddress,\n );\n }\n\n /**\n * Liquidates a lending account position.\n *\n * @param liquidateeLendrAccount - The lendr account to be liquidated\n * @param assetBankAddress - Public key of the bank containing the asset to receive in liquidation\n * @param assetQuantityUi - Amount of the asset to receive, in UI units\n * @param liabBankAddress - Public key of the bank containing the liability to repay\n * @param processOpts - Optional processing options for the transaction\n * @param txOpts - Optional transaction options\n * @returns The transaction signature of the liquidation transaction\n */\n public async lendingAccountLiquidate(\n liquidateeLendrAccount: LendrAccount,\n assetBankAddress: PublicKey,\n assetQuantityUi: Amount,\n liabBankAddress: PublicKey,\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature> {\n this.client.logger.debug(\n {\n address: this.address.toBase58(),\n liquidateeLendrAccount: liquidateeLendrAccount.address.toBase58(),\n },\n \"[lendr:lendr-account:liquidation] Liquidating lendr account\",\n );\n\n const liquidationIxs = await this.makeLendingAccountLiquidateIx(\n liquidateeLendrAccount,\n assetBankAddress,\n assetQuantityUi,\n liabBankAddress,\n );\n const tx = new Transaction().add(...liquidationIxs.instructions);\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n const solanaTx = addTransactionMetadata(tx, {\n signers: liquidationIxs.keys,\n addressLookupTables: clientLookupTables,\n type: TransactionType.LIQUIDATE_ACCOUNT,\n });\n const sig = await this.client.processTransaction(solanaTx, processOpts, txOpts);\n this.client.logger.debug(\n { address: this.address.toBase58(), sig },\n \"[lendr:lendr-account:liquidation] Liquidation successful\",\n );\n\n return sig;\n }\n\n /**\n * Creates an instruction to begin a flash loan operation.\n *\n * @param endIndex - The index where the flash loan instructions end in the transaction\n * @returns An InstructionsWrapper containing the begin flash loan instruction\n */\n public async makeBeginFlashLoanIx(endIndex: number): Promise<InstructionsWrapper> {\n return this._lendrAccount.makeBeginFlashLoanIx(this._program, endIndex);\n }\n\n /**\n * Creates an instruction to begin a flash loan operation.\n *\n * @param endIndex - The index where the flash loan instructions end in the transaction\n * @param session - established session state\n * @returns An InstructionsWrapper containing the begin flash loan instruction\n */\n public async makeBeginFlashLoanWithSessionIx(\n endIndex: number,\n session: EstablishedSessionState,\n ): Promise<InstructionsWrapper> {\n return this._lendrAccount.makeBeginFlashLoanWithSessionIx(this._program, endIndex, session.sessionPublicKey);\n }\n\n /**\n * Creates an instruction to end a flash loan operation.\n *\n * @param projectedActiveBalances - Array of PublicKeys representing the projected active balance accounts after flash loan\n * @returns An InstructionsWrapper containing the end flash loan instruction\n */\n public async makeEndFlashLoanIx(projectedActiveBalances: PublicKey[]): Promise<InstructionsWrapper> {\n return this._lendrAccount.makeEndFlashLoanIx(this._program, this.client.banks, projectedActiveBalances);\n }\n\n /**\n * Creates an instruction to end a flash loan operation.\n *\n * @param projectedActiveBalances - Array of PublicKeys representing the projected active balance accounts after flash loan\n * @param session - established session state\n * @returns An InstructionsWrapper containing the end flash loan instruction\n */\n public async makeEndFlashLoanWithSessionIx(\n projectedActiveBalances: PublicKey[],\n session: EstablishedSessionState,\n ): Promise<InstructionsWrapper> {\n return this._lendrAccount.makeEndFlashLoanWithSessionIx(\n this._program,\n this.client.banks,\n projectedActiveBalances,\n session.sessionPublicKey,\n );\n }\n\n public async flashLoan(\n args: FlashLoanArgs,\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature> {\n this.client.logger.debug(\n { address: this.address.toBase58() },\n \"[lendr:lendr-account:flashLoan] Executing flashloan from lendr account\",\n );\n\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n const tx = await this.buildFlashLoanTx(args, clientLookupTables);\n const sig = await this.client.processTransaction(tx, processOpts, txOpts);\n this.client.logger.debug(\n { address: this.address.toBase58(), sig },\n \"[lendr:lendr-account:flashLoan] Flashloan successful\",\n );\n\n return sig;\n }\n\n public async flashLoanWithSession(args: FlashLoanArgs, session: EstablishedSessionState): Promise<TransactionResult> {\n this.client.logger.debug(\n { address: this.address.toBase58() },\n \"[lendr:lendr-account:flashLoanWithSession] Executing flashloan from lendr account using session\",\n );\n\n const clientLookupTables = await getClientAddressLookupTableAccounts(this.client);\n const tx = await this.buildFlashLoanWithSessionTx(args, session, clientLookupTables);\n\n const txResult = await session.sendTransaction(tx);\n this.client.logger.debug(\n { address: this.address.toBase58(), sig: txResult.signature },\n \"[lendr:lendr-account:flashLoanWithSession] Flashloan successful using session\",\n );\n\n return txResult;\n }\n\n public async buildFlashLoanTx(\n args: FlashLoanArgs,\n lookupTables?: AddressLookupTableAccount[],\n ): Promise<ExtendedV0Transaction> {\n const endIndex = args.ixs.length + 1;\n\n const projectedActiveBalances: PublicKey[] = this._lendrAccount.projectActiveBalancesNoCpi(this._program, args.ixs);\n\n const beginFlashLoanIx = await this.makeBeginFlashLoanIx(endIndex);\n const endFlashLoanIx = await this.makeEndFlashLoanIx(projectedActiveBalances);\n\n const flashloanIxs = [...beginFlashLoanIx.instructions, ...args.ixs, ...endFlashLoanIx.instructions];\n const totalLookupTables = [...(lookupTables ?? []), ...(args.addressLookupTableAccounts ?? [])];\n\n const blockhash =\n args.blockhash ?? (await this._program.provider.connection.getLatestBlockhash(\"confirmed\")).blockhash;\n const message = new TransactionMessage({\n payerKey: this.client.wallet.publicKey,\n recentBlockhash: blockhash,\n instructions: flashloanIxs,\n }).compileToV0Message(totalLookupTables);\n\n const tx = addTransactionMetadata(new VersionedTransaction(message), {\n addressLookupTables: totalLookupTables,\n type: TransactionType.FLASHLOAN,\n });\n\n if (args.signers) {\n tx.sign(args.signers);\n }\n\n return tx;\n }\n\n public async buildFlashLoanWithSessionTx(\n args: FlashLoanArgs,\n session: EstablishedSessionState,\n lookupTables?: AddressLookupTableAccount[],\n ): Promise<ExtendedV0Transaction> {\n const endIndex = args.ixs.length + 1;\n\n const projectedActiveBalances: PublicKey[] = this._lendrAccount.projectActiveBalancesNoCpi(this._program, args.ixs);\n\n const beginFlashLoanIx = await this.makeBeginFlashLoanWithSessionIx(endIndex, session);\n const endFlashLoanIx = await this.makeEndFlashLoanWithSessionIx(projectedActiveBalances, session);\n\n const flashloanIxs = [...beginFlashLoanIx.instructions, ...args.ixs, ...endFlashLoanIx.instructions];\n\n const totalLookupTables = lookupTables || [];\n\n const blockhash =\n args.blockhash ?? (await this._program.provider.connection.getLatestBlockhash(\"confirmed\")).blockhash;\n const message = new TransactionMessage({\n payerKey: session.payer,\n recentBlockhash: blockhash,\n instructions: flashloanIxs,\n }).compileToV0Message(totalLookupTables);\n\n const tx = addTransactionMetadata(new VersionedTransaction(message), {\n addressLookupTables: totalLookupTables,\n type: TransactionType.FLASHLOAN,\n });\n\n if (args.signers) {\n tx.sign(args.signers);\n }\n\n return tx;\n }\n\n public async makeTransferAccountAuthorityIx(newAccountAuthority: PublicKey): Promise<InstructionsWrapper> {\n return this._lendrAccount.makeAccountAuthorityTransferIx(this._program, newAccountAuthority);\n }\n\n async transferAccountAuthority(\n newAccountAuthority: PublicKey,\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<string> {\n this.client.logger.debug(\n { from: this.address.toBase58(), to: newAccountAuthority.toBase58() },\n \"[lendr:lendr-account:transfer-authority] Transferring account\",\n );\n\n const ixs = await this.makeTransferAccountAuthorityIx(newAccountAuthority);\n const tx = new Transaction().add(...ixs.instructions);\n const solanaTx = addTransactionMetadata(tx, {\n type: TransactionType.TRANSFER_AUTH,\n });\n const sig = await this.client.processTransaction(solanaTx, processOpts, txOpts);\n this.client.logger.debug({ sig }, \"[lendr:lendr-account:transfer-authority] Transfer successful\");\n\n return sig;\n }\n\n async makeUpdateFeedIx(\n newBanksPk: PublicKey[],\n txLandingBuffer = 0,\n ): Promise<{\n instructions: TransactionInstruction[];\n luts: AddressLookupTableAccount[];\n }> {\n console.log(newBanksPk, txLandingBuffer);\n\n return { instructions: [], luts: [] };\n }\n\n async makePulseHealthIx(mandatoryBanks: PublicKey[] = [], excludedBanks: PublicKey[] = []) {\n return this._lendrAccount.makePulseHealthIx(\n this._program,\n this.client.banks,\n mandatoryBanks,\n excludedBanks,\n this.client.bankMetadataMap || {},\n );\n }\n\n // --------------------------------------------------------------------------\n // Helpers\n // --------------------------------------------------------------------------\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: Reserved for future use\n private static async fetchAccountData(\n accountAddress: Address,\n config: LendrConfig,\n program: LendrProgram,\n commitment?: Commitment,\n ): Promise<LendrAccountRaw> {\n const mergedCommitment = commitment ?? program.provider.connection.commitment ?? DEFAULT_COMMITMENT;\n\n const data: LendrAccountRaw = (await program.account.lendrAccount.fetch(accountAddress, mergedCommitment)) as any;\n\n if (!data.group.equals(config.groupPk))\n throw Error(`Lendr account tied to group ${data.group.toBase58()}. Expected: ${config.groupPk.toBase58()}`);\n\n return data;\n }\n\n static async encode(decoded: LendrAccountRaw, idl: LendrIdlType): Promise<Buffer> {\n const coder = new BorshCoder(idl);\n return await coder.accounts.encode(AccountType.LendrAccount, decoded);\n }\n\n async reload() {\n this.client.logger.debug(\n { address: this.address.toBase58() },\n \"[lendr:lendr-account:reload] Reloading account data\",\n );\n\n const lendrAccountAi = await this._program.account.lendrAccount.getAccountInfo(this.address);\n if (!lendrAccountAi) throw new Error(`Failed to fetch data for lendr account ${this.address.toBase58()}`);\n const lendrAccountParsed = LendrAccount.decode(lendrAccountAi.data, this._program.idl);\n if (!lendrAccountParsed.group.equals(this._config.groupPk))\n throw Error(\n `Lendr account tied to group ${lendrAccountParsed.group.toBase58()}. Expected: ${this._config.groupPk.toBase58()}`,\n );\n\n this._updateFromAccountParsed(lendrAccountParsed);\n }\n\n private _updateFromAccountParsed(data: LendrAccountRaw) {\n this._lendrAccount = LendrAccount.fromAccountParsed(this.address, data);\n }\n\n public describe(): string {\n return this._lendrAccount.describe(this.client.banks, this.client.oraclePrices);\n }\n\n // --------------------------------------------------------------------------\n // DEPRECATED METHODS\n // --------------------------------------------------------------------------\n\n /**\n * @deprecated This method is deprecated. Please use simulateBorrowLendTransaction instead.\n */\n async simulateDeposit(amount: Amount, bankAddress: PublicKey): Promise<SimulationResult> {\n const ixs = await this.makeDepositIx(amount, bankAddress);\n const tx = new Transaction().add(...ixs.instructions);\n try {\n return this.simulateBorrowLendTransaction([tx], [bankAddress]);\n } catch (_e) {\n throw new Error(\"Failed to simulate deposit\");\n }\n }\n\n /**\n * @deprecated This method is deprecated. Please use simulateBorrowLendTransaction instead.\n */\n async simulateWithdraw(bankAddress: PublicKey, txs: VersionedTransaction[]): Promise<SimulationResult> {\n try {\n return this.simulateBorrowLendTransaction(txs, [bankAddress]);\n } catch (_e) {\n throw new Error(\"Failed to simulate withdraw\");\n }\n }\n\n /**\n * @deprecated This method is deprecated. Please use simulateBorrowLendTransaction instead.\n */\n async simulateBorrow(bankAddress: PublicKey, txs: VersionedTransaction[]): Promise<SimulationResult> {\n try {\n return this.simulateBorrowLendTransaction(txs, [bankAddress]);\n } catch (_e) {\n throw new Error(\"Failed to simulate borrow\");\n }\n }\n\n /**\n * @deprecated This method is deprecated. Please use simulateBorrowLendTransaction instead.\n */\n async simulateRepay(amount: Amount, bankAddress: PublicKey, repayAll = false): Promise<SimulationResult> {\n const ixs = await this.makeRepayIx(amount, bankAddress, repayAll);\n const tx = new Transaction().add(...ixs.instructions);\n try {\n return this.simulateBorrowLendTransaction([tx], [bankAddress]);\n } catch (_e) {\n throw new Error(\"Failed to simulate repay\");\n }\n }\n\n async getBankUnclaimedOutstandingEmissions(bank: PublicKey) {\n const settleEmissionsIx = await this._lendrAccount.makeSettleEmissionsIx(this._program, bank);\n\n const tx = new Transaction().add(...settleEmissionsIx.instructions);\n\n const simulation = await this.client.simulateTransactions([tx], [this._lendrAccount.address]);\n\n const rawBuffer = simulation[0];\n if (!rawBuffer) {\n return new BigNumber(0);\n }\n\n const simulatedLendrAccount = LendrAccount.fromAccountDataRaw(this.address, rawBuffer, this.client.program.idl);\n\n const outstandingEmissions = simulatedLendrAccount.getBalance(bank).emissionsOutstanding;\n\n return outstandingEmissions;\n }\n\n //TODO: maybe become usefull someday\n // async getBanksUnclaimedOutstandingEmissions(banks: PublicKey[]) {\n // const results = await Promise.allSettled(\n // banks.map(async (bank) => {\n // return this.getBankUnclaimedOutstandingEmissions(bank);\n // }),\n // );\n\n // let biggestOutstandingEmissions = new BigNumber(0);\n\n // for (const result of results) {\n // if (result.status === \"fulfilled\" && result.value.gt(biggestOutstandingEmissions)) {\n // biggestOutstandingEmissions = result.value;\n // }\n // }\n\n // return biggestOutstandingEmissions;\n // }\n}\n\n/**\n * @deprecated This method is deprecated.\n */\nexport function makeTxPriorityIx(\n feePayer: PublicKey,\n feeUi = 0,\n broadcastType: TransactionBroadcastType = \"BUNDLE\",\n computeUnitsLimit?: number,\n) {\n let bundleTipIx: TransactionInstruction | undefined;\n let priorityFeeIx: TransactionInstruction = makePriorityFeeIx()[0];\n\n if (broadcastType === \"BUNDLE\") {\n bundleTipIx = makeBundleTipIx(feePayer, Math.trunc(feeUi * LAMPORTS_PER_SOL));\n } else {\n priorityFeeIx = makePriorityFeeIx(feeUi, computeUnitsLimit)[0];\n }\n\n return {\n bundleTipIx,\n priorityFeeIx,\n };\n}\n\nexport function makeBundleTipIx(feePayer: PublicKey, bundleTip = 100_000): TransactionInstruction {\n // they have remained constant so function not used (for now)\n const _getTipAccounts = async () => {\n const response = await fetch(\"https://mainnet.block-engine.jito.wtf/api/v1/bundles\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"getTipAccounts\",\n params: [],\n }),\n });\n\n const data = await response.json();\n return data.result;\n };\n\n const tipAccounts = [\n \"96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5\",\n \"HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe\",\n \"Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY\",\n \"ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49\",\n \"DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh\",\n \"ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt\",\n \"DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL\",\n \"3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT\",\n ];\n const randomTipAccount = tipAccounts[Math.floor(Math.random() * tipAccounts.length)];\n\n return SystemProgram.transfer({\n fromPubkey: feePayer,\n toPubkey: new PublicKey(randomTipAccount),\n lamports: bundleTip, // 100_000 lamports = 0.0001 SOL\n });\n}\n\nasync function getClientAddressLookupTableAccounts(client: LendrClient) {\n const addresses = client.lookupTablesAddresses;\n const luts: AddressLookupTableAccount[] = client.addressLookupTables;\n\n for (const address of addresses) {\n const lut = await client.provider.connection.getAddressLookupTable(address);\n if (lut.value) {\n luts.push(lut.value);\n }\n }\n\n return luts;\n}\n\nexport { LendrAccountWrapper };\n","import { BorshCoder } from \"@coral-xyz/anchor\";\nimport type { PublicKey } from \"@solana/web3.js\";\n\nimport type { InstructionsWrapper } from \"../common\";\n\nimport type { LendrIdlType } from \"../idl\";\nimport {\n type BankConfigOpt,\n type BankConfigOptRaw,\n type LendrGroupRaw,\n type LendrGroupType,\n makeAddPermissionlessStakedBankIx,\n makePoolAddBankIx,\n makePoolConfigureBankIx,\n} from \"../services\";\nimport { AccountType, type LendrProgram } from \"../types\";\n\n// ----------------------------------------------------------------------------\n// Client types\n// ----------------------------------------------------------------------------\n\nclass LendrGroup implements LendrGroupType {\n public address: PublicKey;\n public admin: PublicKey;\n\n constructor(admin: PublicKey, address: PublicKey) {\n this.admin = admin;\n this.address = address;\n }\n\n // ----------------------------------------------------------------------------\n // Factories\n // ----------------------------------------------------------------------------\n\n static fromAccountParsed(address: PublicKey, accountData: LendrGroupRaw): LendrGroup {\n const lendrGroup = {\n admin: accountData.admin,\n };\n return new LendrGroup(lendrGroup.admin, address);\n }\n\n static fromBuffer(address: PublicKey, rawData: Buffer, idl: LendrIdlType) {\n const data = LendrGroup.decode(rawData, idl);\n return LendrGroup.fromAccountParsed(address, data);\n }\n\n static decode(encoded: Buffer, idl: LendrIdlType): LendrGroupRaw {\n const coder = new BorshCoder(idl);\n return coder.accounts.decode(AccountType.LendrGroup, encoded);\n }\n\n static async encode(decoded: LendrGroupRaw, idl: LendrIdlType): Promise<Buffer> {\n const coder = new BorshCoder(idl);\n return await coder.accounts.encode(AccountType.LendrGroup, decoded);\n }\n\n // ----------------------------------------------------------------------------\n // Admin actions\n // ----------------------------------------------------------------------------\n\n // ------------------------------------------------------------------------\n // (TODO: move to Bank class)\n // ------------------------------------------------------------------------\n public async makePoolConfigureBankIx(\n program: LendrProgram,\n bank: PublicKey,\n args: BankConfigOptRaw,\n ): Promise<InstructionsWrapper> {\n return makePoolConfigureBankIx(program, bank, args);\n }\n\n public async makeAddPermissionlessStakedBankIx(\n program: LendrProgram,\n voteAccountAddress: PublicKey,\n feePayer: PublicKey,\n pythOracle: PublicKey, // wSOL oracle\n ): Promise<InstructionsWrapper> {\n return makeAddPermissionlessStakedBankIx(program, this.address, voteAccountAddress, feePayer, pythOracle);\n }\n\n public async makePoolAddBankIx(\n program: LendrProgram,\n bankPubkey: PublicKey,\n bankMint: PublicKey,\n bankConfig: BankConfigOpt,\n feePayer?: PublicKey,\n ): Promise<InstructionsWrapper> {\n return makePoolAddBankIx(program, this.address, bankPubkey, feePayer ?? this.admin, bankMint, bankConfig);\n }\n}\n\nexport { LendrGroup };\n","import { type Address, AnchorProvider, BorshAccountsCoder, Program, translateAddress } from \"@coral-xyz/anchor\";\nimport type { TransactionResult } from \"@fogo/sessions-sdk\";\nimport { MintLayout, type RawMint } from \"@solana/spl-token\";\nimport {\n type AddressLookupTableAccount,\n type Commitment,\n type ConfirmOptions,\n Connection,\n Keypair,\n LAMPORTS_PER_SOL,\n PublicKey,\n type Signer,\n Transaction,\n type TransactionInstruction,\n TransactionMessage,\n type TransactionSignature,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport BigNumber from \"bignumber.js\";\nimport bs58 from \"bs58\";\nimport { createStorage, type Storage } from \"unstorage\";\nimport {\n type BankExtendedMetadataMap,\n type BanksExtendedMetadataOverrideMap,\n fetchBanksExtendedMetadata,\n} from \"@/common/bank-metadata\";\nimport type { EstablishedSessionState } from \"@/common/session\";\nimport { NoopLogger } from \"@/logger\";\nimport { DataFetcher } from \"@/services/data-fetcher\";\nimport { FogoMetadataFetcher } from \"@/services/metadata/fogo\";\nimport {\n Bank,\n BankConfig,\n type BankConfigOpt,\n type BankConfigRaw,\n type BankRaw,\n isOracleSetupSupported,\n type LendrAccountRaw,\n type OraclePrice,\n OracleSetup,\n parseOracleSetup,\n parsePriceInfo,\n SINGLE_POOL_PROGRAM_ID,\n type TLogger,\n} from \"..\";\nimport {\n addTransactionMetadata,\n type BankMetadataMap,\n chunkedGetRawMultipleAccountInfoOrdered,\n chunkedGetRawMultipleAccountInfoOrderedWithNulls,\n type ExtendedTransactionProperties,\n type InstructionsWrapper,\n isV0Tx,\n type SolanaTransaction,\n type TransactionOptions,\n TransactionType,\n type Wallet,\n} from \"../common\";\nimport { getConfig } from \"../config\";\nimport { PYTH_PUSH_ORACLE_ID } from \"../constants\";\nimport { ProcessTransactionError, ProcessTransactionErrorType, parseTransactionError } from \"../errors\";\nimport { fetchLatestIdl } from \"../idl/idl.utils\";\nimport instructions from \"../instructions\";\nimport { LendrRequirementType } from \"../models/account\";\nimport { LendrAccountWrapper } from \"../models/account/wrapper\";\nimport { LendrGroup } from \"../models/group\";\nimport {\n DummyMetadataFetcher,\n type IMetadataFetcher,\n MetadataService,\n MetaplexMetadataFetcher,\n type ProcessTransactionOpts,\n type ProcessTransactionStrategy,\n type ProcessTransactionsClientOpts,\n processTransactions,\n} from \"../services\";\nimport { BundleSimulationError, simulateBundle } from \"../services/transaction/helpers\";\nimport { AccountType, type LendrConfig, type LendrProgram } from \"../types\";\nimport { buildFeedIdMap, findPythPushOracleAddress, PYTH_SPONSORED_SHARD_ID, type PythPushFeedIdMap } from \"../utils\";\nimport { getStakeAccount, type StakeAccount } from \"../vendor\";\n\nexport type BankMap = Map<string, Bank>;\nexport type OraclePriceMap = Map<string, OraclePrice>;\nexport type MintDataMap = Map<string, MintData>;\n\nexport type MintData = {\n mint: PublicKey;\n tokenProgram: PublicKey;\n feeBps: number; // TODO: Handle this in calcs\n emissionTokenProgram: PublicKey | null;\n};\n\nexport type FetchGroupDataFn = (props: {\n connection: Connection;\n program: LendrProgram;\n groupAddress: PublicKey;\n logger?: TLogger;\n commitment?: Commitment;\n overrideBankAddresses?: PublicKey[];\n overrideBanksMetadata?: BanksExtendedMetadataOverrideMap;\n metadataService: MetadataService;\n dataFetcher: DataFetcher;\n}) => Promise<{\n lendrGroup: LendrGroup;\n banks: Map<string, Bank>;\n priceInfos: Map<string, OraclePrice>;\n tokensData: Map<string, MintData>;\n feedIdMap: PythPushFeedIdMap;\n banksExtendedMetadata: BankExtendedMetadataMap;\n}>;\n\nexport type LendrClientOptions = {\n confirmOpts?: ConfirmOptions;\n readOnly?: boolean;\n overrideBankAddresses?: PublicKey[];\n overrideBanksMetadata?: BanksExtendedMetadataOverrideMap;\n bundleSimRpcEndpoint?: string;\n processTransactionStrategy?: ProcessTransactionStrategy;\n fetchGroupDataOverride?: FetchGroupDataFn;\n addressLookupTableAddresses?: PublicKey[];\n logger?: TLogger;\n storage?: Storage;\n metadataFetchers?: Array<IMetadataFetcher>;\n dataFetcher?: DataFetcher;\n};\n\nexport interface LendrClientFetchOptions {\n wallet: Wallet;\n connection: Connection;\n clientOptions?: LendrClientOptions;\n config?: LendrConfig;\n}\n\nexport interface LendrClientProps {\n readonly config?: LendrConfig;\n readonly program: LendrProgram;\n readonly wallet: Wallet;\n readonly isReadOnly: boolean;\n group: LendrGroup;\n banks: BankMap;\n priceInfos: OraclePriceMap;\n mintDatas: MintDataMap;\n feedIdMap: PythPushFeedIdMap;\n addressLookupTables?: AddressLookupTableAccount[];\n processTransactionStrategy?: ProcessTransactionStrategy;\n lookupTablesAddresses?: Array<PublicKey>;\n readonly overrideBankAddresses?: PublicKey[];\n readonly overrideBanksMetadata?: BanksExtendedMetadataOverrideMap;\n // TODO)) [later] remove this\n readonly bankMetadataMap?: BankMetadataMap;\n metadataService: MetadataService;\n bundleSimRpcEndpoint?: string;\n logger?: TLogger;\n storage?: Storage;\n dataFetcher?: DataFetcher;\n}\n\n/**\n * Entrypoint to interact with the lendr contract.\n */\nclass LendrClient {\n readonly program: LendrProgram;\n readonly wallet: Wallet;\n readonly config: LendrConfig;\n readonly isReadOnly: boolean;\n public readonly logger: TLogger;\n\n public group: LendrGroup;\n public banks: BankMap;\n public oraclePrices: OraclePriceMap;\n public mintDatas: MintDataMap;\n public addressLookupTables: AddressLookupTableAccount[];\n public lookupTablesAddresses: PublicKey[];\n public feedIdMap: PythPushFeedIdMap;\n public processTransactionStrategy?: ProcessTransactionStrategy;\n private readonly bundleSimRpcEndpoint: string;\n\n bankMetadataMap?: BankMetadataMap;\n readonly overrideBankAddresses?: Array<PublicKey>;\n readonly overrideBanksMetadata?: BanksExtendedMetadataOverrideMap;\n\n readonly metadataService: MetadataService;\n readonly storage: Storage;\n readonly dataFetcher: DataFetcher;\n\n // --------------------------------------------------------------------------\n // Factories\n // --------------------------------------------------------------------------\n\n constructor({\n program,\n wallet,\n config,\n isReadOnly,\n group,\n banks,\n priceInfos,\n mintDatas,\n addressLookupTables,\n feedIdMap,\n logger,\n bankMetadataMap,\n overrideBanksMetadata,\n overrideBankAddresses,\n bundleSimRpcEndpoint,\n processTransactionStrategy,\n lookupTablesAddresses,\n storage,\n metadataService,\n dataFetcher,\n }: LendrClientProps) {\n this.program = program;\n this.wallet = wallet;\n this.config = config ?? getConfig();\n this.isReadOnly = isReadOnly;\n this.logger = logger ?? new NoopLogger();\n\n this.group = group;\n this.banks = banks;\n this.oraclePrices = priceInfos;\n this.mintDatas = mintDatas;\n this.addressLookupTables = addressLookupTables ?? [];\n this.feedIdMap = feedIdMap;\n this.bundleSimRpcEndpoint = bundleSimRpcEndpoint ?? program.provider.connection.rpcEndpoint;\n this.processTransactionStrategy = processTransactionStrategy;\n this.lookupTablesAddresses = lookupTablesAddresses ?? [];\n\n this.bankMetadataMap = bankMetadataMap;\n this.overrideBankAddresses = overrideBankAddresses;\n this.overrideBanksMetadata = overrideBanksMetadata;\n\n this.storage = storage ?? createStorage();\n this.metadataService = metadataService;\n this.dataFetcher = dataFetcher ?? new DataFetcher();\n }\n\n /**\n * LendrClient factory\n *\n * Fetch account data according to the config and instantiate the corresponding LendrAccount.\n *\n * @param config lendr config\n * @param wallet User wallet (used to pay fees and sign transactions)\n * @param connection Solana web.js Connection object\n * @param clientOptions optional client options\n * @returns LendrClient instance\n */\n static async fetch({ wallet, connection, clientOptions = {}, config = getConfig() }: LendrClientFetchOptions) {\n const {\n logger = new NoopLogger(),\n confirmOpts = {},\n readOnly = false,\n storage = createStorage(),\n dataFetcher = new DataFetcher(),\n overrideBankAddresses,\n overrideBanksMetadata,\n metadataFetchers = [\n new FogoMetadataFetcher(config.cluster === \"mainnet\" ? \"mainnet\" : \"testnet\"),\n new MetaplexMetadataFetcher(connection.rpcEndpoint),\n new DummyMetadataFetcher(),\n ],\n addressLookupTableAddresses,\n } = clientOptions;\n\n logger.debug(\n {\n programId: config.programId.toBase58(),\n env: config.environment,\n group: config.groupPk.toBase58(),\n url: connection?.rpcEndpoint,\n },\n \"[lendr:client] Loading Lendr Client\",\n );\n\n const programIdl = fetchLatestIdl();\n\n const provider = new AnchorProvider(connection, wallet, {\n ...AnchorProvider.defaultOptions(),\n commitment: connection.commitment ?? AnchorProvider.defaultOptions().commitment,\n ...confirmOpts,\n });\n\n const idl = { ...programIdl, address: config.programId.toBase58() };\n\n const program = new Program(idl, provider) as unknown as LendrProgram;\n const metadataService = new MetadataService({\n storage,\n overrides: overrideBanksMetadata,\n fetchers: metadataFetchers,\n logger,\n });\n\n // TODO)) [later] if needed (should also change reload function)\n // const fetchGroupData =\n // \tclientOptions?.fetchGroupDataOverride ?? LendrClient.fetchGroupData;\n\n const { lendrGroup, banks, priceInfos, tokensData, feedIdMap, banksExtendedMetadata } =\n await LendrClient.fetchGroupData({\n connection,\n program,\n groupAddress: config.groupPk,\n logger,\n commitment: connection.commitment,\n overrideBankAddresses,\n overrideBanksMetadata,\n metadataService,\n dataFetcher,\n });\n\n const addressLookupTables = await LendrClient.fetchAddressLookupTables(\n connection,\n addressLookupTableAddresses,\n logger,\n );\n\n return new LendrClient({\n config,\n program,\n wallet,\n isReadOnly: readOnly,\n group: lendrGroup,\n banks,\n priceInfos,\n mintDatas: tokensData,\n feedIdMap,\n addressLookupTables,\n bundleSimRpcEndpoint: clientOptions?.bundleSimRpcEndpoint,\n processTransactionStrategy: clientOptions?.processTransactionStrategy,\n logger,\n overrideBankAddresses,\n overrideBanksMetadata,\n // TODO)) temporary, remove later\n bankMetadataMap: Array.from(banksExtendedMetadata.values()).reduce((prev, curr) => {\n if (!curr.address) {\n return prev;\n }\n\n prev[curr.address] = {\n tokenAddress: curr.address,\n tokenName: curr.name,\n tokenSymbol: curr.symbol,\n };\n return prev;\n }, {} as BankMetadataMap),\n storage,\n metadataService,\n dataFetcher,\n });\n }\n\n /**\n * Fetches address lookup tables from the provided addresses\n * @param connection The Solana connection\n * @param addressLookupTableAddresses Optional array of address lookup table addresses to fetch\n * @param logger Optional logger\n * @returns Array of address lookup table accounts\n */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: Reserved for future use\n private static async fetchAddressLookupTables(\n connection: Connection,\n addressLookupTableAddresses?: PublicKey[],\n logger: TLogger = new NoopLogger(),\n ): Promise<AddressLookupTableAccount[]> {\n if (!addressLookupTableAddresses || addressLookupTableAddresses.length === 0) {\n logger.debug({}, \"[lendr:client] No address lookup table addresses provided\");\n return [];\n }\n\n logger.debug({ for: addressLookupTableAddresses }, \"[lendr:client] Fetching address lookup tables\");\n const addressLookupTables = (\n await Promise.all(addressLookupTableAddresses.map((address) => connection.getAddressLookupTable(address)))\n )\n .map((response) => response?.value)\n .filter((table): table is AddressLookupTableAccount => table !== null);\n return addressLookupTables;\n }\n\n /**\n * Fetches all data for a group, including banks and oracle prices\n * NOTE: If bankAddresses not provided, this will make 2 RPC calls\n * @param connection\n * @param program The Lendr program\n * @param groupAddress The address of the group\n * @param logger Optional logger\n * @param commitment Transaction commitment level\n * @param overrideBankAddresses Optional list of bank addresses to fetch\n * @param overrideBanksMetadata Optional bank metadata for overriding on-chain metadata\n * @param metadataService Metadata service for fetching mint metadata\n * @returns Lending group data, banks, and oracle prices\n */\n static fetchGroupData: FetchGroupDataFn = async ({\n connection: _connection,\n program,\n groupAddress,\n commitment,\n overrideBanksMetadata,\n overrideBankAddresses,\n logger = new NoopLogger(),\n metadataService,\n dataFetcher,\n }) => {\n // Fetch & shape all accounts of Bank type (~ bank discovery)\n const banksRawData: { address: PublicKey; data: BankRaw }[] = await dataFetcher.fetchRawBanks({\n program,\n groupAddress,\n logger,\n bankAddresses: overrideBankAddresses,\n commitment,\n });\n\n const mintKeys: Array<PublicKey> = [];\n const emissionMintKeys: Array<PublicKey> = [];\n const oracleKeys: Array<PublicKey> = [];\n\n const bankConfigs: BankConfigRaw[] = [];\n for (const bank of banksRawData) {\n mintKeys.push(bank.data.mint);\n\n if (!bank.data.emissionsMint.equals(PublicKey.default)) {\n emissionMintKeys.push(bank.data.emissionsMint);\n }\n\n bankConfigs.push(bank.data.config);\n }\n\n // Build feed ID map for PythPushOracle types - this derives actual oracle PDAs from feed IDs\n const feedIdMap = await buildFeedIdMap(bankConfigs, program.provider.connection);\n\n // Now extract oracle keys, using feedIdMap to resolve PythPushOracle addresses\n for (const bank of banksRawData) {\n const bankConfig = BankConfig.fromAccountParsed(bank.data.config);\n // Note: bankConfig.oracleSetup is already parsed to OracleSetup enum, no need to call parseOracleSetup again\n const oracleSetup = bankConfig.oracleSetup;\n\n let oracleKey: PublicKey;\n\n if (oracleSetup === OracleSetup.PythPushOracle || oracleSetup === OracleSetup.KaminoPythPush) {\n // For Pyth Push oracles, use the feed ID map to get the actual oracle address\n const rawKey = bankConfig.oracleKeys[0];\n const feedId = rawKey.toBuffer().toString(\"hex\");\n const feedInfo = feedIdMap.get(feedId);\n\n if (feedInfo?.feedId.equals(rawKey)) {\n // The rawKey is already a PDA (post-configuration), use it directly\n oracleKey = rawKey;\n } else if (feedInfo) {\n // The rawKey is a feed ID, derive the PDA using the shard ID\n oracleKey = findPythPushOracleAddress(\n bankConfig.oracleKeys[0].toBuffer(),\n PYTH_PUSH_ORACLE_ID,\n feedInfo.shardId ?? PYTH_SPONSORED_SHARD_ID,\n );\n } else {\n // Fallback to Pyth sponsored shard if not in map\n oracleKey = findPythPushOracleAddress(\n bankConfig.oracleKeys[0].toBuffer(),\n PYTH_PUSH_ORACLE_ID,\n PYTH_SPONSORED_SHARD_ID,\n );\n }\n } else {\n // For other oracle types, use the key directly\n oracleKey = bankConfig.oracleKeys[0];\n }\n\n oracleKeys.push(oracleKey);\n }\n\n // Deduplicate keys to avoid fetching the same account multiple times\n const uniqueOracleKeys = Array.from(new Set(oracleKeys.map((k) => k.toBase58()))).map((k) => new PublicKey(k));\n const uniqueMintKeys = Array.from(new Set(mintKeys.map((k) => k.toBase58()))).map((k) => new PublicKey(k));\n const uniqueEmissionMintKeys = Array.from(new Set(emissionMintKeys.map((k) => k.toBase58()))).map(\n (k) => new PublicKey(k),\n );\n\n // Batch-fetch the group account and all the oracle/mint accounts\n // NOTE: Using WithNulls variant to preserve order even when accounts don't exist\n const allAccountInfos = await chunkedGetRawMultipleAccountInfoOrderedWithNulls(program.provider.connection, [\n groupAddress.toBase58(),\n ...uniqueOracleKeys.map((pk) => pk.toBase58()),\n ...uniqueMintKeys.map((pk) => pk.toBase58()),\n ...uniqueEmissionMintKeys.map((pk) => pk.toBase58()),\n ]);\n\n const groupAccountInfo = allAccountInfos.shift();\n if (!groupAccountInfo) {\n throw new Error(\"Failed to fetch the on-chain group data\");\n }\n\n const uniqueOracleAccountInfos = allAccountInfos.splice(0, uniqueOracleKeys.length);\n const uniqueMintAccountInfos = allAccountInfos.splice(0, uniqueMintKeys.length);\n const uniqueEmissionMintAccountInfos = allAccountInfos.splice(0);\n\n // Map unique results back to original order\n const oracleKeyToInfo = new Map(\n uniqueOracleKeys.map((key, idx) => [key.toBase58(), uniqueOracleAccountInfos[idx]]),\n );\n const mintKeyToInfo = new Map(uniqueMintKeys.map((key, idx) => [key.toBase58(), uniqueMintAccountInfos[idx]]));\n const emissionMintKeyToInfo = new Map(\n uniqueEmissionMintKeys.map((key, idx) => [key.toBase58(), uniqueEmissionMintAccountInfos[idx]]),\n );\n\n const oracleAccountInfos = oracleKeys.map((key) => {\n const info = oracleKeyToInfo.get(key.toBase58());\n if (!info) throw new Error(`Oracle account info not found for ${key.toBase58()}`);\n return info;\n });\n const mintAccountInfos = mintKeys.map((key) => {\n const info = mintKeyToInfo.get(key.toBase58());\n if (!info) throw new Error(`Mint account info not found for ${key.toBase58()}`);\n return info;\n });\n const emissionMintAccountInfos = emissionMintKeys.map((key) => {\n const info = emissionMintKeyToInfo.get(key.toBase58());\n if (!info) throw new Error(`Emission mint account info not found for ${key.toBase58()}`);\n return info;\n });\n\n // Unpack raw data for group and oracles, and build the `Bank`s map\n const lendrGroup = LendrGroup.fromBuffer(groupAddress, groupAccountInfo.data, program.idl);\n const banksExtendedMetadata = await fetchBanksExtendedMetadata({\n mintsWithOwner: mintKeys\n .map((mint, idx) => {\n const accountInfo = mintAccountInfos[idx];\n if (!accountInfo) {\n logger.warn({ mint: mint.toBase58() }, \"mint account not found\");\n return null;\n }\n return {\n mint,\n owner: accountInfo.owner,\n };\n })\n .filter((item): item is { mint: PublicKey; owner: PublicKey } => item !== null),\n metadataService,\n logger,\n overrideBanksMetadata,\n });\n\n const banks = new Map<string, Bank>();\n const priceInfos = new Map<string, OraclePrice>();\n const _pythStakedCollateralBanks: PublicKey[] = [];\n const tokensData = new Map<string, MintData>();\n\n const stakedCollatMap: Record<\n string,\n {\n bankAddress: PublicKey;\n mint: PublicKey;\n stakePoolAddress: PublicKey;\n poolAddress: PublicKey;\n }\n > = {};\n const solPools: string[] = [];\n const mints: string[] = [];\n\n banksRawData.forEach(({ address, data }, index) => {\n const bankAddressStr = address.toBase58();\n const metadata = banksExtendedMetadata.get(data.mint.toBase58());\n const oracleSetup = parseOracleSetup(data.config.oracleSetup);\n\n if (!isOracleSetupSupported(oracleSetup)) {\n logger.warn({ oracleSetup, bank: bankAddressStr }, \"unsupported oracle setup\");\n return;\n }\n\n const mintDataRaw = mintAccountInfos[index];\n if (!mintDataRaw) {\n logger.warn({ bank: bankAddressStr, mint: data.mint.toBase58() }, \"mint account not found, skipping bank\");\n return;\n }\n\n const priceDataRaw = oracleAccountInfos[index];\n if (!priceDataRaw) {\n logger.warn({ bank: bankAddressStr, oracleSetup }, \"oracle account not found, skipping bank\");\n return;\n }\n\n const bank = Bank.fromAccountParsed(address, data, feedIdMap, metadata, mintDataRaw.owner);\n banks.set(bankAddressStr, bank);\n\n let emissionTokenProgram: PublicKey | null = null;\n if (!data.emissionsMint.equals(PublicKey.default)) {\n const emissionMintDataRawIndex = emissionMintKeys.findIndex((pk) => pk.equals(data.emissionsMint));\n const emissionMintAccountInfo =\n emissionMintDataRawIndex >= 0 ? emissionMintAccountInfos[emissionMintDataRawIndex] : null;\n emissionTokenProgram = emissionMintAccountInfo ? emissionMintAccountInfo.owner : null;\n }\n\n tokensData.set(bankAddressStr, {\n mint: mintKeys[index],\n tokenProgram: mintDataRaw.owner,\n feeBps: 0,\n emissionTokenProgram,\n });\n\n priceInfos.set(bankAddressStr, parsePriceInfo(oracleSetup, priceDataRaw.data, bank.config.fixedPrice, logger));\n\n if (oracleSetup === OracleSetup.StakedWithPythPush && metadata?.validatorVoteAccount) {\n const [poolAddress] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"pool\"), new PublicKey(metadata.validatorVoteAccount).toBuffer()],\n SINGLE_POOL_PROGRAM_ID,\n );\n const [stakePoolAddress] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"stake\"), poolAddress.toBuffer()],\n SINGLE_POOL_PROGRAM_ID,\n );\n\n stakedCollatMap[address.toBase58()] = {\n bankAddress: address,\n mint: new PublicKey(metadata.mint),\n stakePoolAddress,\n poolAddress,\n };\n solPools.push(stakePoolAddress.toBase58());\n mints.push(metadata.mint);\n }\n });\n\n const dataAis = await chunkedGetRawMultipleAccountInfoOrdered(program.provider.connection, [...mints, ...solPools]);\n const stakePoolsAis: StakeAccount[] = dataAis.slice(mints.length).map((ai) => getStakeAccount(ai.data));\n const lstMintsAis: RawMint[] = dataAis.slice(0, mints.length).map((mintAi) => MintLayout.decode(mintAi.data));\n\n const lstMintRecord: Record<string, RawMint> = Object.fromEntries(mints.map((mint, i) => [mint, lstMintsAis[i]]));\n const solPoolsRecord: Record<string, StakeAccount> = Object.fromEntries(\n solPools.map((poolKey, i) => [poolKey, stakePoolsAis[i]]),\n );\n\n for (const index in stakedCollatMap) {\n const { bankAddress, mint, stakePoolAddress, poolAddress: _poolAddress } = stakedCollatMap[index];\n const stakeAccount = solPoolsRecord[stakePoolAddress.toBase58()];\n const tokenSupply = lstMintRecord[mint.toBase58()].supply;\n\n const stakeActual = Number(stakeAccount.stake.delegation.stake);\n\n const oracle = priceInfos.get(bankAddress.toBase58());\n if (oracle) {\n const adjustPrice = (price: BigNumber, stakeActual: number, tokenSupply: bigint) => {\n return Number(tokenSupply) === 0\n ? price\n : new BigNumber((price.toNumber() * (stakeActual - LAMPORTS_PER_SOL)) / Number(tokenSupply));\n };\n\n const adjustPriceComponent = (priceComponent: any, stakeActual: number, tokenSupply: bigint) => ({\n price: adjustPrice(priceComponent.price, stakeActual, tokenSupply),\n confidence: priceComponent.confidence,\n lowestPrice: adjustPrice(priceComponent.lowestPrice, stakeActual, tokenSupply),\n highestPrice: adjustPrice(priceComponent.highestPrice, stakeActual, tokenSupply),\n });\n\n const oraclePrice = {\n timestamp: oracle.timestamp,\n priceRealtime: adjustPriceComponent(oracle.priceRealtime, stakeActual, tokenSupply),\n priceWeighted: adjustPriceComponent(oracle.priceWeighted, stakeActual, tokenSupply),\n };\n\n priceInfos.set(bankAddress.toBase58(), oraclePrice);\n }\n }\n\n logger.debug(\n {\n banksSize: banks.size,\n priceFeedsSize: priceInfos.size,\n },\n \"[lendr:client] Fetched banks and price feeds\",\n );\n\n return {\n lendrGroup,\n banks,\n priceInfos,\n tokensData,\n feedIdMap,\n banksExtendedMetadata,\n };\n };\n\n async reload() {\n const { lendrGroup, banks, priceInfos, tokensData, feedIdMap, banksExtendedMetadata } =\n await LendrClient.fetchGroupData({\n connection: this.program.provider.connection,\n program: this.program,\n groupAddress: this.config.groupPk,\n logger: this.logger,\n commitment: this.program.provider.connection.commitment,\n overrideBankAddresses: this.overrideBankAddresses,\n overrideBanksMetadata: this.overrideBanksMetadata,\n metadataService: this.metadataService,\n dataFetcher: this.dataFetcher,\n });\n\n this.group = lendrGroup;\n this.banks = banks;\n this.oraclePrices = priceInfos;\n this.feedIdMap = feedIdMap;\n this.mintDatas = tokensData;\n this.bankMetadataMap = Array.from(banksExtendedMetadata.values()).reduce((prev, curr) => {\n if (!curr.address) {\n return prev;\n }\n\n prev[curr.address] = {\n tokenAddress: curr.address,\n tokenName: curr.name,\n tokenSymbol: curr.symbol,\n };\n return prev;\n }, {} as BankMetadataMap);\n }\n\n // --------------------------------------------------------------------------\n // Attributes\n // --------------------------------------------------------------------------\n\n get groupAddress(): PublicKey {\n return this.config.groupPk;\n }\n\n get provider(): AnchorProvider {\n return this.program.provider as AnchorProvider;\n }\n\n get programId(): PublicKey {\n return this.program.programId;\n }\n\n async getAllLendrAccountPubkeys(): Promise<PublicKey[]> {\n return (\n await this.provider.connection.getProgramAccounts(this.programId, {\n filters: [\n {\n memcmp: {\n bytes: this.config.groupPk.toBase58(),\n offset: 8, // lendrGroup is the first field in the account, so only offset is the discriminant\n },\n },\n ],\n dataSlice: { offset: 0, length: 0 },\n })\n ).map((a) => a.pubkey);\n }\n\n /**\n * Fetches multiple lendr accounts based on an array of public keys using the getMultipleAccounts RPC call.\n *\n * @param pubkeys - The public keys of the lendr accounts to fetch.\n * @returns An array of LendrAccountWrapper instances.\n */\n async getMultipleLendrAccounts(pubkeys: PublicKey[]): Promise<LendrAccountWrapper[]> {\n this.logger.debug({ pubkeys }, \"Fetching lendr accounts\");\n\n const accounts = await this.program.account.lendrAccount.fetchMultiple(pubkeys);\n\n return accounts.map((account, index) => {\n if (!accounts) {\n throw new Error(`Account not found for pubkey: ${pubkeys[index].toBase58()}`);\n }\n return LendrAccountWrapper.fromAccountParsed(pubkeys[index], this, account as unknown as LendrAccountRaw);\n });\n }\n\n /**\n * Retrieves the addresses of all lendr accounts in the underlying group.\n *\n * @returns Account addresses\n */\n async getAllLendrAccountAddresses(): Promise<PublicKey[]> {\n return (\n await this.program.provider.connection.getProgramAccounts(this.programId, {\n commitment: this.program.provider.connection.commitment,\n dataSlice: {\n offset: 0,\n length: 0,\n },\n filters: [\n {\n memcmp: {\n bytes: this.groupAddress.toBase58(),\n offset: 8, // lendrGroup is the second field in the account after the authority, so offset by the discriminant and a pubkey\n },\n },\n {\n memcmp: {\n offset: 0,\n bytes: bs58.encode(\n new BorshAccountsCoder(this.program.idl).accountDiscriminator(AccountType.LendrAccount),\n ),\n },\n },\n ],\n })\n ).map((a) => a.pubkey);\n }\n\n /**\n * Retrieves all lendr accounts under the specified authority.\n *\n * @returns LendrAccount instances\n */\n async getLendrAccountsForAuthority(authority?: Address): Promise<LendrAccountWrapper[]> {\n const _authority = authority ? translateAddress(authority) : this.provider.wallet.publicKey;\n\n const lendrAccounts = (\n await this.program.account.lendrAccount.all([\n {\n memcmp: {\n bytes: this.groupAddress.toBase58(),\n offset: 8, // lendrGroup is the first field in the account, so only offset is the discriminant\n },\n },\n {\n memcmp: {\n bytes: _authority.toBase58(),\n offset: 8 + 32, // authority is the second field in the account after the authority, so offset by the discriminant and a pubkey\n },\n },\n ])\n ).map((a) => LendrAccountWrapper.fromAccountParsed(a.publicKey, this, a.account as unknown as LendrAccountRaw));\n\n lendrAccounts.sort((accountA, accountB) => {\n const assetsValueA = accountA.computeHealthComponents(LendrRequirementType.Equity).assets;\n const assetsValueB = accountB.computeHealthComponents(LendrRequirementType.Equity).assets;\n\n if (assetsValueA.eq(assetsValueB)) return 0;\n return assetsValueA.gt(assetsValueB) ? -1 : 1;\n });\n\n return lendrAccounts;\n }\n\n /**\n * Retrieves the addresses of all accounts owned by the lendr program.\n *\n * @returns Account addresses\n */\n async getAllProgramAccountAddresses(_type: AccountType): Promise<PublicKey[]> {\n return (\n await this.program.provider.connection.getProgramAccounts(this.programId, {\n commitment: this.program.provider.connection.commitment,\n dataSlice: {\n offset: 0,\n length: 0,\n },\n filters: [\n {\n memcmp: {\n offset: 0,\n bytes: bs58.encode(\n new BorshAccountsCoder(this.program.idl).accountDiscriminator(AccountType.LendrAccount),\n ),\n },\n },\n ],\n })\n ).map((a) => a.pubkey);\n }\n\n getBankByPk(bankAddress: Address): Bank | null {\n const _bankAddress = translateAddress(bankAddress);\n return this.banks.get(_bankAddress.toString()) ?? null;\n }\n\n getBankByMint(mint: Address): Bank | null {\n const _mint = translateAddress(mint);\n return [...this.banks.values()].find((bank) => bank.mint.equals(_mint)) ?? null;\n }\n\n getBankByTokenSymbol(tokenSymbol: string): Bank | null {\n if (tokenSymbol === undefined) return null;\n return [...this.banks.values()].find((bank) => bank.tokenSymbol === tokenSymbol) ?? null;\n }\n\n getOraclePriceByBank(bankAddress: Address): OraclePrice | null {\n const _bankAddress = translateAddress(bankAddress);\n return this.oraclePrices.get(_bankAddress.toString()) ?? null;\n }\n // --------------------------------------------------------------------------\n // User actions\n // --------------------------------------------------------------------------\n\n /**\n * Create transaction instruction to create a new lendr account under the authority of the user.\n *\n * @returns transaction instruction\n */\n async makeCreateLendrAccountIx(lendrAccountPk: PublicKey): Promise<InstructionsWrapper> {\n this.logger.debug({ for: lendrAccountPk.toBase58() }, \"Generating lendr account ix\");\n\n const initLendrAccountIx = await instructions.makeInitLendrAccountIx(this.program, {\n lendrGroup: this.groupAddress,\n lendrAccount: lendrAccountPk,\n authority: this.provider.wallet.publicKey,\n feePayer: this.provider.wallet.publicKey,\n });\n\n const ixs = [initLendrAccountIx];\n\n return {\n instructions: ixs,\n keys: [],\n };\n }\n\n async makeCreateLendrAccountWithSessionIx(\n session: EstablishedSessionState,\n accountIndex: number,\n thirdPartyId?: number,\n ): Promise<InstructionsWrapper> {\n this.logger.debug({ for: session.walletPublicKey.toBase58() }, \"Generating lendr account init with session ix\");\n\n const initLendrAccountIx = await instructions.makeInitLendrAccountWithSessionIx(\n this.program,\n {\n lendrGroup: this.groupAddress,\n session: session,\n feePayer: session.payer,\n },\n accountIndex,\n thirdPartyId,\n );\n\n const ixs = [initLendrAccountIx];\n\n this.logger.debug(\n {\n numInstructions: ixs.length,\n instructions: ixs.map((ix, i) => ({\n index: i,\n programId: ix.programId.toBase58(),\n numKeys: ix.keys.length,\n dataLength: ix.data.length,\n })),\n },\n \"Built initialize with session transaction\",\n );\n\n return {\n instructions: ixs,\n keys: [],\n };\n }\n\n /**\n * Create a new lendr account under the authority of the user.\n *\n * @param createOpts - Options for creating the account\n * @param createOpts.newAccountKey - Optional public key to use for the new account. If not provided, a new keypair will be generated.\n * @param processOpts - Options for processing the transaction\n * @param txOpts - Transaction options\n * @returns Object containing the transaction signature and the created LendrAccount instance\n */\n async createLendrAccount(\n createOpts?: { newAccountKey?: PublicKey | undefined },\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<LendrAccountWrapper> {\n const accountKeypair = Keypair.generate();\n const newAccountKey = createOpts?.newAccountKey ?? accountKeypair.publicKey;\n\n const solanaTx = await this.createLendrAccountTx({ accountKeypair });\n const sig = await this.processTransaction(solanaTx, processOpts, txOpts);\n\n this.logger.debug({ sig }, \"Created Lendr account\");\n\n return txOpts?.dryRun || createOpts?.newAccountKey\n ? Promise.resolve(undefined as unknown as LendrAccountWrapper)\n : LendrAccountWrapper.fetch(newAccountKey, this, txOpts?.commitment);\n }\n\n /**\n * Create a new lendr account under the authority of the user using fogo session.\n *\n * @param session - Session object in Established state\n * @param commitment - desired commitment level\n * @param customAccountSeed - undefined/null/0 for canonical lendr account in a group; positive for multi-accounts.\n *\n * @returns Object containing the transaction signature and the created LendrAccount instance\n */\n async createLendrAccountWithSession(\n session: EstablishedSessionState,\n commitment?: Commitment,\n accountIndex: number = 0,\n thirdPartyId?: number,\n ): Promise<{ account: LendrAccountWrapper | null; accountPublicKey: PublicKey; result: TransactionResult }> {\n const { instructions } = await this.makeCreateLendrAccountWithSessionIx(session, accountIndex, thirdPartyId);\n const txResult = await session.sendTransaction(instructions, { variation: \"LendrAccountInitialize\" });\n this.logger.debug({ txResult }, \"Created Lendr account (using session)\");\n\n const thirdPartyIdValue = thirdPartyId ?? 0;\n const [accountPublicKey] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"lendr_account\"),\n this.groupAddress.toBuffer(),\n session.walletPublicKey.toBuffer(),\n Buffer.from(new Uint16Array([accountIndex]).buffer),\n Buffer.from(new Uint16Array([thirdPartyIdValue]).buffer),\n ],\n this.programId,\n );\n try {\n return {\n account: await LendrAccountWrapper.fetch(accountPublicKey, this, commitment),\n accountPublicKey,\n result: txResult,\n };\n } catch (_ex) {\n this.logger?.error({ tx: txResult?.signature }, \"Failed fetching created account.\");\n }\n\n return {\n result: txResult,\n accountPublicKey,\n account: null,\n };\n }\n\n /**\n * Create a transaction to initialize a new lendr account under the authority of the user.\n *\n * @param createOpts - Options for creating the account\n * @param createOpts.newAccountKey - Optional public key to use for the new account. If not provided, a new keypair will be generated.\n * @returns Transaction that can be used to create a new lendr account\n */\n async createLendrAccountTx(createOpts?: { accountKeypair?: Keypair }): Promise<SolanaTransaction> {\n const accountKeypair = createOpts?.accountKeypair ?? Keypair.generate();\n\n const ixs = await this.makeCreateLendrAccountIx(accountKeypair.publicKey);\n const signers = [...ixs.keys];\n // If there was no newAccountKey provided, we need to sign with the ephemeral Keypair we generated.\n signers.push(accountKeypair);\n\n const tx = new Transaction().add(...ixs.instructions);\n const solanaTx = addTransactionMetadata(tx, {\n signers,\n addressLookupTables: this.addressLookupTables,\n type: TransactionType.CREATE_ACCOUNT,\n });\n\n return solanaTx;\n }\n\n async getLatestBlockHashForSure() {\n try {\n return (await this.provider.connection.getLatestBlockhashAndContext(\"confirmed\")).value.blockhash;\n } catch (_ex) {\n const connection = new Connection(this.provider.connection.rpcEndpoint, this.provider.opts);\n return (await connection.getLatestBlockhashAndContext(\"confirmed\")).value.blockhash;\n }\n }\n\n async createVersionTransaction(\n instructions: TransactionInstruction[],\n payerKey: PublicKey,\n signers?: Array<Signer>,\n extraMetaData?: ExtendedTransactionProperties,\n ) {\n const blockhash = await this.getLatestBlockHashForSure();\n\n const versionedMessage = new TransactionMessage({\n instructions,\n payerKey,\n recentBlockhash: blockhash,\n });\n\n const tx = new VersionedTransaction(\n this.addressLookupTables\n ? versionedMessage.compileToV0Message(this.addressLookupTables)\n : versionedMessage.compileToLegacyMessage(),\n );\n\n if (signers?.length) {\n tx.sign(signers);\n }\n\n if (extraMetaData && Object.keys(extraMetaData)?.length) {\n return addTransactionMetadata(tx, extraMetaData);\n }\n\n return tx;\n }\n\n async createLendrAccountWithSessionTx(session: EstablishedSessionState, accountIndex: number, thirdPartyId?: number) {\n const ixs = await this.makeCreateLendrAccountWithSessionIx(session, accountIndex, thirdPartyId);\n\n return this.createVersionTransaction(ixs.instructions, session.payer, [...ixs.keys], {\n type: TransactionType.CREATE_ACCOUNT,\n });\n }\n\n /**\n * Create transaction instruction to initialize a new group.\n *\n * @returns transaction instruction\n */\n async makeCreateLendrGroupIx(lendrGroup: PublicKey): Promise<InstructionsWrapper> {\n this.logger.debug({ lendrGroup: lendrGroup.toBase58() }, \"Generating group init ix\");\n\n const initGroupIx = await instructions.makeGroupInitIx(this.program, {\n lendrGroup: lendrGroup,\n admin: this.provider.wallet.publicKey,\n });\n\n const ixs = [initGroupIx];\n\n return {\n instructions: ixs,\n keys: [],\n };\n }\n\n /**\n * Initiates a new permissionless lendr bank under the authority of the user.\n *\n * @param {Object} params - The parameters for creating a permissionless bank.\n * @param {PublicKey} params.mint - The public key of the mint for the bank.\n * @param {BankConfigOpt} params.bankConfig - The configuration options for the bank.\n * @param {PublicKey} params.group - The public key of the group to which the bank belongs.\n * @param {PublicKey} params.admin - The public key of the admin who will have authority over the bank.\n * @param {Keypair} [params.seed] - An optional keypair used as a seed for generating the bank account.\n * @param {TransactionOptions} [params.txOpts] - Optional transaction options for processing.\n * @param {ProcessTransactionsClientOpts} [params.processOpts] - Optional processing options for transactions.\n * @returns {Promise<TransactionSignature>} A promise that resolves to the transaction signature as a string.\n */\n async createPermissionlessBank({\n mint,\n bankConfig,\n group: _group,\n admin,\n seed,\n txOpts,\n processOpts,\n }: {\n mint: PublicKey;\n bankConfig: BankConfigOpt;\n group: PublicKey;\n admin: PublicKey;\n seed?: Keypair;\n processOpts?: ProcessTransactionsClientOpts;\n txOpts?: TransactionOptions;\n }): Promise<TransactionSignature> {\n const keypair = seed ?? Keypair.generate();\n const bankIxs = await this.group.makePoolAddBankIx(this.program, keypair.publicKey, mint, bankConfig, admin);\n\n const signers = [...bankIxs.keys, keypair];\n\n const tx = new Transaction().add(...bankIxs.instructions);\n\n const solanaTx = addTransactionMetadata(tx, {\n signers,\n addressLookupTables: this.addressLookupTables,\n type: TransactionType.CREATE_PERM_BANK,\n });\n const sig = await this.processTransaction(solanaTx, processOpts, txOpts);\n this.logger.debug({ sig }, \"Created Lendr group\");\n\n return sig;\n }\n\n /**\n * Initializes a new lendr group with the specified parameters.\n *\n * @param seed - Optional keypair used for generating the group account.\n * @param additionalIxs - Optional array of additional transaction instructions to include.\n * @param txOpts - Optional transaction options for processing.\n * @param processOpts - Optional processing options for transactions.\n * @returns The public key of the newly created lendr group.\n */\n async createLendrGroup(\n seed?: Keypair,\n additionalIxs?: TransactionInstruction[],\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<PublicKey> {\n const accountKeypair = seed ?? Keypair.generate();\n\n const ixs = await this.makeCreateLendrGroupIx(accountKeypair.publicKey);\n const signers = [...ixs.keys, accountKeypair];\n const tx = new Transaction().add(...ixs.instructions, ...(additionalIxs ?? []));\n const solanaTx = addTransactionMetadata(tx, {\n signers,\n addressLookupTables: this.addressLookupTables,\n type: TransactionType.CREATE_GROUP,\n });\n const sig = await this.processTransaction(solanaTx, processOpts, txOpts);\n this.logger.debug({ sig }, \"Created Lendr group\");\n\n return Promise.resolve(accountKeypair.publicKey);\n }\n\n /**\n * Create a new bank under the authority of the user.\n *\n * @param bankMint - The public key of the token mint for the bank.\n * @param bankConfig - Configuration options for the bank.\n * @param seed - Optional keypair for the bank.\n * @param txOpts - Optional transaction options for processing.\n * @param processOpts - Optional processing options for transactions.\n * @returns The bank's public key and the transaction signature\n */\n async createLendingPool(\n bankMint: PublicKey,\n bankConfig: BankConfigOpt,\n seed?: Keypair,\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<{ bankAddress: PublicKey; signature: TransactionSignature }> {\n const bankKeypair = seed ?? Keypair.generate();\n\n const ixs = await this.group.makePoolAddBankIx(this.program, bankKeypair.publicKey, bankMint, bankConfig);\n const signers = [...ixs.keys, bankKeypair];\n const tx = new Transaction().add(...ixs.instructions);\n\n const solanaTx = addTransactionMetadata(tx, {\n signers,\n addressLookupTables: this.addressLookupTables,\n type: TransactionType.CREATE_PERM_BANK,\n });\n const sig = await this.processTransaction(solanaTx, processOpts, txOpts);\n this.logger.debug({ sig }, \"Created new lending pool\");\n\n return Promise.resolve({\n bankAddress: bankKeypair.publicKey,\n signature: sig,\n });\n }\n\n // --------------------------------------------------------------------------\n // Helpers\n // --------------------------------------------------------------------------\n\n /**\n * Processes multiple Solana transactions by signing and sending them to the network.\n *\n * @param {SolanaTransaction[]} transactions - An array of transactions to be processed.\n * @param {ProcessTransactionsClientOpts} [processOpts] - Optional processing options for transactions.\n * @param {TransactionOptions} [txOpts] - Optional transaction options for processing.\n *\n * @returns {Promise<TransactionSignature[]>} - A promise that resolves to an array of transaction signatures.\n *\n * @throws {ProcessTransactionError} - Throws an error if transaction processing fails.\n */\n async processTransactions(\n transactions: SolanaTransaction[],\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature[]> {\n const options: ProcessTransactionOpts = {\n ...processOpts,\n isReadOnly: this.isReadOnly,\n programId: this.program.programId,\n bundleSimRpcEndpoint: this.bundleSimRpcEndpoint,\n dynamicStrategy: processOpts?.dynamicStrategy ?? this.processTransactionStrategy,\n };\n\n console.log(\"processOpts\", processOpts);\n console.log(\"processTransactions\", options);\n\n return await processTransactions({\n transactions,\n connection: this.provider.connection,\n wallet: this.provider.wallet,\n processOpts: options,\n txOpts,\n });\n }\n\n /**\n * Processes a single Solana transaction by signing and sending it to the network.\n *\n * @param {SolanaTransaction} transaction - The transaction to be processed.\n * @param {TransactionOptions} [txOpts] - Optional transaction options.\n * @param {ProcessTransactionsClientOpts} [processOpts] - Optional processing options.\n *\n * @returns {Promise<TransactionSignature>} - A promise that resolves to the transaction signature.\n *\n * @throws {ProcessTransactionError} - Throws an error if transaction processing fails.\n */\n async processTransaction(\n transaction: SolanaTransaction,\n processOpts?: ProcessTransactionsClientOpts,\n txOpts?: TransactionOptions,\n ): Promise<TransactionSignature> {\n transaction.addressLookupTables = transaction.addressLookupTables || this.addressLookupTables;\n\n const options: ProcessTransactionOpts = {\n ...processOpts,\n isReadOnly: this.isReadOnly,\n programId: this.program.programId,\n bundleSimRpcEndpoint: this.bundleSimRpcEndpoint,\n dynamicStrategy: processOpts?.dynamicStrategy ?? this.processTransactionStrategy,\n };\n\n const [signature] = await processTransactions({\n transactions: [transaction],\n connection: this.provider.connection,\n wallet: this.provider.wallet,\n processOpts: options,\n txOpts,\n });\n\n return signature;\n }\n\n async simulateTransactions(\n transactions: (Transaction | VersionedTransaction)[],\n accountsToInspect: PublicKey[],\n ): Promise<(Buffer | null)[]> {\n const versionedTransactions: VersionedTransaction[] = [];\n const connection = new Connection(this.provider.connection.rpcEndpoint, this.provider.opts);\n let blockhash: string;\n\n try {\n const getLatestBlockhashAndContext = await connection.getLatestBlockhashAndContext(\"confirmed\");\n blockhash = getLatestBlockhashAndContext.value.blockhash;\n\n for (const transaction of transactions) {\n if (isV0Tx(transaction)) {\n versionedTransactions.push(transaction);\n } else {\n const versionedMessage = new TransactionMessage({\n instructions: transaction.instructions,\n payerKey: this.provider.publicKey,\n recentBlockhash: blockhash,\n });\n\n versionedTransactions.push(\n new VersionedTransaction(versionedMessage.compileToV0Message(this.addressLookupTables)),\n );\n }\n }\n } catch (error: any) {\n throw new ProcessTransactionError({\n message: error.message,\n type: ProcessTransactionErrorType.TransactionBuildingError,\n _error: error,\n });\n }\n\n try {\n if (transactions.length === 1) {\n const response = await connection.simulateTransaction(versionedTransactions[0], {\n sigVerify: false,\n accounts: {\n encoding: \"base64\",\n addresses: accountsToInspect.map((a) => a.toBase58()),\n },\n });\n if (response.value.err) {\n const error = response.value.err;\n const parsedError = parseTransactionError(error, this.config.programId);\n throw new ProcessTransactionError({\n message: parsedError.description ?? JSON.stringify(response.value.err),\n type: ProcessTransactionErrorType.SimulationError,\n logs: response.value.logs ?? [],\n programId: parsedError.programId,\n });\n }\n return response.value.accounts?.map((a) => (a ? Buffer.from(a.data[0], \"base64\") : null)) ?? [];\n } else {\n const simulationResult = await simulateBundle(\n this.bundleSimRpcEndpoint,\n versionedTransactions,\n accountsToInspect,\n );\n const value = simulationResult[simulationResult.length - 1];\n\n const accounts = value.postExecutionAccounts;\n return accounts?.map((a: any) => (a ? Buffer.from(a.data[0], \"base64\") : null)) ?? [];\n }\n } catch (error: any) {\n if (error instanceof ProcessTransactionError) throw error;\n\n const parsedError = parseTransactionError(error, this.config.programId);\n\n if (error instanceof BundleSimulationError) {\n throw new ProcessTransactionError({\n message: parsedError.description,\n type: ProcessTransactionErrorType.SimulationError,\n logs: error.logs,\n programId: parsedError.programId,\n _error: error,\n });\n }\n\n if (error?.logs?.length > 0) {\n console.log(\"------ Logs 👇 ------\");\n console.log(error.logs.join(\"\\n\"));\n if (parsedError) {\n console.log(\"Parsed:\", parsedError);\n throw new ProcessTransactionError({\n message: parsedError.description,\n type: ProcessTransactionErrorType.SimulationError,\n logs: error.logs,\n programId: parsedError.programId,\n _error: error,\n });\n }\n }\n\n console.log(\"fallthrough error\", error);\n throw new ProcessTransactionError({\n message: parsedError?.description ?? \"Something went wrong\",\n type: ProcessTransactionErrorType.FallthroughError,\n logs: error.logs,\n programId: parsedError.programId,\n _error: error,\n });\n }\n }\n}\n\nexport default LendrClient;\n","import { wrappedI80F48toBigNumber } from \"../common\";\nimport {\n type EmodeEntry,\n type EmodeFlags,\n type EmodeSettingsRaw,\n type EmodeSettingsType,\n type EmodeTag,\n getActiveEmodeEntryFlags,\n getActiveEmodeFlags,\n parseEmodeTag,\n} from \"../services\";\n\nexport class EmodeSettings implements EmodeSettingsType {\n constructor(\n public emodeTag: EmodeTag,\n public timestamp: number,\n public flags: EmodeFlags[],\n public emodeEntries: EmodeEntry[],\n ) {\n this.emodeTag = emodeTag;\n this.timestamp = timestamp;\n this.flags = flags;\n this.emodeEntries = emodeEntries;\n }\n\n static from(emodeSettingsRaw: EmodeSettingsRaw): EmodeSettings {\n const emodeTag = parseEmodeTag(emodeSettingsRaw.emodeTag);\n const timestamp = emodeSettingsRaw.timestamp.toNumber();\n const flags = getActiveEmodeFlags(emodeSettingsRaw.flags);\n const emodeEntries = emodeSettingsRaw.emodeConfig.entries\n .filter((entry) => entry.collateralBankEmodeTag !== 0)\n .map((entry) => {\n return {\n collateralBankEmodeTag: parseEmodeTag(entry.collateralBankEmodeTag),\n flags: getActiveEmodeEntryFlags(entry.flags),\n assetWeightInit: wrappedI80F48toBigNumber(entry.assetWeightInit),\n assetWeightMaint: wrappedI80F48toBigNumber(entry.assetWeightMaint),\n };\n });\n return new EmodeSettings(emodeTag, timestamp, flags, emodeEntries);\n }\n}\n","import LendrClient from \"./clients/client\";\nimport instructions from \"./instructions\";\n\nexport * from \"./clients/client\";\nexport * from \"./config\";\nexport * from \"./constants\";\nexport * from \"./errors\";\nexport * from \"./idl\";\nexport * from \"./models/account\";\nexport * from \"./models/balance\";\nexport * from \"./models/bank\";\nexport * from \"./models/emode-settings\";\nexport * from \"./models/group\";\nexport * from \"./models/health-cache\";\nexport * from \"./services\";\nexport * from \"./types\";\nexport * from \"./utils\";\nexport * as vendor from \"./vendor\";\nexport { LendrClient, instructions };\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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AM,sBACP;GACD,EACE,MAAM,cACP;GACD,EACE,MAAM,UACP;GACD;IACE,MAAM;IACN,UAAU;IACX;GACD;IACE,MAAM;IACN,UAAU;IACX;GACD,EACE,MAAM,iBACP;GACF;EACD,MAAM;GACJ;IACE,MAAM;IACN,MAAM,EACJ,SAAS,EACP,MAAM,oBACP,EACF;IACF;GACD;IACE,MAAM;IACN,MAAM;IACP;GACD;IACE,MAAM;IACN,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,EAClB;IACF;GACF;EACF,CACF;CACD,QAAQ,CACN;EACE,MAAM;EACN,MAAM;EACN,KAAK;EACN,EACD;EACE,MAAM;EACN,MAAM;EACN,KAAK;EACN,CACF;CACD,OAAO,CACL;EACE,MAAM;EACN,MAAM;GACJ,MAAM;GACN,QAAQ,CACN;IACE,MAAM;IACN,MAAM,EACJ,SAAS,EACP,MAAM,qBACP,EACF;IACF,EACD;IACE,MAAM;IACN,MAAM;IACP,CACF;GACF;EACF,EACD;EACE,MAAM;EACN,MAAM;GACJ,MAAM;GACN,QAAQ,CACN;IACE,MAAM;IACN,MAAM;IACP,EACD;IACE,MAAM;IACN,MAAM,EACJ,KAAK,EACH,OAAO,CAAC,MAAM,GAAG,EAClB,EACF;IACF,CACF;GACF;EACF,CACF;CACF;;;;ACk2CD,MAAa,oBAA8C;CACzD,SAAS;CACT,UAAU;EACR,MAAM;EACN,SAAS;EACT,MAAM;EACP;CACD,cAAc;EACZ;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAK;IAAK;IAAI;IAAI;IAAK;IAAK;IAAK;IAAI;GACrD,UAAU,CACR;IACE,MAAM;IACN,MAAM,CAAC,6EAA6E;IACpF,QAAQ;IACT,EACD;IACE,MAAM;IACN,MAAM,CAAC,UAAU;IACjB,UAAU;IACX,CACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM,EACJ,SAAS,EACP,MAAM,qBACP,EACF;IACF,CACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAI;IAAI;IAAK;IAAK;IAAI;IAAK;IAAK;IAAI;GACpD,UAAU,CACR;IACE,MAAM;IACN,QAAQ;IACT,EACD;IACE,MAAM;IACN,MAAM,CAAC,mDAAmD;IAC1D,UAAU;IACX,CACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM,EACJ,SAAS,EACP,MAAM,sBACP,EACF;IACF,CACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAK;IAAK;IAAK;IAAK;IAAK;IAAI;IAAI;IAAI;GACrD,UAAU,CACR;IACE,MAAM;IACN,QAAQ;IACT,EACD;IACE,MAAM;IACN,MAAM,CAAC,mDAAmD;IAC1D,UAAU;IACX,CACF;GACD,MAAM,EAAE;GACT;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAI;IAAK;IAAI;IAAK;IAAK;IAAI;IAAI;IAAI;GACnD,UAAU;IACR;KACE,MAAM;KACN,QAAQ;KACT;IACD;KACE,MAAM;KACN,MAAM,CAAC,mDAAmD;KAC1D,UAAU;KACX;IACD;KACE,MAAM;KACN,UAAU;KACX;IACF;GACD,MAAM,EAAE;GACT;EACD;GACE,MAAM;GACN,MAAM,CACJ,+FACA,wEACD;GACD,eAAe;IAAC;IAAK;IAAK;IAAK;IAAI;IAAI;IAAK;IAAK;IAAI;GACrD,UAAU,CACR;IACE,MAAM;IACN,MAAM,CAAC,6EAA6E;IACpF,QAAQ;IACT,EACD;IACE,MAAM;IACN,MAAM,CAAC,UAAU;IACjB,UAAU;IACX,CACF;GACD,MAAM,EAAE;GACT;EACD;GACE,MAAM;GACN,MAAM,CACJ,gGACA,+EACD;GACD,eAAe;IAAC;IAAI;IAAK;IAAK;IAAK;IAAK;IAAG;IAAK;IAAG;GACnD,UAAU,CACR;IACE,MAAM;IACN,MAAM;KACJ;KACA;KACA;KACD;IACD,UAAU;IACV,QAAQ;IACT,EACD;IACE,MAAM;IACN,MAAM,CAAC,gCAAgC;IACvC,UAAU;IACX,CACF;GACD,MAAM,EAAE;GACT;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAK;IAAK;IAAK;IAAK;IAAK;IAAI;IAAK;IAAG;GACrD,UAAU,CACR;IACE,MAAM;IACN,MAAM,CAAC,gEAAgE;IACvE,QAAQ;IACT,EACD;IACE,MAAM;IACN,MAAM,CAAC,gCAAgC;IACvC,UAAU;IACX,CACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM,EACJ,SAAS,EACP,MAAM,uBACP,EACF;IACF,CACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAK;IAAI;IAAK;IAAK;IAAK;IAAK;IAAI;IAAG;GACpD,UAAU;IACR;KACE,MAAM;KACN,QAAQ;KACT;IACD;KACE,MAAM;KACN,MAAM,CAAC,gCAAgC;KACvC,UAAU;KACX;IACD;KACE,MAAM;KACN,MAAM,CACJ,+FACA,wEACD;KACF;IACF;GACD,MAAM,EAAE;GACT;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAG;IAAI;IAAI;IAAG;IAAK;IAAI;IAAK;IAAG;GAC/C,UAAU;IACR;KACE,MAAM;KACN,MAAM,CACJ,8FACA,kCACD;KACD,UAAU;KACV,QAAQ;KACT;IACD;KACE,MAAM;KACN,MAAM;MACJ;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACF;IACD;KACE,MAAM;KACN,UAAU;KACX;IACD,EACE,MAAM,iBACP;IACF;GACD,MAAM,EAAE;GACT;EACD;GACE,MAAM;GACN,MAAM,CACJ,2FACA,8DACD;GACD,eAAe;IAAC;IAAI;IAAK;IAAK;IAAK;IAAK;IAAK;IAAK;IAAI;GACtD,UAAU;IACR;KACE,MAAM;KACN,UAAU;KACV,QAAQ;KACT;IACD;KACE,MAAM;KACN,MAAM,CAAC,cAAc;KACtB;IACD;KACE,MAAM;KACN,MAAM;MACJ;MACA;MACA;MACD;KACD,UAAU;KACX;IACF;GACD,MAAM,EAAE;GACT;EACF;CACD,UAAU;EACR;GACE,MAAM;GACN,eAAe;IAAC;IAAI;IAAI;IAAI;IAAK;IAAK;IAAI;IAAK;IAAG;GACnD;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAK;IAAK;IAAK;IAAG;IAAK;IAAK;IAAK;IAAI;GACtD;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAI;IAAK;IAAI;IAAI;IAAI;IAAK;IAAK;IAAI;GACpD;EACF;CACD,QAAQ;EACN;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACF;CACD,OAAO;EACL;GACE,MAAM;GACN,MAAM,CAAC,wDAAwD;GAC/D,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,EACJ,KAAK,EACH,OAAO,CAAC,MAAM,GAAG,EAClB,EACF;MACF;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,CAAC,8BAA8B;MACrC,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,mBAAmB;MAC1B,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,oDAAoD;MAC3D,MAAM,EACJ,SAAS,EACP,MAAM,cACP,EACF;MACF;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,CAAC,eAAe;MACtB,MAAM,EACJ,OAAO,CAAC,MAAM,EAAE,EACjB;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,kCAAkC;MACzC,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,8BAA8B;MACrC,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,6DAA6D;MACpE,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,0BAA0B;MACjC,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,EAClB;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,mCAAmC;MAC1C,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,iDAAiD;MACxD,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,mBAAmB;MAC1B,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM;MACJ;MACA;MACA;MACA;MACA;MACA;MACA;MACD;KACD,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,EAClB;KACF,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,+DAA+D;GACtE,MAAM,EACJ,MAAM,UACP;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,CAAC,iFAAiF;MACxF,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CACJ,2FACA,4CACD;MACD,MAAM,EACJ,OAAO,CAAC,MAAM,EAAE,EACjB;MACF;KACD;MACE,MAAM;MACN,MAAM;OACJ;OACA;OACA;OACD;MACD,MAAM,EACJ,SAAS,EACP,MAAM,YACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,6EAA6E;MACpF,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,yEAAyE;GAChF,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,CAAC,8FAA8F;KACrG,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,EACJ,SAAS,EACP,MAAM,yBACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,EACJ,SAAS,EACP,MAAM,eACP,EACF;MACF;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,iEAAiE;GACxE,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,EACJ,SAAS,EACP,MAAM,uBACP,EACF;KACF,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,4EAA4E;GACnF,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,CAAC,iDAAiD;MACxD,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,yFAAyF,UAAU;MAC1G,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;OACJ;OACA;OACA;OACA;OACD;MACD,MAAM,EACJ,SAAS,EACP,MAAM,iBACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,0BAA0B;MACjC,MAAM,EACJ,OAAO,CAAC,MAAM,EAAE,EACjB;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,uCAAuC;MAC9C,MAAM,EACJ,SAAS,EACP,MAAM,aACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,8BAA8B;MACrC,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,mCAAmC;MAC1C,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;OACJ;OACA;OACA;OACA;OACD;MACD,MAAM,EACJ,SAAS,EACP,MAAM,qBACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,oFAAoF;MAC3F,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CACJ,0FACA,gFACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,CAAC,oBAAoB;KAC3B,MAAM,EACJ,SAAS,EACP,MAAM,uBACP,EACF;KACF,EACD;KACE,MAAM;KACN,MAAM,CAAC,mBAAmB;KAC1B,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,CAAC,gBAAgB;KACvB,MAAM,EACJ,SAAS,EACP,MAAM,uBACP,EACF;KACF,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,iGAAiG,OAAO;GAC/G,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,CAAC,iDAAiD;MACxD,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,kCAAkC;MACzC,MAAM,EACJ,SAAS,EACP,MAAM,aACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,CACJ,2FACA,0BACD;MACD,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;OACJ;OACA;OACA;OACA;OACA;OACA;OACA;OACD;MACD,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,8BAA8B;MACrC,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,mCAAmC;MAC1C,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,6DAA6D;MACpE,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,0BAA0B;MACjC,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,EAClB;MACF;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,wCAAwC;GAC/C,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,CAAC,gBAAgB;KACvB,MAAM,EACJ,SAAS,EACP,MAAM,mBACP,EACF;KACF,EACD;KACE,MAAM;KACN,MAAM,CAAC,mBAAmB;KAC1B,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CACJ,gGACA,eACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,CAAC,uBAAuB;KAC9B,MAAM;KACP,EACD;KACE,MAAM;KACN,MAAM,CAAC,sEAAsE;KAC7E,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CACJ,4FACA,eACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,CAAC,8BAA8B;MACrC,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,oDAAoD;MAC3D,MAAM,EACJ,SAAS,EACP,MAAM,cACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM;OACJ;OACA;OACA;OACD;MACD,MAAM,EACJ,QAAQ,UACT;MACF;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CACJ,8FACA,eACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,CAAC,2BAA2B;KAClC,MAAM;KACP,EACD;KACE,MAAM;KACN,MAAM,CAAC,0EAA0E;KACjF,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,+BAA+B;GACtC,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,CACJ,2FACA,+CACD;MACD,MAAM,EACJ,SAAS,EACP,MAAM,oBACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,0DAA0D;MACjE,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,6EAA6E;MACpF,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,mFAAmF;GAC1F,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,0DAA0D;GACjE,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,EAClB;KACF,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,EAClB;MACF;KACD;MACE,MAAM;MACN,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,UAAU;KACR,EACE,MAAM,cACP;KACD,EACE,MAAM,eACP;KACD,EACE,MAAM,WACP;KACD,EACE,MAAM,iBACP;KACD,EACE,MAAM,gBACP;KACD,EACE,MAAM,mBACP;KACD,EACE,MAAM,qBACP;KACD,EACE,MAAM,oBACP;KACD,EACE,MAAM,yBACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,UAAU;KACR,EACE,MAAM,SACP;KACD,EACE,MAAM,UACP;KACD,EACE,MAAM,cACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,gEAAgE,yCAAyC;GAChH,MAAM;IACJ,MAAM;IACN,UAAU;KACR,EACE,MAAM,aACP;KACD,EACE,MAAM,WACP;KACD,EACE,MAAM,sBACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,iEAAiE;GACxE,MAAM;IACJ,MAAM;IACN,UAAU;KACR;MACE,MAAM;MACN,QAAQ;OACN;QACE,MAAM;QACN,MAAM;QACP;OACD;QACE,MAAM;QACN,MAAM;QACP;OACD;QACE,MAAM;QACN,MAAM,EACJ,SAAS,EACP,MAAM,cACP,EACF;QACF;OACF;MACF;KACD;MACE,MAAM;MACN,QAAQ;OACN;QACE,MAAM;QACN,MAAM;QACP;OACD;QACE,MAAM;QACN,MAAM;QACP;OACD;QACE,MAAM;QACN,MAAM;QACP;OACD;QACE,MAAM;QACN,MAAM,EACJ,SAAS,EACP,MAAM,cACP,EACF;QACF;OACF;MACF;KACD,EACE,MAAM,mBACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CAAC,mCAAmC;GAC1C,MAAM;IACJ,MAAM;IACN,UAAU;KACR,EACE,MAAM,SACP;KACD,EACE,MAAM,WACP;KACD,EACE,MAAM,YACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,UAAU,CACR,EACE,MAAM,aACP,EACD,EACE,MAAM,aACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,CAAC,2EAA2E;MAClF,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CAAC,8BAA8B;MACrC,MAAM,EACJ,KAAK,EACH,OAAO,CAAC,MAAM,GAAG,EAClB,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,+DAA+D;MACtE,MAAM,EACJ,SAAS,EACP,MAAM,aACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,oEAAoE;MAC3E,MAAM,EACJ,SAAS,EACP,MAAM,aACP,EACF;MACF;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,CAAC,2BAA2B;MAClC,MAAM,EACJ,KAAK,QACN;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,gCAAgC;MACvC,MAAM,EACJ,SAAS,EACP,MAAM,eACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,CAAC,4BAA4B;MACnC,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,CAAC,2CAA2C;KAClD,MAAM,EACJ,SAAS,EACP,MAAM,UACP,EACF;KACF,EACD;KACE,MAAM;KACN,MAAM,CAAC,cAAc;KACrB,MAAM;KACP,CACF;IACF;GACF;EACF;CACD,WAAW;EACT;GACE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,MAAM;GACN,MAAM,EACJ,SAAS,EACP,MAAM,SACP,EACF;GACD,OAAO;GACR;EACF;CACF;;;;ACt3ED,MAAa,mCAAuD;CAClE,SAAS;CACT,UAAU;EACR,MAAM;EACN,SAAS;EACT,MAAM;EACP;CACD,cAAc;EACZ;GACE,MAAM;GACN,eAAe;IAAC;IAAK;IAAK;IAAK;IAAI;IAAI;IAAK;IAAK;IAAI;GACrD,UAAU;IACR;KACE,MAAM;KACN,UAAU;KACV,QAAQ;KACT;IACD;KACE,MAAM;KACN,UAAU;KACX;IACD,EACE,MAAM,iBACP;IACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM,EACJ,SAAS,EACP,MAAM,UACP,EACF;IACF,CACF;GACF;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAI;IAAI;IAAI;IAAK;IAAI;IAAK;IAAK;IAAI;GACnD,UAAU,CACR;IACE,MAAM;IACN,QAAQ;IACT,EACD;IACE,MAAM;IACN,UAAU;IACX,CACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM;IACP,CACF;GACF;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAK;IAAI;IAAK;IAAI;IAAI;IAAK;IAAK;IAAI;GACpD,UAAU,CACR;IACE,MAAM;IACN,QAAQ;IACT,EACD;IACE,MAAM;IACN,UAAU;IACX,CACF;GACD,MAAM,EAAE;GACT;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAK;IAAI;IAAI;IAAK;IAAK;IAAK;IAAI;IAAI;GACpD,UAAU,CACR;IACE,MAAM;IACN,QAAQ;IACT,EACD;IACE,MAAM;IACN,UAAU;IACX,CACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM,EACJ,KAAK,EACH,SAAS,EACP,MAAM,cACP,EACF,EACF;IACF,CACF;GACF;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAI;IAAK;IAAI;IAAI;IAAK;IAAK;IAAI;IAAG;GAClD,UAAU,CACR;IACE,MAAM;IACN,QAAQ;IACT,EACD;IACE,MAAM;IACN,UAAU;IACX,CACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM;IACP,CACF;GACF;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAK;IAAK;IAAK;IAAK;IAAI;IAAK;IAAK;IAAI;GACtD,UAAU,CACR;IACE,MAAM;IACN,QAAQ;IACT,EACD;IACE,MAAM;IACN,UAAU;IACX,CACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM;IACP,CACF;GACF;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAG;IAAK;IAAK;IAAK;IAAI;IAAI;IAAK;IAAI;GACnD,UAAU,CACR;IACE,MAAM;IACN,QAAQ;IACT,EACD;IACE,MAAM;IACN,UAAU;IACX,CACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM;IACP,CACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAI;IAAK;IAAI;IAAK;IAAK;IAAK;IAAI;IAAI;GACpD,UAAU;IACR;KACE,MAAM;KACN,UAAU;KACV,QAAQ;KACT;IACD;KACE,MAAM;KACN,MAAM,CAAC,oEAAoE;KAC5E;IACD,EACE,MAAM,UACP;IACD;KACE,MAAM;KACN,UAAU;KACX;IACD;KACE,MAAM;KACN,MAAM,CACJ,oHACA,uLACD;KACD,UAAU;KACV,QAAQ;KACT;IACD,EACE,MAAM,iBACP;IACD;KACE,MAAM;KACN,QAAQ;KACT;IACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM,EACJ,SAAS,EACP,MAAM,0BACP,EACF;IACF,CACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAK;IAAI;IAAK;IAAK;IAAI;IAAI;IAAK;IAAG;GACnD,UAAU;IACR;KACE,MAAM;KACN,UAAU;KACV,QAAQ;KACT;IACD,EACE,MAAM,cACP;IACD,EACE,MAAM,UACP;IACD;KACE,MAAM;KACN,UAAU;KACX;IACD;KACE,MAAM;KACN,MAAM,CACJ,oHACA,uLACD;KACD,UAAU;KACV,QAAQ;KACT;IACD,EACE,MAAM,iBACP;IACD;KACE,MAAM;KACN,QAAQ;KACT;IACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM,EACJ,SAAS,EACP,MAAM,oBACP,EACF;IACF,CACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ;IACA;IACA;IACD;GACD,eAAe;IAAC;IAAK;IAAK;IAAK;IAAK;IAAI;IAAK;IAAI;IAAG;GACpD,UAAU;IACR;KACE,MAAM;KACN,UAAU;KACV,QAAQ;KACT;IACD,EACE,MAAM,mBACP;IACD,EACE,MAAM,iBACP;IACD,EACE,MAAM,UACP;IACD;KACE,MAAM;KACN,UAAU;KACX;IACD;KACE,MAAM;KACN,MAAM,CACJ,6HACA,sLACD;KACD,UAAU;KACV,QAAQ;KACT;IACD,EACE,MAAM,iBACP;IACD;KACE,MAAM;KACN,QAAQ;KACT;IACF;GACD,MAAM,CACJ;IACE,MAAM;IACN,MAAM,EACJ,SAAS,EACP,MAAM,wBACP,EACF;IACF,CACF;GACF;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAK;IAAK;IAAI;IAAK;IAAK;IAAI;IAAK;IAAG;GACpD,UAAU,CACR;IACE,MAAM;IACN,UAAU;IACV,QAAQ;IACT,EACD;IACE,MAAM;IACN,UAAU;IACX,CACF;GACD,MAAM,EAAE;GACT;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAI;IAAG;IAAI;IAAK;IAAK;IAAK;IAAK;IAAG;GAClD,UAAU,CACR;IACE,MAAM;IACN,UAAU;IACV,QAAQ;IACT,EACD;IACE,MAAM;IACN,UAAU;IACX,CACF;GACD,MAAM,EAAE;GACT;EACF;CACD,UAAU;EACR;GACE,MAAM;GACN,eAAe;IAAC;IAAK;IAAI;IAAK;IAAK;IAAI;IAAK;IAAK;IAAI;GACtD;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAI;IAAG;IAAI;IAAI;IAAK;IAAI;IAAG;IAAI;GAChD;EACD;GACE,MAAM;GACN,eAAe;IAAC;IAAK;IAAK;IAAK;IAAI;IAAK;IAAK;IAAK;IAAI;GACvD;EACF;CACD,QAAQ;EACN;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACD;GACE,MAAM;GACN,MAAM;GACN,KAAK;GACN;EACF;CACD,OAAO;EACL;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,EAClB;MACF;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CACJ,6FACA,qFACD;GACD,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,EAClB;MACF;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,CACJ,iEACA,+DACD;MACD,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM;KACP,EACD;KACE,MAAM;KACN,MAAM,EACJ,KAAK,EACH,OAAO,CAAC,MAAM,GAAG,EAClB,EACF;KACF,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM;KACP,EACD;KACE,MAAM;KACN,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,EACJ,SAAS,EACP,MAAM,qBACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM,EACJ,SAAS,EACP,MAAM,qBACP,EACF;KACF,EACD;KACE,MAAM;KACN,MAAM;KACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM,EACJ,SAAS,EACP,MAAM,qBACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,EACJ,SAAS,EACP,MAAM,qBACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM,CACJ,+UACD;GACD,MAAM;IACJ,MAAM;IACN,UAAU,CACR;KACE,MAAM;KACN,QAAQ,CACN;MACE,MAAM;MACN,MAAM;MACP,CACF;KACF,EACD,EACE,MAAM,QACP,CACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,EACJ,QAAQ,UACT;MACF;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,EACJ,KAAK,EACH,SAAS,EACP,MAAM,cACP,EACF,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ;KACN;MACE,MAAM;MACN,MAAM;MACP;KACD;MACE,MAAM;MACN,MAAM,EACJ,SAAS,EACP,MAAM,qBACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM,EACJ,SAAS,EACP,MAAM,oBACP,EACF;MACF;KACD;MACE,MAAM;MACN,MAAM;MACP;KACF;IACF;GACF;EACD;GACE,MAAM;GACN,MAAM;IACJ,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM;KACP,EACD;KACE,MAAM;KACN,MAAM,EACJ,SAAS,EACP,MAAM,aACP,EACF;KACF,CACF;IACF;GACF;EACF;CACF;;;;ACljDD,MAAa,8BAA8B,IAAI,UAAU,8CAA8C;AACvG,MAAa,8BAA8B,IAAI,UAAU,+CAA+C;AACxG,MAAa,iCAAiC,IAAI,UAAU,8CAA8C;AAE1G,MAAa,oBAAoB;AACjC,MAAa,gBAAgB;AAC7B,MAAa,gBAAgB;AAC7B,MAAa,sBAAsB;AACnC,MAAa,6BAA6B;AAC1C,MAAa,uBAAuB;;;;AAKpC,MAAa,oCAAoC;;;;AAIjD,MAAa,oCAAoC;;;;AAIjD,MAAa,6BAA6B;;;;AAI1C,MAAa,kCAAkC;;;;AAI/C,MAAa,mCAAmC;;;;AAIhD,MAAa,kCAAkC;;;;AAI/C,MAAa,mCAAmC;;;;AAIhD,MAAa,mCAAmC;AAEhD,MAAa,kBAAkB;AAE/B,MAAa,YAAY;;;;AC9BzB,SAAgB,oBAAoB,KAAa;AAC/C,QAAO,IAAI,aAAa,EAAE;;AAG5B,MAAa,oCAAoC;AACjD,MAAa,qBAAqB;AAClC,SAAgB,eAAe,KAAa,IAAI,mCAA2C;CACzF,MAAM,uBAAuB,IAAI;AACjC,KAAI,IAAI,sBAAsB;AAC5B,QAAM,IAAI,MAAM,iEAAiE;;CAGnF,MAAM,aAAa,OAAO,OAAO,CAC/B,IAAI,SAAS,GAAG,IAAI,IAAI,mBAAmB,EAC3C,IAAI,SAAS,IAAI,uBAAuB,mBAAmB,CAC5D,CAAC;AAEF,YAAW,KAAK;AAChB,QAAO;;AAGT,SAAgB,wBAAwB,aAA8B;AACpE,QACE,YAAY,SAAS,MAAM,CAAC,MAAM,GAAG,EAAE,KAAK,qBAC5C,YAAY,OAAO,iBACnB,YAAY,OAAO;;AASvB,SAAgB,2BAA2B,MAAqC;AAC9E,KAAI,CAAC,wBAAwB,KAAK,EAAE;AAClC,QAAM,IAAI,MAAM,8BAA8B;;CAGhD,IAAI,SAAS;CACb,MAAM,sBAAsB,KAAK,UAAU,OAAO;AAClD,WAAU,IAAI;AAGd,WAAU;CAEV,MAAM,UAAU,KAAK,aAAa,OAAO;AACzC,WAAU;CAEV,MAAM,MAAM,KAAK,SAAS,QAAQ,SAAS,QAAQ;AACnD,WAAU;CAEV,MAAM,aAAa,KAAK,UAAU,OAAO;CACzC,MAAM,UAGD,EAAE;AACP,WAAU;AAEV,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;EACnC,MAAM,cAAc,KAAK,aAAa,OAAO;AAC7C,YAAU;EACV,MAAM,UAAU,KAAK,SAAS,QAAQ,SAAS,YAAY;AAC3D,YAAU;EAEV,MAAM,YAAY,KAAK,UAAU,OAAO;AACxC,YAAU;EACV,MAAM,QAAyB,EAAE;AACjC,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,SAAM,KAAK,MAAM,KAAK,KAAK,SAAS,QAAQ,SAAS,oBAAoB,CAAC,CAAC;AAC3E,aAAU;;AAGZ,UAAQ,KAAK;GAAE;GAAS;GAAO,CAAC;;AAGlC,KAAI,WAAW,KAAK,QAAQ;AAC1B,QAAM,IAAI,MAAM,sCAAsC;;AAGxD,QAAO;EAAE;EAAK;EAAS;;AAsBzB,eAAsB,gCACpB,UACA,KAKC;CACD,MAAM,SAAS,MAAM,6BAA6B,UAAU,IAAI;AAKhE,QAAO;EACL,mBAAmB,OAAO;EAC1B,kBAAkB;GAChB,GAAG,OAAO;GACV,GAAG,OAAO;GACV,GAAG,OAAO;GACX;EACD,mBAAmB,OAAO;EAC3B;;AAGH,eAAe,6BACb,UACA,KAC+B;CAC/B,MAAM,oBAAoB,IAAI,SAAS;CAGvC,MAAM,mBAAsD,CAC1D,MAAM,iCAAiC,UAAU,KAAK,kBAAkB,EACxE;EACE,aAAa,MAAM,SAAS,QACzB,gBAAgB,CAChB,SAAS,EACR,YAAY,kBAAkB,WAC/B,CAAC,CACD,aAAa;EAChB,SAAS,EAAE;EACX,cAAc;EACf,CACF;CAGD,MAAM,6BAAgE,CACpE;EACE,aAAa,MAAM,SAAS,QACzB,gBAAgB;GACf,OAAO;GACP,MAAM,IAAI,SAAS,GAAG,gBAAgB;GACvC,CAAC,CACD,SAAS,EACR,UAAU,kBAAkB,WAC7B,CAAC,CACD,aAAa;EAChB,SAAS,EAAE;EACX,cAAc;EACf,CACF;CAGD,MAAM,uCAA0E,CAC9E;EACE,aAAa,MAAM,SAAS,QACzB,gBAAgB;GACf,OAAO;GACP,MAAM,IAAI,SAAS,gBAAgB;GACpC,CAAC,CACD,SAAS,EACR,UAAU,kBAAkB,WAC7B,CAAC,CACD,aAAa;EAChB,SAAS,EAAE;EACX,cAAc;EACf,EACD;EACE,aAAa,MAAM,SAAS,QACzB,oBAAoB,CACpB,SAAS;GACR,aAAa,kBAAkB,oBAAoB,IAAI,EAAE,SAAS,UAAU;GAC5E,UAAU,kBAAkB;GAC7B,CAAC,CACD,aAAa;EAChB,SAAS,EAAE;EACX,cAAc;EACf,CACF;CAGD,MAAM,oBAAuD,CAC3D;EACE,aAAa,MAAM,SAAS,QACzB,iBAAiB,CACjB,SAAS,EAAE,YAAY,kBAAkB,WAAW,CAAC,CACrD,aAAa;EAChB,SAAS,EAAE;EACX,cAAc;EACf,CACF;AAED,QAAO;EACL;EACA;EACA;EACA;EACA,mBAAmB,kBAAkB;EACtC;;;;;;;AAQH,eAAsB,iCACpB,UACA,KACA,mBAC0C;CAC1C,MAAM,iBAAiB,IAAI,SAAS;AACpC,QAAO;EACL,aAAa,MAAM,SAAS,QAAQ,WAAW,kBAAkB,mBAAmB,eAAe;EACnG,SAAS,CAAC,kBAAkB;EAC7B;;;;;AAMH,MAAa,qBAAqB,kBAA0B,sBAAiC;CAC3F,MAAM,sBAAsB,OAAO,MAAM,EAAE;AAC3C,qBAAoB,cAAc,kBAAkB,EAAE;AACtD,QAAO,UAAU,uBAAuB,CAAC,OAAO,KAAK,cAAc,EAAE,oBAAoB,EAAE,kBAAkB,CAAC;;AAchH,SAAgB,sBAAsB,SAAmC;CACvE,IAAI,SAAS;CACb,MAAM,UAAU,QAAQ,UAAU,OAAO;AACzC,KAAI,YAAY,4BAA4B;AAC1C,QAAM,IAAI,MAAM,2BAA2B;;AAE7C,WAAU;CACV,MAAM,SAAS,QAAQ,SAAS,QAAQ,SAAS,GAAG;AACpD,WAAU;CACV,MAAM,QAAQ,IAAIC,KAAG,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,KAAK;AAChE,WAAU;CACV,MAAM,aAAa,IAAIA,KAAG,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,KAAK;AACrE,WAAU;CACV,MAAM,WAAW,QAAQ,YAAY,OAAO;AAC5C,WAAU;CACV,MAAM,cAAc,IAAIA,KAAG,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,KAAK;AACtE,WAAU;CACV,MAAM,kBAAkB,IAAIA,KAAG,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,KAAK;AAC1E,WAAU;CACV,MAAM,WAAW,IAAIA,KAAG,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,KAAK;AACnE,WAAU;CACV,MAAM,UAAU,IAAIA,KAAG,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,KAAK;AAClE,WAAU;AACV,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;;AC5RH,IAAY,kDAAL;AACL;AACA;AACA;;;;;;gBChB+G;AAQjH,SAAgB,uBAAuB,aAA0B,UAAwC;AACvG,QAAO,WAAW,YAAY,gBAAgB,YAAY;;AAG5D,SAAgB,SACd,aACA,YAAuB,UAAU,MACjC,gBAAyB,OACd;CACX,MAAM,QAAQ,uBAAuB,aAAa,cAAc;AAChE,SAAQ,WAAR;EACE,KAAK,UAAU,OACb,QAAO,MAAM;EACf,KAAK,UAAU,QACb,QAAO,MAAM;EACf,KAAK,UAAU,KACb,QAAO,MAAM;;;AAInB,SAAS,sBAAsB,OAAkB,YAAuB,eAAqC;CAC3G,MAAM,wBAAwB,MAAM,MAAM,cAAc;AAExD,QAAO,UAAU,IAAI,YAAY,sBAAsB;;AAazD,SAAgB,uBAAuB,aAA+D;AACpG,SAAQ,aAAR;EACE,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY,MACf,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,qBACP,aACA,SACA,YACA,SAAkB,IAAI,YAAY,EACrB;AACb,SAAQ,aAAR;EACE,KAAK,YAAY,YAAY;GAC3B,MAAM,gBAAgB,eAAe,QAAQ;GAE7C,IAAI,YAAY,cAAc;AAC9B,OAAI,cAAc,WAAW;AAC3B,gBAAY,cAAc;;GAG5B,IAAI,iBAAiB,cAAc;AACnC,OAAI,mBAAmB,WAAW;AAChC,qBAAiB,cAAc;;AAGjC,OAAI,cAAc,aAAa,mBAAmB,WAAW;AAC3D,UAAM,IAAI,MAAM,6CAA6C;;GAG/D,MAAM,oBAAoB,IAAI,UAAU,UAAU;GAClD,MAAM,yBAAyB,IAAI,UAAU,eAAe,CAAC,MAAM,0BAA0B;GAC7F,MAAM,+BAA+B,sBACnC,mBACA,wBACA,0BACD;GACD,MAAM,0BAA0B,kBAAkB,MAAM,6BAA6B;GACrF,MAAM,2BAA2B,kBAAkB,KAAK,6BAA6B;GAErF,MAAM,oBAAoB,IAAI,UAAU,cAAc,SAAS,MAAM;GACrE,MAAM,2BAA2B,IAAI,UAAU,cAAc,cAAc,MAAM,CAAC,MAChF,0BACD;GACD,MAAM,iCAAiC,sBACrC,mBACA,0BACA,0BACD;GACD,MAAM,kBAAkB,kBAAkB,MAAM,+BAA+B;GAC/E,MAAM,mBAAmB,kBAAkB,KAAK,+BAA+B;AAE/E,UAAO,MACL;IACE,mBAAmB,kBAAkB,UAAU;IAC/C,8BAA8B,6BAA6B,UAAU;IACrE,mBAAmB,kBAAkB,UAAU;IAC/C,gCAAgC,+BAA+B,UAAU;IAC1E,EACD,0CACD;AAED,UAAO;IACL,eAAe;KACb,OAAO;KACP,YAAY;KACZ,aAAa;KACb,cAAc;KACf;IACD,eAAe;KACb,OAAO;KACP,YAAY;KACZ,aAAa;KACb,cAAc;KACf;IACD,WAAW,IAAI,UAAU,OAAO,cAAc,UAAU,CAAC;IAC1D;;EAEH,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY,gBAAgB;GAC/B,MAAM,4BAA4B,QAAQ,MAAM,EAAE;GAClD,MAAM,OAAO,eAAe,0BAA0B;GAEtD,MAAM,WAAW,IAAI,UAAU,MAAM,KAAK,aAAa,SAAS;GAEhE,MAAM,gBAAgB,IAAI,UAAU,OAAO,KAAK,aAAa,MAAM,CAAC,CAAC,MAAM,SAAS;GACpF,MAAM,qBAAqB,IAAI,UAAU,OAAO,KAAK,aAAa,KAAK,CAAC,CACrE,MAAM,SAAS,CACf,MAAM,0BAA0B;GACnC,MAAM,2BAA2B,sBAC/B,eACA,oBACA,8BACD;GACD,MAAM,sBAAsB,cAAc,MAAM,yBAAyB;GACzE,MAAM,uBAAuB,cAAc,KAAK,yBAAyB;GAEzE,MAAM,oBAAoB,IAAI,UAAU,OAAO,KAAK,aAAa,SAAS,CAAC,CAAC,MAAM,SAAS;GAC3F,MAAM,yBAAyB,IAAI,UAAU,OAAO,KAAK,aAAa,QAAQ,CAAC,CAC5E,MAAM,SAAS,CACf,MAAM,0BAA0B;GACnC,MAAM,2BAA2B,sBAC/B,mBACA,wBACA,8BACD;GACD,MAAM,sBAAsB,kBAAkB,MAAM,yBAAyB;GAC7E,MAAM,uBAAuB,kBAAkB,KAAK,yBAAyB;AAE7E,UAAO;IACL,eAAe;KACb,OAAO;KACP,YAAY;KACZ,aAAa;KACb,cAAc;KACf;IACD,eAAe;KACb,OAAO;KACP,YAAY;KACZ,aAAa;KACb,cAAc;KACf;IACD,WAAW,IAAI,UAAU,OAAO,KAAK,aAAa,YAAY,CAAC;IAChE;;EAGH,KAAK,YAAY,eAAe;GAC9B,MAAM,UAAU,sBAAsB,OAAO,QAAQ;GAErD,MAAM,cAAc,kBAAkB,kBAAkB,QAAQ;AAChE,OAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,wCAAwC;;GAE1D,MAAM,WAAW,IAAI,UAAU,YAAY,UAAU,CAAC;GACtD,MAAM,gBAAgB,IAAI,UAAU,QAAQ,qBAAqB,aAAa,OAAO,CAAC,UAAU,CAAC,CAAC,MAChG,yBACD;GACD,MAAM,sBAAsB,sBAAsB,UAAU,eAAe,8BAA8B;GACzG,MAAM,iBAAiB,SAAS,MAAM,oBAAoB;GAC1D,MAAM,kBAAkB,SAAS,KAAK,oBAAoB;AAE1D,UAAO,MACL;IACE,UAAU,SAAS,UAAU;IAC7B,qBAAqB,oBAAoB,UAAU;IACpD,EACD,gDACD;AAED,UAAO;IACL,eAAe;KACb,OAAO;KACP,YAAY;KACZ,aAAa;KACb,cAAc;KACf;IACD,eAAe;KACb,OAAO;KACP,YAAY;KACZ,aAAa;KACb,cAAc;KACf;IACD,WAAW,IAAI,UAAU,QAAQ,qBAAqB,mBAAmB;IAC1E;;EAEH,KAAK,YAAY;EACjB,KAAK,YAAY,uBAAuB;GACtC,MAAM,eAAe,8BAA8B,QAAQ;GAE3D,MAAM,WAAW,IAAI,UAAU,aAAa,OAAO,MAAM,UAAU,CAAC,CAAC,IACnE,MAAM,sCACP;GACD,MAAM,gBAAgB,IAAI,UAAU,aAAa,OAAO,QAAQ,UAAU,CAAC,CAAC,MAAM,yBAAyB;GAC3G,MAAM,sBAAsB,sBAAsB,UAAU,eAAe,8BAA8B;GACzG,MAAM,iBAAiB,SAAS,MAAM,oBAAoB;GAC1D,MAAM,kBAAkB,SAAS,KAAK,oBAAoB;AAE1D,UAAO,MACL;IACE,UAAU,SAAS,UAAU;IAC7B,qBAAqB,oBAAoB,UAAU;IACpD,EACD,8CACD;AAED,UAAO;IACL,eAAe;KACb,OAAO;KACP,YAAY;KACZ,aAAa;KACb,cAAc;KACf;IACD,eAAe;KACb,OAAO;KACP,YAAY;KACZ,aAAa;KACb,cAAc;KACf;IACD,WAAW,IAAI,UAAU,aAAa,sBAAsB,UAAU,CAAC;IACxE;;EAEH,KAAK,YAAY,OAAO;GACtB,MAAM,QAAQ,cAAc,UAAU,EAAE;GAExC,MAAM,mBAAgC;IACpC,eAAe;KACN;KACP,YAAY,UAAU,EAAE;KACxB,aAAa;KACb,cAAc;KACf;IACD,eAAe;KACN;KACP,YAAY,UAAU,EAAE;KACxB,aAAa;KACb,cAAc;KACf;IACD,WAAW,UAAU,KAAK,KAAK,CAAC;IACjC;AACD,UAAO;;EAET;AACE,WAAQ,MAAM,wBAAwB,YAAY;AAClD,SAAM,IAAI,MAAM,yBAAyB,YAAY,GAAG;;;;;;ACrR9D,SAAgB,iBAAiB,KAAkC;AACjE,QAAO;EACL,eAAe;GACb,OAAO,IAAI,UAAU,IAAI,cAAc,MAAM;GAC7C,YAAY,IAAI,UAAU,IAAI,cAAc,WAAW;GACvD,aAAa,IAAI,UAAU,IAAI,cAAc,YAAY;GACzD,cAAc,IAAI,UAAU,IAAI,cAAc,aAAa;GAC5D;EACD,eAAe;GACb,OAAO,IAAI,UAAU,IAAI,cAAc,MAAM;GAC7C,YAAY,IAAI,UAAU,IAAI,cAAc,WAAW;GACvD,aAAa,IAAI,UAAU,IAAI,cAAc,YAAY;GACzD,cAAc,IAAI,UAAU,IAAI,cAAc,aAAa;GAC5D;EACD,WAAW,IAAI,UAAU,IAAI,UAAU;EACvC,aAAa,IAAI;EAClB;;;;;;;;ACOH,MAAM,uBAAuB,UAAmD;CAE9E,MAAM,kBAAkB,MAAM,QAC3B,SAAS,KAAK,KAAK,OAAO,eAAe,gBAAgB,KAAK,KAAK,OAAO,YAC5E;CACD,MAAM,gBAAgB,MAAM,QACzB,SAAS,KAAK,KAAK,OAAO,eAAe,oBAAoB,KAAK,KAAK,OAAO,YAChF;CACD,MAAM,4BAA4B,MAAM,QACrC,SAAS,KAAK,KAAK,OAAO,eAAe,wBAAwB,KAAK,KAAK,OAAO,YACpF;AAED,QAAO;EAAE;EAAiB;EAAe;EAA2B;;;;;AAMtE,MAAM,sBAAsB,OAC1B,eACA,sBAC0F;CAC1F,MAAM,qBAAqB,MACzB,uCACE,cAAc,KAAK,SAAS,KAAK,KAAK,OAAO,WAAW,GAAG,UAAU,CAAC,CAAC,KAAK,IAAI,CACnF;CACD,MAAM,eAAe,mBAAmB,KAAK,UAAU,kBAAkB,CAAC;CAC1E,MAAM,0BAA0B,MAAM,oDAAoD,eAAe;CAEzG,MAAM,CAAC,qBAAqB,4BAA4B,MAAM,QAAQ,IAAI,CACxE,oBACA,wBACD,CAAC;AAEF,KAAI,CAAC,oBAAoB,IAAI;AAC3B,QAAM,IAAI,MAAM,gCAAgC;;AAElD,KAAI,CAAC,yBAAyB,IAAI;AAChC,QAAM,IAAI,MAAM,yCAAyC;;CAG3D,MAAM,kBAAuC,MAAM,oBAAoB,MAAM;CAC7E,MAAM,uBAA+C,MAAM,yBAAyB,MAAM;CAG1F,MAAM,cAAc,IAAI,KAAsD;AAC9E,QAAO,QAAQ,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,WAAW,eAAe;AACpF,cAAY,IAAI,QAAQ;GAAE,QAAQ,IAAI,UAAU,UAAU;GAAE;GAAS,CAAC;GACtE;AAEF,QAAO;EAAE;EAAa,kBAAkB;EAAsB;;;;;AAMhE,MAAM,sBAAsB,OAC1B,OACA,eAC0F;CAC1F,MAAM,cAAc,MAAM,eACxB,MAAM,KAAK,SAAS,KAAK,KAAK,OAAO,EACrC,WACD;CACD,MAAM,mBAAmB,EAAE;AAE3B,QAAO;EAAE;EAAa;EAAkB;;;;;AAM1C,MAAM,oCACJ,2BACA,iBACA,kBAC2B;CAC3B,MAAM,mBAA2C,EAAE;AAEnD,2BAA0B,SAAS,SAAS;EAC1C,MAAM,cAAc,gBAAgB,KAAK,QAAQ,UAAU,GAAG;AAC9D,MAAI,eAAe,cAAc,iBAAiB,WAAW;AAC3D,oBAAiB,KAAK,QAAQ,UAAU,IAAI,cAAc;;GAE5D;AAEF,QAAO;;;;;AAMT,MAAa,yBAAyB,cAAiE;CACrG,MAAM,OAAO,UACV,KAAK,SAAS,KAAK,KAAK,OAAO,WAAW,IAAI,UAAU,CAAC,CACzD,QAAQ,QAAuB,QAAQ,UAAU;AAEpD,QAAO,CAAC,GAAG,KAAK;;;;;AAMlB,MAAM,8BAA8B,OAAO,mBAAmE;CAC5G,MAAM,WAAW,MAAM,MAAM,+CAA+C,eAAe,KAAK,IAAI,GAAG;AAEvG,KAAI,CAAC,SAAS,IAAI;AAChB,QAAM,IAAI,MAAM,mCAAmC;;CAGrD,MAAM,eAAoC,MAAM,SAAS,MAAM;AAC/D,QAAO,OAAO,YACZ,OAAO,QAAQ,aAAa,CAAC,KAAK,CAAC,KAAK,iBAAiB,CACvD,KACA;EACE,eAAe;GACb,OAAO,UAAU,YAAY,cAAc,MAAM;GACjD,YAAY,UAAU,YAAY,cAAc,WAAW;GAC3D,aAAa,UAAU,YAAY,cAAc,YAAY;GAC7D,cAAc,UAAU,YAAY,cAAc,aAAa;GAChE;EACD,eAAe;GACb,OAAO,UAAU,YAAY,cAAc,MAAM;GACjD,YAAY,UAAU,YAAY,cAAc,WAAW;GAC3D,aAAa,UAAU,YAAY,cAAc,YAAY;GAC7D,cAAc,UAAU,YAAY,cAAc,aAAa;GAChE;EACD,WAAW,YAAY,YAAY,UAAU,YAAY,UAAU,GAAG;EACtE,aAAa,YAAY;EAC1B,CACF,CAAC,CACH;;;;;AAMH,MAAM,8BACJ,iBACA,eACA,2BACA,aACA,cACA,qBAC6B;CAC7B,MAAM,qBAAqB,IAAI,KAA0B;AAGzD,iBAAgB,SAAS,SAAS;EAChC,MAAM,YAAY,KAAK,KAAK,OAAO,WAAW,GAAG,UAAU;EAC3D,MAAM,cAAc,aAAa;AACjC,MAAI,aAAa;AACf,sBAAmB,IAAI,KAAK,QAAQ,UAAU,EAAE,YAAY;;GAE9D;AAGF,eAAc,SAAS,SAAS;EAC9B,MAAM,OAAO,YAAY,IAAI,KAAK,KAAK,OAAO,WAAW,GAAG,UAAU,CAAC,SAAS,MAAM,CAAC;AACvF,MAAI,MAAM;GACR,MAAM,cAAc,aAAa,KAAK,OAAO,UAAU;AACvD,OAAI,aAAa;AACf,uBAAmB,IAAI,KAAK,QAAQ,UAAU,EAAE,YAAY;;;GAGhE;AAGF,2BAA0B,SAAS,SAAS;EAC1C,MAAM,aAAa,iBAAiB,KAAK,QAAQ,UAAU;EAC3D,MAAM,YAAY,KAAK,KAAK,OAAO,WAAW,GAAG,UAAU;AAE3D,MAAI,aAAa,eAAe,WAAW;GACzC,MAAM,cAAc,aAAa;AACjC,OAAI,aAAa;AACf,uBAAmB,IAAI,KAAK,QAAQ,UAAU,EAAE;KAC9C,WAAW,YAAY;KACvB,eAAe,qBAAqB,YAAY,eAAe,WAAW;KAC1E,eAAe,qBAAqB,YAAY,eAAe,WAAW;KAC3E,CAAC;;;GAGN;AAEF,QAAO;;AAGT,MAAa,sBAAsB,OACjC,OACA,iBAGA,YACA,SAII;CAEJ,MAAM,EAAE,iBAAiB,eAAe,8BAA8B,oBAAoB,MAAM;CAGhG,MAAM,oBAAwC,0BAA0B,KAAK,SAAS,CACpF,gBAAgB,KAAK,QAAQ,UAAU,GAAG,wBAAwB,IAClE,KAAK,KAAK,MAAM,UAAU,IAAI,GAC/B,CAAC;CAGF,IAAI;CACJ,IAAI;AAEJ,KAAI,MAAM,kBAAkB,CAAC,YAAY;EACvC,MAAM,EAAE,aAAa,SAAS,kBAAkB,kBAAkB,MAAM,oBACtE,eACA,kBACD;AACD,gBAAc;AACd,qBAAmB,iCAAiC,2BAA2B,iBAAiB,cAAc;QACzG;EACL,MAAM,SAAS,MAAM,oBAAoB,OAAO,WAAW;AAC3D,gBAAc,OAAO;AACrB,qBAAmB,OAAO;;CAI5B,MAAM,iBAAiB,sBAAsB,CAAC,GAAG,iBAAiB,GAAG,cAAc,CAAC;CAGpF,IAAI;AACJ,KAAI,MAAM,gBAAgB;AACxB,iBAAe,MAAM,4BAA4B,eAAe;QAC3D;AAEL,iBAAe,EAAE;;CAInB,MAAM,qBAAqB,2BACzB,iBACA,eACA,2BACA,aACA,cACA,iBACD;AAED,QAAO;EACL;EACA;EACD;;AAGH,MAAM,wBAAwB,gBAAqC,gBAAwB;CACzF,OAAO,eAAe,MAAM,aAAa,WAAW;CACpD,YAAY,eAAe;CAC3B,aAAa,eAAe,YAAY,aAAa,WAAW;CAChE,cAAc,eAAe,aAAa,aAAa,WAAW;CACnE;;;;;;;;AAUD,MAAa,qBAAqB,OAChC,OACA,SAGI;CAEJ,MAAM,mBAAmB,MAAM,QAC5B,SACC,KAAK,KAAK,OAAO,gBAChB,qBAAqB,KAAK,KAAK,OAAO,eAAe,mBAAmB,KAAK,KAAK,OAAO,aAC7F;CAED,IAAI;AAEJ,KAAI,MAAM,gBAAgB;EACxB,MAAM,EAAE,cAAc,oBAAoB,MAAM,mBAAmB,iBAAiB;AACpF,iBAAe;QACV;AACL,iBAAe,EAAE;;CAInB,MAAM,aAAa,OAAO,OAAO,aAAa,CAAC,KAAK,cAAc,UAAU,OAAO;CAGnF,IAAI;AACJ,KAAI,MAAM,gBAAgB;AACxB,iBAAe,MAAM,2BAA2B,WAAW;QACtD;AAEL,iBAAe,EAAE;;CAInB,MAAM,qBAAqB,0BAA0B,kBAAkB,cAAc,aAAa;AAElG,QAAO,EACL,oBACD;;;;;AAMH,MAAM,qBAAqB,OACzB,iBACkE;CAClE,MAAM,0BAA0B,MAAM,MACpC,2CACE,aAAa,KAAK,SAAS,KAAK,KAAK,OAAO,WAAW,GAAG,UAAU,CAAC,CAAC,KAAK,IAAI,CAClF;AAED,KAAI,CAAC,wBAAwB,IAAI;AAC/B,QAAM,IAAI,MAAM,qCAAqC;;CAGvD,MAAM,sBAA0D,MAAM,wBAAwB,MAAM;AAEpG,QAAO,EAAE,cAAc,qBAAqB;;AAG9C,MAAM,6BAA6B,OAAO,eAA+D;CACvG,MAAM,WAAW,MAAM,MAAM,uCAAuC,WAAW,KAAK,IAAI,GAAG;AAE3F,KAAI,CAAC,SAAS,IAAI;AAChB,QAAM,IAAI,MAAM,kCAAkC;;CAGpD,MAAM,eAAoC,MAAM,SAAS,MAAM;AAC/D,QAAO,OAAO,YACZ,OAAO,QAAQ,aAAa,CAAC,KAAK,CAAC,KAAK,iBAAiB,CACvD,KACA;EACE,eAAe;GACb,OAAO,UAAU,YAAY,cAAc,MAAM;GACjD,YAAY,UAAU,YAAY,cAAc,WAAW;GAC3D,aAAa,UAAU,YAAY,cAAc,YAAY;GAC7D,cAAc,UAAU,YAAY,cAAc,aAAa;GAChE;EACD,eAAe;GACb,OAAO,UAAU,YAAY,cAAc,MAAM;GACjD,YAAY,UAAU,YAAY,cAAc,WAAW;GAC3D,aAAa,UAAU,YAAY,cAAc,YAAY;GAC7D,cAAc,UAAU,YAAY,cAAc,aAAa;GAChE;EACD,WAAW,YAAY,YAAY,UAAU,YAAY,UAAU,GAAG;EACvE,CACF,CAAC,CACH;;;;;AAMH,MAAM,6BACJ,OACA,cACA,iBAC6B;CAC7B,MAAM,qBAAqB,IAAI,KAA0B;AAGzD,OAAM,SAAS,SAAS;EACtB,MAAM,YAAY,KAAK,KAAK,OAAO,WAAW,GAAG,UAAU;EAC3D,MAAM,aAAa,aAAa;EAChC,MAAM,cAAc,YAAY,SAAS,aAAa,WAAW,UAAU;AAC3E,MAAI,aAAa;AACf,sBAAmB,IAAI,KAAK,QAAQ,UAAU,EAAE,YAAY;;GAE9D;AAEF,QAAO;;;;;;;;;AAWT,MAAa,kBAAkB,OAC7B,OACA,iBAGA,YACA,SAII;CACJ,MAAM,CAAC,UAAU,WAAW,MAAM,QAAQ,IAAI,CAC5C,oBAAoB,OAAO,iBAAiB,YAAY,KAAK,EAC7D,mBAAmB,OAAO,KAAK,CAChC,CAAC;CAEF,MAAM,qBAAqB,IAAI,KAA0B;AAGzD,UAAS,mBAAmB,SAAS,aAAa,gBAAgB;AAChE,qBAAmB,IAAI,aAAa,YAAY;GAChD;AAGF,SAAQ,mBAAmB,SAAS,aAAa,gBAAgB;AAC/D,qBAAmB,IAAI,aAAa,YAAY;GAChD;AAGF,OAAM,SAAS,SAAS;AACtB,MAAI,CAAC,mBAAmB,IAAI,KAAK,QAAQ,UAAU,CAAC,EAAE;AACpD,WAAQ,MAAM,QAAQ,KAAK,QAAQ,UAAU,CAAC,6BAA6B;AAE3E,sBAAmB,IAAI,KAAK,QAAQ,UAAU,EAAE;IAC9C,eAAe;KACb,OAAO,UAAU,EAAE;KACnB,YAAY,UAAU,EAAE;KACxB,aAAa,UAAU,EAAE;KACzB,cAAc,UAAU,EAAE;KAC3B;IACD,eAAe;KACb,OAAO,UAAU,EAAE;KACnB,YAAY,UAAU,EAAE;KACxB,aAAa,UAAU,EAAE;KACzB,cAAc,UAAU,EAAE;KAC3B;IACD,WAAW,UAAU,EAAE;IACxB,CAAC;;GAEJ;AAEF,QAAO;EACL;EACA,aAAa,SAAS;EACvB;;;;;ACrdH,SAAgB,iBAAiB,aAA0C;AACzE,QAAO;EACL,eAAe;GACb,OAAO,YAAY,cAAc,MAAM,UAAU;GACjD,YAAY,YAAY,cAAc,WAAW,UAAU;GAC3D,aAAa,YAAY,cAAc,YAAY,UAAU;GAC7D,cAAc,YAAY,cAAc,aAAa,UAAU;GAChE;EACD,eAAe;GACb,OAAO,YAAY,cAAc,MAAM,UAAU;GACjD,YAAY,YAAY,cAAc,WAAW,UAAU;GAC3D,aAAa,YAAY,cAAc,YAAY,UAAU;GAC7D,cAAc,YAAY,cAAc,aAAa,UAAU;GAChE;EACD,WAAW,YAAY,UAAU,UAAU;EAC3C,aAAa,YAAY;EAC1B;;;;;ACXH,SAAgB,mBACd,aACA,YACA,MACsC;CACtC,MAAM,kBAAkB,MAAM,mBAAmB,YAAY,OAAO;CACpE,MAAM,sBAAsB,MAAM,uBAAuB,WAAW,OAAO;CAE3E,MAAM,MAAM,gBAAgB,IAAI,oBAAoB,CAAC,UAAU;CAC/D,MAAM,cAAc,KAAK,IAAI;AAE7B,QAAO;EACL;EACA;EACD;;AAGH,SAAgB,qBACd,WACA,gBACA,aACA,YACA,mBACA,kBAC4D;CAC5D,MAAM,oBAAoB,YAAY,UAAU;CAChD,MAAM,EAAE,gBAAgB,mBAAmB,aAAa,WAAW;AAEnE,KAAI,iBAAiB,GAAG;AACtB,QAAM,MAAM,mBAAmB,eAAe,6BAA6B;;AAG7E,KAAI,iBAAiB,aAAa;AAChC,QAAM,MAAM,mBAAmB,eAAe,kCAAkC,cAAc;;CAGhG,MAAM,qBAAqB,kBAAkB,MAAM,IAAI,UAAU,eAAe,CAAC;CACjF,MAAM,0BAA0B,mBAAmB,MAAM,kBAAkB;CAC3E,MAAM,eAAe,wBAClB,MAAM,kBAAkB,cAAc,YAAY,CAClD,IAAI,iBAAiB,cAAc,aAAa;AAEnD,QAAO;EAAE;EAAc;EAAoB;;;AAK7C,SAAgB,sBAAsB,MAA2B;AAC/D,QAAO,KAAK,iBAAiB,MAAM,KAAK,gBAAgB;;AAG1D,SAAgB,0BAA0B,MAA2B;AACnE,QAAO,KAAK,qBAAqB,MAAM,KAAK,oBAAoB;;AAGlE,SAAgB,iBAAiB,MAAgB,aAAmC;AAClF,QAAO,YAAY,MAAM,KAAK,gBAAgB;;AAGhD,SAAgB,qBAAqB,MAAgB,iBAAuC;AAC1F,QAAO,gBAAgB,MAAM,KAAK,oBAAoB;;AAGxD,SAAgB,eAAe,MAAgB,eAAqC;AAClF,QAAO,cAAc,MAAM,KAAK,gBAAgB;;AAGlD,SAAgB,mBAAmB,MAAgB,mBAAyC;AAC1F,QAAO,kBAAkB,MAAM,KAAK,oBAAoB;;AAG1D,SAAgB,eACd,MACA,sBACA,aACA,MAIW;CACX,MAAM,kBAAkB,MAAM,2BAA2B,KAAK,OAAO;AAErE,SAAQ,sBAAR;EACE,KAAK,qBAAqB,SAAS;GACjC,MAAM,sBAAsB,KAAK,OAAO,yBAAyB,QAAQ;AACzE,OAAI,MAAM,oBAAoB,oBAAqB,QAAO;GAC1D,MAAM,2BAA2B,qBAC/B,MACA,aACA,KAAK,kBACL,qBAAqB,QACrB,UAAU,OACX;AACD,OAAI,yBAAyB,cAAc,KAAK,OAAO,yBAAyB,EAAE;AAChF,WAAO,KAAK,OAAO,yBAAyB,IAAI,yBAAyB,CAAC,MAAM,gBAAgB;UAC3F;AACL,WAAO;;;EAGX,KAAK,qBAAqB,YACxB,QAAO,KAAK,OAAO;EACrB,KAAK,qBAAqB,OACxB,QAAO,IAAI,UAAU,EAAE;EACzB,QACE,OAAM,IAAI,MAAM,iCAAiC;;;AAIvD,SAAgB,mBAAmB,QAAwB,sBAAuD;AAChH,SAAQ,sBAAR;EACE,KAAK,qBAAqB,QACxB,QAAO,OAAO;EAChB,KAAK,qBAAqB,YACxB,QAAO,OAAO;EAChB,KAAK,qBAAqB,OACxB,QAAO,IAAI,UAAU,EAAE;EACzB,QACE,OAAM,IAAI,MAAM,iCAAiC;;;;AAMvD,SAAgB,yBACd,MACA,aACA,iBACA,sBACA,WACW;CACX,MAAM,oBAAoB,qBAAqB,MAAM,gBAAgB;CACrE,MAAM,kBAAkB,mBAAmB,KAAK,QAAQ,qBAAqB;CAC7E,MAAM,aAAa,gBAAgB,qBAAqB;AACxD,QAAO,gBAAgB,MAAM,aAAa,mBAAmB,WAAW,YAAY,gBAAgB;;AAGtG,SAAgB,qBACd,MACA,aACA,aACA,sBACA,WACW;CACX,MAAM,gBAAgB,iBAAiB,MAAM,YAAY;CACzD,MAAM,cAAc,eAAe,MAAM,sBAAsB,YAAY;CAC3E,MAAM,aAAa,gBAAgB,qBAAqB;AACxD,QAAO,gBAAgB,MAAM,aAAa,eAAe,WAAW,YAAY,YAAY;;AAG9F,SAAgB,gBACd,MACA,aACA,UACA,WACA,eACA,QACA,cAAuB,MACZ;CACX,MAAM,QAAQ,SAAS,aAAa,WAAW,cAAc;AAC7D,QAAO,SACJ,MAAM,MAAM,CACZ,MAAM,UAAU,EAAE,CAClB,UAAU,cAAc,MAAM,KAAK,eAAe,EAAE;;AAGzD,SAAgB,WAAW,MAAgB,aAAqC;AAC9E,QAAO,qBACL,MACA,aACA,KAAK,kBACL,qBAAqB,QACrB,UAAU,KACX,CAAC,MACA,yBAAyB,MAAM,aAAa,KAAK,sBAAsB,qBAAqB,QAAQ,UAAU,KAAK,CACpH;;AAGH,SAAgB,qBAAqB,MAGnC;CACA,MAAM,EAAE,sBAAsB,gBAAgB,qBAAqB,kBAAkB,KAAK,OAAO;CAEjG,MAAM,WAAW,qBAAqB,KAAK,oBAAoB;CAC/D,MAAM,UAAU,eAAe,KAAK,cAAc;CAElD,MAAM,mBAAmB,wBAAwB,KAAK;CACtD,MAAM,kBAAkB,uBAAuB,KAAK;CAEpD,MAAM,cAAc,iBAAiB,MAAM,gBAAgB;CAC3D,MAAM,gBAAgB,iBAAiB,MAAM,IAAI,UAAU,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,SAAS;AAE3F,QAAO;EAAE;EAAa;EAAe;;;;;AAMvC,MAAM,UAAU;;;;;;AAOhB,SAAS,YAAY,MAAyB;CAC5C,MAAM,QAAQ,IAAI,UAAU,KAAK,CAAC,IAAI,QAAQ;AAC9C,QAAO,MAAM,MAAM,GAAG;;;;;;;AAQxB,SAAS,YAAY,MAAyB;AAC5C,QAAO,IAAI,UAAU,KAAK,CAAC,IAAI,QAAQ;;;;;;AAOzC,SAAS,2BACP,QACA,QACA,MACA,MACA,SACW;AAEX,KAAI,KAAK,IAAI,OAAO,CAAE,QAAO;AAC7B,KAAI,QAAQ,GAAG,OAAO,CAAE,QAAO;AAC/B,KAAI,QAAQ,GAAG,KAAK,CAAE,QAAO;AAE7B,KAAI,KAAK,GAAG,OAAO,CAAE,QAAO;CAE5B,MAAM,SAAS,KAAK,MAAM,OAAO;AACjC,KAAI,OAAO,QAAQ,CAAE,QAAO;CAG5B,MAAM,SAAS,QAAQ,MAAM,OAAO;CACpC,MAAM,aAAa,OAAO,IAAI,OAAO;CACrC,MAAM,SAAS,KAAK,MAAM,OAAO;CACjC,MAAM,cAAc,OAAO,MAAM,WAAW;AAE5C,QAAO,OAAO,KAAK,YAAY;;;;;AAMjC,SAAS,mBACP,iBACA,wBACA,qBACA,iBACW;AACX,KAAI,gBAAgB,IAAI,uBAAuB,EAAE;AAC/C,SAAO,gBAAgB,MAAM,oBAAoB,CAAC,IAAI,uBAAuB;QACxE;AACL,SAAO,gBACJ,MAAM,uBAAuB,CAC7B,IAAI,IAAI,UAAU,EAAE,CAAC,MAAM,uBAAuB,CAAC,CACnD,MAAM,gBAAgB,MAAM,oBAAoB,CAAC,CACjD,KAAK,oBAAoB;;;;;;;;;;AAWhC,SAAS,uBACP,iBACA,cACA,iBACA,QACW;CACX,MAAM,WAAW,YAAY,aAAa;CAC1C,MAAM,cAAc,YAAY,gBAAgB;CAGhD,MAAM,yBAAyB,UAAU,IAAI,GAAG,UAAU,IAAI,GAAG,gBAAgB,CAAC;CAIlF,MAAM,mBAAmB,OAAO,QAAQ,UAAU,MAAM,SAAS,EAAE;CAGnE,IAAI,WAAW,IAAI,UAAU,EAAE;CAC/B,IAAI,WAAW;AAGf,MAAK,MAAM,SAAS,kBAAkB;EACpC,MAAM,YAAY,YAAY,MAAM,KAAK;EACzC,MAAM,YAAY,YAAY,MAAM,KAAK;AAIzC,MAAI,uBAAuB,IAAI,UAAU,EAAE;AACzC,UAAO,2BAA2B,UAAU,UAAU,WAAW,WAAW,uBAAuB;;AAIrG,aAAW;AACX,aAAW;;AAIb,QAAO,2BAA2B,UAAU,UAAU,IAAI,UAAU,EAAE,EAAE,aAAa,uBAAuB;;AAG9G,SAAgB,wBAAwB,MAA2B;CACjE,MAAM,qBAAqB,KAAK,OAAO;CACvC,MAAM,kBAAkB,uBAAuB,KAAK;CACpD,MAAM,YAAY,mBAAmB;AAGrC,KAAI,cAAc,GAAG;AACnB,SAAO,uBACL,iBACA,mBAAmB,cACnB,mBAAmB,iBACnB,mBAAmB,OACpB;QACI;AAEL,SAAO,mBACL,iBACA,mBAAmB,wBACnB,mBAAmB,qBACnB,mBAAmB,gBACpB;;;AAIL,SAAgB,uBAAuB,MAA2B;CAChE,MAAM,SAAS,sBAAsB,KAAK;CAC1C,MAAM,cAAc,0BAA0B,KAAK;AACnD,KAAI,OAAO,QAAQ,CAAE,QAAO,IAAI,UAAU,EAAE;AAC5C,QAAO,YAAY,IAAI,OAAO;;AAGhC,MAAMC,oBAAkB,KAAK,KAAK;AAClC,MAAM,mBAAmBA,oBAAkB;AAE3C,SAAgB,yBAAyB,MAGvC;CACA,MAAM,gBAAgB,sBAAsB,KAAK;CACjD,MAAM,oBAAoB,UAAU,IAAI,GAAG,KAAK,OAAO,aAAa,MAAM,cAAc,CAAC;CAEzF,MAAM,eAAe,0BAA0B,KAAK;CACpD,MAAM,0BAA0B,UAAU,IAAI,GAAG,KAAK,OAAO,YAAY,MAAM,aAAa,CAAC;CAE7F,MAAM,2BAA2B,KAAK,KAAK,GAAG,MAAO,KAAK;CAE1D,MAAM,EAAE,aAAa,kBAAkB,qBAAqB,KAAK;CAEjE,MAAM,6BAA6B,YAChC,MAAM,yBAAyB,CAC/B,UAAU,iBAAiB,CAC3B,MAAM,cAAc;CACvB,MAAM,4BAA4B,cAC/B,MAAM,yBAAyB,CAC/B,UAAU,iBAAiB,CAC3B,MAAM,aAAa;CAEtB,MAAM,kBAAkB,kBAAkB,MAAM,2BAA2B,MAAM,EAAE,CAAC;CACpF,MAAM,iBAAiB,wBAAwB,MAAM,0BAA0B,MAAM,EAAE,CAAC;AAExF,QAAO;EACL;EACA;EACD;;;;;AC3XH,MAAa,qBAAqB,OAChC,SACA,SACqD;CACrD,IAAI,YAAqD,EAAE;AAE3D,KAAI,MAAM,iBAAiB,KAAK,cAAc,SAAS,GAAG;EACxD,MAAM,YAAY,KAAK;EACvB,MAAM,OAAO,MAAM,QAAQ,QAAQ,KAAK,cAAc,UAAU;AAEhE,OAAK,SAAS,GAAG,QAAQ;AACvB,OAAI,GAAG;AACL,cAAU,KAAK;KAAE,SAAS,IAAI,UAAU,UAAU,KAAK;KAAE,MAAM;KAAG,CAAC;UAC9D;AACL,YAAQ,MAAM,QAAQ,UAAU,KAAK,YAAY;;IAEnD;QACG;EACL,MAAM,WAAW,MAAM,eACnB,CAAC,EAAE,QAAQ;GAAE,QAAQ,IAAI,KAAK;GAAG,OAAO,KAAK,aAAa,UAAU;GAAE,EAAE,CAAC,GACzE,EAAE;EACN,MAAM,OAAO,MAAM,QAAQ,QAAQ,KAAK,IAAI,SAAS;AACrD,cAAY,KAAK,KAAK,OAAO;GAAE,SAAS,EAAE;GAAW,MAAM,EAAE;GAAS,EAAE;;AAG1E,QAAO;;;;;ACDT,SAAS,uBAAuB,eAAgD;CAC9E,MAAM,mBAAmB,UAA4B,SAAS,yBAAyB,MAAM;CAC7F,MAAM,QAAQ,UAA4B,SAAS,IAAIC,KAAG,MAAM,UAAU,CAAC;AAE3E,QAAO;EACL,iBAAiB,gBAAgB,cAAc,gBAAgB;EAC/D,kBAAkB,gBAAgB,cAAc,iBAAiB;EACjE,qBAAqB,gBAAgB,cAAc,oBAAoB;EACvE,sBAAsB,gBAAgB,cAAc,qBAAqB;EACzE,cAAc,KAAK,cAAc,aAAa;EAC9C,aAAa,KAAK,cAAc,YAAY;EAC5C,UAAU,cAAc,YAAY,kBAAkB,cAAc,SAAS;EAC7E,0BAA0B,KAAK,cAAc,yBAAyB;EACtE,UAAU,cAAc,aAAa,OAAO,OAAO,cAAc,SAAS,GAAG;EAC7E,oBACE,cAAc,sBACb;GACC,sBAAsB,gBAAgB,cAAc,mBAAmB,qBAAqB;GAC5F,iBAAiB,gBAAgB,cAAc,mBAAmB,gBAAgB;GAClF,gBAAgB,gBAAgB,cAAc,mBAAmB,eAAe;GAChF,wBAAwB,gBAAgB,cAAc,mBAAmB,uBAAuB;GAChG,qBAAqB,gBAAgB,cAAc,mBAAmB,oBAAoB;GAC1F,qBAAqB,gBAAgB,cAAc,mBAAmB,oBAAoB;GAC1F,eAAe,gBAAgB,cAAc,mBAAmB,cAAc;GAC9E,wBAAwB,gBAAgB,cAAc,mBAAmB,uBAAuB;GAChG,cAAc,cAAc,mBAAmB;GAC/C,iBAAiB,cAAc,mBAAmB;GAClD,QAAQ,cAAc,mBAAmB;GAC1C;EACH,kBAAkB,cAAc,oBAAoB,0BAA0B,cAAc,iBAAiB;EAC7G,cAAc,cAAc;EAC5B,iCAAiC,cAAc;EAC/C,gBAAgB;EAChB,4BAA4B,cAAc;EAC1C,qBAAqB,cAAc;EACpC;;AAGH,SAAS,4BAA4B,oBAA+D;AAClG,QAAO;EACL,wBAAwB,yBAAyB,mBAAmB,uBAAuB;EAC3F,qBAAqB,yBAAyB,mBAAmB,oBAAoB;EACrF,iBAAiB,yBAAyB,mBAAmB,gBAAgB;EAE7E,sBAAsB,yBAAyB,mBAAmB,qBAAqB;EACvF,gBAAgB,yBAAyB,mBAAmB,eAAe;EAC3E,qBAAqB,yBAAyB,mBAAmB,oBAAoB;EACrF,eAAe,yBAAyB,mBAAmB,cAAc;EACzE,wBAAwB,yBAAyB,mBAAmB,uBAAuB;EAC3F,cAAc,mBAAmB;EACjC,iBAAiB,mBAAmB;EACpC,QAAQ,mBAAmB;EAC3B,WAAW,mBAAmB;EAC/B;;AAGH,SAAS,kBAAkB,UAAiC;AAC1D,SAAQ,UAAR;EACE,KAAK,SAAS,WACZ,QAAO,EAAE,YAAY,EAAE,EAAE;EAC3B,KAAK,SAAS,SACZ,QAAO,EAAE,UAAU,EAAE,EAAE;EACzB,QACE,OAAM,IAAI,MAAM,sBAAsB,SAAS,GAAG;;;AAIxD,SAAS,0BACP,kBAC2D;AAC3D,SAAQ,kBAAR;EACE,KAAK,iBAAiB,OACpB,QAAO,EAAE,QAAQ,EAAE,EAAE;EACvB,KAAK,iBAAiB,YACpB,QAAO,EAAE,aAAa,EAAE,EAAE;EAC5B,KAAK,iBAAiB,WACpB,QAAO,EAAE,YAAY,EAAE,EAAE;EAC3B,QACE,OAAM,IAAI,MAAM,8BAA8B,iBAAiB,GAAG;;;AAIxE,SAAS,4BAA4B,aAAkC;AACrE,SAAQ,aAAR;EACE,KAAK,YAAY,KACf,QAAO;EACT,KAAK,YAAY,WACf,QAAO;EACT,KAAK,YAAY,cACf,QAAO;EACT,KAAK,YAAY,eACf,QAAO;EACT,KAAK,YAAY,gBACf,QAAO;EACT,KAAK,YAAY,mBACf,QAAO;EACT,KAAK,YAAY,eACf,QAAO;EACT,KAAK,YAAY,sBACf,QAAO;EACT,KAAK,YAAY,MACf,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,qBAAqB,aAA0C;AACtE,SAAQ,aAAR;EACE,KAAK,YAAY,KACf,QAAO,EAAE,MAAM,EAAE,EAAE;EACrB,KAAK,YAAY,WACf,QAAO,EAAE,YAAY,EAAE,EAAE;EAC3B,KAAK,YAAY,cACf,QAAO,EAAE,eAAe,EAAE,EAAE;EAC9B,KAAK,YAAY,eACf,QAAO,EAAE,gBAAgB,EAAE,EAAE;EAC/B,KAAK,YAAY,gBACf,QAAO,EAAE,iBAAiB,EAAE,EAAE;EAChC,KAAK,YAAY,mBACf,QAAO,EAAE,oBAAoB,EAAE,EAAE;EACnC,KAAK,YAAY,eACf,QAAO,EAAE,gBAAgB,EAAE,EAAE;EAC/B,KAAK,YAAY,sBACf,QAAO,EAAE,uBAAuB,EAAE,EAAE;EACtC,KAAK,YAAY,MACf,QAAO,EAAE,OAAO,EAAE,EAAE;EACtB,QACE,OAAM,IAAI,MAAM,yBAAyB,YAAY,GAAG;;;AAI9D,SAAS,UAAU,MAA6B;AAC9C,QAAO;EACL,SAAS,KAAK,QAAQ,UAAU;EAChC,OAAO,KAAK,MAAM,UAAU;EAC5B,MAAM,KAAK,KAAK,UAAU;EAC1B,cAAc,KAAK;EACnB,iBAAiB,KAAK,gBAAgB,UAAU;EAChD,qBAAqB,KAAK,oBAAoB,UAAU;EACxD,gBAAgB,KAAK,eAAe,UAAU;EAC9C,oBAAoB,KAAK;EACzB,6BAA6B,KAAK;EAClC,gBAAgB,KAAK,eAAe,UAAU;EAC9C,oBAAoB,KAAK;EACzB,6BAA6B,KAAK;EAClC,mCAAmC,KAAK,kCAAkC,UAAU;EACpF,UAAU,KAAK,SAAS,UAAU;EAClC,cAAc,KAAK;EACnB,uBAAuB,KAAK;EAC5B,+BAA+B,KAAK,8BAA8B,UAAU;EAC5E,YAAY,KAAK;EACjB,QAAQ,gBAAgB,KAAK,OAAO;EACpC,kBAAkB,KAAK,iBAAiB,UAAU;EAClD,sBAAsB,KAAK,qBAAqB,UAAU;EAC1D,0BAA0B,KAAK;EAC/B,wBAAwB,KAAK;EAC7B,eAAe,KAAK;EACpB,eAAe,KAAK,cAAc,UAAU;EAC5C,oBAAoB,KAAK,mBAAmB,UAAU;EACtD,WAAW,KAAK,UAAU,UAAU;EACpC,aAAa,KAAK;EAClB,OAAO,mBAAmB,KAAK,MAAM;EACrC,aAAa,KAAK;EAClB,wBAAwB,KAAK,wBAAwB,UAAU;EAC/D,sBAAsB,KAAK,sBAAsB,UAAU;EAC3D,wBAAwB,KAAK,wBAAwB,UAAU;EAChE;;AAGH,SAAS,mBAAmB,eAAoD;AAC9E,QAAO;EACL,UAAU,cAAc;EACxB,WAAW,cAAc;EACzB,OAAO,cAAc;EACrB,cAAc,cAAc,aAAa,KAAK,UAAU;AACtD,UAAO;IACL,wBAAwB,MAAM;IAC9B,OAAO,MAAM;IACb,iBAAiB,MAAM,gBAAgB,UAAU;IACjD,kBAAkB,MAAM,iBAAiB,UAAU;IACpD;IACD;EACH;;AAGH,SAAS,gBAAgB,YAA2C;AAClE,QAAO;EACL,iBAAiB,WAAW,gBAAgB,UAAU;EACtD,kBAAkB,WAAW,iBAAiB,UAAU;EACxD,qBAAqB,WAAW,oBAAoB,UAAU;EAC9D,sBAAsB,WAAW,qBAAqB,UAAU;EAChE,cAAc,WAAW,aAAa,UAAU;EAChD,aAAa,WAAW,YAAY,UAAU;EAC9C,UAAU,WAAW;EACrB,kBAAkB,WAAW;EAC7B,0BAA0B,WAAW,yBAAyB,UAAU;EACxE,UAAU,WAAW;EACrB,aAAa,WAAW;EACxB,YAAY,WAAW,WAAW,KAAK,QAAQ,IAAI,UAAU,CAAC;EAC9D,cAAc,WAAW;EACzB,oBAAoB,wBAAwB,WAAW,mBAAmB;EAC1E,aAAa,WAAW;EACxB,qBAAqB,WAAW;EAChC,YAAY,WAAW,WAAW,UAAU;EAC7C;;AAGH,SAAS,wBAAwB,oBAA+D;AAC9F,QAAO;EACL,wBAAwB,mBAAmB,uBAAuB,UAAU;EAC5E,qBAAqB,mBAAmB,oBAAoB,UAAU;EACtE,iBAAiB,mBAAmB,gBAAgB,UAAU;EAC9D,sBAAsB,mBAAmB,qBAAqB,UAAU;EACxE,gBAAgB,mBAAmB,eAAe,UAAU;EAC5D,qBAAqB,mBAAmB,oBAAoB,UAAU;EACtE,eAAe,mBAAmB,cAAc,UAAU;EAC1D,wBAAwB,mBAAmB,uBAAuB,UAAU;EAC5E,cAAc,mBAAmB;EACjC,iBAAiB,mBAAmB;EACpC,QAAQ,mBAAmB;EAC3B,WAAW,mBAAmB;EAC/B;;AAGH,SAAgB,0BAA0B,QAAuC;AAC/E,QAAO;EACL,iBAAiB,yBAAyB,OAAO,gBAAgB;EACjE,kBAAkB,yBAAyB,OAAO,iBAAiB;EACnE,qBAAqB,yBAAyB,OAAO,oBAAoB;EACzE,sBAAsB,yBAAyB,OAAO,qBAAqB;EAC3E,cAAc,IAAIA,KAAG,OAAO,aAAa,UAAU,CAAC;EACpD,oBAAoB,4BAA4B,OAAO,mBAAmB;EAC1E,kBAAkB,0BAA0B,OAAO,iBAAiB;EACpE,aAAa,qBAAqB,OAAO,YAAY;EACrD,YAAY,OAAO;EACnB,aAAa,OAAO;EACpB,aAAa,IAAIA,KAAG,OAAO,YAAY,UAAU,CAAC;EAClD,UAAU,kBAAkB,OAAO,SAAS;EAC5C,UAAU,OAAO;EACjB,0BAA0B,IAAIA,KAAG,OAAO,yBAAyB,UAAU,CAAC;EAC5E,cAAc,OAAO;EACrB,qBAAqB,OAAO;EAC5B,YAAY,yBAAyB,OAAO,WAAW;EACxD;;AAGH,SAAgB,aAAa,SAA8B;AACzD,QAAO;EACL,OAAO,QAAQ,MAAM,UAAU;EAC/B,MAAM,QAAQ,KAAK,UAAU;EAC7B,cAAc,QAAQ;EAEtB,iBAAiB,QAAQ;EACzB,qBAAqB,QAAQ;EAE7B,gBAAgB,QAAQ,eAAe,UAAU;EACjD,oBAAoB,QAAQ;EAC5B,6BAA6B,QAAQ;EAErC,gBAAgB,QAAQ,eAAe,UAAU;EACjD,oBAAoB,QAAQ;EAC5B,6BAA6B,QAAQ;EACrC,mCAAmC,QAAQ;EAE3C,UAAU,QAAQ,SAAS,UAAU;EACrC,cAAc,QAAQ;EACtB,uBAAuB,QAAQ;EAC/B,+BAA+B,QAAQ;EAEvC,YAAY,QAAQ,WAAW,UAAU;EAEzC,QAAQ,mBAAmB,QAAQ,OAAO;EAE1C,kBAAkB,QAAQ;EAC1B,sBAAsB,QAAQ;EAE9B,OAAO,QAAQ,MAAM,UAAU;EAC/B,eAAe,QAAQ,cAAc,UAAU;EAC/C,oBAAoB,QAAQ;EAC5B,eAAe,QAAQ,cAAc,UAAU;EAC/C,wBAAwB,SAAS,wBAAwB,UAAU;EACnE,sBAAsB,SAAS,sBAAsB,UAAU;EAC/D,wBAAwB,SAAS,wBAAwB,UAAU;EAEnE,OAAO,sBAAsB,QAAQ,MAAM;EAC5C;;AAGH,SAAgB,sBAAsB,kBAAyD;AAC7F,QAAO;EACL,UAAU,iBAAiB;EAC3B,WAAW,iBAAiB,UAAU,UAAU;EAChD,OAAO,iBAAiB,MAAM,UAAU;EACxC,aAAa,EACX,SAAS,iBAAiB,YAAY,QAAQ,KAAK,UAAU;AAC3D,UAAO;IACL,wBAAwB,MAAM;IAC9B,OAAO,MAAM;IACb,iBAAiB,MAAM;IACvB,kBAAkB,MAAM;IACzB;IACD,EACH;EACF;;AAGH,SAAgB,mBAAmB,eAAgD;AACjF,QAAO;EACL,iBAAiB,cAAc;EAC/B,kBAAkB,cAAc;EAChC,qBAAqB,cAAc;EACnC,sBAAsB,cAAc;EACpC,cAAc,cAAc,aAAa,UAAU;EACnD,aAAa,cAAc,YAAY,UAAU;EACjD,UAAU,cAAc;EACxB,kBAAkB,cAAc;EAChC,0BAA0B,cAAc,yBAAyB,UAAU;EAC3E,UAAU,cAAc;EACxB,aAAa,cAAc;EAC3B,YAAY,cAAc,WAAW,KAAK,QAAQ,IAAI,UAAU,CAAC;EACjE,cAAc,cAAc;EAC5B,oBAAoB,cAAc;EAClC,aAAa,cAAc;EAC3B,qBAAqB,cAAc;EACnC,YAAY,cAAc;EAC3B;;;;;gBCnWkE;AAmBrE,eAAsB,mBACpB,SACA,aACA,eAC8B;AAC9B,KAAI,CAAC,eAAe;CAGpB,MAAM,gBAAgB,uBAAuB,cAAc;CAE3D,MAAM,KAAK,MAAMC,qBAAa,wBAC5B,SACA,EACE,MAAM,aACP,EACD,EACE,eAAe;EACb,GAAG;EACH,iBAAiB;EACjB,kBAAkB;EAElB,qBAAqB;EACrB,sBAAsB;EAEtB,cAAc;EACd,aAAa;EACb,UAAU;EACV,UAAU;EACV,0BAA0B;EAE1B,oBAAoB;EACpB,kBAAkB;EAElB,cAAc;EACd,iCAAiC;EACjC,gBAAgB;EAChB,qBAAqB;EACrB,4BAA4B;EAC7B,EACF,CACF;AAED,QAAO;EACL,cAAc,CAAC,GAAG;EAClB,MAAM,EAAE;EACT;;;;;;AA4BH,eAAsB,mBAAmB,EACvC,SACA,aACA,QACA,OACA,UAAU,yBACV,cACA,gBACuD;CAEvD,IAAI;AAEJ,KAAI,UAAU,oBAAoB,UAAU,kBAAkB;AAE5D,cAAY,0BAA0B,OAAO,UAAU,EAAE,qBAAqB,QAAQ;QACjF;AAEL,cAAY;;CAGd,MAAM,KAAK,MAAMA,qBAAa,qCAC5B,SACA;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,EACD;EACE,OAAO,4BAA4B,MAAM;EACzC,QAAQ;EACT,EACD,CAAC;EAAE,UAAU;EAAO,YAAY;EAAO,QAAQ;EAAW,CAAC,CAC5D;AAED,QAAO;EACL,cAAc,CAAC,GAAG;EAClB,MAAM,EAAE;EACT;;;;;;;;;AAUH,SAAgB,8BACd,SACA,aACA,qBACW;CACX,IAAI;AACJ,KAAI,OAAO,gBAAgB,UAAU;AACnC,MAAI,YAAY,WAAW,KAAK,EAAE;AAChC,kBAAe,OAAO,KAAK,YAAY,MAAM,EAAE,EAAE,MAAM;SAClD;AACL,kBAAe,OAAO,KAAK,aAAa,MAAM;;QAE3C;AACL,iBAAe;;AAGjB,KAAI,aAAa,WAAW,IAAI;AAC9B,QAAM,IAAI,MAAM,kCAAkC;;CAEpD,MAAM,cAAc,OAAO,MAAM,EAAE;AACnC,aAAY,cAAc,SAAS,EAAE;AAErC,QAAO,UAAU,uBACf,CAAC,aAAa,aAAa,EAC3B,uBAAuB,+BACxB,CAAC;;AAGJ,MAAa,kBAAkB,YAAoB,sBAAiC;AAClF,QAAO,UAAU,uBAAuB,CAAC,OAAO,KAAK,WAAW,EAAE,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,kBAAkB,CAAC;;AAGnH,MAAa,gBAAgB,sBAAiC;AAC5D,QAAO,UAAU,uBAAuB,CAAC,OAAO,KAAK,SAAS,CAAC,EAAE,kBAAkB,CAAC;;AAGtF,eAAsB,kBAAkB,SAAgD,UAAoB;CAC1G,MAAM,mBAA6C,EAAE;CACrD,MAAM,kBAAkB,IAAI,QAAQ,mBAAmB,SAAS;CAChE,MAAM,oBAAoB,IAAI,QAAQ,sBAAsB,SAAS;CACrE,MAAM,kBAAkB,IAAI,QAAQ,kCAAkC,SAAS;CAE/E,MAAM,4BAA4B,IAAI,UAAU,+CAA+C;CAE/F,MAAM,sBAAsB,MAAM,SAAS,WAAW,sBAAsB,0BAA0B,EAAE;CAExG,MAAM,YAAY,aAAqB;AACrC,SAAO,IAAI,IAAI,QAAQ,YAAY,+BAA+B;;AAGpE,MAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,EAAE,SAAS,WAAW;AAC5B,MAAI,CAAC,iBAAiB,UAAU;AAC9B,oBAAiB,WAAW,EAAE;;AAEhC,mBAAiB,SAAS,KAAK,OAAO;;CAExC,MAAM,mBAAsD,EAAE;CAC9D,MAAM,mCAA8D,EAAE;CACtE,MAAM,oBAAuD,EAAE;AAE/D,MAAK,MAAM,CAAC,SAAS,YAAY,OAAO,QAAQ,iBAAiB,EAAE;EACjE,MAAM,MAAM,SAAS,uBAAuB;AAC5C,OAAK,MAAM,MAAM,SAAS;AACxB,OAAI,aAAa,OAAO,SAAS,GAAG;;AAGtC,MAAI,aAAa,OAAO,YAAY,SAAS;EAE7C,MAAM,WAAW,MAAM,MAAM,IAAI;EACjC,MAAM,kBAA4B,MAAM,SAAS,MAAM,EAAE,OAAO;EAEhE,MAAM,aAAa;AAEnB,OAAK,MAAM,aAAa,gBAAgB;GACtC,MAAM,wBAAwB,2BAA2B,OAAO,KAAK,WAAW,SAAS,CAAC;GAE1F,MAAM,EACJ,kBAAkB,4BAClB,mBAAmB,YACnB,mBAAmB,oCACjB,MAAM,gCAAgC,iBAAiB,sBAAsB,IAAI;AACrF,oBAAiB,KAAK,GAAG,2BAA2B;AACpD,qBAAkB,KAAK,GAAG,gCAAgC;AAE1D,QAAK,MAAM,UAAU,sBAAsB,SAAS;IAClD,MAAM,SAAS,sBAAsB,OAAO,QAAQ,CAAC;AACrD,qBAAiB,KAAK;KACpB,aAAa,MAAM,kBAAkB,QAClC,gBACC;MACE,mBAAmB;MACnB;MACD,EACD,OAAO,QAAQ,EACf,MAAM,KAAK,OAAO,CACnB,CACA,SAAS;MACR,oBAAoB,gBAAgB;MACpC;MACA,kBAAkB,8BAA8B,OAAO,QAAQ,EAAE,QAAQ,kBAAkB,UAAU;MACrG,UAAU,eAAe,YAAY,gBAAgB,UAAU;MAC/D,QAAQ,aAAa,gBAAgB,UAAU;MAC/C,eAAe;MAChB,CAAC,CACD,aAAa;KAChB,SAAS,EAAE;KACX,cAAc;KACf,CAAC;;;;AAKR,QAAO;EACa;EACC;EACnB,MAAM,EAAE;EACR,KAAK;EACN;;;;;AC/PH,IAAa,kBAAb,cAAqC,MAAM;CACzC,AAAgB;CAEhB,YAAY,SAAiB,UAAmB;AAC9C,QAAM,QAAQ;AACd,SAAO,eAAe,MAAM,IAAI,OAAO,UAAU;AACjD,OAAK,WAAW;AAEhB,QAAM,kBAAkB,MAAM,KAAK,YAAY;;;AAInD,MAAM,iBAAiB;AAEvB,eAAsB,4BACpB,YACA,WACA,aAAa,OACgB;AAC7B,KAAI;EACF,MAAM,qBAAqB,MAAM,MAAM,2BAA2B;GAChE,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU,EACnB,cAAc,WACf,CAAC;GACH,CAAC;EAEF,MAAM,mBAAmB,MAAM,mBAAmB,MAAM;AACxD,MAAI,iBAAiB,MAAO,OAAM,IAAI,gBAAgB,iBAAiB,OAAO,kBAAkB,SAAS;EACzG,MAAM,WAAW,iBAAiB;AAGlC,MAAI;AACF,SAAM,cAAc,YAAY,SAAS;WAClC,QAAQ;AACf,UAAO;;AAGT,SAAO;UACA,OAAO;AACd,MAAI,YAAY;AACd,OAAI,iBAAiB,gBAAiB,OAAM;AAC5C,SAAM,IAAI,gBAAgB,GAAG,eAAe,gBAAgB;;;;AAKlE,MAAM,gBAAgB;AAEtB,eAAsB,wBACpB,YACA,WACA,aAAa,OACb,cAC6B;AAC7B,KAAI;EACF,MAAM,qBAAqB,MAAM,MAAM,wDAAwD;GAC7F,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU;IACnB,SAAS;IACT,IAAI;IACJ,QAAQ;IACR,QAAQ,CAAC,UAAU;IACpB,CAAC;GACH,CAAC;EAEF,MAAM,mBAAmB,MAAM,mBAAmB,MAAM;AACxD,MAAI,iBAAiB,OAAO;AAC1B,OAAI,iBAAiB,MAAM,QAAQ,SAAS,oBAAoB,EAAE;AAChE,WAAO,gBAAgB;;AAGzB,SAAM,IAAI,gBAAgB,GAAG,cAAc,GAAG,iBAAiB,MAAM,UAAU;;EAGjF,MAAM,WAAW,iBAAiB;AAClC,QAAM,MAAM,IAAI;AAEhB,OAAK,IAAI,UAAU,GAAG,UAAU,IAAI,WAAW;GAC7C,MAAM,0BAA0B,MAAM,MAAM,wDAAwD;IAClG,QAAQ;IACR,SAAS,EAAE,gBAAgB,oBAAoB;IAC/C,MAAM,KAAK,UAAU;KACnB,SAAS;KACT,IAAI;KACJ,QAAQ;KACR,QAAQ,CAAC,CAAC,SAAS,CAAC;KACrB,CAAC;IACH,CAAC;GAEF,MAAM,wBAAwB,MAAM,wBAAwB,MAAM;GAElE,MAAM,SAAS,sBAAsB,QAAQ,MAAM,IAAI;AAEvD,OAAI,sBAAsB,QAAQ,MAAM,IAAI,KAAK;IAC/C,MAAM,QAAQ,sBAAsB,QAAQ,MAAM,GAAG;AACrD,QAAI,OAAO,OAAO,MAAM;AACtB,WAAM,IAAI,MAAM,MAAM;;;;;;;;;;AAW1B,OAAI,WAAW,UAAU;AACvB,UAAM,IAAI,gBAAgB,GAAG,cAAc,gBAAgB;cAClD,WAAW,eAAe,WAAW,aAAa;AAC3D,UAAM,cAAc,YAAY,SAAS;AACzC,WAAO;;AAGT,SAAM,MAAM,IAAK;;UAEZ,OAAO;AACd,MAAI,YAAY;AACd,OAAI,iBAAiB,gBAAiB,OAAM;AAE5C,SAAM,IAAI,gBAAgB,GAAG,cAAc,gBAAgB;;;;AAKjE,eAAsB,cAAc,aAAyB,UAAkB,cAA0B,aAAa;CACpH,MAAM,YAAY,YAAY;EAC5B,IAAI,WAAW;EACf,MAAM,cAAc;AAEpB,SAAO,WAAW,aAAa;AAC7B,SAAM,MAAM,IAAK;AACjB,eAAY;GAEZ,MAAM,kBAAkB,MAAM,MAAM,wDAAwD;IAC1F,QAAQ;IACR,SAAS,EAAE,gBAAgB,oBAAoB;IAC/C,MAAM,KAAK,UAAU;KACnB,SAAS;KACT,IAAI;KACJ,QAAQ;KACR,QAAQ,CAAC,CAAC,SAAS,CAAC;KACrB,CAAC;IACH,CAAC;GAEF,MAAM,eAAe,MAAM,gBAAgB,MAAM;AACjD,OAAI,aAAa,OAAO,OAAO;AAC7B,QAAI,aAAa,OAAO,MAAM,GAAG,WAAW;KAC1C,MAAM,mBAAmB,aAAa,OAAO,MAAM,GAAG;AAEtD,SAAI,qBAAqB,aAAa;AACpC,aAAO;;;;AAKb,WAAQ,IAAI,iCAAiC;;AAE/C,UAAQ,IAAI,2CAA2C;AACvD,QAAM,IAAI,MAAM,yCAAyC;;CAG3D,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,WAAW,EAAE,kBAAkB,KAAO,yCAAyC,CAAC,CAAC;AAEpH,KAAI,kBAAkB,OAAO;AAC3B,QAAM;;AAGR,QAAO;;;;;ACtKT,IAAa,wBAAb,MAAa,8BAA8B,MAAM;CAC/C,YACE,SACA,AAAgB,MAChB,AAAkB,OAClB;AACA,QAAM,QAAQ;EAHE;EACE;AAGlB,OAAK,OAAO;;CAGd,OAAO,cAAc,QAAgB,YAA2C;AAC9E,SAAO,IAAI,sBAAsB,cAAc,OAAO,IAAI,aAAa;;CAGzE,OAAO,kBAAkB,QAAiB,OAAuC;AAC/E,SAAO,IAAI,sBAAsB,+BAA+B,UAAU,YAAY,aAAa,UAAU,MAAM;;;AA4BvH,SAAgB,+BACd,UAC0C;AAC1C,QAAO,CAAC,MAAM,QAAQ,SAAS,IAAI,SAAS;;AA4B9C,eAAsB,eACpB,aACA,cACA,iBAC+C;AAE/C,KAAI,CAAC,aAAa,QAAQ;AACxB,QAAM,IAAI,sBAAsB,oCAAoC;;AAGtE,KAAI;EAEF,MAAM,sBAAsB,mBAAmB,aAAa;EAC5D,MAAM,SAAS,mBAAmB,cAAc,gBAAgB;EAGhE,MAAM,SAAS,MAAM,wBAAwB,aAAa,qBAAqB,OAAO;AAEtF,SAAO;UACA,OAAO;AAEd,MAAI,iBAAiB,sBAAsB,iBAAiB,uBAAuB;AACjF,SAAM;SACD;AACL,SAAM,IAAI,sBAAsB,uCAAuC,WAAW,MAAM;;;;AAK9F,SAAS,mBAAmB,cAAgD;AAC1E,KAAI;AACF,SAAO,aAAa,KAAK,IAAI,UAAU;AACrC,OAAI;IACF,MAAM,aAAa,GAAG,WAAW;AACjC,WAAO,OAAO,KAAK,WAAW,CAAC,SAAS,SAAS;YAC1C,OAAO;AACd,UAAM,sBAAsB,kBAAkB,OAAO,MAAM;;IAE7D;UACK,OAAO;AACd,MAAI,iBAAiB,sBAAuB,OAAM;AAClD,QAAM,sBAAsB,kBAAkB,MAAM;;;AAIxD,SAAS,mBACP,cACA,iBACyB;AACzB,QAAO;EACL,eAAe;EACf,wBAAwB;EACxB,6BAA6B,aAAa,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;EACxE,8BAA8B,aAAa,KAAK,GAAG,WAAW,EAC5D,WACE,UAAU,aAAa,SAAS,KAAK,kBACjC,gBAAgB,KAAK,YAAY,QAAQ,UAAU,CAAC,GACpD,EAAE,EACT,EAAE;EACJ;;AAGH,eAAe,wBACb,aACA,qBACA,QAC+C;CAC/C,MAAM,WAAW,MAAM,MAAM,aAAa;EACxC,QAAQ;EACR,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU;GACnB,SAAS;GACT,IAAI;GACJ,QAAQ;GACR,QAAQ,CAAC,EAAE,qBAAqB,EAAE,OAAO;GAC1C,CAAC;EACH,CAAC;AAEF,KAAI,CAAC,SAAS,IAAI;AAChB,QAAM,sBAAsB,cAAc,SAAS,QAAQ,SAAS,WAAW;;CAGjF,MAAM,eAAgB,MAAM,SAAS,MAAM;AAE3C,KAAI,WAAW,cAAc;AAC3B,QAAM,aAAa;;CAGrB,MAAM,QAAQ,aAAa,OAAO;AAElC,KAAI,MAAM,YAAY,aAAa;EACjC,MAAM,OAAO,MAAM,mBAAmB,SAAS,OAAO,GAAG,KAAK;AAE9D,QAAM,IAAI,sBAAsB,KAAK,UAAU,MAAM,QAAQ,OAAO,MAAM,EAAE,KAAK;;AAGnF,QAAO,MAAM;;;;;gBCvKiE;AA2BhF,MAAa,0BAA0B;CACrC,eAAe;CACf,iBAAiB;CACjB,YAAY;CACb;AA+BD,MAAa,8BAA0D;CACrE,yBAAyB;EACvB,UAAU;EACV,SAAS;EACV;CAED,kBAAkB;EAChB;GAAE,QAAQ;GAAe,eAAe;GAAU;EAClD;GAAE,QAAQ;GAAc,eAAe;GAAU;EACjD;GAAE,QAAQ;GAAc,eAAe;GAAO;EAC9C;GAAE,QAAQ;GAAkB,eAAe;GAAO;EACnD;CACF;;;;;;;;;;;;;;;AAgCD,eAAsB,oBAAoB,EACxC,cACA,YACA,QACA,aAAa,iBACb,UAC4D;CAC5D,MAAM,cAAc;EAClB,GAAG;EACH,GAAG;EACJ;CACD,MAAM,aAAa,WAAW,cAAc,qBAAqB;AAEjE,KAAI,aAAa,kBAAkB,YAAY,aAAa,gBAAgB,GAAG;AAC7E,QAAM,IAAI,MAAM,sDAAsD;;CAGxE,IAAI;CACJ,IAAI;CAEJ,MAAM,WAAW,YAAY,mBAAmB;AAChD,KAAI,aAAa,kBAAkB,WAAW;AAC5C,MAAI,SAAS,yBAAyB;AACpC,OAAI,aAAa,SAAS,GAAG;AAC3B,oBAAgB,SAAS,wBAAwB;UAC5C;AACL,oBAAgB,SAAS,wBAAwB;;SAE9C;AACL,mBAAgB,SAAS,iBAAiB,GAAG;;QAE1C;AACL,kBAAgB,YAAY;;AAG9B,KAAI,kBAAkB,OAAO;AAC3B,wBAAsB,SAAS,iBAAiB,QAAQ,WAAW,OAAO,kBAAkB,MAAM;QAC7F;AACL,wBAAsB,SAAS,iBAAiB,QAAQ,WAAW,OAAO,kBAAkB,SAAS;;CAGvG,IAAI,wBAAgD,EAAE;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;AAEJ,KAAI;EACF,MAAM,+BAA+B,MAAM,WAAW,6BAA6B,WAAW;AAE9F,mBAAiB,6BAA6B,QAAQ,OAAO;AAC7D,cAAY,6BAA6B,MAAM;AAC/C,yBAAuB,6BAA6B,MAAM;UACnD,OAAO;AACd,UAAQ,MAAM,8CAA8C,MAAM;AAElE,MAAI,iBAAiB,oBAAoB;AACvC,SAAM;;AAGR,QAAM,IAAI,wBAAwB;GAChC,SAAS;GACT,MAAM,4BAA4B;GAClC,WAAW;GACZ,CAAC;;CAGJ,MAAM,aAA6B;EACjC,GAAG;EACH;EACA,qBAAqB;EACrB;EACA,GAAG;EACJ;CAED,IAAI,sBAA2C;AAE/C,KAAI;EACF,MAAM,mBAAmB,MAAM,qBAAqB,aAAa,YAAY,cAAc,YAAY;GACrG,UAAU,OAAO;GACjB;GACD,CAAC;EAEF,MAAM,gBAAgB,+BAA+B,iBAAiB,GAClE,CAAC,iBAAiB,cAAc,GAChC,iBAAiB,KAAK,OAAQ,GAAG,gBAAgB,OAAO,GAAG,cAAc,GAAG,UAAW;AAE3F,wBAAsB,aAAa,KAAK,IAAI,QAC1C,uBAAuB,IAAI;GACzB,GAAG;GACH,eAAe,cAAc;GAC9B,CAAC,CACH;SACK;CAIR,MAAM,WAAW,YAAY;AAE7B,SAAQ,IAAI,uCAAuC;AACnD,SAAQ,IAAI,gBAAgB,aAAa,OAAO,cAAc,aAAa,SAAS,IAAI,MAAM,KAAK;AACnG,SAAQ,IAAI,sBAAsB,gBAAgB;AAClD,KAAI,kBAAkB,UAAU;AAC9B,UAAQ,IACN,kBAAkB,WAAW,KAAK,IAAI,YAAY,eAAe,GAAG,SAAS,GAAG,YAAY,YAAY,MACzG;QACI;AACL,sBAAoB,SAAS,IAAI,QAAQ;GACvC,MAAM,KAAK,GAAG,gBAAgB,KAAK,IAAI,GAAG,gBAAgB,KAAQ,KAAU,GAAG,sBAAsB,GAAG;GACxG,MAAM,gBAAgB,WAClB,KAAK,IAAI,YAAY,mBAAmB,kBAAkB,YAAY,kBAAkB,GAAG,GAAG,GAAG,SAAS,GAC1G,YAAY,mBACV,kBAAkB,YAAY,kBAAkB,GAAG,GACnD;AACN,WAAQ,IAAI,0BAA0B,IAAI,IAAI,cAAc,MAAM;IAClE;;AAEJ,SAAQ,IAAI,mCAAmC;AAE/C,yBAAwB,mBACtB,qBACA,eACA,WACA;EACE,kBAAkB,YAAY,oBAAoB;EAClD,aAAa,YAAY,eAAe;EACxC,UAAU,OAAO;EAEjB;EACD,EACD,YAAY,cACb;CAED,IAAI,aAAqC,EAAE;CAC3C,IAAI;AAEJ,KAAI;AACF,MAAI,QAAQ,UAAU,aAAa,YAAY;AAC7C,UAAO,MAAM,kBAAkB,aAAa,YAAY,sBAAsB;SACzE;GACL,IAAI,YAAsB,EAAE;AAE5B,OAAI,OAAO,qBAAqB;AAC9B,4BAAwB,MAAM,OAAO,oBAAoB,sBAAsB;AAC/E,gBAAY,sBAAsB,KAAK,aAAa,KAAK,OAAO,SAAS,WAAW,CAAC,CAAC;UACjF;AACL,SAAK,IAAI,IAAI,GAAG,IAAI,sBAAsB,QAAQ,KAAK;KACrD,MAAM,WAAW,MAAM,OAAO,gBAAgB,sBAAsB,GAAG;KACvE,MAAM,WAAW,KAAK,OAAO,SAAS,WAAW,CAAC;AAClD,eAAU,KAAK,SAAS;AACxB,2BAAsB,KAAK;;;AAK/B,OAAI,kBAAkB,UAAU;IAC9B,MAAM,iBAAiB,sBAAsB;AAC7C,gBAAY,WAAW,WAAW,MAAM,WAAW,eAAe;UAC7D;AACL,gBAAY,WAAW,WAAW,KAAK;;GAGzC,IAAI,cACF;AACF,OAAI,CAAC,iBAAiB;AACpB,kBAAc,YACZ,MAAM,qBAAqB,aAAa,YAAY,uBAAuB,WAAW;;GAG1F,MAAM,mBAAmB,OAAO,eAC9B,MAAM,4BAA4B,YAAY,WAAW,WAAW;GACtE,MAAM,kBAAkB,OAAO,YAAqB,aAClD,MAAM,wBAAwB,YAAY,WAAW,YAAY,SAAS;GAC5E,MAAM,kBAAkB,YACtB,MAAM,2BAA2B;IAC/B;IACA;IACA;IACA,YAAY,YAAY;IACxB,eAAe;KAAE;KAAW;KAAsB;IAClD,mBAAmB,WAAW;IAC9B,iBAAiB,YAAY;IAC7B,YAAY;IACb,CAAC;AAEJ,QAAK,MAAM,CAAC,KAAK,WAAW,oBAAoB,SAAS,EAAE;IACzD,MAAM,SAAS,QAAQ,oBAAoB,SAAS;AACpD,QAAI,QAAQ,KAAK,eAAe,CAAC,iBAAiB;AAChD,WAAM,aAAa;;IAGrB,IAAI;IACJ,IAAI;IACJ,IAAI;AACJ,YAAQ,OAAO,QAAf;KACE,KAAK;AAEH,YAAM,MAAM,iBAAiB,KAAK,CAAC,OAAO,UAAU;AAClD,WAAI,OAAO,UAAU;AACnB,mCAA2B,MAAM;;AAGnC,WAAI,OAAQ,OAAM;AAClB,cAAO;QACP;AACF,UAAI,IAAK,mBAAkB;AAC3B;KACF,KAAK;AACH,YAAM,MAAM,gBAAgB,QAAQ,yBAAyB;AAC7D,UAAI,IAAK,mBAAkB;AAC3B;KACF,KAAK;AACH,aAAO,MAAM,iBAAiB;AAC9B,UAAI,KAAM,cAAa;AACvB;KACF,KAAK;AACH,cAAQ,IAAI,YAAY;AACxB;;AAGJ,QAAI,OAAO,MAAM;AACf;;;AAIJ,OAAI,mBAAmB,WAAW,SAAS,GAAG;AAC5C,YAAQ,IAAI,sCAAsC;AAClD,QAAI,iBAAiB;AACnB,aAAQ,IAAI,qBAAqB,gBAAgB;;AAEnD,QAAI,WAAW,SAAS,GAAG;AACzB,aAAQ,IAAI,2BAA2B,WAAW,KAAK,KAAK,CAAC;;AAE/D,YAAQ,IAAI,mCAAmC;;AAGjD,OAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;UACF;AACL,QAAI,CAAC,gBAAiB,OAAM,IAAI,MAAM,mCAAmC;AACzE,WAAO,CAAC,gBAAgB;;;UAGrB,OAAY;EACnB,MAAM,YAAY,aAAa,OAAO,WAAW,OAAO;AAExD,MAAI,iBAAiB,oBAAoB;AACvC,SAAM;;AAGR,MAAI,iBAAiB,yBAAyB;AAC5C,SAAM,wBAAwB,uBAAuB,OAAO,UAAU;;AAGxE,MAAI,iBAAiB,iBAAiB;AAEpC,SAAM,IAAI,wBAAwB;IAChC,SAAS,MAAM;IACf,MAAM,4BAA4B;IAClC,WAAW,WAAW,UAAU;IACrB;IACX,QAAQ;IACT,CAAC;;EAGJ,MAAM,cAAc,sBAAsB,OAAO,aAAa,aAAa,WAAW;AAEtF,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,WAAQ,IAAI,wBAAwB;AACpC,WAAQ,IAAI,MAAM,KAAK,KAAK,KAAK,CAAC;AAClC,OAAI,aAAa;AACf,YAAQ,IAAI,WAAW,YAAY;AACnC,UAAM,IAAI,wBAAwB;KAChC,SAAS,YAAY;KACrB,MAAM,4BAA4B;KAClC,MAAM,MAAM;KACZ,WAAW,YAAY;KACvB,QAAQ;KACT,CAAC;;;AAGN,UAAQ,IAAI,qBAAqB,MAAM;AACvC,QAAM,IAAI,wBAAwB;GAChC,SAAS,aAAa,eAAe;GACrC,MAAM,4BAA4B;GAClC,MAAM,MAAM;GACZ,WAAW,YAAY;GACvB,QAAQ;GACT,CAAC;;;AAIN,MAAa,uBAAuB,OAClC,aACA,YACA,oBACA,aACA,WAIiF;CACjF,MAAM,QAAQ,mBAAmB,KAAK,OAAQ,OAAO,GAAG,GAAG,KAAK,eAAe,IAAI,OAAO,CAAE;AAE5F,KAAI;AACF,MAAI,MAAM,SAAS,GAAG;GACpB,MAAM,WAAW,MAAM,eAAe,aAAa,wBAAwB,WAAW,aAAa,MAAM;AACzG,UAAO;SACF;GACL,MAAM,WAAW,MAAM,WAAW,oBAAoB,MAAM,IAAI;IAC9D,WAAW;IACX,YAAY,aAAa;IACzB,wBAAwB;IACxB,gBAAgB,aAAa;IAC9B,CAAC;AACF,OAAI,SAAS,MAAM,KAAK;IACtB,MAAM,QAAQ,SAAS,MAAM;IAC7B,MAAM,cAAc,sBAAsB,OAAO,aAAa,aAAa,WAAW;AACtF,UAAM,IAAI,wBAAwB;KAChC,SAAS,YAAY,eAAe,KAAK,UAAU,SAAS,MAAM,IAAI;KACtE,MAAM,4BAA4B;KAClC,MAAM,SAAS,MAAM,QAAQ,EAAE;KAC/B,WAAW,YAAY;KACxB,CAAC;;AAEJ,UAAO,SAAS;;UAEX,OAAO;AACd,MAAI,iBAAiB,uBAAuB;GAC1C,MAAM,cAAc,sBAAsB,OAAO,aAAa,aAAa,WAAW;AACtF,SAAM,IAAI,wBAAwB;IAChC,SAAS,YAAY;IACrB,MAAM,4BAA4B;IAClC,MAAM,MAAM;IACZ,WAAW,YAAY;IACvB,QAAQ;IACT,CAAC;;AAGJ,QAAM;;;AAIV,MAAM,oBAAoB,OACxB,aACA,YACA,0BACoC;AACpC,KAAI;EACF,MAAM,WAAW,MAAM,eACrB,aAAa,wBAAwB,WAAW,aAChD,sBACD;AAED,UAAQ,IAAI,kCAAkC;AAC9C,OAAK,MAAM,MAAM,UAAU;AACzB,WAAQ,IAAI,eAAe,GAAG,cAAc,KAAK;;AAGnD,UAAQ,IAAI,wBAAwB;AACpC,OAAK,MAAM,MAAM,UAAU;AACzB,WAAQ,IAAI,GAAG,KAAK;;UAEf,OAAO;AACd,MAAI,iBAAiB,uBAAuB;AAC1C,WAAQ,IAAI,YAAY,MAAM,UAAU;AACxC,WAAQ,IAAI,wBAAwB;AACpC,OAAI,MAAM,MAAM;AACd,SAAK,MAAM,OAAO,MAAM,MAAM;AAC5B,aAAQ,IAAI,IAAI;;;;AAItB,QAAM;;AAGR,QAAO,EAAE;;AAGX,eAAsB,mBACpB,YACA,WACA,aAAyB,aACzB;CACA,MAAM,YAAY,YAAY;EAC5B,MAAM,kBAAgC;GAAC;GAAa;GAAa;GAAY;EAC7E,MAAM,QAAgB,gBAAgB,QAAQ,WAAW;AACzD,MAAI,UAAU,CAAC,EAAG,OAAM,IAAI,MAAM,qBAAqB;EAEvD,IAAI,WAAW;EACf,MAAM,cAAc;AAEpB,SAAO,WAAW,aAAa;AAC7B,eAAY;GAEZ,MAAM,SAAS,MAAM,WAAW,mBAAmB,UAAU;AAE7D,OAAI,QAAQ,OAAO,KAAK;AACtB,YAAQ,MAAM,YAAY,OAAO,MAAM,IAAI;AAC3C,UAAM,OAAO,MAAM;;AAGrB,OAAI,QAAQ,OAAO,oBAAoB;IACrC,MAAM,0BAA0B,gBAAgB,QAAQ,OAAO,MAAM,mBAAmB;AACxF,QAAI,2BAA2B,OAAO;AACpC,YAAO,OAAO;;;AAIlB,WAAQ,IAAI,iCAAiC;AAE7C,SAAM,MAAM,IAAK;;AAEnB,UAAQ,IAAI,2CAA2C;AACvD,QAAM,IAAI,MAAM,yCAAyC;;CAG3D,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,WAAW,EAAE,kBAAkB,KAAO,yCAAyC,CAAC,CAAC;AAEpH,KAAI,kBAAkB,OAAO;AAC3B,QAAM;;AAGR,QAAO;;;;;ACzgBT,eAAsB,2BAA2B,EAC/C,uBACA,QACA,YACA,YACA,eAAe,gBACf,mBACA,iBACA,YAAY,cAAc,SACmC;CAC7D,IAAI,aAAqC,EAAE;CAC3C,IAAI,sBAAsB;AAE1B,KAAI,iBAAiB;AACnB,OAAK,MAAM,CAAC,OAAO,OAAO,sBAAsB,SAAS,EAAE;GACzD,IAAI;AAEJ,OAAI;AACF,gBAAY,MAAM,WAAW,gBAAgB,IAAI,OAAO;YACjD,OAAO;IAEd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,QACE,aAAa,SAAS,wCAAwC,IAC9D,aAAa,SAAS,kBAAkB,EACxC;AACA,aAAQ,KAAK,sCAAsC,aAAa;AAEhE,2BAAsB;AACtB;WACK;AACL,kBAAa,OAAO,OAAO,GAAG;AAC9B,WAAM;;;AAIV,OAAI,WAAW;AACb,QAAI;AACF,WAAM,mBAAmB,YAAY,WAAW,kBAAkB;AAClE,kBAAa,OAAO,MAAM,UAAU;aAC7B,OAAO;AACd,kBAAa,OAAO,OAAO,UAAU;AACrC,WAAM;;AAER,eAAW,KAAK,UAAU;;;AAK9B,MAAI,qBAAqB;AACvB,gBACE,sBAAsB,QACtB,MACA,oEACD;AAED,cAAW,KAAK,oEAAoE;;QAEjF;AACL,eAAa,MAAM,QAAQ,IACzB,sBAAsB,IAAI,OAAO,sBAAsB,UAAU;AAC/D,OAAI;IACF,MAAM,YAAY,MAAM,WAAW,gBAAgB,sBAAsB,OAAO;AAChF,WAAO;YACA,OAAO;IAEd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,QACE,aAAa,SAAS,wCAAwC,IAC9D,aAAa,SAAS,kBAAkB,EACxC;AACA,aAAQ,KAAK,sCAAsC,aAAa;AAChE,kBAAa,OAAO,OAAO,GAAG;AAC9B,2BAAsB;AACtB,YAAO;;AAGT,iBAAa,OAAO,OAAO,GAAG;AAC9B,UAAM;;IAER,CACH;AAGD,eAAa,WAAW,QAAQ,QAAQ,QAAQ,GAAG;AAGnD,MAAI,qBAAqB;AACvB,SAAM,IAAI,wBAAwB;IAChC,SACE;IACF,MAAM,4BAA4B;IACnC,CAAC;;AAGJ,QAAM,QAAQ,IACZ,WAAW,IAAI,OAAO,WAAW,UAAU;AACzC,OAAI;IACF,MAAM,SAAS,MAAM,mBAAmB,YAAY,WAAW,kBAAkB;AACjF,iBAAa,OAAO,MAAM,UAAU;AACpC,WAAO;YACA,OAAO;AACd,iBAAa,OAAO,OAAO,UAAU;AACrC,UAAM;;IAER,CACH;;AAGH,QAAO;;;;;ACrGT,MAAaC,gBAAc;AAC3B,MAAaC,mBAAiB;AAC9B,MAAaC,qBAAmB;AAEhC,SAAgB,YAAY,IAAgC;AAC1D,KAAI,OAAO,GAAG,EAAE;EACd,MAAM,6BAA6B,GAAG,uBAAuB,EAAE;EAC/D,MAAM,UAAU,uBAAuB,IAAI,2BAA2B;EACtE,MAAM,MAAM;GAAE,GAAG;GAAW,SAAS,IAAI,UAAU,EAAE;GAAE;EACvD,MAAM,UAAU,QAAQ,aAAa,KAAK,OAAO,kBAAkB,KAAK,GAAG,KAAK,CAAC;AACjF,SAAO,QAAQ,MAAM,OAAO,IAAI,KAAK,aAAa,CAAC,SAAS,YAAY,CAAC;;AAG3E,QAAO;;AAGT,SAAS,kBAAkB,cAAkD;AAC3E,MAAK,MAAM,CAAC,OAAO,gBAAgB,aAAa,SAAS,EAAE;AACzD,MAAI,YAAY,YAAY,EAAE;AAC5B,UAAO;;;AAGX,QAAO;;;;;;;;;;;;;AAqBT,SAAgB,mBACd,iBACA,eACA,WACA,aACA,oBACwB;CACxB,MAAM,wBAAgD,EAAE;CACxD,MAAM,EAAE,kBAAkB,aAAa,UAAU,aAAa;CAE9D,MAAM,iBAAiB,kBAAkB,gBAAgB;AACzD,iBAAgB,SAAS,OAAO;AAC9B,MAAI,CAAC,OAAO,GAAG,EAAE;AACf,MAAG,kBAAkB;AACrB,MAAG,WAAW;;GAEhB;CAEF,MAAM,eAAe,qBAAqB,qBAAqB,gBAAgB,GAAG;CAElF,MAAM,UAAoB,aAAa,KAAK,OAAO,UAAU,GAAG,CAAC;CACjE,MAAM,qBAAqB,uBAAuB,EAAE;CAEpD,MAAM,cAAwC,EAAE;CAChD,MAAM,aAAqD,EAAE;AAE7D,cAAa,SAAS,IAAI,SAAS;EACjC,MAAM,KAAK,GAAG,gBAAgB,KAAK,IAAI,GAAG,gBAAgB,KAAQ,KAAU,GAAG,sBAAsB,GAAG;EACxG,MAAM,gBAAgB,WAClB,KAAK,IAAI,kBAAkB,kBAAkB,GAAG,EAAE,SAAS,GAC3D,kBAAkB,kBAAkB,GAAG;EAE3C,IAAI,cAAc,kBAAkB,eAAe,GAAG;AAEtD,MAAI,gBAAgB,IAAK;AACvB,iBAAc,kBAAkB,IAAK,GAAG;;AAG1C,cAAY,KAAK,kBAAkB,WAAW,qBAAqB,uBAAuB,YAAY,CAAC;AACvG,aAAW,KAAK,KAAK,qBAAqB,oBAAoB,EAAE,OAAO,IAAI,CAAC,GAAG,UAAU;GACzF;CAEF,MAAM,EAAE,gBAAgB,iBACtB,UACA,WAAW,KAAK,IAAI,aAAa,SAAS,GAAG,aAC7C,cACD;CAED,IAAI,iBAAiB,kBAAkB,WAAW,CAAC,IAAI;CACvD,MAAM,qBAA+B,EAAE;AAEvC,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,IAAI,aAAa,QAAQ;AAEzB,MAAI,mBAAmB,GAAG;AACxB,OAAI,mBAAmB,CAAC,KAAK,QAAQ,KAAKD,mBAAiBD,eAAa;AACtE,kBAAcC;AACd,qBAAiB;;;AAIrB,MAAI,mBAAmB,KAAK,aAAaC,qBAAmBF,eAAa;AACvE,sBAAmB,KAAK,EAAE;;;AAK9B,KAAI,mBAAmB,CAAC,KAAK,aAAa;EACxC,MAAM,mBAAmB,IAAI,mBAAmB;GAC9C,cAAc,CAAC,YAAY;GAC3B,UAAU;GACV,iBAAiB;GAClB,CAAC;AAEF,wBAAsB,KAAK,IAAI,qBAAqB,iBAAiB,oBAAoB,CAAC,CAAC;;AAG7F,MAAK,MAAM,CAAC,OAAO,gBAAgB,aAAa,SAAS,EAAE;EACzD,MAAM,eAAe,mBAAmB;EACxC,MAAM,gBAAgB,gBAAgB,mBAAmB;EAEzD,MAAM,UAAU,YAAY,WAAW,EAAE;EACzC,MAAM,sBAAsB,YAAY,uBAAuB,EAAE;EAEjE,MAAM,cAAwC;GAC5C,GAAI,mBAAmB,SAAS,cAAc,CAAC,YAAY,GAAG,EAAE;GAChE,GAAI,mBAAmB,SAAS,MAAM,GAAG,CAAC,YAAY,OAAO,GAAG,EAAE;GAClE,GAAI,WAAW,SAAS,CAAC,WAAW,OAAO,GAAG,EAAE;GACjD;EAED,IAAI;AAEJ,MAAI,OAAO,YAAY,EAAE;AACvB,oBAAiB,WAAW,aAAa;IACvC;IACA,eAAe;IACf;IACA,aAAa;IACd,CAAC;SACG;AACL,oBAAiB,eAAe,aAAa;IAC3C;IACA,eAAe;IACf;IACA,aAAa;IACd,CAAC;;AAGJ,iBAAe,KAAK,QAAQ;AAC5B,wBAAsB,KAAK,eAAe;;AAG5C,QAAO;;AAGT,SAAS,qBAAqB,cAAwD;CACpF,MAAM,aAAkC,EAAE;AAE1C,MAAK,MAAM,CAAC,GAAG,OAAO,aAAa,SAAS,EAAE;EAC5C,IAAI,WAA8B;EAClC,MAAM,WAAW,uBAAuB,GAAG;AAE3C,MAAI,UAAU;AACZ,OAAI,OAAO,SAAS,EAAE;AACpB,YAAQ,IAAI,MAAM,SAAS;IAC3B,MAAM,6BAA6B,SAAS,uBAAuB,EAAE;IACrE,MAAM,UAAU,uBAAuB,UAAU,2BAA2B;AAE5E,YAAQ,aAAa,GAAG,KAAK,KAAK;KAChC,QAAQ;KACR,UAAU;KACV,YAAY;KACb,CAAC;AACF,eAAW,uBACT,IAAI,qBAAqB,QAAQ,mBAAmB,GAAG,oBAAoB,CAAC,EAC5E;KACE,SAAS,SAAS;KAClB,qBAAqB,SAAS;KAC9B,MAAM,SAAS;KACf,eAAe,SAAS;KACzB,CACF;UACI;AACL,aAAS,aAAa,GAAG,KAAK,KAAK;KACjC,QAAQ;KACR,UAAU;KACV,YAAY;KACb,CAAC;;;AAGN,aAAW,KAAK,SAAS;;AAE3B,QAAO;;;;;sBClN6F;;;;;AAiBtG,SAAgB,sBAAsB,cAAgC,MAAyC;CAC7G,MAAM,WAAW,MAAM,WAAW;CAElC,MAAM,EAAE,QAAQ,gBAAgB,wBAAwB,cAAc,qBAAqB,QAAQ;CAEnG,MAAM,uBAAuB,OAAO,MAAM,YAAY;AAEtD,QAAO,WAAW,UAAU,IAAI,GAAG,qBAAqB,GAAG;;AAG7D,SAAgB,4BACd,gBACA,OACA,cACA,MACW;CACX,MAAM,WAAW,MAAM,WAAW;CAElC,MAAM,EAAE,QAAQ,gBAAgB,8BAC9B,gBACA,OACA,cACA,qBAAqB,SACrB,EAAE,CACH;CAED,MAAM,uBAAuB,OAAO,MAAM,YAAY;AAEtD,QAAO,WAAW,UAAU,IAAI,GAAG,qBAAqB,GAAG;;AAG7D,SAAgB,wBACd,cACA,cAIA;AAEA,SAAQ,cAAR;EACE,KAAK,qBAAqB,OACxB,QAAO;GACL,QAAQ,aAAa,YAAY;GACjC,aAAa,aAAa,YAAY;GACvC;EACH,KAAK,qBAAqB,QACxB,QAAO;GACL,QAAQ,aAAa,YAAY;GACjC,aAAa,aAAa,YAAY;GACvC;EACH,KAAK,qBAAqB,YACxB,QAAO;GACL,QAAQ,aAAa,YAAY;GACjC,aAAa,aAAa,YAAY;GACvC;;;AAIP,SAAgB,8BACd,gBACA,OACA,cACA,cACA,gBAA6B,EAAE,EAI/B;CACA,MAAM,mBAAmB,eAAe,QACrC,mBAAmB,CAAC,cAAc,MAAM,MAAM,EAAE,OAAO,eAAe,OAAO,CAAC,CAChF;CAED,MAAM,CAAC,QAAQ,eAAe,iBAC3B,KAAK,mBAAmB;EACvB,MAAM,OAAO,MAAM,IAAI,eAAe,OAAO,UAAU,CAAC;AACxD,MAAI,CAAC,MAAM;AACT,WAAQ,KAAK,QAAQ,eAAe,eAAe,OAAO,CAAC,+CAA+C;AAC1G,UAAO,CAAC,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;;EAG7C,MAAM,YAAY,aAAa,IAAI,eAAe,OAAO,UAAU,CAAC;AACpE,MAAI,CAAC,WAAW;AACd,WAAQ,KACN,uBAAuB,eAAe,eAAe,OAAO,CAAC,+CAC9D;AACD,UAAO,CAAC,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;;EAG7C,MAAM,EAAE,kBAAQ,+BAAgB,gCAAgC,gBAAgB,MAAM,WAAW,aAAa;AAC9G,SAAO,CAACG,UAAQC,cAAY;GAC5B,CACD,QACE,CAAC,OAAO,YAAY,CAAC,GAAG,OAAO;AAC9B,SAAO,CAAC,MAAM,KAAK,EAAE,EAAE,UAAU,KAAK,EAAE,CAAC;IAE3C,CAAC,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,CACrC;AAEH,QAAO;EAAE;EAAQ;EAAa;;AAGhC,SAAgB,yCACd,gBACA,OACA,cACA,cAIA;CACA,MAAM,CAAC,QAAQ,eAAe,eAC3B,KAAK,mBAAmB;EACvB,MAAM,OAAO,MAAM,IAAI,eAAe,OAAO,UAAU,CAAC;AACxD,MAAI,CAAC,MAAM;AACT,WAAQ,KAAK,QAAQ,eAAe,eAAe,OAAO,CAAC,+CAA+C;AAC1G,UAAO,CAAC,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;;EAG7C,MAAM,YAAY,aAAa,IAAI,eAAe,OAAO,UAAU,CAAC;AACpE,MAAI,CAAC,WAAW;AACd,WAAQ,KACN,uBAAuB,eAAe,eAAe,OAAO,CAAC,+CAC9D;AACD,UAAO,CAAC,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;;EAG7C,MAAM,EAAE,kBAAQ,+BAAgB,uBAAuB,gBAAgB,MAAM,WAAW,aAAa;AACrG,SAAO,CAACD,UAAQC,cAAY;GAC5B,CACD,QACE,CAAC,OAAO,YAAY,CAAC,GAAG,OAAO;AAC9B,SAAO,CAAC,MAAM,KAAK,EAAE,EAAE,UAAU,KAAK,EAAE,CAAC;IAE3C,CAAC,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC,CACrC;AAEH,QAAO;EAAE;EAAQ;EAAa;;AAGhC,SAAgB,oBAAoB,cAA2C;CAC7E,MAAM,EAAE,QAAQ,gBAAgB,wBAAwB,cAAc,qBAAqB,OAAO;AAClG,QAAO,OAAO,MAAM,YAAY;;AAGlC,SAAgB,cACd,cACA,gBACA,OACA,cACQ;CACR,MAAM,EAAE,QAAQ,gBAAgB,wBAAwB,cAAc,qBAAqB,OAAO;CAClG,MAAM,gBAAgB,OAAO,MAAM,YAAY;CAC/C,MAAM,MAAM,eACT,QAAQ,aAAa,YAAY;EAChC,MAAM,OAAO,MAAM,IAAI,QAAQ,OAAO,UAAU,CAAC;AACjD,MAAI,CAAC,MAAM;AACT,WAAQ,KAAK,QAAQ,eAAe,QAAQ,OAAO,CAAC,4CAA4C;AAChG,UAAO;;EAGT,MAAM,YAAY,aAAa,IAAI,QAAQ,OAAO,UAAU,CAAC;AAC7D,MAAI,CAAC,WAAW;AACd,WAAQ,KAAK,uBAAuB,eAAe,QAAQ,OAAO,CAAC,4CAA4C;AAC/G,UAAO;;AAGT,SAAO,YACJ,MACC,qBAAqB,KAAK,CACvB,cAAc,MACb,uBAAuB,SAAS,MAAM,WAAW,qBAAqB,OAAO,CAAC,YAC/E,CACA,IAAI,cAAc,UAAU,EAAE,GAAG,IAAI,cAAc,CACvD,CACA,KACC,qBAAqB,KAAK,CACvB,YAAY,MAAM,uBAAuB,SAAS,MAAM,WAAW,qBAAqB,OAAO,CAAC,OAAO,CACvG,IAAI,cAAc,UAAU,EAAE,GAAG,IAAI,cAAc,CACvD;IACF,IAAI,UAAU,EAAE,CAAC,CACnB,UAAU;AAEb,QAAO,SAAS,IAAI;;;;;;AAQtB,SAAgB,uBACd,SACA,MACA,aACA,sBAIA;CACA,MAAM,cAAc,qBAClB,MACA,aACA,QAAQ,aACR,sBACA,UAAU,KACX;CACD,MAAM,mBAAmB,yBACvB,MACA,aACA,QAAQ,iBACR,sBACA,UAAU,KACX;AACD,QAAO;EAAE,QAAQ;EAAa,aAAa;EAAkB;;AAG/D,SAAgB,gCACd,SACA,MACA,aACA,sBAIA;CACA,MAAM,cAAc,qBAClB,MACA,aACA,QAAQ,aACR,sBACA,UAAU,OACX;CACD,MAAM,mBAAmB,yBACvB,MACA,aACA,QAAQ,iBACR,sBACA,UAAU,QACX;AACD,QAAO;EAAE,QAAQ;EAAa,aAAa;EAAkB;;AAG/D,SAAgB,gBACd,SACA,MAIA;CACA,MAAM,iBAAiB,iBAAiB,MAAM,QAAQ,YAAY;CAClE,MAAM,sBAAsB,qBAAqB,MAAM,QAAQ,gBAAgB;AAC/E,QAAO;EAAE,QAAQ;EAAgB,aAAa;EAAqB;;AAGrE,SAAgB,kBACd,SACA,MAIA;CACA,MAAM,iBAAiB,IAAI,UAAU,WAAW,iBAAiB,MAAM,QAAQ,YAAY,EAAE,KAAK,aAAa,CAAC;CAChH,MAAM,sBAAsB,IAAI,UAC9B,WAAW,qBAAqB,MAAM,QAAQ,gBAAgB,EAAE,KAAK,aAAa,CACnF;AACD,QAAO;EAAE,QAAQ;EAAgB,aAAa;EAAqB;;AAGrE,SAAgB,wBAAwB,SAAsB,MAAgB,kBAAqC;CACjH,MAAM,gBAAgB,KAAK;CAC3B,MAAM,eAAe,KAAK;CAE1B,MAAM,EAAE,QAAQ,gBAAgB,gBAAgB,SAAS,KAAK;CAE9D,IAAI,gBAAkC;AAEtC,KAAI,eAAe;AACjB,kBAAgB;YACP,cAAc;AACvB,kBAAgB;;AAGlB,KAAI,eAAe;EACjB,MAAM,aAAa,QAAQ;EAC3B,MAAM,SAAS,IAAI,UAAU,mBAAmB,WAAW;EAC3D,MAAM,gBAAgB,IAAI,UAAU,KAAK,cAAc;EACvD,MAAM,YAAY,OACf,MAAM,cAAc,CACpB,MAAM,cAAc,CACpB,IAAI,UAAa,MAAM,KAAK,aAAa;EAC5C,MAAM,gBAAgB,UAAU,IAAI,WAAW,IAAI,UAAU,KAAK,mBAAmB,CAAC;AAEtF,SAAO;;AAGT,QAAO,IAAI,UAAU,EAAE;;AAGzB,SAAgB,iCAAiC,SAAsB,MAA2B;CAChG,MAAM,mBAAmB,QAAQ;CACjC,MAAM,qBAAqB,wBAAwB,SAAS,MAAM,KAAK,KAAK,GAAG,IAAK;AACpF,QAAO,iBAAiB,KAAK,mBAAmB;;AAGlD,SAAgB,2BACd,UACA,OACA,iBAA8B,EAAE,EAChC,gBAA6B,EAAE,EACnB;CACZ,MAAM,iBAAiB,SAAS,QAAQ,MAAM,EAAE,OAAO;CAEvD,MAAM,oBAAoB,IAAI,IAAI,eAAe,KAAK,MAAM,EAAE,UAAU,CAAC,CAAC;CAC1E,MAAM,mBAAmB,IAAI,IAAI,cAAc,KAAK,MAAM,EAAE,UAAU,CAAC,CAAC;CACxE,MAAM,cAAc,IAAI,IAAI,eAAe,KAAK,MAAM,EAAE,OAAO,UAAU,CAAC,CAAC;CAC3E,MAAM,aAAa,IAAI,IAAI,CAAC,GAAG,kBAAkB,CAAC,QAAQ,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;CAErF,IAAI,cAAc,WAAW;CAC7B,MAAM,uBAAuB,SAC1B,QAAQ,YAAY;AACnB,MAAI,QAAQ,QAAQ;AAClB,UAAO,CAAC,iBAAiB,IAAI,QAAQ,OAAO,UAAU,CAAC;aAC9C,cAAc,GAAG;AAC1B;AACA,UAAO;SACF;AACL,UAAO;;GAET,CACD,KAAK,YAAY;AAChB,MAAI,QAAQ,QAAQ;GAClB,MAAMC,SAAO,MAAM,IAAI,QAAQ,OAAO,UAAU,CAAC;AACjD,OAAI,CAACA,OAAM,OAAM,MAAM,QAAQ,QAAQ,OAAO,UAAU,CAAC,YAAY;AACrE,UAAOA;;EAET,MAAM,iBAAiB,CAAC,GAAG,WAAW,QAAQ,CAAC,CAAC;AAChD,aAAW,OAAO,eAAe;EACjC,MAAM,OAAO,MAAM,IAAI,eAAe;AACtC,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,eAAe,YAAY;AAC1D,SAAO;GACP;AAEJ,QAAO;;AAGT,SAAgB,0BACd,gBAEA,iBACA,gBAAgB,MAChB,sBACa;CACb,MAAM,YAAY,gBACd,4BACC,oBAAmC,gBAAgB,MAAM;CAE9D,MAAMC,aAAW,UACf,eAAe,KAAK,SAAS;EAC3B,MAAM,OAAO,CAAC,KAAK,SAAS,KAAK,UAAU;AAG3C,MAAI,KAAK,OAAO,aAAa,GAAG;AAE9B,OAAI,CAAC,mBAAmB,CAAC,sBAAsB;AAC7C,UAAM,MAAM,wBAAwB,KAAK,QAAQ,UAAU,CAAC,WAAW;;GAGzE,MAAM,eAAe,wBAAwB,kBAAkB,KAAK,QAAQ,UAAU;GACtF,MAAM,uBAAuB,cAAc;AAE3C,OAAI,CAAC,sBAAsB;AACzB,UAAM,MAAM,6CAA6C,KAAK,QAAQ,UAAU,GAAG;;GAGrF,MAAM,OAAO,gBAAgB,IAAI,UAAU,qBAAqB,CAAC;GACjE,MAAM,UAAU,qBAAqB,KAAK;GAC1C,MAAM,UAAU,oBAAoB,KAAK;AAEzC,QAAK,KAAK,SAAS,QAAQ;;AAG7B,SAAO;GACP,CACH;AAED,QAAOA;;;;;ACxYT,IAAM,UAAN,MAAM,QAA+B;CACnC,YACE,AAAO,QACP,AAAO,QACP,AAAO,aACP,AAAO,iBACP,AAAO,sBACP,AAAO,YACP;EANO;EACA;EACA;EACA;EACA;EACA;;CAGT,OAAO,KAAK,YAAiC;EAC3C,MAAM,QAAQ,gBAAgB,WAAW;AACzC,SAAO,IAAI,QACT,MAAM,QACN,MAAM,QACN,MAAM,aACN,MAAM,iBACN,MAAM,sBACN,MAAM,WACP;;CAGH,OAAO,gBAAgB,SAA+B;AACpD,SAAO,IAAI,QACT,QAAQ,QACR,QAAQ,QACR,QAAQ,aACR,QAAQ,iBACR,QAAQ,sBACR,QAAQ,WACT;;CAGH,OAAO,YAAY,QAA4B;AAC7C,SAAO,IAAI,QAAQ,OAAO,QAAQ,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,EAAE,EAAE;;CAG5F,gBACE,MACA,aACA,uBAAuB,qBAAqB,QAI5C;AACA,SAAO,uBAAuB,MAAM,MAAM,aAAa,qBAAqB;;CAG9E,yBACE,MACA,aACA,uBAAuB,qBAAqB,QAI5C;AACA,SAAO,gCAAgC,MAAM,MAAM,aAAa,qBAAqB;;CAGvF,gBAAgB,MAGd;AACA,SAAO,gBAAgB,MAAM,KAAK;;CAGpC,kBAAkB,MAGhB;AACA,SAAO,kBAAkB,MAAM,KAAK;;CAGtC,iCAAiC,MAAuB;AACtD,SAAO,iCAAiC,MAAM,KAAK;;CAGrD,wBAAwB,MAAY,kBAAqC;AACvE,SAAO,wBAAwB,MAAM,MAAM,iBAAiB;;CAG9D,SAAS,MAAY,aAAkC;EACrD,MAAM,EAAE,QAAQ,UAAU,aAAa,YAAY,KAAK,kBAAkB,KAAK;EAC/E,MAAM,EAAE,QAAQ,WAAW,aAAa,aAAa,KAAK,gBACxD,MACA,aACA,qBAAqB,OACtB;AAED,SAAO,KAAK,KAAK,eAAe,KAAK,QAAQ;gBACjC,SAAS,QAAQ,EAAE,CAAC,IAAI,UAAU,QAAQ,EAAE,CAAC;eAC9C,QAAQ,QAAQ,EAAE,CAAC,IAAI,SAAS,QAAQ,EAAE,CAAC;;;;;;;ACrG1D,IAAY,gEAAL;;;;;AAKL;;;;;;AAMA;;;;;;;;;AASA;;;AA0BF,IAAY,wDAAL;AACL;AACA;AACA;AACA;;;;;;ACtCF,SAAgB,iBAAiB,SAAiB,KAAoC;CACpF,MAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,QAAO,MAAM,SAAS,OAAO,YAAY,cAAc,QAAQ;;AAGjE,SAAgB,gBAAgB,YAAqC;CACnE,MAAM,SAAS,OAAO,WAAW,WAAW,WAAW,WAAW,WAAW,IAAI,WAAW;CAC5F,MAAM,SAAS,WAAW;CAC1B,MAAM,cAAc,yBAAyB,WAAW,YAAY;CACpE,MAAM,kBAAkB,yBAAyB,WAAW,gBAAgB;CAC5E,MAAM,uBAAuB,yBAAyB,WAAW,qBAAqB;CACtF,MAAM,aAAa,WAAW,WAAW,UAAU;AAEnD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAgB,qBAAqB,gBAA2B,aAA8B;CAC5F,MAAMC,YAAU;CAChB,MAAM,QAAQ,YAAY;CAC1B,MAAM,YAAY,YAAY;CAC9B,MAAM,WAAW,YAAY,eAAe,SAAS,IAAI,QAAQ,KAAK;CACtE,MAAM,eAAe,sBAAsB,YAAY,aAAa;CACpE,MAAM,8BAA8B,YAAY;CAChD,MAAM,cAAc,YAAY,KAAK,YAAY,YAAY;AAE7D,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;;AAMH,SAAgB,sBAAsB,OAA2B;CAC/D,MAAM,cAA8B,EAAE;AAEtC,QAAO,KAAK,aAAa,CACtB,QAAQ,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,CAC1C,SAAS,QAAQ;EAChB,MAAM,OAAO,aAAa;AAC1B,MAAI,OAAO,SAAS,YAAY,eAAe,OAAO,KAAK,EAAE;AAC3D,eAAY,KAAK,KAAK;;GAExB;AAEJ,QAAO;;;;;AAMT,SAAgB,eAAe,OAAW,MAAuB;AAC/D,QAAO,CAAC,MAAM,IAAI,IAAIC,KAAG,KAAK,CAAC,CAAC,QAAQ;;;;;;;;;;AAW1C,SAAgB,0BAA0B,OAAmC;CAC3E,MAAM,cAAkC,EAAE;AAG1C,KAAI,mBAAmB,OAAO,iBAAiB,QAAQ,EAAE;AACvD,cAAY,KAAK,iBAAiB,QAAQ;;AAG5C,KAAI,mBAAmB,OAAO,iBAAiB,iBAAiB,EAAE;AAChE,cAAY,KAAK,iBAAiB,iBAAiB;;AAGrD,KAAI,mBAAmB,OAAO,iBAAiB,UAAU,EAAE;AACzD,cAAY,KAAK,iBAAiB,UAAU;;AAG9C,QAAO;;;;;AAMT,SAAgB,mBAAmB,OAAe,MAAiC;AACjF,SAAQ,QAAQ,UAAU;;;;;AAM5B,SAAgB,gCAAgC,OAAuB;CACrE,MAAM,cAAc,0BAA0B,MAAM;AAGpD,KAAI,CAAC,YAAY,SAAS,iBAAiB,QAAQ,EAAE;AACnD,SAAO;;AAGT,KAAI,CAAC,YAAY,SAAS,iBAAiB,iBAAiB,EAAE;AAC5D,SAAO;;AAGT,KAAI,CAAC,YAAY,SAAS,iBAAiB,UAAU,EAAE;AACrD,SAAO;;AAIT,KAAI,YAAY,WAAW,GAAG;AAC5B,SAAO;;AAIT,QAAO,iBAAiB,YAAY,KAAK,KAAK;;AAGhD,SAAgB,kBAAkB,iBAAwD;AACxF,QAAO;EACL,SAAS,IAAI,UAAU,gBAAgB,QAAQ;EAC/C,OAAO,IAAI,UAAU,gBAAgB,MAAM;EAC3C,WAAW,IAAI,UAAU,gBAAgB,UAAU;EACnD,UAAU,gBAAgB,SAAS,IAAI,aAAa;EACpD,cAAc,gBAAgB;EAC9B,6BAA6B,IAAI,UAAU,gBAAgB,4BAA4B;EACvF,aAAa,iBAAiB,gBAAgB,YAAY;EAC3D;;AAGH,SAAgB,aAAa,YAAyC;AACpE,QAAO;EACL,QAAQ,WAAW;EACnB,QAAQ,IAAI,UAAU,WAAW,OAAO;EACxC,aAAa,IAAI,UAAU,WAAW,YAAY;EAClD,iBAAiB,IAAI,UAAU,WAAW,gBAAgB;EAC1D,sBAAsB,IAAI,UAAU,WAAW,qBAAqB;EACpE,YAAY,WAAW;EACxB;;AAGH,SAAgB,iBAAiB,gBAAqD;AACpF,QAAO;EACL,YAAY,IAAI,UAAU,eAAe,WAAW;EACpD,gBAAgB,IAAI,UAAU,eAAe,eAAe;EAC5D,iBAAiB,IAAI,UAAU,eAAe,gBAAgB;EAC9D,qBAAqB,IAAI,UAAU,eAAe,oBAAoB;EACtE,kBAAkB,IAAI,UAAU,eAAe,iBAAiB;EAChE,sBAAsB,IAAI,UAAU,eAAe,qBAAqB;EACxE,WAAW,IAAI,UAAU,eAAe,UAAU;EAClD,OAAO,eAAe;EACtB,QAAQ,eAAe;EACvB,kBAAkB,eAAe;EAClC;;;;;ACjLH,SAAgB,oBACd,YACA,mBACA,kBACA,UACmC;CACnC,MAAM,SAAS,MAAiB,EAAE,UAAU;CAG5C,MAAM,YAAY,wBAAwB,YAAY,mBAAmB,iBAAiB;CAC1F,MAAM,SAAS,UAAU,SAAS;CAGlC,MAAM,aAAa,IAAI,KAAqB;AAC5C,MAAK,MAAM,KAAK,YAAY;AAC1B,aAAW,IAAI,EAAE,cAAc,UAAU,EAAE,EAAE,iBAAiB,UAAU,CAAC;;CAE3E,MAAM,eAAe,IAAI,IACvB,kBAAkB,KAAK,MAAM,WAAW,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,MAAmB,CAAC,CAAC,EAAE,CAC3F;CAGD,SAAS,UAAU,IAA4B;EAC7C,IAAI,IAAI,GAAG,GAAG;AACd,OAAK,MAAM,KAAK,GAAI,KAAI,EAAE,gBAAgB,GAAG,EAAE,CAAE,KAAI,EAAE;AACvD,SAAO;;CAIT,SAAS,UAAU,QAAqB,OAAuC;EAC7E,MAAM,MAAM,OAAO,SAAS,GAC1B,OAAO,MAAM,SAAS;AACxB,MAAI,CAAC,OAAO,CAAC,KAAM,QAAO,kBAAkB;AAC5C,MAAI,CAAC,OAAO,KAAM,QAAO,kBAAkB;AAC3C,MAAI,OAAO,CAAC,KAAM,QAAO,kBAAkB;EAE3C,MAAM,OAAO,UAAU,OAAO,EAC5B,OAAO,UAAU,MAAM;AACzB,MAAI,KAAK,GAAG,KAAK,CAAE,QAAO,kBAAkB;AAC5C,MAAI,KAAK,GAAG,KAAK,CAAE,QAAO,kBAAkB;AAC5C,SAAO,kBAAkB;;CAI3B,SAAS,SAAS,MAAiB,QAAiE;EAClG,IAAI,IAAI,CAAC,GAAG,kBAAkB,EAC5B,IAAI,CAAC,GAAG,iBAAiB;AAC3B,UAAQ,QAAR;GACE,KAAK;AACH,QAAI,CAAC,EAAE,MAAM,MAAM,EAAE,OAAO,KAAK,CAAC,CAAE,GAAE,KAAK,KAAK;AAChD;GACF,KAAK;AACH,QAAI,EAAE,QAAQ,MAAM,CAAC,EAAE,OAAO,KAAK,CAAC;AACpC;GACF,KAAK;AACH,QAAI,CAAC,EAAE,MAAM,MAAM,EAAE,OAAO,KAAK,CAAC,CAAE,GAAE,KAAK,KAAK;AAChD;GACF,KAAK;AACH,QAAI,EAAE,QAAQ,MAAM,CAAC,EAAE,OAAO,KAAK,CAAC;AACpC;;EAGJ,MAAM,QAAQ,wBAAwB,YAAY,GAAG,EAAE;EACvD,IAAI,SAAS,UAAU,WAAW,MAAM;AAGxC,MAAI,WAAW,UAAU;GACvB,MAAM,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC;AAG3C,OAAI,CAAC,KAAK;AACR,aAAS,SAAS,kBAAkB,cAAc,kBAAkB;cAG3D,QAAQ;AACjB,QAAI,MAAM,WAAW,GAAG;AACtB,cAAS,kBAAkB;eAClB,aAAa,IAAI,IAAI,EAAE;AAChC,cAAS,kBAAkB;;;;AAOjC,MAAI,WAAW,UAAU;GACvB,MAAM,OAAO,MAAM,SAAS;AAC5B,YACE,CAAC,UAAU,OACP,kBAAkB,gBAClB,UAAU,OACR,kBAAkB,cAClB,kBAAkB;;AAI5B,MAAI,WAAW,YAAY;AACzB,OAAI,CAAC,QAAQ;AACX,aAAS,kBAAkB;cAClB,MAAM,WAAW,GAAG;AAC7B,aAAS,kBAAkB;UACtB;IACL,MAAM,IAAI,UAAU,UAAU,EAC5B,IAAI,UAAU,MAAM;AACtB,QAAI,EAAE,GAAG,EAAE,CAAE,UAAS,kBAAkB;aAC/B,EAAE,GAAG,EAAE,CAAE,UAAS,kBAAkB;QACxC,UAAS,kBAAkB;;;EAKpC,IAAI;AACJ,MAAI,MAAM,SAAS,GAAG;AACpB,cAAW,MAAM;AACjB,QAAK,MAAM,KAAK,OAAO;AACrB,QAAI,EAAE,gBAAgB,GAAG,SAAS,gBAAgB,EAAE;AAClD,gBAAW;;;;EAKjB,MAAM,kBAA+C,WACjD;GACE,iBAAiB,MAAM,KACrB,IAAI,IAAI,MAAM,SAAS,MAAM,EAAE,gBAAgB,CAAC,KAAK,WAAS,CAACC,OAAK,UAAU,EAAEA,OAAK,CAAC,CAAC,CAAC,QAAQ,CACjG;GACD,oBAAoB,MAAM,KAAK,IAAI,IAAI,MAAM,SAAS,MAAM,EAAE,kBAAkB,CAAC,CAAC;GAClF,gBAAgB,MAAM,KACpB,IAAI,IAAI,MAAM,SAAS,MAAM,EAAE,cAAc,CAAC,KAAK,WAAS,CAACA,OAAK,UAAU,EAAEA,OAAK,CAAC,CAAC,CAAC,QAAQ,CAC/F;GACD,mBAAmB,MAAM,KAAK,IAAI,IAAI,MAAM,SAAS,MAAM,EAAE,iBAAiB,CAAC,CAAC;GAChF,kBAAkB,SAAS;GAC3B,iBAAiB,SAAS;GAC3B,GACD;AAEJ,SAAO;GACL;GACA,gBAAgB;GAChB,YAAY;GACb;;CAIH,MAAM,SAA4C,EAAE;AACpD,MAAK,MAAM,QAAQ,UAAU;EAC3B,MAAM,MAAM,MAAM,KAAK;EACvB,MAAM,SAA4B,EAAE;AAGpC,MAAI,CAAC,iBAAiB,MAAM,MAAM,EAAE,OAAO,KAAK,CAAC,EAAE;AACjD,UAAO,eAAe,SAAS,MAAM,SAAS;;EAIhD,MAAM,UAAU,IAAI,IAAI,WAAW,SAAS,MAAM,EAAE,gBAAgB,KAAK,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC9F,MACE,QAAQ,IAAI,IAAI,IAChB,CAAC,iBAAiB,MAAM,MAAM,EAAE,OAAO,KAAK,CAAC,IAC7C,CAAC,kBAAkB,MAAM,MAAM,EAAE,OAAO,KAAK,CAAC,EAC9C;AACA,UAAO,eAAe,SAAS,MAAM,SAAS;;AAGhD,MAAI,kBAAkB,MAAM,MAAM,EAAE,OAAO,KAAK,CAAC,EAAE;AACjD,UAAO,iBAAiB,SAAS,MAAM,QAAQ;;AAEjD,MAAI,iBAAiB,MAAM,MAAM,EAAE,OAAO,KAAK,CAAC,EAAE;AAChD,UAAO,oBAAoB,SAAS,MAAM,WAAW;;AAGvD,SAAO,OAAO;;AAGhB,QAAO;;AAGT,SAAgB,wBACd,YACA,mBACA,kBACa;CAEb,MAAM,aAAa,WAAW,QAC3B,MAAM,EAAE,sBAAsB,SAAS,SAAS,EAAE,qBAAqB,SAAS,MAClF;CAID,MAAM,gBAAgB,IAAI,KAAqB;AAC/C,MAAK,MAAM,KAAK,YAAY;AAC1B,gBAAc,IAAI,EAAE,cAAc,UAAU,EAAE,EAAE,iBAAiB,UAAU,CAAC;;CAE9E,MAAM,eAAe,IAAI,KAAa;AACtC,MAAK,MAAM,QAAQ,mBAAmB;EACpC,MAAM,MAAM,cAAc,IAAI,KAAK,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAK;AAER,UAAO,EAAE;;AAEX,eAAa,IAAI,IAAI;;CAIvB,MAAM,WAAW,WAAW,QACzB,MACC,kBAAkB,MAAM,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,IACxD,EAAE,gBAAgB,MAAM,MAAM,iBAAiB,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAC3E;AACD,KAAI,SAAS,WAAW,EAAG,QAAO,EAAE;CAGpC,MAAM,YAAyC,EAAE;AACjD,MAAK,MAAM,KAAK,UAAU;EACxB,MAAM,KAAK,EAAE,kBAAkB,UAAU;AACzC,MAAI,CAAC,UAAU,KAAK;AAClB,aAAU,MAAM,EAAE;;AAEpB,YAAU,IAAI,KAAK,EAAE;;CAIvB,MAAM,cAA6B,EAAE;AAErC,MAAK,MAAM,SAAS,OAAO,OAAO,UAAU,EAAE;EAC5C,MAAM,WAAW,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,iBAAiB,UAAU,CAAC,CAAC;EACzE,IAAI,YAAY;AAChB,OAAK,MAAM,MAAM,cAAc;AAC7B,OAAI,CAAC,SAAS,IAAI,GAAG,EAAE;AACrB,gBAAY;AACZ;;;AAGJ,MAAI,WAAW;AACb,eAAY,KAAK,MAAM;;;AAK3B,KAAI,YAAY,WAAW,EAAG,QAAO,EAAE;AAEvC,QAAO,YAAY,MAAM;;;;;ACnP3B,MAAa,6BAA6B,OACxC,SACA,WACA,UACyB;CACzB,MAAM,iBACJ,MAAM,QAAQ,QAAQ,aAAa,IAAI,CACrC,EACE,QAAQ;EACN,OAAO,MAAM,UAAU;EACvB,QAAQ;EACT,EACF,EACD,EACE,QAAQ;EACN,OAAO,UAAU,UAAU;EAC3B,QAAQ,IAAI;EACb,EACF,CACF,CAAC,EACF,KAAK,MAAM,EAAE,UAAU;AAEzB,QAAO;;AAGT,MAAa,wBAAwB,OACnC,SACA,gBACA,SACA,cACA,oBACoF;CACpF,MAAM,kBAAmC,MAAM,QAAQ,QAAQ,aAAa,MAAM,gBAAgB,YAAY;CAC9G,MAAM,eAAe,aAAa,kBAAkB,gBAAgB,gBAAgB;CAEpF,MAAM,wBAAwB,MAAM,uCAAuC;EACzE;EACA;EACA;EACA;EACA;EACA,UAAU,aAAa;EACxB,CAAC;AAEF,QAAO;;;;;;;;ACvCT,SAAgB,gBAAgB,MAAwB;AACtD,QAAO,IAAIC,KAAG,KAAK;;AAGrB,SAAgB,kBAAkB,cAAqD;AACrF,QAAO;EACL,SAAS,aAAa,QAAQ,UAAU;EACxC,OAAO,aAAa,MAAM,UAAU;EACpC,WAAW,aAAa,UAAU,UAAU;EAC5C,UAAU,aAAa,SAAS,IAAI,aAAa;EACjD,cAAc,aAAa;EAC3B,6BAA6B,aAAa,4BAA4B,UAAU;EAChF,aAAa,iBAAiB,aAAa,YAAY;EACxD;;AAGH,SAAgB,aAAa,SAAsC;AACjE,QAAO;EACL,QAAQ,QAAQ;EAChB,QAAQ,QAAQ,OAAO,UAAU;EACjC,aAAa,QAAQ,YAAY,UAAU;EAC3C,iBAAiB,QAAQ,gBAAgB,UAAU;EACnD,sBAAsB,QAAQ,qBAAqB,UAAU;EAC7D,YAAY,QAAQ;EACrB;;AAGH,SAAgB,iBAAiB,aAAkD;AACjF,QAAO;EACL,YAAY,YAAY,WAAW,UAAU;EAC7C,gBAAgB,YAAY,eAAe,UAAU;EACrD,iBAAiB,YAAY,gBAAgB,UAAU;EACvD,qBAAqB,YAAY,oBAAoB,UAAU;EAC/D,kBAAkB,YAAY,iBAAiB,UAAU;EACzD,sBAAsB,YAAY,qBAAqB,UAAU;EACjE,WAAW,YAAY,UAAU,UAAU;EAC3C,OAAO,YAAY;EACnB,QAAQ,YAAY;EACpB,kBAAkB,YAAY;EAC/B;;;;;;;;ACLH,IAAa,6BAAb,MAAa,mCAAmC,MAAM;CACpD;CACA;CAEA,YAAY,SAAiB,SAAwB,aAA4B;AAC/E,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,UAAU;AACf,OAAK,cAAc;AAGnB,MAAI,MAAM,mBAAmB;AAC3B,SAAM,kBAAkB,MAAM,2BAA2B;;;;AAK/D,eAAsB,uCAAuC,OAOmB;CAC9E,IAAI,eAAe,MAAM;CAEzB,MAAM,iBAAiB,MAAM,SAAS,QAAQ,MAAM,EAAE,OAAO;CAE7D,MAAM,EAAE,QAAQ,kBAAkB,aAAa,yBAAyB,yCACtE,gBACA,MAAM,SACN,MAAM,cACN,qBAAqB,OACtB;AAED,KAAI;EACF,MAAM,mBAAmB,MAAM,2BAA2B;GACxD,SAAS,MAAM;GACf,SAAS,MAAM;GACf,cAAc,MAAM;GACpB,gBAAgB,MAAM,aAAa;GACnC,UAAU,MAAM;GAChB,iBAAiB,MAAM;GACxB,CAAC;AAEF,mBAAiB,YAAY,mBAAmB,yBAAyB,iBAAiB;AAC1F,mBAAiB,YAAY,uBAAuB,yBAAyB,qBAAqB;AAElG,iBAAe,aAAa,kBAAkB,MAAM,aAAa,SAAS,iBAAiB;UACpF,GAAG;AACV,UAAQ,IAAI,KAAK,EAAE;EACnB,MAAM,EAAE,QAAQ,iBAAiB,aAAa,wBAAwB,8BACpE,gBACA,MAAM,SACN,MAAM,cACN,qBAAqB,YACtB;EAED,MAAM,EAAE,QAAQ,mBAAmB,aAAa,0BAA0B,8BACxE,gBACA,MAAM,SACN,MAAM,cACN,qBAAqB,QACtB;AAED,eAAa,eACX,IAAI,YACF,mBACA,uBACA,iBACA,qBACA,kBACA,sBACA,IAAI,UAAU,EAAE,EAChB,EAAE,EACF,EAAE,EACF,KACD,CACF;AAGD,MAAI,aAAa,4BAA4B;AAC3C,UAAO;IAAE;IAAc,OAAO;IAAG;;;AAIrC,QAAO,EAAE,cAAc;;AAGzB,eAAsB,2BAA2B,OAOpB;CAC3B,MAAM,EAAE,SAAS,SAAS,cAAc,gBAAgB,UAAU,oBAAoB;CAEtF,MAAM,iBAAiB,SAAS,QAAQ,MAAM,EAAE,OAAO;CAEvD,MAAM,EAAE,oBAAoB,oBAAoB,gBAAgB,SAAS,EAAE,EAAE,cAAc,GAAG;CAE9F,MAAM,YAAY,qBAAqB,oBAAoB,EAAE,OAAO,MAAW,CAAC;CAChF,MAAM,aAAa,MAAM,QAAQ,SAAS,WAAW,mBAAmB,YAAY,EAAE;CAEtF,MAAM,gBAAgB,cAAc,SAAS;EAC3C,YAAY,IAAI,UAAU,+CAA+C;EACzE,UAAU,QAAQ,SAAS;EAC3B,UAAU;EACX,CAAC;CAEF,MAAM,eAKF;EACF,kBAAkB,EAAE;EACpB,mBAAmB,EAAE;EACrB,MAAM,EAAE;EACR,KAAK;EACN;CACD,MAAM,cACJ,gBAAgB,SAAS,IACrB,MAAM,mBAAmB;EACvB,gBAAgB,gBAAgB,KAAK,WAAW,OAAO,UAAU;EACjE,UAAU,QAAQ;EACnB,CAAC,GACF;EAAE,cAAc,EAAE;EAAE,MAAM,EAAE;EAAE;CAEpC,MAAM,iBAAiB,MAAM,kBAC3B,SACA,gBACA,SACA,UACA,eAAe,KAAK,MAAM,EAAE,OAAO,EACnC,EAAE,EACF,gBACD;CAED,MAAM,UAAU,aAAa,MAAM,CAAC,aAAa,IAAI,GAAG,EAAE;CAE1D,MAAM,MAAmC,EAAE;AAE3C,KAAI,aAAa,iBAAiB,SAAS,GAAG;AAC5C,MAAI,KACF,GAAG,mCACD,CAAC,UAAU,EACX;GACE;GACA,GAAG,aAAa,iBAAiB,KAAK,OAAO,GAAG,YAAY;GAC5D,GAAG,aAAa,kBAAkB,KAAK,OAAO,GAAG,YAAY;GAC9D,EACD;GACE;GACA,UAAU,QAAQ,SAAS;GAC3B,MAAM,CAAC,GAAG,YAAY,MAAM,GAAG,QAAQ;GACxC,CACF,CACF;;CAGH,MAAM,YAAY,IAAI,mBAAmB;EACvC,UAAU,QAAQ,SAAS;EAC3B,iBAAiB;EACjB,cAAc,CAAC,GAAG,YAAY,aAAa;EAC5C,CAAC,CAAC,mBAAmB,CAAC,GAAG,YAAY,KAAK,CAAC;CAE5C,MAAM,QAAQ,IAAI,qBAAqB,UAAU;AAEjD,KAAI,KAAK,MAAM;CAEf,MAAM,WAAW,IAAI,mBAAmB;EACtC,UAAU,QAAQ,SAAS;EAC3B,iBAAiB;EACjB,cAAc,CAAC,GAAG,eAAe,aAAa;EAC/C,CAAC,CAAC,mBAAmB,EAAE,CAAC;CAEzB,MAAM,aAAa,IAAI,qBAAqB,SAAS;AACrD,KAAI,KAAK,WAAW;AAEpB,KAAI,IAAI,SAAS,GAAG;AAClB,UAAQ,MAAM,yBAAyB,IAAI,OAAO;AAClD,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,MAAM,mBAAmB,MAAM,eAAe,QAAQ,SAAS,WAAW,aAAa,KAAK,CAAC,eAAe,CAAC;CAE7G,MAAM,uBAAuB,iBAAiB,MAAM,WAAW,OAAO,sBAAsB,SAAS,EAAE;AAEvG,KAAI,CAAC,sBAAsB;AACzB,QAAM,IAAI,MAAM,oBAAoB;;CAGtC,MAAM,mBAAmB,aAAa,iBACpC,OAAO,KAAK,qBAAqB,sBAAsB,GAAG,KAAK,IAAI,SAAS,EAC5E,QAAQ,IACT;AAED,KAAI,iBAAiB,YAAY,WAAW,iBAAiB,YAAY,aAAa;AACpF,UAAQ,IACN,uBACA,gBAAgB,KAAK,WAAW,OAAO,UAAU,CAClD;AACD,UAAQ,IAAI,4CAA4C,iBAAiB,YAAY,YAAY;AACjG,UAAQ,IAAI,wCAAwC,iBAAiB,YAAY,QAAQ;AAEzF,MAAI,iBAAiB,YAAY,YAAY,MAAM;GACjD,MAAM,aAAa,CAAC,yBAAyB,iBAAiB,YAAY,WAAW,CAAC,QAAQ;GAC9F,MAAM,iBAAiB,CAAC,yBAAyB,iBAAiB,YAAY,eAAe,CAAC,QAAQ;GACtG,MAAM,mBAAmB,CAAC,yBAAyB,iBAAiB,YAAY,iBAAiB,CAAC,QAAQ;GAC1G,MAAM,uBAAuB,CAAC,yBAC5B,iBAAiB,YAAY,qBAC9B,CAAC,QAAQ;GACV,MAAM,kBAAkB,CAAC,yBAAyB,iBAAiB,YAAY,gBAAgB,CAAC,QAAQ;GACxG,MAAM,sBAAsB,CAAC,yBAAyB,iBAAiB,YAAY,oBAAoB,CAAC,QAAQ;AAEhH,OACE,cACA,kBACA,oBACA,wBACA,mBACA,qBACA;AACA,WAAO;;;AAGX,UAAQ,MAAM,0CAA0C;GACtD,SAAS,iBAAiB,YAAY;GACtC,aAAa,iBAAiB,YAAY;GAC3C,CAAC;AACF,QAAM,IAAI,2BACR,0CACA,iBAAiB,YAAY,SAC7B,iBAAiB,YAAY,YAC9B;;AAGH,QAAO;;AAGT,eAAsB,kBACpB,SACA,gBACA,OACA,UACA,gBACA,eACA,iBACA;CACA,MAAM,iBAAiB,2BAA2B,UAAU,OAAO,gBAAgB,cAAc;CACjG,MAAM,eAAe,0BAA0B,gBAAgB,gBAAgB;CAE/E,MAAM,KAAK,MAAMC,qBAAa,kBAC5B,SACA,EACE,cAAc,gBACf,EACD,aAAa,KAAK,aAAa;EAAE,QAAQ;EAAS,UAAU;EAAO,YAAY;EAAO,EAAE,CACzF;AAED,QAAO;EAAE,cAAc,CAAC,GAAG;EAAE,MAAM,EAAE;EAAE;;AAEzC,eAAsB,mBAAmB,QAGkD;AAEzF,OAAM,IAAI,MAAM,kDAAkD;;;;;;AAcpE,eAAsB,qBAAqB,OAG0B;CACnE,MAAM,YAAY,MAAM,cAAc,aAAa,MAAM,YAAY,SAAS;CAC9E,MAAM,sBAAsB,QAAQ,UAAU;CAG9C,MAAM,qBAAqB,yBAAyB,IAAI,UAAU,EAAE,CAAC;CACrE,MAAM,gBAA8B,MAAM,GAAG,CAAC,KAAK;EACjD,QAAQ;EACR,QAAQ,IAAI,UAAU,mCAAmC;EACzD,aAAa;EACb,iBAAiB;EACjB,sBAAsB;EACtB,YAAY,IAAIC,KAAG,EAAE;EACtB,CAAC;CACF,MAAM,aAA8B;EAClC,OAAO,MAAM,YAAY,MAAM;EACpB;EACX,gBAAgB,EAAE,UAAU,eAAe;EAC3C,aAAa;GACX,YAAY,EACV,OAAO;IAAC;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAE,EACxD;GACD,gBAAgB,EACd,OAAO;IAAC;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;IAAE,EACxD;GACD,WAAW,IAAIA,KAAG,EAAE;GACpB,OAAO;GACP,QAAQ,EAAE;GACV,iBAAiB,yBAAyB,IAAI,UAAU,EAAE,CAAC;GAC3D,qBAAqB,yBAAyB,IAAI,UAAU,EAAE,CAAC;GAC/D,kBAAkB,yBAAyB,IAAI,UAAU,EAAE,CAAC;GAC5D,sBAAsB,yBAAyB,IAAI,UAAU,EAAE,CAAC;GAChE,UAAU;GACV,aAAa;GACb,uBAAuB;GACvB,gBAAgB;GAChB,SAAS;GACV;EACD,6BAA6B,IAAI,UAAU,mCAAmC;EAC9E,cAAc,IAAIA,KAAG;GAAC;GAAG;GAAG;GAAE,CAAC;EAChC;CAED,MAAM,UAAU,aAAa,kBAAkB,oBAAoB,WAAW,WAAW;CAEzF,MAAM,iBAAiB,IAAI,oBAAoB,oBAAoB,WAAW,MAAM,aAAa,QAAQ;AAEzG,QAAO;EACL,SAAS;EACT,IAAI,MAAM,MAAM,YAAY,qBAAqB,EAAE,gBAAgB,qBAAqB,CAAC;EAC1F;;AAGH,SAAgB,oBACd,UACA,OACA,iBACA,cACA,eAAuB,GACiF;CACxG,MAAM,cAAc,SACjB,QAAQ,YAAY,QAAQ,OAAO,CACnC,KAAK,YAAY,MAAM,IAAI,QAAQ,OAAO,UAAU,CAAC,CAAC,CACtD,QAAQ,SAA2C,CAAC,CAAC,KAAK;CAE7D,MAAM,WAAW,CAAC,GAAG,aAAa,GAAG,gBAAgB;CAErD,MAAM,aAAa,SAAS,QAAQ,SAAS;AAC3C,MACE,KAAK,OAAO,gBAAgB,YAAY,mBACxC,KAAK,OAAO,gBAAgB,YAAY,iBACxC,KAAK,OAAO,gBAAgB,YAAY,uBACxC;AAEA,UAAO;;EAET,MAAM,cAAc,aAAa,IAAI,KAAK,QAAQ,UAAU,CAAC;EAC7D,MAAM,SAAS,KAAK,OAAO;EAC3B,MAAM,cAAc,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;EACjD,MAAM,aAAa,KAAK,MAAM,aAAa,YAAY,YAAY,UAAU,UAAU,GAAG,KAAK,KAAK,CAAC;EACrG,MAAM,iBAAiB,KAAK,IAAI,SAAS,cAAc,EAAE;EACzD,MAAM,UAAU,cAAc,aAAa;AAE3C,SAAO;GACP;AAEF,KAAI,WAAW,SAAS,GAAG;EACzB,MAAM,iBAAwD,EAAE;EAChE,MAAM,kBAA8C,EAAE;EACtD,MAAM,iBAAiB,IAAI,KAAa;EACxC,MAAM,gBAAgB,IAAI,KAAa;AAEvC,aAAW,SAAS,SAAS;AAC3B,OACE,KAAK,OAAO,gBAAgB,YAAY,mBACxC,KAAK,OAAO,gBAAgB,YAAY,uBACxC;IACA,MAAM,MAAM,KAAK,UAAU,UAAU;AACrC,QAAI,CAAC,eAAe,IAAI,IAAI,EAAE;AAC5B,oBAAe,IAAI,IAAI;AACvB,qBAAgB,KAAK,EAAE,WAAW,KAAK,WAAW,CAAC;;cAGrD,KAAK,OAAO,gBAAgB,YAAY,kBACxC,KAAK,OAAO,gBAAgB,YAAY,sBACxC,KAAK,OAAO,gBAAgB,YAAY,gBACxC;IACA,MAAM,cAAc,aAAa,IAAI,KAAK,QAAQ,UAAU,CAAC;IAE7D,MAAM,UAAU,aAAa,eAAe;IAC5C,MAAM,SAAS,KAAK,OAAO,WAAW;IACtC,MAAM,UAAU,eAAe,OAAO;AACtC,QAAI,CAAC,cAAc,IAAI,QAAQ,EAAE;AAC/B,mBAAc,IAAI,QAAQ;AAC1B,oBAAe,KAAK;MAAE,QAAQ;MAAS;MAAS,CAAC;;;IAGrD;AAEF,SAAO;GAAE;GAAgB;GAAiB;;AAG5C,QAAO;EAAE,gBAAgB,EAAE;EAAE,iBAAiB,EAAE;EAAE;;;;;gBCvcC;sBAQnB;AAIlC,eAAsB,wBACpB,SACA,MACA,MAC8B;CAC9B,MAAM,KAAK,MAAMC,qBAAa,wBAC5B,SACA,EACQ,MACP,EACD,EAAE,eAAe,MAAM,CACxB;AAED,QAAO;EACL,cAAc,CAAC,GAAG;EAClB,MAAM,EAAE;EACT;;AAGH,eAAsB,kCACpB,SACA,OACA,oBACA,UACA,YAC8B;CAC9B,MAAM,CAAC,eAAe,UAAU,uBAC9B,CAAC,OAAO,KAAK,mBAAmB,QAAQ,EAAE,MAAM,UAAU,CAAC,EAC3D,QAAQ,UACT;CACD,MAAM,cAAc,gBAAgB,mBAAmB;CACvD,MAAM,UAAU,qBAAqB,YAAY;CACjD,MAAM,UAAU,oBAAoB,YAAY;CAChD,MAAM,gBAAgB,sBAAsB,YAAY;CAExD,MAAM,OAAO;EACX;GAAE,QAAQ;GAAa,UAAU;GAAO,YAAY;GAAO;EAC3D;GAAE,QAAQ;GAAe,UAAU;GAAO,YAAY;GAAM;EAC5D;GAAE,QAAQ;GAAS,UAAU;GAAO,YAAY;GAAO;EACvD;GAAE,QAAQ;GAAoB,UAAU;GAAO,YAAY;GAAO;EAClE;GAAE,QAAQ,cAAc;GAAW,UAAU;GAAO,YAAY;GAAO;EACvE;GAAE,QAAQ,aAAa;GAAW,UAAU;GAAO,YAAY;GAAO;EACvE;CAGD,MAAM,OAAO,OAAO,KAAK,WAAW,GAAG,EAAE,CAAC;CAE1C,MAAM,YAAY,IAAI,uBAAuB;EAC3C;EACA,WAAW;EACX;EACD,CAAC;CAEF,MAAM,gBAAgB;EAAC;EAAY;EAAS;EAAQ;CAEpD,MAAM,KAAK,MAAMA,qBAAa,sCAC5B,SACA;EACE,gBAAgB;EACN;EACV,UAAU;EACV;EACA,WAAW;EACZ,EACD,cAAc,KAAK,SAAS;EAAE,QAAQ;EAAK,UAAU;EAAO,YAAY;EAAO,EAAE,EACjF,EACE,MAAM,IAAIC,KAAG,EAAE,EAChB,CACF;AAED,QAAO;EACL,cAAc,CAAC,GAAG;EAClB,MAAM,EAAE;EACT;;AAGH,eAAsB,kBACpB,SACA,OACA,MACA,UACA,UACA,YACA,eAA0B,kBAC1B,cAAkE,EAAE,EACtC;CAC9B,MAAM,gBAAgB,uBAAuB,WAAW;CAGxD,MAAM,uBAAuB;EAC3B,GAAG;EACH,cAAc,WAAW;EACzB,gBAAgB,CAAC,EAAE;EACnB,gBAAgB,CAAC,EAAE;EACpB;CAED,MAAM,KAAK,MAAMD,qBAAa,kBAC5B,SACA;EACE,YAAY;EACZ;EACA;EACA;EACA;EACA,GAAG;EAEJ,EACD,EACE,YAAY,sBACb,CACF;AAED,QAAO;EACL,cAAc,CAAC,GAAG;EAClB,MAAM,EAAE;EACT;;;;;AC9HH,SAAgB,WAAW,UAA6C;AACtE,QAAO;EACL,OAAO,IAAI,UAAU,SAAS,MAAM;EACpC,SAAS,IAAI,UAAU,SAAS,QAAQ;EACzC;;;;;ACNH,SAAgB,WAAW,OAA0C;AACnE,QAAO;EACL,OAAO,MAAM,MAAM,UAAU;EAC7B,SAAS,MAAM,QAAQ,UAAU;EAClC;;;;;ACFH,SAAgB,yBAAyB,wBAAqE;AAC5G,QAAO;EACL,WAAW,IAAI,UAAU,uBAAuB,UAAU;EAC1D,SAAS,IAAI,UAAU,uBAAuB,QAAQ;EACtD,aAAa,IAAI,UAAU,uBAAuB,YAAY;EAC9D,YAAY,uBAAuB;EACnC,iBAAiB;GACf,QAAQ,IAAI,UAAU,uBAAuB,gBAAgB,OAAO;GACpE,QAAQ,uBAAuB,gBAAgB;GAChD;EACD,UAAU,uBAAuB,SAAS,KAAK,aAAa;GAC1D,QAAQ,IAAI,UAAU,QAAQ,OAAO;GACrC,QAAQ,QAAQ;GACjB,EAAE;EACJ;;;;;gBCjBmC;sBAMJ;;;;;;;;;;;AAclC,MAAa,2BAA2B,OACtC,YACA,aACA,OAEI,EACF,gBAAgB,MACjB,KACkC;AACnC,KAAI,CAAC,cAAc,CAACE,aAAW;AAC7B,QAAM,IAAI,MAAM,mCAAmC;;AAGrD,KAAI;EACF,MAAM,YAAY,MAAM,WAAW,cAAc;EACjD,MAAMC,aAAW,MAAM,WAAW,yBAAyB,aAAa,WAAW,EACjF,SAAS,CACP,EACE,QAAQ;GACN,QAAQ;GACR,OAAOD,YAAU,UAAU;GAC5B,EACF,CACF,EACF,CAAC;EAEF,MAAM,eAAe,IAAI,KAAsD;AAG/E,QAAM,QAAQ,IACZC,WAAS,IAAI,OAAO,QAAQ;GAC1B,MAAM,gBAAgB,IAAI,QAAQ;GAClC,MAAM,YAAY,cAAc,OAAO;AAGvC,OACE,CAAC,UAAU,OAAO,cACjB,KAAK,mBACH,OAAO,UAAU,MAAM,WAAW,gBAAgB,IAAI,UAAU,SAC/D,UAAU,MAAM,WAAW,sBAAsB,UACrD;AACA;;GAGF,MAAM,mBAAmB,UAAU,MAAM,WAAW;GACpD,MAAM,gBAAgB,IAAI;GAC1B,MAAM,SAAS,OAAO,UAAU,MAAM,WAAW,MAAM,GAAG;GAE1D,MAAM,mBAAmB,aAAa,IAAI,iBAAiB,IAAI,EAAE;AACjE,gBAAa,IAAI,kBAAkB,CAAC,GAAG,kBAAkB;IAAE,QAAQ;IAAe;IAAQ,CAAC,CAAC;IAC5F,CACH;AAGD,SAAO,QAAQ,IACb,MAAM,KAAK,aAAa,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,kBAAkBA,gBAAc;GAC7E,MAAM,UAAU,gBAAgB,IAAI,UAAU,iBAAiB,CAAC;GAChE,MAAM,cAAc,oBAAoB,QAAQ;GAChD,MAAM,aAAaA,WAAS,QAAQ,KAAK,SAAS,MAAM,KAAK,QAAQ,EAAE;GACvE,MAAM,iBAAiBA,WAAS,QAAQ,KAAK,SAAU,IAAI,SAAS,KAAK,SAAS,MAAM,KAAM;GAC9F,MAAM,iBAAiBA,WAAS,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,OAAO;AAGnE,OAAI,CAAC,eAAe,GAAG,OAAO,OAAO,eAAe,OAAO,EAAE;AAC3D,mBAAe,QAAQ,eAAe,OAAO,eAAe,QAAQ,eAAe,EAAE,EAAE,CAAC,GAAG;;AAG7F,UAAO;IACL,WAAW,IAAI,UAAU,iBAAiB;IAC1C;IACA;IACA,UAAU;IACV;IACA,iBAAiB;IAClB;IACD,CACH;UACM,GAAG;AACV,UAAQ,MAAM,gCAAgC,EAAE;AAChD,SAAO,EAAE;;;;;;;;;;AAWb,MAAa,6BAA6B,OACxC,YACA,0BACkC;CAClC,MAAM,eAAe,MAAM,WAAW,cAAc;CACpD,MAAM,eAAe,IAAI,KAAsB;CAE/C,MAAM,wBAAmD,EAAE;CAC3D,MAAM,yBAAoD,EAAE;AAE5D,uBAAsB,SAAS,yBAAyB;EACtD,MAAM,cAAc,gBAAgB,qBAAqB;EACzD,MAAM,mBAAmB,qBAAqB,YAAY;EAC1D,MAAM,kBAAkB,oBAAoB,YAAY;AAExD,wBAAsB,qBAAqB,UAAU,IAAI;AACzD,yBAAuB,iBAAiB,UAAU,IAAI;GACtD;CAEF,MAAM,uBAAuB,OAAO,KAAK,uBAAuB;CAEhE,MAAM,oBAAoB,OAAO,aAC9B,MAAM,wCAAwC,YAAY,qBAAqB,EAAE,KAAK,IAAI,UAAU,CACnG,uBAAuB,qBAAqB,SAC5C,IAAI,QAAQ,KACb,CAAC,CACH;AAED,uBAAsB,SAAS,yBAAyB;EACtD,MAAM,eAAe,kBAAkB,kBAAkB,qBAAqB,UAAU,EAAE;EAC1F,MAAM,kBAAkB,sBAAsB,qBAAqB,UAAU;AAE7E,MAAI,CAAC,cAAc;AACjB,gBAAa,IAAI,gBAAgB,UAAU,EAAE,MAAM;AACnD;;AAGF,MAAI,CAAC,aAAa,OAAO,YAAY;AACnC,gBAAa,IAAI,gBAAgB,UAAU,EAAE,MAAM;AACnD;;EAGF,MAAM,kBAAkB,aAAa,MAAM,WAAW;EACtD,MAAM,WAAW,aAAa,QAAQ,OAAO,gBAAgB;AAC7D,eAAa,IAAI,qBAAqB,UAAU,EAAE,SAAS;GAC3D;AAEF,QAAO;;;;;;;;AAqCT,MAAa,qBAAqB,SAA+B;CAC/D,IAAI,SAAS;CAGb,MAAM,eAAe,KAAK,aAAa,OAAO;AAC9C,WAAU;CAGV,MAAM,oBAAoB,KAAK,gBAAgB,OAAO;AACtD,WAAU;CAGV,MAAM,SAAS,IAAI,UAAU,KAAK,SAAS,QAAQ,SAAS,GAAG,CAAC;AAChE,WAAU;CACV,MAAM,aAAa,IAAI,UAAU,KAAK,SAAS,QAAQ,SAAS,GAAG,CAAC;AACpE,WAAU;CAGV,MAAM,gBAAgB,KAAK,gBAAgB,OAAO;AAClD,WAAU;CACV,MAAM,QAAQ,KAAK,gBAAgB,OAAO;AAC1C,WAAU;CACV,MAAM,YAAY,IAAI,UAAU,KAAK,SAAS,QAAQ,SAAS,GAAG,CAAC;AACnE,WAAU;CAGV,MAAM,cAAc,IAAI,UAAU,KAAK,SAAS,QAAQ,SAAS,GAAG,CAAC;AACrE,WAAU;CACV,MAAM,QAAQ,KAAK,gBAAgB,OAAO;AAC1C,WAAU;CACV,MAAM,kBAAkB,KAAK,gBAAgB,OAAO;AACpD,WAAU;CACV,MAAM,oBAAoB,KAAK,gBAAgB,OAAO;AACtD,WAAU;CAGV,MAAM,kBAAkB,KAAK,gBAAgB,OAAO;AAGpD,QAAO;EACL;EACA,MAAM;GACJ;GACA,YAAY;IACV;IACA;IACD;GACD,QAAQ;IACN;IACA;IACA;IACD;GACF;EACD,OAAO;GACL,YAAY;IACV;IACA;IACA;IACA;IACD;GACD;GACD;EACF;;AAGH,MAAa,oBAAoB,OAC/B,YACA,0BAC6B;CAC7B,MAAM,oBAA+C,EAAE;CACvD,MAAM,yBAAoD,EAAE;CAC5D,MAAM,sBAAiD,EAAE;CACzD,MAAM,MAAuB,IAAI,KAA+C;AAEhF,uBAAsB,SAAS,yBAAyB;EACtD,MAAM,cAAc,gBAAgB,qBAAqB;EACzD,MAAM,mBAAmB,qBAAqB,YAAY;EAC1D,MAAM,gBAAgB,sBAAsB,YAAY;AAExD,oBAAkB,qBAAqB,UAAU,IAAI;AACrD,yBAAuB,qBAAqB,UAAU,IAAI;AAC1D,sBAAoB,qBAAqB,UAAU,IAAI;GACvD;CAEF,MAAM,qBAAqB,sBAAsB,KAC9C,yBAAyB,uBAAuB,qBAAqB,UAAU,EACjF;CACD,MAAM,kBAAkB,sBAAsB,KAC3C,yBAAyB,oBAAoB,qBAAqB,UAAU,EAC9E;CAED,MAAM,eAAe,CAAC,GAAG,oBAAoB,GAAG,gBAAgB,CAAC,KAAK,cAAYC,UAAQ,UAAU,CAAC;AAErG,QAAO,wCAAwC,YAAY,aAAa,CAAC,MAAM,iBAAiB;EAC9F,MAAM,iBAAiB,aAAa,MAAM,GAAG,mBAAmB,OAAO;EACvE,MAAM,cAAc,aAAa,MAAM,mBAAmB,OAAO;EACjE,MAAM,OAAO;AAEb,wBAAsB,SAAS,sBAAsB,UAAU;GAC7D,MAAM,gBAAgB,eAAe;GACrC,MAAM,aAAa,YAAY;AAE/B,OAAI,iBAAiB,YAAY;IAC/B,MAAM,eAAe,kBAAkB,cAAc,KAAK;IAC1D,MAAM,gBAAgB,kBAAkB,WAAW,KAAK;IACxD,MAAM,YAAY,cAAc,WAAW,OAAO,OAAO,aAAa,MAAM,WAAW,MAAM,UAAU,CAAC;IACxG,MAAM,cAAc,OAAO,cAAc,MAAM,WAAW,MAAM,UAAU,CAAC;AAE3E,QAAI,IAAI,qBAAqB,UAAU,EAAE;KACvC,MAAM,aAAa,MAAO,YAAY;KACtC,QAAQ;KACT,CAAC;;IAEJ;AAEF,SAAO;GACP;;;;;ACrTJ,SAAgB,yBAAyB,qBAAkE;AACzG,QAAO;EACL,WAAW,oBAAoB,UAAU,UAAU;EACnD,SAAS,oBAAoB,QAAQ,UAAU;EAC/C,aAAa,oBAAoB,YAAY,UAAU;EACvD,YAAY,oBAAoB;EAChC,iBAAiB;GACf,QAAQ,oBAAoB,gBAAgB,OAAO,UAAU;GAC7D,QAAQ,oBAAoB,gBAAgB;GAC7C;EACD,UAAU,oBAAoB,SAAS,KAAK,aAAa;GACvD,QAAQ,QAAQ,OAAO,UAAU;GACjC,QAAQ,QAAQ;GACjB,EAAE;EACJ;;;;;AC6BH,MAAM,kBAAkB,KAAK,KAAK;AAClC,MAAM,oBAAoB,kBAAkB;AAM5C,IAAM,OAAN,MAAM,KAAyB;CAC7B,YACE,AAAgBC,WAChB,AAAgB,MAChB,AAAgB,cAChB,AAAgB,OAChB,AAAgB,UAChB,AAAgB,WAChB,AAAgB,iBAChB,AAAgB,qBAChB,AAAgB,gBAChB,AAAgB,oBAChB,AAAgB,6BAChB,AAAgB,gBAChB,AAAgB,oBAChB,AAAgB,6BAChB,AAAgB,mCAChB,AAAgB,UAChB,AAAgB,cAChB,AAAgB,uBAChB,AAAgB,+BAChB,AAAgB,YAChB,AAAO,QACP,AAAgB,kBAChB,AAAgB,sBAChB,AAAgB,0BAChB,AAAgB,wBAChB,AAAgB,eAChB,AAAgB,eAChB,AAAgB,oBAChB,AAAgB,WAChB,AAAgB,OAChB,AAAgB,wBAChB,AAAgB,sBAChB,AAAgB,wBAChB,AAAgB,aAChB,AAAgB,aAChB,AAAgB,kBAChB,AAAgB,OAChB;EArCgB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACT;EACS;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;CAGlB,OAAO,cAAc,SAAiB,KAA4B;AAChE,SAAO,cAAc,SAAS,IAAI;;CAGpC,OAAO,WAAW,QAAmB,SAAiB,KAAmB,WAAoC;EAC3G,MAAM,gBAAgB,KAAK,cAAc,SAAS,IAAI;AACtD,SAAO,KAAK,kBAAkB,QAAQ,eAAe,UAAU;;CAGjE,OAAO,aAAa,UAA0B;EAC5C,MAAM,SAAS,IAAI,WACjB,SAAS,OAAO,iBAChB,SAAS,OAAO,kBAChB,SAAS,OAAO,qBAChB,SAAS,OAAO,sBAChB,SAAS,OAAO,cAChB,SAAS,OAAO,aAChB,SAAS,OAAO,UAChB,SAAS,OAAO,0BAChB,SAAS,OAAO,UAChB,SAAS,OAAO,aAChB,SAAS,OAAO,YAChB,SAAS,OAAO,cAChB,SAAS,OAAO,oBAChB,SAAS,OAAO,kBAChB,SAAS,OAAO,qBAChB,SAAS,OAAO,YAChB,SAAS,OAAO,YACjB;AACD,SAAO,IAAI,KACT,SAAS,SACT,SAAS,MACT,SAAS,cACT,SAAS,OACT,SAAS,UACT,SAAS,WACT,SAAS,iBACT,SAAS,qBACT,SAAS,gBACT,SAAS,oBACT,SAAS,6BACT,SAAS,gBACT,SAAS,oBACT,SAAS,6BACT,SAAS,mCACT,SAAS,UACT,SAAS,cACT,SAAS,uBACT,SAAS,+BACT,SAAS,YACT,QACA,SAAS,kBACT,SAAS,sBACT,SAAS,0BACT,SAAS,wBACT,SAAS,eACT,SAAS,eACT,SAAS,oBACT,SAAS,WACT,SAAS,OACT,SAAS,wBACT,SAAS,sBACT,SAAS,wBACT,SAAS,aACT,SAAS,YACV;;CAGH,OAAO,kBACL,WACA,eACA,WAEA,kBACA,OACM;EACN,MAAM,QAAQ,aAAaA,WAAS,eAAe,UAAU;AAC7D,SAAO,IAAI,KACT,MAAM,SACN,MAAM,MACN,MAAM,cACN,MAAM,OACN,MAAM,UACN,MAAM,WACN,MAAM,iBACN,MAAM,qBACN,MAAM,gBACN,MAAM,oBACN,MAAM,6BACN,MAAM,gBACN,MAAM,oBACN,MAAM,6BACN,MAAM,mCACN,MAAM,UACN,MAAM,cACN,MAAM,uBACN,MAAM,+BACN,MAAM,YACN,MAAM,QACN,MAAM,kBACN,MAAM,sBACN,MAAM,0BACN,MAAM,wBACN,MAAM,eACN,MAAM,eACN,MAAM,oBACN,MAAM,WACN,MAAM,OACN,MAAM,wBACN,MAAM,sBACN,MAAM,wBACN,MAAM,aACN,kBAAkB,QAClB,kBACA,MACD;;CAGH,OAAO,iBAAiB,MAAY,cAAiF;EACnH,MAAM,UAAU,OAAO,OAAO,KAAK,UAAU;AAE7C,SAAO,OAAO,SAAS,KAAK;AAE5B,UAAQ,SAAS,OAAO,OAAO,EAAE,EAAE,KAAK,OAAO;AAC/C,UAAQ,OAAO,kBAAkB,UAAU,IAAI,KAAK,OAAO,iBAAiB,aAAa,gBAAgB;AACzG,UAAQ,OAAO,mBAAmB,UAAU,IAAI,KAAK,OAAO,kBAAkB,aAAa,iBAAiB;AAE5G,SAAO;;CAGT,OAAO,SACL,aACA,YAAuB,UAAU,MACjC,gBAAyB,OACd;AACX,SAAO,SAAS,aAAa,WAAW,cAAc;;CAGxD,OAAO,4BACL,aACA,UACA,WACA,eACW;EACX,MAAM,QAAQ,SAAS,aAAa,WAAW,cAAc;AAC7D,SAAO,SAAS,IAAI,MAAM;;CAG5B,wBAAmC;AACjC,SAAO,sBAAsB,KAAK;;CAGpC,4BAAuC;AACrC,SAAO,0BAA0B,KAAK;;CAGxC,iBAAiB,aAAmC;AAClD,SAAO,iBAAiB,MAAM,YAAY;;CAG5C,qBAAqB,iBAAuC;AAC1D,SAAO,qBAAqB,MAAM,gBAAgB;;CAGpD,eAAe,eAAqC;AAClD,SAAO,eAAe,MAAM,cAAc;;CAG5C,mBAAmB,mBAAyC;AAC1D,SAAO,mBAAmB,MAAM,kBAAkB;;CAGpD,qBACE,aACA,aACA,sBACA,WACW;AACX,SAAO,qBAAqB,MAAM,aAAa,aAAa,sBAAsB,UAAU;;CAG9F,yBACE,aACA,iBACA,sBACA,WACW;AACX,SAAO,yBAAyB,MAAM,aAAa,iBAAiB,sBAAsB,UAAU;;CAGtG,gBACE,aACA,UACA,WACA,eACA,QACA,cAAuB,MACZ;AACX,SAAO,gBAAgB,MAAM,aAAa,UAAU,WAAW,eAAe,QAAQ,YAAY;;CAGpG,eACE,sBACA,aACA,mBAA4B,OAC5B,yBACW;AACX,SAAO,eAAe,MAAM,sBAAsB,aAAa;GAC7D;GACA;GACD,CAAC;;CAGJ,mBAAmB,sBAAuD;AACxE,SAAO,mBAAmB,KAAK,QAAQ,qBAAqB;;CAG9D,WAAW,aAAqC;AAC9C,SAAO,WAAW,MAAM,YAAY;;CAGtC,uBAGE;AACA,SAAO,qBAAqB,KAAK;;CAGnC,0BAAqC;AACnC,SAAO,wBAAwB,KAAK;;CAGtC,yBAAoC;AAClC,SAAO,uBAAuB,KAAK;;CAGrC,2BAGE;AACA,SAAO,yBAAyB,KAAK;;CAGvC,SAAS,aAAkC;AACzC,SAAO;gBACK,KAAK,QAAQ,UAAU,CAAC;QAChC,KAAK,KAAK,UAAU,CAAC,cAAc,KAAK,aAAa;;kBAE3C,WAAW,KAAK,uBAAuB,EAAE,KAAK,aAAa,CAAC;iBAC7D,WAAW,KAAK,2BAA2B,EAAE,KAAK,aAAa,CAAC;;4BAErD,KAAK,qBAC3B,aACA,KAAK,kBACL,qBAAqB,QACrB,UAAU,KACX,CAAC;iCAC2B,KAAK,yBAChC,aACA,KAAK,sBACL,qBAAqB,QACrB,UAAU,KACX,CAAC;;qBAEe,KAAK,SAAS,aAAa,UAAU,MAAM,MAAM,CAAC;8BACzC,KAAK,SAAS,aAAa,UAAU,MAAM,KAAK,CAAC;;;uBAGxD,KAAK,OAAO,gBAAgB,QAAQ,EAAE,CAAC;wBACtC,KAAK,OAAO,iBAAiB,QAAQ,EAAE,CAAC;2BACrC,KAAK,OAAO,oBAAoB,QAAQ,EAAE,CAAC;4BAC1C,KAAK,OAAO,qBAAqB,QAAQ,EAAE,CAAC;;mBAErD,KAAK,OAAO,aAAa;kBAC1B,KAAK,OAAO,YAAY;;;aAG7B,IAAI,UAAU,EAAE,CAAC,IAAI,KAAK,OAAO,oBAAoB,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;iBACxE,IAAI,UAAU,EAAE,CAAC,IAAI,KAAK,OAAO,qBAAqB,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;;;;AAK9F,IAAM,aAAN,MAAM,WAAqC;CACzC,YACE,AAAO,iBACP,AAAO,kBACP,AAAgB,qBAChB,AAAgB,sBAChB,AAAgB,cAChB,AAAgB,aAChB,AAAgB,UAChB,AAAgB,0BAChB,AAAgB,UAChB,AAAgB,aAChB,AAAgB,YAChB,AAAgB,cAChB,AAAgB,oBAChB,AAAgB,kBAChB,AAAgB,qBAChB,AAAgB,YAChB,AAAgB,aAChB;EAjBO;EACA;EACS;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;CAGlB,OAAO,kBAAkB,eAA0C;EACjE,MAAM,aAAa,mBAAmB,cAAc;AACpD,SAAO,IAAI,WACT,WAAW,iBACX,WAAW,kBACX,WAAW,qBACX,WAAW,sBACX,WAAW,cACX,WAAW,aACX,WAAW,UACX,WAAW,0BACX,WAAW,UACX,WAAW,aACX,WAAW,YACX,WAAW,cACX,WAAW,oBACX,WAAW,kBACX,WAAW,qBACX,WAAW,YACX,WAAW,YACZ;;;;;;;;;;;;;;;ACpWL,SAAS,sBACP,eACA,YACA,OACA,QACA,iBAC0B;CAI1B,MAAM,eAAe,WAAW,QAAQ,EAAE,CAAC,UAAU;CAKrD,MAAM,4BAA4B;CAClC,MAAM,wBAAwB,kBAAkB,WAAW,iBAAiB,EAAE,CAAC,UAAU,GAAG;CAI5F,IAAI,cAAc;AAClB,KAAI,wBAAwB,2BAA2B;EAErD,MAAM,aAAa,KAAK,IAAI,GAAG,4BAA4B,sBAAsB;AACjF,gBAAc,eAAe;QACxB;AAEL,gBAAc,eAAe;;AAG/B,QAAO,8BAA8B,YAAY,eAAe,OAAO,YAAY,CAAC;;;;;;;;;AAUtF,SAAS,uBACP,eACA,YACA,OACwB;AAGxB,QAAO,+BAA+B,YAAY,cAAc;;AASlE,IAAM,eAAN,MAAM,aAAyC;CAC7C,YACE,AAAgBC,WAChB,AAAgB,OAChB,AAAgB,WAChB,AAAgB,UAChB,AAAgB,cAChB,AAAgB,6BAChB,AAAO,aACP;EAPgB;EACA;EACA;EACA;EACA;EACA;EACT;;CAGT,aAAa,MAAM,WAAoB,QAA4C;EACjF,MAAM,OAAwB,MAAM,OAAO,QAAQ,QAAQ,aAAa,MAAMA,UAAQ;AACtF,SAAO,aAAa,kBAAkBA,WAAS,KAAK;;;;;CAMtD,OAAO,OAAO,SAAiB,KAAoC;AACjE,SAAO,iBAAiB,SAAS,IAAI;;CAGvC,OAAO,iBAAiB,SAAiB,KAAoC;AAC3E,SAAO,iBAAiB,SAAS,IAAI;;CAGvC,OAAO,gBAAgB,SAA2B;AAChD,SAAO,IAAI,aACT,QAAQ,SACR,QAAQ,OACR,QAAQ,WACR,QAAQ,SAAS,KAAK,MAAM,QAAQ,gBAAgB,EAAE,CAAC,EACvD,QAAQ,cACR,QAAQ,6BACR,QAAQ,YACT;;CAGH,OAAO,kBAAkB,gBAA2B,aAA8B;EAChF,MAAM,QAAQ,qBAAqB,gBAAgB,YAAY;AAC/D,SAAO,IAAI,aACT,MAAM,SACN,MAAM,OACN,MAAM,WACN,MAAM,UACN,MAAM,cACN,MAAM,6BACN,MAAM,YACP;;CAGH,MAAM,oBACJ,SACA,SACA,cACA,iBACA;EACA,MAAM,yBAAyB,MAAM,uCAAuC;GAC1E;GACA;GACA;GACA,cAAc;GACd,UAAU,KAAK;GACE;GAClB,CAAC;AAEF,SAAO;;CAGT,OAAO,mBAAmB,gBAA2B,SAAiB,KAAmB;EACvF,MAAM,mBAAmB,aAAa,iBAAiB,SAAS,IAAI;AACpE,SAAO,aAAa,kBAAkB,gBAAgB,iBAAiB;;CAMzE,IAAI,iBAA4B;AAC9B,SAAO,KAAK,SAAS,QAAQ,MAAM,EAAE,OAAO;;CAG9C,WAAW,QAA4B;AACrC,SAAO,KAAK,eAAe,MAAM,MAAM,EAAE,OAAO,OAAO,OAAO,CAAC,IAAI,QAAQ,YAAY,OAAO;;CAGhG,IAAI,aAAsB;AACxB,SAAO,KAAK,aAAa,SAAS,aAAa,iBAAiB;;CAGlE,IAAI,qBAA8B;AAChC,SAAO,KAAK,aAAa,SAAS,aAAa,qBAAqB;;CAGtE,IAAI,oCAA6C;AAC/C,SAAO,KAAK,aAAa,SAAS,aAAa,mCAAmC;;CAGpF,eAAe,OAAoB;AACjC,OAAK,cAAc;;CAGrB,sBAAsB,MAAyC;AAC7D,SAAO,sBAAsB,MAAM,KAAK;;CAG1C,4BACE,OACA,cACA,MACW;AACX,SAAO,4BAA4B,KAAK,gBAAgB,OAAO,cAAc,KAAK;;CAGpF,wBAAwB,cAGtB;AACA,SAAO,wBAAwB,MAAM,aAAa;;;;;CAMpD,8BACE,OACA,cACA,cACA,gBAA6B,EAAE,EAI/B;AACA,SAAO,8BAA8B,KAAK,gBAAgB,OAAO,cAAc,cAAc,cAAc;;;;;CAM7G,yCACE,OACA,cACA,cAIA;AACA,SAAO,yCAAyC,KAAK,gBAAgB,OAAO,cAAc,aAAa;;CAGzG,sBAAiC;AAC/B,SAAO,oBAAoB,KAAK;;CAGlC,cAAc,OAA0B,cAAgD;AACtF,SAAO,cAAc,MAAM,KAAK,gBAAgB,OAAO,aAAa;;;;;;;;;;;;;;;;CAiBtE,wBACE,OACA,cACA,aACA,MASA,SAAkB,IAAI,YAAY,EACvB;EACX,MAAM,gBAAgB,IAAI,IAAI,MAAM;AAEpC,MAAI,MAAM,cAAc;GACtB,MAAM,eAAe,KAAK;GAC1B,MAAM,iBAAiB,aAAa;AAGpC,SAAM,SAAS,cAAc,YAAY;AAEvC,QAAI,aAAa,OAAO,YAAY,eAAe,SAAS,aAAa,MAAM,SAAS,EAAE;AACxF,mBAAc,IACZ,SACA,KAAK,iBAAiB,cAAc;MAClC,kBAAkB,aAAa;MAC/B,iBAAiB,aAAa;MAC/B,CAAC,CACH;;KAEH;;EAGJ,MAAM,OAAO,cAAc,IAAI,YAAY,UAAU,CAAC;AACtD,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAElE,MAAM,YAAY,aAAa,IAAI,YAAY,UAAU,CAAC;AAC1D,MAAI,CAAC,UAAW,OAAM,MAAM,kBAAkB,YAAY,UAAU,CAAC,YAAY;EAMjF,MAAM,wBACJ,KAAK,eAAe,QAAQ,MAAM,EAAE,gBAAgB,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,OAAO,YAAY,CAAC,CAAC,SAAS;EAEvG,MAAM,gDACJ,KAAK,OAAO,aAAa,SAAS,YAAY;AAChD,SAAO,MAAM,EAAE,+CAA+C,EAAE,kCAAkC;EAElG,MAAM,yBAAyB,KAAK,eACjC,QAAQ,MAAM,EAAE,gBAAgB,GAAG,EAAE,CAAC,CACtC,KAAK,MAAM,cAAc,IAAI,EAAE,OAAO,UAAU,CAAC,CAAC;EAErD,MAAM,qDAAqD,uBAAuB,MAC/E,MAAM,GAAG,OAAO,aAAa,SAAS,YAAY,CAAC,GAAG,QAAQ,OAAO,YAAY,CACnF;AACD,SAAO,MAAM,EAAE,oDAAoD,EAAE,kCAAkC;AAEvG,MAAI,iDAAiD,oDAAoD;AAEvG,UAAO,KAAK,0BAA0B,eAAe,cAAc,aAAa,KAAK;;EAOvF,MAAM,oBAAoB,MAAM,oBAAoB;EAEpD,MAAM,UAAU,KAAK,WAAW,YAAY;EAE5C,MAAM,WAAW;EAIjB,MAAM,iBAAiB,WACnB,KAAK,uBAAuB,CAAC,MAAM,kBAAkB,GACrD,KAAK,4BAA4B,eAAe,aAAa,CAAC,MAAM,kBAAkB;AAO1F,SAAO,MAAM,EAAE,gBAAgB,eAAe,QAAQ,EAAE,EAAE,EAAE,kDAAkD;EAQ9G,MAAM,0BAA0B,UAAU,IACxC,KAAK,qBAAqB,WAAW,QAAQ,aAAa,qBAAqB,SAAS,UAAU,OAAO,EACzG,eACD;EAED,MAAM,kBAAkB,SAAS,WAAW,UAAU,QAAQ,KAAK;EACnE,MAAM,mBAAmB,SAAS,WAAW,UAAU,SAAS,KAAK;EACrE,MAAM,cAAc,KAAK,eAAe,qBAAqB,SAAS,UAAU;EAChF,MAAM,aAAa,KAAK,mBAAmB,qBAAqB,QAAQ;AAExE,MAAI,YAAY,GAAG,EAAE,EAAE;AACrB,UAAO,QACJ,kBAAkB,KAAK,CACvB,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC,IAAI,iBAAiB,MAAM,WAAW,CAAC,CAAC;;AAGvG,SAAO,wBACJ,IAAI,gBAAgB,MAAM,YAAY,CAAC,CACvC,KAAK,eAAe,MAAM,wBAAwB,CAAC,IAAI,iBAAiB,MAAM,WAAW,CAAC,CAAC;;;;;CAMhG,0BACE,OACA,cACA,aACA,MACW;EACX,MAAM,OAAO,MAAM,IAAI,YAAY,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAClE,MAAM,YAAY,aAAa,IAAI,YAAY,UAAU,CAAC;AAC1D,MAAI,CAAC,UAAW,OAAM,MAAM,kBAAkB,YAAY,UAAU,CAAC,YAAY;EAEjF,MAAM,oBAAoB,MAAM,oBAAoB;EAEpD,MAAM,kBAAkB,KAAK,eAAe,qBAAqB,SAAS,UAAU;EACpF,MAAM,mBAAmB,KAAK,eAAe,qBAAqB,aAAa,UAAU;EACzF,MAAM,UAAU,KAAK,WAAW,YAAY;EAE5C,MAAM,iBAAiB,KAAK,uBAAuB;EACnD,MAAM,wBAAwB,KAAK,qBACjC,WACA,QAAQ,aACR,qBAAqB,SACrB,UAAU,OACX;EAED,MAAM,gBAAgB,QAAQ,kBAAkB,KAAK,CAAC;EAEtD,MAAM,EAAE,aAAa,oBAAoB,KAAK,wBAAwB,qBAAqB,QAAQ;AAQnG,MAAI,KAAK,OAAO,aAAa,SAAS,YAAa,gBAAgB,QAAQ,IAAI,iBAAiB,QAAQ,EAAG;AACzG,OAAI,eAAe,QAAQ,IAAI,CAAC,gBAAgB,QAAQ,EAAE;AAGxD,WAAO,IAAI,UAAU,EAAE;UAClB;AACL,WAAO;;;AAQX,MAAI,gBAAgB,QAAQ,IAAI,CAAC,iBAAiB,QAAQ,EAAE;AAC1D,OAAI,gBAAgB,GAAG,EAAE,EAAE;AACzB,WAAO;cACE,eAAe,QAAQ,EAAE;AAClC,WAAO,IAAI,UAAU,EAAE;UAClB;IACL,MAAM,EAAE,aAAa,kBAAkB,QAAQ,gBAAgB,KAAK,wBAClE,qBAAqB,YACtB;IACD,MAAM,wBAAwB,YAAY,MAAM,iBAAiB;IAEjE,MAAMC,oBAAkB,SAAS,WAAW,UAAU,QAAQ,KAAK;IACnE,MAAM,qBAAqBA,kBAAgB,MAAM,iBAAiB;AAElE,WAAO,sBAAsB,IAAI,mBAAmB;;;AAQxD,MAAI,gBAAgB,QAAQ,IAAI,sBAAsB,IAAI,eAAe,EAAE;AACzE,UAAO;;EAIT,MAAM,8BAA8B,eAAe,MAAM,kBAAkB;EAE3E,MAAM,kBAAkB,SAAS,WAAW,UAAU,QAAQ,KAAK;EACnE,MAAM,oBAAoB,gBAAgB,MAAM,gBAAgB;EAChE,MAAM,cAAc,4BAA4B,IAAI,kBAAkB;AAEtE,SAAO;;;;;CAMT,AAAO,+BACL,OACA,cACA,aACe;EACf,MAAM,OAAO,MAAM,IAAI,YAAY,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAClE,MAAM,YAAY,aAAa,IAAI,YAAY,UAAU,CAAC;AAC1D,MAAI,CAAC,UAAW,OAAM,MAAM,kBAAkB,YAAY,UAAU,CAAC,YAAY;EAEjF,MAAM,UAAU,KAAK,WAAW,YAAY;AAE5C,MAAI,CAAC,QAAQ,OAAQ,QAAO;EAE5B,MAAM,EAAE,QAAQ,WAAW,aAAa,oBAAoB,QAAQ,gBAClE,MACA,WACA,qBAAqB,YACtB;EAED,MAAM,EAAE,QAAQ,eAAe,aAAa,uBAAuB,KAAK,wBACtE,qBAAqB,YACtB;EAED,MAAM,SAAS,cAAc,MAAM,UAAU;EAC7C,MAAM,cAAc,mBAAmB,MAAM,gBAAgB;EAE7D,MAAM,YAAY,QAAQ,gBAAgB,QAAQ;EAClD,MAAM,EAAE,QAAQ,iBAAiB,aAAa,qBAAqB,QAAQ,kBAAkB,KAAK;EAElG,IAAI;AACJ,MAAI,WAAW;AACb,OAAI,YAAY,GAAG,EAAE,CAAE,QAAO;GAE9B,MAAM,cAAc,KAAK,eAAe,qBAAqB,aAAa,UAAU;GACpF,MAAM,kBAAkB,SAAS,WAAW,UAAU,MAAM,MAAM,CAAC,MACjE,SAAS,WAAW,UAAU,QAAQ,MAAM,CAC7C;AACD,sBAAmB,YAAY,MAAM,OAAO,CAAC,IAAI,gBAAgB,MAAM,YAAY,CAAC,CAAC,KAAK,gBAAgB;SACrG;GACL,MAAM,aAAa,KAAK,mBAAmB,qBAAqB,YAAY;GAC5E,MAAM,kBAAkB,SAAS,WAAW,UAAU,SAAS,MAAM,CAAC,MACpE,SAAS,WAAW,UAAU,MAAM,MAAM,CAC3C;AACD,sBAAmB,OAAO,MAAM,YAAY,CAAC,IAAI,iBAAiB,MAAM,WAAW,CAAC,CAAC,MAAM,gBAAgB;;AAE7G,MAAI,iBAAiB,OAAO,IAAI,iBAAiB,GAAG,EAAE,IAAI,CAAC,iBAAiB,UAAU,CAAE,QAAO;AAC/F,SAAO,iBAAiB,UAAU;;;;;CAMpC,AAAO,qCACL,OACA,cACA,aACA,MAGe;EACf,MAAM,OAAO,MAAM,IAAI,YAAY,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAClE,MAAM,YAAY,aAAa,IAAI,YAAY,UAAU,CAAC;AAC1D,MAAI,CAAC,UAAW,OAAM,MAAM,kBAAkB,YAAY,UAAU,CAAC,YAAY;EAEjF,MAAM,UAAU,KAAK,WAAW,YAAY;AAE5C,MAAI,CAAC,QAAQ,OAAQ,QAAO;EAE5B,MAAM,YAAY,QAAQ,gBAAgB,QAAQ;EAElD,MAAM,kBAAkB,KAAK,YAAY;EACzC,MAAM,iBAAiB,KAAK,YAAY;EAExC,MAAM,EAAE,QAAQ,iBAAiB,aAAa,qBAAqB,QAAQ,kBAAkB,KAAK;EAElG,IAAI;AACJ,MAAI,WAAW;AACb,OAAI,eAAe,GAAG,EAAE,CAAE,QAAO;GAEjC,MAAM,cAAc,KAAK,eACvB,qBAAqB,aACrB,WACA,WACA,MAAM,iBACP;GACD,MAAM,kBAAkB,SAAS,WAAW,UAAU,MAAM,MAAM,CAAC,MACjE,SAAS,WAAW,UAAU,QAAQ,MAAM,CAC7C;AACD,sBAAmB,eAChB,MAAM,gBAAgB,CACtB,IAAI,gBAAgB,MAAM,YAAY,CAAC,CACvC,KAAK,gBAAgB;SACnB;GACL,MAAM,aAAa,KAAK,mBAAmB,qBAAqB,YAAY;GAC5E,MAAM,kBAAkB,SAAS,WAAW,UAAU,SAAS,MAAM,CAAC,MACpE,SAAS,WAAW,UAAU,MAAM,MAAM,CAC3C;AACD,sBAAmB,gBAChB,MAAM,eAAe,CACrB,IAAI,iBAAiB,MAAM,WAAW,CAAC,CACvC,MAAM,gBAAgB;;AAE3B,MAAI,iBAAiB,OAAO,IAAI,iBAAiB,GAAG,EAAE,IAAI,CAAC,iBAAiB,UAAU,CAAE,QAAO;AAC/F,SAAO,iBAAiB,UAAU;;;;;CAMpC,AAAO,qCACL,OACA,cACA,aACA,WACA,QACe;EACf,MAAM,OAAO,MAAM,IAAI,YAAY,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAClE,MAAM,YAAY,aAAa,IAAI,YAAY,UAAU,CAAC;AAC1D,MAAI,CAAC,UAAW,OAAM,MAAM,kBAAkB,YAAY,UAAU,CAAC,YAAY;EAEjF,MAAM,UAAU,KAAK,WAAW,YAAY;AAE5C,MAAI,CAAC,QAAQ,OAAQ,QAAO;EAE5B,MAAM,EAAE,QAAQ,WAAW,aAAa,oBAAoB,QAAQ,gBAClE,MACA,WACA,qBAAqB,YACtB;EAED,MAAM,EAAE,QAAQ,eAAe,aAAa,uBAAuB,KAAK,wBACtE,qBAAqB,YACtB;EAED,MAAM,SAAS,cAAc,MAAM,UAAU;EAC7C,MAAM,cAAc,mBAAmB,MAAM,gBAAgB;EAE7D,MAAM,WAAW,IAAI,UAAU,OAAO;EAEtC,IAAI;AACJ,MAAI,WAAW;AACb,OAAI,YAAY,GAAG,EAAE,CAAE,QAAO;GAE9B,MAAM,cAAc,KAAK,eAAe,qBAAqB,aAAa,UAAU;GACpF,MAAM,kBAAkB,SAAS,WAAW,UAAU,MAAM,MAAM,CAAC,MACjE,SAAS,WAAW,UAAU,QAAQ,MAAM,CAC7C;AACD,sBAAmB,YAAY,MAAM,OAAO,CAAC,IAAI,SAAS,MAAM,YAAY,CAAC,CAAC,KAAK,gBAAgB;SAC9F;GACL,MAAM,aAAa,KAAK,mBAAmB,qBAAqB,YAAY;GAC5E,MAAM,kBAAkB,SAAS,WAAW,UAAU,SAAS,MAAM,CAAC,MACpE,SAAS,WAAW,UAAU,MAAM,MAAM,CAC3C;AACD,sBAAmB,OAAO,MAAM,YAAY,CAAC,IAAI,SAAS,MAAM,WAAW,CAAC,CAAC,MAAM,gBAAgB;;AAErG,MAAI,iBAAiB,OAAO,IAAI,iBAAiB,GAAG,EAAE,CAAE,QAAO;AAC/D,SAAO,iBAAiB,UAAU;;CAQpC,kCACE,OACA,cACA,kBACA,sBACA,SAAkB,IAAI,YAAY,EACvB;EACX,MAAM,YAAY,MAAM,IAAI,iBAAiB,UAAU,CAAC;AACxD,MAAI,CAAC,UAAW,OAAM,MAAM,QAAQ,iBAAiB,UAAU,CAAC,YAAY;EAC5E,MAAM,iBAAiB,aAAa,IAAI,iBAAiB,UAAU,CAAC;AACpE,MAAI,CAAC,eAAgB,OAAM,MAAM,kBAAkB,iBAAiB,UAAU,CAAC,YAAY;EAE3F,MAAM,gBAAgB,MAAM,IAAI,qBAAqB,UAAU,CAAC;AAChE,MAAI,CAAC,cAAe,OAAM,MAAM,QAAQ,qBAAqB,UAAU,CAAC,YAAY;EACpF,MAAM,qBAAqB,aAAa,IAAI,qBAAqB,UAAU,CAAC;AAC5E,MAAI,CAAC,mBAAoB,OAAM,MAAM,kBAAkB,qBAAqB,UAAU,CAAC,YAAY;EAEnG,MAAM,EAAE,QAAQ,gBAAgB,KAAK,wBAAwB,qBAAqB,YAAY;EAC9F,MAAM,gBAAgB,OAAO,MAAM,YAAY;EAE/C,MAAM,kBAAkB,SAAS,gBAAgB,UAAU,QAAQ,MAAM;EACzE,MAAM,mBAAmB,SAAS,gBAAgB,UAAU,MAAM,MAAM;EACxE,MAAM,mBAAmB,UAAU,OAAO;EAE1C,MAAM,sBAAsB,IAAI,UAAU,IAAK;EAE/C,MAAM,mBAAmB,SAAS,oBAAoB,UAAU,SAAS,MAAM;EAC/E,MAAM,kBAAkB,SAAS,oBAAoB,UAAU,MAAM,MAAM;EAC3E,MAAM,kBAAkB,cAAc,OAAO;AAE7C,SAAO,MACL;GACE,eAAe,cAAc,QAAQ,EAAE;GACvC;GACA;GACA;GACD,EACD,wCACD;EAED,MAAM,0BAA0B,cAAc,IAC5C,iBAAiB,MAAM,gBAAgB,MAAM,oBAAoB,CAAC,CACnE;AAED,SAAO,MACL,EAAE,yBAAyB,wBAAwB,QAAQ,EAAE,EAAE,EAC/D,uEACD;EAGD,MAAM,eAAe,KAAK,WAAW,iBAAiB;EACtD,MAAM,iBAAiB,aAAa,kBAAkB,UAAU,CAAC;EACjE,MAAM,iBAAiB,eAAe,MAAM,gBAAgB;EAG5D,MAAM,mBAAmB,KAAK,WAAW,qBAAqB;EAC9D,MAAM,sBAAsB,iBAAiB,kBAAkB,cAAc,CAAC;EAC9E,MAAM,eAAe,oBAAoB,MAAM,oBAAoB,CAAC,MAAM,iBAAiB;AAC3F,SAAO,MACL;GACE,gBAAgB,eAAe,QAAQ,EAAE;GACzC,kBAAkB,iBAAiB,QAAQ,EAAE;GAC7C,gBAAgB,eAAe,MAAM,iBAAiB,CAAC,QAAQ,EAAE;GACjE,qBAAqB,oBAAoB,QAAQ,EAAE;GACnD,iBAAiB,gBAAgB,QAAQ,EAAE;GAC3C,cAAc,aAAa,QAAQ,EAAE;GACtC,EACD,wCACD;EAED,MAAM,0BAA0B,UAAU,IAAI,gBAAgB,yBAAyB,aAAa;AACpG,SAAO,MACL,EACE,yBAAyB,wBAAwB,QAAQ,EAAE,EAC5D,EACD,mEACD;AAED,SAAO,wBAAwB,IAAI,gBAAgB;;CAGrD,uBACE,OACA,iBAA8B,EAAE,EAChC,gBAA6B,EAAE,EACnB;AACZ,SAAO,2BAA2B,KAAK,UAAU,OAAO,gBAAgB,cAAc;;;;;;;;CASxF,wBAAwB,YAAsC;EAC5D,MAAM,oBAAoB,KAAK,eAC5B,QAAQ,YAAY,QAAQ,gBAAgB,GAAG,EAAE,CAAC,CAClD,KAAK,YAAY,QAAQ,OAAO;EACnC,MAAM,mBAAmB,KAAK,eAC3B,QAAQ,YAAY,QAAQ,YAAY,GAAG,EAAE,CAAC,CAC9C,KAAK,YAAY,QAAQ,OAAO;AACnC,SAAO,wBAAwB,YAAY,mBAAmB,iBAAiB;;;;;;;;;;;;;;;CAgBjF,oBAAoB,YAAyB,OAAuD;EAClG,MAAM,oBAAoB,KAAK,eAC5B,QAAQ,YAAY,QAAQ,gBAAgB,GAAG,EAAE,CAAC,CAClD,KAAK,YAAY,QAAQ,OAAO;EACnC,MAAM,mBAAmB,KAAK,eAC3B,QAAQ,YAAY,QAAQ,YAAY,GAAG,EAAE,CAAC,CAC9C,KAAK,YAAY,QAAQ,OAAO;AAEnC,SAAO,oBAAoB,YAAY,mBAAmB,kBAAkB,MAAM;;CAOpF,MAAM,iBACJ,OACA,WACA,QACA,aACA,OAA0B,EAAE,EAC5B;EACA,MAAM,OAAO,MAAM,IAAI,YAAY,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAClE,MAAM,WAAW,UAAU,IAAI,YAAY,UAAU,CAAC;AACtD,MAAI,CAAC,SAAU,OAAM,MAAM,iBAAiB,YAAY,UAAU,CAAC,YAAY;EAE/E,MAAM,mBAAmB,KAAK,oBAAoB;EAClD,MAAM,gBAAgB,KAAK,iBAAiB;EAE5C,MAAM,iBAAiB,8BAA8B,KAAK,MAAM,KAAK,WAAW,MAAM,SAAS,aAAa;EAE5G,MAAM,oBAAmC,EAAE;AAK3C,oBAAkB,KAChB;GAAE,QAAQ,KAAK;GAAS,UAAU;GAAO,YAAY;GAAO,EAC5D;GAAE,QAAQ,KAAK,OAAO,WAAW;GAAI,UAAU;GAAO,YAAY;GAAO,CAC1E;AAGD,MAAI,SAAS,aAAa,OAAO,sBAAsB,EAAE;AACvD,qBAAkB,KAAK;IAAE,QAAQ,SAAS;IAAM,UAAU;IAAO,YAAY;IAAO,CAAC;;EAGvF,MAAM,aAA4C,EAAE;AAEpD,MAAI,KAAK,KAAK,OAAO,YAAY,IAAI,kBAAkB;AACrD,cAAW,KAAK,GAAG,eAAe,KAAK,WAAW,IAAI,UAAU,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC;;AAGhG,SAAO;GACL;GACA;GACA;GACA;GACA,aAAa,EAAE,QAAQ,WAAW,QAAQ,KAAK,aAAa,EAAE;GAC9D;GACD;;CAGH,MAAM,cACJ,SACA,OACA,WACA,QACA,aACA,OAA0B,EAAE,EACE;EAC9B,MAAM,EAAE,YAAY,aAAa,gBAAgB,UAAU,MAAM,sBAAsB,MAAM,KAAK,iBAChG,OACA,WACA,QACA,aACA,KACD;EAED,MAAM,YAAY,MAAMC,qBAAa,cACnC,SACA;GACE,cAAc,KAAK;GACnB,oBAAoB;GACpB,MAAM;GACN,cAAc,SAAS;GACvB,WAAW,KAAK,uBAAuB,aAAa,KAAK;GACzD,OAAO,KAAK,uBAAuB,SAAS,KAAK;GACjD,gBAAgB,KAAK,uBAAuB,kBAAkB,KAAK;GACpE,EACD,aACA,kBAAkB,KAAK,aAAa;GAClC,QAAQ,QAAQ;GAChB,UAAU;GACV,YAAY;GACb,EAAE,CACJ;AACD,aAAW,KAAK,UAAU;AAE1B,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;CAGH,MAAM,yBACJ,SACA,OACA,WACA,QACA,aACA,SACA,OAAqC,EAAE,EACT;EAC9B,MAAM,OAAO,MAAM,IAAI,YAAY,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAGlE,MAAM,EAAE,YAAY,aAAa,gBAAgB,UAAU,sBAAsB,MAAM,KAAK,iBAC1F,OACA,WACA,QACA,aACA;GAAE,GAAG;GAAM,kBAAkB;GAAO,CACrC;EAED,MAAMC,aAAW;GACf,YAAY,QAAQ;GACpB,cAAc,KAAK;GACnB,MAAM;GACN,oBAAoB;GACpB,cAAc,SAAS;GACvB,OAAO,KAAK,uBAAuB,SAAS,KAAK;GACjD,gBAAgB,KAAK,uBAAuB;GAC7C;EAED,MAAM,YAAY,MAAMD,qBAAa,yBAAyB,SAASC,YAAU,aAAa,kBAAkB;AAGhH,MAAI,KAAK,KAAK,OAAO,YAAY,EAAE;GACjC,MAAM,gBAAgB,KAAK,iBAAiB;GAC5C,MAAM,aAAa,IAAI,UAAU,OAAO,CAAC,MAAM,cAAc;GAC7D,MAAM,UAAU,sBACd,QAAQ,iBACR,QAAQ,kBACR,QAAQ,OACR,YACA,cACD;AACD,cAAW,KAAK,GAAG,QAAQ;;AAG7B,aAAW,KAAK,UAAU;AAE1B,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;CAGH,MAAM,sBAAsB,SAAuB,MAA+C;EAChG,MAAM,oBAAoB,MAAMD,qBAAa,oCAAoC,SAAS;GACxF,cAAc,KAAK;GACb;GACP,CAAC;AAEF,SAAO;GACL,cAAc,CAAC,kBAAkB;GACjC,MAAM,EAAE;GACT;;CAGH,MAAM,wBACJ,SACA,OACA,WACA,QACA,aACA,WAAW,OACX,OAAwB,EAAE,EAC1B;EACA,MAAM,OAAO,MAAM,IAAI,YAAY,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAClE,MAAM,WAAW,UAAU,IAAI,YAAY,UAAU,CAAC;AACtD,MAAI,CAAC,SAAU,OAAM,MAAM,sBAAsB,YAAY,UAAU,CAAC,YAAY;EAEpF,MAAM,mBAAmB,KAAK,oBAAoB;EAClD,MAAM,gBAAgB,KAAK,iBAAiB;EAE5C,MAAM,WAA0C,EAAE;AAGlD,MAAI,YAAY,CAAC,KAAK,cAAc,OAAO,UAAU,QAAQ,EAAE;AAC7D,YAAS,KAAK,IAAI,MAAM,KAAK,wBAAwB,SAAS,OAAO,WAAW,YAAY,EAAE,aAAa;;EAI7G,MAAM,UAAU,8BAA8B,KAAK,MAAM,KAAK,WAAW,MAAM,SAAS,aAAa;EAErG,MAAM,oBAAiC,EAAE;AAKzC,oBAAkB,KAAK,KAAK,SAAS,KAAK,OAAO,WAAW,GAAG;AAG/D,MAAI,SAAS,aAAa,OAAO,sBAAsB,EAAE;AACvD,qBAAkB,KAAK,SAAS,KAAK;;AAGvC,MAAI,KAAK,KAAK,OAAO,YAAY,IAAI,kBAAkB;AACrD,YAAS,KAAK,GAAG,eAAe,KAAK,WAAW,IAAI,UAAU,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC;;AAE9F,SAAO;GACL;GACA;GACA;GACA;GACA,aAAa;IAAE,QAAQ,WAAW,QAAQ,KAAK,aAAa;IAAE;IAAU;GACxE;GACD;;CAGH,MAAM,YACJ,SACA,OACA,WACA,QACA,aACA,WAAW,OACX,OAAwB,EAAE,EACI;EAC9B,MAAM,EAAE,UAAU,aAAa,SAAS,UAAU,MAAM,sBAAsB,MAAM,KAAK,wBACvF,SACA,OACA,WACA,QACA,aACA,UACA,KACD;EAED,MAAM,UAAU,MAAMA,qBAAa,YACjC,SACA;GACE,cAAc,KAAK;GACnB,oBAAoB;GACpB,MAAM;GACN,cAAc,SAAS;GACvB,WAAW,KAAK,uBAAuB,aAAa,KAAK;GACzD,OAAO,KAAK,uBAAuB,SAAS,KAAK;GACjD,gBAAgB,KAAK,uBAAuB,kBAAkB,KAAK;GACpE,EACD,aACA,kBAAkB,KAAK,aAAa;GAClC,QAAQ;GACR,UAAU;GACV,YAAY;GACb,EAAE,CACJ;AACD,WAAS,KAAK,QAAQ;AAEtB,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;CAGH,MAAM,uBACJ,SACA,OACA,WACA,QACA,aACA,SACA,WAAW,OACX,OAAmC,EAAE,EACP;EAC9B,MAAM,OAAO,MAAM,IAAI,YAAY,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAGlE,MAAM,EAAE,UAAU,aAAa,SAAS,UAAU,sBAAsB,MAAM,KAAK,wBACjF,SACA,OACA,WACA,QACA,aACA,UACA;GAAE,GAAG;GAAM,kBAAkB;GAAO,CACrC;EAED,MAAM,UAAU,MAAMA,qBAAa,uBACjC,SACA;GACE,YAAY,QAAQ;GACpB,cAAc,KAAK;GACnB,oBAAoB;GACpB,MAAM;GACN,cAAc,SAAS;GACvB,OAAO,KAAK,uBAAuB;GACnC,gBAAgB,KAAK,uBAAuB;GAC7C,EACD,aACA,kBAAkB,KAAK,aAAa;GAClC,QAAQ;GACR,UAAU;GACV,YAAY;GACb,EAAE,CACJ;AAGD,MAAI,KAAK,KAAK,OAAO,YAAY,EAAE;GACjC,MAAM,gBAAgB,KAAK,iBAAiB;GAC5C,MAAM,aAAa,IAAI,UAAU,OAAO,CAAC,MAAM,cAAc;GAC7D,MAAM,UAAU,sBACd,QAAQ,iBACR,QAAQ,kBACR,QAAQ,OACR,WAAW,KAAK,SAAW,EAC3B,cACD;AACD,YAAS,KAAK,GAAG,QAAQ;;AAG3B,WAAS,KAAK,QAAQ;AAGtB,MAAI,KAAK,KAAK,OAAO,YAAY,EAAE;AAEjC,YAAS,KAAK,uBAAuB,QAAQ,iBAAiB,QAAQ,kBAAkB,QAAQ,MAAM,CAAC;;AAGzG,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;CAGH,MAAM,2BACJ,SACA,SACA,WACA,iBACA,aACA,cAAc,OACd,eAAoE,EAAE,EACtE;EACA,MAAM,OAAO,QAAQ,IAAI,YAAY,UAAU,CAAC;AAChD,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAClE,MAAM,WAAW,UAAU,IAAI,YAAY,UAAU,CAAC;AACtD,MAAI,CAAC,SAAU,OAAM,MAAM,sBAAsB,YAAY,UAAU,CAAC,YAAY;EAEpF,MAAM,mBAAmB,aAAa,oBAAoB;EAC1D,MAAM,aAAa,aAAa,cAAc;EAE9C,MAAM,cAA6C,EAAE;AAGrD,MAAI,eAAe,CAAC,KAAK,cAAc,OAAO,UAAU,QAAQ,IAAI,SAAS,sBAAsB;AACjG,eAAY,KAAK,IAAI,MAAM,KAAK,wBAAwB,SAAS,SAAS,WAAW,YAAY,EAAE,aAAa;;EAGlH,MAAM,UAAU,8BAA8B,KAAK,MAAM,KAAK,WAAW,MAAM,SAAS,aAAa;AAErG,MAAI,YAAY;GACd,MAAM,wBAAwB,kDAC5B,cAAc,kBAAkB,KAAK,WACrC,SACA,KAAK,WACL,KAAK,MACL,SAAS,aACV;AACD,eAAY,KAAK,sBAAsB;;EAGzC,MAAM,iBAAiB,cACnB,KAAK,uBAAuB,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,GACvD,KAAK,uBAAuB,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC;EAG3D,MAAM,oBAAiC,EAAE;AACzC,MAAI,SAAS,aAAa,OAAO,sBAAsB,EAAE;AACvD,qBAAkB,KAAK,SAAS,KAAK;;AAGvC,MAAI,aAAa,0BAA0B;AACzC,qBAAkB,KAAK,GAAG,aAAa,yBAAyB;SAC3D;GACL,MAAM,eAAe,0BAA0B,gBAAgB,gBAAgB;AAC/E,qBAAkB,KAAK,GAAG,aAAa;;AAGzC,MAAI,aAAa;AACf,qBAAkB,KAAK,KAAK,SAAS,KAAK,OAAO,WAAW,GAAG;AAE/D,OAAI,KAAK,OAAO,aAAa,GAAG;IAC9B,MAAM,eAAe,kBAAkB,YAAY,UAAU;AAC7D,QAAI,CAAC,cAAc,sBAAsB;AACvC,WAAM,MAAM,6CAA6C,YAAY,UAAU,GAAG;;IAEpF,MAAM,EAAE,oCAAiB,8CAAsB;IAC/C,MAAM,OAAOE,kBAAgB,IAAI,UAAU,aAAa,qBAAqB,CAAC;IAC9E,MAAM,UAAUC,uBAAqB,KAAK;IAC1C,MAAM,UAAUC,sBAAoB,KAAK;AACzC,sBAAkB,KAAK,SAAS,QAAQ;;;AAI5C,SAAO;GACL;GACA;GACA;GACA;GACA;GACA,mBAAmB,kBAAkB,KAAK,aAAa;IACrD,QAAQ;IACR,UAAU;IACV,YAAY;IACb,EAAE;GACJ;;CAGH,MAAM,eACJ,SACA,SACA,WACA,iBACA,QACA,aACA,cAAc,OACd,eAAmC,EAAE,EACP;EAC9B,MAAM,EAAE,aAAa,kBAAkB,SAAS,UAAU,MAAM,sBAC9D,MAAM,KAAK,2BACT,SACA,SACA,WACA,iBACA,aACA,aACA,aACD;EAEH,MAAM,CAAC,+BAA+B,sBACpC,cAAc,gBACd,KAAK,SACL,QAAQ,UACT;EAED,MAAM,aAAa,MAAMJ,qBAAa,eACpC,SACA;GACE,cAAc,KAAK;GACnB,MAAM,KAAK;GACX,yBAAyB;GACzB,cAAc,SAAS;GACvB,WAAW,aAAa,uBAAuB,aAAa,KAAK;GACjE,OAAO,aAAa,uBAAuB,SAAS,KAAK;GACzD;GACA,gBAAgB,KAAK;GACtB,EACD;GAAE,QAAQ,WAAW,QAAQ,KAAK,aAAa;GAAE;GAAa,EAC9D,kBACD;AACD,cAAY,KAAK,WAAW;AAE5B,MAAI,oBAAoB,KAAK,KAAK,OAAO,YAAY,EAAE;AACrD,eAAY,KAAK,gBAAgB,KAAK,UAAU,CAAC;;AAGnD,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;CAGH,MAAM,0BACJ,SACA,SACA,WACA,iBACA,QACA,aACA,SACA,cAAc,OACd,eAA8C,EAAE,EAClB;EAC9B,MAAM,EAAE,aAAa,kBAAkB,SAAS,UAAU,MAAM,sBAC9D,MAAM,KAAK,2BAA2B,SAAS,SAAS,WAAW,iBAAiB,aAAa,aAAa;GAC5G,GAAG;GACH,gBAAgB,QAAQ;GACzB,CAAC;EAEJ,MAAM,aAAa,MAAMA,qBAAa,0BACpC,SACA;GACE,YAAY,QAAQ;GACpB,cAAc,KAAK;GACnB,MAAM,KAAK;GACX,yBAAyB;GACzB,cAAc,SAAS;GACvB,OAAO,aAAa,uBAAuB;GAC5C,EACD;GAAE,QAAQ,WAAW,QAAQ,KAAK,aAAa;GAAE;GAAa,EAC9D,kBACD;AACD,cAAY,KAAK,WAAW;AAE5B,MAAI,oBAAoB,KAAK,KAAK,OAAO,YAAY,EAAE;AAErD,eAAY,KAAK,uBAAuB,QAAQ,iBAAiB,QAAQ,kBAAkB,QAAQ,MAAM,CAAC;;AAG5G,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;CAGH,MAAM,yBACJ,SACA,WACA,iBACA,aACA,aAAgE,EAAE,EAClE;EACA,MAAM,OAAO,QAAQ,IAAI,YAAY,UAAU,CAAC;AAChD,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAClE,MAAM,WAAW,UAAU,IAAI,YAAY,UAAU,CAAC;AACtD,MAAI,CAAC,SAAU,OAAM,MAAM,sBAAsB,YAAY,UAAU,CAAC,YAAY;EAEpF,MAAM,mBAAmB,WAAW,oBAAoB;EACxD,MAAM,aAAa,WAAW,cAAc;EAE5C,MAAM,YAAsC,EAAE;EAE9C,MAAM,UAAU,8BAA8B,KAAK,MAAM,KAAK,WAAW,MAAM,SAAS,aAAa;AAErG,MAAI,YAAY;GACd,MAAM,wBAAwB,kDAC5B,YAAY,kBAAkB,KAAK,WACnC,SACA,KAAK,WACL,KAAK,MACL,SAAS,aACV;AACD,aAAU,KAAK,sBAAsB;;EAGvC,MAAM,iBAAiB,KAAK,uBAAuB,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC;EAE9E,MAAM,oBAAiC,EAAE;AAEzC,MAAI,SAAS,aAAa,OAAO,sBAAsB,EAAE;AACvD,qBAAkB,KAAK,SAAS,KAAK;;AAEvC,MAAI,YAAY,0BAA0B;AACxC,qBAAkB,KAAK,GAAG,WAAW,yBAAyB;SACzD;GACL,MAAM,eAAe,0BAA0B,gBAAgB,gBAAgB;AAC/E,qBAAkB,KAAK,GAAG,aAAa;;AAGzC,SAAO;GACL;GACA;GACA;GACA;GACA;GACA,mBAAmB,kBAAkB,KAAK,aAAa;IACrD,QAAQ;IACR,UAAU;IACV,YAAY;IACb,EAAE;GACJ;;CAGH,MAAM,aACJ,SACA,SACA,WACA,iBACA,QACA,aACA,aAA+B,EAAE,EACH;EAC9B,MAAM,EAAE,WAAW,MAAM,UAAU,SAAS,mBAAmB,qBAC7D,MAAM,KAAK,yBAAyB,SAAS,WAAW,iBAAiB,aAAa,WAAW;EAEnG,MAAM,CAAC,+BAA+B,sBACpC,cAAc,gBACd,KAAK,SACL,QAAQ,UACT;EAED,MAAM,WAAW,MAAMA,qBAAa,aAClC,SACA;GACE,cAAc,KAAK;GACnB,MAAM,KAAK;GACX,yBAAyB;GACzB,cAAc,SAAS;GACvB,WAAW,YAAY,uBAAuB,aAAa,KAAK;GAChE,OAAO,YAAY,uBAAuB,SAAS,KAAK;GACxD;GACA,gBAAgB,KAAK;GACtB,EACD,EAAE,QAAQ,WAAW,QAAQ,KAAK,aAAa,EAAE,EACjD,kBACD;AACD,YAAU,KAAK,SAAS;AAExB,MAAI,KAAK,KAAK,OAAO,YAAY,IAAI,kBAAkB;AACrD,aAAU,KAAK,gBAAgB,KAAK,UAAU,CAAC;;AAGjD,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;CAGH,MAAM,wBACJ,SACA,SACA,WACA,iBACA,QACA,aACA,SACA,aAA0C,EAAE,EACd;EAC9B,MAAM,EAAE,WAAW,MAAM,UAAU,SAAS,mBAAmB,qBAC7D,MAAM,KAAK,yBAAyB,SAAS,WAAW,iBAAiB,aAAa;GACpF,GAAG;GACH,gBAAgB,QAAQ;GACzB,CAAC;EAEJ,MAAM,WAAW,MAAMA,qBAAa,wBAClC,SACA;GACE,YAAY,QAAQ;GACpB,cAAc,KAAK;GACnB,MAAM,KAAK;GACX,yBAAyB;GACzB,cAAc,SAAS;GACvB,OAAO,YAAY,uBAAuB;GAC3C,EACD,EAAE,QAAQ,WAAW,QAAQ,KAAK,aAAa,EAAE,EACjD,kBACD;AACD,YAAU,KAAK,SAAS;AAExB,MAAI,KAAK,KAAK,OAAO,YAAY,IAAI,kBAAkB;AAErD,aAAU,KAAK,uBAAuB,QAAQ,iBAAiB,QAAQ,kBAAkB,QAAQ,MAAM,CAAC;;AAG1G,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;CAGH,MAAM,wBACJ,SACA,OACA,WACA,aAC8B;EAC9B,MAAM,OAAO,MAAM,IAAI,YAAY,UAAU,CAAC;AAC9C,MAAI,CAAC,KAAM,OAAM,MAAM,QAAQ,YAAY,UAAU,CAAC,YAAY;EAClE,MAAM,WAAW,UAAU,IAAI,YAAY,UAAU,CAAC;AACtD,MAAI,CAAC,SAAU,OAAM,MAAM,sBAAsB,YAAY,UAAU,CAAC,YAAY;AACpF,MAAI,CAAC,SAAS,sBAAsB;AAClC,SAAM,MAAM,6CAA6C,YAAY,UAAU,GAAG;;EAGpF,MAAM,MAAqC,EAAE;EAE7C,MAAM,UAAU,8BACd,KAAK,eACL,KAAK,WACL,MACA,SAAS,qBACV;EACD,MAAM,wBAAwB,kDAC5B,KAAK,WACL,SACA,KAAK,WACL,KAAK,eACL,SAAS,qBACV;AACD,MAAI,KAAK,sBAAsB;EAE/B,MAAM,sBAAsB,MAAMA,qBAAa,qCAAqC,SAAS;GAC3F,cAAc,KAAK;GACnB,oBAAoB;GACpB,MAAM,KAAK;GACX,cAAc,SAAS;GACxB,CAAC;AACF,MAAI,KAAK,oBAAoB;AAE7B,SAAO;GAAE,cAAc;GAAK,MAAM,EAAE;GAAE;;CAGxC,MAAM,8BACJ,wBACA,SACA,SACA,WACA,iBACA,kBACA,iBACA,sBAC8B;EAC9B,MAAM,YAAY,QAAQ,IAAI,iBAAiB,UAAU,CAAC;AAC1D,MAAI,CAAC,UAAW,OAAM,MAAM,cAAc,iBAAiB,UAAU,CAAC,YAAY;EAClF,MAAM,gBAAgB,QAAQ,IAAI,qBAAqB,UAAU,CAAC;AAClE,MAAI,CAAC,cAAe,OAAM,MAAM,kBAAkB,qBAAqB,UAAU,CAAC,YAAY;EAC9F,MAAM,oBAAoB,UAAU,IAAI,qBAAqB,UAAU,CAAC;AACxE,MAAI,CAAC,kBAAmB,OAAM,MAAM,sBAAsB,qBAAqB,UAAU,CAAC,YAAY;EAEtG,MAAM,MAAqC,EAAE;EAE7C,MAAM,2BAA2B,KAAK,uBAAuB,SAAS,CAAC,sBAAsB,iBAAiB,EAAE,EAAE,CAAC;EACnH,MAAM,2BAA2B,uBAAuB,uBAAuB,SAAS,EAAE,EAAE,EAAE,CAAC;EAE/F,MAAM,iBAAiB,CAAC,GAAG,0BAA0B,GAAG,yBAAyB;EAEjF,MAAM,oBAAiC,EAAE;AAEzC,MAAI,kBAAkB,aAAa,OAAO,sBAAsB,EAAE;AAChE,qBAAkB,KAAK,kBAAkB,KAAK;;EAGhD,MAAM,eAAe,0BAA0B,gBAAgB,gBAAgB;AAC/E,oBAAkB,KAAK,GAAG,aAAa;AAEvC,MAAI,KAAK,qBAAqB,oBAAoB,EAAE,OAAO,MAAW,CAAC,CAAC;EACxE,MAAM,cAAc,MAAMA,qBAAa,8BACrC,SACA;GACE,WAAW;GACX,UAAU;GACV,wBAAwB,KAAK;GAC7B,wBAAwB,uBAAuB;GAC/C,cAAc,kBAAkB;GACjC,EAED;GACE,aAAa,WAAW,iBAAiB,UAAU,aAAa;GAChE,oBAAoB,yBAAyB;GAC7C,oBAAoB,yBAAyB;GAC9C,EACD,kBAAkB,KAAK,aAAa;GAClC,QAAQ;GACR,UAAU;GACV,YAAY;GACb,EAAE,CACJ;AACD,MAAI,KAAK,YAAY;AAErB,SAAO;GAAE,cAAc;GAAK,MAAM,EAAE;GAAE;;CAGxC,MAAM,qBAAqB,SAAuB,UAAgD;EAChG,MAAM,KAAK,MAAMA,qBAAa,qBAC5B,SACA,EACE,cAAc,KAAK,SACpB,EACD,EAAE,UAAU,IAAIK,KAAG,SAAS,EAAE,CAC/B;AACD,SAAO;GAAE,cAAc,CAAC,GAAG;GAAE,MAAM,EAAE;GAAE;;CAGzC,MAAM,gCACJ,SACA,UACA,YAC8B;EAC9B,MAAM,KAAK,MAAML,qBAAa,gCAC5B,SACA;GACE;GACA,cAAc,KAAK;GACpB,EACD,EAAE,UAAU,IAAIK,KAAG,SAAS,EAAE,CAC/B;AACD,SAAO;GAAE,cAAc,CAAC,GAAG;GAAE,MAAM,EAAE;GAAE;;CAGzC,MAAM,mBACJ,SACA,SACA,yBAC8B;EAC9B,MAAM,QAAQ,wBAAwB,KAAK,YAAY;GACrD,MAAM,IAAI,QAAQ,IAAI,QAAQ,UAAU,CAAC;AACzC,OAAI,CAAC,EAAG,OAAM,MAAM,QAAQ,QAAQ,UAAU,CAAC,YAAY;AAC3D,UAAO;IACP;EACF,MAAM,oBAAoB,0BAA0B,MAAM;EAC1D,MAAM,KAAK,MAAML,qBAAa,mBAC5B,SACA,EACE,cAAc,KAAK,SACpB,EACD,kBAAkB,KAAK,aAAa;GAClC,QAAQ;GACR,UAAU;GACV,YAAY;GACb,EAAE,CACJ;AAED,SAAO;GAAE,cAAc,CAAC,GAAG;GAAE,MAAM,EAAE;GAAE;;CAGzC,MAAM,8BACJ,SACA,SACA,yBACA,YAC8B;EAC9B,MAAM,QAAQ,wBAAwB,KAAK,YAAY;GACrD,MAAM,IAAI,QAAQ,IAAI,QAAQ,UAAU,CAAC;AACzC,OAAI,CAAC,EAAG,OAAM,MAAM,QAAQ,QAAQ,UAAU,CAAC,YAAY;AAC3D,UAAO;IACP;EACF,MAAM,oBAAoB,0BAA0B,MAAM;EAC1D,MAAM,KAAK,MAAMA,qBAAa,8BAC5B,SACA;GACE;GACA,cAAc,KAAK;GACpB,EACD,kBAAkB,KAAK,aAAa;GAClC,QAAQ;GACR,UAAU;GACV,YAAY;GACb,EAAE,CACJ;AAED,SAAO;GAAE,cAAc,CAAC,GAAG;GAAE,MAAM,EAAE;GAAE;;CAIzC,MAAM,+BACJ,SACA,qBAC8B;AAC9B,QAAM,IAAI,MAAM,SAAS,QAAQ,GAAG,sBAAsB;;CAS5D,MAAM,mBAAmB,SAAqD;EAC5E,MAAM,KAAK,MAAMA,qBAAa,mBAAmB,SAAS;GACxD,cAAc,KAAK;GACnB,UAAU,KAAK;GAChB,CAAC;AACF,SAAO;GAAE,cAAc,CAAC,GAAG;GAAE,MAAM,EAAE;GAAE;;CAGzC,MAAM,kBACJ,SACA,OACA,gBACA,eACA,iBAC8B;AAC9B,SAAO,kBACL,SACA,KAAK,SACL,OACA,KAAK,UACL,gBACA,eACA,gBACD;;CAGH,2BAA2B,SAAuB,gBAAqD;EACrG,MAAM,oBAAoB,CAAC,GAAG,KAAK,SAAS,KAAK,OAAO;GAAE,QAAQ,EAAE;GAAQ,QAAQ,EAAE;GAAQ,EAAE,CAAC;AAEjG,OAAK,IAAI,QAAQ,GAAG,QAAQA,eAAa,QAAQ,SAAS;GACxD,MAAM,KAAKA,eAAa;AAExB,OAAI,CAAC,GAAG,UAAU,OAAO,QAAQ,UAAU,CAAE;GAE7C,MAAM,aAAa,IAAI,sBAAsB,QAAQ,IAAI;GACzD,MAAM,UAAU,WAAW,OAAO,GAAG,MAAM,SAAS;AACpD,OAAI,CAAC,QAAS;GAEd,MAAM,SAAS,QAAQ;AAEvB,OAAI,QAAQ,SAAS,0BAA0B,QAAQ,SAAS,yBAAyB;IACvF,MAAM,aAAa,IAAI,UAAU,GAAG,KAAK,GAAG,OAAO;IACnD,MAAM,gBAAgB,kBAAkB,MAAM,MAAM,EAAE,OAAO,OAAO,WAAW,CAAC;AAChF,QAAI,CAAC,eAAe;KAClB,MAAM,4BAA4B,kBAAkB,WAAW,MAAM,CAAC,EAAE,OAAO;AAC/E,SAAI,8BAA8B,CAAC,GAAG;AACpC,YAAM,MAAM,4BAA4B;;AAG1C,uBAAkB,2BAA2B,SAAS;AACtD,uBAAkB,2BAA2B,SAAS;;AAExD;;AAEF,OAAI,QAAQ,SAAS,yBAAyB,QAAQ,SAAS,0BAA0B;IACvF,MAAM,aAAa,IAAI,UAAU,GAAG,KAAK,GAAG,OAAO;IACnD,MAAM,gBAAgB,kBAAkB,MAAM,MAAM,EAAE,OAAO,OAAO,WAAW,CAAC;AAChF,QAAI,CAAC,eAAe;AAClB,WAAM,MACJ,oBAAoB,WAAW,UAAU,CAAC,gDAAgD,MAAM,IAC9F,QAAQ,KACT,IACF;;AAGH,QAAI,OAAO,YAAY,OAAO,aAAa;AACzC,mBAAc,SAAS;AACvB,mBAAc,SAAS,UAAU;;;;AAKvC,SAAO,kBAAkB,QAAQ,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,EAAE,OAAO;;CAGvE,uBAAuB,IAA4B,SAAiB,IAAI,UAAU,EAAE,EAA4B;AAC9G,SAAO;GAAC,GAAG,eAAe,KAAK,WAAW,IAAI,UAAU,OAAO,CAAC;GAAE;GAAI,gBAAgB,KAAK,UAAU;GAAC;;CAGxG,AAAO,SAAS,OAAgB,cAAsC;EACpE,MAAM,EAAE,QAAQ,gBAAgB,KAAK,wBAAwB,qBAAqB,OAAO;EACzF,MAAM,EAAE,QAAQ,aAAa,aAAa,qBAAqB,KAAK,wBAClE,qBAAqB,YACtB;EACD,MAAM,EAAE,QAAQ,YAAY,aAAa,oBAAoB,KAAK,wBAChE,qBAAqB,QACtB;EACD,IAAI,cAAc;mBACH,KAAK,QAAQ;eACjB,KAAK,UAAU;qBACT,OAAO,QAAQ,EAAE,CAAC;wBACf,YAAY,QAAQ,EAAE,CAAC;aAClC,OAAO,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAC;kBAChC,YAAY,MAAM,iBAAiB,CAAC,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;iBAC5E,WAAW,MAAM,gBAAgB,CAAC,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;;AAGrF,OAAK,MAAM,WAAW,KAAK,gBAAgB;GACzC,MAAM,OAAO,MAAM,IAAI,QAAQ,OAAO,UAAU,CAAC;GACjD,MAAM,YAAY,aAAa,IAAI,QAAQ,OAAO,UAAU,CAAC;AAC7D,OAAI,CAAC,QAAQ,CAAC,UAAW;AACzB,kBAAe,QAAQ,SAAS,MAAM,UAAU;;AAElD,SAAO;;;AAIX,IAAK,wEAAL;AACE;AACA;AACA;;EAHG;AAuEL,SAAgB,gBAAgB,SAAwC;AACtE,QAAO,YAAY,qBAAqB;;;;;gBCxvDrB;AAqErB,IAAM,sBAAN,MAAM,oBAAoB;CACxB,AAAgB;CAEhB,AAAQ;;;;CASR,YACE,gBACA,AAAS,QACT,cACA;EAFS;AAGT,OAAK,UAAU;AACf,OAAK,gBAAgB;;CAGvB,aAAa,MACX,gBACA,QACA,YAC8B;EAC9B,MAAM,EAAE,QAAQ,YAAY;EAC5B,MAAM,kBAAkB,iBAAiB,eAAe;EAExD,MAAM,cAAc,MAAM,oBAAoB,iBAAiB,iBAAiB,QAAQ,SAAS,WAAW;EAC5G,MAAM,eAAe,aAAa,kBAAkB,iBAAiB,YAAY;EAEjF,MAAM,oBAAoB,IAAI,oBAAoB,iBAAiB,QAAQ,aAAa;AAExF,SAAO,OAAO,MAAM,EAAE,WAAW,iBAAiB,EAAE,6CAA6C;AAEjG,SAAO;;CAGT,OAAO,kBAAkB,gBAAyB,QAAqB,aAA8B;AACnG,MAAI,CAAC,YAAY,MAAM,OAAO,OAAO,OAAO,QAAQ,CAClD,OAAM,MACJ,+BAA+B,YAAY,MAAM,UAAU,CAAC,cAAc,OAAO,OAAO,QAAQ,UAAU,GAC3G;EAEH,MAAM,kBAAkB,iBAAiB,eAAe;EACxD,MAAM,eAAe,aAAa,kBAAkB,iBAAiB,YAAY;AACjF,SAAO,IAAI,oBAAoB,iBAAiB,QAAQ,aAAa;;CAGvE,OAAO,mBACL,gBACA,QACA,qBACA,KACA;EACA,MAAM,mBAAmB,aAAa,OAAO,qBAAqB,IAAI;AACtE,SAAO,oBAAoB,kBAAkB,gBAAgB,QAAQ,iBAAiB;;CAOxF,IAAI,YAAuB;AACzB,SAAO,KAAK,cAAc;;CAG5B,IAAI,QAAoB;AACtB,SAAO,KAAK,OAAO;;CAGrB,IAAI,WAAsB;AACxB,SAAO,KAAK,cAAc;;CAG5B,IAAI,OAAqB;AACvB,SAAO,KAAK;;CAGd,IAAI,cAA4B;AAC9B,SAAO,KAAK;;;CAId,IAAY,WAAW;AACrB,SAAO,KAAK,OAAO;;;CAIrB,IAAY,UAAU;AACpB,SAAO,KAAK,OAAO;;CAGrB,IAAI,iBAA4B;AAC9B,SAAO,KAAK,cAAc,SAAS,QAAQ,OAAO,GAAG,OAAO;;CAG9D,IAAI,aAAsB;AACxB,SAAO,KAAK,cAAc;;CAG5B,IAAI,qBAA8B;AAChC,SAAO,KAAK,cAAc;;CAG5B,IAAI,oCAA6C;AAC/C,SAAO,KAAK,cAAc;;CAG5B,AAAO,WAAW,QAA4B;AAC5C,SAAO,KAAK,cAAc,WAAW,OAAO;;CAG9C,MAAa,sBAAoD;EAC/D,MAAM,EAAE,cAAc,YAAY,MAAM,KAAK,cAAc,oBACzD,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,cACZ,KAAK,OAAO,mBAAmB,EAAE,CAClC;AACD,SAAO,IAAI,oBAAoB,KAAK,SAAS,KAAK,QAAQ,QAAQ;;CAGpE,AAAO,kBAA2B;EAChC,MAAM,EAAE,QAAQ,gBAAgB,KAAK,cAAc,wBAAwB,qBAAqB,YAAY;AAE5G,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACA;GACD,EACD,wCACD;AAED,SAAO,OAAO,GAAG,YAAY;;CAG/B,AAAO,wBAAwB,kBAG7B;AACA,SAAO,KAAK,cAAc,wBAAwB,iBAAiB;;CAIrE,AAAO,8BACL,kBACA,gBAA6B,EAAE,EAI/B;AACA,SAAO,KAAK,cAAc,8BACxB,KAAK,OAAO,OACZ,KAAK,OAAO,cACZ,kBACA,cACD;;CAGH,AAAO,yCAAyC,kBAG9C;AACA,SAAO,KAAK,cAAc,yCACxB,KAAK,OAAO,OACZ,KAAK,OAAO,cACZ,iBACD;;CAGH,AAAO,sBAAsB,MAAyC;AACpE,SAAO,KAAK,cAAc,sBAAsB,KAAK;;CAGvD,AAAO,4BAA4B,MAAyC;AAC1E,SAAO,KAAK,cAAc,4BAA4B,KAAK,OAAO,OAAO,KAAK,OAAO,cAAc,KAAK;;CAG1G,AAAO,sBAAiC;AACtC,SAAO,KAAK,cAAc,qBAAqB;;CAGjD,AAAO,wBAAwB,YAAsC;AACnE,SAAO,KAAK,cAAc,wBAAwB,WAAW;;CAG/D,AAAO,oBAAoB,YAA4D;AACrF,SAAO,KAAK,cAAc,oBACxB,YACA,MAAM,KAAK,KAAK,OAAO,MAAM,MAAM,CAAC,CAAC,KAAK,MAAM,IAAI,UAAU,EAAE,CAAC,CAClE;;CAGH,AAAO,wBACL,aACA,MAQW;AACX,SAAO,KAAK,cAAc,wBACxB,KAAK,OAAO,OACZ,KAAK,OAAO,cACZ,aACA,MACA,KAAK,OAAO,OACb;;CAGH,AAAO,0BAA0B,aAAwB,MAAiD;AACxG,SAAO,KAAK,cAAc,0BAA0B,KAAK,OAAO,OAAO,KAAK,OAAO,cAAc,aAAa,KAAK;;CAGrH,AAAO,kCAAkC,kBAA6B,sBAA4C;AAChH,SAAO,KAAK,cAAc,kCACxB,KAAK,OAAO,OACZ,KAAK,OAAO,cACZ,kBACA,sBACA,KAAK,OAAO,OACb;;CAGH,AAAO,+BAA+B,aAAuC;AAC3E,SAAO,KAAK,cAAc,+BAA+B,KAAK,OAAO,OAAO,KAAK,OAAO,cAAc,YAAY;;CAGpH,AAAO,qCACL,aACA,WACA,QACe;AACf,SAAO,KAAK,cAAc,qCACxB,KAAK,OAAO,OACZ,KAAK,OAAO,cACZ,aACA,WACA,OACD;;CAGH,AAAO,gBAAwB;AAC7B,SAAO,KAAK,cAAc,cAAc,KAAK,OAAO,OAAO,KAAK,OAAO,aAAa;;;CAItF,AAAO,qBACL,WACA,gBACA,oBACA,mBAC4D;EAC5D,MAAM,cAAc,KAAK,OAAO,MAAM,IAAI,mBAAmB,UAAU,CAAC;AACxE,MAAI,CAAC,YAAa,OAAM,MAAM,QAAQ,mBAAmB,UAAU,CAAC,YAAY;EAChF,MAAM,mBAAmB,KAAK,OAAO,aAAa,IAAI,mBAAmB,UAAU,CAAC;AACpF,MAAI,CAAC,iBAAkB,OAAM,MAAM,kBAAkB,mBAAmB,UAAU,CAAC,YAAY;EAE/F,MAAM,aAAa,KAAK,OAAO,MAAM,IAAI,kBAAkB,UAAU,CAAC;AACtE,MAAI,CAAC,WAAY,OAAM,MAAM,QAAQ,kBAAkB,UAAU,CAAC,YAAY;EAC9E,MAAM,kBAAkB,KAAK,OAAO,aAAa,IAAI,kBAAkB,UAAU,CAAC;AAClF,MAAI,CAAC,gBAAiB,OAAM,MAAM,kBAAkB,kBAAkB,UAAU,CAAC,YAAY;AAE7F,SAAO,qBAAqB,WAAW,gBAAgB,aAAa,YAAY,kBAAkB,gBAAgB;;CAGpH,sBAAgD;EAE9C,MAAM,eAAyC,EAAE;EACjD,MAAM,iBAAiB,KAAK,SAAS,QAAQ,MAAM,EAAE,OAAO;AAC5D,MAAI,eAAe,UAAU,GAAG;AAC9B,gBAAa,KAAK,qBAAqB,oBAAoB,EAAE,OAAO,KAAW,CAAC,CAAC;;AAGnF,SAAO;;CAOT,MAAM,YAAY,OAAoB;AACpC,OAAK,cAAc;AAEnB,MAAI,KAAK,OAAO,oBAAoB,WAAW;AAC7C,UAAO,EAAE;;AAGX,MAAI;GACF,MAAM,WAAW,MAAM,KAAK,gBAAgB;IAC1C,MAAM,OAAO,KAAK,OAAO,kBAAkB,YAAY,UAAU;IACjE,MAAM,WAAW,KAAK,OAAO,UAAU,IAAI,YAAY,UAAU,CAAC;AAClE,QAAI,CAAC,QAAQ,CAAC,SAAU,OAAM,MAAM,kBAAkB,YAAY,UAAU,CAAC,YAAY;AACzF,WAAO,8BACL,IAAI,UAAU,KAAK,aAAa,EAChC,KAAK,WACL,MACA,SAAS,aAAa,OAAO,sBAAsB,GAAG,wBAAwB,UAC/E;KACD;GAEF,MAAM,MAAqC,EAAE;GAC7C,MAAM,aAAa,MAAM,KAAK,SAAS,SAAS,WAAW,wBAAwB,SAAS;AAE5F,QAAK,MAAM,CAAC,GAAG,YAAY,WAAW,SAAS,EAAE;AAC/C,QAAI,YAAY,MAAM;KACpB,MAAM,cAAc,MAAM;KAC1B,MAAM,OAAO,KAAK,OAAO,kBAAkB,YAAY,UAAU;KACjE,MAAM,WAAW,KAAK,OAAO,UAAU,IAAI,YAAY,UAAU,CAAC;AAClE,SAAI,CAAC,SAAU,OAAM,MAAM,kBAAkB,KAAK,aAAa,YAAY;AAC3E,SAAI,KACF,kDACE,KAAK,WACL,SAAS,IACT,KAAK,WACL,IAAI,UAAU,KAAK,aAAa,EAChC,SAAS,aAAa,OAAO,sBAAsB,GAAG,wBAAwB,UAC/E,CACF;;;AAIL,UAAO;UACD;AACN,UAAO,EAAE;;;;;;;;;;;;;CAcb,MAAM,aACJ,QACA,aACA,sBACA,aACA,QACiC;AACjC,OAAK,OAAO,OAAO,MAAM,EAAE,MAAM,KAAK,SAAS,EAAE,sDAAsD;EAEvG,MAAM,EAAE,iBAAiB,MAAM,KAAK,mBAAmB,QAAQ,aAAa,qBAAqB;EAEjG,MAAM,OAAO,MAAM,KAAK,OAAO,oBAAoB,cAAc,aAAa,OAAO;AAErF,OAAK,OAAO,OAAO,MACjB,EAAE,MAAM,KAAK,KAAK,SAAS,IAAI,EAC/B,iEACD;AACD,SAAO;;;;;;;;;;CAWT,MAAM,mBACJ,QACA,aACA,sBACmC;EACnC,MAAM,eAAe,KAAK,qBAAqB;EAC/C,MAAM,EAAE,cAAc,eAAe,MAAM,aAAa,MAAM,KAAK,iBAAiB,EAAE,CAAC;EACvF,MAAM,cAAc,MAAM,KAAK,eAAe,QAAQ,aAAa,KAAK;EAExE,MAAM,EACJ,OAAO,EAAE,gBACP,MAAM,KAAK,SAAS,SAAS,WAAW,6BAA6B,YAAY;EAErF,MAAM,eAAwC,EAAE;AAEhD,MAAI,cAAc,SAAS,GAAG;AAC5B,gBAAa,KACX,uBACE,IAAI,qBACF,IAAI,mBAAmB;IACrB,cAAc,CAAC,GAAG,cAAc;IAChC,UAAU,KAAK;IACf,iBAAiB;IAClB,CAAC,CAAC,mBAAmB,SAAS,CAChC,EACD;IACE,qBAAqB;IACrB,MAAM,gBAAgB;IACvB,CACF,CACF;;EAGH,MAAM,eAAe,MAAM,oCAAoC,KAAK,OAAO;EAE3E,MAAM,aAAa,uBACjB,IAAI,qBACF,IAAI,mBAAmB;GACrB,cAAc,CAAC,GAAG,cAAc,GAAG,YAAY,aAAa;GAC5D,UAAU,KAAK;GACf,iBAAiB;GAClB,CAAC,CAAC,mBAAmB,aAAa,CACpC,EACD;GACE,SAAS,YAAY;GACrB,qBAAqB;GACrB,MAAM,gBAAgB;GACvB,CACF;EAED,MAAM,qBAAqB,MAAM,oBAAoB,MAAM,sBAAsB,KAAK,OAAO;EAE7F,MAAM,YAAY,MAAM,mBAAmB,cAAc,QAAQ,YAAY;EAC7E,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,UAAU,aAAa;EAC3D,MAAM,YAAY,uBAAuB,IAAI;GAC3C,SAAS,UAAU;GACnB,qBAAqB;GACrB,MAAM,gBAAgB;GACvB,CAAC;EAEF,MAAM,eAAe;GAAC,GAAG;GAAc;GAAY;GAAU;AAE7D,SAAO;GAAE;GAAc,eAAe,aAAa,SAAS;GAAG;;;;;;;;;;;;;;;;;;;;CAqBjE,MAAM,kBAAkB,OAAkE;AACxF,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC,aAAa,MAAM;GACnB,mBAAmB,MAAM;GACzB,UAAU,MAAM;GACjB,EACD,oEACD;EAED,MAAM,EAAE,aAAa,QAAQ,GAAG,YAAY;EAC5C,MAAM,EAAE,iBAAiB,MAAM,KAAK,wBAAwB,EAC1D,GAAG,SACJ,CAAC;EAEF,MAAM,OAAO,MAAM,KAAK,OAAO,oBAAoB,cAAc,aAAa,OAAO;AACrF,OAAK,OAAO,OAAO,MACjB,EAAE,KAAK,KAAK,KAAK,SAAS,IAAI,EAC9B,yEACD;AAED,SAAO;;;;;;;;;;;;;;;;;;;;;CAsBT,MAAM,wBAAwB,EAC5B,aACA,gBACA,mBACA,oBACA,cAAc,OACd,WAAW,OACX,MACA,WAAW,gBACgD;EAC3D,MAAM,YACJ,iBAAiB,MAAM,KAAK,SAAS,SAAS,WAAW,mBAAmB,YAAY,EAAE;EAG5F,MAAM,WAAW,MAAM,KAAK,YAAY,CAAC,mBAAmB,mBAAmB,CAAC;EAChF,MAAM,eACJ,KAAK,qBAAqB,CAAC,SAAS,IAChC,KAAK,qBAAqB,GAC1B,CAAC,qBAAqB,oBAAoB,EAAE,OAAO,KAAW,CAAC,CAAC;EAEtE,MAAM,CAAC,iBAAiB,kBAAkB,KAAQ;EAClD,MAAM,cAAc,MAAM,KAAK,eAAe,gBAAgB,oBAAoB,aAAa;GAC7F,YAAY;GACZ,kBAAkB;GACnB,CAAC;EACF,MAAM,WAAW,MAAM,KAAK,YAAY,aAAa,mBAAmB,UAAU,EAChF,kBAAkB,OACnB,CAAC;EACF,MAAM,EAAE,cAAc,eAAe,MAAM,aAAa,MAAM,KAAK,iBAAiB,CAClF,oBACA,kBACD,CAAC;EACF,MAAM,EAAE,cAAc,kBAAkB,cAAc,YAAY;EAElE,MAAM,gBAAyC,EAAE;EACjD,IAAI;EACJ,IAAI,cAAc;AAGlB,MAAI,SAAS,SAAS,GAAG;GACvB,MAAM,UAAU,IAAI,mBAAmB;IACrC,UAAU,KAAK,OAAO,OAAO;IAC7B,iBAAiB;IACjB,cAAc;IACf,CAAC,CAAC,wBAAwB;AAE3B,iBAAc,KACZ,uBAAuB,IAAI,qBAAqB,QAAQ,EAAE,EACxD,MAAM,gBAAgB,YACvB,CAAC,CACH;;AAIH,MAAI,cAAc,SAAS,GAAG;GAC5B,MAAM,UAAU,IAAI,mBAAmB;IACrC,UAAU,KAAK,OAAO,OAAO;IAC7B,iBAAiB;IACjB,cAAc;IACf,CAAC,CAAC,mBAAmB,SAAS;AAE/B,iBAAc,KACZ,uBAAuB,IAAI,qBAAqB,QAAQ,EAAE;IACxD,qBAAqB;IACrB,MAAM,gBAAgB;IACvB,CAAC,CACH;;EAGH,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EAEjF,MAAM,6BAA6B,CAAC,GAAG,oBAAoB,GAAG,iBAAiB;AAK/E,gBAAc,MAAM,KAAK,iBAAiB;GACxC,KAAK;IAAC,GAAG;IAAc;IAAe,GAAG,YAAY;IAAc,GAAG;IAAS,GAAG,SAAS;IAAa;GACxG;GACA;GACD,CAAC;EAEF,MAAM,SAAS,UAAU,YAAY;EACrC,MAAM,cAAc,eAAe,aAAa,2BAA2B;EAC3E,MAAM,eAAe,cAAc;EACnC,MAAM,UAAU,SAAS;EACzB,MAAM,iBAAiB,gBAAgB,WAAW,SAAS,oBAAoB;AAE/E,MAAI,gBAAgB;AAGlB,iBAAc,MAAM,KAAK,iBAAiB;IACxC,KAAK;KAAC,GAAG;KAAc,GAAG,YAAY;KAAc,GAAG;KAAS,GAAG,SAAS;KAAa;IACzF;IACA;IACD,CAAC;GAEF,MAAMM,WAAS,UAAU,YAAY;GACrC,MAAMC,YAAUD,WAAS;AAGzB,OAAIC,WAAS;AACX,kBAAc;;aAEP,WAAW,cAAc;AAClC,iBAAc;;AAGhB,gBAAc,uBAAuB,aAAa;GAChD,MAAM,gBAAgB;GACtB,qBAAqB,YAAY;GAClC,CAAC;EAEF,MAAM,eAAe,CAAC,GAAG,eAAe,YAAY;AAGpD,SAAO;GACL;GACA,eAAe,aAAa,SAAS;GACrC;GACD;;CAGH,MAAM,OAAO,OAAmD;AAC9D,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC,eAAe,MAAM;GACrB,oBAAoB,MAAM,mBAAmB,UAAU;GACvD,cAAc,MAAM;GACpB,mBAAmB,MAAM,kBAAkB,UAAU;GACtD,EACD,wDACD;EAED,MAAM,cAAc,KAAK,OAAO,MAAM,IAAI,MAAM,mBAAmB,UAAU,CAAC;AAC9E,MAAI,CAAC,YAAa,OAAM,MAAM,yBAAyB;EACvD,MAAM,aAAa,KAAK,OAAO,MAAM,IAAI,MAAM,kBAAkB,UAAU,CAAC;AAC5E,MAAI,CAAC,WAAY,OAAM,MAAM,wBAAwB;EAErD,MAAM,EAAE,aAAa,QAAQ,GAAG,YAAY;EAE5C,MAAM,EAAE,iBAAiB,MAAM,KAAK,aAAa,QAAQ;EAEzD,MAAM,OAAO,MAAM,KAAK,OAAO,oBAAoB,cAAc,aAAa,OAAO;AACrF,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC,KAAK,KAAK,KAAK,SAAS;GACzB,EACD,gDACD;AAED,SAAO;;CAGT,MAAM,aAAa,EACjB,eACA,oBACA,cACA,oBACA,mBACA,MACA,WAAW,cACX,oBACA,yBAC8C;EAC9C,MAAM,cAAc,KAAK,OAAO,MAAM,IAAI,mBAAmB,UAAU,CAAC;AACxE,MAAI,CAAC,YAAa,OAAM,MAAM,yBAAyB;EACvD,MAAM,aAAa,KAAK,OAAO,MAAM,IAAI,kBAAkB,UAAU,CAAC;AACtE,MAAI,CAAC,WAAY,OAAM,MAAM,wBAAwB;EAErD,MAAM,YACJ,iBAAiB,MAAM,KAAK,SAAS,SAAS,WAAW,mBAAmB,YAAY,EAAE;EAG5F,MAAM,WAAW,MAAM,KAAK,YAAY,sBAAsB,CAAC,mBAAmB,mBAAmB,CAAC;EACtG,MAAM,eACJ,KAAK,qBAAqB,CAAC,SAAS,IAChC,KAAK,qBAAqB,GAC1B,CAAC,qBAAqB,oBAAoB,EAAE,OAAO,KAAS,CAAC,CAAC;EAEpE,MAAM,CAAC,iBAAiB,kBAAkB,KAAQ;EAClD,MAAM,YAAY,MAAM,KAAK,aAAa,cAAc,mBAAmB;GACzE,YAAY;GACZ,kBAAkB;GAClB;GACD,CAAC;EACF,MAAM,aAAa,MAAM,KAAK,cAAc,eAAe,oBAAoB;GAC7E,kBAAkB;GAClB;GACD,CAAC;EAKF,MAAM,EAAE,cAAc,eAAe,MAAM,aAAa,MAAM,KAAK,iBAAiB,CAClF,oBACA,kBACD,CAAC;EACF,MAAM,EAAE,cAAc,kBAAkB,cAAc,YAAY;EAElE,MAAM,gBAAyC,EAAE;EACjD,IAAI;EACJ,IAAI,cAAc;AAGlB,MAAI,YAAY,KAAK,OAAO,YAAY,IAAI,oBAAoB;AAC9D,YAAS,KAAK,GAAG,eAAe,KAAK,WAAW,IAAI,UAAU,mBAAmB,CAAC,CAAC;;AAIrF,MAAI,SAAS,SAAS,GAAG;GACvB,MAAM,UAAU,IAAI,mBAAmB;IACrC,UAAU,KAAK,OAAO,OAAO;IAC7B,iBAAiB;IACjB,cAAc;IACf,CAAC,CAAC,wBAAwB;AAE3B,iBAAc,KACZ,uBAAuB,IAAI,qBAAqB,QAAQ,EAAE,EACxD,MAAM,gBAAgB,YACvB,CAAC,CACH;;AAIH,MAAI,cAAc,SAAS,GAAG;GAC5B,MAAM,UAAU,IAAI,mBAAmB;IACrC,UAAU,KAAK,OAAO,OAAO;IAC7B,iBAAiB;IACjB,cAAc;IACf,CAAC,CAAC,mBAAmB,SAAS;AAE/B,iBAAc,KACZ,uBAAuB,IAAI,qBAAqB,QAAQ,EAAE;IACxD,qBAAqB;IACrB,MAAM,gBAAgB;IACvB,CAAC,CACH;;EAGH,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EACjF,MAAM,6BAA6B,CAAC,GAAG,oBAAoB,GAAG,iBAAiB;AAK/E,gBAAc,MAAM,KAAK,iBAAiB;GACxC,KAAK;IAAC,GAAG;IAAc;IAAe,GAAG,UAAU;IAAc,GAAG;IAAS,GAAG,WAAW;IAAa;GACxG;GACA;GACD,CAAC;EAEF,MAAM,SAAS,UAAU,YAAY;EACrC,MAAM,cAAc,eAAe,aAAa,2BAA2B;EAC3E,MAAM,eAAe,cAAc;EACnC,MAAM,UAAU,SAAS;EACzB,MAAM,iBAAiB,gBAAgB,WAAW,SAAS,oBAAoB;AAE/E,MAAI,gBAAgB;AAGlB,iBAAc,MAAM,KAAK,iBAAiB;IACxC,KAAK;KAAC,GAAG;KAAc,GAAG,UAAU;KAAc,GAAG;KAAS,GAAG,WAAW;KAAa;IACzF;IACA;IACD,CAAC;GACF,MAAMD,WAAS,UAAU,YAAY;GACrC,MAAMC,YAAUD,WAAS;AAGzB,OAAIC,WAAS;AACX,kBAAc;;aAEP,WAAW,cAAc;AAClC,iBAAc;;AAGhB,gBAAc,uBAAuB,aAAa;GAChD,MAAM,gBAAgB;GACtB,qBAAqB,YAAY;GAClC,CAAC;EAEF,MAAM,eAAe,CAAC,GAAG,eAAe,YAAY;AACpD,SAAO;GACL;GACA,eAAe,aAAa,SAAS;GACrC;GACD;;;;;;;;;CAUH,MAAM,qBAAmD;EACvD,MAAM,KAAK,MAAMC,qBAAa,mBAAmB,KAAK,UAAU;GAC9D,cAAc,KAAK;GACnB,UAAU,KAAK,OAAO,OAAO;GAC9B,CAAC;AACF,SAAO;GAAE,cAAc,CAAC,GAAG;GAAE,MAAM,EAAE;GAAE;;;;;;;;;;CAWzC,MAAM,aACJ,aACA,QAC+B;EAC/B,MAAM,KAAK,MAAM,KAAK,oBAAoB;AAC1C,SAAO,KAAK,OAAO,mBAAmB,IAAI,aAAa,OAAO;;;;;;;;CAShE,MAAM,qBAAmD;EACvD,MAAM,KAAK,MAAM,KAAK,oBAAoB;EAC1C,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,GAAG,aAAa;EACpD,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;AACjF,SAAO,uBAAuB,IAAI;GAChC,SAAS,GAAG;GACZ,qBAAqB;GACrB,MAAM,gBAAgB;GACvB,CAAC;;;;;;;;;;CAWJ,MAAM,cACJ,QACA,aACA,cAAiC,EAAE,EACL;AAC9B,SAAO,KAAK,cAAc,cACxB,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,QACA,aACA,YACD;;CAGH,MAAM,yBACJ,QACA,aACA,SACA,cAA4C,EAAE,EAChB;AAC9B,SAAO,KAAK,cAAc,yBACxB,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,QACA,aACA,SACA,YACD;;;;;;;;;;;;;;;;CAkBH,MAAM,oBACJ,QACA,aACA,gBACA,WACA,cAAiC,EAAE,EACL;EAE9B,MAAM,OAAO,gBAAgB,UAAU;EACvC,MAAM,mBAAmB,qBAAqB,KAAK;EACnD,MAAM,UAAU,oBAAoB,KAAK;EACzC,MAAM,OAAO,8BAA8B,KAAK;EAChD,MAAM,SAAS,8BAA8B,SAAS,KAAK,UAAU;EAGrE,MAAM,CAAC,YAAY,mBAAmB,sBAAsB,MAAM,QAAQ,IAAI;GAC5E,KAAK,OAAO,SAAS,WAAW,eAAe,OAAO;GACtD,KAAK,SAAS,SAAS,WAAW,eAAe,eAAe;GAChE,KAAK,SAAS,SAAS,WAAW,qBAAqB,eAAe;GACvE,CAAC;EACF,MAAM,iBAAiB,oBAAoB,OAAO;EAGlD,MAAM,CAAC,mBAAmB,qBAAqB,MAAM,QAAQ,IAAI,CAC/D,KAAK,SAAS,SAAS,WAAW,kCAAkC,aAAa,MAAM,EACvF,KAAK,SAAS,SAAS,WAAW,2BAA2B,CAAC,MAAM,QAAQ;AAC1E,UAAO,KAAK,IAAI,IAAI,OAAO,iBAAiB;IAC5C,CACH,CAAC;EAGF,MAAM,iBAAiB,KAAK,MAAM,OAAO,OAAO,GAAG,iBAAiB;EACpE,MAAM,mBAAmB,OAAO,eAAe,OAAO,KAAK,OAAO,YAAY,SAAS,EAAE;EACzF,MAAM,cAAc,kBAAkB;EAGtC,MAAM,wBACH,MAAM,KAAK,SAAS,SAAS,WAAW,eAAe,iBAAiB,GAAG,YAAY;EAC1F,MAAM,eAAe,KAAK,IAAI,uBAAuB,oBAAoB,mBAAmB,EAAE;EAE9F,MAAM,cAAc,OAAO,UACxB,MAAM,KAAK,SAAS,SAAS,WAAW,eAAe,QAAQ,EAAE,MAAM,QACxE,GACD;EACD,MAAM,mBAAmB,OAAO,OAAO,GAAG;EAE1C,MAAM,gBACJ,eAAe,KAAK,cAAc,IAC9B,KAAK,MAAO,mBAAmB,cAAe,aAAa,GAC3D;AAEN,MAAI,iBAAiB,GAAG;AACtB,SAAM,IAAI,MAAM,0CAA0C;;EAI5D,MAAMA,iBAAyC,EAAE;EACjD,MAAM,UAAoB,EAAE;AAG5B,MAAI,CAAC,YAAY;AACf,kBAAa,KAAK,wCAAwC,KAAK,WAAW,QAAQ,KAAK,WAAW,QAAQ,CAAC;;EAI7G,IAAI;AACJ,MAAI,CAAC,aAAa;GAChB,MAAM,oBAAoB,QAAQ,UAAU;AAC5C,WAAQ,KAAK,kBAAkB;AAC/B,uBAAoB,kBAAkB;AAEtC,kBAAa,KACX,GAAG,aAAa,MACd;IACE,aAAa;IACb,kBAAkB,KAAK;IACvB,kBAAkB,kBAAkB;IACpC,UAAU;IACX,EACD,kBACD,CAAC,aACH;SACI;AACL,uBAAoB;;EAItB,MAAM,CAAC,mBAAmB,uBAAuB,MAAM,QAAQ,IAAI,CACjE,aAAa,UAAU;GACrB,aAAa;GACb,kBAAkB,KAAK;GACvB,qBAAqB;GACrB,wBAAwB,yBAAyB;GAClD,CAAC,CAAC,cACH,aAAa,UAAU;GACrB,aAAa;GACb,kBAAkB,KAAK;GACvB,qBAAqB;GACrB,wBAAwB,yBAAyB;GAClD,CAAC,CAAC,aACJ,CAAC;AAGF,GAAC,kBAAkB,IAAI,oBAAoB,GAAG,CAAC,SAAS,OAAO;AAC7D,MAAG,OAAO,GAAG,KAAK,KAAK,SAAS;IAC9B,GAAG;IACH,YAAY,IAAI,OAAO,OAAO,gBAAgB,GAAG,QAAQ,IAAI;IAC9D,EAAE;IACH;AAEF,iBAAa,KAAK,GAAG,mBAAmB,GAAG,oBAAoB;EAG/D,MAAM,iBAAiB,MAAM,sBAAsB,aAAa,MAAM,mBAAmB,QAAQ,KAAK,UAAU;EAGhH,MAAM,kBAAkB,MAAM,KAAK,cAAc,gBAAgB,KAAK,aAAa,YAAY;AAE/F,iBAAa,KAAK,gBAAgB,GAAG,gBAAgB,aAAa;EAGlE,MAAM,cAAc,IAAI,aAAa,CAAC,IAAI,GAAGA,eAAa;AAC1D,SAAO,uBAAuB,aAAa;GACzC,MAAM,gBAAgB;GACtB,SAAS,CAAC,GAAG,SAAS,GAAG,gBAAgB,KAAK;GAC9C,qBAAqB,KAAK,OAAO;GAClC,CAAC;;CAGJ,MAAM,yBACJ,iBACA,kBAC8B;EAE9B,MAAM,mBAAmB,aAAa,MAAM;GAC1C,aAAa;GACb,mBAAmB;GACnB,kBAAkB,KAAK;GACxB,CAAC;EAGF,MAAM,cAAc,IAAI,aAAa,CAAC,IAAI,iBAAiB;EAG3D,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;AAEjF,SAAO,uBAAuB,aAAa;GACzC,MAAM,gBAAgB;GACtB,SAAS,EAAE;GACX,qBAAqB;GACtB,CAAC;;;;;;;;;;;;CAaJ,MAAM,QACJ,QACA,aACA,cAAiC,EAAE,EACnC,aACA,QAC+B;AAC/B,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACA,aAAa,YAAY,UAAU;GACpC,EACD,8DACD;EAED,MAAM,KAAK,MAAM,KAAK,cAAc,QAAQ,aAAa,YAAY;EAErE,MAAM,MAAM,MAAM,KAAK,OAAO,mBAAmB,IAAI,aAAa,OAAO;AACzE,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACD,EACD,sDACD;AACD,SAAO;;CAGT,MAAM,mBACJ,QACA,aACA,SACA,cAA4C,EAAE,EAClB;AAC5B,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACA,aAAa,YAAY,UAAU;GACnC,YAAY,QAAQ;GACrB,EACD,0FACD;EAED,MAAM,EAAE,iCAAiB,MAAM,KAAK,yBAAyB,QAAQ,aAAa,SAAS,YAAY;EAEvG,MAAM,WAAW,MAAM,QAAQ,gBAAgBA,eAAa;AAC5D,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACD,EACD,8EACD;AACD,SAAO;;;;;;;;;;CAWT,MAAM,cACJ,QACA,aACA,cAAiC,EAAE,EACL;EAC9B,MAAM,MAAM,MAAM,KAAK,cAAc,QAAQ,aAAa,YAAY;EACtE,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,aAAa;EACrD,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EACjF,MAAM,WAAW,uBAAuB,IAAI;GAC1C,MAAM,gBAAgB;GACtB,SAAS,IAAI;GACb,qBAAqB;GACtB,CAAC;AAEF,SAAO;;CAGT,MAAM,yBACJ,QACA,aACA,SACA,cAA4C,EAAE,EAChB;EAC9B,MAAM,MAAM,MAAM,KAAK,yBAAyB,QAAQ,aAAa,SAAS,YAAY;EAC1F,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,aAAa;EACrD,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EACjF,MAAM,WAAW,uBAAuB,IAAI;GAC1C,MAAM,gBAAgB;GACtB,SAAS,IAAI;GACb,qBAAqB;GACtB,CAAC;AAEF,SAAO;;;;;;;;;;;CAYT,MAAM,8BACJ,KACA,gBACA,kBAK2B;EAC3B,MAAM,gBAAwC,EAAE;AAEhD,MAAI,kBAAkB,SAAS;GAC7B,MAAM,YAAY,qBAAqB,oBAAoB,EACzD,OAAO,MACR,CAAC;GACF,MAAM,eAAe,MAAM,KAAK,iBAAiB,iBAAiB,eAAe;GACjF,MAAM,gBAAgB,MAAM,KAAK,kBAC/B,iBAAiB,gBACjB,iBAAiB,cAClB;GAED,MAAM,aAAa,MAAM,KAAK,OAAO,SAAS,WAAW,mBAAmB,YAAY,EAAE;GAE1F,MAAM,KAAK,IAAI,qBACb,IAAI,mBAAmB;IACrB,cAAc;KAAC;KAAW,GAAG,aAAa;KAAc,GAAG,cAAc;KAAa;IACtF,UAAU,KAAK,OAAO,SAAS;IAC/B,iBAAiB;IAClB,CAAC,CAAC,mBAAmB,CAAC,GAAG,KAAK,OAAO,qBAAqB,GAAG,aAAa,KAAK,CAAC,CAClF;AAED,iBAAc,KAAK,GAAG;;EAGxB,MAAM,CAAC,gBAAgB,GAAG,YAAY,MAAM,KAAK,OAAO,qBACtD,CAAC,GAAG,KAAK,GAAG,cAAc,EAC1B,CAAC,KAAK,SAAS,GAAG,eAAe,CAClC;AAED,MAAI,CAAC,eAAgB,OAAM,IAAI,MAAM,qBAAqB;EAC1D,MAAM,aAAa,aAAa,OAAO,gBAAgB,KAAK,SAAS,IAAI;AACzE,UAAQ,IAAI,cAAc,WAAW;AACrC,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,qBAAqB;EACpD,MAAM,eAAe,IAAI,IAAI,KAAK,OAAO,MAAM;AAE/C,iBAAe,SAAS,aAAa,QAAQ;GAC3C,MAAM,OAAO,SAAS;AACtB,OAAI,CAAC,KAAM,OAAM,IAAI,MAAM,qBAAqB;AAChD,gBAAa,IACX,YAAY,UAAU,EACtB,KAAK,WAAW,aAAa,MAAM,KAAK,SAAS,KAAK,KAAK,OAAO,UAAU,CAC7E;IACD;EAEF,MAAM,gBAAgB,IAAIC,eAAY;GACpC,QAAQ,KAAK;GACb,SAAS,KAAK,OAAO;GACrB,QAAQ,EAAE;GACV,YAAY;GACZ,OAAO,KAAK,OAAO;GACnB,OAAO,KAAK,OAAO;GACnB,YAAY,KAAK,OAAO;GACxB,WAAW,KAAK,OAAO;GACvB,WAAW,KAAK,OAAO;GACvB,iBAAiB,KAAK,OAAO;GAC9B,CAAC;EACF,MAAM,sBAAsB,oBAAoB,mBAC9C,KAAK,SACL,eACA,gBACA,KAAK,SAAS,IACf;AAED,SAAO;GACL,OAAO;GACP,cAAc;GACf;;;;;;;;;;;;CAaH,MAAM,YACJ,QACA,aACA,WAAW,OACX,YAA6B,EAAE,EACD;EAC9B,MAAM,sBAAsB,KAAK,OAAO,UAAU,IAAI,YAAY,UAAU,CAAC,EAAE;AAC/E,MAAI,CAAC,oBAAqB,OAAM,MAAM,uBAAuB;AAE7D,SAAO,KAAK,cAAc,YACxB,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,QACA,aACA,UACA,UACD;;;;;;;;;;;;;CAcH,MAAM,uBACJ,QACA,aACA,SACA,WAAW,OACX,YAAwC,EAAE,EACZ;EAC9B,MAAM,sBAAsB,KAAK,OAAO,UAAU,IAAI,YAAY,UAAU,CAAC,EAAE;AAC/E,MAAI,CAAC,oBAAqB,OAAM,MAAM,uBAAuB;AAE7D,SAAO,KAAK,cAAc,uBACxB,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,QACA,aACA,SACA,UACA,UACD;;;;;;;;;;;;;CAcH,MAAM,MACJ,QACA,aACA,WAAW,OACX,YAA6B,EAAE,EAC/B,aACA,QAC+B;AAC/B,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACA;GACA;GACD,EACD,0DACD;EAED,MAAM,KAAK,MAAM,KAAK,YAAY,QAAQ,aAAa,UAAU,UAAU;EAE3E,MAAM,MAAM,MAAM,KAAK,OAAO,mBAAmB,IAAI,aAAa,OAAO;AACzE,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACD,EACD,kDACD;AAED,SAAO;;;;;;;;;;;;CAaT,MAAM,iBACJ,QACA,aACA,SACA,WAAW,OACX,YAAwC,EAAE,EACd;AAC5B,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC,YAAY,QAAQ;GACpB;GACA;GACA;GACD,EACD,qEACD;EAED,MAAM,EAAE,iCAAiB,MAAM,KAAK,uBAAuB,QAAQ,aAAa,SAAS,UAAU,UAAU;EAE7G,MAAM,SAAS,MAAM,QAAQ,gBAAgBD,eAAa;AAE1D,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACD,EACD,6DACD;AAED,SAAO;;;;;;;;;;;CAYT,MAAM,YACJ,QACA,aACA,WAAW,OACX,YAA6B,EAAE,EACD;EAC9B,MAAM,MAAM,MAAM,KAAK,YAAY,QAAQ,aAAa,UAAU,UAAU;EAC5E,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,aAAa;EACrD,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EACjF,MAAM,WAAW,uBAAuB,IAAI;GAC1C,MAAM,gBAAgB;GACtB,SAAS,IAAI;GACb,qBAAqB;GACtB,CAAC;AACF,SAAO;;;;;;;;;;;CAYT,MAAM,uBACJ,QACA,aACA,SACA,WAAW,OACX,YAAwC,EAAE,EACZ;EAC9B,MAAM,MAAM,MAAM,KAAK,uBAAuB,QAAQ,aAAa,SAAS,UAAU,UAAU;EAChG,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,aAAa;EACrD,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EACjF,MAAM,WAAW,uBAAuB,IAAI;GAC1C,MAAM,gBAAgB;GACtB,SAAS,IAAI;GACb,qBAAqB;GACtB,CAAC;AACF,SAAO;;;;;;;;;;;;CAaT,MAAM,eACJ,QACA,aACA,cAAc,OACd,eAAmC,EAAE,EACP;EAC9B,MAAM,sBAAsB,KAAK,OAAO,UAAU,IAAI,YAAY,UAAU,CAAC,EAAE;AAC/E,MAAI,CAAC,oBAAqB,OAAM,MAAM,0BAA0B;AAEhE,MAAI,CAAC,KAAK,OAAO,gBAAiB,OAAM,MAAM,8BAA8B;AAE5E,SAAO,KAAK,cAAc,eACxB,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,KAAK,OAAO,iBACZ,QACA,aACA,aACA,aACD;;;;;;;;;;;;;CAcH,MAAM,0BACJ,QACA,aACA,SACA,cAAc,OACd,eAA8C,EAAE,EAClB;EAC9B,MAAM,sBAAsB,KAAK,OAAO,UAAU,IAAI,YAAY,UAAU,CAAC,EAAE;AAC/E,MAAI,CAAC,oBAAqB,OAAM,MAAM,0BAA0B;AAEhE,MAAI,CAAC,KAAK,OAAO,gBAAiB,OAAM,MAAM,8BAA8B;AAE5E,SAAO,KAAK,cAAc,0BACxB,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,KAAK,OAAO,iBACZ,QACA,aACA,SACA,aACA,aACD;;;;;;;;;;;;;;CAeH,MAAM,qBACJ,QACA,aACA,iBACmC;EAEnC,MAAM,OAAO,KAAK,OAAO,YAAY,YAAY;EACjD,MAAM,UAAU,KAAK,OAAO,cAAc,UAAU;EACpD,MAAM,eAAe,KAAK,OAAO,kBAAkB,YAAY,UAAU;AAEzE,MAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,SAAM,IAAI,MAAM,kBAAkB;;AAGpC,MAAI,CAAC,gBAAgB,CAAC,aAAa,sBAAsB;AACvD,SAAM,IAAI,MAAM,mCAAmC;;EAIrD,MAAM,OAAO,gBAAgB,IAAI,UAAU,aAAa,qBAAqB,CAAC;EAC9E,MAAM,UAAU,oBAAoB,KAAK;EACzC,MAAM,gBAAgB,6BAA6B,KAAK;EACxD,MAAM,SAAS,8BAA8B,SAAS,KAAK,UAAU;EAGrE,MAAM,gBAAgB,MAAM,KAAK,SAAS,SAAS,WAAW,kCAAkC,IAAI;EAEpG,MAAM,cAAc,IAAI,UAAU,IAAI,UAAU,OAAO,CAAC,UAAU,CAAC;EAGnE,MAAM,cAAc,MAAM,KAAK,eAAe,QAAQ,aAAa,iBAAiB;GAClF,YAAY;GACZ,kBAAkB;GACnB,CAAC;EAGF,MAAM,eAAe,QAAQ,UAAU;EACvC,MAAM,uBAAuB,cAAc,cAAc;GACvD,YAAY,KAAK;GACjB,kBAAkB,aAAa;GAC/B,UAAU;GACV,OAAO;GACP,WAAW;GACZ,CAAC;EAEF,MAAM,4BAA4B,yBAChC,QACA,eACA,KAAK,WACL,YAAY,aAAa,IAAI,CAAC,UAAU,EACxC,EAAE,EAEF,iBACD;EAGD,MAAM,kBAA0C,MAAM,sBAAsB,cAC1E,MACA,aAAa,WACb,KAAK,WACL,QACA,YACD;EAGD,MAAM,EACJ,OAAO,EAAE,gBACP,MAAM,KAAK,SAAS,SAAS,WAAW,6BAA6B,YAAY;EAErF,MAAM,kBAAkB,IAAI,mBAAmB;GAC7C,UAAU,KAAK,OAAO,OAAO;GAC7B,iBAAiB;GACjB,cAAc,CAAC,GAAG,YAAY,aAAa;GAC5C,CAAC,CAAC,mBAAmB,KAAK,OAAO,oBAAoB;EACtD,MAAM,cAAc,uBAAuB,IAAI,qBAAqB,gBAAgB,EAAE;GACpF,SAAS,YAAY;GACrB,qBAAqB,KAAK,OAAO;GACjC,MAAM,gBAAgB;GACvB,CAAC;EAEF,MAAM,eAAe,IAAI,mBAAmB;GAC1C,UAAU,KAAK,OAAO,OAAO;GAC7B,iBAAiB;GACjB,cAAc;IAAC;IAAsB;IAA2B;IAAgB;GACjF,CAAC,CAAC,mBAAmB,KAAK,OAAO,oBAAoB;EACtD,MAAM,WAAW,uBAAuB,IAAI,qBAAqB,aAAa,EAAE;GAC9E,SAAS,CAAC,aAAa;GACvB,qBAAqB,KAAK,OAAO;GACjC,MAAM,gBAAgB;GACvB,CAAC;AAEF,SAAO;GAAE,cAAc,CAAC,aAAa,SAAS;GAAE,eAAe;GAAG;;;;;;;;;CAUpE,MAAM,kBACJ,OAIA,eAAmC,EAAE,EACP;AAC9B,OAAK,OAAO,OAAO,MACjB,EAAE,SAAS,KAAK,QAAQ,UAAU,EAAE,EACpC,wEACD;EAED,MAAM,qBAAqB,MAAM,QAAQ,IACvC,MAAM,KAAK,SAAS,KAAK,eAAe,KAAK,QAAQ,KAAK,aAAa,MAAM,aAAa,CAAC,CAC5F;AACD,SAAO,KAAK,+BAA+B,mBAAmB;;;;;;;;;;CAWhE,MAAM,6BACJ,OAIA,SACA,eAA8C,EAAE,EAClB;AAC9B,OAAK,OAAO,OAAO,MACjB,EAAE,SAAS,KAAK,QAAQ,UAAU,EAAE,EACpC,qFACD;EAED,MAAM,qBAAqB,MAAM,QAAQ,IACvC,MAAM,KAAK,SAAS,KAAK,0BAA0B,KAAK,QAAQ,KAAK,aAAa,SAAS,MAAM,aAAa,CAAC,CAChH;AAED,SAAO,KAAK,+BAA+B,mBAAmB;;CAGhE,MAAM,+BAA+B,oBAA2C;EAE9E,MAAM,eAAe,KAAK,qBAAqB;EAC/C,MAAM,cAAc,mBAAmB,SAAS,OAAO,GAAG,aAAa;EAEvE,MAAM,kBAAkB,mBACrB,SAAS,OAAO,GAAG,KAAK,CACxB,QAAQ,KAAK,OAAO,SAAS,UAAU,KAAK,WAAW,MAAM,EAAE,UAAU,OAAO,IAAI,UAAU,CAAC,CAAC;EAEnG,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,cAAc,GAAG,YAAY;EACjE,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EAEjF,MAAM,WAAW,uBAAuB,IAAI;GAC1C,SAAS;GACT,qBAAqB;GACrB,MAAM,gBAAgB;GACvB,CAAC;AACF,SAAO;;;;;;;;;;;;;CAcT,MAAM,SACJ,QACA,aACA,cAAc,OACd,eAAmC,EAAE,EACrC,aACA,QACiC;AACjC,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE;GAAQ,EAC5C,gEACD;EAED,MAAM,EAAE,iBAAiB,MAAM,KAAK,eAAe,QAAQ,aAAa,aAAa,aAAa;EAGlG,MAAM,OAAO,MAAM,KAAK,OAAO,oBAAoB,CAAC,GAAG,aAAa,EAAE,aAAa,OAAO;AAC1F,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE,KAAK,KAAK,KAAK,SAAS;GAAI,EAChE,wDACD;AAED,SAAO;;;;;;;;;;;CAYT,MAAM,oBACJ,QACA,aACA,SACA,cAAc,OACd,eAA8C,EAAE,EAChD;AACA,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACA,YAAY,QAAQ;GACrB,EACD,2EACD;EAED,MAAM,EAAE,iCAAiB,MAAM,KAAK,0BAClC,QACA,aACA,SACA,aACA,aACD;EAID,MAAM,WAAW,MAAM,QAAQ,gBAAgBA,eAAa;AAE5D,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE;GAAU,EAC9C,qEACD;AAED,SAAO;;;;;;;;;;;CAYT,MAAM,eACJ,QACA,aACA,cAAc,OACd,eAAmC,EAAE,EACF;EACnC,MAAM,eAAe,KAAK,qBAAqB;EAC/C,MAAM,EAAE,cAAc,eAAe,MAAM,aAAa,MAAM,KAAK,iBAAiB,EAAE,CAAC;EACvF,MAAM,cAAc,MAAM,KAAK,eAAe,QAAQ,aAAa,aAAa,aAAa;EAE7F,MAAM,EACJ,OAAO,EAAE,gBACP,MAAM,KAAK,SAAS,SAAS,WAAW,6BAA6B,YAAY;EAErF,MAAM,eAAwC,EAAE;AAEhD,MAAI,cAAc,SAAS,GAAG;AAC5B,gBAAa,KACX,uBACE,IAAI,qBACF,IAAI,mBAAmB;IACrB,cAAc,CAAC,GAAG,cAAc;IAChC,UAAU,KAAK;IACf,iBAAiB;IAClB,CAAC,CAAC,mBAAmB,SAAS,CAChC,EACD;IACE,qBAAqB;IACrB,MAAM,gBAAgB;IACvB,CACF,CACF;;EAGH,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EAEjF,MAAM,aAAa,uBACjB,IAAI,qBACF,IAAI,mBAAmB;GACrB,cAAc,CAAC,GAAG,cAAc,GAAG,YAAY,aAAa;GAC5D,UAAU,KAAK;GACf,iBAAiB;GAClB,CAAC,CAAC,mBAAmB,mBAAmB,CAC1C,EACD;GACE,SAAS,YAAY;GACrB,qBAAqB;GACrB,MAAM,gBAAgB;GACvB,CACF;EAED,MAAM,eAAe,CAAC,GAAG,cAAc,WAAW;AAElD,SAAO;GAAE;GAAc,eAAe,aAAa,SAAS;GAAG;;;;;;;;;;;;CAajE,MAAM,0BACJ,QACA,aACA,SACA,cAAc,OACd,eAA8C,EAAE,EAChD;EACA,MAAM,eAAe,KAAK,qBAAqB;EAC/C,MAAM,EAAE,cAAc,eAAe,MAAM,aAAa,MAAM,KAAK,iBAAiB,EAAE,CAAC;EACvF,MAAM,cAAc,MAAM,KAAK,0BAA0B,QAAQ,aAAa,SAAS,aAAa,aAAa;EAEjH,MAAM,EACJ,OAAO,EAAE,gBACP,MAAM,KAAK,SAAS,SAAS,WAAW,6BAA6B,YAAY;EAErF,MAAM,eAAwC,EAAE;AAEhD,MAAI,cAAc,SAAS,GAAG;AAC5B,gBAAa,KACX,uBACE,IAAI,qBACF,IAAI,mBAAmB;IACrB,cAAc,CAAC,GAAG,cAAc;IAChC,UAAU,KAAK;IACf,iBAAiB;IAClB,CAAC,CAAC,mBAAmB,SAAS,CAChC,EACD;IACE,qBAAqB;IACrB,MAAM,gBAAgB;IACvB,CACF,CACF;;EAGH,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EAEjF,MAAM,aAAa,uBACjB,IAAI,qBACF,IAAI,mBAAmB;GACrB,cAAc,CAAC,GAAG,cAAc,GAAG,YAAY,aAAa;GAC5D,UAAU,KAAK;GACf,iBAAiB;GAClB,CAAC,CAAC,mBAAmB,mBAAmB,CAC1C,EACD;GACE,SAAS,YAAY;GACrB,qBAAqB;GACrB,MAAM,gBAAgB;GACvB,CACF;EAED,MAAM,eAAe,CAAC,GAAG,cAAc,WAAW;AAElD,SAAO;GACL;GACA,cAAc;IAAC,GAAG;IAAe,GAAG;IAAc,GAAG,YAAY;IAAa;GAC9E,eAAe,aAAa,SAAS;GACtC;;;;;;;;;;CAWH,MAAM,aACJ,QACA,aACA,aAA+B,EAAE,EACH;EAC9B,MAAM,sBAAsB,KAAK,OAAO,UAAU,IAAI,YAAY,UAAU,CAAC,EAAE;AAC/E,MAAI,CAAC,oBAAqB,OAAM,MAAM,wBAAwB;AAE9D,MAAI,CAAC,KAAK,OAAO,gBAAiB,OAAM,MAAM,8BAA8B;AAE5E,SAAO,KAAK,cAAc,aACxB,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,KAAK,OAAO,iBACZ,QACA,aACA,WACD;;;;;;;;;;;CAYH,MAAM,wBACJ,QACA,aACA,SACA,aAA0C,EAAE,EACd;EAC9B,MAAM,sBAAsB,KAAK,OAAO,UAAU,IAAI,YAAY,UAAU,CAAC,EAAE;AAC/E,MAAI,CAAC,oBAAqB,OAAM,MAAM,wBAAwB;AAE9D,MAAI,CAAC,KAAK,OAAO,gBAAiB,OAAM,MAAM,8BAA8B;AAE5E,SAAO,KAAK,cAAc,wBACxB,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,KAAK,OAAO,iBACZ,QACA,aACA,SACA,WACD;;;;;;;;;;;;CAaH,MAAM,OACJ,QACA,aACA,aAA+B,EAAE,EACjC,aACA,QACiC;AACjC,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE;GAAQ,EAC5C,4DACD;EAED,MAAM,EAAE,iBAAiB,MAAM,KAAK,aAAa,QAAQ,aAAa,WAAW;EAEjF,MAAM,OAAO,MAAM,KAAK,OAAO,oBAAoB,CAAC,GAAG,aAAa,EAAE,aAAa,OAAO;AAC1F,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE;GAAM,EAC1C,oDACD;AACD,SAAO;;;;;;;;;;;CAYT,MAAM,kBACJ,QACA,aACA,SACA,aAA0C,EAAE,EAChB;AAC5B,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC;GACA,YAAY,QAAQ;GACrB,EACD,uEACD;EAED,MAAM,EAAE,iCAAiB,MAAM,KAAK,wBAAwB,QAAQ,aAAa,SAAS,WAAW;EAErG,MAAM,WAAW,MAAM,QAAQ,gBAAgBA,gBAAc,EAAE,WAAW,wBAAwB,CAAC;AAEnG,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE;GAAU,EAC9C,+DACD;AACD,SAAO;;;;;;;;;;CAWT,MAAM,aACJ,QACA,aACA,aAA+B,EAAE,EACE;EACnC,MAAM,eAAe,KAAK,qBAAqB;EAG/C,MAAM,EAAE,cAAc,eAAe,MAAM,aAAa,MAAM,KAAK,iBAAiB,CAAC,YAAY,CAAC;EAClG,MAAM,YAAY,MAAM,KAAK,aAAa,QAAQ,aAAa,WAAW;EAE1E,MAAM,EACJ,OAAO,EAAE,gBACP,MAAM,KAAK,SAAS,SAAS,WAAW,6BAA6B,YAAY;EAErF,MAAM,eAAwC,EAAE;AAEhD,MAAI,cAAc,SAAS,GAAG;AAC5B,gBAAa,KACX,uBACE,IAAI,qBACF,IAAI,mBAAmB;IACrB,cAAc;IACd,UAAU,KAAK;IACf,iBAAiB;IAClB,CAAC,CAAC,mBAAmB,SAAS,CAChC,EACD;IACE,MAAM,gBAAgB;IACtB,qBAAqB;IACtB,CACF,CACF;;EAGH,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EAEjF,MAAM,WAAW,uBACf,IAAI,qBACF,IAAI,mBAAmB;GACrB,cAAc,CAAC,GAAG,cAAc,GAAG,UAAU,aAAa;GAC1D,UAAU,KAAK;GACf,iBAAiB;GAClB,CAAC,CAAC,mBAAmB,mBAAmB,CAC1C,EACD;GACE,SAAS,UAAU;GACnB,MAAM,gBAAgB;GACtB,qBAAqB;GACtB,CACF;EAED,MAAM,eAAe,CAAC,GAAG,cAAc,SAAS;AAChD,SAAO;GAAE;GAAc,eAAe,aAAa,SAAS;GAAG;;;;;;;;;;;CAYjE,MAAM,wBACJ,QACA,aACA,SACA,aAA0C,EAAE,EAC5C;EACA,MAAM,eAAe,KAAK,qBAAqB;EAG/C,MAAM,EAAE,cAAc,eAAe,MAAM,aAAa,MAAM,KAAK,iBAAiB,CAAC,YAAY,CAAC;EAClG,MAAM,YAAY,MAAM,KAAK,wBAAwB,QAAQ,aAAa,SAAS,WAAW;EAE9F,MAAM,EACJ,OAAO,EAAE,gBACP,MAAM,KAAK,SAAS,SAAS,WAAW,6BAA6B,YAAY;EAErF,MAAM,eAAwC,EAAE;AAEhD,MAAI,cAAc,SAAS,GAAG;AAC5B,gBAAa,KACX,uBACE,IAAI,qBACF,IAAI,mBAAmB;IACrB,cAAc;IACd,UAAU,KAAK;IACf,iBAAiB;IAClB,CAAC,CAAC,mBAAmB,SAAS,CAChC,EACD;IACE,MAAM,gBAAgB;IACtB,qBAAqB;IACtB,CACF,CACF;;EAGH,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EAEjF,MAAM,WAAW,uBACf,IAAI,qBACF,IAAI,mBAAmB;GACrB,cAAc,CAAC,GAAG,cAAc,GAAG,UAAU,aAAa;GAC1D,UAAU,KAAK;GACf,iBAAiB;GAClB,CAAC,CAAC,mBAAmB,mBAAmB,CAC1C,EACD;GACE,SAAS,UAAU;GACnB,MAAM,gBAAgB;GACtB,qBAAqB;GACtB,CACF;EAED,MAAM,eAAe,CAAC,GAAG,cAAc,SAAS;AAChD,SAAO;GACL;GACA,cAAc;IAAC,GAAG;IAAe,GAAG;IAAc,GAAG,UAAU;IAAa;GAC5E,eAAe,aAAa,SAAS;GACtC;;;;;;;;CASH,MAAM,wBAAwB,aAAsD;AAClF,SAAO,KAAK,cAAc,wBACxB,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,YACD;;;;;;;;CASH,MAAM,wBAAwB,eAA4D;EACxF,MAAM,EACJ,OAAO,EAAE,gBACP,MAAM,KAAK,SAAS,SAAS,WAAW,6BAA6B,YAAY;EAErF,MAAM,uBAA8C,EAAE;AACtD,QAAM,QAAQ,IACZ,cAAc,IAAI,OAAO,gBAAgB;GACvC,MAAM,KAAK,MAAM,KAAK,wBAAwB,YAAY;AAC1D,OAAI,CAAC,GAAI;AACT,wBAAqB,KAAK,GAAG;IAC7B,CACH;EAED,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EAEjF,MAAM,cAAc,uBAClB,IAAI,qBACF,IAAI,mBAAmB;GACrB,cAAc,qBAAqB,SAAS,OAAO,GAAG,aAAa;GACnE,UAAU,KAAK;GACf,iBAAiB;GAClB,CAAC,CAAC,mBAAmB,mBAAmB,CAC1C,EACD;GACE,SAAS,qBAAqB,SAAS,OAAO,GAAG,KAAK;GACtD,MAAM,gBAAgB;GACtB,qBAAqB;GACtB,CACF;AAED,SAAO;;;;;;;;;;CAWT,MAAM,kBACJ,eACA,aACA,QAC+B;AAC/B,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC,OAAO,cAAc,KAAK,MAAM,EAAE,UAAU,CAAC;GAC9C,EACD,mFACD;EAED,MAAM,sBAAsB,MAAM,KAAK,wBAAwB,cAAc;EAC7E,MAAM,MAAM,MAAM,KAAK,OAAO,mBAAmB,qBAAqB,aAAa,OAAO;AAC1F,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE;GAAK,EACzC,mFACD;AAED,SAAO;;;;;;;;;;;CAYT,MAAa,8BACX,wBACA,kBACA,iBACA,iBAC8B;EAC9B,MAAM,0BAA0B,KAAK,OAAO,UAAU,IAAI,gBAAgB,UAAU,CAAC,EAAE;AACvF,MAAI,CAAC,wBAAyB,OAAM,MAAM,2BAA2B;AAErE,MAAI,CAAC,KAAK,OAAO,gBAAiB,OAAM,MAAM,8BAA8B;AAE5E,SAAO,KAAK,cAAc,8BACxB,wBACA,KAAK,UACL,KAAK,OAAO,OACZ,KAAK,OAAO,WACZ,KAAK,OAAO,iBACZ,kBACA,iBACA,gBACD;;;;;;;;;;;;;CAcH,MAAa,wBACX,wBACA,kBACA,iBACA,iBACA,aACA,QAC+B;AAC/B,OAAK,OAAO,OAAO,MACjB;GACE,SAAS,KAAK,QAAQ,UAAU;GAChC,wBAAwB,uBAAuB,QAAQ,UAAU;GAClE,EACD,8DACD;EAED,MAAM,iBAAiB,MAAM,KAAK,8BAChC,wBACA,kBACA,iBACA,gBACD;EACD,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,eAAe,aAAa;EAChE,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EACjF,MAAM,WAAW,uBAAuB,IAAI;GAC1C,SAAS,eAAe;GACxB,qBAAqB;GACrB,MAAM,gBAAgB;GACvB,CAAC;EACF,MAAM,MAAM,MAAM,KAAK,OAAO,mBAAmB,UAAU,aAAa,OAAO;AAC/E,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE;GAAK,EACzC,2DACD;AAED,SAAO;;;;;;;;CAST,MAAa,qBAAqB,UAAgD;AAChF,SAAO,KAAK,cAAc,qBAAqB,KAAK,UAAU,SAAS;;;;;;;;;CAUzE,MAAa,gCACX,UACA,SAC8B;AAC9B,SAAO,KAAK,cAAc,gCAAgC,KAAK,UAAU,UAAU,QAAQ,iBAAiB;;;;;;;;CAS9G,MAAa,mBAAmB,yBAAoE;AAClG,SAAO,KAAK,cAAc,mBAAmB,KAAK,UAAU,KAAK,OAAO,OAAO,wBAAwB;;;;;;;;;CAUzG,MAAa,8BACX,yBACA,SAC8B;AAC9B,SAAO,KAAK,cAAc,8BACxB,KAAK,UACL,KAAK,OAAO,OACZ,yBACA,QAAQ,iBACT;;CAGH,MAAa,UACX,MACA,aACA,QAC+B;AAC/B,OAAK,OAAO,OAAO,MACjB,EAAE,SAAS,KAAK,QAAQ,UAAU,EAAE,EACpC,yEACD;EAED,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EACjF,MAAM,KAAK,MAAM,KAAK,iBAAiB,MAAM,mBAAmB;EAChE,MAAM,MAAM,MAAM,KAAK,OAAO,mBAAmB,IAAI,aAAa,OAAO;AACzE,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE;GAAK,EACzC,uDACD;AAED,SAAO;;CAGT,MAAa,qBAAqB,MAAqB,SAA8D;AACnH,OAAK,OAAO,OAAO,MACjB,EAAE,SAAS,KAAK,QAAQ,UAAU,EAAE,EACpC,kGACD;EAED,MAAM,qBAAqB,MAAM,oCAAoC,KAAK,OAAO;EACjF,MAAM,KAAK,MAAM,KAAK,4BAA4B,MAAM,SAAS,mBAAmB;EAEpF,MAAM,WAAW,MAAM,QAAQ,gBAAgB,GAAG;AAClD,OAAK,OAAO,OAAO,MACjB;GAAE,SAAS,KAAK,QAAQ,UAAU;GAAE,KAAK,SAAS;GAAW,EAC7D,gFACD;AAED,SAAO;;CAGT,MAAa,iBACX,MACA,cACgC;EAChC,MAAM,WAAW,KAAK,IAAI,SAAS;EAEnC,MAAM,0BAAuC,KAAK,cAAc,2BAA2B,KAAK,UAAU,KAAK,IAAI;EAEnH,MAAM,mBAAmB,MAAM,KAAK,qBAAqB,SAAS;EAClE,MAAM,iBAAiB,MAAM,KAAK,mBAAmB,wBAAwB;EAE7E,MAAM,eAAe;GAAC,GAAG,iBAAiB;GAAc,GAAG,KAAK;GAAK,GAAG,eAAe;GAAa;EACpG,MAAM,oBAAoB,CAAC,GAAI,gBAAgB,EAAE,EAAG,GAAI,KAAK,8BAA8B,EAAE,CAAE;EAE/F,MAAM,YACJ,KAAK,cAAc,MAAM,KAAK,SAAS,SAAS,WAAW,mBAAmB,YAAY,EAAE;EAC9F,MAAM,UAAU,IAAI,mBAAmB;GACrC,UAAU,KAAK,OAAO,OAAO;GAC7B,iBAAiB;GACjB,cAAc;GACf,CAAC,CAAC,mBAAmB,kBAAkB;EAExC,MAAM,KAAK,uBAAuB,IAAI,qBAAqB,QAAQ,EAAE;GACnE,qBAAqB;GACrB,MAAM,gBAAgB;GACvB,CAAC;AAEF,MAAI,KAAK,SAAS;AAChB,MAAG,KAAK,KAAK,QAAQ;;AAGvB,SAAO;;CAGT,MAAa,4BACX,MACA,SACA,cACgC;EAChC,MAAM,WAAW,KAAK,IAAI,SAAS;EAEnC,MAAM,0BAAuC,KAAK,cAAc,2BAA2B,KAAK,UAAU,KAAK,IAAI;EAEnH,MAAM,mBAAmB,MAAM,KAAK,gCAAgC,UAAU,QAAQ;EACtF,MAAM,iBAAiB,MAAM,KAAK,8BAA8B,yBAAyB,QAAQ;EAEjG,MAAM,eAAe;GAAC,GAAG,iBAAiB;GAAc,GAAG,KAAK;GAAK,GAAG,eAAe;GAAa;EAEpG,MAAM,oBAAoB,gBAAgB,EAAE;EAE5C,MAAM,YACJ,KAAK,cAAc,MAAM,KAAK,SAAS,SAAS,WAAW,mBAAmB,YAAY,EAAE;EAC9F,MAAM,UAAU,IAAI,mBAAmB;GACrC,UAAU,QAAQ;GAClB,iBAAiB;GACjB,cAAc;GACf,CAAC,CAAC,mBAAmB,kBAAkB;EAExC,MAAM,KAAK,uBAAuB,IAAI,qBAAqB,QAAQ,EAAE;GACnE,qBAAqB;GACrB,MAAM,gBAAgB;GACvB,CAAC;AAEF,MAAI,KAAK,SAAS;AAChB,MAAG,KAAK,KAAK,QAAQ;;AAGvB,SAAO;;CAGT,MAAa,+BAA+B,qBAA8D;AACxG,SAAO,KAAK,cAAc,+BAA+B,KAAK,UAAU,oBAAoB;;CAG9F,MAAM,yBACJ,qBACA,aACA,QACiB;AACjB,OAAK,OAAO,OAAO,MACjB;GAAE,MAAM,KAAK,QAAQ,UAAU;GAAE,IAAI,oBAAoB,UAAU;GAAE,EACrE,gEACD;EAED,MAAM,MAAM,MAAM,KAAK,+BAA+B,oBAAoB;EAC1E,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,aAAa;EACrD,MAAM,WAAW,uBAAuB,IAAI,EAC1C,MAAM,gBAAgB,eACvB,CAAC;EACF,MAAM,MAAM,MAAM,KAAK,OAAO,mBAAmB,UAAU,aAAa,OAAO;AAC/E,OAAK,OAAO,OAAO,MAAM,EAAE,KAAK,EAAE,+DAA+D;AAEjG,SAAO;;CAGT,MAAM,iBACJ,YACA,kBAAkB,GAIjB;AACD,UAAQ,IAAI,YAAY,gBAAgB;AAExC,SAAO;GAAE,cAAc,EAAE;GAAE,MAAM,EAAE;GAAE;;CAGvC,MAAM,kBAAkB,iBAA8B,EAAE,EAAE,gBAA6B,EAAE,EAAE;AACzF,SAAO,KAAK,cAAc,kBACxB,KAAK,UACL,KAAK,OAAO,OACZ,gBACA,eACA,KAAK,OAAO,mBAAmB,EAAE,CAClC;;CAQH,aAAqB,iBACnB,gBACA,QACA,SACA,YAC0B;EAC1B,MAAM,mBAAmB,cAAc,QAAQ,SAAS,WAAW,cAAc;EAEjF,MAAM,OAAyB,MAAM,QAAQ,QAAQ,aAAa,MAAM,gBAAgB,iBAAiB;AAEzG,MAAI,CAAC,KAAK,MAAM,OAAO,OAAO,QAAQ,CACpC,OAAM,MAAM,+BAA+B,KAAK,MAAM,UAAU,CAAC,cAAc,OAAO,QAAQ,UAAU,GAAG;AAE7G,SAAO;;CAGT,aAAa,OAAO,SAA0B,KAAoC;EAChF,MAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,SAAO,MAAM,MAAM,SAAS,OAAO,YAAY,cAAc,QAAQ;;CAGvE,MAAM,SAAS;AACb,OAAK,OAAO,OAAO,MACjB,EAAE,SAAS,KAAK,QAAQ,UAAU,EAAE,EACpC,sDACD;EAED,MAAM,iBAAiB,MAAM,KAAK,SAAS,QAAQ,aAAa,eAAe,KAAK,QAAQ;AAC5F,MAAI,CAAC,eAAgB,OAAM,IAAI,MAAM,0CAA0C,KAAK,QAAQ,UAAU,GAAG;EACzG,MAAM,qBAAqB,aAAa,OAAO,eAAe,MAAM,KAAK,SAAS,IAAI;AACtF,MAAI,CAAC,mBAAmB,MAAM,OAAO,KAAK,QAAQ,QAAQ,CACxD,OAAM,MACJ,+BAA+B,mBAAmB,MAAM,UAAU,CAAC,cAAc,KAAK,QAAQ,QAAQ,UAAU,GACjH;AAEH,OAAK,yBAAyB,mBAAmB;;CAGnD,AAAQ,yBAAyB,MAAuB;AACtD,OAAK,gBAAgB,aAAa,kBAAkB,KAAK,SAAS,KAAK;;CAGzE,AAAO,WAAmB;AACxB,SAAO,KAAK,cAAc,SAAS,KAAK,OAAO,OAAO,KAAK,OAAO,aAAa;;;;;CAUjF,MAAM,gBAAgB,QAAgB,aAAmD;EACvF,MAAM,MAAM,MAAM,KAAK,cAAc,QAAQ,YAAY;EACzD,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,aAAa;AACrD,MAAI;AACF,UAAO,KAAK,8BAA8B,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;WACvD,IAAI;AACX,SAAM,IAAI,MAAM,6BAA6B;;;;;;CAOjD,MAAM,iBAAiB,aAAwB,KAAwD;AACrG,MAAI;AACF,UAAO,KAAK,8BAA8B,KAAK,CAAC,YAAY,CAAC;WACtD,IAAI;AACX,SAAM,IAAI,MAAM,8BAA8B;;;;;;CAOlD,MAAM,eAAe,aAAwB,KAAwD;AACnG,MAAI;AACF,UAAO,KAAK,8BAA8B,KAAK,CAAC,YAAY,CAAC;WACtD,IAAI;AACX,SAAM,IAAI,MAAM,4BAA4B;;;;;;CAOhD,MAAM,cAAc,QAAgB,aAAwB,WAAW,OAAkC;EACvG,MAAM,MAAM,MAAM,KAAK,YAAY,QAAQ,aAAa,SAAS;EACjE,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,aAAa;AACrD,MAAI;AACF,UAAO,KAAK,8BAA8B,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;WACvD,IAAI;AACX,SAAM,IAAI,MAAM,2BAA2B;;;CAI/C,MAAM,qCAAqC,MAAiB;EAC1D,MAAM,oBAAoB,MAAM,KAAK,cAAc,sBAAsB,KAAK,UAAU,KAAK;EAE7F,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,kBAAkB,aAAa;EAEnE,MAAM,aAAa,MAAM,KAAK,OAAO,qBAAqB,CAAC,GAAG,EAAE,CAAC,KAAK,cAAc,QAAQ,CAAC;EAE7F,MAAM,YAAY,WAAW;AAC7B,MAAI,CAAC,WAAW;AACd,UAAO,IAAI,UAAU,EAAE;;EAGzB,MAAM,wBAAwB,aAAa,mBAAmB,KAAK,SAAS,WAAW,KAAK,OAAO,QAAQ,IAAI;EAE/G,MAAM,uBAAuB,sBAAsB,WAAW,KAAK,CAAC;AAEpE,SAAO;;;;;;AA0BX,SAAgB,iBACd,UACA,QAAQ,GACR,gBAA0C,UAC1C,mBACA;CACA,IAAI;CACJ,IAAI,gBAAwC,mBAAmB,CAAC;AAEhE,KAAI,kBAAkB,UAAU;AAC9B,gBAAc,gBAAgB,UAAU,KAAK,MAAM,QAAQ,iBAAiB,CAAC;QACxE;AACL,kBAAgB,kBAAkB,OAAO,kBAAkB,CAAC;;AAG9D,QAAO;EACL;EACA;EACD;;AAGH,SAAgB,gBAAgB,UAAqB,YAAY,KAAiC;CAEhG,MAAM,kBAAkB,YAAY;EAClC,MAAM,WAAW,MAAM,MAAM,wDAAwD;GACnF,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU;IACnB,SAAS;IACT,IAAI;IACJ,QAAQ;IACR,QAAQ,EAAE;IACX,CAAC;GACH,CAAC;EAEF,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAO,KAAK;;CAGd,MAAM,cAAc;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM,mBAAmB,YAAY,KAAK,MAAM,KAAK,QAAQ,GAAG,YAAY,OAAO;AAEnF,QAAO,cAAc,SAAS;EAC5B,YAAY;EACZ,UAAU,IAAI,UAAU,iBAAiB;EACzC,UAAU;EACX,CAAC;;AAGJ,eAAe,oCAAoC,QAAqB;CACtE,MAAM,YAAY,OAAO;CACzB,MAAM,OAAoC,OAAO;AAEjD,MAAK,MAAME,aAAW,WAAW;EAC/B,MAAM,MAAM,MAAM,OAAO,SAAS,WAAW,sBAAsBA,UAAQ;AAC3E,MAAI,IAAI,OAAO;AACb,QAAK,KAAK,IAAI,MAAM;;;AAIxB,QAAO;;;;;ACvyFT,IAAM,aAAN,MAAM,WAAqC;CACzC,AAAO;CACP,AAAO;CAEP,YAAY,OAAkB,WAAoB;AAChD,OAAK,QAAQ;AACb,OAAK,UAAUC;;CAOjB,OAAO,kBAAkB,WAAoB,aAAwC;EACnF,MAAM,aAAa,EACjB,OAAO,YAAY,OACpB;AACD,SAAO,IAAI,WAAW,WAAW,OAAOA,UAAQ;;CAGlD,OAAO,WAAW,WAAoB,SAAiB,KAAmB;EACxE,MAAM,OAAO,WAAW,OAAO,SAAS,IAAI;AAC5C,SAAO,WAAW,kBAAkBA,WAAS,KAAK;;CAGpD,OAAO,OAAO,SAAiB,KAAkC;EAC/D,MAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,SAAO,MAAM,SAAS,OAAO,YAAY,YAAY,QAAQ;;CAG/D,aAAa,OAAO,SAAwB,KAAoC;EAC9E,MAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,SAAO,MAAM,MAAM,SAAS,OAAO,YAAY,YAAY,QAAQ;;CAUrE,MAAa,wBACX,SACA,MACA,MAC8B;AAC9B,SAAO,wBAAwB,SAAS,MAAM,KAAK;;CAGrD,MAAa,kCACX,SACA,oBACA,UACA,YAC8B;AAC9B,SAAO,kCAAkC,SAAS,KAAK,SAAS,oBAAoB,UAAU,WAAW;;CAG3G,MAAa,kBACX,SACA,YACA,UACA,YACA,UAC8B;AAC9B,SAAO,kBAAkB,SAAS,KAAK,SAAS,YAAY,YAAY,KAAK,OAAO,UAAU,WAAW;;;;;;gBC5B1D;;;;AAqGnD,IAAM,cAAN,MAAM,YAAY;CAChB,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAgB;CAEhB,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAiB;CAEjB;CACA,AAAS;CACT,AAAS;CAET,AAAS;CACT,AAAS;CACT,AAAS;CAMT,YAAY,EACV,SACA,QACA,QACA,YACA,OACA,OACA,YACA,WACA,qBACA,WACA,QACA,iBACA,uBACA,uBACA,sBACA,4BACA,uBACA,SACA,iBACA,eACmB;AACnB,OAAK,UAAU;AACf,OAAK,SAAS;AACd,OAAK,SAAS,UAAU,WAAW;AACnC,OAAK,aAAa;AAClB,OAAK,SAAS,UAAU,IAAI,YAAY;AAExC,OAAK,QAAQ;AACb,OAAK,QAAQ;AACb,OAAK,eAAe;AACpB,OAAK,YAAY;AACjB,OAAK,sBAAsB,uBAAuB,EAAE;AACpD,OAAK,YAAY;AACjB,OAAK,uBAAuB,wBAAwB,QAAQ,SAAS,WAAW;AAChF,OAAK,6BAA6B;AAClC,OAAK,wBAAwB,yBAAyB,EAAE;AAExD,OAAK,kBAAkB;AACvB,OAAK,wBAAwB;AAC7B,OAAK,wBAAwB;AAE7B,OAAK,UAAU,WAAW,eAAe;AACzC,OAAK,kBAAkB;AACvB,OAAK,cAAc,eAAe,IAAI,aAAa;;;;;;;;;;;;;CAcrD,aAAa,MAAM,EAAE,QAAQ,YAAY,gBAAgB,EAAE,EAAE,SAAS,WAAW,IAA6B;EAC5G,MAAM,EACJ,SAAS,IAAI,YAAY,EACzB,cAAc,EAAE,EAChB,WAAW,OACX,UAAU,eAAe,EACzB,cAAc,IAAI,aAAa,EAC/B,uBACA,uBACA,mBAAmB;GACjB,IAAI,oBAAoB,OAAO,YAAY,YAAY,YAAY,UAAU;GAC7E,IAAI,wBAAwB,WAAW,YAAY;GACnD,IAAI,sBAAsB;GAC3B,EACD,gCACE;AAEJ,SAAO,MACL;GACE,WAAW,OAAO,UAAU,UAAU;GACtC,KAAK,OAAO;GACZ,OAAO,OAAO,QAAQ,UAAU;GAChC,KAAK,YAAY;GAClB,EACD,sCACD;EAED,MAAM,aAAa,gBAAgB;EAEnC,MAAM,WAAW,IAAI,eAAe,YAAY,QAAQ;GACtD,GAAG,eAAe,gBAAgB;GAClC,YAAY,WAAW,cAAc,eAAe,gBAAgB,CAAC;GACrE,GAAG;GACJ,CAAC;EAEF,MAAM,MAAM;GAAE,GAAG;GAAY,SAAS,OAAO,UAAU,UAAU;GAAE;EAEnE,MAAM,UAAU,IAAI,QAAQ,KAAK,SAAS;EAC1C,MAAM,kBAAkB,IAAI,gBAAgB;GAC1C;GACA,WAAW;GACX,UAAU;GACV;GACD,CAAC;EAMF,MAAM,EAAE,YAAY,OAAO,YAAY,YAAY,WAAW,0BAC5D,MAAM,YAAY,eAAe;GAC/B;GACA;GACA,cAAc,OAAO;GACrB;GACA,YAAY,WAAW;GACvB;GACA;GACA;GACA;GACD,CAAC;EAEJ,MAAM,sBAAsB,MAAM,YAAY,yBAC5C,YACA,6BACA,OACD;AAED,SAAO,IAAI,YAAY;GACrB;GACA;GACA;GACA,YAAY;GACZ,OAAO;GACP;GACA;GACA,WAAW;GACX;GACA;GACA,sBAAsB,eAAe;GACrC,4BAA4B,eAAe;GAC3C;GACA;GACA;GAEA,iBAAiB,MAAM,KAAK,sBAAsB,QAAQ,CAAC,CAAC,QAAQ,MAAM,SAAS;AACjF,QAAI,CAAC,KAAK,SAAS;AACjB,YAAO;;AAGT,SAAK,KAAK,WAAW;KACnB,cAAc,KAAK;KACnB,WAAW,KAAK;KAChB,aAAa,KAAK;KACnB;AACD,WAAO;MACN,EAAE,CAAoB;GACzB;GACA;GACA;GACD,CAAC;;;;;;;;;CAWJ,aAAqB,yBACnB,YACA,6BACA,SAAkB,IAAI,YAAY,EACI;AACtC,MAAI,CAAC,+BAA+B,4BAA4B,WAAW,GAAG;AAC5E,UAAO,MAAM,EAAE,EAAE,4DAA4D;AAC7E,UAAO,EAAE;;AAGX,SAAO,MAAM,EAAE,KAAK,6BAA6B,EAAE,gDAAgD;EACnG,MAAM,uBACJ,MAAM,QAAQ,IAAI,4BAA4B,KAAK,cAAY,WAAW,sBAAsBC,UAAQ,CAAC,CAAC,EAEzG,KAAK,aAAa,UAAU,MAAM,CAClC,QAAQ,UAA8C,UAAU,KAAK;AACxE,SAAO;;;;;;;;;;;;;;;CAgBT,OAAO,iBAAmC,OAAO,EAC/C,YAAY,aACZ,SACA,cACA,YACA,uBACA,uBACA,SAAS,IAAI,YAAY,EACzB,iBACA,kBACI;EAEJ,MAAM,eAAwD,MAAM,YAAY,cAAc;GAC5F;GACA;GACA;GACA,eAAe;GACf;GACD,CAAC;EAEF,MAAM,WAA6B,EAAE;EACrC,MAAM,mBAAqC,EAAE;EAC7C,MAAM,aAA+B,EAAE;EAEvC,MAAM,cAA+B,EAAE;AACvC,OAAK,MAAM,QAAQ,cAAc;AAC/B,YAAS,KAAK,KAAK,KAAK,KAAK;AAE7B,OAAI,CAAC,KAAK,KAAK,cAAc,OAAO,UAAU,QAAQ,EAAE;AACtD,qBAAiB,KAAK,KAAK,KAAK,cAAc;;AAGhD,eAAY,KAAK,KAAK,KAAK,OAAO;;EAIpC,MAAM,YAAY,MAAM,eAAe,aAAa,QAAQ,SAAS,WAAW;AAGhF,OAAK,MAAM,QAAQ,cAAc;GAC/B,MAAM,aAAa,WAAW,kBAAkB,KAAK,KAAK,OAAO;GAEjE,MAAM,cAAc,WAAW;GAE/B,IAAI;AAEJ,OAAI,gBAAgB,YAAY,kBAAkB,gBAAgB,YAAY,gBAAgB;IAE5F,MAAM,SAAS,WAAW,WAAW;IACrC,MAAM,SAAS,OAAO,UAAU,CAAC,SAAS,MAAM;IAChD,MAAM,WAAW,UAAU,IAAI,OAAO;AAEtC,QAAI,UAAU,OAAO,OAAO,OAAO,EAAE;AAEnC,iBAAY;eACH,UAAU;AAEnB,iBAAY,0BACV,WAAW,WAAW,GAAG,UAAU,EACnC,qBACA,SAAS,WAAW,wBACrB;WACI;AAEL,iBAAY,0BACV,WAAW,WAAW,GAAG,UAAU,EACnC,qBACA,wBACD;;UAEE;AAEL,gBAAY,WAAW,WAAW;;AAGpC,cAAW,KAAK,UAAU;;EAI5B,MAAM,mBAAmB,MAAM,KAAK,IAAI,IAAI,WAAW,KAAK,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,UAAU,EAAE,CAAC;EAC9G,MAAM,iBAAiB,MAAM,KAAK,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,UAAU,EAAE,CAAC;EAC1G,MAAM,yBAAyB,MAAM,KAAK,IAAI,IAAI,iBAAiB,KAAK,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAC3F,MAAM,IAAI,UAAU,EAAE,CACxB;EAID,MAAM,kBAAkB,MAAM,iDAAiD,QAAQ,SAAS,YAAY;GAC1G,aAAa,UAAU;GACvB,GAAG,iBAAiB,KAAK,OAAO,GAAG,UAAU,CAAC;GAC9C,GAAG,eAAe,KAAK,OAAO,GAAG,UAAU,CAAC;GAC5C,GAAG,uBAAuB,KAAK,OAAO,GAAG,UAAU,CAAC;GACrD,CAAC;EAEF,MAAM,mBAAmB,gBAAgB,OAAO;AAChD,MAAI,CAAC,kBAAkB;AACrB,SAAM,IAAI,MAAM,0CAA0C;;EAG5D,MAAM,2BAA2B,gBAAgB,OAAO,GAAG,iBAAiB,OAAO;EACnF,MAAM,yBAAyB,gBAAgB,OAAO,GAAG,eAAe,OAAO;EAC/E,MAAM,iCAAiC,gBAAgB,OAAO,EAAE;EAGhE,MAAM,kBAAkB,IAAI,IAC1B,iBAAiB,KAAK,KAAK,QAAQ,CAAC,IAAI,UAAU,EAAE,yBAAyB,KAAK,CAAC,CACpF;EACD,MAAM,gBAAgB,IAAI,IAAI,eAAe,KAAK,KAAK,QAAQ,CAAC,IAAI,UAAU,EAAE,uBAAuB,KAAK,CAAC,CAAC;EAC9G,MAAM,wBAAwB,IAAI,IAChC,uBAAuB,KAAK,KAAK,QAAQ,CAAC,IAAI,UAAU,EAAE,+BAA+B,KAAK,CAAC,CAChG;EAED,MAAM,qBAAqB,WAAW,KAAK,QAAQ;GACjD,MAAM,OAAO,gBAAgB,IAAI,IAAI,UAAU,CAAC;AAChD,OAAI,CAAC,KAAM,OAAM,IAAI,MAAM,qCAAqC,IAAI,UAAU,GAAG;AACjF,UAAO;IACP;EACF,MAAM,mBAAmB,SAAS,KAAK,QAAQ;GAC7C,MAAM,OAAO,cAAc,IAAI,IAAI,UAAU,CAAC;AAC9C,OAAI,CAAC,KAAM,OAAM,IAAI,MAAM,mCAAmC,IAAI,UAAU,GAAG;AAC/E,UAAO;IACP;EACF,MAAM,2BAA2B,iBAAiB,KAAK,QAAQ;GAC7D,MAAM,OAAO,sBAAsB,IAAI,IAAI,UAAU,CAAC;AACtD,OAAI,CAAC,KAAM,OAAM,IAAI,MAAM,4CAA4C,IAAI,UAAU,GAAG;AACxF,UAAO;IACP;EAGF,MAAM,aAAa,WAAW,WAAW,cAAc,iBAAiB,MAAM,QAAQ,IAAI;EAC1F,MAAM,wBAAwB,MAAM,2BAA2B;GAC7D,gBAAgB,SACb,KAAK,MAAM,QAAQ;IAClB,MAAM,cAAc,iBAAiB;AACrC,QAAI,CAAC,aAAa;AAChB,YAAO,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE,EAAE,yBAAyB;AAChE,YAAO;;AAET,WAAO;KACL;KACA,OAAO,YAAY;KACpB;KACD,CACD,QAAQ,SAAwD,SAAS,KAAK;GACjF;GACA;GACA;GACD,CAAC;EAEF,MAAM,QAAQ,IAAI,KAAmB;EACrC,MAAM,aAAa,IAAI,KAA0B;EACjD,MAAM,6BAA0C,EAAE;EAClD,MAAM,aAAa,IAAI,KAAuB;EAE9C,MAAM,kBAQF,EAAE;EACN,MAAM,WAAqB,EAAE;EAC7B,MAAM,QAAkB,EAAE;AAE1B,eAAa,SAAS,EAAE,oBAAS,QAAQ,UAAU;GACjD,MAAM,iBAAiBA,UAAQ,UAAU;GACzC,MAAMC,aAAW,sBAAsB,IAAI,KAAK,KAAK,UAAU,CAAC;GAChE,MAAM,cAAc,iBAAiB,KAAK,OAAO,YAAY;AAE7D,OAAI,CAAC,uBAAuB,YAAY,EAAE;AACxC,WAAO,KAAK;KAAE;KAAa,MAAM;KAAgB,EAAE,2BAA2B;AAC9E;;GAGF,MAAM,cAAc,iBAAiB;AACrC,OAAI,CAAC,aAAa;AAChB,WAAO,KAAK;KAAE,MAAM;KAAgB,MAAM,KAAK,KAAK,UAAU;KAAE,EAAE,wCAAwC;AAC1G;;GAGF,MAAM,eAAe,mBAAmB;AACxC,OAAI,CAAC,cAAc;AACjB,WAAO,KAAK;KAAE,MAAM;KAAgB;KAAa,EAAE,0CAA0C;AAC7F;;GAGF,MAAM,OAAO,KAAK,kBAAkBD,WAAS,MAAM,WAAWC,YAAU,YAAY,MAAM;AAC1F,SAAM,IAAI,gBAAgB,KAAK;GAE/B,IAAI,uBAAyC;AAC7C,OAAI,CAAC,KAAK,cAAc,OAAO,UAAU,QAAQ,EAAE;IACjD,MAAM,2BAA2B,iBAAiB,WAAW,OAAO,GAAG,OAAO,KAAK,cAAc,CAAC;IAClG,MAAM,0BACJ,4BAA4B,IAAI,yBAAyB,4BAA4B;AACvF,2BAAuB,0BAA0B,wBAAwB,QAAQ;;AAGnF,cAAW,IAAI,gBAAgB;IAC7B,MAAM,SAAS;IACf,cAAc,YAAY;IAC1B,QAAQ;IACR;IACD,CAAC;AAEF,cAAW,IAAI,gBAAgBC,qBAAe,aAAa,aAAa,MAAM,KAAK,OAAO,YAAY,OAAO,CAAC;AAE9G,OAAI,gBAAgB,YAAY,sBAAsBD,YAAU,sBAAsB;IACpF,MAAM,CAAC,eAAe,UAAU,uBAC9B,CAAC,OAAO,KAAK,OAAO,EAAE,IAAI,UAAUA,WAAS,qBAAqB,CAAC,UAAU,CAAC,EAC9E,uBACD;IACD,MAAM,CAAC,oBAAoB,UAAU,uBACnC,CAAC,OAAO,KAAK,QAAQ,EAAE,YAAY,UAAU,CAAC,EAC9C,uBACD;AAED,oBAAgBD,UAAQ,UAAU,IAAI;KACpC,aAAaA;KACb,MAAM,IAAI,UAAUC,WAAS,KAAK;KAClC;KACA;KACD;AACD,aAAS,KAAK,iBAAiB,UAAU,CAAC;AAC1C,UAAM,KAAKA,WAAS,KAAK;;IAE3B;EAEF,MAAM,UAAU,MAAM,wCAAwC,QAAQ,SAAS,YAAY,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC;EACnH,MAAM,gBAAgC,QAAQ,MAAM,MAAM,OAAO,CAAC,KAAK,OAAO,gBAAgB,GAAG,KAAK,CAAC;EACvG,MAAM,cAAyB,QAAQ,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,WAAW,WAAW,OAAO,OAAO,KAAK,CAAC;EAE7G,MAAM,gBAAyC,OAAO,YAAY,MAAM,KAAK,MAAM,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;EACjH,MAAM,iBAA+C,OAAO,YAC1D,SAAS,KAAK,SAAS,MAAM,CAAC,SAAS,cAAc,GAAG,CAAC,CAC1D;AAED,OAAK,MAAM,SAAS,iBAAiB;GACnC,MAAM,EAAE,aAAa,MAAM,kBAAkB,aAAa,iBAAiB,gBAAgB;GAC3F,MAAM,eAAe,eAAe,iBAAiB,UAAU;GAC/D,MAAM,cAAc,cAAc,KAAK,UAAU,EAAE;GAEnD,MAAM,cAAc,OAAO,aAAa,MAAM,WAAW,MAAM;GAE/D,MAAM,SAAS,WAAW,IAAI,YAAY,UAAU,CAAC;AACrD,OAAI,QAAQ;IACV,MAAM,eAAe,OAAkB,eAAqB,kBAAwB;AAClF,YAAO,OAAOE,cAAY,KAAK,IAC3B,QACA,IAAI,UAAW,MAAM,UAAU,IAAIC,gBAAc,oBAAqB,OAAOD,cAAY,CAAC;;IAGhG,MAAME,0BAAwB,gBAAqB,eAAqB,mBAAyB;KAC/F,OAAO,YAAY,eAAe,OAAOD,eAAaD,cAAY;KAClE,YAAY,eAAe;KAC3B,aAAa,YAAY,eAAe,aAAaC,eAAaD,cAAY;KAC9E,cAAc,YAAY,eAAe,cAAcC,eAAaD,cAAY;KACjF;IAED,MAAM,cAAc;KAClB,WAAW,OAAO;KAClB,eAAeE,uBAAqB,OAAO,eAAe,aAAa,YAAY;KACnF,eAAeA,uBAAqB,OAAO,eAAe,aAAa,YAAY;KACpF;AAED,eAAW,IAAI,YAAY,UAAU,EAAE,YAAY;;;AAIvD,SAAO,MACL;GACE,WAAW,MAAM;GACjB,gBAAgB,WAAW;GAC5B,EACD,+CACD;AAED,SAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACD;;CAGH,MAAM,SAAS;EACb,MAAM,EAAE,YAAY,OAAO,YAAY,YAAY,WAAW,0BAC5D,MAAM,YAAY,eAAe;GAC/B,YAAY,KAAK,QAAQ,SAAS;GAClC,SAAS,KAAK;GACd,cAAc,KAAK,OAAO;GAC1B,QAAQ,KAAK;GACb,YAAY,KAAK,QAAQ,SAAS,WAAW;GAC7C,uBAAuB,KAAK;GAC5B,uBAAuB,KAAK;GAC5B,iBAAiB,KAAK;GACtB,aAAa,KAAK;GACnB,CAAC;AAEJ,OAAK,QAAQ;AACb,OAAK,QAAQ;AACb,OAAK,eAAe;AACpB,OAAK,YAAY;AACjB,OAAK,YAAY;AACjB,OAAK,kBAAkB,MAAM,KAAK,sBAAsB,QAAQ,CAAC,CAAC,QAAQ,MAAM,SAAS;AACvF,OAAI,CAAC,KAAK,SAAS;AACjB,WAAO;;AAGT,QAAK,KAAK,WAAW;IACnB,cAAc,KAAK;IACnB,WAAW,KAAK;IAChB,aAAa,KAAK;IACnB;AACD,UAAO;KACN,EAAE,CAAoB;;CAO3B,IAAI,eAA0B;AAC5B,SAAO,KAAK,OAAO;;CAGrB,IAAI,WAA2B;AAC7B,SAAO,KAAK,QAAQ;;CAGtB,IAAI,YAAuB;AACzB,SAAO,KAAK,QAAQ;;CAGtB,MAAM,4BAAkD;AACtD,UACE,MAAM,KAAK,SAAS,WAAW,mBAAmB,KAAK,WAAW;GAChE,SAAS,CACP,EACE,QAAQ;IACN,OAAO,KAAK,OAAO,QAAQ,UAAU;IACrC,QAAQ;IACT,EACF,CACF;GACD,WAAW;IAAE,QAAQ;IAAG,QAAQ;IAAG;GACpC,CAAC,EACF,KAAK,MAAM,EAAE,OAAO;;;;;;;;CASxB,MAAM,yBAAyB,SAAsD;AACnF,OAAK,OAAO,MAAM,EAAE,SAAS,EAAE,0BAA0B;EAEzD,MAAMC,aAAW,MAAM,KAAK,QAAQ,QAAQ,aAAa,cAAc,QAAQ;AAE/E,SAAOA,WAAS,KAAK,SAAS,UAAU;AACtC,OAAI,CAACA,YAAU;AACb,UAAM,IAAI,MAAM,iCAAiC,QAAQ,OAAO,UAAU,GAAG;;AAE/E,UAAO,oBAAoB,kBAAkB,QAAQ,QAAQ,MAAM,QAAsC;IACzG;;;;;;;CAQJ,MAAM,8BAAoD;AACxD,UACE,MAAM,KAAK,QAAQ,SAAS,WAAW,mBAAmB,KAAK,WAAW;GACxE,YAAY,KAAK,QAAQ,SAAS,WAAW;GAC7C,WAAW;IACT,QAAQ;IACR,QAAQ;IACT;GACD,SAAS,CACP,EACE,QAAQ;IACN,OAAO,KAAK,aAAa,UAAU;IACnC,QAAQ;IACT,EACF,EACD,EACE,QAAQ;IACN,QAAQ;IACR,OAAO,KAAK,OACV,IAAI,mBAAmB,KAAK,QAAQ,IAAI,CAAC,qBAAqB,YAAY,aAAa,CACxF;IACF,EACF,CACF;GACF,CAAC,EACF,KAAK,MAAM,EAAE,OAAO;;;;;;;CAQxB,MAAM,6BAA6B,WAAqD;EACtF,MAAM,aAAa,YAAY,iBAAiB,UAAU,GAAG,KAAK,SAAS,OAAO;EAElF,MAAM,iBACJ,MAAM,KAAK,QAAQ,QAAQ,aAAa,IAAI,CAC1C,EACE,QAAQ;GACN,OAAO,KAAK,aAAa,UAAU;GACnC,QAAQ;GACT,EACF,EACD,EACE,QAAQ;GACN,OAAO,WAAW,UAAU;GAC5B,QAAQ,IAAI;GACb,EACF,CACF,CAAC,EACF,KAAK,MAAM,oBAAoB,kBAAkB,EAAE,WAAW,MAAM,EAAE,QAAsC,CAAC;AAE/G,gBAAc,MAAM,UAAU,aAAa;GACzC,MAAM,eAAe,SAAS,wBAAwB,qBAAqB,OAAO,CAAC;GACnF,MAAM,eAAe,SAAS,wBAAwB,qBAAqB,OAAO,CAAC;AAEnF,OAAI,aAAa,GAAG,aAAa,CAAE,QAAO;AAC1C,UAAO,aAAa,GAAG,aAAa,GAAG,CAAC,IAAI;IAC5C;AAEF,SAAO;;;;;;;CAQT,MAAM,8BAA8B,OAA0C;AAC5E,UACE,MAAM,KAAK,QAAQ,SAAS,WAAW,mBAAmB,KAAK,WAAW;GACxE,YAAY,KAAK,QAAQ,SAAS,WAAW;GAC7C,WAAW;IACT,QAAQ;IACR,QAAQ;IACT;GACD,SAAS,CACP,EACE,QAAQ;IACN,QAAQ;IACR,OAAO,KAAK,OACV,IAAI,mBAAmB,KAAK,QAAQ,IAAI,CAAC,qBAAqB,YAAY,aAAa,CACxF;IACF,EACF,CACF;GACF,CAAC,EACF,KAAK,MAAM,EAAE,OAAO;;CAGxB,YAAY,aAAmC;EAC7C,MAAM,eAAe,iBAAiB,YAAY;AAClD,SAAO,KAAK,MAAM,IAAI,aAAa,UAAU,CAAC,IAAI;;CAGpD,cAAc,MAA4B;EACxC,MAAM,QAAQ,iBAAiB,KAAK;AACpC,SAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC,MAAM,SAAS,KAAK,KAAK,OAAO,MAAM,CAAC,IAAI;;CAG7E,qBAAqB,aAAkC;AACrD,MAAI,gBAAgB,UAAW,QAAO;AACtC,SAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC,MAAM,SAAS,KAAK,gBAAgB,YAAY,IAAI;;CAGtF,qBAAqB,aAA0C;EAC7D,MAAM,eAAe,iBAAiB,YAAY;AAClD,SAAO,KAAK,aAAa,IAAI,aAAa,UAAU,CAAC,IAAI;;;;;;;CAW3D,MAAM,yBAAyB,gBAAyD;AACtF,OAAK,OAAO,MAAM,EAAE,KAAK,eAAe,UAAU,EAAE,EAAE,8BAA8B;EAEpF,MAAM,qBAAqB,MAAMC,qBAAa,uBAAuB,KAAK,SAAS;GACjF,YAAY,KAAK;GACjB,cAAc;GACd,WAAW,KAAK,SAAS,OAAO;GAChC,UAAU,KAAK,SAAS,OAAO;GAChC,CAAC;EAEF,MAAM,MAAM,CAAC,mBAAmB;AAEhC,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;CAGH,MAAM,oCACJ,SACA,cACA,cAC8B;AAC9B,OAAK,OAAO,MAAM,EAAE,KAAK,QAAQ,gBAAgB,UAAU,EAAE,EAAE,gDAAgD;EAE/G,MAAM,qBAAqB,MAAMA,qBAAa,kCAC5C,KAAK,SACL;GACE,YAAY,KAAK;GACR;GACT,UAAU,QAAQ;GACnB,EACD,cACA,aACD;EAED,MAAM,MAAM,CAAC,mBAAmB;AAEhC,OAAK,OAAO,MACV;GACE,iBAAiB,IAAI;GACrB,cAAc,IAAI,KAAK,IAAI,OAAO;IAChC,OAAO;IACP,WAAW,GAAG,UAAU,UAAU;IAClC,SAAS,GAAG,KAAK;IACjB,YAAY,GAAG,KAAK;IACrB,EAAE;GACJ,EACD,4CACD;AAED,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;;;;;;;;;;CAYH,MAAM,mBACJ,YACA,aACA,QAC8B;EAC9B,MAAM,iBAAiB,QAAQ,UAAU;EACzC,MAAM,gBAAgB,YAAY,iBAAiB,eAAe;EAElE,MAAM,WAAW,MAAM,KAAK,qBAAqB,EAAE,gBAAgB,CAAC;EACpE,MAAM,MAAM,MAAM,KAAK,mBAAmB,UAAU,aAAa,OAAO;AAExE,OAAK,OAAO,MAAM,EAAE,KAAK,EAAE,wBAAwB;AAEnD,SAAO,QAAQ,UAAU,YAAY,gBACjC,QAAQ,QAAQ,UAA4C,GAC5D,oBAAoB,MAAM,eAAe,MAAM,QAAQ,WAAW;;;;;;;;;;;CAYxE,MAAM,8BACJ,SACA,YACA,eAAuB,GACvB,cAC0G;EAC1G,MAAM,EAAE,iCAAiB,MAAM,KAAK,oCAAoC,SAAS,cAAc,aAAa;EAC5G,MAAM,WAAW,MAAM,QAAQ,gBAAgBA,gBAAc,EAAE,WAAW,0BAA0B,CAAC;AACrG,OAAK,OAAO,MAAM,EAAE,UAAU,EAAE,wCAAwC;EAExE,MAAM,oBAAoB,gBAAgB;EAC1C,MAAM,CAAC,oBAAoB,UAAU,uBACnC;GACE,OAAO,KAAK,gBAAgB;GAC5B,KAAK,aAAa,UAAU;GAC5B,QAAQ,gBAAgB,UAAU;GAClC,OAAO,KAAK,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC,OAAO;GACnD,OAAO,KAAK,IAAI,YAAY,CAAC,kBAAkB,CAAC,CAAC,OAAO;GACzD,EACD,KAAK,UACN;AACD,MAAI;AACF,UAAO;IACL,SAAS,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,WAAW;IAC5E;IACA,QAAQ;IACT;WACM,KAAK;AACZ,QAAK,QAAQ,MAAM,EAAE,IAAI,UAAU,WAAW,EAAE,mCAAmC;;AAGrF,SAAO;GACL,QAAQ;GACR;GACA,SAAS;GACV;;;;;;;;;CAUH,MAAM,qBAAqB,YAAuE;EAChG,MAAM,iBAAiB,YAAY,kBAAkB,QAAQ,UAAU;EAEvE,MAAM,MAAM,MAAM,KAAK,yBAAyB,eAAe,UAAU;EACzE,MAAM,UAAU,CAAC,GAAG,IAAI,KAAK;AAE7B,UAAQ,KAAK,eAAe;EAE5B,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,aAAa;EACrD,MAAM,WAAW,uBAAuB,IAAI;GAC1C;GACA,qBAAqB,KAAK;GAC1B,MAAM,gBAAgB;GACvB,CAAC;AAEF,SAAO;;CAGT,MAAM,4BAA4B;AAChC,MAAI;AACF,WAAQ,MAAM,KAAK,SAAS,WAAW,6BAA6B,YAAY,EAAE,MAAM;WACjF,KAAK;GACZ,MAAM,aAAa,IAAI,WAAW,KAAK,SAAS,WAAW,aAAa,KAAK,SAAS,KAAK;AAC3F,WAAQ,MAAM,WAAW,6BAA6B,YAAY,EAAE,MAAM;;;CAI9E,MAAM,yBACJ,gBACA,UACA,SACA,eACA;EACA,MAAM,YAAY,MAAM,KAAK,2BAA2B;EAExD,MAAM,mBAAmB,IAAI,mBAAmB;GAC9C;GACA;GACA,iBAAiB;GAClB,CAAC;EAEF,MAAM,KAAK,IAAI,qBACb,KAAK,sBACD,iBAAiB,mBAAmB,KAAK,oBAAoB,GAC7D,iBAAiB,wBAAwB,CAC9C;AAED,MAAI,SAAS,QAAQ;AACnB,MAAG,KAAK,QAAQ;;AAGlB,MAAI,iBAAiB,OAAO,KAAK,cAAc,EAAE,QAAQ;AACvD,UAAO,uBAAuB,IAAI,cAAc;;AAGlD,SAAO;;CAGT,MAAM,gCAAgC,SAAkC,cAAsB,cAAuB;EACnH,MAAM,MAAM,MAAM,KAAK,oCAAoC,SAAS,cAAc,aAAa;AAE/F,SAAO,KAAK,yBAAyB,IAAI,cAAc,QAAQ,OAAO,CAAC,GAAG,IAAI,KAAK,EAAE,EACnF,MAAM,gBAAgB,gBACvB,CAAC;;;;;;;CAQJ,MAAM,uBAAuB,YAAqD;AAChF,OAAK,OAAO,MAAM,EAAE,YAAY,WAAW,UAAU,EAAE,EAAE,2BAA2B;EAEpF,MAAM,cAAc,MAAMA,qBAAa,gBAAgB,KAAK,SAAS;GACvD;GACZ,OAAO,KAAK,SAAS,OAAO;GAC7B,CAAC;EAEF,MAAM,MAAM,CAAC,YAAY;AAEzB,SAAO;GACL,cAAc;GACd,MAAM,EAAE;GACT;;;;;;;;;;;;;;;CAgBH,MAAM,yBAAyB,EAC7B,MACA,YACA,OAAO,QACP,OACA,MACA,QACA,eASgC;EAChC,MAAM,UAAU,QAAQ,QAAQ,UAAU;EAC1C,MAAM,UAAU,MAAM,KAAK,MAAM,kBAAkB,KAAK,SAAS,QAAQ,WAAW,MAAM,YAAY,MAAM;EAE5G,MAAM,UAAU,CAAC,GAAG,QAAQ,MAAM,QAAQ;EAE1C,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,QAAQ,aAAa;EAEzD,MAAM,WAAW,uBAAuB,IAAI;GAC1C;GACA,qBAAqB,KAAK;GAC1B,MAAM,gBAAgB;GACvB,CAAC;EACF,MAAM,MAAM,MAAM,KAAK,mBAAmB,UAAU,aAAa,OAAO;AACxE,OAAK,OAAO,MAAM,EAAE,KAAK,EAAE,sBAAsB;AAEjD,SAAO;;;;;;;;;;;CAYT,MAAM,iBACJ,MACA,eACA,aACA,QACoB;EACpB,MAAM,iBAAiB,QAAQ,QAAQ,UAAU;EAEjD,MAAM,MAAM,MAAM,KAAK,uBAAuB,eAAe,UAAU;EACvE,MAAM,UAAU,CAAC,GAAG,IAAI,MAAM,eAAe;EAC7C,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,cAAc,GAAI,iBAAiB,EAAE,CAAE;EAC/E,MAAM,WAAW,uBAAuB,IAAI;GAC1C;GACA,qBAAqB,KAAK;GAC1B,MAAM,gBAAgB;GACvB,CAAC;EACF,MAAM,MAAM,MAAM,KAAK,mBAAmB,UAAU,aAAa,OAAO;AACxE,OAAK,OAAO,MAAM,EAAE,KAAK,EAAE,sBAAsB;AAEjD,SAAO,QAAQ,QAAQ,eAAe,UAAU;;;;;;;;;;;;CAalD,MAAM,kBACJ,UACA,YACA,MACA,aACA,QACsE;EACtE,MAAM,cAAc,QAAQ,QAAQ,UAAU;EAE9C,MAAM,MAAM,MAAM,KAAK,MAAM,kBAAkB,KAAK,SAAS,YAAY,WAAW,UAAU,WAAW;EACzG,MAAM,UAAU,CAAC,GAAG,IAAI,MAAM,YAAY;EAC1C,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,IAAI,aAAa;EAErD,MAAM,WAAW,uBAAuB,IAAI;GAC1C;GACA,qBAAqB,KAAK;GAC1B,MAAM,gBAAgB;GACvB,CAAC;EACF,MAAM,MAAM,MAAM,KAAK,mBAAmB,UAAU,aAAa,OAAO;AACxE,OAAK,OAAO,MAAM,EAAE,KAAK,EAAE,2BAA2B;AAEtD,SAAO,QAAQ,QAAQ;GACrB,aAAa,YAAY;GACzB,WAAW;GACZ,CAAC;;;;;;;;;;;;;CAkBJ,MAAM,oBACJ,cACA,aACA,QACiC;EACjC,MAAM,UAAkC;GACtC,GAAG;GACH,YAAY,KAAK;GACjB,WAAW,KAAK,QAAQ;GACxB,sBAAsB,KAAK;GAC3B,iBAAiB,aAAa,mBAAmB,KAAK;GACvD;AAED,UAAQ,IAAI,eAAe,YAAY;AACvC,UAAQ,IAAI,uBAAuB,QAAQ;AAE3C,SAAO,MAAM,oBAAoB;GAC/B;GACA,YAAY,KAAK,SAAS;GAC1B,QAAQ,KAAK,SAAS;GACtB,aAAa;GACb;GACD,CAAC;;;;;;;;;;;;;CAcJ,MAAM,mBACJ,aACA,aACA,QAC+B;AAC/B,cAAY,sBAAsB,YAAY,uBAAuB,KAAK;EAE1E,MAAM,UAAkC;GACtC,GAAG;GACH,YAAY,KAAK;GACjB,WAAW,KAAK,QAAQ;GACxB,sBAAsB,KAAK;GAC3B,iBAAiB,aAAa,mBAAmB,KAAK;GACvD;EAED,MAAM,CAAC,aAAa,MAAM,oBAAoB;GAC5C,cAAc,CAAC,YAAY;GAC3B,YAAY,KAAK,SAAS;GAC1B,QAAQ,KAAK,SAAS;GACtB,aAAa;GACb;GACD,CAAC;AAEF,SAAO;;CAGT,MAAM,qBACJ,cACA,mBAC4B;EAC5B,MAAM,wBAAgD,EAAE;EACxD,MAAM,aAAa,IAAI,WAAW,KAAK,SAAS,WAAW,aAAa,KAAK,SAAS,KAAK;EAC3F,IAAI;AAEJ,MAAI;GACF,MAAM,+BAA+B,MAAM,WAAW,6BAA6B,YAAY;AAC/F,eAAY,6BAA6B,MAAM;AAE/C,QAAK,MAAM,eAAe,cAAc;AACtC,QAAI,OAAO,YAAY,EAAE;AACvB,2BAAsB,KAAK,YAAY;WAClC;KACL,MAAM,mBAAmB,IAAI,mBAAmB;MAC9C,cAAc,YAAY;MAC1B,UAAU,KAAK,SAAS;MACxB,iBAAiB;MAClB,CAAC;AAEF,2BAAsB,KACpB,IAAI,qBAAqB,iBAAiB,mBAAmB,KAAK,oBAAoB,CAAC,CACxF;;;WAGE,OAAY;AACnB,SAAM,IAAI,wBAAwB;IAChC,SAAS,MAAM;IACf,MAAM,4BAA4B;IAClC,QAAQ;IACT,CAAC;;AAGJ,MAAI;AACF,OAAI,aAAa,WAAW,GAAG;IAC7B,MAAM,WAAW,MAAM,WAAW,oBAAoB,sBAAsB,IAAI;KAC9E,WAAW;KACX,UAAU;MACR,UAAU;MACV,WAAW,kBAAkB,KAAK,MAAM,EAAE,UAAU,CAAC;MACtD;KACF,CAAC;AACF,QAAI,SAAS,MAAM,KAAK;KACtB,MAAM,QAAQ,SAAS,MAAM;KAC7B,MAAM,cAAc,sBAAsB,OAAO,KAAK,OAAO,UAAU;AACvE,WAAM,IAAI,wBAAwB;MAChC,SAAS,YAAY,eAAe,KAAK,UAAU,SAAS,MAAM,IAAI;MACtE,MAAM,4BAA4B;MAClC,MAAM,SAAS,MAAM,QAAQ,EAAE;MAC/B,WAAW,YAAY;MACxB,CAAC;;AAEJ,WAAO,SAAS,MAAM,UAAU,KAAK,MAAO,IAAI,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,GAAG,KAAM,IAAI,EAAE;UAC1F;IACL,MAAM,mBAAmB,MAAM,eAC7B,KAAK,sBACL,uBACA,kBACD;IACD,MAAM,QAAQ,iBAAiB,iBAAiB,SAAS;IAEzD,MAAMD,aAAW,MAAM;AACvB,WAAOA,YAAU,KAAK,MAAY,IAAI,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,GAAG,KAAM,IAAI,EAAE;;WAEhF,OAAY;AACnB,OAAI,iBAAiB,wBAAyB,OAAM;GAEpD,MAAM,cAAc,sBAAsB,OAAO,KAAK,OAAO,UAAU;AAEvE,OAAI,iBAAiB,uBAAuB;AAC1C,UAAM,IAAI,wBAAwB;KAChC,SAAS,YAAY;KACrB,MAAM,4BAA4B;KAClC,MAAM,MAAM;KACZ,WAAW,YAAY;KACvB,QAAQ;KACT,CAAC;;AAGJ,OAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,YAAQ,IAAI,wBAAwB;AACpC,YAAQ,IAAI,MAAM,KAAK,KAAK,KAAK,CAAC;AAClC,QAAI,aAAa;AACf,aAAQ,IAAI,WAAW,YAAY;AACnC,WAAM,IAAI,wBAAwB;MAChC,SAAS,YAAY;MACrB,MAAM,4BAA4B;MAClC,MAAM,MAAM;MACZ,WAAW,YAAY;MACvB,QAAQ;MACT,CAAC;;;AAIN,WAAQ,IAAI,qBAAqB,MAAM;AACvC,SAAM,IAAI,wBAAwB;IAChC,SAAS,aAAa,eAAe;IACrC,MAAM,4BAA4B;IAClC,MAAM,MAAM;IACZ,WAAW,YAAY;IACvB,QAAQ;IACT,CAAC;;;;AAKR,qBAAe;;;;ACx3Cf,IAAa,gBAAb,MAAa,cAA2C;CACtD,YACE,AAAO,UACP,AAAO,WACP,AAAO,OACP,AAAO,cACP;EAJO;EACA;EACA;EACA;AAEP,OAAK,WAAW;AAChB,OAAK,YAAY;AACjB,OAAK,QAAQ;AACb,OAAK,eAAe;;CAGtB,OAAO,KAAK,kBAAmD;EAC7D,MAAM,WAAW,cAAc,iBAAiB,SAAS;EACzD,MAAM,YAAY,iBAAiB,UAAU,UAAU;EACvD,MAAM,QAAQ,oBAAoB,iBAAiB,MAAM;EACzD,MAAM,eAAe,iBAAiB,YAAY,QAC/C,QAAQ,UAAU,MAAM,2BAA2B,EAAE,CACrD,KAAK,UAAU;AACd,UAAO;IACL,wBAAwB,cAAc,MAAM,uBAAuB;IACnE,OAAO,yBAAyB,MAAM,MAAM;IAC5C,iBAAiB,yBAAyB,MAAM,gBAAgB;IAChE,kBAAkB,yBAAyB,MAAM,iBAAiB;IACnE;IACD;AACJ,SAAO,IAAI,cAAc,UAAU,WAAW,OAAO,aAAa"}
|